openclaw-plugin-yuanbao 0.1.0-beta.1
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.
Potentially problematic release.
This version of openclaw-plugin-yuanbao might be problematic. Click here for more details.
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/src/accounts.d.ts +34 -0
- package/dist/src/accounts.d.ts.map +1 -0
- package/dist/src/accounts.js +138 -0
- package/dist/src/accounts.js.map +1 -0
- package/dist/src/api.d.ts +111 -0
- package/dist/src/api.d.ts.map +1 -0
- package/dist/src/api.js +291 -0
- package/dist/src/api.js.map +1 -0
- package/dist/src/channel.d.ts +7 -0
- package/dist/src/channel.d.ts.map +1 -0
- package/dist/src/channel.js +284 -0
- package/dist/src/channel.js.map +1 -0
- package/dist/src/config-schema.d.ts +14 -0
- package/dist/src/config-schema.d.ts.map +1 -0
- package/dist/src/config-schema.js +89 -0
- package/dist/src/config-schema.js.map +1 -0
- package/dist/src/logger.d.ts +91 -0
- package/dist/src/logger.d.ts.map +1 -0
- package/dist/src/logger.js +224 -0
- package/dist/src/logger.js.map +1 -0
- package/dist/src/media.d.ts +124 -0
- package/dist/src/media.d.ts.map +1 -0
- package/dist/src/media.js +402 -0
- package/dist/src/media.js.map +1 -0
- package/dist/src/message-handler/context.d.ts +87 -0
- package/dist/src/message-handler/context.d.ts.map +1 -0
- package/dist/src/message-handler/context.js +147 -0
- package/dist/src/message-handler/context.js.map +1 -0
- package/dist/src/message-handler/extract.d.ts +21 -0
- package/dist/src/message-handler/extract.d.ts.map +1 -0
- package/dist/src/message-handler/extract.js +36 -0
- package/dist/src/message-handler/extract.js.map +1 -0
- package/dist/src/message-handler/handlers/custom.d.ts +18 -0
- package/dist/src/message-handler/handlers/custom.d.ts.map +1 -0
- package/dist/src/message-handler/handlers/custom.js +73 -0
- package/dist/src/message-handler/handlers/custom.js.map +1 -0
- package/dist/src/message-handler/handlers/file.d.ts +9 -0
- package/dist/src/message-handler/handlers/file.d.ts.map +1 -0
- package/dist/src/message-handler/handlers/file.js +49 -0
- package/dist/src/message-handler/handlers/file.js.map +1 -0
- package/dist/src/message-handler/handlers/image.d.ts +9 -0
- package/dist/src/message-handler/handlers/image.d.ts.map +1 -0
- package/dist/src/message-handler/handlers/image.js +56 -0
- package/dist/src/message-handler/handlers/image.js.map +1 -0
- package/dist/src/message-handler/handlers/index.d.ts +65 -0
- package/dist/src/message-handler/handlers/index.d.ts.map +1 -0
- package/dist/src/message-handler/handlers/index.js +175 -0
- package/dist/src/message-handler/handlers/index.js.map +1 -0
- package/dist/src/message-handler/handlers/sound.d.ts +9 -0
- package/dist/src/message-handler/handlers/sound.d.ts.map +1 -0
- package/dist/src/message-handler/handlers/sound.js +23 -0
- package/dist/src/message-handler/handlers/sound.js.map +1 -0
- package/dist/src/message-handler/handlers/text.d.ts +8 -0
- package/dist/src/message-handler/handlers/text.d.ts.map +1 -0
- package/dist/src/message-handler/handlers/text.js +35 -0
- package/dist/src/message-handler/handlers/text.js.map +1 -0
- package/dist/src/message-handler/handlers/types.d.ts +107 -0
- package/dist/src/message-handler/handlers/types.d.ts.map +1 -0
- package/dist/src/message-handler/handlers/types.js +8 -0
- package/dist/src/message-handler/handlers/types.js.map +1 -0
- package/dist/src/message-handler/handlers/video.d.ts +8 -0
- package/dist/src/message-handler/handlers/video.d.ts.map +1 -0
- package/dist/src/message-handler/handlers/video.js +49 -0
- package/dist/src/message-handler/handlers/video.js.map +1 -0
- package/dist/src/message-handler/inbound.d.ts +14 -0
- package/dist/src/message-handler/inbound.d.ts.map +1 -0
- package/dist/src/message-handler/inbound.js +428 -0
- package/dist/src/message-handler/inbound.js.map +1 -0
- package/dist/src/message-handler/index.d.ts +20 -0
- package/dist/src/message-handler/index.d.ts.map +1 -0
- package/dist/src/message-handler/index.js +18 -0
- package/dist/src/message-handler/index.js.map +1 -0
- package/dist/src/message-handler/outbound.d.ts +132 -0
- package/dist/src/message-handler/outbound.d.ts.map +1 -0
- package/dist/src/message-handler/outbound.js +237 -0
- package/dist/src/message-handler/outbound.js.map +1 -0
- package/dist/src/onboarding.d.ts +9 -0
- package/dist/src/onboarding.d.ts.map +1 -0
- package/dist/src/onboarding.js +211 -0
- package/dist/src/onboarding.js.map +1 -0
- package/dist/src/runtime.d.ts +18 -0
- package/dist/src/runtime.d.ts.map +1 -0
- package/dist/src/runtime.js +20 -0
- package/dist/src/runtime.js.map +1 -0
- package/dist/src/tools/index.d.ts +8 -0
- package/dist/src/tools/index.d.ts.map +1 -0
- package/dist/src/tools/index.js +8 -0
- package/dist/src/tools/index.js.map +1 -0
- package/dist/src/tools/lookup-conversation-members.d.ts +46 -0
- package/dist/src/tools/lookup-conversation-members.d.ts.map +1 -0
- package/dist/src/tools/lookup-conversation-members.js +133 -0
- package/dist/src/tools/lookup-conversation-members.js.map +1 -0
- package/dist/src/types.d.ts +135 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/user-tracker.d.ts +47 -0
- package/dist/src/user-tracker.d.ts.map +1 -0
- package/dist/src/user-tracker.js +99 -0
- package/dist/src/user-tracker.js.map +1 -0
- package/dist/src/utils/get-env.d.ts +13 -0
- package/dist/src/utils/get-env.d.ts.map +1 -0
- package/dist/src/utils/get-env.js +28 -0
- package/dist/src/utils/get-env.js.map +1 -0
- package/dist/src/utils.d.ts +32 -0
- package/dist/src/utils.d.ts.map +1 -0
- package/dist/src/utils.js +48 -0
- package/dist/src/utils.js.map +1 -0
- package/dist/src/ws/biz-codec.d.ts +86 -0
- package/dist/src/ws/biz-codec.d.ts.map +1 -0
- package/dist/src/ws/biz-codec.js +233 -0
- package/dist/src/ws/biz-codec.js.map +1 -0
- package/dist/src/ws/client.d.ts +113 -0
- package/dist/src/ws/client.d.ts.map +1 -0
- package/dist/src/ws/client.js +547 -0
- package/dist/src/ws/client.js.map +1 -0
- package/dist/src/ws/conn-codec.d.ts +143 -0
- package/dist/src/ws/conn-codec.d.ts.map +1 -0
- package/dist/src/ws/conn-codec.js +204 -0
- package/dist/src/ws/conn-codec.js.map +1 -0
- package/dist/src/ws/gateway.d.ts +52 -0
- package/dist/src/ws/gateway.d.ts.map +1 -0
- package/dist/src/ws/gateway.js +269 -0
- package/dist/src/ws/gateway.js.map +1 -0
- package/dist/src/ws/index.d.ts +12 -0
- package/dist/src/ws/index.d.ts.map +1 -0
- package/dist/src/ws/index.js +14 -0
- package/dist/src/ws/index.js.map +1 -0
- package/dist/src/ws/proto/biz.json +263 -0
- package/dist/src/ws/proto/conn.json +391 -0
- package/dist/src/ws/runtime.d.ts +18 -0
- package/dist/src/ws/runtime.d.ts.map +1 -0
- package/dist/src/ws/runtime.js +16 -0
- package/dist/src/ws/runtime.js.map +1 -0
- package/dist/src/ws/types.d.ts +107 -0
- package/dist/src/ws/types.d.ts.map +1 -0
- package/dist/src/ws/types.js +8 -0
- package/dist/src/ws/types.js.map +1 -0
- package/openclaw.plugin.json +19 -0
- package/package.json +122 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Author: YanHaidao
|
|
3
|
+
*/
|
|
4
|
+
import type { OpenClawPluginApi } from 'openclaw/plugin-sdk';
|
|
5
|
+
declare const plugin: {
|
|
6
|
+
id: string;
|
|
7
|
+
name: string;
|
|
8
|
+
description: string;
|
|
9
|
+
configSchema: any;
|
|
10
|
+
register(api: OpenClawPluginApi): void;
|
|
11
|
+
};
|
|
12
|
+
export default plugin;
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAQ7D,QAAA,MAAM,MAAM;;;;;kBAKI,iBAAiB,GAAG,IAAI;CAQvC,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { emptyPluginConfigSchema } from 'openclaw/plugin-sdk';
|
|
2
|
+
import { setYuanbaoRuntime } from './src/runtime.js';
|
|
3
|
+
import { yuanbaoPlugin } from './src/channel.js';
|
|
4
|
+
import { initLogger } from './src/logger.js';
|
|
5
|
+
import { createLookupConversationMembersTool } from './src/tools/index.js';
|
|
6
|
+
const plugin = {
|
|
7
|
+
id: 'yuanbao',
|
|
8
|
+
name: '元宝派 Bot',
|
|
9
|
+
description: 'YuanBao intelligent bot channel via WebSocket',
|
|
10
|
+
configSchema: emptyPluginConfigSchema(),
|
|
11
|
+
register(api) {
|
|
12
|
+
initLogger(api);
|
|
13
|
+
setYuanbaoRuntime(api.runtime);
|
|
14
|
+
api.registerChannel({ plugin: yuanbaoPlugin });
|
|
15
|
+
// Tool: lookup_conversation_members
|
|
16
|
+
api.registerTool(createLookupConversationMembersTool, { optional: false });
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
export default plugin;
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,mCAAmC,EAAE,MAAM,sBAAsB,CAAC;AAE3E,MAAM,MAAM,GAAG;IACb,EAAE,EAAE,SAAS;IACb,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,+CAA+C;IAC5D,YAAY,EAAE,uBAAuB,EAAE;IACvC,QAAQ,CAAC,GAAsB;QAC7B,UAAU,CAAC,GAAG,CAAC,CAAC;QAChB,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC/B,GAAG,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QAE/C,oCAAoC;QACpC,GAAG,CAAC,YAAY,CAAC,mCAAmC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7E,CAAC;CACF,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { OpenClawConfig } from 'openclaw/plugin-sdk';
|
|
2
|
+
import type { ResolvedYuanbaoAccount } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* 获取配置中的所有元宝账号 ID 列表
|
|
5
|
+
* @param cfg - OpenClaw 全局配置
|
|
6
|
+
* @returns 账号 ID 数组,若无配置则返回默认账号
|
|
7
|
+
*/
|
|
8
|
+
export declare function listYuanbaoAccountIds(cfg: OpenClawConfig): string[];
|
|
9
|
+
/**
|
|
10
|
+
* 解析默认元宝账号 ID
|
|
11
|
+
* @param cfg - OpenClaw 全局配置
|
|
12
|
+
* @returns 默认账号 ID,优先使用配置中指定的 defaultAccount
|
|
13
|
+
*/
|
|
14
|
+
export declare function resolveDefaultYuanbaoAccountId(cfg: OpenClawConfig): string;
|
|
15
|
+
/**
|
|
16
|
+
* 解析并返回完整的账号配置对象
|
|
17
|
+
*
|
|
18
|
+
* 核心逻辑:合并顶层+子账号配置 → 提取各字段并设置默认值 → 判断 configured 状态
|
|
19
|
+
* configured 条件:appKey + appSecret 同时存在
|
|
20
|
+
*
|
|
21
|
+
* @param params - 包含全局配置和可选账号 ID
|
|
22
|
+
* @returns 完整的账号配置对象,包含所有必要字段和默认值
|
|
23
|
+
*/
|
|
24
|
+
export declare function resolveYuanbaoAccount(params: {
|
|
25
|
+
cfg: OpenClawConfig;
|
|
26
|
+
accountId?: string | null;
|
|
27
|
+
}): ResolvedYuanbaoAccount;
|
|
28
|
+
/**
|
|
29
|
+
* 获取所有已启用的元宝账号列表
|
|
30
|
+
* @param cfg - OpenClaw 全局配置
|
|
31
|
+
* @returns 已启用的账号配置数组
|
|
32
|
+
*/
|
|
33
|
+
export declare function listEnabledYuanbaoAccounts(cfg: OpenClawConfig): ResolvedYuanbaoAccount[];
|
|
34
|
+
//# sourceMappingURL=accounts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../src/accounts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG1D,OAAO,KAAK,EACV,sBAAsB,EAIvB,MAAM,YAAY,CAAC;AAcpB;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,EAAE,CAInE;AAED;;;;GAIG;AACH,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,CAM1E;AAuCD;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE;IAC5C,GAAG,EAAE,cAAc,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,GAAG,sBAAsB,CAuDzB;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,cAAc,GAAG,sBAAsB,EAAE,CAIxF"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from 'openclaw/plugin-sdk';
|
|
2
|
+
import { logSimple } from './logger.js';
|
|
3
|
+
const DEFAULT_API_DOMAIN = 'bot.yuanbao.tencent.com';
|
|
4
|
+
const DEFAULT_WS_GATEWAY_URL = 'wss://bot-wss.yuanbao.tencent.com/wss/connection';
|
|
5
|
+
// const DEFAULT_API_DOMAIN = "bot-test.yuanbao.tencent.com";
|
|
6
|
+
// const DEFAULT_WS_GATEWAY_URL = "wss://bot-wss-test.yuanbao.tencent.com/wss/connection";
|
|
7
|
+
function listConfiguredAccountIds(cfg) {
|
|
8
|
+
const accounts = cfg.channels?.yuanbao?.accounts;
|
|
9
|
+
if (!accounts || typeof accounts !== 'object')
|
|
10
|
+
return [];
|
|
11
|
+
return Object.keys(accounts).filter(Boolean);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* 获取配置中的所有元宝账号 ID 列表
|
|
15
|
+
* @param cfg - OpenClaw 全局配置
|
|
16
|
+
* @returns 账号 ID 数组,若无配置则返回默认账号
|
|
17
|
+
*/
|
|
18
|
+
export function listYuanbaoAccountIds(cfg) {
|
|
19
|
+
const ids = listConfiguredAccountIds(cfg);
|
|
20
|
+
if (ids.length === 0)
|
|
21
|
+
return [DEFAULT_ACCOUNT_ID];
|
|
22
|
+
return ids.sort((a, b) => a.localeCompare(b));
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 解析默认元宝账号 ID
|
|
26
|
+
* @param cfg - OpenClaw 全局配置
|
|
27
|
+
* @returns 默认账号 ID,优先使用配置中指定的 defaultAccount
|
|
28
|
+
*/
|
|
29
|
+
export function resolveDefaultYuanbaoAccountId(cfg) {
|
|
30
|
+
const yuanbaoConfig = cfg.channels?.yuanbao;
|
|
31
|
+
if (yuanbaoConfig?.defaultAccount?.trim())
|
|
32
|
+
return yuanbaoConfig.defaultAccount.trim();
|
|
33
|
+
const ids = listYuanbaoAccountIds(cfg);
|
|
34
|
+
if (ids.includes(DEFAULT_ACCOUNT_ID))
|
|
35
|
+
return DEFAULT_ACCOUNT_ID;
|
|
36
|
+
return ids[0] ?? DEFAULT_ACCOUNT_ID;
|
|
37
|
+
}
|
|
38
|
+
function resolveAccountConfig(cfg, accountId) {
|
|
39
|
+
const accounts = cfg.channels?.yuanbao?.accounts;
|
|
40
|
+
if (!accounts || typeof accounts !== 'object')
|
|
41
|
+
return undefined;
|
|
42
|
+
return accounts[accountId];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 合并账号配置:将顶层 yuanbao 配置作为基础,再叠加指定 accountId 的子配置
|
|
46
|
+
* 这样单账号场景直接用顶层配置,多账号场景子配置可覆盖顶层字段
|
|
47
|
+
*/
|
|
48
|
+
function mergeYuanbaoAccountConfig(cfg, accountId) {
|
|
49
|
+
const raw = (cfg.channels?.yuanbao ?? {});
|
|
50
|
+
const { accounts: _accounts, defaultAccount: _defaultAccount, ...base } = raw;
|
|
51
|
+
const account = resolveAccountConfig(cfg, accountId) ?? {};
|
|
52
|
+
const merged = { ...base, ...account };
|
|
53
|
+
return merged;
|
|
54
|
+
}
|
|
55
|
+
/** 解析溢出策略配置值 */
|
|
56
|
+
function resolveOverflowPolicy(raw) {
|
|
57
|
+
return raw === 'split' ? 'split' : 'stop';
|
|
58
|
+
}
|
|
59
|
+
/** 输出配置不完整的警告信息 */
|
|
60
|
+
function warnIncompleteConfig(appKey, appSecret) {
|
|
61
|
+
const missing = [];
|
|
62
|
+
if (!appKey)
|
|
63
|
+
missing.push('appKey');
|
|
64
|
+
if (!appSecret)
|
|
65
|
+
missing.push('appSecret');
|
|
66
|
+
if (missing.length > 0) {
|
|
67
|
+
logSimple('warn', `配置不完整,缺少: ${missing.join(', ')}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 解析并返回完整的账号配置对象
|
|
72
|
+
*
|
|
73
|
+
* 核心逻辑:合并顶层+子账号配置 → 提取各字段并设置默认值 → 判断 configured 状态
|
|
74
|
+
* configured 条件:appKey + appSecret 同时存在
|
|
75
|
+
*
|
|
76
|
+
* @param params - 包含全局配置和可选账号 ID
|
|
77
|
+
* @returns 完整的账号配置对象,包含所有必要字段和默认值
|
|
78
|
+
*/
|
|
79
|
+
export function resolveYuanbaoAccount(params) {
|
|
80
|
+
const accountId = normalizeAccountId(params.accountId);
|
|
81
|
+
const yuanbaoConfig = params.cfg.channels?.yuanbao;
|
|
82
|
+
const baseEnabled = yuanbaoConfig?.enabled !== false;
|
|
83
|
+
const merged = mergeYuanbaoAccountConfig(params.cfg, accountId);
|
|
84
|
+
const enabled = baseEnabled && merged.enabled !== false;
|
|
85
|
+
// 从合并后的配置中提取字段
|
|
86
|
+
const appKey = merged.appKey?.trim() || undefined;
|
|
87
|
+
const appSecret = merged.appSecret?.trim() || undefined;
|
|
88
|
+
const identifier = merged.identifier?.trim() || undefined;
|
|
89
|
+
const apiDomain = merged.apiDomain?.trim() || DEFAULT_API_DOMAIN;
|
|
90
|
+
const token = merged.token?.trim() || undefined;
|
|
91
|
+
const overflowPolicy = resolveOverflowPolicy(merged.overflowPolicy);
|
|
92
|
+
// WebSocket 配置
|
|
93
|
+
const wsGatewayUrl = merged.wsUrl?.trim() || DEFAULT_WS_GATEWAY_URL;
|
|
94
|
+
const wsHeartbeatInterval = undefined;
|
|
95
|
+
const wsMaxReconnectAttempts = 100;
|
|
96
|
+
// 媒体配置
|
|
97
|
+
const mediaMaxMb = merged.mediaMaxMb && merged.mediaMaxMb >= 1 ? merged.mediaMaxMb : 20;
|
|
98
|
+
// 群聊历史上下文条数(默认 100)
|
|
99
|
+
const historyLimit = merged.historyLimit !== undefined && merged.historyLimit >= 0
|
|
100
|
+
? merged.historyLimit
|
|
101
|
+
: 100;
|
|
102
|
+
// 配置完整需要 appKey + appSecret(identifier 可选)
|
|
103
|
+
const configured = Boolean(appKey && appSecret);
|
|
104
|
+
// 配置不完整时输出警告
|
|
105
|
+
if (!configured && Boolean(yuanbaoConfig)) {
|
|
106
|
+
warnIncompleteConfig(appKey, appSecret);
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
accountId,
|
|
110
|
+
name: merged.name?.trim() || undefined,
|
|
111
|
+
enabled,
|
|
112
|
+
configured,
|
|
113
|
+
appKey,
|
|
114
|
+
appSecret,
|
|
115
|
+
identifier,
|
|
116
|
+
botId: undefined,
|
|
117
|
+
apiDomain,
|
|
118
|
+
token,
|
|
119
|
+
wsGatewayUrl,
|
|
120
|
+
wsHeartbeatInterval,
|
|
121
|
+
wsMaxReconnectAttempts,
|
|
122
|
+
overflowPolicy,
|
|
123
|
+
mediaMaxMb,
|
|
124
|
+
historyLimit,
|
|
125
|
+
config: merged,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* 获取所有已启用的元宝账号列表
|
|
130
|
+
* @param cfg - OpenClaw 全局配置
|
|
131
|
+
* @returns 已启用的账号配置数组
|
|
132
|
+
*/
|
|
133
|
+
export function listEnabledYuanbaoAccounts(cfg) {
|
|
134
|
+
return listYuanbaoAccountIds(cfg)
|
|
135
|
+
.map(accountId => resolveYuanbaoAccount({ cfg, accountId }))
|
|
136
|
+
.filter(account => account.enabled);
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=accounts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../src/accounts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 元宝 API 客户端
|
|
3
|
+
*
|
|
4
|
+
* 将签票缓存(原 auth-cache.ts)与 HTTP 接口调用统一在一个文件中维护,
|
|
5
|
+
* 参考 QQBot 插件的组织方式:
|
|
6
|
+
* - token 按 accountId 隔离,Map 存储,20 天缓存
|
|
7
|
+
* - singleflight:并发签票请求复用同一个 Promise,避免重复调用
|
|
8
|
+
* - 所有 API 函数自动获取鉴权头,调用方只需传 account
|
|
9
|
+
*/
|
|
10
|
+
import type { ResolvedYuanbaoAccount } from './types.js';
|
|
11
|
+
export type SignTokenData = {
|
|
12
|
+
bot_id: string;
|
|
13
|
+
duration: number;
|
|
14
|
+
product: string;
|
|
15
|
+
source: string;
|
|
16
|
+
token: string;
|
|
17
|
+
};
|
|
18
|
+
export type AuthHeaders = {
|
|
19
|
+
'X-ID': string;
|
|
20
|
+
'X-Token': string;
|
|
21
|
+
'X-Source': string;
|
|
22
|
+
'X-Route-Env'?: string;
|
|
23
|
+
'X-AppVersion': string;
|
|
24
|
+
'X-OperationSystem': string;
|
|
25
|
+
'X-Instance-Id': string;
|
|
26
|
+
'X-Bot-Version': string;
|
|
27
|
+
};
|
|
28
|
+
/** COS 上传预签配置 */
|
|
29
|
+
export type CosUploadConfig = {
|
|
30
|
+
bucketName: string;
|
|
31
|
+
region: string;
|
|
32
|
+
location: string;
|
|
33
|
+
encryptTmpSecretId: string;
|
|
34
|
+
encryptTmpSecretKey: string;
|
|
35
|
+
encryptToken: string;
|
|
36
|
+
startTime: number;
|
|
37
|
+
expiredTime: number;
|
|
38
|
+
resourceUrl: string;
|
|
39
|
+
resourceID?: string;
|
|
40
|
+
};
|
|
41
|
+
type Log = {
|
|
42
|
+
info?: (msg: string) => void;
|
|
43
|
+
warn?: (msg: string) => void;
|
|
44
|
+
error?: (msg: string) => void;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* 清除指定账号的 token 缓存(强制下次重新签票)
|
|
48
|
+
*
|
|
49
|
+
* @param accountId - 要清除缓存的账号 ID
|
|
50
|
+
*/
|
|
51
|
+
export declare function clearSignTokenCache(accountId: string): void;
|
|
52
|
+
/**
|
|
53
|
+
* 清除所有账号的 token 缓存
|
|
54
|
+
*/
|
|
55
|
+
export declare function clearAllSignTokenCache(): void;
|
|
56
|
+
/**
|
|
57
|
+
* 查看 token 缓存状态(用于监控/调试)
|
|
58
|
+
*
|
|
59
|
+
* @param accountId - 账号 ID
|
|
60
|
+
* @returns 缓存状态对象:status 为当前状态,expiresAt 为过期时间戳(无缓存时为 null)
|
|
61
|
+
*/
|
|
62
|
+
export declare function getTokenStatus(accountId: string): {
|
|
63
|
+
status: 'valid' | 'expired' | 'refreshing' | 'none';
|
|
64
|
+
expiresAt: number | null;
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* 使用恒定时间比较验证 HMAC 签名,防止时序攻击。
|
|
68
|
+
* 使用 === 比较签名字符串时,JavaScript 引擎会在发现第一个不匹配的字符时立即返回 false,攻击者可以通过测量响应时间逐字节推断出正确的签名值。
|
|
69
|
+
*
|
|
70
|
+
* @param expected - 预期签名(hex 字符串)
|
|
71
|
+
* @param actual - 待验证的实际签名(hex 字符串)
|
|
72
|
+
* @returns 签名匹配时返回 true
|
|
73
|
+
*/
|
|
74
|
+
export declare function verifySignature(expected: string, actual: string): boolean;
|
|
75
|
+
/**
|
|
76
|
+
* 获取签票数据(20 天内存缓存 + singleflight 并发安全)
|
|
77
|
+
*
|
|
78
|
+
* - 静态 token:直接返回,不走缓存也不调用接口
|
|
79
|
+
* - 缓存命中:直接返回
|
|
80
|
+
* - 缓存未命中/过期:调用接口,并发请求复用同一 Promise
|
|
81
|
+
*
|
|
82
|
+
* @param account - 账号配置(含 appKey/appSecret 或 token)
|
|
83
|
+
* @param log - 可选日志对象
|
|
84
|
+
* @returns 签票数据
|
|
85
|
+
*/
|
|
86
|
+
export declare function getSignToken(account: ResolvedYuanbaoAccount, log?: Log): Promise<SignTokenData>;
|
|
87
|
+
/**
|
|
88
|
+
* 获取鉴权请求头(X-ID / X-Token / X-Source),同时回填 account.botId
|
|
89
|
+
*/
|
|
90
|
+
export declare function getAuthHeaders(account: ResolvedYuanbaoAccount, log?: Log): Promise<AuthHeaders>;
|
|
91
|
+
/**
|
|
92
|
+
* 获取 COS 上传预签配置
|
|
93
|
+
*
|
|
94
|
+
* @param account - 账号配置(用于鉴权)
|
|
95
|
+
* @param fileName - 文件名(含扩展名)
|
|
96
|
+
* @param fileId - 客户端生成的唯一文件 ID(hex 随机串)
|
|
97
|
+
* @param log - 可选日志对象
|
|
98
|
+
* @returns COS 上传预签配置,含 bucket、region、临时凭证等
|
|
99
|
+
*/
|
|
100
|
+
export declare function apiGetUploadInfo(account: ResolvedYuanbaoAccount, fileName: string, fileId: string, log?: Log): Promise<CosUploadConfig>;
|
|
101
|
+
/**
|
|
102
|
+
* 用 resourceId 换取 COS 下载链接
|
|
103
|
+
*
|
|
104
|
+
* @param account - 账号配置(用于鉴权)
|
|
105
|
+
* @param resourceId - 元宝资源 ID
|
|
106
|
+
* @param log - 可选日志对象
|
|
107
|
+
* @returns COS 下载 URL
|
|
108
|
+
*/
|
|
109
|
+
export declare function apiGetDownloadUrl(account: ResolvedYuanbaoAccount, resourceId: string, log?: Log): Promise<string>;
|
|
110
|
+
export {};
|
|
111
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAMzD,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,iBAAiB;AACjB,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,KAAK,GAAG,GAAG;IACT,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B,CAAC;AA+BF;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAE3D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,YAAY,GAAG,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAUnI;AAeD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAOzE;AA0ED;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,sBAAsB,EAC/B,GAAG,CAAC,EAAE,GAAG,GACR,OAAO,CAAC,aAAa,CAAC,CAqCxB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,sBAAsB,EAC/B,GAAG,CAAC,EAAE,GAAG,GACR,OAAO,CAAC,WAAW,CAAC,CAsBtB;AA8ED;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,sBAAsB,EAC/B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,GAAG,CAAC,EAAE,GAAG,GACR,OAAO,CAAC,eAAe,CAAC,CAa1B;AAID;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,sBAAsB,EAC/B,UAAU,EAAE,MAAM,EAClB,GAAG,CAAC,EAAE,GAAG,GACR,OAAO,CAAC,MAAM,CAAC,CAcjB"}
|
package/dist/src/api.js
ADDED
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 元宝 API 客户端
|
|
3
|
+
*
|
|
4
|
+
* 将签票缓存(原 auth-cache.ts)与 HTTP 接口调用统一在一个文件中维护,
|
|
5
|
+
* 参考 QQBot 插件的组织方式:
|
|
6
|
+
* - token 按 accountId 隔离,Map 存储,20 天缓存
|
|
7
|
+
* - singleflight:并发签票请求复用同一个 Promise,避免重复调用
|
|
8
|
+
* - 所有 API 函数自动获取鉴权头,调用方只需传 account
|
|
9
|
+
*/
|
|
10
|
+
import { createHmac, randomBytes, timingSafeEqual } from 'node:crypto';
|
|
11
|
+
import { LOG_PREFIX, sanitize } from './logger.js';
|
|
12
|
+
import { getOpenclawVersion, getOperationSystem, getPluginVersion } from './utils/get-env.js';
|
|
13
|
+
// ============ 常量 ============
|
|
14
|
+
const SIGN_TOKEN_PATH = '/api/v5/robotLogic/sign-token';
|
|
15
|
+
const UPLOAD_INFO_PATH = '/api/resource/genUploadInfo';
|
|
16
|
+
const DOWNLOAD_INFO_PATH = '/api/resource/v1/download';
|
|
17
|
+
const RETRYABLE_SIGN_CODE = 10099;
|
|
18
|
+
const SIGN_MAX_RETRIES = 3;
|
|
19
|
+
const SIGN_RETRY_DELAY_MS = 1000;
|
|
20
|
+
/** token 缓存有效期:20 天 */
|
|
21
|
+
const CACHE_TTL_MS = 20 * 24 * 60 * 60 * 1000;
|
|
22
|
+
// ============ Token 缓存(按 accountId 隔离) ============
|
|
23
|
+
/** key: accountId */
|
|
24
|
+
const tokenCacheMap = new Map();
|
|
25
|
+
/**
|
|
26
|
+
* 进行中的签票 Promise(singleflight)
|
|
27
|
+
* 多个并发请求发现缓存过期时,只有第一个真正调用接口,其余复用同一 Promise。
|
|
28
|
+
*/
|
|
29
|
+
const tokenFetchPromises = new Map();
|
|
30
|
+
/**
|
|
31
|
+
* 清除指定账号的 token 缓存(强制下次重新签票)
|
|
32
|
+
*
|
|
33
|
+
* @param accountId - 要清除缓存的账号 ID
|
|
34
|
+
*/
|
|
35
|
+
export function clearSignTokenCache(accountId) {
|
|
36
|
+
tokenCacheMap.delete(accountId);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* 清除所有账号的 token 缓存
|
|
40
|
+
*/
|
|
41
|
+
export function clearAllSignTokenCache() {
|
|
42
|
+
tokenCacheMap.clear();
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 查看 token 缓存状态(用于监控/调试)
|
|
46
|
+
*
|
|
47
|
+
* @param accountId - 账号 ID
|
|
48
|
+
* @returns 缓存状态对象:status 为当前状态,expiresAt 为过期时间戳(无缓存时为 null)
|
|
49
|
+
*/
|
|
50
|
+
export function getTokenStatus(accountId) {
|
|
51
|
+
if (tokenFetchPromises.has(accountId)) {
|
|
52
|
+
return { status: 'refreshing', expiresAt: tokenCacheMap.get(accountId)?.expiresAt ?? null };
|
|
53
|
+
}
|
|
54
|
+
const cached = tokenCacheMap.get(accountId);
|
|
55
|
+
if (!cached)
|
|
56
|
+
return { status: 'none', expiresAt: null };
|
|
57
|
+
return {
|
|
58
|
+
status: cached.expiresAt > Date.now() ? 'valid' : 'expired',
|
|
59
|
+
expiresAt: cached.expiresAt,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
// ============ 签票(内部) ============
|
|
63
|
+
function computeSignature(params) {
|
|
64
|
+
const plain = params.nonce + params.timestamp + params.appKey + params.appSecret;
|
|
65
|
+
return createHmac('sha256', params.appSecret).update(plain)
|
|
66
|
+
.digest('hex');
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* 使用恒定时间比较验证 HMAC 签名,防止时序攻击。
|
|
70
|
+
* 使用 === 比较签名字符串时,JavaScript 引擎会在发现第一个不匹配的字符时立即返回 false,攻击者可以通过测量响应时间逐字节推断出正确的签名值。
|
|
71
|
+
*
|
|
72
|
+
* @param expected - 预期签名(hex 字符串)
|
|
73
|
+
* @param actual - 待验证的实际签名(hex 字符串)
|
|
74
|
+
* @returns 签名匹配时返回 true
|
|
75
|
+
*/
|
|
76
|
+
export function verifySignature(expected, actual) {
|
|
77
|
+
const expectedBuf = Buffer.from(expected, 'hex');
|
|
78
|
+
const actualBuf = Buffer.from(actual, 'hex');
|
|
79
|
+
if (expectedBuf.length !== actualBuf.length) {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
return timingSafeEqual(expectedBuf, actualBuf);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* 内部实现:发起签票 HTTP 请求,支持自动重试(最多 SIGN_MAX_RETRIES 次)。
|
|
86
|
+
*
|
|
87
|
+
* @param account - 账号配置,需包含 appKey、appSecret、apiDomain
|
|
88
|
+
* @param log - 可选日志对象
|
|
89
|
+
* @returns 签票数据(含 token、bot_id 等字段)
|
|
90
|
+
*/
|
|
91
|
+
async function doFetchSignToken(account, log) {
|
|
92
|
+
const { appKey, appSecret, apiDomain } = account;
|
|
93
|
+
if (!appKey || !appSecret)
|
|
94
|
+
throw new Error('签票失败: 缺少 appKey 或 appSecret');
|
|
95
|
+
const url = `https://${apiDomain}${SIGN_TOKEN_PATH}`;
|
|
96
|
+
for (let attempt = 0; attempt <= SIGN_MAX_RETRIES; attempt++) {
|
|
97
|
+
const nonce = randomBytes(16).toString('hex');
|
|
98
|
+
const bjTime = new Date(Date.now() + 8 * 3600000);
|
|
99
|
+
const timestamp = bjTime.toISOString().replace('Z', '+08:00')
|
|
100
|
+
.replace(/\.\d{3}/, '');
|
|
101
|
+
const signature = computeSignature({ nonce, timestamp, appKey, appSecret });
|
|
102
|
+
const body = { app_key: appKey, nonce, signature, timestamp };
|
|
103
|
+
log?.info?.(`${LOG_PREFIX} [${account.accountId}] 正在签票: url=${url}${attempt > 0 ? ` (重试 ${attempt}/${SIGN_MAX_RETRIES})` : ''}`);
|
|
104
|
+
log?.info?.(`${LOG_PREFIX} [${account.accountId}] 签票入参: ${sanitize(body)}`);
|
|
105
|
+
const headers = {
|
|
106
|
+
'Content-Type': 'application/json',
|
|
107
|
+
'X-AppVersion': getPluginVersion(),
|
|
108
|
+
'X-OperationSystem': getOperationSystem(),
|
|
109
|
+
'X-Instance-Id': '16',
|
|
110
|
+
'X-Bot-Version': getOpenclawVersion(),
|
|
111
|
+
};
|
|
112
|
+
if (account.config?.routeEnv) {
|
|
113
|
+
headers['x-route-env'] = account.config.routeEnv;
|
|
114
|
+
}
|
|
115
|
+
log?.info?.(`${LOG_PREFIX} [${account.accountId}] 签票请求头: ${JSON.stringify(headers)}`);
|
|
116
|
+
const response = await fetch(url, {
|
|
117
|
+
method: 'POST',
|
|
118
|
+
headers,
|
|
119
|
+
body: JSON.stringify(body),
|
|
120
|
+
});
|
|
121
|
+
if (!response.ok) {
|
|
122
|
+
throw new Error(`签票请求失败: HTTP ${response.status} ${response.statusText}`);
|
|
123
|
+
}
|
|
124
|
+
const result = (await response.json());
|
|
125
|
+
if (result.code === 0) {
|
|
126
|
+
log?.info?.(`${LOG_PREFIX} [${account.accountId}] 签票成功: bot_id=${result.data.bot_id}`);
|
|
127
|
+
return result.data;
|
|
128
|
+
}
|
|
129
|
+
if (result.code === RETRYABLE_SIGN_CODE && attempt < SIGN_MAX_RETRIES) {
|
|
130
|
+
log?.warn?.(`${LOG_PREFIX} [${account.accountId}] 签票可重试: code=${result.code}, 将在 ${SIGN_RETRY_DELAY_MS}ms 后重试`);
|
|
131
|
+
await new Promise(r => setTimeout(r, SIGN_RETRY_DELAY_MS));
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
throw new Error(`签票错误: code=${result.code}, msg=${result.msg}`);
|
|
135
|
+
}
|
|
136
|
+
throw new Error('签票失败: 超过最大重试次数');
|
|
137
|
+
}
|
|
138
|
+
// ============ 公开:获取 token ============
|
|
139
|
+
/**
|
|
140
|
+
* 获取签票数据(20 天内存缓存 + singleflight 并发安全)
|
|
141
|
+
*
|
|
142
|
+
* - 静态 token:直接返回,不走缓存也不调用接口
|
|
143
|
+
* - 缓存命中:直接返回
|
|
144
|
+
* - 缓存未命中/过期:调用接口,并发请求复用同一 Promise
|
|
145
|
+
*
|
|
146
|
+
* @param account - 账号配置(含 appKey/appSecret 或 token)
|
|
147
|
+
* @param log - 可选日志对象
|
|
148
|
+
* @returns 签票数据
|
|
149
|
+
*/
|
|
150
|
+
export async function getSignToken(account, log) {
|
|
151
|
+
// 静态 token 优先
|
|
152
|
+
if (account.token) {
|
|
153
|
+
return {
|
|
154
|
+
bot_id: account.botId || account.identifier || '',
|
|
155
|
+
duration: CACHE_TTL_MS / 1000,
|
|
156
|
+
product: 'yuanbao',
|
|
157
|
+
source: 'bot',
|
|
158
|
+
token: account.token,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
const cached = tokenCacheMap.get(account.accountId);
|
|
162
|
+
if (cached && cached.expiresAt > Date.now()) {
|
|
163
|
+
log?.info?.(`${LOG_PREFIX} [${account.accountId}] 使用缓存 token (剩余 ${Math.round((cached.expiresAt - Date.now()) / 86400000)} 天)`);
|
|
164
|
+
return cached.data;
|
|
165
|
+
}
|
|
166
|
+
// Singleflight:已有进行中的请求则复用
|
|
167
|
+
let fetchPromise = tokenFetchPromises.get(account.accountId);
|
|
168
|
+
if (fetchPromise) {
|
|
169
|
+
log?.info?.(`${LOG_PREFIX} [${account.accountId}] 签票进行中,等待已有请求`);
|
|
170
|
+
return fetchPromise;
|
|
171
|
+
}
|
|
172
|
+
fetchPromise = (async () => {
|
|
173
|
+
try {
|
|
174
|
+
const data = await doFetchSignToken(account, log);
|
|
175
|
+
tokenCacheMap.set(account.accountId, { data, expiresAt: Date.now() + CACHE_TTL_MS });
|
|
176
|
+
return data;
|
|
177
|
+
}
|
|
178
|
+
finally {
|
|
179
|
+
tokenFetchPromises.delete(account.accountId);
|
|
180
|
+
}
|
|
181
|
+
})();
|
|
182
|
+
tokenFetchPromises.set(account.accountId, fetchPromise);
|
|
183
|
+
return fetchPromise;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* 获取鉴权请求头(X-ID / X-Token / X-Source),同时回填 account.botId
|
|
187
|
+
*/
|
|
188
|
+
export async function getAuthHeaders(account, log) {
|
|
189
|
+
const data = await getSignToken(account, log);
|
|
190
|
+
if (data.bot_id && !account.botId) {
|
|
191
|
+
account.botId = data.bot_id;
|
|
192
|
+
}
|
|
193
|
+
const authHeaders = {
|
|
194
|
+
'X-ID': data.bot_id || account.botId || account.identifier || '',
|
|
195
|
+
'X-Token': data.token,
|
|
196
|
+
'X-Source': data.source || 'web',
|
|
197
|
+
'X-AppVersion': getPluginVersion(),
|
|
198
|
+
'X-OperationSystem': getOperationSystem(),
|
|
199
|
+
'X-Instance-Id': '16',
|
|
200
|
+
'X-Bot-Version': getOpenclawVersion(),
|
|
201
|
+
};
|
|
202
|
+
if (account.config?.routeEnv) {
|
|
203
|
+
authHeaders['X-Route-Env'] = account.config.routeEnv;
|
|
204
|
+
}
|
|
205
|
+
return authHeaders;
|
|
206
|
+
}
|
|
207
|
+
// ============ 内部 HTTP 工具 ============
|
|
208
|
+
/**
|
|
209
|
+
* 以 POST 方式调用元宝 API,自动附加鉴权头,统一处理 HTTP 和业务错误。
|
|
210
|
+
*
|
|
211
|
+
* @param account - 账号配置(用于拼接域名和获取鉴权头)
|
|
212
|
+
* @param path - API 路径(如 /api/v5/robotLogic/sign-token)
|
|
213
|
+
* @param body - 请求体(将被 JSON 序列化)
|
|
214
|
+
* @param log - 可选日志对象
|
|
215
|
+
* @returns 响应 data 字段(若无 data 则返回整个响应体)
|
|
216
|
+
*/
|
|
217
|
+
async function yuanbaoPost(account, path, body, log) {
|
|
218
|
+
const url = `https://${account.apiDomain}${path}`;
|
|
219
|
+
const authHeaders = await getAuthHeaders(account, log);
|
|
220
|
+
const response = await fetch(url, {
|
|
221
|
+
method: 'POST',
|
|
222
|
+
headers: {
|
|
223
|
+
'Content-Type': 'application/json',
|
|
224
|
+
...authHeaders,
|
|
225
|
+
},
|
|
226
|
+
body: JSON.stringify(body),
|
|
227
|
+
});
|
|
228
|
+
if (!response.ok) {
|
|
229
|
+
throw new Error(`[yuanbao-api] ${path} HTTP ${response.status} ${response.statusText}`);
|
|
230
|
+
}
|
|
231
|
+
const json = (await response.json());
|
|
232
|
+
if (json.code !== 0 && json.code !== undefined) {
|
|
233
|
+
throw new Error(`[yuanbao-api] ${path} 错误: code=${json.code}, msg=${json.msg}`);
|
|
234
|
+
}
|
|
235
|
+
log?.info?.(`${LOG_PREFIX} [${account.accountId}] ${path} 响应: ${sanitize(json)}`);
|
|
236
|
+
return (json.data ?? json);
|
|
237
|
+
}
|
|
238
|
+
async function yuanbaoGet(account, path, params, log) {
|
|
239
|
+
const url = `https://${account.apiDomain}${path}${params ? `?${new URLSearchParams(params).toString()}` : ''}`;
|
|
240
|
+
const authHeaders = await getAuthHeaders(account, log);
|
|
241
|
+
const response = await fetch(url, {
|
|
242
|
+
method: 'GET',
|
|
243
|
+
headers: {
|
|
244
|
+
'Content-Type': 'application/json',
|
|
245
|
+
...authHeaders,
|
|
246
|
+
},
|
|
247
|
+
});
|
|
248
|
+
if (!response.ok) {
|
|
249
|
+
throw new Error(`[yuanbao-api] ${path} HTTP ${response.status} ${response.statusText}`);
|
|
250
|
+
}
|
|
251
|
+
const json = (await response.json());
|
|
252
|
+
if (json.code !== 0 && json.code !== undefined) {
|
|
253
|
+
throw new Error(`[yuanbao-api] ${path} 错误: code=${json.code}, msg=${json.msg}`);
|
|
254
|
+
}
|
|
255
|
+
return (json.data ?? json);
|
|
256
|
+
}
|
|
257
|
+
// ============ 上传 API ============
|
|
258
|
+
/**
|
|
259
|
+
* 获取 COS 上传预签配置
|
|
260
|
+
*
|
|
261
|
+
* @param account - 账号配置(用于鉴权)
|
|
262
|
+
* @param fileName - 文件名(含扩展名)
|
|
263
|
+
* @param fileId - 客户端生成的唯一文件 ID(hex 随机串)
|
|
264
|
+
* @param log - 可选日志对象
|
|
265
|
+
* @returns COS 上传预签配置,含 bucket、region、临时凭证等
|
|
266
|
+
*/
|
|
267
|
+
export async function apiGetUploadInfo(account, fileName, fileId, log) {
|
|
268
|
+
const data = await yuanbaoPost(account, UPLOAD_INFO_PATH, { fileName, fileId, docFrom: 'localDoc', docOpenId: '' }, log);
|
|
269
|
+
if (!data.bucketName || !data.location) {
|
|
270
|
+
throw new Error(`[yuanbao-api] genUploadInfo 配置不完整: ${JSON.stringify(data)}`);
|
|
271
|
+
}
|
|
272
|
+
return data;
|
|
273
|
+
}
|
|
274
|
+
// ============ 下载 API ============
|
|
275
|
+
/**
|
|
276
|
+
* 用 resourceId 换取 COS 下载链接
|
|
277
|
+
*
|
|
278
|
+
* @param account - 账号配置(用于鉴权)
|
|
279
|
+
* @param resourceId - 元宝资源 ID
|
|
280
|
+
* @param log - 可选日志对象
|
|
281
|
+
* @returns COS 下载 URL
|
|
282
|
+
*/
|
|
283
|
+
export async function apiGetDownloadUrl(account, resourceId, log) {
|
|
284
|
+
const data = await yuanbaoGet(account, DOWNLOAD_INFO_PATH, { resourceId }, log);
|
|
285
|
+
const downloadUrl = data.url ?? data.realUrl;
|
|
286
|
+
if (!downloadUrl) {
|
|
287
|
+
throw new Error(`[yuanbao-api] resource/v1/download 未返回有效 URL: ${JSON.stringify(data)}`);
|
|
288
|
+
}
|
|
289
|
+
return downloadUrl;
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEvE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAgD9F,+BAA+B;AAE/B,MAAM,eAAe,GAAG,+BAA+B,CAAC;AACxD,MAAM,gBAAgB,GAAG,6BAA6B,CAAC;AACvD,MAAM,kBAAkB,GAAG,2BAA2B,CAAC;AAEvD,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAClC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAC3B,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAEjC,uBAAuB;AACvB,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE9C,qDAAqD;AAErD,qBAAqB;AACrB,MAAM,aAAa,GAAG,IAAI,GAAG,EAAsB,CAAC;AAEpD;;;GAGG;AACH,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAkC,CAAC;AAErE;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAiB;IACnD,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB;IACpC,aAAa,CAAC,KAAK,EAAE,CAAC;AACxB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,IAAI,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QACtC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,SAAS,IAAI,IAAI,EAAE,CAAC;IAC9F,CAAC;IACD,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACxD,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;QAC3D,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC;AACJ,CAAC;AAED,mCAAmC;AAEnC,SAAS,gBAAgB,CAAC,MAKzB;IACC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC;IACjF,OAAO,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SACxD,MAAM,CAAC,KAAK,CAAC,CAAC;AACnB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,MAAc;IAC9D,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC7C,IAAI,WAAW,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,eAAe,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;AACjD,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,gBAAgB,CAC7B,OAA+B,EAC/B,GAAS;IAET,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IACjD,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAE1E,MAAM,GAAG,GAAG,WAAW,SAAS,GAAG,eAAe,EAAE,CAAC;IAErD,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,gBAAgB,EAAE,OAAO,EAAE,EAAE,CAAC;QAC7D,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC;aAC1D,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC1B,MAAM,SAAS,GAAG,gBAAgB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAC5E,MAAM,IAAI,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;QAE9D,GAAG,EAAE,IAAI,EAAE,CAAC,GAAG,UAAU,KAAK,OAAO,CAAC,SAAS,eAAe,GAAG,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,OAAO,IAAI,gBAAgB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACjI,GAAG,EAAE,IAAI,EAAE,CAAC,GAAG,UAAU,KAAK,OAAO,CAAC,SAAS,WAAW,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE5E,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,cAAc,EAAE,gBAAgB,EAAE;YAClC,mBAAmB,EAAE,kBAAkB,EAAE;YACzC,eAAe,EAAE,IAAI;YACrB,eAAe,EAAE,kBAAkB,EAAE;SACtC,CAAC;QAEF,IAAI,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;YAC7B,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;QACnD,CAAC;QAED,GAAG,EAAE,IAAI,EAAE,CAAC,GAAG,UAAU,KAAK,OAAO,CAAC,SAAS,YAAY,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAEtF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,gBAAgB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAuD,CAAC;QAE7F,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACtB,GAAG,EAAE,IAAI,EAAE,CAAC,GAAG,UAAU,KAAK,OAAO,CAAC,SAAS,kBAAkB,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YACvF,OAAO,MAAM,CAAC,IAAI,CAAC;QACrB,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,KAAK,mBAAmB,IAAI,OAAO,GAAG,gBAAgB,EAAE,CAAC;YACtE,GAAG,EAAE,IAAI,EAAE,CAAC,GAAG,UAAU,KAAK,OAAO,CAAC,SAAS,iBAAiB,MAAM,CAAC,IAAI,QAAQ,mBAAmB,QAAQ,CAAC,CAAC;YAChH,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC;YAC3D,SAAS;QACX,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,cAAc,MAAM,CAAC,IAAI,SAAS,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;AACpC,CAAC;AAED,wCAAwC;AAExC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAA+B,EAC/B,GAAS;IAET,cAAc;IACd,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO;YACL,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,UAAU,IAAI,EAAE;YACjD,QAAQ,EAAE,YAAY,GAAG,IAAI;YAC7B,OAAO,EAAE,SAAS;YAClB,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACpD,IAAI,MAAM,IAAI,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAC5C,GAAG,EAAE,IAAI,EAAE,CAAC,GAAG,UAAU,KAAK,OAAO,CAAC,SAAS,oBAAoB,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChI,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,2BAA2B;IAC3B,IAAI,YAAY,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC7D,IAAI,YAAY,EAAE,CAAC;QACjB,GAAG,EAAE,IAAI,EAAE,CAAC,GAAG,UAAU,KAAK,OAAO,CAAC,SAAS,gBAAgB,CAAC,CAAC;QACjE,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,YAAY,GAAG,CAAC,KAAK,IAAI,EAAE;QACzB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAClD,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,EAAE,CAAC,CAAC;YACrF,OAAO,IAAI,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IAEL,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACxD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAA+B,EAC/B,GAAS;IAET,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAE9C,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,MAAM,WAAW,GAAgB;QAC/B,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,UAAU,IAAI,EAAE;QAChE,SAAS,EAAE,IAAI,CAAC,KAAK;QACrB,UAAU,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK;QAChC,cAAc,EAAE,gBAAgB,EAAE;QAClC,mBAAmB,EAAE,kBAAkB,EAAE;QACzC,eAAe,EAAE,IAAI;QACrB,eAAe,EAAE,kBAAkB,EAAE;KACtC,CAAC;IAEF,IAAI,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;QAC7B,WAAW,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;IACvD,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,uCAAuC;AAEvC;;;;;;;;GAQG;AACH,KAAK,UAAU,WAAW,CACxB,OAA+B,EAC/B,IAAY,EACZ,IAAa,EACb,GAAS;IAET,MAAM,GAAG,GAAG,WAAW,OAAO,CAAC,SAAS,GAAG,IAAI,EAAE,CAAC;IAClD,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAEvD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,GAAG,WAAW;SACf;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,SAAS,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA8C,CAAC;IAElF,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,aAAa,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,GAAG,EAAE,IAAI,EAAE,CAAC,GAAG,UAAU,KAAK,OAAO,CAAC,SAAS,KAAK,IAAI,QAAQ,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClF,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAM,CAAC;AAClC,CAAC;AAGD,KAAK,UAAU,UAAU,CACvB,OAA+B,EAC/B,IAAY,EACZ,MAA+B,EAC/B,GAAS;IAET,MAAM,GAAG,GAAG,WAAW,OAAO,CAAC,SAAS,GAAG,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAC/G,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAEvD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,KAAK;QACb,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,GAAG,WAAW;SACf;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,SAAS,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA8C,CAAC;IAElF,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,aAAa,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAM,CAAC;AAClC,CAAC;AAED,mCAAmC;AAEnC;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAA+B,EAC/B,QAAgB,EAChB,MAAc,EACd,GAAS;IAET,MAAM,IAAI,GAAG,MAAM,WAAW,CAC5B,OAAO,EACP,gBAAgB,EAChB,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,EACxD,GAAG,CACJ,CAAC;IAEF,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,sCAAsC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,mCAAmC;AAEnC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAA+B,EAC/B,UAAkB,EAClB,GAAS;IAET,MAAM,IAAI,GAAG,MAAM,UAAU,CAC3B,OAAO,EACP,kBAAkB,EAClB,EAAE,UAAU,EAAE,EACd,GAAG,CACJ,CAAC;IAEF,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC;IAC7C,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,iDAAiD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3F,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ChannelPlugin } from 'openclaw/plugin-sdk';
|
|
2
|
+
import type { ResolvedYuanbaoAccount } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* 频道插件主定义对象,实现 ChannelPlugin 接口
|
|
5
|
+
*/
|
|
6
|
+
export declare const yuanbaoPlugin: ChannelPlugin<ResolvedYuanbaoAccount>;
|
|
7
|
+
//# sourceMappingURL=channel.d.ts.map
|