@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,15 @@
|
|
|
1
|
+
import type { InfoType, MemoryMetadata } from "./types.js";
|
|
2
|
+
export declare function getChroma(): Promise<{
|
|
3
|
+
client: null;
|
|
4
|
+
collection: null;
|
|
5
|
+
}>;
|
|
6
|
+
export declare function addToStore(id: string, embedding: number[], document: string, metadata: MemoryMetadata): Promise<void>;
|
|
7
|
+
export type MemoryFilter = {
|
|
8
|
+
infotype?: InfoType;
|
|
9
|
+
sessionId?: string;
|
|
10
|
+
};
|
|
11
|
+
export declare function queryStore(queryEmbedding: number[], topK?: number, filter?: MemoryFilter): Promise<{
|
|
12
|
+
document: string;
|
|
13
|
+
metadata: MemoryMetadata;
|
|
14
|
+
distance?: number;
|
|
15
|
+
}[]>;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { LocalIndex } from "vectra";
|
|
3
|
+
import { getOpenbotAgentDir } from "../agent/agent-dir.js";
|
|
4
|
+
const INDEX_DIR_NAME = "memory";
|
|
5
|
+
let indexDir = null;
|
|
6
|
+
let index = null;
|
|
7
|
+
function getIndexDir() {
|
|
8
|
+
if (!indexDir) {
|
|
9
|
+
indexDir = join(getOpenbotAgentDir(), INDEX_DIR_NAME);
|
|
10
|
+
}
|
|
11
|
+
return indexDir;
|
|
12
|
+
}
|
|
13
|
+
async function getIndex() {
|
|
14
|
+
if (index)
|
|
15
|
+
return index;
|
|
16
|
+
const path = getIndexDir();
|
|
17
|
+
index = new LocalIndex(path);
|
|
18
|
+
if (!(await index.isIndexCreated())) {
|
|
19
|
+
await index.createIndex();
|
|
20
|
+
}
|
|
21
|
+
return index;
|
|
22
|
+
}
|
|
23
|
+
/** Vectra 返回 score(相似度 0~1,越大越相似);转为 distance = 1 - score,与现有 API 一致 */
|
|
24
|
+
function scoreToDistance(score) {
|
|
25
|
+
return 1 - score;
|
|
26
|
+
}
|
|
27
|
+
export async function getChroma() {
|
|
28
|
+
await getIndex();
|
|
29
|
+
return { client: null, collection: null };
|
|
30
|
+
}
|
|
31
|
+
export async function addToStore(id, embedding, document, metadata) {
|
|
32
|
+
const idx = await getIndex();
|
|
33
|
+
await idx.upsertItem({
|
|
34
|
+
id,
|
|
35
|
+
vector: embedding,
|
|
36
|
+
metadata: {
|
|
37
|
+
document,
|
|
38
|
+
infotype: metadata.infotype,
|
|
39
|
+
sessionId: metadata.sessionId,
|
|
40
|
+
createdAt: metadata.createdAt,
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
export async function queryStore(queryEmbedding, topK = 10, filter) {
|
|
45
|
+
const idx = await getIndex();
|
|
46
|
+
const vectraFilter = filter && (filter.infotype != null || filter.sessionId != null)
|
|
47
|
+
? {
|
|
48
|
+
...(filter.infotype != null && { infotype: { $eq: filter.infotype } }),
|
|
49
|
+
...(filter.sessionId != null && { sessionId: { $eq: filter.sessionId } }),
|
|
50
|
+
}
|
|
51
|
+
: undefined;
|
|
52
|
+
const results = await idx.queryItems(queryEmbedding, "", topK, vectraFilter);
|
|
53
|
+
return results.map((r) => {
|
|
54
|
+
const meta = (r.item.metadata ?? {});
|
|
55
|
+
return {
|
|
56
|
+
document: String(meta.document ?? ""),
|
|
57
|
+
metadata: {
|
|
58
|
+
infotype: meta.infotype,
|
|
59
|
+
sessionId: String(meta.sessionId ?? ""),
|
|
60
|
+
createdAt: String(meta.createdAt ?? ""),
|
|
61
|
+
},
|
|
62
|
+
distance: scoreToDistance(r.score),
|
|
63
|
+
};
|
|
64
|
+
});
|
|
65
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { AgentConfigService, AgentConfigItem } from './agent-config.service.js';
|
|
2
|
+
export declare class AgentConfigController {
|
|
3
|
+
private readonly agentConfigService;
|
|
4
|
+
constructor(agentConfigService: AgentConfigService);
|
|
5
|
+
listAgents(): Promise<{
|
|
6
|
+
success: boolean;
|
|
7
|
+
data: AgentConfigItem[];
|
|
8
|
+
}>;
|
|
9
|
+
getAgent(id: string): Promise<{
|
|
10
|
+
success: boolean;
|
|
11
|
+
data: null;
|
|
12
|
+
} | {
|
|
13
|
+
success: boolean;
|
|
14
|
+
data: AgentConfigItem;
|
|
15
|
+
}>;
|
|
16
|
+
createAgent(body: {
|
|
17
|
+
name: string;
|
|
18
|
+
workspace: string;
|
|
19
|
+
}): Promise<{
|
|
20
|
+
success: boolean;
|
|
21
|
+
data: AgentConfigItem;
|
|
22
|
+
}>;
|
|
23
|
+
updateAgent(id: string, body: Partial<Pick<AgentConfigItem, 'name' | 'provider' | 'model'>>): Promise<{
|
|
24
|
+
success: boolean;
|
|
25
|
+
data: AgentConfigItem;
|
|
26
|
+
}>;
|
|
27
|
+
deleteAgent(id: string): Promise<{
|
|
28
|
+
success: boolean;
|
|
29
|
+
}>;
|
|
30
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
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, Post, Put, Delete, Body, Param } from '@nestjs/common';
|
|
14
|
+
import { AgentConfigService } from './agent-config.service.js';
|
|
15
|
+
let AgentConfigController = class AgentConfigController {
|
|
16
|
+
agentConfigService;
|
|
17
|
+
constructor(agentConfigService) {
|
|
18
|
+
this.agentConfigService = agentConfigService;
|
|
19
|
+
}
|
|
20
|
+
async listAgents() {
|
|
21
|
+
const agents = await this.agentConfigService.listAgents();
|
|
22
|
+
return { success: true, data: agents };
|
|
23
|
+
}
|
|
24
|
+
async getAgent(id) {
|
|
25
|
+
const agent = await this.agentConfigService.getAgent(id);
|
|
26
|
+
if (!agent) {
|
|
27
|
+
return { success: false, data: null };
|
|
28
|
+
}
|
|
29
|
+
return { success: true, data: agent };
|
|
30
|
+
}
|
|
31
|
+
async createAgent(body) {
|
|
32
|
+
const agent = await this.agentConfigService.createAgent(body);
|
|
33
|
+
return { success: true, data: agent };
|
|
34
|
+
}
|
|
35
|
+
async updateAgent(id, body) {
|
|
36
|
+
const agent = await this.agentConfigService.updateAgent(id, body);
|
|
37
|
+
return { success: true, data: agent };
|
|
38
|
+
}
|
|
39
|
+
async deleteAgent(id) {
|
|
40
|
+
await this.agentConfigService.deleteAgent(id);
|
|
41
|
+
return { success: true };
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
__decorate([
|
|
45
|
+
Get(),
|
|
46
|
+
__metadata("design:type", Function),
|
|
47
|
+
__metadata("design:paramtypes", []),
|
|
48
|
+
__metadata("design:returntype", Promise)
|
|
49
|
+
], AgentConfigController.prototype, "listAgents", null);
|
|
50
|
+
__decorate([
|
|
51
|
+
Get(':id'),
|
|
52
|
+
__param(0, Param('id')),
|
|
53
|
+
__metadata("design:type", Function),
|
|
54
|
+
__metadata("design:paramtypes", [String]),
|
|
55
|
+
__metadata("design:returntype", Promise)
|
|
56
|
+
], AgentConfigController.prototype, "getAgent", null);
|
|
57
|
+
__decorate([
|
|
58
|
+
Post(),
|
|
59
|
+
__param(0, Body()),
|
|
60
|
+
__metadata("design:type", Function),
|
|
61
|
+
__metadata("design:paramtypes", [Object]),
|
|
62
|
+
__metadata("design:returntype", Promise)
|
|
63
|
+
], AgentConfigController.prototype, "createAgent", null);
|
|
64
|
+
__decorate([
|
|
65
|
+
Put(':id'),
|
|
66
|
+
__param(0, Param('id')),
|
|
67
|
+
__param(1, Body()),
|
|
68
|
+
__metadata("design:type", Function),
|
|
69
|
+
__metadata("design:paramtypes", [String, Object]),
|
|
70
|
+
__metadata("design:returntype", Promise)
|
|
71
|
+
], AgentConfigController.prototype, "updateAgent", null);
|
|
72
|
+
__decorate([
|
|
73
|
+
Delete(':id'),
|
|
74
|
+
__param(0, Param('id')),
|
|
75
|
+
__metadata("design:type", Function),
|
|
76
|
+
__metadata("design:paramtypes", [String]),
|
|
77
|
+
__metadata("design:returntype", Promise)
|
|
78
|
+
], AgentConfigController.prototype, "deleteAgent", null);
|
|
79
|
+
AgentConfigController = __decorate([
|
|
80
|
+
Controller('agent-config'),
|
|
81
|
+
__metadata("design:paramtypes", [AgentConfigService])
|
|
82
|
+
], AgentConfigController);
|
|
83
|
+
export { AgentConfigController };
|
|
@@ -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 { AgentConfigService } from './agent-config.service.js';
|
|
9
|
+
import { AgentConfigController } from './agent-config.controller.js';
|
|
10
|
+
let AgentConfigModule = class AgentConfigModule {
|
|
11
|
+
};
|
|
12
|
+
AgentConfigModule = __decorate([
|
|
13
|
+
Module({
|
|
14
|
+
controllers: [AgentConfigController],
|
|
15
|
+
providers: [AgentConfigService],
|
|
16
|
+
exports: [AgentConfigService],
|
|
17
|
+
})
|
|
18
|
+
], AgentConfigModule);
|
|
19
|
+
export { AgentConfigModule };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/** 缺省智能体 ID / 工作空间名,不可删除;对应目录 ~/.openbot/workspace/default */
|
|
2
|
+
export declare const DEFAULT_AGENT_ID = "default";
|
|
3
|
+
/**
|
|
4
|
+
* 智能体列表与配置使用文件存储(~/.openbot/desktop/agents.json),不使用 SQLite。
|
|
5
|
+
* 会话与消息历史使用 SQLite;Skills、工作空间文档为目录文件管理。
|
|
6
|
+
*/
|
|
7
|
+
export interface AgentConfigItem {
|
|
8
|
+
id: string;
|
|
9
|
+
name: string;
|
|
10
|
+
workspace: string;
|
|
11
|
+
provider?: string;
|
|
12
|
+
model?: string;
|
|
13
|
+
/** 是否为系统缺省智能体(主智能体),不可删除 */
|
|
14
|
+
isDefault?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare class AgentConfigService {
|
|
17
|
+
private configDir;
|
|
18
|
+
private agentsPath;
|
|
19
|
+
constructor();
|
|
20
|
+
private ensureConfigDir;
|
|
21
|
+
private readAgentsFile;
|
|
22
|
+
private writeAgentsFile;
|
|
23
|
+
/** 确保 default 工作空间目录存在 */
|
|
24
|
+
private ensureDefaultWorkspace;
|
|
25
|
+
private defaultAgent;
|
|
26
|
+
listAgents(): Promise<AgentConfigItem[]>;
|
|
27
|
+
getAgent(id: string): Promise<AgentConfigItem | null>;
|
|
28
|
+
createAgent(params: {
|
|
29
|
+
name: string;
|
|
30
|
+
workspace: string;
|
|
31
|
+
}): Promise<AgentConfigItem>;
|
|
32
|
+
updateAgent(id: string, updates: Partial<Pick<AgentConfigItem, 'name' | 'provider' | 'model'>>): Promise<AgentConfigItem>;
|
|
33
|
+
deleteAgent(id: string): Promise<void>;
|
|
34
|
+
}
|
|
@@ -0,0 +1,171 @@
|
|
|
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, ConflictException, BadRequestException, NotFoundException } from '@nestjs/common';
|
|
11
|
+
import { readFile, writeFile, mkdir } from 'fs/promises';
|
|
12
|
+
import { join } from 'path';
|
|
13
|
+
import { existsSync } from 'fs';
|
|
14
|
+
import { homedir } from 'os';
|
|
15
|
+
/** 工作空间名仅允许英文、数字、下划线、连字符 */
|
|
16
|
+
const WORKSPACE_NAME_REGEX = /^[a-zA-Z0-9_-]+$/;
|
|
17
|
+
/** 缺省智能体 ID / 工作空间名,不可删除;对应目录 ~/.openbot/workspace/default */
|
|
18
|
+
export const DEFAULT_AGENT_ID = 'default';
|
|
19
|
+
/** 主智能体(default)的默认展示名 */
|
|
20
|
+
const DEFAULT_AGENT_NAME = '主智能体';
|
|
21
|
+
let AgentConfigService = class AgentConfigService {
|
|
22
|
+
configDir;
|
|
23
|
+
agentsPath;
|
|
24
|
+
constructor() {
|
|
25
|
+
const homeDir = process.env.HOME || process.env.USERPROFILE || homedir();
|
|
26
|
+
this.configDir = join(homeDir, '.openbot', 'desktop');
|
|
27
|
+
this.agentsPath = join(this.configDir, 'agents.json');
|
|
28
|
+
}
|
|
29
|
+
async ensureConfigDir() {
|
|
30
|
+
if (!existsSync(this.configDir)) {
|
|
31
|
+
await mkdir(this.configDir, { recursive: true });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async readAgentsFile() {
|
|
35
|
+
await this.ensureConfigDir();
|
|
36
|
+
if (!existsSync(this.agentsPath)) {
|
|
37
|
+
return { agents: [] };
|
|
38
|
+
}
|
|
39
|
+
const content = await readFile(this.agentsPath, 'utf-8');
|
|
40
|
+
try {
|
|
41
|
+
const data = JSON.parse(content);
|
|
42
|
+
return Array.isArray(data.agents) ? data : { agents: [] };
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return { agents: [] };
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async writeAgentsFile(data) {
|
|
49
|
+
await this.ensureConfigDir();
|
|
50
|
+
await writeFile(this.agentsPath, JSON.stringify(data, null, 2), 'utf-8');
|
|
51
|
+
}
|
|
52
|
+
/** 确保 default 工作空间目录存在 */
|
|
53
|
+
async ensureDefaultWorkspace() {
|
|
54
|
+
const homeDir = process.env.HOME || process.env.USERPROFILE || homedir();
|
|
55
|
+
const workspaceRoot = join(homeDir, '.openbot', 'workspace', DEFAULT_AGENT_ID);
|
|
56
|
+
const skillsDir = join(workspaceRoot, 'skills');
|
|
57
|
+
if (!existsSync(workspaceRoot)) {
|
|
58
|
+
await mkdir(skillsDir, { recursive: true });
|
|
59
|
+
}
|
|
60
|
+
else if (!existsSync(skillsDir)) {
|
|
61
|
+
await mkdir(skillsDir, { recursive: true });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
defaultAgent(overrides) {
|
|
65
|
+
return {
|
|
66
|
+
id: DEFAULT_AGENT_ID,
|
|
67
|
+
name: DEFAULT_AGENT_NAME,
|
|
68
|
+
workspace: DEFAULT_AGENT_ID,
|
|
69
|
+
isDefault: true,
|
|
70
|
+
...overrides,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
async listAgents() {
|
|
74
|
+
await this.ensureDefaultWorkspace();
|
|
75
|
+
const file = await this.readAgentsFile();
|
|
76
|
+
const others = file.agents.filter((a) => a.id !== DEFAULT_AGENT_ID);
|
|
77
|
+
const defaultEntry = file.agents.find((a) => a.id === DEFAULT_AGENT_ID);
|
|
78
|
+
const mainAgent = defaultEntry
|
|
79
|
+
? { ...defaultEntry, isDefault: true }
|
|
80
|
+
: this.defaultAgent();
|
|
81
|
+
return [mainAgent, ...others].map((a) => (a.id === DEFAULT_AGENT_ID ? { ...a, isDefault: true } : a));
|
|
82
|
+
}
|
|
83
|
+
async getAgent(id) {
|
|
84
|
+
if (id === DEFAULT_AGENT_ID) {
|
|
85
|
+
await this.ensureDefaultWorkspace();
|
|
86
|
+
}
|
|
87
|
+
const file = await this.readAgentsFile();
|
|
88
|
+
const found = file.agents.find((a) => a.id === id);
|
|
89
|
+
if (found)
|
|
90
|
+
return { ...found, isDefault: found.id === DEFAULT_AGENT_ID };
|
|
91
|
+
if (id === DEFAULT_AGENT_ID)
|
|
92
|
+
return this.defaultAgent();
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
async createAgent(params) {
|
|
96
|
+
const { name, workspace } = params;
|
|
97
|
+
if (workspace === DEFAULT_AGENT_ID) {
|
|
98
|
+
throw new BadRequestException('工作空间名 default 为系统保留(主智能体),请使用其他名称');
|
|
99
|
+
}
|
|
100
|
+
if (!workspace || !WORKSPACE_NAME_REGEX.test(workspace)) {
|
|
101
|
+
throw new BadRequestException('工作空间名必须为英文、数字、下划线或连字符');
|
|
102
|
+
}
|
|
103
|
+
const trimmedName = (name || workspace).trim() || workspace;
|
|
104
|
+
const file = await this.readAgentsFile();
|
|
105
|
+
if (file.agents.some((a) => a.workspace === workspace || a.id === workspace)) {
|
|
106
|
+
throw new ConflictException('该工作空间名已存在');
|
|
107
|
+
}
|
|
108
|
+
const homeDir = process.env.HOME || process.env.USERPROFILE || homedir();
|
|
109
|
+
const workspaceRoot = join(homeDir, '.openbot', 'workspace', workspace);
|
|
110
|
+
const skillsDir = join(workspaceRoot, 'skills');
|
|
111
|
+
if (!existsSync(workspaceRoot)) {
|
|
112
|
+
await mkdir(skillsDir, { recursive: true });
|
|
113
|
+
}
|
|
114
|
+
else if (!existsSync(skillsDir)) {
|
|
115
|
+
await mkdir(skillsDir, { recursive: true });
|
|
116
|
+
}
|
|
117
|
+
const agent = {
|
|
118
|
+
id: workspace,
|
|
119
|
+
name: trimmedName,
|
|
120
|
+
workspace,
|
|
121
|
+
provider: undefined,
|
|
122
|
+
model: undefined,
|
|
123
|
+
};
|
|
124
|
+
file.agents.push(agent);
|
|
125
|
+
await this.writeAgentsFile(file);
|
|
126
|
+
return agent;
|
|
127
|
+
}
|
|
128
|
+
async updateAgent(id, updates) {
|
|
129
|
+
if (id === DEFAULT_AGENT_ID) {
|
|
130
|
+
await this.ensureDefaultWorkspace();
|
|
131
|
+
}
|
|
132
|
+
const file = await this.readAgentsFile();
|
|
133
|
+
let idx = file.agents.findIndex((a) => a.id === id);
|
|
134
|
+
if (idx < 0) {
|
|
135
|
+
if (id === DEFAULT_AGENT_ID) {
|
|
136
|
+
file.agents.unshift(this.defaultAgent());
|
|
137
|
+
idx = 0;
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
throw new NotFoundException('智能体不存在');
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const agent = file.agents[idx];
|
|
144
|
+
if (agent.id !== DEFAULT_AGENT_ID && updates.name !== undefined) {
|
|
145
|
+
agent.name = (updates.name || agent.workspace).trim() || agent.workspace;
|
|
146
|
+
}
|
|
147
|
+
if (updates.provider !== undefined)
|
|
148
|
+
agent.provider = updates.provider;
|
|
149
|
+
if (updates.model !== undefined)
|
|
150
|
+
agent.model = updates.model;
|
|
151
|
+
await this.writeAgentsFile(file);
|
|
152
|
+
return { ...agent, isDefault: agent.id === DEFAULT_AGENT_ID };
|
|
153
|
+
}
|
|
154
|
+
async deleteAgent(id) {
|
|
155
|
+
if (id === DEFAULT_AGENT_ID) {
|
|
156
|
+
throw new BadRequestException('主智能体(default)不可删除');
|
|
157
|
+
}
|
|
158
|
+
const file = await this.readAgentsFile();
|
|
159
|
+
const idx = file.agents.findIndex((a) => a.id === id);
|
|
160
|
+
if (idx < 0) {
|
|
161
|
+
throw new NotFoundException('智能体不存在');
|
|
162
|
+
}
|
|
163
|
+
file.agents.splice(idx, 1);
|
|
164
|
+
await this.writeAgentsFile(file);
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
AgentConfigService = __decorate([
|
|
168
|
+
Injectable(),
|
|
169
|
+
__metadata("design:paramtypes", [])
|
|
170
|
+
], AgentConfigService);
|
|
171
|
+
export { AgentConfigService };
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { AgentsService } from './agents.service.js';
|
|
2
|
+
export declare class AgentsController {
|
|
3
|
+
private readonly agentsService;
|
|
4
|
+
constructor(agentsService: AgentsService);
|
|
5
|
+
createSession(body: {
|
|
6
|
+
id?: string;
|
|
7
|
+
agentId?: string;
|
|
8
|
+
workspace?: string;
|
|
9
|
+
provider?: string;
|
|
10
|
+
model?: string;
|
|
11
|
+
title?: string;
|
|
12
|
+
type?: 'chat' | 'scheduled' | 'system';
|
|
13
|
+
}): Promise<{
|
|
14
|
+
success: boolean;
|
|
15
|
+
data: import("./agents.service.js").AgentSession;
|
|
16
|
+
}>;
|
|
17
|
+
getSessions(): {
|
|
18
|
+
success: boolean;
|
|
19
|
+
data: import("./agents.service.js").AgentSession[];
|
|
20
|
+
};
|
|
21
|
+
getSession(id: string): {
|
|
22
|
+
success: boolean;
|
|
23
|
+
data: import("./agents.service.js").AgentSession;
|
|
24
|
+
};
|
|
25
|
+
deleteSession(id: string): Promise<{
|
|
26
|
+
success: boolean;
|
|
27
|
+
message: string;
|
|
28
|
+
}>;
|
|
29
|
+
getHistory(id: string): {
|
|
30
|
+
success: boolean;
|
|
31
|
+
data: import("./agents.service.js").ChatMessage[];
|
|
32
|
+
};
|
|
33
|
+
appendMessage(id: string, body: {
|
|
34
|
+
role: 'user' | 'assistant';
|
|
35
|
+
content: string;
|
|
36
|
+
toolCalls?: any[];
|
|
37
|
+
contentParts?: any[];
|
|
38
|
+
}): {
|
|
39
|
+
success: boolean;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
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, Post, Delete, Body, Param, HttpException, HttpStatus, } from '@nestjs/common';
|
|
14
|
+
import { AgentsService } from './agents.service.js';
|
|
15
|
+
let AgentsController = class AgentsController {
|
|
16
|
+
agentsService;
|
|
17
|
+
constructor(agentsService) {
|
|
18
|
+
this.agentsService = agentsService;
|
|
19
|
+
}
|
|
20
|
+
async createSession(body) {
|
|
21
|
+
try {
|
|
22
|
+
const session = await this.agentsService.createSession(body);
|
|
23
|
+
return {
|
|
24
|
+
success: true,
|
|
25
|
+
data: session,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
throw new HttpException(error.message || 'Failed to create session', HttpStatus.INTERNAL_SERVER_ERROR);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
getSessions() {
|
|
33
|
+
const sessions = this.agentsService.getSessions();
|
|
34
|
+
return {
|
|
35
|
+
success: true,
|
|
36
|
+
data: sessions,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
getSession(id) {
|
|
40
|
+
const session = this.agentsService.getSession(id);
|
|
41
|
+
if (!session) {
|
|
42
|
+
throw new HttpException('Session not found', HttpStatus.NOT_FOUND);
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
success: true,
|
|
46
|
+
data: session,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
async deleteSession(id) {
|
|
50
|
+
const deleted = await this.agentsService.deleteSession(id);
|
|
51
|
+
if (!deleted) {
|
|
52
|
+
throw new HttpException('Session not found', HttpStatus.NOT_FOUND);
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
success: true,
|
|
56
|
+
message: 'Session deleted',
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
getHistory(id) {
|
|
60
|
+
const history = this.agentsService.getMessageHistory(id);
|
|
61
|
+
return {
|
|
62
|
+
success: true,
|
|
63
|
+
data: history,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
appendMessage(id, body) {
|
|
67
|
+
this.agentsService.appendMessage(id, body.role, body.content, {
|
|
68
|
+
toolCalls: body.toolCalls,
|
|
69
|
+
contentParts: body.contentParts,
|
|
70
|
+
});
|
|
71
|
+
return { success: true };
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
__decorate([
|
|
75
|
+
Post('sessions'),
|
|
76
|
+
__param(0, Body()),
|
|
77
|
+
__metadata("design:type", Function),
|
|
78
|
+
__metadata("design:paramtypes", [Object]),
|
|
79
|
+
__metadata("design:returntype", Promise)
|
|
80
|
+
], AgentsController.prototype, "createSession", null);
|
|
81
|
+
__decorate([
|
|
82
|
+
Get('sessions'),
|
|
83
|
+
__metadata("design:type", Function),
|
|
84
|
+
__metadata("design:paramtypes", []),
|
|
85
|
+
__metadata("design:returntype", void 0)
|
|
86
|
+
], AgentsController.prototype, "getSessions", null);
|
|
87
|
+
__decorate([
|
|
88
|
+
Get('sessions/:id'),
|
|
89
|
+
__param(0, Param('id')),
|
|
90
|
+
__metadata("design:type", Function),
|
|
91
|
+
__metadata("design:paramtypes", [String]),
|
|
92
|
+
__metadata("design:returntype", void 0)
|
|
93
|
+
], AgentsController.prototype, "getSession", null);
|
|
94
|
+
__decorate([
|
|
95
|
+
Delete('sessions/:id'),
|
|
96
|
+
__param(0, Param('id')),
|
|
97
|
+
__metadata("design:type", Function),
|
|
98
|
+
__metadata("design:paramtypes", [String]),
|
|
99
|
+
__metadata("design:returntype", Promise)
|
|
100
|
+
], AgentsController.prototype, "deleteSession", null);
|
|
101
|
+
__decorate([
|
|
102
|
+
Get('sessions/:id/history'),
|
|
103
|
+
__param(0, Param('id')),
|
|
104
|
+
__metadata("design:type", Function),
|
|
105
|
+
__metadata("design:paramtypes", [String]),
|
|
106
|
+
__metadata("design:returntype", void 0)
|
|
107
|
+
], AgentsController.prototype, "getHistory", null);
|
|
108
|
+
__decorate([
|
|
109
|
+
Post('sessions/:id/messages'),
|
|
110
|
+
__param(0, Param('id')),
|
|
111
|
+
__param(1, Body()),
|
|
112
|
+
__metadata("design:type", Function),
|
|
113
|
+
__metadata("design:paramtypes", [String, Object]),
|
|
114
|
+
__metadata("design:returntype", void 0)
|
|
115
|
+
], AgentsController.prototype, "appendMessage", null);
|
|
116
|
+
AgentsController = __decorate([
|
|
117
|
+
Controller('agents'),
|
|
118
|
+
__metadata("design:paramtypes", [AgentsService])
|
|
119
|
+
], AgentsController);
|
|
120
|
+
export { AgentsController };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { OnGatewayInit, OnGatewayConnection, OnGatewayDisconnect } from '@nestjs/websockets';
|
|
2
|
+
import { Server, Socket } from 'socket.io';
|
|
3
|
+
import { AgentsService } from './agents.service.js';
|
|
4
|
+
export declare class AgentsGateway implements OnGatewayInit, OnGatewayConnection, OnGatewayDisconnect {
|
|
5
|
+
private readonly agentsService;
|
|
6
|
+
server: Server;
|
|
7
|
+
private sessionSubscriptions;
|
|
8
|
+
constructor(agentsService: AgentsService);
|
|
9
|
+
afterInit(server: Server): void;
|
|
10
|
+
handleConnection(client: Socket): void;
|
|
11
|
+
handleDisconnect(client: Socket): void;
|
|
12
|
+
handleSubscribeSession(client: Socket, payload: {
|
|
13
|
+
sessionId: string;
|
|
14
|
+
}): {
|
|
15
|
+
success: boolean;
|
|
16
|
+
};
|
|
17
|
+
handleUnsubscribeSession(client: Socket): {
|
|
18
|
+
success: boolean;
|
|
19
|
+
};
|
|
20
|
+
broadcastMessageComplete(sessionId: string, content: string): void;
|
|
21
|
+
}
|