clawcenter 0.1.0

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 (122) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +180 -0
  3. package/bin/clawcenter.js +2 -0
  4. package/dist/center/commands/system-commands.d.ts +15 -0
  5. package/dist/center/commands/system-commands.d.ts.map +1 -0
  6. package/dist/center/commands/system-commands.js +363 -0
  7. package/dist/center/commands/system-commands.js.map +1 -0
  8. package/dist/center/dispatcher.d.ts +32 -0
  9. package/dist/center/dispatcher.d.ts.map +1 -0
  10. package/dist/center/dispatcher.js +264 -0
  11. package/dist/center/dispatcher.js.map +1 -0
  12. package/dist/center/hub.d.ts +16 -0
  13. package/dist/center/hub.d.ts.map +1 -0
  14. package/dist/center/hub.js +214 -0
  15. package/dist/center/hub.js.map +1 -0
  16. package/dist/center/router/engine.d.ts +35 -0
  17. package/dist/center/router/engine.d.ts.map +1 -0
  18. package/dist/center/router/engine.js +106 -0
  19. package/dist/center/router/engine.js.map +1 -0
  20. package/dist/center/router/hashtag.d.ts +15 -0
  21. package/dist/center/router/hashtag.d.ts.map +1 -0
  22. package/dist/center/router/hashtag.js +21 -0
  23. package/dist/center/router/hashtag.js.map +1 -0
  24. package/dist/center/wechat/api.d.ts +131 -0
  25. package/dist/center/wechat/api.d.ts.map +1 -0
  26. package/dist/center/wechat/api.js +205 -0
  27. package/dist/center/wechat/api.js.map +1 -0
  28. package/dist/center/wechat/cdn.d.ts +13 -0
  29. package/dist/center/wechat/cdn.d.ts.map +1 -0
  30. package/dist/center/wechat/cdn.js +100 -0
  31. package/dist/center/wechat/cdn.js.map +1 -0
  32. package/dist/center/wechat/connector.d.ts +51 -0
  33. package/dist/center/wechat/connector.d.ts.map +1 -0
  34. package/dist/center/wechat/connector.js +253 -0
  35. package/dist/center/wechat/connector.js.map +1 -0
  36. package/dist/center/wechat/login.d.ts +13 -0
  37. package/dist/center/wechat/login.d.ts.map +1 -0
  38. package/dist/center/wechat/login.js +81 -0
  39. package/dist/center/wechat/login.js.map +1 -0
  40. package/dist/core/agents/adapter.d.ts +43 -0
  41. package/dist/core/agents/adapter.d.ts.map +1 -0
  42. package/dist/core/agents/adapter.js +2 -0
  43. package/dist/core/agents/adapter.js.map +1 -0
  44. package/dist/core/agents/claude-code.d.ts +19 -0
  45. package/dist/core/agents/claude-code.d.ts.map +1 -0
  46. package/dist/core/agents/claude-code.js +138 -0
  47. package/dist/core/agents/claude-code.js.map +1 -0
  48. package/dist/core/agents/claude-sdk.d.ts +17 -0
  49. package/dist/core/agents/claude-sdk.d.ts.map +1 -0
  50. package/dist/core/agents/claude-sdk.js +85 -0
  51. package/dist/core/agents/claude-sdk.js.map +1 -0
  52. package/dist/core/agents/codebuddy.d.ts +19 -0
  53. package/dist/core/agents/codebuddy.d.ts.map +1 -0
  54. package/dist/core/agents/codebuddy.js +352 -0
  55. package/dist/core/agents/codebuddy.js.map +1 -0
  56. package/dist/core/agents/codex.d.ts +18 -0
  57. package/dist/core/agents/codex.d.ts.map +1 -0
  58. package/dist/core/agents/codex.js +300 -0
  59. package/dist/core/agents/codex.js.map +1 -0
  60. package/dist/core/agents/cursor-agent.d.ts +19 -0
  61. package/dist/core/agents/cursor-agent.d.ts.map +1 -0
  62. package/dist/core/agents/cursor-agent.js +253 -0
  63. package/dist/core/agents/cursor-agent.js.map +1 -0
  64. package/dist/core/agents/http-agent.d.ts +17 -0
  65. package/dist/core/agents/http-agent.d.ts.map +1 -0
  66. package/dist/core/agents/http-agent.js +91 -0
  67. package/dist/core/agents/http-agent.js.map +1 -0
  68. package/dist/core/agents/manager.d.ts +45 -0
  69. package/dist/core/agents/manager.d.ts.map +1 -0
  70. package/dist/core/agents/manager.js +245 -0
  71. package/dist/core/agents/manager.js.map +1 -0
  72. package/dist/core/agents/openclaw.d.ts +19 -0
  73. package/dist/core/agents/openclaw.d.ts.map +1 -0
  74. package/dist/core/agents/openclaw.js +173 -0
  75. package/dist/core/agents/openclaw.js.map +1 -0
  76. package/dist/core/agents/opencode.d.ts +19 -0
  77. package/dist/core/agents/opencode.d.ts.map +1 -0
  78. package/dist/core/agents/opencode.js +175 -0
  79. package/dist/core/agents/opencode.js.map +1 -0
  80. package/dist/core/agents/worker-agent.d.ts +24 -0
  81. package/dist/core/agents/worker-agent.d.ts.map +1 -0
  82. package/dist/core/agents/worker-agent.js +40 -0
  83. package/dist/core/agents/worker-agent.js.map +1 -0
  84. package/dist/core/api/routes.d.ts +6 -0
  85. package/dist/core/api/routes.d.ts.map +1 -0
  86. package/dist/core/api/routes.js +238 -0
  87. package/dist/core/api/routes.js.map +1 -0
  88. package/dist/core/db/schema.d.ts +3 -0
  89. package/dist/core/db/schema.d.ts.map +1 -0
  90. package/dist/core/db/schema.js +97 -0
  91. package/dist/core/db/schema.js.map +1 -0
  92. package/dist/core/db/store.d.ts +167 -0
  93. package/dist/core/db/store.d.ts.map +1 -0
  94. package/dist/core/db/store.js +469 -0
  95. package/dist/core/db/store.js.map +1 -0
  96. package/dist/index.d.ts +2 -0
  97. package/dist/index.d.ts.map +1 -0
  98. package/dist/index.js +70 -0
  99. package/dist/index.js.map +1 -0
  100. package/dist/logger.d.ts +6 -0
  101. package/dist/logger.d.ts.map +1 -0
  102. package/dist/logger.js +22 -0
  103. package/dist/logger.js.map +1 -0
  104. package/dist/server.d.ts +28 -0
  105. package/dist/server.d.ts.map +1 -0
  106. package/dist/server.js +158 -0
  107. package/dist/server.js.map +1 -0
  108. package/dist/tui/App.d.ts +78 -0
  109. package/dist/tui/App.d.ts.map +1 -0
  110. package/dist/tui/App.js +106 -0
  111. package/dist/tui/App.js.map +1 -0
  112. package/dist/tui/index.d.ts +7 -0
  113. package/dist/tui/index.d.ts.map +1 -0
  114. package/dist/tui/index.js +12 -0
  115. package/dist/tui/index.js.map +1 -0
  116. package/dist/worker/client.d.ts +28 -0
  117. package/dist/worker/client.d.ts.map +1 -0
  118. package/dist/worker/client.js +142 -0
  119. package/dist/worker/client.js.map +1 -0
  120. package/package.json +74 -0
  121. package/web/dist/assets/index-Bvq27OV5.js +60 -0
  122. package/web/dist/index.html +63 -0
@@ -0,0 +1,51 @@
1
+ import { EventEmitter } from "node:events";
2
+ import { type WeixinMessage } from "./api.js";
3
+ import type { CDNMedia } from "./api.js";
4
+ import { type LoginCallbacks, type LoginResult } from "./login.js";
5
+ import type { Store } from "../../core/db/store.js";
6
+ export interface InboundMessage {
7
+ wechatAccountId: string;
8
+ messageId?: string;
9
+ fromUserId: string;
10
+ text: string;
11
+ contextToken?: string;
12
+ refMessageId?: string;
13
+ refMessageText?: string;
14
+ mediaItems: MediaItemInfo[];
15
+ rawMessage: WeixinMessage;
16
+ receivedAt: number;
17
+ }
18
+ export interface MediaItemInfo {
19
+ type: "image" | "voice" | "file" | "video";
20
+ media?: CDNMedia;
21
+ fileName?: string;
22
+ voiceText?: string;
23
+ }
24
+ export declare class WechatConnector extends EventEmitter {
25
+ private store;
26
+ private accountId;
27
+ private running;
28
+ private abortController;
29
+ private pausedUntil;
30
+ private contextTokenCache;
31
+ private typingTicketCache;
32
+ constructor(store: Store, accountId: string);
33
+ get isRunning(): boolean;
34
+ login(callbacks?: LoginCallbacks): Promise<LoginResult>;
35
+ start(): Promise<void>;
36
+ stop(): void;
37
+ sendText(toUserId: string, text: string): Promise<{
38
+ clientId: string;
39
+ serverMsgId?: string;
40
+ }>;
41
+ sendMediaFile(toUserId: string, filePath: string, text?: string): Promise<{
42
+ clientId: string;
43
+ serverMsgId?: string;
44
+ }>;
45
+ sendTypingIndicator(toUserId: string, typing: boolean): Promise<void>;
46
+ downloadMedia(media: CDNMedia, cdnBaseUrl?: string): Promise<Buffer>;
47
+ setContextToken(userId: string, token: string): void;
48
+ private pollLoop;
49
+ private extractMediaItems;
50
+ }
51
+ //# sourceMappingURL=connector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector.d.ts","sourceRoot":"","sources":["../../../src/center/wechat/connector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAAE,QAAQ,EAAe,MAAM,UAAU,CAAC;AACtD,OAAO,EAAe,KAAK,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAChF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AASpD,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,UAAU,EAAE,aAAa,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;IAC3C,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,iBAAiB,CAA6B;gBAE1C,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM;IAM3C,IAAI,SAAS,IAAI,OAAO,CAEvB;IAEK,KAAK,CAAC,SAAS,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC;IAiBvD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA0B5B,IAAI,IAAI,IAAI;IAKN,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAc7F,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAuBrH,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBrE,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK1E,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;YAItC,QAAQ;IAwGtB,OAAO,CAAC,iBAAiB;CAe1B"}
@@ -0,0 +1,253 @@
1
+ import { EventEmitter } from "node:events";
2
+ import { getUpdates, sendMessage, sendTyping, getConfig, extractTextFromMessage, getRefMessageId, getRefMessageText, sendImageMessage, } from "./api.js";
3
+ import { encryptAndUploadMedia, downloadAndDecryptMedia } from "./cdn.js";
4
+ import { loginWithQr } from "./login.js";
5
+ import { debug } from "../../logger.js";
6
+ const SESSION_EXPIRED_CODE = -14;
7
+ const MAX_CONSECUTIVE_FAILURES = 3;
8
+ const BACKOFF_DELAY_MS = 30_000;
9
+ const RETRY_DELAY_MS = 2_000;
10
+ const SESSION_PAUSE_MS = 60 * 60_000;
11
+ export class WechatConnector extends EventEmitter {
12
+ store;
13
+ accountId;
14
+ running = false;
15
+ abortController = null;
16
+ pausedUntil = 0;
17
+ contextTokenCache = new Map();
18
+ typingTicketCache = new Map();
19
+ constructor(store, accountId) {
20
+ super();
21
+ this.store = store;
22
+ this.accountId = accountId;
23
+ }
24
+ get isRunning() {
25
+ return this.running;
26
+ }
27
+ async login(callbacks) {
28
+ const account = this.store.getWechatAccount(this.accountId);
29
+ if (!account)
30
+ throw new Error(`WeChat account "${this.accountId}" not found`);
31
+ debug("Connector", `Starting login for "${this.accountId}", base_url=${account.base_url}`);
32
+ const result = await loginWithQr(account.base_url, callbacks);
33
+ this.store.updateWechatAccount(this.accountId, {
34
+ token: result.token,
35
+ base_url: result.baseUrl,
36
+ account_id: result.accountId,
37
+ user_id: result.userId,
38
+ status: "connected",
39
+ get_updates_buf: "",
40
+ });
41
+ return result;
42
+ }
43
+ async start() {
44
+ if (this.running)
45
+ return;
46
+ const account = this.store.getWechatAccount(this.accountId);
47
+ if (!account?.token) {
48
+ throw new Error(`WeChat account "${this.accountId}" not logged in`);
49
+ }
50
+ this.running = true;
51
+ this.abortController = new AbortController();
52
+ this.store.updateWechatAccount(this.accountId, { status: "connected" });
53
+ this.emit("started", this.accountId);
54
+ this.pollLoop(account.base_url, account.token, account.cdn_base_url, account.get_updates_buf)
55
+ .catch((err) => {
56
+ if (!this.abortController?.signal.aborted) {
57
+ console.error(`[WechatConnector:${this.accountId}] Poll loop error:`, err);
58
+ this.emit("error", err);
59
+ }
60
+ })
61
+ .finally(() => {
62
+ this.running = false;
63
+ this.store.updateWechatAccount(this.accountId, { status: "disconnected" });
64
+ this.emit("stopped", this.accountId);
65
+ });
66
+ }
67
+ stop() {
68
+ this.running = false;
69
+ this.abortController?.abort();
70
+ }
71
+ async sendText(toUserId, text) {
72
+ const account = this.store.getWechatAccount(this.accountId);
73
+ if (!account?.token)
74
+ throw new Error("Not connected");
75
+ const contextToken = this.contextTokenCache.get(toUserId);
76
+ return sendMessage({
77
+ baseUrl: account.base_url,
78
+ token: account.token,
79
+ to: toUserId,
80
+ text,
81
+ contextToken,
82
+ });
83
+ }
84
+ async sendMediaFile(toUserId, filePath, text) {
85
+ const account = this.store.getWechatAccount(this.accountId);
86
+ if (!account?.token)
87
+ throw new Error("Not connected");
88
+ const uploaded = await encryptAndUploadMedia(filePath, {
89
+ baseUrl: account.base_url,
90
+ token: account.token,
91
+ cdnBaseUrl: account.cdn_base_url,
92
+ });
93
+ const contextToken = this.contextTokenCache.get(toUserId);
94
+ return sendImageMessage({
95
+ baseUrl: account.base_url,
96
+ token: account.token,
97
+ to: toUserId,
98
+ text,
99
+ contextToken,
100
+ imageAesKey: uploaded.aesKey,
101
+ encryptQueryParam: uploaded.encryptQueryParam,
102
+ fileSize: uploaded.fileSize,
103
+ });
104
+ }
105
+ async sendTypingIndicator(toUserId, typing) {
106
+ const account = this.store.getWechatAccount(this.accountId);
107
+ if (!account?.token)
108
+ return;
109
+ const ticket = this.typingTicketCache.get(toUserId);
110
+ if (!ticket)
111
+ return;
112
+ try {
113
+ await sendTyping({
114
+ baseUrl: account.base_url,
115
+ token: account.token,
116
+ userId: toUserId,
117
+ typingTicket: ticket,
118
+ status: typing ? 1 : 2,
119
+ });
120
+ }
121
+ catch {
122
+ // Typing indicator failures are non-critical
123
+ }
124
+ }
125
+ async downloadMedia(media, cdnBaseUrl) {
126
+ const account = this.store.getWechatAccount(this.accountId);
127
+ return downloadAndDecryptMedia(media, cdnBaseUrl ?? account?.cdn_base_url);
128
+ }
129
+ setContextToken(userId, token) {
130
+ this.contextTokenCache.set(userId, token);
131
+ }
132
+ async pollLoop(baseUrl, token, cdnBaseUrl, initialBuf) {
133
+ let buf = initialBuf;
134
+ let consecutiveFailures = 0;
135
+ const signal = this.abortController.signal;
136
+ while (this.running && !signal.aborted) {
137
+ // Session pause check
138
+ if (Date.now() < this.pausedUntil) {
139
+ await sleep(Math.min(60_000, this.pausedUntil - Date.now()), signal);
140
+ continue;
141
+ }
142
+ try {
143
+ const resp = await getUpdates({ baseUrl, token, get_updates_buf: buf, timeoutMs: 38_000 });
144
+ debug("Connector", `[${this.accountId}] getUpdates: ret=${resp.ret}, errcode=${resp.errcode}, msgs=${resp.msgs?.length ?? 0}, buf=${!!resp.get_updates_buf}`);
145
+ // API error handling
146
+ const isError = (resp.ret !== undefined && resp.ret !== 0) || (resp.errcode !== undefined && resp.errcode !== 0);
147
+ if (isError) {
148
+ if (resp.errcode === SESSION_EXPIRED_CODE || resp.ret === SESSION_EXPIRED_CODE) {
149
+ console.error(`[WechatConnector:${this.accountId}] Session expired (ret=${resp.ret}, errcode=${resp.errcode}), pausing for 1 hour`);
150
+ this.pausedUntil = Date.now() + SESSION_PAUSE_MS;
151
+ this.emit("session_expired", this.accountId);
152
+ consecutiveFailures = 0;
153
+ continue;
154
+ }
155
+ consecutiveFailures++;
156
+ console.error(`[WechatConnector:${this.accountId}] getUpdates error: ret=${resp.ret} errcode=${resp.errcode}`);
157
+ if (consecutiveFailures >= MAX_CONSECUTIVE_FAILURES) {
158
+ consecutiveFailures = 0;
159
+ await sleep(BACKOFF_DELAY_MS, signal);
160
+ }
161
+ else {
162
+ await sleep(RETRY_DELAY_MS, signal);
163
+ }
164
+ continue;
165
+ }
166
+ consecutiveFailures = 0;
167
+ if (resp.get_updates_buf) {
168
+ buf = resp.get_updates_buf;
169
+ this.store.updateWechatAccount(this.accountId, { get_updates_buf: buf });
170
+ }
171
+ for (const msg of resp.msgs ?? []) {
172
+ if (msg.context_token && msg.from_user_id) {
173
+ this.contextTokenCache.set(msg.from_user_id, msg.context_token);
174
+ }
175
+ // Fetch typing ticket for this user
176
+ if (msg.from_user_id && !this.typingTicketCache.has(msg.from_user_id)) {
177
+ try {
178
+ const cfg = await getConfig({
179
+ baseUrl, token,
180
+ userId: msg.from_user_id,
181
+ contextToken: msg.context_token,
182
+ });
183
+ if (cfg.typing_ticket) {
184
+ this.typingTicketCache.set(msg.from_user_id, cfg.typing_ticket);
185
+ }
186
+ }
187
+ catch { /* non-critical */ }
188
+ }
189
+ const refMessageId = getRefMessageId(msg) ?? undefined;
190
+ const refMessageText = getRefMessageText(msg) ?? undefined;
191
+ if (refMessageId || refMessageText) {
192
+ debug("Connector", `[${this.accountId}] ref_msg: id=${refMessageId ?? "none"}, text=${refMessageText?.slice(0, 80) ?? "none"}`);
193
+ }
194
+ const inbound = {
195
+ wechatAccountId: this.accountId,
196
+ messageId: msg.message_id,
197
+ fromUserId: msg.from_user_id ?? "",
198
+ text: extractTextFromMessage(msg),
199
+ contextToken: msg.context_token,
200
+ refMessageId,
201
+ refMessageText,
202
+ mediaItems: this.extractMediaItems(msg),
203
+ rawMessage: msg,
204
+ receivedAt: Date.now(),
205
+ };
206
+ this.emit("message", inbound);
207
+ }
208
+ }
209
+ catch (err) {
210
+ if (signal.aborted)
211
+ return;
212
+ consecutiveFailures++;
213
+ console.error(`[WechatConnector:${this.accountId}] Poll error:`, err.message);
214
+ if (consecutiveFailures >= MAX_CONSECUTIVE_FAILURES) {
215
+ consecutiveFailures = 0;
216
+ await sleep(BACKOFF_DELAY_MS, signal);
217
+ }
218
+ else {
219
+ await sleep(RETRY_DELAY_MS, signal);
220
+ }
221
+ }
222
+ }
223
+ }
224
+ extractMediaItems(msg) {
225
+ const items = [];
226
+ for (const item of msg.item_list ?? []) {
227
+ if (item.type === 2 && item.image_item?.media?.encrypt_query_param) {
228
+ items.push({ type: "image", media: item.image_item.media });
229
+ }
230
+ else if (item.type === 3 && item.voice_item?.media?.encrypt_query_param) {
231
+ items.push({ type: "voice", media: item.voice_item.media, voiceText: item.voice_item.text });
232
+ }
233
+ else if (item.type === 4 && item.file_item?.media?.encrypt_query_param) {
234
+ items.push({ type: "file", media: item.file_item.media, fileName: item.file_item.file_name });
235
+ }
236
+ else if (item.type === 5 && item.video_item?.media?.encrypt_query_param) {
237
+ items.push({ type: "video", media: item.video_item.media });
238
+ }
239
+ }
240
+ return items;
241
+ }
242
+ }
243
+ function sleep(ms, signal) {
244
+ return new Promise((resolve, reject) => {
245
+ if (signal?.aborted) {
246
+ reject(new Error("aborted"));
247
+ return;
248
+ }
249
+ const t = setTimeout(resolve, ms);
250
+ signal?.addEventListener("abort", () => { clearTimeout(t); reject(new Error("aborted")); }, { once: true });
251
+ });
252
+ }
253
+ //# sourceMappingURL=connector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector.js","sourceRoot":"","sources":["../../../src/center/wechat/connector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface LoginResult {
2
+ token: string;
3
+ baseUrl: string;
4
+ accountId: string;
5
+ userId: string;
6
+ }
7
+ export interface LoginCallbacks {
8
+ onQrCode?: (qrcodeUrl: string) => void;
9
+ onStatus?: (message: string) => void;
10
+ onScanned?: () => void;
11
+ }
12
+ export declare function loginWithQr(baseUrl: string, callbacks?: LoginCallbacks, abortSignal?: AbortSignal): Promise<LoginResult>;
13
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/center/wechat/login.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,cAAc,EAC1B,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,WAAW,CAAC,CAyEtB"}
@@ -0,0 +1,81 @@
1
+ import { getBotQrcode, getQrcodeStatus } from "./api.js";
2
+ import { debug } from "../../logger.js";
3
+ const BOT_TYPE = "3";
4
+ const MAX_QR_REFRESHES = 3;
5
+ const LOGIN_TIMEOUT_MS = 5 * 60_000;
6
+ const POLL_INTERVAL_MS = 1000;
7
+ export async function loginWithQr(baseUrl, callbacks, abortSignal) {
8
+ const log = callbacks?.onStatus ?? (() => { });
9
+ log("Starting WeChat QR login...");
10
+ debug("Login", `baseUrl=${baseUrl}, botType=${BOT_TYPE}`);
11
+ const qrResp = await getBotQrcode(baseUrl, BOT_TYPE);
12
+ debug("Login", `getBotQrcode response: qrcode=${!!qrResp.qrcode}, img=${!!qrResp.qrcode_img_content}, ret=${qrResp.ret}, errmsg=${qrResp.errmsg}`);
13
+ if (!qrResp.qrcode || !qrResp.qrcode_img_content) {
14
+ throw new Error(`Failed to get QR code: ${qrResp.errmsg ?? "unknown error"}`);
15
+ }
16
+ let currentQrcode = qrResp.qrcode;
17
+ callbacks?.onQrCode?.(qrResp.qrcode_img_content);
18
+ log("Waiting for scan...");
19
+ const deadline = Date.now() + LOGIN_TIMEOUT_MS;
20
+ let refreshCount = 0;
21
+ while (Date.now() < deadline) {
22
+ if (abortSignal?.aborted)
23
+ throw new Error("Login cancelled");
24
+ let status;
25
+ try {
26
+ status = await getQrcodeStatus(baseUrl, currentQrcode);
27
+ }
28
+ catch (err) {
29
+ debug("Login", `getQrcodeStatus error: ${err.message}`);
30
+ log(`Poll error, retrying...`);
31
+ await sleep(POLL_INTERVAL_MS, abortSignal);
32
+ continue;
33
+ }
34
+ debug("Login", `qrcode status: ${status.status}`);
35
+ switch (status.status) {
36
+ case "wait":
37
+ break;
38
+ case "scaned":
39
+ callbacks?.onScanned?.();
40
+ log("Scanned. Please confirm on WeChat...");
41
+ break;
42
+ case "expired":
43
+ if (++refreshCount > MAX_QR_REFRESHES) {
44
+ throw new Error("QR code expired too many times");
45
+ }
46
+ log(`QR expired, refreshing (${refreshCount}/${MAX_QR_REFRESHES})...`);
47
+ const newQr = await getBotQrcode(baseUrl, BOT_TYPE);
48
+ if (!newQr.qrcode || !newQr.qrcode_img_content) {
49
+ throw new Error("Failed to refresh QR code");
50
+ }
51
+ currentQrcode = newQr.qrcode;
52
+ callbacks?.onQrCode?.(newQr.qrcode_img_content);
53
+ break;
54
+ case "confirmed":
55
+ if (!status.bot_token || !status.ilink_bot_id) {
56
+ debug("Login", `confirmed but incomplete: token=${!!status.bot_token}, bot_id=${status.ilink_bot_id}`);
57
+ throw new Error("Login confirmed but missing token/bot_id");
58
+ }
59
+ log("Login successful!");
60
+ debug("Login", `Success: bot_id=${status.ilink_bot_id}, baseurl=${status.baseurl}`);
61
+ return {
62
+ token: status.bot_token,
63
+ baseUrl: status.baseurl || baseUrl,
64
+ accountId: status.ilink_bot_id,
65
+ userId: status.ilink_user_id ?? "",
66
+ };
67
+ }
68
+ await sleep(POLL_INTERVAL_MS, abortSignal);
69
+ }
70
+ throw new Error("Login timeout");
71
+ }
72
+ function sleep(ms, signal) {
73
+ return new Promise((resolve, reject) => {
74
+ const t = setTimeout(resolve, ms);
75
+ signal?.addEventListener("abort", () => {
76
+ clearTimeout(t);
77
+ reject(new Error("aborted"));
78
+ }, { once: true });
79
+ });
80
+ }
81
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/center/wechat/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ export type AgentType = "claude-code" | "claude-sdk" | "opencode" | "openclaw" | "codex" | "codebuddy" | "cursor-agent" | "http" | "worker";
2
+ export interface AgentConfig {
3
+ cwd?: string;
4
+ model?: string;
5
+ url?: string;
6
+ headers?: Record<string, string>;
7
+ env?: Record<string, string>;
8
+ permissionMode?: string;
9
+ [key: string]: unknown;
10
+ }
11
+ export interface SendParams {
12
+ sessionId: string;
13
+ agentSessionId?: string;
14
+ message: string;
15
+ mediaPath?: string;
16
+ onStream?: (chunk: string) => void;
17
+ }
18
+ export interface SendResult {
19
+ text: string;
20
+ agentSessionId?: string;
21
+ mediaUrls?: string[];
22
+ }
23
+ export interface ModelInfo {
24
+ id: string;
25
+ provider: string;
26
+ }
27
+ export interface AgentAdapter {
28
+ readonly id: string;
29
+ readonly type: AgentType;
30
+ readonly displayName: string;
31
+ status: "running" | "stopped" | "error";
32
+ readonly supportsModelSwitch: boolean;
33
+ start(config: AgentConfig): Promise<void>;
34
+ stop(): Promise<void>;
35
+ send(params: SendParams): Promise<SendResult>;
36
+ getModel(): string | undefined;
37
+ setModel(model: string): void;
38
+ listModels(provider?: string): Promise<ModelInfo[]>;
39
+ }
40
+ export interface AgentAdapterFactory {
41
+ create(id: string, displayName: string): AgentAdapter;
42
+ }
43
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/core/agents/adapter.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,YAAY,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,GAAG,WAAW,GAAG,cAAc,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE5I,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IACxC,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;IAEtC,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9C,QAAQ,IAAI,MAAM,GAAG,SAAS,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,YAAY,CAAC;CACvD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/core/agents/adapter.ts"],"names":[],"mappings":""}
@@ -0,0 +1,19 @@
1
+ import type { AgentAdapter, AgentConfig, ModelInfo, SendParams, SendResult } from "./adapter.js";
2
+ export declare class ClaudeCodeAdapter implements AgentAdapter {
3
+ readonly id: string;
4
+ readonly displayName: string;
5
+ readonly type: "claude-code";
6
+ readonly supportsModelSwitch = false;
7
+ status: "running" | "stopped" | "error";
8
+ private config;
9
+ private processes;
10
+ private sessionMessageCount;
11
+ constructor(id: string, displayName: string);
12
+ start(config: AgentConfig): Promise<void>;
13
+ stop(): Promise<void>;
14
+ getModel(): string | undefined;
15
+ setModel(): void;
16
+ listModels(): Promise<ModelInfo[]>;
17
+ send(params: SendParams): Promise<SendResult>;
18
+ }
19
+ //# sourceMappingURL=claude-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../../src/core/agents/claude-code.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAwBjG,qBAAa,iBAAkB,YAAW,YAAY;IASlD,QAAQ,CAAC,EAAE,EAAE,MAAM;IACnB,QAAQ,CAAC,WAAW,EAAE,MAAM;IAT9B,QAAQ,CAAC,IAAI,EAAG,aAAa,CAAU;IACvC,QAAQ,CAAC,mBAAmB,SAAS;IACrC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAa;IACpD,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,mBAAmB,CAA6B;gBAG7C,EAAE,EAAE,MAAM,EACV,WAAW,EAAE,MAAM;IAGxB,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAKzC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAS3B,QAAQ,IAAI,MAAM,GAAG,SAAS;IAC9B,QAAQ,IAAI,IAAI;IACV,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAElC,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;CAiGpD"}
@@ -0,0 +1,138 @@
1
+ import { spawn } from "node:child_process";
2
+ import { createInterface } from "node:readline";
3
+ function buildPermissionArgs(configMode) {
4
+ const mode = configMode || process.env.CLAUDE_PERMISSION_MODE;
5
+ if (mode && mode !== "dangerously-skip-permissions") {
6
+ return ["--permission-mode", mode];
7
+ }
8
+ return ["--dangerously-skip-permissions"];
9
+ }
10
+ function extractTextContent(content) {
11
+ if (typeof content === "string")
12
+ return content;
13
+ if (Array.isArray(content)) {
14
+ return content
15
+ .filter((block) => block.type === "text" || typeof block === "string")
16
+ .map((block) => (typeof block === "string" ? block : block.text))
17
+ .join("\n");
18
+ }
19
+ if (content && typeof content === "object" && "text" in content) {
20
+ return content.text;
21
+ }
22
+ return null;
23
+ }
24
+ export class ClaudeCodeAdapter {
25
+ id;
26
+ displayName;
27
+ type = "claude-code";
28
+ supportsModelSwitch = false;
29
+ status = "stopped";
30
+ config = {};
31
+ processes = new Map();
32
+ sessionMessageCount = new Map();
33
+ constructor(id, displayName) {
34
+ this.id = id;
35
+ this.displayName = displayName;
36
+ }
37
+ async start(config) {
38
+ this.config = config;
39
+ this.status = "running";
40
+ }
41
+ async stop() {
42
+ for (const proc of this.processes.values()) {
43
+ proc.kill("SIGTERM");
44
+ }
45
+ this.processes.clear();
46
+ this.sessionMessageCount.clear();
47
+ this.status = "stopped";
48
+ }
49
+ getModel() { return undefined; }
50
+ setModel() { }
51
+ async listModels() { return []; }
52
+ async send(params) {
53
+ if (this.status !== "running") {
54
+ throw new Error(`Agent ${this.id} is not running`);
55
+ }
56
+ const msgCount = this.sessionMessageCount.get(params.sessionId) ?? 0;
57
+ this.sessionMessageCount.set(params.sessionId, msgCount + 1);
58
+ const isFirstMessage = !params.agentSessionId;
59
+ const args = [
60
+ "--print",
61
+ ...buildPermissionArgs(this.config.permissionMode),
62
+ "--output-format", "stream-json",
63
+ "--input-format", "stream-json",
64
+ "--verbose",
65
+ ];
66
+ if (params.agentSessionId) {
67
+ args.push("--resume", params.agentSessionId);
68
+ }
69
+ const env = { ...process.env, ...(this.config.env ?? {}) };
70
+ delete env.CLAUDECODE;
71
+ return new Promise((resolve, reject) => {
72
+ const proc = spawn("claude", args, {
73
+ cwd: this.config.cwd ?? process.cwd(),
74
+ shell: true,
75
+ env,
76
+ stdio: ["pipe", "pipe", "pipe"],
77
+ });
78
+ this.processes.set(params.sessionId, proc);
79
+ let resultText = "";
80
+ let sessionId;
81
+ const chunks = [];
82
+ const rl = createInterface({ input: proc.stdout });
83
+ rl.on("line", (line) => {
84
+ try {
85
+ const event = JSON.parse(line);
86
+ if (event.type === "assistant" && event.message?.content) {
87
+ const text = extractTextContent(event.message.content);
88
+ if (text) {
89
+ chunks.push(text);
90
+ params.onStream?.(text);
91
+ }
92
+ }
93
+ if (event.type === "result") {
94
+ resultText = event.result ?? "";
95
+ sessionId = event.session_id;
96
+ }
97
+ if (event.session_id && !sessionId) {
98
+ sessionId = event.session_id;
99
+ }
100
+ }
101
+ catch {
102
+ // Non-JSON line, ignore
103
+ }
104
+ });
105
+ proc.stderr?.on("data", (data) => {
106
+ const text = data.toString().trim();
107
+ if (text)
108
+ console.error(`[claude-code:${this.id}] stderr:`, text);
109
+ });
110
+ proc.on("error", (err) => {
111
+ this.processes.delete(params.sessionId);
112
+ reject(new Error(`Claude Code process error: ${err.message}`));
113
+ });
114
+ proc.on("close", (code) => {
115
+ this.processes.delete(params.sessionId);
116
+ if (code !== 0 && code !== null && !resultText && chunks.length === 0) {
117
+ reject(new Error(`Claude Code exited with code ${code}`));
118
+ return;
119
+ }
120
+ const finalText = resultText || chunks.join("\n");
121
+ resolve({
122
+ text: finalText || "(No response)",
123
+ agentSessionId: sessionId,
124
+ });
125
+ });
126
+ const input = JSON.stringify({
127
+ type: "user",
128
+ message: {
129
+ role: "user",
130
+ content: params.message,
131
+ },
132
+ });
133
+ proc.stdin.write(input + "\n");
134
+ proc.stdin.end();
135
+ });
136
+ }
137
+ }
138
+ //# sourceMappingURL=claude-code.js.map