@next-open-ai/openbot 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 +212 -0
- package/dist/agent/agent-dir.d.ts +14 -0
- package/dist/agent/agent-dir.js +75 -0
- package/dist/agent/agent-manager.d.ts +61 -0
- package/dist/agent/agent-manager.js +257 -0
- package/dist/agent/config-manager.d.ts +25 -0
- package/dist/agent/config-manager.js +84 -0
- package/dist/agent/desktop-config.d.ts +15 -0
- package/dist/agent/desktop-config.js +91 -0
- package/dist/agent/run.d.ts +26 -0
- package/dist/agent/run.js +65 -0
- package/dist/agent/skills.d.ts +20 -0
- package/dist/agent/skills.js +86 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +168 -0
- package/dist/gateway/backend-url.d.ts +2 -0
- package/dist/gateway/backend-url.js +11 -0
- package/dist/gateway/clients.d.ts +5 -0
- package/dist/gateway/clients.js +4 -0
- package/dist/gateway/connection-handler.d.ts +6 -0
- package/dist/gateway/connection-handler.js +48 -0
- package/dist/gateway/desktop-config.d.ts +7 -0
- package/dist/gateway/desktop-config.js +25 -0
- package/dist/gateway/index.d.ts +3 -0
- package/dist/gateway/index.js +2 -0
- package/dist/gateway/message-handler.d.ts +5 -0
- package/dist/gateway/message-handler.js +65 -0
- package/dist/gateway/methods/agent-cancel.d.ts +10 -0
- package/dist/gateway/methods/agent-cancel.js +17 -0
- package/dist/gateway/methods/agent-chat.d.ts +8 -0
- package/dist/gateway/methods/agent-chat.js +194 -0
- package/dist/gateway/methods/connect.d.ts +8 -0
- package/dist/gateway/methods/connect.js +15 -0
- package/dist/gateway/methods/install-skill-from-path.d.ts +13 -0
- package/dist/gateway/methods/install-skill-from-path.js +48 -0
- package/dist/gateway/methods/run-scheduled-task.d.ts +13 -0
- package/dist/gateway/methods/run-scheduled-task.js +164 -0
- package/dist/gateway/server.d.ts +10 -0
- package/dist/gateway/server.js +268 -0
- package/dist/gateway/types.d.ts +76 -0
- package/dist/gateway/types.js +1 -0
- package/dist/gateway/utils.d.ts +22 -0
- package/dist/gateway/utils.js +67 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/memory/build-summary.d.ts +6 -0
- package/dist/memory/build-summary.js +27 -0
- package/dist/memory/compaction-extension.d.ts +6 -0
- package/dist/memory/compaction-extension.js +23 -0
- package/dist/memory/embedding.d.ts +10 -0
- package/dist/memory/embedding.js +22 -0
- package/dist/memory/index.d.ts +29 -0
- package/dist/memory/index.js +66 -0
- package/dist/memory/types.d.ts +16 -0
- package/dist/memory/types.js +1 -0
- package/dist/memory/vector-store.d.ts +15 -0
- package/dist/memory/vector-store.js +65 -0
- package/dist/server/agent-config/agent-config.controller.d.ts +30 -0
- package/dist/server/agent-config/agent-config.controller.js +83 -0
- package/dist/server/agent-config/agent-config.module.d.ts +2 -0
- package/dist/server/agent-config/agent-config.module.js +19 -0
- package/dist/server/agent-config/agent-config.service.d.ts +34 -0
- package/dist/server/agent-config/agent-config.service.js +171 -0
- package/dist/server/agents/agents.controller.d.ts +41 -0
- package/dist/server/agents/agents.controller.js +120 -0
- package/dist/server/agents/agents.gateway.d.ts +21 -0
- package/dist/server/agents/agents.gateway.js +103 -0
- package/dist/server/agents/agents.module.d.ts +2 -0
- package/dist/server/agents/agents.module.js +20 -0
- package/dist/server/agents/agents.service.d.ts +63 -0
- package/dist/server/agents/agents.service.js +167 -0
- package/dist/server/app.module.d.ts +2 -0
- package/dist/server/app.module.js +36 -0
- package/dist/server/auth/auth.controller.d.ts +20 -0
- package/dist/server/auth/auth.controller.js +64 -0
- package/dist/server/auth/auth.module.d.ts +2 -0
- package/dist/server/auth/auth.module.js +19 -0
- package/dist/server/config/config.controller.d.ts +51 -0
- package/dist/server/config/config.controller.js +81 -0
- package/dist/server/config/config.module.d.ts +2 -0
- package/dist/server/config/config.module.js +19 -0
- package/dist/server/config/config.service.d.ts +34 -0
- package/dist/server/config/config.service.js +91 -0
- package/dist/server/database/database.module.d.ts +2 -0
- package/dist/server/database/database.module.js +18 -0
- package/dist/server/database/database.service.d.ts +11 -0
- package/dist/server/database/database.service.js +137 -0
- package/dist/server/main.d.ts +1 -0
- package/dist/server/main.js +18 -0
- package/dist/server/skills/skills.controller.d.ts +63 -0
- package/dist/server/skills/skills.controller.js +194 -0
- package/dist/server/skills/skills.module.d.ts +2 -0
- package/dist/server/skills/skills.module.js +22 -0
- package/dist/server/skills/skills.service.d.ts +63 -0
- package/dist/server/skills/skills.service.js +324 -0
- package/dist/server/tasks/tasks.controller.d.ts +52 -0
- package/dist/server/tasks/tasks.controller.js +163 -0
- package/dist/server/tasks/tasks.module.d.ts +2 -0
- package/dist/server/tasks/tasks.module.js +22 -0
- package/dist/server/tasks/tasks.service.d.ts +84 -0
- package/dist/server/tasks/tasks.service.js +313 -0
- package/dist/server/usage/usage.controller.d.ts +12 -0
- package/dist/server/usage/usage.controller.js +46 -0
- package/dist/server/usage/usage.module.d.ts +2 -0
- package/dist/server/usage/usage.module.js +19 -0
- package/dist/server/usage/usage.service.d.ts +21 -0
- package/dist/server/usage/usage.service.js +55 -0
- package/dist/server/users/users.controller.d.ts +35 -0
- package/dist/server/users/users.controller.js +69 -0
- package/dist/server/users/users.module.d.ts +2 -0
- package/dist/server/users/users.module.js +19 -0
- package/dist/server/users/users.service.d.ts +39 -0
- package/dist/server/users/users.service.js +140 -0
- package/dist/server/workspace/workspace.controller.d.ts +24 -0
- package/dist/server/workspace/workspace.controller.js +132 -0
- package/dist/server/workspace/workspace.module.d.ts +2 -0
- package/dist/server/workspace/workspace.module.js +21 -0
- package/dist/server/workspace/workspace.service.d.ts +25 -0
- package/dist/server/workspace/workspace.service.js +103 -0
- package/dist/tools/browser-tool.d.ts +10 -0
- package/dist/tools/browser-tool.js +362 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.js +3 -0
- package/dist/tools/install-skill-tool.d.ts +9 -0
- package/dist/tools/install-skill-tool.js +77 -0
- package/dist/tools/save-experience-tool.d.ts +5 -0
- package/dist/tools/save-experience-tool.js +54 -0
- package/package.json +80 -0
- package/skills/agent-browser/SKILL.md +207 -0
- package/skills/agent-browser/references/authentication.md +202 -0
- package/skills/agent-browser/references/commands.md +259 -0
- package/skills/agent-browser/references/proxy-support.md +188 -0
- package/skills/agent-browser/references/session-management.md +193 -0
- package/skills/agent-browser/references/snapshot-refs.md +194 -0
- package/skills/agent-browser/references/video-recording.md +173 -0
- package/skills/agent-browser/templates/authenticated-session.sh +97 -0
- package/skills/agent-browser/templates/capture-workflow.sh +69 -0
- package/skills/agent-browser/templates/form-automation.sh +62 -0
- package/skills/find-skills/SKILL.md +140 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { WebSocketGateway, WebSocketServer, SubscribeMessage, } from '@nestjs/websockets';
|
|
11
|
+
import { Server, Socket } from 'socket.io';
|
|
12
|
+
import { AgentsService } from './agents.service.js';
|
|
13
|
+
let AgentsGateway = class AgentsGateway {
|
|
14
|
+
agentsService;
|
|
15
|
+
server;
|
|
16
|
+
sessionSubscriptions = new Map();
|
|
17
|
+
constructor(agentsService) {
|
|
18
|
+
this.agentsService = agentsService;
|
|
19
|
+
}
|
|
20
|
+
afterInit(server) {
|
|
21
|
+
console.log('WebSocket Gateway initialized');
|
|
22
|
+
}
|
|
23
|
+
handleConnection(client) {
|
|
24
|
+
console.log(`Client connected: ${client.id}`);
|
|
25
|
+
}
|
|
26
|
+
handleDisconnect(client) {
|
|
27
|
+
console.log(`Client disconnected: ${client.id}`);
|
|
28
|
+
// Clean up subscriptions
|
|
29
|
+
const subscriptions = this.sessionSubscriptions.get(client.id);
|
|
30
|
+
if (subscriptions) {
|
|
31
|
+
subscriptions.forEach(unsubscribe => unsubscribe());
|
|
32
|
+
this.sessionSubscriptions.delete(client.id);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
handleSubscribeSession(client, payload) {
|
|
36
|
+
const { sessionId } = payload;
|
|
37
|
+
console.log(`Client ${client.id} subscribing to session ${sessionId}`);
|
|
38
|
+
// Unsubscribe from previous session if any
|
|
39
|
+
const existingSubscriptions = this.sessionSubscriptions.get(client.id);
|
|
40
|
+
if (existingSubscriptions) {
|
|
41
|
+
existingSubscriptions.forEach(unsubscribe => unsubscribe());
|
|
42
|
+
}
|
|
43
|
+
const subscriptions = new Map();
|
|
44
|
+
// Subscribe to agent chunks
|
|
45
|
+
const unsubChunk = this.agentsService.addEventListener('agent.chunk', (data) => {
|
|
46
|
+
client.emit('agent_chunk', data);
|
|
47
|
+
});
|
|
48
|
+
subscriptions.set('chunk', unsubChunk);
|
|
49
|
+
// Subscribe to tool events
|
|
50
|
+
const unsubTool = this.agentsService.addEventListener('agent.tool', (data) => {
|
|
51
|
+
client.emit('agent_tool', data);
|
|
52
|
+
});
|
|
53
|
+
subscriptions.set('tool', unsubTool);
|
|
54
|
+
// Subscribe to message completion
|
|
55
|
+
const unsubComplete = this.agentsService.addEventListener('message_complete', (data) => {
|
|
56
|
+
// Ensure we only emit for the subscribed session
|
|
57
|
+
if (data.sessionId === sessionId) {
|
|
58
|
+
client.emit('message_complete', data);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
subscriptions.set('complete', unsubComplete);
|
|
62
|
+
this.sessionSubscriptions.set(client.id, subscriptions);
|
|
63
|
+
return { success: true };
|
|
64
|
+
}
|
|
65
|
+
handleUnsubscribeSession(client) {
|
|
66
|
+
const subscriptions = this.sessionSubscriptions.get(client.id);
|
|
67
|
+
if (subscriptions) {
|
|
68
|
+
subscriptions.forEach(unsubscribe => unsubscribe());
|
|
69
|
+
this.sessionSubscriptions.delete(client.id);
|
|
70
|
+
}
|
|
71
|
+
return { success: true };
|
|
72
|
+
}
|
|
73
|
+
// Broadcast message completion to all clients
|
|
74
|
+
broadcastMessageComplete(sessionId, content) {
|
|
75
|
+
this.server.emit('message_complete', { sessionId, content });
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
__decorate([
|
|
79
|
+
WebSocketServer(),
|
|
80
|
+
__metadata("design:type", Server)
|
|
81
|
+
], AgentsGateway.prototype, "server", void 0);
|
|
82
|
+
__decorate([
|
|
83
|
+
SubscribeMessage('subscribe_session'),
|
|
84
|
+
__metadata("design:type", Function),
|
|
85
|
+
__metadata("design:paramtypes", [Socket, Object]),
|
|
86
|
+
__metadata("design:returntype", void 0)
|
|
87
|
+
], AgentsGateway.prototype, "handleSubscribeSession", null);
|
|
88
|
+
__decorate([
|
|
89
|
+
SubscribeMessage('unsubscribe_session'),
|
|
90
|
+
__metadata("design:type", Function),
|
|
91
|
+
__metadata("design:paramtypes", [Socket]),
|
|
92
|
+
__metadata("design:returntype", void 0)
|
|
93
|
+
], AgentsGateway.prototype, "handleUnsubscribeSession", null);
|
|
94
|
+
AgentsGateway = __decorate([
|
|
95
|
+
WebSocketGateway({
|
|
96
|
+
cors: {
|
|
97
|
+
origin: ['http://localhost:5173', 'http://localhost:3001'],
|
|
98
|
+
credentials: true,
|
|
99
|
+
},
|
|
100
|
+
}),
|
|
101
|
+
__metadata("design:paramtypes", [AgentsService])
|
|
102
|
+
], AgentsGateway);
|
|
103
|
+
export { AgentsGateway };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { Module } from '@nestjs/common';
|
|
8
|
+
import { AgentsController } from './agents.controller.js';
|
|
9
|
+
import { AgentsService } from './agents.service.js';
|
|
10
|
+
import { AgentsGateway } from './agents.gateway.js';
|
|
11
|
+
let AgentsModule = class AgentsModule {
|
|
12
|
+
};
|
|
13
|
+
AgentsModule = __decorate([
|
|
14
|
+
Module({
|
|
15
|
+
controllers: [AgentsController],
|
|
16
|
+
providers: [AgentsService, AgentsGateway],
|
|
17
|
+
exports: [AgentsService],
|
|
18
|
+
})
|
|
19
|
+
], AgentsModule);
|
|
20
|
+
export { AgentsModule };
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { DatabaseService } from '../database/database.service.js';
|
|
2
|
+
export type SessionType = 'scheduled' | 'chat' | 'system';
|
|
3
|
+
export interface AgentSession {
|
|
4
|
+
id: string;
|
|
5
|
+
createdAt: number;
|
|
6
|
+
lastActiveAt: number;
|
|
7
|
+
messageCount: number;
|
|
8
|
+
status: 'idle' | 'active' | 'error';
|
|
9
|
+
/** 绑定的智能体 ID,不选则为 default(主智能体) */
|
|
10
|
+
agentId?: string;
|
|
11
|
+
workspace?: string;
|
|
12
|
+
provider?: string;
|
|
13
|
+
model?: string;
|
|
14
|
+
title?: string;
|
|
15
|
+
preview?: string;
|
|
16
|
+
type?: SessionType;
|
|
17
|
+
}
|
|
18
|
+
export interface ChatMessage {
|
|
19
|
+
id: string;
|
|
20
|
+
sessionId: string;
|
|
21
|
+
role: 'user' | 'assistant' | 'system';
|
|
22
|
+
content: string;
|
|
23
|
+
timestamp: number;
|
|
24
|
+
toolCalls?: any[];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Agents service: session + history storage in SQLite.
|
|
28
|
+
* Conversation is done via frontend -> Gateway (WebSocket) -> agent; NestJS is not in the chat path.
|
|
29
|
+
*/
|
|
30
|
+
export declare class AgentsService {
|
|
31
|
+
private readonly db;
|
|
32
|
+
private eventListeners;
|
|
33
|
+
constructor(db: DatabaseService);
|
|
34
|
+
addEventListener(event: string, listener: (data: any) => void): () => void;
|
|
35
|
+
private emitEvent;
|
|
36
|
+
private rowToSession;
|
|
37
|
+
private rowToMessage;
|
|
38
|
+
createSession(options?: {
|
|
39
|
+
id?: string;
|
|
40
|
+
agentId?: string;
|
|
41
|
+
workspace?: string;
|
|
42
|
+
provider?: string;
|
|
43
|
+
model?: string;
|
|
44
|
+
title?: string;
|
|
45
|
+
type?: SessionType;
|
|
46
|
+
}): Promise<AgentSession>;
|
|
47
|
+
/** 获取或创建会话(指定 id 时复用同一会话,用于定时任务固定 sessionId) */
|
|
48
|
+
getOrCreateSession(sessionId: string, options?: {
|
|
49
|
+
agentId?: string;
|
|
50
|
+
workspace?: string;
|
|
51
|
+
title?: string;
|
|
52
|
+
type?: SessionType;
|
|
53
|
+
}): Promise<AgentSession>;
|
|
54
|
+
getSessions(): AgentSession[];
|
|
55
|
+
getSession(sessionId: string): AgentSession | undefined;
|
|
56
|
+
deleteSession(sessionId: string): Promise<boolean>;
|
|
57
|
+
getMessageHistory(sessionId: string): ChatMessage[];
|
|
58
|
+
addAssistantMessage(sessionId: string, content: string): void;
|
|
59
|
+
appendMessage(sessionId: string, role: 'user' | 'assistant', content: string, options?: {
|
|
60
|
+
toolCalls?: any[];
|
|
61
|
+
contentParts?: any[];
|
|
62
|
+
}): void;
|
|
63
|
+
}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { Injectable } from '@nestjs/common';
|
|
11
|
+
import { randomUUID } from 'crypto';
|
|
12
|
+
import { agentManager } from '../../agent/agent-manager.js';
|
|
13
|
+
import { DatabaseService } from '../database/database.service.js';
|
|
14
|
+
/**
|
|
15
|
+
* Agents service: session + history storage in SQLite.
|
|
16
|
+
* Conversation is done via frontend -> Gateway (WebSocket) -> agent; NestJS is not in the chat path.
|
|
17
|
+
*/
|
|
18
|
+
let AgentsService = class AgentsService {
|
|
19
|
+
db;
|
|
20
|
+
eventListeners = new Map();
|
|
21
|
+
constructor(db) {
|
|
22
|
+
this.db = db;
|
|
23
|
+
}
|
|
24
|
+
addEventListener(event, listener) {
|
|
25
|
+
if (!this.eventListeners.has(event)) {
|
|
26
|
+
this.eventListeners.set(event, new Set());
|
|
27
|
+
}
|
|
28
|
+
this.eventListeners.get(event).add(listener);
|
|
29
|
+
return () => {
|
|
30
|
+
const listeners = this.eventListeners.get(event);
|
|
31
|
+
if (listeners)
|
|
32
|
+
listeners.delete(listener);
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
emitEvent(event, payload) {
|
|
36
|
+
const listeners = this.eventListeners.get(event);
|
|
37
|
+
if (listeners)
|
|
38
|
+
listeners.forEach((l) => l(payload));
|
|
39
|
+
}
|
|
40
|
+
rowToSession(r) {
|
|
41
|
+
return {
|
|
42
|
+
id: r.id,
|
|
43
|
+
createdAt: r.created_at,
|
|
44
|
+
lastActiveAt: r.last_active_at,
|
|
45
|
+
messageCount: r.message_count,
|
|
46
|
+
status: r.status,
|
|
47
|
+
agentId: r.agent_id ?? undefined,
|
|
48
|
+
workspace: r.workspace ?? undefined,
|
|
49
|
+
provider: r.provider ?? undefined,
|
|
50
|
+
model: r.model ?? undefined,
|
|
51
|
+
title: r.title ?? undefined,
|
|
52
|
+
preview: r.preview ?? undefined,
|
|
53
|
+
type: (r.type === 'scheduled' || r.type === 'chat' || r.type === 'system' ? r.type : 'chat'),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
rowToMessage(r) {
|
|
57
|
+
const msg = {
|
|
58
|
+
id: r.id,
|
|
59
|
+
sessionId: r.session_id,
|
|
60
|
+
role: r.role,
|
|
61
|
+
content: r.content,
|
|
62
|
+
timestamp: r.timestamp,
|
|
63
|
+
};
|
|
64
|
+
if (r.tool_calls_json) {
|
|
65
|
+
try {
|
|
66
|
+
msg.toolCalls = JSON.parse(r.tool_calls_json);
|
|
67
|
+
}
|
|
68
|
+
catch (_) { }
|
|
69
|
+
}
|
|
70
|
+
return msg;
|
|
71
|
+
}
|
|
72
|
+
async createSession(options) {
|
|
73
|
+
const sessionId = options?.id ?? randomUUID();
|
|
74
|
+
const sessionType = options?.type ?? 'chat';
|
|
75
|
+
const existing = this.getSession(sessionId);
|
|
76
|
+
if (existing)
|
|
77
|
+
return existing;
|
|
78
|
+
const now = Date.now();
|
|
79
|
+
const agentId = options?.agentId ?? 'default';
|
|
80
|
+
const workspace = options?.workspace ?? 'default';
|
|
81
|
+
const session = {
|
|
82
|
+
id: sessionId,
|
|
83
|
+
createdAt: now,
|
|
84
|
+
lastActiveAt: now,
|
|
85
|
+
messageCount: 0,
|
|
86
|
+
status: 'idle',
|
|
87
|
+
agentId,
|
|
88
|
+
workspace,
|
|
89
|
+
provider: options?.provider,
|
|
90
|
+
model: options?.model,
|
|
91
|
+
title: options?.title ?? undefined,
|
|
92
|
+
preview: '',
|
|
93
|
+
type: sessionType,
|
|
94
|
+
};
|
|
95
|
+
this.db.run(`INSERT INTO sessions (id, created_at, last_active_at, message_count, status, agent_id, workspace, provider, model, title, preview, type)
|
|
96
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
97
|
+
session.id,
|
|
98
|
+
session.createdAt,
|
|
99
|
+
session.lastActiveAt,
|
|
100
|
+
session.messageCount,
|
|
101
|
+
session.status,
|
|
102
|
+
agentId,
|
|
103
|
+
workspace,
|
|
104
|
+
session.provider ?? null,
|
|
105
|
+
session.model ?? null,
|
|
106
|
+
session.title ?? null,
|
|
107
|
+
session.preview ?? null,
|
|
108
|
+
sessionType,
|
|
109
|
+
]);
|
|
110
|
+
return session;
|
|
111
|
+
}
|
|
112
|
+
/** 获取或创建会话(指定 id 时复用同一会话,用于定时任务固定 sessionId) */
|
|
113
|
+
async getOrCreateSession(sessionId, options) {
|
|
114
|
+
const existing = this.getSession(sessionId);
|
|
115
|
+
if (existing) {
|
|
116
|
+
const now = Date.now();
|
|
117
|
+
const title = options?.title ?? existing.title;
|
|
118
|
+
this.db.run('UPDATE sessions SET last_active_at = ?, title = ? WHERE id = ?', [now, title ?? null, sessionId]);
|
|
119
|
+
return { ...existing, lastActiveAt: now, title };
|
|
120
|
+
}
|
|
121
|
+
return this.createSession({
|
|
122
|
+
id: sessionId,
|
|
123
|
+
agentId: options?.agentId ?? 'default',
|
|
124
|
+
workspace: options?.workspace ?? 'default',
|
|
125
|
+
title: options?.title,
|
|
126
|
+
type: options?.type ?? 'chat',
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
getSessions() {
|
|
130
|
+
const rows = this.db.all('SELECT * FROM sessions ORDER BY last_active_at DESC');
|
|
131
|
+
return rows.map((r) => this.rowToSession(r));
|
|
132
|
+
}
|
|
133
|
+
getSession(sessionId) {
|
|
134
|
+
const r = this.db.get('SELECT * FROM sessions WHERE id = ?', [sessionId]);
|
|
135
|
+
return r ? this.rowToSession(r) : undefined;
|
|
136
|
+
}
|
|
137
|
+
async deleteSession(sessionId) {
|
|
138
|
+
agentManager.deleteSession(sessionId);
|
|
139
|
+
const result = this.db.run('DELETE FROM sessions WHERE id = ?', [sessionId]);
|
|
140
|
+
return result.changes > 0;
|
|
141
|
+
}
|
|
142
|
+
getMessageHistory(sessionId) {
|
|
143
|
+
const rows = this.db.all('SELECT * FROM chat_messages WHERE session_id = ? ORDER BY timestamp ASC', [sessionId]);
|
|
144
|
+
return rows.map((r) => this.rowToMessage(r));
|
|
145
|
+
}
|
|
146
|
+
addAssistantMessage(sessionId, content) {
|
|
147
|
+
const id = randomUUID();
|
|
148
|
+
const now = Date.now();
|
|
149
|
+
this.db.run(`INSERT INTO chat_messages (id, session_id, role, content, timestamp, tool_calls_json) VALUES (?, ?, ?, ?, ?, ?)`, [id, sessionId, 'assistant', content, now, null]);
|
|
150
|
+
this.db.run('UPDATE sessions SET last_active_at = ?, status = ?, message_count = message_count + 1 WHERE id = ?', [now, 'idle', sessionId]);
|
|
151
|
+
}
|
|
152
|
+
appendMessage(sessionId, role, content, options) {
|
|
153
|
+
const session = this.getSession(sessionId);
|
|
154
|
+
if (!session)
|
|
155
|
+
return;
|
|
156
|
+
const id = randomUUID();
|
|
157
|
+
const now = Date.now();
|
|
158
|
+
const toolCallsJson = role === 'assistant' && options?.toolCalls ? JSON.stringify(options.toolCalls) : null;
|
|
159
|
+
this.db.run(`INSERT INTO chat_messages (id, session_id, role, content, timestamp, tool_calls_json) VALUES (?, ?, ?, ?, ?, ?)`, [id, sessionId, role, content, now, toolCallsJson]);
|
|
160
|
+
this.db.run('UPDATE sessions SET last_active_at = ?, status = ?, message_count = message_count + 1 WHERE id = ?', [now, role === 'assistant' ? 'idle' : session.status, sessionId]);
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
AgentsService = __decorate([
|
|
164
|
+
Injectable(),
|
|
165
|
+
__metadata("design:paramtypes", [DatabaseService])
|
|
166
|
+
], AgentsService);
|
|
167
|
+
export { AgentsService };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { Module } from '@nestjs/common';
|
|
8
|
+
import { DatabaseModule } from './database/database.module.js';
|
|
9
|
+
import { AgentsModule } from './agents/agents.module.js';
|
|
10
|
+
import { AgentConfigModule } from './agent-config/agent-config.module.js';
|
|
11
|
+
import { SkillsModule } from './skills/skills.module.js';
|
|
12
|
+
import { ConfigModule } from './config/config.module.js';
|
|
13
|
+
import { AuthModule } from './auth/auth.module.js';
|
|
14
|
+
import { UsersModule } from './users/users.module.js';
|
|
15
|
+
import { WorkspaceModule } from './workspace/workspace.module.js';
|
|
16
|
+
import { TasksModule } from './tasks/tasks.module.js';
|
|
17
|
+
import { UsageModule } from './usage/usage.module.js';
|
|
18
|
+
let AppModule = class AppModule {
|
|
19
|
+
};
|
|
20
|
+
AppModule = __decorate([
|
|
21
|
+
Module({
|
|
22
|
+
imports: [
|
|
23
|
+
DatabaseModule,
|
|
24
|
+
AgentsModule,
|
|
25
|
+
AgentConfigModule,
|
|
26
|
+
SkillsModule,
|
|
27
|
+
ConfigModule,
|
|
28
|
+
AuthModule,
|
|
29
|
+
UsersModule,
|
|
30
|
+
WorkspaceModule,
|
|
31
|
+
TasksModule,
|
|
32
|
+
UsageModule,
|
|
33
|
+
],
|
|
34
|
+
})
|
|
35
|
+
], AppModule);
|
|
36
|
+
export { AppModule };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ConfigService } from '../config/config.service.js';
|
|
2
|
+
import { UsersService } from '../users/users.service.js';
|
|
3
|
+
export declare class AuthController {
|
|
4
|
+
private readonly configService;
|
|
5
|
+
private readonly usersService;
|
|
6
|
+
constructor(configService: ConfigService, usersService: UsersService);
|
|
7
|
+
login(body: {
|
|
8
|
+
username?: string;
|
|
9
|
+
password?: string;
|
|
10
|
+
}): Promise<{
|
|
11
|
+
success: boolean;
|
|
12
|
+
user: {
|
|
13
|
+
id: string;
|
|
14
|
+
username: string;
|
|
15
|
+
} | undefined;
|
|
16
|
+
} | {
|
|
17
|
+
success: boolean;
|
|
18
|
+
user?: undefined;
|
|
19
|
+
}>;
|
|
20
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
import { Controller, Post, Body, HttpCode, HttpStatus, UnauthorizedException } from '@nestjs/common';
|
|
14
|
+
import { ConfigService } from '../config/config.service.js';
|
|
15
|
+
import { UsersService } from '../users/users.service.js';
|
|
16
|
+
const DEFAULT_USERNAME = 'admin';
|
|
17
|
+
const DEFAULT_PASSWORD = '123456';
|
|
18
|
+
let AuthController = class AuthController {
|
|
19
|
+
configService;
|
|
20
|
+
usersService;
|
|
21
|
+
constructor(configService, usersService) {
|
|
22
|
+
this.configService = configService;
|
|
23
|
+
this.usersService = usersService;
|
|
24
|
+
}
|
|
25
|
+
async login(body) {
|
|
26
|
+
const user = (body.username ?? '').trim().toLowerCase();
|
|
27
|
+
const pass = (body.password ?? '').trim();
|
|
28
|
+
// 系统缺省:admin / 123456 始终允许登录,并确保缺省用户存在
|
|
29
|
+
if (user === DEFAULT_USERNAME && pass === DEFAULT_PASSWORD) {
|
|
30
|
+
const defaultUser = await this.usersService.ensureDefaultAdmin();
|
|
31
|
+
return { success: true, user: defaultUser };
|
|
32
|
+
}
|
|
33
|
+
const hasUsers = await this.usersService.hasUsers();
|
|
34
|
+
if (hasUsers) {
|
|
35
|
+
const ok = await this.usersService.validateCredentials(body.username ?? '', body.password ?? '');
|
|
36
|
+
if (ok) {
|
|
37
|
+
const found = await this.usersService.findByUsername(body.username ?? '');
|
|
38
|
+
return { success: true, user: found ?? undefined };
|
|
39
|
+
}
|
|
40
|
+
throw new UnauthorizedException('Invalid username or password');
|
|
41
|
+
}
|
|
42
|
+
const config = await this.configService.getConfig();
|
|
43
|
+
const expectedUser = (config.loginUsername?.trim() || DEFAULT_USERNAME).toLowerCase();
|
|
44
|
+
const expectedPass = config.loginPassword?.trim() || DEFAULT_PASSWORD;
|
|
45
|
+
if (user === expectedUser && pass === expectedPass) {
|
|
46
|
+
return { success: true };
|
|
47
|
+
}
|
|
48
|
+
throw new UnauthorizedException('Invalid username or password');
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
__decorate([
|
|
52
|
+
Post('login'),
|
|
53
|
+
HttpCode(HttpStatus.OK),
|
|
54
|
+
__param(0, Body()),
|
|
55
|
+
__metadata("design:type", Function),
|
|
56
|
+
__metadata("design:paramtypes", [Object]),
|
|
57
|
+
__metadata("design:returntype", Promise)
|
|
58
|
+
], AuthController.prototype, "login", null);
|
|
59
|
+
AuthController = __decorate([
|
|
60
|
+
Controller('auth'),
|
|
61
|
+
__metadata("design:paramtypes", [ConfigService,
|
|
62
|
+
UsersService])
|
|
63
|
+
], AuthController);
|
|
64
|
+
export { AuthController };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { Module } from '@nestjs/common';
|
|
8
|
+
import { ConfigModule } from '../config/config.module.js';
|
|
9
|
+
import { UsersModule } from '../users/users.module.js';
|
|
10
|
+
import { AuthController } from './auth.controller.js';
|
|
11
|
+
let AuthModule = class AuthModule {
|
|
12
|
+
};
|
|
13
|
+
AuthModule = __decorate([
|
|
14
|
+
Module({
|
|
15
|
+
imports: [ConfigModule, UsersModule],
|
|
16
|
+
controllers: [AuthController],
|
|
17
|
+
})
|
|
18
|
+
], AuthModule);
|
|
19
|
+
export { AuthModule };
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { ConfigService, AppConfig } from './config.service.js';
|
|
2
|
+
export declare class ConfigController {
|
|
3
|
+
private readonly configService;
|
|
4
|
+
constructor(configService: ConfigService);
|
|
5
|
+
getConfig(): Promise<{
|
|
6
|
+
success: boolean;
|
|
7
|
+
data: {
|
|
8
|
+
loginPasswordSet: boolean;
|
|
9
|
+
gatewayUrl: string;
|
|
10
|
+
defaultProvider: string;
|
|
11
|
+
defaultModel: string;
|
|
12
|
+
defaultAgentId?: string;
|
|
13
|
+
theme: "light" | "dark";
|
|
14
|
+
maxAgentSessions?: number;
|
|
15
|
+
loginUsername?: string;
|
|
16
|
+
providers: {
|
|
17
|
+
[key: string]: {
|
|
18
|
+
apiKey?: string;
|
|
19
|
+
baseUrl?: string;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
}>;
|
|
24
|
+
updateConfig(updates: Partial<AppConfig>): Promise<{
|
|
25
|
+
success: boolean;
|
|
26
|
+
data: {
|
|
27
|
+
loginPasswordSet: boolean;
|
|
28
|
+
gatewayUrl: string;
|
|
29
|
+
defaultProvider: string;
|
|
30
|
+
defaultModel: string;
|
|
31
|
+
defaultAgentId?: string;
|
|
32
|
+
theme: "light" | "dark";
|
|
33
|
+
maxAgentSessions?: number;
|
|
34
|
+
loginUsername?: string;
|
|
35
|
+
providers: {
|
|
36
|
+
[key: string]: {
|
|
37
|
+
apiKey?: string;
|
|
38
|
+
baseUrl?: string;
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
}>;
|
|
43
|
+
getProviders(): Promise<{
|
|
44
|
+
success: boolean;
|
|
45
|
+
data: string[];
|
|
46
|
+
}>;
|
|
47
|
+
getModels(provider: string): Promise<{
|
|
48
|
+
success: boolean;
|
|
49
|
+
data: string[];
|
|
50
|
+
}>;
|
|
51
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
import { Controller, Get, Put, Body, Param } from '@nestjs/common';
|
|
14
|
+
import { ConfigService } from './config.service.js';
|
|
15
|
+
let ConfigController = class ConfigController {
|
|
16
|
+
configService;
|
|
17
|
+
constructor(configService) {
|
|
18
|
+
this.configService = configService;
|
|
19
|
+
}
|
|
20
|
+
async getConfig() {
|
|
21
|
+
const config = await this.configService.getConfig();
|
|
22
|
+
const { loginPassword, ...rest } = config;
|
|
23
|
+
return {
|
|
24
|
+
success: true,
|
|
25
|
+
data: { ...rest, loginPasswordSet: !!loginPassword },
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
async updateConfig(updates) {
|
|
29
|
+
const config = await this.configService.updateConfig(updates);
|
|
30
|
+
const { loginPassword, ...rest } = config;
|
|
31
|
+
return {
|
|
32
|
+
success: true,
|
|
33
|
+
data: { ...rest, loginPasswordSet: !!loginPassword },
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
async getProviders() {
|
|
37
|
+
const providers = await this.configService.getProviders();
|
|
38
|
+
return {
|
|
39
|
+
success: true,
|
|
40
|
+
data: providers,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
async getModels(provider) {
|
|
44
|
+
const models = await this.configService.getModels(provider);
|
|
45
|
+
return {
|
|
46
|
+
success: true,
|
|
47
|
+
data: models,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
__decorate([
|
|
52
|
+
Get(),
|
|
53
|
+
__metadata("design:type", Function),
|
|
54
|
+
__metadata("design:paramtypes", []),
|
|
55
|
+
__metadata("design:returntype", Promise)
|
|
56
|
+
], ConfigController.prototype, "getConfig", null);
|
|
57
|
+
__decorate([
|
|
58
|
+
Put(),
|
|
59
|
+
__param(0, Body()),
|
|
60
|
+
__metadata("design:type", Function),
|
|
61
|
+
__metadata("design:paramtypes", [Object]),
|
|
62
|
+
__metadata("design:returntype", Promise)
|
|
63
|
+
], ConfigController.prototype, "updateConfig", null);
|
|
64
|
+
__decorate([
|
|
65
|
+
Get('providers'),
|
|
66
|
+
__metadata("design:type", Function),
|
|
67
|
+
__metadata("design:paramtypes", []),
|
|
68
|
+
__metadata("design:returntype", Promise)
|
|
69
|
+
], ConfigController.prototype, "getProviders", null);
|
|
70
|
+
__decorate([
|
|
71
|
+
Get('providers/:provider/models'),
|
|
72
|
+
__param(0, Param('provider')),
|
|
73
|
+
__metadata("design:type", Function),
|
|
74
|
+
__metadata("design:paramtypes", [String]),
|
|
75
|
+
__metadata("design:returntype", Promise)
|
|
76
|
+
], ConfigController.prototype, "getModels", null);
|
|
77
|
+
ConfigController = __decorate([
|
|
78
|
+
Controller('config'),
|
|
79
|
+
__metadata("design:paramtypes", [ConfigService])
|
|
80
|
+
], ConfigController);
|
|
81
|
+
export { ConfigController };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { Module } from '@nestjs/common';
|
|
8
|
+
import { ConfigController } from './config.controller.js';
|
|
9
|
+
import { ConfigService } from './config.service.js';
|
|
10
|
+
let ConfigModule = class ConfigModule {
|
|
11
|
+
};
|
|
12
|
+
ConfigModule = __decorate([
|
|
13
|
+
Module({
|
|
14
|
+
controllers: [ConfigController],
|
|
15
|
+
providers: [ConfigService],
|
|
16
|
+
exports: [ConfigService],
|
|
17
|
+
})
|
|
18
|
+
], ConfigModule);
|
|
19
|
+
export { ConfigModule };
|