@amaster.ai/pi-channels 0.1.2-beta.18 → 0.1.2-beta.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/README.md +32 -25
  2. package/dist/adapters/wecom/adapter.d.ts +3 -1
  3. package/dist/adapters/wecom/adapter.d.ts.map +1 -1
  4. package/dist/adapters/wecom/adapter.js +194 -157
  5. package/dist/adapters/wecom/adapter.js.map +1 -1
  6. package/dist/adapters/wecom.d.ts +0 -2
  7. package/dist/adapters/wecom.d.ts.map +1 -1
  8. package/dist/adapters/wecom.js +0 -1
  9. package/dist/adapters/wecom.js.map +1 -1
  10. package/dist/bridge.d.ts +1 -0
  11. package/dist/bridge.d.ts.map +1 -1
  12. package/dist/bridge.js +92 -1
  13. package/dist/bridge.js.map +1 -1
  14. package/dist/config.js +5 -7
  15. package/dist/config.js.map +1 -1
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +270 -15
  18. package/dist/index.js.map +1 -1
  19. package/dist/registry.d.ts +1 -0
  20. package/dist/registry.d.ts.map +1 -1
  21. package/dist/registry.js +7 -1
  22. package/dist/registry.js.map +1 -1
  23. package/dist/types.d.ts +10 -8
  24. package/dist/types.d.ts.map +1 -1
  25. package/package.json +3 -2
  26. package/dist/adapters/wecom/client.d.ts +0 -13
  27. package/dist/adapters/wecom/client.d.ts.map +0 -1
  28. package/dist/adapters/wecom/client.js +0 -116
  29. package/dist/adapters/wecom/client.js.map +0 -1
  30. package/dist/adapters/wecom/crypto.d.ts +0 -14
  31. package/dist/adapters/wecom/crypto.d.ts.map +0 -1
  32. package/dist/adapters/wecom/crypto.js +0 -37
  33. package/dist/adapters/wecom/crypto.js.map +0 -1
  34. package/dist/adapters/wecom/errors.d.ts +0 -25
  35. package/dist/adapters/wecom/errors.d.ts.map +0 -1
  36. package/dist/adapters/wecom/errors.js +0 -56
  37. package/dist/adapters/wecom/errors.js.map +0 -1
  38. package/dist/adapters/wecom/types.d.ts +0 -52
  39. package/dist/adapters/wecom/types.d.ts.map +0 -1
  40. package/dist/adapters/wecom/types.js +0 -2
  41. package/dist/adapters/wecom/types.js.map +0 -1
  42. package/dist/adapters/wecom/xml.d.ts +0 -4
  43. package/dist/adapters/wecom/xml.d.ts.map +0 -1
  44. package/dist/adapters/wecom/xml.js +0 -16
  45. package/dist/adapters/wecom/xml.js.map +0 -1
@@ -1,13 +0,0 @@
1
- import type { WeComAgentAccount, WeComTextTarget } from './types.js';
2
- export declare class WeComAgentClient {
3
- private readonly account;
4
- private readonly tokenCache;
5
- constructor(account: WeComAgentAccount);
6
- getAccessToken(): Promise<string>;
7
- sendText(params: {
8
- target: WeComTextTarget;
9
- text: string;
10
- safe?: 0 | 1;
11
- }): Promise<void>;
12
- }
13
- //# sourceMappingURL=client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/adapters/wecom/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAiDrE,qBAAa,gBAAgB;IAGf,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAmB;gBAEjB,OAAO,EAAE,iBAAiB;IASjD,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAqCjC,QAAQ,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,eAAe,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAoD/F"}
@@ -1,116 +0,0 @@
1
- import { WeComApiError } from './errors.js';
2
- const tokenCaches = new Map();
3
- function cacheKey(account) {
4
- return `${account.baseUrl}:${account.corpId}:${account.agentId}:${account.secret}`;
5
- }
6
- async function fetchWithTimeout(url, init, timeoutMs) {
7
- const controller = new AbortController();
8
- const timer = setTimeout(() => controller.abort(), timeoutMs);
9
- try {
10
- return await fetch(url, { ...init, signal: controller.signal });
11
- }
12
- catch (error) {
13
- const err = new WeComApiError({
14
- operation: 'network',
15
- category: 'network',
16
- errmsg: error instanceof Error ? error.message : String(error),
17
- });
18
- throw err;
19
- }
20
- finally {
21
- clearTimeout(timer);
22
- }
23
- }
24
- async function readJson(response) {
25
- return (await response.json().catch(() => ({})));
26
- }
27
- export class WeComAgentClient {
28
- account;
29
- tokenCache;
30
- constructor(account) {
31
- this.account = account;
32
- let cache = tokenCaches.get(cacheKey(account));
33
- if (!cache) {
34
- cache = { value: '', expiresAt: 0, refreshPromise: null };
35
- tokenCaches.set(cacheKey(account), cache);
36
- }
37
- this.tokenCache = cache;
38
- }
39
- async getAccessToken() {
40
- const cache = this.tokenCache;
41
- if (cache.value && Date.now() < cache.expiresAt)
42
- return cache.value;
43
- if (cache.refreshPromise)
44
- return cache.refreshPromise;
45
- cache.refreshPromise = (async () => {
46
- try {
47
- const url = new URL(`${this.account.baseUrl}/gettoken`);
48
- url.searchParams.set('corpid', this.account.corpId);
49
- url.searchParams.set('corpsecret', this.account.secret);
50
- const response = await fetchWithTimeout(url, undefined, this.account.network.timeoutMs);
51
- const data = await readJson(response);
52
- if (!response.ok || data.errcode !== 0 || !data.access_token) {
53
- throw new WeComApiError({
54
- operation: 'gettoken',
55
- errcode: data.errcode,
56
- errmsg: data.errmsg ?? response.statusText,
57
- status: response.status,
58
- });
59
- }
60
- const ttlSeconds = Math.max((data.expires_in ?? 7200) - this.account.tokenRefreshBufferSeconds, 60);
61
- cache.value = data.access_token;
62
- cache.expiresAt = Date.now() + ttlSeconds * 1000;
63
- return cache.value;
64
- }
65
- finally {
66
- cache.refreshPromise = null;
67
- }
68
- })();
69
- return cache.refreshPromise;
70
- }
71
- async sendText(params) {
72
- const accessToken = await this.getAccessToken();
73
- const useAppChat = Boolean(params.target.chatid);
74
- const endpoint = useAppChat ? 'appchat/send' : 'message/send';
75
- const response = await fetchWithTimeout(`${this.account.baseUrl}/${endpoint}?access_token=${encodeURIComponent(accessToken)}`, {
76
- method: 'POST',
77
- headers: { 'Content-Type': 'application/json' },
78
- body: JSON.stringify(useAppChat
79
- ? {
80
- chatid: params.target.chatid,
81
- msgtype: 'text',
82
- text: { content: params.text },
83
- }
84
- : {
85
- touser: params.target.touser,
86
- toparty: params.target.toparty,
87
- totag: params.target.totag,
88
- msgtype: 'text',
89
- agentid: this.account.agentId,
90
- text: { content: params.text },
91
- safe: params.safe ?? 0,
92
- }),
93
- }, this.account.network.timeoutMs);
94
- const data = await readJson(response);
95
- if (!response.ok || data.errcode !== 0) {
96
- throw new WeComApiError({
97
- operation: useAppChat ? 'appchat/send' : 'message/send',
98
- errcode: data.errcode,
99
- errmsg: data.errmsg ?? response.statusText,
100
- status: response.status,
101
- });
102
- }
103
- if (data.invaliduser || data.invalidparty || data.invalidtag) {
104
- throw new WeComApiError({
105
- operation: useAppChat ? 'appchat/send' : 'message/send',
106
- errcode: data.errcode,
107
- errmsg: 'partial recipient failure',
108
- category: 'invalid_recipient',
109
- invalidUser: data.invaliduser,
110
- invalidParty: data.invalidparty,
111
- invalidTag: data.invalidtag,
112
- });
113
- }
114
- }
115
- }
116
- //# sourceMappingURL=client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/adapters/wecom/client.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- export declare function sha1Signature(token: string, timestamp: string, nonce: string, encrypted: string): string;
2
- export declare function timingSafeEqualString(a: string, b: string): boolean;
3
- export declare function verifyWeComSignature(params: {
4
- token: string;
5
- timestamp?: string | null;
6
- nonce?: string | null;
7
- encrypted?: string | null;
8
- provided?: string | null;
9
- }): boolean;
10
- export declare function decryptWeComEnvelope(encrypted: string, encodingAesKey: string): {
11
- message: string;
12
- receiveId: string;
13
- };
14
- //# sourceMappingURL=crypto.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../../src/adapters/wecom/crypto.ts"],"names":[],"mappings":"AAEA,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAChB,MAAM,CAIR;AAED,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAInE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,GAAG,OAAO,CAKV;AAQD,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,GACrB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAYxC"}
@@ -1,37 +0,0 @@
1
- import { createDecipheriv, createHash, timingSafeEqual } from 'node:crypto';
2
- export function sha1Signature(token, timestamp, nonce, encrypted) {
3
- return createHash('sha1')
4
- .update([token, timestamp, nonce, encrypted].sort().join(''))
5
- .digest('hex');
6
- }
7
- export function timingSafeEqualString(a, b) {
8
- const left = Buffer.from(a);
9
- const right = Buffer.from(b);
10
- return left.length === right.length && timingSafeEqual(left, right);
11
- }
12
- export function verifyWeComSignature(params) {
13
- const { token, timestamp, nonce, encrypted, provided } = params;
14
- if (!token || !timestamp || !nonce || !encrypted || !provided)
15
- return false;
16
- const expected = sha1Signature(token, timestamp, nonce, encrypted);
17
- return timingSafeEqualString(expected, provided);
18
- }
19
- function pkcs7Unpad(buffer) {
20
- const pad = buffer.at(-1);
21
- if (!pad || pad < 1 || pad > 32)
22
- return buffer;
23
- return buffer.subarray(0, buffer.length - pad);
24
- }
25
- export function decryptWeComEnvelope(encrypted, encodingAesKey) {
26
- const aesKey = Buffer.from(`${encodingAesKey}=`, 'base64');
27
- if (aesKey.length !== 32)
28
- throw new Error('Invalid WeCom encodingAesKey');
29
- const decipher = createDecipheriv('aes-256-cbc', aesKey, aesKey.subarray(0, 16));
30
- decipher.setAutoPadding(false);
31
- const decrypted = pkcs7Unpad(Buffer.concat([decipher.update(encrypted, 'base64'), decipher.final()]));
32
- const msgLength = decrypted.readUInt32BE(16);
33
- const message = decrypted.subarray(20, 20 + msgLength).toString('utf-8');
34
- const receiveId = decrypted.subarray(20 + msgLength).toString('utf-8');
35
- return { message, receiveId };
36
- }
37
- //# sourceMappingURL=crypto.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../../src/adapters/wecom/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE5E,MAAM,UAAU,aAAa,CAC3B,KAAa,EACb,SAAiB,EACjB,KAAa,EACb,SAAiB;IAEjB,OAAO,UAAU,CAAC,MAAM,CAAC;SACtB,MAAM,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SAC5D,MAAM,CAAC,KAAK,CAAC,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,CAAS,EAAE,CAAS;IACxD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7B,OAAO,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,IAAI,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAMpC;IACC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAChE,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5E,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IACnE,OAAO,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,UAAU,CAAC,MAAc;IAChC,MAAM,GAAG,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,EAAE;QAAE,OAAO,MAAM,CAAC;IAC/C,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,SAAiB,EACjB,cAAsB;IAEtB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,cAAc,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC3D,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC1E,MAAM,QAAQ,GAAG,gBAAgB,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACjF,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,SAAS,GAAG,UAAU,CAC1B,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CACxE,CAAC;IACF,MAAM,SAAS,GAAG,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,GAAG,SAAS,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACzE,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACvE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAChC,CAAC"}
@@ -1,25 +0,0 @@
1
- export type WeComErrorCategory = 'ip_whitelist' | 'invalid_credential' | 'invalid_recipient' | 'rate_limited' | 'network' | 'api';
2
- export type WeComApiErrorDetails = {
3
- operation: string;
4
- errcode?: number | undefined;
5
- errmsg?: string | undefined;
6
- status?: number | undefined;
7
- category?: WeComErrorCategory | undefined;
8
- invalidUser?: string | undefined;
9
- invalidParty?: string | undefined;
10
- invalidTag?: string | undefined;
11
- };
12
- export declare function categorizeWeComError(errcode?: number, errmsg?: string): WeComErrorCategory;
13
- export declare class WeComApiError extends Error {
14
- readonly operation: string;
15
- readonly errcode: number | undefined;
16
- readonly errmsg: string | undefined;
17
- readonly status: number | undefined;
18
- readonly category: WeComErrorCategory;
19
- readonly invalidUser: string | undefined;
20
- readonly invalidParty: string | undefined;
21
- readonly invalidTag: string | undefined;
22
- readonly hint: string;
23
- constructor(details: WeComApiErrorDetails);
24
- }
25
- //# sourceMappingURL=errors.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/adapters/wecom/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAC1B,cAAc,GACd,oBAAoB,GACpB,mBAAmB,GACnB,cAAc,GACd,SAAS,GACT,KAAK,CAAC;AAEV,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,QAAQ,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;IAC1C,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,SAAK,GAAG,kBAAkB,CAUtF;AAkBD,qBAAa,aAAc,SAAQ,KAAK;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,OAAO,EAAE,oBAAoB;CAgB1C"}
@@ -1,56 +0,0 @@
1
- export function categorizeWeComError(errcode, errmsg = '') {
2
- if (errcode === 60020 || errmsg.includes('not allow to access from your ip')) {
3
- return 'ip_whitelist';
4
- }
5
- if ([40001, 40013, 40014, 41001, 41002, 42001].includes(errcode ?? Number.NaN)) {
6
- return 'invalid_credential';
7
- }
8
- if ([81013, 84061].includes(errcode ?? Number.NaN))
9
- return 'invalid_recipient';
10
- if ([45009, 45011].includes(errcode ?? Number.NaN))
11
- return 'rate_limited';
12
- return 'api';
13
- }
14
- function hintFor(category) {
15
- if (category === 'ip_whitelist') {
16
- return '企业微信拒绝了当前出口 IP,请在企业微信后台把运行机器或代理出口加入可信 IP,或配置固定出口代理。';
17
- }
18
- if (category === 'invalid_credential') {
19
- return '请检查 CorpID、应用 Secret、AgentId 以及 token 是否来自同一个企业微信自建应用。';
20
- }
21
- if (category === 'invalid_recipient') {
22
- return '请检查接收人、部门、标签或 appchat id 是否存在且该应用有可见范围权限。';
23
- }
24
- if (category === 'rate_limited') {
25
- return '企业微信接口触发限频,请稍后重试或降低发送频率。';
26
- }
27
- return '请参考企业微信接口错误码进一步排查。';
28
- }
29
- export class WeComApiError extends Error {
30
- operation;
31
- errcode;
32
- errmsg;
33
- status;
34
- category;
35
- invalidUser;
36
- invalidParty;
37
- invalidTag;
38
- hint;
39
- constructor(details) {
40
- const category = details.category ?? categorizeWeComError(details.errcode, details.errmsg);
41
- const code = details.errcode === undefined ? '' : ` ${details.errcode}`;
42
- const reason = details.errmsg || (details.status ? `HTTP ${details.status}` : 'unknown error');
43
- super(`WeCom ${details.operation} error:${code} ${reason}. ${hintFor(category)}`);
44
- this.name = 'WeComApiError';
45
- this.operation = details.operation;
46
- this.errcode = details.errcode;
47
- this.errmsg = details.errmsg;
48
- this.status = details.status;
49
- this.category = category;
50
- this.invalidUser = details.invalidUser;
51
- this.invalidParty = details.invalidParty;
52
- this.invalidTag = details.invalidTag;
53
- this.hint = hintFor(category);
54
- }
55
- }
56
- //# sourceMappingURL=errors.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/adapters/wecom/errors.ts"],"names":[],"mappings":"AAmBA,MAAM,UAAU,oBAAoB,CAAC,OAAgB,EAAE,MAAM,GAAG,EAAE;IAChE,IAAI,OAAO,KAAK,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,kCAAkC,CAAC,EAAE,CAAC;QAC7E,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/E,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IACD,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC;QAAE,OAAO,mBAAmB,CAAC;IAC/E,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC;QAAE,OAAO,cAAc,CAAC;IAC1E,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,OAAO,CAAC,QAA4B;IAC3C,IAAI,QAAQ,KAAK,cAAc,EAAE,CAAC;QAChC,OAAO,qDAAqD,CAAC;IAC/D,CAAC;IACD,IAAI,QAAQ,KAAK,oBAAoB,EAAE,CAAC;QACtC,OAAO,wDAAwD,CAAC;IAClE,CAAC;IACD,IAAI,QAAQ,KAAK,mBAAmB,EAAE,CAAC;QACrC,OAAO,2CAA2C,CAAC;IACrD,CAAC;IACD,IAAI,QAAQ,KAAK,cAAc,EAAE,CAAC;QAChC,OAAO,0BAA0B,CAAC;IACpC,CAAC;IACD,OAAO,oBAAoB,CAAC;AAC9B,CAAC;AAED,MAAM,OAAO,aAAc,SAAQ,KAAK;IAC7B,SAAS,CAAS;IAClB,OAAO,CAAqB;IAC5B,MAAM,CAAqB;IAC3B,MAAM,CAAqB;IAC3B,QAAQ,CAAqB;IAC7B,WAAW,CAAqB;IAChC,YAAY,CAAqB;IACjC,UAAU,CAAqB;IAC/B,IAAI,CAAS;IAEtB,YAAY,OAA6B;QACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,oBAAoB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3F,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACxE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;QAC/F,KAAK,CAAC,SAAS,OAAO,CAAC,SAAS,UAAU,IAAI,IAAI,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAClF,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QACvC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QACzC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;CACF"}
@@ -1,52 +0,0 @@
1
- import type { ChannelMessage, WeComAdapterConfig } from '../../types.js';
2
- export type WeComNetworkOptions = {
3
- timeoutMs: number;
4
- };
5
- export type WeComAgentAccount = {
6
- corpId: string;
7
- agentId: number;
8
- secret: string;
9
- baseUrl: string;
10
- tokenRefreshBufferSeconds: number;
11
- network: WeComNetworkOptions;
12
- };
13
- export type WeComRecipient = {
14
- kind: 'user';
15
- id: string;
16
- } | {
17
- kind: 'party';
18
- id: string;
19
- } | {
20
- kind: 'tag';
21
- id: string;
22
- } | {
23
- kind: 'appchat';
24
- id: string;
25
- };
26
- export type WeComTextTarget = {
27
- touser?: string;
28
- toparty?: string;
29
- totag?: string;
30
- chatid?: string;
31
- };
32
- export type WeComIncomingContext = {
33
- token: string;
34
- encodingAesKey: string;
35
- receiveId?: string;
36
- corpId: string;
37
- };
38
- export type NormalizedWeComConfig = WeComAdapterConfig & {
39
- corpId: string;
40
- agentId: number;
41
- secret: string;
42
- baseUrl: string;
43
- timeoutMs: number;
44
- tokenRefreshBufferSeconds: number;
45
- incoming?: WeComAdapterConfig['incoming'];
46
- };
47
- export type ResolvedOutboundMessage = {
48
- target: WeComTextTarget;
49
- text: string;
50
- raw: ChannelMessage;
51
- };
52
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/adapters/wecom/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzE,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB,EAAE,MAAM,CAAC;IAClC,OAAO,EAAE,mBAAmB,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC3B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpC,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,kBAAkB,GAAG;IACvD,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,yBAAyB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,EAAE,eAAe,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,cAAc,CAAC;CACrB,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/adapters/wecom/types.ts"],"names":[],"mappings":""}
@@ -1,4 +0,0 @@
1
- export declare function xmlTag(xml: string, tag: string): string | undefined;
2
- export declare function decodeXml(value: string): string;
3
- export declare function xmlText(xml: string, tag: string): string;
4
- //# sourceMappingURL=xml.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"xml.d.ts","sourceRoot":"","sources":["../../../src/adapters/wecom/xml.ts"],"names":[],"mappings":"AAAA,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKnE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO/C;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAExD"}
@@ -1,16 +0,0 @@
1
- export function xmlTag(xml, tag) {
2
- const match = xml.match(new RegExp(`<${tag}><!\\[CDATA\\[([\\s\\S]*?)\\]\\]></${tag}>|<${tag}>([\\s\\S]*?)</${tag}>`));
3
- return match?.[1] ?? match?.[2];
4
- }
5
- export function decodeXml(value) {
6
- return value
7
- .replace(/&lt;/g, '<')
8
- .replace(/&gt;/g, '>')
9
- .replace(/&quot;/g, '"')
10
- .replace(/&apos;/g, "'")
11
- .replace(/&amp;/g, '&');
12
- }
13
- export function xmlText(xml, tag) {
14
- return decodeXml(xmlTag(xml, tag) ?? '');
15
- }
16
- //# sourceMappingURL=xml.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"xml.js","sourceRoot":"","sources":["../../../src/adapters/wecom/xml.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,MAAM,CAAC,GAAW,EAAE,GAAW;IAC7C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CACrB,IAAI,MAAM,CAAC,IAAI,GAAG,sCAAsC,GAAG,MAAM,GAAG,kBAAkB,GAAG,GAAG,CAAC,CAC9F,CAAC;IACF,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,OAAO,KAAK;SACT,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAW,EAAE,GAAW;IAC9C,OAAO,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;AAC3C,CAAC"}