@next-open-ai/openbot 0.6.6 → 0.6.16
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/LICENSE +21 -0
- package/README.md +197 -138
- package/apps/desktop/renderer/dist/assets/index-BxqMW-uy.css +10 -0
- package/apps/desktop/renderer/dist/assets/index-DJs-wX3R.js +89 -0
- package/apps/desktop/renderer/dist/index.html +2 -2
- package/dist/core/agent/agent-manager.d.ts +14 -6
- package/dist/core/agent/agent-manager.js +63 -23
- package/dist/core/agent/proxy/adapters/coze-adapter.d.ts +2 -0
- package/dist/core/agent/proxy/adapters/coze-adapter.js +406 -0
- package/dist/core/agent/proxy/adapters/local-adapter.d.ts +2 -0
- package/dist/core/agent/proxy/adapters/local-adapter.js +93 -0
- package/dist/core/agent/proxy/adapters/openclawx-adapter.d.ts +2 -0
- package/dist/core/agent/proxy/adapters/openclawx-adapter.js +115 -0
- package/dist/core/agent/proxy/adapters/opencode-adapter.d.ts +11 -0
- package/dist/core/agent/proxy/adapters/opencode-adapter.js +750 -0
- package/dist/core/agent/proxy/adapters/opencode-free-models.d.ts +20 -0
- package/dist/core/agent/proxy/adapters/opencode-free-models.js +14 -0
- package/dist/core/agent/proxy/adapters/opencode-local-runner.d.ts +5 -0
- package/dist/core/agent/proxy/adapters/opencode-local-runner.js +86 -0
- package/dist/core/agent/proxy/index.d.ts +3 -0
- package/dist/core/agent/proxy/index.js +16 -0
- package/dist/core/agent/proxy/registry.d.ts +7 -0
- package/dist/core/agent/proxy/registry.js +13 -0
- package/dist/core/agent/proxy/run-for-channel.d.ts +3 -0
- package/dist/core/agent/proxy/run-for-channel.js +31 -0
- package/dist/core/agent/proxy/types.d.ts +30 -0
- package/dist/core/agent/proxy/types.js +1 -0
- package/dist/core/agent/run.js +1 -1
- package/dist/core/config/agent-reload-pending.d.ts +9 -0
- package/dist/core/config/agent-reload-pending.js +66 -0
- package/dist/core/config/desktop-config.d.ts +122 -3
- package/dist/core/config/desktop-config.js +289 -26
- package/dist/core/inbound-message-preprocess.d.ts +27 -0
- package/dist/core/inbound-message-preprocess.js +96 -0
- package/dist/core/mcp/client.d.ts +4 -0
- package/dist/core/mcp/client.js +2 -0
- package/dist/core/mcp/config.d.ts +14 -3
- package/dist/core/mcp/config.js +68 -3
- package/dist/core/mcp/index.d.ts +8 -6
- package/dist/core/mcp/index.js +6 -3
- package/dist/core/mcp/operator.d.ts +17 -2
- package/dist/core/mcp/operator.js +97 -30
- package/dist/core/mcp/transport/index.d.ts +4 -0
- package/dist/core/mcp/transport/index.js +6 -1
- package/dist/core/mcp/transport/stdio.d.ts +6 -0
- package/dist/core/mcp/transport/stdio.js +22 -1
- package/dist/core/mcp/types.d.ts +18 -0
- package/dist/core/memory/compaction-extension.d.ts +4 -3
- package/dist/core/memory/compaction-extension.js +6 -14
- package/dist/core/memory/embedding-types.d.ts +10 -0
- package/dist/core/memory/embedding-types.js +5 -0
- package/dist/core/memory/embedding.d.ts +2 -1
- package/dist/core/memory/embedding.js +38 -6
- package/dist/core/memory/index.js +3 -0
- package/dist/core/memory/local-embedding-llama.d.ts +13 -0
- package/dist/core/memory/local-embedding-llama.js +76 -0
- package/dist/core/memory/local-embedding.d.ts +10 -0
- package/dist/core/memory/local-embedding.js +29 -0
- package/dist/core/memory/persist-compaction-on-close.d.ts +14 -0
- package/dist/core/memory/persist-compaction-on-close.js +32 -0
- package/dist/core/session-outlet/index.d.ts +19 -0
- package/dist/core/session-outlet/index.js +33 -0
- package/dist/core/session-outlet/outlet.d.ts +15 -0
- package/dist/core/session-outlet/outlet.js +49 -0
- package/dist/core/session-outlet/types.d.ts +35 -0
- package/dist/core/session-outlet/types.js +5 -0
- package/dist/core/tools/bookmark-tool.d.ts +4 -0
- package/dist/core/tools/bookmark-tool.js +59 -3
- package/dist/core/tools/index.d.ts +2 -1
- package/dist/core/tools/index.js +2 -1
- package/dist/core/tools/memory-recall-tool.d.ts +6 -0
- package/dist/core/tools/memory-recall-tool.js +77 -0
- package/dist/gateway/channel/adapters/dingtalk.d.ts +11 -0
- package/dist/gateway/channel/adapters/dingtalk.js +190 -0
- package/dist/gateway/channel/adapters/telegram.d.ts +14 -0
- package/dist/gateway/channel/adapters/telegram.js +208 -0
- package/dist/gateway/channel/adapters/wechat.d.ts +24 -0
- package/dist/gateway/channel/adapters/wechat.js +205 -0
- package/dist/gateway/channel/channel-core.d.ts +1 -0
- package/dist/gateway/channel/channel-core.js +101 -51
- package/dist/gateway/channel/run-agent.d.ts +2 -4
- package/dist/gateway/channel/run-agent.js +13 -125
- package/dist/gateway/channel/types.d.ts +8 -4
- package/dist/gateway/methods/agent-cancel.d.ts +3 -1
- package/dist/gateway/methods/agent-cancel.js +16 -2
- package/dist/gateway/methods/agent-chat.d.ts +4 -0
- package/dist/gateway/methods/agent-chat.js +309 -118
- package/dist/gateway/methods/run-scheduled-task.js +7 -7
- package/dist/gateway/proxy-run-abort.d.ts +6 -0
- package/dist/gateway/proxy-run-abort.js +39 -0
- package/dist/gateway/server.js +103 -12
- package/dist/server/agent-config/agent-config.controller.d.ts +2 -2
- package/dist/server/agent-config/agent-config.controller.js +8 -4
- package/dist/server/agent-config/agent-config.module.js +3 -1
- package/dist/server/agent-config/agent-config.service.d.ts +67 -6
- package/dist/server/agent-config/agent-config.service.js +75 -3
- package/dist/server/agents/agents.controller.d.ts +16 -0
- package/dist/server/agents/agents.controller.js +62 -1
- package/dist/server/agents/agents.service.js +1 -1
- package/dist/server/bootstrap.js +9 -2
- package/dist/server/config/config.controller.d.ts +31 -2
- package/dist/server/config/config.controller.js +14 -0
- package/dist/server/config/config.module.js +2 -2
- package/dist/server/config/config.service.d.ts +14 -1
- package/dist/server/config/config.service.js +1 -0
- package/dist/server/workspace/workspace.service.d.ts +7 -0
- package/dist/server/workspace/workspace.service.js +16 -0
- package/package.json +9 -2
- package/presets/preset-agents.json +94 -0
- package/presets/preset-config.json +11 -0
- package/presets/preset-providers.json +173 -0
- package/presets/workspaces/code-assistant/skills/code-review/SKILL.md +19 -0
- package/presets/workspaces/code-assistant/skills/code-runner/SKILL.md +21 -0
- package/presets/workspaces/code-assistant/skills/git-helper/SKILL.md +29 -0
- package/presets/workspaces/creator-assistant/skills/.gitkeep +0 -0
- package/presets/workspaces/creator-assistant/skills/creator-tools/SKILL.md +15 -0
- package/presets/workspaces/doc-assistant/skills/doc-processor/SKILL.md +21 -0
- package/presets/workspaces/download-assistant/skills/downloader/SKILL.md +20 -0
- package/presets/workspaces/file-assistant/skills/file-converter/SKILL.md +21 -0
- package/presets/workspaces/file-assistant/skills/file-organizer/SKILL.md +17 -0
- package/presets/workspaces/file-assistant/skills/file-search/SKILL.md +22 -0
- package/presets/workspaces/morning-briefing/skills/news-fetcher/SKILL.md +16 -0
- package/presets/workspaces/morning-briefing/skills/web-summarizer/SKILL.md +20 -0
- package/presets/workspaces/news-assistant/skills/news-fetcher/SKILL.md +16 -0
- package/presets/workspaces/news-assistant/skills/web-summarizer/SKILL.md +20 -0
- package/apps/desktop/renderer/dist/assets/index-BNuvb6Ay.css +0 -10
- package/apps/desktop/renderer/dist/assets/index-DvQjslfT.js +0 -89
|
@@ -1,137 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 通道用:跑 Agent 并收集完整回复文本(无 WebSocket 客户端)。
|
|
3
|
+
* 委托给 core/agent/proxy 统一入口,按 runnerType 分发到 local/coze/openclawx 等适配器。
|
|
3
4
|
*/
|
|
4
|
-
import {
|
|
5
|
-
import { getDesktopConfig, loadDesktopAgentConfig } from "../../core/config/desktop-config.js";
|
|
6
|
-
import { getExperienceContextForUserMessage } from "../../core/memory/index.js";
|
|
5
|
+
import { runForChannelStream, runForChannelCollect } from "../../core/agent/proxy/index.js";
|
|
7
6
|
/**
|
|
8
|
-
*
|
|
9
|
-
* onDone 在 agent_end 时调用,保证「对话真正结束」语义(多轮 tool+文本合并为一条回复)。
|
|
7
|
+
* 使用 AgentProxy 统一入口跑一轮对话,以流式回调方式推送助手回复(onChunk/onDone)。
|
|
10
8
|
*/
|
|
11
9
|
export async function runAgentAndStreamReply(options, callbacks) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
let apiKey;
|
|
18
|
-
const agentConfig = await loadDesktopAgentConfig(sessionAgentId);
|
|
19
|
-
if (agentConfig) {
|
|
20
|
-
if (agentConfig.workspace)
|
|
21
|
-
workspace = agentConfig.workspace;
|
|
22
|
-
provider = agentConfig.provider;
|
|
23
|
-
modelId = agentConfig.model;
|
|
24
|
-
if (agentConfig.apiKey)
|
|
25
|
-
apiKey = agentConfig.apiKey;
|
|
26
|
-
}
|
|
27
|
-
const { maxAgentSessions } = getDesktopConfig();
|
|
28
|
-
const session = await agentManager.getOrCreateSession(sessionId, {
|
|
29
|
-
agentId: sessionAgentId,
|
|
30
|
-
workspace,
|
|
31
|
-
provider,
|
|
32
|
-
modelId,
|
|
33
|
-
apiKey,
|
|
34
|
-
maxSessions: maxAgentSessions,
|
|
35
|
-
targetAgentId: sessionAgentId,
|
|
36
|
-
mcpServers: agentConfig?.mcpServers,
|
|
37
|
-
systemPrompt: agentConfig?.systemPrompt,
|
|
38
|
-
});
|
|
39
|
-
let resolveDone;
|
|
40
|
-
const donePromise = new Promise((r) => {
|
|
41
|
-
resolveDone = r;
|
|
42
|
-
});
|
|
43
|
-
const unsubscribe = session.subscribe((event) => {
|
|
44
|
-
if (event.type === "message_update") {
|
|
45
|
-
const update = event;
|
|
46
|
-
if (update.assistantMessageEvent?.type === "text_delta" && update.assistantMessageEvent?.delta) {
|
|
47
|
-
callbacks.onChunk(update.assistantMessageEvent.delta);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
else if (event.type === "turn_end") {
|
|
51
|
-
callbacks.onTurnEnd?.();
|
|
52
|
-
}
|
|
53
|
-
else if (event.type === "agent_end") {
|
|
54
|
-
callbacks.onDone();
|
|
55
|
-
resolveDone();
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
try {
|
|
59
|
-
const experienceBlock = await getExperienceContextForUserMessage();
|
|
60
|
-
const userMessageToSend = experienceBlock.trim().length > 0
|
|
61
|
-
? `${experienceBlock}\n\n用户问题:\n${message}`
|
|
62
|
-
: message;
|
|
63
|
-
await session.sendUserMessage(userMessageToSend, { deliverAs: "followUp" });
|
|
64
|
-
await Promise.race([
|
|
65
|
-
donePromise,
|
|
66
|
-
new Promise((_, rej) => setTimeout(() => rej(new Error("Channel agent reply timeout")), 120_000)),
|
|
67
|
-
]);
|
|
68
|
-
}
|
|
69
|
-
finally {
|
|
70
|
-
unsubscribe();
|
|
71
|
-
}
|
|
10
|
+
await runForChannelStream({
|
|
11
|
+
sessionId: options.sessionId,
|
|
12
|
+
message: options.message,
|
|
13
|
+
agentId: options.agentId ?? "default",
|
|
14
|
+
}, callbacks);
|
|
72
15
|
}
|
|
73
16
|
/**
|
|
74
|
-
*
|
|
75
|
-
* 不依赖 WebSocket 客户端,供通道核心调用。
|
|
17
|
+
* 使用 AgentProxy 统一入口跑一轮对话,收集助手完整回复文本后返回。
|
|
76
18
|
*/
|
|
77
19
|
export async function runAgentAndCollectReply(options) {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
let modelId;
|
|
83
|
-
let apiKey;
|
|
84
|
-
const agentConfig = await loadDesktopAgentConfig(sessionAgentId);
|
|
85
|
-
if (agentConfig) {
|
|
86
|
-
if (agentConfig.workspace)
|
|
87
|
-
workspace = agentConfig.workspace;
|
|
88
|
-
provider = agentConfig.provider;
|
|
89
|
-
modelId = agentConfig.model;
|
|
90
|
-
if (agentConfig.apiKey)
|
|
91
|
-
apiKey = agentConfig.apiKey;
|
|
92
|
-
}
|
|
93
|
-
const { maxAgentSessions } = getDesktopConfig();
|
|
94
|
-
const session = await agentManager.getOrCreateSession(sessionId, {
|
|
95
|
-
agentId: sessionAgentId,
|
|
96
|
-
workspace,
|
|
97
|
-
provider,
|
|
98
|
-
modelId,
|
|
99
|
-
apiKey,
|
|
100
|
-
maxSessions: maxAgentSessions,
|
|
101
|
-
targetAgentId: sessionAgentId,
|
|
102
|
-
mcpServers: agentConfig?.mcpServers,
|
|
103
|
-
systemPrompt: agentConfig?.systemPrompt,
|
|
104
|
-
});
|
|
105
|
-
const chunks = [];
|
|
106
|
-
let resolveDone;
|
|
107
|
-
const donePromise = new Promise((r) => {
|
|
108
|
-
resolveDone = r;
|
|
109
|
-
});
|
|
110
|
-
const unsubscribe = session.subscribe((event) => {
|
|
111
|
-
if (event.type === "message_update") {
|
|
112
|
-
const update = event;
|
|
113
|
-
if (update.assistantMessageEvent?.type === "text_delta" && update.assistantMessageEvent?.delta) {
|
|
114
|
-
chunks.push(update.assistantMessageEvent.delta);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
else if (event.type === "agent_end") {
|
|
118
|
-
resolveDone();
|
|
119
|
-
}
|
|
20
|
+
return runForChannelCollect({
|
|
21
|
+
sessionId: options.sessionId,
|
|
22
|
+
message: options.message,
|
|
23
|
+
agentId: options.agentId ?? "default",
|
|
120
24
|
});
|
|
121
|
-
try {
|
|
122
|
-
const experienceBlock = await getExperienceContextForUserMessage();
|
|
123
|
-
const userMessageToSend = experienceBlock.trim().length > 0
|
|
124
|
-
? `${experienceBlock}\n\n用户问题:\n${message}`
|
|
125
|
-
: message;
|
|
126
|
-
await session.sendUserMessage(userMessageToSend, { deliverAs: "followUp" });
|
|
127
|
-
// 等待 agent_end(整轮对话真正结束)或超时
|
|
128
|
-
await Promise.race([
|
|
129
|
-
donePromise,
|
|
130
|
-
new Promise((_, rej) => setTimeout(() => rej(new Error("Channel agent reply timeout")), 120_000)),
|
|
131
|
-
]);
|
|
132
|
-
}
|
|
133
|
-
finally {
|
|
134
|
-
unsubscribe();
|
|
135
|
-
}
|
|
136
|
-
return chunks.join("").trim() || "(无文本回复)";
|
|
137
25
|
}
|
|
@@ -25,6 +25,8 @@ export interface UnifiedMessage {
|
|
|
25
25
|
replyTarget?: string;
|
|
26
26
|
/** 平台消息 ID(可选,用于回复引用等) */
|
|
27
27
|
messageId?: string;
|
|
28
|
+
/** 通道可选:回复发送完成后调用的 ack(如钉钉 Stream 需回调响应防重试),参数为 send 返回值 */
|
|
29
|
+
ack?: (sendResult?: unknown) => void | Promise<void>;
|
|
28
30
|
}
|
|
29
31
|
/** 统一出站回复 */
|
|
30
32
|
export interface UnifiedReply {
|
|
@@ -42,16 +44,18 @@ export interface IInboundTransport {
|
|
|
42
44
|
/** 设置收到消息时的回调 */
|
|
43
45
|
setMessageHandler(handler: (msg: UnifiedMessage) => void | Promise<void>): void;
|
|
44
46
|
}
|
|
45
|
-
/** 流式出站:先发一条占位消息,再由调用方按累积内容多次更新。返回的 sink 由 channel-core 在 onChunk/onDone 时调用。 */
|
|
47
|
+
/** 流式出站:先发一条占位消息,再由调用方按累积内容多次更新。返回的 sink 由 channel-core 在 onChunk / onTurnEnd / onDone 时调用。 */
|
|
46
48
|
export interface StreamSink {
|
|
47
|
-
/**
|
|
49
|
+
/** 更新当前已累积的全文(节流后调用),通道可用来做占位或实时更新 */
|
|
48
50
|
onChunk(accumulated: string): void | Promise<void>;
|
|
51
|
+
/** 可选:agent 每轮结束(turn_end)时调用,通道可在此发一条消息(如钉钉按轮发) */
|
|
52
|
+
onTurnEnd?(accumulated: string): void | Promise<void>;
|
|
49
53
|
/** 流结束,做最终一次更新 */
|
|
50
54
|
onDone(accumulated: string): void | Promise<void>;
|
|
51
55
|
}
|
|
52
|
-
/** 出站传输:将 UnifiedReply
|
|
56
|
+
/** 出站传输:将 UnifiedReply 发到外部;返回值可传给 UnifiedMessage.ack */
|
|
53
57
|
export interface IOutboundTransport {
|
|
54
|
-
send(targetId: string, reply: UnifiedReply): Promise<
|
|
58
|
+
send(targetId: string, reply: UnifiedReply): Promise<unknown>;
|
|
55
59
|
/** 可选:该出站是否还能往 targetId 发(如连接是否有效) */
|
|
56
60
|
canSend?(targetId: string): boolean;
|
|
57
61
|
/** 可选:流式发送。先创建占位消息,返回 sink 供调用方按累积内容更新(如飞书 create + patch)。 */
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import type { GatewayClient } from "../types.js";
|
|
2
2
|
/**
|
|
3
3
|
* Handle agent.cancel: abort the current turn for the given session.
|
|
4
|
-
*
|
|
4
|
+
* - Proxy agents: abort in-flight run via registered AbortController.
|
|
5
|
+
* - Local agent: uses pi-coding-agent's session.abort().
|
|
5
6
|
*/
|
|
6
7
|
export declare function handleAgentCancel(client: GatewayClient, params: {
|
|
7
8
|
sessionId?: string;
|
|
9
|
+
agentId?: string;
|
|
8
10
|
}): Promise<{
|
|
9
11
|
status: string;
|
|
10
12
|
}>;
|
|
@@ -1,14 +1,28 @@
|
|
|
1
1
|
import { agentManager } from "../../core/agent/agent-manager.js";
|
|
2
|
+
import { abortProxyRun } from "../proxy-run-abort.js";
|
|
3
|
+
import { clearSessionStreamSubscription } from "./agent-chat.js";
|
|
4
|
+
const COMPOSITE_KEY_SEP = "::";
|
|
2
5
|
/**
|
|
3
6
|
* Handle agent.cancel: abort the current turn for the given session.
|
|
4
|
-
*
|
|
7
|
+
* - Proxy agents: abort in-flight run via registered AbortController.
|
|
8
|
+
* - Local agent: uses pi-coding-agent's session.abort().
|
|
5
9
|
*/
|
|
6
10
|
export async function handleAgentCancel(client, params) {
|
|
7
11
|
const sessionId = params?.sessionId ?? client.sessionId;
|
|
8
12
|
if (!sessionId) {
|
|
9
13
|
throw new Error("No session ID available");
|
|
10
14
|
}
|
|
11
|
-
const
|
|
15
|
+
const agentId = params?.agentId ?? client.agentId ?? "default";
|
|
16
|
+
if (abortProxyRun(sessionId, agentId)) {
|
|
17
|
+
clearSessionStreamSubscription(sessionId);
|
|
18
|
+
return { status: "aborted" };
|
|
19
|
+
}
|
|
20
|
+
clearSessionStreamSubscription(sessionId);
|
|
21
|
+
const compositeKey = sessionId + COMPOSITE_KEY_SEP + agentId;
|
|
22
|
+
let session = agentManager.getSession(compositeKey);
|
|
23
|
+
if (!session) {
|
|
24
|
+
session = agentManager.getSessionBySessionId(sessionId);
|
|
25
|
+
}
|
|
12
26
|
if (!session) {
|
|
13
27
|
return { status: "no_session" };
|
|
14
28
|
}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import type { GatewayClient, AgentChatParams } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* 移除某 session 的流式订阅(cancel 或新消息开始时调用,避免同一事件被多个回调处理导致界面重复)
|
|
4
|
+
*/
|
|
5
|
+
export declare function clearSessionStreamSubscription(sessionId: string): void;
|
|
2
6
|
/**
|
|
3
7
|
* Handle agent chat request with streaming support
|
|
4
8
|
*/
|