@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.
- package/README.md +280 -0
- package/dist/adapters/express.d.ts +8 -0
- package/dist/adapters/express.js +91 -0
- package/dist/adapters/index.d.ts +5 -0
- package/dist/adapters/index.js +21 -0
- package/dist/adapters/koa.d.ts +3 -0
- package/dist/adapters/koa.js +75 -0
- package/dist/adapters/midway.d.ts +5 -0
- package/dist/adapters/midway.js +11 -0
- package/dist/adapters/next.d.ts +12 -0
- package/dist/adapters/next.js +89 -0
- package/dist/adapters/shared.d.ts +4 -0
- package/dist/adapters/shared.js +31 -0
- package/dist/channel/dingtalk.d.ts +18 -0
- package/dist/channel/dingtalk.js +68 -0
- package/dist/channel/feishu.d.ts +20 -0
- package/dist/channel/feishu.js +96 -0
- package/dist/channel/index.d.ts +46 -0
- package/dist/channel/index.js +311 -0
- package/dist/channel/types.d.ts +77 -0
- package/dist/channel/types.js +7 -0
- package/dist/channel/wecom.d.ts +22 -0
- package/dist/channel/wecom.js +106 -0
- package/dist/component.d.ts +49 -0
- package/dist/component.js +129 -0
- package/dist/connector/calendar-adapter.d.ts +19 -0
- package/dist/connector/calendar-adapter.js +236 -0
- package/dist/connector/db-adapter.d.ts +28 -0
- package/dist/connector/db-adapter.js +193 -0
- package/dist/connector/email-adapter.d.ts +23 -0
- package/dist/connector/email-adapter.js +192 -0
- package/dist/connector/fs-adapter.d.ts +15 -0
- package/dist/connector/fs-adapter.js +199 -0
- package/dist/connector/http-adapter.d.ts +29 -0
- package/dist/connector/http-adapter.js +181 -0
- package/dist/connector/index.d.ts +24 -0
- package/dist/connector/index.js +454 -0
- package/dist/connector/mcp-adapter.d.ts +27 -0
- package/dist/connector/mcp-adapter.js +156 -0
- package/dist/connector/mq-adapter.d.ts +25 -0
- package/dist/connector/mq-adapter.js +181 -0
- package/dist/connector/types.d.ts +205 -0
- package/dist/connector/types.js +9 -0
- package/dist/controller/a2a.controller.d.ts +41 -0
- package/dist/controller/a2a.controller.js +150 -0
- package/dist/controller/agent-profile.controller.d.ts +97 -0
- package/dist/controller/agent-profile.controller.js +200 -0
- package/dist/controller/agent.controller.d.ts +199 -0
- package/dist/controller/agent.controller.js +414 -0
- package/dist/controller/application.controller.d.ts +113 -0
- package/dist/controller/application.controller.js +217 -0
- package/dist/controller/automation.controller.d.ts +113 -0
- package/dist/controller/automation.controller.js +246 -0
- package/dist/controller/channel.controller.d.ts +73 -0
- package/dist/controller/channel.controller.js +183 -0
- package/dist/controller/chat.controller.d.ts +188 -0
- package/dist/controller/chat.controller.js +375 -0
- package/dist/controller/connector.controller.d.ts +134 -0
- package/dist/controller/connector.controller.js +257 -0
- package/dist/controller/knowledge-base.controller.d.ts +157 -0
- package/dist/controller/knowledge-base.controller.js +278 -0
- package/dist/controller/mcp-server.controller.d.ts +115 -0
- package/dist/controller/mcp-server.controller.js +236 -0
- package/dist/controller/model-config.controller.d.ts +139 -0
- package/dist/controller/model-config.controller.js +274 -0
- package/dist/controller/observability.controller.d.ts +124 -0
- package/dist/controller/observability.controller.js +142 -0
- package/dist/controller/security.controller.d.ts +91 -0
- package/dist/controller/security.controller.js +172 -0
- package/dist/controller/settings.controller.d.ts +83 -0
- package/dist/controller/settings.controller.js +280 -0
- package/dist/core/ai-workstation.d.ts +17 -0
- package/dist/core/ai-workstation.js +129 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.js +20 -0
- package/dist/core/service-container.d.ts +12 -0
- package/dist/core/service-container.js +54 -0
- package/dist/core/sse.d.ts +6 -0
- package/dist/core/sse.js +56 -0
- package/dist/core/types.d.ts +72 -0
- package/dist/core/types.js +2 -0
- package/dist/dto/agent.dto.d.ts +21 -0
- package/dist/dto/agent.dto.js +79 -0
- package/dist/dto/ai-config.dto.d.ts +67 -0
- package/dist/dto/ai-config.dto.js +249 -0
- package/dist/dto/chat.dto.d.ts +40 -0
- package/dist/dto/chat.dto.js +122 -0
- package/dist/index.d.ts +101 -0
- package/dist/index.js +195 -0
- package/dist/memory/db-store.d.ts +33 -0
- package/dist/memory/db-store.js +143 -0
- package/dist/memory/index.d.ts +187 -0
- package/dist/memory/index.js +443 -0
- package/dist/model/ai-agent-profile.entity.d.ts +32 -0
- package/dist/model/ai-agent-profile.entity.js +289 -0
- package/dist/model/ai-application.entity.d.ts +20 -0
- package/dist/model/ai-application.entity.js +166 -0
- package/dist/model/ai-chat-memory.entity.d.ts +16 -0
- package/dist/model/ai-chat-memory.entity.js +123 -0
- package/dist/model/ai-chat-message.entity.d.ts +16 -0
- package/dist/model/ai-chat-message.entity.js +122 -0
- package/dist/model/ai-chat-skill.entity.d.ts +19 -0
- package/dist/model/ai-chat-skill.entity.js +155 -0
- package/dist/model/ai-chat-thread.entity.d.ts +15 -0
- package/dist/model/ai-chat-thread.entity.js +113 -0
- package/dist/model/ai-chat-workspace.entity.d.ts +17 -0
- package/dist/model/ai-chat-workspace.entity.js +136 -0
- package/dist/model/ai-kb-document.entity.d.ts +16 -0
- package/dist/model/ai-kb-document.entity.js +122 -0
- package/dist/model/ai-knowledge-base.entity.d.ts +22 -0
- package/dist/model/ai-knowledge-base.entity.js +185 -0
- package/dist/model/ai-mcp-server.entity.d.ts +23 -0
- package/dist/model/ai-mcp-server.entity.js +198 -0
- package/dist/model/ai-model-config.entity.d.ts +24 -0
- package/dist/model/ai-model-config.entity.js +200 -0
- package/dist/service/a2a.service.d.ts +142 -0
- package/dist/service/a2a.service.js +537 -0
- package/dist/service/agent-profile.service.d.ts +34 -0
- package/dist/service/agent-profile.service.js +110 -0
- package/dist/service/agent-server.service.d.ts +91 -0
- package/dist/service/agent-server.service.js +634 -0
- package/dist/service/agent-task-queue.service.d.ts +98 -0
- package/dist/service/agent-task-queue.service.js +283 -0
- package/dist/service/ai-chat.service.d.ts +103 -0
- package/dist/service/ai-chat.service.js +431 -0
- package/dist/service/ai-skill.service.d.ts +116 -0
- package/dist/service/ai-skill.service.js +457 -0
- package/dist/service/application.service.d.ts +42 -0
- package/dist/service/application.service.js +139 -0
- package/dist/service/automation.service.d.ts +37 -0
- package/dist/service/automation.service.js +196 -0
- package/dist/service/connector.service.d.ts +136 -0
- package/dist/service/connector.service.js +524 -0
- package/dist/service/knowledge-base.service.d.ts +138 -0
- package/dist/service/knowledge-base.service.js +528 -0
- package/dist/service/mcp-server.service.d.ts +39 -0
- package/dist/service/mcp-server.service.js +143 -0
- package/dist/service/model-config.service.d.ts +57 -0
- package/dist/service/model-config.service.js +168 -0
- package/dist/service/observability.service.d.ts +145 -0
- package/dist/service/observability.service.js +281 -0
- package/dist/service/openai.service.d.ts +88 -0
- package/dist/service/openai.service.js +406 -0
- package/dist/service/prompt-builder.service.d.ts +50 -0
- package/dist/service/prompt-builder.service.js +246 -0
- package/dist/tools/code-exec.tool.d.ts +37 -0
- package/dist/tools/code-exec.tool.js +162 -0
- package/dist/tools/datetime.tool.d.ts +21 -0
- package/dist/tools/datetime.tool.js +379 -0
- package/dist/tools/http-request.tool.d.ts +43 -0
- package/dist/tools/http-request.tool.js +455 -0
- package/dist/tools/registry.d.ts +71 -0
- package/dist/tools/registry.js +77 -0
- package/dist/tools/text-process.tool.d.ts +7 -0
- package/dist/tools/text-process.tool.js +366 -0
- package/dist/tools/web-search.tool.d.ts +28 -0
- package/dist/tools/web-search.tool.js +304 -0
- package/dist/types.d.ts +70 -0
- package/dist/types.js +7 -0
- package/package.json +69 -0
|
@@ -0,0 +1,172 @@
|
|
|
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
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.SecurityController = void 0;
|
|
16
|
+
const core_1 = require("@midwayjs/core");
|
|
17
|
+
const midwayjs_base_1 = require("@cicctencent/midwayjs-base");
|
|
18
|
+
const agent_server_1 = require("@cicctencent/agent-server");
|
|
19
|
+
/**
|
|
20
|
+
* 安全审计 Controller
|
|
21
|
+
*
|
|
22
|
+
* 使用 agent-server 的安全服务提供:
|
|
23
|
+
* - 工具调用审计日志
|
|
24
|
+
* - 风险评估
|
|
25
|
+
* - 权限审批
|
|
26
|
+
* - 安全策略管理
|
|
27
|
+
*/
|
|
28
|
+
let SecurityController = class SecurityController extends midwayjs_base_1.BaseController {
|
|
29
|
+
/** 获取审计日志列表 */
|
|
30
|
+
async getAuditLogs(body = {}) {
|
|
31
|
+
try {
|
|
32
|
+
const logs = (0, agent_server_1.listAuditLogs)({
|
|
33
|
+
tool: body.tool,
|
|
34
|
+
level: body.level,
|
|
35
|
+
sessionId: body.sessionId,
|
|
36
|
+
limit: body.limit || 50,
|
|
37
|
+
since: body.since,
|
|
38
|
+
until: body.until,
|
|
39
|
+
});
|
|
40
|
+
return { ret: 0, data: logs, msg: 'success' };
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
return { ret: 1, msg: error.message };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** 获取工具风险评估(调用 agent-server 的 assessToolRisk) */
|
|
47
|
+
async getToolRisks(body = {}) {
|
|
48
|
+
try {
|
|
49
|
+
if (body.toolName) {
|
|
50
|
+
// 评估单个工具
|
|
51
|
+
const assessment = (0, agent_server_1.assessToolRisk)(body.toolName);
|
|
52
|
+
return {
|
|
53
|
+
ret: 0,
|
|
54
|
+
data: {
|
|
55
|
+
tool: body.toolName,
|
|
56
|
+
riskLevel: assessment.level,
|
|
57
|
+
description: assessment.reasons.join('; '),
|
|
58
|
+
requiresApproval: assessment.requiresConfirmation,
|
|
59
|
+
},
|
|
60
|
+
msg: 'success',
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
// 无 toolName 时返回策略
|
|
64
|
+
const policy = (0, agent_server_1.getSecurityPolicy)();
|
|
65
|
+
return { ret: 0, data: policy, msg: 'success' };
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
return { ret: 1, msg: error.message };
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/** 获取待审批列表 */
|
|
72
|
+
async getPendingApprovals() {
|
|
73
|
+
try {
|
|
74
|
+
const requests = (0, agent_server_1.listPermissionRequests)('pending');
|
|
75
|
+
return { ret: 0, data: requests, msg: 'success' };
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
return { ret: 1, msg: error.message };
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/** 审批操作 */
|
|
82
|
+
async approveAction(id, body) {
|
|
83
|
+
try {
|
|
84
|
+
const result = (0, agent_server_1.decidePermissionRequest)(id, body.approved, body.reason);
|
|
85
|
+
if (!result) {
|
|
86
|
+
return { ret: 1, msg: 'Permission request not found' };
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
ret: 0,
|
|
90
|
+
data: result,
|
|
91
|
+
msg: body.approved ? '已批准' : '已拒绝',
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
return { ret: 1, msg: error.message };
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/** 更新工具安全策略 */
|
|
99
|
+
async updateToolPolicy(toolName, body) {
|
|
100
|
+
try {
|
|
101
|
+
// 更新安全策略
|
|
102
|
+
const updates = {};
|
|
103
|
+
if (body.riskLevel) {
|
|
104
|
+
updates.toolBaseRisk = updates.toolBaseRisk || {};
|
|
105
|
+
updates.toolBaseRisk[toolName] = body.riskLevel;
|
|
106
|
+
}
|
|
107
|
+
if (body.requiresApproval === false) {
|
|
108
|
+
updates.allowTools = updates.allowTools || [];
|
|
109
|
+
updates.allowTools.push(toolName);
|
|
110
|
+
}
|
|
111
|
+
else if (body.requiresApproval === true) {
|
|
112
|
+
updates.denyTools = updates.denyTools || [];
|
|
113
|
+
updates.denyTools.push(toolName);
|
|
114
|
+
}
|
|
115
|
+
const updated = (0, agent_server_1.updateSecurityPolicy)(updates);
|
|
116
|
+
return {
|
|
117
|
+
ret: 0,
|
|
118
|
+
data: { tool: toolName, ...body, policy: updated },
|
|
119
|
+
msg: '安全策略已更新',
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
return { ret: 1, msg: error.message };
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
exports.SecurityController = SecurityController;
|
|
128
|
+
__decorate([
|
|
129
|
+
(0, core_1.Get)('/audit-logs'),
|
|
130
|
+
midwayjs_base_1.decorators.checkLogin(true),
|
|
131
|
+
__param(0, (0, core_1.Body)()),
|
|
132
|
+
__metadata("design:type", Function),
|
|
133
|
+
__metadata("design:paramtypes", [Object]),
|
|
134
|
+
__metadata("design:returntype", Promise)
|
|
135
|
+
], SecurityController.prototype, "getAuditLogs", null);
|
|
136
|
+
__decorate([
|
|
137
|
+
(0, core_1.Get)('/tool-risks'),
|
|
138
|
+
midwayjs_base_1.decorators.checkLogin(true),
|
|
139
|
+
__param(0, (0, core_1.Body)()),
|
|
140
|
+
__metadata("design:type", Function),
|
|
141
|
+
__metadata("design:paramtypes", [Object]),
|
|
142
|
+
__metadata("design:returntype", Promise)
|
|
143
|
+
], SecurityController.prototype, "getToolRisks", null);
|
|
144
|
+
__decorate([
|
|
145
|
+
(0, core_1.Get)('/approvals/pending'),
|
|
146
|
+
midwayjs_base_1.decorators.checkLogin(true),
|
|
147
|
+
__metadata("design:type", Function),
|
|
148
|
+
__metadata("design:paramtypes", []),
|
|
149
|
+
__metadata("design:returntype", Promise)
|
|
150
|
+
], SecurityController.prototype, "getPendingApprovals", null);
|
|
151
|
+
__decorate([
|
|
152
|
+
(0, core_1.Post)('/approvals/:id'),
|
|
153
|
+
midwayjs_base_1.decorators.checkLogin(true),
|
|
154
|
+
__param(0, (0, core_1.Param)('id')),
|
|
155
|
+
__param(1, (0, core_1.Body)()),
|
|
156
|
+
__metadata("design:type", Function),
|
|
157
|
+
__metadata("design:paramtypes", [String, Object]),
|
|
158
|
+
__metadata("design:returntype", Promise)
|
|
159
|
+
], SecurityController.prototype, "approveAction", null);
|
|
160
|
+
__decorate([
|
|
161
|
+
(0, core_1.Put)('/tool-policy/:toolName'),
|
|
162
|
+
midwayjs_base_1.decorators.checkLogin(true),
|
|
163
|
+
__param(0, (0, core_1.Param)('toolName')),
|
|
164
|
+
__param(1, (0, core_1.Body)()),
|
|
165
|
+
__metadata("design:type", Function),
|
|
166
|
+
__metadata("design:paramtypes", [String, Object]),
|
|
167
|
+
__metadata("design:returntype", Promise)
|
|
168
|
+
], SecurityController.prototype, "updateToolPolicy", null);
|
|
169
|
+
exports.SecurityController = SecurityController = __decorate([
|
|
170
|
+
(0, core_1.Provide)(),
|
|
171
|
+
(0, core_1.Controller)('/api/security')
|
|
172
|
+
], SecurityController);
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { BaseController } from '@cicctencent/midwayjs-base';
|
|
2
|
+
import { OpenAIService } from '../service/openai.service';
|
|
3
|
+
import { AgentServerService } from '../service/agent-server.service';
|
|
4
|
+
import { ApplicationService } from '../service/application.service';
|
|
5
|
+
/**
|
|
6
|
+
* 全局设置 Controller
|
|
7
|
+
*
|
|
8
|
+
* 提供系统级配置管理,包括 AI 服务状态、模型配置概览、Agent 引擎状态等
|
|
9
|
+
* 使用 agent-server 的 SettingsProvider 进行设置持久化
|
|
10
|
+
*/
|
|
11
|
+
export declare class SettingsController extends BaseController {
|
|
12
|
+
openaiService: OpenAIService;
|
|
13
|
+
agentServerService: AgentServerService;
|
|
14
|
+
applicationService: ApplicationService;
|
|
15
|
+
openaiConfig: any;
|
|
16
|
+
/**
|
|
17
|
+
* 热更新 LLM 配置
|
|
18
|
+
* 在设置更新后调用,使新的模型配置立即生效
|
|
19
|
+
*/
|
|
20
|
+
private refreshLLMConfig;
|
|
21
|
+
/** 获取全局设置概览(API Key 脱敏) */
|
|
22
|
+
getSettings(): Promise<{
|
|
23
|
+
ret: number;
|
|
24
|
+
data: any;
|
|
25
|
+
msg: string;
|
|
26
|
+
} | {
|
|
27
|
+
ret: number;
|
|
28
|
+
msg: any;
|
|
29
|
+
data?: undefined;
|
|
30
|
+
}>;
|
|
31
|
+
/** 获取 AI 服务状态 */
|
|
32
|
+
getAIStatus(): Promise<{
|
|
33
|
+
ret: number;
|
|
34
|
+
data: {
|
|
35
|
+
available: boolean;
|
|
36
|
+
model: any;
|
|
37
|
+
baseUrl: any;
|
|
38
|
+
fallbackModels: any;
|
|
39
|
+
};
|
|
40
|
+
msg: string;
|
|
41
|
+
} | {
|
|
42
|
+
ret: number;
|
|
43
|
+
msg: any;
|
|
44
|
+
data?: undefined;
|
|
45
|
+
}>;
|
|
46
|
+
/** 获取 Agent 引擎状态 */
|
|
47
|
+
getAgentStatus(): Promise<{
|
|
48
|
+
ret: number;
|
|
49
|
+
data: {
|
|
50
|
+
available: boolean;
|
|
51
|
+
toolCount: number;
|
|
52
|
+
tools: {
|
|
53
|
+
name: any;
|
|
54
|
+
description: any;
|
|
55
|
+
}[];
|
|
56
|
+
};
|
|
57
|
+
msg: string;
|
|
58
|
+
} | {
|
|
59
|
+
ret: number;
|
|
60
|
+
msg: any;
|
|
61
|
+
data?: undefined;
|
|
62
|
+
}>;
|
|
63
|
+
/** 更新全局设置(API Key 脱敏返回) */
|
|
64
|
+
updateSettings(body: any): Promise<{
|
|
65
|
+
ret: number;
|
|
66
|
+
data: any;
|
|
67
|
+
msg: string;
|
|
68
|
+
} | {
|
|
69
|
+
ret: number;
|
|
70
|
+
msg: any;
|
|
71
|
+
data?: undefined;
|
|
72
|
+
}>;
|
|
73
|
+
/** 重置全局设置为默认值 */
|
|
74
|
+
resetSettings(): Promise<{
|
|
75
|
+
ret: number;
|
|
76
|
+
data: any;
|
|
77
|
+
msg: string;
|
|
78
|
+
} | {
|
|
79
|
+
ret: number;
|
|
80
|
+
msg: any;
|
|
81
|
+
data?: undefined;
|
|
82
|
+
}>;
|
|
83
|
+
}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
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;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
42
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
43
|
+
};
|
|
44
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
45
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
46
|
+
};
|
|
47
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
exports.SettingsController = void 0;
|
|
49
|
+
const core_1 = require("@midwayjs/core");
|
|
50
|
+
const midwayjs_base_1 = require("@cicctencent/midwayjs-base");
|
|
51
|
+
const openai_service_1 = require("../service/openai.service");
|
|
52
|
+
const agent_server_service_1 = require("../service/agent-server.service");
|
|
53
|
+
const application_service_1 = require("../service/application.service");
|
|
54
|
+
const agent_server_1 = require("@cicctencent/agent-server");
|
|
55
|
+
/** API Key 脱敏占位符 */
|
|
56
|
+
const REDACTED_VALUE = '••••••••';
|
|
57
|
+
/**
|
|
58
|
+
* 递归脱敏设置对象中的所有 apiKey 字段
|
|
59
|
+
* 将所有名为 apiKey 的字段值替换为 REDACTED_VALUE
|
|
60
|
+
*/
|
|
61
|
+
function redactSettings(settings) {
|
|
62
|
+
if (settings == null)
|
|
63
|
+
return settings;
|
|
64
|
+
if (typeof settings === 'string') {
|
|
65
|
+
return settings;
|
|
66
|
+
}
|
|
67
|
+
if (Array.isArray(settings)) {
|
|
68
|
+
return settings.map(item => redactSettings(item));
|
|
69
|
+
}
|
|
70
|
+
if (typeof settings === 'object') {
|
|
71
|
+
const result = {};
|
|
72
|
+
for (const key of Object.keys(settings)) {
|
|
73
|
+
if (key === 'apiKey' &&
|
|
74
|
+
typeof settings[key] === 'string' &&
|
|
75
|
+
settings[key].length > 0) {
|
|
76
|
+
result[key] = REDACTED_VALUE;
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
result[key] = redactSettings(settings[key]);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return result;
|
|
83
|
+
}
|
|
84
|
+
return settings;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 全局设置 Controller
|
|
88
|
+
*
|
|
89
|
+
* 提供系统级配置管理,包括 AI 服务状态、模型配置概览、Agent 引擎状态等
|
|
90
|
+
* 使用 agent-server 的 SettingsProvider 进行设置持久化
|
|
91
|
+
*/
|
|
92
|
+
let SettingsController = class SettingsController extends midwayjs_base_1.BaseController {
|
|
93
|
+
/**
|
|
94
|
+
* 热更新 LLM 配置
|
|
95
|
+
* 在设置更新后调用,使新的模型配置立即生效
|
|
96
|
+
*/
|
|
97
|
+
async refreshLLMConfig() {
|
|
98
|
+
try {
|
|
99
|
+
// 重新初始化 OpenAI 客户端以应用新的配置
|
|
100
|
+
if (this.openaiService.isAvailable()) {
|
|
101
|
+
const settings = (0, agent_server_1.getSettings)();
|
|
102
|
+
const defaultProvider = settings.modelProviders?.find(p => p.id === settings.defaultModelId);
|
|
103
|
+
if (defaultProvider?.apiKey) {
|
|
104
|
+
// 重新初始化 OpenAI 客户端
|
|
105
|
+
const { default: OpenAI } = await Promise.resolve().then(() => __importStar(require('openai')));
|
|
106
|
+
this.openaiService.client = new OpenAI({
|
|
107
|
+
apiKey: defaultProvider.apiKey,
|
|
108
|
+
baseURL: defaultProvider.baseUrl || '',
|
|
109
|
+
});
|
|
110
|
+
console.log('[Settings] LLM 配置已热更新, model:', defaultProvider.model);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
console.warn('[Settings] LLM 配置热更新失败:', error.message);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/** 获取全局设置概览(API Key 脱敏) */
|
|
119
|
+
async getSettings() {
|
|
120
|
+
try {
|
|
121
|
+
const defaultApp = await this.applicationService.getDefault();
|
|
122
|
+
const settings = (0, agent_server_1.getSettings)();
|
|
123
|
+
return {
|
|
124
|
+
ret: 0,
|
|
125
|
+
data: redactSettings({
|
|
126
|
+
ai: {
|
|
127
|
+
available: this.openaiService.isAvailable(),
|
|
128
|
+
model: this.openaiConfig?.model || '',
|
|
129
|
+
baseUrl: this.openaiConfig?.baseUrl || '',
|
|
130
|
+
},
|
|
131
|
+
agent: {
|
|
132
|
+
available: this.agentServerService.isAvailable(),
|
|
133
|
+
},
|
|
134
|
+
application: defaultApp
|
|
135
|
+
? {
|
|
136
|
+
id: defaultApp.id,
|
|
137
|
+
name: defaultApp.name,
|
|
138
|
+
key: defaultApp.key,
|
|
139
|
+
}
|
|
140
|
+
: null,
|
|
141
|
+
settings: settings,
|
|
142
|
+
}),
|
|
143
|
+
msg: 'success',
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
return { ret: 1, msg: error.message };
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/** 获取 AI 服务状态 */
|
|
151
|
+
async getAIStatus() {
|
|
152
|
+
try {
|
|
153
|
+
return {
|
|
154
|
+
ret: 0,
|
|
155
|
+
data: {
|
|
156
|
+
available: this.openaiService.isAvailable(),
|
|
157
|
+
model: this.openaiConfig?.model || '',
|
|
158
|
+
baseUrl: this.openaiConfig?.baseUrl || '',
|
|
159
|
+
fallbackModels: this.openaiConfig?.fallbackModels || [],
|
|
160
|
+
},
|
|
161
|
+
msg: 'success',
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
return { ret: 1, msg: error.message };
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/** 获取 Agent 引擎状态 */
|
|
169
|
+
async getAgentStatus() {
|
|
170
|
+
try {
|
|
171
|
+
const tools = this.agentServerService.getTools();
|
|
172
|
+
return {
|
|
173
|
+
ret: 0,
|
|
174
|
+
data: {
|
|
175
|
+
available: this.agentServerService.isAvailable(),
|
|
176
|
+
toolCount: tools.length,
|
|
177
|
+
tools: tools.map(t => ({
|
|
178
|
+
name: t.name,
|
|
179
|
+
description: t.description,
|
|
180
|
+
})),
|
|
181
|
+
},
|
|
182
|
+
msg: 'success',
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
return { ret: 1, msg: error.message };
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/** 更新全局设置(API Key 脱敏返回) */
|
|
190
|
+
async updateSettings(body) {
|
|
191
|
+
try {
|
|
192
|
+
// 使用 agent-server 的 updateSettings 持久化
|
|
193
|
+
const updated = (0, agent_server_1.updateSettings)(body);
|
|
194
|
+
// 热更新 LLM 配置,使新的模型配置立即生效
|
|
195
|
+
await this.refreshLLMConfig();
|
|
196
|
+
return {
|
|
197
|
+
ret: 0,
|
|
198
|
+
data: redactSettings(updated),
|
|
199
|
+
msg: '设置已更新',
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
return { ret: 1, msg: error.message };
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/** 重置全局设置为默认值 */
|
|
207
|
+
async resetSettings() {
|
|
208
|
+
try {
|
|
209
|
+
// 使用 agent-server 的 resetSettings 重置
|
|
210
|
+
const reset = (0, agent_server_1.resetSettings)();
|
|
211
|
+
// 热更新 LLM 配置
|
|
212
|
+
await this.refreshLLMConfig();
|
|
213
|
+
return {
|
|
214
|
+
ret: 0,
|
|
215
|
+
data: redactSettings(reset),
|
|
216
|
+
msg: '设置已重置为默认值',
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
return { ret: 1, msg: error.message };
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
exports.SettingsController = SettingsController;
|
|
225
|
+
__decorate([
|
|
226
|
+
(0, core_1.Inject)(),
|
|
227
|
+
__metadata("design:type", openai_service_1.OpenAIService)
|
|
228
|
+
], SettingsController.prototype, "openaiService", void 0);
|
|
229
|
+
__decorate([
|
|
230
|
+
(0, core_1.Inject)(),
|
|
231
|
+
__metadata("design:type", agent_server_service_1.AgentServerService)
|
|
232
|
+
], SettingsController.prototype, "agentServerService", void 0);
|
|
233
|
+
__decorate([
|
|
234
|
+
(0, core_1.Inject)(),
|
|
235
|
+
__metadata("design:type", application_service_1.ApplicationService)
|
|
236
|
+
], SettingsController.prototype, "applicationService", void 0);
|
|
237
|
+
__decorate([
|
|
238
|
+
(0, core_1.Config)('openai'),
|
|
239
|
+
__metadata("design:type", Object)
|
|
240
|
+
], SettingsController.prototype, "openaiConfig", void 0);
|
|
241
|
+
__decorate([
|
|
242
|
+
(0, core_1.Get)('/'),
|
|
243
|
+
midwayjs_base_1.decorators.checkLogin(true),
|
|
244
|
+
__metadata("design:type", Function),
|
|
245
|
+
__metadata("design:paramtypes", []),
|
|
246
|
+
__metadata("design:returntype", Promise)
|
|
247
|
+
], SettingsController.prototype, "getSettings", null);
|
|
248
|
+
__decorate([
|
|
249
|
+
(0, core_1.Get)('/ai-status'),
|
|
250
|
+
midwayjs_base_1.decorators.checkLogin(true),
|
|
251
|
+
__metadata("design:type", Function),
|
|
252
|
+
__metadata("design:paramtypes", []),
|
|
253
|
+
__metadata("design:returntype", Promise)
|
|
254
|
+
], SettingsController.prototype, "getAIStatus", null);
|
|
255
|
+
__decorate([
|
|
256
|
+
(0, core_1.Get)('/agent-status'),
|
|
257
|
+
midwayjs_base_1.decorators.checkLogin(true),
|
|
258
|
+
__metadata("design:type", Function),
|
|
259
|
+
__metadata("design:paramtypes", []),
|
|
260
|
+
__metadata("design:returntype", Promise)
|
|
261
|
+
], SettingsController.prototype, "getAgentStatus", null);
|
|
262
|
+
__decorate([
|
|
263
|
+
(0, core_1.Put)('/'),
|
|
264
|
+
midwayjs_base_1.decorators.checkLogin(true),
|
|
265
|
+
__param(0, (0, core_1.Body)()),
|
|
266
|
+
__metadata("design:type", Function),
|
|
267
|
+
__metadata("design:paramtypes", [Object]),
|
|
268
|
+
__metadata("design:returntype", Promise)
|
|
269
|
+
], SettingsController.prototype, "updateSettings", null);
|
|
270
|
+
__decorate([
|
|
271
|
+
(0, core_1.Post)('/reset'),
|
|
272
|
+
midwayjs_base_1.decorators.checkLogin(true),
|
|
273
|
+
__metadata("design:type", Function),
|
|
274
|
+
__metadata("design:paramtypes", []),
|
|
275
|
+
__metadata("design:returntype", Promise)
|
|
276
|
+
], SettingsController.prototype, "resetSettings", null);
|
|
277
|
+
exports.SettingsController = SettingsController = __decorate([
|
|
278
|
+
(0, core_1.Provide)(),
|
|
279
|
+
(0, core_1.Controller)('/api/settings')
|
|
280
|
+
], SettingsController);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AIFrameworkAdapterOptions, AIHttpHandler, AIJsonResponse, AIRequestContext, AISSEWriter } from './types';
|
|
2
|
+
import { AIServiceContainer } from './service-container';
|
|
3
|
+
export declare class AIWorkstationCore {
|
|
4
|
+
readonly container: AIServiceContainer;
|
|
5
|
+
constructor(options: AIFrameworkAdapterOptions);
|
|
6
|
+
get prefix(): string;
|
|
7
|
+
routes(): Record<string, AIHttpHandler>;
|
|
8
|
+
runAgentSync(ctx: AIRequestContext): Promise<AIJsonResponse>;
|
|
9
|
+
runAgentStream(ctx: AIRequestContext, writer: AISSEWriter): Promise<void>;
|
|
10
|
+
reconnectStream(ctx: AIRequestContext, writer: AISSEWriter): Promise<void>;
|
|
11
|
+
abortAgent(ctx: AIRequestContext): Promise<AIJsonResponse>;
|
|
12
|
+
submitTask(ctx: AIRequestContext): Promise<AIJsonResponse>;
|
|
13
|
+
health(_ctx: AIRequestContext): Promise<AIJsonResponse>;
|
|
14
|
+
private getRunInput;
|
|
15
|
+
private getPrompt;
|
|
16
|
+
}
|
|
17
|
+
export declare function createAIWorkstation(options: AIFrameworkAdapterOptions): AIWorkstationCore;
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AIWorkstationCore = void 0;
|
|
4
|
+
exports.createAIWorkstation = createAIWorkstation;
|
|
5
|
+
const service_container_1 = require("./service-container");
|
|
6
|
+
const sse_1 = require("./sse");
|
|
7
|
+
class AIWorkstationCore {
|
|
8
|
+
constructor(options) {
|
|
9
|
+
this.container = (0, service_container_1.createAIServiceContainer)(options);
|
|
10
|
+
}
|
|
11
|
+
get prefix() {
|
|
12
|
+
return this.container.prefix;
|
|
13
|
+
}
|
|
14
|
+
routes() {
|
|
15
|
+
return {
|
|
16
|
+
'POST /agent/run/sync': ctx => this.runAgentSync(ctx),
|
|
17
|
+
'POST /agent/task': ctx => this.submitTask(ctx),
|
|
18
|
+
'GET /agent/health': ctx => this.health(ctx),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
async runAgentSync(ctx) {
|
|
22
|
+
try {
|
|
23
|
+
const input = this.getRunInput(ctx);
|
|
24
|
+
const prompt = this.getPrompt(input);
|
|
25
|
+
const user = await this.container.resolveUser(ctx);
|
|
26
|
+
const applicationId = await this.container.resolveApplicationId(ctx, user);
|
|
27
|
+
const result = await this.container.services.agent.runAgent(prompt, {
|
|
28
|
+
userId: user.userId,
|
|
29
|
+
applicationId,
|
|
30
|
+
threadId: input.threadId,
|
|
31
|
+
profileId: input.profileId,
|
|
32
|
+
maxSteps: input.maxSteps,
|
|
33
|
+
timeout: input.timeout,
|
|
34
|
+
customContext: input.customContext,
|
|
35
|
+
});
|
|
36
|
+
return { ret: 0, data: result, msg: 'success' };
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
await this.container.handleError(error, ctx);
|
|
40
|
+
return { ret: 1, msg: error.message || 'Agent run failed' };
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async runAgentStream(ctx, writer) {
|
|
44
|
+
(0, sse_1.initSSEHeaders)(writer);
|
|
45
|
+
try {
|
|
46
|
+
const input = this.getRunInput(ctx);
|
|
47
|
+
const prompt = this.getPrompt(input);
|
|
48
|
+
const user = await this.container.resolveUser(ctx);
|
|
49
|
+
const applicationId = await this.container.resolveApplicationId(ctx, user);
|
|
50
|
+
const stream = this.container.services.agent.runAgentStream(prompt, {
|
|
51
|
+
userId: user.userId,
|
|
52
|
+
applicationId,
|
|
53
|
+
threadId: input.threadId,
|
|
54
|
+
profileId: input.profileId,
|
|
55
|
+
maxSteps: input.maxSteps,
|
|
56
|
+
timeout: input.timeout,
|
|
57
|
+
customContext: input.customContext,
|
|
58
|
+
});
|
|
59
|
+
await (0, sse_1.pipeSSEStream)(writer, stream);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
await this.container.handleError(error, ctx);
|
|
63
|
+
(0, sse_1.writeSSEEvent)(writer, {
|
|
64
|
+
type: 'error',
|
|
65
|
+
data: { message: error.message || 'Agent stream failed' },
|
|
66
|
+
timestamp: Date.now(),
|
|
67
|
+
});
|
|
68
|
+
if (!writer.writableEnded)
|
|
69
|
+
writer.end();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async reconnectStream(ctx, writer) {
|
|
73
|
+
const threadId = Number(ctx.params?.threadId || ctx.query?.threadId);
|
|
74
|
+
const reconnect = this.container.services.agent.reconnectStream;
|
|
75
|
+
if (!reconnect) {
|
|
76
|
+
(0, sse_1.writeSSEEvent)(writer, {
|
|
77
|
+
type: 'error',
|
|
78
|
+
data: { message: 'Reconnect stream is not supported by current agent service' },
|
|
79
|
+
timestamp: Date.now(),
|
|
80
|
+
});
|
|
81
|
+
writer.end();
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const user = await this.container.resolveUser(ctx);
|
|
85
|
+
await (0, sse_1.pipeSSEStream)(writer, reconnect.call(this.container.services.agent, threadId, user.userId));
|
|
86
|
+
}
|
|
87
|
+
async abortAgent(ctx) {
|
|
88
|
+
try {
|
|
89
|
+
const threadId = Number(ctx.params?.threadId || ctx.body?.threadId);
|
|
90
|
+
const user = await this.container.resolveUser(ctx);
|
|
91
|
+
const aborted = await this.container.services.agent.abortAgent?.(threadId, user.userId);
|
|
92
|
+
return { ret: 0, data: { aborted: !!aborted }, msg: aborted ? 'Agent 已中止' : '无法中止 Agent' };
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
await this.container.handleError(error, ctx);
|
|
96
|
+
return { ret: 1, msg: error.message || 'Abort failed' };
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async submitTask(ctx) {
|
|
100
|
+
return {
|
|
101
|
+
ret: 1,
|
|
102
|
+
msg: 'Task queue is framework-specific. Please wire AgentTaskQueueService in the adapter options.',
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
async health(_ctx) {
|
|
106
|
+
const agent = this.container.services.agent;
|
|
107
|
+
return {
|
|
108
|
+
ret: 0,
|
|
109
|
+
data: {
|
|
110
|
+
available: agent.isAvailable ? agent.isAvailable() : true,
|
|
111
|
+
tools: agent.getTools ? agent.getTools().map(tool => tool.definition?.function?.name || 'unknown') : [],
|
|
112
|
+
},
|
|
113
|
+
msg: 'success',
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
getRunInput(ctx) {
|
|
117
|
+
return (ctx.body || {});
|
|
118
|
+
}
|
|
119
|
+
getPrompt(input) {
|
|
120
|
+
const prompt = input.prompt || input.content;
|
|
121
|
+
if (!prompt)
|
|
122
|
+
throw new Error('prompt is required');
|
|
123
|
+
return prompt;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
exports.AIWorkstationCore = AIWorkstationCore;
|
|
127
|
+
function createAIWorkstation(options) {
|
|
128
|
+
return new AIWorkstationCore(options);
|
|
129
|
+
}
|