@kangentic/protocol 0.2.0 → 0.3.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/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  // src/version.ts
2
- var PROTOCOL_VERSION = "1";
2
+ var PROTOCOL_VERSION = "2";
3
3
  function encodeProtocolVersion(version = PROTOCOL_VERSION) {
4
4
  return new TextEncoder().encode(`kangentic-bridge-v${version}`);
5
5
  }
@@ -629,12 +629,12 @@ function asciiToBytes(ascii) {
629
629
  });
630
630
  }
631
631
  var isPosBig = (n) => typeof n === "bigint" && _0n <= n;
632
- function inRange(n, min, max) {
633
- return isPosBig(n) && isPosBig(min) && isPosBig(max) && min <= n && n < max;
632
+ function inRange(n, min, max2) {
633
+ return isPosBig(n) && isPosBig(min) && isPosBig(max2) && min <= n && n < max2;
634
634
  }
635
- function aInRange(title, n, min, max) {
636
- if (!inRange(n, min, max))
637
- throw new RangeError("expected valid " + title + ": " + min + " <= n < " + max + ", got " + n);
635
+ function aInRange(title, n, min, max2) {
636
+ if (!inRange(n, min, max2))
637
+ throw new RangeError("expected valid " + title + ": " + min + " <= n < " + max2 + ", got " + n);
638
638
  }
639
639
  function bitLen(n) {
640
640
  if (n < _0n)
@@ -911,10 +911,10 @@ function nLength(n, nBitLength) {
911
911
  throw new Error("invalid n length: expected positive n, got " + n);
912
912
  if (nBitLength !== void 0 && nBitLength < 1)
913
913
  throw new Error("invalid n length: expected positive bit length, got " + nBitLength);
914
- const bits = bitLen(n);
915
- if (nBitLength !== void 0 && nBitLength < bits)
916
- throw new Error(`invalid n length: expected bit length (${bits}) >= n.length (${nBitLength})`);
917
- const _nBitLength = nBitLength !== void 0 ? nBitLength : bits;
914
+ const bits2 = bitLen(n);
915
+ if (nBitLength !== void 0 && nBitLength < bits2)
916
+ throw new Error(`invalid n length: expected bit length (${bits2}) >= n.length (${nBitLength})`);
917
+ const _nBitLength = nBitLength !== void 0 ? nBitLength : bits2;
918
918
  const nByteLength = Math.ceil(_nBitLength / 8);
919
919
  return { nBitLength: _nBitLength, nByteLength };
920
920
  }
@@ -1069,9 +1069,9 @@ function normalizeZ(c, points) {
1069
1069
  const invertedZs = FpInvertBatch(c.Fp, points.map((p) => p.Z));
1070
1070
  return points.map((p, i) => c.fromAffine(p.toAffine(invertedZs[i])));
1071
1071
  }
1072
- function validateW(W, bits) {
1073
- if (!Number.isSafeInteger(W) || W <= 0 || W > bits)
1074
- throw new Error("invalid window size, expected [1.." + bits + "], got W=" + W);
1072
+ function validateW(W, bits2) {
1073
+ if (!Number.isSafeInteger(W) || W <= 0 || W > bits2)
1074
+ throw new Error("invalid window size, expected [1.." + bits2 + "], got W=" + W);
1075
1075
  }
1076
1076
  function calcWOpts(W, scalarBits) {
1077
1077
  validateW(W, scalarBits);
@@ -1084,16 +1084,16 @@ function calcWOpts(W, scalarBits) {
1084
1084
  }
1085
1085
  function calcOffsets(n, window, wOpts) {
1086
1086
  const { windowSize, mask, maxNumber, shiftBy } = wOpts;
1087
- let wbits = Number(n & mask);
1087
+ let wbits2 = Number(n & mask);
1088
1088
  let nextN = n >> shiftBy;
1089
- if (wbits > windowSize) {
1090
- wbits -= maxNumber;
1089
+ if (wbits2 > windowSize) {
1090
+ wbits2 -= maxNumber;
1091
1091
  nextN += _1n3;
1092
1092
  }
1093
1093
  const offsetStart = window * windowSize;
1094
- const offset = offsetStart + Math.abs(wbits) - 1;
1095
- const isZero = wbits === 0;
1096
- const isNeg = wbits < 0;
1094
+ const offset = offsetStart + Math.abs(wbits2) - 1;
1095
+ const isZero = wbits2 === 0;
1096
+ const isNeg = wbits2 < 0;
1097
1097
  const isNegF = window % 2 !== 0;
1098
1098
  const offsetF = offsetStart;
1099
1099
  return { nextN, offset, isZero, isNeg, isNegF, offsetF };
@@ -1113,11 +1113,11 @@ var wNAF = class {
1113
1113
  Fn;
1114
1114
  bits;
1115
1115
  // Parametrized with a given Point class (not individual point)
1116
- constructor(Point, bits) {
1116
+ constructor(Point, bits2) {
1117
1117
  this.BASE = Point.BASE;
1118
1118
  this.ZERO = Point.ZERO;
1119
1119
  this.Fn = Point.Fn;
1120
- this.bits = bits;
1120
+ this.bits = bits2;
1121
1121
  }
1122
1122
  // non-const time multiplication ladder
1123
1123
  _unsafeLadder(elm, n, p = this.ZERO) {
@@ -1261,8 +1261,8 @@ function createCurveFields(type, CURVE, curveOpts = {}, FpFnLE) {
1261
1261
  }
1262
1262
  const Fp2 = createField(CURVE.p, curveOpts.Fp, FpFnLE);
1263
1263
  const Fn2 = createField(CURVE.n, curveOpts.Fn, FpFnLE);
1264
- const _b = type === "weierstrass" ? "b" : "d";
1265
- const params = ["Gx", "Gy", "a", _b];
1264
+ const _b2 = type === "weierstrass" ? "b" : "d";
1265
+ const params = ["Gx", "Gy", "a", _b2];
1266
1266
  for (const p of params) {
1267
1267
  if (!Fp2.isValid(CURVE[p]))
1268
1268
  throw new Error(`CURVE.${p} must be valid field element of CURVE.Fp`);
@@ -1363,8 +1363,8 @@ function edwards(params, extraOpts = {}) {
1363
1363
  const lastByte = bytes[len - 1];
1364
1364
  normed[len - 1] = lastByte & ~128;
1365
1365
  const y = bytesToNumberLE(normed);
1366
- const max = zip215 ? MASK : Fp2.ORDER;
1367
- aInRange("point.y", y, _0n4, max);
1366
+ const max2 = zip215 ? MASK : Fp2.ORDER;
1367
+ aInRange("point.y", y, _0n4, max2);
1368
1368
  const y2 = modP(y * y);
1369
1369
  const u = modP(y2 - _1n4);
1370
1370
  const v = modP(d * y2 - a);
@@ -4178,6 +4178,691 @@ function deriveSessionSlotId(desktopStaticPublicKey, phoneStaticPublicKey) {
4178
4178
  return bytesToHex(deriveLabeledKey(material, SESSION_SLOT_LABEL, SESSION_SLOT_LENGTH));
4179
4179
  }
4180
4180
 
4181
+ // ../../node_modules/fflate/esm/browser.js
4182
+ var u8 = Uint8Array;
4183
+ var u16 = Uint16Array;
4184
+ var i32 = Int32Array;
4185
+ var fleb = new u8([
4186
+ 0,
4187
+ 0,
4188
+ 0,
4189
+ 0,
4190
+ 0,
4191
+ 0,
4192
+ 0,
4193
+ 0,
4194
+ 1,
4195
+ 1,
4196
+ 1,
4197
+ 1,
4198
+ 2,
4199
+ 2,
4200
+ 2,
4201
+ 2,
4202
+ 3,
4203
+ 3,
4204
+ 3,
4205
+ 3,
4206
+ 4,
4207
+ 4,
4208
+ 4,
4209
+ 4,
4210
+ 5,
4211
+ 5,
4212
+ 5,
4213
+ 5,
4214
+ 0,
4215
+ /* unused */
4216
+ 0,
4217
+ 0,
4218
+ /* impossible */
4219
+ 0
4220
+ ]);
4221
+ var fdeb = new u8([
4222
+ 0,
4223
+ 0,
4224
+ 0,
4225
+ 0,
4226
+ 1,
4227
+ 1,
4228
+ 2,
4229
+ 2,
4230
+ 3,
4231
+ 3,
4232
+ 4,
4233
+ 4,
4234
+ 5,
4235
+ 5,
4236
+ 6,
4237
+ 6,
4238
+ 7,
4239
+ 7,
4240
+ 8,
4241
+ 8,
4242
+ 9,
4243
+ 9,
4244
+ 10,
4245
+ 10,
4246
+ 11,
4247
+ 11,
4248
+ 12,
4249
+ 12,
4250
+ 13,
4251
+ 13,
4252
+ /* unused */
4253
+ 0,
4254
+ 0
4255
+ ]);
4256
+ var clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);
4257
+ var freb = function(eb, start) {
4258
+ var b = new u16(31);
4259
+ for (var i = 0; i < 31; ++i) {
4260
+ b[i] = start += 1 << eb[i - 1];
4261
+ }
4262
+ var r = new i32(b[30]);
4263
+ for (var i = 1; i < 30; ++i) {
4264
+ for (var j = b[i]; j < b[i + 1]; ++j) {
4265
+ r[j] = j - b[i] << 5 | i;
4266
+ }
4267
+ }
4268
+ return { b, r };
4269
+ };
4270
+ var _a = freb(fleb, 2);
4271
+ var fl = _a.b;
4272
+ var revfl = _a.r;
4273
+ fl[28] = 258, revfl[258] = 28;
4274
+ var _b = freb(fdeb, 0);
4275
+ var fd = _b.b;
4276
+ var revfd = _b.r;
4277
+ var rev = new u16(32768);
4278
+ for (i = 0; i < 32768; ++i) {
4279
+ x = (i & 43690) >> 1 | (i & 21845) << 1;
4280
+ x = (x & 52428) >> 2 | (x & 13107) << 2;
4281
+ x = (x & 61680) >> 4 | (x & 3855) << 4;
4282
+ rev[i] = ((x & 65280) >> 8 | (x & 255) << 8) >> 1;
4283
+ }
4284
+ var x;
4285
+ var i;
4286
+ var hMap = (function(cd, mb, r) {
4287
+ var s = cd.length;
4288
+ var i = 0;
4289
+ var l = new u16(mb);
4290
+ for (; i < s; ++i) {
4291
+ if (cd[i])
4292
+ ++l[cd[i] - 1];
4293
+ }
4294
+ var le = new u16(mb);
4295
+ for (i = 1; i < mb; ++i) {
4296
+ le[i] = le[i - 1] + l[i - 1] << 1;
4297
+ }
4298
+ var co;
4299
+ if (r) {
4300
+ co = new u16(1 << mb);
4301
+ var rvb = 15 - mb;
4302
+ for (i = 0; i < s; ++i) {
4303
+ if (cd[i]) {
4304
+ var sv = i << 4 | cd[i];
4305
+ var r_1 = mb - cd[i];
4306
+ var v = le[cd[i] - 1]++ << r_1;
4307
+ for (var m = v | (1 << r_1) - 1; v <= m; ++v) {
4308
+ co[rev[v] >> rvb] = sv;
4309
+ }
4310
+ }
4311
+ }
4312
+ } else {
4313
+ co = new u16(s);
4314
+ for (i = 0; i < s; ++i) {
4315
+ if (cd[i]) {
4316
+ co[i] = rev[le[cd[i] - 1]++] >> 15 - cd[i];
4317
+ }
4318
+ }
4319
+ }
4320
+ return co;
4321
+ });
4322
+ var flt = new u8(288);
4323
+ for (i = 0; i < 144; ++i)
4324
+ flt[i] = 8;
4325
+ var i;
4326
+ for (i = 144; i < 256; ++i)
4327
+ flt[i] = 9;
4328
+ var i;
4329
+ for (i = 256; i < 280; ++i)
4330
+ flt[i] = 7;
4331
+ var i;
4332
+ for (i = 280; i < 288; ++i)
4333
+ flt[i] = 8;
4334
+ var i;
4335
+ var fdt = new u8(32);
4336
+ for (i = 0; i < 32; ++i)
4337
+ fdt[i] = 5;
4338
+ var i;
4339
+ var flm = /* @__PURE__ */ hMap(flt, 9, 0);
4340
+ var flrm = /* @__PURE__ */ hMap(flt, 9, 1);
4341
+ var fdm = /* @__PURE__ */ hMap(fdt, 5, 0);
4342
+ var fdrm = /* @__PURE__ */ hMap(fdt, 5, 1);
4343
+ var max = function(a) {
4344
+ var m = a[0];
4345
+ for (var i = 1; i < a.length; ++i) {
4346
+ if (a[i] > m)
4347
+ m = a[i];
4348
+ }
4349
+ return m;
4350
+ };
4351
+ var bits = function(d, p, m) {
4352
+ var o = p / 8 | 0;
4353
+ return (d[o] | d[o + 1] << 8) >> (p & 7) & m;
4354
+ };
4355
+ var bits16 = function(d, p) {
4356
+ var o = p / 8 | 0;
4357
+ return (d[o] | d[o + 1] << 8 | d[o + 2] << 16) >> (p & 7);
4358
+ };
4359
+ var shft = function(p) {
4360
+ return (p + 7) / 8 | 0;
4361
+ };
4362
+ var slc = function(v, s, e) {
4363
+ if (s == null || s < 0)
4364
+ s = 0;
4365
+ if (e == null || e > v.length)
4366
+ e = v.length;
4367
+ return new u8(v.subarray(s, e));
4368
+ };
4369
+ var ec = [
4370
+ "unexpected EOF",
4371
+ "invalid block type",
4372
+ "invalid length/literal",
4373
+ "invalid distance",
4374
+ "stream finished",
4375
+ "no stream handler",
4376
+ ,
4377
+ // determined by compression function
4378
+ "no callback",
4379
+ "invalid UTF-8 data",
4380
+ "extra field too long",
4381
+ "date not in range 1980-2099",
4382
+ "filename too long",
4383
+ "stream finishing",
4384
+ "invalid zip data"
4385
+ // determined by unknown compression method
4386
+ ];
4387
+ var err = function(ind, msg, nt) {
4388
+ var e = new Error(msg || ec[ind]);
4389
+ e.code = ind;
4390
+ if (Error.captureStackTrace)
4391
+ Error.captureStackTrace(e, err);
4392
+ if (!nt)
4393
+ throw e;
4394
+ return e;
4395
+ };
4396
+ var inflt = function(dat, st, buf, dict) {
4397
+ var sl = dat.length, dl = dict ? dict.length : 0;
4398
+ if (!sl || st.f && !st.l)
4399
+ return buf || new u8(0);
4400
+ var noBuf = !buf;
4401
+ var resize = noBuf || st.i != 2;
4402
+ var noSt = st.i;
4403
+ if (noBuf)
4404
+ buf = new u8(sl * 3);
4405
+ var cbuf = function(l2) {
4406
+ var bl = buf.length;
4407
+ if (l2 > bl) {
4408
+ var nbuf = new u8(Math.max(bl * 2, l2));
4409
+ nbuf.set(buf);
4410
+ buf = nbuf;
4411
+ }
4412
+ };
4413
+ var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;
4414
+ var tbts = sl * 8;
4415
+ do {
4416
+ if (!lm) {
4417
+ final = bits(dat, pos, 1);
4418
+ var type = bits(dat, pos + 1, 3);
4419
+ pos += 3;
4420
+ if (!type) {
4421
+ var s = shft(pos) + 4, l = dat[s - 4] | dat[s - 3] << 8, t = s + l;
4422
+ if (t > sl) {
4423
+ if (noSt)
4424
+ err(0);
4425
+ break;
4426
+ }
4427
+ if (resize)
4428
+ cbuf(bt + l);
4429
+ buf.set(dat.subarray(s, t), bt);
4430
+ st.b = bt += l, st.p = pos = t * 8, st.f = final;
4431
+ continue;
4432
+ } else if (type == 1)
4433
+ lm = flrm, dm = fdrm, lbt = 9, dbt = 5;
4434
+ else if (type == 2) {
4435
+ var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;
4436
+ var tl = hLit + bits(dat, pos + 5, 31) + 1;
4437
+ pos += 14;
4438
+ var ldt = new u8(tl);
4439
+ var clt = new u8(19);
4440
+ for (var i = 0; i < hcLen; ++i) {
4441
+ clt[clim[i]] = bits(dat, pos + i * 3, 7);
4442
+ }
4443
+ pos += hcLen * 3;
4444
+ var clb = max(clt), clbmsk = (1 << clb) - 1;
4445
+ var clm = hMap(clt, clb, 1);
4446
+ for (var i = 0; i < tl; ) {
4447
+ var r = clm[bits(dat, pos, clbmsk)];
4448
+ pos += r & 15;
4449
+ var s = r >> 4;
4450
+ if (s < 16) {
4451
+ ldt[i++] = s;
4452
+ } else {
4453
+ var c = 0, n = 0;
4454
+ if (s == 16)
4455
+ n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];
4456
+ else if (s == 17)
4457
+ n = 3 + bits(dat, pos, 7), pos += 3;
4458
+ else if (s == 18)
4459
+ n = 11 + bits(dat, pos, 127), pos += 7;
4460
+ while (n--)
4461
+ ldt[i++] = c;
4462
+ }
4463
+ }
4464
+ var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);
4465
+ lbt = max(lt);
4466
+ dbt = max(dt);
4467
+ lm = hMap(lt, lbt, 1);
4468
+ dm = hMap(dt, dbt, 1);
4469
+ } else
4470
+ err(1);
4471
+ if (pos > tbts) {
4472
+ if (noSt)
4473
+ err(0);
4474
+ break;
4475
+ }
4476
+ }
4477
+ if (resize)
4478
+ cbuf(bt + 131072);
4479
+ var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;
4480
+ var lpos = pos;
4481
+ for (; ; lpos = pos) {
4482
+ var c = lm[bits16(dat, pos) & lms], sym = c >> 4;
4483
+ pos += c & 15;
4484
+ if (pos > tbts) {
4485
+ if (noSt)
4486
+ err(0);
4487
+ break;
4488
+ }
4489
+ if (!c)
4490
+ err(2);
4491
+ if (sym < 256)
4492
+ buf[bt++] = sym;
4493
+ else if (sym == 256) {
4494
+ lpos = pos, lm = null;
4495
+ break;
4496
+ } else {
4497
+ var add2 = sym - 254;
4498
+ if (sym > 264) {
4499
+ var i = sym - 257, b = fleb[i];
4500
+ add2 = bits(dat, pos, (1 << b) - 1) + fl[i];
4501
+ pos += b;
4502
+ }
4503
+ var d = dm[bits16(dat, pos) & dms], dsym = d >> 4;
4504
+ if (!d)
4505
+ err(3);
4506
+ pos += d & 15;
4507
+ var dt = fd[dsym];
4508
+ if (dsym > 3) {
4509
+ var b = fdeb[dsym];
4510
+ dt += bits16(dat, pos) & (1 << b) - 1, pos += b;
4511
+ }
4512
+ if (pos > tbts) {
4513
+ if (noSt)
4514
+ err(0);
4515
+ break;
4516
+ }
4517
+ if (resize)
4518
+ cbuf(bt + 131072);
4519
+ var end = bt + add2;
4520
+ if (bt < dt) {
4521
+ var shift = dl - dt, dend = Math.min(dt, end);
4522
+ if (shift + bt < 0)
4523
+ err(3);
4524
+ for (; bt < dend; ++bt)
4525
+ buf[bt] = dict[shift + bt];
4526
+ }
4527
+ for (; bt < end; ++bt)
4528
+ buf[bt] = buf[bt - dt];
4529
+ }
4530
+ }
4531
+ st.l = lm, st.p = lpos, st.b = bt, st.f = final;
4532
+ if (lm)
4533
+ final = 1, st.m = lbt, st.d = dm, st.n = dbt;
4534
+ } while (!final);
4535
+ return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt);
4536
+ };
4537
+ var wbits = function(d, p, v) {
4538
+ v <<= p & 7;
4539
+ var o = p / 8 | 0;
4540
+ d[o] |= v;
4541
+ d[o + 1] |= v >> 8;
4542
+ };
4543
+ var wbits16 = function(d, p, v) {
4544
+ v <<= p & 7;
4545
+ var o = p / 8 | 0;
4546
+ d[o] |= v;
4547
+ d[o + 1] |= v >> 8;
4548
+ d[o + 2] |= v >> 16;
4549
+ };
4550
+ var hTree = function(d, mb) {
4551
+ var t = [];
4552
+ for (var i = 0; i < d.length; ++i) {
4553
+ if (d[i])
4554
+ t.push({ s: i, f: d[i] });
4555
+ }
4556
+ var s = t.length;
4557
+ var t2 = t.slice();
4558
+ if (!s)
4559
+ return { t: et, l: 0 };
4560
+ if (s == 1) {
4561
+ var v = new u8(t[0].s + 1);
4562
+ v[t[0].s] = 1;
4563
+ return { t: v, l: 1 };
4564
+ }
4565
+ t.sort(function(a, b) {
4566
+ return a.f - b.f;
4567
+ });
4568
+ t.push({ s: -1, f: 25001 });
4569
+ var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;
4570
+ t[0] = { s: -1, f: l.f + r.f, l, r };
4571
+ while (i1 != s - 1) {
4572
+ l = t[t[i0].f < t[i2].f ? i0++ : i2++];
4573
+ r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];
4574
+ t[i1++] = { s: -1, f: l.f + r.f, l, r };
4575
+ }
4576
+ var maxSym = t2[0].s;
4577
+ for (var i = 1; i < s; ++i) {
4578
+ if (t2[i].s > maxSym)
4579
+ maxSym = t2[i].s;
4580
+ }
4581
+ var tr = new u16(maxSym + 1);
4582
+ var mbt = ln(t[i1 - 1], tr, 0);
4583
+ if (mbt > mb) {
4584
+ var i = 0, dt = 0;
4585
+ var lft = mbt - mb, cst = 1 << lft;
4586
+ t2.sort(function(a, b) {
4587
+ return tr[b.s] - tr[a.s] || a.f - b.f;
4588
+ });
4589
+ for (; i < s; ++i) {
4590
+ var i2_1 = t2[i].s;
4591
+ if (tr[i2_1] > mb) {
4592
+ dt += cst - (1 << mbt - tr[i2_1]);
4593
+ tr[i2_1] = mb;
4594
+ } else
4595
+ break;
4596
+ }
4597
+ dt >>= lft;
4598
+ while (dt > 0) {
4599
+ var i2_2 = t2[i].s;
4600
+ if (tr[i2_2] < mb)
4601
+ dt -= 1 << mb - tr[i2_2]++ - 1;
4602
+ else
4603
+ ++i;
4604
+ }
4605
+ for (; i >= 0 && dt; --i) {
4606
+ var i2_3 = t2[i].s;
4607
+ if (tr[i2_3] == mb) {
4608
+ --tr[i2_3];
4609
+ ++dt;
4610
+ }
4611
+ }
4612
+ mbt = mb;
4613
+ }
4614
+ return { t: new u8(tr), l: mbt };
4615
+ };
4616
+ var ln = function(n, l, d) {
4617
+ return n.s == -1 ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1)) : l[n.s] = d;
4618
+ };
4619
+ var lc = function(c) {
4620
+ var s = c.length;
4621
+ while (s && !c[--s])
4622
+ ;
4623
+ var cl = new u16(++s);
4624
+ var cli = 0, cln = c[0], cls = 1;
4625
+ var w = function(v) {
4626
+ cl[cli++] = v;
4627
+ };
4628
+ for (var i = 1; i <= s; ++i) {
4629
+ if (c[i] == cln && i != s)
4630
+ ++cls;
4631
+ else {
4632
+ if (!cln && cls > 2) {
4633
+ for (; cls > 138; cls -= 138)
4634
+ w(32754);
4635
+ if (cls > 2) {
4636
+ w(cls > 10 ? cls - 11 << 5 | 28690 : cls - 3 << 5 | 12305);
4637
+ cls = 0;
4638
+ }
4639
+ } else if (cls > 3) {
4640
+ w(cln), --cls;
4641
+ for (; cls > 6; cls -= 6)
4642
+ w(8304);
4643
+ if (cls > 2)
4644
+ w(cls - 3 << 5 | 8208), cls = 0;
4645
+ }
4646
+ while (cls--)
4647
+ w(cln);
4648
+ cls = 1;
4649
+ cln = c[i];
4650
+ }
4651
+ }
4652
+ return { c: cl.subarray(0, cli), n: s };
4653
+ };
4654
+ var clen = function(cf, cl) {
4655
+ var l = 0;
4656
+ for (var i = 0; i < cl.length; ++i)
4657
+ l += cf[i] * cl[i];
4658
+ return l;
4659
+ };
4660
+ var wfblk = function(out, pos, dat) {
4661
+ var s = dat.length;
4662
+ var o = shft(pos + 2);
4663
+ out[o] = s & 255;
4664
+ out[o + 1] = s >> 8;
4665
+ out[o + 2] = out[o] ^ 255;
4666
+ out[o + 3] = out[o + 1] ^ 255;
4667
+ for (var i = 0; i < s; ++i)
4668
+ out[o + i + 4] = dat[i];
4669
+ return (o + 4 + s) * 8;
4670
+ };
4671
+ var wblk = function(dat, out, final, syms, lf, df, eb, li, bs, bl, p) {
4672
+ wbits(out, p++, final);
4673
+ ++lf[256];
4674
+ var _a2 = hTree(lf, 15), dlt = _a2.t, mlb = _a2.l;
4675
+ var _b2 = hTree(df, 15), ddt = _b2.t, mdb = _b2.l;
4676
+ var _c = lc(dlt), lclt = _c.c, nlc = _c.n;
4677
+ var _d = lc(ddt), lcdt = _d.c, ndc = _d.n;
4678
+ var lcfreq = new u16(19);
4679
+ for (var i = 0; i < lclt.length; ++i)
4680
+ ++lcfreq[lclt[i] & 31];
4681
+ for (var i = 0; i < lcdt.length; ++i)
4682
+ ++lcfreq[lcdt[i] & 31];
4683
+ var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l;
4684
+ var nlcc = 19;
4685
+ for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)
4686
+ ;
4687
+ var flen = bl + 5 << 3;
4688
+ var ftlen = clen(lf, flt) + clen(df, fdt) + eb;
4689
+ var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18];
4690
+ if (bs >= 0 && flen <= ftlen && flen <= dtlen)
4691
+ return wfblk(out, p, dat.subarray(bs, bs + bl));
4692
+ var lm, ll, dm, dl;
4693
+ wbits(out, p, 1 + (dtlen < ftlen)), p += 2;
4694
+ if (dtlen < ftlen) {
4695
+ lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;
4696
+ var llm = hMap(lct, mlcb, 0);
4697
+ wbits(out, p, nlc - 257);
4698
+ wbits(out, p + 5, ndc - 1);
4699
+ wbits(out, p + 10, nlcc - 4);
4700
+ p += 14;
4701
+ for (var i = 0; i < nlcc; ++i)
4702
+ wbits(out, p + 3 * i, lct[clim[i]]);
4703
+ p += 3 * nlcc;
4704
+ var lcts = [lclt, lcdt];
4705
+ for (var it = 0; it < 2; ++it) {
4706
+ var clct = lcts[it];
4707
+ for (var i = 0; i < clct.length; ++i) {
4708
+ var len = clct[i] & 31;
4709
+ wbits(out, p, llm[len]), p += lct[len];
4710
+ if (len > 15)
4711
+ wbits(out, p, clct[i] >> 5 & 127), p += clct[i] >> 12;
4712
+ }
4713
+ }
4714
+ } else {
4715
+ lm = flm, ll = flt, dm = fdm, dl = fdt;
4716
+ }
4717
+ for (var i = 0; i < li; ++i) {
4718
+ var sym = syms[i];
4719
+ if (sym > 255) {
4720
+ var len = sym >> 18 & 31;
4721
+ wbits16(out, p, lm[len + 257]), p += ll[len + 257];
4722
+ if (len > 7)
4723
+ wbits(out, p, sym >> 23 & 31), p += fleb[len];
4724
+ var dst = sym & 31;
4725
+ wbits16(out, p, dm[dst]), p += dl[dst];
4726
+ if (dst > 3)
4727
+ wbits16(out, p, sym >> 5 & 8191), p += fdeb[dst];
4728
+ } else {
4729
+ wbits16(out, p, lm[sym]), p += ll[sym];
4730
+ }
4731
+ }
4732
+ wbits16(out, p, lm[256]);
4733
+ return p + ll[256];
4734
+ };
4735
+ var deo = /* @__PURE__ */ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);
4736
+ var et = /* @__PURE__ */ new u8(0);
4737
+ var dflt = function(dat, lvl, plvl, pre, post, st) {
4738
+ var s = st.z || dat.length;
4739
+ var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7e3)) + post);
4740
+ var w = o.subarray(pre, o.length - post);
4741
+ var lst = st.l;
4742
+ var pos = (st.r || 0) & 7;
4743
+ if (lvl) {
4744
+ if (pos)
4745
+ w[0] = st.r >> 3;
4746
+ var opt = deo[lvl - 1];
4747
+ var n = opt >> 13, c = opt & 8191;
4748
+ var msk_1 = (1 << plvl) - 1;
4749
+ var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1);
4750
+ var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;
4751
+ var hsh = function(i2) {
4752
+ return (dat[i2] ^ dat[i2 + 1] << bs1_1 ^ dat[i2 + 2] << bs2_1) & msk_1;
4753
+ };
4754
+ var syms = new i32(25e3);
4755
+ var lf = new u16(288), df = new u16(32);
4756
+ var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0;
4757
+ for (; i + 2 < s; ++i) {
4758
+ var hv = hsh(i);
4759
+ var imod = i & 32767, pimod = head[hv];
4760
+ prev[imod] = pimod;
4761
+ head[hv] = imod;
4762
+ if (wi <= i) {
4763
+ var rem = s - i;
4764
+ if ((lc_1 > 7e3 || li > 24576) && (rem > 423 || !lst)) {
4765
+ pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);
4766
+ li = lc_1 = eb = 0, bs = i;
4767
+ for (var j = 0; j < 286; ++j)
4768
+ lf[j] = 0;
4769
+ for (var j = 0; j < 30; ++j)
4770
+ df[j] = 0;
4771
+ }
4772
+ var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767;
4773
+ if (rem > 2 && hv == hsh(i - dif)) {
4774
+ var maxn = Math.min(n, rem) - 1;
4775
+ var maxd = Math.min(32767, i);
4776
+ var ml = Math.min(258, rem);
4777
+ while (dif <= maxd && --ch_1 && imod != pimod) {
4778
+ if (dat[i + l] == dat[i + l - dif]) {
4779
+ var nl = 0;
4780
+ for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)
4781
+ ;
4782
+ if (nl > l) {
4783
+ l = nl, d = dif;
4784
+ if (nl > maxn)
4785
+ break;
4786
+ var mmd = Math.min(dif, nl - 2);
4787
+ var md = 0;
4788
+ for (var j = 0; j < mmd; ++j) {
4789
+ var ti = i - dif + j & 32767;
4790
+ var pti = prev[ti];
4791
+ var cd = ti - pti & 32767;
4792
+ if (cd > md)
4793
+ md = cd, pimod = ti;
4794
+ }
4795
+ }
4796
+ }
4797
+ imod = pimod, pimod = prev[imod];
4798
+ dif += imod - pimod & 32767;
4799
+ }
4800
+ }
4801
+ if (d) {
4802
+ syms[li++] = 268435456 | revfl[l] << 18 | revfd[d];
4803
+ var lin = revfl[l] & 31, din = revfd[d] & 31;
4804
+ eb += fleb[lin] + fdeb[din];
4805
+ ++lf[257 + lin];
4806
+ ++df[din];
4807
+ wi = i + l;
4808
+ ++lc_1;
4809
+ } else {
4810
+ syms[li++] = dat[i];
4811
+ ++lf[dat[i]];
4812
+ }
4813
+ }
4814
+ }
4815
+ for (i = Math.max(i, wi); i < s; ++i) {
4816
+ syms[li++] = dat[i];
4817
+ ++lf[dat[i]];
4818
+ }
4819
+ pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);
4820
+ if (!lst) {
4821
+ st.r = pos & 7 | w[pos / 8 | 0] << 3;
4822
+ pos -= 7;
4823
+ st.h = head, st.p = prev, st.i = i, st.w = wi;
4824
+ }
4825
+ } else {
4826
+ for (var i = st.w || 0; i < s + lst; i += 65535) {
4827
+ var e = i + 65535;
4828
+ if (e >= s) {
4829
+ w[pos / 8 | 0] = lst;
4830
+ e = s;
4831
+ }
4832
+ pos = wfblk(w, pos + 1, dat.subarray(i, e));
4833
+ }
4834
+ st.i = s;
4835
+ }
4836
+ return slc(o, 0, pre + shft(pos) + post);
4837
+ };
4838
+ var dopt = function(dat, opt, pre, post, st) {
4839
+ if (!st) {
4840
+ st = { l: 1 };
4841
+ if (opt.dictionary) {
4842
+ var dict = opt.dictionary.subarray(-32768);
4843
+ var newDat = new u8(dict.length + dat.length);
4844
+ newDat.set(dict);
4845
+ newDat.set(dat, dict.length);
4846
+ dat = newDat;
4847
+ st.w = dict.length;
4848
+ }
4849
+ }
4850
+ return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? st.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 20 : 12 + opt.mem, pre, post, st);
4851
+ };
4852
+ function deflateSync(data, opts) {
4853
+ return dopt(data, opts || {}, 0, 0);
4854
+ }
4855
+ function inflateSync(data, opts) {
4856
+ return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary);
4857
+ }
4858
+ var td = typeof TextDecoder != "undefined" && /* @__PURE__ */ new TextDecoder();
4859
+ var tds = 0;
4860
+ try {
4861
+ td.decode(et, { stream: true });
4862
+ tds = 1;
4863
+ } catch (e) {
4864
+ }
4865
+
4181
4866
  // src/capabilities/verbs.ts
4182
4867
  var CAPABILITY_VERBS = [
4183
4868
  "read-stream",
@@ -4219,18 +4904,53 @@ function isRecord(value) {
4219
4904
 
4220
4905
  // src/wire/framing.ts
4221
4906
  var MAX_FRAME_LENGTH = 1024 * 1024;
4907
+ var MAX_DECODED_LENGTH = 4 * 1024 * 1024;
4908
+ var COMPRESSION_THRESHOLD = 4 * 1024;
4909
+ var FRAME_FORMAT_DEFLATE = 1;
4910
+ var JSON_OPEN_BRACE = 123;
4911
+ var DEFLATE_HEADER_LENGTH = 5;
4222
4912
  function encodeMessage(message) {
4223
- const bytes = new TextEncoder().encode(JSON.stringify(message));
4224
- if (bytes.length > MAX_FRAME_LENGTH) {
4913
+ const json = new TextEncoder().encode(JSON.stringify(message));
4914
+ if (json.length > MAX_DECODED_LENGTH) {
4915
+ throw new Error(`Encoded bridge message exceeds ${MAX_DECODED_LENGTH} bytes before compression`);
4916
+ }
4917
+ let frame = json;
4918
+ if (json.length > COMPRESSION_THRESHOLD) {
4919
+ const compressed = deflateSync(json);
4920
+ if (compressed.length + DEFLATE_HEADER_LENGTH < json.length) {
4921
+ frame = new Uint8Array(DEFLATE_HEADER_LENGTH + compressed.length);
4922
+ frame[0] = FRAME_FORMAT_DEFLATE;
4923
+ new DataView(frame.buffer).setUint32(1, json.length, true);
4924
+ frame.set(compressed, DEFLATE_HEADER_LENGTH);
4925
+ }
4926
+ }
4927
+ if (frame.length > MAX_FRAME_LENGTH) {
4225
4928
  throw new Error(`Encoded bridge message exceeds ${MAX_FRAME_LENGTH} bytes`);
4226
4929
  }
4227
- return bytes;
4930
+ return frame;
4228
4931
  }
4229
4932
  function decodeMessage(bytes) {
4230
4933
  if (bytes.length > MAX_FRAME_LENGTH) {
4231
4934
  throw new Error(`Bridge message frame exceeds ${MAX_FRAME_LENGTH} bytes`);
4232
4935
  }
4233
- const parsed = JSON.parse(new TextDecoder().decode(bytes));
4936
+ if (bytes.length === 0) throw new Error("Bridge message frame is empty");
4937
+ let json;
4938
+ if (bytes[0] === JSON_OPEN_BRACE) {
4939
+ json = bytes;
4940
+ } else if (bytes[0] === FRAME_FORMAT_DEFLATE) {
4941
+ if (bytes.length < DEFLATE_HEADER_LENGTH + 1) throw new Error("Compressed bridge message frame is truncated");
4942
+ const declaredLength = new DataView(bytes.buffer, bytes.byteOffset).getUint32(1, true);
4943
+ if (declaredLength === 0 || declaredLength > MAX_DECODED_LENGTH) {
4944
+ throw new Error(`Compressed bridge message declares an invalid decoded length: ${declaredLength}`);
4945
+ }
4946
+ json = inflateSync(bytes.subarray(DEFLATE_HEADER_LENGTH), { out: new Uint8Array(declaredLength) });
4947
+ if (json.length !== declaredLength) {
4948
+ throw new Error("Compressed bridge message decoded length does not match its declaration");
4949
+ }
4950
+ } else {
4951
+ throw new Error(`Unknown bridge message frame format: 0x${bytes[0].toString(16)}`);
4952
+ }
4953
+ const parsed = JSON.parse(new TextDecoder().decode(json));
4234
4954
  return validateBridgeMessage(parsed);
4235
4955
  }
4236
4956
  function validateEvent(event) {
@@ -4359,6 +5079,24 @@ function parseTranscriptEntriesWire(payload) {
4359
5079
  return entry;
4360
5080
  });
4361
5081
  }
5082
+ function parseTranscriptEventPayload(payload) {
5083
+ if (!isRecord(payload)) throw new Error("transcript payload must be an object");
5084
+ const revision = requireNumber(payload, "revision", "transcript payload");
5085
+ const totalEntries = requireNumber(payload, "totalEntries", "transcript payload");
5086
+ if (!Number.isInteger(revision) || revision < 0) throw new Error('transcript payload has an invalid "revision"');
5087
+ if (!Number.isInteger(totalEntries) || totalEntries < 0) throw new Error('transcript payload has an invalid "totalEntries"');
5088
+ if (payload.mode === "reset") return { mode: "reset", revision, totalEntries };
5089
+ if (payload.mode !== "delta") throw new Error('transcript payload has an invalid "mode"');
5090
+ if (!Array.isArray(payload.upserts)) throw new Error('transcript delta is missing "upserts"');
5091
+ const upserts = payload.upserts.map((upsert, position) => {
5092
+ if (!isRecord(upsert) || typeof upsert.index !== "number" || !Number.isInteger(upsert.index) || upsert.index < 0) {
5093
+ throw new Error(`transcript delta upsert ${position} has an invalid "index"`);
5094
+ }
5095
+ if (!isTranscriptEntryWire(upsert.entry)) throw new Error(`transcript delta upsert ${position} has a malformed "entry"`);
5096
+ return { index: upsert.index, entry: upsert.entry };
5097
+ });
5098
+ return { mode: "delta", revision, totalEntries, upserts };
5099
+ }
4362
5100
  function isActivityStateWire(value) {
4363
5101
  return value === "thinking" || value === "idle" || value === "permission";
4364
5102
  }
@@ -4537,13 +5275,45 @@ function parseReadStreamResponsePayload(payload) {
4537
5275
  awaitedPromptId: payload.awaitedPromptId ?? null
4538
5276
  };
4539
5277
  }
5278
+ function parseTranscriptWindowResponsePayload(payload) {
5279
+ if (!isRecord(payload)) throw new Error("transcript-window response must be an object");
5280
+ const { revision, totalEntries, startIndex } = payload;
5281
+ if (typeof revision !== "number" || !Number.isInteger(revision) || revision < 0) {
5282
+ throw new Error('transcript-window response has an invalid "revision"');
5283
+ }
5284
+ if (typeof totalEntries !== "number" || !Number.isInteger(totalEntries) || totalEntries < 0) {
5285
+ throw new Error('transcript-window response has an invalid "totalEntries"');
5286
+ }
5287
+ if (typeof startIndex !== "number" || !Number.isInteger(startIndex) || startIndex < 0) {
5288
+ throw new Error('transcript-window response has an invalid "startIndex"');
5289
+ }
5290
+ return {
5291
+ revision,
5292
+ totalEntries,
5293
+ startIndex,
5294
+ entries: parseTranscriptEntriesWire(payload.entries)
5295
+ };
5296
+ }
4540
5297
  function parseReadStreamRequestPayload(payload) {
4541
5298
  if (!isRecord(payload)) throw new Error("read-stream payload must be an object");
4542
5299
  if (typeof payload.sessionId !== "string") throw new Error('read-stream payload missing "sessionId"');
4543
- if (payload.action !== "subscribe" && payload.action !== "unsubscribe") {
5300
+ if (payload.action !== "subscribe" && payload.action !== "unsubscribe" && payload.action !== "transcript-window") {
4544
5301
  throw new Error('read-stream payload has an invalid "action"');
4545
5302
  }
4546
- return { sessionId: payload.sessionId, action: payload.action };
5303
+ const request = { sessionId: payload.sessionId, action: payload.action };
5304
+ if (payload.beforeIndex !== void 0) {
5305
+ if (typeof payload.beforeIndex !== "number" || !Number.isInteger(payload.beforeIndex) || payload.beforeIndex < 0) {
5306
+ throw new Error('read-stream payload has an invalid "beforeIndex"');
5307
+ }
5308
+ request.beforeIndex = payload.beforeIndex;
5309
+ }
5310
+ if (payload.limit !== void 0) {
5311
+ if (typeof payload.limit !== "number" || !Number.isInteger(payload.limit) || payload.limit < 1) {
5312
+ throw new Error('read-stream payload has an invalid "limit"');
5313
+ }
5314
+ request.limit = payload.limit;
5315
+ }
5316
+ return request;
4547
5317
  }
4548
5318
  function parseReadBoardResponsePayload(payload) {
4549
5319
  if (!isRecord(payload)) throw new Error("read-board response must be an object");
@@ -4892,7 +5662,7 @@ function isBridgeEvent(value) {
4892
5662
  case "transcript": {
4893
5663
  if (typeof value.sessionId !== "string" || typeof value.taskId !== "string") return false;
4894
5664
  try {
4895
- parseTranscriptEntriesWire(value.payload);
5665
+ parseTranscriptEventPayload(value.payload);
4896
5666
  return true;
4897
5667
  } catch {
4898
5668
  return false;
@@ -4929,12 +5699,14 @@ export {
4929
5699
  BOARD_TOOL_READ_NAMES,
4930
5700
  BOARD_TOOL_WRITE_NAMES,
4931
5701
  CAPABILITY_VERBS,
5702
+ COMPRESSION_THRESHOLD,
4932
5703
  CipherState,
4933
5704
  ED25519_KEY_LENGTH,
4934
5705
  FrameTag,
4935
5706
  HandshakeState,
4936
5707
  IKPSK0_PATTERN,
4937
5708
  KK_PATTERN,
5709
+ MAX_DECODED_LENGTH,
4938
5710
  MAX_FRAME_LENGTH,
4939
5711
  PAIRING_URI_SCHEME,
4940
5712
  PROTOCOL_VERSION,
@@ -4983,6 +5755,8 @@ export {
4983
5755
  parseSessionEventWire,
4984
5756
  parseSessionUsageWire,
4985
5757
  parseTranscriptEntriesWire,
5758
+ parseTranscriptEventPayload,
5759
+ parseTranscriptWindowResponsePayload,
4986
5760
  randomBytes4 as randomBytes,
4987
5761
  rosterDeviceCapabilitySet,
4988
5762
  signRosterEntry,