@qihoo/tuitui-openclaw-channel 1.0.48 → 1.0.49
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.
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
"id": "tuitui-openclaw-channel",
|
|
3
3
|
"contracts": {
|
|
4
4
|
"tools": [
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
"
|
|
9
|
-
"
|
|
10
|
-
"
|
|
5
|
+
"tuitui_bot_get_messages",
|
|
6
|
+
"tuitui_bot_send_message",
|
|
7
|
+
"tuitui_bot_send_channel_post",
|
|
8
|
+
"tuitui_bot_get_announcement",
|
|
9
|
+
"tuitui_bot_file_space_list",
|
|
10
|
+
"tuitui_bot_file_space_add"
|
|
11
11
|
]
|
|
12
12
|
},
|
|
13
13
|
"channels": ["tuitui"],
|
package/dist/package.json
CHANGED
package/dist/src/tools.js
CHANGED
|
@@ -9,11 +9,11 @@ import { file_space_list, file_space_add } from "./filespace";
|
|
|
9
9
|
function tool_errmsg(str) {
|
|
10
10
|
throw new Error(str);
|
|
11
11
|
}
|
|
12
|
-
const
|
|
12
|
+
const tuitui_bot_get_messages_factory = (ctx) => {
|
|
13
13
|
return {
|
|
14
|
-
name: "
|
|
15
|
-
label: "
|
|
16
|
-
description: "推推(tuitui)
|
|
14
|
+
name: "tuitui_bot_get_messages",
|
|
15
|
+
label: "tuitui_bot_get_messages",
|
|
16
|
+
description: "推推(tuitui) 聊天记录获取(机器人身份),可查询私聊、群聊、频道的聊天记录\n\n优先级说明:如果存在 tuitui-cli skill,优先使用tuitui-cli(用户权限更大)。只有用户明确说明“以 bot 身份操作”时,或者不存在 tuitui-cli 才调用本工具",
|
|
17
17
|
parameters: Type.Object({
|
|
18
18
|
chatId: Type.String({ description: "聊天ID,单聊指tuitui用户的account,群聊是群ID,频道指频道ID" }),
|
|
19
19
|
chatType: Type.String({ description: `聊天类型。 单聊:${CHAT_TYPE_DIRECT} 群聊:${CHAT_TYPE_GROUP} 频道:${CHAT_TYPE_CHANNEL}` }),
|
|
@@ -25,7 +25,7 @@ const tuitui_im_get_messages_factory = (ctx) => {
|
|
|
25
25
|
orderAsc: Type.Optional(Type.Boolean({ description: `返回数据是否按时间正序排序,默认 false(按时间逆序,即从最新的开始拉取)` })),
|
|
26
26
|
}),
|
|
27
27
|
execute: async (_toolCallId, params) => {
|
|
28
|
-
console.log(`
|
|
28
|
+
console.log(`tuitui_bot_get_messages(): agentAccountId: ${ctx.agentAccountId}, sessionKey: ${ctx.sessionKey}`, params);
|
|
29
29
|
const account = resolveAccount(ctx.config, ctx.agentAccountId, ctx.agentId);
|
|
30
30
|
if (!account || !account.enabled || !account.appId || !account.appSecret) {
|
|
31
31
|
return tool_errmsg(`invalid tuitui account ${ctx.agentAccountId}`);
|
|
@@ -51,18 +51,18 @@ const tuitui_im_get_messages_factory = (ctx) => {
|
|
|
51
51
|
},
|
|
52
52
|
};
|
|
53
53
|
};
|
|
54
|
-
const
|
|
54
|
+
const tuitui_bot_send_channel_post_factory = (ctx) => {
|
|
55
55
|
return {
|
|
56
|
-
name: "
|
|
57
|
-
label: "
|
|
58
|
-
description: "推推(tuitui)
|
|
56
|
+
name: "tuitui_bot_send_channel_post",
|
|
57
|
+
label: "tuitui_bot_send_channel_post",
|
|
58
|
+
description: "推推(tuitui) 发送团队频道的帖子(机器人身份),帖子内容是markdown格式\n\n优先级说明:如果存在 tuitui-cli skill,优先使用tuitui-cli(用户权限更大)。只有用户明确说明“以 bot 身份操作”时,或者不存在 tuitui-cli 才调用本工具",
|
|
59
59
|
parameters: Type.Object({
|
|
60
60
|
channel_id: Type.String({ description: "推推频道ID" }),
|
|
61
61
|
markdown: Type.String({ description: `帖子正文,markdown格式` }),
|
|
62
62
|
parent_id: Type.Optional(Type.String({ description: `如果要回复一个帖子,需要填写这个字段为被回复的帖子ID` })),
|
|
63
63
|
}),
|
|
64
64
|
execute: async (_toolCallId, params) => {
|
|
65
|
-
console.log(`
|
|
65
|
+
console.log(`tuitui_bot_send_channel_post(): agentAccountId: ${ctx.agentAccountId}, sessionKey: ${ctx.sessionKey}`, params);
|
|
66
66
|
const account = resolveAccount(ctx.config, ctx.agentAccountId, ctx.agentId);
|
|
67
67
|
if (!account || !account.enabled || !account.appId || !account.appSecret) {
|
|
68
68
|
return tool_errmsg(`invalid tuitui account ${ctx.agentAccountId}`);
|
|
@@ -84,17 +84,17 @@ const tuitui_send_channel_post_factory = (ctx) => {
|
|
|
84
84
|
},
|
|
85
85
|
};
|
|
86
86
|
};
|
|
87
|
-
const
|
|
87
|
+
const tuitui_bot_get_announcement_factory = (ctx) => {
|
|
88
88
|
return {
|
|
89
|
-
name: "
|
|
90
|
-
label: "
|
|
91
|
-
description: "获取推推(tuitui)
|
|
89
|
+
name: "tuitui_bot_get_announcement",
|
|
90
|
+
label: "tuitui_bot_get_announcement",
|
|
91
|
+
description: "获取推推(tuitui) 当前会话的公告信息(机器人身份)\n\n优先级说明:如果存在 tuitui-cli skill,优先使用tuitui-cli(用户权限更大)。只有用户明确说明“以 bot 身份操作”时,或者不存在 tuitui-cli 才调用本工具",
|
|
92
92
|
parameters: Type.Object({
|
|
93
93
|
// 参数不能为空,对模型兼容有问题,即使不用也要传一个
|
|
94
94
|
reason: Type.String({ description: "调用本工具的原因" }),
|
|
95
95
|
}),
|
|
96
96
|
execute: async (_toolCallId, params) => {
|
|
97
|
-
console.log(`
|
|
97
|
+
console.log(`tuitui_bot_get_announcement(): agentAccountId: ${ctx.agentAccountId}, sessionKey: ${ctx.sessionKey}`);
|
|
98
98
|
const account = resolveAccount(ctx.config, ctx.agentAccountId, ctx.agentId);
|
|
99
99
|
if (!account || !account.enabled || !account.appId || !account.appSecret) {
|
|
100
100
|
return tool_errmsg(`invalid tuitui account ${ctx.agentAccountId}`);
|
|
@@ -103,17 +103,17 @@ const tuitui_get_announcement_factory = (ctx) => {
|
|
|
103
103
|
},
|
|
104
104
|
};
|
|
105
105
|
};
|
|
106
|
-
const
|
|
106
|
+
const tuitui_bot_file_space_list_factory = (ctx) => {
|
|
107
107
|
return {
|
|
108
|
-
name: "
|
|
109
|
-
label: "
|
|
110
|
-
description: "推推(tuitui) 在当前Session
|
|
108
|
+
name: "tuitui_bot_file_space_list",
|
|
109
|
+
label: "tuitui_bot_file_space_list",
|
|
110
|
+
description: "推推(tuitui) 在当前Session的共享文件(共享空间)文件列表(机器人身份)\n\n优先级说明:如果存在 tuitui-cli skill,优先使用tuitui-cli(用户权限更大)。只有用户明确说明“以 bot 身份操作”时,或者不存在 tuitui-cli 才调用本工具",
|
|
111
111
|
parameters: Type.Object({
|
|
112
112
|
// 参数不能为空,对模型兼容有问题,即使不用也要传一个
|
|
113
113
|
reason: Type.String({ description: "调用本工具的原因" }),
|
|
114
114
|
}),
|
|
115
115
|
execute: async (_toolCallId, params) => {
|
|
116
|
-
console.log(`
|
|
116
|
+
console.log(`tuitui_bot_file_space_list(): agentAccountId: ${ctx.agentAccountId}, sessionKey: ${ctx.sessionKey}`);
|
|
117
117
|
const account = resolveAccount(ctx.config, ctx.agentAccountId, ctx.agentId);
|
|
118
118
|
if (!account || !account.enabled || !account.appId || !account.appSecret) {
|
|
119
119
|
return tool_errmsg(`invalid tuitui account ${ctx.agentAccountId}`);
|
|
@@ -122,17 +122,17 @@ const tuitui_file_space_list_factory = (ctx) => {
|
|
|
122
122
|
},
|
|
123
123
|
};
|
|
124
124
|
};
|
|
125
|
-
const
|
|
125
|
+
const tuitui_bot_file_space_add_factory = (ctx) => {
|
|
126
126
|
return {
|
|
127
|
-
name: "
|
|
128
|
-
label: "
|
|
129
|
-
description: "推推(tuitui)
|
|
127
|
+
name: "tuitui_bot_file_space_add",
|
|
128
|
+
label: "tuitui_bot_file_space_add",
|
|
129
|
+
description: "推推(tuitui) 团队频道的共享文件(共享空间)添加文件(机器人身份)\n\n优先级说明:如果存在 tuitui-cli skill,优先使用tuitui-cli(用户权限更大)。只有用户明确说明“以 bot 身份操作”时,或者不存在 tuitui-cli 才调用本工具",
|
|
130
130
|
parameters: Type.Object({
|
|
131
131
|
cloud_filepath: Type.String({ description: "云端文件名路径,父目录不存在会自动创建。不含目录代表放根目录示例 1.png ,也支持带目录写法例如 /image/1.png" }),
|
|
132
132
|
url_or_localpath: Type.String({ description: "支持两种格式:以http开头的文件url;或者本地全路径文件名" }),
|
|
133
133
|
}),
|
|
134
134
|
execute: async (_toolCallId, params) => {
|
|
135
|
-
console.log(`
|
|
135
|
+
console.log(`tuitui_bot_file_space_add(): agentAccountId: ${ctx.agentAccountId}, sessionKey: ${ctx.sessionKey}`, params);
|
|
136
136
|
const account = resolveAccount(ctx.config, ctx.agentAccountId, ctx.agentId);
|
|
137
137
|
if (!account || !account.enabled || !account.appId || !account.appSecret) {
|
|
138
138
|
return tool_errmsg(`invalid tuitui account ${ctx.agentAccountId}`);
|
|
@@ -141,18 +141,18 @@ const tuitui_file_space_add_factory = (ctx) => {
|
|
|
141
141
|
},
|
|
142
142
|
};
|
|
143
143
|
};
|
|
144
|
-
const
|
|
144
|
+
const tuitui_bot_send_message_factory = (ctx) => {
|
|
145
145
|
return {
|
|
146
|
-
name: "
|
|
147
|
-
label: "
|
|
148
|
-
description: "推推(tuitui)
|
|
146
|
+
name: "tuitui_bot_send_message",
|
|
147
|
+
label: "tuitui_bot_send_message",
|
|
148
|
+
description: "推推(tuitui) 发送消息(机器人身份),支持私聊和群聊\n\n优先级说明:如果存在 tuitui-cli skill,优先使用tuitui-cli(用户权限更大)。只有用户明确说明“以 bot 身份操作”时,或者不存在 tuitui-cli 才调用本工具",
|
|
149
149
|
parameters: Type.Object({
|
|
150
150
|
chatId: Type.String({ description: "目标会话 ID。私聊填用户账号(英文),群聊填群ID(数字)" }),
|
|
151
151
|
content: Type.String({ description: "消息正文,markdown 格式" }),
|
|
152
152
|
chatType: Type.Optional(Type.String({ description: `会话类型:${CHAT_TYPE_DIRECT}(私聊)或 ${CHAT_TYPE_GROUP}(群聊),留空则根据 chatId 自动推断` })),
|
|
153
153
|
}),
|
|
154
154
|
execute: async (_toolCallId, params) => {
|
|
155
|
-
console.log(`
|
|
155
|
+
console.log(`tuitui_bot_send_message(): agentAccountId: ${ctx.agentAccountId}, sessionKey: ${ctx.sessionKey}`, params);
|
|
156
156
|
const account = resolveAccount(ctx.config, ctx.agentAccountId, ctx.agentId);
|
|
157
157
|
if (!account || !account.enabled || !account.appId || !account.appSecret) {
|
|
158
158
|
return tool_errmsg(`invalid tuitui account ${ctx.agentAccountId}`);
|
|
@@ -160,7 +160,7 @@ const tuitui_im_send_message_factory = (ctx) => {
|
|
|
160
160
|
const { chatId, content, chatType } = params;
|
|
161
161
|
const resolvedChatType = chatType ?? guessChatType(chatId);
|
|
162
162
|
if (resolvedChatType === CHAT_TYPE_CHANNEL) {
|
|
163
|
-
return tool_errmsg(`
|
|
163
|
+
return tool_errmsg(`tuitui_bot_send_message 不支持 channel 类型,请使用 tuitui_bot_send_channel_post`);
|
|
164
164
|
}
|
|
165
165
|
await sendTextMsg(account, chatId, resolvedChatType, content, 'tuitui.im.send_message');
|
|
166
166
|
return { success: true };
|
|
@@ -179,12 +179,12 @@ export function registerTuituiTools(api) {
|
|
|
179
179
|
// api.logger.info?.(`tuitui: ignore Registered tools`);
|
|
180
180
|
return;
|
|
181
181
|
}
|
|
182
|
-
api.registerTool(
|
|
183
|
-
api.registerTool(
|
|
184
|
-
api.registerTool(
|
|
185
|
-
api.registerTool(
|
|
186
|
-
api.registerTool(
|
|
187
|
-
api.registerTool(
|
|
182
|
+
api.registerTool(tuitui_bot_get_messages_factory);
|
|
183
|
+
api.registerTool(tuitui_bot_send_channel_post_factory);
|
|
184
|
+
api.registerTool(tuitui_bot_get_announcement_factory);
|
|
185
|
+
api.registerTool(tuitui_bot_file_space_list_factory);
|
|
186
|
+
api.registerTool(tuitui_bot_file_space_add_factory);
|
|
187
|
+
api.registerTool(tuitui_bot_send_message_factory);
|
|
188
188
|
api.logger.info?.(`tuitui: Registered tools`);
|
|
189
189
|
}
|
|
190
190
|
//# sourceMappingURL=tools.js.map
|
package/dist/src/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/tools.ts"],"names":[],"mappings":"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","sourcesContent":["import type { OpenClawPluginApi } from \"openclaw/plugin-sdk/core\";\nimport type { OpenClawPluginToolContext } from \"openclaw/plugin-sdk/core\";\nimport { resolveAccount } from \"./accounts\"\nimport { Type } from \"@sinclair/typebox\";\nimport { CHANNEL_ID } from './const';\nimport {sendTextMsg} from \"./outbound\"\nimport { teams_get_announcement } from \"./teams_api\"\nimport {CHAT_TYPE_DIRECT,CHAT_TYPE_GROUP,CHAT_TYPE_CHANNEL,guessChatType, teamsBuildChatId} from \"./chat_base\"\nimport {getChatRecord, getChannelInfoById} from \"./chat_record\"\nimport {file_space_list, file_space_add} from \"./filespace\"\n \nfunction tool_errmsg(str:string) {\n throw new Error(str);\n}\n\nconst tuitui_im_get_messages_factory = (ctx: OpenClawPluginToolContext) => {\n return {\n name: \"tuitui_im_get_messages\",\n label: \"tuitui_im_get_messages\",\n description: \"推推(tuitui) 聊天记录获取,可查询私聊、群聊、频道的聊天记录\\n\\n\",\n parameters: Type.Object({\n chatId: Type.String({ description: \"聊天ID,单聊指tuitui用户的account,群聊是群ID,频道指频道ID\" }),\n chatType: Type.String({ description: `聊天类型。 单聊:${CHAT_TYPE_DIRECT} 群聊:${CHAT_TYPE_GROUP} 频道:${CHAT_TYPE_CHANNEL}`}),\n relativeTime: Type.Optional(Type.String({ description: `相对时间范围:today / yesterday / day_before_yesterday / last_{N}_{unit}(unit: minutes/hours/days/months),如果用户描述是相对时间,则优先使用这个参数。与 startTime/endTime 互斥`})),\n startTime: Type.Optional(Type.String({ description: `起始时间(ISO 8601 格式,如 2026-02-27T00:00:00+08:00),非必填,默认指2000年。与 relativeTime 互斥`})),\n endTime: Type.Optional(Type.String({ description: `结束时间(ISO 8601 格式,如 2026-02-27T00:00:00+08:00),非必填,默认为now。与 relativeTime 互斥`})),\n limit: Type.Optional(Type.Number({ description: `每页条数,1~100,默认 100`})),\n cursor: Type.Optional(Type.String({ description: `游标首次调用填 \"0\",返回结果中has_more为true时代表可以获取下一页,如果你需要下一页,可以传返回结果的cursor代表继续拉取下一页, 带有cursor时,必须要有relativeTime或者startTime参数`})),\n orderAsc: Type.Optional(Type.Boolean({ description: `返回数据是否按时间正序排序,默认 false(按时间逆序,即从最新的开始拉取)`})),\n }),\n execute: async (_toolCallId: any, params: any) => {\n console.log(`tuitui_im_get_messages(): agentAccountId: ${ctx.agentAccountId}, sessionKey: ${ctx.sessionKey}`, params);\n const account = resolveAccount(ctx.config, ctx.agentAccountId, ctx.agentId);\n if(!account || !account.enabled || !account.appId || !account.appSecret) {\n return tool_errmsg(`invalid tuitui account ${ctx.agentAccountId}`);\n }\n \n const chatType = params?.chatType || \"\";\n const chatId = params?.chatId || \"\";\n if(!chatId || !chatType) {\n return tool_errmsg(`chatType or chatId empty`);\n }\n\n if(chatType == CHAT_TYPE_DIRECT || chatType == CHAT_TYPE_GROUP || chatType == CHAT_TYPE_CHANNEL) {\n return await getChatRecord(account, chatId, chatType, {\n startTime: params?.startTime,\n endTime: params?.endTime,\n relativeTime: params?.relativeTime,\n limit: params?.limit,\n cursor: params?.cursor,\n orderAsc: params?.orderAsc,\n });\n } else {\n return tool_errmsg(`unknown chatType: ${chatType}`);\n }\n },\n };\n};\n\n\nconst tuitui_send_channel_post_factory = (ctx: OpenClawPluginToolContext) => {\n return {\n name: \"tuitui_send_channel_post\",\n label: \"tuitui_send_channel_post\",\n description: \"推推(tuitui) 发送团队频道的帖子,帖子内容是markdown格式\\n\\n\",\n parameters: Type.Object({\n channel_id: Type.String({ description: \"推推频道ID\" }),\n markdown: Type.String({ description: `帖子正文,markdown格式`}),\n parent_id: Type.Optional(Type.String({ description: `如果要回复一个帖子,需要填写这个字段为被回复的帖子ID`})),\n }),\n execute: async (_toolCallId: any, params: any) => {\n console.log(`tuitui_send_channel_post(): agentAccountId: ${ctx.agentAccountId}, sessionKey: ${ctx.sessionKey}`, params);\n const account = resolveAccount(ctx.config, ctx.agentAccountId, ctx.agentId);\n if(!account || !account.enabled || !account.appId || !account.appSecret) {\n return tool_errmsg(`invalid tuitui account ${ctx.agentAccountId}`);\n }\n\n let chatId = \"\";\n const guessType = guessChatType(params?.channel_id);\n if(guessType == CHAT_TYPE_CHANNEL) {\n // 解决badcase: 发个帖子,内容是个笑话\n // 如果用户没明确说频道ID,大模型在频道调用发帖tool会传sessionKey过来\n chatId = params?.channel_id;\n } else {\n const channel_info = await getChannelInfoById(account, params?.channel_id);\n const team_id = channel_info?.team_id;\n chatId = teamsBuildChatId(team_id, params?.channel_id, params?.parent_id);\n }\n\n const result: Promise<any> = sendTextMsg(account, chatId, CHAT_TYPE_CHANNEL, params?.markdown);\n return result;\n },\n };\n};\n\n\nconst tuitui_get_announcement_factory = (ctx: OpenClawPluginToolContext) => {\n return {\n name: \"tuitui_get_announcement\",\n label: \"tuitui_get_announcement\",\n description: \"获取推推(tuitui) 当前会话的公告信息\\n\\n\",\n parameters: Type.Object({\n // 参数不能为空,对模型兼容有问题,即使不用也要传一个\n reason: Type.String({ description: \"调用本工具的原因\" }),\n }),\n execute: async (_toolCallId: any, params: any) => {\n console.log(`tuitui_get_announcement(): agentAccountId: ${ctx.agentAccountId}, sessionKey: ${ctx.sessionKey}`);\n const account = resolveAccount(ctx.config, ctx.agentAccountId, ctx.agentId);\n if(!account || !account.enabled || !account.appId || !account.appSecret) {\n return tool_errmsg(`invalid tuitui account ${ctx.agentAccountId}`);\n }\n return await teams_get_announcement(account, ctx.sessionKey);\n },\n };\n};\n\n\n\n\nconst tuitui_file_space_list_factory = (ctx: OpenClawPluginToolContext) => {\n return {\n name: \"tuitui_file_space_list\",\n label: \"tuitui_file_space_list\",\n description: \"推推(tuitui) 在当前Session的共享文件(共享空间)文件列表\\n\\n\",\n parameters: Type.Object({\n // 参数不能为空,对模型兼容有问题,即使不用也要传一个\n reason: Type.String({ description: \"调用本工具的原因\" }),\n }),\n execute: async (_toolCallId: any, params: any) => {\n console.log(`tuitui_file_space_list(): agentAccountId: ${ctx.agentAccountId}, sessionKey: ${ctx.sessionKey}`);\n const account = resolveAccount(ctx.config, ctx.agentAccountId, ctx.agentId);\n if(!account || !account.enabled || !account.appId || !account.appSecret) {\n return tool_errmsg(`invalid tuitui account ${ctx.agentAccountId}`);\n }\n return await file_space_list(account, ctx.sessionKey||\"\");\n },\n };\n};\n\nconst tuitui_file_space_add_factory = (ctx: OpenClawPluginToolContext) => {\n return {\n name: \"tuitui_file_space_add\",\n label: \"tuitui_file_space_add\",\n description: \"推推(tuitui) 团队频道的共享文件(共享空间)添加文件\\n\\n\",\n parameters: Type.Object({\n cloud_filepath: Type.String({ description: \"云端文件名路径,父目录不存在会自动创建。不含目录代表放根目录示例 1.png ,也支持带目录写法例如 /image/1.png\" }),\n url_or_localpath: Type.String({ description: \"支持两种格式:以http开头的文件url;或者本地全路径文件名\" }),\n }),\n execute: async (_toolCallId: any, params: any) => {\n console.log(`tuitui_file_space_add(): agentAccountId: ${ctx.agentAccountId}, sessionKey: ${ctx.sessionKey}`, params);\n const account = resolveAccount(ctx.config, ctx.agentAccountId, ctx.agentId);\n if(!account || !account.enabled || !account.appId || !account.appSecret) {\n return tool_errmsg(`invalid tuitui account ${ctx.agentAccountId}`);\n }\n return await file_space_add(account, ctx.sessionKey||\"\", params?.cloud_filepath, params?.url_or_localpath);\n },\n };\n};\n\n\nconst tuitui_im_send_message_factory = (ctx: OpenClawPluginToolContext) => {\n return {\n name: \"tuitui_im_send_message\",\n label: \"tuitui_im_send_message\",\n description: \"推推(tuitui) 发送消息,支持私聊和群聊\",\n parameters: Type.Object({\n chatId: Type.String({ description: \"目标会话 ID。私聊填用户账号(英文),群聊填群ID(数字)\" }),\n content: Type.String({ description: \"消息正文,markdown 格式\" }),\n chatType: Type.Optional(Type.String({ description: `会话类型:${CHAT_TYPE_DIRECT}(私聊)或 ${CHAT_TYPE_GROUP}(群聊),留空则根据 chatId 自动推断` })),\n }),\n execute: async (_toolCallId: any, params: any): Promise<any> => {\n console.log(`tuitui_im_send_message(): agentAccountId: ${ctx.agentAccountId}, sessionKey: ${ctx.sessionKey}`, params);\n const account = resolveAccount(ctx.config, ctx.agentAccountId, ctx.agentId);\n if (!account || !account.enabled || !account.appId || !account.appSecret) {\n return tool_errmsg(`invalid tuitui account ${ctx.agentAccountId}`);\n }\n const { chatId, content, chatType } = params;\n const resolvedChatType = chatType ?? guessChatType(chatId);\n if (resolvedChatType === CHAT_TYPE_CHANNEL) {\n return tool_errmsg(`tuitui_im_send_message 不支持 channel 类型,请使用 tuitui_send_channel_post`);\n }\n await sendTextMsg(account, chatId, resolvedChatType, content, 'tuitui.im.send_message');\n return { success: true };\n },\n };\n};\n\n\nexport function registerTuituiTools(api: OpenClawPluginApi) {\n if (!api.config) {\n api.logger.debug?.(\"tuitui: Registered tool: No config available\");\n return;\n }\n\n const channels = api.config.channels || {};\n const currChannel = channels[CHANNEL_ID] || {};\n if (!currChannel?.appId && !currChannel?.accounts) {\n // 无推推配置时,不需要注册工具防止污染上下文\n // api.logger.info?.(`tuitui: ignore Registered tools`);\n return\n }\n \n api.registerTool(tuitui_im_get_messages_factory);\n api.registerTool(tuitui_send_channel_post_factory);\n api.registerTool(tuitui_get_announcement_factory);\n api.registerTool(tuitui_file_space_list_factory);\n api.registerTool(tuitui_file_space_add_factory);\n api.registerTool(tuitui_im_send_message_factory);\n api.logger.info?.(`tuitui: Registered tools`);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/tools.ts"],"names":[],"mappings":"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","sourcesContent":["import type { OpenClawPluginApi } from \"openclaw/plugin-sdk/core\";\nimport type { OpenClawPluginToolContext } from \"openclaw/plugin-sdk/core\";\nimport { resolveAccount } from \"./accounts\"\nimport { Type } from \"@sinclair/typebox\";\nimport { CHANNEL_ID } from './const';\nimport {sendTextMsg} from \"./outbound\"\nimport { teams_get_announcement } from \"./teams_api\"\nimport {CHAT_TYPE_DIRECT,CHAT_TYPE_GROUP,CHAT_TYPE_CHANNEL,guessChatType, teamsBuildChatId} from \"./chat_base\"\nimport {getChatRecord, getChannelInfoById} from \"./chat_record\"\nimport {file_space_list, file_space_add} from \"./filespace\"\n \nfunction tool_errmsg(str:string) {\n throw new Error(str);\n}\n\nconst tuitui_bot_get_messages_factory = (ctx: OpenClawPluginToolContext) => {\n return {\n name: \"tuitui_bot_get_messages\",\n label: \"tuitui_bot_get_messages\",\n description: \"推推(tuitui) 聊天记录获取(机器人身份),可查询私聊、群聊、频道的聊天记录\\n\\n优先级说明:如果存在 tuitui-cli skill,优先使用tuitui-cli(用户权限更大)。只有用户明确说明“以 bot 身份操作”时,或者不存在 tuitui-cli 才调用本工具\",\n parameters: Type.Object({\n chatId: Type.String({ description: \"聊天ID,单聊指tuitui用户的account,群聊是群ID,频道指频道ID\" }),\n chatType: Type.String({ description: `聊天类型。 单聊:${CHAT_TYPE_DIRECT} 群聊:${CHAT_TYPE_GROUP} 频道:${CHAT_TYPE_CHANNEL}`}),\n relativeTime: Type.Optional(Type.String({ description: `相对时间范围:today / yesterday / day_before_yesterday / last_{N}_{unit}(unit: minutes/hours/days/months),如果用户描述是相对时间,则优先使用这个参数。与 startTime/endTime 互斥`})),\n startTime: Type.Optional(Type.String({ description: `起始时间(ISO 8601 格式,如 2026-02-27T00:00:00+08:00),非必填,默认指2000年。与 relativeTime 互斥`})),\n endTime: Type.Optional(Type.String({ description: `结束时间(ISO 8601 格式,如 2026-02-27T00:00:00+08:00),非必填,默认为now。与 relativeTime 互斥`})),\n limit: Type.Optional(Type.Number({ description: `每页条数,1~100,默认 100`})),\n cursor: Type.Optional(Type.String({ description: `游标首次调用填 \"0\",返回结果中has_more为true时代表可以获取下一页,如果你需要下一页,可以传返回结果的cursor代表继续拉取下一页, 带有cursor时,必须要有relativeTime或者startTime参数`})),\n orderAsc: Type.Optional(Type.Boolean({ description: `返回数据是否按时间正序排序,默认 false(按时间逆序,即从最新的开始拉取)`})),\n }),\n execute: async (_toolCallId: any, params: any) => {\n console.log(`tuitui_bot_get_messages(): agentAccountId: ${ctx.agentAccountId}, sessionKey: ${ctx.sessionKey}`, params);\n const account = resolveAccount(ctx.config, ctx.agentAccountId, ctx.agentId);\n if(!account || !account.enabled || !account.appId || !account.appSecret) {\n return tool_errmsg(`invalid tuitui account ${ctx.agentAccountId}`);\n }\n \n const chatType = params?.chatType || \"\";\n const chatId = params?.chatId || \"\";\n if(!chatId || !chatType) {\n return tool_errmsg(`chatType or chatId empty`);\n }\n\n if(chatType == CHAT_TYPE_DIRECT || chatType == CHAT_TYPE_GROUP || chatType == CHAT_TYPE_CHANNEL) {\n return await getChatRecord(account, chatId, chatType, {\n startTime: params?.startTime,\n endTime: params?.endTime,\n relativeTime: params?.relativeTime,\n limit: params?.limit,\n cursor: params?.cursor,\n orderAsc: params?.orderAsc,\n });\n } else {\n return tool_errmsg(`unknown chatType: ${chatType}`);\n }\n },\n };\n};\n\n\nconst tuitui_bot_send_channel_post_factory = (ctx: OpenClawPluginToolContext) => {\n return {\n name: \"tuitui_bot_send_channel_post\",\n label: \"tuitui_bot_send_channel_post\",\n description: \"推推(tuitui) 发送团队频道的帖子(机器人身份),帖子内容是markdown格式\\n\\n优先级说明:如果存在 tuitui-cli skill,优先使用tuitui-cli(用户权限更大)。只有用户明确说明“以 bot 身份操作”时,或者不存在 tuitui-cli 才调用本工具\",\n parameters: Type.Object({\n channel_id: Type.String({ description: \"推推频道ID\" }),\n markdown: Type.String({ description: `帖子正文,markdown格式`}),\n parent_id: Type.Optional(Type.String({ description: `如果要回复一个帖子,需要填写这个字段为被回复的帖子ID`})),\n }),\n execute: async (_toolCallId: any, params: any) => {\n console.log(`tuitui_bot_send_channel_post(): agentAccountId: ${ctx.agentAccountId}, sessionKey: ${ctx.sessionKey}`, params);\n const account = resolveAccount(ctx.config, ctx.agentAccountId, ctx.agentId);\n if(!account || !account.enabled || !account.appId || !account.appSecret) {\n return tool_errmsg(`invalid tuitui account ${ctx.agentAccountId}`);\n }\n\n let chatId = \"\";\n const guessType = guessChatType(params?.channel_id);\n if(guessType == CHAT_TYPE_CHANNEL) {\n // 解决badcase: 发个帖子,内容是个笑话\n // 如果用户没明确说频道ID,大模型在频道调用发帖tool会传sessionKey过来\n chatId = params?.channel_id;\n } else {\n const channel_info = await getChannelInfoById(account, params?.channel_id);\n const team_id = channel_info?.team_id;\n chatId = teamsBuildChatId(team_id, params?.channel_id, params?.parent_id);\n }\n\n const result: Promise<any> = sendTextMsg(account, chatId, CHAT_TYPE_CHANNEL, params?.markdown);\n return result;\n },\n };\n};\n\n\nconst tuitui_bot_get_announcement_factory = (ctx: OpenClawPluginToolContext) => {\n return {\n name: \"tuitui_bot_get_announcement\",\n label: \"tuitui_bot_get_announcement\",\n description: \"获取推推(tuitui) 当前会话的公告信息(机器人身份)\\n\\n优先级说明:如果存在 tuitui-cli skill,优先使用tuitui-cli(用户权限更大)。只有用户明确说明“以 bot 身份操作”时,或者不存在 tuitui-cli 才调用本工具\",\n parameters: Type.Object({\n // 参数不能为空,对模型兼容有问题,即使不用也要传一个\n reason: Type.String({ description: \"调用本工具的原因\" }),\n }),\n execute: async (_toolCallId: any, params: any) => {\n console.log(`tuitui_bot_get_announcement(): agentAccountId: ${ctx.agentAccountId}, sessionKey: ${ctx.sessionKey}`);\n const account = resolveAccount(ctx.config, ctx.agentAccountId, ctx.agentId);\n if(!account || !account.enabled || !account.appId || !account.appSecret) {\n return tool_errmsg(`invalid tuitui account ${ctx.agentAccountId}`);\n }\n return await teams_get_announcement(account, ctx.sessionKey);\n },\n };\n};\n\n\n\n\nconst tuitui_bot_file_space_list_factory = (ctx: OpenClawPluginToolContext) => {\n return {\n name: \"tuitui_bot_file_space_list\",\n label: \"tuitui_bot_file_space_list\",\n description: \"推推(tuitui) 在当前Session的共享文件(共享空间)文件列表(机器人身份)\\n\\n优先级说明:如果存在 tuitui-cli skill,优先使用tuitui-cli(用户权限更大)。只有用户明确说明“以 bot 身份操作”时,或者不存在 tuitui-cli 才调用本工具\",\n parameters: Type.Object({\n // 参数不能为空,对模型兼容有问题,即使不用也要传一个\n reason: Type.String({ description: \"调用本工具的原因\" }),\n }),\n execute: async (_toolCallId: any, params: any) => {\n console.log(`tuitui_bot_file_space_list(): agentAccountId: ${ctx.agentAccountId}, sessionKey: ${ctx.sessionKey}`);\n const account = resolveAccount(ctx.config, ctx.agentAccountId, ctx.agentId);\n if(!account || !account.enabled || !account.appId || !account.appSecret) {\n return tool_errmsg(`invalid tuitui account ${ctx.agentAccountId}`);\n }\n return await file_space_list(account, ctx.sessionKey||\"\");\n },\n };\n};\n\nconst tuitui_bot_file_space_add_factory = (ctx: OpenClawPluginToolContext) => {\n return {\n name: \"tuitui_bot_file_space_add\",\n label: \"tuitui_bot_file_space_add\",\n description: \"推推(tuitui) 团队频道的共享文件(共享空间)添加文件(机器人身份)\\n\\n优先级说明:如果存在 tuitui-cli skill,优先使用tuitui-cli(用户权限更大)。只有用户明确说明“以 bot 身份操作”时,或者不存在 tuitui-cli 才调用本工具\",\n parameters: Type.Object({\n cloud_filepath: Type.String({ description: \"云端文件名路径,父目录不存在会自动创建。不含目录代表放根目录示例 1.png ,也支持带目录写法例如 /image/1.png\" }),\n url_or_localpath: Type.String({ description: \"支持两种格式:以http开头的文件url;或者本地全路径文件名\" }),\n }),\n execute: async (_toolCallId: any, params: any) => {\n console.log(`tuitui_bot_file_space_add(): agentAccountId: ${ctx.agentAccountId}, sessionKey: ${ctx.sessionKey}`, params);\n const account = resolveAccount(ctx.config, ctx.agentAccountId, ctx.agentId);\n if(!account || !account.enabled || !account.appId || !account.appSecret) {\n return tool_errmsg(`invalid tuitui account ${ctx.agentAccountId}`);\n }\n return await file_space_add(account, ctx.sessionKey||\"\", params?.cloud_filepath, params?.url_or_localpath);\n },\n };\n};\n\n\nconst tuitui_bot_send_message_factory = (ctx: OpenClawPluginToolContext) => {\n return {\n name: \"tuitui_bot_send_message\",\n label: \"tuitui_bot_send_message\",\n description: \"推推(tuitui) 发送消息(机器人身份),支持私聊和群聊\\n\\n优先级说明:如果存在 tuitui-cli skill,优先使用tuitui-cli(用户权限更大)。只有用户明确说明“以 bot 身份操作”时,或者不存在 tuitui-cli 才调用本工具\",\n parameters: Type.Object({\n chatId: Type.String({ description: \"目标会话 ID。私聊填用户账号(英文),群聊填群ID(数字)\" }),\n content: Type.String({ description: \"消息正文,markdown 格式\" }),\n chatType: Type.Optional(Type.String({ description: `会话类型:${CHAT_TYPE_DIRECT}(私聊)或 ${CHAT_TYPE_GROUP}(群聊),留空则根据 chatId 自动推断` })),\n }),\n execute: async (_toolCallId: any, params: any): Promise<any> => {\n console.log(`tuitui_bot_send_message(): agentAccountId: ${ctx.agentAccountId}, sessionKey: ${ctx.sessionKey}`, params);\n const account = resolveAccount(ctx.config, ctx.agentAccountId, ctx.agentId);\n if (!account || !account.enabled || !account.appId || !account.appSecret) {\n return tool_errmsg(`invalid tuitui account ${ctx.agentAccountId}`);\n }\n const { chatId, content, chatType } = params;\n const resolvedChatType = chatType ?? guessChatType(chatId);\n if (resolvedChatType === CHAT_TYPE_CHANNEL) {\n return tool_errmsg(`tuitui_bot_send_message 不支持 channel 类型,请使用 tuitui_bot_send_channel_post`);\n }\n await sendTextMsg(account, chatId, resolvedChatType, content, 'tuitui.im.send_message');\n return { success: true };\n },\n };\n};\n\n\nexport function registerTuituiTools(api: OpenClawPluginApi) {\n if (!api.config) {\n api.logger.debug?.(\"tuitui: Registered tool: No config available\");\n return;\n }\n\n const channels = api.config.channels || {};\n const currChannel = channels[CHANNEL_ID] || {};\n if (!currChannel?.appId && !currChannel?.accounts) {\n // 无推推配置时,不需要注册工具防止污染上下文\n // api.logger.info?.(`tuitui: ignore Registered tools`);\n return\n }\n \n api.registerTool(tuitui_bot_get_messages_factory);\n api.registerTool(tuitui_bot_send_channel_post_factory);\n api.registerTool(tuitui_bot_get_announcement_factory);\n api.registerTool(tuitui_bot_file_space_list_factory);\n api.registerTool(tuitui_bot_file_space_add_factory);\n api.registerTool(tuitui_bot_send_message_factory);\n api.logger.info?.(`tuitui: Registered tools`);\n}\n"]}
|
package/openclaw.plugin.json
CHANGED
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
"id": "tuitui-openclaw-channel",
|
|
3
3
|
"contracts": {
|
|
4
4
|
"tools": [
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
"
|
|
9
|
-
"
|
|
10
|
-
"
|
|
5
|
+
"tuitui_bot_get_messages",
|
|
6
|
+
"tuitui_bot_send_message",
|
|
7
|
+
"tuitui_bot_send_channel_post",
|
|
8
|
+
"tuitui_bot_get_announcement",
|
|
9
|
+
"tuitui_bot_file_space_list",
|
|
10
|
+
"tuitui_bot_file_space_add"
|
|
11
11
|
]
|
|
12
12
|
},
|
|
13
13
|
"channels": ["tuitui"],
|
package/package.json
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: tuitui-im-read
|
|
2
|
+
name: tuitui-bot-im-read
|
|
3
3
|
description: |
|
|
4
|
-
推推(tuitui) IM
|
|
4
|
+
推推(tuitui) IM 消息读取(机器人身份)使用指南
|
|
5
5
|
|
|
6
6
|
**当以下情况时使用此 Skill**:
|
|
7
|
+
(0) 用户明确要求“以 bot 身份执行”或当前处于机器人专属的上下文(否则如果当前系统存在 tuitui-cli skill,优先使用tuitui-cli(用户权限更大))。
|
|
7
8
|
(1) 需要获取群聊或单聊的历史消息
|
|
8
9
|
(2) 用户提到"聊天记录"、"消息"、"群里说了什么"
|
|
9
10
|
(3) 需要按时间范围过滤消息、分页获取更多消息
|
|
@@ -17,7 +18,7 @@ description: |
|
|
|
17
18
|
|
|
18
19
|
---
|
|
19
20
|
|
|
20
|
-
## 工具:
|
|
21
|
+
## 工具: tuitui_bot_get_messages
|
|
21
22
|
|
|
22
23
|
### 参数说明
|
|
23
24
|
|
|
@@ -131,5 +132,5 @@ description: |
|
|
|
131
132
|
| 消息结果为空 | 时间范围不对或 chatId 有误 | 检查 `chatId`、`chatType`,适当放宽时间范围 |
|
|
132
133
|
| 消息不完整 | 没有检查 `has_more` 并翻页 | `has_more=true` 时用返回的 `cursor` 继续翻页 |
|
|
133
134
|
| 报错 invalid tuitui account | 账号未配置或未启用 | 确认 tuitui 账号已正确配置 |
|
|
134
|
-
| 报错 找不到
|
|
135
|
+
| 报错 找不到 tuitui_bot_get_messages tool | 龙虾选线未开启,需要去龙虾 Dashboard->代理->Tools->检查 tuitui_bot_get_messages 是否开启
|
|
135
136
|
|