@harrylabsj/kiwi 0.6.0 → 0.6.1
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/a2a/node.d.ts +3 -1
- package/dist/a2a/node.js +1 -0
- package/dist/a2a/node.js.map +1 -1
- package/dist/agent/buyer/types.d.ts +0 -25
- package/dist/agent/buyer/types.js.map +1 -1
- package/dist/agent/kernel-builder.d.ts +27 -0
- package/dist/agent/kernel-builder.js +180 -0
- package/dist/agent/kernel-builder.js.map +1 -0
- package/dist/cli.js +98 -154
- package/dist/cli.js.map +1 -1
- package/dist/commerce/data-source.d.ts +4 -3
- package/dist/commerce/data-source.js.map +1 -1
- package/dist/commerce/shopping-cli-source.js +3 -2
- package/dist/commerce/shopping-cli-source.js.map +1 -1
- package/dist/config/profile.d.ts +7 -0
- package/dist/config/profile.js +23 -0
- package/dist/config/profile.js.map +1 -1
- package/dist/discovery/catalog-source/kiwi-record.d.ts +3 -0
- package/dist/discovery/catalog-source/kiwi-record.js.map +1 -1
- package/dist/discovery/catalog-source/kiwi-source.js +7 -1
- package/dist/discovery/catalog-source/kiwi-source.js.map +1 -1
- package/dist/discovery/catalog-source/register.d.ts +6 -0
- package/dist/discovery/catalog-source/register.js +15 -7
- package/dist/discovery/catalog-source/register.js.map +1 -1
- package/dist/handoff/errors.d.ts +1 -1
- package/dist/handoff/errors.js +1 -0
- package/dist/handoff/errors.js.map +1 -1
- package/dist/handoff/idempotency.d.ts +10 -1
- package/dist/handoff/idempotency.js +13 -3
- package/dist/handoff/idempotency.js.map +1 -1
- package/dist/handoff/transaction.js +13 -6
- package/dist/handoff/transaction.js.map +1 -1
- package/dist/negotiation/state/phase.js +12 -4
- package/dist/negotiation/state/phase.js.map +1 -1
- package/dist/product-catalog.d.ts +43 -0
- package/dist/product-catalog.js +60 -0
- package/dist/product-catalog.js.map +1 -0
- package/dist/product-cli.d.ts +1 -1
- package/dist/product-cli.js +1 -1
- package/dist/product-publish.d.ts +10 -17
- package/dist/product-publish.js +177 -41
- package/dist/product-publish.js.map +1 -1
- package/dist/weixin/channel.d.ts +87 -0
- package/dist/weixin/channel.js +356 -0
- package/dist/weixin/channel.js.map +1 -0
- package/dist/weixin/cli-weixin.d.ts +29 -0
- package/dist/weixin/cli-weixin.js +128 -0
- package/dist/weixin/cli-weixin.js.map +1 -0
- package/dist/weixin/credentials.d.ts +33 -0
- package/dist/weixin/credentials.js +107 -0
- package/dist/weixin/credentials.js.map +1 -0
- package/dist/weixin/ilink-client.d.ts +44 -0
- package/dist/weixin/ilink-client.js +262 -0
- package/dist/weixin/ilink-client.js.map +1 -0
- package/dist/weixin/login.d.ts +34 -0
- package/dist/weixin/login.js +93 -0
- package/dist/weixin/login.js.map +1 -0
- package/dist/weixin/qr.d.ts +26 -0
- package/dist/weixin/qr.js +525 -0
- package/dist/weixin/qr.js.map +1 -0
- package/dist/weixin/types.d.ts +114 -0
- package/dist/weixin/types.js +48 -0
- package/dist/weixin/types.js.map +1 -0
- package/package.json +4 -1
|
@@ -0,0 +1,525 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2026 harrylabsj
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* QR 编码器(零运行时依赖,纯函数)——微信扫码登录的终端二维码渲染。
|
|
18
|
+
*
|
|
19
|
+
* 规格:ISO/IEC 18004,Byte mode,纠错级别 L,版本 1–10。
|
|
20
|
+
* 流水线:版本选择 → 位流(模式/长度/数据/终结/填充)→ Reed-Solomon
|
|
21
|
+
* (GF(2^8) 0x11D,多块交织)→ 矩阵放置(finder/timing/alignment/dark/
|
|
22
|
+
* 数据 zigzag)→ 8 掩码全试(penalty N1–N4 最低胜出)→ format/version 信息。
|
|
23
|
+
* 正确性由测试双重验证:qrcode 库矩阵对照 + jsqr 解码回环。
|
|
24
|
+
*/
|
|
25
|
+
import { WeixinError } from "./types.js";
|
|
26
|
+
/** 版本容量表(字节,纠错 L;索引 = 版本号 1..10)。 */
|
|
27
|
+
const CAPACITY_BYTE_L = [
|
|
28
|
+
17, 32, 53, 78, 106, 134, 154, 192, 230, 271,
|
|
29
|
+
];
|
|
30
|
+
/** 总码字数(含 ECC;索引 = 版本号 1..10)。 */
|
|
31
|
+
const TOTAL_CODEWORDS = [
|
|
32
|
+
26, 44, 70, 100, 134, 172, 196, 242, 292, 346,
|
|
33
|
+
];
|
|
34
|
+
/** 每块 ECC 码字数(纠错 L;索引 = 版本号 1..10)。 */
|
|
35
|
+
const ECC_PER_BLOCK_L = [
|
|
36
|
+
7, 10, 15, 20, 26, 18, 20, 24, 30, 36,
|
|
37
|
+
];
|
|
38
|
+
/** 块数(纠错 L;索引 = 版本号 1..10)。 */
|
|
39
|
+
const BLOCKS_L = [1, 1, 1, 1, 1, 2, 2, 2, 2, 2];
|
|
40
|
+
/** 对齐图案中心坐标(索引 = 版本号 1..10;v1 无)。 */
|
|
41
|
+
const ALIGNMENT_PATTERNS = [
|
|
42
|
+
[],
|
|
43
|
+
[6, 18],
|
|
44
|
+
[6, 22],
|
|
45
|
+
[6, 26],
|
|
46
|
+
[6, 30],
|
|
47
|
+
[6, 34],
|
|
48
|
+
[6, 22, 38],
|
|
49
|
+
[6, 24, 42],
|
|
50
|
+
[6, 26, 46],
|
|
51
|
+
[6, 28, 50],
|
|
52
|
+
];
|
|
53
|
+
// ── GF(2^8) 有限域(本原多项式 0x11D)──────────────────────────────────
|
|
54
|
+
const GF_EXP = new Uint8Array(512);
|
|
55
|
+
const GF_LOG = new Uint8Array(256);
|
|
56
|
+
{
|
|
57
|
+
let x = 1;
|
|
58
|
+
for (let i = 0; i < 255; i++) {
|
|
59
|
+
GF_EXP[i] = x;
|
|
60
|
+
GF_LOG[x] = i;
|
|
61
|
+
x <<= 1;
|
|
62
|
+
if (x & 0x100)
|
|
63
|
+
x ^= 0x11d;
|
|
64
|
+
}
|
|
65
|
+
for (let i = 255; i < 512; i++)
|
|
66
|
+
GF_EXP[i] = GF_EXP[i - 255];
|
|
67
|
+
}
|
|
68
|
+
function gfMul(a, b) {
|
|
69
|
+
if (a === 0 || b === 0)
|
|
70
|
+
return 0;
|
|
71
|
+
return GF_EXP[GF_LOG[a] + GF_LOG[b]];
|
|
72
|
+
}
|
|
73
|
+
/** Reed-Solomon 生成多项式 g(x) = ∏(x − α^i),i=0..ecc-1。 */
|
|
74
|
+
function rsGeneratorPoly(ecc) {
|
|
75
|
+
const g = new Uint8Array(ecc + 1);
|
|
76
|
+
g[0] = 1;
|
|
77
|
+
for (let i = 0; i < ecc; i++) {
|
|
78
|
+
const next = new Uint8Array(g.length + 1);
|
|
79
|
+
for (let j = 0; j < g.length; j++) {
|
|
80
|
+
if (g[j] !== 0) {
|
|
81
|
+
next[j] ^= g[j];
|
|
82
|
+
next[j + 1] ^= gfMul(g[j], GF_EXP[i]);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
g.set(next.subarray(0, ecc + 1));
|
|
86
|
+
}
|
|
87
|
+
return g;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* 计算一块数据的 ECC 码字(多项式长除法,复刻 qrcode 库 mod 算法)。
|
|
91
|
+
* 生成多项式 g 高次在前(g[0] = x^ecc 系数);每步取被除数首项系数
|
|
92
|
+
* 消元 divisor 对齐项,直至被除数次数 < divisor 次数。
|
|
93
|
+
*/
|
|
94
|
+
function rsComputeEcc(data, ecc) {
|
|
95
|
+
const g = rsGeneratorPoly(ecc);
|
|
96
|
+
// 被除数 = data || 0^ecc(多项式除法余数即 ECC)
|
|
97
|
+
let result = new Uint8Array(data.length + ecc);
|
|
98
|
+
result.set(data);
|
|
99
|
+
let offset = 0;
|
|
100
|
+
while (result.length - offset - g.length >= 0) {
|
|
101
|
+
const coeff = result[offset];
|
|
102
|
+
for (let i = 0; i < g.length; i++) {
|
|
103
|
+
result[offset + i] = (result[offset + i] ^ gfMul(g[i], coeff));
|
|
104
|
+
}
|
|
105
|
+
// 去掉前导零
|
|
106
|
+
while (offset < result.length && result[offset] === 0)
|
|
107
|
+
offset++;
|
|
108
|
+
}
|
|
109
|
+
// 余数(可能短于 ecc,前补零)
|
|
110
|
+
const rem = result.slice(offset);
|
|
111
|
+
const out = new Uint8Array(ecc);
|
|
112
|
+
out.set(rem, ecc - rem.length);
|
|
113
|
+
return out;
|
|
114
|
+
}
|
|
115
|
+
// ── 位流(Byte mode)──────────────────────────────────────────────────
|
|
116
|
+
function buildBitStream(bytes, version, dataCodewords) {
|
|
117
|
+
const bits = [];
|
|
118
|
+
const push = (value, len) => {
|
|
119
|
+
for (let i = len - 1; i >= 0; i--)
|
|
120
|
+
bits.push((value >> i) & 1);
|
|
121
|
+
};
|
|
122
|
+
push(0b0100, 4); // Byte mode
|
|
123
|
+
push(bytes.length, version <= 9 ? 8 : 16);
|
|
124
|
+
for (const b of bytes)
|
|
125
|
+
push(b, 8);
|
|
126
|
+
push(0, Math.min(4, dataCodewords * 8 - bits.length)); // terminator
|
|
127
|
+
while (bits.length % 8 !== 0)
|
|
128
|
+
bits.push(0); // 字节对齐
|
|
129
|
+
let pad = 0xec; // 填充 0xEC/0x11 交替
|
|
130
|
+
while (bits.length < dataCodewords * 8) {
|
|
131
|
+
push(pad, 8);
|
|
132
|
+
pad = pad === 0xec ? 0x11 : 0xec;
|
|
133
|
+
}
|
|
134
|
+
const out = new Uint8Array(dataCodewords);
|
|
135
|
+
for (let i = 0; i < dataCodewords; i++) {
|
|
136
|
+
let v = 0;
|
|
137
|
+
for (let b = 0; b < 8; b++)
|
|
138
|
+
v = (v << 1) | bits[i * 8 + b];
|
|
139
|
+
out[i] = v;
|
|
140
|
+
}
|
|
141
|
+
return out;
|
|
142
|
+
}
|
|
143
|
+
/** 块拆分 + ECC 计算 + 按块轮转交织。 */
|
|
144
|
+
function interleave(data, version) {
|
|
145
|
+
const blocks = BLOCKS_L[version - 1];
|
|
146
|
+
const totalData = TOTAL_CODEWORDS[version - 1] - ECC_PER_BLOCK_L[version - 1] * blocks;
|
|
147
|
+
const eccPerBlock = ECC_PER_BLOCK_L[version - 1];
|
|
148
|
+
const perBlock = totalData / blocks;
|
|
149
|
+
const blockData = [];
|
|
150
|
+
for (let b = 0; b < blocks; b++)
|
|
151
|
+
blockData.push(data.subarray(b * perBlock, (b + 1) * perBlock));
|
|
152
|
+
const eccBlocks = blockData.map((bd) => rsComputeEcc(bd, eccPerBlock));
|
|
153
|
+
const out = new Uint8Array(totalData + blocks * eccPerBlock);
|
|
154
|
+
let i = 0;
|
|
155
|
+
for (let r = 0; r < perBlock; r++)
|
|
156
|
+
for (let b = 0; b < blocks; b++)
|
|
157
|
+
out[i++] = blockData[b][r];
|
|
158
|
+
for (let r = 0; r < eccPerBlock; r++)
|
|
159
|
+
for (let b = 0; b < blocks; b++)
|
|
160
|
+
out[i++] = eccBlocks[b][r];
|
|
161
|
+
return out;
|
|
162
|
+
}
|
|
163
|
+
// ── 掩码与惩罚 ─────────────────────────────────────────────────────────
|
|
164
|
+
/** 掩码 0–7 判定(x, y 为模块坐标)。 */
|
|
165
|
+
export function maskPattern(mask, x, y) {
|
|
166
|
+
switch (mask) {
|
|
167
|
+
case 0:
|
|
168
|
+
return (x + y) % 2 === 0;
|
|
169
|
+
case 1:
|
|
170
|
+
return y % 2 === 0;
|
|
171
|
+
case 2:
|
|
172
|
+
return x % 3 === 0;
|
|
173
|
+
case 3:
|
|
174
|
+
return (x + y) % 3 === 0;
|
|
175
|
+
case 4:
|
|
176
|
+
return (Math.floor(y / 2) + Math.floor(x / 3)) % 2 === 0;
|
|
177
|
+
case 5:
|
|
178
|
+
return ((x * y) % 2) + ((x * y) % 3) === 0;
|
|
179
|
+
case 6:
|
|
180
|
+
return (((x * y) % 2) + ((x * y) % 3)) % 2 === 0;
|
|
181
|
+
case 7:
|
|
182
|
+
return (((x + y) % 2) + ((x * y) % 3)) % 2 === 0;
|
|
183
|
+
default:
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/** 惩罚分(与 qrcode 库 mask-pattern.js 逐位一致:N1/N2/N3 滑动窗口/N4 ceil)。 */
|
|
188
|
+
function penaltyScore(m, size) {
|
|
189
|
+
const get = (y, x) => m[y * size + x];
|
|
190
|
+
let score = 0;
|
|
191
|
+
// N1: 行/列连续同色 ≥5,每多 1 个 +1(count=5→3, 6→4, ...)
|
|
192
|
+
for (let row = 0; row < size; row++) {
|
|
193
|
+
let sameCol = 0;
|
|
194
|
+
let sameRow = 0;
|
|
195
|
+
let lastCol = null;
|
|
196
|
+
let lastRow = null;
|
|
197
|
+
for (let col = 0; col < size; col++) {
|
|
198
|
+
const mc = get(row, col);
|
|
199
|
+
if (mc === lastCol)
|
|
200
|
+
sameCol++;
|
|
201
|
+
else {
|
|
202
|
+
if (sameCol >= 5)
|
|
203
|
+
score += 3 + (sameCol - 5);
|
|
204
|
+
lastCol = mc;
|
|
205
|
+
sameCol = 1;
|
|
206
|
+
}
|
|
207
|
+
const mr = get(col, row);
|
|
208
|
+
if (mr === lastRow)
|
|
209
|
+
sameRow++;
|
|
210
|
+
else {
|
|
211
|
+
if (sameRow >= 5)
|
|
212
|
+
score += 3 + (sameRow - 5);
|
|
213
|
+
lastRow = mr;
|
|
214
|
+
sameRow = 1;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
if (sameCol >= 5)
|
|
218
|
+
score += 3 + (sameCol - 5);
|
|
219
|
+
if (sameRow >= 5)
|
|
220
|
+
score += 3 + (sameRow - 5);
|
|
221
|
+
}
|
|
222
|
+
// N2: 2×2 同色块
|
|
223
|
+
for (let row = 0; row < size - 1; row++) {
|
|
224
|
+
for (let col = 0; col < size - 1; col++) {
|
|
225
|
+
const last = get(row, col) + get(row, col + 1) + get(row + 1, col) + get(row + 1, col + 1);
|
|
226
|
+
if (last === 4 || last === 0)
|
|
227
|
+
score += 3;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
// N3: 11 位滑动窗口匹配 0x5D0(10111010000)或 0x05D(00001011101)
|
|
231
|
+
for (let row = 0; row < size; row++) {
|
|
232
|
+
let bitsCol = 0;
|
|
233
|
+
let bitsRow = 0;
|
|
234
|
+
for (let col = 0; col < size; col++) {
|
|
235
|
+
bitsCol = ((bitsCol << 1) & 0x7ff) | get(row, col);
|
|
236
|
+
if (col >= 10 && (bitsCol === 0x5d0 || bitsCol === 0x05d))
|
|
237
|
+
score += 40;
|
|
238
|
+
bitsRow = ((bitsRow << 1) & 0x7ff) | get(col, row);
|
|
239
|
+
if (col >= 10 && (bitsRow === 0x5d0 || bitsRow === 0x05d))
|
|
240
|
+
score += 40;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// N4: 暗模块比例偏离 50%(ceil 到 5% 步进)
|
|
244
|
+
let dark = 0;
|
|
245
|
+
for (let i = 0; i < size * size; i++)
|
|
246
|
+
dark += m[i];
|
|
247
|
+
const k = Math.abs(Math.ceil((dark * 100) / (size * size) / 5) - 10);
|
|
248
|
+
score += k * 10;
|
|
249
|
+
return score;
|
|
250
|
+
}
|
|
251
|
+
// ── 格式/版本信息 ──────────────────────────────────────────────────────
|
|
252
|
+
/** 求最高有效位编号(qrcode 库 getBCHDigit 同款)。 */
|
|
253
|
+
function bchDigit(value) {
|
|
254
|
+
let digit = 0;
|
|
255
|
+
while (value !== 0) {
|
|
256
|
+
digit++;
|
|
257
|
+
value >>>= 1;
|
|
258
|
+
}
|
|
259
|
+
return digit;
|
|
260
|
+
}
|
|
261
|
+
/** BCH 除法(从实际最高位开始,避免高位置零导致错位)。 */
|
|
262
|
+
function bchRemainder(data, gen, genDigit) {
|
|
263
|
+
let d = data;
|
|
264
|
+
while (bchDigit(d) - genDigit >= 0) {
|
|
265
|
+
d ^= gen << (bchDigit(d) - genDigit);
|
|
266
|
+
}
|
|
267
|
+
return d;
|
|
268
|
+
}
|
|
269
|
+
/** BCH(15,5) 格式信息:data=EC(2b)|mask(3b),纠错后 XOR G15_MASK。 */
|
|
270
|
+
function formatBits(mask) {
|
|
271
|
+
const data = (0b01 << 3) | mask;
|
|
272
|
+
const gen = 0b10100110111;
|
|
273
|
+
const mask15 = 0b101010000010010;
|
|
274
|
+
const d = bchRemainder(data << 10, gen, bchDigit(gen));
|
|
275
|
+
return ((data << 10) | d) ^ mask15;
|
|
276
|
+
}
|
|
277
|
+
/** BCH(18,6) 版本信息(v7+)。 */
|
|
278
|
+
function versionBits(version) {
|
|
279
|
+
const gen = 0b1111100100101;
|
|
280
|
+
const d = bchRemainder(version << 12, gen, bchDigit(gen));
|
|
281
|
+
return (version << 12) | d;
|
|
282
|
+
}
|
|
283
|
+
function newMatrix(version) {
|
|
284
|
+
const size = version * 4 + 17;
|
|
285
|
+
return { size, m: new Uint8Array(size * size), reserved: new Uint8Array(size * size) };
|
|
286
|
+
}
|
|
287
|
+
function drawFinder(matrix, cx, cy) {
|
|
288
|
+
const { size, m, reserved } = matrix;
|
|
289
|
+
// 7×7 图案(±3)+ 分离带(±4);以 finder 中心 (cx, cy) 定位。
|
|
290
|
+
for (let dy = -4; dy <= 4; dy++) {
|
|
291
|
+
for (let dx = -4; dx <= 4; dx++) {
|
|
292
|
+
const x = cx + dx;
|
|
293
|
+
const y = cy + dy;
|
|
294
|
+
if (x < 0 || y < 0 || x >= size || y >= size)
|
|
295
|
+
continue;
|
|
296
|
+
reserved[y * size + x] = 1;
|
|
297
|
+
const inPattern = dx >= -3 && dx <= 3 && dy >= -3 && dy <= 3;
|
|
298
|
+
if (inPattern) {
|
|
299
|
+
const border = Math.abs(dx) === 3 || Math.abs(dy) === 3;
|
|
300
|
+
const inner = Math.abs(dx) <= 1 && Math.abs(dy) <= 1;
|
|
301
|
+
m[y * size + x] = border || inner ? 1 : 0;
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
304
|
+
m[y * size + x] = 0; // 分离带
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
/** 放置功能图案并返回 (matrix, 数据位总长)。 */
|
|
310
|
+
function buildBaseMatrix(version, codewords) {
|
|
311
|
+
const matrix = newMatrix(version);
|
|
312
|
+
const { size, m, reserved } = matrix;
|
|
313
|
+
drawFinder(matrix, 3, 3);
|
|
314
|
+
drawFinder(matrix, size - 4, 3);
|
|
315
|
+
drawFinder(matrix, 3, size - 4);
|
|
316
|
+
// Timing(第 6 行/列)
|
|
317
|
+
for (let i = 8; i < size - 8; i++) {
|
|
318
|
+
const v = i % 2 === 0 ? 1 : 0;
|
|
319
|
+
reserved[6 * size + i] = 1;
|
|
320
|
+
m[6 * size + i] = v;
|
|
321
|
+
reserved[i * size + 6] = 1;
|
|
322
|
+
m[i * size + 6] = v;
|
|
323
|
+
}
|
|
324
|
+
// Alignment(跳过与 finder 重叠)
|
|
325
|
+
const centers = ALIGNMENT_PATTERNS[version - 1];
|
|
326
|
+
for (const cy of centers) {
|
|
327
|
+
for (const cx of centers) {
|
|
328
|
+
const overlaps = (cx <= 6 && cy <= 6) || (cx >= size - 7 && cy <= 6) || (cx <= 6 && cy >= size - 7);
|
|
329
|
+
if (overlaps)
|
|
330
|
+
continue;
|
|
331
|
+
for (let dy = -2; dy <= 2; dy++) {
|
|
332
|
+
for (let dx = -2; dx <= 2; dx++) {
|
|
333
|
+
const x = cx + dx;
|
|
334
|
+
const y = cy + dy;
|
|
335
|
+
reserved[y * size + x] = 1;
|
|
336
|
+
m[y * size + x] = Math.max(Math.abs(dx), Math.abs(dy)) !== 1 ? 1 : 0;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
// Dark module (8, 4·version+9)
|
|
342
|
+
reserved[(version * 4 + 9) * size + 8] = 1;
|
|
343
|
+
m[(version * 4 + 9) * size + 8] = 1;
|
|
344
|
+
// Format info 区域(两处复制)先 reserve——数据 zigzag 不得占用
|
|
345
|
+
// (否则消耗数据位导致后续全部错位)。值在 applyMask 末尾写入。
|
|
346
|
+
// 坐标布局与 qrcode 库 setupFormatInfo 逐位一致(库参数序为 (row=y, col=x))。
|
|
347
|
+
const reserveFormat = (y, x) => {
|
|
348
|
+
if (x >= 0 && y >= 0 && x < size && y < size)
|
|
349
|
+
reserved[y * size + x] = 1;
|
|
350
|
+
};
|
|
351
|
+
for (let i = 0; i < 15; i++) {
|
|
352
|
+
// 垂直段(x=8 列)
|
|
353
|
+
if (i < 6)
|
|
354
|
+
reserveFormat(i, 8);
|
|
355
|
+
else if (i < 8)
|
|
356
|
+
reserveFormat(i + 1, 8);
|
|
357
|
+
else
|
|
358
|
+
reserveFormat(size - 15 + i, 8);
|
|
359
|
+
// 水平段(y=8 行)
|
|
360
|
+
if (i < 8)
|
|
361
|
+
reserveFormat(8, size - i - 1);
|
|
362
|
+
else if (i < 9)
|
|
363
|
+
reserveFormat(8, 15 - i - 1 + 1);
|
|
364
|
+
else
|
|
365
|
+
reserveFormat(8, 15 - i - 1);
|
|
366
|
+
}
|
|
367
|
+
reserveFormat(size - 8, 8); // 固定暗模块
|
|
368
|
+
// Version info 区域(v7+,两处 3×6 对称块;库参数序 (row=y, col=x))
|
|
369
|
+
if (version >= 7) {
|
|
370
|
+
for (let i = 0; i < 18; i++) {
|
|
371
|
+
const y = Math.floor(i / 3);
|
|
372
|
+
const x = (i % 3) + size - 11;
|
|
373
|
+
reserveFormat(y, x);
|
|
374
|
+
reserveFormat(x, y);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
// 数据 zigzag 放置(与 qrcode 库 setupData 逐位一致):
|
|
378
|
+
// 从右下角起,每 2 列一组向上蛇行;跳过第 6 列;reserved 位跳过不消耗位;
|
|
379
|
+
// 数据耗尽后余位继续走(值保持 0,bitIndex 继续递减)。
|
|
380
|
+
let row = size - 1;
|
|
381
|
+
let inc = -1;
|
|
382
|
+
let bitIndex = 7;
|
|
383
|
+
let byteIndex = 0;
|
|
384
|
+
for (let col = size - 1; col > 0; col -= 2) {
|
|
385
|
+
if (col === 6)
|
|
386
|
+
col--;
|
|
387
|
+
for (;;) {
|
|
388
|
+
for (let c = 0; c < 2; c++) {
|
|
389
|
+
const x = col - c;
|
|
390
|
+
const y = row;
|
|
391
|
+
if (reserved[y * size + x] === 0) {
|
|
392
|
+
if (byteIndex < codewords.length) {
|
|
393
|
+
const byte = codewords[byteIndex];
|
|
394
|
+
m[y * size + x] = (byte >> bitIndex) & 1;
|
|
395
|
+
}
|
|
396
|
+
bitIndex--;
|
|
397
|
+
if (bitIndex === -1) {
|
|
398
|
+
byteIndex++;
|
|
399
|
+
bitIndex = 7;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
row += inc;
|
|
404
|
+
if (row < 0 || size <= row) {
|
|
405
|
+
row -= inc;
|
|
406
|
+
inc = -inc;
|
|
407
|
+
break;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
return matrix;
|
|
412
|
+
}
|
|
413
|
+
/** 对数据位应用掩码并绘制 format/version 信息。 */
|
|
414
|
+
function applyMask(matrix, version, mask) {
|
|
415
|
+
const { size, m, reserved } = matrix;
|
|
416
|
+
for (let y = 0; y < size; y++) {
|
|
417
|
+
for (let x = 0; x < size; x++) {
|
|
418
|
+
if (reserved[y * size + x] === 0 && maskPattern(mask, x, y)) {
|
|
419
|
+
m[y * size + x] = m[y * size + x] === 0 ? 1 : 0;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
// Format info(两处复制,坐标布局与 qrcode 库 setupFormatInfo 一致,
|
|
424
|
+
// 库参数序为 (row=y, col=x))
|
|
425
|
+
const bits = formatBits(mask);
|
|
426
|
+
const setFormat = (y, x, bit) => {
|
|
427
|
+
m[y * size + x] = bit;
|
|
428
|
+
};
|
|
429
|
+
for (let i = 0; i < 15; i++) {
|
|
430
|
+
const mod = (bits >> i) & 1;
|
|
431
|
+
// 垂直段(x=8 列)
|
|
432
|
+
if (i < 6)
|
|
433
|
+
setFormat(i, 8, mod);
|
|
434
|
+
else if (i < 8)
|
|
435
|
+
setFormat(i + 1, 8, mod);
|
|
436
|
+
else
|
|
437
|
+
setFormat(size - 15 + i, 8, mod);
|
|
438
|
+
// 水平段(y=8 行)
|
|
439
|
+
if (i < 8)
|
|
440
|
+
setFormat(8, size - i - 1, mod);
|
|
441
|
+
else if (i < 9)
|
|
442
|
+
setFormat(8, 15 - i - 1 + 1, mod);
|
|
443
|
+
else
|
|
444
|
+
setFormat(8, 15 - i - 1, mod);
|
|
445
|
+
}
|
|
446
|
+
setFormat(size - 8, 8, 1); // 固定暗模块
|
|
447
|
+
// Version info(v7+,两处 3×6 对称块)
|
|
448
|
+
if (version >= 7) {
|
|
449
|
+
const vbits = versionBits(version);
|
|
450
|
+
for (let i = 0; i < 18; i++) {
|
|
451
|
+
const bit = (vbits >> i) & 1;
|
|
452
|
+
const y = Math.floor(i / 3);
|
|
453
|
+
const x = (i % 3) + size - 11;
|
|
454
|
+
setFormat(y, x, bit);
|
|
455
|
+
setFormat(x, y, bit);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* 生成 QR 码矩阵(1 = 暗模块)。版本自动选择(1–10,纠错 L),
|
|
461
|
+
* 8 掩码全试 penalty 最低胜出。超长(>271 字节)抛 WeixinError("validation")。
|
|
462
|
+
*/
|
|
463
|
+
export function encodeQrMatrix(payload) {
|
|
464
|
+
const bytes = new TextEncoder().encode(payload);
|
|
465
|
+
if (bytes.length === 0) {
|
|
466
|
+
throw new WeixinError("validation", "QR 载荷为空");
|
|
467
|
+
}
|
|
468
|
+
let version = 0;
|
|
469
|
+
for (let v = 1; v <= 10; v++) {
|
|
470
|
+
if (bytes.length <= CAPACITY_BYTE_L[v - 1]) {
|
|
471
|
+
version = v;
|
|
472
|
+
break;
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
if (version === 0) {
|
|
476
|
+
throw new WeixinError("validation", `QR 载荷过长(${bytes.length} 字节,上限 271)`);
|
|
477
|
+
}
|
|
478
|
+
const dataCodewords = TOTAL_CODEWORDS[version - 1] - ECC_PER_BLOCK_L[version - 1] * BLOCKS_L[version - 1];
|
|
479
|
+
const bitStream = buildBitStream(bytes, version, dataCodewords);
|
|
480
|
+
const codewords = interleave(bitStream, version);
|
|
481
|
+
// 8 掩码全试:penalty 最低者胜出
|
|
482
|
+
let best = null;
|
|
483
|
+
let bestScore = Infinity;
|
|
484
|
+
for (let mask = 0; mask < 8; mask++) {
|
|
485
|
+
const candidate = buildBaseMatrix(version, codewords);
|
|
486
|
+
applyMask(candidate, version, mask);
|
|
487
|
+
const score = penaltyScore(candidate.m, candidate.size);
|
|
488
|
+
if (score < bestScore) {
|
|
489
|
+
bestScore = score;
|
|
490
|
+
best = candidate;
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
return best.m;
|
|
494
|
+
}
|
|
495
|
+
/** 终端渲染:半块字符(00→" "、01→"▀"、10→"▄"、11→"█"),静区 4。 */
|
|
496
|
+
export function renderQrMatrix(matrix, size, scale = 1) {
|
|
497
|
+
const quiet = 4;
|
|
498
|
+
const rows = [];
|
|
499
|
+
// 顶静区(偶数行对齐:静区行全白)
|
|
500
|
+
for (let r = 0; r < quiet / 2; r++)
|
|
501
|
+
rows.push(" ".repeat((size + quiet * 2) * scale));
|
|
502
|
+
for (let y = 0; y < size; y += 2) {
|
|
503
|
+
let line = " ".repeat(quiet * scale);
|
|
504
|
+
for (let x = 0; x < size; x++) {
|
|
505
|
+
const top = y < size ? matrix[y * size + x] : 0;
|
|
506
|
+
const bottom = y + 1 < size ? matrix[(y + 1) * size + x] : 0;
|
|
507
|
+
const pair = (top << 1) | bottom;
|
|
508
|
+
const ch = pair === 0 ? " " : pair === 1 ? "▀" : pair === 2 ? "▄" : "█";
|
|
509
|
+
line += ch.repeat(scale);
|
|
510
|
+
}
|
|
511
|
+
line += " ".repeat(quiet * scale);
|
|
512
|
+
rows.push(line);
|
|
513
|
+
}
|
|
514
|
+
// 底静区
|
|
515
|
+
for (let r = 0; r < quiet / 2; r++)
|
|
516
|
+
rows.push(" ".repeat((size + quiet * 2) * scale));
|
|
517
|
+
return rows;
|
|
518
|
+
}
|
|
519
|
+
/** 便捷入口:payload → 渲染行(静区已含,可直接 stdout)。 */
|
|
520
|
+
export function renderQr(payload, scale = 1) {
|
|
521
|
+
const m = encodeQrMatrix(payload);
|
|
522
|
+
const size = Math.sqrt(m.length);
|
|
523
|
+
return renderQrMatrix(m, size, scale);
|
|
524
|
+
}
|
|
525
|
+
//# sourceMappingURL=qr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qr.js","sourceRoot":"","sources":["../../src/weixin/qr.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2026 harrylabsj
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* 微信远程控制通道(iLink Bot API)——协议 DTO、错误分类与时序配置。
|
|
18
|
+
*
|
|
19
|
+
* 协议学习自 Hermes Agent 的 weixin adapter(gateway/platforms/weixin.py):
|
|
20
|
+
* 腾讯 iLink Bot API(个人微信 bot 身份)。模块语义:
|
|
21
|
+
* - 错误统一 `WeixinError`(code 分类,fail-closed 决策点);
|
|
22
|
+
* - 所有 DTO 只声明我们消费的字段(wire 容忍服务端前向扩展);
|
|
23
|
+
* - 时序全部可注入覆盖(测试用),生产缺省对齐 Hermes 行为。
|
|
24
|
+
*/
|
|
25
|
+
/** iLink 服务默认 base URL(与 Hermes ILINK_BASE_URL 一致)。 */
|
|
26
|
+
export declare const ILINK_DEFAULT_BASE_URL = "https://ilinkai.weixin.qq.com";
|
|
27
|
+
/** iLink 协议错误分类(Hermes 归约;分类逻辑集中在客户端 request())。 */
|
|
28
|
+
export type WeixinErrorCode = "network" | "timeout" | "http" | "redirect" | "response_too_large" | "invalid_json" | "protocol" | "auth" | "session_stale" | "qr_expired" | "validation" | "not_configured";
|
|
29
|
+
/** 微信通道错误(fail-closed:任何协议/校验异常抛此类型,不静默容错)。 */
|
|
30
|
+
export declare class WeixinError extends Error {
|
|
31
|
+
readonly code: WeixinErrorCode;
|
|
32
|
+
constructor(code: WeixinErrorCode, message: string);
|
|
33
|
+
}
|
|
34
|
+
/** confirmed 返回并持久化的 bot 凭证。 */
|
|
35
|
+
export interface BotCredentials {
|
|
36
|
+
/** iLink bot 身份 ID。 */
|
|
37
|
+
ilink_bot_id: string;
|
|
38
|
+
/** bot 访问令牌(仅 base_info 中发送,绝不落日志)。 */
|
|
39
|
+
bot_token: string;
|
|
40
|
+
/** confirmed 携带的 baseurl;后续请求全走它(redirect 后可能变更)。 */
|
|
41
|
+
base_url: string;
|
|
42
|
+
/** 扫描者本人微信用户 ID(= 默认授权身份)。 */
|
|
43
|
+
ilink_user_id: string;
|
|
44
|
+
/** 持久化时间(now() 时钟)。 */
|
|
45
|
+
saved_at: string;
|
|
46
|
+
}
|
|
47
|
+
/** get_bot_qrcode 响应。 */
|
|
48
|
+
export interface BotQrcode {
|
|
49
|
+
/** 二维码 hex token(状态轮询用)。 */
|
|
50
|
+
qrcode: string;
|
|
51
|
+
/** 完整可扫 URL(微信扫一扫实际扫描内容)。 */
|
|
52
|
+
qrcode_img_content: string;
|
|
53
|
+
}
|
|
54
|
+
/** 扫码状态轮询结果(判别联合)。 */
|
|
55
|
+
export type QrcodeStatus = {
|
|
56
|
+
state: "wait" | "scaned";
|
|
57
|
+
} | {
|
|
58
|
+
state: "scaned_but_redirect";
|
|
59
|
+
baseUrl: string;
|
|
60
|
+
} | {
|
|
61
|
+
state: "expired";
|
|
62
|
+
} | {
|
|
63
|
+
state: "confirmed";
|
|
64
|
+
credentials: BotCredentials;
|
|
65
|
+
};
|
|
66
|
+
/** getupdates 里的单条入站消息(只提取消费字段;非文本消息 text="")。 */
|
|
67
|
+
export interface InboundMessage {
|
|
68
|
+
/** 消息来源标识(bot 自身视角)。 */
|
|
69
|
+
account: string;
|
|
70
|
+
from_user_id: string;
|
|
71
|
+
message_id: string;
|
|
72
|
+
/** item_list 中 type:1 的 text_item.text;非文本消息为空串。 */
|
|
73
|
+
text: string;
|
|
74
|
+
/** 回执令牌:回复必须回显((account,user) 缓存)。 */
|
|
75
|
+
context_token: string;
|
|
76
|
+
}
|
|
77
|
+
export interface GetUpdatesResult {
|
|
78
|
+
messages: InboundMessage[];
|
|
79
|
+
/** 下轮轮询游标(服务端返回,逐轮写穿持久化)。 */
|
|
80
|
+
next_sync_buf: string;
|
|
81
|
+
/** 服务端建议长轮询时长(毫秒;首轮缺省 LONG_POLL_DEFAULT_MS)。 */
|
|
82
|
+
longpoll_timeout_ms: number;
|
|
83
|
+
}
|
|
84
|
+
export interface SendMessageInput {
|
|
85
|
+
to_user_id: string;
|
|
86
|
+
text: string;
|
|
87
|
+
/** (account,user) 缓存回显;无则不带。 */
|
|
88
|
+
context_token?: string;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* 时序配置(全部可注入覆盖——测试用;生产缺省对齐 Hermes 行为)。
|
|
92
|
+
*/
|
|
93
|
+
export interface WeixinTimings {
|
|
94
|
+
/** 长轮询 fetch 超时 = server longpoll_timeout + 该余量(毫秒)。 */
|
|
95
|
+
longPollGraceMs: number;
|
|
96
|
+
/** 连续协议错误退避(毫秒)。 */
|
|
97
|
+
protocolBackoffMs: number;
|
|
98
|
+
/** -14 会话过期冷却(毫秒)。 */
|
|
99
|
+
sessionStaleCooldownMs: number;
|
|
100
|
+
/** 网络/HTTP 错误指数退避(毫秒;第 4 次起封顶最后一项)。 */
|
|
101
|
+
httpBackoffMs: readonly [number, number, number, number];
|
|
102
|
+
/** buyer 任务轮询间隔(毫秒;0 = 禁用)。 */
|
|
103
|
+
schedulerTickMs: number;
|
|
104
|
+
/** autopilot 磋商轮询间隔(毫秒;0 = 禁用)。 */
|
|
105
|
+
negotiateTickMs: number;
|
|
106
|
+
/** 去重指纹/context_token 缓存容量。 */
|
|
107
|
+
dedupCap: number;
|
|
108
|
+
/** 二维码轮询间隔(毫秒)。 */
|
|
109
|
+
qrPollMs: number;
|
|
110
|
+
/** 二维码过期刷新上限。 */
|
|
111
|
+
qrRefreshCap: number;
|
|
112
|
+
}
|
|
113
|
+
/** 生产缺省时序(Hermes weixin.py 常量对齐)。 */
|
|
114
|
+
export declare const DEFAULT_WEIXIN_TIMINGS: WeixinTimings;
|