@kangentic/protocol 0.2.0 → 0.5.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/capabilities/verbs.d.ts +1 -1
- package/dist/crypto/push-envelope.d.ts +38 -0
- package/dist/events/event.d.ts +26 -4
- package/dist/events/payloads.d.ts +54 -1
- package/dist/index.cjs +1028 -76
- package/dist/index.d.ts +5 -4
- package/dist/index.mjs +1006 -76
- package/dist/version.d.ts +1 -1
- package/dist/wire/framing.d.ts +4 -0
- package/dist/wire/payloads.d.ts +103 -7
- package/package.json +3 -2
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/version.ts
|
|
2
|
-
var PROTOCOL_VERSION = "
|
|
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,
|
|
633
|
-
return isPosBig(n) && isPosBig(min) && isPosBig(
|
|
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,
|
|
636
|
-
if (!inRange(n, min,
|
|
637
|
-
throw new RangeError("expected valid " + title + ": " + min + " <= 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
|
|
915
|
-
if (nBitLength !== void 0 && nBitLength <
|
|
916
|
-
throw new Error(`invalid n length: expected bit length (${
|
|
917
|
-
const _nBitLength = nBitLength !== void 0 ? nBitLength :
|
|
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,
|
|
1073
|
-
if (!Number.isSafeInteger(W) || W <= 0 || W >
|
|
1074
|
-
throw new Error("invalid window size, expected [1.." +
|
|
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
|
|
1087
|
+
let wbits2 = Number(n & mask);
|
|
1088
1088
|
let nextN = n >> shiftBy;
|
|
1089
|
-
if (
|
|
1090
|
-
|
|
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(
|
|
1095
|
-
const isZero =
|
|
1096
|
-
const isNeg =
|
|
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,
|
|
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 =
|
|
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
|
|
1265
|
-
const params = ["Gx", "Gy", "a",
|
|
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
|
|
1367
|
-
aInRange("point.y", y, _0n4,
|
|
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",
|
|
@@ -4188,7 +4873,8 @@ var CAPABILITY_VERBS = [
|
|
|
4188
4873
|
"answer-permission-prompt",
|
|
4189
4874
|
"interactive-terminal",
|
|
4190
4875
|
"board-tool-read",
|
|
4191
|
-
"board-tool-write"
|
|
4876
|
+
"board-tool-write",
|
|
4877
|
+
"register-push"
|
|
4192
4878
|
];
|
|
4193
4879
|
function isCapabilityVerb(value) {
|
|
4194
4880
|
return CAPABILITY_VERBS.includes(value);
|
|
@@ -4219,18 +4905,53 @@ function isRecord(value) {
|
|
|
4219
4905
|
|
|
4220
4906
|
// src/wire/framing.ts
|
|
4221
4907
|
var MAX_FRAME_LENGTH = 1024 * 1024;
|
|
4908
|
+
var MAX_DECODED_LENGTH = 4 * 1024 * 1024;
|
|
4909
|
+
var COMPRESSION_THRESHOLD = 4 * 1024;
|
|
4910
|
+
var FRAME_FORMAT_DEFLATE = 1;
|
|
4911
|
+
var JSON_OPEN_BRACE = 123;
|
|
4912
|
+
var DEFLATE_HEADER_LENGTH = 5;
|
|
4222
4913
|
function encodeMessage(message) {
|
|
4223
|
-
const
|
|
4224
|
-
if (
|
|
4914
|
+
const json = new TextEncoder().encode(JSON.stringify(message));
|
|
4915
|
+
if (json.length > MAX_DECODED_LENGTH) {
|
|
4916
|
+
throw new Error(`Encoded bridge message exceeds ${MAX_DECODED_LENGTH} bytes before compression`);
|
|
4917
|
+
}
|
|
4918
|
+
let frame = json;
|
|
4919
|
+
if (json.length > COMPRESSION_THRESHOLD) {
|
|
4920
|
+
const compressed = deflateSync(json);
|
|
4921
|
+
if (compressed.length + DEFLATE_HEADER_LENGTH < json.length) {
|
|
4922
|
+
frame = new Uint8Array(DEFLATE_HEADER_LENGTH + compressed.length);
|
|
4923
|
+
frame[0] = FRAME_FORMAT_DEFLATE;
|
|
4924
|
+
new DataView(frame.buffer).setUint32(1, json.length, true);
|
|
4925
|
+
frame.set(compressed, DEFLATE_HEADER_LENGTH);
|
|
4926
|
+
}
|
|
4927
|
+
}
|
|
4928
|
+
if (frame.length > MAX_FRAME_LENGTH) {
|
|
4225
4929
|
throw new Error(`Encoded bridge message exceeds ${MAX_FRAME_LENGTH} bytes`);
|
|
4226
4930
|
}
|
|
4227
|
-
return
|
|
4931
|
+
return frame;
|
|
4228
4932
|
}
|
|
4229
4933
|
function decodeMessage(bytes) {
|
|
4230
4934
|
if (bytes.length > MAX_FRAME_LENGTH) {
|
|
4231
4935
|
throw new Error(`Bridge message frame exceeds ${MAX_FRAME_LENGTH} bytes`);
|
|
4232
4936
|
}
|
|
4233
|
-
|
|
4937
|
+
if (bytes.length === 0) throw new Error("Bridge message frame is empty");
|
|
4938
|
+
let json;
|
|
4939
|
+
if (bytes[0] === JSON_OPEN_BRACE) {
|
|
4940
|
+
json = bytes;
|
|
4941
|
+
} else if (bytes[0] === FRAME_FORMAT_DEFLATE) {
|
|
4942
|
+
if (bytes.length < DEFLATE_HEADER_LENGTH + 1) throw new Error("Compressed bridge message frame is truncated");
|
|
4943
|
+
const declaredLength = new DataView(bytes.buffer, bytes.byteOffset).getUint32(1, true);
|
|
4944
|
+
if (declaredLength === 0 || declaredLength > MAX_DECODED_LENGTH) {
|
|
4945
|
+
throw new Error(`Compressed bridge message declares an invalid decoded length: ${declaredLength}`);
|
|
4946
|
+
}
|
|
4947
|
+
json = inflateSync(bytes.subarray(DEFLATE_HEADER_LENGTH), { out: new Uint8Array(declaredLength) });
|
|
4948
|
+
if (json.length !== declaredLength) {
|
|
4949
|
+
throw new Error("Compressed bridge message decoded length does not match its declaration");
|
|
4950
|
+
}
|
|
4951
|
+
} else {
|
|
4952
|
+
throw new Error(`Unknown bridge message frame format: 0x${bytes[0].toString(16)}`);
|
|
4953
|
+
}
|
|
4954
|
+
const parsed = JSON.parse(new TextDecoder().decode(json));
|
|
4234
4955
|
return validateBridgeMessage(parsed);
|
|
4235
4956
|
}
|
|
4236
4957
|
function validateEvent(event) {
|
|
@@ -4239,7 +4960,8 @@ function validateEvent(event) {
|
|
|
4239
4960
|
switch (event.kind) {
|
|
4240
4961
|
case "transcript":
|
|
4241
4962
|
case "activity":
|
|
4242
|
-
case "terminal":
|
|
4963
|
+
case "terminal":
|
|
4964
|
+
case "terminal-resize": {
|
|
4243
4965
|
if (typeof event.sessionId !== "string") throw new Error(`"${event.kind}" event is missing "sessionId"`);
|
|
4244
4966
|
if (typeof event.taskId !== "string") throw new Error(`"${event.kind}" event is missing "taskId"`);
|
|
4245
4967
|
return event;
|
|
@@ -4312,6 +5034,47 @@ function unwrapSessionFrame(frame) {
|
|
|
4312
5034
|
return { kind, payload: frame.subarray(1) };
|
|
4313
5035
|
}
|
|
4314
5036
|
|
|
5037
|
+
// src/wire/base64url.ts
|
|
5038
|
+
var ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
|
|
5039
|
+
var DECODE_MAP = {};
|
|
5040
|
+
for (let i = 0; i < ALPHABET.length; i++) DECODE_MAP[ALPHABET[i]] = i;
|
|
5041
|
+
function base64UrlEncode(bytes) {
|
|
5042
|
+
let result = "";
|
|
5043
|
+
let i = 0;
|
|
5044
|
+
for (; i + 2 < bytes.length; i += 3) {
|
|
5045
|
+
const chunk = bytes[i] << 16 | bytes[i + 1] << 8 | bytes[i + 2];
|
|
5046
|
+
result += ALPHABET[chunk >> 18 & 63] + ALPHABET[chunk >> 12 & 63] + ALPHABET[chunk >> 6 & 63] + ALPHABET[chunk & 63];
|
|
5047
|
+
}
|
|
5048
|
+
const remaining = bytes.length - i;
|
|
5049
|
+
if (remaining === 1) {
|
|
5050
|
+
const chunk = bytes[i] << 16;
|
|
5051
|
+
result += ALPHABET[chunk >> 18 & 63] + ALPHABET[chunk >> 12 & 63];
|
|
5052
|
+
} else if (remaining === 2) {
|
|
5053
|
+
const chunk = bytes[i] << 16 | bytes[i + 1] << 8;
|
|
5054
|
+
result += ALPHABET[chunk >> 18 & 63] + ALPHABET[chunk >> 12 & 63] + ALPHABET[chunk >> 6 & 63];
|
|
5055
|
+
}
|
|
5056
|
+
return result;
|
|
5057
|
+
}
|
|
5058
|
+
function base64UrlDecode(encoded) {
|
|
5059
|
+
const byteLength = Math.floor(encoded.length * 6 / 8);
|
|
5060
|
+
const bytes = new Uint8Array(byteLength);
|
|
5061
|
+
let bitBuffer = 0;
|
|
5062
|
+
let bitCount = 0;
|
|
5063
|
+
let outputIndex = 0;
|
|
5064
|
+
for (const char of encoded) {
|
|
5065
|
+
const value = DECODE_MAP[char];
|
|
5066
|
+
if (value === void 0) throw new Error(`Invalid base64url character: "${char}"`);
|
|
5067
|
+
bitBuffer = bitBuffer << 6 | value;
|
|
5068
|
+
bitCount += 6;
|
|
5069
|
+
if (bitCount >= 8) {
|
|
5070
|
+
bitCount -= 8;
|
|
5071
|
+
bytes[outputIndex] = bitBuffer >> bitCount & 255;
|
|
5072
|
+
outputIndex += 1;
|
|
5073
|
+
}
|
|
5074
|
+
}
|
|
5075
|
+
return bytes;
|
|
5076
|
+
}
|
|
5077
|
+
|
|
4315
5078
|
// src/events/payloads.ts
|
|
4316
5079
|
var DIFF_FILE_STATUSES = ["A", "M", "D", "R", "C", "U"];
|
|
4317
5080
|
var TRANSCRIPT_SYSTEM_SUBTYPES = ["compaction", "command", "command_output", "session_boundary"];
|
|
@@ -4359,6 +5122,32 @@ function parseTranscriptEntriesWire(payload) {
|
|
|
4359
5122
|
return entry;
|
|
4360
5123
|
});
|
|
4361
5124
|
}
|
|
5125
|
+
function parseTranscriptEventPayload(payload) {
|
|
5126
|
+
if (!isRecord(payload)) throw new Error("transcript payload must be an object");
|
|
5127
|
+
const revision = requireNumber(payload, "revision", "transcript payload");
|
|
5128
|
+
const totalEntries = requireNumber(payload, "totalEntries", "transcript payload");
|
|
5129
|
+
if (!Number.isInteger(revision) || revision < 0) throw new Error('transcript payload has an invalid "revision"');
|
|
5130
|
+
if (!Number.isInteger(totalEntries) || totalEntries < 0) throw new Error('transcript payload has an invalid "totalEntries"');
|
|
5131
|
+
if (payload.mode === "reset") return { mode: "reset", revision, totalEntries };
|
|
5132
|
+
if (payload.mode !== "delta") throw new Error('transcript payload has an invalid "mode"');
|
|
5133
|
+
if (!Array.isArray(payload.upserts)) throw new Error('transcript delta is missing "upserts"');
|
|
5134
|
+
const upserts = payload.upserts.map((upsert, position) => {
|
|
5135
|
+
if (!isRecord(upsert) || typeof upsert.index !== "number" || !Number.isInteger(upsert.index) || upsert.index < 0) {
|
|
5136
|
+
throw new Error(`transcript delta upsert ${position} has an invalid "index"`);
|
|
5137
|
+
}
|
|
5138
|
+
if (!isTranscriptEntryWire(upsert.entry)) throw new Error(`transcript delta upsert ${position} has a malformed "entry"`);
|
|
5139
|
+
return { index: upsert.index, entry: upsert.entry };
|
|
5140
|
+
});
|
|
5141
|
+
return { mode: "delta", revision, totalEntries, upserts };
|
|
5142
|
+
}
|
|
5143
|
+
function parseTerminalDimensionsWire(payload) {
|
|
5144
|
+
if (!isRecord(payload)) throw new Error("terminal dimensions must be an object");
|
|
5145
|
+
const cols = requireNumber(payload, "cols", "terminal dimensions");
|
|
5146
|
+
const rows = requireNumber(payload, "rows", "terminal dimensions");
|
|
5147
|
+
if (!Number.isInteger(cols) || cols < 2 || cols > 1e3) throw new Error('terminal dimensions have an invalid "cols"');
|
|
5148
|
+
if (!Number.isInteger(rows) || rows < 1 || rows > 1e3) throw new Error('terminal dimensions have an invalid "rows"');
|
|
5149
|
+
return { cols, rows };
|
|
5150
|
+
}
|
|
4362
5151
|
function isActivityStateWire(value) {
|
|
4363
5152
|
return value === "thinking" || value === "idle" || value === "permission";
|
|
4364
5153
|
}
|
|
@@ -4519,6 +5308,7 @@ function parseDiffFileContentWire(payload) {
|
|
|
4519
5308
|
}
|
|
4520
5309
|
|
|
4521
5310
|
// src/wire/payloads.ts
|
|
5311
|
+
var READ_STREAM_SESSION_STATUSES = ["running", "queued", "suspended", "exited"];
|
|
4522
5312
|
function parseReadStreamResponsePayload(payload) {
|
|
4523
5313
|
if (!isRecord(payload)) throw new Error("read-stream response must be an object");
|
|
4524
5314
|
if (typeof payload.scrollback !== "string") throw new Error('read-stream response is missing "scrollback"');
|
|
@@ -4530,20 +5320,69 @@ function parseReadStreamResponsePayload(payload) {
|
|
|
4530
5320
|
if (payload.awaitedPromptId !== null && typeof payload.awaitedPromptId !== "string") {
|
|
4531
5321
|
throw new Error('read-stream response has an invalid "awaitedPromptId"');
|
|
4532
5322
|
}
|
|
4533
|
-
|
|
5323
|
+
const response = {
|
|
4534
5324
|
scrollback: payload.scrollback,
|
|
4535
5325
|
activity: { state: state ?? null, reason: reason ?? null },
|
|
4536
5326
|
usage: payload.usage === null || payload.usage === void 0 ? null : parseSessionUsageWire(payload.usage),
|
|
4537
5327
|
awaitedPromptId: payload.awaitedPromptId ?? null
|
|
4538
5328
|
};
|
|
5329
|
+
if (payload.ptyDimensions !== void 0) {
|
|
5330
|
+
response.ptyDimensions = parseTerminalDimensionsWire(payload.ptyDimensions);
|
|
5331
|
+
}
|
|
5332
|
+
if (payload.sessionStatus !== void 0) {
|
|
5333
|
+
if (typeof payload.sessionStatus !== "string" || !READ_STREAM_SESSION_STATUSES.includes(payload.sessionStatus)) {
|
|
5334
|
+
throw new Error('read-stream response has an invalid "sessionStatus"');
|
|
5335
|
+
}
|
|
5336
|
+
response.sessionStatus = payload.sessionStatus;
|
|
5337
|
+
}
|
|
5338
|
+
return response;
|
|
5339
|
+
}
|
|
5340
|
+
function parseTranscriptWindowResponsePayload(payload) {
|
|
5341
|
+
if (!isRecord(payload)) throw new Error("transcript-window response must be an object");
|
|
5342
|
+
const { revision, totalEntries, startIndex } = payload;
|
|
5343
|
+
if (typeof revision !== "number" || !Number.isInteger(revision) || revision < 0) {
|
|
5344
|
+
throw new Error('transcript-window response has an invalid "revision"');
|
|
5345
|
+
}
|
|
5346
|
+
if (typeof totalEntries !== "number" || !Number.isInteger(totalEntries) || totalEntries < 0) {
|
|
5347
|
+
throw new Error('transcript-window response has an invalid "totalEntries"');
|
|
5348
|
+
}
|
|
5349
|
+
if (typeof startIndex !== "number" || !Number.isInteger(startIndex) || startIndex < 0) {
|
|
5350
|
+
throw new Error('transcript-window response has an invalid "startIndex"');
|
|
5351
|
+
}
|
|
5352
|
+
return {
|
|
5353
|
+
revision,
|
|
5354
|
+
totalEntries,
|
|
5355
|
+
startIndex,
|
|
5356
|
+
entries: parseTranscriptEntriesWire(payload.entries)
|
|
5357
|
+
};
|
|
4539
5358
|
}
|
|
4540
5359
|
function parseReadStreamRequestPayload(payload) {
|
|
4541
5360
|
if (!isRecord(payload)) throw new Error("read-stream payload must be an object");
|
|
4542
5361
|
if (typeof payload.sessionId !== "string") throw new Error('read-stream payload missing "sessionId"');
|
|
4543
|
-
if (payload.action !== "subscribe" && payload.action !== "unsubscribe") {
|
|
5362
|
+
if (payload.action !== "subscribe" && payload.action !== "unsubscribe" && payload.action !== "transcript-window") {
|
|
4544
5363
|
throw new Error('read-stream payload has an invalid "action"');
|
|
4545
5364
|
}
|
|
4546
|
-
|
|
5365
|
+
const request = { sessionId: payload.sessionId, action: payload.action };
|
|
5366
|
+
if (payload.beforeIndex !== void 0) {
|
|
5367
|
+
if (typeof payload.beforeIndex !== "number" || !Number.isInteger(payload.beforeIndex) || payload.beforeIndex < 0) {
|
|
5368
|
+
throw new Error('read-stream payload has an invalid "beforeIndex"');
|
|
5369
|
+
}
|
|
5370
|
+
request.beforeIndex = payload.beforeIndex;
|
|
5371
|
+
}
|
|
5372
|
+
if (payload.limit !== void 0) {
|
|
5373
|
+
if (typeof payload.limit !== "number" || !Number.isInteger(payload.limit) || payload.limit < 1) {
|
|
5374
|
+
throw new Error('read-stream payload has an invalid "limit"');
|
|
5375
|
+
}
|
|
5376
|
+
request.limit = payload.limit;
|
|
5377
|
+
}
|
|
5378
|
+
return request;
|
|
5379
|
+
}
|
|
5380
|
+
var ACCENT_COLOR_PATTERN = /^#[0-9a-fA-F]{6}$/;
|
|
5381
|
+
function parseAccentColor(value, context) {
|
|
5382
|
+
if (typeof value !== "string" || !ACCENT_COLOR_PATTERN.test(value)) {
|
|
5383
|
+
throw new Error(`${context} has an invalid accent color (expected "#rrggbb")`);
|
|
5384
|
+
}
|
|
5385
|
+
return value;
|
|
4547
5386
|
}
|
|
4548
5387
|
function parseReadBoardResponsePayload(payload) {
|
|
4549
5388
|
if (!isRecord(payload)) throw new Error("read-board response must be an object");
|
|
@@ -4552,7 +5391,11 @@ function parseReadBoardResponsePayload(payload) {
|
|
|
4552
5391
|
if (!isRecord(project) || typeof project.id !== "string" || typeof project.name !== "string") {
|
|
4553
5392
|
throw new Error(`read-board project ${index} is malformed`);
|
|
4554
5393
|
}
|
|
4555
|
-
return {
|
|
5394
|
+
return {
|
|
5395
|
+
id: project.id,
|
|
5396
|
+
name: project.name,
|
|
5397
|
+
...project.color !== void 0 ? { color: parseAccentColor(project.color, `read-board project ${index}`) } : {}
|
|
5398
|
+
};
|
|
4556
5399
|
});
|
|
4557
5400
|
return { projects };
|
|
4558
5401
|
}
|
|
@@ -4564,7 +5407,8 @@ function parseReadBoardResponsePayload(payload) {
|
|
|
4564
5407
|
projectId: payload.projectId,
|
|
4565
5408
|
columns: payload.columns.map((column) => parseBoardColumnWire(column)),
|
|
4566
5409
|
tasks: payload.tasks.map((task) => parseBoardTaskWire(task)),
|
|
4567
|
-
backlog: payload.backlog.map((item) => parseBacklogItemWire(item))
|
|
5410
|
+
backlog: payload.backlog.map((item) => parseBacklogItemWire(item)),
|
|
5411
|
+
...payload.projectColor !== void 0 ? { projectColor: parseAccentColor(payload.projectColor, "read-board snapshot") } : {}
|
|
4568
5412
|
};
|
|
4569
5413
|
}
|
|
4570
5414
|
function parseReadBoardRequestPayload(payload) {
|
|
@@ -4631,8 +5475,21 @@ function parseAnswerPermissionPromptRequestPayload(payload) {
|
|
|
4631
5475
|
function parseInteractiveTerminalRequestPayload(payload) {
|
|
4632
5476
|
if (!isRecord(payload)) throw new Error("interactive-terminal payload must be an object");
|
|
4633
5477
|
if (typeof payload.sessionId !== "string") throw new Error('interactive-terminal payload missing "sessionId"');
|
|
4634
|
-
if (
|
|
4635
|
-
|
|
5478
|
+
if (payload.action === void 0 || payload.action === "write") {
|
|
5479
|
+
if (typeof payload.data !== "string") throw new Error('interactive-terminal payload missing "data"');
|
|
5480
|
+
return { sessionId: payload.sessionId, action: "write", data: payload.data };
|
|
5481
|
+
}
|
|
5482
|
+
if (payload.action === "resize") {
|
|
5483
|
+
return {
|
|
5484
|
+
sessionId: payload.sessionId,
|
|
5485
|
+
action: "resize",
|
|
5486
|
+
dimensions: parseTerminalDimensionsWire(payload.dimensions)
|
|
5487
|
+
};
|
|
5488
|
+
}
|
|
5489
|
+
if (payload.action === "release-size") {
|
|
5490
|
+
return { sessionId: payload.sessionId, action: "release-size" };
|
|
5491
|
+
}
|
|
5492
|
+
throw new Error('interactive-terminal payload has an invalid "action"');
|
|
4636
5493
|
}
|
|
4637
5494
|
function parseBoardToolRequestPayload(payload) {
|
|
4638
5495
|
if (!isRecord(payload)) throw new Error("board-tool payload must be an object");
|
|
@@ -4640,6 +5497,42 @@ function parseBoardToolRequestPayload(payload) {
|
|
|
4640
5497
|
if (payload.params === void 0 || !isJsonValue(payload.params)) throw new Error('board-tool payload missing a JSON "params"');
|
|
4641
5498
|
return { tool: payload.tool, params: payload.params };
|
|
4642
5499
|
}
|
|
5500
|
+
var PUSH_KEY_LENGTH = 32;
|
|
5501
|
+
function parseRegisterPushRequestPayload(payload) {
|
|
5502
|
+
if (!isRecord(payload)) throw new Error("register-push payload must be an object");
|
|
5503
|
+
if (payload.action !== "register" && payload.action !== "unregister") {
|
|
5504
|
+
throw new Error('register-push payload has an invalid "action"');
|
|
5505
|
+
}
|
|
5506
|
+
const request = { action: payload.action };
|
|
5507
|
+
if (payload.expoPushToken !== void 0) {
|
|
5508
|
+
if (typeof payload.expoPushToken !== "string") throw new Error('register-push payload has a non-string "expoPushToken"');
|
|
5509
|
+
request.expoPushToken = payload.expoPushToken;
|
|
5510
|
+
}
|
|
5511
|
+
if (payload.pushKeyBase64 !== void 0) {
|
|
5512
|
+
if (typeof payload.pushKeyBase64 !== "string") throw new Error('register-push payload has a non-string "pushKeyBase64"');
|
|
5513
|
+
let decodedKey;
|
|
5514
|
+
try {
|
|
5515
|
+
decodedKey = base64UrlDecode(payload.pushKeyBase64);
|
|
5516
|
+
} catch {
|
|
5517
|
+
throw new Error('register-push payload has a malformed "pushKeyBase64"');
|
|
5518
|
+
}
|
|
5519
|
+
if (decodedKey.length !== PUSH_KEY_LENGTH) {
|
|
5520
|
+
throw new Error(`register-push payload "pushKeyBase64" must decode to ${PUSH_KEY_LENGTH} bytes`);
|
|
5521
|
+
}
|
|
5522
|
+
request.pushKeyBase64 = payload.pushKeyBase64;
|
|
5523
|
+
}
|
|
5524
|
+
if (payload.platform !== void 0) {
|
|
5525
|
+
if (payload.platform !== "android" && payload.platform !== "ios") {
|
|
5526
|
+
throw new Error('register-push payload has an invalid "platform"');
|
|
5527
|
+
}
|
|
5528
|
+
request.platform = payload.platform;
|
|
5529
|
+
}
|
|
5530
|
+
if (request.action === "register") {
|
|
5531
|
+
if (request.expoPushToken === void 0) throw new Error('register-push register payload missing "expoPushToken"');
|
|
5532
|
+
if (request.pushKeyBase64 === void 0) throw new Error('register-push register payload missing "pushKeyBase64"');
|
|
5533
|
+
}
|
|
5534
|
+
return request;
|
|
5535
|
+
}
|
|
4643
5536
|
function parseCapabilityRequestPayload(verb, payload) {
|
|
4644
5537
|
switch (verb) {
|
|
4645
5538
|
case "read-stream":
|
|
@@ -4659,6 +5552,8 @@ function parseCapabilityRequestPayload(verb, payload) {
|
|
|
4659
5552
|
case "board-tool-read":
|
|
4660
5553
|
case "board-tool-write":
|
|
4661
5554
|
return parseBoardToolRequestPayload(payload);
|
|
5555
|
+
case "register-push":
|
|
5556
|
+
return parseRegisterPushRequestPayload(payload);
|
|
4662
5557
|
default: {
|
|
4663
5558
|
const exhaustiveCheck = verb;
|
|
4664
5559
|
throw new Error(`Unknown capability verb: ${String(exhaustiveCheck)}`);
|
|
@@ -4666,45 +5561,54 @@ function parseCapabilityRequestPayload(verb, payload) {
|
|
|
4666
5561
|
}
|
|
4667
5562
|
}
|
|
4668
5563
|
|
|
4669
|
-
// src/
|
|
4670
|
-
var
|
|
4671
|
-
|
|
4672
|
-
|
|
4673
|
-
|
|
4674
|
-
|
|
4675
|
-
|
|
4676
|
-
|
|
4677
|
-
|
|
4678
|
-
|
|
4679
|
-
|
|
4680
|
-
const remaining = bytes.length - i;
|
|
4681
|
-
if (remaining === 1) {
|
|
4682
|
-
const chunk = bytes[i] << 16;
|
|
4683
|
-
result += ALPHABET[chunk >> 18 & 63] + ALPHABET[chunk >> 12 & 63];
|
|
4684
|
-
} else if (remaining === 2) {
|
|
4685
|
-
const chunk = bytes[i] << 16 | bytes[i + 1] << 8;
|
|
4686
|
-
result += ALPHABET[chunk >> 18 & 63] + ALPHABET[chunk >> 12 & 63] + ALPHABET[chunk >> 6 & 63];
|
|
4687
|
-
}
|
|
4688
|
-
return result;
|
|
5564
|
+
// src/crypto/push-envelope.ts
|
|
5565
|
+
var PUSH_CATEGORIES = ["permission-needed", "agent-question", "turn-complete", "session-failed"];
|
|
5566
|
+
function isPushCategory(value) {
|
|
5567
|
+
return typeof value === "string" && PUSH_CATEGORIES.includes(value);
|
|
5568
|
+
}
|
|
5569
|
+
var PUSH_ENVELOPE_MAX_AGE_MS = 24 * 60 * 60 * 1e3;
|
|
5570
|
+
var PUSH_ENVELOPE_MAX_FUTURE_SKEW_MS = 5 * 60 * 1e3;
|
|
5571
|
+
function requireEnvelopeString(record, field) {
|
|
5572
|
+
const value = record[field];
|
|
5573
|
+
if (typeof value !== "string") throw new Error(`push envelope plaintext is missing a string "${field}"`);
|
|
5574
|
+
return value;
|
|
4689
5575
|
}
|
|
4690
|
-
function
|
|
4691
|
-
|
|
4692
|
-
|
|
4693
|
-
|
|
4694
|
-
|
|
4695
|
-
let outputIndex = 0;
|
|
4696
|
-
for (const char of encoded) {
|
|
4697
|
-
const value = DECODE_MAP[char];
|
|
4698
|
-
if (value === void 0) throw new Error(`Invalid base64url character: "${char}"`);
|
|
4699
|
-
bitBuffer = bitBuffer << 6 | value;
|
|
4700
|
-
bitCount += 6;
|
|
4701
|
-
if (bitCount >= 8) {
|
|
4702
|
-
bitCount -= 8;
|
|
4703
|
-
bytes[outputIndex] = bitBuffer >> bitCount & 255;
|
|
4704
|
-
outputIndex += 1;
|
|
4705
|
-
}
|
|
5576
|
+
function parsePushEnvelopePlaintext(value) {
|
|
5577
|
+
if (!isRecord(value)) throw new Error("push envelope plaintext must be an object");
|
|
5578
|
+
if (!isPushCategory(value.category)) throw new Error('push envelope plaintext has an unknown "category"');
|
|
5579
|
+
if (typeof value.sentAt !== "number" || !Number.isFinite(value.sentAt)) {
|
|
5580
|
+
throw new Error('push envelope plaintext has an invalid "sentAt"');
|
|
4706
5581
|
}
|
|
4707
|
-
return
|
|
5582
|
+
return {
|
|
5583
|
+
category: value.category,
|
|
5584
|
+
projectId: requireEnvelopeString(value, "projectId"),
|
|
5585
|
+
taskId: requireEnvelopeString(value, "taskId"),
|
|
5586
|
+
sessionId: requireEnvelopeString(value, "sessionId"),
|
|
5587
|
+
taskTitle: requireEnvelopeString(value, "taskTitle"),
|
|
5588
|
+
detail: requireEnvelopeString(value, "detail"),
|
|
5589
|
+
sentAt: value.sentAt
|
|
5590
|
+
};
|
|
5591
|
+
}
|
|
5592
|
+
function sealPushEnvelope(pushKey, recipientStaticPublicKey, plaintext) {
|
|
5593
|
+
const nonce = randomBytes4(XCHACHA_NONCE_LENGTH);
|
|
5594
|
+
const encodedPlaintext = new TextEncoder().encode(JSON.stringify(plaintext));
|
|
5595
|
+
const ciphertext = xaeadEncrypt(pushKey, nonce, recipientStaticPublicKey, encodedPlaintext);
|
|
5596
|
+
return base64UrlEncode(concatBytes4(nonce, ciphertext));
|
|
5597
|
+
}
|
|
5598
|
+
function openPushEnvelope(pushKey, recipientStaticPublicKey, blob) {
|
|
5599
|
+
const bytes = base64UrlDecode(blob);
|
|
5600
|
+
if (bytes.length < XCHACHA_NONCE_LENGTH + AEAD_TAG_LENGTH) {
|
|
5601
|
+
throw new Error("push envelope blob is too short");
|
|
5602
|
+
}
|
|
5603
|
+
const nonce = bytes.subarray(0, XCHACHA_NONCE_LENGTH);
|
|
5604
|
+
const ciphertext = bytes.subarray(XCHACHA_NONCE_LENGTH);
|
|
5605
|
+
const decrypted = xaeadDecrypt(pushKey, nonce, recipientStaticPublicKey, ciphertext);
|
|
5606
|
+
const decoded = JSON.parse(new TextDecoder().decode(decrypted));
|
|
5607
|
+
const plaintext = parsePushEnvelopePlaintext(decoded);
|
|
5608
|
+
const now = Date.now();
|
|
5609
|
+
if (plaintext.sentAt < now - PUSH_ENVELOPE_MAX_AGE_MS) throw new Error("push envelope is stale");
|
|
5610
|
+
if (plaintext.sentAt > now + PUSH_ENVELOPE_MAX_FUTURE_SKEW_MS) throw new Error("push envelope sentAt is in the future");
|
|
5611
|
+
return plaintext;
|
|
4708
5612
|
}
|
|
4709
5613
|
|
|
4710
5614
|
// src/pairing/qr.ts
|
|
@@ -4882,6 +5786,10 @@ function parseActivityEventPayload(payload) {
|
|
|
4882
5786
|
if (typeof payload.pending !== "boolean") throw new Error('permission payload is missing "pending"');
|
|
4883
5787
|
return { type: "permission", promptId: payload.promptId, pending: payload.pending };
|
|
4884
5788
|
}
|
|
5789
|
+
case "session-ended": {
|
|
5790
|
+
if (typeof payload.intentional !== "boolean") throw new Error('session-ended payload is missing "intentional"');
|
|
5791
|
+
return { type: "session-ended", intentional: payload.intentional };
|
|
5792
|
+
}
|
|
4885
5793
|
default:
|
|
4886
5794
|
throw new Error('activity payload has an unknown "type"');
|
|
4887
5795
|
}
|
|
@@ -4892,7 +5800,7 @@ function isBridgeEvent(value) {
|
|
|
4892
5800
|
case "transcript": {
|
|
4893
5801
|
if (typeof value.sessionId !== "string" || typeof value.taskId !== "string") return false;
|
|
4894
5802
|
try {
|
|
4895
|
-
|
|
5803
|
+
parseTranscriptEventPayload(value.payload);
|
|
4896
5804
|
return true;
|
|
4897
5805
|
} catch {
|
|
4898
5806
|
return false;
|
|
@@ -4911,6 +5819,15 @@ function isBridgeEvent(value) {
|
|
|
4911
5819
|
if (typeof value.sessionId !== "string" || typeof value.taskId !== "string") return false;
|
|
4912
5820
|
return isRecord(value.payload) && typeof value.payload.data === "string";
|
|
4913
5821
|
}
|
|
5822
|
+
case "terminal-resize": {
|
|
5823
|
+
if (typeof value.sessionId !== "string" || typeof value.taskId !== "string") return false;
|
|
5824
|
+
try {
|
|
5825
|
+
parseTerminalDimensionsWire(value.payload);
|
|
5826
|
+
return true;
|
|
5827
|
+
} catch {
|
|
5828
|
+
return false;
|
|
5829
|
+
}
|
|
5830
|
+
}
|
|
4914
5831
|
case "board": {
|
|
4915
5832
|
if (typeof value.projectId !== "string") return false;
|
|
4916
5833
|
if (value.taskId !== void 0 && typeof value.taskId !== "string") return false;
|
|
@@ -4929,15 +5846,20 @@ export {
|
|
|
4929
5846
|
BOARD_TOOL_READ_NAMES,
|
|
4930
5847
|
BOARD_TOOL_WRITE_NAMES,
|
|
4931
5848
|
CAPABILITY_VERBS,
|
|
5849
|
+
COMPRESSION_THRESHOLD,
|
|
4932
5850
|
CipherState,
|
|
4933
5851
|
ED25519_KEY_LENGTH,
|
|
4934
5852
|
FrameTag,
|
|
4935
5853
|
HandshakeState,
|
|
4936
5854
|
IKPSK0_PATTERN,
|
|
4937
5855
|
KK_PATTERN,
|
|
5856
|
+
MAX_DECODED_LENGTH,
|
|
4938
5857
|
MAX_FRAME_LENGTH,
|
|
4939
5858
|
PAIRING_URI_SCHEME,
|
|
4940
5859
|
PROTOCOL_VERSION,
|
|
5860
|
+
PUSH_CATEGORIES,
|
|
5861
|
+
PUSH_ENVELOPE_MAX_AGE_MS,
|
|
5862
|
+
PUSH_ENVELOPE_MAX_FUTURE_SKEW_MS,
|
|
4941
5863
|
SecretstreamState,
|
|
4942
5864
|
SessionFrameKind,
|
|
4943
5865
|
X25519_KEY_LENGTH,
|
|
@@ -4968,8 +5890,10 @@ export {
|
|
|
4968
5890
|
isBridgeEvent,
|
|
4969
5891
|
isCapabilityVerb,
|
|
4970
5892
|
isJsonValue,
|
|
5893
|
+
isPushCategory,
|
|
4971
5894
|
isRecord,
|
|
4972
5895
|
isRosterEntryExpired,
|
|
5896
|
+
openPushEnvelope,
|
|
4973
5897
|
parseActivityEventPayload,
|
|
4974
5898
|
parseBacklogItemWire,
|
|
4975
5899
|
parseBoardColumnWire,
|
|
@@ -4977,14 +5901,20 @@ export {
|
|
|
4977
5901
|
parseCapabilityRequestPayload,
|
|
4978
5902
|
parseDiffFileContentWire,
|
|
4979
5903
|
parseDiffFileListWire,
|
|
5904
|
+
parsePushEnvelopePlaintext,
|
|
4980
5905
|
parseReadBoardResponsePayload,
|
|
4981
5906
|
parseReadDiffResponsePayload,
|
|
4982
5907
|
parseReadStreamResponsePayload,
|
|
5908
|
+
parseRegisterPushRequestPayload,
|
|
4983
5909
|
parseSessionEventWire,
|
|
4984
5910
|
parseSessionUsageWire,
|
|
5911
|
+
parseTerminalDimensionsWire,
|
|
4985
5912
|
parseTranscriptEntriesWire,
|
|
5913
|
+
parseTranscriptEventPayload,
|
|
5914
|
+
parseTranscriptWindowResponsePayload,
|
|
4986
5915
|
randomBytes4 as randomBytes,
|
|
4987
5916
|
rosterDeviceCapabilitySet,
|
|
5917
|
+
sealPushEnvelope,
|
|
4988
5918
|
signRosterEntry,
|
|
4989
5919
|
unwrapSessionFrame,
|
|
4990
5920
|
verifyRosterEntry,
|