@cicctencent/agent-midway 0.1.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.
Files changed (160) hide show
  1. package/README.md +280 -0
  2. package/dist/adapters/express.d.ts +8 -0
  3. package/dist/adapters/express.js +91 -0
  4. package/dist/adapters/index.d.ts +5 -0
  5. package/dist/adapters/index.js +21 -0
  6. package/dist/adapters/koa.d.ts +3 -0
  7. package/dist/adapters/koa.js +75 -0
  8. package/dist/adapters/midway.d.ts +5 -0
  9. package/dist/adapters/midway.js +11 -0
  10. package/dist/adapters/next.d.ts +12 -0
  11. package/dist/adapters/next.js +89 -0
  12. package/dist/adapters/shared.d.ts +4 -0
  13. package/dist/adapters/shared.js +31 -0
  14. package/dist/channel/dingtalk.d.ts +18 -0
  15. package/dist/channel/dingtalk.js +68 -0
  16. package/dist/channel/feishu.d.ts +20 -0
  17. package/dist/channel/feishu.js +96 -0
  18. package/dist/channel/index.d.ts +46 -0
  19. package/dist/channel/index.js +311 -0
  20. package/dist/channel/types.d.ts +77 -0
  21. package/dist/channel/types.js +7 -0
  22. package/dist/channel/wecom.d.ts +22 -0
  23. package/dist/channel/wecom.js +106 -0
  24. package/dist/component.d.ts +49 -0
  25. package/dist/component.js +129 -0
  26. package/dist/connector/calendar-adapter.d.ts +19 -0
  27. package/dist/connector/calendar-adapter.js +236 -0
  28. package/dist/connector/db-adapter.d.ts +28 -0
  29. package/dist/connector/db-adapter.js +193 -0
  30. package/dist/connector/email-adapter.d.ts +23 -0
  31. package/dist/connector/email-adapter.js +192 -0
  32. package/dist/connector/fs-adapter.d.ts +15 -0
  33. package/dist/connector/fs-adapter.js +199 -0
  34. package/dist/connector/http-adapter.d.ts +29 -0
  35. package/dist/connector/http-adapter.js +181 -0
  36. package/dist/connector/index.d.ts +24 -0
  37. package/dist/connector/index.js +454 -0
  38. package/dist/connector/mcp-adapter.d.ts +27 -0
  39. package/dist/connector/mcp-adapter.js +156 -0
  40. package/dist/connector/mq-adapter.d.ts +25 -0
  41. package/dist/connector/mq-adapter.js +181 -0
  42. package/dist/connector/types.d.ts +205 -0
  43. package/dist/connector/types.js +9 -0
  44. package/dist/controller/a2a.controller.d.ts +41 -0
  45. package/dist/controller/a2a.controller.js +150 -0
  46. package/dist/controller/agent-profile.controller.d.ts +97 -0
  47. package/dist/controller/agent-profile.controller.js +200 -0
  48. package/dist/controller/agent.controller.d.ts +199 -0
  49. package/dist/controller/agent.controller.js +414 -0
  50. package/dist/controller/application.controller.d.ts +113 -0
  51. package/dist/controller/application.controller.js +217 -0
  52. package/dist/controller/automation.controller.d.ts +113 -0
  53. package/dist/controller/automation.controller.js +246 -0
  54. package/dist/controller/channel.controller.d.ts +73 -0
  55. package/dist/controller/channel.controller.js +183 -0
  56. package/dist/controller/chat.controller.d.ts +188 -0
  57. package/dist/controller/chat.controller.js +375 -0
  58. package/dist/controller/connector.controller.d.ts +134 -0
  59. package/dist/controller/connector.controller.js +257 -0
  60. package/dist/controller/knowledge-base.controller.d.ts +157 -0
  61. package/dist/controller/knowledge-base.controller.js +278 -0
  62. package/dist/controller/mcp-server.controller.d.ts +115 -0
  63. package/dist/controller/mcp-server.controller.js +236 -0
  64. package/dist/controller/model-config.controller.d.ts +139 -0
  65. package/dist/controller/model-config.controller.js +274 -0
  66. package/dist/controller/observability.controller.d.ts +124 -0
  67. package/dist/controller/observability.controller.js +142 -0
  68. package/dist/controller/security.controller.d.ts +91 -0
  69. package/dist/controller/security.controller.js +172 -0
  70. package/dist/controller/settings.controller.d.ts +83 -0
  71. package/dist/controller/settings.controller.js +280 -0
  72. package/dist/core/ai-workstation.d.ts +17 -0
  73. package/dist/core/ai-workstation.js +129 -0
  74. package/dist/core/index.d.ts +4 -0
  75. package/dist/core/index.js +20 -0
  76. package/dist/core/service-container.d.ts +12 -0
  77. package/dist/core/service-container.js +54 -0
  78. package/dist/core/sse.d.ts +6 -0
  79. package/dist/core/sse.js +56 -0
  80. package/dist/core/types.d.ts +72 -0
  81. package/dist/core/types.js +2 -0
  82. package/dist/dto/agent.dto.d.ts +21 -0
  83. package/dist/dto/agent.dto.js +79 -0
  84. package/dist/dto/ai-config.dto.d.ts +67 -0
  85. package/dist/dto/ai-config.dto.js +249 -0
  86. package/dist/dto/chat.dto.d.ts +40 -0
  87. package/dist/dto/chat.dto.js +122 -0
  88. package/dist/index.d.ts +101 -0
  89. package/dist/index.js +195 -0
  90. package/dist/memory/db-store.d.ts +33 -0
  91. package/dist/memory/db-store.js +143 -0
  92. package/dist/memory/index.d.ts +187 -0
  93. package/dist/memory/index.js +443 -0
  94. package/dist/model/ai-agent-profile.entity.d.ts +32 -0
  95. package/dist/model/ai-agent-profile.entity.js +289 -0
  96. package/dist/model/ai-application.entity.d.ts +20 -0
  97. package/dist/model/ai-application.entity.js +166 -0
  98. package/dist/model/ai-chat-memory.entity.d.ts +16 -0
  99. package/dist/model/ai-chat-memory.entity.js +123 -0
  100. package/dist/model/ai-chat-message.entity.d.ts +16 -0
  101. package/dist/model/ai-chat-message.entity.js +122 -0
  102. package/dist/model/ai-chat-skill.entity.d.ts +19 -0
  103. package/dist/model/ai-chat-skill.entity.js +155 -0
  104. package/dist/model/ai-chat-thread.entity.d.ts +15 -0
  105. package/dist/model/ai-chat-thread.entity.js +113 -0
  106. package/dist/model/ai-chat-workspace.entity.d.ts +17 -0
  107. package/dist/model/ai-chat-workspace.entity.js +136 -0
  108. package/dist/model/ai-kb-document.entity.d.ts +16 -0
  109. package/dist/model/ai-kb-document.entity.js +122 -0
  110. package/dist/model/ai-knowledge-base.entity.d.ts +22 -0
  111. package/dist/model/ai-knowledge-base.entity.js +185 -0
  112. package/dist/model/ai-mcp-server.entity.d.ts +23 -0
  113. package/dist/model/ai-mcp-server.entity.js +198 -0
  114. package/dist/model/ai-model-config.entity.d.ts +24 -0
  115. package/dist/model/ai-model-config.entity.js +200 -0
  116. package/dist/service/a2a.service.d.ts +142 -0
  117. package/dist/service/a2a.service.js +537 -0
  118. package/dist/service/agent-profile.service.d.ts +34 -0
  119. package/dist/service/agent-profile.service.js +110 -0
  120. package/dist/service/agent-server.service.d.ts +91 -0
  121. package/dist/service/agent-server.service.js +634 -0
  122. package/dist/service/agent-task-queue.service.d.ts +98 -0
  123. package/dist/service/agent-task-queue.service.js +283 -0
  124. package/dist/service/ai-chat.service.d.ts +103 -0
  125. package/dist/service/ai-chat.service.js +431 -0
  126. package/dist/service/ai-skill.service.d.ts +116 -0
  127. package/dist/service/ai-skill.service.js +457 -0
  128. package/dist/service/application.service.d.ts +42 -0
  129. package/dist/service/application.service.js +139 -0
  130. package/dist/service/automation.service.d.ts +37 -0
  131. package/dist/service/automation.service.js +196 -0
  132. package/dist/service/connector.service.d.ts +136 -0
  133. package/dist/service/connector.service.js +524 -0
  134. package/dist/service/knowledge-base.service.d.ts +138 -0
  135. package/dist/service/knowledge-base.service.js +528 -0
  136. package/dist/service/mcp-server.service.d.ts +39 -0
  137. package/dist/service/mcp-server.service.js +143 -0
  138. package/dist/service/model-config.service.d.ts +57 -0
  139. package/dist/service/model-config.service.js +168 -0
  140. package/dist/service/observability.service.d.ts +145 -0
  141. package/dist/service/observability.service.js +281 -0
  142. package/dist/service/openai.service.d.ts +88 -0
  143. package/dist/service/openai.service.js +406 -0
  144. package/dist/service/prompt-builder.service.d.ts +50 -0
  145. package/dist/service/prompt-builder.service.js +246 -0
  146. package/dist/tools/code-exec.tool.d.ts +37 -0
  147. package/dist/tools/code-exec.tool.js +162 -0
  148. package/dist/tools/datetime.tool.d.ts +21 -0
  149. package/dist/tools/datetime.tool.js +379 -0
  150. package/dist/tools/http-request.tool.d.ts +43 -0
  151. package/dist/tools/http-request.tool.js +455 -0
  152. package/dist/tools/registry.d.ts +71 -0
  153. package/dist/tools/registry.js +77 -0
  154. package/dist/tools/text-process.tool.d.ts +7 -0
  155. package/dist/tools/text-process.tool.js +366 -0
  156. package/dist/tools/web-search.tool.d.ts +28 -0
  157. package/dist/tools/web-search.tool.js +304 -0
  158. package/dist/types.d.ts +70 -0
  159. package/dist/types.js +7 -0
  160. package/package.json +69 -0
@@ -0,0 +1,98 @@
1
+ import { AgentServerService, AgentRunEvent, AgentRunOptions } from './agent-server.service';
2
+ /**
3
+ * 任务状态
4
+ */
5
+ export type TaskStatus = 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';
6
+ /**
7
+ * 任务信息
8
+ */
9
+ export interface AgentTask {
10
+ taskId: string;
11
+ status: TaskStatus;
12
+ userId: string;
13
+ threadId?: number;
14
+ profileId?: number;
15
+ prompt: string;
16
+ options?: AgentRunOptions;
17
+ createdAt: number;
18
+ startedAt?: number;
19
+ completedAt?: number;
20
+ result?: any;
21
+ error?: string;
22
+ events: AgentRunEvent[];
23
+ }
24
+ /**
25
+ * Agent 任务队列服务
26
+ *
27
+ * 管理并发 Agent 任务执行:
28
+ * - 限制同时运行的任务数量
29
+ * - 支持任务取消
30
+ * - 支持事件流订阅
31
+ */
32
+ export declare class AgentTaskQueueService {
33
+ /** 最大并发数 */
34
+ private maxConcurrency;
35
+ /** 任务存储 */
36
+ private tasks;
37
+ /** 运行中的任务数量 */
38
+ private runningCount;
39
+ /** 任务订阅者 */
40
+ private subscribers;
41
+ /** 清理定时器 */
42
+ private cleanupTimer?;
43
+ /** 任务 TTL(毫秒) */
44
+ private taskTTL;
45
+ init(): Promise<void>;
46
+ destroy(): Promise<void>;
47
+ /**
48
+ * 提交任务
49
+ */
50
+ submit(agentServer: AgentServerService, prompt: string, userId: string, options?: AgentRunOptions): Promise<string>;
51
+ /**
52
+ * 尝试执行下一个任务
53
+ */
54
+ private tryExecuteNext;
55
+ /**
56
+ * 执行任务
57
+ */
58
+ private executeTask;
59
+ /**
60
+ * 订阅任务事件
61
+ */
62
+ subscribe(taskId: string, callback: (event: AgentRunEvent) => void): () => void;
63
+ /**
64
+ * 通知订阅者
65
+ */
66
+ private notifySubscribers;
67
+ /**
68
+ * 获取任务状态
69
+ */
70
+ getTask(taskId: string): AgentTask | undefined;
71
+ /**
72
+ * 获取用户的所有任务
73
+ */
74
+ getUserTasks(userId: string): AgentTask[];
75
+ /**
76
+ * 取消任务
77
+ */
78
+ cancelTask(taskId: string): boolean;
79
+ /**
80
+ * 获取队列状态
81
+ */
82
+ getStatus(): {
83
+ total: number;
84
+ pending: number;
85
+ running: number;
86
+ completed: number;
87
+ failed: number;
88
+ maxConcurrency: number;
89
+ };
90
+ /**
91
+ * 清理过期任务
92
+ */
93
+ private cleanupOldTasks;
94
+ /**
95
+ * 等待任务完成
96
+ */
97
+ waitForCompletion(taskId: string, timeout?: number): Promise<AgentTask>;
98
+ }
@@ -0,0 +1,283 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.AgentTaskQueueService = void 0;
13
+ const core_1 = require("@midwayjs/core");
14
+ /**
15
+ * Agent 任务队列服务
16
+ *
17
+ * 管理并发 Agent 任务执行:
18
+ * - 限制同时运行的任务数量
19
+ * - 支持任务取消
20
+ * - 支持事件流订阅
21
+ */
22
+ let AgentTaskQueueService = class AgentTaskQueueService {
23
+ constructor() {
24
+ /** 最大并发数 */
25
+ this.maxConcurrency = 5;
26
+ /** 任务存储 */
27
+ this.tasks = new Map();
28
+ /** 运行中的任务数量 */
29
+ this.runningCount = 0;
30
+ /** 任务订阅者 */
31
+ this.subscribers = new Map();
32
+ /** 任务 TTL(毫秒) */
33
+ this.taskTTL = 30 * 60 * 1000;
34
+ }
35
+ async init() {
36
+ // 启动清理定时器
37
+ this.cleanupTimer = setInterval(() => {
38
+ this.cleanupOldTasks();
39
+ }, 5 * 60 * 1000);
40
+ console.log(`[AgentTaskQueueService] 初始化完成,最大并发: ${this.maxConcurrency}`);
41
+ }
42
+ async destroy() {
43
+ if (this.cleanupTimer) {
44
+ clearInterval(this.cleanupTimer);
45
+ }
46
+ // 取消所有运行中的任务
47
+ for (const [_taskId, task] of this.tasks) {
48
+ if (task.status === 'running') {
49
+ task.status = 'cancelled';
50
+ }
51
+ }
52
+ console.log('[AgentTaskQueueService] 已销毁');
53
+ }
54
+ /**
55
+ * 提交任务
56
+ */
57
+ async submit(agentServer, prompt, userId, options) {
58
+ const taskId = `task_${Date.now()}_${Math.random()
59
+ .toString(36)
60
+ .substr(2, 9)}`;
61
+ const task = {
62
+ taskId,
63
+ status: 'pending',
64
+ userId,
65
+ threadId: options?.threadId ? Number(options.threadId) : undefined,
66
+ profileId: options?.profileId ? Number(options.profileId) : undefined,
67
+ prompt,
68
+ options,
69
+ createdAt: Date.now(),
70
+ events: [],
71
+ };
72
+ this.tasks.set(taskId, task);
73
+ // 尝试执行
74
+ this.tryExecuteNext(agentServer);
75
+ return taskId;
76
+ }
77
+ /**
78
+ * 尝试执行下一个任务
79
+ */
80
+ async tryExecuteNext(agentServer) {
81
+ if (this.runningCount >= this.maxConcurrency) {
82
+ return;
83
+ }
84
+ // 获取下一个待执行任务
85
+ const pendingTask = Array.from(this.tasks.values())
86
+ .filter(t => t.status === 'pending')
87
+ .sort((a, b) => a.createdAt - b.createdAt)[0];
88
+ if (!pendingTask) {
89
+ return;
90
+ }
91
+ // 执行任务
92
+ this.executeTask(agentServer, pendingTask);
93
+ }
94
+ /**
95
+ * 执行任务
96
+ */
97
+ async executeTask(agentServer, task) {
98
+ task.status = 'running';
99
+ task.startedAt = Date.now();
100
+ this.runningCount++;
101
+ try {
102
+ // 运行 Agent
103
+ for await (const event of agentServer.runAgentStream(task.prompt, task.options)) {
104
+ // 记录事件
105
+ task.events.push(event);
106
+ // 通知订阅者
107
+ this.notifySubscribers(task.taskId, event);
108
+ }
109
+ // 任务完成
110
+ task.status = 'completed';
111
+ task.completedAt = Date.now();
112
+ const lastEvent = task.events[task.events.length - 1];
113
+ if (lastEvent?.type === 'done') {
114
+ task.result = lastEvent.data;
115
+ }
116
+ }
117
+ catch (error) {
118
+ task.status = 'failed';
119
+ task.completedAt = Date.now();
120
+ task.error = error.message;
121
+ // 发送错误事件
122
+ const errorEvent = {
123
+ type: 'error',
124
+ data: { message: error.message },
125
+ timestamp: Date.now(),
126
+ };
127
+ task.events.push(errorEvent);
128
+ this.notifySubscribers(task.taskId, errorEvent);
129
+ }
130
+ finally {
131
+ this.runningCount--;
132
+ // 尝试执行下一个任务
133
+ this.tryExecuteNext(agentServer);
134
+ }
135
+ }
136
+ /**
137
+ * 订阅任务事件
138
+ */
139
+ subscribe(taskId, callback) {
140
+ if (!this.subscribers.has(taskId)) {
141
+ this.subscribers.set(taskId, new Set());
142
+ }
143
+ this.subscribers.get(taskId).add(callback);
144
+ // 返回取消订阅函数
145
+ return () => {
146
+ this.subscribers.get(taskId)?.delete(callback);
147
+ };
148
+ }
149
+ /**
150
+ * 通知订阅者
151
+ */
152
+ notifySubscribers(taskId, event) {
153
+ const subs = this.subscribers.get(taskId);
154
+ if (subs) {
155
+ for (const callback of subs) {
156
+ try {
157
+ callback(event);
158
+ }
159
+ catch (e) {
160
+ console.error('[AgentTaskQueueService] 订阅回调错误:', e);
161
+ }
162
+ }
163
+ }
164
+ }
165
+ /**
166
+ * 获取任务状态
167
+ */
168
+ getTask(taskId) {
169
+ return this.tasks.get(taskId);
170
+ }
171
+ /**
172
+ * 获取用户的所有任务
173
+ */
174
+ getUserTasks(userId) {
175
+ return Array.from(this.tasks.values())
176
+ .filter(t => t.userId === userId)
177
+ .sort((a, b) => b.createdAt - a.createdAt);
178
+ }
179
+ /**
180
+ * 取消任务
181
+ */
182
+ cancelTask(taskId) {
183
+ const task = this.tasks.get(taskId);
184
+ if (!task)
185
+ return false;
186
+ if (task.status === 'pending') {
187
+ task.status = 'cancelled';
188
+ task.completedAt = Date.now();
189
+ return true;
190
+ }
191
+ // 运行中的任务无法取消(需要 Agent 引擎支持)
192
+ return false;
193
+ }
194
+ /**
195
+ * 获取队列状态
196
+ */
197
+ getStatus() {
198
+ const tasks = Array.from(this.tasks.values());
199
+ return {
200
+ total: tasks.length,
201
+ pending: tasks.filter(t => t.status === 'pending').length,
202
+ running: tasks.filter(t => t.status === 'running').length,
203
+ completed: tasks.filter(t => t.status === 'completed').length,
204
+ failed: tasks.filter(t => t.status === 'failed').length,
205
+ maxConcurrency: this.maxConcurrency,
206
+ };
207
+ }
208
+ /**
209
+ * 清理过期任务
210
+ */
211
+ cleanupOldTasks() {
212
+ const now = Date.now();
213
+ const toRemove = [];
214
+ for (const [taskId, task] of this.tasks) {
215
+ // 保留运行中的任务
216
+ if (task.status === 'running')
217
+ continue;
218
+ // 清理超过 TTL 的任务
219
+ const age = now - (task.completedAt || task.createdAt);
220
+ if (age > this.taskTTL) {
221
+ toRemove.push(taskId);
222
+ }
223
+ }
224
+ for (const taskId of toRemove) {
225
+ this.tasks.delete(taskId);
226
+ this.subscribers.delete(taskId);
227
+ }
228
+ if (toRemove.length > 0) {
229
+ console.log(`[AgentTaskQueueService] 清理了 ${toRemove.length} 个过期任务`);
230
+ }
231
+ }
232
+ /**
233
+ * 等待任务完成
234
+ */
235
+ async waitForCompletion(taskId, timeout) {
236
+ return new Promise((resolve, reject) => {
237
+ const task = this.tasks.get(taskId);
238
+ if (!task) {
239
+ reject(new Error('任务不存在'));
240
+ return;
241
+ }
242
+ // 如果已完成,直接返回
243
+ if (task.status === 'completed' ||
244
+ task.status === 'failed' ||
245
+ task.status === 'cancelled') {
246
+ resolve(task);
247
+ return;
248
+ }
249
+ // 设置超时
250
+ const timeoutId = timeout
251
+ ? setTimeout(() => {
252
+ reject(new Error('等待超时'));
253
+ }, timeout)
254
+ : undefined;
255
+ // 订阅事件
256
+ const unsubscribe = this.subscribe(taskId, event => {
257
+ if (event.type === 'done' || event.type === 'error') {
258
+ if (timeoutId)
259
+ clearTimeout(timeoutId);
260
+ unsubscribe();
261
+ resolve(this.tasks.get(taskId));
262
+ }
263
+ });
264
+ });
265
+ }
266
+ };
267
+ exports.AgentTaskQueueService = AgentTaskQueueService;
268
+ __decorate([
269
+ (0, core_1.Init)(),
270
+ __metadata("design:type", Function),
271
+ __metadata("design:paramtypes", []),
272
+ __metadata("design:returntype", Promise)
273
+ ], AgentTaskQueueService.prototype, "init", null);
274
+ __decorate([
275
+ (0, core_1.Destroy)(),
276
+ __metadata("design:type", Function),
277
+ __metadata("design:paramtypes", []),
278
+ __metadata("design:returntype", Promise)
279
+ ], AgentTaskQueueService.prototype, "destroy", null);
280
+ exports.AgentTaskQueueService = AgentTaskQueueService = __decorate([
281
+ (0, core_1.Provide)(),
282
+ (0, core_1.Scope)(core_1.ScopeEnum.Singleton)
283
+ ], AgentTaskQueueService);
@@ -0,0 +1,103 @@
1
+ import { BaseService } from '@cicctencent/midwayjs-base';
2
+ import { DataSource, Repository } from 'typeorm';
3
+ import AIChatWorkspaceEntity from '../model/ai-chat-workspace.entity';
4
+ import AIChatThreadEntity from '../model/ai-chat-thread.entity';
5
+ import AIChatMessageEntity from '../model/ai-chat-message.entity';
6
+ /** 搜索结果 */
7
+ export interface SearchResult {
8
+ threadId: number;
9
+ threadTitle: string;
10
+ messageId: number;
11
+ role: string;
12
+ content: string;
13
+ createTime: Date;
14
+ snippet: string;
15
+ }
16
+ /** 导出格式 */
17
+ export type ExportFormat = 'markdown' | 'json' | 'text';
18
+ export declare class AIChatService extends BaseService {
19
+ dataSource: DataSource;
20
+ private wsRepo?;
21
+ private thRepo?;
22
+ private msgRepo?;
23
+ get workspaceModel(): Repository<AIChatWorkspaceEntity>;
24
+ get threadModel(): Repository<AIChatThreadEntity>;
25
+ get messageModel(): Repository<AIChatMessageEntity>;
26
+ getWorkspaces(userId: string, applicationId: number): Promise<AIChatWorkspaceEntity[]>;
27
+ getWorkspace(id: number, userId: string, applicationId: number): Promise<AIChatWorkspaceEntity>;
28
+ createWorkspace(userId: string, applicationId: number, data: Partial<AIChatWorkspaceEntity>): Promise<AIChatWorkspaceEntity>;
29
+ updateWorkspace(id: number, userId: string, applicationId: number, data: Partial<AIChatWorkspaceEntity>): Promise<AIChatWorkspaceEntity>;
30
+ deleteWorkspace(id: number, userId: string, applicationId: number): Promise<void>;
31
+ getThreads(workspaceId: number, userId: string, applicationId: number): Promise<AIChatThreadEntity[]>;
32
+ getThread(id: number, userId: string, applicationId: number): Promise<AIChatThreadEntity>;
33
+ createThread(userId: string, applicationId: number, data: {
34
+ workspaceId: number;
35
+ title?: string;
36
+ }): Promise<AIChatThreadEntity>;
37
+ updateThread(id: number, userId: string, applicationId: number, data: Partial<AIChatThreadEntity>): Promise<AIChatThreadEntity>;
38
+ deleteThread(id: number, userId: string, applicationId: number): Promise<void>;
39
+ getMessages(threadId: number, userId: string, applicationId: number, options?: {
40
+ limit?: number;
41
+ offset?: number;
42
+ }): Promise<{
43
+ items: AIChatMessageEntity[];
44
+ total: number;
45
+ hasMore: boolean;
46
+ }>;
47
+ addMessage(userId: string, applicationId: number, data: {
48
+ threadId: number;
49
+ role: string;
50
+ content: string;
51
+ type?: string;
52
+ meta?: any;
53
+ }): Promise<AIChatMessageEntity>;
54
+ updateMessage(id: number, userId: string, applicationId: number, data: {
55
+ content?: string;
56
+ meta?: any;
57
+ }): Promise<AIChatMessageEntity>;
58
+ deleteMessage(id: number, userId: string, applicationId: number): Promise<void>;
59
+ clearThreadMessages(threadId: number, userId: string, applicationId: number): Promise<void>;
60
+ /** 初始化默认工作空间(新用户首次使用时,可由业务层覆盖) */
61
+ ensureDefaultWorkspaces(userId: string, applicationId: number): Promise<void>;
62
+ /**
63
+ * 全局搜索对话消息
64
+ * @param query 搜索关键词
65
+ * @param options.workspaceId 限定工作空间
66
+ * @param options.limit 结果上限
67
+ */
68
+ searchMessages(query: string, options?: {
69
+ workspaceId?: number;
70
+ limit?: number;
71
+ }): Promise<SearchResult[]>;
72
+ /**
73
+ * 导出对话为指定格式
74
+ * @param threadId 线程 ID
75
+ * @param format 导出格式:markdown / json / text
76
+ * @param userId 用户 ID
77
+ * @param applicationId 应用 ID
78
+ */
79
+ exportThread(threadId: number, format: 'markdown' | 'json' | 'text', userId: string, applicationId: number): Promise<string>;
80
+ private exportAsMarkdown;
81
+ private exportAsText;
82
+ /** 单条工具输出截断长度 */
83
+ private static readonly MAX_TOOL_OUTPUT_LEN;
84
+ /** 最终 LLM 消息数硬上限 */
85
+ private static readonly MAX_RESULT_MESSAGES;
86
+ /**
87
+ * 判断 assistant 消息是否应排除出历史(精简 token)
88
+ */
89
+ private shouldSkipMessage;
90
+ /**
91
+ * 从已持久化的消息记录重建 LLM 格式的对话历史(用于 AgentEngine)
92
+ *
93
+ * @param threadId 线程 ID
94
+ * @param userId 用户 ID
95
+ * @param applicationId 应用 ID
96
+ * @param limit 最大 DB 消息数,默认 20
97
+ * @returns Message[] 格式的对话历史
98
+ */
99
+ buildThreadHistory(threadId: number, userId: string, applicationId: number, limit?: number): Promise<Array<{
100
+ role: string;
101
+ content: string;
102
+ }>>;
103
+ }