@lanbaolu/dsh-wechat-bridge 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.
- package/LICENSE +21 -0
- package/README.md +152 -0
- package/cordis.patch.yml +12 -0
- package/docs/feasibility-plan.md +62 -0
- package/lib/bridge/commands/handlers.js +155 -0
- package/lib/bridge/commands/handlers.js.map +1 -0
- package/lib/bridge/commands/router.js +52 -0
- package/lib/bridge/commands/router.js.map +1 -0
- package/lib/bridge/config.js +40 -0
- package/lib/bridge/config.js.map +1 -0
- package/lib/bridge/constants.js +14 -0
- package/lib/bridge/constants.js.map +1 -0
- package/lib/bridge/dsh-client.js +100 -0
- package/lib/bridge/dsh-client.js.map +1 -0
- package/lib/bridge/logger.js +75 -0
- package/lib/bridge/logger.js.map +1 -0
- package/lib/bridge/main.js +546 -0
- package/lib/bridge/main.js.map +1 -0
- package/lib/bridge/pending-queue.js +55 -0
- package/lib/bridge/pending-queue.js.map +1 -0
- package/lib/bridge/session.js +84 -0
- package/lib/bridge/session.js.map +1 -0
- package/lib/bridge/store.js +38 -0
- package/lib/bridge/store.js.map +1 -0
- package/lib/bridge/wechat/accounts.js +50 -0
- package/lib/bridge/wechat/accounts.js.map +1 -0
- package/lib/bridge/wechat/api.js +197 -0
- package/lib/bridge/wechat/api.js.map +1 -0
- package/lib/bridge/wechat/cdn.js +45 -0
- package/lib/bridge/wechat/cdn.js.map +1 -0
- package/lib/bridge/wechat/crypto.js +17 -0
- package/lib/bridge/wechat/crypto.js.map +1 -0
- package/lib/bridge/wechat/login.js +139 -0
- package/lib/bridge/wechat/login.js.map +1 -0
- package/lib/bridge/wechat/media.js +138 -0
- package/lib/bridge/wechat/media.js.map +1 -0
- package/lib/bridge/wechat/monitor.js +104 -0
- package/lib/bridge/wechat/monitor.js.map +1 -0
- package/lib/bridge/wechat/send.js +172 -0
- package/lib/bridge/wechat/send.js.map +1 -0
- package/lib/bridge/wechat/sync-buf.js +11 -0
- package/lib/bridge/wechat/sync-buf.js.map +1 -0
- package/lib/bridge/wechat/types.js +35 -0
- package/lib/bridge/wechat/types.js.map +1 -0
- package/lib/bridge/wechat/upload.js +111 -0
- package/lib/bridge/wechat/upload.js.map +1 -0
- package/lib/client/Panel.js +205 -0
- package/lib/client/Panel.js.map +1 -0
- package/lib/client/index.js +11 -0
- package/lib/client/index.js.map +1 -0
- package/lib/client.js +376 -0
- package/lib/client.js.map +1 -0
- package/lib/index.js +828 -0
- package/lib/index.js.map +1 -0
- package/lib/types/bridge/commands/handlers.d.ts +18 -0
- package/lib/types/bridge/commands/router.d.ts +26 -0
- package/lib/types/bridge/config.d.ts +7 -0
- package/lib/types/bridge/constants.d.ts +10 -0
- package/lib/types/bridge/dsh-client.d.ts +39 -0
- package/lib/types/bridge/logger.d.ts +13 -0
- package/lib/types/bridge/main.d.ts +1 -0
- package/lib/types/bridge/pending-queue.d.ts +10 -0
- package/lib/types/bridge/session.d.ts +22 -0
- package/lib/types/bridge/store.d.ts +11 -0
- package/lib/types/bridge/wechat/accounts.d.ts +14 -0
- package/lib/types/bridge/wechat/api.d.ts +32 -0
- package/lib/types/bridge/wechat/cdn.d.ts +2 -0
- package/lib/types/bridge/wechat/crypto.d.ts +4 -0
- package/lib/types/bridge/wechat/login.d.ts +31 -0
- package/lib/types/bridge/wechat/media.d.ts +20 -0
- package/lib/types/bridge/wechat/monitor.d.ts +10 -0
- package/lib/types/bridge/wechat/send.d.ts +6 -0
- package/lib/types/bridge/wechat/sync-buf.d.ts +2 -0
- package/lib/types/bridge/wechat/types.d.ts +135 -0
- package/lib/types/bridge/wechat/upload.d.ts +11 -0
- package/lib/types/client/Panel.d.ts +3 -0
- package/lib/types/client/index.d.ts +9 -0
- package/lib/types/index.d.ts +39 -0
- package/package.json +92 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { createHash, randomBytes } from 'node:crypto';
|
|
2
|
+
import { readFileSync, statSync } from 'node:fs';
|
|
3
|
+
import { basename, extname } from 'node:path';
|
|
4
|
+
import { encryptAesEcb, aesEcbPaddedSize } from './crypto.js';
|
|
5
|
+
import { UploadMediaType } from './types.js';
|
|
6
|
+
import { CDN_BASE_URL } from '../constants.js';
|
|
7
|
+
import { logger } from '../logger.js';
|
|
8
|
+
const MAX_FILE_SIZE = 25 * 1024 * 1024; // 25MB
|
|
9
|
+
const IMAGE_EXTENSIONS = new Set(['.png', '.jpg', '.jpeg', '.gif', '.webp', '.bmp', '.svg', '.ico']);
|
|
10
|
+
export function isImageFile(filePath) {
|
|
11
|
+
return IMAGE_EXTENSIONS.has(extname(filePath).toLowerCase());
|
|
12
|
+
}
|
|
13
|
+
export async function uploadFile(api, toUserId, filePath) {
|
|
14
|
+
const stat = statSync(filePath);
|
|
15
|
+
if (stat.size > MAX_FILE_SIZE) {
|
|
16
|
+
throw new Error(`文件过大 (${(stat.size / 1024 / 1024).toFixed(1)}MB),最大支持 25MB`);
|
|
17
|
+
}
|
|
18
|
+
const fileName = basename(filePath);
|
|
19
|
+
const isImage = isImageFile(filePath);
|
|
20
|
+
const mediaType = isImage ? UploadMediaType.IMAGE : UploadMediaType.FILE;
|
|
21
|
+
// Prepare file
|
|
22
|
+
const plaintext = readFileSync(filePath);
|
|
23
|
+
const rawSize = plaintext.length;
|
|
24
|
+
const rawFileMd5 = createHash('md5').update(plaintext).digest('hex');
|
|
25
|
+
const fileSize = aesEcbPaddedSize(rawSize);
|
|
26
|
+
const fileKey = randomBytes(16).toString('hex'); // 32-hex-char string
|
|
27
|
+
const aesKey = randomBytes(16); // 16 raw bytes
|
|
28
|
+
const aesKeyHex = aesKey.toString('hex');
|
|
29
|
+
// Get upload URL
|
|
30
|
+
logger.info('Requesting upload URL', { fileName, rawSize, mediaType, toUserId });
|
|
31
|
+
const uploadResp = await api.getUploadUrl({
|
|
32
|
+
filekey: fileKey,
|
|
33
|
+
media_type: mediaType,
|
|
34
|
+
to_user_id: toUserId,
|
|
35
|
+
rawsize: rawSize,
|
|
36
|
+
rawfilemd5: rawFileMd5,
|
|
37
|
+
filesize: fileSize,
|
|
38
|
+
no_need_thumb: true,
|
|
39
|
+
aeskey: aesKeyHex,
|
|
40
|
+
base_info: {
|
|
41
|
+
channel_version: '2.0.0',
|
|
42
|
+
bot_agent: 'wechat-claude-code',
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
logger.info('Upload URL response', { uploadResp });
|
|
46
|
+
if (!uploadResp.upload_full_url && !uploadResp.upload_param) {
|
|
47
|
+
throw new Error(`获取上传地址失败: ${JSON.stringify(uploadResp)}`);
|
|
48
|
+
}
|
|
49
|
+
// Encrypt
|
|
50
|
+
const encrypted = encryptAesEcb(aesKey, plaintext);
|
|
51
|
+
// Build CDN upload URL
|
|
52
|
+
let uploadUrl;
|
|
53
|
+
if (uploadResp.upload_full_url) {
|
|
54
|
+
uploadUrl = uploadResp.upload_full_url;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
uploadUrl = `${CDN_BASE_URL}/upload?encrypted_query_param=${encodeURIComponent(uploadResp.upload_param)}&filekey=${fileKey}`;
|
|
58
|
+
}
|
|
59
|
+
logger.info('Uploading to CDN', { uploadUrl, encryptedSize: encrypted.length });
|
|
60
|
+
// Upload to CDN (POST, get download param from response header)
|
|
61
|
+
const encryptQueryParam = await uploadToCdn(uploadUrl, encrypted);
|
|
62
|
+
logger.info('CDN upload succeeded', { fileName });
|
|
63
|
+
return {
|
|
64
|
+
mediaType: isImage ? 'image' : 'file',
|
|
65
|
+
encryptQueryParam,
|
|
66
|
+
aesKeyHex,
|
|
67
|
+
fileName,
|
|
68
|
+
fileSize,
|
|
69
|
+
rawSize,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
async function uploadToCdn(url, encrypted) {
|
|
73
|
+
const MAX_RETRIES = 3;
|
|
74
|
+
for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
|
|
75
|
+
const controller = new AbortController();
|
|
76
|
+
const timer = setTimeout(() => controller.abort(), 60_000);
|
|
77
|
+
try {
|
|
78
|
+
const res = await fetch(url, {
|
|
79
|
+
method: 'POST',
|
|
80
|
+
body: new Uint8Array(encrypted),
|
|
81
|
+
signal: controller.signal,
|
|
82
|
+
headers: { 'Content-Type': 'application/octet-stream' },
|
|
83
|
+
});
|
|
84
|
+
if (res.status >= 400 && res.status < 500) {
|
|
85
|
+
const text = await res.text();
|
|
86
|
+
throw new Error(`CDN 上传失败 (4xx): ${res.status} ${text.slice(0, 200)}`);
|
|
87
|
+
}
|
|
88
|
+
if (res.status >= 500) {
|
|
89
|
+
logger.warn('CDN upload 5xx, retrying', { status: res.status, attempt });
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
// Get download param from response header
|
|
93
|
+
const param = res.headers.get('x-encrypted-param');
|
|
94
|
+
if (!param) {
|
|
95
|
+
throw new Error('CDN 上传成功但未返回 x-encrypted-param');
|
|
96
|
+
}
|
|
97
|
+
return param;
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
if (err instanceof DOMException && err.name === 'AbortError') {
|
|
101
|
+
throw new Error('CDN 上传超时');
|
|
102
|
+
}
|
|
103
|
+
throw err;
|
|
104
|
+
}
|
|
105
|
+
finally {
|
|
106
|
+
clearTimeout(timer);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
throw new Error('CDN 上传失败: 多次重试后仍失败');
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=upload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../../src/bridge/wechat/upload.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useState } from 'react';
|
|
3
|
+
const API_BASE = '/@lanbaolu/dsh-wechat-bridge';
|
|
4
|
+
const panelStyle = {
|
|
5
|
+
padding: '14px 16px',
|
|
6
|
+
fontFamily: 'ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif',
|
|
7
|
+
fontSize: 13,
|
|
8
|
+
lineHeight: 1.6,
|
|
9
|
+
color: 'var(--text-1, #1f2328)',
|
|
10
|
+
background: 'var(--surface-2, rgba(127,127,127,.06))',
|
|
11
|
+
border: '1px solid var(--border-color, rgba(127,127,127,.18))',
|
|
12
|
+
borderRadius: 10,
|
|
13
|
+
margin: '8px 0',
|
|
14
|
+
};
|
|
15
|
+
const titleStyle = {
|
|
16
|
+
fontWeight: 600,
|
|
17
|
+
fontSize: 14,
|
|
18
|
+
marginBottom: 8,
|
|
19
|
+
};
|
|
20
|
+
const outputStyle = {
|
|
21
|
+
margin: '4px 0 8px',
|
|
22
|
+
padding: '8px 10px',
|
|
23
|
+
background: 'var(--surface-3, rgba(0,0,0,.04))',
|
|
24
|
+
border: '1px solid var(--border-color, rgba(127,127,127,.15))',
|
|
25
|
+
borderRadius: 6,
|
|
26
|
+
whiteSpace: 'pre-wrap',
|
|
27
|
+
wordBreak: 'break-all',
|
|
28
|
+
fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',
|
|
29
|
+
fontSize: 12,
|
|
30
|
+
maxHeight: 360,
|
|
31
|
+
overflow: 'auto',
|
|
32
|
+
};
|
|
33
|
+
const buttonRowStyle = {
|
|
34
|
+
display: 'flex',
|
|
35
|
+
gap: 8,
|
|
36
|
+
flexWrap: 'wrap',
|
|
37
|
+
alignItems: 'center',
|
|
38
|
+
};
|
|
39
|
+
const buttonStyle = {
|
|
40
|
+
padding: '4px 10px',
|
|
41
|
+
border: '1px solid var(--border-color, rgba(127,127,127,.4))',
|
|
42
|
+
borderRadius: 6,
|
|
43
|
+
background: 'var(--button-bg, #fff)',
|
|
44
|
+
color: 'var(--text-1, inherit)',
|
|
45
|
+
cursor: 'pointer',
|
|
46
|
+
fontSize: 12,
|
|
47
|
+
};
|
|
48
|
+
const inputStyle = {
|
|
49
|
+
padding: '4px 8px',
|
|
50
|
+
border: '1px solid var(--border-color, rgba(127,127,127,.4))',
|
|
51
|
+
borderRadius: 6,
|
|
52
|
+
background: 'var(--surface-3, rgba(127,127,127,.06))',
|
|
53
|
+
color: 'var(--text-1, inherit)',
|
|
54
|
+
fontSize: 12,
|
|
55
|
+
minWidth: 220,
|
|
56
|
+
};
|
|
57
|
+
const hintStyle = {
|
|
58
|
+
marginTop: 8,
|
|
59
|
+
fontSize: 12,
|
|
60
|
+
opacity: 0.7,
|
|
61
|
+
};
|
|
62
|
+
export function WechatBridgePanel(_props) {
|
|
63
|
+
const [output, setOutput] = useState('加载中…');
|
|
64
|
+
const [error, setError] = useState(null);
|
|
65
|
+
const [busy, setBusy] = useState(null);
|
|
66
|
+
const [workingDir, setWorkingDir] = useState('');
|
|
67
|
+
const [setupPhase, setSetupPhase] = useState('idle');
|
|
68
|
+
const [qrcodeDataUrl, setQrcodeDataUrl] = useState('');
|
|
69
|
+
const [qrcodeId, setQrcodeId] = useState('');
|
|
70
|
+
const [setupError, setSetupError] = useState('');
|
|
71
|
+
const [boundAccountId, setBoundAccountId] = useState('');
|
|
72
|
+
const refresh = useCallback(async () => {
|
|
73
|
+
try {
|
|
74
|
+
const res = await fetch(`${API_BASE}/status`, { cache: 'no-store' });
|
|
75
|
+
if (!res.ok)
|
|
76
|
+
throw new Error(`HTTP ${res.status}`);
|
|
77
|
+
const data = await res.json();
|
|
78
|
+
setOutput(JSON.stringify(data, null, 2));
|
|
79
|
+
if (typeof data.workingDirectory === 'string') {
|
|
80
|
+
setWorkingDir((prev) => prev || data.workingDirectory);
|
|
81
|
+
}
|
|
82
|
+
setError(null);
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
setError(err instanceof Error ? err.message : String(err));
|
|
86
|
+
}
|
|
87
|
+
}, []);
|
|
88
|
+
useEffect(() => {
|
|
89
|
+
void refresh();
|
|
90
|
+
}, [refresh]);
|
|
91
|
+
async function run(path) {
|
|
92
|
+
setBusy(path);
|
|
93
|
+
setError(null);
|
|
94
|
+
try {
|
|
95
|
+
const res = await fetch(`${API_BASE}/${path}`, { method: 'POST' });
|
|
96
|
+
if (!res.ok)
|
|
97
|
+
throw new Error(`HTTP ${res.status}`);
|
|
98
|
+
const data = await res.json();
|
|
99
|
+
setOutput(JSON.stringify(data, null, 2));
|
|
100
|
+
await refresh();
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
setError(err instanceof Error ? err.message : String(err));
|
|
104
|
+
}
|
|
105
|
+
finally {
|
|
106
|
+
setBusy(null);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
async function showLogs() {
|
|
110
|
+
setBusy('logs');
|
|
111
|
+
setError(null);
|
|
112
|
+
try {
|
|
113
|
+
const res = await fetch(`${API_BASE}/logs`, { cache: 'no-store' });
|
|
114
|
+
if (!res.ok)
|
|
115
|
+
throw new Error(`HTTP ${res.status}`);
|
|
116
|
+
setOutput(await res.text());
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
setError(err instanceof Error ? err.message : String(err));
|
|
120
|
+
}
|
|
121
|
+
finally {
|
|
122
|
+
setBusy(null);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async function startSetup() {
|
|
126
|
+
setSetupPhase('starting');
|
|
127
|
+
setSetupError('');
|
|
128
|
+
try {
|
|
129
|
+
const res = await fetch(`${API_BASE}/setup/start`, {
|
|
130
|
+
method: 'POST',
|
|
131
|
+
headers: { 'Content-Type': 'application/json' },
|
|
132
|
+
body: JSON.stringify({ workingDirectory: workingDir || undefined }),
|
|
133
|
+
});
|
|
134
|
+
if (!res.ok)
|
|
135
|
+
throw new Error(`HTTP ${res.status}`);
|
|
136
|
+
const data = await res.json();
|
|
137
|
+
if (!data.ok)
|
|
138
|
+
throw new Error(data.message || data.error || '启动扫码绑定失败');
|
|
139
|
+
setQrcodeDataUrl(data.qrcodeDataUrl);
|
|
140
|
+
setQrcodeId(data.qrcodeId);
|
|
141
|
+
setWorkingDir(data.workingDirectory || workingDir);
|
|
142
|
+
setSetupPhase('qr');
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
setSetupPhase('error');
|
|
146
|
+
setSetupError(err instanceof Error ? err.message : String(err));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
useEffect(() => {
|
|
150
|
+
if (setupPhase !== 'qr' || !qrcodeId)
|
|
151
|
+
return;
|
|
152
|
+
let cancelled = false;
|
|
153
|
+
let timer;
|
|
154
|
+
async function poll() {
|
|
155
|
+
try {
|
|
156
|
+
const res = await fetch(`${API_BASE}/setup/status?qrcodeId=${encodeURIComponent(qrcodeId)}`, { cache: 'no-store' });
|
|
157
|
+
if (!res.ok)
|
|
158
|
+
throw new Error(`HTTP ${res.status}`);
|
|
159
|
+
const data = await res.json();
|
|
160
|
+
if (cancelled)
|
|
161
|
+
return;
|
|
162
|
+
if (data.status === 'confirmed') {
|
|
163
|
+
setSetupPhase('confirmed');
|
|
164
|
+
setBoundAccountId(data.accountId || '');
|
|
165
|
+
void refresh();
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
if (data.status === 'expired' || (data.status === 'error' && !data.retryable)) {
|
|
169
|
+
setSetupPhase('error');
|
|
170
|
+
setSetupError(data.message || '绑定失败,请重试');
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
timer = window.setTimeout(() => void poll(), 3000);
|
|
174
|
+
}
|
|
175
|
+
catch (err) {
|
|
176
|
+
if (!cancelled) {
|
|
177
|
+
setSetupPhase('error');
|
|
178
|
+
setSetupError(err instanceof Error ? err.message : String(err));
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
void poll();
|
|
183
|
+
return () => {
|
|
184
|
+
cancelled = true;
|
|
185
|
+
if (timer)
|
|
186
|
+
window.clearTimeout(timer);
|
|
187
|
+
};
|
|
188
|
+
}, [setupPhase, qrcodeId, refresh]);
|
|
189
|
+
function cancelSetup() {
|
|
190
|
+
setSetupPhase('idle');
|
|
191
|
+
setQrcodeDataUrl('');
|
|
192
|
+
setQrcodeId('');
|
|
193
|
+
setSetupError('');
|
|
194
|
+
}
|
|
195
|
+
const actions = [
|
|
196
|
+
{ label: '刷新状态', run: () => void refresh() },
|
|
197
|
+
{ label: '扫码绑定', run: () => void startSetup(), disabled: setupPhase === 'starting' || setupPhase === 'qr' },
|
|
198
|
+
{ label: '启动', run: () => void run('start'), disabled: busy !== null },
|
|
199
|
+
{ label: '停止', run: () => void run('stop'), disabled: busy !== null },
|
|
200
|
+
{ label: '重启', run: () => void run('restart'), disabled: busy !== null },
|
|
201
|
+
{ label: '查看日志', run: () => void showLogs(), disabled: busy !== null },
|
|
202
|
+
];
|
|
203
|
+
return (_jsxs("div", { style: panelStyle, role: "region", "aria-label": "DSH \u5FAE\u4FE1\u6865\u63A5\u7BA1\u7406\u9762\u677F", children: [_jsx("div", { style: titleStyle, children: "\uD83D\uDCF1 DSH \u5FAE\u4FE1\u6865\u63A5" }), error && _jsx("div", { role: "alert", style: { color: '#e5484d', marginBottom: 8 }, children: error }), _jsxs("label", { style: { display: 'block', marginBottom: 8, fontSize: 12 }, children: ["DSH \u5DE5\u4F5C\u76EE\u5F55", _jsx("input", { type: "text", value: workingDir, onChange: (e) => setWorkingDir(e.target.value), placeholder: "\u4F8B\u5982 ~/Documents/DSH", style: { ...inputStyle, marginLeft: 8 } })] }), setupPhase === 'starting' && (_jsx("div", { role: "status", style: { marginBottom: 8 }, children: "\u6B63\u5728\u751F\u6210\u4E8C\u7EF4\u7801\u2026" })), setupPhase === 'qr' && qrcodeDataUrl && (_jsxs("div", { style: { marginBottom: 8 }, children: [_jsx("div", { style: { fontWeight: 600, marginBottom: 4 }, children: "\u8BF7\u7528\u5FAE\u4FE1\u626B\u63CF\u4E0B\u65B9\u4E8C\u7EF4\u7801\u5B8C\u6210\u7ED1\u5B9A" }), _jsx("img", { src: qrcodeDataUrl, alt: "\u5FAE\u4FE1\u626B\u7801\u7ED1\u5B9A\u4E8C\u7EF4\u7801", width: 240, height: 240, style: { display: 'block', maxWidth: '100%', height: 'auto', borderRadius: 8, background: '#fff' } }), _jsxs("div", { style: { fontSize: 12, opacity: 0.7, marginTop: 4 }, children: ["\u5DE5\u4F5C\u76EE\u5F55\uFF1A", workingDir || '未设置', "\u3002\u7B49\u5F85\u626B\u7801\u786E\u8BA4\u4E2D\u2026"] }), _jsx("button", { type: "button", style: { ...buttonStyle, marginTop: 8 }, onClick: cancelSetup, children: "\u53D6\u6D88\u7ED1\u5B9A" })] })), setupPhase === 'confirmed' && (_jsxs("div", { role: "status", style: { marginBottom: 8, color: '#2f9e44' }, children: ["\u2705 \u7ED1\u5B9A\u6210\u529F", boundAccountId ? `:${boundAccountId}` : '', "\uFF0C\u53EF\u4EE5\u70B9\u51FB\u201C\u542F\u52A8\u201D\u5F00\u59CB\u4F7F\u7528\u3002"] })), setupPhase === 'error' && (_jsxs("div", { role: "alert", style: { marginBottom: 8, color: '#e5484d' }, children: ["\u274C ", setupError, _jsx("button", { type: "button", style: { ...buttonStyle, marginLeft: 8 }, onClick: () => setSetupPhase('idle'), children: "\u91CD\u65B0\u626B\u7801" })] })), _jsx("pre", { style: outputStyle, "aria-live": "polite", children: output }), _jsx("div", { style: buttonRowStyle, children: actions.map((action) => (_jsx("button", { type: "button", style: buttonStyle, disabled: action.disabled ?? false, onClick: action.run, children: action.label }, action.label))) }), _jsx("div", { style: hintStyle, children: "\u4E5F\u53EF\u5728 DSH \u5BF9\u8BDD\u4E2D\u76F4\u63A5\u4F7F\u7528 wechat_bridge_setup / wechat_bridge_status / wechat_bridge_start / wechat_bridge_stop / wechat_bridge_logs \u7B49\u5DE5\u5177\u3002" })] }));
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=Panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Panel.js","sourceRoot":"","sources":["../../src/client/Panel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { WechatBridgePanel } from './Panel.js';
|
|
2
|
+
export const inject = ['slots'];
|
|
3
|
+
export function apply(ctx) {
|
|
4
|
+
ctx.effect(() => ctx.slots.inject('settings.section', () => ctx.slots.register({
|
|
5
|
+
name: 'settings.section',
|
|
6
|
+
id: '@lanbaolu/dsh-wechat-bridge-panel',
|
|
7
|
+
order: 55,
|
|
8
|
+
label: () => '📱 微信桥接',
|
|
9
|
+
}, WechatBridgePanel)), '@lanbaolu/dsh-wechat-bridge: panel');
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAE9C,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,CAAA;AAE/B,MAAM,UAAU,KAAK,CAAC,GAAkB;IACtC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,EAAE,GAAG,EAAE,CACzD,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;QACjB,IAAI,EAAE,kBAAkB;QACxB,EAAE,EAAE,mCAAmC;QACvC,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS;KACvB,EAAE,iBAAiB,CAAC,CACtB,EAAE,oCAAoC,CAAC,CAAA;AAC1C,CAAC"}
|