@xuanyue202/wechat-mp 2026.3.21

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 (95) hide show
  1. package/README.md +74 -0
  2. package/dist/index.d.ts +20 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +59 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/src/api.d.ts +101 -0
  7. package/dist/src/api.d.ts.map +1 -0
  8. package/dist/src/api.js +142 -0
  9. package/dist/src/api.js.map +1 -0
  10. package/dist/src/channel.d.ts +296 -0
  11. package/dist/src/channel.d.ts.map +1 -0
  12. package/dist/src/channel.js +341 -0
  13. package/dist/src/channel.js.map +1 -0
  14. package/dist/src/config.d.ts +69 -0
  15. package/dist/src/config.d.ts.map +1 -0
  16. package/dist/src/config.js +167 -0
  17. package/dist/src/config.js.map +1 -0
  18. package/dist/src/crypto.d.ts +117 -0
  19. package/dist/src/crypto.d.ts.map +1 -0
  20. package/dist/src/crypto.js +270 -0
  21. package/dist/src/crypto.js.map +1 -0
  22. package/dist/src/crypto.test.d.ts +2 -0
  23. package/dist/src/crypto.test.d.ts.map +1 -0
  24. package/dist/src/crypto.test.js +76 -0
  25. package/dist/src/crypto.test.js.map +1 -0
  26. package/dist/src/dispatch.d.ts +15 -0
  27. package/dist/src/dispatch.d.ts.map +1 -0
  28. package/dist/src/dispatch.js +193 -0
  29. package/dist/src/dispatch.js.map +1 -0
  30. package/dist/src/dispatch.test.d.ts +2 -0
  31. package/dist/src/dispatch.test.d.ts.map +1 -0
  32. package/dist/src/dispatch.test.js +231 -0
  33. package/dist/src/dispatch.test.js.map +1 -0
  34. package/dist/src/inbound.d.ts +7 -0
  35. package/dist/src/inbound.d.ts.map +1 -0
  36. package/dist/src/inbound.js +82 -0
  37. package/dist/src/inbound.js.map +1 -0
  38. package/dist/src/onboarding.d.ts +25 -0
  39. package/dist/src/onboarding.d.ts.map +1 -0
  40. package/dist/src/onboarding.js +49 -0
  41. package/dist/src/onboarding.js.map +1 -0
  42. package/dist/src/outbound.d.ts +17 -0
  43. package/dist/src/outbound.d.ts.map +1 -0
  44. package/dist/src/outbound.js +55 -0
  45. package/dist/src/outbound.js.map +1 -0
  46. package/dist/src/outbound.test.d.ts +2 -0
  47. package/dist/src/outbound.test.d.ts.map +1 -0
  48. package/dist/src/outbound.test.js +175 -0
  49. package/dist/src/outbound.test.js.map +1 -0
  50. package/dist/src/probe.d.ts +15 -0
  51. package/dist/src/probe.d.ts.map +1 -0
  52. package/dist/src/probe.js +55 -0
  53. package/dist/src/probe.js.map +1 -0
  54. package/dist/src/runtime.d.ts +22 -0
  55. package/dist/src/runtime.d.ts.map +1 -0
  56. package/dist/src/runtime.js +33 -0
  57. package/dist/src/runtime.js.map +1 -0
  58. package/dist/src/send.d.ts +27 -0
  59. package/dist/src/send.d.ts.map +1 -0
  60. package/dist/src/send.js +103 -0
  61. package/dist/src/send.js.map +1 -0
  62. package/dist/src/state.d.ts +7 -0
  63. package/dist/src/state.d.ts.map +1 -0
  64. package/dist/src/state.js +109 -0
  65. package/dist/src/state.js.map +1 -0
  66. package/dist/src/text.d.ts +46 -0
  67. package/dist/src/text.d.ts.map +1 -0
  68. package/dist/src/text.js +192 -0
  69. package/dist/src/text.js.map +1 -0
  70. package/dist/src/text.test.d.ts +2 -0
  71. package/dist/src/text.test.d.ts.map +1 -0
  72. package/dist/src/text.test.js +110 -0
  73. package/dist/src/text.test.js.map +1 -0
  74. package/dist/src/token.d.ts +40 -0
  75. package/dist/src/token.d.ts.map +1 -0
  76. package/dist/src/token.js +154 -0
  77. package/dist/src/token.js.map +1 -0
  78. package/dist/src/token.test.d.ts +2 -0
  79. package/dist/src/token.test.d.ts.map +1 -0
  80. package/dist/src/token.test.js +74 -0
  81. package/dist/src/token.test.js.map +1 -0
  82. package/dist/src/types.d.ts +320 -0
  83. package/dist/src/types.d.ts.map +1 -0
  84. package/dist/src/types.js +2 -0
  85. package/dist/src/types.js.map +1 -0
  86. package/dist/src/webhook.d.ts +6 -0
  87. package/dist/src/webhook.d.ts.map +1 -0
  88. package/dist/src/webhook.js +381 -0
  89. package/dist/src/webhook.js.map +1 -0
  90. package/dist/src/webhook.test.d.ts +2 -0
  91. package/dist/src/webhook.test.d.ts.map +1 -0
  92. package/dist/src/webhook.test.js +737 -0
  93. package/dist/src/webhook.test.js.map +1 -0
  94. package/openclaw.plugin.json +83 -0
  95. package/package.json +103 -0
@@ -0,0 +1,296 @@
1
+ import type { PluginConfig, ResolvedWechatMpAccount } from "./types.js";
2
+ export { DEFAULT_ACCOUNT_ID } from "./config.js";
3
+ export type { ResolvedWechatMpAccount } from "./types.js";
4
+ /**
5
+ * WeChat MP ChannelPlugin composition root skeleton.
6
+ * Provides the complete plugin surface for host registration.
7
+ */
8
+ export declare const wechatMpPlugin: {
9
+ id: string;
10
+ meta: {
11
+ id: "wechat-mp";
12
+ label: "WeChat MP";
13
+ selectionLabel: "WeChat Official Account (微信公众号)";
14
+ docsPath: "/channels/wechat-mp";
15
+ docsLabel: "wechat-mp";
16
+ blurb: "微信公众号渠道,支持关注用户通过公众号与 AI 交互";
17
+ aliases: readonly ["weixin-mp", "微信公众号", "公众号"];
18
+ order: 81;
19
+ };
20
+ capabilities: {
21
+ chatTypes: readonly ["direct"];
22
+ media: boolean;
23
+ reactions: boolean;
24
+ threads: boolean;
25
+ edit: boolean;
26
+ reply: boolean;
27
+ polls: boolean;
28
+ activeSend: boolean;
29
+ };
30
+ messaging: {
31
+ normalizeTarget: (raw: string) => string | undefined;
32
+ targetResolver: {
33
+ looksLikeId: (raw: string, normalized?: string) => boolean;
34
+ hint: string;
35
+ };
36
+ formatTargetDisplay: (params: {
37
+ target: string;
38
+ display?: string;
39
+ }) => string;
40
+ };
41
+ configSchema: {
42
+ schema: {
43
+ type: string;
44
+ additionalProperties: boolean;
45
+ properties: {
46
+ enabled: {
47
+ type: string;
48
+ };
49
+ name: {
50
+ type: string;
51
+ };
52
+ defaultAccount: {
53
+ type: string;
54
+ };
55
+ appId: {
56
+ type: string;
57
+ };
58
+ appSecret: {
59
+ type: string;
60
+ };
61
+ encodingAESKey: {
62
+ type: string;
63
+ };
64
+ token: {
65
+ type: string;
66
+ };
67
+ webhookPath: {
68
+ type: string;
69
+ };
70
+ messageMode: {
71
+ type: string;
72
+ enum: string[];
73
+ };
74
+ replyMode: {
75
+ type: string;
76
+ enum: string[];
77
+ };
78
+ activeDeliveryMode: {
79
+ type: string;
80
+ enum: string[];
81
+ };
82
+ renderMarkdown: {
83
+ type: string;
84
+ };
85
+ welcomeText: {
86
+ type: string;
87
+ };
88
+ dmPolicy: {
89
+ type: string;
90
+ enum: string[];
91
+ };
92
+ allowFrom: {
93
+ type: string;
94
+ items: {
95
+ type: string;
96
+ };
97
+ };
98
+ accounts: {
99
+ type: string;
100
+ additionalProperties: {
101
+ type: string;
102
+ additionalProperties: boolean;
103
+ properties: {
104
+ name: {
105
+ type: string;
106
+ };
107
+ enabled: {
108
+ type: string;
109
+ };
110
+ appId: {
111
+ type: string;
112
+ };
113
+ appSecret: {
114
+ type: string;
115
+ };
116
+ encodingAESKey: {
117
+ type: string;
118
+ };
119
+ token: {
120
+ type: string;
121
+ };
122
+ webhookPath: {
123
+ type: string;
124
+ };
125
+ messageMode: {
126
+ type: string;
127
+ enum: string[];
128
+ };
129
+ replyMode: {
130
+ type: string;
131
+ enum: string[];
132
+ };
133
+ activeDeliveryMode: {
134
+ type: string;
135
+ enum: string[];
136
+ };
137
+ renderMarkdown: {
138
+ type: string;
139
+ };
140
+ welcomeText: {
141
+ type: string;
142
+ };
143
+ dmPolicy: {
144
+ type: string;
145
+ enum: string[];
146
+ };
147
+ allowFrom: {
148
+ type: string;
149
+ items: {
150
+ type: string;
151
+ };
152
+ };
153
+ };
154
+ };
155
+ };
156
+ };
157
+ };
158
+ };
159
+ reload: {
160
+ configPrefixes: string[];
161
+ };
162
+ onboarding: {
163
+ channel: "wechat-mp";
164
+ getStatus: (params: {
165
+ cfg: PluginConfig;
166
+ }) => Promise<{
167
+ channel: "wechat-mp";
168
+ configured: boolean;
169
+ statusLines: string[];
170
+ selectionHint: string;
171
+ quickstartScore: number;
172
+ }>;
173
+ configure: (params: {
174
+ cfg: PluginConfig;
175
+ prompter: import("./onboarding.js").WizardPrompter;
176
+ }) => Promise<{
177
+ cfg: PluginConfig;
178
+ accountId: string;
179
+ }>;
180
+ disable: (cfg: PluginConfig) => PluginConfig;
181
+ };
182
+ config: {
183
+ listAccountIds: (cfg: PluginConfig) => string[];
184
+ resolveAccount: (cfg: PluginConfig, accountId?: string) => ResolvedWechatMpAccount;
185
+ defaultAccountId: (cfg: PluginConfig) => string;
186
+ setAccountEnabled: (params: {
187
+ cfg: PluginConfig;
188
+ accountId?: string;
189
+ enabled: boolean;
190
+ }) => PluginConfig;
191
+ deleteAccount: (params: {
192
+ cfg: PluginConfig;
193
+ accountId?: string;
194
+ }) => PluginConfig;
195
+ isConfigured: (account: ResolvedWechatMpAccount) => boolean;
196
+ describeAccount: (account: ResolvedWechatMpAccount) => {
197
+ accountId: string;
198
+ name: string | undefined;
199
+ enabled: boolean;
200
+ configured: boolean;
201
+ canSendActive: boolean;
202
+ webhookPath: string;
203
+ };
204
+ resolveAllowFrom: (params: {
205
+ cfg: PluginConfig;
206
+ accountId?: string;
207
+ }) => string[];
208
+ formatAllowFrom: (params: {
209
+ allowFrom: (string | number)[];
210
+ }) => string[];
211
+ };
212
+ setup: {
213
+ resolveAccountId: (params: {
214
+ cfg: PluginConfig;
215
+ accountId?: string;
216
+ }) => string;
217
+ applyAccountConfig: (params: {
218
+ cfg: PluginConfig;
219
+ accountId?: string;
220
+ config?: Record<string, unknown>;
221
+ }) => PluginConfig;
222
+ };
223
+ directory: {
224
+ canResolve: (params: {
225
+ target: string;
226
+ }) => boolean;
227
+ resolveTarget: (params: {
228
+ cfg: PluginConfig;
229
+ target: string;
230
+ }) => {
231
+ channel: string;
232
+ accountId: string | undefined;
233
+ to: string;
234
+ } | null;
235
+ resolveTargets: (params: {
236
+ cfg: PluginConfig;
237
+ targets: string[];
238
+ }) => {
239
+ channel: string;
240
+ accountId?: string;
241
+ to: string;
242
+ }[];
243
+ getTargetFormats: () => string[];
244
+ };
245
+ outbound: {
246
+ deliveryMode: "direct";
247
+ textChunkLimit: number;
248
+ sendText: (params: {
249
+ cfg: PluginConfig;
250
+ accountId?: string;
251
+ to: string;
252
+ text: string;
253
+ }) => Promise<{
254
+ channel: string;
255
+ ok: boolean;
256
+ messageId: string;
257
+ error: Error | undefined;
258
+ }>;
259
+ };
260
+ gateway: {
261
+ startAccount: (ctx: {
262
+ cfg: PluginConfig;
263
+ runtime?: unknown;
264
+ abortSignal?: AbortSignal;
265
+ accountId: string;
266
+ setStatus?: (status: Record<string, unknown>) => void;
267
+ log?: {
268
+ info: (message: string) => void;
269
+ error: (message: string) => void;
270
+ };
271
+ }) => Promise<void>;
272
+ stopAccount: (ctx: {
273
+ accountId: string;
274
+ setStatus?: (status: Record<string, unknown>) => void;
275
+ }) => Promise<void>;
276
+ getStatus: () => {
277
+ connected: boolean;
278
+ };
279
+ };
280
+ status: {
281
+ probeAccount: (params: {
282
+ cfg: PluginConfig;
283
+ accountId?: string;
284
+ }) => Promise<{
285
+ channel: "wechat-mp";
286
+ accountId: string;
287
+ configured: boolean;
288
+ canSendActive: boolean;
289
+ webhookPath?: string;
290
+ authOk: boolean;
291
+ lastInboundAt?: number;
292
+ error?: string;
293
+ }>;
294
+ };
295
+ };
296
+ //# sourceMappingURL=channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../src/channel.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,YAAY,EAAE,uBAAuB,EAAkB,MAAM,YAAY,CAAC;AAExF,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,YAAY,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAkG1D;;;GAGG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;+BAiBA,MAAM,KAAG,MAAM,GAAG,SAAS;;+BAK7B,MAAM,eAAe,MAAM;;;sCAGlB;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8BAe5C,YAAY,KAAG,MAAM,EAAE;8BACvB,YAAY,cAAc,MAAM,KAAG,uBAAuB;gCAExD,YAAY,KAAG,MAAM;oCACjB;YAC1B,GAAG,EAAE,YAAY,CAAC;YAClB,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,OAAO,EAAE,OAAO,CAAC;SAClB,KAAG,YAAY;gCAmCQ;YAAE,GAAG,EAAE,YAAY,CAAC;YAAC,SAAS,CAAC,EAAE,MAAM,CAAA;SAAE,KAAG,YAAY;gCA+BxD,uBAAuB,KAAG,OAAO;mCAC9B,uBAAuB;;;;;;;;mCAQvB;YAAE,GAAG,EAAE,YAAY,CAAC;YAAC,SAAS,CAAC,EAAE,MAAM,CAAA;SAAE,KAAG,MAAM,EAAE;kCAErD;YAAE,SAAS,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;SAAE,KAAG,MAAM,EAAE;;;mCAO5C;YAAE,GAAG,EAAE,YAAY,CAAC;YAAC,SAAS,CAAC,EAAE,MAAM,CAAA;SAAE,KAAG,MAAM;qCAEhD;YAC3B,GAAG,EAAE,YAAY,CAAC;YAClB,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;SAClC,KAAG,YAAY;;;6BAuCK;YAAE,MAAM,EAAE,MAAM,CAAA;SAAE;gCACf;YAAE,GAAG,EAAE,YAAY,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE;;;;;iCAUpC;YAAE,GAAG,EAAE,YAAY,CAAC;YAAC,OAAO,EAAE,MAAM,EAAE,CAAA;SAAE;qBAC/B,MAAM;wBAAc,MAAM;gBAAM,MAAM;;;;;;;;;qBAxRM,CAAC;;;;;;;;;;;4BAuSrD;YACxB,GAAG,EAAE,YAAY,CAAC;YAClB,OAAO,CAAC,EAAE,OAAO,CAAC;YAClB,WAAW,CAAC,EAAE,WAAW,CAAC;YAC1B,SAAS,EAAE,MAAM,CAAC;YAClB,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;YACtD,GAAG,CAAC,EAAE;gBAAE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;gBAAC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;aAAE,CAAC;SAC7E,KAAG,OAAO,CAAC,IAAI,CAAC;2BAgEQ;YACvB,SAAS,EAAE,MAAM,CAAC;YAClB,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;SACvD,KAAG,OAAO,CAAC,IAAI,CAAC;;;;;;+BAcY;YAAE,GAAG,EAAE,YAAY,CAAC;YAAC,SAAS,CAAC,EAAE,MAAM,CAAA;SAAE;;;;;;;;;;;CAGzE,CAAC"}
@@ -0,0 +1,341 @@
1
+ import { DEFAULT_ACCOUNT_ID, listWechatMpAccountIds, resolveAllowFrom, resolveDefaultWechatMpAccountId, resolveWechatMpAccount, } from "./config.js";
2
+ import { wechatMpOnboardingAdapter } from "./onboarding.js";
3
+ import { wechatMpOutbound } from "./outbound.js";
4
+ import { probeWechatMpAccount } from "./probe.js";
5
+ import { getAccountState, updateAccountState } from "./state.js";
6
+ import { registerWechatMpWebhookTarget } from "./webhook.js";
7
+ import { setWechatMpRuntime } from "./runtime.js";
8
+ export { DEFAULT_ACCOUNT_ID } from "./config.js";
9
+ const unregisterHooks = new Map();
10
+ /**
11
+ * Parse a direct target string into accountId and openId components.
12
+ * Supports formats: "wechat-mp:user:<openId>@<accountId>", "user:<openId>@<accountId>", "<openId>@<accountId>"
13
+ */
14
+ function parseDirectTarget(rawTarget) {
15
+ let raw = String(rawTarget ?? "").trim();
16
+ if (!raw)
17
+ return null;
18
+ if (/^wechat-mp:/i.test(raw)) {
19
+ raw = raw.slice("wechat-mp:".length);
20
+ }
21
+ let accountId;
22
+ const atIndex = raw.lastIndexOf("@");
23
+ if (atIndex > 0 && atIndex < raw.length - 1) {
24
+ accountId = raw.slice(atIndex + 1).trim();
25
+ raw = raw.slice(0, atIndex);
26
+ }
27
+ if (/^user:/i.test(raw)) {
28
+ raw = raw.slice("user:".length);
29
+ }
30
+ const openId = raw.trim();
31
+ return openId ? { accountId, openId } : null;
32
+ }
33
+ /**
34
+ * JSON Schema for wechat-mp configuration validation.
35
+ */
36
+ const wechatMpConfigSchema = {
37
+ type: "object",
38
+ additionalProperties: false,
39
+ properties: {
40
+ enabled: { type: "boolean" },
41
+ name: { type: "string" },
42
+ defaultAccount: { type: "string" },
43
+ appId: { type: "string" },
44
+ appSecret: { type: "string" },
45
+ encodingAESKey: { type: "string" },
46
+ token: { type: "string" },
47
+ webhookPath: { type: "string" },
48
+ messageMode: { type: "string", enum: ["plain", "safe", "compat"] },
49
+ replyMode: { type: "string", enum: ["passive", "active"] },
50
+ activeDeliveryMode: { type: "string", enum: ["merged", "split"] },
51
+ renderMarkdown: { type: "boolean" },
52
+ welcomeText: { type: "string" },
53
+ dmPolicy: { type: "string", enum: ["open", "pairing", "allowlist", "disabled"] },
54
+ allowFrom: { type: "array", items: { type: "string" } },
55
+ accounts: {
56
+ type: "object",
57
+ additionalProperties: {
58
+ type: "object",
59
+ additionalProperties: false,
60
+ properties: {
61
+ name: { type: "string" },
62
+ enabled: { type: "boolean" },
63
+ appId: { type: "string" },
64
+ appSecret: { type: "string" },
65
+ encodingAESKey: { type: "string" },
66
+ token: { type: "string" },
67
+ webhookPath: { type: "string" },
68
+ messageMode: { type: "string", enum: ["plain", "safe", "compat"] },
69
+ replyMode: { type: "string", enum: ["passive", "active"] },
70
+ activeDeliveryMode: { type: "string", enum: ["merged", "split"] },
71
+ renderMarkdown: { type: "boolean" },
72
+ welcomeText: { type: "string" },
73
+ dmPolicy: { type: "string", enum: ["open", "pairing", "allowlist", "disabled"] },
74
+ allowFrom: { type: "array", items: { type: "string" } },
75
+ },
76
+ },
77
+ },
78
+ },
79
+ };
80
+ /**
81
+ * Plugin metadata for display and identification.
82
+ */
83
+ const meta = {
84
+ id: "wechat-mp",
85
+ label: "WeChat MP",
86
+ selectionLabel: "WeChat Official Account (微信公众号)",
87
+ docsPath: "/channels/wechat-mp",
88
+ docsLabel: "wechat-mp",
89
+ blurb: "微信公众号渠道,支持关注用户通过公众号与 AI 交互",
90
+ aliases: ["weixin-mp", "微信公众号", "公众号"],
91
+ order: 81,
92
+ };
93
+ /**
94
+ * WeChat MP ChannelPlugin composition root skeleton.
95
+ * Provides the complete plugin surface for host registration.
96
+ */
97
+ export const wechatMpPlugin = {
98
+ id: "wechat-mp",
99
+ meta: { ...meta },
100
+ capabilities: {
101
+ chatTypes: ["direct"],
102
+ media: false,
103
+ reactions: false,
104
+ threads: false,
105
+ edit: false,
106
+ reply: true,
107
+ polls: false,
108
+ activeSend: true,
109
+ },
110
+ messaging: {
111
+ normalizeTarget: (raw) => {
112
+ const parsed = parseDirectTarget(raw);
113
+ return parsed ? `user:${parsed.openId}${parsed.accountId ? `@${parsed.accountId}` : ""}` : undefined;
114
+ },
115
+ targetResolver: {
116
+ looksLikeId: (raw, normalized) => Boolean(parseDirectTarget(normalized ?? raw)),
117
+ hint: "Use openid only: user:<openid> (optional @accountId).",
118
+ },
119
+ formatTargetDisplay: (params) => {
120
+ const parsed = parseDirectTarget(params.target);
121
+ return parsed ? `user:${parsed.openId}` : params.display?.trim() || params.target;
122
+ },
123
+ },
124
+ configSchema: {
125
+ schema: wechatMpConfigSchema,
126
+ },
127
+ reload: { configPrefixes: ["channels.wechat-mp"] },
128
+ onboarding: wechatMpOnboardingAdapter,
129
+ config: {
130
+ listAccountIds: (cfg) => listWechatMpAccountIds(cfg),
131
+ resolveAccount: (cfg, accountId) => resolveWechatMpAccount({ cfg, accountId }),
132
+ defaultAccountId: (cfg) => resolveDefaultWechatMpAccountId(cfg),
133
+ setAccountEnabled: (params) => {
134
+ const accountId = params.accountId ?? DEFAULT_ACCOUNT_ID;
135
+ const existing = (params.cfg.channels?.["wechat-mp"] ?? {});
136
+ const hasDedicatedAccount = Boolean(existing.accounts?.[accountId]);
137
+ if (!hasDedicatedAccount || accountId === DEFAULT_ACCOUNT_ID) {
138
+ return {
139
+ ...params.cfg,
140
+ channels: {
141
+ ...params.cfg.channels,
142
+ "wechat-mp": {
143
+ ...existing,
144
+ enabled: params.enabled,
145
+ },
146
+ },
147
+ };
148
+ }
149
+ return {
150
+ ...params.cfg,
151
+ channels: {
152
+ ...params.cfg.channels,
153
+ "wechat-mp": {
154
+ ...existing,
155
+ accounts: {
156
+ ...(existing.accounts ?? {}),
157
+ [accountId]: {
158
+ ...(existing.accounts?.[accountId] ?? {}),
159
+ enabled: params.enabled,
160
+ },
161
+ },
162
+ },
163
+ },
164
+ };
165
+ },
166
+ deleteAccount: (params) => {
167
+ const accountId = params.accountId ?? DEFAULT_ACCOUNT_ID;
168
+ const existing = (params.cfg.channels?.["wechat-mp"] ?? undefined);
169
+ if (!existing)
170
+ return params.cfg;
171
+ if (accountId === DEFAULT_ACCOUNT_ID) {
172
+ return {
173
+ ...params.cfg,
174
+ channels: {
175
+ ...params.cfg.channels,
176
+ "wechat-mp": {
177
+ ...existing,
178
+ enabled: false,
179
+ },
180
+ },
181
+ };
182
+ }
183
+ const nextAccounts = { ...(existing.accounts ?? {}) };
184
+ delete nextAccounts[accountId];
185
+ return {
186
+ ...params.cfg,
187
+ channels: {
188
+ ...params.cfg.channels,
189
+ "wechat-mp": {
190
+ ...existing,
191
+ accounts: Object.keys(nextAccounts).length > 0 ? nextAccounts : undefined,
192
+ },
193
+ },
194
+ };
195
+ },
196
+ isConfigured: (account) => account.configured,
197
+ describeAccount: (account) => ({
198
+ accountId: account.accountId,
199
+ name: account.name,
200
+ enabled: account.enabled,
201
+ configured: account.configured,
202
+ canSendActive: account.canSendActive,
203
+ webhookPath: account.config.webhookPath ?? "/wechat-mp",
204
+ }),
205
+ resolveAllowFrom: (params) => resolveAllowFrom(resolveWechatMpAccount({ cfg: params.cfg, accountId: params.accountId }).config),
206
+ formatAllowFrom: (params) => params.allowFrom
207
+ .map((entry) => String(entry).trim().toLowerCase())
208
+ .filter(Boolean),
209
+ },
210
+ setup: {
211
+ resolveAccountId: (params) => params.accountId?.trim() || resolveDefaultWechatMpAccountId(params.cfg),
212
+ applyAccountConfig: (params) => {
213
+ const accountId = params.accountId ?? DEFAULT_ACCOUNT_ID;
214
+ const existing = (params.cfg.channels?.["wechat-mp"] ?? {});
215
+ if (accountId === DEFAULT_ACCOUNT_ID) {
216
+ return {
217
+ ...params.cfg,
218
+ channels: {
219
+ ...params.cfg.channels,
220
+ "wechat-mp": {
221
+ ...existing,
222
+ ...params.config,
223
+ enabled: true,
224
+ },
225
+ },
226
+ };
227
+ }
228
+ return {
229
+ ...params.cfg,
230
+ channels: {
231
+ ...params.cfg.channels,
232
+ "wechat-mp": {
233
+ ...existing,
234
+ enabled: true,
235
+ accounts: {
236
+ ...(existing.accounts ?? {}),
237
+ [accountId]: {
238
+ ...(existing.accounts?.[accountId] ?? {}),
239
+ ...params.config,
240
+ enabled: true,
241
+ },
242
+ },
243
+ },
244
+ },
245
+ };
246
+ },
247
+ },
248
+ directory: {
249
+ canResolve: (params) => Boolean(parseDirectTarget(params.target)),
250
+ resolveTarget: (params) => {
251
+ const parsed = parseDirectTarget(params.target);
252
+ return parsed
253
+ ? {
254
+ channel: "wechat-mp",
255
+ accountId: parsed.accountId,
256
+ to: parsed.openId,
257
+ }
258
+ : null;
259
+ },
260
+ resolveTargets: (params) => {
261
+ const results = [];
262
+ for (const target of params.targets) {
263
+ const resolved = wechatMpPlugin.directory.resolveTarget({ cfg: params.cfg, target });
264
+ if (resolved) {
265
+ results.push(resolved);
266
+ }
267
+ }
268
+ return results;
269
+ },
270
+ getTargetFormats: () => ["wechat-mp:user:<openid>", "user:<openid>", "<openid>"],
271
+ },
272
+ outbound: wechatMpOutbound,
273
+ gateway: {
274
+ startAccount: async (ctx) => {
275
+ const account = resolveWechatMpAccount({ cfg: ctx.cfg, accountId: ctx.accountId });
276
+ const path = (account.config.webhookPath ?? "/wechat-mp").trim() || "/wechat-mp";
277
+ const runtimeCandidate = ctx.runtime;
278
+ if (runtimeCandidate?.channel?.routing?.resolveAgentRoute &&
279
+ runtimeCandidate.channel.reply?.dispatchReplyWithBufferedBlockDispatcher) {
280
+ setWechatMpRuntime(ctx.runtime);
281
+ }
282
+ ctx.log?.info?.(`[wechat-mp] account ${account.accountId} starting webhook ingress`);
283
+ const registerTarget = {
284
+ account,
285
+ config: ctx.cfg,
286
+ runtime: {
287
+ log: ctx.log?.info ?? console.log,
288
+ error: ctx.log?.error ?? console.error,
289
+ },
290
+ path,
291
+ statusSink: (patch) => ctx.setStatus?.({ accountId: account.accountId, ...patch }),
292
+ };
293
+ const unregister = registerWechatMpWebhookTarget(registerTarget);
294
+ const previous = unregisterHooks.get(account.accountId);
295
+ if (previous)
296
+ previous();
297
+ unregisterHooks.set(account.accountId, unregister);
298
+ const lastStartAt = Date.now();
299
+ await updateAccountState(account.accountId, {
300
+ running: true,
301
+ configured: account.configured,
302
+ webhookPath: path,
303
+ lastStartAt,
304
+ });
305
+ const state = await getAccountState(account.accountId);
306
+ ctx.setStatus?.({
307
+ accountId: account.accountId,
308
+ running: true,
309
+ configured: account.configured,
310
+ canSendActive: account.canSendActive,
311
+ webhookPath: path,
312
+ lastInboundAt: state.lastInboundAt,
313
+ lastStartAt,
314
+ });
315
+ if (ctx.abortSignal) {
316
+ await new Promise((resolve) => {
317
+ if (ctx.abortSignal?.aborted) {
318
+ resolve();
319
+ return;
320
+ }
321
+ ctx.abortSignal?.addEventListener("abort", () => resolve(), { once: true });
322
+ });
323
+ }
324
+ },
325
+ stopAccount: async (ctx) => {
326
+ const unregister = unregisterHooks.get(ctx.accountId);
327
+ if (unregister) {
328
+ unregister();
329
+ unregisterHooks.delete(ctx.accountId);
330
+ }
331
+ const lastStopAt = Date.now();
332
+ await updateAccountState(ctx.accountId, { running: false, lastStopAt });
333
+ ctx.setStatus?.({ accountId: ctx.accountId, running: false, lastStopAt });
334
+ },
335
+ getStatus: () => ({ connected: true }),
336
+ },
337
+ status: {
338
+ probeAccount: async (params) => probeWechatMpAccount({ cfg: params.cfg, accountId: params.accountId }),
339
+ },
340
+ };
341
+ //# sourceMappingURL=channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/channel.ts"],"names":[],"mappings":"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"}