@okclaw-build/cli 1.0.0-beta.6 → 1.0.0-beta.61

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 (130) hide show
  1. package/dist/bridge/daemon/channel-auth-runtime.d.ts +16 -0
  2. package/dist/bridge/daemon/channel-auth-runtime.js +2 -0
  3. package/dist/bridge/daemon/channel-auth-runtime.js.map +1 -0
  4. package/dist/bridge/daemon/config.d.ts +24 -0
  5. package/dist/bridge/daemon/config.js +96 -0
  6. package/dist/bridge/daemon/config.js.map +1 -0
  7. package/dist/bridge/daemon/daemon.d.ts +7 -0
  8. package/dist/bridge/daemon/daemon.js +32 -0
  9. package/dist/bridge/daemon/daemon.js.map +1 -0
  10. package/dist/bridge/daemon/event-id.d.ts +2 -0
  11. package/dist/bridge/daemon/event-id.js +18 -0
  12. package/dist/bridge/daemon/event-id.js.map +1 -0
  13. package/dist/bridge/daemon/frames.d.ts +81 -0
  14. package/dist/bridge/daemon/frames.js +64 -0
  15. package/dist/bridge/daemon/frames.js.map +1 -0
  16. package/dist/bridge/daemon/openclaw-chat-runtime.d.ts +80 -0
  17. package/dist/bridge/daemon/openclaw-chat-runtime.js +1222 -0
  18. package/dist/bridge/daemon/openclaw-chat-runtime.js.map +1 -0
  19. package/dist/bridge/daemon/openclaw-gateway-client.d.ts +58 -0
  20. package/dist/bridge/daemon/openclaw-gateway-client.js +251 -0
  21. package/dist/bridge/daemon/openclaw-gateway-client.js.map +1 -0
  22. package/dist/bridge/daemon/openclaw-weixin-auth-runtime.d.ts +28 -0
  23. package/dist/bridge/daemon/openclaw-weixin-auth-runtime.js +266 -0
  24. package/dist/bridge/daemon/openclaw-weixin-auth-runtime.js.map +1 -0
  25. package/dist/bridge/daemon/openclaw-weixin-plugin.d.ts +67 -0
  26. package/dist/bridge/daemon/openclaw-weixin-plugin.js +196 -0
  27. package/dist/bridge/daemon/openclaw-weixin-plugin.js.map +1 -0
  28. package/dist/bridge/daemon/relay-client.d.ts +79 -0
  29. package/dist/bridge/daemon/relay-client.js +396 -0
  30. package/dist/bridge/daemon/relay-client.js.map +1 -0
  31. package/dist/bridge/daemon/stub-chat-runtime.d.ts +4 -0
  32. package/dist/bridge/daemon/stub-chat-runtime.js +91 -0
  33. package/dist/bridge/daemon/stub-chat-runtime.js.map +1 -0
  34. package/dist/bridge/service.d.ts +12 -0
  35. package/dist/bridge/service.js +86 -0
  36. package/dist/bridge/service.js.map +1 -0
  37. package/dist/commands/backup.d.ts +16 -0
  38. package/dist/commands/backup.js +99 -0
  39. package/dist/commands/backup.js.map +1 -0
  40. package/dist/commands/bridge.d.ts +7 -0
  41. package/dist/commands/bridge.js +100 -0
  42. package/dist/commands/bridge.js.map +1 -0
  43. package/dist/commands/check.js +22 -6
  44. package/dist/commands/check.js.map +1 -1
  45. package/dist/commands/edit.d.ts +2 -7
  46. package/dist/commands/edit.js +28 -16
  47. package/dist/commands/edit.js.map +1 -1
  48. package/dist/commands/feed.js +48 -16
  49. package/dist/commands/feed.js.map +1 -1
  50. package/dist/commands/install.js +99 -18
  51. package/dist/commands/install.js.map +1 -1
  52. package/dist/commands/migration.d.ts +1 -0
  53. package/dist/commands/migration.js +205 -0
  54. package/dist/commands/migration.js.map +1 -0
  55. package/dist/commands/openclaw-channel-login.d.ts +54 -0
  56. package/dist/commands/openclaw-channel-login.js +334 -0
  57. package/dist/commands/openclaw-channel-login.js.map +1 -0
  58. package/dist/commands/restore.d.ts +16 -0
  59. package/dist/commands/restore.js +94 -0
  60. package/dist/commands/restore.js.map +1 -0
  61. package/dist/commands/service.js +56 -13
  62. package/dist/commands/service.js.map +1 -1
  63. package/dist/commands/show.d.ts +13 -0
  64. package/dist/commands/show.js +70 -0
  65. package/dist/commands/show.js.map +1 -0
  66. package/dist/commands/skill.d.ts +1 -0
  67. package/dist/commands/skill.js +137 -0
  68. package/dist/commands/skill.js.map +1 -0
  69. package/dist/commands/uninstall.d.ts +1 -0
  70. package/dist/commands/uninstall.js +46 -0
  71. package/dist/commands/uninstall.js.map +1 -0
  72. package/dist/index.js +116 -12
  73. package/dist/index.js.map +1 -1
  74. package/dist/installers/base.d.ts +3 -1
  75. package/dist/installers/channel.d.ts +10 -2
  76. package/dist/installers/channel.js +143 -24
  77. package/dist/installers/channel.js.map +1 -1
  78. package/dist/installers/openclaw.d.ts +20 -2
  79. package/dist/installers/openclaw.js +201 -55
  80. package/dist/installers/openclaw.js.map +1 -1
  81. package/dist/installers/openviking-purge.d.ts +52 -0
  82. package/dist/installers/openviking-purge.js +380 -0
  83. package/dist/installers/openviking-purge.js.map +1 -0
  84. package/dist/installers/openviking.js +1 -2
  85. package/dist/installers/openviking.js.map +1 -1
  86. package/dist/installers/skill.d.ts +5 -2
  87. package/dist/installers/skill.js +67 -18
  88. package/dist/installers/skill.js.map +1 -1
  89. package/dist/migration/archive.d.ts +14 -0
  90. package/dist/migration/archive.js +84 -0
  91. package/dist/migration/archive.js.map +1 -0
  92. package/dist/migration/crypto.d.ts +16 -0
  93. package/dist/migration/crypto.js +56 -0
  94. package/dist/migration/crypto.js.map +1 -0
  95. package/dist/migration/manifest.d.ts +39 -0
  96. package/dist/migration/manifest.js +140 -0
  97. package/dist/migration/manifest.js.map +1 -0
  98. package/dist/openclaw-user-data.d.ts +86 -0
  99. package/dist/openclaw-user-data.js +422 -0
  100. package/dist/openclaw-user-data.js.map +1 -0
  101. package/dist/output/mode.d.ts +11 -0
  102. package/dist/output/mode.js +27 -0
  103. package/dist/output/mode.js.map +1 -0
  104. package/dist/output/ndjson.d.ts +57 -0
  105. package/dist/output/ndjson.js +136 -0
  106. package/dist/output/ndjson.js.map +1 -0
  107. package/dist/utils/constants.d.ts +14 -13
  108. package/dist/utils/constants.js +40 -21
  109. package/dist/utils/constants.js.map +1 -1
  110. package/dist/utils/deps.d.ts +34 -3
  111. package/dist/utils/deps.js +62 -100
  112. package/dist/utils/deps.js.map +1 -1
  113. package/dist/utils/install-safety.d.ts +25 -0
  114. package/dist/utils/install-safety.js +97 -0
  115. package/dist/utils/install-safety.js.map +1 -0
  116. package/dist/utils/logger.d.ts +10 -0
  117. package/dist/utils/logger.js +31 -4
  118. package/dist/utils/logger.js.map +1 -1
  119. package/dist/utils/mirror.js +14 -0
  120. package/dist/utils/mirror.js.map +1 -1
  121. package/dist/utils/openclaw-config-cli.d.ts +19 -0
  122. package/dist/utils/openclaw-config-cli.js +81 -0
  123. package/dist/utils/openclaw-config-cli.js.map +1 -0
  124. package/dist/utils/openclaw-daemon.d.ts +58 -0
  125. package/dist/utils/openclaw-daemon.js +154 -0
  126. package/dist/utils/openclaw-daemon.js.map +1 -0
  127. package/dist/utils/shell.d.ts +23 -2
  128. package/dist/utils/shell.js +138 -5
  129. package/dist/utils/shell.js.map +1 -1
  130. package/package.json +6 -4
@@ -0,0 +1,266 @@
1
+ import { bridgeEventId } from './event-id.js';
2
+ import { isAlreadyConnectedMessage, loadInstalledWeixinPlugin, LoginFailure, normalizeFailure, OPENCLAW_WEIXIN_CHANNEL_ID, resolveAccountId, runPluginAdapterSafely, startOpenclawChannel, WECHAT_PLUGIN_MISSING, WECHAT_QR_EXPIRED, WECHAT_QR_START_FAILED, WECHAT_VERIFY_CODE_REQUIRED, } from './openclaw-weixin-plugin.js';
3
+ const DEFAULT_ACCOUNT_ID = 'default';
4
+ const DEFAULT_SESSION_TIMEOUT_SECONDS = 120;
5
+ const QR_VISIBLE_SECONDS = 110;
6
+ const WAIT_SLICE_MS = 10_000;
7
+ const PLUGIN_WAIT_TIMEOUT_GRACE_MS = 2_000;
8
+ export class OpenClawWeixinAuthRuntime {
9
+ config;
10
+ activeJob;
11
+ loadPlugin;
12
+ startChannel;
13
+ timers;
14
+ now;
15
+ constructor(config, options = {}) {
16
+ this.config = config;
17
+ this.loadPlugin = options.loadPlugin ?? loadInstalledWeixinPlugin;
18
+ this.startChannel = options.startChannel ?? startOpenclawChannel;
19
+ this.timers = options.timers ?? {
20
+ setTimeout: (callback, delayMs) => setTimeout(callback, delayMs),
21
+ clearTimeout: (handle) => clearTimeout(handle),
22
+ };
23
+ this.now = options.now ?? (() => Date.now());
24
+ }
25
+ stop() {
26
+ this.activeJob?.abortController.abort();
27
+ this.activeJob = undefined;
28
+ }
29
+ handleChannelAuth(request, sink) {
30
+ if (request.method !== 'channel.auth.start') {
31
+ sink.sendRpcResult(rpcFailure(request.requestId, 'E_WECHAT_AUTH_METHOD_UNSUPPORTED', 'unsupported channel auth method'));
32
+ return;
33
+ }
34
+ const params = request.params;
35
+ const channelType = textParam(params, 'channelType');
36
+ const sessionId = positiveIntegerParam(params, 'sessionId');
37
+ const shrimpId = positiveIntegerParam(params, 'shrimpId');
38
+ const customerId = positiveIntegerParam(params, 'customerId');
39
+ if (channelType !== OPENCLAW_WEIXIN_CHANNEL_ID || !sessionId || !shrimpId || !customerId) {
40
+ sink.sendRpcResult(rpcFailure(request.requestId, 'E_WECHAT_AUTH_INVALID_REQUEST', 'invalid wechat auth request'));
41
+ return;
42
+ }
43
+ if (this.activeJob?.requestId === request.requestId) {
44
+ sink.sendRpcResult(rpcAccepted(request.requestId, sessionId));
45
+ return;
46
+ }
47
+ if (this.activeJob) {
48
+ sink.sendRpcResult(rpcFailure(request.requestId, 'E_WECHAT_AUTH_BUSY', 'wechat auth is already running'));
49
+ return;
50
+ }
51
+ const job = {
52
+ requestId: request.requestId,
53
+ sessionId,
54
+ shrimpId,
55
+ customerId,
56
+ channelType: OPENCLAW_WEIXIN_CHANNEL_ID,
57
+ qrSeq: 0,
58
+ abortController: new AbortController(),
59
+ };
60
+ this.activeJob = job;
61
+ sink.sendRpcResult(rpcAccepted(request.requestId, sessionId));
62
+ void this.runAuthJob(job, request, sink)
63
+ .catch((err) => {
64
+ if (!job.abortController.signal.aborted) {
65
+ this.sendFailed(job, sink, normalizeFailure(err));
66
+ }
67
+ })
68
+ .finally(() => {
69
+ if (this.activeJob?.requestId === job.requestId) {
70
+ this.activeJob = undefined;
71
+ }
72
+ });
73
+ }
74
+ async runAuthJob(job, request, sink) {
75
+ const plugin = await this.loadPlugin(OPENCLAW_WEIXIN_CHANNEL_ID);
76
+ const gateway = plugin.gateway;
77
+ if (!gateway?.loginWithQrStart || !gateway.loginWithQrWait) {
78
+ throw new LoginFailure(WECHAT_PLUGIN_MISSING, 'openclaw-weixin QR login adapter is unavailable');
79
+ }
80
+ const force = request.params.force === true;
81
+ const sessionTimeoutSeconds = positiveIntegerParam(request.params, 'sessionTimeoutSeconds')
82
+ ?? DEFAULT_SESSION_TIMEOUT_SECONDS;
83
+ const deadline = this.now() + sessionTimeoutSeconds * 1000;
84
+ const start = await runPluginAdapterSafely(() => gateway.loginWithQrStart({
85
+ accountId: DEFAULT_ACCOUNT_ID,
86
+ force,
87
+ timeoutMs: 30_000,
88
+ }), {
89
+ timeoutMs: 35_000,
90
+ timeoutError: () => new LoginFailure(WECHAT_QR_START_FAILED, 'wechat qr login start timed out'),
91
+ timers: this.timers,
92
+ });
93
+ if (job.abortController.signal.aborted) {
94
+ return;
95
+ }
96
+ if (start.connected) {
97
+ await this.confirm(plugin, job, sink, DEFAULT_ACCOUNT_ID, true);
98
+ return;
99
+ }
100
+ const qrDataUrl = normalizeText(start.qrDataUrl);
101
+ const sessionKey = normalizeText(start.sessionKey);
102
+ if (!qrDataUrl || !sessionKey) {
103
+ throw new LoginFailure(WECHAT_QR_START_FAILED, start.message || 'wechat qr login did not return qrDataUrl');
104
+ }
105
+ this.sendQrReady(job, sink, qrDataUrl);
106
+ while (this.now() < deadline && !job.abortController.signal.aborted) {
107
+ const waitTimeoutMs = Math.min(WAIT_SLICE_MS, Math.max(1000, deadline - this.now()));
108
+ const wait = await runPluginAdapterSafely(() => gateway.loginWithQrWait({
109
+ accountId: DEFAULT_ACCOUNT_ID,
110
+ timeoutMs: waitTimeoutMs,
111
+ currentQrDataUrl: qrDataUrl,
112
+ sessionKey,
113
+ }), {
114
+ timeoutMs: waitTimeoutMs + PLUGIN_WAIT_TIMEOUT_GRACE_MS,
115
+ timeoutError: () => new LoginFailure(WECHAT_VERIFY_CODE_REQUIRED, 'wechat login requires verify code, but bridge daemon cannot read interactive stdin'),
116
+ timers: this.timers,
117
+ });
118
+ if (job.abortController.signal.aborted) {
119
+ return;
120
+ }
121
+ if (wait.connected || wait.alreadyConnected || isAlreadyConnectedMessage(wait.message)) {
122
+ await this.confirm(plugin, job, sink, wait.accountId || DEFAULT_ACCOUNT_ID, Boolean(wait.alreadyConnected));
123
+ return;
124
+ }
125
+ if (this.now() < deadline) {
126
+ await this.sleep(Math.min(1000, deadline - this.now()), job.abortController.signal);
127
+ }
128
+ }
129
+ if (!job.abortController.signal.aborted) {
130
+ this.sendExpired(job, sink);
131
+ }
132
+ }
133
+ async confirm(plugin, job, sink, rawAccountId, alreadyConnected) {
134
+ const accountId = resolveAccountId(plugin, rawAccountId);
135
+ await this.startChannel(OPENCLAW_WEIXIN_CHANNEL_ID, accountId);
136
+ sink.sendEvent({
137
+ type: 'event',
138
+ eventId: bridgeEventId(job.requestId, 'confirmed'),
139
+ requestId: job.requestId,
140
+ eventType: 'channel.auth.confirmed',
141
+ payload: {
142
+ sessionId: job.sessionId,
143
+ shrimpId: job.shrimpId,
144
+ customerId: job.customerId,
145
+ channelType: job.channelType,
146
+ accountId,
147
+ qrSeq: job.qrSeq,
148
+ alreadyConnected,
149
+ },
150
+ });
151
+ }
152
+ sendQrReady(job, sink, qrUrl) {
153
+ job.qrSeq += 1;
154
+ const expireAt = new Date(this.now() + QR_VISIBLE_SECONDS * 1000).toISOString();
155
+ sink.sendEvent({
156
+ type: 'event',
157
+ eventId: bridgeEventId(job.requestId, `qr-${job.qrSeq}`),
158
+ requestId: job.requestId,
159
+ eventType: 'channel.auth.qr_ready',
160
+ payload: {
161
+ sessionId: job.sessionId,
162
+ shrimpId: job.shrimpId,
163
+ customerId: job.customerId,
164
+ channelType: job.channelType,
165
+ qrSeq: job.qrSeq,
166
+ qrUrl,
167
+ expireInSeconds: QR_VISIBLE_SECONDS,
168
+ expireAt,
169
+ qrExpireAt: expireAt,
170
+ },
171
+ });
172
+ }
173
+ sendExpired(job, sink) {
174
+ sink.sendEvent({
175
+ type: 'event',
176
+ eventId: bridgeEventId(job.requestId, 'expired'),
177
+ requestId: job.requestId,
178
+ eventType: 'channel.auth.expired',
179
+ payload: {
180
+ sessionId: job.sessionId,
181
+ shrimpId: job.shrimpId,
182
+ customerId: job.customerId,
183
+ channelType: job.channelType,
184
+ qrSeq: job.qrSeq,
185
+ errorCode: WECHAT_QR_EXPIRED,
186
+ errorMessage: 'wechat qr login expired',
187
+ },
188
+ });
189
+ }
190
+ sendFailed(job, sink, failure) {
191
+ sink.sendEvent({
192
+ type: 'event',
193
+ eventId: bridgeEventId(job.requestId, `failed-${Math.floor(this.now())}`),
194
+ requestId: job.requestId,
195
+ eventType: 'channel.auth.failed',
196
+ payload: {
197
+ sessionId: job.sessionId,
198
+ shrimpId: job.shrimpId,
199
+ customerId: job.customerId,
200
+ channelType: job.channelType,
201
+ errorCode: failure.code,
202
+ errorMessage: failure.message,
203
+ },
204
+ });
205
+ }
206
+ sleep(delayMs, signal) {
207
+ if (delayMs <= 0 || signal.aborted) {
208
+ return Promise.resolve();
209
+ }
210
+ return new Promise((resolve) => {
211
+ let handle;
212
+ const done = () => {
213
+ signal.removeEventListener('abort', onAbort);
214
+ resolve();
215
+ };
216
+ const onAbort = () => {
217
+ this.timers.clearTimeout(handle);
218
+ done();
219
+ };
220
+ signal.addEventListener('abort', onAbort, { once: true });
221
+ handle = this.timers.setTimeout(done, delayMs);
222
+ });
223
+ }
224
+ }
225
+ function rpcAccepted(requestId, sessionId) {
226
+ return {
227
+ type: 'rpc_result',
228
+ eventId: bridgeEventId(requestId, 'accepted'),
229
+ requestId,
230
+ ok: true,
231
+ result: {
232
+ status: 'accepted',
233
+ channelType: OPENCLAW_WEIXIN_CHANNEL_ID,
234
+ sessionId,
235
+ },
236
+ };
237
+ }
238
+ function rpcFailure(requestId, errorCode, errorMessage) {
239
+ return {
240
+ type: 'rpc_result',
241
+ eventId: bridgeEventId(requestId, 'failed'),
242
+ requestId,
243
+ ok: false,
244
+ errorCode,
245
+ errorMessage,
246
+ };
247
+ }
248
+ function textParam(params, key) {
249
+ const value = params[key];
250
+ return typeof value === 'string' && value.trim() ? value.trim() : undefined;
251
+ }
252
+ function positiveIntegerParam(params, key) {
253
+ const value = params[key];
254
+ if (typeof value === 'number' && Number.isInteger(value) && value > 0) {
255
+ return value;
256
+ }
257
+ if (typeof value === 'string' && value.trim()) {
258
+ const parsed = Number.parseInt(value, 10);
259
+ return Number.isInteger(parsed) && parsed > 0 ? parsed : undefined;
260
+ }
261
+ return undefined;
262
+ }
263
+ function normalizeText(value) {
264
+ return typeof value === 'string' ? value.trim() : '';
265
+ }
266
+ //# sourceMappingURL=openclaw-weixin-auth-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw-weixin-auth-runtime.js","sourceRoot":"","sources":["../../../src/bridge/daemon/openclaw-weixin-auth-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ export declare const OPENCLAW_WEIXIN_CHANNEL_ID = "openclaw-weixin";
2
+ export declare const WECHAT_PLUGIN_MISSING = "WECHAT_PLUGIN_MISSING";
3
+ export declare const WECHAT_QR_START_FAILED = "WECHAT_QR_START_FAILED";
4
+ export declare const WECHAT_QR_EXPIRED = "WECHAT_QR_EXPIRED";
5
+ export declare const WECHAT_LOGIN_FAILED = "WECHAT_LOGIN_FAILED";
6
+ export declare const WECHAT_CHANNEL_START_FAILED = "WECHAT_CHANNEL_START_FAILED";
7
+ export declare const WECHAT_VERIFY_CODE_REQUIRED = "WECHAT_VERIFY_CODE_REQUIRED";
8
+ export type ChannelGateway = {
9
+ loginWithQrStart?: (params: {
10
+ accountId?: string;
11
+ force?: boolean;
12
+ timeoutMs?: number;
13
+ verbose?: boolean;
14
+ }) => Promise<{
15
+ qrDataUrl?: string;
16
+ message?: string;
17
+ sessionKey?: string;
18
+ connected?: boolean;
19
+ }>;
20
+ loginWithQrWait?: (params: {
21
+ accountId?: string;
22
+ timeoutMs?: number;
23
+ currentQrDataUrl?: string;
24
+ sessionKey?: string;
25
+ }) => Promise<{
26
+ connected?: boolean;
27
+ alreadyConnected?: boolean;
28
+ message?: string;
29
+ accountId?: string;
30
+ }>;
31
+ };
32
+ export type ChannelPlugin = {
33
+ id?: string;
34
+ gateway?: ChannelGateway;
35
+ config?: {
36
+ listAccountIds?: (cfg: Record<string, unknown>) => string[];
37
+ resolveAccount?: (cfg: Record<string, unknown>, accountId?: string | null) => unknown;
38
+ };
39
+ };
40
+ type PluginAdapterTimerApi = {
41
+ setTimeout(callback: () => void, delayMs: number): unknown;
42
+ clearTimeout(handle: unknown): void;
43
+ };
44
+ type PluginAdapterRunOptions = {
45
+ timeoutMs?: number;
46
+ timeoutError?: () => Error;
47
+ timers?: PluginAdapterTimerApi;
48
+ };
49
+ export declare function runPluginAdapterSafely<T>(fn: () => Promise<T>, options?: PluginAdapterRunOptions): Promise<T>;
50
+ export declare function loadInstalledWeixinPlugin(channelId: string): Promise<ChannelPlugin>;
51
+ export declare function ensureOpenclawPeerVisible(pluginDir: string): void;
52
+ export declare function resolveOpenclawPackageRoot(): string;
53
+ export declare function resolveOpenclawRootFromNpm(): string | undefined;
54
+ export declare function resolveOpenclawRootFromBinary(): string | undefined;
55
+ export declare function findPackageRoot(startDir: string): string | undefined;
56
+ export declare function startOpenclawChannel(channelId: string, accountId: string): Promise<void>;
57
+ export declare function resolveAccountId(plugin: ChannelPlugin, rawAccountId: string): string;
58
+ export declare function isAlreadyConnectedMessage(message: unknown): boolean;
59
+ export declare function normalizeFailure(err: unknown): {
60
+ code: string;
61
+ message: string;
62
+ };
63
+ export declare class LoginFailure extends Error {
64
+ readonly code: string;
65
+ constructor(code: string, message: string);
66
+ }
67
+ export {};
@@ -0,0 +1,196 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { existsSync, lstatSync, mkdirSync, readFileSync, realpathSync, symlinkSync } from 'node:fs';
3
+ import { dirname, join } from 'node:path';
4
+ import { pathToFileURL } from 'node:url';
5
+ import { OPENCLAW_HOME } from '../../utils/constants.js';
6
+ import { runCommandCapture } from '../../utils/shell.js';
7
+ export const OPENCLAW_WEIXIN_CHANNEL_ID = 'openclaw-weixin';
8
+ export const WECHAT_PLUGIN_MISSING = 'WECHAT_PLUGIN_MISSING';
9
+ export const WECHAT_QR_START_FAILED = 'WECHAT_QR_START_FAILED';
10
+ export const WECHAT_QR_EXPIRED = 'WECHAT_QR_EXPIRED';
11
+ export const WECHAT_LOGIN_FAILED = 'WECHAT_LOGIN_FAILED';
12
+ export const WECHAT_CHANNEL_START_FAILED = 'WECHAT_CHANNEL_START_FAILED';
13
+ export const WECHAT_VERIFY_CODE_REQUIRED = 'WECHAT_VERIFY_CODE_REQUIRED';
14
+ let pluginQueue = Promise.resolve();
15
+ export function runPluginAdapterSafely(fn, options = {}) {
16
+ const run = pluginQueue.then(() => runWithOptionalTimeout(fn, options), () => runWithOptionalTimeout(fn, options));
17
+ pluginQueue = run.then(() => undefined, () => undefined);
18
+ return run;
19
+ }
20
+ function runWithOptionalTimeout(fn, options) {
21
+ const timeoutMs = options.timeoutMs;
22
+ if (!timeoutMs || timeoutMs <= 0) {
23
+ return fn();
24
+ }
25
+ const timers = options.timers ?? {
26
+ setTimeout: (callback, delayMs) => setTimeout(callback, delayMs),
27
+ clearTimeout: (handle) => clearTimeout(handle),
28
+ };
29
+ let handle;
30
+ const timeout = new Promise((_resolve, reject) => {
31
+ handle = timers.setTimeout(() => {
32
+ reject(options.timeoutError?.() ?? new LoginFailure(WECHAT_LOGIN_FAILED, 'wechat plugin adapter timed out'));
33
+ }, timeoutMs);
34
+ });
35
+ return Promise.race([
36
+ Promise.resolve().then(fn).finally(() => timers.clearTimeout(handle)),
37
+ timeout,
38
+ ]);
39
+ }
40
+ export async function loadInstalledWeixinPlugin(channelId) {
41
+ const pluginDir = join(OPENCLAW_HOME, 'extensions', channelId);
42
+ const entry = join(pluginDir, 'dist', 'index.js');
43
+ if (!existsSync(entry)) {
44
+ throw new LoginFailure(WECHAT_PLUGIN_MISSING, `${entry} not found`);
45
+ }
46
+ ensureOpenclawPeerVisible(pluginDir);
47
+ const module = await import(pathToFileURL(entry).href);
48
+ const pluginEntry = module.default;
49
+ if (!pluginEntry || typeof pluginEntry.register !== 'function') {
50
+ throw new LoginFailure(WECHAT_PLUGIN_MISSING, 'openclaw-weixin plugin entry is invalid');
51
+ }
52
+ let captured;
53
+ pluginEntry.register({
54
+ runtime: { version: 'unknown' },
55
+ registerChannel(input) {
56
+ captured = input.plugin;
57
+ },
58
+ });
59
+ if (!captured || captured.id !== channelId) {
60
+ throw new LoginFailure(WECHAT_PLUGIN_MISSING, 'openclaw-weixin channel plugin was not registered');
61
+ }
62
+ return captured;
63
+ }
64
+ export function ensureOpenclawPeerVisible(pluginDir) {
65
+ const nodeModulesDir = join(pluginDir, 'node_modules');
66
+ const linkPath = join(nodeModulesDir, 'openclaw');
67
+ if (existsSync(linkPath)) {
68
+ return;
69
+ }
70
+ const openclawRoot = resolveOpenclawPackageRoot();
71
+ mkdirSync(nodeModulesDir, { recursive: true });
72
+ try {
73
+ symlinkSync(openclawRoot, linkPath, 'dir');
74
+ }
75
+ catch (err) {
76
+ if (!existsSync(linkPath) || !lstatSync(linkPath).isSymbolicLink()) {
77
+ throw err;
78
+ }
79
+ }
80
+ }
81
+ export function resolveOpenclawPackageRoot() {
82
+ const candidates = [
83
+ resolveOpenclawRootFromNpm(),
84
+ resolveOpenclawRootFromBinary(),
85
+ ].filter((value) => Boolean(value));
86
+ const found = candidates.find((candidate) => existsSync(candidate));
87
+ if (found) {
88
+ return found;
89
+ }
90
+ throw new LoginFailure(WECHAT_PLUGIN_MISSING, 'openclaw package root is not resolvable in current node environment');
91
+ }
92
+ export function resolveOpenclawRootFromNpm() {
93
+ try {
94
+ const globalRoot = execFileSync('npm', ['root', '-g'], { encoding: 'utf8' }).trim();
95
+ return globalRoot ? join(globalRoot, 'openclaw') : undefined;
96
+ }
97
+ catch {
98
+ return undefined;
99
+ }
100
+ }
101
+ export function resolveOpenclawRootFromBinary() {
102
+ try {
103
+ const bin = execFileSync('sh', ['-lc', 'command -v openclaw'], { encoding: 'utf8' }).trim();
104
+ if (!bin)
105
+ return undefined;
106
+ return findPackageRoot(dirname(realpathSync(bin)));
107
+ }
108
+ catch {
109
+ return undefined;
110
+ }
111
+ }
112
+ export function findPackageRoot(startDir) {
113
+ let current = startDir;
114
+ for (let i = 0; i < 10; i++) {
115
+ const pkg = join(current, 'package.json');
116
+ if (existsSync(pkg)) {
117
+ try {
118
+ const parsed = JSON.parse(readFileSync(pkg, 'utf8'));
119
+ if (parsed.name === 'openclaw') {
120
+ return current;
121
+ }
122
+ }
123
+ catch {
124
+ return undefined;
125
+ }
126
+ }
127
+ const parent = dirname(current);
128
+ if (parent === current)
129
+ return undefined;
130
+ current = parent;
131
+ }
132
+ return undefined;
133
+ }
134
+ export async function startOpenclawChannel(channelId, accountId) {
135
+ const result = await runCommandCapture('openclaw', [
136
+ 'gateway',
137
+ 'call',
138
+ 'channels.start',
139
+ '--params',
140
+ JSON.stringify({ channel: channelId, accountId }),
141
+ '--json',
142
+ '--timeout',
143
+ '30000',
144
+ ]);
145
+ if (result.code !== 0) {
146
+ throw new LoginFailure(WECHAT_CHANNEL_START_FAILED, 'openclaw channels.start failed');
147
+ }
148
+ }
149
+ export function resolveAccountId(plugin, rawAccountId) {
150
+ if (rawAccountId === 'default') {
151
+ try {
152
+ const accountIds = plugin.config?.listAccountIds?.({ channels: {} }) ?? [];
153
+ if (accountIds.length === 1 && accountIds[0]?.trim()) {
154
+ return accountIds[0].trim();
155
+ }
156
+ }
157
+ catch {
158
+ // Continue with resolveAccount fallback.
159
+ }
160
+ }
161
+ try {
162
+ const account = plugin.config?.resolveAccount?.({ channels: {} }, rawAccountId);
163
+ const normalized = account?.accountId;
164
+ if (typeof normalized === 'string' && normalized.trim()) {
165
+ return normalized.trim();
166
+ }
167
+ }
168
+ catch {
169
+ // Fall back to the raw value; the plugin already saved credentials before this point.
170
+ }
171
+ return rawAccountId;
172
+ }
173
+ export function isAlreadyConnectedMessage(message) {
174
+ if (typeof message !== 'string') {
175
+ return false;
176
+ }
177
+ const text = message.toLowerCase();
178
+ return text.includes('already') || message.includes('无需重复连接') || message.includes('已连接过');
179
+ }
180
+ export function normalizeFailure(err) {
181
+ if (err instanceof LoginFailure) {
182
+ return { code: err.code, message: err.message };
183
+ }
184
+ return {
185
+ code: WECHAT_LOGIN_FAILED,
186
+ message: err instanceof Error ? err.message : String(err),
187
+ };
188
+ }
189
+ export class LoginFailure extends Error {
190
+ code;
191
+ constructor(code, message) {
192
+ super(message);
193
+ this.code = code;
194
+ }
195
+ }
196
+ //# sourceMappingURL=openclaw-weixin-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw-weixin-plugin.js","sourceRoot":"","sources":["../../../src/bridge/daemon/openclaw-weixin-plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ import type { BridgeConfig } from './config.js';
2
+ import type { BridgeChannelAuthRuntime } from './channel-auth-runtime.js';
3
+ import type { BridgeChatRuntime } from './openclaw-chat-runtime.js';
4
+ export interface BridgeWebSocket {
5
+ send(data: string): void;
6
+ close(code?: number, reason?: string): void;
7
+ addEventListener(type: string, listener: (event: unknown) => void): void;
8
+ }
9
+ export type WebSocketFactory = (url: string) => BridgeWebSocket;
10
+ export interface TimerApi {
11
+ setInterval(callback: () => void, delayMs: number): unknown;
12
+ clearInterval(handle: unknown): void;
13
+ setTimeout(callback: () => void, delayMs: number): unknown;
14
+ clearTimeout(handle: unknown): void;
15
+ }
16
+ interface BridgeRelayClientOptions {
17
+ webSocketFactory?: WebSocketFactory;
18
+ nonce?: () => string;
19
+ now?: () => Date;
20
+ installedVersion?: string;
21
+ timers?: TimerApi;
22
+ chatRuntime?: BridgeChatRuntime;
23
+ channelAuthRuntime?: BridgeChannelAuthRuntime;
24
+ maxPendingOutboundFrames?: number;
25
+ maxPendingOutboundResends?: number;
26
+ random?: () => number;
27
+ }
28
+ export declare class BridgeRelayClient {
29
+ private readonly config;
30
+ private socket;
31
+ private heartbeatHandle;
32
+ private heartbeatAckPending;
33
+ private heartbeatAckTimeoutHandle;
34
+ private heartbeatIntervalSeconds;
35
+ private reconnectHandle;
36
+ private reconnectAttempts;
37
+ private stopped;
38
+ private readonly webSocketFactory;
39
+ private readonly nonce;
40
+ private readonly now;
41
+ private readonly installedVersion;
42
+ private readonly timers;
43
+ private readonly chatRuntime;
44
+ private readonly channelAuthRuntime;
45
+ private readonly maxPendingOutboundFrames;
46
+ private readonly maxPendingOutboundResends;
47
+ private readonly random;
48
+ private readonly pendingOutbound;
49
+ private readonly pendingOpsRequests;
50
+ constructor(config: BridgeConfig, options?: BridgeRelayClientOptions);
51
+ connect(): BridgeWebSocket;
52
+ private openSocket;
53
+ close(): void;
54
+ private handleMessage;
55
+ private handleRpc;
56
+ private handleChannelAuthRpc;
57
+ private sendRpcFailure;
58
+ private sendOpsRequest;
59
+ private handleOpsResponse;
60
+ private rejectPendingOpsRequests;
61
+ private scheduleHeartbeat;
62
+ /**
63
+ * 半开检测:仅当当前没有未确认的 heartbeat 时才启动一个 pong 超时计时器,
64
+ * 后续心跳不刷新这个 deadline——否则周期心跳会把超时一直顶到永不触发。
65
+ * 收到 heartbeat_ack 才清除;超时即判定 relay 半开,主动断开触发重连。
66
+ */
67
+ private armHeartbeatAckTimeout;
68
+ private clearHeartbeatAckTimeout;
69
+ private clearHeartbeat;
70
+ private scheduleReconnect;
71
+ private clearReconnect;
72
+ private buildHelloFrame;
73
+ private buildHeartbeatFrame;
74
+ private sendOutbound;
75
+ private resendPendingOutbound;
76
+ private ensurePendingOutboundCapacity;
77
+ private sendJson;
78
+ }
79
+ export {};