@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.cjs CHANGED
@@ -23,12 +23,14 @@ __export(index_exports, {
23
23
  BOARD_TOOL_READ_NAMES: () => BOARD_TOOL_READ_NAMES,
24
24
  BOARD_TOOL_WRITE_NAMES: () => BOARD_TOOL_WRITE_NAMES,
25
25
  CAPABILITY_VERBS: () => CAPABILITY_VERBS,
26
+ COMPRESSION_THRESHOLD: () => COMPRESSION_THRESHOLD,
26
27
  CipherState: () => CipherState,
27
28
  ED25519_KEY_LENGTH: () => ED25519_KEY_LENGTH,
28
29
  FrameTag: () => FrameTag,
29
30
  HandshakeState: () => HandshakeState,
30
31
  IKPSK0_PATTERN: () => IKPSK0_PATTERN,
31
32
  KK_PATTERN: () => KK_PATTERN,
33
+ MAX_DECODED_LENGTH: () => MAX_DECODED_LENGTH,
32
34
  MAX_FRAME_LENGTH: () => MAX_FRAME_LENGTH,
33
35
  PAIRING_URI_SCHEME: () => PAIRING_URI_SCHEME,
34
36
  PROTOCOL_VERSION: () => PROTOCOL_VERSION,
@@ -77,6 +79,8 @@ __export(index_exports, {
77
79
  parseSessionEventWire: () => parseSessionEventWire,
78
80
  parseSessionUsageWire: () => parseSessionUsageWire,
79
81
  parseTranscriptEntriesWire: () => parseTranscriptEntriesWire,
82
+ parseTranscriptEventPayload: () => parseTranscriptEventPayload,
83
+ parseTranscriptWindowResponsePayload: () => parseTranscriptWindowResponsePayload,
80
84
  randomBytes: () => randomBytes4,
81
85
  rosterDeviceCapabilitySet: () => rosterDeviceCapabilitySet,
82
86
  signRosterEntry: () => signRosterEntry,
@@ -88,7 +92,7 @@ __export(index_exports, {
88
92
  module.exports = __toCommonJS(index_exports);
89
93
 
90
94
  // src/version.ts
91
- var PROTOCOL_VERSION = "1";
95
+ var PROTOCOL_VERSION = "2";
92
96
  function encodeProtocolVersion(version = PROTOCOL_VERSION) {
93
97
  return new TextEncoder().encode(`kangentic-bridge-v${version}`);
94
98
  }
@@ -718,12 +722,12 @@ function asciiToBytes(ascii) {
718
722
  });
719
723
  }
720
724
  var isPosBig = (n) => typeof n === "bigint" && _0n <= n;
721
- function inRange(n, min, max) {
722
- return isPosBig(n) && isPosBig(min) && isPosBig(max) && min <= n && n < max;
725
+ function inRange(n, min, max2) {
726
+ return isPosBig(n) && isPosBig(min) && isPosBig(max2) && min <= n && n < max2;
723
727
  }
724
- function aInRange(title, n, min, max) {
725
- if (!inRange(n, min, max))
726
- throw new RangeError("expected valid " + title + ": " + min + " <= n < " + max + ", got " + n);
728
+ function aInRange(title, n, min, max2) {
729
+ if (!inRange(n, min, max2))
730
+ throw new RangeError("expected valid " + title + ": " + min + " <= n < " + max2 + ", got " + n);
727
731
  }
728
732
  function bitLen(n) {
729
733
  if (n < _0n)
@@ -1000,10 +1004,10 @@ function nLength(n, nBitLength) {
1000
1004
  throw new Error("invalid n length: expected positive n, got " + n);
1001
1005
  if (nBitLength !== void 0 && nBitLength < 1)
1002
1006
  throw new Error("invalid n length: expected positive bit length, got " + nBitLength);
1003
- const bits = bitLen(n);
1004
- if (nBitLength !== void 0 && nBitLength < bits)
1005
- throw new Error(`invalid n length: expected bit length (${bits}) >= n.length (${nBitLength})`);
1006
- const _nBitLength = nBitLength !== void 0 ? nBitLength : bits;
1007
+ const bits2 = bitLen(n);
1008
+ if (nBitLength !== void 0 && nBitLength < bits2)
1009
+ throw new Error(`invalid n length: expected bit length (${bits2}) >= n.length (${nBitLength})`);
1010
+ const _nBitLength = nBitLength !== void 0 ? nBitLength : bits2;
1007
1011
  const nByteLength = Math.ceil(_nBitLength / 8);
1008
1012
  return { nBitLength: _nBitLength, nByteLength };
1009
1013
  }
@@ -1158,9 +1162,9 @@ function normalizeZ(c, points) {
1158
1162
  const invertedZs = FpInvertBatch(c.Fp, points.map((p) => p.Z));
1159
1163
  return points.map((p, i) => c.fromAffine(p.toAffine(invertedZs[i])));
1160
1164
  }
1161
- function validateW(W, bits) {
1162
- if (!Number.isSafeInteger(W) || W <= 0 || W > bits)
1163
- throw new Error("invalid window size, expected [1.." + bits + "], got W=" + W);
1165
+ function validateW(W, bits2) {
1166
+ if (!Number.isSafeInteger(W) || W <= 0 || W > bits2)
1167
+ throw new Error("invalid window size, expected [1.." + bits2 + "], got W=" + W);
1164
1168
  }
1165
1169
  function calcWOpts(W, scalarBits) {
1166
1170
  validateW(W, scalarBits);
@@ -1173,16 +1177,16 @@ function calcWOpts(W, scalarBits) {
1173
1177
  }
1174
1178
  function calcOffsets(n, window, wOpts) {
1175
1179
  const { windowSize, mask, maxNumber, shiftBy } = wOpts;
1176
- let wbits = Number(n & mask);
1180
+ let wbits2 = Number(n & mask);
1177
1181
  let nextN = n >> shiftBy;
1178
- if (wbits > windowSize) {
1179
- wbits -= maxNumber;
1182
+ if (wbits2 > windowSize) {
1183
+ wbits2 -= maxNumber;
1180
1184
  nextN += _1n3;
1181
1185
  }
1182
1186
  const offsetStart = window * windowSize;
1183
- const offset = offsetStart + Math.abs(wbits) - 1;
1184
- const isZero = wbits === 0;
1185
- const isNeg = wbits < 0;
1187
+ const offset = offsetStart + Math.abs(wbits2) - 1;
1188
+ const isZero = wbits2 === 0;
1189
+ const isNeg = wbits2 < 0;
1186
1190
  const isNegF = window % 2 !== 0;
1187
1191
  const offsetF = offsetStart;
1188
1192
  return { nextN, offset, isZero, isNeg, isNegF, offsetF };
@@ -1202,11 +1206,11 @@ var wNAF = class {
1202
1206
  Fn;
1203
1207
  bits;
1204
1208
  // Parametrized with a given Point class (not individual point)
1205
- constructor(Point, bits) {
1209
+ constructor(Point, bits2) {
1206
1210
  this.BASE = Point.BASE;
1207
1211
  this.ZERO = Point.ZERO;
1208
1212
  this.Fn = Point.Fn;
1209
- this.bits = bits;
1213
+ this.bits = bits2;
1210
1214
  }
1211
1215
  // non-const time multiplication ladder
1212
1216
  _unsafeLadder(elm, n, p = this.ZERO) {
@@ -1350,8 +1354,8 @@ function createCurveFields(type, CURVE, curveOpts = {}, FpFnLE) {
1350
1354
  }
1351
1355
  const Fp2 = createField(CURVE.p, curveOpts.Fp, FpFnLE);
1352
1356
  const Fn2 = createField(CURVE.n, curveOpts.Fn, FpFnLE);
1353
- const _b = type === "weierstrass" ? "b" : "d";
1354
- const params = ["Gx", "Gy", "a", _b];
1357
+ const _b2 = type === "weierstrass" ? "b" : "d";
1358
+ const params = ["Gx", "Gy", "a", _b2];
1355
1359
  for (const p of params) {
1356
1360
  if (!Fp2.isValid(CURVE[p]))
1357
1361
  throw new Error(`CURVE.${p} must be valid field element of CURVE.Fp`);
@@ -1452,8 +1456,8 @@ function edwards(params, extraOpts = {}) {
1452
1456
  const lastByte = bytes[len - 1];
1453
1457
  normed[len - 1] = lastByte & ~128;
1454
1458
  const y = bytesToNumberLE(normed);
1455
- const max = zip215 ? MASK : Fp2.ORDER;
1456
- aInRange("point.y", y, _0n4, max);
1459
+ const max2 = zip215 ? MASK : Fp2.ORDER;
1460
+ aInRange("point.y", y, _0n4, max2);
1457
1461
  const y2 = modP(y * y);
1458
1462
  const u = modP(y2 - _1n4);
1459
1463
  const v = modP(d * y2 - a);
@@ -4267,6 +4271,700 @@ function deriveSessionSlotId(desktopStaticPublicKey, phoneStaticPublicKey) {
4267
4271
  return bytesToHex(deriveLabeledKey(material, SESSION_SLOT_LABEL, SESSION_SLOT_LENGTH));
4268
4272
  }
4269
4273
 
4274
+ // ../../node_modules/fflate/esm/index.mjs
4275
+ var import_module = require("module");
4276
+ var require2 = (0, import_module.createRequire)("/");
4277
+ var _a;
4278
+ var Worker;
4279
+ var isMarkedAsUntransferable;
4280
+ try {
4281
+ _a = require2("worker_threads"), Worker = _a.Worker, isMarkedAsUntransferable = _a.isMarkedAsUntransferable;
4282
+ } catch (e) {
4283
+ }
4284
+ var u8 = Uint8Array;
4285
+ var u16 = Uint16Array;
4286
+ var i32 = Int32Array;
4287
+ var fleb = new u8([
4288
+ 0,
4289
+ 0,
4290
+ 0,
4291
+ 0,
4292
+ 0,
4293
+ 0,
4294
+ 0,
4295
+ 0,
4296
+ 1,
4297
+ 1,
4298
+ 1,
4299
+ 1,
4300
+ 2,
4301
+ 2,
4302
+ 2,
4303
+ 2,
4304
+ 3,
4305
+ 3,
4306
+ 3,
4307
+ 3,
4308
+ 4,
4309
+ 4,
4310
+ 4,
4311
+ 4,
4312
+ 5,
4313
+ 5,
4314
+ 5,
4315
+ 5,
4316
+ 0,
4317
+ /* unused */
4318
+ 0,
4319
+ 0,
4320
+ /* impossible */
4321
+ 0
4322
+ ]);
4323
+ var fdeb = new u8([
4324
+ 0,
4325
+ 0,
4326
+ 0,
4327
+ 0,
4328
+ 1,
4329
+ 1,
4330
+ 2,
4331
+ 2,
4332
+ 3,
4333
+ 3,
4334
+ 4,
4335
+ 4,
4336
+ 5,
4337
+ 5,
4338
+ 6,
4339
+ 6,
4340
+ 7,
4341
+ 7,
4342
+ 8,
4343
+ 8,
4344
+ 9,
4345
+ 9,
4346
+ 10,
4347
+ 10,
4348
+ 11,
4349
+ 11,
4350
+ 12,
4351
+ 12,
4352
+ 13,
4353
+ 13,
4354
+ /* unused */
4355
+ 0,
4356
+ 0
4357
+ ]);
4358
+ var clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);
4359
+ var freb = function(eb, start) {
4360
+ var b = new u16(31);
4361
+ for (var i = 0; i < 31; ++i) {
4362
+ b[i] = start += 1 << eb[i - 1];
4363
+ }
4364
+ var r = new i32(b[30]);
4365
+ for (var i = 1; i < 30; ++i) {
4366
+ for (var j = b[i]; j < b[i + 1]; ++j) {
4367
+ r[j] = j - b[i] << 5 | i;
4368
+ }
4369
+ }
4370
+ return { b, r };
4371
+ };
4372
+ var _a = freb(fleb, 2);
4373
+ var fl = _a.b;
4374
+ var revfl = _a.r;
4375
+ fl[28] = 258, revfl[258] = 28;
4376
+ var _b = freb(fdeb, 0);
4377
+ var fd = _b.b;
4378
+ var revfd = _b.r;
4379
+ var rev = new u16(32768);
4380
+ for (i = 0; i < 32768; ++i) {
4381
+ x = (i & 43690) >> 1 | (i & 21845) << 1;
4382
+ x = (x & 52428) >> 2 | (x & 13107) << 2;
4383
+ x = (x & 61680) >> 4 | (x & 3855) << 4;
4384
+ rev[i] = ((x & 65280) >> 8 | (x & 255) << 8) >> 1;
4385
+ }
4386
+ var x;
4387
+ var i;
4388
+ var hMap = (function(cd, mb, r) {
4389
+ var s = cd.length;
4390
+ var i = 0;
4391
+ var l = new u16(mb);
4392
+ for (; i < s; ++i) {
4393
+ if (cd[i])
4394
+ ++l[cd[i] - 1];
4395
+ }
4396
+ var le = new u16(mb);
4397
+ for (i = 1; i < mb; ++i) {
4398
+ le[i] = le[i - 1] + l[i - 1] << 1;
4399
+ }
4400
+ var co;
4401
+ if (r) {
4402
+ co = new u16(1 << mb);
4403
+ var rvb = 15 - mb;
4404
+ for (i = 0; i < s; ++i) {
4405
+ if (cd[i]) {
4406
+ var sv = i << 4 | cd[i];
4407
+ var r_1 = mb - cd[i];
4408
+ var v = le[cd[i] - 1]++ << r_1;
4409
+ for (var m = v | (1 << r_1) - 1; v <= m; ++v) {
4410
+ co[rev[v] >> rvb] = sv;
4411
+ }
4412
+ }
4413
+ }
4414
+ } else {
4415
+ co = new u16(s);
4416
+ for (i = 0; i < s; ++i) {
4417
+ if (cd[i]) {
4418
+ co[i] = rev[le[cd[i] - 1]++] >> 15 - cd[i];
4419
+ }
4420
+ }
4421
+ }
4422
+ return co;
4423
+ });
4424
+ var flt = new u8(288);
4425
+ for (i = 0; i < 144; ++i)
4426
+ flt[i] = 8;
4427
+ var i;
4428
+ for (i = 144; i < 256; ++i)
4429
+ flt[i] = 9;
4430
+ var i;
4431
+ for (i = 256; i < 280; ++i)
4432
+ flt[i] = 7;
4433
+ var i;
4434
+ for (i = 280; i < 288; ++i)
4435
+ flt[i] = 8;
4436
+ var i;
4437
+ var fdt = new u8(32);
4438
+ for (i = 0; i < 32; ++i)
4439
+ fdt[i] = 5;
4440
+ var i;
4441
+ var flm = /* @__PURE__ */ hMap(flt, 9, 0);
4442
+ var flrm = /* @__PURE__ */ hMap(flt, 9, 1);
4443
+ var fdm = /* @__PURE__ */ hMap(fdt, 5, 0);
4444
+ var fdrm = /* @__PURE__ */ hMap(fdt, 5, 1);
4445
+ var max = function(a) {
4446
+ var m = a[0];
4447
+ for (var i = 1; i < a.length; ++i) {
4448
+ if (a[i] > m)
4449
+ m = a[i];
4450
+ }
4451
+ return m;
4452
+ };
4453
+ var bits = function(d, p, m) {
4454
+ var o = p / 8 | 0;
4455
+ return (d[o] | d[o + 1] << 8) >> (p & 7) & m;
4456
+ };
4457
+ var bits16 = function(d, p) {
4458
+ var o = p / 8 | 0;
4459
+ return (d[o] | d[o + 1] << 8 | d[o + 2] << 16) >> (p & 7);
4460
+ };
4461
+ var shft = function(p) {
4462
+ return (p + 7) / 8 | 0;
4463
+ };
4464
+ var slc = function(v, s, e) {
4465
+ if (s == null || s < 0)
4466
+ s = 0;
4467
+ if (e == null || e > v.length)
4468
+ e = v.length;
4469
+ return new u8(v.subarray(s, e));
4470
+ };
4471
+ var ec = [
4472
+ "unexpected EOF",
4473
+ "invalid block type",
4474
+ "invalid length/literal",
4475
+ "invalid distance",
4476
+ "stream finished",
4477
+ "no stream handler",
4478
+ ,
4479
+ // determined by compression function
4480
+ "no callback",
4481
+ "invalid UTF-8 data",
4482
+ "extra field too long",
4483
+ "date not in range 1980-2099",
4484
+ "filename too long",
4485
+ "stream finishing",
4486
+ "invalid zip data"
4487
+ // determined by unknown compression method
4488
+ ];
4489
+ var err = function(ind, msg, nt) {
4490
+ var e = new Error(msg || ec[ind]);
4491
+ e.code = ind;
4492
+ if (Error.captureStackTrace)
4493
+ Error.captureStackTrace(e, err);
4494
+ if (!nt)
4495
+ throw e;
4496
+ return e;
4497
+ };
4498
+ var inflt = function(dat, st, buf, dict) {
4499
+ var sl = dat.length, dl = dict ? dict.length : 0;
4500
+ if (!sl || st.f && !st.l)
4501
+ return buf || new u8(0);
4502
+ var noBuf = !buf;
4503
+ var resize = noBuf || st.i != 2;
4504
+ var noSt = st.i;
4505
+ if (noBuf)
4506
+ buf = new u8(sl * 3);
4507
+ var cbuf = function(l2) {
4508
+ var bl = buf.length;
4509
+ if (l2 > bl) {
4510
+ var nbuf = new u8(Math.max(bl * 2, l2));
4511
+ nbuf.set(buf);
4512
+ buf = nbuf;
4513
+ }
4514
+ };
4515
+ 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;
4516
+ var tbts = sl * 8;
4517
+ do {
4518
+ if (!lm) {
4519
+ final = bits(dat, pos, 1);
4520
+ var type = bits(dat, pos + 1, 3);
4521
+ pos += 3;
4522
+ if (!type) {
4523
+ var s = shft(pos) + 4, l = dat[s - 4] | dat[s - 3] << 8, t = s + l;
4524
+ if (t > sl) {
4525
+ if (noSt)
4526
+ err(0);
4527
+ break;
4528
+ }
4529
+ if (resize)
4530
+ cbuf(bt + l);
4531
+ buf.set(dat.subarray(s, t), bt);
4532
+ st.b = bt += l, st.p = pos = t * 8, st.f = final;
4533
+ continue;
4534
+ } else if (type == 1)
4535
+ lm = flrm, dm = fdrm, lbt = 9, dbt = 5;
4536
+ else if (type == 2) {
4537
+ var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;
4538
+ var tl = hLit + bits(dat, pos + 5, 31) + 1;
4539
+ pos += 14;
4540
+ var ldt = new u8(tl);
4541
+ var clt = new u8(19);
4542
+ for (var i = 0; i < hcLen; ++i) {
4543
+ clt[clim[i]] = bits(dat, pos + i * 3, 7);
4544
+ }
4545
+ pos += hcLen * 3;
4546
+ var clb = max(clt), clbmsk = (1 << clb) - 1;
4547
+ var clm = hMap(clt, clb, 1);
4548
+ for (var i = 0; i < tl; ) {
4549
+ var r = clm[bits(dat, pos, clbmsk)];
4550
+ pos += r & 15;
4551
+ var s = r >> 4;
4552
+ if (s < 16) {
4553
+ ldt[i++] = s;
4554
+ } else {
4555
+ var c = 0, n = 0;
4556
+ if (s == 16)
4557
+ n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];
4558
+ else if (s == 17)
4559
+ n = 3 + bits(dat, pos, 7), pos += 3;
4560
+ else if (s == 18)
4561
+ n = 11 + bits(dat, pos, 127), pos += 7;
4562
+ while (n--)
4563
+ ldt[i++] = c;
4564
+ }
4565
+ }
4566
+ var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);
4567
+ lbt = max(lt);
4568
+ dbt = max(dt);
4569
+ lm = hMap(lt, lbt, 1);
4570
+ dm = hMap(dt, dbt, 1);
4571
+ } else
4572
+ err(1);
4573
+ if (pos > tbts) {
4574
+ if (noSt)
4575
+ err(0);
4576
+ break;
4577
+ }
4578
+ }
4579
+ if (resize)
4580
+ cbuf(bt + 131072);
4581
+ var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;
4582
+ var lpos = pos;
4583
+ for (; ; lpos = pos) {
4584
+ var c = lm[bits16(dat, pos) & lms], sym = c >> 4;
4585
+ pos += c & 15;
4586
+ if (pos > tbts) {
4587
+ if (noSt)
4588
+ err(0);
4589
+ break;
4590
+ }
4591
+ if (!c)
4592
+ err(2);
4593
+ if (sym < 256)
4594
+ buf[bt++] = sym;
4595
+ else if (sym == 256) {
4596
+ lpos = pos, lm = null;
4597
+ break;
4598
+ } else {
4599
+ var add2 = sym - 254;
4600
+ if (sym > 264) {
4601
+ var i = sym - 257, b = fleb[i];
4602
+ add2 = bits(dat, pos, (1 << b) - 1) + fl[i];
4603
+ pos += b;
4604
+ }
4605
+ var d = dm[bits16(dat, pos) & dms], dsym = d >> 4;
4606
+ if (!d)
4607
+ err(3);
4608
+ pos += d & 15;
4609
+ var dt = fd[dsym];
4610
+ if (dsym > 3) {
4611
+ var b = fdeb[dsym];
4612
+ dt += bits16(dat, pos) & (1 << b) - 1, pos += b;
4613
+ }
4614
+ if (pos > tbts) {
4615
+ if (noSt)
4616
+ err(0);
4617
+ break;
4618
+ }
4619
+ if (resize)
4620
+ cbuf(bt + 131072);
4621
+ var end = bt + add2;
4622
+ if (bt < dt) {
4623
+ var shift = dl - dt, dend = Math.min(dt, end);
4624
+ if (shift + bt < 0)
4625
+ err(3);
4626
+ for (; bt < dend; ++bt)
4627
+ buf[bt] = dict[shift + bt];
4628
+ }
4629
+ for (; bt < end; ++bt)
4630
+ buf[bt] = buf[bt - dt];
4631
+ }
4632
+ }
4633
+ st.l = lm, st.p = lpos, st.b = bt, st.f = final;
4634
+ if (lm)
4635
+ final = 1, st.m = lbt, st.d = dm, st.n = dbt;
4636
+ } while (!final);
4637
+ return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt);
4638
+ };
4639
+ var wbits = function(d, p, v) {
4640
+ v <<= p & 7;
4641
+ var o = p / 8 | 0;
4642
+ d[o] |= v;
4643
+ d[o + 1] |= v >> 8;
4644
+ };
4645
+ var wbits16 = function(d, p, v) {
4646
+ v <<= p & 7;
4647
+ var o = p / 8 | 0;
4648
+ d[o] |= v;
4649
+ d[o + 1] |= v >> 8;
4650
+ d[o + 2] |= v >> 16;
4651
+ };
4652
+ var hTree = function(d, mb) {
4653
+ var t = [];
4654
+ for (var i = 0; i < d.length; ++i) {
4655
+ if (d[i])
4656
+ t.push({ s: i, f: d[i] });
4657
+ }
4658
+ var s = t.length;
4659
+ var t2 = t.slice();
4660
+ if (!s)
4661
+ return { t: et, l: 0 };
4662
+ if (s == 1) {
4663
+ var v = new u8(t[0].s + 1);
4664
+ v[t[0].s] = 1;
4665
+ return { t: v, l: 1 };
4666
+ }
4667
+ t.sort(function(a, b) {
4668
+ return a.f - b.f;
4669
+ });
4670
+ t.push({ s: -1, f: 25001 });
4671
+ var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;
4672
+ t[0] = { s: -1, f: l.f + r.f, l, r };
4673
+ while (i1 != s - 1) {
4674
+ l = t[t[i0].f < t[i2].f ? i0++ : i2++];
4675
+ r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];
4676
+ t[i1++] = { s: -1, f: l.f + r.f, l, r };
4677
+ }
4678
+ var maxSym = t2[0].s;
4679
+ for (var i = 1; i < s; ++i) {
4680
+ if (t2[i].s > maxSym)
4681
+ maxSym = t2[i].s;
4682
+ }
4683
+ var tr = new u16(maxSym + 1);
4684
+ var mbt = ln(t[i1 - 1], tr, 0);
4685
+ if (mbt > mb) {
4686
+ var i = 0, dt = 0;
4687
+ var lft = mbt - mb, cst = 1 << lft;
4688
+ t2.sort(function(a, b) {
4689
+ return tr[b.s] - tr[a.s] || a.f - b.f;
4690
+ });
4691
+ for (; i < s; ++i) {
4692
+ var i2_1 = t2[i].s;
4693
+ if (tr[i2_1] > mb) {
4694
+ dt += cst - (1 << mbt - tr[i2_1]);
4695
+ tr[i2_1] = mb;
4696
+ } else
4697
+ break;
4698
+ }
4699
+ dt >>= lft;
4700
+ while (dt > 0) {
4701
+ var i2_2 = t2[i].s;
4702
+ if (tr[i2_2] < mb)
4703
+ dt -= 1 << mb - tr[i2_2]++ - 1;
4704
+ else
4705
+ ++i;
4706
+ }
4707
+ for (; i >= 0 && dt; --i) {
4708
+ var i2_3 = t2[i].s;
4709
+ if (tr[i2_3] == mb) {
4710
+ --tr[i2_3];
4711
+ ++dt;
4712
+ }
4713
+ }
4714
+ mbt = mb;
4715
+ }
4716
+ return { t: new u8(tr), l: mbt };
4717
+ };
4718
+ var ln = function(n, l, d) {
4719
+ return n.s == -1 ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1)) : l[n.s] = d;
4720
+ };
4721
+ var lc = function(c) {
4722
+ var s = c.length;
4723
+ while (s && !c[--s])
4724
+ ;
4725
+ var cl = new u16(++s);
4726
+ var cli = 0, cln = c[0], cls = 1;
4727
+ var w = function(v) {
4728
+ cl[cli++] = v;
4729
+ };
4730
+ for (var i = 1; i <= s; ++i) {
4731
+ if (c[i] == cln && i != s)
4732
+ ++cls;
4733
+ else {
4734
+ if (!cln && cls > 2) {
4735
+ for (; cls > 138; cls -= 138)
4736
+ w(32754);
4737
+ if (cls > 2) {
4738
+ w(cls > 10 ? cls - 11 << 5 | 28690 : cls - 3 << 5 | 12305);
4739
+ cls = 0;
4740
+ }
4741
+ } else if (cls > 3) {
4742
+ w(cln), --cls;
4743
+ for (; cls > 6; cls -= 6)
4744
+ w(8304);
4745
+ if (cls > 2)
4746
+ w(cls - 3 << 5 | 8208), cls = 0;
4747
+ }
4748
+ while (cls--)
4749
+ w(cln);
4750
+ cls = 1;
4751
+ cln = c[i];
4752
+ }
4753
+ }
4754
+ return { c: cl.subarray(0, cli), n: s };
4755
+ };
4756
+ var clen = function(cf, cl) {
4757
+ var l = 0;
4758
+ for (var i = 0; i < cl.length; ++i)
4759
+ l += cf[i] * cl[i];
4760
+ return l;
4761
+ };
4762
+ var wfblk = function(out, pos, dat) {
4763
+ var s = dat.length;
4764
+ var o = shft(pos + 2);
4765
+ out[o] = s & 255;
4766
+ out[o + 1] = s >> 8;
4767
+ out[o + 2] = out[o] ^ 255;
4768
+ out[o + 3] = out[o + 1] ^ 255;
4769
+ for (var i = 0; i < s; ++i)
4770
+ out[o + i + 4] = dat[i];
4771
+ return (o + 4 + s) * 8;
4772
+ };
4773
+ var wblk = function(dat, out, final, syms, lf, df, eb, li, bs, bl, p) {
4774
+ wbits(out, p++, final);
4775
+ ++lf[256];
4776
+ var _a2 = hTree(lf, 15), dlt = _a2.t, mlb = _a2.l;
4777
+ var _b2 = hTree(df, 15), ddt = _b2.t, mdb = _b2.l;
4778
+ var _c = lc(dlt), lclt = _c.c, nlc = _c.n;
4779
+ var _d = lc(ddt), lcdt = _d.c, ndc = _d.n;
4780
+ var lcfreq = new u16(19);
4781
+ for (var i = 0; i < lclt.length; ++i)
4782
+ ++lcfreq[lclt[i] & 31];
4783
+ for (var i = 0; i < lcdt.length; ++i)
4784
+ ++lcfreq[lcdt[i] & 31];
4785
+ var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l;
4786
+ var nlcc = 19;
4787
+ for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)
4788
+ ;
4789
+ var flen = bl + 5 << 3;
4790
+ var ftlen = clen(lf, flt) + clen(df, fdt) + eb;
4791
+ var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18];
4792
+ if (bs >= 0 && flen <= ftlen && flen <= dtlen)
4793
+ return wfblk(out, p, dat.subarray(bs, bs + bl));
4794
+ var lm, ll, dm, dl;
4795
+ wbits(out, p, 1 + (dtlen < ftlen)), p += 2;
4796
+ if (dtlen < ftlen) {
4797
+ lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;
4798
+ var llm = hMap(lct, mlcb, 0);
4799
+ wbits(out, p, nlc - 257);
4800
+ wbits(out, p + 5, ndc - 1);
4801
+ wbits(out, p + 10, nlcc - 4);
4802
+ p += 14;
4803
+ for (var i = 0; i < nlcc; ++i)
4804
+ wbits(out, p + 3 * i, lct[clim[i]]);
4805
+ p += 3 * nlcc;
4806
+ var lcts = [lclt, lcdt];
4807
+ for (var it = 0; it < 2; ++it) {
4808
+ var clct = lcts[it];
4809
+ for (var i = 0; i < clct.length; ++i) {
4810
+ var len = clct[i] & 31;
4811
+ wbits(out, p, llm[len]), p += lct[len];
4812
+ if (len > 15)
4813
+ wbits(out, p, clct[i] >> 5 & 127), p += clct[i] >> 12;
4814
+ }
4815
+ }
4816
+ } else {
4817
+ lm = flm, ll = flt, dm = fdm, dl = fdt;
4818
+ }
4819
+ for (var i = 0; i < li; ++i) {
4820
+ var sym = syms[i];
4821
+ if (sym > 255) {
4822
+ var len = sym >> 18 & 31;
4823
+ wbits16(out, p, lm[len + 257]), p += ll[len + 257];
4824
+ if (len > 7)
4825
+ wbits(out, p, sym >> 23 & 31), p += fleb[len];
4826
+ var dst = sym & 31;
4827
+ wbits16(out, p, dm[dst]), p += dl[dst];
4828
+ if (dst > 3)
4829
+ wbits16(out, p, sym >> 5 & 8191), p += fdeb[dst];
4830
+ } else {
4831
+ wbits16(out, p, lm[sym]), p += ll[sym];
4832
+ }
4833
+ }
4834
+ wbits16(out, p, lm[256]);
4835
+ return p + ll[256];
4836
+ };
4837
+ var deo = /* @__PURE__ */ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);
4838
+ var et = /* @__PURE__ */ new u8(0);
4839
+ var dflt = function(dat, lvl, plvl, pre, post, st) {
4840
+ var s = st.z || dat.length;
4841
+ var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7e3)) + post);
4842
+ var w = o.subarray(pre, o.length - post);
4843
+ var lst = st.l;
4844
+ var pos = (st.r || 0) & 7;
4845
+ if (lvl) {
4846
+ if (pos)
4847
+ w[0] = st.r >> 3;
4848
+ var opt = deo[lvl - 1];
4849
+ var n = opt >> 13, c = opt & 8191;
4850
+ var msk_1 = (1 << plvl) - 1;
4851
+ var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1);
4852
+ var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;
4853
+ var hsh = function(i2) {
4854
+ return (dat[i2] ^ dat[i2 + 1] << bs1_1 ^ dat[i2 + 2] << bs2_1) & msk_1;
4855
+ };
4856
+ var syms = new i32(25e3);
4857
+ var lf = new u16(288), df = new u16(32);
4858
+ var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0;
4859
+ for (; i + 2 < s; ++i) {
4860
+ var hv = hsh(i);
4861
+ var imod = i & 32767, pimod = head[hv];
4862
+ prev[imod] = pimod;
4863
+ head[hv] = imod;
4864
+ if (wi <= i) {
4865
+ var rem = s - i;
4866
+ if ((lc_1 > 7e3 || li > 24576) && (rem > 423 || !lst)) {
4867
+ pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);
4868
+ li = lc_1 = eb = 0, bs = i;
4869
+ for (var j = 0; j < 286; ++j)
4870
+ lf[j] = 0;
4871
+ for (var j = 0; j < 30; ++j)
4872
+ df[j] = 0;
4873
+ }
4874
+ var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767;
4875
+ if (rem > 2 && hv == hsh(i - dif)) {
4876
+ var maxn = Math.min(n, rem) - 1;
4877
+ var maxd = Math.min(32767, i);
4878
+ var ml = Math.min(258, rem);
4879
+ while (dif <= maxd && --ch_1 && imod != pimod) {
4880
+ if (dat[i + l] == dat[i + l - dif]) {
4881
+ var nl = 0;
4882
+ for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)
4883
+ ;
4884
+ if (nl > l) {
4885
+ l = nl, d = dif;
4886
+ if (nl > maxn)
4887
+ break;
4888
+ var mmd = Math.min(dif, nl - 2);
4889
+ var md = 0;
4890
+ for (var j = 0; j < mmd; ++j) {
4891
+ var ti = i - dif + j & 32767;
4892
+ var pti = prev[ti];
4893
+ var cd = ti - pti & 32767;
4894
+ if (cd > md)
4895
+ md = cd, pimod = ti;
4896
+ }
4897
+ }
4898
+ }
4899
+ imod = pimod, pimod = prev[imod];
4900
+ dif += imod - pimod & 32767;
4901
+ }
4902
+ }
4903
+ if (d) {
4904
+ syms[li++] = 268435456 | revfl[l] << 18 | revfd[d];
4905
+ var lin = revfl[l] & 31, din = revfd[d] & 31;
4906
+ eb += fleb[lin] + fdeb[din];
4907
+ ++lf[257 + lin];
4908
+ ++df[din];
4909
+ wi = i + l;
4910
+ ++lc_1;
4911
+ } else {
4912
+ syms[li++] = dat[i];
4913
+ ++lf[dat[i]];
4914
+ }
4915
+ }
4916
+ }
4917
+ for (i = Math.max(i, wi); i < s; ++i) {
4918
+ syms[li++] = dat[i];
4919
+ ++lf[dat[i]];
4920
+ }
4921
+ pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);
4922
+ if (!lst) {
4923
+ st.r = pos & 7 | w[pos / 8 | 0] << 3;
4924
+ pos -= 7;
4925
+ st.h = head, st.p = prev, st.i = i, st.w = wi;
4926
+ }
4927
+ } else {
4928
+ for (var i = st.w || 0; i < s + lst; i += 65535) {
4929
+ var e = i + 65535;
4930
+ if (e >= s) {
4931
+ w[pos / 8 | 0] = lst;
4932
+ e = s;
4933
+ }
4934
+ pos = wfblk(w, pos + 1, dat.subarray(i, e));
4935
+ }
4936
+ st.i = s;
4937
+ }
4938
+ return slc(o, 0, pre + shft(pos) + post);
4939
+ };
4940
+ var dopt = function(dat, opt, pre, post, st) {
4941
+ if (!st) {
4942
+ st = { l: 1 };
4943
+ if (opt.dictionary) {
4944
+ var dict = opt.dictionary.subarray(-32768);
4945
+ var newDat = new u8(dict.length + dat.length);
4946
+ newDat.set(dict);
4947
+ newDat.set(dat, dict.length);
4948
+ dat = newDat;
4949
+ st.w = dict.length;
4950
+ }
4951
+ }
4952
+ 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);
4953
+ };
4954
+ function deflateSync(data, opts) {
4955
+ return dopt(data, opts || {}, 0, 0);
4956
+ }
4957
+ function inflateSync(data, opts) {
4958
+ return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary);
4959
+ }
4960
+ var td = typeof TextDecoder != "undefined" && /* @__PURE__ */ new TextDecoder();
4961
+ var tds = 0;
4962
+ try {
4963
+ td.decode(et, { stream: true });
4964
+ tds = 1;
4965
+ } catch (e) {
4966
+ }
4967
+
4270
4968
  // src/capabilities/verbs.ts
4271
4969
  var CAPABILITY_VERBS = [
4272
4970
  "read-stream",
@@ -4308,18 +5006,53 @@ function isRecord(value) {
4308
5006
 
4309
5007
  // src/wire/framing.ts
4310
5008
  var MAX_FRAME_LENGTH = 1024 * 1024;
5009
+ var MAX_DECODED_LENGTH = 4 * 1024 * 1024;
5010
+ var COMPRESSION_THRESHOLD = 4 * 1024;
5011
+ var FRAME_FORMAT_DEFLATE = 1;
5012
+ var JSON_OPEN_BRACE = 123;
5013
+ var DEFLATE_HEADER_LENGTH = 5;
4311
5014
  function encodeMessage(message) {
4312
- const bytes = new TextEncoder().encode(JSON.stringify(message));
4313
- if (bytes.length > MAX_FRAME_LENGTH) {
5015
+ const json = new TextEncoder().encode(JSON.stringify(message));
5016
+ if (json.length > MAX_DECODED_LENGTH) {
5017
+ throw new Error(`Encoded bridge message exceeds ${MAX_DECODED_LENGTH} bytes before compression`);
5018
+ }
5019
+ let frame = json;
5020
+ if (json.length > COMPRESSION_THRESHOLD) {
5021
+ const compressed = deflateSync(json);
5022
+ if (compressed.length + DEFLATE_HEADER_LENGTH < json.length) {
5023
+ frame = new Uint8Array(DEFLATE_HEADER_LENGTH + compressed.length);
5024
+ frame[0] = FRAME_FORMAT_DEFLATE;
5025
+ new DataView(frame.buffer).setUint32(1, json.length, true);
5026
+ frame.set(compressed, DEFLATE_HEADER_LENGTH);
5027
+ }
5028
+ }
5029
+ if (frame.length > MAX_FRAME_LENGTH) {
4314
5030
  throw new Error(`Encoded bridge message exceeds ${MAX_FRAME_LENGTH} bytes`);
4315
5031
  }
4316
- return bytes;
5032
+ return frame;
4317
5033
  }
4318
5034
  function decodeMessage(bytes) {
4319
5035
  if (bytes.length > MAX_FRAME_LENGTH) {
4320
5036
  throw new Error(`Bridge message frame exceeds ${MAX_FRAME_LENGTH} bytes`);
4321
5037
  }
4322
- const parsed = JSON.parse(new TextDecoder().decode(bytes));
5038
+ if (bytes.length === 0) throw new Error("Bridge message frame is empty");
5039
+ let json;
5040
+ if (bytes[0] === JSON_OPEN_BRACE) {
5041
+ json = bytes;
5042
+ } else if (bytes[0] === FRAME_FORMAT_DEFLATE) {
5043
+ if (bytes.length < DEFLATE_HEADER_LENGTH + 1) throw new Error("Compressed bridge message frame is truncated");
5044
+ const declaredLength = new DataView(bytes.buffer, bytes.byteOffset).getUint32(1, true);
5045
+ if (declaredLength === 0 || declaredLength > MAX_DECODED_LENGTH) {
5046
+ throw new Error(`Compressed bridge message declares an invalid decoded length: ${declaredLength}`);
5047
+ }
5048
+ json = inflateSync(bytes.subarray(DEFLATE_HEADER_LENGTH), { out: new Uint8Array(declaredLength) });
5049
+ if (json.length !== declaredLength) {
5050
+ throw new Error("Compressed bridge message decoded length does not match its declaration");
5051
+ }
5052
+ } else {
5053
+ throw new Error(`Unknown bridge message frame format: 0x${bytes[0].toString(16)}`);
5054
+ }
5055
+ const parsed = JSON.parse(new TextDecoder().decode(json));
4323
5056
  return validateBridgeMessage(parsed);
4324
5057
  }
4325
5058
  function validateEvent(event) {
@@ -4448,6 +5181,24 @@ function parseTranscriptEntriesWire(payload) {
4448
5181
  return entry;
4449
5182
  });
4450
5183
  }
5184
+ function parseTranscriptEventPayload(payload) {
5185
+ if (!isRecord(payload)) throw new Error("transcript payload must be an object");
5186
+ const revision = requireNumber(payload, "revision", "transcript payload");
5187
+ const totalEntries = requireNumber(payload, "totalEntries", "transcript payload");
5188
+ if (!Number.isInteger(revision) || revision < 0) throw new Error('transcript payload has an invalid "revision"');
5189
+ if (!Number.isInteger(totalEntries) || totalEntries < 0) throw new Error('transcript payload has an invalid "totalEntries"');
5190
+ if (payload.mode === "reset") return { mode: "reset", revision, totalEntries };
5191
+ if (payload.mode !== "delta") throw new Error('transcript payload has an invalid "mode"');
5192
+ if (!Array.isArray(payload.upserts)) throw new Error('transcript delta is missing "upserts"');
5193
+ const upserts = payload.upserts.map((upsert, position) => {
5194
+ if (!isRecord(upsert) || typeof upsert.index !== "number" || !Number.isInteger(upsert.index) || upsert.index < 0) {
5195
+ throw new Error(`transcript delta upsert ${position} has an invalid "index"`);
5196
+ }
5197
+ if (!isTranscriptEntryWire(upsert.entry)) throw new Error(`transcript delta upsert ${position} has a malformed "entry"`);
5198
+ return { index: upsert.index, entry: upsert.entry };
5199
+ });
5200
+ return { mode: "delta", revision, totalEntries, upserts };
5201
+ }
4451
5202
  function isActivityStateWire(value) {
4452
5203
  return value === "thinking" || value === "idle" || value === "permission";
4453
5204
  }
@@ -4626,13 +5377,45 @@ function parseReadStreamResponsePayload(payload) {
4626
5377
  awaitedPromptId: payload.awaitedPromptId ?? null
4627
5378
  };
4628
5379
  }
5380
+ function parseTranscriptWindowResponsePayload(payload) {
5381
+ if (!isRecord(payload)) throw new Error("transcript-window response must be an object");
5382
+ const { revision, totalEntries, startIndex } = payload;
5383
+ if (typeof revision !== "number" || !Number.isInteger(revision) || revision < 0) {
5384
+ throw new Error('transcript-window response has an invalid "revision"');
5385
+ }
5386
+ if (typeof totalEntries !== "number" || !Number.isInteger(totalEntries) || totalEntries < 0) {
5387
+ throw new Error('transcript-window response has an invalid "totalEntries"');
5388
+ }
5389
+ if (typeof startIndex !== "number" || !Number.isInteger(startIndex) || startIndex < 0) {
5390
+ throw new Error('transcript-window response has an invalid "startIndex"');
5391
+ }
5392
+ return {
5393
+ revision,
5394
+ totalEntries,
5395
+ startIndex,
5396
+ entries: parseTranscriptEntriesWire(payload.entries)
5397
+ };
5398
+ }
4629
5399
  function parseReadStreamRequestPayload(payload) {
4630
5400
  if (!isRecord(payload)) throw new Error("read-stream payload must be an object");
4631
5401
  if (typeof payload.sessionId !== "string") throw new Error('read-stream payload missing "sessionId"');
4632
- if (payload.action !== "subscribe" && payload.action !== "unsubscribe") {
5402
+ if (payload.action !== "subscribe" && payload.action !== "unsubscribe" && payload.action !== "transcript-window") {
4633
5403
  throw new Error('read-stream payload has an invalid "action"');
4634
5404
  }
4635
- return { sessionId: payload.sessionId, action: payload.action };
5405
+ const request = { sessionId: payload.sessionId, action: payload.action };
5406
+ if (payload.beforeIndex !== void 0) {
5407
+ if (typeof payload.beforeIndex !== "number" || !Number.isInteger(payload.beforeIndex) || payload.beforeIndex < 0) {
5408
+ throw new Error('read-stream payload has an invalid "beforeIndex"');
5409
+ }
5410
+ request.beforeIndex = payload.beforeIndex;
5411
+ }
5412
+ if (payload.limit !== void 0) {
5413
+ if (typeof payload.limit !== "number" || !Number.isInteger(payload.limit) || payload.limit < 1) {
5414
+ throw new Error('read-stream payload has an invalid "limit"');
5415
+ }
5416
+ request.limit = payload.limit;
5417
+ }
5418
+ return request;
4636
5419
  }
4637
5420
  function parseReadBoardResponsePayload(payload) {
4638
5421
  if (!isRecord(payload)) throw new Error("read-board response must be an object");
@@ -4981,7 +5764,7 @@ function isBridgeEvent(value) {
4981
5764
  case "transcript": {
4982
5765
  if (typeof value.sessionId !== "string" || typeof value.taskId !== "string") return false;
4983
5766
  try {
4984
- parseTranscriptEntriesWire(value.payload);
5767
+ parseTranscriptEventPayload(value.payload);
4985
5768
  return true;
4986
5769
  } catch {
4987
5770
  return false;
@@ -5019,12 +5802,14 @@ function isBridgeEvent(value) {
5019
5802
  BOARD_TOOL_READ_NAMES,
5020
5803
  BOARD_TOOL_WRITE_NAMES,
5021
5804
  CAPABILITY_VERBS,
5805
+ COMPRESSION_THRESHOLD,
5022
5806
  CipherState,
5023
5807
  ED25519_KEY_LENGTH,
5024
5808
  FrameTag,
5025
5809
  HandshakeState,
5026
5810
  IKPSK0_PATTERN,
5027
5811
  KK_PATTERN,
5812
+ MAX_DECODED_LENGTH,
5028
5813
  MAX_FRAME_LENGTH,
5029
5814
  PAIRING_URI_SCHEME,
5030
5815
  PROTOCOL_VERSION,
@@ -5073,6 +5858,8 @@ function isBridgeEvent(value) {
5073
5858
  parseSessionEventWire,
5074
5859
  parseSessionUsageWire,
5075
5860
  parseTranscriptEntriesWire,
5861
+ parseTranscriptEventPayload,
5862
+ parseTranscriptWindowResponsePayload,
5076
5863
  randomBytes,
5077
5864
  rosterDeviceCapabilitySet,
5078
5865
  signRosterEntry,