@xgjktech/xg_cwork_im 1.11.3 → 1.11.5

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 (53) hide show
  1. package/README.md +20 -10
  2. package/dist/index.d.ts +10 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/{index.ts → dist/index.js} +5 -9
  5. package/dist/index.js.map +1 -0
  6. package/dist/src/auth.d.ts +25 -0
  7. package/dist/src/auth.d.ts.map +1 -0
  8. package/{src/auth.ts → dist/src/auth.js} +55 -79
  9. package/dist/src/auth.js.map +1 -0
  10. package/dist/src/channel.d.ts +13 -0
  11. package/dist/src/channel.d.ts.map +1 -0
  12. package/{src/channel.ts → dist/src/channel.js} +252 -392
  13. package/dist/src/channel.js.map +1 -0
  14. package/dist/src/connection.d.ts +51 -0
  15. package/dist/src/connection.d.ts.map +1 -0
  16. package/{src/connection.ts → dist/src/connection.js} +63 -124
  17. package/dist/src/connection.js.map +1 -0
  18. package/dist/src/group-history-tool.d.ts +23 -0
  19. package/dist/src/group-history-tool.d.ts.map +1 -0
  20. package/{src/group-history-tool.ts → dist/src/group-history-tool.js} +168 -204
  21. package/dist/src/group-history-tool.js.map +1 -0
  22. package/dist/src/inbound-media-local.d.ts +40 -0
  23. package/dist/src/inbound-media-local.d.ts.map +1 -0
  24. package/{src/inbound-media-local.ts → dist/src/inbound-media-local.js} +52 -90
  25. package/dist/src/inbound-media-local.js.map +1 -0
  26. package/dist/src/recommended-system-prompt.d.ts +3 -0
  27. package/dist/src/recommended-system-prompt.d.ts.map +1 -0
  28. package/dist/src/recommended-system-prompt.js +3 -0
  29. package/dist/src/recommended-system-prompt.js.map +1 -0
  30. package/dist/src/resource-file.d.ts +65 -0
  31. package/dist/src/resource-file.d.ts.map +1 -0
  32. package/{src/resource-file.ts → dist/src/resource-file.js} +80 -103
  33. package/dist/src/resource-file.js.map +1 -0
  34. package/dist/src/send-group-message-tool.d.ts +16 -0
  35. package/dist/src/send-group-message-tool.d.ts.map +1 -0
  36. package/{src/send-group-message-tool.ts → dist/src/send-group-message-tool.js} +17 -34
  37. package/dist/src/send-group-message-tool.js.map +1 -0
  38. package/dist/src/send-service.d.ts +34 -0
  39. package/dist/src/send-service.d.ts.map +1 -0
  40. package/dist/src/send-service.js +263 -0
  41. package/dist/src/send-service.js.map +1 -0
  42. package/{src/tool-json-result.ts → dist/src/tool-json-result.d.ts} +14 -24
  43. package/dist/src/tool-json-result.d.ts.map +1 -0
  44. package/dist/src/tool-json-result.js +20 -0
  45. package/dist/src/tool-json-result.js.map +1 -0
  46. package/{src/types.ts → dist/src/types.d.ts} +32 -95
  47. package/dist/src/types.d.ts.map +1 -0
  48. package/dist/src/types.js +32 -0
  49. package/dist/src/types.js.map +1 -0
  50. package/openclaw.plugin.json +6 -0
  51. package/package.json +7 -6
  52. package/src/recommended-system-prompt.ts +0 -3
  53. package/src/send-service.ts +0 -283
@@ -0,0 +1,263 @@
1
+ /**
2
+ * XG-IM 消息发送模块
3
+ *
4
+ * 调用 IM 接口将 AI 回复发送到指定群聊,并 @ 原始发送者。
5
+ * 支持 RICH_TEXT 与带资源 fileId 的 FILE 类型(attachments)。
6
+ */
7
+ import axios from "axios";
8
+ import { downloadMediaBuffer, formatFromFilename, resolveMaxAttachmentBytes, resolveResourceUploadUrl, uploadWholeResourceFile, } from "./resource-file.js";
9
+ function formatDeliverError(err) {
10
+ if (axios.isAxiosError(err)) {
11
+ const parts = [err.message];
12
+ if (err.code)
13
+ parts.push(`axiosCode=${err.code}`);
14
+ if (err.response?.status != null)
15
+ parts.push(`httpStatus=${err.response.status}`);
16
+ return parts.join(" ");
17
+ }
18
+ if (err instanceof Error)
19
+ return err.message;
20
+ return String(err);
21
+ }
22
+ /** 用于合并流式占位消息:trim 后非空才写入请求体 `msgId` */
23
+ function normalizePlaceholderMsgId(msgId) {
24
+ if (msgId == null)
25
+ return undefined;
26
+ const t = String(msgId).trim();
27
+ return t.length > 0 ? t : undefined;
28
+ }
29
+ /** 日志脱敏摘要:便于对照 IM 后台是否收到合并字段(不含完整密钥) */
30
+ function summarizePlaceholderMsgId(raw) {
31
+ if (raw == null)
32
+ return "input=null";
33
+ const n = normalizePlaceholderMsgId(raw);
34
+ if (!n)
35
+ return raw === "" ? "empty-string" : "whitespace-only";
36
+ if (n.length <= 18)
37
+ return `full=${n}`;
38
+ return `len=${n.length} ${n.slice(0, 8)}…${n.slice(-4)}`;
39
+ }
40
+ /**
41
+ * 发消息接口的重试参数。
42
+ *
43
+ * 总尝试次数 = 1(首次) + IM_SEND_MAX_RETRIES(重试) = 6,间隔约 1 秒。
44
+ * 仅对网络层瞬时错误(无响应 / 5xx / 408 / 429)重试;4xx 与业务 resultCode 错误视为永久失败,立即抛出。
45
+ */
46
+ const IM_SEND_MAX_RETRIES = 5;
47
+ const IM_SEND_RETRY_DELAY_MS = 1_000;
48
+ function delay(ms) {
49
+ return new Promise((resolve) => setTimeout(resolve, ms));
50
+ }
51
+ /**
52
+ * 判断错误是否值得重试。
53
+ *
54
+ * - axios 网络错误 / 超时 / 5xx / 408 / 429 → 重试
55
+ * - 4xx(其它)/ 业务 resultCode 错误(普通 Error)→ 永久失败,不重试
56
+ */
57
+ function isRetryableSendError(err) {
58
+ if (axios.isAxiosError(err)) {
59
+ const status = err.response?.status;
60
+ if (status === undefined)
61
+ return true;
62
+ if (status >= 500)
63
+ return true;
64
+ if (status === 408 || status === 429)
65
+ return true;
66
+ return false;
67
+ }
68
+ return false;
69
+ }
70
+ /** POST /im/message/send 相关日志:`log` 未传入或网关未绑定时仍输出到 console,避免「消息已发出却看不到接口日志」 */
71
+ function sendLogInfo(log, msg) {
72
+ if (typeof log?.info === "function") {
73
+ log.info(msg);
74
+ return;
75
+ }
76
+ const alt = log;
77
+ if (typeof alt?.log === "function") {
78
+ alt.log(msg);
79
+ return;
80
+ }
81
+ console.log(`[xg_cwork_im] ${msg}`);
82
+ }
83
+ function sendLogWarn(log, msg) {
84
+ if (typeof log?.warn === "function") {
85
+ log.warn(msg);
86
+ return;
87
+ }
88
+ sendLogInfo(log, msg);
89
+ }
90
+ function sendLogError(log, msg) {
91
+ if (typeof log?.error === "function") {
92
+ log.error(msg);
93
+ return;
94
+ }
95
+ console.error(`[xg_cwork_im] ${msg}`);
96
+ }
97
+ function sendLogDebug(log, config, msg) {
98
+ if (!config.debug)
99
+ return;
100
+ if (typeof log?.debug === "function") {
101
+ log.debug(msg);
102
+ return;
103
+ }
104
+ console.log(`[xg_cwork_im] ${msg}`);
105
+ }
106
+ async function postImMessage(config, token, groupId, body, atUserIds = [], log) {
107
+ const url = `${config.baseUrl}/im/message/send`;
108
+ const full = {
109
+ ...body,
110
+ groupId,
111
+ ...(atUserIds.length > 0 ? { atUserIds } : {}),
112
+ };
113
+ const bodyMsgIdRaw = full.msgId;
114
+ const bodyMsgId = typeof bodyMsgIdRaw === "string" ? bodyMsgIdRaw : undefined;
115
+ const mergedPlaceholder = normalizePlaceholderMsgId(bodyMsgId);
116
+ sendLogInfo(log, `[cwork_im:send] POST ${url} groupId=${groupId} type=${full.type} ` +
117
+ `placeholderRaw=${summarizePlaceholderMsgId(bodyMsgId)} ` +
118
+ `mergeFieldInJson=${mergedPlaceholder != null ? `yes(len=${mergedPlaceholder.length})` : "no"} ` +
119
+ `atUsers=${JSON.stringify(atUserIds)}`);
120
+ sendLogDebug(log, config, `[cwork_im:send] Request body: ${JSON.stringify(full)}`);
121
+ const totalAttempts = 1 + IM_SEND_MAX_RETRIES;
122
+ let lastErr = undefined;
123
+ for (let attempt = 1; attempt <= totalAttempts; attempt++) {
124
+ try {
125
+ const res = await axios.post(url, full, {
126
+ headers: {
127
+ "Content-Type": "application/json",
128
+ "access-token": token,
129
+ },
130
+ timeout: 10_000,
131
+ });
132
+ sendLogInfo(log, `[cwork_im:send] Response status=${res.status} (attempt=${attempt}/${totalAttempts})`);
133
+ sendLogDebug(log, config, `[cwork_im:send] Response body: ${JSON.stringify(res.data)}`);
134
+ // Detect business-level errors that arrive with HTTP 200.
135
+ // IM API unified response: { data, resultCode: 1, resultMsg: "" } — resultCode=1 means success.
136
+ const d = res.data;
137
+ if (d && typeof d === "object") {
138
+ const resultCode = d.resultCode;
139
+ const resultMsg = d.resultMsg;
140
+ if (resultCode !== undefined && resultCode !== 1) {
141
+ throw new Error(`IM API error resultCode=${resultCode}${resultMsg ? ` resultMsg=${resultMsg}` : ""}`);
142
+ }
143
+ }
144
+ return;
145
+ }
146
+ catch (err) {
147
+ lastErr = err;
148
+ const msg = formatDeliverError(err);
149
+ const retryable = isRetryableSendError(err);
150
+ const isLast = attempt >= totalAttempts;
151
+ if (!retryable || isLast) {
152
+ sendLogError(log, `[cwork_im:send] Failed to send message to groupId=${groupId} ` +
153
+ `(attempt=${attempt}/${totalAttempts}, retryable=${retryable}): ${msg}`);
154
+ throw err;
155
+ }
156
+ sendLogWarn(log, `[cwork_im:send] Send failed (attempt=${attempt}/${totalAttempts}), ` +
157
+ `retrying in ${IM_SEND_RETRY_DELAY_MS}ms: ${msg}`);
158
+ await delay(IM_SEND_RETRY_DELAY_MS);
159
+ }
160
+ }
161
+ // 理论上不可达:上面循环里要么 return 要么 throw。这里只是给 TS 一个安全兜底。
162
+ throw lastErr ?? new Error("[cwork_im:send] Send failed after retries");
163
+ }
164
+ /**
165
+ * 将 deliver 块发到 IM:若有媒体则先 POST baseUrl/file/upDownload/uploadWholeFile 再发 FILE;否则发 RICH_TEXT。
166
+ */
167
+ export async function sendReplyDeliverBlock(config, token, groupId, payload, atUserIds = [], log, msgId, reply) {
168
+ const placeholderMsgId = normalizePlaceholderMsgId(msgId);
169
+ if (msgId !== undefined && placeholderMsgId === undefined) {
170
+ sendLogWarn(log, `[cwork_im:send] sendReplyDeliverBlock: placeholder msgId omitted (empty/whitespace only after trim) raw=${JSON.stringify(msgId)}`);
171
+ }
172
+ const textToSend = (payload.markdown || payload.text || "").trim();
173
+ const mediaList = [
174
+ ...(payload.mediaUrl ? [payload.mediaUrl] : []),
175
+ ...((payload.mediaUrls ?? []).filter((u) => typeof u === "string" && u.trim())),
176
+ ];
177
+ const uniqueUrls = [...new Set(mediaList)];
178
+ const maxBytes = resolveMaxAttachmentBytes(config);
179
+ const formField = config.fileUploadFormField?.trim() || "file";
180
+ const wantFile = uniqueUrls.length > 0 && !payload.isThinking;
181
+ sendLogInfo(log, `[cwork_im:send] sendReplyDeliverBlock plan kind=${wantFile ? "FILE" : textToSend.length > 0 ? "RICH_TEXT" : "none"} ` +
182
+ `placeholder=${placeholderMsgId != null ? `merge(len=${placeholderMsgId.length})` : "no-merge"} ` +
183
+ `isThinking=${payload.isThinking ?? false}`);
184
+ if (wantFile) {
185
+ const fileUploadUrl = resolveResourceUploadUrl(config.baseUrl);
186
+ try {
187
+ const attachments = [];
188
+ for (const u of uniqueUrls) {
189
+ const { buffer, filename } = await downloadMediaBuffer(u, maxBytes, log);
190
+ const { fileId } = await uploadWholeResourceFile({
191
+ fileUploadUrl,
192
+ token,
193
+ buffer,
194
+ filename,
195
+ formField,
196
+ log,
197
+ });
198
+ attachments.push({
199
+ fileId,
200
+ fileType: "FILE",
201
+ format: formatFromFilename(filename),
202
+ name: filename,
203
+ size: buffer.length,
204
+ source: "resource",
205
+ });
206
+ }
207
+ const caption = textToSend.length > 0 ? textToSend : " ";
208
+ await postImMessage(config, token, groupId, {
209
+ type: "FILE",
210
+ text: caption,
211
+ attachments,
212
+ ...(placeholderMsgId ? { msgId: placeholderMsgId } : {}),
213
+ ...(reply ? { reply } : {}),
214
+ }, atUserIds, log);
215
+ return;
216
+ }
217
+ catch (err) {
218
+ sendLogError(log, `[cwork_im:send] FILE deliver failed, fallback to text if any: ${formatDeliverError(err)}`);
219
+ const errNote = `(文件发送失败:${formatDeliverError(err)})`;
220
+ const fallbackText = textToSend.length > 0 ? `${textToSend}\n\n${errNote}` : errNote;
221
+ await postImMessage(config, token, groupId, {
222
+ type: "RICH_TEXT",
223
+ text: fallbackText,
224
+ ...(placeholderMsgId ? { msgId: placeholderMsgId } : {}),
225
+ ...(reply ? { reply } : {}),
226
+ }, atUserIds, log);
227
+ return;
228
+ }
229
+ }
230
+ if (textToSend.length > 0) {
231
+ await postImMessage(config, token, groupId, {
232
+ type: "RICH_TEXT",
233
+ text: textToSend,
234
+ ...(placeholderMsgId ? { msgId: placeholderMsgId } : {}),
235
+ ...(reply ? { reply } : {}),
236
+ }, atUserIds, log);
237
+ }
238
+ }
239
+ /**
240
+ * 发送文本消息到指定 IM 群聊。
241
+ *
242
+ * @param config 插件配置
243
+ * @param token 鉴权 token
244
+ * @param groupId 目标群聊 ID(gid / groupId)
245
+ * @param content 消息内容文本
246
+ * @param atUserIds 需要 @ 的用户 ID 列表(可为空)
247
+ * @param log 日志接口
248
+ * @param msgId 可选的业务消息 ID(用于覆盖/更新已有消息)
249
+ * @param reply 可选的被回复消息信息(用于在 IM 中建立“回复某条消息”的关联)
250
+ */
251
+ export async function sendTextMessage(config, token, groupId, content, atUserIds = [], log, msgId, reply) {
252
+ const placeholderMsgId = normalizePlaceholderMsgId(msgId);
253
+ if (msgId !== undefined && placeholderMsgId === undefined) {
254
+ sendLogWarn(log, `[cwork_im:send] sendTextMessage: placeholder msgId omitted (empty/whitespace only after trim) raw=${JSON.stringify(msgId)}`);
255
+ }
256
+ await postImMessage(config, token, groupId, {
257
+ type: "RICH_TEXT",
258
+ text: content,
259
+ ...(placeholderMsgId ? { msgId: placeholderMsgId } : {}),
260
+ ...(reply ? { reply } : {}),
261
+ }, atUserIds, log);
262
+ }
263
+ //# sourceMappingURL=send-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-service.js","sourceRoot":"","sources":["../../src/send-service.ts"],"names":[],"mappings":"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"}
@@ -1,24 +1,14 @@
1
- import type { AnyAgentTool } from "openclaw/plugin-sdk";
2
-
3
- type ToolExecuteReturn = Awaited<ReturnType<NonNullable<AnyAgentTool["execute"]>>>;
4
-
5
- /**
6
- * 与 `openclaw/plugin-sdk` 的 `jsonResult` 返回结构一致(AgentToolResult),
7
- * 供工具 `execute` 使用。
8
- *
9
- * 部分环境下网关打包插件后,`import { jsonResult } from "openclaw/plugin-sdk"` 会变成
10
- * `_pluginSdk.jsonResult` 且值为 `undefined`,调用时报
11
- * `(0 , _pluginSdk.jsonResult) is not a function`。
12
- * 使用本函数可避免依赖该命名导出在打包产物中是否保留。
13
- */
14
- export function toolJsonResult(payload: unknown): ToolExecuteReturn {
15
- if (payload === undefined) {
16
- return { content: [{ type: "text", text: "" }] } as ToolExecuteReturn;
17
- }
18
- const text =
19
- typeof payload === "string" ? JSON.stringify(payload) : JSON.stringify(payload, null, 2);
20
- return {
21
- content: [{ type: "text", text }],
22
- details: payload,
23
- } as ToolExecuteReturn;
24
- }
1
+ import type { AnyAgentTool } from "openclaw/plugin-sdk";
2
+ type ToolExecuteReturn = Awaited<ReturnType<NonNullable<AnyAgentTool["execute"]>>>;
3
+ /**
4
+ * 与 `openclaw/plugin-sdk` 的 `jsonResult` 返回结构一致(AgentToolResult),
5
+ * 供工具 `execute` 使用。
6
+ *
7
+ * 部分环境下网关打包插件后,`import { jsonResult } from "openclaw/plugin-sdk"` 会变成
8
+ * `_pluginSdk.jsonResult` 且值为 `undefined`,调用时报
9
+ * `(0 , _pluginSdk.jsonResult) is not a function`。
10
+ * 使用本函数可避免依赖该命名导出在打包产物中是否保留。
11
+ */
12
+ export declare function toolJsonResult(payload: unknown): ToolExecuteReturn;
13
+ export {};
14
+ //# sourceMappingURL=tool-json-result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-json-result.d.ts","sourceRoot":"","sources":["../../src/tool-json-result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,KAAK,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AAEnF;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,iBAAiB,CAUlE"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * 与 `openclaw/plugin-sdk` 的 `jsonResult` 返回结构一致(AgentToolResult),
3
+ * 供工具 `execute` 使用。
4
+ *
5
+ * 部分环境下网关打包插件后,`import { jsonResult } from "openclaw/plugin-sdk"` 会变成
6
+ * `_pluginSdk.jsonResult` 且值为 `undefined`,调用时报
7
+ * `(0 , _pluginSdk.jsonResult) is not a function`。
8
+ * 使用本函数可避免依赖该命名导出在打包产物中是否保留。
9
+ */
10
+ export function toolJsonResult(payload) {
11
+ if (payload === undefined) {
12
+ return { content: [{ type: "text", text: "" }] };
13
+ }
14
+ const text = typeof payload === "string" ? JSON.stringify(payload) : JSON.stringify(payload, null, 2);
15
+ return {
16
+ content: [{ type: "text", text }],
17
+ details: payload,
18
+ };
19
+ }
20
+ //# sourceMappingURL=tool-json-result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-json-result.js","sourceRoot":"","sources":["../../src/tool-json-result.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC3C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAuB,CAAC;IAC1E,CAAC;IACD,MAAM,IAAI,GACN,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7F,OAAO;QACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACjC,OAAO,EAAE,OAAO;KACE,CAAC;AAC3B,CAAC"}
@@ -1,19 +1,7 @@
1
1
  /**
2
2
  * XG-IM Channel Plugin — 类型定义
3
3
  */
4
-
5
- import type {
6
- OpenClawConfig,
7
- OpenClawPluginApi,
8
- ChannelLogSink as SDKChannelLogSink,
9
- ChannelAccountSnapshot as SDKChannelAccountSnapshot,
10
- ChannelGatewayContext as SDKChannelGatewayContext,
11
- ChannelPlugin as SDKChannelPlugin,
12
- PluginRuntime,
13
- } from "openclaw/plugin-sdk";
14
-
15
- // ─── 插件模块 ───────────────────────────────────────────────────────────────
16
-
4
+ import type { OpenClawConfig, OpenClawPluginApi, ChannelAccountSnapshot as SDKChannelAccountSnapshot, ChannelGatewayContext as SDKChannelGatewayContext, ChannelPlugin as SDKChannelPlugin, PluginRuntime } from "openclaw/plugin-sdk";
17
5
  export interface XgImPluginModule {
18
6
  id: string;
19
7
  name: string;
@@ -21,12 +9,8 @@ export interface XgImPluginModule {
21
9
  configSchema?: unknown;
22
10
  register?: (api: OpenClawPluginApi) => void | Promise<void>;
23
11
  }
24
-
25
12
  /** 与 openclaw.plugin.json 中 id: xg_cwork_im 对应 */
26
13
  export type XgCworkImPluginModule = XgImPluginModule;
27
-
28
- // ─── Channel 配置 ────────────────────────────────────────────────────────────
29
-
30
14
  /** 单个机器人账户配置 */
31
15
  export interface XgImAccountConfig {
32
16
  /** 机器人 Key(新字段,优先于 appKey) */
@@ -62,11 +46,9 @@ export interface XgImAccountConfig {
62
46
  */
63
47
  systemPrompt?: string;
64
48
  }
65
-
66
49
  export interface XgImConfig extends OpenClawConfig {
67
50
  /** 多账户列表 */
68
51
  accounts?: Record<string, XgImAccountConfig>;
69
-
70
52
  /** 机器人 Key(新字段,优先于 appKey,单账户模式) */
71
53
  robotKey?: string;
72
54
  /** 机器人 appKey(单账户模式,已改名为 robotKey,此字段保留兼容旧配置) */
@@ -102,7 +84,6 @@ export interface XgImConfig extends OpenClawConfig {
102
84
  * - 仅用于保护「思考中」占位消息,避免长时间不被更新。
103
85
  */
104
86
  firstReplyTimeoutMs?: number;
105
-
106
87
  /**
107
88
  * 附件上传地址固定为 `{baseUrl}/file/upDownload/uploadWholeFile`,请求头 `access-token` 与发 IM 相同。
108
89
  * multipart 字段名默认 `file`,可通过 fileUploadFormField 覆盖。
@@ -110,7 +91,6 @@ export interface XgImConfig extends OpenClawConfig {
110
91
  fileUploadFormField?: string;
111
92
  /** 单个附件下载/上传允许的最大字节数,默认 50MB */
112
93
  maxAttachmentBytes?: number;
113
-
114
94
  /**
115
95
  * 若配置为非空相对路径(相对于当前 Agent workspace 根目录):入站附件会先下载到
116
96
  * `{workspace}/{本字段}/{userId}/{YYYY-MM-DD}/{name}_{HHmmssmmm}.ext`,再向 OpenClaw 传入 **workspace 相对路径**(默认 `./子目录/...`,便于沙箱挂载 `/workspace`)或 `file://`(见 `inboundMediaOpenClawPath`)。
@@ -130,9 +110,6 @@ export interface XgImConfig extends OpenClawConfig {
130
110
  */
131
111
  systemPrompt?: string;
132
112
  }
133
-
134
- // ─── IM 接口 Request / Response ─────────────────────────────────────────────
135
-
136
113
  /** GET /user/login/appkey 的响应 */
137
114
  export interface GetTokenResponse {
138
115
  data?: {
@@ -149,23 +126,18 @@ export interface GetTokenResponse {
149
126
  resultCode?: number;
150
127
  resultMsg?: string | null;
151
128
  }
152
-
153
129
  /** 机器人身份信息(认证成功后缓存) */
154
130
  export interface BotIdentity {
155
131
  token: string;
156
132
  userId: string;
157
133
  name: string;
158
134
  }
159
-
160
- // ─── WebSocket 消息 ──────────────────────────────────────────────────────────
161
-
162
135
  /** WebSocket 消息通知(cmd = robotMention) */
163
136
  export interface WsMessage {
164
137
  cmd: string;
165
138
  params: WsMessageParams;
166
139
  ts: number;
167
140
  }
168
-
169
141
  /**
170
142
  * 与 IM 服务 `MsgFileVO` 对齐的附件项(WebSocket `msgContent.files[]`)。
171
143
  */
@@ -186,38 +158,10 @@ export interface MsgFileVO {
186
158
  */
187
159
  content?: string;
188
160
  }
189
-
190
161
  /** @deprecated 使用 {@link MsgFileVO} */
191
162
  export type WsInboundFileItem = MsgFileVO;
192
-
193
163
  /** 常见 IM format → MIME,供 OpenClaw 媒体理解;未知格式返回 undefined */
194
- export function imFormatToMimeType(format: string | undefined): string | undefined {
195
- const f = format?.trim().toLowerCase();
196
- if (!f) return undefined;
197
- const map: Record<string, string> = {
198
- pdf: "application/pdf",
199
- png: "image/png",
200
- jpg: "image/jpeg",
201
- jpeg: "image/jpeg",
202
- gif: "image/gif",
203
- webp: "image/webp",
204
- doc: "application/msword",
205
- docx: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
206
- ppt: "application/vnd.ms-powerpoint",
207
- pptx: "application/vnd.openxmlformats-officedocument.presentationml.presentation",
208
- xls: "application/vnd.ms-excel",
209
- xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
210
- txt: "text/plain",
211
- md: "text/markdown",
212
- csv: "text/csv",
213
- zip: "application/zip",
214
- mp3: "audio/mpeg",
215
- wav: "audio/wav",
216
- mp4: "video/mp4",
217
- };
218
- return map[f];
219
- }
220
-
164
+ export declare function imFormatToMimeType(format: string | undefined): string | undefined;
221
165
  /**
222
166
  * 入站消息内容体(与 IM WebSocket `params.msgContent` 对齐)。
223
167
  *
@@ -234,7 +178,6 @@ export interface WsMessageContent {
234
178
  files?: MsgFileVO[];
235
179
  ext?: Record<string, any>;
236
180
  }
237
-
238
181
  /** robotMention 消息的 params */
239
182
  export interface WsMessageParams {
240
183
  msgId: string;
@@ -258,9 +201,6 @@ export interface WsMessageParams {
258
201
  /** 被 @ 的人员 ID 列表 */
259
202
  mentions?: string[] | null;
260
203
  }
261
-
262
- // ─── IM 发送消息 ─────────────────────────────────────────────────────────────
263
-
264
204
  /** POST /im/message/send 请求体 */
265
205
  export interface SendMessageReply {
266
206
  /** 被回复消息ID */
@@ -272,7 +212,6 @@ export interface SendMessageReply {
272
212
  /** 被回复消息摘要 */
273
213
  previewText: string;
274
214
  }
275
-
276
215
  /** IM 发送 FILE 类型消息时的附件项(与发消息接口约定一致) */
277
216
  export interface SendMessageFileAttachment {
278
217
  fileId: string;
@@ -285,42 +224,39 @@ export interface SendMessageFileAttachment {
285
224
  /** 固定为 resource */
286
225
  source: "resource";
287
226
  }
288
-
289
- export type SendMessageBody =
290
- | {
291
- type: "TEXT" | "RICH_TEXT" | "VOICE";
292
- groupId?: string;
293
- toUserId?: string;
294
- text: string;
295
- atUserIds?: string[];
296
- /** 流式占位消息 ID,用于将回复更新到对应的占位消息上 */
297
- msgId?: string;
298
- reply?: SendMessageReply;
299
- }
300
- | {
301
- type: "FILE";
302
- groupId?: string;
303
- toUserId?: string;
304
- text: string;
305
- attachments: SendMessageFileAttachment[];
306
- atUserIds?: string[];
307
- /** 流式占位消息 ID,用于将回复更新到对应的占位消息上 */
308
- msgId?: string;
309
- reply?: SendMessageReply;
310
- };
311
-
227
+ export type SendMessageBody = {
228
+ type: "TEXT" | "RICH_TEXT" | "VOICE";
229
+ groupId?: string;
230
+ toUserId?: string;
231
+ text: string;
232
+ atUserIds?: string[];
233
+ /** 流式占位消息 ID,用于将回复更新到对应的占位消息上 */
234
+ msgId?: string;
235
+ reply?: SendMessageReply;
236
+ } | {
237
+ type: "FILE";
238
+ groupId?: string;
239
+ toUserId?: string;
240
+ text: string;
241
+ attachments: SendMessageFileAttachment[];
242
+ atUserIds?: string[];
243
+ /** 流式占位消息 ID,用于将回复更新到对应的占位消息上 */
244
+ msgId?: string;
245
+ reply?: SendMessageReply;
246
+ };
312
247
  /** GET /im/message/getLatestMsgListForAI 响应 */
313
248
  export interface GetLatestMsgListResponse {
314
249
  data?: WsMessageParams[];
315
250
  resultCode?: number;
316
251
  message?: string;
317
252
  }
318
-
319
- // ─── OpenClaw 插件 SDK 类型别名 ───────────────────────────────────────────────
320
-
321
- export type ChannelLogSink = SDKChannelLogSink;
253
+ export type ChannelLogSink = {
254
+ info: (msg: string) => void;
255
+ warn: (msg: string) => void;
256
+ error: (msg: string) => void;
257
+ debug?: (msg: string) => void;
258
+ };
322
259
  export type ChannelAccountSnapshot = SDKChannelAccountSnapshot;
323
-
324
260
  export interface ResolvedAccount {
325
261
  accountId: string;
326
262
  config: XgImConfig;
@@ -328,9 +264,10 @@ export interface ResolvedAccount {
328
264
  configured: boolean;
329
265
  name?: string | null;
330
266
  }
331
-
332
267
  export type GatewayStartContext = SDKChannelGatewayContext<ResolvedAccount>;
333
- export type XgImChannelPlugin = SDKChannelPlugin<ResolvedAccount & { configured: boolean }>;
334
-
268
+ export type XgImChannelPlugin = SDKChannelPlugin<ResolvedAccount & {
269
+ configured: boolean;
270
+ }>;
335
271
  /** PluginRuntime 的类型(内部 API 丰富,用 any 表示) */
336
272
  export type { PluginRuntime };
273
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * XG-IM Channel Plugin — 类型定义
3
+ */
4
+ /** 常见 IM format → MIME,供 OpenClaw 媒体理解;未知格式返回 undefined */
5
+ export function imFormatToMimeType(format) {
6
+ const f = format?.trim().toLowerCase();
7
+ if (!f)
8
+ return undefined;
9
+ const map = {
10
+ pdf: "application/pdf",
11
+ png: "image/png",
12
+ jpg: "image/jpeg",
13
+ jpeg: "image/jpeg",
14
+ gif: "image/gif",
15
+ webp: "image/webp",
16
+ doc: "application/msword",
17
+ docx: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
18
+ ppt: "application/vnd.ms-powerpoint",
19
+ pptx: "application/vnd.openxmlformats-officedocument.presentationml.presentation",
20
+ xls: "application/vnd.ms-excel",
21
+ xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
22
+ txt: "text/plain",
23
+ md: "text/markdown",
24
+ csv: "text/csv",
25
+ zip: "application/zip",
26
+ mp3: "audio/mpeg",
27
+ wav: "audio/wav",
28
+ mp4: "video/mp4",
29
+ };
30
+ return map[f];
31
+ }
32
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AA6LH,2DAA2D;AAC3D,MAAM,UAAU,kBAAkB,CAAC,MAA0B;IACzD,MAAM,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACvC,IAAI,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACzB,MAAM,GAAG,GAA2B;QAChC,GAAG,EAAE,iBAAiB;QACtB,GAAG,EAAE,WAAW;QAChB,GAAG,EAAE,YAAY;QACjB,IAAI,EAAE,YAAY;QAClB,GAAG,EAAE,WAAW;QAChB,IAAI,EAAE,YAAY;QAClB,GAAG,EAAE,oBAAoB;QACzB,IAAI,EAAE,yEAAyE;QAC/E,GAAG,EAAE,+BAA+B;QACpC,IAAI,EAAE,2EAA2E;QACjF,GAAG,EAAE,0BAA0B;QAC/B,IAAI,EAAE,mEAAmE;QACzE,GAAG,EAAE,YAAY;QACjB,EAAE,EAAE,eAAe;QACnB,GAAG,EAAE,UAAU;QACf,GAAG,EAAE,iBAAiB;QACtB,GAAG,EAAE,YAAY;QACjB,GAAG,EAAE,WAAW;QAChB,GAAG,EAAE,WAAW;KACnB,CAAC;IACF,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -16,5 +16,11 @@
16
16
  "type": "object",
17
17
  "additionalProperties": true,
18
18
  "properties": {}
19
+ },
20
+ "contracts": {
21
+ "tools": [
22
+ "xg_cwork_im_get_group_chat_history",
23
+ "xg_cwork_im_send_group_message"
24
+ ]
19
25
  }
20
26
  }