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,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM 会话管理(运行时内存存储)
|
|
3
|
+
*
|
|
4
|
+
* 管理多角色 LLM 分析过程中的会话状态。
|
|
5
|
+
* 每个会话存储一系列消息,支持自动裁剪以避免超出上下文窗口。
|
|
6
|
+
* 会话数据不持久化,仅在内存中维护。
|
|
7
|
+
*
|
|
8
|
+
* @module services/session
|
|
9
|
+
*/
|
|
10
|
+
// ─── 模块级状态 ────────────────────────────────────────────
|
|
11
|
+
/** 内存中的会话存储 */
|
|
12
|
+
const sessions = new Map();
|
|
13
|
+
/** 当前激活的会话 ID */
|
|
14
|
+
let currentSessionId;
|
|
15
|
+
/** 单个会话允许的最大消息数 */
|
|
16
|
+
const MAX_MESSAGES = 20;
|
|
17
|
+
/**
|
|
18
|
+
* 超过 MAX_MESSAGES 时一次性裁剪的消息数。
|
|
19
|
+
* 从最早的消息开始移除。
|
|
20
|
+
*/
|
|
21
|
+
const TRIM_COUNT = 5;
|
|
22
|
+
// ─── 工具函数 ──────────────────────────────────────────────
|
|
23
|
+
/**
|
|
24
|
+
* 生成一个简短随机字符串作为会话 ID。
|
|
25
|
+
* 格式:8 位十六进制字符。
|
|
26
|
+
*
|
|
27
|
+
* @returns 随机 ID
|
|
28
|
+
*/
|
|
29
|
+
function generateId() {
|
|
30
|
+
return Math.random().toString(16).slice(2, 10);
|
|
31
|
+
}
|
|
32
|
+
// ─── 公开 API ──────────────────────────────────────────────
|
|
33
|
+
/**
|
|
34
|
+
* 创建一个新的空会话并将其设为当前会话。
|
|
35
|
+
*
|
|
36
|
+
* @returns 新会话的 ID
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* const sessionId = createSession();
|
|
40
|
+
* console.log(sessionId); // 'a1b2c3d4'
|
|
41
|
+
*/
|
|
42
|
+
export function createSession() {
|
|
43
|
+
const id = generateId();
|
|
44
|
+
const session = {
|
|
45
|
+
id,
|
|
46
|
+
createdAt: new Date().toISOString(),
|
|
47
|
+
messages: [],
|
|
48
|
+
};
|
|
49
|
+
sessions.set(id, session);
|
|
50
|
+
currentSessionId = id;
|
|
51
|
+
return id;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 切换到指定会话作为当前会话。
|
|
55
|
+
* 如果指定 ID 不存在则会自动创建新会话。
|
|
56
|
+
*
|
|
57
|
+
* @param sessionId - 目标会话 ID
|
|
58
|
+
* @returns 包含当前会话 ID 和上一个会话 ID 的对象
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* const { sessionId, previousId } = switchSession('a1b2c3d4');
|
|
62
|
+
* // 如果之前有活动会话,previousId 是其 ID
|
|
63
|
+
*/
|
|
64
|
+
export function switchSession(sessionId) {
|
|
65
|
+
const previousId = currentSessionId;
|
|
66
|
+
// 如果会话不存在则自动创建
|
|
67
|
+
if (!sessions.has(sessionId)) {
|
|
68
|
+
const session = {
|
|
69
|
+
id: sessionId,
|
|
70
|
+
createdAt: new Date().toISOString(),
|
|
71
|
+
messages: [],
|
|
72
|
+
};
|
|
73
|
+
sessions.set(sessionId, session);
|
|
74
|
+
}
|
|
75
|
+
currentSessionId = sessionId;
|
|
76
|
+
return { sessionId, previousId };
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 向指定会话追加一条消息。
|
|
80
|
+
* 如果会话消息数超过 MAX_MESSAGES,自动裁剪最早的非系统消息。
|
|
81
|
+
*
|
|
82
|
+
* @param sessionId - 目标会话 ID
|
|
83
|
+
* @param role - 消息角色
|
|
84
|
+
* @param content - 消息内容
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* appendMessage('a1b2c3d4', 'user', '分析贵州茅台');
|
|
88
|
+
* appendMessage('a1b2c3d4', 'assistant', '贵州茅台最新股价...');
|
|
89
|
+
*/
|
|
90
|
+
export function appendMessage(sessionId, role, content) {
|
|
91
|
+
const session = sessions.get(sessionId);
|
|
92
|
+
if (!session) {
|
|
93
|
+
throw new Error(`会话不存在: ${sessionId}`);
|
|
94
|
+
}
|
|
95
|
+
session.messages.push({ role, content });
|
|
96
|
+
// 超出限制时裁剪最早的消息(保留系统消息)
|
|
97
|
+
if (session.messages.length > MAX_MESSAGES) {
|
|
98
|
+
// 计算需要移除的消息数
|
|
99
|
+
const excess = session.messages.length - MAX_MESSAGES;
|
|
100
|
+
const toRemove = Math.min(excess + TRIM_COUNT, session.messages.length);
|
|
101
|
+
// 保留所有 system 消息,移除最早的非 system 消息
|
|
102
|
+
const systemMessages = session.messages.filter((m) => m.role === 'system');
|
|
103
|
+
const nonSystemMessages = session.messages.filter((m) => m.role !== 'system');
|
|
104
|
+
const trimmed = nonSystemMessages.slice(toRemove);
|
|
105
|
+
session.messages = [...systemMessages, ...trimmed];
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* 获取指定会话的完整数据。
|
|
110
|
+
*
|
|
111
|
+
* @param sessionId - 会话 ID
|
|
112
|
+
* @returns 会话对象,不存在返回 undefined
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* const session = getSession('a1b2c3d4');
|
|
116
|
+
* if (session) console.log(session.messages.length);
|
|
117
|
+
*/
|
|
118
|
+
export function getSession(sessionId) {
|
|
119
|
+
return sessions.get(sessionId);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* 列出所有已创建的会话(摘要信息)。
|
|
123
|
+
*
|
|
124
|
+
* @returns 会话摘要列表,包含 id 和 createdAt
|
|
125
|
+
*
|
|
126
|
+
* @example
|
|
127
|
+
* const list = listSessions();
|
|
128
|
+
* list.forEach(s => console.log(s.id, s.createdAt));
|
|
129
|
+
*/
|
|
130
|
+
export function listSessions() {
|
|
131
|
+
return Array.from(sessions.values()).map((s) => ({
|
|
132
|
+
id: s.id,
|
|
133
|
+
createdAt: s.createdAt,
|
|
134
|
+
}));
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* 获取当前激活的会话。
|
|
138
|
+
*
|
|
139
|
+
* @returns 当前会话对象,无活动会话时返回 undefined
|
|
140
|
+
*
|
|
141
|
+
* @example
|
|
142
|
+
* const session = getCurrentSession();
|
|
143
|
+
* if (session) console.log(session.id);
|
|
144
|
+
*/
|
|
145
|
+
export function getCurrentSession() {
|
|
146
|
+
if (!currentSessionId)
|
|
147
|
+
return undefined;
|
|
148
|
+
return sessions.get(currentSessionId);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* 清空会话消息。
|
|
152
|
+
*
|
|
153
|
+
* - 不指定 sessionId:清空所有会话(重置整个内存存储)
|
|
154
|
+
* - 指定 sessionId:仅清空该会话的消息列表(会话保留)
|
|
155
|
+
*
|
|
156
|
+
* @param sessionId - 可选的目标会话 ID
|
|
157
|
+
*
|
|
158
|
+
* @example
|
|
159
|
+
* // 清空特定会话
|
|
160
|
+
* clearSession('a1b2c3d4');
|
|
161
|
+
* // 清空全部
|
|
162
|
+
* clearSession();
|
|
163
|
+
*/
|
|
164
|
+
export function clearSession(sessionId) {
|
|
165
|
+
if (sessionId) {
|
|
166
|
+
const session = sessions.get(sessionId);
|
|
167
|
+
if (session) {
|
|
168
|
+
session.messages = [];
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
sessions.clear();
|
|
173
|
+
currentSessionId = undefined;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/services/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 股票基础信息 CRUD 服务
|
|
3
|
+
*
|
|
4
|
+
* 对 stock 表进行增删改查操作。
|
|
5
|
+
* 每个股票存储 6 位代码、名称、最新价格和更新时间。
|
|
6
|
+
*
|
|
7
|
+
* @module services/stock
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* 根据股票代码获取单只股票信息。
|
|
11
|
+
*
|
|
12
|
+
* @param code - 六位股票代码(如 '600519')
|
|
13
|
+
* @returns 股票对象,未找到时返回 null
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* const s = await getStockByCode('600519');
|
|
17
|
+
* if (s) console.log(s.name);
|
|
18
|
+
*/
|
|
19
|
+
export declare function getStockByCode(code: string): Promise<{
|
|
20
|
+
name: string;
|
|
21
|
+
updatedAt: string;
|
|
22
|
+
code: string;
|
|
23
|
+
currentPrice: number;
|
|
24
|
+
}>;
|
|
25
|
+
/**
|
|
26
|
+
* 根据关键词搜索股票(模糊匹配名称或代码)。
|
|
27
|
+
*
|
|
28
|
+
* @param keyword - 搜索关键词,自动在前后添加 % 通配符
|
|
29
|
+
* @returns 匹配的股票列表
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* const results = await searchStocks('茅台');
|
|
33
|
+
*/
|
|
34
|
+
export declare function searchStocks(keyword: string): Promise<{
|
|
35
|
+
name: string;
|
|
36
|
+
updatedAt: string;
|
|
37
|
+
code: string;
|
|
38
|
+
currentPrice: number;
|
|
39
|
+
}[]>;
|
|
40
|
+
/**
|
|
41
|
+
* 插入或更新股票信息。
|
|
42
|
+
* 当 code 已存在时更新名称、价格和更新时间;不存在时新增记录。
|
|
43
|
+
*
|
|
44
|
+
* @param code - 六位股票代码
|
|
45
|
+
* @param name - 股票名称
|
|
46
|
+
* @param price - 当前价格
|
|
47
|
+
* @returns 插入或更新后的股票对象
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* const s = await upsertStock('600519', '贵州茅台', 1915.00);
|
|
51
|
+
*/
|
|
52
|
+
export declare function upsertStock(code: string, name: string, price: number): Promise<{
|
|
53
|
+
name: string;
|
|
54
|
+
updatedAt: string;
|
|
55
|
+
code: string;
|
|
56
|
+
currentPrice: number;
|
|
57
|
+
}>;
|
|
58
|
+
/**
|
|
59
|
+
* 列出数据库中所有股票,按代码升序排列。
|
|
60
|
+
*
|
|
61
|
+
* @returns 全部股票列表
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* const all = await listAllStocks();
|
|
65
|
+
*/
|
|
66
|
+
export declare function listAllStocks(): Promise<{
|
|
67
|
+
name: string;
|
|
68
|
+
updatedAt: string;
|
|
69
|
+
code: string;
|
|
70
|
+
currentPrice: number;
|
|
71
|
+
}[]>;
|
|
72
|
+
/**
|
|
73
|
+
* 根据股票代码删除一条股票记录。
|
|
74
|
+
* 注意:会因外键约束失败而拒绝删除,如果存在关联的 pool_stock 或 daily_info 记录。
|
|
75
|
+
*
|
|
76
|
+
* @param code - 六位股票代码
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* await deleteStock('600519');
|
|
80
|
+
*/
|
|
81
|
+
export declare function deleteStock(code: string): Promise<void>;
|
|
82
|
+
//# sourceMappingURL=stock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stock.d.ts","sourceRoot":"","sources":["../../src/services/stock.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM;;;;;GAIhD;AAED;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM;;;;;KAQjD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;;;;;GAiB1E;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa;;;;;KAGlC;AAED;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,iBAG7C"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 股票基础信息 CRUD 服务
|
|
3
|
+
*
|
|
4
|
+
* 对 stock 表进行增删改查操作。
|
|
5
|
+
* 每个股票存储 6 位代码、名称、最新价格和更新时间。
|
|
6
|
+
*
|
|
7
|
+
* @module services/stock
|
|
8
|
+
*/
|
|
9
|
+
import { getDatabase } from '../db/index.js';
|
|
10
|
+
import { stock } from '../db/schema.js';
|
|
11
|
+
import { eq, like, or, sql } from 'drizzle-orm';
|
|
12
|
+
/**
|
|
13
|
+
* 根据股票代码获取单只股票信息。
|
|
14
|
+
*
|
|
15
|
+
* @param code - 六位股票代码(如 '600519')
|
|
16
|
+
* @returns 股票对象,未找到时返回 null
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* const s = await getStockByCode('600519');
|
|
20
|
+
* if (s) console.log(s.name);
|
|
21
|
+
*/
|
|
22
|
+
export async function getStockByCode(code) {
|
|
23
|
+
const db = getDatabase();
|
|
24
|
+
const rows = db.select().from(stock).where(eq(stock.code, code)).all();
|
|
25
|
+
return rows[0] ?? null;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 根据关键词搜索股票(模糊匹配名称或代码)。
|
|
29
|
+
*
|
|
30
|
+
* @param keyword - 搜索关键词,自动在前后添加 % 通配符
|
|
31
|
+
* @returns 匹配的股票列表
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* const results = await searchStocks('茅台');
|
|
35
|
+
*/
|
|
36
|
+
export async function searchStocks(keyword) {
|
|
37
|
+
const db = getDatabase();
|
|
38
|
+
const pattern = `%${keyword}%`;
|
|
39
|
+
return db
|
|
40
|
+
.select()
|
|
41
|
+
.from(stock)
|
|
42
|
+
.where(or(like(stock.code, pattern), like(stock.name, pattern)))
|
|
43
|
+
.all();
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* 插入或更新股票信息。
|
|
47
|
+
* 当 code 已存在时更新名称、价格和更新时间;不存在时新增记录。
|
|
48
|
+
*
|
|
49
|
+
* @param code - 六位股票代码
|
|
50
|
+
* @param name - 股票名称
|
|
51
|
+
* @param price - 当前价格
|
|
52
|
+
* @returns 插入或更新后的股票对象
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* const s = await upsertStock('600519', '贵州茅台', 1915.00);
|
|
56
|
+
*/
|
|
57
|
+
export async function upsertStock(code, name, price) {
|
|
58
|
+
const db = getDatabase();
|
|
59
|
+
db.insert(stock)
|
|
60
|
+
.values({ code, name, currentPrice: price })
|
|
61
|
+
.onConflictDoUpdate({
|
|
62
|
+
target: stock.code,
|
|
63
|
+
set: {
|
|
64
|
+
name,
|
|
65
|
+
currentPrice: price,
|
|
66
|
+
updatedAt: sql `datetime('now')`,
|
|
67
|
+
},
|
|
68
|
+
})
|
|
69
|
+
.run();
|
|
70
|
+
// 重新查询以返回完整记录
|
|
71
|
+
const rows = db.select().from(stock).where(eq(stock.code, code)).all();
|
|
72
|
+
return rows[0];
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* 列出数据库中所有股票,按代码升序排列。
|
|
76
|
+
*
|
|
77
|
+
* @returns 全部股票列表
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* const all = await listAllStocks();
|
|
81
|
+
*/
|
|
82
|
+
export async function listAllStocks() {
|
|
83
|
+
const db = getDatabase();
|
|
84
|
+
return db.select().from(stock).orderBy(stock.code).all();
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 根据股票代码删除一条股票记录。
|
|
88
|
+
* 注意:会因外键约束失败而拒绝删除,如果存在关联的 pool_stock 或 daily_info 记录。
|
|
89
|
+
*
|
|
90
|
+
* @param code - 六位股票代码
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* await deleteStock('600519');
|
|
94
|
+
*/
|
|
95
|
+
export async function deleteStock(code) {
|
|
96
|
+
const db = getDatabase();
|
|
97
|
+
db.delete(stock).where(eq(stock.code, code)).run();
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=stock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stock.js","sourceRoot":"","sources":["../../src/services/stock.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAEhD;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACvE,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AACzB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAe;IAChD,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;IACzB,MAAM,OAAO,GAAG,IAAI,OAAO,GAAG,CAAC;IAC/B,OAAO,EAAE;SACN,MAAM,EAAE;SACR,IAAI,CAAC,KAAK,CAAC;SACX,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;SAC/D,GAAG,EAAE,CAAC;AACX,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,IAAY,EAAE,KAAa;IACzE,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;IACzB,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;SACb,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;SAC3C,kBAAkB,CAAC;QAClB,MAAM,EAAE,KAAK,CAAC,IAAI;QAClB,GAAG,EAAE;YACH,IAAI;YACJ,YAAY,EAAE,KAAK;YACnB,SAAS,EAAE,GAAG,CAAA,iBAAiB;SAChC;KACF,CAAC;SACD,GAAG,EAAE,CAAC;IAET,cAAc;IACd,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACvE,OAAO,IAAI,CAAC,CAAC,CAAE,CAAC;AAClB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;IACzB,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;AAC3D,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY;IAC5C,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;IACzB,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 字数统计与截断工具
|
|
3
|
+
*
|
|
4
|
+
* 职责:
|
|
5
|
+
* - 统计中文字符数、综合字数(中文 + 英文)
|
|
6
|
+
* - 按限制截断文本
|
|
7
|
+
* - 估算 Token 数(用于 LLM 上下文窗口控制)
|
|
8
|
+
*
|
|
9
|
+
* @module services/word-count
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* 统计字符串中的中文字符数。
|
|
13
|
+
* 仅统计 Unicode 中的 CJK 统一表意文字(一-鿿)。
|
|
14
|
+
*
|
|
15
|
+
* @param text - 待统计的文本
|
|
16
|
+
* @returns 中文字符数量
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* countChineseChars('Hello 世界') // => 2
|
|
20
|
+
*/
|
|
21
|
+
export declare function countChineseChars(text: string): number;
|
|
22
|
+
/**
|
|
23
|
+
* 综合字数统计。
|
|
24
|
+
* - 中文字符:每个计 1 字
|
|
25
|
+
* - 英文单词:按空白或标点分隔的连续字母序列,每个计 1 词
|
|
26
|
+
* - 数字序列:每个连续数字序列计 1 词
|
|
27
|
+
*
|
|
28
|
+
* @param text - 待统计的文本
|
|
29
|
+
* @returns 综合字数
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* countWords('Hello 世界 foo bar') // => 4 (Hello + 世界 + foo + bar)
|
|
33
|
+
*/
|
|
34
|
+
export declare function countWords(text: string): number;
|
|
35
|
+
/**
|
|
36
|
+
* 将文本截断至指定字数限制,保留完整单词。
|
|
37
|
+
* 截断后追加 `[已截断]` 标记。
|
|
38
|
+
* 如果文本已在限制内,则原样返回。
|
|
39
|
+
*
|
|
40
|
+
* @param text - 原始文本
|
|
41
|
+
* @param limit - 字数上限
|
|
42
|
+
* @returns 截断后的文本(带标记)或原文本
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* truncateToLimit('这是一段很长的文本内容', 3)
|
|
46
|
+
* // => '这是一[已截断]'
|
|
47
|
+
*/
|
|
48
|
+
export declare function truncateToLimit(text: string, limit: number): string;
|
|
49
|
+
/**
|
|
50
|
+
* 粗略估算 Token 数。
|
|
51
|
+
* - 中文:约每 1.5 个字符计 1 token
|
|
52
|
+
* - 英文:按空格分词,每词约 1.3 token
|
|
53
|
+
*
|
|
54
|
+
* @param text - 待估算的文本
|
|
55
|
+
* @returns 预估 Token 数量
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* estimateTokens('Hello 世界') // => ~3 (2 english tokens + 1.3 chinese tokens)
|
|
59
|
+
*/
|
|
60
|
+
export declare function estimateTokens(text: string): number;
|
|
61
|
+
//# sourceMappingURL=word-count.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"word-count.d.ts","sourceRoot":"","sources":["../../src/services/word-count.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGtD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQ/C;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAqCnE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAWnD"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 字数统计与截断工具
|
|
3
|
+
*
|
|
4
|
+
* 职责:
|
|
5
|
+
* - 统计中文字符数、综合字数(中文 + 英文)
|
|
6
|
+
* - 按限制截断文本
|
|
7
|
+
* - 估算 Token 数(用于 LLM 上下文窗口控制)
|
|
8
|
+
*
|
|
9
|
+
* @module services/word-count
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* 统计字符串中的中文字符数。
|
|
13
|
+
* 仅统计 Unicode 中的 CJK 统一表意文字(一-鿿)。
|
|
14
|
+
*
|
|
15
|
+
* @param text - 待统计的文本
|
|
16
|
+
* @returns 中文字符数量
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* countChineseChars('Hello 世界') // => 2
|
|
20
|
+
*/
|
|
21
|
+
export function countChineseChars(text) {
|
|
22
|
+
const matches = text.match(/[一-鿿]/g);
|
|
23
|
+
return matches ? matches.length : 0;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 综合字数统计。
|
|
27
|
+
* - 中文字符:每个计 1 字
|
|
28
|
+
* - 英文单词:按空白或标点分隔的连续字母序列,每个计 1 词
|
|
29
|
+
* - 数字序列:每个连续数字序列计 1 词
|
|
30
|
+
*
|
|
31
|
+
* @param text - 待统计的文本
|
|
32
|
+
* @returns 综合字数
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* countWords('Hello 世界 foo bar') // => 4 (Hello + 世界 + foo + bar)
|
|
36
|
+
*/
|
|
37
|
+
export function countWords(text) {
|
|
38
|
+
const chineseCount = countChineseChars(text);
|
|
39
|
+
// 移去中文字符后,按空白和标点分割英文/数字单词
|
|
40
|
+
const nonChinese = text.replace(/[一-鿿]/g, ' ');
|
|
41
|
+
const englishWords = nonChinese
|
|
42
|
+
.split(/[\s,.;:!?()\[\]{}"'\-_/@#$%^&*+=<>~`|]+/)
|
|
43
|
+
.filter(Boolean);
|
|
44
|
+
return chineseCount + englishWords.length;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 将文本截断至指定字数限制,保留完整单词。
|
|
48
|
+
* 截断后追加 `[已截断]` 标记。
|
|
49
|
+
* 如果文本已在限制内,则原样返回。
|
|
50
|
+
*
|
|
51
|
+
* @param text - 原始文本
|
|
52
|
+
* @param limit - 字数上限
|
|
53
|
+
* @returns 截断后的文本(带标记)或原文本
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* truncateToLimit('这是一段很长的文本内容', 3)
|
|
57
|
+
* // => '这是一[已截断]'
|
|
58
|
+
*/
|
|
59
|
+
export function truncateToLimit(text, limit) {
|
|
60
|
+
if (limit <= 0)
|
|
61
|
+
return '[已截断]';
|
|
62
|
+
const currentCount = countWords(text);
|
|
63
|
+
if (currentCount <= limit)
|
|
64
|
+
return text;
|
|
65
|
+
// 按字符遍历,逐个检查累计字数
|
|
66
|
+
let result = '';
|
|
67
|
+
let accumulated = 0;
|
|
68
|
+
for (const char of text) {
|
|
69
|
+
const isChinese = /[一-鿿]/.test(char);
|
|
70
|
+
const isSpaceOrPunct = /[\s,.;:!?()\[\]{}"'\-_/@#$%^&*+=<>~`|]/.test(char);
|
|
71
|
+
if (isChinese) {
|
|
72
|
+
if (accumulated + 1 > limit)
|
|
73
|
+
break;
|
|
74
|
+
result += char;
|
|
75
|
+
accumulated += 1;
|
|
76
|
+
}
|
|
77
|
+
else if (isSpaceOrPunct) {
|
|
78
|
+
// 标点和空白不计入字数,但保留
|
|
79
|
+
result += char;
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
// 英文字母或数字:尝试读入完整单词
|
|
83
|
+
const remaining = text.slice(text.length - text.slice(result.length).length);
|
|
84
|
+
const wordMatch = remaining.match(/^[^\s一-鿿]+/);
|
|
85
|
+
if (wordMatch) {
|
|
86
|
+
const word = wordMatch[0];
|
|
87
|
+
if (accumulated + 1 > limit)
|
|
88
|
+
break;
|
|
89
|
+
result += word;
|
|
90
|
+
accumulated += 1;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
result += char;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return result + '[已截断]';
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* 粗略估算 Token 数。
|
|
101
|
+
* - 中文:约每 1.5 个字符计 1 token
|
|
102
|
+
* - 英文:按空格分词,每词约 1.3 token
|
|
103
|
+
*
|
|
104
|
+
* @param text - 待估算的文本
|
|
105
|
+
* @returns 预估 Token 数量
|
|
106
|
+
*
|
|
107
|
+
* @example
|
|
108
|
+
* estimateTokens('Hello 世界') // => ~3 (2 english tokens + 1.3 chinese tokens)
|
|
109
|
+
*/
|
|
110
|
+
export function estimateTokens(text) {
|
|
111
|
+
const chineseCount = countChineseChars(text);
|
|
112
|
+
const chineseTokens = Math.ceil(chineseCount / 1.5);
|
|
113
|
+
const nonChinese = text.replace(/[一-鿿]/g, ' ');
|
|
114
|
+
const englishWords = nonChinese
|
|
115
|
+
.split(/[\s,.;:!?()\[\]{}"'\-_/@#$%^&*+=<>~`|]+/)
|
|
116
|
+
.filter(Boolean);
|
|
117
|
+
const englishTokens = englishWords.reduce((sum, w) => sum + Math.ceil(w.length / 3), 0);
|
|
118
|
+
return chineseTokens + englishTokens;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=word-count.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"word-count.js","sourceRoot":"","sources":["../../src/services/word-count.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 辅助类工具(Auxiliary)
|
|
3
|
+
*
|
|
4
|
+
* 提供帮助信息、资源列表、状态查询、版本信息、配置管理等功能。
|
|
5
|
+
* 返回值均为元信息,不涉及业务数据。
|
|
6
|
+
*
|
|
7
|
+
* @module tools/auxiliary
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* 输出所有可用的命令和工具帮助信息。
|
|
11
|
+
*
|
|
12
|
+
* @param command - 可选命令名称,不指定则输出所有
|
|
13
|
+
* @returns 帮助文本
|
|
14
|
+
*/
|
|
15
|
+
export declare function help(command?: string): Promise<string>;
|
|
16
|
+
/**
|
|
17
|
+
* 列出可用资源。
|
|
18
|
+
*
|
|
19
|
+
* @param type - 资源类型 "pools" | "stocks" | "tools"
|
|
20
|
+
* @returns 资源列表
|
|
21
|
+
*/
|
|
22
|
+
export declare function listResources(type: 'pools' | 'stocks' | 'tools'): Promise<{
|
|
23
|
+
items: {
|
|
24
|
+
id: string;
|
|
25
|
+
name: string;
|
|
26
|
+
}[];
|
|
27
|
+
}>;
|
|
28
|
+
/**
|
|
29
|
+
* 查看系统简要运行状态。
|
|
30
|
+
*
|
|
31
|
+
* @returns { status: 'running' | 'error', version: string, uptime: number }
|
|
32
|
+
*/
|
|
33
|
+
export declare function showState(): Promise<{
|
|
34
|
+
status: "running";
|
|
35
|
+
version: string;
|
|
36
|
+
uptime: number;
|
|
37
|
+
}>;
|
|
38
|
+
/**
|
|
39
|
+
* 输出版本信息。
|
|
40
|
+
*
|
|
41
|
+
* @returns 版本字符串
|
|
42
|
+
*/
|
|
43
|
+
export declare function showVersion(): Promise<string>;
|
|
44
|
+
/**
|
|
45
|
+
* 查看指定配置项或所有配置。
|
|
46
|
+
*
|
|
47
|
+
* 查询优先级:DB → process.env → null。
|
|
48
|
+
* DB 中不存在的键会 fallback 到 .env 环境变量。
|
|
49
|
+
*
|
|
50
|
+
* @param key - 可选配置键名,不指定则返回所有配置
|
|
51
|
+
* @returns 配置键值对
|
|
52
|
+
*/
|
|
53
|
+
export declare function getConfig(key?: string): Promise<{
|
|
54
|
+
key: string;
|
|
55
|
+
value: string;
|
|
56
|
+
source?: undefined;
|
|
57
|
+
config?: undefined;
|
|
58
|
+
} | {
|
|
59
|
+
key: string;
|
|
60
|
+
value: string;
|
|
61
|
+
source: string;
|
|
62
|
+
config?: undefined;
|
|
63
|
+
} | {
|
|
64
|
+
key: string;
|
|
65
|
+
value: null;
|
|
66
|
+
source?: undefined;
|
|
67
|
+
config?: undefined;
|
|
68
|
+
} | {
|
|
69
|
+
config: Record<string, string>;
|
|
70
|
+
key?: undefined;
|
|
71
|
+
value?: undefined;
|
|
72
|
+
source?: undefined;
|
|
73
|
+
}>;
|
|
74
|
+
/**
|
|
75
|
+
* 修改配置项。
|
|
76
|
+
*
|
|
77
|
+
* 同时更新 DB 和运行时的 process.env,确保对同一进程后续读取生效。
|
|
78
|
+
*
|
|
79
|
+
* @param key - 配置键名
|
|
80
|
+
* @param value - 配置值
|
|
81
|
+
* @returns { success: true }
|
|
82
|
+
*/
|
|
83
|
+
export declare function setConfig(key: string, value: string): Promise<{
|
|
84
|
+
success: true;
|
|
85
|
+
error?: undefined;
|
|
86
|
+
} | {
|
|
87
|
+
success: false;
|
|
88
|
+
error: {
|
|
89
|
+
code: string;
|
|
90
|
+
message: string;
|
|
91
|
+
};
|
|
92
|
+
}>;
|
|
93
|
+
//# sourceMappingURL=auxiliary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auxiliary.d.ts","sourceRoot":"","sources":["../../src/tools/auxiliary.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH;;;;;GAKG;AACH,wBAAsB,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqD5D;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO;;;;;GAoCrE;AAED;;;;GAIG;AACH,wBAAsB,SAAS;;;;GAM9B;AAED;;;;GAIG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAEnD;AAED;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;GA+B3C;AAED;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;;;;;;;;;GAiBzD"}
|