openpaean 0.6.5 → 0.7.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.
package/dist/cli.js CHANGED
@@ -16,6 +16,7 @@ import { validateCommand } from './commands/validate.js';
16
16
  import { agentCommand, runAgentMode } from './commands/agent.js';
17
17
  import { updateCommand } from './commands/update.js';
18
18
  import { gatewayCommand } from './commands/gateway.js';
19
+ import { wechatCommand } from './commands/wechat.js';
19
20
  import { creditsCommand } from './commands/credits.js';
20
21
  import { getConfigPath } from './utils/config.js';
21
22
  // Read version from package.json
@@ -34,6 +35,7 @@ program
34
35
  .option('-m, --message <message>', 'Send a single message to agent')
35
36
  .option('--gateway', 'Enable gateway relay for remote clients')
36
37
  .option('--gateway-interval <ms>', 'Gateway poll interval in milliseconds', '3000')
38
+ .option('--wechat', 'Enable WeChat channel gateway')
37
39
  .action(async (options) => {
38
40
  if (options.config) {
39
41
  console.log(getConfigPath());
@@ -46,6 +48,7 @@ program
46
48
  message: options.message,
47
49
  gatewayEnabled: options.gateway ?? false,
48
50
  gatewayPollInterval: parseInt(options.gatewayInterval, 10) || 3000,
51
+ wechatEnabled: options.wechat ?? false,
49
52
  });
50
53
  });
51
54
  // Register commands
@@ -57,6 +60,7 @@ program.addCommand(contextCommand);
57
60
  program.addCommand(serveCommand);
58
61
  program.addCommand(validateCommand);
59
62
  program.addCommand(gatewayCommand);
63
+ program.addCommand(wechatCommand);
60
64
  program.addCommand(creditsCommand);
61
65
  program.addCommand(updateCommand);
62
66
  // Parse arguments
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -14,5 +14,6 @@ export declare function runAgentMode(options: {
14
14
  message?: string;
15
15
  gatewayEnabled?: boolean;
16
16
  gatewayPollInterval?: number;
17
+ wechatEnabled?: boolean;
17
18
  }): Promise<void>;
18
19
  //# sourceMappingURL=agent.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,YAAY,SAsBnB,CAAC;AAEP;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE;IACxC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAChC,GAAG,OAAO,CAAC,IAAI,CAAC,CA4KhB"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,YAAY,SAwBnB,CAAC;AAEP;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE;IACxC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B,GAAG,OAAO,CAAC,IAAI,CAAC,CA8LhB"}
@@ -16,6 +16,7 @@ export const agentCommand = new Command('agent')
16
16
  .option('-m, --message <message>', 'Send a single message and exit')
17
17
  .option('--gateway', 'Enable gateway relay for remote clients')
18
18
  .option('--gateway-interval <ms>', 'Gateway poll interval in milliseconds', '3000')
19
+ .option('--wechat', 'Enable WeChat channel gateway')
19
20
  .action(async (options) => {
20
21
  if (!isAuthenticated()) {
21
22
  console.log(chalk.yellow('⚠️ Not logged in. Run `openpaean login` first.\n'));
@@ -28,6 +29,7 @@ export const agentCommand = new Command('agent')
28
29
  message: options.message,
29
30
  gatewayEnabled: options.gateway ?? false,
30
31
  gatewayPollInterval: parseInt(options.gatewayInterval, 10) || 3000,
32
+ wechatEnabled: options.wechat ?? false,
31
33
  });
32
34
  });
33
35
  /**
@@ -158,6 +160,16 @@ export async function runAgentMode(options) {
158
160
  console.log(chalk.dim('[Gateway] Enabled — polling for remote requests'));
159
161
  }
160
162
  }
163
+ // Initialize WeChat gateway if enabled
164
+ let wechatService;
165
+ if (options.wechatEnabled) {
166
+ const { WechatGatewayService } = await import('../wechat/service.js');
167
+ wechatService = new WechatGatewayService({ debug });
168
+ wechatService.setMcpState(mcpState, onMcpToolCall);
169
+ if (debug) {
170
+ console.log(chalk.dim('[WeChat] Enabled — polling for WeChat messages'));
171
+ }
172
+ }
161
173
  // Start interactive chat (scrolling mode by default, fullscreen if requested)
162
174
  try {
163
175
  // Start background services
@@ -166,6 +178,11 @@ export async function runAgentMode(options) {
166
178
  console.log(chalk.yellow(`Gateway failed to start: ${err instanceof Error ? err.message : err}`));
167
179
  });
168
180
  }
181
+ if (wechatService) {
182
+ wechatService.start().catch((err) => {
183
+ console.log(chalk.yellow(`WeChat channel failed to start: ${err instanceof Error ? err.message : err}`));
184
+ });
185
+ }
169
186
  if (enableFullscreen) {
170
187
  await startFullscreenChat({
171
188
  mcpState,
@@ -182,7 +199,9 @@ export async function runAgentMode(options) {
182
199
  }
183
200
  }
184
201
  finally {
185
- // Cleanup gateway and MCP connections on exit
202
+ if (wechatService) {
203
+ await wechatService.stop().catch(() => { });
204
+ }
186
205
  if (gatewayService) {
187
206
  await gatewayService.stop().catch(() => { });
188
207
  }
@@ -1 +1 @@
1
- {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAG1D,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC3C,WAAW,CAAC,2CAA2C,CAAC;KACxD,MAAM,CAAC,UAAU,EAAE,sCAAsC,CAAC;KAC1D,MAAM,CAAC,cAAc,EAAE,kDAAkD,CAAC;KAC1E,MAAM,CAAC,aAAa,EAAE,sBAAsB,CAAC;KAC7C,MAAM,CAAC,yBAAyB,EAAE,gCAAgC,CAAC;KACnE,MAAM,CAAC,WAAW,EAAE,yCAAyC,CAAC;KAC9D,MAAM,CAAC,yBAAyB,EAAE,uCAAuC,EAAE,MAAM,CAAC;KAClF,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACtB,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mDAAmD,CAAC,CAAC,CAAC;QAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,YAAY,CAAC;QACf,GAAG,EAAE,OAAO,CAAC,GAAG,KAAK,KAAK;QAC1B,UAAU,EAAE,OAAO,CAAC,UAAU,KAAK,IAAI;QACvC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK;QAC7B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,cAAc,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK;QACxC,mBAAmB,EAAE,QAAQ,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,IAAI,IAAI;KACrE,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEP;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAOlC;IACG,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mDAAmD,CAAC,CAAC,CAAC;QAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC;IACrC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,KAAK,KAAK,CAAC;IACxC,MAAM,gBAAgB,GAAG,OAAO,CAAC,UAAU,KAAK,KAAK,CAAC;IAEtD,4BAA4B;IAC5B,IAAI,QAA8B,CAAC;IACnC,IAAI,SAAgC,CAAC;IAErC,IAAI,SAAS,EAAE,CAAC;QACZ,SAAS,GAAG,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACrC,MAAM,WAAW,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QAE5C,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,IAAI,KAAK,EAAE,CAAC;gBACR,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,WAAW,CAAC,MAAM,uBAAuB,CAAC,CAAC,CAAC;YACrF,CAAC;YAED,yBAAyB;YACzB,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;gBAC7B,IAAI,CAAC;oBACD,IAAI,KAAK,EAAE,CAAC;wBACR,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,IAAI,KAAK,CAAC,CAAC,CAAC;oBAC7D,CAAC;oBACD,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBAC5C,IAAI,KAAK,EAAE,CAAC;wBACR,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,IAAI,KAAK,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC;oBAChF,CAAC;gBACL,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACb,OAAO,CAAC,GAAG,CACP,KAAK,CAAC,MAAM,CAAC,wCAAwC,IAAI,MAAO,KAAe,CAAC,OAAO,EAAE,CAAC,CAC7F,CAAC;gBACN,CAAC;YACL,CAAC;YAED,0BAA0B;YAC1B,MAAM,gBAAgB,GAAG,SAAS,CAAC,mBAAmB,EAAE,CAAC;YACzD,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,QAAQ,GAAG;oBACP,UAAU,EAAE,IAAI;oBAChB,UAAU,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;wBACxC,IAAI;wBACJ,SAAS,EAAE,IAAI;wBACf,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,SAAU,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;qBAC9D,CAAC,CAAC;iBACN,CAAC;YACN,CAAC;QACL,CAAC;IACL,CAAC;IAED,mDAAmD;IACnD,sDAAsD;IACtD,iDAAiD;IACjD,2EAA2E;IAC3E,IAAI,CAAC;QACD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QAEvC,MAAM,iBAAiB,GAAG;YACtB,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,gBAAgB,CAAC;YAC/C,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,gBAAgB,CAAC;SACtD,CAAC;QAEF,MAAM,gBAAgB,GAAG;YACrB,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,gBAAgB,CAAC;YAC3C,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,gBAAgB,CAAC;SAClD,CAAC;QAEF,+DAA+D;QAC/D,KAAK,MAAM,gBAAgB,IAAI,iBAAiB,EAAE,CAAC;YAC/C,MAAM,YAAY,GAAG,MAAM,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;YACrE,IAAI,YAAY,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,YAAY,wBAAwB,gBAAgB,EAAE,CAAC,CAAC,CAAC;YACnG,CAAC;QACL,CAAC;QAED,wDAAwD;QACxD,KAAK,MAAM,eAAe,IAAI,gBAAgB,EAAE,CAAC;YAC7C,MAAM,WAAW,GAAG,MAAM,uBAAuB,CAAC,eAAe,CAAC,CAAC;YACnE,IAAI,WAAW,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,WAAW,wBAAwB,eAAe,EAAE,CAAC,CAAC,CAAC;YACjG,CAAC;QACL,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,KAAK,EAAE,CAAC;YACR,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,uCAAwC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC9F,CAAC;IACL,CAAC;IAED,+BAA+B;IAC/B,MAAM,aAAa,GAAG,KAAK,EACvB,OAAe,EACf,UAAkB,EAClB,QAAgB,EAChB,IAA6B,EACP,EAAE;QACxB,IAAI,CAAC,SAAS,EAAE,CAAC;YACb,OAAO;gBACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC;gBAC7D,OAAO,EAAE,IAAI;aAChB,CAAC;QACN,CAAC;QAED,OAAO,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC1D,CAAC,CAAC;IAEF,6BAA6B;IAC7B,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;QAChE,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE;gBAChD,QAAQ;gBACR,aAAa;gBACb,KAAK;aACR,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAW,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;gBAAS,CAAC;YACP,MAAM,SAAS,EAAE,aAAa,EAAE,CAAC;QACrC,CAAC;QACD,OAAO;IACX,CAAC;IAED,wCAAwC;IACxC,IAAI,cAA0E,CAAC;IAC/E,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;QACzB,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QACjE,cAAc,GAAG,IAAI,cAAc,CAAC;YAChC,YAAY,EAAE,OAAO,CAAC,mBAAmB,IAAI,IAAI;YACjD,KAAK;SACR,CAAC,CAAC;QACH,cAAc,CAAC,WAAW,CAAC,QAAQ,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;QAC/D,IAAI,KAAK,EAAE,CAAC;YACR,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC,CAAC;QAC9E,CAAC;IACL,CAAC;IAED,8EAA8E;IAC9E,IAAI,CAAC;QACD,4BAA4B;QAC5B,IAAI,cAAc,EAAE,CAAC;YACjB,cAAc,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,4BAA4B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACtG,CAAC,CAAC,CAAC;QACP,CAAC;QACD,IAAI,gBAAgB,EAAE,CAAC;YACnB,MAAM,mBAAmB,CAAC;gBACtB,QAAQ;gBACR,aAAa;gBACb,KAAK;aACR,CAAC,CAAC;QACP,CAAC;aAAM,CAAC;YACJ,MAAM,kBAAkB,CAAC;gBACrB,QAAQ;gBACR,aAAa;gBACb,KAAK;aACR,CAAC,CAAC;QACP,CAAC;IACL,CAAC;YAAS,CAAC;QACP,8CAA8C;QAC9C,IAAI,cAAc,EAAE,CAAC;YACjB,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,SAAS,EAAE,aAAa,EAAE,CAAC;IACrC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * WeChat Command
3
+ * CLI commands for WeChat channel integration.
4
+ *
5
+ * Workflow:
6
+ * 1. openpaean wechat setup — Scan QR code to authenticate
7
+ * 2. openpaean wechat start — Start agent with WeChat channel active
8
+ * 3. openpaean wechat status — Check login status
9
+ * 4. openpaean wechat logout — Remove saved credentials
10
+ */
11
+ import { Command } from 'commander';
12
+ export declare const wechatCommand: Command;
13
+ //# sourceMappingURL=wechat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wechat.d.ts","sourceRoot":"","sources":["../../src/commands/wechat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,aAAa,SAYxB,CAAC"}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * WeChat Command
3
+ * CLI commands for WeChat channel integration.
4
+ *
5
+ * Workflow:
6
+ * 1. openpaean wechat setup — Scan QR code to authenticate
7
+ * 2. openpaean wechat start — Start agent with WeChat channel active
8
+ * 3. openpaean wechat status — Check login status
9
+ * 4. openpaean wechat logout — Remove saved credentials
10
+ */
11
+ import { Command } from 'commander';
12
+ import chalk from 'chalk';
13
+ export const wechatCommand = new Command('wechat')
14
+ .description('WeChat channel — bridge WeChat messages to local agent')
15
+ .addHelpText('after', `
16
+ Workflow:
17
+ $ openpaean wechat setup Authenticate with WeChat (scan QR code)
18
+ $ openpaean wechat start Start the agent with WeChat channel active
19
+ $ openpaean wechat status Show current login status
20
+ $ openpaean wechat logout Remove saved credentials
21
+
22
+ The "start" command launches the interactive agent with WeChat message
23
+ bridging enabled. You can also use the --wechat flag directly:
24
+ $ openpaean --wechat
25
+ `);
26
+ wechatCommand
27
+ .command('setup')
28
+ .description('Authenticate with WeChat via QR code')
29
+ .option('-f, --force', 'Re-authenticate even if already logged in')
30
+ .addHelpText('after', `
31
+ After setup completes, start the agent with:
32
+ $ openpaean wechat start
33
+ $ openpaean --wechat (equivalent shorthand)
34
+ `)
35
+ .action(async (opts) => {
36
+ const { fetchQRCode, pollQRStatus, DEFAULT_BASE_URL } = await import('../wechat/api.js');
37
+ const { loadCredentials, saveCredentials } = await import('../wechat/credentials.js');
38
+ const existing = loadCredentials();
39
+ if (existing && !opts.force) {
40
+ console.log(`Existing WeChat account: ${existing.accountId}`);
41
+ console.log(`Saved at: ${existing.savedAt}\n`);
42
+ const readline = await import('node:readline');
43
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
44
+ const answer = await new Promise(resolve => rl.question('Re-authenticate? (y/N) ', resolve));
45
+ rl.close();
46
+ if (answer.toLowerCase() !== 'y') {
47
+ console.log('Keeping existing credentials.');
48
+ return;
49
+ }
50
+ }
51
+ console.log('Fetching WeChat login QR code...\n');
52
+ const qrResp = await fetchQRCode(DEFAULT_BASE_URL);
53
+ try {
54
+ const qrterm = await import('qrcode-terminal');
55
+ await new Promise(resolve => {
56
+ qrterm.default.generate(qrResp.qrcode_img_content, { small: true }, (qr) => { console.log(qr); resolve(); });
57
+ });
58
+ }
59
+ catch {
60
+ console.log(`QR URL: ${qrResp.qrcode_img_content}\n`);
61
+ }
62
+ console.log('Scan the QR code with WeChat...\n');
63
+ const deadline = Date.now() + 480_000;
64
+ let scanned = false;
65
+ while (Date.now() < deadline) {
66
+ const status = await pollQRStatus(DEFAULT_BASE_URL, qrResp.qrcode);
67
+ switch (status.status) {
68
+ case 'wait':
69
+ process.stdout.write('.');
70
+ break;
71
+ case 'scaned':
72
+ if (!scanned) {
73
+ console.log('\nScanned! Confirm on phone...');
74
+ scanned = true;
75
+ }
76
+ break;
77
+ case 'expired':
78
+ console.error('\nQR code expired. Run setup again.');
79
+ process.exit(1);
80
+ break;
81
+ case 'confirmed': {
82
+ if (!status.ilink_bot_id || !status.bot_token) {
83
+ console.error('\nLogin failed.');
84
+ process.exit(1);
85
+ }
86
+ const account = {
87
+ token: status.bot_token, baseUrl: status.baseurl || DEFAULT_BASE_URL,
88
+ accountId: status.ilink_bot_id, userId: status.ilink_user_id,
89
+ savedAt: new Date().toISOString(),
90
+ };
91
+ saveCredentials(account);
92
+ console.log(chalk.green(`\n✓ WeChat connected!`));
93
+ console.log(` Account: ${account.accountId}\n`);
94
+ console.log(chalk.bold('Next step — start the agent with WeChat channel:'));
95
+ console.log(` ${chalk.cyan('openpaean wechat start')}`);
96
+ console.log(` ${chalk.cyan('openpaean --wechat')} ${chalk.dim('(equivalent)')}`);
97
+ return;
98
+ }
99
+ }
100
+ await new Promise(r => setTimeout(r, 1000));
101
+ }
102
+ console.error('\nLogin timed out.');
103
+ process.exit(1);
104
+ });
105
+ wechatCommand
106
+ .command('start')
107
+ .description('Start the agent with WeChat channel active')
108
+ .option('--no-mcp', 'Disable local MCP server integration')
109
+ .option('-d, --debug', 'Enable debug logging')
110
+ .action(async (opts) => {
111
+ const { loadCredentials } = await import('../wechat/credentials.js');
112
+ if (!loadCredentials()) {
113
+ console.log(chalk.yellow('WeChat not set up yet.\n'));
114
+ console.log(`Run ${chalk.cyan('openpaean wechat setup')} to authenticate first.`);
115
+ process.exit(1);
116
+ }
117
+ const { isAuthenticated } = await import('../utils/config.js');
118
+ if (!isAuthenticated()) {
119
+ console.log(chalk.yellow('⚠️ Not logged in. Run `openpaean login` first.\n'));
120
+ process.exit(1);
121
+ }
122
+ const { runAgentMode } = await import('./agent.js');
123
+ await runAgentMode({
124
+ mcp: opts.mcp !== false,
125
+ debug: opts.debug ?? false,
126
+ wechatEnabled: true,
127
+ });
128
+ });
129
+ wechatCommand
130
+ .command('status')
131
+ .description('Show WeChat login status')
132
+ .action(async () => {
133
+ const { loadCredentials } = await import('../wechat/credentials.js');
134
+ const account = loadCredentials();
135
+ if (account) {
136
+ console.log(chalk.green('✓ WeChat: Logged in'));
137
+ console.log(` Account: ${account.accountId}`);
138
+ console.log(` User: ${account.userId ?? 'N/A'}`);
139
+ console.log(` Saved: ${account.savedAt}\n`);
140
+ console.log(`Start the agent with: ${chalk.cyan('openpaean wechat start')}`);
141
+ }
142
+ else {
143
+ console.log(chalk.gray('✗ WeChat: Not logged in'));
144
+ console.log(` Run ${chalk.cyan('openpaean wechat setup')} to authenticate.`);
145
+ }
146
+ });
147
+ wechatCommand
148
+ .command('logout')
149
+ .description('Remove WeChat credentials')
150
+ .action(async () => {
151
+ const { removeCredentials, loadCredentials } = await import('../wechat/credentials.js');
152
+ if (!loadCredentials()) {
153
+ console.log('No WeChat credentials found.');
154
+ return;
155
+ }
156
+ removeCredentials();
157
+ console.log(chalk.green('✓ WeChat credentials removed.'));
158
+ });
159
+ //# sourceMappingURL=wechat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wechat.js","sourceRoot":"","sources":["../../src/commands/wechat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ declare const DEFAULT_BASE_URL = "https://ilinkai.weixin.qq.com";
2
+ export declare const MSG_TYPE_USER = 1;
3
+ export { DEFAULT_BASE_URL };
4
+ export interface AccountData {
5
+ token: string;
6
+ baseUrl: string;
7
+ accountId: string;
8
+ userId?: string;
9
+ savedAt: string;
10
+ }
11
+ export interface QRCodeResponse {
12
+ qrcode: string;
13
+ qrcode_img_content: string;
14
+ }
15
+ export interface QRStatusResponse {
16
+ status: 'wait' | 'scaned' | 'confirmed' | 'expired';
17
+ bot_token?: string;
18
+ ilink_bot_id?: string;
19
+ baseurl?: string;
20
+ ilink_user_id?: string;
21
+ }
22
+ interface MessageItem {
23
+ type?: number;
24
+ text_item?: {
25
+ text?: string;
26
+ };
27
+ voice_item?: {
28
+ text?: string;
29
+ };
30
+ ref_msg?: {
31
+ title?: string;
32
+ };
33
+ }
34
+ export interface WeixinMessage {
35
+ from_user_id?: string;
36
+ message_type?: number;
37
+ item_list?: MessageItem[];
38
+ context_token?: string;
39
+ }
40
+ export interface GetUpdatesResp {
41
+ ret?: number;
42
+ errcode?: number;
43
+ errmsg?: string;
44
+ msgs?: WeixinMessage[];
45
+ get_updates_buf?: string;
46
+ }
47
+ export declare function fetchQRCode(baseUrl?: string): Promise<QRCodeResponse>;
48
+ export declare function pollQRStatus(baseUrl: string, qrcode: string): Promise<QRStatusResponse>;
49
+ export declare function getUpdates(baseUrl: string, token: string, buf: string): Promise<GetUpdatesResp>;
50
+ export declare function sendTextMessage(baseUrl: string, token: string, to: string, text: string, contextToken: string): Promise<void>;
51
+ export declare function extractText(msg: WeixinMessage): string;
52
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/wechat/api.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,gBAAgB,kCAAkC,CAAC;AAOzD,eAAO,MAAM,aAAa,IAAI,CAAC;AAM/B,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAE5B,MAAM,WAAW,WAAW;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAC;CAAE;AAC/E,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAC;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACvF;AAED,UAAU,WAAW;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,UAAU,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/B,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChD,IAAI,CAAC,EAAE,aAAa,EAAE,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACpD;AAgCD,wBAAsB,WAAW,CAAC,OAAO,GAAE,MAAyB,GAAG,OAAO,CAAC,cAAc,CAAC,CAI7F;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAc7F;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAUrG;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWnI;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAWtD"}
@@ -0,0 +1,110 @@
1
+ import crypto from 'crypto';
2
+ const DEFAULT_BASE_URL = 'https://ilinkai.weixin.qq.com';
3
+ const BOT_TYPE = '3';
4
+ const CHANNEL_VERSION = '0.1.0';
5
+ const LONG_POLL_TIMEOUT_MS = 35_000;
6
+ const QR_POLL_TIMEOUT_MS = 35_000;
7
+ const SEND_TIMEOUT_MS = 15_000;
8
+ export const MSG_TYPE_USER = 1;
9
+ const MSG_TYPE_BOT = 2;
10
+ const MSG_STATE_FINISH = 2;
11
+ const MSG_ITEM_TEXT = 1;
12
+ const MSG_ITEM_VOICE = 3;
13
+ export { DEFAULT_BASE_URL };
14
+ function randomUin() {
15
+ return Buffer.from(String(crypto.randomBytes(4).readUInt32BE(0)), 'utf-8').toString('base64');
16
+ }
17
+ function headers(token, body) {
18
+ const h = {
19
+ 'Content-Type': 'application/json',
20
+ AuthorizationType: 'ilink_bot_token',
21
+ 'X-WECHAT-UIN': randomUin(),
22
+ };
23
+ if (body)
24
+ h['Content-Length'] = String(Buffer.byteLength(body, 'utf-8'));
25
+ if (token?.trim())
26
+ h.Authorization = `Bearer ${token.trim()}`;
27
+ return h;
28
+ }
29
+ function norm(u) { return u.endsWith('/') ? u : `${u}/`; }
30
+ async function apiFetch(baseUrl, endpoint, body, token, timeoutMs = 15_000) {
31
+ const url = new URL(endpoint, norm(baseUrl)).toString();
32
+ const ctrl = new AbortController();
33
+ const timer = setTimeout(() => ctrl.abort(), timeoutMs);
34
+ try {
35
+ const res = await fetch(url, { method: 'POST', headers: headers(token, body), body, signal: ctrl.signal });
36
+ clearTimeout(timer);
37
+ const text = await res.text();
38
+ if (!res.ok)
39
+ throw new Error(`HTTP ${res.status}: ${text}`);
40
+ return text;
41
+ }
42
+ catch (err) {
43
+ clearTimeout(timer);
44
+ throw err;
45
+ }
46
+ }
47
+ export async function fetchQRCode(baseUrl = DEFAULT_BASE_URL) {
48
+ const res = await fetch(new URL(`ilink/bot/get_bot_qrcode?bot_type=${encodeURIComponent(BOT_TYPE)}`, norm(baseUrl)).toString());
49
+ if (!res.ok)
50
+ throw new Error(`QR fetch failed: ${res.status}`);
51
+ return (await res.json());
52
+ }
53
+ export async function pollQRStatus(baseUrl, qrcode) {
54
+ const ctrl = new AbortController();
55
+ const timer = setTimeout(() => ctrl.abort(), QR_POLL_TIMEOUT_MS);
56
+ try {
57
+ const res = await fetch(new URL(`ilink/bot/get_qrcode_status?qrcode=${encodeURIComponent(qrcode)}`, norm(baseUrl)).toString(), { headers: { 'iLink-App-ClientVersion': '1' }, signal: ctrl.signal });
58
+ clearTimeout(timer);
59
+ if (!res.ok)
60
+ throw new Error(`QR status failed: ${res.status}`);
61
+ return (await res.json());
62
+ }
63
+ catch (err) {
64
+ clearTimeout(timer);
65
+ if (err instanceof Error && err.name === 'AbortError')
66
+ return { status: 'wait' };
67
+ throw err;
68
+ }
69
+ }
70
+ export async function getUpdates(baseUrl, token, buf) {
71
+ try {
72
+ const raw = await apiFetch(baseUrl, 'ilink/bot/getupdates', JSON.stringify({
73
+ get_updates_buf: buf, base_info: { channel_version: CHANNEL_VERSION },
74
+ }), token, LONG_POLL_TIMEOUT_MS);
75
+ return JSON.parse(raw);
76
+ }
77
+ catch (err) {
78
+ if (err instanceof Error && err.name === 'AbortError')
79
+ return { ret: 0, msgs: [], get_updates_buf: buf };
80
+ throw err;
81
+ }
82
+ }
83
+ export async function sendTextMessage(baseUrl, token, to, text, contextToken) {
84
+ await apiFetch(baseUrl, 'ilink/bot/sendmessage', JSON.stringify({
85
+ msg: {
86
+ from_user_id: '', to_user_id: to,
87
+ client_id: `openpaean:${Date.now()}-${crypto.randomBytes(4).toString('hex')}`,
88
+ message_type: MSG_TYPE_BOT, message_state: MSG_STATE_FINISH,
89
+ item_list: [{ type: MSG_ITEM_TEXT, text_item: { text } }],
90
+ context_token: contextToken,
91
+ },
92
+ base_info: { channel_version: CHANNEL_VERSION },
93
+ }), token, SEND_TIMEOUT_MS);
94
+ }
95
+ export function extractText(msg) {
96
+ if (!msg.item_list?.length)
97
+ return '';
98
+ for (const item of msg.item_list) {
99
+ if (item.type === MSG_ITEM_TEXT && item.text_item?.text) {
100
+ const t = item.text_item.text;
101
+ if (item.ref_msg?.title)
102
+ return `[Quote: ${item.ref_msg.title}]\n${t}`;
103
+ return t;
104
+ }
105
+ if (item.type === MSG_ITEM_VOICE && item.voice_item?.text)
106
+ return item.voice_item.text;
107
+ }
108
+ return '';
109
+ }
110
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/wechat/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { AccountData } from './api.js';
2
+ export declare function loadCredentials(): AccountData | null;
3
+ export declare function saveCredentials(data: AccountData): void;
4
+ export declare function removeCredentials(): void;
5
+ export declare function loadSyncBuf(): string;
6
+ export declare function saveSyncBuf(buf: string): void;
7
+ //# sourceMappingURL=credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/wechat/credentials.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAM5C,wBAAgB,eAAe,IAAI,WAAW,GAAG,IAAI,CAKpD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAIvD;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAGxC;AAED,wBAAgB,WAAW,IAAI,MAAM,CAGpC;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE7C"}
@@ -0,0 +1,52 @@
1
+ import fs from 'fs';
2
+ import { join } from 'path';
3
+ import { getConfigDir } from '../utils/config.js';
4
+ function wechatDir() { return join(getConfigDir(), 'wechat'); }
5
+ function credFile() { return join(wechatDir(), 'account.json'); }
6
+ function syncFile() { return join(wechatDir(), 'sync_buf.txt'); }
7
+ export function loadCredentials() {
8
+ try {
9
+ if (!fs.existsSync(credFile()))
10
+ return null;
11
+ return JSON.parse(fs.readFileSync(credFile(), 'utf-8'));
12
+ }
13
+ catch {
14
+ return null;
15
+ }
16
+ }
17
+ export function saveCredentials(data) {
18
+ fs.mkdirSync(wechatDir(), { recursive: true });
19
+ fs.writeFileSync(credFile(), JSON.stringify(data, null, 2), 'utf-8');
20
+ try {
21
+ fs.chmodSync(credFile(), 0o600);
22
+ }
23
+ catch { /* best-effort */ }
24
+ }
25
+ export function removeCredentials() {
26
+ try {
27
+ if (fs.existsSync(credFile()))
28
+ fs.unlinkSync(credFile());
29
+ }
30
+ catch { /* ignore */ }
31
+ try {
32
+ if (fs.existsSync(syncFile()))
33
+ fs.unlinkSync(syncFile());
34
+ }
35
+ catch { /* ignore */ }
36
+ }
37
+ export function loadSyncBuf() {
38
+ try {
39
+ if (fs.existsSync(syncFile()))
40
+ return fs.readFileSync(syncFile(), 'utf-8');
41
+ }
42
+ catch { /* ignore */ }
43
+ return '';
44
+ }
45
+ export function saveSyncBuf(buf) {
46
+ try {
47
+ fs.mkdirSync(wechatDir(), { recursive: true });
48
+ fs.writeFileSync(syncFile(), buf, 'utf-8');
49
+ }
50
+ catch { /* ignore */ }
51
+ }
52
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/wechat/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,SAAS,SAAS,KAAa,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;AACvE,SAAS,QAAQ,KAAa,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;AACzE,SAAS,QAAQ,KAAa,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;AAEzE,MAAM,UAAU,eAAe;IAC3B,IAAI,CAAC;QACD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC;QAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAiB;IAC7C,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACrE,IAAI,CAAC;QAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC7B,IAAI,CAAC;QAAC,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;YAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACxF,IAAI,CAAC;QAAC,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;YAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;AAC5F,CAAC;AAED,MAAM,UAAU,WAAW;IACvB,IAAI,CAAC;QAAC,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;YAAE,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAC1G,OAAO,EAAE,CAAC;AACd,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAW;IACnC,IAAI,CAAC;QAAC,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;AAC9H,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * WeChat Gateway Service
3
+ *
4
+ * Polls WeChat ilink API for incoming messages, routes them through the
5
+ * agent service, and sends replies back via the WeChat API.
6
+ */
7
+ import { EventEmitter } from 'events';
8
+ export interface WechatGatewayConfig {
9
+ debug?: boolean;
10
+ }
11
+ export type WechatGatewayEvent = {
12
+ type: 'started';
13
+ } | {
14
+ type: 'stopped';
15
+ } | {
16
+ type: 'message_received';
17
+ sender: string;
18
+ text: string;
19
+ } | {
20
+ type: 'reply_sent';
21
+ sender: string;
22
+ } | {
23
+ type: 'error';
24
+ error: string;
25
+ };
26
+ export declare class WechatGatewayService extends EventEmitter {
27
+ private config;
28
+ private running;
29
+ private account;
30
+ private mcpState;
31
+ private onMcpToolCall;
32
+ private contextTokenCache;
33
+ constructor(config?: WechatGatewayConfig);
34
+ setMcpState(mcpState: unknown, onMcpToolCall: unknown): void;
35
+ start(): Promise<void>;
36
+ stop(): Promise<void>;
37
+ private pollLoop;
38
+ private processMessage;
39
+ private backoff;
40
+ private log;
41
+ }
42
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/wechat/service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAWtC,MAAM,WAAW,mBAAmB;IAChC,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,MAAM,kBAAkB,GACxB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAMvC,qBAAa,oBAAqB,SAAQ,YAAY;IAClD,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,aAAa,CAAiB;IACtC,OAAO,CAAC,iBAAiB,CAA6B;gBAE1C,MAAM,GAAE,mBAAwB;IAK5C,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,GAAG,IAAI;IAKtD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAYtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAKb,QAAQ;YAmCR,cAAc;YA0Cd,OAAO;IAQrB,OAAO,CAAC,GAAG;CAGd"}
@@ -0,0 +1,148 @@
1
+ /**
2
+ * WeChat Gateway Service
3
+ *
4
+ * Polls WeChat ilink API for incoming messages, routes them through the
5
+ * agent service, and sends replies back via the WeChat API.
6
+ */
7
+ import { EventEmitter } from 'events';
8
+ import { agentService } from '../agent/service.js';
9
+ import { executeSystemTool } from '../mcp/system.js';
10
+ import { getUpdates, sendTextMessage, extractText, MSG_TYPE_USER, } from './api.js';
11
+ import { loadCredentials, loadSyncBuf, saveSyncBuf } from './credentials.js';
12
+ const MAX_CONSECUTIVE_FAILURES = 3;
13
+ const BACKOFF_DELAY_MS = 30_000;
14
+ const RETRY_DELAY_MS = 2_000;
15
+ export class WechatGatewayService extends EventEmitter {
16
+ config;
17
+ running = false;
18
+ account = null;
19
+ mcpState = null;
20
+ onMcpToolCall = null;
21
+ contextTokenCache = new Map();
22
+ constructor(config = {}) {
23
+ super();
24
+ this.config = config;
25
+ }
26
+ setMcpState(mcpState, onMcpToolCall) {
27
+ this.mcpState = mcpState;
28
+ this.onMcpToolCall = onMcpToolCall;
29
+ }
30
+ async start() {
31
+ this.account = loadCredentials();
32
+ if (!this.account) {
33
+ this.emit('event', { type: 'error', error: 'No WeChat credentials. Run `openpaean wechat setup` first.' });
34
+ return;
35
+ }
36
+ this.running = true;
37
+ this.emit('event', { type: 'started' });
38
+ this.log(`WeChat channel active (account: ${this.account.accountId})`);
39
+ await this.pollLoop();
40
+ }
41
+ async stop() {
42
+ this.running = false;
43
+ this.emit('event', { type: 'stopped' });
44
+ }
45
+ async pollLoop() {
46
+ if (!this.account)
47
+ return;
48
+ let buf = loadSyncBuf();
49
+ let failures = 0;
50
+ while (this.running) {
51
+ try {
52
+ const resp = await getUpdates(this.account.baseUrl, this.account.token, buf);
53
+ const isErr = (resp.ret !== undefined && resp.ret !== 0) || (resp.errcode !== undefined && resp.errcode !== 0);
54
+ if (isErr) {
55
+ failures++;
56
+ this.log(`getUpdates error: ret=${resp.ret} errcode=${resp.errcode}`);
57
+ await this.backoff(failures);
58
+ continue;
59
+ }
60
+ failures = 0;
61
+ if (resp.get_updates_buf) {
62
+ buf = resp.get_updates_buf;
63
+ saveSyncBuf(buf);
64
+ }
65
+ for (const msg of resp.msgs ?? []) {
66
+ if (msg.message_type !== MSG_TYPE_USER)
67
+ continue;
68
+ const text = extractText(msg);
69
+ if (!text)
70
+ continue;
71
+ const senderId = msg.from_user_id ?? 'unknown';
72
+ if (msg.context_token)
73
+ this.contextTokenCache.set(senderId, msg.context_token);
74
+ this.emit('event', { type: 'message_received', sender: senderId, text });
75
+ await this.processMessage(senderId, text);
76
+ }
77
+ }
78
+ catch (err) {
79
+ failures++;
80
+ this.log(`Poll error: ${err instanceof Error ? err.message : err}`);
81
+ await this.backoff(failures);
82
+ }
83
+ }
84
+ }
85
+ async processMessage(senderId, text) {
86
+ if (!this.account)
87
+ return;
88
+ let responseText = '';
89
+ const callbacks = {
90
+ onContent: (t, partial) => {
91
+ if (partial)
92
+ responseText += t;
93
+ else
94
+ responseText = t;
95
+ },
96
+ onMcpToolCall: async (callId, serverName, toolName, args) => {
97
+ if (typeof this.onMcpToolCall === 'function') {
98
+ try {
99
+ return await this.onMcpToolCall(callId, serverName, toolName, args);
100
+ }
101
+ catch (e) {
102
+ return { content: [{ type: 'text', text: `Error: ${e instanceof Error ? e.message : e}` }], isError: true };
103
+ }
104
+ }
105
+ if (toolName.startsWith('paean_execute') || toolName.startsWith('paean_check') || toolName.startsWith('paean_kill')) {
106
+ const result = await executeSystemTool(toolName, args, { autonomousMode: true });
107
+ return { content: [{ type: 'text', text: JSON.stringify(result) }], isError: !result.success };
108
+ }
109
+ return { content: [{ type: 'text', text: 'MCP not available' }], isError: true };
110
+ },
111
+ onError: (error) => { this.log(`Agent error: ${error}`); },
112
+ onDone: async () => {
113
+ if (responseText && this.account) {
114
+ const ctx = this.contextTokenCache.get(senderId);
115
+ if (ctx) {
116
+ const maxLen = 2048;
117
+ for (let i = 0; i < responseText.length; i += maxLen) {
118
+ try {
119
+ await sendTextMessage(this.account.baseUrl, this.account.token, senderId, responseText.slice(i, i + maxLen), ctx);
120
+ }
121
+ catch (e) {
122
+ this.log(`Send failed: ${e instanceof Error ? e.message : e}`);
123
+ }
124
+ }
125
+ this.emit('event', { type: 'reply_sent', sender: senderId });
126
+ }
127
+ }
128
+ },
129
+ };
130
+ agentService.streamMessage(text, callbacks, {
131
+ mcpState: this.mcpState,
132
+ cliMode: { enabled: true },
133
+ });
134
+ }
135
+ async backoff(failures) {
136
+ if (failures >= MAX_CONSECUTIVE_FAILURES) {
137
+ await new Promise(r => setTimeout(r, BACKOFF_DELAY_MS));
138
+ }
139
+ else {
140
+ await new Promise(r => setTimeout(r, RETRY_DELAY_MS));
141
+ }
142
+ }
143
+ log(msg) {
144
+ if (this.config.debug)
145
+ console.error(`[WeChat] ${msg}`);
146
+ }
147
+ }
148
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/wechat/service.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openpaean",
3
- "version": "0.6.5",
3
+ "version": "0.7.1",
4
4
  "description": "Open source AI agent CLI with executor framework (a8e, Claude Code), gateway relay, MCP support, and scrolling TUI",
5
5
  "author": "Paean AI <dev@paean.ai>",
6
6
  "license": "MIT",