@qwen-code/channel-weixin 0.21.0-preview.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.
- package/dist/WeixinAdapter.d.ts +23 -0
- package/dist/WeixinAdapter.js +278 -0
- package/dist/WeixinAdapter.js.map +1 -0
- package/dist/accounts.d.ts +15 -0
- package/dist/accounts.js +91 -0
- package/dist/accounts.js.map +1 -0
- package/dist/api.d.ts +29 -0
- package/dist/api.js +265 -0
- package/dist/api.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/login.d.ts +18 -0
- package/dist/login.js +76 -0
- package/dist/login.js.map +1 -0
- package/dist/media.d.ts +17 -0
- package/dist/media.js +58 -0
- package/dist/media.js.map +1 -0
- package/dist/monitor.d.ts +30 -0
- package/dist/monitor.js +140 -0
- package/dist/monitor.js.map +1 -0
- package/dist/send.d.ts +43 -0
- package/dist/send.js +227 -0
- package/dist/send.js.map +1 -0
- package/dist/types.d.ts +114 -0
- package/dist/types.js +26 -0
- package/dist/types.js.map +1 -0
- package/package.json +34 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitor.js","sourceRoot":"","sources":["../src/monitor.ts"],"names":[],"mappings":"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"}
|
package/dist/send.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Send messages to WeChat users.
|
|
3
|
+
*/
|
|
4
|
+
/** Convert markdown to plain text (WeChat doesn't support markdown) */
|
|
5
|
+
export declare function markdownToPlainText(text: string): string;
|
|
6
|
+
/** Image magic bytes → MIME type mapping. */
|
|
7
|
+
export declare function detectImageMime(data: Buffer): string;
|
|
8
|
+
/**
|
|
9
|
+
* Validate and resolve an image path before reading.
|
|
10
|
+
*
|
|
11
|
+
* Security: prevents AI-controlled [IMAGE: ...] markers from reading
|
|
12
|
+
* arbitrary files by enforcing directory allowlist, extension allowlist,
|
|
13
|
+
* size cap, and magic-byte verification.
|
|
14
|
+
*
|
|
15
|
+
* @param imagePath Raw path from the AI response.
|
|
16
|
+
* @param workspaceDirs Additional directories to allow (typically the cwd).
|
|
17
|
+
* @returns Resolved absolute realpath if valid.
|
|
18
|
+
*/
|
|
19
|
+
export declare function validateImagePath(imagePath: string, workspaceDirs?: string[]): string;
|
|
20
|
+
/** Send a text message */
|
|
21
|
+
export declare function sendText(params: {
|
|
22
|
+
to: string;
|
|
23
|
+
text: string;
|
|
24
|
+
baseUrl: string;
|
|
25
|
+
token: string;
|
|
26
|
+
contextToken: string;
|
|
27
|
+
}): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Send an image message via the four-step CDN upload flow:
|
|
30
|
+
* 1. Validate path + read file, compute rawsize + MD5; generate AES key + filekey
|
|
31
|
+
* 2. Request upload URL via getuploadurl
|
|
32
|
+
* 3. AES-128-ECB encrypt + POST upload to CDN; extract x-encrypted-param
|
|
33
|
+
* 4. Send message with image_item referencing the CDN media
|
|
34
|
+
*/
|
|
35
|
+
export declare function sendImage(params: {
|
|
36
|
+
to: string;
|
|
37
|
+
imagePath: string;
|
|
38
|
+
baseUrl: string;
|
|
39
|
+
token: string;
|
|
40
|
+
contextToken: string;
|
|
41
|
+
/** Workspace directories to allow for image paths. */
|
|
42
|
+
workspaceDirs?: string[];
|
|
43
|
+
}): Promise<void>;
|
package/dist/send.js
ADDED
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Send messages to WeChat users.
|
|
3
|
+
*/
|
|
4
|
+
import { randomBytes, randomUUID } from 'node:crypto';
|
|
5
|
+
import { readFileSync, statSync, realpathSync, openSync, readSync, closeSync, } from 'node:fs';
|
|
6
|
+
import { tmpdir } from 'node:os';
|
|
7
|
+
import { resolve, extname, win32, posix } from 'node:path';
|
|
8
|
+
import { sendMessage, getUploadUrl, uploadToCdn } from './api.js';
|
|
9
|
+
import { MessageType, MessageState, MessageItemType } from './types.js';
|
|
10
|
+
import { encryptAesEcb, computeMd5 } from './media.js';
|
|
11
|
+
/** Convert markdown to plain text (WeChat doesn't support markdown) */
|
|
12
|
+
export function markdownToPlainText(text) {
|
|
13
|
+
return text
|
|
14
|
+
.replace(/```[\s\S]*?\n([\s\S]*?)```/g, '$1')
|
|
15
|
+
.replace(/`([^`]+)`/g, '$1')
|
|
16
|
+
.replace(/\*\*\*(.+?)\*\*\*/g, '$1')
|
|
17
|
+
.replace(/\*\*(.+?)\*\*/g, '$1')
|
|
18
|
+
.replace(/\*(.+?)\*/g, '$1')
|
|
19
|
+
.replace(/___(.+?)___/g, '$1')
|
|
20
|
+
.replace(/__(.+?)__/g, '$1')
|
|
21
|
+
.replace(/_(.+?)_/g, '$1')
|
|
22
|
+
.replace(/~~(.+?)~~/g, '$1')
|
|
23
|
+
.replace(/^#{1,6}\s+/gm, '')
|
|
24
|
+
.replace(/!\[([^\]]*)\]\([^)]+\)/g, '[$1]')
|
|
25
|
+
.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '$1 ($2)')
|
|
26
|
+
.replace(/^>\s+/gm, '')
|
|
27
|
+
.replace(/^[-*_]{3,}$/gm, '---')
|
|
28
|
+
.replace(/^[\s]*[-*+]\s+/gm, '- ')
|
|
29
|
+
.replace(/^[\s]*(\d+)\.\s+/gm, '$1. ')
|
|
30
|
+
.replace(/\n{3,}/g, '\n\n')
|
|
31
|
+
.trim();
|
|
32
|
+
}
|
|
33
|
+
// ── Image path validation ─────────────────────────────────────────
|
|
34
|
+
const ALLOWED_EXTS = new Set(['.png', '.jpg', '.jpeg', '.gif', '.webp']);
|
|
35
|
+
const MAX_IMAGE_SIZE = 20 * 1024 * 1024; // 20 MB
|
|
36
|
+
function looksLikeWindowsPath(pathValue) {
|
|
37
|
+
return /^[a-zA-Z]:[\\/]/.test(pathValue) || pathValue.startsWith('\\\\');
|
|
38
|
+
}
|
|
39
|
+
function normalizeWindowsPath(pathValue) {
|
|
40
|
+
return pathValue.replace(/\//g, '\\');
|
|
41
|
+
}
|
|
42
|
+
function isInsideAllowedDir(realPath, allowedDir) {
|
|
43
|
+
const windowsStyle = looksLikeWindowsPath(realPath) || looksLikeWindowsPath(allowedDir);
|
|
44
|
+
const pathImpl = windowsStyle ? win32 : posix;
|
|
45
|
+
const from = windowsStyle ? normalizeWindowsPath(allowedDir) : allowedDir;
|
|
46
|
+
const to = windowsStyle ? normalizeWindowsPath(realPath) : realPath;
|
|
47
|
+
const relative = pathImpl.relative(from, to);
|
|
48
|
+
return (relative === '' ||
|
|
49
|
+
(!relative.startsWith('..') && !pathImpl.isAbsolute(relative)));
|
|
50
|
+
}
|
|
51
|
+
function trimDisplayDir(dir) {
|
|
52
|
+
if (/^[a-zA-Z]:[\\/]?$/.test(dir))
|
|
53
|
+
return dir;
|
|
54
|
+
const trimmed = dir.replace(/[\\/]+$/, '');
|
|
55
|
+
return trimmed || dir;
|
|
56
|
+
}
|
|
57
|
+
function formatAllowedImageDirs(dirs) {
|
|
58
|
+
return Array.from(new Set(dirs.map(trimDisplayDir))).join(', ');
|
|
59
|
+
}
|
|
60
|
+
/** Image magic bytes → MIME type mapping. */
|
|
61
|
+
export function detectImageMime(data) {
|
|
62
|
+
if (data[0] === 0x89 &&
|
|
63
|
+
data[1] === 0x50 &&
|
|
64
|
+
data[2] === 0x4e &&
|
|
65
|
+
data[3] === 0x47) {
|
|
66
|
+
return 'image/png';
|
|
67
|
+
}
|
|
68
|
+
if (data[0] === 0x47 && data[1] === 0x49 && data[2] === 0x46) {
|
|
69
|
+
return 'image/gif';
|
|
70
|
+
}
|
|
71
|
+
// WebP is a RIFF container, so the "RIFF" prefix alone is not enough — WAV and
|
|
72
|
+
// AVI share it. The bytes at offset 8-11 must spell "WEBP" to confirm the type.
|
|
73
|
+
if (data[0] === 0x52 &&
|
|
74
|
+
data[1] === 0x49 &&
|
|
75
|
+
data[2] === 0x46 &&
|
|
76
|
+
data[3] === 0x46 &&
|
|
77
|
+
data[8] === 0x57 &&
|
|
78
|
+
data[9] === 0x45 &&
|
|
79
|
+
data[10] === 0x42 &&
|
|
80
|
+
data[11] === 0x50) {
|
|
81
|
+
return 'image/webp';
|
|
82
|
+
}
|
|
83
|
+
if (data[0] === 0xff && data[1] === 0xd8 && data[2] === 0xff) {
|
|
84
|
+
return 'image/jpeg';
|
|
85
|
+
}
|
|
86
|
+
throw new Error('Unrecognized image format: magic bytes do not match any supported type');
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Validate and resolve an image path before reading.
|
|
90
|
+
*
|
|
91
|
+
* Security: prevents AI-controlled [IMAGE: ...] markers from reading
|
|
92
|
+
* arbitrary files by enforcing directory allowlist, extension allowlist,
|
|
93
|
+
* size cap, and magic-byte verification.
|
|
94
|
+
*
|
|
95
|
+
* @param imagePath Raw path from the AI response.
|
|
96
|
+
* @param workspaceDirs Additional directories to allow (typically the cwd).
|
|
97
|
+
* @returns Resolved absolute realpath if valid.
|
|
98
|
+
*/
|
|
99
|
+
export function validateImagePath(imagePath, workspaceDirs = []) {
|
|
100
|
+
const resolved = resolve(imagePath);
|
|
101
|
+
const ext = extname(resolved).toLowerCase();
|
|
102
|
+
if (!ALLOWED_EXTS.has(ext)) {
|
|
103
|
+
throw new Error(`Image extension not allowed: ${ext} (path: ${resolved})`);
|
|
104
|
+
}
|
|
105
|
+
const real = (() => {
|
|
106
|
+
try {
|
|
107
|
+
return realpathSync(resolved);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
throw new Error(`Image file not found: ${resolved}`);
|
|
111
|
+
}
|
|
112
|
+
})();
|
|
113
|
+
const st = statSync(real);
|
|
114
|
+
if (!st.isFile()) {
|
|
115
|
+
throw new Error(`Not a regular file: ${real}`);
|
|
116
|
+
}
|
|
117
|
+
if (st.size > MAX_IMAGE_SIZE) {
|
|
118
|
+
throw new Error(`Image too large: ${st.size} bytes (max ${MAX_IMAGE_SIZE})`);
|
|
119
|
+
}
|
|
120
|
+
// Build the allowlist: /tmp/ (and macOS real /private/tmp/), os.tmpdir(),
|
|
121
|
+
// plus workspace directories passed by the caller. Use realpathSync to
|
|
122
|
+
// resolve symlinks (e.g. /tmp → /private/tmp on macOS).
|
|
123
|
+
const ALLOWED_DIRS = [
|
|
124
|
+
'/tmp/',
|
|
125
|
+
realpathSync('/tmp/') + '/',
|
|
126
|
+
tmpdir() + '/',
|
|
127
|
+
realpathSync(tmpdir()) + '/',
|
|
128
|
+
...workspaceDirs.map((d) => realpathSync(resolve(d)) + '/'),
|
|
129
|
+
];
|
|
130
|
+
if (!ALLOWED_DIRS.some((dir) => isInsideAllowedDir(real, dir))) {
|
|
131
|
+
throw new Error(`Image path outside allowed directories: ${real}. Allowed directories: ${formatAllowedImageDirs(ALLOWED_DIRS)}`);
|
|
132
|
+
}
|
|
133
|
+
// Verify magic bytes match the extension (read only first 16 bytes to
|
|
134
|
+
// avoid TOCTOU double-read — sendImage reads the full file later).
|
|
135
|
+
let fd;
|
|
136
|
+
try {
|
|
137
|
+
fd = openSync(real, 'r');
|
|
138
|
+
const head = Buffer.alloc(16);
|
|
139
|
+
const bytesRead = readSync(fd, head, 0, 16, 0);
|
|
140
|
+
const mime = detectImageMime(head.slice(0, bytesRead));
|
|
141
|
+
const extToExpectedMime = {
|
|
142
|
+
'.png': 'image/png',
|
|
143
|
+
'.jpg': 'image/jpeg',
|
|
144
|
+
'.jpeg': 'image/jpeg',
|
|
145
|
+
'.gif': 'image/gif',
|
|
146
|
+
'.webp': 'image/webp',
|
|
147
|
+
};
|
|
148
|
+
const expected = extToExpectedMime[ext];
|
|
149
|
+
if (mime !== expected) {
|
|
150
|
+
throw new Error(`Image type mismatch: ext=${ext} expects ${expected} but got ${mime}`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
finally {
|
|
154
|
+
if (fd !== undefined)
|
|
155
|
+
closeSync(fd);
|
|
156
|
+
}
|
|
157
|
+
return real;
|
|
158
|
+
}
|
|
159
|
+
/** Send a text message */
|
|
160
|
+
export async function sendText(params) {
|
|
161
|
+
const { to, text, baseUrl, token, contextToken } = params;
|
|
162
|
+
const plainText = markdownToPlainText(text);
|
|
163
|
+
await sendMessage(baseUrl, token, {
|
|
164
|
+
to_user_id: to,
|
|
165
|
+
from_user_id: '',
|
|
166
|
+
client_id: randomUUID(),
|
|
167
|
+
message_type: MessageType.BOT,
|
|
168
|
+
message_state: MessageState.FINISH,
|
|
169
|
+
context_token: contextToken,
|
|
170
|
+
item_list: [{ type: MessageItemType.TEXT, text_item: { text: plainText } }],
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Send an image message via the four-step CDN upload flow:
|
|
175
|
+
* 1. Validate path + read file, compute rawsize + MD5; generate AES key + filekey
|
|
176
|
+
* 2. Request upload URL via getuploadurl
|
|
177
|
+
* 3. AES-128-ECB encrypt + POST upload to CDN; extract x-encrypted-param
|
|
178
|
+
* 4. Send message with image_item referencing the CDN media
|
|
179
|
+
*/
|
|
180
|
+
export async function sendImage(params) {
|
|
181
|
+
const { to, imagePath, baseUrl, token, contextToken, workspaceDirs } = params;
|
|
182
|
+
// Step 1 (security): validate and resolve the image path
|
|
183
|
+
const resolvedPath = validateImagePath(imagePath, workspaceDirs);
|
|
184
|
+
// Step 1 (continued): read file, compute metadata + generate random identifiers
|
|
185
|
+
const fileBuffer = readFileSync(resolvedPath);
|
|
186
|
+
const rawsize = fileBuffer.length;
|
|
187
|
+
const rawfilemd5 = computeMd5(fileBuffer);
|
|
188
|
+
// Generate random 16-byte AES key as hex string
|
|
189
|
+
const aesKeyBytes = randomBytes(16);
|
|
190
|
+
const aesKeyHex = aesKeyBytes.toString('hex');
|
|
191
|
+
// Generate random 32-char hex filekey
|
|
192
|
+
const filekey = randomBytes(16).toString('hex');
|
|
193
|
+
// AES-128-ECB PKCS#7 padding: encrypted size = ceil((rawsize + 1) / 16) * 16
|
|
194
|
+
const encryptedSize = Math.ceil((rawsize + 1) / 16) * 16;
|
|
195
|
+
// Step 2: get upload URL and CDN credentials
|
|
196
|
+
const uploadParam = await getUploadUrl(baseUrl, token, to, filekey, rawsize, rawfilemd5, encryptedSize, aesKeyHex);
|
|
197
|
+
// Step 3: encrypt and upload to CDN
|
|
198
|
+
const encrypted = encryptAesEcb(fileBuffer, aesKeyBytes);
|
|
199
|
+
const cdnEncryptParam = await uploadToCdn(uploadParam, filekey, encrypted);
|
|
200
|
+
// Step 4: send message with image_item using CDN's x-encrypted-param.
|
|
201
|
+
// WeChat image messages expect the AES key as a hex string, with media.aes_key
|
|
202
|
+
// carrying base64(hex string), not base64(raw bytes).
|
|
203
|
+
const aesKeyBase64 = Buffer.from(aesKeyHex, 'ascii').toString('base64');
|
|
204
|
+
await sendMessage(baseUrl, token, {
|
|
205
|
+
to_user_id: to,
|
|
206
|
+
from_user_id: '',
|
|
207
|
+
client_id: randomUUID(),
|
|
208
|
+
message_type: MessageType.BOT,
|
|
209
|
+
message_state: MessageState.FINISH,
|
|
210
|
+
context_token: contextToken,
|
|
211
|
+
item_list: [
|
|
212
|
+
{
|
|
213
|
+
type: MessageItemType.IMAGE,
|
|
214
|
+
image_item: {
|
|
215
|
+
aeskey: aesKeyHex,
|
|
216
|
+
mid_size: encryptedSize,
|
|
217
|
+
media: {
|
|
218
|
+
encrypt_query_param: cdnEncryptParam,
|
|
219
|
+
aes_key: aesKeyBase64,
|
|
220
|
+
encrypt_type: 1,
|
|
221
|
+
},
|
|
222
|
+
},
|
|
223
|
+
},
|
|
224
|
+
],
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=send.js.map
|
package/dist/send.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send.js","sourceRoot":"","sources":["../src/send.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WeChat iLink Bot API protocol types.
|
|
3
|
+
*/
|
|
4
|
+
export declare const MessageType: {
|
|
5
|
+
readonly NONE: 0;
|
|
6
|
+
readonly USER: 1;
|
|
7
|
+
readonly BOT: 2;
|
|
8
|
+
};
|
|
9
|
+
export declare const MessageItemType: {
|
|
10
|
+
readonly NONE: 0;
|
|
11
|
+
readonly TEXT: 1;
|
|
12
|
+
readonly IMAGE: 2;
|
|
13
|
+
readonly VOICE: 3;
|
|
14
|
+
readonly FILE: 4;
|
|
15
|
+
readonly VIDEO: 5;
|
|
16
|
+
};
|
|
17
|
+
export declare const MessageState: {
|
|
18
|
+
readonly NEW: 0;
|
|
19
|
+
readonly GENERATING: 1;
|
|
20
|
+
readonly FINISH: 2;
|
|
21
|
+
};
|
|
22
|
+
export interface BaseInfo {
|
|
23
|
+
channel_version?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface CDNMedia {
|
|
26
|
+
encrypt_query_param?: string;
|
|
27
|
+
aes_key?: string;
|
|
28
|
+
encrypt_type?: number;
|
|
29
|
+
}
|
|
30
|
+
export interface TextItem {
|
|
31
|
+
text?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface ImageItem {
|
|
34
|
+
media?: CDNMedia;
|
|
35
|
+
thumb_media?: CDNMedia;
|
|
36
|
+
aeskey?: string;
|
|
37
|
+
url?: string;
|
|
38
|
+
mid_size?: number;
|
|
39
|
+
}
|
|
40
|
+
export interface VoiceItem {
|
|
41
|
+
media?: CDNMedia;
|
|
42
|
+
text?: string;
|
|
43
|
+
}
|
|
44
|
+
export interface FileItem {
|
|
45
|
+
media?: CDNMedia;
|
|
46
|
+
file_name?: string;
|
|
47
|
+
md5?: string;
|
|
48
|
+
len?: string;
|
|
49
|
+
}
|
|
50
|
+
export interface VideoItem {
|
|
51
|
+
media?: CDNMedia;
|
|
52
|
+
video_size?: number;
|
|
53
|
+
}
|
|
54
|
+
export interface RefMessage {
|
|
55
|
+
message_item?: MessageItem;
|
|
56
|
+
title?: string;
|
|
57
|
+
}
|
|
58
|
+
export interface MessageItem {
|
|
59
|
+
type?: number;
|
|
60
|
+
text_item?: TextItem;
|
|
61
|
+
image_item?: ImageItem;
|
|
62
|
+
voice_item?: VoiceItem;
|
|
63
|
+
file_item?: FileItem;
|
|
64
|
+
video_item?: VideoItem;
|
|
65
|
+
ref_msg?: RefMessage;
|
|
66
|
+
}
|
|
67
|
+
export interface WeixinMessage {
|
|
68
|
+
seq?: number;
|
|
69
|
+
message_id?: number;
|
|
70
|
+
from_user_id?: string;
|
|
71
|
+
to_user_id?: string;
|
|
72
|
+
client_id?: string;
|
|
73
|
+
create_time_ms?: number;
|
|
74
|
+
session_id?: string;
|
|
75
|
+
message_type?: number;
|
|
76
|
+
message_state?: number;
|
|
77
|
+
item_list?: MessageItem[];
|
|
78
|
+
context_token?: string;
|
|
79
|
+
}
|
|
80
|
+
export interface GetUpdatesReq {
|
|
81
|
+
get_updates_buf?: string;
|
|
82
|
+
base_info?: BaseInfo;
|
|
83
|
+
}
|
|
84
|
+
export interface GetUpdatesResp {
|
|
85
|
+
ret?: number;
|
|
86
|
+
errcode?: number;
|
|
87
|
+
errmsg?: string;
|
|
88
|
+
msgs?: WeixinMessage[];
|
|
89
|
+
get_updates_buf?: string;
|
|
90
|
+
longpolling_timeout_ms?: number;
|
|
91
|
+
}
|
|
92
|
+
export interface SendMessageReq {
|
|
93
|
+
msg?: WeixinMessage;
|
|
94
|
+
base_info?: BaseInfo;
|
|
95
|
+
}
|
|
96
|
+
export declare const TypingStatus: {
|
|
97
|
+
readonly TYPING: 1;
|
|
98
|
+
readonly CANCEL: 2;
|
|
99
|
+
};
|
|
100
|
+
export interface GetConfigResp {
|
|
101
|
+
ret?: number;
|
|
102
|
+
errmsg?: string;
|
|
103
|
+
typing_ticket?: string;
|
|
104
|
+
}
|
|
105
|
+
export interface SendTypingReq {
|
|
106
|
+
ilink_user_id?: string;
|
|
107
|
+
typing_ticket?: string;
|
|
108
|
+
status?: number;
|
|
109
|
+
base_info?: BaseInfo;
|
|
110
|
+
}
|
|
111
|
+
export interface SendTypingResp {
|
|
112
|
+
ret?: number;
|
|
113
|
+
errmsg?: string;
|
|
114
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WeChat iLink Bot API protocol types.
|
|
3
|
+
*/
|
|
4
|
+
export const MessageType = {
|
|
5
|
+
NONE: 0,
|
|
6
|
+
USER: 1,
|
|
7
|
+
BOT: 2,
|
|
8
|
+
};
|
|
9
|
+
export const MessageItemType = {
|
|
10
|
+
NONE: 0,
|
|
11
|
+
TEXT: 1,
|
|
12
|
+
IMAGE: 2,
|
|
13
|
+
VOICE: 3,
|
|
14
|
+
FILE: 4,
|
|
15
|
+
VIDEO: 5,
|
|
16
|
+
};
|
|
17
|
+
export const MessageState = {
|
|
18
|
+
NEW: 0,
|
|
19
|
+
GENERATING: 1,
|
|
20
|
+
FINISH: 2,
|
|
21
|
+
};
|
|
22
|
+
export const TypingStatus = {
|
|
23
|
+
TYPING: 1,
|
|
24
|
+
CANCEL: 2,
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,GAAG,EAAE,CAAC;CACE,CAAC;AAEX,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACA,CAAC;AAEX,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,GAAG,EAAE,CAAC;IACN,UAAU,EAAE,CAAC;IACb,MAAM,EAAE,CAAC;CACD,CAAC;AAyFX,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,MAAM,EAAE,CAAC;IACT,MAAM,EAAE,CAAC;CACD,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@qwen-code/channel-weixin",
|
|
3
|
+
"version": "0.21.0-preview.0",
|
|
4
|
+
"description": "WeChat (Weixin) channel adapter for Qwen Code",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./accounts": {
|
|
14
|
+
"types": "./dist/accounts.d.ts",
|
|
15
|
+
"default": "./dist/accounts.js"
|
|
16
|
+
},
|
|
17
|
+
"./login": {
|
|
18
|
+
"types": "./dist/login.d.ts",
|
|
19
|
+
"default": "./dist/login.js"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"dist"
|
|
24
|
+
],
|
|
25
|
+
"scripts": {
|
|
26
|
+
"build": "tsc --build"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@qwen-code/channel-base": "^0.21.0"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"typescript": "^5.0.0"
|
|
33
|
+
}
|
|
34
|
+
}
|