wechat-bridge-opencode 0.1.6 → 0.1.7

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.
@@ -1,284 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * wechat-acp CLI entry point.
4
- *
5
- * Usage:
6
- * wechat-acp --agent "claude code"
7
- * wechat-acp --agent "gemini" --cwd /path/to/project
8
- * wechat-acp --agent "npx tsx ./agent.ts" --login
9
- * wechat-acp --agent "claude code" --daemon
10
- * wechat-acp stop
11
- * wechat-acp status
12
- */
13
- import fs from "node:fs";
14
- import path from "node:path";
15
- import { spawn } from "node:child_process";
16
- import qrcodeTerminal from "qrcode-terminal";
17
- import { WeChatAcpBridge } from "../src/bridge.js";
18
- import { defaultConfig, listBuiltInAgents, resolveAgentSelection, } from "../src/config.js";
19
- function usage() {
20
- const presets = listBuiltInAgents()
21
- .map(({ id }) => id)
22
- .join(", ");
23
- console.log(`
24
- wechat-acp — Bridge WeChat to any ACP-compatible AI agent
25
-
26
- Usage:
27
- wechat-acp --agent <preset|command> [options]
28
- wechat-acp agents List built-in agent presets
29
- wechat-acp stop Stop a running daemon
30
- wechat-acp status Check daemon status
31
-
32
- Options:
33
- --agent <value> Built-in preset name or raw agent command
34
- Presets: ${presets}
35
- Examples: "copilot", "claude", "npx tsx ./agent.ts"
36
- --cwd <dir> Working directory for agent (default: current dir)
37
- --login Force re-login (new QR code)
38
- --daemon Run in background after login
39
- --config <file> Config file path (JSON)
40
- --idle-timeout <m> Session idle timeout in minutes (default: 1440)
41
- Use 0 to disable idle cleanup
42
- --max-sessions <n> Max concurrent user sessions (default: 10)
43
- --show-thoughts Forward agent thinking to WeChat (default: off)
44
- -v, --verbose Verbose logging
45
- -h, --help Show this help
46
- `);
47
- }
48
- function parseArgs(argv) {
49
- const result = {
50
- forceLogin: false,
51
- daemon: false,
52
- showThoughts: false,
53
- verbose: false,
54
- help: false,
55
- };
56
- const args = argv.slice(2);
57
- let i = 0;
58
- // Check for subcommand
59
- if (args[0] && !args[0].startsWith("-")) {
60
- result.command = args[0];
61
- i = 1;
62
- }
63
- while (i < args.length) {
64
- const arg = args[i];
65
- switch (arg) {
66
- case "--agent":
67
- result.agent = args[++i];
68
- break;
69
- case "--cwd":
70
- result.cwd = args[++i];
71
- break;
72
- case "--login":
73
- result.forceLogin = true;
74
- break;
75
- case "--daemon":
76
- result.daemon = true;
77
- break;
78
- case "--config":
79
- result.configFile = args[++i];
80
- break;
81
- case "--idle-timeout":
82
- result.idleTimeout = parseInt(args[++i], 10);
83
- break;
84
- case "--max-sessions":
85
- result.maxSessions = parseInt(args[++i], 10);
86
- break;
87
- case "--show-thoughts":
88
- result.showThoughts = true;
89
- break;
90
- case "-v":
91
- case "--verbose":
92
- result.verbose = true;
93
- break;
94
- case "-h":
95
- case "--help":
96
- result.help = true;
97
- break;
98
- default:
99
- if (arg?.startsWith("-")) {
100
- console.error(`Unknown option: ${arg}`);
101
- process.exit(1);
102
- }
103
- }
104
- i++;
105
- }
106
- return result;
107
- }
108
- function loadConfigFile(filePath) {
109
- const content = fs.readFileSync(filePath, "utf-8");
110
- return JSON.parse(content);
111
- }
112
- function handleAgents(config) {
113
- console.log("Built-in ACP agent presets:\n");
114
- for (const { id, preset } of listBuiltInAgents(config.agents)) {
115
- const commandLine = [preset.command, ...preset.args].join(" ");
116
- console.log(`${id.padEnd(10)} ${commandLine}`);
117
- if (preset.description) {
118
- console.log(` ${preset.description}`);
119
- }
120
- }
121
- }
122
- function handleStop(config) {
123
- const pidFile = config.daemon.pidFile;
124
- if (!fs.existsSync(pidFile)) {
125
- console.log("No daemon running (no PID file found)");
126
- return;
127
- }
128
- const pid = parseInt(fs.readFileSync(pidFile, "utf-8").trim(), 10);
129
- try {
130
- process.kill(pid, "SIGTERM");
131
- fs.unlinkSync(pidFile);
132
- console.log(`Stopped daemon (PID ${pid})`);
133
- }
134
- catch (err) {
135
- if (err.code === "ESRCH") {
136
- fs.unlinkSync(pidFile);
137
- console.log(`Daemon not running (stale PID ${pid}), cleaned up`);
138
- }
139
- else {
140
- console.error(`Failed to stop daemon: ${String(err)}`);
141
- }
142
- }
143
- }
144
- function handleStatus(config) {
145
- const pidFile = config.daemon.pidFile;
146
- if (!fs.existsSync(pidFile)) {
147
- console.log("Not running");
148
- return;
149
- }
150
- const pid = parseInt(fs.readFileSync(pidFile, "utf-8").trim(), 10);
151
- try {
152
- process.kill(pid, 0); // test if process exists
153
- console.log(`Running (PID ${pid})`);
154
- }
155
- catch {
156
- console.log(`Not running (stale PID ${pid})`);
157
- fs.unlinkSync(pidFile);
158
- }
159
- }
160
- function daemonize(config) {
161
- const logFile = config.daemon.logFile;
162
- const pidFile = config.daemon.pidFile;
163
- fs.mkdirSync(path.dirname(logFile), { recursive: true });
164
- fs.mkdirSync(path.dirname(pidFile), { recursive: true });
165
- const out = fs.openSync(logFile, "a");
166
- const err = fs.openSync(logFile, "a");
167
- // Re-run ourselves with --no-daemon (internal flag) as a detached process
168
- const args = process.argv.slice(1).filter((a) => a !== "--daemon");
169
- const child = spawn(process.execPath, args, {
170
- detached: true,
171
- stdio: ["ignore", out, err],
172
- env: { ...process.env, WECHAT_ACP_DAEMON: "1" },
173
- });
174
- child.unref();
175
- fs.writeFileSync(pidFile, String(child.pid), "utf-8");
176
- console.log(`Daemon started (PID ${child.pid})`);
177
- console.log(`Logs: ${logFile}`);
178
- console.log(`PID file: ${pidFile}`);
179
- process.exit(0);
180
- }
181
- function renderQrInTerminal(url) {
182
- qrcodeTerminal.generate(url, { small: true }, (qr) => {
183
- console.log(qr);
184
- });
185
- }
186
- async function main() {
187
- const args = parseArgs(process.argv);
188
- if (args.help) {
189
- usage();
190
- process.exit(0);
191
- }
192
- const config = defaultConfig();
193
- // Load config file if specified
194
- if (args.configFile) {
195
- const fileConfig = loadConfigFile(args.configFile);
196
- Object.assign(config.wechat, fileConfig.wechat ?? {});
197
- Object.assign(config.agent, fileConfig.agent ?? {});
198
- Object.assign(config.agents, fileConfig.agents ?? {});
199
- Object.assign(config.session, fileConfig.session ?? {});
200
- Object.assign(config.daemon, fileConfig.daemon ?? {});
201
- Object.assign(config.storage, fileConfig.storage ?? {});
202
- }
203
- // Handle subcommands
204
- if (args.command === "agents") {
205
- handleAgents(config);
206
- return;
207
- }
208
- if (args.command === "stop") {
209
- handleStop(config);
210
- return;
211
- }
212
- if (args.command === "status") {
213
- handleStatus(config);
214
- return;
215
- }
216
- const agentSelection = args.agent ?? config.agent.preset;
217
- // Require preset or raw command
218
- if (!agentSelection && !config.agent.command) {
219
- console.error("Error: --agent is required\n");
220
- usage();
221
- process.exit(1);
222
- }
223
- if (agentSelection) {
224
- const resolvedAgent = resolveAgentSelection(agentSelection, config.agents);
225
- config.agent.preset = resolvedAgent.id;
226
- config.agent.command = resolvedAgent.command;
227
- config.agent.args = resolvedAgent.args;
228
- if (resolvedAgent.env) {
229
- config.agent.env = { ...(config.agent.env ?? {}), ...resolvedAgent.env };
230
- }
231
- }
232
- if (args.cwd)
233
- config.agent.cwd = path.resolve(args.cwd);
234
- if (args.idleTimeout !== undefined) {
235
- if (!Number.isFinite(args.idleTimeout) || args.idleTimeout < 0) {
236
- console.error("Error: invalid --idle-timeout value");
237
- console.error('Use a non-negative integer minute value, where "0" means unlimited.');
238
- process.exit(1);
239
- }
240
- config.session.idleTimeoutMs = args.idleTimeout * 60_000;
241
- }
242
- if (args.maxSessions)
243
- config.session.maxConcurrentUsers = args.maxSessions;
244
- if (args.showThoughts)
245
- config.agent.showThoughts = true;
246
- config.daemon.enabled = args.daemon;
247
- // Handle daemon mode
248
- if (args.daemon && !process.env.WECHAT_ACP_DAEMON) {
249
- daemonize(config);
250
- return;
251
- }
252
- // Create and start bridge
253
- const bridge = new WeChatAcpBridge(config, (msg) => {
254
- const ts = new Date().toISOString().substring(11, 19);
255
- console.log(`[${ts}] ${msg}`);
256
- });
257
- // Handle graceful shutdown
258
- const shutdown = async () => {
259
- await bridge.stop();
260
- process.exit(0);
261
- };
262
- process.on("SIGINT", () => void shutdown());
263
- process.on("SIGTERM", () => void shutdown());
264
- try {
265
- await bridge.start({
266
- forceLogin: args.forceLogin,
267
- renderQrUrl: renderQrInTerminal,
268
- });
269
- }
270
- catch (err) {
271
- if (err.message === "aborted") {
272
- // Normal shutdown
273
- }
274
- else {
275
- console.error(`Fatal: ${String(err)}`);
276
- process.exit(1);
277
- }
278
- }
279
- }
280
- main().catch((err) => {
281
- console.error(`Fatal: ${String(err)}`);
282
- process.exit(1);
283
- });
284
- //# sourceMappingURL=wechat-acp.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"wechat-acp.js","sourceRoot":"","sources":["../../bin/wechat-acp.ts"],"names":[],"mappings":"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"}