liangzimixin 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/accounts.d.ts +45 -0
- package/dist/accounts.d.ts.map +1 -0
- package/dist/accounts.js +73 -0
- package/dist/accounts.js.map +1 -0
- package/dist/auth/oauth-client.d.ts +1 -1
- package/dist/auth/oauth-client.js +1 -1
- package/dist/auth/token-manager.d.ts +1 -1
- package/dist/auth/token-manager.js +1 -1
- package/dist/auth/token-store.d.ts +4 -4
- package/dist/auth/token-store.js +4 -4
- package/dist/channel/gate.d.ts +1 -1
- package/dist/channel/gate.js +1 -1
- package/dist/channel/outbound.d.ts +1 -1
- package/dist/channel/outbound.d.ts.map +1 -1
- package/dist/channel/outbound.js +10 -9
- package/dist/channel/outbound.js.map +1 -1
- package/dist/channel/plugin.d.ts +1 -1
- package/dist/channel/plugin.d.ts.map +1 -1
- package/dist/channel/plugin.js +36 -29
- package/dist/channel/plugin.js.map +1 -1
- package/dist/config-schema.d.ts +33 -275
- package/dist/config-schema.d.ts.map +1 -1
- package/dist/config-schema.js +33 -279
- package/dist/config-schema.js.map +1 -1
- package/dist/config.d.ts +133 -78
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +93 -139
- package/dist/config.js.map +1 -1
- package/dist/constants.d.ts +25 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +30 -0
- package/dist/constants.js.map +1 -0
- package/dist/crypto/crypto-engine.d.ts +1 -1
- package/dist/crypto/crypto-engine.js +1 -1
- package/dist/crypto/key-manager.d.ts +1 -1
- package/dist/crypto/key-manager.js +1 -1
- package/dist/crypto/quantun-plug-mock.d.ts +1 -1
- package/dist/crypto/quantun-plug-mock.js +1 -1
- package/dist/crypto/strategy.d.ts +1 -1
- package/dist/crypto/strategy.js +1 -1
- package/dist/file/api-client.d.ts +1 -1
- package/dist/file/api-client.js +1 -1
- package/dist/file/download.d.ts +1 -1
- package/dist/file/download.js +1 -1
- package/dist/file/http-client.d.ts +1 -1
- package/dist/file/http-client.js +1 -1
- package/dist/file/media.d.ts +1 -1
- package/dist/file/media.d.ts.map +1 -1
- package/dist/file/media.js +4 -3
- package/dist/file/media.js.map +1 -1
- package/dist/file/upload.d.ts +1 -1
- package/dist/file/upload.js +1 -1
- package/dist/index.d.ts +17 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -30
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +1 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +3 -2
- package/dist/logger.js.map +1 -1
- package/dist/message-handler/abort-detect.d.ts +1 -1
- package/dist/message-handler/abort-detect.js +1 -1
- package/dist/message-handler/content-resolver.d.ts +1 -1
- package/dist/message-handler/content-resolver.js +1 -1
- package/dist/message-handler/envelope-builder.d.ts +1 -1
- package/dist/message-handler/envelope-builder.d.ts.map +1 -1
- package/dist/message-handler/envelope-builder.js +7 -6
- package/dist/message-handler/envelope-builder.js.map +1 -1
- package/dist/message-handler/handler.d.ts +1 -1
- package/dist/message-handler/handler.js +1 -1
- package/dist/message-handler/parser.d.ts +1 -1
- package/dist/message-handler/parser.js +1 -1
- package/dist/push/cockatoo-client.d.ts +1 -1
- package/dist/push/cockatoo-client.js +1 -1
- package/dist/push/message-transformer.d.ts +1 -1
- package/dist/push/message-transformer.js +1 -1
- package/dist/push/push-queue.d.ts +1 -1
- package/dist/push/push-queue.js +1 -1
- package/dist/reply-dispatcher/dispatcher.d.ts +1 -1
- package/dist/reply-dispatcher/dispatcher.js +1 -1
- package/dist/reply-dispatcher/stream-handler.d.ts +1 -1
- package/dist/reply-dispatcher/stream-handler.js +1 -1
- package/dist/reply-dispatcher/typing-indicator.d.ts +1 -1
- package/dist/reply-dispatcher/typing-indicator.js +1 -1
- package/dist/transport/connection-manager.d.ts +1 -1
- package/dist/transport/connection-manager.js +1 -1
- package/dist/transport/dedup.d.ts +1 -1
- package/dist/transport/dedup.js +1 -1
- package/dist/transport/message-pipe.d.ts +1 -1
- package/dist/transport/message-pipe.js +1 -1
- package/dist/transport/ws-client.d.ts +1 -1
- package/dist/transport/ws-client.js +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.js +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* openclaw-liangzimixin — 多账户配置读取
|
|
3
|
+
*
|
|
4
|
+
* 从 OpenClaw 的 cfg.channels.liangzimixin 中提取账户配置。
|
|
5
|
+
*/
|
|
6
|
+
import { type AccountConfig } from './config.js';
|
|
7
|
+
type GlobalConfig = Record<string, unknown>;
|
|
8
|
+
/** 渠道配置(channels.liangzimixin 下的完整对象) */
|
|
9
|
+
interface ChannelSection {
|
|
10
|
+
accounts?: Record<string, Record<string, unknown>>;
|
|
11
|
+
[key: string]: unknown;
|
|
12
|
+
}
|
|
13
|
+
/** 已解析的账户信息 */
|
|
14
|
+
export interface ResolvedAccount {
|
|
15
|
+
accountId: string;
|
|
16
|
+
enabled: boolean;
|
|
17
|
+
configured: boolean;
|
|
18
|
+
credentials?: AccountConfig;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 从 OpenClaw 全局配置中提取渠道配置。
|
|
22
|
+
* 对应 `cfg.channels.liangzimixin`。
|
|
23
|
+
*/
|
|
24
|
+
export declare function getChannelConfig(cfg: GlobalConfig): ChannelSection | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* 列出所有账户 ID。
|
|
27
|
+
* 当前只支持单账户 (DEFAULT_ACCOUNT_ID)。
|
|
28
|
+
*/
|
|
29
|
+
export declare function getAccountIds(cfg: GlobalConfig): string[];
|
|
30
|
+
/**
|
|
31
|
+
* 获取默认账户 ID。
|
|
32
|
+
*/
|
|
33
|
+
export declare function getDefaultAccountId(cfg: GlobalConfig): string;
|
|
34
|
+
/**
|
|
35
|
+
* 解析指定账户的配置。
|
|
36
|
+
* 从 channels.liangzimixin.accounts.<accountId> 中读取并校验。
|
|
37
|
+
*/
|
|
38
|
+
export declare function resolveAccount(cfg: GlobalConfig, accountId?: string | null): ResolvedAccount;
|
|
39
|
+
/**
|
|
40
|
+
* 提取账户凭据(快捷方法)。
|
|
41
|
+
* 返回已解析的 AccountConfig,如果账户未配置则返回 null。
|
|
42
|
+
*/
|
|
43
|
+
export declare function getCredentials(cfg: GlobalConfig, accountId?: string | null): AccountConfig | null;
|
|
44
|
+
export {};
|
|
45
|
+
//# sourceMappingURL=accounts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../src/accounts.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAItE,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAM5C,yCAAyC;AACzC,UAAU,cAAc;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,eAAe;AACf,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,aAAa,CAAC;CAC7B;AAMD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,YAAY,GAAG,cAAc,GAAG,SAAS,CAE9E;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,EAAE,CAIzD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAE7D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,eAAe,CA6B5F;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,aAAa,GAAG,IAAI,CAGjG"}
|
package/dist/accounts.js
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* openclaw-liangzimixin — 多账户配置读取
|
|
3
|
+
*
|
|
4
|
+
* 从 OpenClaw 的 cfg.channels.liangzimixin 中提取账户配置。
|
|
5
|
+
*/
|
|
6
|
+
import { DEFAULT_ACCOUNT_ID } from 'openclaw/plugin-sdk';
|
|
7
|
+
import { AccountConfigSchema } from './config.js';
|
|
8
|
+
import { CHANNEL_ID } from './constants.js';
|
|
9
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
10
|
+
// 配置读取
|
|
11
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
12
|
+
/**
|
|
13
|
+
* 从 OpenClaw 全局配置中提取渠道配置。
|
|
14
|
+
* 对应 `cfg.channels.liangzimixin`。
|
|
15
|
+
*/
|
|
16
|
+
export function getChannelConfig(cfg) {
|
|
17
|
+
return cfg?.channels?.[CHANNEL_ID];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 列出所有账户 ID。
|
|
21
|
+
* 当前只支持单账户 (DEFAULT_ACCOUNT_ID)。
|
|
22
|
+
*/
|
|
23
|
+
export function getAccountIds(cfg) {
|
|
24
|
+
const section = getChannelConfig(cfg);
|
|
25
|
+
if (!section?.accounts)
|
|
26
|
+
return [DEFAULT_ACCOUNT_ID];
|
|
27
|
+
return Object.keys(section.accounts);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* 获取默认账户 ID。
|
|
31
|
+
*/
|
|
32
|
+
export function getDefaultAccountId(cfg) {
|
|
33
|
+
return getAccountIds(cfg)[0] ?? DEFAULT_ACCOUNT_ID;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 解析指定账户的配置。
|
|
37
|
+
* 从 channels.liangzimixin.accounts.<accountId> 中读取并校验。
|
|
38
|
+
*/
|
|
39
|
+
export function resolveAccount(cfg, accountId) {
|
|
40
|
+
const requestedId = accountId ?? DEFAULT_ACCOUNT_ID;
|
|
41
|
+
const section = getChannelConfig(cfg);
|
|
42
|
+
if (!section?.accounts?.[requestedId]) {
|
|
43
|
+
return {
|
|
44
|
+
accountId: requestedId,
|
|
45
|
+
enabled: false,
|
|
46
|
+
configured: false,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
const rawAccount = section.accounts[requestedId];
|
|
50
|
+
const result = AccountConfigSchema.safeParse(rawAccount);
|
|
51
|
+
if (!result.success) {
|
|
52
|
+
return {
|
|
53
|
+
accountId: requestedId,
|
|
54
|
+
enabled: false,
|
|
55
|
+
configured: false,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
accountId: requestedId,
|
|
60
|
+
enabled: true,
|
|
61
|
+
configured: true,
|
|
62
|
+
credentials: result.data,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 提取账户凭据(快捷方法)。
|
|
67
|
+
* 返回已解析的 AccountConfig,如果账户未配置则返回 null。
|
|
68
|
+
*/
|
|
69
|
+
export function getCredentials(cfg, accountId) {
|
|
70
|
+
const resolved = resolveAccount(cfg, accountId);
|
|
71
|
+
return resolved.credentials ?? null;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=accounts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../src/accounts.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAsB,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAuB5C,gFAAgF;AAChF,OAAO;AACP,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAiB;IAChD,OAAQ,GAAG,EAAE,QAAuD,EAAE,CAAC,UAAU,CAAC,CAAC;AACrF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,GAAiB;IAC7C,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC,OAAO,EAAE,QAAQ;QAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACpD,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAiB;IACnD,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,kBAAkB,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,GAAiB,EAAE,SAAyB;IACzE,MAAM,WAAW,GAAG,SAAS,IAAI,kBAAkB,CAAC;IACpD,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAEtC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC;QACtC,OAAO;YACL,SAAS,EAAE,WAAW;YACtB,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,KAAK;SAClB,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAEzD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO;YACL,SAAS,EAAE,WAAW;YACtB,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,KAAK;SAClB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,SAAS,EAAE,WAAW;QACtB,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,IAAI;QAChB,WAAW,EAAE,MAAM,CAAC,IAAI;KACzB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,GAAiB,EAAE,SAAyB;IACzE,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAChD,OAAO,QAAQ,CAAC,WAAW,IAAI,IAAI,CAAC;AACtC,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* openclaw-
|
|
2
|
+
* openclaw-liangzimixin — Token 安全存储
|
|
3
3
|
*
|
|
4
|
-
* 加密持久化 Token 到 ~/.
|
|
4
|
+
* 加密持久化 Token 到 ~/.liangzimixin/tokens/ (目录 0700, 文件 0600)。
|
|
5
5
|
* 使用 CryptoEngine 对 Token 数据进行量子加密(Mock)后存储。
|
|
6
6
|
*
|
|
7
7
|
* 存储格式 (JSON):
|
|
@@ -18,7 +18,7 @@ import type { CryptoEngine } from '../crypto/crypto-engine.js';
|
|
|
18
18
|
/**
|
|
19
19
|
* Token 安全存储 — 加密持久化 Token 到本地文件系统。
|
|
20
20
|
*
|
|
21
|
-
* 存储路径: ~/.
|
|
21
|
+
* 存储路径: ~/.liangzimixin/tokens/
|
|
22
22
|
* 文件格式: JSON → CryptoEngine.encrypt() → { ciphertext, keyId } JSON → .enc 文件
|
|
23
23
|
*
|
|
24
24
|
* 操作:
|
|
@@ -34,7 +34,7 @@ export declare class TokenStore {
|
|
|
34
34
|
/** 目录是否已初始化 (避免重复 mkdir) */
|
|
35
35
|
private dirEnsured;
|
|
36
36
|
/**
|
|
37
|
-
* @param storageDir - 存储目录路径 (如 '~/.
|
|
37
|
+
* @param storageDir - 存储目录路径 (如 '~/.liangzimixin/tokens')
|
|
38
38
|
* @param crypto - CryptoEngine 实例 (需已调用 init())
|
|
39
39
|
*/
|
|
40
40
|
constructor(storageDir: string, crypto: CryptoEngine);
|
package/dist/auth/token-store.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* openclaw-
|
|
2
|
+
* openclaw-liangzimixin — Token 安全存储
|
|
3
3
|
*
|
|
4
|
-
* 加密持久化 Token 到 ~/.
|
|
4
|
+
* 加密持久化 Token 到 ~/.liangzimixin/tokens/ (目录 0700, 文件 0600)。
|
|
5
5
|
* 使用 CryptoEngine 对 Token 数据进行量子加密(Mock)后存储。
|
|
6
6
|
*
|
|
7
7
|
* 存储格式 (JSON):
|
|
@@ -22,7 +22,7 @@ const log = createLogger('auth/token-store');
|
|
|
22
22
|
/**
|
|
23
23
|
* Token 安全存储 — 加密持久化 Token 到本地文件系统。
|
|
24
24
|
*
|
|
25
|
-
* 存储路径: ~/.
|
|
25
|
+
* 存储路径: ~/.liangzimixin/tokens/
|
|
26
26
|
* 文件格式: JSON → CryptoEngine.encrypt() → { ciphertext, keyId } JSON → .enc 文件
|
|
27
27
|
*
|
|
28
28
|
* 操作:
|
|
@@ -38,7 +38,7 @@ export class TokenStore {
|
|
|
38
38
|
/** 目录是否已初始化 (避免重复 mkdir) */
|
|
39
39
|
dirEnsured = false;
|
|
40
40
|
/**
|
|
41
|
-
* @param storageDir - 存储目录路径 (如 '~/.
|
|
41
|
+
* @param storageDir - 存储目录路径 (如 '~/.liangzimixin/tokens')
|
|
42
42
|
* @param crypto - CryptoEngine 实例 (需已调用 init())
|
|
43
43
|
*/
|
|
44
44
|
constructor(storageDir, crypto) {
|
package/dist/channel/gate.d.ts
CHANGED
package/dist/channel/gate.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outbound.d.ts","sourceRoot":"","sources":["../../src/channel/outbound.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"outbound.d.ts","sourceRoot":"","sources":["../../src/channel/outbound.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAa7D,wDAAwD;AACxD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,OAAO,8BAA8B,EAAE,WAAW,GAAG,IAAI,CAE3G;AAQD,wDAAwD;AACxD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,aAAa,GAAG,IAAI,CAErE;AAQD,yDAAyD;AACzD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,YAAY,GAAG,IAAI,CAEtE;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,sBA0E/B,CAAC"}
|
package/dist/channel/outbound.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* openclaw-
|
|
2
|
+
* openclaw-liangzimixin — SDK 主动发消息适配器 (ChannelOutboundAdapter)
|
|
3
3
|
*
|
|
4
4
|
* 仅处理 SDK 主动发送 (tool call / 通知)。入站回复走 reply-dispatcher/。
|
|
5
5
|
*
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { resolveAndUploadMedia } from '../file/media.js';
|
|
13
13
|
import { createLogger } from '../logger.js';
|
|
14
|
+
import { CHANNEL_ID, parseChannelAddress } from '../constants.js';
|
|
14
15
|
const log = createLogger('channel/outbound');
|
|
15
16
|
/**
|
|
16
17
|
* 获取当前 MessagePipe 实例。
|
|
@@ -56,32 +57,32 @@ export const quantumImOutbound = {
|
|
|
56
57
|
log.info('sendText called', { to, textLength: text.length });
|
|
57
58
|
if (!messagePipeGetter) {
|
|
58
59
|
log.error('outbound:sendText failed, messagePipe not initialized');
|
|
59
|
-
return { channel:
|
|
60
|
+
return { channel: CHANNEL_ID, messageId: '', chatId: to };
|
|
60
61
|
}
|
|
61
62
|
const messagePipe = messagePipeGetter();
|
|
62
|
-
// 从 to 解析 chatId (去掉
|
|
63
|
+
// 从 to 解析 chatId (去掉 channel 前缀)
|
|
63
64
|
// 私聊场景: chatId 即为用户 ID,同时作为 senderId (receive_id)
|
|
64
|
-
const chatId = to
|
|
65
|
+
const chatId = parseChannelAddress(to);
|
|
65
66
|
await messagePipe.sendMessage({
|
|
66
67
|
chatId,
|
|
67
68
|
senderId: chatId,
|
|
68
69
|
msgType: 'text',
|
|
69
70
|
content: JSON.stringify({ content: text }),
|
|
70
71
|
});
|
|
71
|
-
return { channel:
|
|
72
|
+
return { channel: CHANNEL_ID, messageId: '', chatId };
|
|
72
73
|
},
|
|
73
74
|
/** 发送媒体消息 — SDK fetchRemoteMedia + 三步上传 + 发送 */
|
|
74
75
|
sendMedia: async ({ cfg, to, text, mediaUrl, mediaLocalRoots, accountId }) => {
|
|
75
76
|
log.info('sendMedia called', { to, mediaUrl });
|
|
76
77
|
if (!messagePipeGetter || !sdkRuntimeGetter || !tokenManagerGetter) {
|
|
77
78
|
log.error('outbound:sendMedia failed, dependencies not initialized');
|
|
78
|
-
return { channel:
|
|
79
|
+
return { channel: CHANNEL_ID, messageId: '', chatId: to };
|
|
79
80
|
}
|
|
80
81
|
const messagePipe = messagePipeGetter();
|
|
81
82
|
const sdkRuntime = sdkRuntimeGetter();
|
|
82
|
-
const chatId = to
|
|
83
|
+
const chatId = parseChannelAddress(to);
|
|
83
84
|
// 从 cfg 获取文件服务配置
|
|
84
|
-
const fileCfg = cfg?.channels?.[
|
|
85
|
+
const fileCfg = cfg?.channels?.[CHANNEL_ID]?.file;
|
|
85
86
|
const result = await resolveAndUploadMedia({
|
|
86
87
|
mediaUrl: mediaUrl ?? undefined,
|
|
87
88
|
tokenManager: tokenManagerGetter(),
|
|
@@ -98,7 +99,7 @@ export const quantumImOutbound = {
|
|
|
98
99
|
if (result.warning) {
|
|
99
100
|
log.warn('sendMedia:degraded', { chatId, warning: result.warning });
|
|
100
101
|
}
|
|
101
|
-
return { channel:
|
|
102
|
+
return { channel: CHANNEL_ID, messageId: result.messageId, chatId };
|
|
102
103
|
},
|
|
103
104
|
};
|
|
104
105
|
//# sourceMappingURL=outbound.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outbound.js","sourceRoot":"","sources":["../../src/channel/outbound.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"outbound.js","sourceRoot":"","sources":["../../src/channel/outbound.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAElE,MAAM,GAAG,GAAG,YAAY,CAAC,kBAAkB,CAAC,CAAC;AAE7C;;;GAGG;AACH,IAAI,iBAAiB,GAAsE,IAAI,CAAC;AAEhG,wDAAwD;AACxD,MAAM,UAAU,oBAAoB,CAAC,MAAgE;IACnG,iBAAiB,GAAG,MAAM,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,IAAI,gBAAgB,GAAiC,IAAI,CAAC;AAE1D,wDAAwD;AACxD,MAAM,UAAU,mBAAmB,CAAC,MAA2B;IAC7D,gBAAgB,GAAG,MAAM,CAAC;AAC5B,CAAC;AAED;;;GAGG;AACH,IAAI,kBAAkB,GAAgC,IAAI,CAAC;AAE3D,yDAAyD;AACzD,MAAM,UAAU,qBAAqB,CAAC,MAA0B;IAC9D,kBAAkB,GAAG,MAAM,CAAC;AAC9B,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAA2B;IACvD,kCAAkC;IAClC,YAAY,EAAE,QAAQ;IACtB,sCAAsC;IACtC,WAAW,EAAE,UAAU;IACvB,gBAAgB;IAChB,cAAc,EAAE,KAAK;IAErB,iCAAiC;IACjC,QAAQ,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE;QAC/C,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAE7D,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,GAAG,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;YACnE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAC5D,CAAC;QAED,MAAM,WAAW,GAAG,iBAAiB,EAAE,CAAC;QACxC,iCAAiC;QACjC,kDAAkD;QAClD,MAAM,MAAM,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAC;QAEvC,MAAM,WAAW,CAAC,WAAW,CAAC;YAC5B,MAAM;YACN,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,MAAM;YACf,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;SAC3C,CAAC,CAAC;QAEH,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;IACxD,CAAC;IAED,gDAAgD;IAChD,SAAS,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,eAAe,EAAE,SAAS,EAAE,EAAE,EAAE;QAC3E,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAE/C,IAAI,CAAC,iBAAiB,IAAI,CAAC,gBAAgB,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACnE,GAAG,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;YACrE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAC5D,CAAC;QAED,MAAM,WAAW,GAAG,iBAAiB,EAAE,CAAC;QACxC,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAC;QAEvC,iBAAiB;QACjB,MAAM,OAAO,GAAI,GAMV,EAAE,QAAQ,EAAE,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC;QAEtC,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC;YACzC,QAAQ,EAAE,QAAQ,IAAI,SAAS;YAC/B,YAAY,EAAE,kBAAkB,EAAE;YAClC,SAAS,EAAE,OAAO,EAAE,kBAAkB,IAAI,EAAE;YAC5C,iBAAiB,EAAE,eAAe,IAAI,SAAS;YAC/C,mBAAmB,EAAE,OAAO,EAAE,mBAAmB,IAAI,KAAK;YAC1D,UAAU;YACV,WAAW;YACX,MAAM;YACN,aAAa,EAAE,OAAO,EAAE,aAAa;YACrC,WAAW,EAAE,OAAO,EAAE,WAAW;YACjC,SAAS,EAAE,OAAO,EAAE,cAAc;SACnC,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;IACtE,CAAC;CACF,CAAC"}
|
package/dist/channel/plugin.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/channel/plugin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAe,aAAa,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/channel/plugin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAe,aAAa,EAAE,MAAM,qBAAqB,CAAC;AA2BtE,eAAO,MAAM,eAAe,EAAE,aAyJ7B,CAAC"}
|
package/dist/channel/plugin.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* openclaw-
|
|
2
|
+
* openclaw-liangzimixin — ChannelPlugin 接口实现
|
|
3
3
|
*
|
|
4
4
|
* 插件与 OpenClaw SDK 的核心契约。
|
|
5
5
|
* gateway.startAccount 是整个插件的启动入口。
|
|
@@ -10,14 +10,16 @@ import { startPlugin } from '../index.js';
|
|
|
10
10
|
import { InboundPipeline } from '../message-handler/handler.js';
|
|
11
11
|
import { createLogger } from '../logger.js';
|
|
12
12
|
import { QUANTUM_IM_CONFIG_JSON_SCHEMA } from '../config-schema.js';
|
|
13
|
+
import { getAccountIds, getDefaultAccountId, resolveAccount } from '../accounts.js';
|
|
14
|
+
import { CHANNEL_ID } from '../constants.js';
|
|
13
15
|
const log = createLogger('channel/plugin');
|
|
14
16
|
/** 渠道元数据 — 显示在 OpenClaw 管理界面的插件信息 */
|
|
15
17
|
const meta = {
|
|
16
|
-
id:
|
|
18
|
+
id: CHANNEL_ID,
|
|
17
19
|
label: 'QuantumIM',
|
|
18
20
|
selectionLabel: '密信 IM',
|
|
19
|
-
docsPath:
|
|
20
|
-
docsLabel:
|
|
21
|
+
docsPath: `/channels/${CHANNEL_ID}`,
|
|
22
|
+
docsLabel: CHANNEL_ID,
|
|
21
23
|
blurb: '密信 IM Channel,支持量子加密的安全即时通信。',
|
|
22
24
|
aliases: ['qim'], // CLI 和 API 中的短名
|
|
23
25
|
order: 80, // 渠道列表排序权重
|
|
@@ -25,7 +27,7 @@ const meta = {
|
|
|
25
27
|
/** 当前运行中的插件实例 (单账户) */
|
|
26
28
|
let activeInstance = null;
|
|
27
29
|
export const quantumImPlugin = {
|
|
28
|
-
id:
|
|
30
|
+
id: CHANNEL_ID,
|
|
29
31
|
meta: { ...meta },
|
|
30
32
|
/** 配置 JSON Schema — 用于框架配置校验和 UI 表单自动生成 */
|
|
31
33
|
configSchema: {
|
|
@@ -53,20 +55,22 @@ export const quantumImPlugin = {
|
|
|
53
55
|
* 当前简化实现: 仅支持单一默认账户 (DEFAULT_ACCOUNT_ID)。
|
|
54
56
|
*/
|
|
55
57
|
config: {
|
|
56
|
-
/** 列出所有账户 ID
|
|
57
|
-
listAccountIds: (
|
|
58
|
+
/** 列出所有账户 ID */
|
|
59
|
+
listAccountIds: (cfg) => getAccountIds(cfg),
|
|
58
60
|
/** 解析账户配置 */
|
|
59
|
-
resolveAccount: (
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
61
|
+
resolveAccount: (cfg, accountId) => {
|
|
62
|
+
const resolved = resolveAccount(cfg, accountId);
|
|
63
|
+
return {
|
|
64
|
+
accountId: resolved.accountId,
|
|
65
|
+
enabled: resolved.enabled,
|
|
66
|
+
configured: resolved.configured,
|
|
67
|
+
};
|
|
68
|
+
},
|
|
65
69
|
/** 返回默认账户 ID */
|
|
66
|
-
defaultAccountId: (
|
|
67
|
-
/** 检查账户是否已配置
|
|
68
|
-
isConfigured: (account) => Boolean(account),
|
|
69
|
-
/** 返回账户状态描述
|
|
70
|
+
defaultAccountId: (cfg) => getDefaultAccountId(cfg),
|
|
71
|
+
/** 检查账户是否已配置 */
|
|
72
|
+
isConfigured: (account) => Boolean(account?.configured),
|
|
73
|
+
/** 返回账户状态描述 */
|
|
70
74
|
describeAccount: (_account) => ({
|
|
71
75
|
accountId: DEFAULT_ACCOUNT_ID,
|
|
72
76
|
enabled: true,
|
|
@@ -107,17 +111,20 @@ export const quantumImPlugin = {
|
|
|
107
111
|
gateway: {
|
|
108
112
|
/** 启动账户 — 初始化所有模块并开始接收消息 */
|
|
109
113
|
startAccount: async (ctx) => {
|
|
110
|
-
log.info(`starting
|
|
114
|
+
log.info(`starting liangzimixin[${ctx.accountId}]`);
|
|
111
115
|
try {
|
|
112
|
-
// 1.
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
+
// 1. 从全局配置中提取账户凭据
|
|
117
|
+
const resolved = resolveAccount(ctx.cfg, ctx.accountId);
|
|
118
|
+
if (!resolved.credentials) {
|
|
119
|
+
throw new Error(`账户 ${ctx.accountId} 未配置或凭据不完整`);
|
|
120
|
+
}
|
|
121
|
+
// 2. 使用凭据初始化所有模块
|
|
122
|
+
const instance = await startPlugin(resolved.credentials);
|
|
116
123
|
activeInstance = instance;
|
|
117
124
|
const { config } = instance;
|
|
118
|
-
//
|
|
125
|
+
// 3. 启动 WS 连接
|
|
119
126
|
await instance.connectionManager.start(config.transport.wsUrl, () => instance.tokenManager.getValidToken(), config.credentials.appId);
|
|
120
|
-
//
|
|
127
|
+
// 4. 创建入站管道并注册消息回调
|
|
121
128
|
const pipeline = new InboundPipeline({
|
|
122
129
|
messagePipe: instance.messagePipe,
|
|
123
130
|
tokenManager: instance.tokenManager,
|
|
@@ -131,14 +138,14 @@ export const quantumImPlugin = {
|
|
|
131
138
|
instance.messagePipe.onMessage((msg) => {
|
|
132
139
|
pipeline.handle(msg);
|
|
133
140
|
});
|
|
134
|
-
//
|
|
141
|
+
// 5. 注册 outbound 依赖 getter
|
|
135
142
|
setMessagePipeGetter(() => instance.messagePipe);
|
|
136
143
|
setSdkRuntimeGetter(() => ctx.runtime);
|
|
137
144
|
setTokenManagerGetter(() => instance.tokenManager);
|
|
138
|
-
log.info(`
|
|
145
|
+
log.info(`liangzimixin[${ctx.accountId}] started ✓`);
|
|
139
146
|
}
|
|
140
147
|
catch (err) {
|
|
141
|
-
log.error(`
|
|
148
|
+
log.error(`liangzimixin[${ctx.accountId}] start failed`, {
|
|
142
149
|
error: err.message,
|
|
143
150
|
});
|
|
144
151
|
throw err;
|
|
@@ -146,12 +153,12 @@ export const quantumImPlugin = {
|
|
|
146
153
|
},
|
|
147
154
|
/** 停止账户 — 优雅关闭所有模块 */
|
|
148
155
|
stopAccount: async (ctx) => {
|
|
149
|
-
log.info(`stopping
|
|
156
|
+
log.info(`stopping liangzimixin[${ctx.accountId}]`);
|
|
150
157
|
if (activeInstance) {
|
|
151
158
|
await activeInstance.shutdown();
|
|
152
159
|
activeInstance = null;
|
|
153
160
|
}
|
|
154
|
-
log.info(`stopped
|
|
161
|
+
log.info(`stopped liangzimixin[${ctx.accountId}]`);
|
|
155
162
|
},
|
|
156
163
|
},
|
|
157
164
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/channel/plugin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACpH,OAAO,EAAE,WAAW,EAAuB,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAsB,MAAM,+BAA+B,CAAC;AACpF,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,6BAA6B,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/channel/plugin.ts"],"names":[],"mappings":"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"}
|