@xgjktech/xg_cwork_im 1.11.5 → 1.11.7
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 +17 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -7
- package/dist/index.js.map +1 -1
- package/dist/src/agent-context-types.d.ts +33 -0
- package/dist/src/agent-context-types.d.ts.map +1 -0
- package/dist/src/agent-context-types.js +26 -0
- package/dist/src/agent-context-types.js.map +1 -0
- package/dist/src/apply-sync-mapping.d.ts +17 -0
- package/dist/src/apply-sync-mapping.d.ts.map +1 -0
- package/dist/src/apply-sync-mapping.js +86 -0
- package/dist/src/apply-sync-mapping.js.map +1 -0
- package/dist/src/auth.d.ts +2 -2
- package/dist/src/auth.d.ts.map +1 -1
- package/dist/src/auth.js +18 -12
- package/dist/src/auth.js.map +1 -1
- package/dist/src/build-project-prompt.d.ts +28 -0
- package/dist/src/build-project-prompt.d.ts.map +1 -0
- package/dist/src/build-project-prompt.js +86 -0
- package/dist/src/build-project-prompt.js.map +1 -0
- package/dist/src/channel-config.d.ts +256 -0
- package/dist/src/channel-config.d.ts.map +1 -0
- package/dist/src/channel-config.js +194 -0
- package/dist/src/channel-config.js.map +1 -0
- package/dist/src/channel-log.d.ts +17 -0
- package/dist/src/channel-log.d.ts.map +1 -0
- package/dist/src/channel-log.js +45 -0
- package/dist/src/channel-log.js.map +1 -0
- package/dist/src/channel.d.ts +4 -7
- package/dist/src/channel.d.ts.map +1 -1
- package/dist/src/channel.js +77 -538
- package/dist/src/channel.js.map +1 -1
- package/dist/src/connection.d.ts +45 -9
- package/dist/src/connection.d.ts.map +1 -1
- package/dist/src/connection.js +117 -5
- package/dist/src/connection.js.map +1 -1
- package/dist/src/dispatch-mentioned-reply.d.ts +25 -0
- package/dist/src/dispatch-mentioned-reply.d.ts.map +1 -0
- package/dist/src/dispatch-mentioned-reply.js +346 -0
- package/dist/src/dispatch-mentioned-reply.js.map +1 -0
- package/dist/src/gateway-session-queue.d.ts +26 -0
- package/dist/src/gateway-session-queue.d.ts.map +1 -0
- package/dist/src/gateway-session-queue.js +82 -0
- package/dist/src/gateway-session-queue.js.map +1 -0
- package/dist/src/group-history-tool.d.ts +11 -3
- package/dist/src/group-history-tool.d.ts.map +1 -1
- package/dist/src/group-history-tool.js +14 -10
- package/dist/src/group-history-tool.js.map +1 -1
- package/dist/src/inbound-display.d.ts +25 -0
- package/dist/src/inbound-display.d.ts.map +1 -0
- package/dist/src/inbound-display.js +100 -0
- package/dist/src/inbound-display.js.map +1 -0
- package/dist/src/project-path-normalize.d.ts +16 -0
- package/dist/src/project-path-normalize.d.ts.map +1 -0
- package/dist/src/project-path-normalize.js +75 -0
- package/dist/src/project-path-normalize.js.map +1 -0
- package/dist/src/resolve-inbound-group-prompt.d.ts +18 -0
- package/dist/src/resolve-inbound-group-prompt.d.ts.map +1 -0
- package/dist/src/resolve-inbound-group-prompt.js +38 -0
- package/dist/src/resolve-inbound-group-prompt.js.map +1 -0
- package/dist/src/resource-file.d.ts +17 -8
- package/dist/src/resource-file.d.ts.map +1 -1
- package/dist/src/resource-file.js +60 -21
- package/dist/src/resource-file.js.map +1 -1
- package/dist/src/send-group-message-tool.d.ts +3 -2
- package/dist/src/send-group-message-tool.d.ts.map +1 -1
- package/dist/src/send-group-message-tool.js +5 -4
- package/dist/src/send-group-message-tool.js.map +1 -1
- package/dist/src/send-service.d.ts +5 -1
- package/dist/src/send-service.d.ts.map +1 -1
- package/dist/src/send-service.js +6 -2
- package/dist/src/send-service.js.map +1 -1
- package/dist/src/sync-mapping-types.d.ts +170 -0
- package/dist/src/sync-mapping-types.d.ts.map +1 -0
- package/dist/src/sync-mapping-types.js +41 -0
- package/dist/src/sync-mapping-types.js.map +1 -0
- package/dist/src/sync-service-client.d.ts +27 -0
- package/dist/src/sync-service-client.d.ts.map +1 -0
- package/dist/src/sync-service-client.js +72 -0
- package/dist/src/sync-service-client.js.map +1 -0
- package/dist/src/types.d.ts +34 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -9,7 +9,7 @@ IM 系统 → WebSocket → 插件(本项目) → OpenClaw AI → IM
|
|
|
9
9
|
```
|
|
10
10
|
|
|
11
11
|
1. 插件启动时用 `robotKey`(兼容旧字段 `appKey`)换取 `access_token` 和 `userId`
|
|
12
|
-
2. 建立 WebSocket
|
|
12
|
+
2. 建立 WebSocket 长连接,接收带业务 `params` 的推送(当前代码会处理 **`robotMention`** 与 **`groupMessage`**,条件:`parsed.params` 存在且 `cmd` 为上述二者之一)
|
|
13
13
|
3. 将收到的消息转发给 OpenClaw 处理
|
|
14
14
|
4. OpenClaw AI 回复后,插件:
|
|
15
15
|
- 先通过 WebSocket `START` 让 IM 端显示一条「思考中」占位消息;
|
|
@@ -226,19 +226,20 @@ openclaw gateway restart
|
|
|
226
226
|
|---|---|---|---|
|
|
227
227
|
| `baseUrl` | string | **必填** | IM 服务域名(API 接口地址) |
|
|
228
228
|
| `wsBaseUrl` | string | — | **可选**。WebSocket 独立域名。若不填,插件将尝试自动映射。 |
|
|
229
|
-
| `groupPolicy` | string | `"mention"` | `
|
|
229
|
+
| `groupPolicy` | string | `"mention"` | 用于 OpenClaw **`groups.resolveRequireMention`**:`"open"` 时返回「不必强制仅 @ 才参与提及策略」;`"mention"` 时返回「需要 @」。**注意**:网关 **`handleMessage` 是否把消息交给 AI** 仅取决于 **`actuallyMentioned`**(`mentions` 含机器人 `userId` 或 **`"all"`**,或旧版正文匹配 `@机器人名`)。**`groupPolicy: open` 不会**变成「群里任意发言都自动触发 AI」;未 @ 时仍会 **recordInboundSession** 记记忆,但不走 `dispatchMentionedReply`。 |
|
|
230
230
|
| `enabled` | boolean | `true` | 是否启用 |
|
|
231
231
|
| `debug` | boolean | `false` | 开启调试日志 |
|
|
232
|
-
| `maxConnectionAttempts` | number |
|
|
232
|
+
| `maxConnectionAttempts` | number | 见下 | Channel 配置经 Zod 校验时默认 **`10`**(`channel.ts` 中 `XgImConfigSchema`)。`connection.ts` 读取配置时若该字段仍为 **`undefined`**,则回退为 **`200`**。建议在 `openclaw.json` 中显式填写以避免与直觉不一致。 |
|
|
233
233
|
| `initialReconnectDelay` | number | `1000` | 初始重连延迟(ms) |
|
|
234
234
|
| `maxReconnectDelay` | number | `60000` | 最大重连延迟(ms) |
|
|
235
235
|
| `reconnectJitter` | number | `0.3` | 重连抖动因子(0-1) |
|
|
236
|
-
| `firstReplyTimeoutMs` | number | `
|
|
236
|
+
| `firstReplyTimeoutMs` | number | `1800000`(30 分钟) | **首条 AI 回复超时时间(毫秒)**。未配置时代码使用 **`30 * 60_000`**(`channel.ts` 中 `dispatchMentionedReply`)。超时后通过 HTTP 将占位更新为超时提示。该键目前**未**写入 `XgImConfigSchema`,仅作为运行时字段生效(`types.ts` 中有类型说明)。 |
|
|
237
237
|
| `inboundMediaWorkspaceSubdir` | string | — | **可选**。非空时,将入站附件先下载到**当前 Agent workspace** 下该**相对子目录**(如 `xg_im_inbound`),路径约定:`{子目录}/{发送者 userId}/{YYYY-MM-DD}/{文件名}_{HHmmssmmm}.ext`(时间为本机写入时刻),再向 OpenClaw 传入 **MediaPath**;默认使用 **workspace 相对路径**(如 `./xg_im_inbound/...`),便于 **沙箱** 将 `/workspace` 映射到同一套目录树;未配置则仍使用 IM 返回的 URL。需 runtime 提供 `resolveAgentWorkspaceDir`。 |
|
|
238
238
|
| `inboundMediaOpenClawPath` | string | `workspaceRelative`(默认) | `workspaceRelative`:入站落盘后 `MediaPath` 为 `./子目录/...`(若配置了 `inboundMediaSandboxRootPrefix` 则为该前缀 + 相对路径,如 `/workspace/xg_im_inbound/...`);`absoluteFileUrl`:宿主机 `file://...`(仅适合无沙箱、网关与 Agent 同盘场景)。 |
|
|
239
239
|
| `inboundMediaSandboxRootPrefix` | string | — | **可选**。沙箱内 workspace 挂载根,填 **`/workspace`** 时,在 `workspaceRelative` 模式下 `MediaPath` 为 **`/workspace/xg_im_inbound/...`**,避免 `./` 被 `read` 等工具按**进程 cwd**解析导致「不可访问」。须以 `/` 开头。 |
|
|
240
|
+
| `syncServiceBaseUrl` | string | — | **可选**。openclaw-xgkb-sync **管理 API** 根地址(如 `http://127.0.0.1:9090`)。配置后插件可处理 IM 下发的 `openclawApplySyncMapping` 信令并登记目录映射。详见 `docs/im服务接口说明.md`。 |
|
|
240
241
|
|
|
241
|
-
### 账户配置(`accounts.<accountId
|
|
242
|
+
### 账户配置(`accounts.<accountId>`,对象 map)
|
|
242
243
|
|
|
243
244
|
| 选项 | 类型 | 默认值 | 说明 |
|
|
244
245
|
|---|---|---|---|
|
|
@@ -249,6 +250,11 @@ openclaw gateway restart
|
|
|
249
250
|
| `inboundMediaWorkspaceSubdir` | string | 继承顶层 | 可覆盖顶层的入站附件落盘子目录 |
|
|
250
251
|
| `inboundMediaOpenClawPath` | string | 继承顶层 | 可覆盖顶层的 MediaPath 形式(相对路径 vs file://) |
|
|
251
252
|
| `inboundMediaSandboxRootPrefix` | string | 继承顶层 | 可覆盖沙箱根前缀(如 `/workspace`) |
|
|
253
|
+
| `syncServiceBaseUrl` | string | 继承顶层 | 可覆盖同步服务管理 API 地址 |
|
|
254
|
+
|
|
255
|
+
### Agent 工具(`optional: true`)
|
|
256
|
+
|
|
257
|
+
`xg_cwork_im_get_group_chat_history` 与 `xg_cwork_im_send_group_message` 在 `index.ts` 中以 **`api.registerTool(..., { optional: true })`** 注册。需在对应 Agent 的 **`tools.allow`**(或你们环境中的工具白名单配置)中**显式加入**上述工具名后,模型才会在运行时获得它们。
|
|
252
258
|
|
|
253
259
|
---
|
|
254
260
|
|
|
@@ -293,7 +299,12 @@ openclaw-channel-xg-cwork-im/
|
|
|
293
299
|
│ ├── group-history-tool.ts # 拉取群消息历史的 Agent Tool
|
|
294
300
|
│ ├── send-group-message-tool.ts # 发送群消息的 Agent Tool
|
|
295
301
|
│ ├── inbound-media-local.ts # 可选:入站附件落盘到 workspace 子目录
|
|
296
|
-
│
|
|
302
|
+
│ ├── channel.ts # Channel 组装(meta / config / outbound / gateway)
|
|
303
|
+
│ ├── channel-config.ts # Zod schema、getXgImConfig、GroupSystemPrompt、命令门控
|
|
304
|
+
│ ├── channel-log.ts # toLogger 适配
|
|
305
|
+
│ ├── inbound-display.ts # 入站正文、@ 判定、MediaPath(s)、UntrustedContext
|
|
306
|
+
│ ├── dispatch-mentioned-reply.ts # OpenClaw 派发 + 流式 + HTTP deliver
|
|
307
|
+
│ ├── gateway-session-queue.ts # 按 session 排队与 /stop 清队列
|
|
297
308
|
├── package.json
|
|
298
309
|
├── tsconfig.json
|
|
299
310
|
├── openclaw.plugin.json
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE5D,OAAO,EAAE,uCAAuC,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE5D,OAAO,EAAE,uCAAuC,EAAE,MAAM,oCAAoC,CAAC;AAW7F,QAAA,MAAM,MAAM,EAAE,qBAmCb,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -16,13 +16,18 @@ const plugin = {
|
|
|
16
16
|
register(api) {
|
|
17
17
|
setXgImRuntime(api.runtime);
|
|
18
18
|
api.registerChannel({ plugin: xgCworkImChannelPlugin });
|
|
19
|
-
//
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
19
|
+
// 必须使用工厂 `(ctx) => tool`:OpenClaw 文档化行为为「静态工具等价于 (_ctx)=>tool」,会丢弃每回合的
|
|
20
|
+
// runtimeConfig / agentAccountId / requesterSenderId;工厂才能在执行前重建工具并打通鉴权与多账户路由。
|
|
21
|
+
const snapshot = extractXgCworkImConfig(api.config);
|
|
22
|
+
if (snapshot?.baseUrl) {
|
|
23
|
+
const resolveToolConfig = (ctx) => extractXgCworkImConfig(ctx.getRuntimeConfig?.() ?? ctx.runtimeConfig ?? ctx.config ?? api.config) ??
|
|
24
|
+
snapshot;
|
|
25
|
+
const sessionHints = (ctx) => ({
|
|
26
|
+
channelAccountId: ctx.agentAccountId ?? undefined,
|
|
27
|
+
requesterSenderId: ctx.requesterSenderId ?? undefined,
|
|
28
|
+
});
|
|
29
|
+
api.registerTool((ctx) => buildGroupHistoryTool(resolveToolConfig(ctx), sessionHints(ctx)), { optional: true });
|
|
30
|
+
api.registerTool((ctx) => buildSendGroupMessageTool(resolveToolConfig(ctx), sessionHints(ctx)), { optional: true });
|
|
26
31
|
}
|
|
27
32
|
else {
|
|
28
33
|
console.warn("[xg_cwork_im] channel config not found, skipping tool registration");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAC5F,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAG7E,OAAO,EAAE,uCAAuC,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAC5F,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAG7E,OAAO,EAAE,uCAAuC,EAAE,MAAM,oCAAoC,CAAC;AAW7F,MAAM,MAAM,GAA0B;IAClC,EAAE,EAAE,aAAa;IACjB,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EAAE,2CAA2C;IACxD,YAAY,EAAE,uBAAuB,EAAE;IACvC,QAAQ,CAAC,GAAsB;QAC3B,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5B,GAAG,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC,CAAC;QACxD,uEAAuE;QACvE,8EAA8E;QAC9E,MAAM,QAAQ,GAAG,sBAAsB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,QAAQ,EAAE,OAAO,EAAE,CAAC;YACpB,MAAM,iBAAiB,GAAG,CAAC,GAA0B,EAAE,EAAE,CACrD,sBAAsB,CAAC,GAAG,CAAC,gBAAgB,EAAE,EAAE,IAAI,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC;gBACjG,QAAQ,CAAC;YAEb,MAAM,YAAY,GAAG,CAAC,GAA0B,EAAE,EAAE,CAAC,CAAC;gBAClD,gBAAgB,EAAE,GAAG,CAAC,cAAc,IAAI,SAAS;gBACjD,iBAAiB,EAAE,GAAG,CAAC,iBAAiB,IAAI,SAAS;aACxD,CAAC,CAAC;YAEH,GAAG,CAAC,YAAY,CACZ,CAAC,GAA0B,EAAE,EAAE,CAC3B,qBAAqB,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,EACpE,EAAE,QAAQ,EAAE,IAAI,EAAE,CACrB,CAAC;YACF,GAAG,CAAC,YAAY,CACZ,CAAC,GAA0B,EAAE,EAAE,CAC3B,yBAAyB,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,EACxE,EAAE,QAAQ,EAAE,IAAI,EAAE,CACrB,CAAC;QACN,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;QACvF,CAAC;IACL,CAAC;CACJ,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* robotMention.params.agentContext — 精简版:工作区路径 + 可选项目背景
|
|
3
|
+
*/
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
/** 与 IM 后台约定的 `params.agentContext` 结构 */
|
|
6
|
+
export declare const robotMentionAgentContextSchema: z.ZodObject<{
|
|
7
|
+
localRoot: z.ZodObject<{
|
|
8
|
+
kind: z.ZodEnum<["workspace_relative", "host_absolute"]>;
|
|
9
|
+
path: z.ZodString;
|
|
10
|
+
}, "strip", z.ZodTypeAny, {
|
|
11
|
+
path: string;
|
|
12
|
+
kind: "workspace_relative" | "host_absolute";
|
|
13
|
+
}, {
|
|
14
|
+
path: string;
|
|
15
|
+
kind: "workspace_relative" | "host_absolute";
|
|
16
|
+
}>;
|
|
17
|
+
background: z.ZodOptional<z.ZodString>;
|
|
18
|
+
}, "strip", z.ZodTypeAny, {
|
|
19
|
+
localRoot: {
|
|
20
|
+
path: string;
|
|
21
|
+
kind: "workspace_relative" | "host_absolute";
|
|
22
|
+
};
|
|
23
|
+
background?: string | undefined;
|
|
24
|
+
}, {
|
|
25
|
+
localRoot: {
|
|
26
|
+
path: string;
|
|
27
|
+
kind: "workspace_relative" | "host_absolute";
|
|
28
|
+
};
|
|
29
|
+
background?: string | undefined;
|
|
30
|
+
}>;
|
|
31
|
+
export type RobotMentionAgentContext = z.infer<typeof robotMentionAgentContextSchema>;
|
|
32
|
+
export declare function parseRobotMentionAgentContext(params: unknown): RobotMentionAgentContext | undefined;
|
|
33
|
+
//# sourceMappingURL=agent-context-types.d.ts.map
|
|
@@ -0,0 +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;AAQxB,0CAA0C;AAC1C,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;EAGzC,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AAEtF,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,OAAO,GAAG,wBAAwB,GAAG,SAAS,CAUnG"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* robotMention.params.agentContext — 精简版:工作区路径 + 可选项目背景
|
|
3
|
+
*/
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { LOCAL_ROOT_KINDS } from "./project-path-normalize.js";
|
|
6
|
+
const localRootSchema = z.object({
|
|
7
|
+
kind: z.enum(LOCAL_ROOT_KINDS),
|
|
8
|
+
path: z.string().min(1),
|
|
9
|
+
});
|
|
10
|
+
/** 与 IM 后台约定的 `params.agentContext` 结构 */
|
|
11
|
+
export const robotMentionAgentContextSchema = z.object({
|
|
12
|
+
localRoot: localRootSchema,
|
|
13
|
+
background: z.string().optional(),
|
|
14
|
+
});
|
|
15
|
+
export function parseRobotMentionAgentContext(params) {
|
|
16
|
+
if (params == null || typeof params !== "object") {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
const raw = params.agentContext;
|
|
20
|
+
if (raw == null || typeof raw !== "object") {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
const parsed = robotMentionAgentContextSchema.safeParse(raw);
|
|
24
|
+
return parsed.success ? parsed.data : undefined;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=agent-context-types.js.map
|
|
@@ -0,0 +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,0CAA0C;AAC1C,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC,MAAM,CAAC;IACnD,SAAS,EAAE,eAAe;IAC1B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAC;AAIH,MAAM,UAAU,6BAA6B,CAAC,MAAe;IACzD,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/C,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,MAAM,GAAG,GAAI,MAAkC,CAAC,YAAY,CAAC;IAC7D,IAAI,GAAG,IAAI,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACzC,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,MAAM,MAAM,GAAG,8BAA8B,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC7D,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
|
|
3
|
+
* 处理 IM WebSocket 下发的 openclawApplySyncMapping 信令。
|
|
4
|
+
|
|
5
|
+
*/
|
|
6
|
+
import type { OpenClawConfig } from "openclaw/plugin-sdk";
|
|
7
|
+
import type { Log } from "./auth.js";
|
|
8
|
+
import type { XgImConfig } from "./types.js";
|
|
9
|
+
export interface ApplySyncMappingContext {
|
|
10
|
+
config: XgImConfig;
|
|
11
|
+
cfg: OpenClawConfig;
|
|
12
|
+
rt: unknown;
|
|
13
|
+
log: Log;
|
|
14
|
+
logPrefix: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function applySyncMappingFromWsParams(ctx: ApplySyncMappingContext, rawParams: unknown): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=apply-sync-mapping.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-sync-mapping.d.ts","sourceRoot":"","sources":["../../src/apply-sync-mapping.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAUrC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAU7C,MAAM,WAAW,uBAAuB;IAEpC,MAAM,EAAE,UAAU,CAAC;IAEnB,GAAG,EAAE,cAAc,CAAC;IAEpB,EAAE,EAAE,OAAO,CAAC;IAEZ,GAAG,EAAE,GAAG,CAAC;IAET,SAAS,EAAE,MAAM,CAAC;CAErB;AAID,wBAAsB,4BAA4B,CAE9C,GAAG,EAAE,uBAAuB,EAE5B,SAAS,EAAE,OAAO,GAEnB,OAAO,CAAC,IAAI,CAAC,CAwDf"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
|
|
3
|
+
* 处理 IM WebSocket 下发的 openclawApplySyncMapping 信令。
|
|
4
|
+
|
|
5
|
+
*/
|
|
6
|
+
import { normalizeRemoteRootFolderPath, resolveLocalAbsolutePath } from "./project-path-normalize.js";
|
|
7
|
+
import { resolveAgentWorkspaceDirFromRuntime } from "./inbound-media-local.js";
|
|
8
|
+
import { parseSyncMappingParams } from "./sync-mapping-types.js";
|
|
9
|
+
import { deleteSyncMapping, upsertSyncMapping } from "./sync-service-client.js";
|
|
10
|
+
const DEFAULT_FILE_PATTERNS = ["**/*"];
|
|
11
|
+
const DEFAULT_EXCLUDE = ["**/_conflict_*", "**/.tmp/**", "**/.openclaw/**"];
|
|
12
|
+
export async function applySyncMappingFromWsParams(ctx, rawParams) {
|
|
13
|
+
const { config, cfg, rt, log, logPrefix } = ctx;
|
|
14
|
+
const syncBase = config.syncServiceBaseUrl?.trim();
|
|
15
|
+
if (!syncBase) {
|
|
16
|
+
log.warn?.(`${logPrefix} [sync-mapping] received openclawApplySyncMapping but syncServiceBaseUrl is not configured; ignored`);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
let params;
|
|
20
|
+
try {
|
|
21
|
+
params = parseSyncMappingParams(rawParams);
|
|
22
|
+
}
|
|
23
|
+
catch (e) {
|
|
24
|
+
log.error(`${logPrefix} [sync-mapping] invalid params: ${String(e)}`);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (params.action === "delete") {
|
|
28
|
+
try {
|
|
29
|
+
await deleteSyncMapping(syncBase, params.mappingId, log);
|
|
30
|
+
}
|
|
31
|
+
catch (e) {
|
|
32
|
+
log.error(`${logPrefix} [sync-mapping] delete failed: ${String(e)}`);
|
|
33
|
+
}
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
await applyUpsert(ctx, syncBase, params);
|
|
37
|
+
}
|
|
38
|
+
async function applyUpsert(ctx, syncBase, params) {
|
|
39
|
+
const { config, cfg, rt, log, logPrefix } = ctx;
|
|
40
|
+
const localRoot = params.localRoot;
|
|
41
|
+
let remoteRootFolderPath;
|
|
42
|
+
try {
|
|
43
|
+
remoteRootFolderPath = normalizeRemoteRootFolderPath(params.remoteRootFolderPath);
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
log.error(`${logPrefix} [sync-mapping] remote path: ${String(e)}`);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const workspaceHost = localRoot.kind === "workspace_relative"
|
|
50
|
+
? resolveAgentWorkspaceDirFromRuntime(rt, cfg)
|
|
51
|
+
: undefined;
|
|
52
|
+
let resolvedLocalAbs;
|
|
53
|
+
try {
|
|
54
|
+
resolvedLocalAbs = resolveLocalAbsolutePath(localRoot, workspaceHost);
|
|
55
|
+
}
|
|
56
|
+
catch (e) {
|
|
57
|
+
log.error(`${logPrefix} [sync-mapping] resolve local path: ${String(e)}`);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const syncOpts = params.sync;
|
|
61
|
+
const filePatterns = syncOpts?.filePatterns && syncOpts.filePatterns.length > 0
|
|
62
|
+
? syncOpts.filePatterns
|
|
63
|
+
: DEFAULT_FILE_PATTERNS;
|
|
64
|
+
const excludePatterns = syncOpts?.excludePatterns && syncOpts.excludePatterns.length > 0
|
|
65
|
+
? syncOpts.excludePatterns
|
|
66
|
+
: DEFAULT_EXCLUDE;
|
|
67
|
+
const body = {
|
|
68
|
+
mappingId: params.mappingId,
|
|
69
|
+
localRoot: resolvedLocalAbs,
|
|
70
|
+
enabled: params.enabled ?? true,
|
|
71
|
+
appKey: params.appKey.trim(),
|
|
72
|
+
remoteRootFolderPath,
|
|
73
|
+
...(params.kbProjectId?.trim() ? { projectId: params.kbProjectId.trim() } : {}),
|
|
74
|
+
filePatterns,
|
|
75
|
+
excludePatterns,
|
|
76
|
+
...(syncOpts?.direction ? { syncDirection: syncOpts.direction } : {}),
|
|
77
|
+
};
|
|
78
|
+
log.info(`${logPrefix} [sync-mapping] upsert mappingId=${params.mappingId} localRoot=${resolvedLocalAbs} remote=${remoteRootFolderPath} agent=${config.agentId ?? "main"}`);
|
|
79
|
+
try {
|
|
80
|
+
await upsertSyncMapping(syncBase, params.mappingId, body, log);
|
|
81
|
+
}
|
|
82
|
+
catch (e) {
|
|
83
|
+
log.error(`${logPrefix} [sync-mapping] upsert failed: ${String(e)}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=apply-sync-mapping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-sync-mapping.js","sourceRoot":"","sources":["../../src/apply-sync-mapping.ts"],"names":[],"mappings":"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"}
|
package/dist/src/auth.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* XG-IM 认证模块
|
|
3
3
|
*
|
|
4
|
-
* 通过 appKey
|
|
4
|
+
* 通过 robotKey(或兼容旧字段 appKey)换取 access_token 和机器人 userId。
|
|
5
5
|
* token 有效期一年,启动时获取一次并缓存,无需定期刷新。
|
|
6
6
|
*/
|
|
7
7
|
import type { BotIdentity, XgImConfig } from "./types.js";
|
|
@@ -12,7 +12,7 @@ export type Log = {
|
|
|
12
12
|
debug?: (msg: string) => void;
|
|
13
13
|
};
|
|
14
14
|
/**
|
|
15
|
-
* 通过
|
|
15
|
+
* 通过 robotKey 获取机器人身份信息(token + userId)。
|
|
16
16
|
* 若缓存中已有有效 token,直接返回缓存;否则请求接口。
|
|
17
17
|
*
|
|
18
18
|
* @param config 插件配置
|
package/dist/src/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAoB,UAAU,EAAE,MAAM,YAAY,CAAC;AAE5E,MAAM,MAAM,GAAG,GAAG;IACd,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,CAAC;AAKF;;;;;;;GAOG;AACH,wBAAsB,QAAQ,CAC1B,MAAM,EAAE,UAAU,EAClB,GAAG,CAAC,EAAE,GAAG,EACT,KAAK,UAAQ,GACd,OAAO,CAAC,WAAW,CAAC,CA4CtB;AAED,oCAAoC;AACpC,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAKxD"}
|
package/dist/src/auth.js
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* XG-IM 认证模块
|
|
3
3
|
*
|
|
4
|
-
* 通过 appKey
|
|
4
|
+
* 通过 robotKey(或兼容旧字段 appKey)换取 access_token 和机器人 userId。
|
|
5
5
|
* token 有效期一年,启动时获取一次并缓存,无需定期刷新。
|
|
6
6
|
*/
|
|
7
7
|
import axios from "axios";
|
|
8
|
-
|
|
8
|
+
import { normalizeRobotKey } from "./channel-config.js";
|
|
9
|
+
/** 运行时 token 缓存,按 baseUrl + robotKey 索引 */
|
|
9
10
|
const tokenCache = new Map();
|
|
10
11
|
/**
|
|
11
|
-
* 通过
|
|
12
|
+
* 通过 robotKey 获取机器人身份信息(token + userId)。
|
|
12
13
|
* 若缓存中已有有效 token,直接返回缓存;否则请求接口。
|
|
13
14
|
*
|
|
14
15
|
* @param config 插件配置
|
|
@@ -16,19 +17,21 @@ const tokenCache = new Map();
|
|
|
16
17
|
* @param force 强制重新获取(忽略缓存)
|
|
17
18
|
*/
|
|
18
19
|
export async function getToken(config, log, force = false) {
|
|
19
|
-
|
|
20
|
-
|
|
20
|
+
const normalized = normalizeRobotKey(config);
|
|
21
|
+
const robotKey = normalized.appKey?.trim();
|
|
22
|
+
if (!robotKey) {
|
|
23
|
+
throw new Error("[cwork_im] robotKey is required (set channels.xg_cwork_im.robotKey or accounts.<id>.robotKey)");
|
|
21
24
|
}
|
|
22
|
-
const cacheKey = `${
|
|
25
|
+
const cacheKey = `${normalized.baseUrl}:${robotKey}`;
|
|
23
26
|
if (!force) {
|
|
24
27
|
const cached = tokenCache.get(cacheKey);
|
|
25
28
|
if (cached) {
|
|
26
|
-
log?.info?.(`[cwork_im] Using cached token for
|
|
29
|
+
log?.info?.(`[cwork_im] Using cached token for robotKey=${robotKey}`);
|
|
27
30
|
return cached;
|
|
28
31
|
}
|
|
29
32
|
}
|
|
30
|
-
const url = `${
|
|
31
|
-
log?.info(`[cwork_im:auth] GET ${url}
|
|
33
|
+
const url = `${normalized.baseUrl}/user/login/appkey?appKey=${encodeURIComponent(robotKey)}&appCode=im`;
|
|
34
|
+
log?.info(`[cwork_im:auth] GET ${url} robotKey=${robotKey}`);
|
|
32
35
|
const response = await axios.get(url, {
|
|
33
36
|
headers: { "Content-Type": "application/json" },
|
|
34
37
|
timeout: 10_000,
|
|
@@ -44,12 +47,15 @@ export async function getToken(config, log, force = false) {
|
|
|
44
47
|
name: body.data.userName ?? "bot",
|
|
45
48
|
};
|
|
46
49
|
tokenCache.set(cacheKey, identity);
|
|
47
|
-
log?.info(`[cwork_im:auth] Token acquired: userId=${identity.userId} name=${identity.name}
|
|
50
|
+
log?.info(`[cwork_im:auth] Token acquired: userId=${identity.userId} name=${identity.name} robotKey=${robotKey}`);
|
|
48
51
|
return identity;
|
|
49
52
|
}
|
|
50
53
|
/** 清除指定账户的 token 缓存(用于重连时强制重新鉴权) */
|
|
51
54
|
export function clearTokenCache(config) {
|
|
52
|
-
const
|
|
53
|
-
|
|
55
|
+
const normalized = normalizeRobotKey(config);
|
|
56
|
+
const robotKey = normalized.appKey?.trim();
|
|
57
|
+
if (!robotKey || !normalized.baseUrl)
|
|
58
|
+
return;
|
|
59
|
+
tokenCache.delete(`${normalized.baseUrl}:${robotKey}`);
|
|
54
60
|
}
|
|
55
61
|
//# sourceMappingURL=auth.js.map
|
package/dist/src/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAUxD,2CAA2C;AAC3C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAuB,CAAC;AAElD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC1B,MAAkB,EAClB,GAAS,EACT,KAAK,GAAG,KAAK;IAEb,MAAM,UAAU,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;IAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACX,+FAA+F,CAClG,CAAC;IACN,CAAC;IACD,MAAM,QAAQ,GAAG,GAAG,UAAU,CAAC,OAAO,IAAI,QAAQ,EAAE,CAAC;IAErD,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,MAAM,EAAE,CAAC;YACT,GAAG,EAAE,IAAI,EAAE,CAAC,8CAA8C,QAAQ,EAAE,CAAC,CAAC;YACtE,OAAO,MAAM,CAAC;QAClB,CAAC;IACL,CAAC;IAED,MAAM,GAAG,GAAG,GAAG,UAAU,CAAC,OAAO,6BAA6B,kBAAkB,CAAC,QAAQ,CAAC,aAAa,CAAC;IACxG,GAAG,EAAE,IAAI,CAAC,uBAAuB,GAAG,aAAa,QAAQ,EAAE,CAAC,CAAC;IAE7D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAmB,GAAG,EAAE;QACpD,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,OAAO,EAAE,MAAM;KAClB,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;IAC3B,GAAG,EAAE,IAAI,CAAC,mCAAmC,QAAQ,CAAC,MAAM,eAAe,IAAI,EAAE,UAAU,IAAI,KAAK,EAAE,CAAC,CAAC;IACxG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CACX,qDAAqD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAC9E,CAAC;IACN,CAAC;IAED,MAAM,QAAQ,GAAgB;QAC1B,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO;QACxB,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;QACvB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,KAAK;KACpC,CAAC;IAEF,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACnC,GAAG,EAAE,IAAI,CAAC,0CAA0C,QAAQ,CAAC,MAAM,SAAS,QAAQ,CAAC,IAAI,aAAa,QAAQ,EAAE,CAAC,CAAC;IAElH,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,eAAe,CAAC,MAAkB;IAC9C,MAAM,UAAU,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;IAC3C,IAAI,CAAC,QAAQ,IAAI,CAAC,UAAU,CAAC,OAAO;QAAE,OAAO;IAC7C,UAAU,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC,OAAO,IAAI,QAAQ,EAAE,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 将 IM 下发的 agentContext 渲染为 GroupSystemPrompt 追加段。
|
|
3
|
+
*/
|
|
4
|
+
import type { Log } from "./auth.js";
|
|
5
|
+
import { type LocalRootSpec } from "./project-path-normalize.js";
|
|
6
|
+
import type { RobotMentionAgentContext } from "./agent-context-types.js";
|
|
7
|
+
import type { XgImConfig } from "./types.js";
|
|
8
|
+
export interface AgentContextPromptInput {
|
|
9
|
+
agentContext: RobotMentionAgentContext;
|
|
10
|
+
config: XgImConfig;
|
|
11
|
+
workspaceHostRoot?: string;
|
|
12
|
+
log?: Log;
|
|
13
|
+
}
|
|
14
|
+
export interface AgentContextPromptResult {
|
|
15
|
+
block: string;
|
|
16
|
+
sandboxProjectPath?: string;
|
|
17
|
+
}
|
|
18
|
+
/** Agent 沙箱内可见的项目目录路径(供 Prompt / 工具使用) */
|
|
19
|
+
export declare function resolveSandboxProjectPath(localRoot: LocalRootSpec, config: XgImConfig): {
|
|
20
|
+
sandboxPath: string;
|
|
21
|
+
workspaceRelativeSegment?: string;
|
|
22
|
+
hostNote?: string;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* 渲染项目工作区 + 可选项目背景 + 入站落盘说明(不含用户个人 background)。
|
|
26
|
+
*/
|
|
27
|
+
export declare function buildAgentContextPromptBlock(input: AgentContextPromptInput): AgentContextPromptResult;
|
|
28
|
+
//# sourceMappingURL=build-project-prompt.d.ts.map
|
|
@@ -0,0 +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,EAGH,KAAK,aAAa,EACrB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAK7C,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;AAOD,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,CAAA;CAAE,CAc/E;AAgBD;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,uBAAuB,GAAG,wBAAwB,CAgDrG"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 将 IM 下发的 agentContext 渲染为 GroupSystemPrompt 追加段。
|
|
3
|
+
*/
|
|
4
|
+
import { normalizeWorkspaceRelativeSegment, resolveLocalAbsolutePath, } from "./project-path-normalize.js";
|
|
5
|
+
const DEFAULT_SANDBOX_PREFIX = "/workspace";
|
|
6
|
+
const DEFAULT_PROJECT_PROMPT_MAX_CHARS = 12_000;
|
|
7
|
+
function sandboxPrefix(config) {
|
|
8
|
+
const p = config.inboundMediaSandboxRootPrefix?.trim();
|
|
9
|
+
return p && p.startsWith("/") ? p.replace(/\/+$/, "") : DEFAULT_SANDBOX_PREFIX;
|
|
10
|
+
}
|
|
11
|
+
/** Agent 沙箱内可见的项目目录路径(供 Prompt / 工具使用) */
|
|
12
|
+
export function resolveSandboxProjectPath(localRoot, config) {
|
|
13
|
+
if (localRoot.kind === "host_absolute") {
|
|
14
|
+
return {
|
|
15
|
+
sandboxPath: localRoot.path.trim(),
|
|
16
|
+
hostNote: "该项目目录为宿主机绝对路径;沙箱 Agent 可能无法直接读写,请勿默认向该路径写入。",
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
const rel = normalizeWorkspaceRelativeSegment(localRoot.path);
|
|
20
|
+
const prefix = sandboxPrefix(config);
|
|
21
|
+
return {
|
|
22
|
+
sandboxPath: `${prefix}/${rel}`,
|
|
23
|
+
workspaceRelativeSegment: rel,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function truncate(text, max) {
|
|
27
|
+
if (text.length <= max)
|
|
28
|
+
return text;
|
|
29
|
+
return `${text.slice(0, max)}\n\n…(内容已截断)`;
|
|
30
|
+
}
|
|
31
|
+
function inboundMediaPromptLines(config, sandboxPrefixValue) {
|
|
32
|
+
const sub = config.inboundMediaWorkspaceSubdir?.trim();
|
|
33
|
+
if (!sub)
|
|
34
|
+
return [];
|
|
35
|
+
const normalized = sub.replace(/^\/+/, "").replace(/\/+$/, "");
|
|
36
|
+
return [
|
|
37
|
+
`- 用户从 IM 上传的附件会落盘到 \`${normalized}\`(路径约为 \`${sandboxPrefixValue}/${normalized}/…\`)`,
|
|
38
|
+
];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* 渲染项目工作区 + 可选项目背景 + 入站落盘说明(不含用户个人 background)。
|
|
42
|
+
*/
|
|
43
|
+
export function buildAgentContextPromptBlock(input) {
|
|
44
|
+
const { agentContext, config, workspaceHostRoot, log } = input;
|
|
45
|
+
const lines = [];
|
|
46
|
+
const maxChars = typeof config.projectPromptMaxChars === "number" && config.projectPromptMaxChars > 0
|
|
47
|
+
? config.projectPromptMaxChars
|
|
48
|
+
: DEFAULT_PROJECT_PROMPT_MAX_CHARS;
|
|
49
|
+
const pathInfo = resolveSandboxProjectPath(agentContext.localRoot, config);
|
|
50
|
+
lines.push("## 项目工作区");
|
|
51
|
+
lines.push("");
|
|
52
|
+
lines.push(`- 读写项目文件请使用: \`${pathInfo.sandboxPath}\``);
|
|
53
|
+
if (pathInfo.workspaceRelativeSegment) {
|
|
54
|
+
lines.push(`- 对应该 Agent workspace 根下的 \`${pathInfo.workspaceRelativeSegment}\``);
|
|
55
|
+
}
|
|
56
|
+
if (pathInfo.hostNote) {
|
|
57
|
+
lines.push(`- ${pathInfo.hostNote}`);
|
|
58
|
+
}
|
|
59
|
+
if (workspaceHostRoot?.trim() && agentContext.localRoot.kind === "workspace_relative") {
|
|
60
|
+
try {
|
|
61
|
+
resolveLocalAbsolutePath(agentContext.localRoot, workspaceHostRoot);
|
|
62
|
+
}
|
|
63
|
+
catch (e) {
|
|
64
|
+
log?.warn?.(`[agent-context] localRoot host resolve failed: ${String(e)}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const mediaLines = inboundMediaPromptLines(config, sandboxPrefix(config));
|
|
68
|
+
if (mediaLines.length > 0) {
|
|
69
|
+
lines.push("");
|
|
70
|
+
lines.push("## 入站附件");
|
|
71
|
+
lines.push("");
|
|
72
|
+
lines.push(...mediaLines);
|
|
73
|
+
}
|
|
74
|
+
const bg = agentContext.background?.trim();
|
|
75
|
+
if (bg) {
|
|
76
|
+
lines.push("");
|
|
77
|
+
lines.push("## 项目背景");
|
|
78
|
+
lines.push("");
|
|
79
|
+
lines.push(truncate(bg, maxChars));
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
block: lines.join("\n"),
|
|
83
|
+
sandboxProjectPath: pathInfo.sandboxPath,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=build-project-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-project-prompt.js","sourceRoot":"","sources":["../../src/build-project-prompt.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACH,iCAAiC,EACjC,wBAAwB,GAE3B,MAAM,6BAA6B,CAAC;AAIrC,MAAM,sBAAsB,GAAG,YAAY,CAAC;AAC5C,MAAM,gCAAgC,GAAG,MAAM,CAAC;AAchD,SAAS,aAAa,CAAC,MAAkB;IACrC,MAAM,CAAC,GAAG,MAAM,CAAC,6BAA6B,EAAE,IAAI,EAAE,CAAC;IACvD,OAAO,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC;AACnF,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,yBAAyB,CACrC,SAAwB,EACxB,MAAkB;IAElB,IAAI,SAAS,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QACrC,OAAO;YACH,WAAW,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE;YAClC,QAAQ,EACJ,6CAA6C;SACpD,CAAC;IACN,CAAC;IACD,MAAM,GAAG,GAAG,iCAAiC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACrC,OAAO;QACH,WAAW,EAAE,GAAG,MAAM,IAAI,GAAG,EAAE;QAC/B,wBAAwB,EAAE,GAAG;KAChC,CAAC;AACN,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,GAAW;IACvC,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC;AAC/C,CAAC;AAED,SAAS,uBAAuB,CAAC,MAAkB,EAAE,kBAA0B;IAC3E,MAAM,GAAG,GAAG,MAAM,CAAC,2BAA2B,EAAE,IAAI,EAAE,CAAC;IACvD,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC/D,OAAO;QACH,wBAAwB,UAAU,aAAa,kBAAkB,IAAI,UAAU,OAAO;KACzF,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAAC,KAA8B;IACvE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,iBAAiB,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;IAC/D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,QAAQ,GACV,OAAO,MAAM,CAAC,qBAAqB,KAAK,QAAQ,IAAI,MAAM,CAAC,qBAAqB,GAAG,CAAC;QAChF,CAAC,CAAC,MAAM,CAAC,qBAAqB;QAC9B,CAAC,CAAC,gCAAgC,CAAC;IAE3C,MAAM,QAAQ,GAAG,yBAAyB,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAE3E,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,kBAAkB,QAAQ,CAAC,WAAW,IAAI,CAAC,CAAC;IACvD,IAAI,QAAQ,CAAC,wBAAwB,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,+BAA+B,QAAQ,CAAC,wBAAwB,IAAI,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,iBAAiB,EAAE,IAAI,EAAE,IAAI,YAAY,CAAC,SAAS,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;QACpF,IAAI,CAAC;YACD,wBAAwB,CAAC,YAAY,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;QACxE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,GAAG,EAAE,IAAI,EAAE,CAAC,kDAAkD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/E,CAAC;IACL,CAAC;IAED,MAAM,UAAU,GAAG,uBAAuB,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1E,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,EAAE,GAAG,YAAY,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;IAC3C,IAAI,EAAE,EAAE,CAAC;QACL,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,OAAO;QACH,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QACvB,kBAAkB,EAAE,QAAQ,CAAC,WAAW;KAC3C,CAAC;AACN,CAAC"}
|