fi-pool-server 0.1.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/README.md +26 -0
- package/dist/db/index.d.ts +18 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +58 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/migrate.d.ts +11 -0
- package/dist/db/migrate.d.ts.map +1 -0
- package/dist/db/migrate.js +42 -0
- package/dist/db/migrate.js.map +1 -0
- package/dist/db/schema.d.ts +1101 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +149 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/index.d.ts +50 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +69 -0
- package/dist/index.js.map +1 -0
- package/dist/services/analysis.d.ts +62 -0
- package/dist/services/analysis.d.ts.map +1 -0
- package/dist/services/analysis.js +74 -0
- package/dist/services/analysis.js.map +1 -0
- package/dist/services/daily-info.d.ts +150 -0
- package/dist/services/daily-info.d.ts.map +1 -0
- package/dist/services/daily-info.js +293 -0
- package/dist/services/daily-info.js.map +1 -0
- package/dist/services/embedding.d.ts +89 -0
- package/dist/services/embedding.d.ts.map +1 -0
- package/dist/services/embedding.js +227 -0
- package/dist/services/embedding.js.map +1 -0
- package/dist/services/llm.d.ts +64 -0
- package/dist/services/llm.d.ts.map +1 -0
- package/dist/services/llm.js +109 -0
- package/dist/services/llm.js.map +1 -0
- package/dist/services/pipeline.d.ts +161 -0
- package/dist/services/pipeline.d.ts.map +1 -0
- package/dist/services/pipeline.js +844 -0
- package/dist/services/pipeline.js.map +1 -0
- package/dist/services/pool.d.ts +142 -0
- package/dist/services/pool.d.ts.map +1 -0
- package/dist/services/pool.js +208 -0
- package/dist/services/pool.js.map +1 -0
- package/dist/services/sentiment.d.ts +31 -0
- package/dist/services/sentiment.d.ts.map +1 -0
- package/dist/services/sentiment.js +76 -0
- package/dist/services/sentiment.js.map +1 -0
- package/dist/services/session.d.ts +117 -0
- package/dist/services/session.d.ts.map +1 -0
- package/dist/services/session.js +176 -0
- package/dist/services/session.js.map +1 -0
- package/dist/services/stock.d.ts +82 -0
- package/dist/services/stock.d.ts.map +1 -0
- package/dist/services/stock.js +99 -0
- package/dist/services/stock.js.map +1 -0
- package/dist/services/word-count.d.ts +61 -0
- package/dist/services/word-count.d.ts.map +1 -0
- package/dist/services/word-count.js +120 -0
- package/dist/services/word-count.js.map +1 -0
- package/dist/tools/auxiliary.d.ts +93 -0
- package/dist/tools/auxiliary.d.ts.map +1 -0
- package/dist/tools/auxiliary.js +204 -0
- package/dist/tools/auxiliary.js.map +1 -0
- package/dist/tools/command.d.ts +193 -0
- package/dist/tools/command.d.ts.map +1 -0
- package/dist/tools/command.js +263 -0
- package/dist/tools/command.js.map +1 -0
- package/dist/tools/execute.d.ts +109 -0
- package/dist/tools/execute.d.ts.map +1 -0
- package/dist/tools/execute.js +112 -0
- package/dist/tools/execute.js.map +1 -0
- package/dist/tools/manager.d.ts +150 -0
- package/dist/tools/manager.d.ts.map +1 -0
- package/dist/tools/manager.js +200 -0
- package/dist/tools/manager.js.map +1 -0
- package/dist/tools/query.d.ts +163 -0
- package/dist/tools/query.d.ts.map +1 -0
- package/dist/tools/query.js +190 -0
- package/dist/tools/query.js.map +1 -0
- package/dist/utils/http-client.d.ts +87 -0
- package/dist/utils/http-client.d.ts.map +1 -0
- package/dist/utils/http-client.js +211 -0
- package/dist/utils/http-client.js.map +1 -0
- package/dist/utils/indicators.d.ts +194 -0
- package/dist/utils/indicators.d.ts.map +1 -0
- package/dist/utils/indicators.js +395 -0
- package/dist/utils/indicators.js.map +1 -0
- package/dist/utils/signals.d.ts +65 -0
- package/dist/utils/signals.d.ts.map +1 -0
- package/dist/utils/signals.js +171 -0
- package/dist/utils/signals.js.map +1 -0
- package/drizzle/0000_equal_marvel_apes.sql +124 -0
- package/drizzle/meta/0000_snapshot.json +858 -0
- package/drizzle/meta/_journal.json +13 -0
- package/package.json +58 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 执行类工具(Execute)
|
|
3
|
+
*
|
|
4
|
+
* 封装流水线执行操作,返回执行确认信息。
|
|
5
|
+
* 执行进度可通过 getSystemStatus 查看。
|
|
6
|
+
*
|
|
7
|
+
* @module tools/execute
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* 对单只股票运行本地分析(数据获取 + 技术指标计算 + 客观报告)。
|
|
11
|
+
*
|
|
12
|
+
* @param code - 股票代码
|
|
13
|
+
* @returns { success: true, data: { date: string } }
|
|
14
|
+
*/
|
|
15
|
+
export declare function runLocalAnalysis(code: string): Promise<{
|
|
16
|
+
success: true;
|
|
17
|
+
data: {
|
|
18
|
+
date: string;
|
|
19
|
+
};
|
|
20
|
+
error?: undefined;
|
|
21
|
+
} | {
|
|
22
|
+
success: false;
|
|
23
|
+
error: {
|
|
24
|
+
code: string;
|
|
25
|
+
message: string;
|
|
26
|
+
};
|
|
27
|
+
data?: undefined;
|
|
28
|
+
}>;
|
|
29
|
+
/**
|
|
30
|
+
* 对单只股票运行完整流水线。
|
|
31
|
+
*
|
|
32
|
+
* @param code - 股票代码
|
|
33
|
+
* @returns { success: true, data: { date: string } }
|
|
34
|
+
*/
|
|
35
|
+
export declare function runFullPipeline(code: string): Promise<{
|
|
36
|
+
success: true;
|
|
37
|
+
data: {
|
|
38
|
+
date: string;
|
|
39
|
+
};
|
|
40
|
+
error?: undefined;
|
|
41
|
+
} | {
|
|
42
|
+
success: false;
|
|
43
|
+
error: {
|
|
44
|
+
code: string;
|
|
45
|
+
message: string;
|
|
46
|
+
};
|
|
47
|
+
data?: undefined;
|
|
48
|
+
}>;
|
|
49
|
+
/**
|
|
50
|
+
* 对指定股池中所有股票运行本地分析。
|
|
51
|
+
*
|
|
52
|
+
* @param poolId - 股池 ID
|
|
53
|
+
* @returns { success: true, data: { total: number } }
|
|
54
|
+
*/
|
|
55
|
+
export declare function runPoolAnalysis(poolId: number): Promise<{
|
|
56
|
+
success: true;
|
|
57
|
+
data: {
|
|
58
|
+
total: number;
|
|
59
|
+
};
|
|
60
|
+
error?: undefined;
|
|
61
|
+
} | {
|
|
62
|
+
success: false;
|
|
63
|
+
error: {
|
|
64
|
+
code: string;
|
|
65
|
+
message: string;
|
|
66
|
+
};
|
|
67
|
+
data?: undefined;
|
|
68
|
+
}>;
|
|
69
|
+
/**
|
|
70
|
+
* 对指定股池中所有股票运行完整流水线。
|
|
71
|
+
*
|
|
72
|
+
* @param poolId - 股池 ID
|
|
73
|
+
* @returns { success: true, data: { total: number } }
|
|
74
|
+
*/
|
|
75
|
+
export declare function runPoolFullPipeline(poolId: number): Promise<{
|
|
76
|
+
success: true;
|
|
77
|
+
data: {
|
|
78
|
+
total: number;
|
|
79
|
+
};
|
|
80
|
+
error?: undefined;
|
|
81
|
+
} | {
|
|
82
|
+
success: false;
|
|
83
|
+
error: {
|
|
84
|
+
code: string;
|
|
85
|
+
message: string;
|
|
86
|
+
};
|
|
87
|
+
data?: undefined;
|
|
88
|
+
}>;
|
|
89
|
+
/**
|
|
90
|
+
* 触发获取最新日行情数据。
|
|
91
|
+
*
|
|
92
|
+
* @param code - 可选股票代码,不指定则更新所有关注股票
|
|
93
|
+
* @returns { success: true, data: { updated: number } }
|
|
94
|
+
*/
|
|
95
|
+
export declare function refreshData(code?: string): Promise<{
|
|
96
|
+
success: true;
|
|
97
|
+
data: {
|
|
98
|
+
updated: number;
|
|
99
|
+
};
|
|
100
|
+
error?: undefined;
|
|
101
|
+
} | {
|
|
102
|
+
success: false;
|
|
103
|
+
error: {
|
|
104
|
+
code: string;
|
|
105
|
+
message: string;
|
|
106
|
+
};
|
|
107
|
+
data?: undefined;
|
|
108
|
+
}>;
|
|
109
|
+
//# sourceMappingURL=execute.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../src/tools/execute.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM;;;;;;;;;;;;;GAQlD;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM;;;;;;;;;;;;;GAQjD;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM;;;;;;;;;;;;;GAiBnD;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,MAAM;;;;;;;;;;;;;GAiBvD;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM;;;;;;;;;;;;;GAQ9C"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 执行类工具(Execute)
|
|
3
|
+
*
|
|
4
|
+
* 封装流水线执行操作,返回执行确认信息。
|
|
5
|
+
* 执行进度可通过 getSystemStatus 查看。
|
|
6
|
+
*
|
|
7
|
+
* @module tools/execute
|
|
8
|
+
*/
|
|
9
|
+
import * as pipelineService from '../services/pipeline.js';
|
|
10
|
+
import * as dailyInfoService from '../services/daily-info.js';
|
|
11
|
+
import * as poolService from '../services/pool.js';
|
|
12
|
+
/**
|
|
13
|
+
* 对单只股票运行本地分析(数据获取 + 技术指标计算 + 客观报告)。
|
|
14
|
+
*
|
|
15
|
+
* @param code - 股票代码
|
|
16
|
+
* @returns { success: true, data: { date: string } }
|
|
17
|
+
*/
|
|
18
|
+
export async function runLocalAnalysis(code) {
|
|
19
|
+
try {
|
|
20
|
+
const result = await pipelineService.runLocalAnalysis(code);
|
|
21
|
+
return { success: true, data: { date: result.date } };
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
25
|
+
return { success: false, error: { code: 'LLM_ERROR', message } };
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 对单只股票运行完整流水线。
|
|
30
|
+
*
|
|
31
|
+
* @param code - 股票代码
|
|
32
|
+
* @returns { success: true, data: { date: string } }
|
|
33
|
+
*/
|
|
34
|
+
export async function runFullPipeline(code) {
|
|
35
|
+
try {
|
|
36
|
+
const result = await pipelineService.runFullPipeline(code);
|
|
37
|
+
return { success: true, data: { date: result.date } };
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
41
|
+
return { success: false, error: { code: 'LLM_ERROR', message } };
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 对指定股池中所有股票运行本地分析。
|
|
46
|
+
*
|
|
47
|
+
* @param poolId - 股池 ID
|
|
48
|
+
* @returns { success: true, data: { total: number } }
|
|
49
|
+
*/
|
|
50
|
+
export async function runPoolAnalysis(poolId) {
|
|
51
|
+
try {
|
|
52
|
+
const stocks = await poolService.getPoolStocks(poolId);
|
|
53
|
+
let completed = 0;
|
|
54
|
+
for (const s of stocks) {
|
|
55
|
+
try {
|
|
56
|
+
await pipelineService.runLocalAnalysis(s.code);
|
|
57
|
+
completed++;
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
console.warn(`[runPoolAnalysis] ${s.code} 失败:`, err.message);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return { success: true, data: { total: completed } };
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
67
|
+
return { success: false, error: { code: 'DB_ERROR', message } };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 对指定股池中所有股票运行完整流水线。
|
|
72
|
+
*
|
|
73
|
+
* @param poolId - 股池 ID
|
|
74
|
+
* @returns { success: true, data: { total: number } }
|
|
75
|
+
*/
|
|
76
|
+
export async function runPoolFullPipeline(poolId) {
|
|
77
|
+
try {
|
|
78
|
+
const stocks = await poolService.getPoolStocks(poolId);
|
|
79
|
+
let completed = 0;
|
|
80
|
+
for (const s of stocks) {
|
|
81
|
+
try {
|
|
82
|
+
await pipelineService.runFullPipeline(s.code);
|
|
83
|
+
completed++;
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
console.warn(`[runPoolFullPipeline] ${s.code} 失败:`, err.message);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return { success: true, data: { total: completed } };
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
93
|
+
return { success: false, error: { code: 'DB_ERROR', message } };
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* 触发获取最新日行情数据。
|
|
98
|
+
*
|
|
99
|
+
* @param code - 可选股票代码,不指定则更新所有关注股票
|
|
100
|
+
* @returns { success: true, data: { updated: number } }
|
|
101
|
+
*/
|
|
102
|
+
export async function refreshData(code) {
|
|
103
|
+
try {
|
|
104
|
+
const result = await dailyInfoService.refreshData(code);
|
|
105
|
+
return { success: true, data: { updated: result.updated } };
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
109
|
+
return { success: false, error: { code: 'RATE_LIMIT', message } };
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=execute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../src/tools/execute.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 管理类工具(Manager)
|
|
3
|
+
*
|
|
4
|
+
* 封装股池 CRUD 操作,对外暴露标准 API 格式:
|
|
5
|
+
* { success: true, data: T } | { success: false, error: { code: string, message: string } }
|
|
6
|
+
*
|
|
7
|
+
* 错误码约定:
|
|
8
|
+
* - INVALID_PARAM:参数校验失败(空名称、负 ID、信号值范围错误等)
|
|
9
|
+
* - DB_ERROR:数据库操作异常(唯一约束冲突、外键关联等)
|
|
10
|
+
*
|
|
11
|
+
* @module tools/manager
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* 创建新的股票池。
|
|
15
|
+
*
|
|
16
|
+
* 创建后如果提供了 stockCodes,会立即将对应股票加入新股池。
|
|
17
|
+
*
|
|
18
|
+
* @param name - 股池名称(必填,不能为空字符串)
|
|
19
|
+
* @param desc - 可选描述
|
|
20
|
+
* @param stockCodes - 可选的初始股票代码列表
|
|
21
|
+
* @returns 成功包含 { id },失败带错误码 INVALID_PARAM 或 DB_ERROR
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* const r = await createPool('白马股池', '优质蓝筹', ['600519']);
|
|
25
|
+
* if (r.success) console.log('created id:', r.data.id);
|
|
26
|
+
*/
|
|
27
|
+
export declare function createPool(name: string, desc?: string, stockCodes?: string[]): Promise<{
|
|
28
|
+
success: true;
|
|
29
|
+
data: {
|
|
30
|
+
id: number;
|
|
31
|
+
};
|
|
32
|
+
} | {
|
|
33
|
+
success: false;
|
|
34
|
+
error: {
|
|
35
|
+
code: string;
|
|
36
|
+
message: string;
|
|
37
|
+
};
|
|
38
|
+
}>;
|
|
39
|
+
/**
|
|
40
|
+
* 删除指定股池及其关联的 pool_stock 记录。
|
|
41
|
+
*
|
|
42
|
+
* @param id - 股池 ID(必须是正整数)
|
|
43
|
+
* @returns 成功无 data,失败带错误码 INVALID_PARAM 或 DB_ERROR
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* const r = await deletePool(1);
|
|
47
|
+
*/
|
|
48
|
+
export declare function deletePool(id: number): Promise<{
|
|
49
|
+
success: true;
|
|
50
|
+
data?: undefined;
|
|
51
|
+
} | {
|
|
52
|
+
success: false;
|
|
53
|
+
error: {
|
|
54
|
+
code: string;
|
|
55
|
+
message: string;
|
|
56
|
+
};
|
|
57
|
+
}>;
|
|
58
|
+
/**
|
|
59
|
+
* 修改股池名称或描述。
|
|
60
|
+
*
|
|
61
|
+
* 仅提供需要更新的字段即可,未提供的字段保持不变。
|
|
62
|
+
*
|
|
63
|
+
* @param id - 股池 ID(必须是正整数)
|
|
64
|
+
* @param name - 可选新名称(不能为空字符串)
|
|
65
|
+
* @param desc - 可选新描述
|
|
66
|
+
* @returns 成功无 data,失败带错误码 INVALID_PARAM 或 DB_ERROR
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* const r = await updatePool(1, { name: '新名称', desc: '新描述' });
|
|
70
|
+
*/
|
|
71
|
+
export declare function updatePool(id: number, name?: string, desc?: string): Promise<{
|
|
72
|
+
success: true;
|
|
73
|
+
data?: undefined;
|
|
74
|
+
} | {
|
|
75
|
+
success: false;
|
|
76
|
+
error: {
|
|
77
|
+
code: string;
|
|
78
|
+
message: string;
|
|
79
|
+
};
|
|
80
|
+
}>;
|
|
81
|
+
/**
|
|
82
|
+
* 向指定股池批量添加股票代码。
|
|
83
|
+
*
|
|
84
|
+
* 已存在于该股池的股票会自动跳过,不会重复添加。
|
|
85
|
+
*
|
|
86
|
+
* @param poolId - 股池 ID(必须是正整数)
|
|
87
|
+
* @param stockCodes - 要添加的股票代码数组(不能为空)
|
|
88
|
+
* @returns 成功包含 { added, skipped },失败带错误码
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* const r = await addStocks(1, ['600519', '000001']);
|
|
92
|
+
* if (r.success) console.log(`添加 ${r.data.added},跳过 ${r.data.skipped}`);
|
|
93
|
+
*/
|
|
94
|
+
export declare function addStocks(poolId: number, stockCodes: string[]): Promise<{
|
|
95
|
+
success: true;
|
|
96
|
+
data: {
|
|
97
|
+
added: number;
|
|
98
|
+
skipped: number;
|
|
99
|
+
};
|
|
100
|
+
} | {
|
|
101
|
+
success: false;
|
|
102
|
+
error: {
|
|
103
|
+
code: string;
|
|
104
|
+
message: string;
|
|
105
|
+
};
|
|
106
|
+
}>;
|
|
107
|
+
/**
|
|
108
|
+
* 从指定股池中移除一批股票代码。
|
|
109
|
+
*
|
|
110
|
+
* @param poolId - 股池 ID(必须是正整数)
|
|
111
|
+
* @param stockCodes - 要移除的股票代码数组(不能为空)
|
|
112
|
+
* @returns 成功包含 { removed },失败带错误码
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* const r = await removeStocks(1, ['600519']);
|
|
116
|
+
* if (r.success) console.log(`移除了 ${r.data.removed} 只`);
|
|
117
|
+
*/
|
|
118
|
+
export declare function removeStocks(poolId: number, stockCodes: string[]): Promise<{
|
|
119
|
+
success: true;
|
|
120
|
+
data: {
|
|
121
|
+
removed: number;
|
|
122
|
+
};
|
|
123
|
+
} | {
|
|
124
|
+
success: false;
|
|
125
|
+
error: {
|
|
126
|
+
code: string;
|
|
127
|
+
message: string;
|
|
128
|
+
};
|
|
129
|
+
}>;
|
|
130
|
+
/**
|
|
131
|
+
* 设置股池综合信号值。
|
|
132
|
+
*
|
|
133
|
+
* @param poolId - 股池 ID(必须是正整数)
|
|
134
|
+
* @param signal - 信号值:-1 看空, 0 中性, 1 看多
|
|
135
|
+
* @returns 成功无 data,失败带错误码
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
* const r = await setPoolSignal(1, 1); // 看多
|
|
139
|
+
*/
|
|
140
|
+
export declare function setPoolSignal(poolId: number, signal: number): Promise<{
|
|
141
|
+
success: true;
|
|
142
|
+
data?: undefined;
|
|
143
|
+
} | {
|
|
144
|
+
success: false;
|
|
145
|
+
error: {
|
|
146
|
+
code: string;
|
|
147
|
+
message: string;
|
|
148
|
+
};
|
|
149
|
+
}>;
|
|
150
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/tools/manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH;;;;;;;;;;;;;GAaG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,MAAM,EAAE,GACpB,OAAO,CACN;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GACvC;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAC/D,CAqBA;AAED;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAC9B,EAAE,EAAE,MAAM,GACT,OAAO,CACN;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,SAAS,CAAA;CAAE,GACnC;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAC/D,CAWA;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,UAAU,CAC9B,EAAE,EAAE,MAAM,EACV,IAAI,CAAC,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CACN;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,SAAS,CAAA;CAAE,GACnC;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAC/D,CA+BA;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAAE,GACnB,OAAO,CACN;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAC3D;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAC/D,CAeA;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAAE,GACnB,OAAO,CACN;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAC5C;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAC/D,CAeA;AAED;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,OAAO,CACN;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,SAAS,CAAA;CAAE,GACnC;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAC/D,CAeA"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 管理类工具(Manager)
|
|
3
|
+
*
|
|
4
|
+
* 封装股池 CRUD 操作,对外暴露标准 API 格式:
|
|
5
|
+
* { success: true, data: T } | { success: false, error: { code: string, message: string } }
|
|
6
|
+
*
|
|
7
|
+
* 错误码约定:
|
|
8
|
+
* - INVALID_PARAM:参数校验失败(空名称、负 ID、信号值范围错误等)
|
|
9
|
+
* - DB_ERROR:数据库操作异常(唯一约束冲突、外键关联等)
|
|
10
|
+
*
|
|
11
|
+
* @module tools/manager
|
|
12
|
+
*/
|
|
13
|
+
import * as poolService from '../services/pool.js';
|
|
14
|
+
import { getDatabase } from '../db/index.js';
|
|
15
|
+
import { pool } from '../db/schema.js';
|
|
16
|
+
import { eq } from 'drizzle-orm';
|
|
17
|
+
/**
|
|
18
|
+
* 创建新的股票池。
|
|
19
|
+
*
|
|
20
|
+
* 创建后如果提供了 stockCodes,会立即将对应股票加入新股池。
|
|
21
|
+
*
|
|
22
|
+
* @param name - 股池名称(必填,不能为空字符串)
|
|
23
|
+
* @param desc - 可选描述
|
|
24
|
+
* @param stockCodes - 可选的初始股票代码列表
|
|
25
|
+
* @returns 成功包含 { id },失败带错误码 INVALID_PARAM 或 DB_ERROR
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* const r = await createPool('白马股池', '优质蓝筹', ['600519']);
|
|
29
|
+
* if (r.success) console.log('created id:', r.data.id);
|
|
30
|
+
*/
|
|
31
|
+
export async function createPool(name, desc, stockCodes) {
|
|
32
|
+
try {
|
|
33
|
+
if (!name || name.trim().length === 0) {
|
|
34
|
+
return { success: false, error: { code: 'INVALID_PARAM', message: '股池名称不能为空' } };
|
|
35
|
+
}
|
|
36
|
+
// 预检名称唯一性
|
|
37
|
+
const existing = getDatabase().select().from(pool).where(eq(pool.name, name.trim())).get();
|
|
38
|
+
if (existing) {
|
|
39
|
+
return { success: false, error: { code: 'INVALID_PARAM', message: `股池名称"${name}"已存在` } };
|
|
40
|
+
}
|
|
41
|
+
const result = await poolService.createPool(name.trim(), desc?.trim());
|
|
42
|
+
if (stockCodes && stockCodes.length > 0) {
|
|
43
|
+
await poolService.addStocks(result.id, stockCodes);
|
|
44
|
+
}
|
|
45
|
+
return { success: true, data: { id: result.id } };
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
49
|
+
return { success: false, error: { code: 'DB_ERROR', message } };
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 删除指定股池及其关联的 pool_stock 记录。
|
|
54
|
+
*
|
|
55
|
+
* @param id - 股池 ID(必须是正整数)
|
|
56
|
+
* @returns 成功无 data,失败带错误码 INVALID_PARAM 或 DB_ERROR
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* const r = await deletePool(1);
|
|
60
|
+
*/
|
|
61
|
+
export async function deletePool(id) {
|
|
62
|
+
try {
|
|
63
|
+
if (!Number.isInteger(id) || id <= 0) {
|
|
64
|
+
return { success: false, error: { code: 'INVALID_PARAM', message: '股池 ID 必须是正整数' } };
|
|
65
|
+
}
|
|
66
|
+
await poolService.deletePool(id);
|
|
67
|
+
return { success: true };
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
71
|
+
return { success: false, error: { code: 'DB_ERROR', message } };
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* 修改股池名称或描述。
|
|
76
|
+
*
|
|
77
|
+
* 仅提供需要更新的字段即可,未提供的字段保持不变。
|
|
78
|
+
*
|
|
79
|
+
* @param id - 股池 ID(必须是正整数)
|
|
80
|
+
* @param name - 可选新名称(不能为空字符串)
|
|
81
|
+
* @param desc - 可选新描述
|
|
82
|
+
* @returns 成功无 data,失败带错误码 INVALID_PARAM 或 DB_ERROR
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* const r = await updatePool(1, { name: '新名称', desc: '新描述' });
|
|
86
|
+
*/
|
|
87
|
+
export async function updatePool(id, name, desc) {
|
|
88
|
+
try {
|
|
89
|
+
if (!Number.isInteger(id) || id <= 0) {
|
|
90
|
+
return { success: false, error: { code: 'INVALID_PARAM', message: '股池 ID 必须是正整数' } };
|
|
91
|
+
}
|
|
92
|
+
if (name !== undefined && name.trim().length === 0) {
|
|
93
|
+
return { success: false, error: { code: 'INVALID_PARAM', message: '股池名称不能为空' } };
|
|
94
|
+
}
|
|
95
|
+
// 预检名称唯一性(如需改名)
|
|
96
|
+
if (name !== undefined) {
|
|
97
|
+
const existing = getDatabase().select().from(pool).where(eq(pool.name, name.trim())).get();
|
|
98
|
+
if (existing && existing.id !== id) {
|
|
99
|
+
return { success: false, error: { code: 'INVALID_PARAM', message: `股池名称"${name}"已存在` } };
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const updateData = {};
|
|
103
|
+
if (name !== undefined)
|
|
104
|
+
updateData.name = name.trim();
|
|
105
|
+
if (desc !== undefined)
|
|
106
|
+
updateData.desc = desc.trim();
|
|
107
|
+
if (Object.keys(updateData).length === 0) {
|
|
108
|
+
return { success: false, error: { code: 'INVALID_PARAM', message: '未提供任何需要更新的字段' } };
|
|
109
|
+
}
|
|
110
|
+
await poolService.updatePool(id, updateData);
|
|
111
|
+
return { success: true };
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
115
|
+
return { success: false, error: { code: 'DB_ERROR', message } };
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* 向指定股池批量添加股票代码。
|
|
120
|
+
*
|
|
121
|
+
* 已存在于该股池的股票会自动跳过,不会重复添加。
|
|
122
|
+
*
|
|
123
|
+
* @param poolId - 股池 ID(必须是正整数)
|
|
124
|
+
* @param stockCodes - 要添加的股票代码数组(不能为空)
|
|
125
|
+
* @returns 成功包含 { added, skipped },失败带错误码
|
|
126
|
+
*
|
|
127
|
+
* @example
|
|
128
|
+
* const r = await addStocks(1, ['600519', '000001']);
|
|
129
|
+
* if (r.success) console.log(`添加 ${r.data.added},跳过 ${r.data.skipped}`);
|
|
130
|
+
*/
|
|
131
|
+
export async function addStocks(poolId, stockCodes) {
|
|
132
|
+
try {
|
|
133
|
+
if (!Number.isInteger(poolId) || poolId <= 0) {
|
|
134
|
+
return { success: false, error: { code: 'INVALID_PARAM', message: '股池 ID 必须是正整数' } };
|
|
135
|
+
}
|
|
136
|
+
if (!stockCodes || stockCodes.length === 0) {
|
|
137
|
+
return { success: false, error: { code: 'INVALID_PARAM', message: '股票代码列表不能为空' } };
|
|
138
|
+
}
|
|
139
|
+
const result = await poolService.addStocks(poolId, stockCodes);
|
|
140
|
+
return { success: true, data: result };
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
144
|
+
return { success: false, error: { code: 'DB_ERROR', message } };
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* 从指定股池中移除一批股票代码。
|
|
149
|
+
*
|
|
150
|
+
* @param poolId - 股池 ID(必须是正整数)
|
|
151
|
+
* @param stockCodes - 要移除的股票代码数组(不能为空)
|
|
152
|
+
* @returns 成功包含 { removed },失败带错误码
|
|
153
|
+
*
|
|
154
|
+
* @example
|
|
155
|
+
* const r = await removeStocks(1, ['600519']);
|
|
156
|
+
* if (r.success) console.log(`移除了 ${r.data.removed} 只`);
|
|
157
|
+
*/
|
|
158
|
+
export async function removeStocks(poolId, stockCodes) {
|
|
159
|
+
try {
|
|
160
|
+
if (!Number.isInteger(poolId) || poolId <= 0) {
|
|
161
|
+
return { success: false, error: { code: 'INVALID_PARAM', message: '股池 ID 必须是正整数' } };
|
|
162
|
+
}
|
|
163
|
+
if (!stockCodes || stockCodes.length === 0) {
|
|
164
|
+
return { success: false, error: { code: 'INVALID_PARAM', message: '股票代码列表不能为空' } };
|
|
165
|
+
}
|
|
166
|
+
const result = await poolService.removeStocks(poolId, stockCodes);
|
|
167
|
+
return { success: true, data: result };
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
171
|
+
return { success: false, error: { code: 'DB_ERROR', message } };
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* 设置股池综合信号值。
|
|
176
|
+
*
|
|
177
|
+
* @param poolId - 股池 ID(必须是正整数)
|
|
178
|
+
* @param signal - 信号值:-1 看空, 0 中性, 1 看多
|
|
179
|
+
* @returns 成功无 data,失败带错误码
|
|
180
|
+
*
|
|
181
|
+
* @example
|
|
182
|
+
* const r = await setPoolSignal(1, 1); // 看多
|
|
183
|
+
*/
|
|
184
|
+
export async function setPoolSignal(poolId, signal) {
|
|
185
|
+
try {
|
|
186
|
+
if (!Number.isInteger(poolId) || poolId <= 0) {
|
|
187
|
+
return { success: false, error: { code: 'INVALID_PARAM', message: '股池 ID 必须是正整数' } };
|
|
188
|
+
}
|
|
189
|
+
if (![-1, 0, 1].includes(signal)) {
|
|
190
|
+
return { success: false, error: { code: 'INVALID_PARAM', message: '信号值必须为 -1(看空)、0(中性)或 1(看多)' } };
|
|
191
|
+
}
|
|
192
|
+
await poolService.setPoolSignal(poolId, signal);
|
|
193
|
+
return { success: true };
|
|
194
|
+
}
|
|
195
|
+
catch (err) {
|
|
196
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
197
|
+
return { success: false, error: { code: 'DB_ERROR', message } };
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/tools/manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,WAAW,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEjC;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAY,EACZ,IAAa,EACb,UAAqB;IAKrB,IAAI,CAAC;QACH,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtC,OAAO,EAAE,OAAO,EAAE,KAAc,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC;QAC5F,CAAC;QAED,UAAU;QACV,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QAC3F,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,EAAE,OAAO,EAAE,KAAc,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,QAAQ,IAAI,MAAM,EAAE,EAAE,CAAC;QACpG,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,MAAM,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAa,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC;IAC7D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,EAAE,OAAO,EAAE,KAAc,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;IAC3E,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,EAAU;IAKV,IAAI,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACrC,OAAO,EAAE,OAAO,EAAE,KAAc,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,CAAC;QAChG,CAAC;QACD,MAAM,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACjC,OAAO,EAAE,OAAO,EAAE,IAAa,EAAE,CAAC;IACpC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,EAAE,OAAO,EAAE,KAAc,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;IAC3E,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,EAAU,EACV,IAAa,EACb,IAAa;IAKb,IAAI,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACrC,OAAO,EAAE,OAAO,EAAE,KAAc,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,CAAC;QAChG,CAAC;QACD,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnD,OAAO,EAAE,OAAO,EAAE,KAAc,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC;QAC5F,CAAC;QAED,gBAAgB;QAChB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YAC3F,IAAI,QAAQ,IAAI,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;gBACnC,OAAO,EAAE,OAAO,EAAE,KAAc,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,QAAQ,IAAI,MAAM,EAAE,EAAE,CAAC;YACpG,CAAC;QACH,CAAC;QAED,MAAM,UAAU,GAAqC,EAAE,CAAC;QACxD,IAAI,IAAI,KAAK,SAAS;YAAE,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACtD,IAAI,IAAI,KAAK,SAAS;YAAE,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAEtD,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzC,OAAO,EAAE,OAAO,EAAE,KAAc,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,CAAC;QAChG,CAAC;QAED,MAAM,WAAW,CAAC,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAC7C,OAAO,EAAE,OAAO,EAAE,IAAa,EAAE,CAAC;IACpC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,EAAE,OAAO,EAAE,KAAc,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;IAC3E,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,MAAc,EACd,UAAoB;IAKpB,IAAI,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;YAC7C,OAAO,EAAE,OAAO,EAAE,KAAc,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,CAAC;QAChG,CAAC;QACD,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3C,OAAO,EAAE,OAAO,EAAE,KAAc,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,CAAC;QAC9F,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC/D,OAAO,EAAE,OAAO,EAAE,IAAa,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAClD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,EAAE,OAAO,EAAE,KAAc,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;IAC3E,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAc,EACd,UAAoB;IAKpB,IAAI,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;YAC7C,OAAO,EAAE,OAAO,EAAE,KAAc,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,CAAC;QAChG,CAAC;QACD,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3C,OAAO,EAAE,OAAO,EAAE,KAAc,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,CAAC;QAC9F,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAClE,OAAO,EAAE,OAAO,EAAE,IAAa,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAClD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,EAAE,OAAO,EAAE,KAAc,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;IAC3E,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAc,EACd,MAAc;IAKd,IAAI,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;YAC7C,OAAO,EAAE,OAAO,EAAE,KAAc,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,CAAC;QAChG,CAAC;QACD,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,OAAO,EAAE,OAAO,EAAE,KAAc,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,4BAA4B,EAAE,EAAE,CAAC;QAC9G,CAAC;QAED,MAAM,WAAW,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChD,OAAO,EAAE,OAAO,EAAE,IAAa,EAAE,CAAC;IACpC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,EAAE,OAAO,EAAE,KAAc,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;IAC3E,CAAC;AACH,CAAC"}
|