@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,19 @@
1
+ /**
2
+ * Gateway 路径常量:各模块使用独立 path 端点,便于路由与扩展。
3
+ */
4
+ export const PATHS = {
5
+ /** 业务 REST API(Nest) */
6
+ SERVER_API: '/server-api',
7
+ /** Agent 对话 WebSocket */
8
+ WS: '/ws',
9
+ /** 语音通道 WebSocket(扩展占位) */
10
+ WS_VOICE: '/ws/voice',
11
+ /** Agent 流式 SSE(占位) */
12
+ SSE: '/sse',
13
+ /** 通道模块(webhook / 回调) */
14
+ CHANNEL: '/channel',
15
+ /** 健康检查 */
16
+ HEALTH: '/health',
17
+ /** 定时任务执行(Nest 回调 Gateway) */
18
+ RUN_SCHEDULED_TASK: '/run-scheduled-task',
19
+ };
@@ -0,0 +1,8 @@
1
+ import { type Server } from "http";
2
+ import { WebSocketServer } from "ws";
3
+ export declare function startGatewayServer(port?: number): Promise<{
4
+ httpServer: Server;
5
+ wss: WebSocketServer;
6
+ port: number;
7
+ close: () => Promise<void>;
8
+ }>;
@@ -0,0 +1,190 @@
1
+ /**
2
+ * Gateway 单进程入口:内嵌 Nest,按 path 分流。
3
+ * - /server-api → Nest(业务 REST)
4
+ * - /ws → Agent 对话 WebSocket
5
+ * - /ws/voice → 语音通道(占位)
6
+ * - /sse → SSE(占位)
7
+ * - /channel → 通道模块(占位)
8
+ * - 其余 → 静态资源
9
+ */
10
+ /* Avoid MaxListenersExceededWarning */
11
+ const Et = globalThis.EventTarget;
12
+ if (Et?.prototype?.addEventListener && Et.prototype.setMaxListeners) {
13
+ const add = Et.prototype.addEventListener;
14
+ Et.prototype.addEventListener = function (type, listener, options) {
15
+ if (type === "abort" && typeof this.setMaxListeners === "function") {
16
+ this.setMaxListeners(32);
17
+ }
18
+ return add.call(this, type, listener, options);
19
+ };
20
+ }
21
+ import express from "express";
22
+ import { createServer } from "http";
23
+ import { WebSocketServer } from "ws";
24
+ import { readFile, stat } from "fs/promises";
25
+ import { join, extname, dirname } from "path";
26
+ import { fileURLToPath } from "node:url";
27
+ import { PATHS } from "./paths.js";
28
+ import { authHookServerApi, authHookChannel, authHookSse, authHookWs } from "./auth-hooks.js";
29
+ import { handleChannel } from "./channel-handler.js";
30
+ import { handleSse } from "./sse-handler.js";
31
+ import { handleVoiceUpgrade } from "./voice-handler.js";
32
+ import { handleConnection } from "./connection-handler.js";
33
+ import { handleRunScheduledTask } from "./methods/run-scheduled-task.js";
34
+ import multer from "multer";
35
+ import { handleInstallSkillFromPath } from "./methods/install-skill-from-path.js";
36
+ import { handleInstallSkillFromUpload } from "./methods/install-skill-from-upload.js";
37
+ import { setBackendBaseUrl } from "./backend-url.js";
38
+ import { ensureDesktopConfigInitialized } from "../core/config/desktop-config.js";
39
+ import { createNestAppEmbedded } from "../server/bootstrap.js";
40
+ const __dirname = dirname(fileURLToPath(import.meta.url));
41
+ const PACKAGE_ROOT = join(__dirname, "..", "..");
42
+ /** 内嵌到 Electron 时由主进程设置 OPENBOT_STATIC_DIR,指向打包后的 renderer/dist */
43
+ const STATIC_DIR = process.env.OPENBOT_STATIC_DIR || join(PACKAGE_ROOT, "apps", "desktop", "renderer", "dist");
44
+ const MIME_TYPES = {
45
+ ".html": "text/html",
46
+ ".js": "text/javascript",
47
+ ".css": "text/css",
48
+ ".json": "application/json",
49
+ ".png": "image/png",
50
+ ".jpg": "image/jpeg",
51
+ ".gif": "image/gif",
52
+ ".svg": "image/svg+xml",
53
+ ".ico": "image/x-icon",
54
+ ".woff": "font/woff",
55
+ ".woff2": "font/woff2",
56
+ ".ttf": "font/ttf",
57
+ ".eot": "application/vnd.ms-fontobject",
58
+ };
59
+ export async function startGatewayServer(port = 38080) {
60
+ await ensureDesktopConfigInitialized();
61
+ console.log(`Starting gateway server on port ${port}...`);
62
+ setBackendBaseUrl(`http://localhost:${port}`);
63
+ const { app: nestApp, express: nestExpress } = await createNestAppEmbedded();
64
+ const gatewayExpress = express();
65
+ gatewayExpress.get(PATHS.HEALTH, (_req, res) => {
66
+ res.status(200).json({ status: "ok", timestamp: Date.now() });
67
+ });
68
+ gatewayExpress.post(PATHS.RUN_SCHEDULED_TASK, async (req, res) => {
69
+ await handleRunScheduledTask(req, res);
70
+ });
71
+ const uploadZip = multer({
72
+ storage: multer.memoryStorage(),
73
+ limits: { fileSize: 10 * 1024 * 1024 },
74
+ });
75
+ gatewayExpress.post(`${PATHS.SERVER_API}/skills/install-from-path`, async (req, res) => {
76
+ const body = await new Promise((resolve, reject) => {
77
+ const chunks = [];
78
+ req.on("data", (chunk) => chunks.push(chunk));
79
+ req.on("end", () => resolve(Buffer.concat(chunks).toString("utf-8")));
80
+ req.on("error", reject);
81
+ });
82
+ try {
83
+ const parsed = JSON.parse(body || "{}");
84
+ const result = await handleInstallSkillFromPath({
85
+ path: parsed.path ?? "",
86
+ scope: parsed.scope === "workspace" ? "workspace" : "global",
87
+ workspace: parsed.workspace,
88
+ });
89
+ res.status(200).json(result);
90
+ }
91
+ catch (err) {
92
+ const message = err instanceof Error ? err.message : String(err);
93
+ const code = message.includes("required") || message.includes("不存在") || message.includes("SKILL.md") || message.includes("目录名") ? 400 : 500;
94
+ res.status(code).json({ success: false, message });
95
+ }
96
+ });
97
+ gatewayExpress.post(`${PATHS.SERVER_API}/skills/install-from-upload`, authHookServerApi, uploadZip.single("file"), async (req, res) => {
98
+ try {
99
+ const file = req.file;
100
+ const buffer = file?.buffer;
101
+ if (!buffer || !Buffer.isBuffer(buffer)) {
102
+ return res.status(400).json({ success: false, message: "请上传 zip 文件" });
103
+ }
104
+ const scope = req.body?.scope === "workspace" ? "workspace" : "global";
105
+ const workspace = req.body?.workspace ?? "default";
106
+ const result = await handleInstallSkillFromUpload({ buffer, scope, workspace });
107
+ res.status(200).json(result);
108
+ }
109
+ catch (err) {
110
+ const message = err instanceof Error ? err.message : String(err);
111
+ const code = message.includes("请上传") || message.includes("SKILL.md") || message.includes("目录") || message.includes("10MB") ? 400 : 500;
112
+ res.status(code).json({ success: false, message });
113
+ }
114
+ });
115
+ gatewayExpress.use(PATHS.SERVER_API, authHookServerApi, nestExpress);
116
+ gatewayExpress.use(PATHS.CHANNEL, authHookChannel, (req, res) => handleChannel(req, res));
117
+ gatewayExpress.use(PATHS.SSE, authHookSse, (req, res) => handleSse(req, res));
118
+ gatewayExpress.use(async (req, res) => {
119
+ const staticDir = STATIC_DIR;
120
+ const urlPath = req.url?.split("?")[0] || "/";
121
+ let filePath = join(staticDir, urlPath === "/" ? "index.html" : urlPath);
122
+ try {
123
+ const stats = await stat(filePath);
124
+ if (stats.isDirectory()) {
125
+ filePath = join(filePath, "index.html");
126
+ await stat(filePath);
127
+ }
128
+ }
129
+ catch {
130
+ if (req.headers.accept?.includes("text/html") && req.method === "GET") {
131
+ filePath = join(staticDir, "index.html");
132
+ }
133
+ else {
134
+ res.writeHead(404, { "Content-Type": "text/plain" });
135
+ res.end("Not Found");
136
+ return;
137
+ }
138
+ }
139
+ try {
140
+ const content = await readFile(filePath);
141
+ const ext = extname(filePath).toLowerCase();
142
+ const contentType = MIME_TYPES[ext] || "application/octet-stream";
143
+ res.writeHead(200, { "Content-Type": contentType });
144
+ res.end(content);
145
+ }
146
+ catch (error) {
147
+ console.error("Static file error:", error);
148
+ res.writeHead(500, { "Content-Type": "text/plain" });
149
+ res.end("Internal Server Error");
150
+ }
151
+ });
152
+ const httpServer = createServer(gatewayExpress);
153
+ const wss = new WebSocketServer({ noServer: true });
154
+ wss.on("connection", (ws, req) => handleConnection(ws, req));
155
+ httpServer.on("upgrade", (req, socket, head) => {
156
+ const path = req.url?.split("?")[0] || "";
157
+ if (handleVoiceUpgrade(req, socket, head)) {
158
+ return;
159
+ }
160
+ const isAgentWs = path === PATHS.WS || path === "/";
161
+ if (isAgentWs && authHookWs(req, path)) {
162
+ wss.handleUpgrade(req, socket, head, (ws) => {
163
+ wss.emit("connection", ws, req);
164
+ });
165
+ }
166
+ else {
167
+ socket.destroy();
168
+ }
169
+ });
170
+ const actualPort = await new Promise((resolve) => {
171
+ httpServer.listen(port, () => {
172
+ const addr = httpServer.address();
173
+ const p = typeof addr === "object" && addr && "port" in addr ? addr.port : port;
174
+ console.log(`✅ Gateway server listening on ws://localhost:${p}`);
175
+ console.log(` Health: http://localhost:${p}${PATHS.HEALTH}`);
176
+ console.log(` API: http://localhost:${p}${PATHS.SERVER_API}`);
177
+ console.log(` WS: ws://localhost:${p}${PATHS.WS}`);
178
+ resolve(p);
179
+ });
180
+ });
181
+ const close = async () => {
182
+ console.log("Closing gateway server...");
183
+ await nestApp.close();
184
+ wss.clients.forEach((c) => c.close());
185
+ await new Promise((r) => wss.close(() => r()));
186
+ await new Promise((r) => httpServer.close(() => r()));
187
+ console.log("Gateway server closed");
188
+ };
189
+ return { httpServer, wss, port: actualPort, close };
190
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * SSE 端点(占位)。
3
+ * 后续:Agent 流式输出;当前返回 501 或简单说明。
4
+ */
5
+ import type { Request, Response } from 'express';
6
+ export declare function handleSse(_req: Request, res: Response): void;
@@ -0,0 +1,3 @@
1
+ export function handleSse(_req, res) {
2
+ res.status(501).setHeader('Content-Type', 'application/json').end(JSON.stringify({ ok: false, message: 'SSE endpoint not implemented yet' }));
3
+ }
@@ -0,0 +1,90 @@
1
+ import type { WebSocket } from "ws";
2
+ /** 会话类型:chat 普通对话,scheduled 定时任务,system 系统/临时 */
3
+ export type SessionType = "chat" | "scheduled" | "system";
4
+ /**
5
+ * Gateway client connection
6
+ */
7
+ export interface GatewayClient {
8
+ id: string;
9
+ ws: WebSocket;
10
+ authenticated: boolean;
11
+ sessionId?: string;
12
+ /** 建连时客户端传入的 session 绑定 agentId,用于取配置,不再请求 Nest */
13
+ agentId?: string;
14
+ /** 建连时客户端传入的 session 类型 */
15
+ sessionType?: SessionType;
16
+ connectedAt: number;
17
+ }
18
+ /**
19
+ * Gateway message types
20
+ */
21
+ export type GatewayMessageType = "request" | "response" | "event";
22
+ /**
23
+ * Base gateway message
24
+ */
25
+ export interface GatewayMessage {
26
+ type: GatewayMessageType;
27
+ id?: string;
28
+ method?: string;
29
+ params?: any;
30
+ result?: any;
31
+ error?: {
32
+ message: string;
33
+ code?: string;
34
+ };
35
+ event?: string;
36
+ payload?: any;
37
+ }
38
+ /**
39
+ * Request message
40
+ */
41
+ export interface GatewayRequest extends GatewayMessage {
42
+ type: "request";
43
+ id: string;
44
+ method: string;
45
+ params?: any;
46
+ }
47
+ /**
48
+ * Response message
49
+ */
50
+ export interface GatewayResponse extends GatewayMessage {
51
+ type: "response";
52
+ id: string;
53
+ result?: any;
54
+ error?: {
55
+ message: string;
56
+ code?: string;
57
+ };
58
+ }
59
+ /**
60
+ * Event message
61
+ */
62
+ export interface GatewayEvent extends GatewayMessage {
63
+ type: "event";
64
+ event: string;
65
+ payload?: any;
66
+ }
67
+ /**
68
+ * Connect params
69
+ */
70
+ export interface ConnectParams {
71
+ sessionId?: string;
72
+ /** 当前 session 绑定的 agentId,Gateway 用其本地取配置,不请求 Nest */
73
+ agentId?: string;
74
+ /** 当前 session 类型:chat | scheduled | system */
75
+ sessionType?: SessionType;
76
+ nonce?: string;
77
+ }
78
+ /**
79
+ * Agent chat params
80
+ */
81
+ export interface AgentChatParams {
82
+ message: string;
83
+ sessionId?: string;
84
+ /** 当前 session 绑定的 agentId,不传则用 connect 时存的 client.agentId,再缺省 default */
85
+ agentId?: string;
86
+ /** 当前 session 类型,不传则用 connect 时存的 client.sessionType,再缺省 chat */
87
+ sessionType?: SessionType;
88
+ /** 对话/安装目标:具体 agentId,或 "global"|"all" 表示全局;用于 install_skill 等隔离 */
89
+ targetAgentId?: string;
90
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,22 @@
1
+ import type { WebSocket } from "ws";
2
+ import type { GatewayMessage } from "./types.js";
3
+ /**
4
+ * Send JSON message to WebSocket client
5
+ */
6
+ export declare function send(ws: WebSocket, message: GatewayMessage): void;
7
+ /**
8
+ * Parse incoming WebSocket message
9
+ */
10
+ export declare function parseMessage(data: Buffer | string): GatewayMessage | null;
11
+ /**
12
+ * Create error response
13
+ */
14
+ export declare function createErrorResponse(id: string, message: string, code?: string): GatewayMessage;
15
+ /**
16
+ * Create success response
17
+ */
18
+ export declare function createSuccessResponse(id: string, result: any): GatewayMessage;
19
+ /**
20
+ * Create event message
21
+ */
22
+ export declare function createEvent(event: string, payload: any): GatewayMessage;
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Send JSON message to WebSocket client
3
+ */
4
+ export function send(ws, message) {
5
+ try {
6
+ ws.send(JSON.stringify(message));
7
+ }
8
+ catch (error) {
9
+ console.error("Failed to send message:", error);
10
+ }
11
+ }
12
+ /**
13
+ * Parse incoming WebSocket message
14
+ */
15
+ export function parseMessage(data) {
16
+ try {
17
+ const text = typeof data === "string" ? data : data.toString();
18
+ const obj = JSON.parse(text);
19
+ // If type is missing, try to infer it
20
+ if (!obj.type) {
21
+ if (obj.method) {
22
+ obj.type = "request";
23
+ }
24
+ else if (obj.event) {
25
+ obj.type = "event";
26
+ }
27
+ else if (obj.result !== undefined || obj.error !== undefined) {
28
+ obj.type = "response";
29
+ }
30
+ }
31
+ return obj;
32
+ }
33
+ catch (error) {
34
+ console.error("Failed to parse message:", error);
35
+ return null;
36
+ }
37
+ }
38
+ /**
39
+ * Create error response
40
+ */
41
+ export function createErrorResponse(id, message, code) {
42
+ return {
43
+ type: "response",
44
+ id,
45
+ error: { message, code },
46
+ };
47
+ }
48
+ /**
49
+ * Create success response
50
+ */
51
+ export function createSuccessResponse(id, result) {
52
+ return {
53
+ type: "response",
54
+ id,
55
+ result,
56
+ };
57
+ }
58
+ /**
59
+ * Create event message
60
+ */
61
+ export function createEvent(event, payload) {
62
+ return {
63
+ type: "event",
64
+ event,
65
+ payload,
66
+ };
67
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * 语音通道 WebSocket(占位)。
3
+ * 后续:/ws/voice 建连、二进制/信令、与语音服务对接;当前仅关闭连接并返回 400 或不做 upgrade。
4
+ */
5
+ import type { IncomingMessage } from 'http';
6
+ import type { Duplex } from 'stream';
7
+ /**
8
+ * 处理 /ws/voice 的 upgrade 请求(占位)。
9
+ * 返回 true 表示已处理(例如拒绝并关闭),调用方不必再交给 agent /ws;
10
+ * 返回 false 表示未处理。
11
+ */
12
+ export declare function handleVoiceUpgrade(req: IncomingMessage, socket: Duplex, _head: Buffer): boolean;
@@ -0,0 +1,18 @@
1
+ import { PATHS } from './paths.js';
2
+ /**
3
+ * 处理 /ws/voice 的 upgrade 请求(占位)。
4
+ * 返回 true 表示已处理(例如拒绝并关闭),调用方不必再交给 agent /ws;
5
+ * 返回 false 表示未处理。
6
+ */
7
+ export function handleVoiceUpgrade(req, socket, _head) {
8
+ const path = req.url?.split('?')[0] || '';
9
+ if (path !== PATHS.WS_VOICE) {
10
+ return false;
11
+ }
12
+ socket.write('HTTP/1.1 501 Not Implemented\r\n' +
13
+ 'Content-Type: application/json\r\n' +
14
+ 'Connection: close\r\n\r\n' +
15
+ JSON.stringify({ ok: false, message: 'Voice WebSocket not implemented yet' }));
16
+ socket.destroy();
17
+ return true;
18
+ }
@@ -0,0 +1,5 @@
1
+ export { loadSkillsFromDir, loadSkillsFromPaths, formatSkillsForPrompt, type Skill, type LoadSkillsFromDirOptions, } from "./core/agent/skills.js";
2
+ export { run, type RunOptions, type RunResult } from "./core/agent/run.js";
3
+ export { getOpenbotAgentDir, ensureDefaultAgentDir } from "./core/agent/agent-dir.js";
4
+ export { resolveInstallTarget, installSkillByUrl, installSkillFromPath, type InstallByUrlOptions, type InstallByUrlResult, type InstallFromPathOptions, type InstallFromPathResult, } from "./core/installer/index.js";
5
+ export { getProviderSupport, ensureProviderSupportFile, syncDesktopConfigToModelsJson, type ProviderSupport, type ProviderSupportEntry, type ProviderSupportModel, type ModelSupportType, } from "./core/config/desktop-config.js";
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export { loadSkillsFromDir, loadSkillsFromPaths, formatSkillsForPrompt, } from "./core/agent/skills.js";
2
+ export { run } from "./core/agent/run.js";
3
+ export { getOpenbotAgentDir, ensureDefaultAgentDir } from "./core/agent/agent-dir.js";
4
+ export { resolveInstallTarget, installSkillByUrl, installSkillFromPath, } from "./core/installer/index.js";
5
+ export { getProviderSupport, ensureProviderSupportFile, syncDesktopConfigToModelsJson, } from "./core/config/desktop-config.js";
@@ -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' | 'modelItemCode' | 'mcpServers'>>): 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,2 @@
1
+ export declare class AgentConfigModule {
2
+ }
@@ -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,53 @@
1
+ import type { McpServerConfig } from '../../core/mcp/index.js';
2
+ /** 缺省智能体 ID / 工作空间名,不可删除;对应目录 ~/.openbot/workspace/default */
3
+ export declare const DEFAULT_AGENT_ID = "default";
4
+ /**
5
+ * 智能体列表与配置使用文件存储(~/.openbot/desktop/agents.json),不使用 SQLite。
6
+ * 会话与消息历史使用 SQLite;Skills、工作空间文档为目录文件管理。
7
+ */
8
+ export interface AgentConfigItem {
9
+ id: string;
10
+ name: string;
11
+ workspace: string;
12
+ provider?: string;
13
+ model?: string;
14
+ /** 匹配 config.configuredModels 中的 modelItemCode,优先于 provider/model */
15
+ modelItemCode?: string;
16
+ /** 是否为系统缺省智能体(主智能体),不可删除 */
17
+ isDefault?: boolean;
18
+ /** MCP 服务器配置列表,创建 Session 时传入(与 Skill 类似) */
19
+ mcpServers?: McpServerConfig[];
20
+ }
21
+ export declare class AgentConfigService {
22
+ private configDir;
23
+ private agentsPath;
24
+ constructor();
25
+ private ensureConfigDir;
26
+ private readAgentsFile;
27
+ private writeAgentsFile;
28
+ /** 确保 default 工作空间目录存在 */
29
+ private ensureDefaultWorkspace;
30
+ private defaultAgent;
31
+ listAgents(): Promise<AgentConfigItem[]>;
32
+ getAgent(id: string): Promise<AgentConfigItem | null>;
33
+ createAgent(params: {
34
+ name: string;
35
+ workspace: string;
36
+ }): Promise<AgentConfigItem>;
37
+ updateAgent(id: string, updates: Partial<Pick<AgentConfigItem, 'name' | 'provider' | 'model' | 'modelItemCode' | 'mcpServers'>>): Promise<AgentConfigItem>;
38
+ deleteAgent(id: string): Promise<void>;
39
+ /**
40
+ * 根据 config 的 defaultProvider / defaultModel / defaultModelItemCode 及 configuredModels 同步 agents.json 中缺省智能体的 provider、model、modelItemCode。
41
+ * 在桌面保存配置(如修改默认模型)后调用,保证 agents 与 config 一致。
42
+ */
43
+ syncDefaultAgentFromConfig(config: {
44
+ defaultProvider?: string;
45
+ defaultModel?: string;
46
+ defaultModelItemCode?: string;
47
+ configuredModels?: Array<{
48
+ provider: string;
49
+ modelId: string;
50
+ modelItemCode?: string;
51
+ }>;
52
+ }): Promise<void>;
53
+ }