@xgjktech/xg_cwork_im 1.12.9 → 1.14.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.
- package/README.md +18 -4
- package/dist/src/agent-context-types.d.ts +39 -1
- package/dist/src/agent-context-types.d.ts.map +1 -1
- package/dist/src/agent-context-types.js +52 -7
- package/dist/src/agent-context-types.js.map +1 -1
- package/dist/src/agent-context-types.test.d.ts +2 -0
- package/dist/src/agent-context-types.test.d.ts.map +1 -0
- package/dist/src/agent-context-types.test.js +61 -0
- package/dist/src/agent-context-types.test.js.map +1 -0
- package/dist/src/apply-sync-mapping.js +14 -6
- package/dist/src/apply-sync-mapping.js.map +1 -1
- package/dist/src/block-streaming-config.test.d.ts +2 -0
- package/dist/src/block-streaming-config.test.d.ts.map +1 -0
- package/dist/src/block-streaming-config.test.js +41 -0
- package/dist/src/block-streaming-config.test.js.map +1 -0
- package/dist/src/build-project-prompt.d.ts.map +1 -1
- package/dist/src/build-project-prompt.js +5 -1
- package/dist/src/build-project-prompt.js.map +1 -1
- package/dist/src/channel-config.d.ts +128 -0
- package/dist/src/channel-config.d.ts.map +1 -1
- package/dist/src/channel-config.js +67 -0
- package/dist/src/channel-config.js.map +1 -1
- package/dist/src/channel.d.ts.map +1 -1
- package/dist/src/channel.js +24 -8
- package/dist/src/channel.js.map +1 -1
- package/dist/src/connection.d.ts +7 -0
- package/dist/src/connection.d.ts.map +1 -1
- package/dist/src/connection.js +16 -1
- package/dist/src/connection.js.map +1 -1
- package/dist/src/deliver-text.d.ts +13 -0
- package/dist/src/deliver-text.d.ts.map +1 -0
- package/dist/src/deliver-text.js +28 -0
- package/dist/src/deliver-text.js.map +1 -0
- package/dist/src/deliver-text.test.d.ts +2 -0
- package/dist/src/deliver-text.test.d.ts.map +1 -0
- package/dist/src/deliver-text.test.js +31 -0
- package/dist/src/deliver-text.test.js.map +1 -0
- package/dist/src/dispatch-mentioned-reply.d.ts +3 -0
- package/dist/src/dispatch-mentioned-reply.d.ts.map +1 -1
- package/dist/src/dispatch-mentioned-reply.js +124 -76
- package/dist/src/dispatch-mentioned-reply.js.map +1 -1
- package/dist/src/gateway-session-queue.d.ts +3 -0
- package/dist/src/gateway-session-queue.d.ts.map +1 -1
- package/dist/src/gateway-session-queue.js +1 -0
- package/dist/src/gateway-session-queue.js.map +1 -1
- package/dist/src/inbound-chat-type.d.ts +4 -0
- package/dist/src/inbound-chat-type.d.ts.map +1 -1
- package/dist/src/inbound-chat-type.js +8 -0
- package/dist/src/inbound-chat-type.js.map +1 -1
- package/dist/src/inbound-display.d.ts +2 -0
- package/dist/src/inbound-display.d.ts.map +1 -1
- package/dist/src/inbound-display.js +16 -5
- package/dist/src/inbound-display.js.map +1 -1
- package/dist/src/inbound-input-media.js +1 -1
- package/dist/src/inbound-input-media.js.map +1 -1
- package/dist/src/inbound-media-local.js +1 -1
- package/dist/src/inbound-media-local.js.map +1 -1
- package/dist/src/inbound-terminal-delivery.d.ts +74 -0
- package/dist/src/inbound-terminal-delivery.d.ts.map +1 -0
- package/dist/src/inbound-terminal-delivery.js +246 -0
- package/dist/src/inbound-terminal-delivery.js.map +1 -0
- package/dist/src/inbound-terminal-state.d.ts +61 -0
- package/dist/src/inbound-terminal-state.d.ts.map +1 -0
- package/dist/src/inbound-terminal-state.js +177 -0
- package/dist/src/inbound-terminal-state.js.map +1 -0
- package/dist/src/inbound-terminal-state.test.d.ts +2 -0
- package/dist/src/inbound-terminal-state.test.d.ts.map +1 -0
- package/dist/src/inbound-terminal-state.test.js +203 -0
- package/dist/src/inbound-terminal-state.test.js.map +1 -0
- package/dist/src/per-message-fallback-notice.d.ts +11 -1
- package/dist/src/per-message-fallback-notice.d.ts.map +1 -1
- package/dist/src/per-message-fallback-notice.js +16 -1
- package/dist/src/per-message-fallback-notice.js.map +1 -1
- package/dist/src/per-message-fallback-notice.test.d.ts +2 -0
- package/dist/src/per-message-fallback-notice.test.d.ts.map +1 -0
- package/dist/src/per-message-fallback-notice.test.js +47 -0
- package/dist/src/per-message-fallback-notice.test.js.map +1 -0
- package/dist/src/project-path-normalize.d.ts +14 -0
- package/dist/src/project-path-normalize.d.ts.map +1 -1
- package/dist/src/project-path-normalize.js +26 -0
- package/dist/src/project-path-normalize.js.map +1 -1
- package/dist/src/resource-file.d.ts +7 -1
- package/dist/src/resource-file.d.ts.map +1 -1
- package/dist/src/resource-file.js +56 -19
- package/dist/src/resource-file.js.map +1 -1
- package/dist/src/send-group-message-tool.d.ts.map +1 -1
- package/dist/src/send-group-message-tool.js +4 -2
- package/dist/src/send-group-message-tool.js.map +1 -1
- package/dist/src/send-service.d.ts.map +1 -1
- package/dist/src/send-service.js +33 -7
- package/dist/src/send-service.js.map +1 -1
- package/dist/src/sync-mapping-types.d.ts +58 -8
- package/dist/src/sync-mapping-types.d.ts.map +1 -1
- package/dist/src/sync-mapping-types.js +19 -5
- package/dist/src/sync-mapping-types.js.map +1 -1
- package/dist/src/sync-service-client.d.ts +3 -1
- package/dist/src/sync-service-client.d.ts.map +1 -1
- package/dist/src/sync-service-client.js.map +1 -1
- package/dist/src/types.d.ts +27 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js.map +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -12,10 +12,19 @@ IM 系统 → WebSocket → 插件(本项目) → OpenClaw AI → IM
|
|
|
12
12
|
2. 建立 WebSocket 长连接,接收带业务 `params` 的推送(当前代码会处理 `**robotMention**` 与 `**groupMessage**`,条件:`parsed.params` 存在且 `cmd` 为上述二者之一)
|
|
13
13
|
3. 将收到的消息转发给 OpenClaw 处理
|
|
14
14
|
4. OpenClaw AI 回复后,插件:
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
|
|
15
|
+
- 通过 HTTP `/im/message/send` 发送**业务正文**(及附件);
|
|
16
|
+
- 若本轮无业务回复或失败(超时、precheck、无回复、发 IM 失败等),通过 **HTTP 终态兜底** 发送中文说明(见 `docs/reliability-roadmap.md`);
|
|
17
|
+
- WebSocket 可发 BEGIN / 进度 / FINISHED 等信令(IM 可不展示;**不以 WS 为唯一用户反馈**)。
|
|
18
|
+
|
|
19
|
+
### 文档索引
|
|
20
|
+
|
|
21
|
+
| 文档 | 说明 |
|
|
22
|
+
|------|------|
|
|
23
|
+
| [docs/reliability-roadmap.md](docs/reliability-roadmap.md) | **可靠性优化路线图**(待办清单、风险、执行顺序) |
|
|
24
|
+
| [docs/插件实现逻辑说明.md](docs/插件实现逻辑说明.md) | 实现细节 |
|
|
25
|
+
| [docs/openclaw通道插件-BUSINESS.md](docs/openclaw通道插件-BUSINESS.md) | 业务场景 |
|
|
26
|
+
| [docs/im服务接口说明.md](docs/im服务接口说明.md) | IM API / WS |
|
|
27
|
+
| [docs/流式消息协议设计与优化.md](docs/流式消息协议设计与优化.md) | WS 协议 |
|
|
19
28
|
|
|
20
29
|
---
|
|
21
30
|
|
|
@@ -244,6 +253,9 @@ openclaw gateway restart
|
|
|
244
253
|
| `inboundMediaSandboxRootPrefix` | string | — | **可选**。沙箱内 workspace 挂载根,填 `**/workspace`** 时,在 `workspaceRelative` 模式下 `MediaPath` 为 `**/workspace/xg_im_inbound/...**`,避免 `./` 被 `read` 等工具按**进程 cwd**解析导致「不可访问」。须以 `/` 开头。 |
|
|
245
254
|
| `syncServiceBaseUrl` | string | — | **可选**。openclaw-xgkb-sync **管理 API** 根地址(如 `http://127.0.0.1:9090`)。配置后插件可处理 IM 下发的 `openclawApplySyncMapping` 信令并登记目录映射。详见 `docs/im服务接口说明.md`。 |
|
|
246
255
|
| `projectPromptMaxChars` | number | `15000` | `agentContext.background` 与 `userInfo.background` 单段最大字符数;超出尾部截断。 |
|
|
256
|
+
| `blockStreaming` | boolean | `true`(未配置时) | 开启后,assistant 每个 **text 块结束(tool 调用前)** 即 HTTP 发送中间正文(OpenClaw `text_end`);tool 过程仍走 WS `TOOL_PHASE`。设为 `false` 恢复整轮结束才 deliver 一次。 |
|
|
257
|
+
| `blockStreamingCoalesce` | object | 不配 | 可选:合并同一 text 块内 token 碎片(`minChars` / `maxChars` / `idleMs`)。IM 默认不配;**若未在通道配置,插件会自动注入 `minChars:1 idleMs:0`,覆盖 `agents.defaults` 里偏大的 coalesce**。 |
|
|
258
|
+
| `deliverModelFallbackNotice` | boolean | `false`(未配置时) | 为 `true` 时向 IM 用户发送 OpenClaw 模型降级运营通知(`↪️ Model Fallback: …`)。默认不发送,仅保留 gateway 日志。 |
|
|
247
259
|
|
|
248
260
|
|
|
249
261
|
### 账户配置(`accounts.<accountId>`,对象 map)
|
|
@@ -270,6 +282,8 @@ openclaw gateway restart
|
|
|
270
282
|
|
|
271
283
|
## 故障排除
|
|
272
284
|
|
|
285
|
+
排查「无回复 / Media failed / 断连」时,请先对照 **[可靠性路线图](docs/reliability-roadmap.md)** 中的已知现状与日志字段。
|
|
286
|
+
|
|
273
287
|
### 收不到消息
|
|
274
288
|
|
|
275
289
|
- 确认 `robotKey` 正确(或旧字段 `appKey` 正确),且机器人已在 IM 后台激活
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* robotMention.params.agentContext — 项目工作区路径 + 可选知识库绑定 + 可选项目背景
|
|
3
3
|
*/
|
|
4
4
|
import { z } from "zod";
|
|
5
|
-
/** 知识库空间 ID +
|
|
5
|
+
/** 知识库空间 ID + 逻辑目录路径 */
|
|
6
6
|
declare const knowledgeBaseByPathSchema: z.ZodObject<{
|
|
7
7
|
projectId: z.ZodString;
|
|
8
8
|
folderPath: z.ZodString;
|
|
@@ -13,6 +13,14 @@ declare const knowledgeBaseByPathSchema: z.ZodObject<{
|
|
|
13
13
|
projectId: string;
|
|
14
14
|
folderPath: string;
|
|
15
15
|
}>;
|
|
16
|
+
/** IM 常见:仅传知识库空间 ID(无 folderPath) */
|
|
17
|
+
declare const knowledgeBaseByProjectIdOnlySchema: z.ZodObject<{
|
|
18
|
+
projectId: z.ZodString;
|
|
19
|
+
}, "strip", z.ZodTypeAny, {
|
|
20
|
+
projectId: string;
|
|
21
|
+
}, {
|
|
22
|
+
projectId: string;
|
|
23
|
+
}>;
|
|
16
24
|
export declare const agentContextKnowledgeBaseSchema: z.ZodUnion<[z.ZodObject<{
|
|
17
25
|
rootFileId: z.ZodString;
|
|
18
26
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -28,6 +36,12 @@ export declare const agentContextKnowledgeBaseSchema: z.ZodUnion<[z.ZodObject<{
|
|
|
28
36
|
}, {
|
|
29
37
|
projectId: string;
|
|
30
38
|
folderPath: string;
|
|
39
|
+
}>, z.ZodObject<{
|
|
40
|
+
projectId: z.ZodString;
|
|
41
|
+
}, "strip", z.ZodTypeAny, {
|
|
42
|
+
projectId: string;
|
|
43
|
+
}, {
|
|
44
|
+
projectId: string;
|
|
31
45
|
}>]>;
|
|
32
46
|
export type AgentContextKnowledgeBase = z.infer<typeof agentContextKnowledgeBaseSchema>;
|
|
33
47
|
/** 与 IM 后台约定的 `params.agentContext` 结构 */
|
|
@@ -57,6 +71,12 @@ export declare const robotMentionAgentContextSchema: z.ZodObject<{
|
|
|
57
71
|
}, {
|
|
58
72
|
projectId: string;
|
|
59
73
|
folderPath: string;
|
|
74
|
+
}>, z.ZodObject<{
|
|
75
|
+
projectId: z.ZodString;
|
|
76
|
+
}, "strip", z.ZodTypeAny, {
|
|
77
|
+
projectId: string;
|
|
78
|
+
}, {
|
|
79
|
+
projectId: string;
|
|
60
80
|
}>]>>;
|
|
61
81
|
background: z.ZodOptional<z.ZodString>;
|
|
62
82
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -69,6 +89,8 @@ export declare const robotMentionAgentContextSchema: z.ZodObject<{
|
|
|
69
89
|
} | {
|
|
70
90
|
projectId: string;
|
|
71
91
|
folderPath: string;
|
|
92
|
+
} | {
|
|
93
|
+
projectId: string;
|
|
72
94
|
} | undefined;
|
|
73
95
|
background?: string | undefined;
|
|
74
96
|
}, {
|
|
@@ -81,12 +103,28 @@ export declare const robotMentionAgentContextSchema: z.ZodObject<{
|
|
|
81
103
|
} | {
|
|
82
104
|
projectId: string;
|
|
83
105
|
folderPath: string;
|
|
106
|
+
} | {
|
|
107
|
+
projectId: string;
|
|
84
108
|
} | undefined;
|
|
85
109
|
background?: string | undefined;
|
|
86
110
|
}>;
|
|
87
111
|
export type RobotMentionAgentContext = z.infer<typeof robotMentionAgentContextSchema>;
|
|
112
|
+
export type ParseRobotMentionAgentContextResult = {
|
|
113
|
+
agentContext?: RobotMentionAgentContext;
|
|
114
|
+
/** localRoot 缺失等致命错误 */
|
|
115
|
+
fatalError?: string;
|
|
116
|
+
/** knowledgeBase 存在但无法解析时被丢弃 */
|
|
117
|
+
knowledgeBaseDropped?: boolean;
|
|
118
|
+
knowledgeBaseDropReason?: string;
|
|
119
|
+
};
|
|
120
|
+
/**
|
|
121
|
+
* 解析 agentContext;knowledgeBase 非法时丢弃该字段,仍保留 localRoot + background。
|
|
122
|
+
*/
|
|
123
|
+
export declare function parseRobotMentionAgentContextDetailed(params: unknown): ParseRobotMentionAgentContextResult;
|
|
88
124
|
export declare function parseRobotMentionAgentContext(params: unknown): RobotMentionAgentContext | undefined;
|
|
89
125
|
/** 判断 knowledgeBase 是否为 projectId + folderPath 形式 */
|
|
90
126
|
export declare function isKnowledgeBaseByPath(kb: AgentContextKnowledgeBase): kb is z.infer<typeof knowledgeBaseByPathSchema>;
|
|
127
|
+
/** 判断 knowledgeBase 是否仅有 projectId(无 folderPath / rootFileId) */
|
|
128
|
+
export declare function isKnowledgeBaseByProjectIdOnly(kb: AgentContextKnowledgeBase): kb is z.infer<typeof knowledgeBaseByProjectIdOnlySchema>;
|
|
91
129
|
export {};
|
|
92
130
|
//# sourceMappingURL=agent-context-types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-context-types.d.ts","sourceRoot":"","sources":["../../src/agent-context-types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAaxB,
|
|
1
|
+
{"version":3,"file":"agent-context-types.d.ts","sourceRoot":"","sources":["../../src/agent-context-types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAaxB,wBAAwB;AACxB,QAAA,MAAM,yBAAyB;;;;;;;;;EAG7B,CAAC;AAEH,qCAAqC;AACrC,QAAA,MAAM,kCAAkC;;;;;;EAEtC,CAAC;AAEH,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;IAI1C,CAAC;AAEH,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,+BAA+B,CAAC,CAAC;AAExF,0CAA0C;AAC1C,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAIzC,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AAEtF,MAAM,MAAM,mCAAmC,GAAG;IAC9C,YAAY,CAAC,EAAE,wBAAwB,CAAC;IACxC,wBAAwB;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,uBAAuB,CAAC,EAAE,MAAM,CAAC;CACpC,CAAC;AAQF;;GAEG;AACH,wBAAgB,qCAAqC,CAAC,MAAM,EAAE,OAAO,GAAG,mCAAmC,CAuC1G;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,OAAO,GAAG,wBAAwB,GAAG,SAAS,CAEnG;AAED,qDAAqD;AACrD,wBAAgB,qBAAqB,CACjC,EAAE,EAAE,yBAAyB,GAC9B,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAEjD;AAED,iEAAiE;AACjE,wBAAgB,8BAA8B,CAC1C,EAAE,EAAE,yBAAyB,GAC9B,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,kCAAkC,CAAC,CAE1D"}
|
|
@@ -7,18 +7,23 @@ const localRootSchema = z.object({
|
|
|
7
7
|
kind: z.enum(LOCAL_ROOT_KINDS),
|
|
8
8
|
path: z.string().min(1),
|
|
9
9
|
});
|
|
10
|
-
/** 知识库目录 fileId(与 projectId
|
|
10
|
+
/** 知识库目录 fileId(与 projectId 形式二选一) */
|
|
11
11
|
const knowledgeBaseByFileIdSchema = z.object({
|
|
12
12
|
rootFileId: z.string().min(1),
|
|
13
13
|
});
|
|
14
|
-
/** 知识库空间 ID +
|
|
14
|
+
/** 知识库空间 ID + 逻辑目录路径 */
|
|
15
15
|
const knowledgeBaseByPathSchema = z.object({
|
|
16
16
|
projectId: z.string().min(1),
|
|
17
17
|
folderPath: z.string().min(1),
|
|
18
18
|
});
|
|
19
|
+
/** IM 常见:仅传知识库空间 ID(无 folderPath) */
|
|
20
|
+
const knowledgeBaseByProjectIdOnlySchema = z.object({
|
|
21
|
+
projectId: z.string().min(1),
|
|
22
|
+
});
|
|
19
23
|
export const agentContextKnowledgeBaseSchema = z.union([
|
|
20
24
|
knowledgeBaseByFileIdSchema,
|
|
21
25
|
knowledgeBaseByPathSchema,
|
|
26
|
+
knowledgeBaseByProjectIdOnlySchema,
|
|
22
27
|
]);
|
|
23
28
|
/** 与 IM 后台约定的 `params.agentContext` 结构 */
|
|
24
29
|
export const robotMentionAgentContextSchema = z.object({
|
|
@@ -26,19 +31,59 @@ export const robotMentionAgentContextSchema = z.object({
|
|
|
26
31
|
knowledgeBase: agentContextKnowledgeBaseSchema.optional(),
|
|
27
32
|
background: z.string().optional(),
|
|
28
33
|
});
|
|
29
|
-
|
|
34
|
+
function formatZodIssue(err) {
|
|
35
|
+
const issue = err.issues[0];
|
|
36
|
+
const path = issue?.path?.length ? issue.path.join(".") : "agentContext";
|
|
37
|
+
return `${path}: ${issue?.message ?? err.message}`;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 解析 agentContext;knowledgeBase 非法时丢弃该字段,仍保留 localRoot + background。
|
|
41
|
+
*/
|
|
42
|
+
export function parseRobotMentionAgentContextDetailed(params) {
|
|
30
43
|
if (params == null || typeof params !== "object") {
|
|
31
|
-
return
|
|
44
|
+
return {};
|
|
32
45
|
}
|
|
33
46
|
const raw = params.agentContext;
|
|
34
47
|
if (raw == null || typeof raw !== "object") {
|
|
35
|
-
return
|
|
48
|
+
return {};
|
|
36
49
|
}
|
|
37
|
-
const
|
|
38
|
-
|
|
50
|
+
const record = raw;
|
|
51
|
+
const localRootParsed = localRootSchema.safeParse(record.localRoot);
|
|
52
|
+
if (!localRootParsed.success) {
|
|
53
|
+
return { fatalError: formatZodIssue(localRootParsed.error) };
|
|
54
|
+
}
|
|
55
|
+
let knowledgeBase;
|
|
56
|
+
let knowledgeBaseDropped = false;
|
|
57
|
+
let knowledgeBaseDropReason;
|
|
58
|
+
if (record.knowledgeBase != null) {
|
|
59
|
+
const kbParsed = agentContextKnowledgeBaseSchema.safeParse(record.knowledgeBase);
|
|
60
|
+
if (kbParsed.success) {
|
|
61
|
+
knowledgeBase = kbParsed.data;
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
knowledgeBaseDropped = true;
|
|
65
|
+
knowledgeBaseDropReason = formatZodIssue(kbParsed.error);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const background = typeof record.background === "string" ? record.background : undefined;
|
|
69
|
+
return {
|
|
70
|
+
agentContext: {
|
|
71
|
+
localRoot: localRootParsed.data,
|
|
72
|
+
...(knowledgeBase ? { knowledgeBase } : {}),
|
|
73
|
+
...(background !== undefined ? { background } : {}),
|
|
74
|
+
},
|
|
75
|
+
...(knowledgeBaseDropped ? { knowledgeBaseDropped, knowledgeBaseDropReason } : {}),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
export function parseRobotMentionAgentContext(params) {
|
|
79
|
+
return parseRobotMentionAgentContextDetailed(params).agentContext;
|
|
39
80
|
}
|
|
40
81
|
/** 判断 knowledgeBase 是否为 projectId + folderPath 形式 */
|
|
41
82
|
export function isKnowledgeBaseByPath(kb) {
|
|
42
83
|
return "projectId" in kb && "folderPath" in kb;
|
|
43
84
|
}
|
|
85
|
+
/** 判断 knowledgeBase 是否仅有 projectId(无 folderPath / rootFileId) */
|
|
86
|
+
export function isKnowledgeBaseByProjectIdOnly(kb) {
|
|
87
|
+
return "projectId" in kb && !("folderPath" in kb) && !("rootFileId" in kb);
|
|
88
|
+
}
|
|
44
89
|
//# sourceMappingURL=agent-context-types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-context-types.js","sourceRoot":"","sources":["../../src/agent-context-types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/D,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7B,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC;IAC9B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC1B,CAAC,CAAC;AAEH
|
|
1
|
+
{"version":3,"file":"agent-context-types.js","sourceRoot":"","sources":["../../src/agent-context-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-context-types.test.d.ts","sourceRoot":"","sources":["../../src/agent-context-types.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { describe, it } from "node:test";
|
|
3
|
+
import { parseRobotMentionAgentContext, parseRobotMentionAgentContextDetailed, } from "./agent-context-types.js";
|
|
4
|
+
const USER_PAYLOAD = {
|
|
5
|
+
agentContext: {
|
|
6
|
+
background: "- 项目名称:Sitavig\n\n该项目对应的知识库根目录id为:2072258063360479234\n\n### 会话背景信息:\n待办内容:BD初审修订任务",
|
|
7
|
+
knowledgeBase: { projectId: "1660820549716893698" },
|
|
8
|
+
localRoot: { kind: "workspace_relative", path: "project/202607/2074431529933336577" },
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
describe("parseRobotMentionAgentContext", () => {
|
|
12
|
+
it("accepts knowledgeBase with projectId only (IM 常见形态)", () => {
|
|
13
|
+
const ctx = parseRobotMentionAgentContext(USER_PAYLOAD);
|
|
14
|
+
assert.ok(ctx);
|
|
15
|
+
assert.equal(ctx.localRoot.path, "project/202607/2074431529933336577");
|
|
16
|
+
assert.deepEqual(ctx.knowledgeBase, { projectId: "1660820549716893698" });
|
|
17
|
+
assert.ok(ctx.background?.includes("Sitavig"));
|
|
18
|
+
});
|
|
19
|
+
it("accepts knowledgeBase with projectId and folderPath", () => {
|
|
20
|
+
const ctx = parseRobotMentionAgentContext({
|
|
21
|
+
agentContext: {
|
|
22
|
+
localRoot: { kind: "workspace_relative", path: "data/a" },
|
|
23
|
+
knowledgeBase: { projectId: "p1", folderPath: "团队文档/项目A" },
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
assert.deepEqual(ctx.knowledgeBase, {
|
|
27
|
+
projectId: "p1",
|
|
28
|
+
folderPath: "团队文档/项目A",
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
it("accepts knowledgeBase with rootFileId", () => {
|
|
32
|
+
const ctx = parseRobotMentionAgentContext({
|
|
33
|
+
agentContext: {
|
|
34
|
+
localRoot: { kind: "workspace_relative", path: "data/a" },
|
|
35
|
+
knowledgeBase: { rootFileId: "2072258063360479234" },
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
assert.deepEqual(ctx.knowledgeBase, { rootFileId: "2072258063360479234" });
|
|
39
|
+
});
|
|
40
|
+
it("rejects missing localRoot", () => {
|
|
41
|
+
const result = parseRobotMentionAgentContextDetailed({
|
|
42
|
+
agentContext: { background: "x" },
|
|
43
|
+
});
|
|
44
|
+
assert.equal(result.agentContext, undefined);
|
|
45
|
+
assert.ok(result.fatalError);
|
|
46
|
+
});
|
|
47
|
+
it("drops invalid knowledgeBase but keeps localRoot and background", () => {
|
|
48
|
+
const result = parseRobotMentionAgentContextDetailed({
|
|
49
|
+
agentContext: {
|
|
50
|
+
localRoot: { kind: "workspace_relative", path: "data/a" },
|
|
51
|
+
knowledgeBase: { rootFileId: "" },
|
|
52
|
+
background: "项目说明",
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
assert.ok(result.agentContext);
|
|
56
|
+
assert.equal(result.agentContext.background, "项目说明");
|
|
57
|
+
assert.equal(result.agentContext.knowledgeBase, undefined);
|
|
58
|
+
assert.equal(result.knowledgeBaseDropped, true);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
//# sourceMappingURL=agent-context-types.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-context-types.test.js","sourceRoot":"","sources":["../../src/agent-context-types.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* 处理 IM WebSocket 下发的 openclawApplySyncMapping 信令。
|
|
3
3
|
*/
|
|
4
4
|
import { resolveAgentWorkspaceDir } from "openclaw/plugin-sdk/memory-core-host-engine-foundation";
|
|
5
|
-
import {
|
|
5
|
+
import { resolveLocalAbsolutePath, resolveRemoteRootForSync } from "./project-path-normalize.js";
|
|
6
6
|
import { parseSyncMappingParams } from "./sync-mapping-types.js";
|
|
7
7
|
import { deleteSyncMapping, upsertSyncMapping } from "./sync-service-client.js";
|
|
8
8
|
const DEFAULT_FILE_PATTERNS = ["**/*"];
|
|
@@ -37,12 +37,15 @@ async function applyUpsert(ctx, syncBase, params) {
|
|
|
37
37
|
const { config, cfg, log, logPrefix } = ctx;
|
|
38
38
|
const localRoot = params.localRoot;
|
|
39
39
|
const agentId = config.agentId || "main";
|
|
40
|
-
let
|
|
40
|
+
let remoteRoot;
|
|
41
41
|
try {
|
|
42
|
-
|
|
42
|
+
remoteRoot = resolveRemoteRootForSync({
|
|
43
|
+
remoteRootFolderId: params.remoteRootFolderId,
|
|
44
|
+
remoteRootFolderPath: params.remoteRootFolderPath,
|
|
45
|
+
});
|
|
43
46
|
}
|
|
44
47
|
catch (e) {
|
|
45
|
-
log.error(`${logPrefix} [sync-mapping] remote
|
|
48
|
+
log.error(`${logPrefix} [sync-mapping] remote root: ${String(e)}`);
|
|
46
49
|
return;
|
|
47
50
|
}
|
|
48
51
|
let workspaceHost;
|
|
@@ -73,13 +76,18 @@ async function applyUpsert(ctx, syncBase, params) {
|
|
|
73
76
|
localRoot: resolvedLocalAbs,
|
|
74
77
|
enabled: params.enabled ?? true,
|
|
75
78
|
appKey: params.appKey.trim(),
|
|
76
|
-
|
|
79
|
+
...(remoteRoot.remoteRootFileId ? { remoteRootFileId: remoteRoot.remoteRootFileId } : {}),
|
|
80
|
+
...(remoteRoot.remoteRootFolderPath ? { remoteRootFolderPath: remoteRoot.remoteRootFolderPath } : {}),
|
|
77
81
|
...(params.kbProjectId?.trim() ? { projectId: params.kbProjectId.trim() } : {}),
|
|
78
82
|
filePatterns,
|
|
79
83
|
excludePatterns,
|
|
80
84
|
...(syncOpts?.direction ? { syncDirection: syncOpts.direction } : {}),
|
|
81
85
|
};
|
|
82
|
-
|
|
86
|
+
const remoteLabel = remoteRoot.remoteRootFileId
|
|
87
|
+
? `fileId=${remoteRoot.remoteRootFileId}` +
|
|
88
|
+
(remoteRoot.remoteRootFolderPath ? ` path=${remoteRoot.remoteRootFolderPath}` : "")
|
|
89
|
+
: `path=${remoteRoot.remoteRootFolderPath}`;
|
|
90
|
+
log.info(`${logPrefix} [sync-mapping] upsert mappingId=${params.mappingId} agentId=${agentId} workspaceHost=${workspaceHost ?? "(host_absolute)"} localRoot=${resolvedLocalAbs} remote=${remoteLabel}`);
|
|
83
91
|
try {
|
|
84
92
|
await upsertSyncMapping(syncBase, params.mappingId, body, log);
|
|
85
93
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply-sync-mapping.js","sourceRoot":"","sources":["../../src/apply-sync-mapping.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,wBAAwB,EAAE,MAAM,wDAAwD,CAAC;AAElG,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"apply-sync-mapping.js","sourceRoot":"","sources":["../../src/apply-sync-mapping.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block-streaming-config.test.d.ts","sourceRoot":"","sources":["../../src/block-streaming-config.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { describe, it } from "node:test";
|
|
3
|
+
import { IM_BLOCK_STREAMING_COALESCE_DEFAULT, isInboundBlockStreamingEnabled, resolveBlockStreamingReplyOptions, resolveDispatchOpenClawCfg, } from "./channel-config.js";
|
|
4
|
+
function cfg(overrides = {}) {
|
|
5
|
+
return { baseUrl: "https://example.com", ...overrides };
|
|
6
|
+
}
|
|
7
|
+
const baseOpenClawCfg = {
|
|
8
|
+
agents: {
|
|
9
|
+
defaults: {
|
|
10
|
+
blockStreamingCoalesce: { minChars: 2400, maxChars: 12000, idleMs: 3000 },
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
channels: { xg_cwork_im: { baseUrl: "https://example.com" } },
|
|
14
|
+
};
|
|
15
|
+
describe("block streaming config", () => {
|
|
16
|
+
it("enabled by default when blockStreaming unset", () => {
|
|
17
|
+
assert.equal(isInboundBlockStreamingEnabled(cfg()), true);
|
|
18
|
+
assert.deepEqual(resolveBlockStreamingReplyOptions(cfg()), { disableBlockStreaming: false });
|
|
19
|
+
});
|
|
20
|
+
it("disabled when blockStreaming is false", () => {
|
|
21
|
+
assert.equal(isInboundBlockStreamingEnabled(cfg({ blockStreaming: false })), false);
|
|
22
|
+
assert.deepEqual(resolveBlockStreamingReplyOptions(cfg({ blockStreaming: false })), {
|
|
23
|
+
disableBlockStreaming: true,
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
it("explicit true forces enable", () => {
|
|
27
|
+
assert.equal(isInboundBlockStreamingEnabled(cfg({ blockStreaming: true })), true);
|
|
28
|
+
});
|
|
29
|
+
it("resolveDispatchOpenClawCfg injects IM coalesce when channel omits it", () => {
|
|
30
|
+
const patched = resolveDispatchOpenClawCfg(baseOpenClawCfg, cfg());
|
|
31
|
+
const xg = patched
|
|
32
|
+
.channels?.xg_cwork_im;
|
|
33
|
+
assert.deepEqual(xg?.blockStreamingCoalesce, { ...IM_BLOCK_STREAMING_COALESCE_DEFAULT });
|
|
34
|
+
});
|
|
35
|
+
it("resolveDispatchOpenClawCfg leaves cfg when channel coalesce set", () => {
|
|
36
|
+
const custom = { minChars: 100, idleMs: 50 };
|
|
37
|
+
const patched = resolveDispatchOpenClawCfg(baseOpenClawCfg, cfg({ blockStreamingCoalesce: custom }));
|
|
38
|
+
assert.equal(patched, baseOpenClawCfg);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
//# sourceMappingURL=block-streaming-config.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block-streaming-config.test.js","sourceRoot":"","sources":["../../src/block-streaming-config.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EACH,mCAAmC,EACnC,8BAA8B,EAC9B,iCAAiC,EACjC,0BAA0B,GAC7B,MAAM,qBAAqB,CAAC;AAG7B,SAAS,GAAG,CAAC,YAAiC,EAAE;IAC5C,OAAO,EAAE,OAAO,EAAE,qBAAqB,EAAE,GAAG,SAAS,EAAE,CAAC;AAC5D,CAAC;AAED,MAAM,eAAe,GAAG;IACpB,MAAM,EAAE;QACJ,QAAQ,EAAE;YACN,sBAAsB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE;SAC5E;KACJ;IACD,QAAQ,EAAE,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE;CACL,CAAC;AAE7D,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAC1D,MAAM,CAAC,SAAS,CAAC,iCAAiC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,qBAAqB,EAAE,KAAK,EAAE,CAAC,CAAC;IACjG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,GAAG,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACpF,MAAM,CAAC,SAAS,CAAC,iCAAiC,CAAC,GAAG,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE;YAChF,qBAAqB,EAAE,IAAI;SAC9B,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,GAAG,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC5E,MAAM,OAAO,GAAG,0BAA0B,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;QACnE,MAAM,EAAE,GAAI,OAAiF;aACxF,QAAQ,EAAE,WAAW,CAAC;QAC3B,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,sBAAsB,EAAE,EAAE,GAAG,mCAAmC,EAAE,CAAC,CAAC;IAC7F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACvE,MAAM,MAAM,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,0BAA0B,CAAC,eAAe,EAAE,GAAG,CAAC,EAAE,sBAAsB,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QACrG,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-project-prompt.d.ts","sourceRoot":"","sources":["../../src/build-project-prompt.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,
|
|
1
|
+
{"version":3,"file":"build-project-prompt.d.ts","sourceRoot":"","sources":["../../src/build-project-prompt.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAGH,KAAK,wBAAwB,EAChC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAGH,KAAK,aAAa,EACrB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAK7C,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAIhE;AAED,MAAM,WAAW,uBAAuB;IACpC,YAAY,EAAE,wBAAwB,CAAC;IACvC,MAAM,EAAE,UAAU,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,GAAG,CAAC,EAAE,GAAG,CAAC;CACb;AAED,MAAM,WAAW,wBAAwB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAQD,0CAA0C;AAC1C,wBAAgB,yBAAyB,CACrC,SAAS,EAAE,aAAa,EACxB,MAAM,EAAE,UAAU,GACnB;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,CAAA;CAAE,CAuB3H;AAOD,MAAM,WAAW,sBAAsB;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,UAAU,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,GAAG,SAAS,CAmB7F;AAkCD;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,uBAAuB,GAAG,wBAAwB,CAgErG"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 将 IM 下发的 agentContext 渲染为 GroupSystemPrompt 追加段。
|
|
3
3
|
*/
|
|
4
|
-
import { isKnowledgeBaseByPath, } from "./agent-context-types.js";
|
|
4
|
+
import { isKnowledgeBaseByPath, isKnowledgeBaseByProjectIdOnly, } from "./agent-context-types.js";
|
|
5
5
|
import { normalizeWorkspaceRelativeSegment, resolveLocalAbsolutePath, } from "./project-path-normalize.js";
|
|
6
6
|
const DEFAULT_SANDBOX_PREFIX = "/workspace";
|
|
7
7
|
const DEFAULT_PROJECT_PROMPT_MAX_CHARS = 15_000;
|
|
@@ -81,6 +81,10 @@ function knowledgeBasePurposeLine(agentContext) {
|
|
|
81
81
|
return (`- **知识库资料**:本项目已与知识库(空间 \`${kb.projectId.trim()}\`)目录「${folder}」建立同步;` +
|
|
82
82
|
`来自知识库的文件会出现在项目根目录及子路径中,可作为背景资料使用。`);
|
|
83
83
|
}
|
|
84
|
+
if (isKnowledgeBaseByProjectIdOnly(kb)) {
|
|
85
|
+
return (`- **知识库资料**:本项目已与知识库空间 \`${kb.projectId.trim()}\` 关联;` +
|
|
86
|
+
`来自知识库的文件会出现在项目根目录及子路径中,可作为背景资料使用。`);
|
|
87
|
+
}
|
|
84
88
|
const fileId = kb.rootFileId.trim();
|
|
85
89
|
return (`- **知识库资料**:本项目已与知识库目录(fileId: \`${fileId}\`)建立同步;` +
|
|
86
90
|
`来自知识库的文件会出现在项目根目录及子路径中,可作为背景资料使用。`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-project-prompt.js","sourceRoot":"","sources":["../../src/build-project-prompt.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACH,qBAAqB,
|
|
1
|
+
{"version":3,"file":"build-project-prompt.js","sourceRoot":"","sources":["../../src/build-project-prompt.ts"],"names":[],"mappings":"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"}
|