@next-open-ai/openclawx 0.6.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. package/README.md +523 -0
  2. package/apps/desktop/README.md +210 -0
  3. package/apps/desktop/renderer/dist/assets/index-CYkSfhcp.css +10 -0
  4. package/apps/desktop/renderer/dist/assets/index-FI6O25Ms.js +89 -0
  5. package/apps/desktop/renderer/dist/index.html +22 -0
  6. package/dist/cli/cli.d.ts +2 -0
  7. package/dist/cli/cli.js +198 -0
  8. package/dist/cli/service.d.ts +13 -0
  9. package/dist/cli/service.js +243 -0
  10. package/dist/cli.d.ts +5 -0
  11. package/dist/cli.js +5 -0
  12. package/dist/core/agent/agent-dir.d.ts +14 -0
  13. package/dist/core/agent/agent-dir.js +75 -0
  14. package/dist/core/agent/agent-manager.d.ts +64 -0
  15. package/dist/core/agent/agent-manager.js +278 -0
  16. package/dist/core/agent/config-manager.d.ts +25 -0
  17. package/dist/core/agent/config-manager.js +84 -0
  18. package/dist/core/agent/run.d.ts +26 -0
  19. package/dist/core/agent/run.js +65 -0
  20. package/dist/core/agent/skills.d.ts +20 -0
  21. package/dist/core/agent/skills.js +86 -0
  22. package/dist/core/config/desktop-config.d.ts +90 -0
  23. package/dist/core/config/desktop-config.js +521 -0
  24. package/dist/core/config/provider-support-default.d.ts +21 -0
  25. package/dist/core/config/provider-support-default.js +57 -0
  26. package/dist/core/installer/index.d.ts +1 -0
  27. package/dist/core/installer/index.js +1 -0
  28. package/dist/core/installer/skill-installer.d.ts +39 -0
  29. package/dist/core/installer/skill-installer.js +215 -0
  30. package/dist/core/mcp/adapter.d.ts +17 -0
  31. package/dist/core/mcp/adapter.js +49 -0
  32. package/dist/core/mcp/client.d.ts +24 -0
  33. package/dist/core/mcp/client.js +70 -0
  34. package/dist/core/mcp/config.d.ts +22 -0
  35. package/dist/core/mcp/config.js +69 -0
  36. package/dist/core/mcp/index.d.ts +18 -0
  37. package/dist/core/mcp/index.js +20 -0
  38. package/dist/core/mcp/operator.d.ts +15 -0
  39. package/dist/core/mcp/operator.js +72 -0
  40. package/dist/core/mcp/transport/index.d.ts +11 -0
  41. package/dist/core/mcp/transport/index.js +16 -0
  42. package/dist/core/mcp/transport/sse.d.ts +20 -0
  43. package/dist/core/mcp/transport/sse.js +82 -0
  44. package/dist/core/mcp/transport/stdio.d.ts +32 -0
  45. package/dist/core/mcp/transport/stdio.js +132 -0
  46. package/dist/core/mcp/types.d.ts +72 -0
  47. package/dist/core/mcp/types.js +5 -0
  48. package/dist/core/memory/build-summary.d.ts +6 -0
  49. package/dist/core/memory/build-summary.js +27 -0
  50. package/dist/core/memory/compaction-extension.d.ts +6 -0
  51. package/dist/core/memory/compaction-extension.js +23 -0
  52. package/dist/core/memory/embedding.d.ts +4 -0
  53. package/dist/core/memory/embedding.js +15 -0
  54. package/dist/core/memory/index.d.ts +29 -0
  55. package/dist/core/memory/index.js +70 -0
  56. package/dist/core/memory/remote-embedding.d.ts +10 -0
  57. package/dist/core/memory/remote-embedding.js +36 -0
  58. package/dist/core/memory/types.d.ts +16 -0
  59. package/dist/core/memory/types.js +1 -0
  60. package/dist/core/memory/vector-store.d.ts +15 -0
  61. package/dist/core/memory/vector-store.js +65 -0
  62. package/dist/core/tools/bookmark-tool.d.ts +9 -0
  63. package/dist/core/tools/bookmark-tool.js +118 -0
  64. package/dist/core/tools/browser-tool.d.ts +10 -0
  65. package/dist/core/tools/browser-tool.js +362 -0
  66. package/dist/core/tools/index.d.ts +4 -0
  67. package/dist/core/tools/index.js +4 -0
  68. package/dist/core/tools/install-skill-tool.d.ts +6 -0
  69. package/dist/core/tools/install-skill-tool.js +53 -0
  70. package/dist/core/tools/save-experience-tool.d.ts +5 -0
  71. package/dist/core/tools/save-experience-tool.js +54 -0
  72. package/dist/gateway/auth-hooks.d.ts +17 -0
  73. package/dist/gateway/auth-hooks.js +19 -0
  74. package/dist/gateway/backend-url.d.ts +2 -0
  75. package/dist/gateway/backend-url.js +11 -0
  76. package/dist/gateway/channel-handler.d.ts +6 -0
  77. package/dist/gateway/channel-handler.js +3 -0
  78. package/dist/gateway/clients.d.ts +5 -0
  79. package/dist/gateway/clients.js +4 -0
  80. package/dist/gateway/connection-handler.d.ts +6 -0
  81. package/dist/gateway/connection-handler.js +48 -0
  82. package/dist/gateway/index.d.ts +3 -0
  83. package/dist/gateway/index.js +2 -0
  84. package/dist/gateway/message-handler.d.ts +5 -0
  85. package/dist/gateway/message-handler.js +65 -0
  86. package/dist/gateway/methods/agent-cancel.d.ts +10 -0
  87. package/dist/gateway/methods/agent-cancel.js +17 -0
  88. package/dist/gateway/methods/agent-chat.d.ts +8 -0
  89. package/dist/gateway/methods/agent-chat.js +148 -0
  90. package/dist/gateway/methods/connect.d.ts +9 -0
  91. package/dist/gateway/methods/connect.js +18 -0
  92. package/dist/gateway/methods/install-skill-from-path.d.ts +13 -0
  93. package/dist/gateway/methods/install-skill-from-path.js +15 -0
  94. package/dist/gateway/methods/install-skill-from-upload.d.ts +14 -0
  95. package/dist/gateway/methods/install-skill-from-upload.js +13 -0
  96. package/dist/gateway/methods/run-scheduled-task.d.ts +15 -0
  97. package/dist/gateway/methods/run-scheduled-task.js +127 -0
  98. package/dist/gateway/paths.d.ts +20 -0
  99. package/dist/gateway/paths.js +19 -0
  100. package/dist/gateway/server.d.ts +8 -0
  101. package/dist/gateway/server.js +190 -0
  102. package/dist/gateway/sse-handler.d.ts +6 -0
  103. package/dist/gateway/sse-handler.js +3 -0
  104. package/dist/gateway/types.d.ts +90 -0
  105. package/dist/gateway/types.js +1 -0
  106. package/dist/gateway/utils.d.ts +22 -0
  107. package/dist/gateway/utils.js +67 -0
  108. package/dist/gateway/voice-handler.d.ts +12 -0
  109. package/dist/gateway/voice-handler.js +18 -0
  110. package/dist/index.d.ts +5 -0
  111. package/dist/index.js +5 -0
  112. package/dist/server/agent-config/agent-config.controller.d.ts +30 -0
  113. package/dist/server/agent-config/agent-config.controller.js +83 -0
  114. package/dist/server/agent-config/agent-config.module.d.ts +2 -0
  115. package/dist/server/agent-config/agent-config.module.js +19 -0
  116. package/dist/server/agent-config/agent-config.service.d.ts +53 -0
  117. package/dist/server/agent-config/agent-config.service.js +213 -0
  118. package/dist/server/agents/agents.controller.d.ts +41 -0
  119. package/dist/server/agents/agents.controller.js +118 -0
  120. package/dist/server/agents/agents.gateway.d.ts +21 -0
  121. package/dist/server/agents/agents.gateway.js +103 -0
  122. package/dist/server/agents/agents.module.d.ts +2 -0
  123. package/dist/server/agents/agents.module.js +20 -0
  124. package/dist/server/agents/agents.service.d.ts +63 -0
  125. package/dist/server/agents/agents.service.js +169 -0
  126. package/dist/server/app.module.d.ts +2 -0
  127. package/dist/server/app.module.js +38 -0
  128. package/dist/server/auth/auth.controller.d.ts +20 -0
  129. package/dist/server/auth/auth.controller.js +64 -0
  130. package/dist/server/auth/auth.module.d.ts +2 -0
  131. package/dist/server/auth/auth.module.js +19 -0
  132. package/dist/server/bootstrap.d.ts +15 -0
  133. package/dist/server/bootstrap.js +38 -0
  134. package/dist/server/config/config.controller.d.ts +73 -0
  135. package/dist/server/config/config.controller.js +95 -0
  136. package/dist/server/config/config.module.d.ts +2 -0
  137. package/dist/server/config/config.module.js +21 -0
  138. package/dist/server/config/config.service.d.ts +82 -0
  139. package/dist/server/config/config.service.js +123 -0
  140. package/dist/server/database/database.module.d.ts +2 -0
  141. package/dist/server/database/database.module.js +18 -0
  142. package/dist/server/database/database.service.d.ts +26 -0
  143. package/dist/server/database/database.service.js +253 -0
  144. package/dist/server/main.d.ts +1 -0
  145. package/dist/server/main.js +9 -0
  146. package/dist/server/saved-items/saved-items.controller.d.ts +57 -0
  147. package/dist/server/saved-items/saved-items.controller.js +229 -0
  148. package/dist/server/saved-items/saved-items.module.d.ts +2 -0
  149. package/dist/server/saved-items/saved-items.module.js +25 -0
  150. package/dist/server/saved-items/saved-items.service.d.ts +31 -0
  151. package/dist/server/saved-items/saved-items.service.js +105 -0
  152. package/dist/server/saved-items/tags.controller.d.ts +30 -0
  153. package/dist/server/saved-items/tags.controller.js +85 -0
  154. package/dist/server/saved-items/tags.service.d.ts +24 -0
  155. package/dist/server/saved-items/tags.service.js +84 -0
  156. package/dist/server/skills/skills.controller.d.ts +63 -0
  157. package/dist/server/skills/skills.controller.js +194 -0
  158. package/dist/server/skills/skills.module.d.ts +2 -0
  159. package/dist/server/skills/skills.module.js +22 -0
  160. package/dist/server/skills/skills.service.d.ts +65 -0
  161. package/dist/server/skills/skills.service.js +388 -0
  162. package/dist/server/tasks/tasks.controller.d.ts +52 -0
  163. package/dist/server/tasks/tasks.controller.js +163 -0
  164. package/dist/server/tasks/tasks.module.d.ts +2 -0
  165. package/dist/server/tasks/tasks.module.js +23 -0
  166. package/dist/server/tasks/tasks.service.d.ts +86 -0
  167. package/dist/server/tasks/tasks.service.js +327 -0
  168. package/dist/server/usage/usage.controller.d.ts +12 -0
  169. package/dist/server/usage/usage.controller.js +46 -0
  170. package/dist/server/usage/usage.module.d.ts +2 -0
  171. package/dist/server/usage/usage.module.js +19 -0
  172. package/dist/server/usage/usage.service.d.ts +21 -0
  173. package/dist/server/usage/usage.service.js +55 -0
  174. package/dist/server/users/users.controller.d.ts +35 -0
  175. package/dist/server/users/users.controller.js +69 -0
  176. package/dist/server/users/users.module.d.ts +2 -0
  177. package/dist/server/users/users.module.js +19 -0
  178. package/dist/server/users/users.service.d.ts +39 -0
  179. package/dist/server/users/users.service.js +140 -0
  180. package/dist/server/workspace/workspace.controller.d.ts +24 -0
  181. package/dist/server/workspace/workspace.controller.js +132 -0
  182. package/dist/server/workspace/workspace.module.d.ts +2 -0
  183. package/dist/server/workspace/workspace.module.js +21 -0
  184. package/dist/server/workspace/workspace.service.d.ts +36 -0
  185. package/dist/server/workspace/workspace.service.js +142 -0
  186. package/package.json +90 -0
  187. package/skills/agent-browser/SKILL.md +207 -0
  188. package/skills/agent-browser/references/authentication.md +202 -0
  189. package/skills/agent-browser/references/commands.md +259 -0
  190. package/skills/agent-browser/references/proxy-support.md +188 -0
  191. package/skills/agent-browser/references/session-management.md +193 -0
  192. package/skills/agent-browser/references/snapshot-refs.md +194 -0
  193. package/skills/agent-browser/references/video-recording.md +173 -0
  194. package/skills/agent-browser/templates/authenticated-session.sh +97 -0
  195. package/skills/agent-browser/templates/capture-workflow.sh +69 -0
  196. package/skills/agent-browser/templates/form-automation.sh +62 -0
  197. package/skills/find-skills/SKILL.md +140 -0
  198. package/skills/url-bookmark/SKILL.md +36 -0
@@ -0,0 +1,213 @@
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
+ if (updates.modelItemCode !== undefined)
152
+ agent.modelItemCode = updates.modelItemCode;
153
+ if (updates.mcpServers !== undefined)
154
+ agent.mcpServers = updates.mcpServers;
155
+ await this.writeAgentsFile(file);
156
+ return { ...agent, isDefault: agent.id === DEFAULT_AGENT_ID };
157
+ }
158
+ async deleteAgent(id) {
159
+ if (id === DEFAULT_AGENT_ID) {
160
+ throw new BadRequestException('主智能体(default)不可删除');
161
+ }
162
+ const file = await this.readAgentsFile();
163
+ const idx = file.agents.findIndex((a) => a.id === id);
164
+ if (idx < 0) {
165
+ throw new NotFoundException('智能体不存在');
166
+ }
167
+ file.agents.splice(idx, 1);
168
+ await this.writeAgentsFile(file);
169
+ }
170
+ /**
171
+ * 根据 config 的 defaultProvider / defaultModel / defaultModelItemCode 及 configuredModels 同步 agents.json 中缺省智能体的 provider、model、modelItemCode。
172
+ * 在桌面保存配置(如修改默认模型)后调用,保证 agents 与 config 一致。
173
+ */
174
+ async syncDefaultAgentFromConfig(config) {
175
+ const list = config.configuredModels ?? [];
176
+ let provider = config.defaultProvider?.trim();
177
+ let model = config.defaultModel?.trim();
178
+ let modelItemCode = config.defaultModelItemCode?.trim();
179
+ if (modelItemCode && list.length) {
180
+ const item = list.find((m) => m.modelItemCode === modelItemCode);
181
+ if (item) {
182
+ provider = item.provider;
183
+ model = item.modelId;
184
+ }
185
+ }
186
+ if (!provider || !model)
187
+ return;
188
+ if (!modelItemCode && list.length) {
189
+ const item = list.find((m) => m.provider === provider && m.modelId === model);
190
+ if (item?.modelItemCode)
191
+ modelItemCode = item.modelItemCode;
192
+ }
193
+ await this.ensureDefaultWorkspace();
194
+ const file = await this.readAgentsFile();
195
+ let idx = file.agents.findIndex((a) => a.id === DEFAULT_AGENT_ID);
196
+ if (idx < 0) {
197
+ file.agents.unshift(this.defaultAgent({ provider, model, modelItemCode }));
198
+ idx = 0;
199
+ }
200
+ else {
201
+ const agent = file.agents[idx];
202
+ agent.provider = provider;
203
+ agent.model = model;
204
+ agent.modelItemCode = modelItemCode;
205
+ }
206
+ await this.writeAgentsFile(file);
207
+ }
208
+ };
209
+ AgentConfigService = __decorate([
210
+ Injectable(),
211
+ __metadata("design:paramtypes", [])
212
+ ], AgentConfigService);
213
+ 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,118 @@
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, Header, 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
+ await this.agentsService.deleteSession(id);
51
+ return {
52
+ success: true,
53
+ message: 'Session deleted',
54
+ };
55
+ }
56
+ getHistory(id) {
57
+ const history = this.agentsService.getMessageHistory(id);
58
+ return {
59
+ success: true,
60
+ data: history,
61
+ };
62
+ }
63
+ appendMessage(id, body) {
64
+ this.agentsService.appendMessage(id, body.role, body.content, {
65
+ toolCalls: body.toolCalls,
66
+ contentParts: body.contentParts,
67
+ });
68
+ return { success: true };
69
+ }
70
+ };
71
+ __decorate([
72
+ Post('sessions'),
73
+ __param(0, Body()),
74
+ __metadata("design:type", Function),
75
+ __metadata("design:paramtypes", [Object]),
76
+ __metadata("design:returntype", Promise)
77
+ ], AgentsController.prototype, "createSession", null);
78
+ __decorate([
79
+ Get('sessions'),
80
+ Header('Cache-Control', 'no-store'),
81
+ __metadata("design:type", Function),
82
+ __metadata("design:paramtypes", []),
83
+ __metadata("design:returntype", void 0)
84
+ ], AgentsController.prototype, "getSessions", null);
85
+ __decorate([
86
+ Get('sessions/:id'),
87
+ __param(0, Param('id')),
88
+ __metadata("design:type", Function),
89
+ __metadata("design:paramtypes", [String]),
90
+ __metadata("design:returntype", void 0)
91
+ ], AgentsController.prototype, "getSession", null);
92
+ __decorate([
93
+ Delete('sessions/:id'),
94
+ __param(0, Param('id')),
95
+ __metadata("design:type", Function),
96
+ __metadata("design:paramtypes", [String]),
97
+ __metadata("design:returntype", Promise)
98
+ ], AgentsController.prototype, "deleteSession", null);
99
+ __decorate([
100
+ Get('sessions/:id/history'),
101
+ __param(0, Param('id')),
102
+ __metadata("design:type", Function),
103
+ __metadata("design:paramtypes", [String]),
104
+ __metadata("design:returntype", void 0)
105
+ ], AgentsController.prototype, "getHistory", null);
106
+ __decorate([
107
+ Post('sessions/:id/messages'),
108
+ __param(0, Param('id')),
109
+ __param(1, Body()),
110
+ __metadata("design:type", Function),
111
+ __metadata("design:paramtypes", [String, Object]),
112
+ __metadata("design:returntype", void 0)
113
+ ], AgentsController.prototype, "appendMessage", null);
114
+ AgentsController = __decorate([
115
+ Controller('agents'),
116
+ __metadata("design:paramtypes", [AgentsService])
117
+ ], AgentsController);
118
+ 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
+ }
@@ -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:38081'],
98
+ credentials: true,
99
+ },
100
+ }),
101
+ __metadata("design:paramtypes", [AgentsService])
102
+ ], AgentsGateway);
103
+ export { AgentsGateway };
@@ -0,0 +1,2 @@
1
+ export declare class AgentsModule {
2
+ }
@@ -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<void>;
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
+ }