@openclaw-china/channels 0.1.32 → 0.1.34
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/dist/index.d.ts +17 -2
- package/dist/index.js +46 -0
- package/dist/index.js.map +1 -1
- package/openclaw.plugin.json +12 -12
- package/package.json +8 -6
package/dist/index.d.ts
CHANGED
|
@@ -44,7 +44,22 @@ interface MoltbotPluginApi {
|
|
|
44
44
|
registerChannel: (opts: {
|
|
45
45
|
plugin: unknown;
|
|
46
46
|
}) => void;
|
|
47
|
-
|
|
47
|
+
registerCli?: (registrar: (ctx: {
|
|
48
|
+
program: unknown;
|
|
49
|
+
config?: MoltbotConfig;
|
|
50
|
+
}) => void | Promise<void>, opts?: {
|
|
51
|
+
commands?: string[];
|
|
52
|
+
}) => void;
|
|
53
|
+
logger?: {
|
|
54
|
+
info?: (message: string) => void;
|
|
55
|
+
warn?: (message: string) => void;
|
|
56
|
+
error?: (message: string) => void;
|
|
57
|
+
};
|
|
58
|
+
runtime?: {
|
|
59
|
+
config?: {
|
|
60
|
+
writeConfigFile?: (cfg: unknown) => Promise<void>;
|
|
61
|
+
};
|
|
62
|
+
};
|
|
48
63
|
config?: MoltbotConfig;
|
|
49
64
|
[key: string]: unknown;
|
|
50
65
|
}
|
|
@@ -58,7 +73,7 @@ type SupportedChannel = (typeof SUPPORTED_CHANNELS)[number];
|
|
|
58
73
|
*
|
|
59
74
|
* 符合 Moltbot 官方约定:从 cfg.channels.<id>.enabled 读取配置
|
|
60
75
|
*
|
|
61
|
-
* @param api Moltbot
|
|
76
|
+
* @param api Moltbot 鎻掍欢 API
|
|
62
77
|
* @param cfg Moltbot 配置(可选,默认从 api.config 读取)
|
|
63
78
|
*
|
|
64
79
|
* @example
|
package/dist/index.js
CHANGED
|
@@ -8,9 +8,16 @@ import wecomAppEntry from '@openclaw-china/wecom-app';
|
|
|
8
8
|
export { DEFAULT_ACCOUNT_ID as WECOM_APP_DEFAULT_ACCOUNT_ID, clearAccessTokenCache, clearAllAccessTokenCache, downloadAndSendImage, getAccessToken, getWecomAppRuntime, sendWecomAppImageMessage, sendWecomAppMarkdownMessage, sendWecomAppMessage, setWecomAppRuntime, stripMarkdown, wecomAppPlugin } from '@openclaw-china/wecom-app';
|
|
9
9
|
import qqbotEntry from '@openclaw-china/qqbot';
|
|
10
10
|
export { DEFAULT_ACCOUNT_ID as QQBOT_DEFAULT_ACCOUNT_ID, getQQBotRuntime, qqbotPlugin, setQQBotRuntime } from '@openclaw-china/qqbot';
|
|
11
|
+
import { registerChinaSetupCli } from '@openclaw-china/shared';
|
|
11
12
|
|
|
12
13
|
// src/index.ts
|
|
13
14
|
var SUPPORTED_CHANNELS = ["dingtalk", "feishu-china", "wecom", "wecom-app", "qqbot"];
|
|
15
|
+
var PROJECT_REPO = "https://github.com/BytePioneer-AI/moltbot-china";
|
|
16
|
+
var DEBUG_COMMAND = "openclaw gateway --port 18789 --verbose";
|
|
17
|
+
var ANSI_RESET = "\x1B[0m";
|
|
18
|
+
var ANSI_LINK = "\x1B[1;4;96m";
|
|
19
|
+
var ANSI_BORDER = "\x1B[92m";
|
|
20
|
+
var hasShownPromoHint = false;
|
|
14
21
|
var channelPlugins = {
|
|
15
22
|
dingtalk: {
|
|
16
23
|
register: (api) => {
|
|
@@ -38,6 +45,43 @@ var channelPlugins = {
|
|
|
38
45
|
}
|
|
39
46
|
}
|
|
40
47
|
};
|
|
48
|
+
function hasAnyEnabledChinaChannel(cfg) {
|
|
49
|
+
const channels = cfg?.channels;
|
|
50
|
+
if (!channels) {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
return SUPPORTED_CHANNELS.some((channelId) => Boolean(channels[channelId]?.enabled));
|
|
54
|
+
}
|
|
55
|
+
function showPromoHint(api) {
|
|
56
|
+
if (hasShownPromoHint || hasAnyEnabledChinaChannel(api.config)) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
hasShownPromoHint = true;
|
|
60
|
+
const lines = [
|
|
61
|
+
`${ANSI_BORDER}\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501${ANSI_RESET}`,
|
|
62
|
+
" OpenClaw China Channels \u5DF2\u5C31\u7EEA!",
|
|
63
|
+
`${ANSI_BORDER}\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501${ANSI_RESET}`,
|
|
64
|
+
"",
|
|
65
|
+
"\u9879\u76EE\u4ED3\u5E93:",
|
|
66
|
+
` ${ANSI_LINK}${PROJECT_REPO}${ANSI_RESET}`,
|
|
67
|
+
"",
|
|
68
|
+
"\u2B50 \u5982\u679C\u8FD9\u4E2A\u9879\u76EE\u5BF9\u4F60\u6709\u5E2E\u52A9\uFF0C\u8BF7\u7ED9\u6211\u4EEC\u4E00\u4E2A Star\uFF01\u2B50",
|
|
69
|
+
"",
|
|
70
|
+
"\u4E0B\u4E00\u6B65:",
|
|
71
|
+
` ${DEBUG_COMMAND}`
|
|
72
|
+
];
|
|
73
|
+
if (api.logger?.info) {
|
|
74
|
+
for (const line of lines) {
|
|
75
|
+
api.logger.info(line);
|
|
76
|
+
}
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (api.logger?.warn) {
|
|
80
|
+
for (const line of lines) {
|
|
81
|
+
api.logger.warn(line);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
41
85
|
function registerChannelsByConfig(api, cfg) {
|
|
42
86
|
const config = cfg ?? api.config;
|
|
43
87
|
const channelsConfig = config?.channels;
|
|
@@ -68,6 +112,8 @@ var channelsPlugin = {
|
|
|
68
112
|
* 从 api.config.channels.<id>.enabled 读取配置
|
|
69
113
|
*/
|
|
70
114
|
register(api) {
|
|
115
|
+
registerChinaSetupCli(api, { channels: SUPPORTED_CHANNELS });
|
|
116
|
+
showPromoHint(api);
|
|
71
117
|
registerChannelsByConfig(api);
|
|
72
118
|
}
|
|
73
119
|
};
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAwJO,IAAM,qBAAqB,CAAC,UAAA,EAAY,cAAA,EAAgB,OAAA,EAAS,aAAa,OAAO;AAK5F,IAAM,cAAA,GAA0F;AAAA,EAC9F,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,CAAC,GAAA,KAA0B;AACnC,MAAA,aAAA,CAAc,SAAS,GAAG,CAAA;AAAA,IAC5B;AAAA,GACF;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,QAAA,EAAU,CAAC,GAAA,KAA0B;AACnC,MAAA,WAAA,CAAY,SAAS,GAAG,CAAA;AAAA,IAC1B;AAAA,GACF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,QAAA,EAAU,CAAC,GAAA,KAA0B;AACnC,MAAA,UAAA,CAAW,SAAS,GAAG,CAAA;AAAA,IACzB;AAAA,GACF;AAAA,EACA,WAAA,EAAa;AAAA,IACX,QAAA,EAAU,CAAC,GAAA,KAA0B;AACnC,MAAA,aAAA,CAAc,SAAS,GAAG,CAAA;AAAA,IAC5B;AAAA,GACF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,QAAA,EAAU,CAAC,GAAA,KAA0B;AACnC,MAAA,UAAA,CAAW,SAAS,GAAG,CAAA;AAAA,IACzB;AAAA;AAEJ,CAAA;AAwBO,SAAS,wBAAA,CACd,KACA,GAAA,EACM;AAEN,EAAA,MAAM,MAAA,GAAS,OAAO,GAAA,CAAI,MAAA;AAC1B,EAAA,MAAM,iBAAiB,MAAA,EAAQ,QAAA;AAE/B,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,aAAa,kBAAA,EAAoB;AAE1C,IAAA,MAAM,aAAA,GAAgB,eAAe,SAAS,CAAA;AAG9C,IAAA,IAAI,CAAC,eAAe,OAAA,EAAS;AAC3B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,eAAe,SAAS,CAAA;AACvC,IAAA,MAAA,CAAO,SAAS,GAAG,CAAA;AAAA,EACrB;AACF;AAQA,IAAM,cAAA,GAAiB;AAAA,EACrB,EAAA,EAAI,UAAA;AAAA,EACJ,IAAA,EAAM,wBAAA;AAAA,EACN,WAAA,EAAa,0HAAA;AAAA,EAEb,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,oBAAA,EAAsB,KAAA;AAAA,IACtB,YAAY;AAAC,GACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,GAAA,EAAuB;AAC9B,IAAA,wBAAA,CAAyB,GAAG,CAAA;AAAA,EAC9B;AACF,CAAA;AAEA,IAAO,aAAA,GAAQ","file":"index.js","sourcesContent":["/**\n * @openclaw-china/channels\n * 统一渠道包入口\n *\n * 导出所有渠道插件,提供统一注册函数\n *\n * Requirements: Unified Package Entry, Unified Distribution\n */\n\n// 导出 DingTalk 插件\nimport {\n dingtalkPlugin,\n DEFAULT_ACCOUNT_ID as DINGTALK_DEFAULT_ACCOUNT_ID,\n sendMessageDingtalk,\n setDingtalkRuntime,\n getDingtalkRuntime,\n} from \"@openclaw-china/dingtalk\";\nimport dingtalkEntry from \"@openclaw-china/dingtalk\";\nimport {\n feishuPlugin,\n DEFAULT_ACCOUNT_ID as FEISHU_DEFAULT_ACCOUNT_ID,\n sendMessageFeishu,\n setFeishuRuntime,\n getFeishuRuntime,\n} from \"@openclaw-china/feishu-china\";\nimport feishuEntry from \"@openclaw-china/feishu-china\";\nimport {\n wecomPlugin,\n DEFAULT_ACCOUNT_ID as WECOM_DEFAULT_ACCOUNT_ID,\n setWecomRuntime,\n getWecomRuntime,\n} from \"@openclaw-china/wecom\";\nimport wecomEntry from \"@openclaw-china/wecom\";\nimport {\n wecomAppPlugin,\n DEFAULT_ACCOUNT_ID as WECOM_APP_DEFAULT_ACCOUNT_ID,\n setWecomAppRuntime,\n getWecomAppRuntime,\n sendWecomAppMessage,\n getAccessToken,\n sendWecomAppMarkdownMessage,\n stripMarkdown,\n clearAccessTokenCache,\n clearAllAccessTokenCache,\n downloadAndSendImage,\n sendWecomAppImageMessage,\n} from \"@openclaw-china/wecom-app\";\nimport wecomAppEntry from \"@openclaw-china/wecom-app\";\nimport {\n qqbotPlugin,\n DEFAULT_ACCOUNT_ID as QQBOT_DEFAULT_ACCOUNT_ID,\n setQQBotRuntime,\n getQQBotRuntime,\n} from \"@openclaw-china/qqbot\";\nimport qqbotEntry from \"@openclaw-china/qqbot\";\n\nexport {\n dingtalkPlugin,\n DINGTALK_DEFAULT_ACCOUNT_ID,\n sendMessageDingtalk,\n setDingtalkRuntime,\n getDingtalkRuntime,\n feishuPlugin,\n FEISHU_DEFAULT_ACCOUNT_ID,\n sendMessageFeishu,\n setFeishuRuntime,\n getFeishuRuntime,\n wecomPlugin,\n WECOM_DEFAULT_ACCOUNT_ID,\n setWecomRuntime,\n getWecomRuntime,\n wecomAppPlugin,\n WECOM_APP_DEFAULT_ACCOUNT_ID,\n setWecomAppRuntime,\n getWecomAppRuntime,\n sendWecomAppMessage,\n getAccessToken,\n sendWecomAppMarkdownMessage,\n stripMarkdown,\n clearAccessTokenCache,\n clearAllAccessTokenCache,\n downloadAndSendImage,\n sendWecomAppImageMessage,\n qqbotPlugin,\n QQBOT_DEFAULT_ACCOUNT_ID,\n setQQBotRuntime,\n getQQBotRuntime,\n};\n\nexport type {\n DingtalkConfig,\n ResolvedDingtalkAccount,\n DingtalkSendResult,\n} from \"@openclaw-china/dingtalk\";\nexport type {\n FeishuConfig,\n ResolvedFeishuAccount,\n FeishuSendResult,\n} from \"@openclaw-china/feishu-china\";\nexport type { WecomConfig, ResolvedWecomAccount, WecomInboundMessage } from \"@openclaw-china/wecom\";\nexport type {\n WecomAppConfig,\n ResolvedWecomAppAccount,\n WecomAppInboundMessage,\n WecomAppDmPolicy,\n WecomAppSendTarget,\n AccessTokenCacheEntry,\n} from \"@openclaw-china/wecom-app\";\nexport type { QQBotConfig, ResolvedQQBotAccount, QQBotSendResult } from \"@openclaw-china/qqbot\";\n\n// TODO: 后续添加其他渠道\n// export { qqPlugin } from \"@openclaw-china/qq\";\n\n/**\n * 渠道配置接口\n */\nexport interface ChannelConfig {\n /** 是否启用该渠道 */\n enabled?: boolean;\n [key: string]: unknown;\n}\n\n/**\n * Moltbot 配置接口(符合官方约定)\n * 配置路径: channels.<id>.enabled\n */\nexport interface MoltbotConfig {\n channels?: {\n dingtalk?: ChannelConfig;\n \"feishu-china\"?: ChannelConfig;\n wecom?: ChannelConfig;\n \"wecom-app\"?: ChannelConfig;\n qqbot?: ChannelConfig;\n qq?: ChannelConfig;\n [key: string]: ChannelConfig | undefined;\n };\n [key: string]: unknown;\n}\n\n/**\n * Moltbot 插件 API 接口\n */\nexport interface MoltbotPluginApi {\n registerChannel: (opts: { plugin: unknown }) => void;\n runtime?: unknown;\n config?: MoltbotConfig;\n [key: string]: unknown;\n}\n\n/**\n * 支持的渠道列表\n */\nexport const SUPPORTED_CHANNELS = [\"dingtalk\", \"feishu-china\", \"wecom\", \"wecom-app\", \"qqbot\"] as const;\n// TODO: 后续添加 \"qq\"\n\nexport type SupportedChannel = (typeof SUPPORTED_CHANNELS)[number];\n\nconst channelPlugins: Record<SupportedChannel, { register: (api: MoltbotPluginApi) => void }> = {\n dingtalk: {\n register: (api: MoltbotPluginApi) => {\n dingtalkEntry.register(api);\n },\n },\n \"feishu-china\": {\n register: (api: MoltbotPluginApi) => {\n feishuEntry.register(api);\n },\n },\n wecom: {\n register: (api: MoltbotPluginApi) => {\n wecomEntry.register(api);\n },\n },\n \"wecom-app\": {\n register: (api: MoltbotPluginApi) => {\n wecomAppEntry.register(api);\n },\n },\n qqbot: {\n register: (api: MoltbotPluginApi) => {\n qqbotEntry.register(api);\n },\n },\n};\n\n/**\n * 根据 Moltbot 配置注册启用的渠道\n *\n * 符合 Moltbot 官方约定:从 cfg.channels.<id>.enabled 读取配置\n *\n * @param api Moltbot 插件 API\n * @param cfg Moltbot 配置(可选,默认从 api.config 读取)\n *\n * @example\n * ```ts\n * // moltbot.json 配置\n * {\n * \"channels\": {\n * \"dingtalk\": {\n * \"enabled\": true,\n * \"clientId\": \"...\",\n * \"clientSecret\": \"...\"\n * }\n * }\n * }\n * ```\n */\nexport function registerChannelsByConfig(\n api: MoltbotPluginApi,\n cfg?: MoltbotConfig\n): void {\n // 从 api.config 或传入的 cfg 获取配置\n const config = cfg ?? api.config;\n const channelsConfig = config?.channels;\n\n if (!channelsConfig) {\n return;\n }\n\n for (const channelId of SUPPORTED_CHANNELS) {\n // 符合官方约定:从 channels.<id>.enabled 读取\n const channelConfig = channelsConfig[channelId];\n\n // 跳过未启用的渠道\n if (!channelConfig?.enabled) {\n continue;\n }\n\n const plugin = channelPlugins[channelId];\n plugin.register(api);\n }\n}\n\n/**\n * 统一渠道插件定义\n *\n * 包含所有支持的渠道,通过配置启用\n * 配置路径符合 Moltbot 官方约定: channels.<id>\n */\nconst channelsPlugin = {\n id: \"channels\",\n name: \"Moltbot China Channels\",\n description: \"统一渠道包,支持钉钉、飞书、企业微信、QQ Bot\",\n\n configSchema: {\n type: \"object\",\n additionalProperties: false,\n properties: {},\n },\n\n /**\n * 注册所有启用的渠道\n *\n * 从 api.config.channels.<id>.enabled 读取配置\n */\n register(api: MoltbotPluginApi) {\n registerChannelsByConfig(api);\n },\n};\n\nexport default channelsPlugin;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * @openclaw-china/channels\r\n * 统一渠道包入口\r\n *\r\n * 导出所有渠道插件,提供统一注册函数\r\n *\r\n * Requirements: Unified Package Entry, Unified Distribution\r\n */\r\n\r\n// 导出 DingTalk 插件\r\nimport {\r\n dingtalkPlugin,\r\n DEFAULT_ACCOUNT_ID as DINGTALK_DEFAULT_ACCOUNT_ID,\r\n sendMessageDingtalk,\r\n setDingtalkRuntime,\r\n getDingtalkRuntime,\r\n} from \"@openclaw-china/dingtalk\";\r\nimport dingtalkEntry from \"@openclaw-china/dingtalk\";\r\nimport {\r\n feishuPlugin,\r\n DEFAULT_ACCOUNT_ID as FEISHU_DEFAULT_ACCOUNT_ID,\r\n sendMessageFeishu,\r\n setFeishuRuntime,\r\n getFeishuRuntime,\r\n} from \"@openclaw-china/feishu-china\";\r\nimport feishuEntry from \"@openclaw-china/feishu-china\";\r\nimport {\r\n wecomPlugin,\r\n DEFAULT_ACCOUNT_ID as WECOM_DEFAULT_ACCOUNT_ID,\r\n setWecomRuntime,\r\n getWecomRuntime,\r\n} from \"@openclaw-china/wecom\";\r\nimport wecomEntry from \"@openclaw-china/wecom\";\r\nimport {\r\n wecomAppPlugin,\r\n DEFAULT_ACCOUNT_ID as WECOM_APP_DEFAULT_ACCOUNT_ID,\r\n setWecomAppRuntime,\r\n getWecomAppRuntime,\r\n sendWecomAppMessage,\r\n getAccessToken,\r\n sendWecomAppMarkdownMessage,\r\n stripMarkdown,\r\n clearAccessTokenCache,\r\n clearAllAccessTokenCache,\r\n downloadAndSendImage,\r\n sendWecomAppImageMessage,\r\n} from \"@openclaw-china/wecom-app\";\r\nimport wecomAppEntry from \"@openclaw-china/wecom-app\";\r\nimport {\n qqbotPlugin,\n DEFAULT_ACCOUNT_ID as QQBOT_DEFAULT_ACCOUNT_ID,\n setQQBotRuntime,\n getQQBotRuntime,\n} from \"@openclaw-china/qqbot\";\nimport qqbotEntry from \"@openclaw-china/qqbot\";\nimport { registerChinaSetupCli } from \"@openclaw-china/shared\";\n\r\nexport {\r\n dingtalkPlugin,\r\n DINGTALK_DEFAULT_ACCOUNT_ID,\r\n sendMessageDingtalk,\r\n setDingtalkRuntime,\r\n getDingtalkRuntime,\r\n feishuPlugin,\r\n FEISHU_DEFAULT_ACCOUNT_ID,\r\n sendMessageFeishu,\r\n setFeishuRuntime,\r\n getFeishuRuntime,\r\n wecomPlugin,\r\n WECOM_DEFAULT_ACCOUNT_ID,\r\n setWecomRuntime,\r\n getWecomRuntime,\r\n wecomAppPlugin,\r\n WECOM_APP_DEFAULT_ACCOUNT_ID,\r\n setWecomAppRuntime,\r\n getWecomAppRuntime,\r\n sendWecomAppMessage,\r\n getAccessToken,\r\n sendWecomAppMarkdownMessage,\r\n stripMarkdown,\r\n clearAccessTokenCache,\r\n clearAllAccessTokenCache,\r\n downloadAndSendImage,\r\n sendWecomAppImageMessage,\r\n qqbotPlugin,\r\n QQBOT_DEFAULT_ACCOUNT_ID,\r\n setQQBotRuntime,\r\n getQQBotRuntime,\r\n};\r\n\r\nexport type {\r\n DingtalkConfig,\r\n ResolvedDingtalkAccount,\r\n DingtalkSendResult,\r\n} from \"@openclaw-china/dingtalk\";\r\nexport type {\r\n FeishuConfig,\r\n ResolvedFeishuAccount,\r\n FeishuSendResult,\r\n} from \"@openclaw-china/feishu-china\";\r\nexport type { WecomConfig, ResolvedWecomAccount, WecomInboundMessage } from \"@openclaw-china/wecom\";\r\nexport type {\r\n WecomAppConfig,\r\n ResolvedWecomAppAccount,\r\n WecomAppInboundMessage,\r\n WecomAppDmPolicy,\r\n WecomAppSendTarget,\r\n AccessTokenCacheEntry,\r\n} from \"@openclaw-china/wecom-app\";\r\nexport type { QQBotConfig, ResolvedQQBotAccount, QQBotSendResult } from \"@openclaw-china/qqbot\";\r\n\r\n// TODO: 后续添加其他渠道\r\n// export { qqPlugin } from \"@openclaw-china/qq\";\r\n\r\n/**\r\n * 渠道配置接口\r\n */\r\nexport interface ChannelConfig {\r\n /** 是否启用该渠道 */\r\n enabled?: boolean;\r\n [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * Moltbot 配置接口(符合官方约定)\r\n * 配置路径: channels.<id>.enabled\r\n */\r\nexport interface MoltbotConfig {\r\n channels?: {\r\n dingtalk?: ChannelConfig;\r\n \"feishu-china\"?: ChannelConfig;\r\n wecom?: ChannelConfig;\r\n \"wecom-app\"?: ChannelConfig;\r\n qqbot?: ChannelConfig;\r\n qq?: ChannelConfig;\r\n [key: string]: ChannelConfig | undefined;\r\n };\r\n [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * Moltbot 插件 API 接口\r\n */\r\nexport interface MoltbotPluginApi {\r\n registerChannel: (opts: { plugin: unknown }) => void;\r\n registerCli?: (\r\n registrar: (ctx: { program: unknown; config?: MoltbotConfig }) => void | Promise<void>,\r\n opts?: { commands?: string[] }\r\n ) => void;\r\n logger?: {\r\n info?: (message: string) => void;\r\n warn?: (message: string) => void;\r\n error?: (message: string) => void;\r\n };\r\n runtime?: {\r\n config?: {\r\n writeConfigFile?: (cfg: unknown) => Promise<void>;\r\n };\r\n };\r\n config?: MoltbotConfig;\r\n [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * 支持的渠道列表\r\n */\r\nexport const SUPPORTED_CHANNELS = [\"dingtalk\", \"feishu-china\", \"wecom\", \"wecom-app\", \"qqbot\"] as const;\r\n// TODO: 鍚庣画娣诲姞 \"qq\"\r\n\r\nexport type SupportedChannel = (typeof SUPPORTED_CHANNELS)[number];\r\nconst PROJECT_REPO = \"https://github.com/BytePioneer-AI/moltbot-china\";\r\nconst DEBUG_COMMAND = \"openclaw gateway --port 18789 --verbose\";\r\nconst ANSI_RESET = \"\\u001b[0m\";\r\nconst ANSI_LINK = \"\\u001b[1;4;96m\";\r\nconst ANSI_BORDER = \"\\u001b[92m\";\r\nlet hasShownPromoHint = false;\r\n\r\nconst channelPlugins: Record<SupportedChannel, { register: (api: MoltbotPluginApi) => void }> = {\r\n dingtalk: {\r\n register: (api: MoltbotPluginApi) => {\r\n dingtalkEntry.register(api);\r\n },\r\n },\r\n \"feishu-china\": {\r\n register: (api: MoltbotPluginApi) => {\r\n feishuEntry.register(api);\r\n },\r\n },\r\n wecom: {\r\n register: (api: MoltbotPluginApi) => {\r\n wecomEntry.register(api);\r\n },\r\n },\r\n \"wecom-app\": {\r\n register: (api: MoltbotPluginApi) => {\r\n wecomAppEntry.register(api);\r\n },\r\n },\r\n qqbot: {\r\n register: (api: MoltbotPluginApi) => {\r\n qqbotEntry.register(api);\r\n },\r\n },\r\n};\r\n\r\nfunction hasAnyEnabledChinaChannel(cfg?: MoltbotConfig): boolean {\r\n const channels = cfg?.channels;\r\n if (!channels) {\r\n return false;\r\n }\r\n return SUPPORTED_CHANNELS.some((channelId) => Boolean(channels[channelId]?.enabled));\r\n}\r\n\r\nfunction showPromoHint(api: MoltbotPluginApi): void {\r\n if (hasShownPromoHint || hasAnyEnabledChinaChannel(api.config)) {\r\n return;\r\n }\r\n hasShownPromoHint = true;\r\n\r\n const lines = [\r\n `${ANSI_BORDER}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${ANSI_RESET}`,\r\n \" OpenClaw China Channels 已就绪!\",\r\n `${ANSI_BORDER}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${ANSI_RESET}`,\r\n \"\",\r\n \"项目仓库:\",\r\n ` ${ANSI_LINK}${PROJECT_REPO}${ANSI_RESET}`,\r\n \"\",\r\n \"⭐ 如果这个项目对你有帮助,请给我们一个 Star!⭐\",\r\n \"\",\r\n \"下一步:\",\r\n ` ${DEBUG_COMMAND}`,\r\n ];\r\n\r\n if (api.logger?.info) {\r\n for (const line of lines) {\r\n api.logger.info(line);\r\n }\r\n return;\r\n }\r\n if (api.logger?.warn) {\r\n for (const line of lines) {\r\n api.logger.warn(line);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 根据 Moltbot 配置注册启用的渠道\r\n *\r\n * 符合 Moltbot 官方约定:从 cfg.channels.<id>.enabled 读取配置\r\n *\r\n * @param api Moltbot 鎻掍欢 API\r\n * @param cfg Moltbot 配置(可选,默认从 api.config 读取)\r\n *\r\n * @example\r\n * ```ts\r\n * // moltbot.json 配置\r\n * {\r\n * \"channels\": {\r\n * \"dingtalk\": {\r\n * \"enabled\": true,\r\n * \"clientId\": \"...\",\r\n * \"clientSecret\": \"...\"\r\n * }\r\n * }\r\n * }\r\n * ```\r\n */\r\nexport function registerChannelsByConfig(\r\n api: MoltbotPluginApi,\r\n cfg?: MoltbotConfig\r\n): void {\r\n // 从 api.config 或传入的 cfg 获取配置\r\n const config = cfg ?? api.config;\r\n const channelsConfig = config?.channels;\r\n\r\n if (!channelsConfig) {\r\n return;\r\n }\r\n\r\n for (const channelId of SUPPORTED_CHANNELS) {\r\n // 符合官方约定:从 channels.<id>.enabled 读取\r\n const channelConfig = channelsConfig[channelId];\r\n\r\n // 跳过未启用的渠道\r\n if (!channelConfig?.enabled) {\r\n continue;\r\n }\r\n\r\n const plugin = channelPlugins[channelId];\r\n plugin.register(api);\r\n }\r\n}\r\n\r\n/**\r\n * 统一渠道插件定义\r\n *\r\n * 包含所有支持的渠道,通过配置启用\r\n * 配置路径符合 Moltbot 官方约定: channels.<id>\r\n */\r\nconst channelsPlugin = {\r\n id: \"channels\",\r\n name: \"Moltbot China Channels\",\r\n description: \"统一渠道包,支持钉钉、飞书、企业微信、QQ Bot\",\r\n\r\n configSchema: {\r\n type: \"object\",\r\n additionalProperties: false,\r\n properties: {},\r\n },\r\n\r\n /**\r\n * 注册所有启用的渠道\r\n *\r\n * 从 api.config.channels.<id>.enabled 读取配置\r\n */\r\n register(api: MoltbotPluginApi) {\n registerChinaSetupCli(api, { channels: SUPPORTED_CHANNELS });\n showPromoHint(api);\n registerChannelsByConfig(api);\n },\n};\n\r\nexport default channelsPlugin;\r\n"]}
|
package/openclaw.plugin.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "channels",
|
|
3
|
-
"name": "Moltbot China Channels",
|
|
4
|
-
"description": "统一渠道包,支持钉钉、飞书、企业微信智能机器人、企业微信自建应用、QQ Bot",
|
|
5
|
-
"version": "0.1.0",
|
|
6
|
-
"channels": ["dingtalk", "feishu-china", "wecom", "wecom-app", "qqbot"],
|
|
7
|
-
"configSchema": {
|
|
8
|
-
"type": "object",
|
|
9
|
-
"additionalProperties": false,
|
|
10
|
-
"properties": {}
|
|
11
|
-
}
|
|
12
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"id": "channels",
|
|
3
|
+
"name": "Moltbot China Channels",
|
|
4
|
+
"description": "统一渠道包,支持钉钉、飞书、企业微信智能机器人、企业微信自建应用、QQ Bot",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"channels": ["dingtalk", "feishu-china", "wecom", "wecom-app", "qqbot"],
|
|
7
|
+
"configSchema": {
|
|
8
|
+
"type": "object",
|
|
9
|
+
"additionalProperties": false,
|
|
10
|
+
"properties": {}
|
|
11
|
+
}
|
|
12
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openclaw-china/channels",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.34",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Unified package for all Moltbot China channel plugins",
|
|
6
6
|
"license": "MIT",
|
|
@@ -54,11 +54,13 @@
|
|
|
54
54
|
"clean": "rimraf dist"
|
|
55
55
|
},
|
|
56
56
|
"dependencies": {
|
|
57
|
-
"@
|
|
58
|
-
"@openclaw-china/
|
|
59
|
-
"@openclaw-china/
|
|
60
|
-
"@openclaw-china/
|
|
61
|
-
"@openclaw-china/
|
|
57
|
+
"@clack/prompts": "^1.0.0",
|
|
58
|
+
"@openclaw-china/dingtalk": "0.1.34",
|
|
59
|
+
"@openclaw-china/feishu-china": "0.1.10",
|
|
60
|
+
"@openclaw-china/qqbot": "0.1.7",
|
|
61
|
+
"@openclaw-china/shared": "0.1.33",
|
|
62
|
+
"@openclaw-china/wecom": "0.1.23",
|
|
63
|
+
"@openclaw-china/wecom-app": "0.1.10"
|
|
62
64
|
},
|
|
63
65
|
"devDependencies": {
|
|
64
66
|
"@types/node": "^22.0.0",
|