@highway1/core 0.1.29 → 0.1.30

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.js CHANGED
@@ -1092,11 +1092,15 @@ function createDHTOperations(libp2p) {
1092
1092
  break;
1093
1093
  }
1094
1094
  }
1095
- const caps = (card.capabilities ?? []).map(
1096
- (c) => typeof c === "string" ? c : c.name
1097
- ).filter(Boolean);
1095
+ const caps = (card.capabilities ?? []).flatMap((c) => {
1096
+ if (typeof c === "string") return [c];
1097
+ return [c.name, c.id].filter(Boolean);
1098
+ });
1098
1099
  caps.push("__all__");
1099
1100
  const importantCaps = ["__all__"];
1101
+ if (caps.some((cap) => capKey(cap) === "relay")) {
1102
+ importantCaps.push("relay");
1103
+ }
1100
1104
  await Promise.all(importantCaps.map(async (cap) => {
1101
1105
  const capKeyStr = `/clawiverse/cap/${capKey(cap)}`;
1102
1106
  const capDHTKey = fromString(capKeyStr);
@@ -1379,13 +1383,13 @@ function createMessageRouter(libp2p, verifyFn, dht, relayPeers) {
1379
1383
  } catch {
1380
1384
  }
1381
1385
  }
1386
+ let lastError;
1382
1387
  if (!stream) {
1383
1388
  const allRelayAddrs = [
1384
1389
  ...relayMultiaddrs,
1385
1390
  ...(relayPeers ?? []).map((r) => buildCircuitRelayAddr(r, targetPeerIdStr))
1386
1391
  ];
1387
1392
  const uniqueRelayAddrs = [...new Set(allRelayAddrs)];
1388
- let lastError;
1389
1393
  for (const addr of uniqueRelayAddrs) {
1390
1394
  try {
1391
1395
  const conn = await libp2p.dial(multiaddr(addr));
@@ -1398,7 +1402,6 @@ function createMessageRouter(libp2p, verifyFn, dht, relayPeers) {
1398
1402
  lastError = relayErr;
1399
1403
  }
1400
1404
  }
1401
- if (!stream) throw lastError ?? new MessagingError("All dial attempts failed");
1402
1405
  }
1403
1406
  if (!stream && dht && "queryRelayPeers" in dht) {
1404
1407
  const discoveredRelays = await dht.queryRelayPeers();
@@ -1411,9 +1414,12 @@ function createMessageRouter(libp2p, verifyFn, dht, relayPeers) {
1411
1414
  break;
1412
1415
  } catch (e) {
1413
1416
  logger5.warn("DHT relay failed", { relayAddr, error: e.message });
1417
+ lastError = e;
1414
1418
  }
1415
1419
  }
1416
- if (!stream) throw new MessagingError("All dial attempts failed (including DHT-discovered relays)");
1420
+ }
1421
+ if (!stream) {
1422
+ throw lastError ?? new MessagingError("All dial attempts failed (including DHT-discovered relays)");
1417
1423
  }
1418
1424
  const encoded = encodeMessage(envelope);
1419
1425
  await stream.sink(
@@ -1515,6 +1521,17 @@ async function handleIncomingStream(stream, handlers, catchAllHandler, _verifyFn
1515
1521
  logger5.warn("Received invalid message envelope");
1516
1522
  return;
1517
1523
  }
1524
+ const isValidSignature = await verifyEnvelope(envelope, async (signature, data2) => {
1525
+ const senderPublicKey = extractPublicKey(envelope.from);
1526
+ return verify(signature, data2, senderPublicKey);
1527
+ });
1528
+ if (!isValidSignature) {
1529
+ logger5.warn("Received message with invalid signature", {
1530
+ id: envelope.id,
1531
+ from: envelope.from
1532
+ });
1533
+ return;
1534
+ }
1518
1535
  logger5.info("Received message", {
1519
1536
  id: envelope.id,
1520
1537
  from: envelope.from,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/errors.ts","../src/identity/keys.ts","../src/identity/did.ts","../src/identity/signer.ts","../src/utils/logger.ts","../src/transport/node.ts","../src/discovery/agent-card-types.ts","../src/discovery/agent-card.ts","../src/discovery/agent-card-schema.ts","../src/discovery/agent-card-encoder.ts","../src/discovery/search-index.ts","../src/discovery/capability-matcher.ts","../src/discovery/semantic-search.ts","../src/discovery/dht.ts","../src/messaging/envelope.ts","../src/messaging/codec.ts","../src/messaging/router.ts","../src/trust/trust-score.ts","../src/trust/interaction-history.ts","../src/trust/endorsement.ts","../src/trust/sybil-defense.ts","../src/trust/index.ts"],"names":["LogLevel","cborEncode","cborDecode","logger","uint8ArrayToString","uint8ArrayFromString","Level"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAO,IAAM,eAAA,GAAN,cAA8B,KAAA,CAAM;AAAA,EACzC,WAAA,CACE,OAAA,EACO,IAAA,EACA,OAAA,EACP;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAHN,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAGP,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AACF;AAEO,IAAM,aAAA,GAAN,cAA4B,eAAA,CAAgB;AAAA,EACjD,WAAA,CAAY,SAAiB,OAAA,EAAmB;AAC9C,IAAA,KAAA,CAAM,OAAA,EAAS,kBAAkB,OAAO,CAAA;AACxC,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AAAA,EACd;AACF;AAEO,IAAM,cAAA,GAAN,cAA6B,eAAA,CAAgB;AAAA,EAClD,WAAA,CAAY,SAAiB,OAAA,EAAmB;AAC9C,IAAA,KAAA,CAAM,OAAA,EAAS,mBAAmB,OAAO,CAAA;AACzC,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AAAA,EACd;AACF;AAEO,IAAM,cAAA,GAAN,cAA6B,eAAA,CAAgB;AAAA,EAClD,WAAA,CAAY,SAAiB,OAAA,EAAmB;AAC9C,IAAA,KAAA,CAAM,OAAA,EAAS,mBAAmB,OAAO,CAAA;AACzC,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AAAA,EACd;AACF;AAEO,IAAM,cAAA,GAAN,cAA6B,eAAA,CAAgB;AAAA,EAClD,WAAA,CAAY,SAAiB,OAAA,EAAmB;AAC9C,IAAA,KAAA,CAAM,OAAA,EAAS,mBAAmB,OAAO,CAAA;AACzC,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AAAA,EACd;AACF;;;AC1BA,eAAsB,eAAA,GAAoC;AACxD,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAqB,cAAM,gBAAA,EAAiB;AAClD,IAAA,MAAM,SAAA,GAAY,MAAc,OAAA,CAAA,iBAAA,CAAkB,UAAU,CAAA;AAE5D,IAAA,OAAO;AAAA,MACL,SAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,aAAA,CAAc,6BAAA,EAA+B,KAAK,CAAA;AAAA,EAC9D;AACF;AAKA,eAAsB,IAAA,CACpB,SACA,UAAA,EACqB;AACrB,EAAA,IAAI;AACF,IAAA,OAAO,MAAc,OAAA,CAAA,SAAA,CAAU,OAAA,EAAS,UAAU,CAAA;AAAA,EACpD,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,aAAA,CAAc,wBAAA,EAA0B,KAAK,CAAA;AAAA,EACzD;AACF;AAKA,eAAsB,MAAA,CACpB,SAAA,EACA,OAAA,EACA,SAAA,EACkB;AAClB,EAAA,IAAI;AACF,IAAA,OAAO,MAAc,OAAA,CAAA,WAAA,CAAY,SAAA,EAAW,OAAA,EAAS,SAAS,CAAA;AAAA,EAChE,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,aAAA,CAAc,4BAAA,EAA8B,KAAK,CAAA;AAAA,EAC7D;AACF;AAKO,SAAS,cAAc,OAAA,EAG5B;AACA,EAAA,OAAO;AAAA,IACL,WAAW,MAAA,CAAO,IAAA,CAAK,QAAQ,SAAS,CAAA,CAAE,SAAS,KAAK,CAAA;AAAA,IACxD,YAAY,MAAA,CAAO,IAAA,CAAK,QAAQ,UAAU,CAAA,CAAE,SAAS,KAAK;AAAA,GAC5D;AACF;AAKO,SAAS,cAAc,QAAA,EAGlB;AACV,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,IAAI,UAAA,CAAW,MAAA,CAAO,KAAK,QAAA,CAAS,SAAA,EAAW,KAAK,CAAC,CAAA;AAAA,IAChE,UAAA,EAAY,IAAI,UAAA,CAAW,MAAA,CAAO,KAAK,QAAA,CAAS,UAAA,EAAY,KAAK,CAAC;AAAA,GACpE;AACF;ACvEO,SAAS,UAAU,SAAA,EAA+B;AACvD,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,MAAA,CAAO,SAAS,CAAA;AAC1C,IAAA,OAAO,kBAAkB,OAAO,CAAA,CAAA;AAAA,EAClC,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,aAAA,CAAc,sBAAA,EAAwB,KAAK,CAAA;AAAA,EACvD;AACF;AAKO,SAAS,iBAAiB,GAAA,EAAyB;AACxD,EAAA,IAAI,CAAC,GAAA,CAAI,UAAA,CAAW,iBAAiB,CAAA,EAAG;AACtC,IAAA,MAAM,IAAI,cAAc,qDAAqD,CAAA;AAAA,EAC/E;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,OAAA,CAAQ,iBAAA,EAAmB,EAAE,CAAA;AACjD,IAAA,OAAO,SAAA,CAAU,OAAO,OAAO,CAAA;AAAA,EACjC,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,aAAA,CAAc,uCAAA,EAAyC,KAAK,CAAA;AAAA,EACxE;AACF;AAKO,SAAS,YAAY,GAAA,EAAsB;AAChD,EAAA,IAAI,CAAC,GAAA,CAAI,UAAA,CAAW,iBAAiB,CAAA,EAAG;AACtC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,OAAA,CAAQ,iBAAA,EAAmB,EAAE,CAAA;AACjD,IAAA,SAAA,CAAU,OAAO,OAAO,CAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;AClCA,eAAsB,WAAA,CACpB,OAAA,EACA,UAAA,EACA,SAAA,EACwB;AACxB,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,OAAA,EAAS,UAAU,CAAA;AAChD,IAAA,MAAM,MAAA,GAAS,UAAU,SAAS,CAAA;AAElC,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,aAAA,CAAc,wBAAA,EAA0B,KAAK,CAAA;AAAA,EACzD;AACF;AAKA,eAAsB,aAAA,CACpB,eACA,iBAAA,EACkB;AAClB,EAAA,IAAI;AACF,IAAA,MAAM,WAAA,GAAc,UAAU,iBAAiB,CAAA;AAE/C,IAAA,IAAI,aAAA,CAAc,WAAW,WAAA,EAAa;AACxC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,MAAM,MAAA;AAAA,MACX,aAAA,CAAc,SAAA;AAAA,MACd,aAAA,CAAc,OAAA;AAAA,MACd;AAAA,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,aAAA,CAAc,0BAAA,EAA4B,KAAK,CAAA;AAAA,EAC3D;AACF;;;ACtDO,IAAK,QAAA,qBAAAA,SAAAA,KAAL;AACL,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,WAAQ,CAAA,CAAA,GAAR,OAAA;AACA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,UAAO,CAAA,CAAA,GAAP,MAAA;AACA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,UAAO,CAAA,CAAA,GAAP,MAAA;AACA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,WAAQ,CAAA,CAAA,GAAR,OAAA;AAJU,EAAA,OAAAA,SAAAA;AAAA,CAAA,EAAA,QAAA,IAAA,EAAA;AAOL,IAAM,SAAN,MAAa;AAAA,EACV,KAAA;AAAA,EACA,MAAA;AAAA,EAER,WAAA,CAAY,MAAA,EAAgB,KAAA,GAAkB,CAAA,aAAe;AAC3D,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA,EAEA,SAAS,KAAA,EAAuB;AAC9B,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA,EAEA,KAAA,CAAM,YAAoB,IAAA,EAAuB;AAC/C,IAAA,IAAI,IAAA,CAAK,SAAS,CAAA,cAAgB;AAChC,MAAA,OAAA,CAAQ,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,MAAM,CAAA,QAAA,CAAA,EAAY,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,IAC3D;AAAA,EACF;AAAA,EAEA,IAAA,CAAK,YAAoB,IAAA,EAAuB;AAC9C,IAAA,IAAI,IAAA,CAAK,SAAS,CAAA,aAAe;AAC/B,MAAA,OAAA,CAAQ,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAM,CAAA,OAAA,CAAA,EAAW,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,IACzD;AAAA,EACF;AAAA,EAEA,IAAA,CAAK,YAAoB,IAAA,EAAuB;AAC9C,IAAA,IAAI,IAAA,CAAK,SAAS,CAAA,aAAe;AAC/B,MAAA,OAAA,CAAQ,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAM,CAAA,OAAA,CAAA,EAAW,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,IACzD;AAAA,EACF;AAAA,EAEA,KAAA,CAAM,YAAoB,IAAA,EAAuB;AAC/C,IAAA,IAAI,IAAA,CAAK,SAAS,CAAA,cAAgB;AAChC,MAAA,OAAA,CAAQ,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,MAAM,CAAA,QAAA,CAAA,EAAY,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,IAC3D;AAAA,EACF;AACF;AAEO,IAAM,YAAA,GAAe,CAAC,MAAA,EAAgB,KAAA,KAA6B;AACxE,EAAA,OAAO,IAAI,MAAA,CAAO,MAAA,EAAQ,KAAK,CAAA;AACjC;;;AC9BA,IAAM,MAAA,GAAS,aAAa,WAAW,CAAA;AA4BvC,eAAsB,WACpB,MAAA,EACyB;AACzB,EAAA,IAAI;AACF,IAAA,MAAM;AAAA,MACJ,eAAA,GAAkB,CAAC,oBAAoB,CAAA;AAAA,MACvC,iBAAiB,EAAC;AAAA,MAClB,SAAA,GAAY,IAAA;AAAA,MACZ,WAAA,GAAc,KAAA;AAAA,MACd,gBAAA,GAAmB,KAAA;AAAA,MACnB,UAAA,GAAa,KAAA;AAAA,MACb;AAAA,KACF,GAAI,MAAA;AAGJ,IAAA,MAAM,gBAAA,GAAmB,gBAAA,GACrB,cAAA,CAAe,GAAA,CAAI,CAAC,SAAS,CAAA,EAAG,IAAI,CAAA,YAAA,CAAc,CAAA,GAClD,EAAC;AAEL,IAAA,MAAM,YAAA,GAAoB;AAAA,MACxB,SAAA,EAAW;AAAA,QACT,MAAA,EAAQ,CAAC,GAAG,eAAA,EAAiB,GAAG,gBAAgB;AAAA,OAClD;AAAA,MACA,GAAI,UAAA,GAAa,EAAE,UAAA,KAAe,EAAC;AAAA,MACnC,UAAA,EAAY;AAAA,QACV,GAAA,EAAI;AAAA,QACJ,qBAAA;AAAsB,OACxB;AAAA,MACA,oBAAA,EAAsB,CAAC,KAAA,EAAO,CAAA;AAAA,MAC9B,YAAA,EAAc,CAAC,KAAA,EAAO,CAAA;AAAA,MACtB,iBAAA,EAAmB;AAAA,QACjB,cAAA,EAAgB,cAAA,CAAe,MAAA,GAAS,CAAA,GAAI,CAAA,GAAI,CAAA;AAAA,QAChD,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,QAAA,EAAU;AAAA,QACR,UAAU,QAAA,EAAS;AAAA,QACnB,MAAM,IAAA;AAAK;AACb,KACF;AAEA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,YAAA,CAAa,QAAA,CAAS,QAAQ,kBAAA,CAAmB;AAAA,QAC/C,YAAA,EAAc;AAAA,UACZ,eAAA,EAAiB;AAAA;AAAA;AACnB,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,YAAA,CAAa,QAAA,CAAS,MAAM,MAAA,CAAO;AAAA,QACjC,UAAA,EAAY,KAAA;AAAA,QACZ,cAAA,EAAgB,iBAAA;AAAA,QAChB,UAAA,EAAY;AAAA,UACV,YAAY,YAAY;AAAA,UAAC;AAAA,SAC3B;AAAA,QACA,SAAA,EAAW;AAAA,UACT,YAAY,MAAM;AAAA,SACpB;AAAA;AAAA,QAEA,WAAA,EAAa,EAAA;AAAA;AAAA,QACb,iBAAA,EAAmB,GAAA;AAAA;AAAA;AAAA,QAEnB,uBAAA,EAAyB;AAAA,OAC1B,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,gBAAuB,EAAC;AAC9B,IAAA,IAAI,cAAA,CAAe,MAAA,GAAS,CAAA,EAAG,aAAA,CAAc,IAAA,CAAK,UAAU,EAAE,IAAA,EAAM,cAAA,EAAgB,CAAC,CAAA;AACrF,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,OAAO,cAAc,CAAA;AAC5C,MAAA,aAAA,CAAc,IAAA,CAAK,MAAM,CAAA;AAAA,IAC3B;AACA,IAAA,IAAI,aAAA,CAAc,MAAA,GAAS,CAAA,EAAG,YAAA,CAAa,aAAA,GAAgB,aAAA;AAE3D,IAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,YAAY,CAAA;AAE9C,IAAA,MAAA,CAAO,KAAK,qBAAA,EAAuB;AAAA,MACjC,eAAA,EAAiB,aAAa,SAAA,CAAU,MAAA;AAAA,MACxC;AAAA,KACD,CAAA;AAED,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,OAAO,YAAY;AACjB,QAAA,MAAM,OAAO,KAAA,EAAM;AACnB,QAAA,MAAA,CAAO,KAAK,cAAA,EAAgB;AAAA,UAC1B,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,QAAA,EAAS;AAAA,UAC/B,SAAA,EAAW,OAAO,aAAA,EAAc,CAAE,IAAI,CAAC,EAAA,KAAO,EAAA,CAAG,QAAA,EAAU,CAAA;AAAA,UAC3D,KAAA,EAAO,WAAA;AAAA,UACP;AAAA,SACD,CAAA;AAAA,MACH,CAAA;AAAA,MACA,MAAM,YAAY;AAChB,QAAA,MAAM,OAAO,IAAA,EAAK;AAClB,QAAA,MAAA,CAAO,KAAK,cAAc,CAAA;AAAA,MAC5B,CAAA;AAAA,MACA,eAAe,MAAM;AACnB,QAAA,OAAO,MAAA,CAAO,eAAc,CAAE,GAAA,CAAI,CAAC,EAAA,KAAO,EAAA,CAAG,UAAU,CAAA;AAAA,MACzD,CAAA;AAAA,MACA,WAAW,MAAM;AACf,QAAA,OAAO,MAAA,CAAO,OAAO,QAAA,EAAS;AAAA,MAChC;AAAA,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,cAAA,CAAe,iCAAA,EAAmC,KAAK,CAAA;AAAA,EACnE;AACF;;;AClFO,SAAS,aAAa,IAAA,EAA4D;AACvF,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,YAAY,CAAA,IAC/B,IAAA,CAAK,YAAA,CAAa,MAAA,GAAS,CAAA,IAC3B,OAAO,IAAA,CAAK,YAAA,CAAa,CAAC,CAAA,KAAM,QAAA;AACzC;AAKO,SAAS,kBAAkB,MAAA,EAAoC;AACpE,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,YAAA,EAAc,MAAA,CAAO,YAAA,CAAa,GAAA,CAAI,CAAA,GAAA,MAAQ;AAAA,MAC5C,EAAA,EAAI,GAAA;AAAA,MACJ,IAAA,EAAM,GAAA;AAAA,MACN,WAAA,EAAa,eAAe,GAAG,CAAA;AAAA,KACjC,CAAE;AAAA,GACJ;AACF;AAKO,SAAS,sBAAsB,IAAA,EAAkC;AACtE,EAAA,MAAM,EAAE,UAAA,EAAY,CAAA,EAAG,OAAO,EAAA,EAAI,GAAG,MAAK,GAAI,IAAA;AAC9C,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,cAAc,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,EAAE;AAAA,GACnD;AACF;;;ACtFA,IAAM,qBAAA,GAA4E;AAAA,EAChF,IAAA,EAAM,QAAA;AAAA,EACN,UAAA,EAAY;AAAA,IACV,GAAA,EAAK,EAAE,IAAA,EAAM,QAAA,EAAU,SAAS,wCAAA,EAAyC;AAAA,IACzE,MAAM,EAAE,IAAA,EAAM,UAAU,SAAA,EAAW,CAAA,EAAG,WAAW,GAAA,EAAI;AAAA,IACrD,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAU,WAAW,GAAA,EAAI;AAAA,IAC9C,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAU,SAAS,sBAAA,EAAuB;AAAA,IAC3D,YAAA,EAAc;AAAA,MACZ,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACxB,QAAA,EAAU,CAAA;AAAA,MACV,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACxB,QAAA,EAAU,CAAA;AAAA,MACV,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,IACzC,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,QAAA;AAAA,MACN,QAAA,EAAU,IAAA;AAAA,MACV,UAAU;AAAC,KACb;AAAA,IACA,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA;AAAS,GAC9B;AAAA,EACA,QAAA,EAAU,CAAC,KAAA,EAAO,MAAA,EAAQ,eAAe,SAAA,EAAW,cAAA,EAAgB,aAAa,WAAW,CAAA;AAAA,EAC5F,oBAAA,EAAsB;AACxB,CAAA;AAEA,IAAM,GAAA,GAAM,IAAI,GAAA,EAAI;AACpB,IAAM,oBAAA,GAAuB,GAAA,CAAI,OAAA,CAAQ,qBAAqB,CAAA;AAKvD,SAAS,eAAA,CACd,KACA,IAAA,EACA,WAAA,EACA,cACA,SAAA,GAAsB,EAAC,EACvB,MAAA,EACA,QAAA,EAC8B;AAC9B,EAAA,OAAO;AAAA,IACL,GAAA;AAAA,IACA,IAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAA,EAAS,OAAA;AAAA,IACT,YAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA,EAAW,KAAK,GAAA;AAAI,GACtB;AACF;AAMO,SAAS,qBAAA,CACd,KACA,IAAA,EACA,WAAA,EACA,cACA,SAAA,GAAsB,EAAC,EACvB,MAAA,EACA,QAAA,EACoC;AACpC,EAAA,OAAO;AAAA,IACL,GAAA;AAAA,IACA,IAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAA,EAAS,OAAA;AAAA,IACT,YAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA,EAAW,KAAK,GAAA;AAAI,GACtB;AACF;AAKO,SAAS,kBAAkB,IAAA,EAAoD;AACpF,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,IAAA,EAAM;AAC7C,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,CAAA,GAAI,IAAA;AAGV,EAAA,IAAI,OAAO,CAAA,CAAE,SAAA,KAAc,QAAA,EAAU;AACnC,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IAAI,YAAA,CAAa,CAAQ,CAAA,EAAG;AAC1B,IAAA,OAAO,qBAAqB,CAAC,CAAA;AAAA,EAC/B;AAIA,EAAA,OACE,OAAO,CAAA,CAAE,GAAA,KAAQ,QAAA,IACjB,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,IAClB,OAAO,CAAA,CAAE,WAAA,KAAgB,QAAA,IACzB,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,IACrB,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,YAAY,CAAA,IAC5B,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,SAAS,CAAA,IACzB,OAAO,CAAA,CAAE,SAAA,KAAc,QAAA;AAE3B;AAKA,eAAsB,aAAA,CACpB,MACA,MAAA,EACoB;AACpB,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AACpC,IAAA,MAAM,SAAA,GAAY,IAAI,WAAA,EAAY,CAAE,OAAO,QAAQ,CAAA;AACnD,IAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,SAAS,CAAA;AAExC,IAAA,OAAO;AAAA,MACL,GAAG,IAAA;AAAA,MACH,WAAW,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,CAAE,SAAS,KAAK;AAAA,KAClD;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,cAAA,CAAe,2BAAA,EAA6B,KAAK,CAAA;AAAA,EAC7D;AACF;AAKA,eAAsB,eAAA,CACpB,MACA,QAAA,EACkB;AAClB,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,SAAA,EAAW,GAAG,cAAA,EAAe,GAAI,IAAA;AACzC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,cAAc,CAAA;AAC9C,IAAA,MAAM,SAAA,GAAY,IAAI,WAAA,EAAY,CAAE,OAAO,QAAQ,CAAA;AACnD,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,IAAA,CAAK,SAAA,EAAW,KAAK,CAAA;AAEnD,IAAA,OAAO,MAAM,QAAA,CAAS,cAAA,EAAgB,SAAS,CAAA;AAAA,EACjD,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,cAAA,CAAe,6BAAA,EAA+B,KAAK,CAAA;AAAA,EAC/D;AACF;AAMO,SAAS,iBAAA,CACd,MACA,UAAA,EACS;AACT,EAAA,IAAI,YAAA,CAAa,IAAI,CAAA,EAAG;AACtB,IAAA,OAAO,KAAK,YAAA,CAAa,IAAA;AAAA,MAAK,CAAC,QAC7B,GAAA,CAAI,WAAA,GAAc,QAAA,CAAS,UAAA,CAAW,aAAa;AAAA,KACrD;AAAA,EACF;AAEA,EAAA,OAAO,KAAK,YAAA,CAAa,IAAA;AAAA,IAAK,CAAC,GAAA,KAC7B,GAAA,CAAI,EAAA,CAAG,WAAA,EAAY,CAAE,QAAA,CAAS,UAAA,CAAW,WAAA,EAAa,CAAA,IACtD,GAAA,CAAI,IAAA,CAAK,WAAA,EAAY,CAAE,QAAA,CAAS,UAAA,CAAW,WAAA,EAAa,CAAA,IACxD,GAAA,CAAI,WAAA,CAAY,WAAA,EAAY,CAAE,QAAA,CAAS,UAAA,CAAW,WAAA,EAAa;AAAA,GACjE;AACF;;;ACtLO,IAAM,kBAAA,GAAqB;AAC3B,IAAM,kBAAA,GAAqB;AAM3B,IAAM,iBAAA,GAAoB;AAAA,EAC/B,UAAA,EAAY;AAAA,IACV,QAAA,EAAU,kBAAA;AAAA,IACV,QAAA,EAAU,kBAAA;AAAA,IACV,WAAA,EAAa,4BAAA;AAAA,IACb,YAAA,EAAc,eAAA;AAAA,IACd,KAAA,EAAO,KAAA;AAAA,IACP,MAAA,EAAQ,aAAA;AAAA,IACR,aAAA,EAAe,oBAAA;AAAA,IACf,SAAA,EAAW,wBAAA;AAAA,IACX,cAAA,EAAgB;AAAA,MACd,KAAA,EAAO,wBAAA;AAAA,MACP,OAAA,EAAS,KAAA;AAAA,MACT,YAAA,EAAc;AAAA,KAChB;AAAA,IACA,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc;AAAA,KAChB;AAAA,IACA,QAAA,EAAU,mBAAA;AAAA,IACV,OAAA,EAAS,uBAAA;AAAA,IACT,UAAA,EAAY,2BAAA;AAAA,IACZ,WAAA,EAAa,qBAAA;AAAA,IACb,WAAA,EAAa,sBAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,KAAA,EAAO,eAAA;AAAA,MACP,YAAA,EAAc;AAAA;AAChB;AAEJ;AAMO,IAAM,eAAA,GAAkB;AAAA,EAC7B,WAAA,EAAa,oBAAA;AAAA,EACb,WAAA,EAAa,mBAAA;AAAA,EACb,aAAA,EAAe,qBAAA;AAAA,EACf,eAAA,EAAiB,uBAAA;AAAA,EACjB,gBAAA,EAAkB,wBAAA;AAAA,EAClB,MAAA,EAAQ,eAAA;AAAA,EACR,WAAA,EAAa,oBAAA;AAAA,EACb,OAAA,EAAS,gBAAA;AAAA,EACT,SAAA,EAAW,kBAAA;AAAA,EACX,cAAA,EAAgB;AAClB;AAKO,IAAM,cAAA,GAAiB;AAAA,EAC5B,MAAA,EAAQ,QAAA;AAAA,EACR,MAAA,EAAQ,QAAA;AAAA,EACR,OAAA,EAAS,SAAA;AAAA,EACT,MAAA,EAAQ,QAAA;AAAA,EACR,KAAA,EAAO;AACT;AAKO,SAAS,mBAAA,GAAgC;AAC9C,EAAA,OAAO,CAAC,oBAAoB,kBAAkB,CAAA;AAChD;AAKO,SAAS,eAAe,OAAA,EAA2B;AACxD,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,GAAG,OAAO,KAAA;AACpC,EAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,CAAA,KAAK,OAAO,MAAM,QAAQ,CAAA;AACjD;ACrEO,SAAS,aAAa,IAAA,EAA6B;AACxD,EAAA,IAAI;AAEF,IAAA,MAAM,EAAE,UAAA,EAAY,CAAA,EAAG,GAAG,oBAAmB,GAAI,IAAA;AACjD,IAAA,OAAOC,OAAW,kBAAkB,CAAA;AAAA,EACtC,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,cAAA,CAAe,qCAAA,EAAuC,KAAK,CAAA;AAAA,EACvE;AACF;AAKO,SAAS,aAAa,IAAA,EAAyB;AACpD,EAAA,IAAI;AAEF,IAAA,MAAM,eAAA,GAA6B;AAAA,MACjC,UAAA,EAAY,IAAA,CAAK,UAAU,CAAA,IAAK,mBAAA,EAAoB;AAAA,MACpD,GAAG;AAAA,KACL;AACA,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,eAAA,EAAiB,IAAA,EAAM,CAAC,CAAA;AAAA,EAChD,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,cAAA,CAAe,wCAAA,EAA0C,KAAK,CAAA;AAAA,EAC1E;AACF;AAKO,SAAS,eAAe,IAAA,EAA6B;AAC1D,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAUC,OAAW,IAAI,CAAA;AAG/B,IAAA,IAAI,YAAA,CAAa,OAAO,CAAA,EAAG;AACzB,MAAA,OAAO,kBAAkB,OAAO,CAAA;AAAA,IAClC;AAGA,IAAA,IAAI,CAAC,OAAA,CAAQ,UAAU,CAAA,EAAG;AACxB,MAAA,OAAA,CAAQ,UAAU,IAAI,mBAAA,EAAoB;AAAA,IAC5C;AAEA,IAAA,OAAO,OAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,cAAA,CAAe,uCAAA,EAAyC,KAAK,CAAA;AAAA,EACzE;AACF;AAKO,SAAS,eAAe,IAAA,EAAyB;AACtD,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAG/B,IAAA,IAAI,YAAA,CAAa,OAAO,CAAA,EAAG;AACzB,MAAA,OAAO,kBAAkB,OAAO,CAAA;AAAA,IAClC;AAGA,IAAA,IAAI,CAAC,OAAA,CAAQ,UAAU,CAAA,EAAG;AACxB,MAAA,OAAA,CAAQ,UAAU,IAAI,mBAAA,EAAoB;AAAA,IAC5C;AAEA,IAAA,OAAO,OAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,cAAA,CAAe,uCAAA,EAAyC,KAAK,CAAA;AAAA,EACzE;AACF;AAKO,SAAS,gBAAgB,IAAA,EAAsC;AACpE,EAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,OAAO,eAAe,IAAI,CAAA;AAAA,EAC5B;AAGA,EAAA,IAAI;AACF,IAAA,OAAO,eAAe,IAAI,CAAA;AAAA,EAC5B,CAAA,CAAA,MAAQ;AAEN,IAAA,MAAM,IAAA,GAAO,IAAI,WAAA,EAAY,CAAE,OAAO,IAAI,CAAA;AAC1C,IAAA,IAAI,IAAA,CAAK,IAAA,EAAK,CAAE,UAAA,CAAW,GAAG,CAAA,EAAG;AAC/B,MAAA,OAAO,eAAe,IAAI,CAAA;AAAA,IAC5B;AACA,IAAA,MAAM,IAAI,eAAe,6CAA6C,CAAA;AAAA,EACxE;AACF;AAKO,SAAS,eAAe,IAAA,EAAiD;AAC9E,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,YAAA,CAAa,IAAI,CAAA,CAAE,MAAA;AAAA,IACzB,IAAA,EAAM,YAAA,CAAa,IAAI,CAAA,CAAE;AAAA,GAC3B;AACF;AC3GA,IAAMC,OAAAA,GAAS,aAAa,cAAc,CAAA;AA4BnC,IAAM,cAAN,MAAkB;AAAA,EACf,KAAA,uBAAY,GAAA,EAAuB;AAAA,EACnC,SAAA;AAAA,EACA,IAAA;AAAA,EACA,YAAA,GAAe,KAAA;AAAA;AAAA;AAAA;AAAA,EAKvB,eAAe,IAAA,EAAuB;AACpC,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA;AAC7B,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAAA,OAAAA,CAAO,KAAA,CAAM,oBAAA,EAAsB,EAAE,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,YAAA,EAAc,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ,CAAA;AAAA,EAC9F;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,GAAA,EAAmB;AACjC,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AACrB,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAAA,OAAAA,CAAO,KAAA,CAAM,+BAAA,EAAiC,EAAE,KAAK,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,KAAA,EAAsC;AAC3C,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACf;AAEA,IAAA,IAAI,UAA0B,EAAC;AAG/B,IAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,IAAA,CAAK,SAAA,EAAW;AAChC,MAAA,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,KAAA,CAAM,IAAI,CAAA;AAAA,IACxC,CAAA,MAAA,IAES,KAAA,CAAM,UAAA,IAAc,IAAA,CAAK,IAAA,EAAM;AACtC,MAAA,OAAA,GAAU,IAAA,CAAK,kBAAA,CAAmB,KAAA,CAAM,UAAU,CAAA;AAAA,IACpD,CAAA,MAEK;AACH,MAAA,OAAA,GAAU,KAAA,CAAM,KAAK,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,CAAE,IAAI,CAAA,IAAA,MAAS;AAAA,QACrD,IAAA;AAAA,QACA,KAAA,EAAO;AAAA,OACT,CAAE,CAAA;AAAA,IACJ;AAGA,IAAA,IAAI,MAAM,OAAA,EAAS;AACjB,MAAA,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,KAAA,CAAM,OAAO,CAAA;AAAA,IACpD;AAGA,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAGxC,IAAA,IAAI,MAAM,KAAA,EAAO;AACf,MAAA,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA;AAAA,IACxC;AAEA,IAAAA,OAAAA,CAAO,MAAM,kBAAA,EAAoB,EAAE,OAAO,OAAA,EAAS,OAAA,CAAQ,QAAQ,CAAA;AACnE,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAA2B;AACzB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AACjB,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AACjB,IAAA,IAAA,CAAK,IAAA,GAAO,MAAA;AACZ,IAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AACpB,IAAAA,OAAAA,CAAO,KAAK,sBAAsB,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,GAAe;AACb,IAAA,OAAO,KAAK,KAAA,CAAM,IAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKQ,OAAA,GAAgB;AACtB,IAAAA,OAAAA,CAAO,KAAK,2BAAA,EAA6B,EAAE,OAAO,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAEnE,IAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAG5C,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,WAA8B;AAClD,MAAA,IAAA,CAAK,IAAI,KAAK,CAAA;AACd,MAAA,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,EAAE,KAAA,EAAO,IAAI,CAAA;AAChC,MAAA,IAAA,CAAK,KAAA,CAAM,aAAA,EAAe,EAAE,KAAA,EAAO,GAAG,CAAA;AACtC,MAAA,IAAA,CAAK,MAAM,cAAc,CAAA;AAEzB,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,IAAA,CAAK,GAAA,CAAI;AAAA,UACP,KAAK,IAAA,CAAK,GAAA;AAAA,UACV,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,aAAa,IAAA,CAAK,WAAA;AAAA,UAClB,YAAA,EAAc,IAAA,CAAK,YAAA,CAChB,GAAA,CAAI,CAAC,GAAA,KAAa,CAAA,EAAG,GAAA,CAAI,IAAI,IAAI,GAAA,CAAI,WAAW,CAAA,CAAE,CAAA,CAClD,KAAK,GAAG;AAAA,SACZ,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,IAAA,CAAK,KAAA,CAAM,KAAK,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,CAAA,EAAG;AAAA,MACpD,IAAA,EAAM;AAAA,QACJ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,GAAA,EAAI;AAAA,QAC5B,EAAE,IAAA,EAAM,aAAA,EAAe,MAAA,EAAQ,GAAA,EAAI;AAAA,QACnC,EAAE,IAAA,EAAM,mBAAA,EAAqB,MAAA,EAAQ,GAAA,EAAI;AAAA,QACzC,EAAE,IAAA,EAAM,0BAAA,EAA4B,MAAA,EAAQ,GAAA;AAAI,OAClD;AAAA,MACA,SAAA,EAAW,GAAA;AAAA,MACX,YAAA,EAAc;AAAA,KACf,CAAA;AAED,IAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AACpB,IAAAA,OAAAA,CAAO,KAAK,wBAAwB,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,IAAA,EAA8B;AACjD,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,EAAW,OAAO,EAAC;AAE7B,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,IAAI,CAAA;AAC9C,IAAA,OAAO,WAAA,CAAY,IAAI,CAAA,MAAA,MAAW;AAAA,MAChC,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,OAAO,GAAG,CAAA;AAAA,MAC/B,OAAO,MAAA,CAAO;AAAA,KAChB,CAAE,CAAA;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,UAAA,EAAoC;AAC7D,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAM,OAAO,EAAC;AAExB,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,UAAU,CAAA;AAC/C,IAAA,OAAO,WAAA,CAAY,IAAI,CAAA,MAAA,MAAW;AAAA,MAChC,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,KAAA,EAAO,CAAA,IAAK,MAAA,CAAO,KAAA,IAAS,CAAA;AAAA;AAAA,KAC9B,CAAE,CAAA;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAA,CACN,SACA,OAAA,EACgB;AAChB,IAAA,OAAO,OAAA,CAAQ,OAAO,CAAA,MAAA,KAAU;AAC9B,MAAA,MAAM,EAAE,MAAK,GAAI,MAAA;AAGjB,MAAA,IAAI,OAAA,CAAQ,aAAA,KAAkB,MAAA,IAAa,IAAA,CAAK,KAAA,EAAO;AACrD,QAAA,MAAM,YAAA,GACJ,KAAK,KAAA,CAAM,gBAAA,GAAmB,MAC9B,IAAA,CAAK,GAAA,CAAI,KAAK,KAAA,CAAM,YAAA,GAAe,IAAI,CAAC,CAAA,GAAI,MAC5C,IAAA,CAAK,KAAA,CAAM,iBAAiB,GAAA,GAC5B,IAAA,CAAK,MAAM,MAAA,GAAS,GAAA;AAEtB,QAAA,IAAI,YAAA,GAAe,QAAQ,aAAA,EAAe;AACxC,UAAA,OAAO,KAAA;AAAA,QACT;AAAA,MACF;AAGA,MAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,QAAA,MAAM,WAAA,GAAc,KAAK,YAAA,CAAa,IAAA;AAAA,UACpC,CAAA,GAAA,KAAO;AACL,YAAA,MAAM,WAAW,GAAA,CAAI,QAAA;AACrB,YAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AACtB,YAAA,OAAO,QAAA,CAAS,QAAA,KAAa,OAAA,CAAQ,QAAA,IAC7B,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,IAAK,QAAA,CAAS,SAAA,CAAU,QAAA,CAAS,QAAQ,QAAQ,CAAA;AAAA,UAC3F;AAAA,SACF;AACA,QAAA,IAAI,CAAC,aAAa,OAAO,KAAA;AAAA,MAC3B;AAGA,MAAA,IAAI,OAAA,CAAQ,IAAA,IAAQ,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,EAAG;AAC3C,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,QAAA,EAAU,IAAI,CAAA,GAAK,IAAA,CAAK,QAAA,CAAS,IAAA,GAAoB,EAAC;AAC1F,QAAA,MAAM,UAAA,GAAa,QAAQ,IAAA,CAAK,KAAA,CAAM,SAAO,QAAA,CAAS,QAAA,CAAS,GAAG,CAAC,CAAA;AACnE,QAAA,IAAI,CAAC,YAAY,OAAO,KAAA;AAAA,MAC1B;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AACF;;;AC1OO,IAAM,oBAAN,MAAwB;AAAA;AAAA;AAAA;AAAA;AAAA,EAK7B,KAAA,CAAM,OAAsB,UAAA,EAAgC;AAC1D,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,IAAI,OAAA,GAAU,CAAA;AAGd,IAAA,IAAI,KAAA,CAAM,UAAA,IAAc,UAAA,CAAW,EAAA,KAAO,MAAM,UAAA,EAAY;AAC1D,MAAA,OAAO,CAAA;AAAA,IACT;AAGA,IAAA,IAAI,MAAM,UAAA,EAAY;AACpB,MAAA,MAAM,YAAY,IAAA,CAAK,UAAA,CAAW,KAAA,CAAM,UAAA,EAAY,WAAW,IAAI,CAAA;AACnE,MAAA,KAAA,IAAS,SAAA,GAAY,GAAA;AACrB,MAAA,OAAA,IAAW,GAAA;AAAA,IACb;AAGA,IAAA,IAAI,MAAM,IAAA,EAAM;AACd,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,KAAA,CAAM,IAAI,CAAA;AAChD,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,aAAA,CAAc,QAAA,EAAU,UAAU,CAAA;AAC5D,MAAA,KAAA,IAAS,YAAA,GAAe,GAAA;AACxB,MAAA,OAAA,IAAW,GAAA;AAAA,IACb;AAGA,IAAA,IAAI,KAAA,CAAM,UAAA,IAAc,UAAA,CAAW,OAAO,CAAA,EAAG;AAC3C,MAAA,MAAM,SAAA,GAAY,KAAK,WAAA,CAAY,KAAA,CAAM,YAAY,UAAA,CAAW,OAAO,CAAC,CAAA,GAAI,GAAA,GAAM,CAAA;AAClF,MAAA,KAAA,IAAS,SAAA,GAAY,GAAA;AACrB,MAAA,OAAA,IAAW,GAAA;AAAA,IACb;AAEA,IAAA,OAAO,OAAA,GAAU,CAAA,GAAI,KAAA,GAAQ,OAAA,GAAU,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,IAAA,EAAwB;AAEtC,IAAA,MAAM,SAAA,uBAAgB,GAAA,CAAI;AAAA,MACxB,GAAA;AAAA,MAAK,IAAA;AAAA,MAAM,KAAA;AAAA,MAAO,IAAA;AAAA,MAAM,KAAA;AAAA,MAAO,KAAA;AAAA,MAAO,MAAA;AAAA,MAAQ,IAAA;AAAA,MAAM,MAAA;AAAA,MACpD,IAAA;AAAA,MAAM,MAAA;AAAA,MAAQ,IAAA;AAAA,MAAM,IAAA;AAAA,MAAM,IAAA;AAAA,MAAM,IAAA;AAAA,MAAM,KAAA;AAAA,MAAO,MAAA;AAAA,MAAQ,OAAA;AAAA,MACrD,KAAA;AAAA,MAAO,OAAA;AAAA,MAAS,QAAA;AAAA,MAAU,OAAA;AAAA,MAAS,MAAA;AAAA,MAAQ,IAAA;AAAA,MAAM,MAAA;AAAA,MAAQ,KAAA;AAAA,MACzD,GAAA;AAAA,MAAK,KAAA;AAAA,MAAO,IAAA;AAAA,MAAM,KAAA;AAAA,MAAO,IAAA;AAAA,MAAM,IAAA;AAAA,MAAM,MAAA;AAAA,MAAQ,IAAA;AAAA,MAAM,KAAA;AAAA,MAAO;AAAA,KAC3D,CAAA;AAED,IAAA,OAAO,IAAA,CACJ,WAAA,EAAY,CACZ,KAAA,CAAM,KAAK,CAAA,CACX,MAAA,CAAO,CAAA,IAAA,KAAQ,IAAA,CAAK,SAAS,CAAA,IAAK,CAAC,SAAA,CAAU,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,CAAc,UAAoB,UAAA,EAAgC;AAChE,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AAElC,IAAA,MAAM,OAAA,GAAU,GAAG,UAAA,CAAW,IAAI,IAAI,UAAA,CAAW,WAAW,GAAG,WAAA,EAAY;AAC3E,IAAA,MAAM,UAAU,QAAA,CAAS,MAAA,CAAO,aAAW,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAC,CAAA;AAEpE,IAAA,OAAO,OAAA,CAAQ,SAAS,QAAA,CAAS,MAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,CAAY,OAAe,IAAA,EAAuB;AAChD,IAAA,MAAM,UAAA,GAAa,MAAM,WAAA,EAAY;AACrC,IAAA,MAAM,SAAA,GAAY,KAAK,WAAA,EAAY;AAGnC,IAAA,IAAI,SAAA,CAAU,QAAA,CAAS,UAAU,CAAA,EAAG,OAAO,IAAA;AAG3C,IAAA,MAAM,OAAA,GAAoC;AAAA,MACxC,SAAA,EAAW,CAAC,aAAA,EAAe,oBAAoB,CAAA;AAAA,MAC/C,MAAA,EAAQ,CAAC,YAAA,EAAc,eAAe,CAAA;AAAA,MACtC,OAAA,EAAS,CAAC,UAAA,EAAY,cAAc,CAAA;AAAA,MACpC,QAAA,EAAU,CAAC,YAAA,EAAc,gBAAA,EAAkB,iBAAiB,CAAA;AAAA,MAC5D,MAAA,EAAQ,CAAC,eAAA,EAAiB,OAAO,CAAA;AAAA,MACjC,OAAA,EAAS,CAAC,aAAA,EAAe,oBAAoB,CAAA;AAAA,MAC7C,KAAA,EAAO,CAAC,SAAA,EAAW,gBAAgB,CAAA;AAAA,MACnC,OAAA,EAAS,CAAC,WAAA,EAAa,kBAAkB,CAAA;AAAA,MACzC,IAAA,EAAM,CAAC,gBAAA,EAAkB,uBAAuB;AAAA,KAClD;AAEA,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AACnD,MAAA,IAAI,UAAA,CAAW,QAAA,CAAS,GAAG,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,CAAA,CAAA,KAAK,SAAA,CAAU,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG;AACvE,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAA,CAAW,OAAe,MAAA,EAAwB;AACxD,IAAA,MAAM,UAAA,GAAa,MAAM,WAAA,EAAY;AACrC,IAAA,MAAM,WAAA,GAAc,OAAO,WAAA,EAAY;AAGvC,IAAA,IAAI,UAAA,KAAe,aAAa,OAAO,CAAA;AAGvC,IAAA,IAAI,WAAA,CAAY,QAAA,CAAS,UAAU,CAAA,EAAG,OAAO,GAAA;AAC7C,IAAA,IAAI,UAAA,CAAW,QAAA,CAAS,WAAW,CAAA,EAAG,OAAO,GAAA;AAG7C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,mBAAA,CAAoB,UAAA,EAAY,WAAW,CAAA;AACjE,IAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,MAAA,EAAQ,YAAY,MAAM,CAAA;AAC7D,IAAA,MAAM,UAAA,GAAa,IAAI,QAAA,GAAW,MAAA;AAGlC,IAAA,OAAO,UAAA,GAAa,GAAA,GAAM,UAAA,GAAa,GAAA,GAAM,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAA,CAAoB,GAAW,CAAA,EAAmB;AACxD,IAAA,MAAM,SAAqB,EAAC;AAE5B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AAClC,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AAClC,MAAA,MAAA,CAAO,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA;AAAA,IACjB;AAEA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AAClC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AAClC,QAAA,IAAI,CAAA,CAAE,OAAO,CAAA,GAAI,CAAC,MAAM,CAAA,CAAE,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,EAAG;AACvC,UAAA,MAAA,CAAO,CAAC,EAAE,CAAC,CAAA,GAAI,OAAO,CAAA,GAAI,CAAC,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA;AAAA,QACpC,CAAA,MAAO;AACL,UAAA,MAAA,CAAO,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA;AAAA,YAClB,OAAO,CAAA,GAAI,CAAC,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA;AAAA;AAAA,YACvB,MAAA,CAAO,CAAC,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA;AAAA;AAAA,YACnB,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI;AAAA;AAAA,WACrB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,MAAA,CAAO,CAAA,CAAE,MAAM,CAAA,CAAE,EAAE,MAAM,CAAA;AAAA,EAClC;AACF;;;ACxJA,IAAMA,OAAAA,GAAS,aAAa,iBAAiB,CAAA;AAKtC,IAAM,uBAAN,MAA2B;AAAA,EAIhC,YAAoB,GAAA,EAAqB;AAArB,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAClB,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,WAAA,EAAY;AAC7B,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,iBAAA,EAAkB;AAAA,EACvC;AAAA,EANQ,KAAA;AAAA,EACA,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWR,MAAM,OAAO,KAAA,EAA4C;AACvD,IAAAA,OAAAA,CAAO,IAAA,CAAK,sBAAA,EAAwB,EAAE,OAAO,CAAA;AAG7C,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA;AAC5C,IAAAA,QAAO,KAAA,CAAM,sBAAA,EAAwB,EAAE,KAAA,EAAO,YAAA,CAAa,QAAQ,CAAA;AAGnE,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,EAAA;AAC7B,IAAA,IAAI,YAAA,CAAa,MAAA,GAAS,KAAA,IAAS,IAAA,CAAK,GAAA,EAAK;AAC3C,MAAAA,OAAAA,CAAO,MAAM,8CAA8C,CAAA;AAC3D,MAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,aAAA,CAAc,KAAK,CAAA;AACrD,MAAA,OAAO,IAAA,CAAK,YAAA,CAAa,YAAA,EAAc,cAAA,EAAgB,KAAK,CAAA;AAAA,IAC9D;AAEA,IAAA,OAAO,YAAA,CAAa,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,IAAA,EAAuB;AACpC,IAAA,IAAA,CAAK,KAAA,CAAM,eAAe,IAAI,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,GAAA,EAAmB;AACjC,IAAA,IAAA,CAAK,KAAA,CAAM,gBAAgB,GAAG,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAA,GAAkC;AAChC,IAAA,OAAO,IAAA,CAAK,MAAM,WAAA,EAAY;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,MAAM,IAAA,EAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cAAc,KAAA,EAA+C;AACzE,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACb,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,IAAI;AAGF,MAAA,MAAM,aAAa,KAAA,CAAM,UAAA,IAAc,IAAA,CAAK,wBAAA,CAAyB,MAAM,IAAI,CAAA;AAE/E,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAAA,OAAAA,CAAO,MAAM,6DAA6D,CAAA;AAC1E,QAAA,OAAO,EAAC;AAAA,MACV;AAEA,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,GAAA,CAAI,kBAAkB,UAAU,CAAA;AACzD,MAAAA,QAAO,KAAA,CAAM,wBAAA,EAA0B,EAAE,KAAA,EAAO,KAAA,CAAM,QAAQ,CAAA;AAG9D,MAAA,OAAO,KAAA,CAAM,IAAI,CAAA,IAAA,KAAQ;AACvB,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,KAAK,CAAA;AACxC,QAAA,OAAO,EAAE,MAAM,KAAA,EAAM;AAAA,MACvB,CAAC,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAAA,OAAAA,CAAO,KAAA,CAAM,uBAAA,EAAyB,EAAE,OAAO,CAAA;AAC/C,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAA,CACN,KAAA,EACA,OAAA,EACA,KAAA,EACa;AACb,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,MAAM,SAAyB,EAAC;AAGhC,IAAA,KAAA,MAAW,UAAU,KAAA,EAAO;AAC1B,MAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAG;AAC9B,QAAA,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AACxB,QAAA,MAAA,CAAO,KAAK,MAAM,CAAA;AAAA,MACpB;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAG;AAC9B,QAAA,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AACxB,QAAA,MAAA,CAAO,KAAK,MAAM,CAAA;AAGlB,QAAA,IAAA,CAAK,KAAA,CAAM,cAAA,CAAe,MAAA,CAAO,IAAI,CAAA;AAAA,MACvC;AAAA,IACF;AAGA,IAAA,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AACvC,IAAA,OAAO,MAAA,CAAO,MAAM,CAAA,EAAG,KAAK,EAAE,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAI,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAA,CAAU,MAAiB,KAAA,EAA8B;AAC/D,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,IAAA,KAAA,MAAW,UAAA,IAAc,KAAK,YAAA,EAAc;AAC1C,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,OAAO,UAAU,CAAA;AAClD,MAAA,IAAI,QAAQ,CAAA,EAAG;AACb,QAAA,UAAA,IAAc,KAAA;AACd,QAAA,KAAA,EAAA;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,QAAA,GAAW,KAAA,GAAQ,CAAA,GAAI,UAAA,GAAa,KAAA,GAAQ,CAAA;AAGlD,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,gBAAA,GAAmB,GAAA;AACjD,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,QAAA,GAAW,UAAA,EAAY,CAAG,CAAA;AAAA,IAC5C;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,yBAAyB,IAAA,EAAmC;AAClE,IAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAElB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB,IAAI,CAAA;AAGlD,IAAA,MAAM,kBAAA,GAAqB;AAAA,MACzB,WAAA;AAAA,MAAa,aAAA;AAAA,MACb,QAAA;AAAA,MAAU,MAAA;AAAA,MACV,SAAA;AAAA,MAAW,UAAA;AAAA,MACX,UAAA;AAAA,MAAY,YAAA;AAAA,MACZ,QAAA;AAAA,MAAU,OAAA;AAAA,MACV,SAAA;AAAA,MAAW,aAAA;AAAA,MACX,OAAA;AAAA,MAAS,SAAA;AAAA,MACT,SAAA;AAAA,MAAW,WAAA;AAAA,MACX,MAAA;AAAA,MAAQ;AAAA,KACV;AAGA,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,IAAI,kBAAA,CAAmB,QAAA,CAAS,OAAO,CAAA,EAAG;AACxC,QAAA,OAAO,OAAA;AAAA,MACT;AAAA,IACF;AAGA,IAAA,OAAO,SAAS,CAAC,CAAA;AAAA,EACnB;AACF;AAKO,SAAS,qBAAqB,GAAA,EAA2C;AAC9E,EAAA,OAAO,IAAI,qBAAqB,GAAG,CAAA;AACrC;;;AC/MA,IAAMA,OAAAA,GAAS,aAAa,KAAK,CAAA;AAiBjC,SAAS,aAAa,KAAA,EAA+B;AACnD,EAAA,IAAI,MAAM,IAAA,KAAS,OAAA,IAAW,KAAA,CAAM,KAAA,SAAc,KAAA,CAAM,KAAA;AACxD,EAAA,IAAI,MAAM,IAAA,KAAS,eAAA,IAAmB,KAAA,CAAM,KAAA,SAAc,KAAA,CAAM,KAAA;AAChE,EAAA,OAAO,IAAA;AACT;AAGA,SAAS,OAAO,GAAA,EAAqB;AACnC,EAAA,OAAO,GAAA,CAAI,WAAA,EAAY,CAAE,OAAA,CAAQ,gBAAgB,GAAG,CAAA;AACtD;AAGA,eAAe,WAAA,CAAY,KAAU,GAAA,EAAoC;AACvE,EAAA,IAAI;AACF,IAAA,WAAA,MAAiB,KAAA,IAAS,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,EAAE,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,GAAK,CAAA,EAAG,CAAA,EAAG;AAC9E,MAAA,MAAM,GAAA,GAAM,aAAa,KAAK,CAAA;AAC9B,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,MAAM,IAAA,GAAOC,SAAmB,GAAG,CAAA;AACnC,QAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAE,OAAO,OAAO,CAAA;AAAA,MACxC;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,EAAC;AACV;AAGA,eAAe,YAAA,CAAa,GAAA,EAAU,GAAA,EAAiB,IAAA,EAA+B;AACpF,EAAA,MAAM,KAAA,GAAQC,UAAA,CAAqB,CAAC,GAAG,IAAI,GAAA,CAAI,IAAI,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAEhE,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,CAAA,EAAG,OAAA,EAAA,EAAW;AAC7C,IAAA,IAAI;AACF,MAAA,WAAA,MAAiB,CAAA,IAAK,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,KAAA,EAAO,EAAE,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,GAAK,CAAA,EAAG,CAAA,EAAG;AAAA,MAAgB;AACnG,MAAA;AAAA,IACF,SAAS,CAAA,EAAQ;AACf,MAAA,IAAI,CAAA,EAAG,IAAA,KAAS,YAAA,IAAgB,OAAA,GAAU,CAAA,EAAG;AAC3C,QAAAF,OAAAA,CAAO,KAAA,CAAM,CAAA,2BAAA,EAA8B,OAAO,CAAA,MAAA,CAAQ,CAAA;AAC1D,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAA,EAAG,IAAA,KAAS,YAAA,EAAc,MAAM,CAAA;AAAA,IACtC;AAAA,EACF;AACF;AAKO,SAAS,oBAAoB,MAAA,EAA+B;AACjE,EAAA,MAAM,aAA4B,EAAC;AACnC,EAAA,MAAM,YAAA,GAAe,qBAAqB,UAAU,CAAA;AAEpD,EAAA,OAAO,MAAA,CAAO,OAAO,UAAA,EAAY;AAAA,IAC/B,gBAAA,EAAkB,OAAO,IAAA,KAAoB;AAC3C,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAO,OAAe,QAAA,EAAU,GAAA;AACtC,QAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,eAAe,2BAA2B,CAAA;AAG9D,QAAA,MAAM,QAAA,GAAWE,UAAA,CAAqB,CAAA,kBAAA,EAAqB,IAAA,CAAK,GAAG,CAAA,CAAE,CAAA;AAErE,QAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,CAAA,EAAG,OAAA,EAAA,EAAW;AAC7C,UAAA,IAAI;AACF,YAAA,WAAA,MAAiB,CAAA,IAAK,GAAA,CAAI,GAAA,CAAI,QAAA,EAAU,aAAa,IAAI,CAAA,EAAG,EAAE,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,GAAK,CAAA,EAAG,CAAA,EAAG;AAAA,YAAgB;AACrH,YAAA;AAAA,UACF,SAAS,CAAA,EAAQ;AACf,YAAA,IAAI,CAAA,EAAG,IAAA,KAAS,YAAA,IAAgB,OAAA,GAAU,CAAA,EAAG;AAC3C,cAAAF,OAAAA,CAAO,KAAA,CAAM,CAAA,sCAAA,EAAyC,OAAO,CAAA,MAAA,CAAQ,CAAA;AACrE,cAAA;AAAA,YACF;AACA,YAAAA,QAAO,IAAA,CAAK,uCAAA,EAAyC,EAAE,KAAA,EAAQ,CAAA,CAAY,SAAS,CAAA;AACpF,YAAA;AAAA,UACF;AAAA,QACF;AAIA,QAAA,MAAM,IAAA,GAAA,CAAkB,IAAA,CAAK,YAAA,IAAgB,EAAC,EAAG,GAAA;AAAA,UAAI,CAAC,CAAA,KACpD,OAAO,CAAA,KAAM,QAAA,GAAW,IAAI,CAAA,CAAE;AAAA,SAChC,CAAE,OAAO,OAAO,CAAA;AAGhB,QAAA,IAAA,CAAK,KAAK,SAAS,CAAA;AAGnB,QAAA,MAAM,aAAA,GAAgB,CAAC,SAAS,CAAA;AAChC,QAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,OAAO,GAAA,KAAQ;AACjD,UAAA,MAAM,SAAA,GAAY,CAAA,gBAAA,EAAmB,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AAChD,UAAA,MAAM,SAAA,GAAYE,WAAqB,SAAS,CAAA;AAChD,UAAA,IAAI;AACF,YAAA,MAAM,QAAA,GAAW,MAAM,WAAA,CAAY,GAAA,EAAK,SAAS,CAAA;AACjD,YAAA,IAAI,CAAC,QAAA,CAAS,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA,EAAG;AAChC,cAAA,MAAM,YAAA,CAAa,KAAK,SAAA,EAAW,CAAC,GAAG,QAAA,EAAU,IAAA,CAAK,GAAG,CAAC,CAAA;AAC1D,cAAAF,OAAAA,CAAO,KAAA,CAAM,2BAAA,EAA6B,EAAE,GAAA,EAAK,MAAA,CAAO,GAAG,CAAA,EAAG,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,CAAA;AAAA,YAC/E;AAAA,UACF,SAAS,CAAA,EAAQ;AACf,YAAAA,OAAAA,CAAO,IAAA,CAAK,wCAAA,EAA0C,EAAE,GAAA,EAAK,MAAA,CAAO,GAAG,CAAA,EAAG,KAAA,EAAQ,CAAA,CAAY,OAAA,EAAS,CAAA;AAAA,UACzG;AAAA,QACF,CAAC,CAAC,CAAA;AAGF,QAAA,YAAA,CAAa,eAAe,IAAI,CAAA;AAEhC,QAAAA,QAAO,IAAA,CAAK,6BAAA,EAA+B,EAAE,GAAA,EAAK,IAAA,CAAK,KAAK,CAAA;AAAA,MAC9D,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,IAAI,cAAA,CAAe,8BAAA,EAAgC,KAAK,CAAA;AAAA,MAChE;AAAA,IACF,CAAA;AAAA,IAEA,cAAA,EAAgB,OAAO,GAAA,KAAgB;AACrC,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAO,OAAe,QAAA,EAAU,GAAA;AACtC,QAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,eAAe,2BAA2B,CAAA;AAE9D,QAAA,MAAM,GAAA,GAAME,UAAA,CAAqB,CAAA,kBAAA,EAAqB,GAAG,CAAA,CAAE,CAAA;AAC3D,QAAA,WAAA,MAAiB,KAAA,IAAS,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA,EAAG;AACtC,UAAA,MAAM,GAAA,GAAM,aAAa,KAAK,CAAA;AAC9B,UAAA,IAAI,GAAA,EAAK;AACP,YAAA,MAAM,IAAA,GAAO,eAAe,GAAG,CAAA;AAC/B,YAAA,YAAA,CAAa,eAAe,IAAI,CAAA;AAChC,YAAAF,OAAAA,CAAO,KAAA,CAAM,yBAAA,EAA2B,EAAE,KAAK,CAAA;AAC/C,YAAA,OAAO,IAAA;AAAA,UACT;AAAA,QACF;AAEA,QAAAA,OAAAA,CAAO,KAAA,CAAM,6BAAA,EAA+B,EAAE,KAAK,CAAA;AACnD,QAAA,OAAO,IAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAAA,QAAO,IAAA,CAAK,4BAAA,EAA8B,EAAE,GAAA,EAAK,OAAO,CAAA;AACxD,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAA;AAAA,IAEA,iBAAA,EAAmB,OAAO,UAAA,KAAuB;AAC/C,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAO,OAAe,QAAA,EAAU,GAAA;AAGtC,QAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,kBAAA,EAAmB,CAAE,MAAA;AAAA,UAAO,CAAA,IAAA,KACrD,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,CAAC,GAAA,KAAa;AACnC,YAAA,MAAM,IAAA,GAAO,OAAO,GAAA,KAAQ,QAAA,GAAW,MAAM,GAAA,CAAI,IAAA;AACjD,YAAA,OAAO,MAAM,WAAA,EAAY,CAAE,QAAA,CAAS,UAAA,CAAW,aAAa,CAAA;AAAA,UAC9D,CAAC;AAAA,SACH;AACA,QAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AAG7B,QAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAElB,QAAA,MAAM,YAAYE,UAAA,CAAqB,CAAA,gBAAA,EAAmB,MAAA,CAAO,UAAU,CAAC,CAAA,CAAE,CAAA;AAC9E,QAAA,MAAM,IAAA,GAAO,MAAM,WAAA,CAAY,GAAA,EAAK,SAAS,CAAA;AAC7C,QAAAF,QAAO,KAAA,CAAM,sBAAA,EAAwB,EAAE,UAAA,EAAY,MAAM,CAAA;AAGzD,QAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,GAAA;AAAA,UAC1B,IAAA,CAAK,GAAA,CAAI,OAAO,GAAA,KAAQ;AACtB,YAAA,MAAM,GAAA,GAAME,UAAA,CAAqB,CAAA,kBAAA,EAAqB,GAAG,CAAA,CAAE,CAAA;AAC3D,YAAA,IAAI;AACF,cAAA,WAAA,MAAiB,KAAA,IAAS,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA,EAAG;AACtC,gBAAA,MAAM,GAAA,GAAM,aAAa,KAAK,CAAA;AAC9B,gBAAA,IAAI,GAAA,EAAK;AACP,kBAAA,MAAM,IAAA,GAAO,eAAe,GAAG,CAAA;AAC/B,kBAAA,YAAA,CAAa,eAAe,IAAI,CAAA;AAChC,kBAAA,OAAO,IAAA;AAAA,gBACT;AAAA,cACF;AAAA,YACF,CAAA,CAAA,MAAQ;AAAA,YAAyB;AACjC,YAAA,OAAO,IAAA;AAAA,UACT,CAAC;AAAA,SACH;AAEA,QAAA,OAAO,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAsB,MAAM,IAAI,CAAA;AAAA,MACvD,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,IAAI,cAAA,CAAe,+BAAA,EAAiC,KAAK,CAAA;AAAA,MACjE;AAAA,IACF,CAAA;AAAA,IAEA,cAAA,EAAgB,OAAO,KAAA,KAAyB;AAC9C,MAAA,IAAI;AAEF,QAAA,MAAM,GAAA,GAAO,OAAe,QAAA,EAAU,GAAA;AACtC,QAAA,IAAI,GAAA,EAAK;AACP,UAAA,MAAM,MAAA,GAASA,WAAqB,yBAAyB,CAAA;AAC7D,UAAA,MAAM,IAAA,GAAO,MAAM,WAAA,CAAY,GAAA,EAAK,MAAM,CAAA;AAC1C,UAAAF,QAAO,KAAA,CAAM,mBAAA,EAAqB,EAAE,KAAA,EAAO,IAAA,CAAK,QAAQ,CAAA;AAExD,UAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,YACZ,IAAA,CAAK,GAAA,CAAI,OAAO,GAAA,KAAQ;AACtB,cAAA,MAAM,GAAA,GAAME,UAAA,CAAqB,CAAA,kBAAA,EAAqB,GAAG,CAAA,CAAE,CAAA;AAC3D,cAAA,IAAI;AACF,gBAAA,WAAA,MAAiB,KAAA,IAAS,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA,EAAG;AACtC,kBAAA,MAAM,GAAA,GAAM,aAAa,KAAK,CAAA;AAC9B,kBAAA,IAAI,GAAA,EAAK;AACP,oBAAA,YAAA,CAAa,cAAA,CAAe,cAAA,CAAe,GAAG,CAAC,CAAA;AAC/C,oBAAA;AAAA,kBACF;AAAA,gBACF;AAAA,cACF,CAAA,CAAA,MAAQ;AAAA,cAAa;AAAA,YACvB,CAAC;AAAA,WACH;AAAA,QACF;AAEA,QAAA,OAAO,YAAA,CAAa,OAAO,KAAK,CAAA;AAAA,MAClC,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,IAAI,cAAA,CAAe,mCAAA,EAAqC,KAAK,CAAA;AAAA,MACrE;AAAA,IACF,CAAA;AAAA,IAEA,iBAAiB,YAA+B;AAC9C,MAAA,MAAM,GAAA,GAAO,OAAe,QAAA,EAAU,GAAA;AACtC,MAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAClB,MAAA,MAAM,SAAA,GAAYA,WAAqB,uBAAuB,CAAA;AAC9D,MAAA,MAAM,IAAA,GAAO,MAAM,WAAA,CAAY,GAAA,EAAK,SAAS,CAAA;AAC7C,MAAA,MAAM,QAAkB,EAAC;AACzB,MAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,OAAO,GAAA,KAAQ;AACxC,QAAA,MAAM,IAAA,GAAO,MAAM,UAAA,CAAW,cAAA,CAAe,GAAG,CAAA;AAChD,QAAA,IAAI,MAAM,SAAA,EAAW;AACnB,UAAA,KAAA,CAAM,IAAA,CAAK,GAAG,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,CAAC,CAAA,KAAc,CAAC,CAAA,CAAE,QAAA,CAAS,eAAe,CAAC,CAAC,CAAA;AAAA,QAClF;AAAA,MACF,CAAC,CAAC,CAAA;AACF,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAAA,IAEA,UAAA,EAAY,OAAO,GAAA,KAAgB;AACjC,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAO,OAAe,QAAA,EAAU,GAAA;AACtC,QAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,eAAe,2BAA2B,CAAA;AAE9D,QAAA,MAAM,GAAA,GAAMA,UAAA,CAAqB,CAAA,kBAAA,EAAqB,GAAG,CAAA,CAAE,CAAA;AAC3D,QAAA,WAAA,MAAiB,KAAA,IAAS,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA,EAAG;AACtC,UAAA,MAAM,GAAA,GAAM,aAAa,KAAK,CAAA;AAC9B,UAAA,IAAI,GAAA,EAAK;AACP,YAAA,MAAM,IAAA,GAAO,eAAe,GAAG,CAAA;AAC/B,YAAA,IAAI,KAAK,MAAA,EAAQ;AACf,cAAAF,OAAAA,CAAO,MAAM,sBAAA,EAAwB,EAAE,KAAK,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AACjE,cAAA,OAAO,EAAE,QAAQ,IAAA,CAAK,MAAA,EAAQ,YAAY,IAAA,CAAK,SAAA,IAAa,EAAC,EAAE;AAAA,YACjE;AACA,YAAAA,OAAAA,CAAO,IAAA,CAAK,oCAAA,EAAsC,EAAE,KAAK,CAAA;AACzD,YAAA,OAAO,IAAA;AAAA,UACT;AAAA,QACF;AAEA,QAAAA,OAAAA,CAAO,KAAA,CAAM,sBAAA,EAAwB,EAAE,KAAK,CAAA;AAC5C,QAAA,OAAO,IAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAAA,QAAO,IAAA,CAAK,uBAAA,EAAyB,EAAE,GAAA,EAAK,OAAO,CAAA;AACnD,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAAA,GACD,CAAA;AACH;;;ACpQO,SAAS,eACd,IAAA,EACA,EAAA,EACA,IAAA,EACA,QAAA,EACA,SACA,OAAA,EACoC;AACpC,EAAA,OAAO;AAAA,IACL,IAAI,iBAAA,EAAkB;AAAA,IACtB,IAAA;AAAA,IACA,EAAA;AAAA,IACA,IAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,IACpB;AAAA,GACF;AACF;AAKA,eAAsB,YAAA,CACpB,UACA,MAAA,EAC0B;AAC1B,EAAA,IAAI;AACF,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AAC5C,IAAA,MAAM,aAAA,GAAgB,IAAI,WAAA,EAAY,CAAE,OAAO,YAAY,CAAA;AAC3D,IAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,aAAa,CAAA;AAE5C,IAAA,OAAO;AAAA,MACL,GAAG,QAAA;AAAA,MACH,WAAW,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,CAAE,SAAS,KAAK;AAAA,KAClD;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,cAAA,CAAe,yBAAA,EAA2B,KAAK,CAAA;AAAA,EAC3D;AACF;AAKA,eAAsB,cAAA,CACpB,UACA,QAAA,EACkB;AAClB,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,SAAA,EAAW,GAAG,kBAAA,EAAmB,GAAI,QAAA;AAC7C,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,SAAA,CAAU,kBAAkB,CAAA;AACtD,IAAA,MAAM,aAAA,GAAgB,IAAI,WAAA,EAAY,CAAE,OAAO,YAAY,CAAA;AAC3D,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,IAAA,CAAK,SAAA,EAAW,KAAK,CAAA;AAEnD,IAAA,OAAO,MAAM,QAAA,CAAS,cAAA,EAAgB,aAAa,CAAA;AAAA,EACrD,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,cAAA,CAAe,2BAAA,EAA6B,KAAK,CAAA;AAAA,EAC7D;AACF;AAKO,SAAS,iBAAiB,GAAA,EAAsC;AACrE,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,IAAA,EAAM;AAC3C,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,CAAA,GAAI,GAAA;AAEV,EAAA,OACE,OAAO,EAAE,EAAA,KAAO,QAAA,IAChB,OAAO,CAAA,CAAE,IAAA,KAAS,YAClB,CAAA,CAAE,IAAA,CAAK,WAAW,iBAAiB,CAAA,IACnC,OAAO,CAAA,CAAE,EAAA,KAAO,YAChB,CAAA,CAAE,EAAA,CAAG,WAAW,iBAAiB,CAAA,KAChC,EAAE,IAAA,KAAS,SAAA,IAAa,EAAE,IAAA,KAAS,UAAA,IAAc,EAAE,IAAA,KAAS,cAAA,CAAA,IAC7D,OAAO,CAAA,CAAE,QAAA,KAAa,YACtB,CAAA,CAAE,OAAA,KAAY,UACd,OAAO,CAAA,CAAE,cAAc,QAAA,IACvB,OAAO,EAAE,SAAA,KAAc,QAAA;AAE3B;AAKA,SAAS,iBAAA,GAA4B;AACnC,EAAA,OAAO,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AACzE;ACnGO,SAAS,cAAc,QAAA,EAAuC;AACnE,EAAA,IAAI;AACF,IAAA,OAAO,OAAO,QAAQ,CAAA;AAAA,EACxB,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,cAAA,CAAe,0BAAA,EAA4B,KAAK,CAAA;AAAA,EAC5D;AACF;AAKO,SAAS,cAAc,IAAA,EAAmC;AAC/D,EAAA,IAAI;AACF,IAAA,OAAO,OAAO,IAAI,CAAA;AAAA,EACpB,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,cAAA,CAAe,0BAAA,EAA4B,KAAK,CAAA;AAAA,EAC5D;AACF;AAKO,SAAS,kBAAkB,QAAA,EAAmC;AACnE,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAA;AAAA,EACzC,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,cAAA,CAAe,kCAAA,EAAoC,KAAK,CAAA;AAAA,EACpE;AACF;AAKO,SAAS,kBAAkB,IAAA,EAA+B;AAC/D,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EACxB,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,cAAA,CAAe,oCAAA,EAAsC,KAAK,CAAA;AAAA,EACtE;AACF;ACpCA,IAAMA,OAAAA,GAAS,aAAa,QAAQ,CAAA;AAyB7B,SAAS,mBAAA,CACd,MAAA,EACA,QAAA,EACA,GAAA,EACA,UAAA,EACe;AACf,EAAA,MAAM,QAAA,uBAAe,GAAA,EAA4B;AACjD,EAAA,IAAI,eAAA;AACJ,EAAA,MAAM,eAAA,GAAkB,uBAAA;AAExB,EAAA,OAAO;AAAA,IACL,eAAA,EAAiB,CAAC,QAAA,EAAkB,OAAA,KAA4B;AAC9D,MAAA,QAAA,CAAS,GAAA,CAAI,UAAU,OAAO,CAAA;AAC9B,MAAAA,OAAAA,CAAO,IAAA,CAAK,4BAAA,EAA8B,EAAE,UAAU,CAAA;AAAA,IACxD,CAAA;AAAA,IAEA,iBAAA,EAAmB,CAAC,QAAA,KAAqB;AACvC,MAAA,QAAA,CAAS,OAAO,QAAQ,CAAA;AACxB,MAAAA,OAAAA,CAAO,IAAA,CAAK,8BAAA,EAAgC,EAAE,UAAU,CAAA;AAAA,IAC1D,CAAA;AAAA,IAEA,uBAAA,EAAyB,CAAC,OAAA,KAA4B;AACpD,MAAA,eAAA,GAAkB,OAAA;AAClB,MAAAA,OAAAA,CAAO,KAAK,sCAAsC,CAAA;AAAA,IACpD,CAAA;AAAA,IAEA,WAAA,EAAa,OAAO,QAAA,EAA2B,QAAA,KAAwB;AACrE,MAAA,IAAI;AACF,QAAA,IAAI,CAAC,gBAAA,CAAiB,QAAQ,CAAA,EAAG;AAC/B,UAAA,MAAM,IAAI,eAAe,0BAA0B,CAAA;AAAA,QACrD;AAGA,QAAA,IAAI,eAAA;AACJ,QAAA,IAAI,mBAA6B,EAAC;AAElC,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,eAAA,GAAkB,QAAA,CAAS,MAAA;AAC3B,UAAA,gBAAA,GAAmB,QAAA,CAAS,UAAA;AAC5B,UAAAA,QAAO,IAAA,CAAK,uCAAA,EAAyC,EAAE,MAAA,EAAQ,iBAAiB,CAAA;AAAA,QAClF,WAAW,GAAA,EAAK;AACd,UAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,UAAA,CAAW,SAAS,EAAE,CAAA;AACjD,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,eAAA,GAAkB,QAAA,CAAS,MAAA;AAC3B,YAAA,gBAAA,GAAmB,QAAA,CAAS,UAAA;AAAA,UAC9B;AAAA,QACF;AAEA,QAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,UAAA,MAAM,IAAI,cAAA;AAAA,YACR,CAAA,0BAAA,EAA6B,SAAS,EAAE,CAAA,kDAAA;AAAA,WAC1C;AAAA,QACF;AAEA,QAAA,MAAM,YAAA,GAAe,iBAAiB,eAAe,CAAA;AAErD,QAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,UAAA,MAAM,MAAM,gBAAA,CAAiB,GAAA,CAAI,CAAC,CAAA,KAAM,SAAA,CAAU,CAAC,CAAC,CAAA;AACpD,UAAA,MAAM,OAAO,SAAA,CAAU,KAAA,CAAM,cAAc,EAAE,UAAA,EAAY,KAAK,CAAA;AAAA,QAChE;AAEA,QAAAA,OAAAA,CAAO,KAAK,mCAAA,EAAqC;AAAA,UAC/C,MAAA,EAAQ,eAAA;AAAA,UACR,UAAA,EAAY;AAAA,SACb,CAAA;AAED,QAAA,IAAI,MAAA;AAGJ,QAAA,MAAM,eAAA,GAAkB,iBAAiB,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,QAAA,CAAS,eAAe,CAAC,CAAA;AAClF,QAAA,MAAM,gBAAA,GAAmB,iBAAiB,MAAA,CAAO,CAAC,MAAM,CAAC,CAAA,CAAE,QAAA,CAAS,eAAe,CAAC,CAAA;AAGpF,QAAA,KAAA,MAAW,QAAQ,gBAAA,EAAkB;AACnC,UAAA,IAAI;AACF,YAAA,MAAM,OAAO,MAAM,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAC9C,YAAA,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,iBAAiB,EAAE,sBAAA,EAAwB,MAAM,CAAA;AAC/E,YAAAA,OAAAA,CAAO,IAAA,CAAK,uBAAA,EAAyB,EAAE,MAAM,CAAA;AAC7C,YAAA;AAAA,UACF,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAGA,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,MAAM,aAAA,GAAgB;AAAA,YACpB,GAAG,eAAA;AAAA,YACH,GAAA,CAAI,UAAA,IAAc,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAM,qBAAA,CAAsB,CAAA,EAAG,eAAgB,CAAC;AAAA,WAC7E;AAEA,UAAA,MAAM,mBAAmB,CAAC,GAAG,IAAI,GAAA,CAAI,aAAa,CAAC,CAAA;AACnD,UAAA,IAAI,SAAA;AACJ,UAAA,KAAA,MAAW,QAAQ,gBAAA,EAAkB;AACnC,YAAA,IAAI;AAEF,cAAA,MAAM,OAAO,MAAM,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAC9C,cAAAA,OAAAA,CAAO,IAAA,CAAK,8BAAA,EAAgC,EAAE,MAAM,CAAA;AAEpD,cAAA,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,iBAAiB,EAAE,sBAAA,EAAwB,MAAM,CAAA;AAC/E,cAAAA,OAAAA,CAAO,IAAA,CAAK,qBAAA,EAAuB,EAAE,MAAM,CAAA;AAC3C,cAAA;AAAA,YACF,SAAS,QAAA,EAAU;AACjB,cAAAA,OAAAA,CAAO,KAAK,mBAAA,EAAqB,EAAE,MAAM,KAAA,EAAQ,QAAA,CAAmB,SAAS,CAAA;AAC7E,cAAA,SAAA,GAAY,QAAA;AAAA,YACd;AAAA,UACF;AACA,UAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,SAAA,IAAa,IAAI,eAAe,0BAA0B,CAAA;AAAA,QAC/E;AAGA,QAAA,IAAI,CAAC,MAAA,IAAU,GAAA,IAAO,iBAAA,IAAqB,GAAA,EAAK;AAC9C,UAAA,MAAM,gBAAA,GAAmB,MAAO,GAAA,CAAY,eAAA,EAAgB;AAC5D,UAAA,KAAA,MAAW,aAAa,gBAAA,EAAkB;AACxC,YAAA,MAAM,WAAA,GAAc,qBAAA,CAAsB,SAAA,EAAW,eAAgB,CAAA;AACrE,YAAA,IAAI;AACF,cAAA,MAAM,OAAO,MAAM,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,WAAW,CAAC,CAAA;AACrD,cAAA,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,iBAAiB,EAAE,sBAAA,EAAwB,MAAM,CAAA;AAC/E,cAAAA,OAAAA,CAAO,IAAA,CAAK,gCAAA,EAAkC,EAAE,WAAW,CAAA;AAC3D,cAAA;AAAA,YACF,SAAS,CAAA,EAAG;AACV,cAAAA,OAAAA,CAAO,KAAK,kBAAA,EAAoB,EAAE,WAAW,KAAA,EAAQ,CAAA,CAAY,SAAS,CAAA;AAAA,YAC5E;AAAA,UACF;AACA,UAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,eAAe,4DAA4D,CAAA;AAAA,QACpG;AAEA,QAAA,MAAM,OAAA,GAAU,cAAc,QAAQ,CAAA;AACtC,QAAA,MAAM,MAAA,CAAO,IAAA;AAAA,UAAA,CACV,mBAAmB;AAClB,YAAA,MAAM,OAAA;AAAA,UACR,CAAA;AAAG,SACL;AAEA,QAAAA,OAAAA,CAAO,KAAK,iCAAA,EAAmC;AAAA,UAC7C,IAAI,QAAA,CAAS,EAAA;AAAA,UACb,MAAM,QAAA,CAAS,IAAA;AAAA,UACf,IAAI,QAAA,CAAS,EAAA;AAAA,UACb,UAAU,QAAA,CAAS;AAAA,SACpB,CAAA;AAGD,QAAA,IAAI,QAAA,CAAS,SAAS,SAAA,EAAW;AAC/B,UAAAA,QAAO,KAAA,CAAM,iCAAA,EAAmC,EAAE,EAAA,EAAI,QAAA,CAAS,IAAI,CAAA;AAEnE,UAAA,IAAI;AAEF,YAAA,MAAM,gBAAA,GAAmB,GAAA;AAEzB,YAAA,MAAM,mBAAmB,YAAY;AACnC,cAAA,MAAM,iBAA+B,EAAC;AACtC,cAAA,WAAA,MAAiB,KAAA,IAAS,OAAO,MAAA,EAAQ;AACvC,gBAAA,cAAA,CAAe,IAAA,CAAK,KAAA,CAAM,QAAA,EAAU,CAAA;AAAA,cACtC;AAEA,cAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,gBAAA,MAAM,eAAe,IAAI,UAAA;AAAA,kBACvB,cAAA,CAAe,OAAO,CAAC,GAAA,EAAK,UAAU,GAAA,GAAM,KAAA,CAAM,QAAQ,CAAC;AAAA,iBAC7D;AACA,gBAAA,IAAI,MAAA,GAAS,CAAA;AACb,gBAAA,KAAA,MAAW,SAAS,cAAA,EAAgB;AAClC,kBAAA,YAAA,CAAa,GAAA,CAAI,OAAO,MAAM,CAAA;AAC9B,kBAAA,MAAA,IAAU,KAAA,CAAM,MAAA;AAAA,gBAClB;AAEA,gBAAA,MAAM,gBAAA,GAAmB,cAAc,YAAY,CAAA;AACnD,gBAAAA,OAAAA,CAAO,KAAK,mBAAA,EAAqB;AAAA,kBAC/B,IAAI,gBAAA,CAAiB,EAAA;AAAA,kBACrB,SAAS,gBAAA,CAAiB;AAAA,iBAC3B,CAAA;AAED,gBAAA,OAAO,gBAAA;AAAA,cACT,CAAA,MAAO;AACL,gBAAAA,QAAO,IAAA,CAAK,kCAAA,EAAoC,EAAE,EAAA,EAAI,QAAA,CAAS,IAAI,CAAA;AACnE,gBAAA,OAAO,KAAA,CAAA;AAAA,cACT;AAAA,YACF,CAAA,GAAG;AAEH,YAAA,MAAM,cAAA,GAAiB,IAAI,OAAA,CAAmB,CAAC,OAAA,KAAY;AACzD,cAAA,UAAA,CAAW,MAAM;AACf,gBAAAA,OAAAA,CAAO,KAAK,kBAAA,EAAoB,EAAE,IAAI,QAAA,CAAS,EAAA,EAAI,OAAA,EAAS,gBAAA,EAAkB,CAAA;AAC9E,gBAAA,OAAA,CAAQ,KAAA,CAAS,CAAA;AAAA,cACnB,GAAG,gBAAgB,CAAA;AAAA,YACrB,CAAC,CAAA;AAED,YAAA,MAAM,WAAW,MAAM,OAAA,CAAQ,KAAK,CAAC,eAAA,EAAiB,cAAc,CAAC,CAAA;AACrE,YAAA,OAAO,QAAA;AAAA,UACT,SAAS,KAAA,EAAO;AACd,YAAAA,OAAAA,CAAO,IAAA,CAAK,wBAAA,EAA0B,EAAE,OAAO,CAAA;AAC/C,YAAA,OAAO,KAAA,CAAA;AAAA,UACT;AAAA,QACF;AAEA,QAAA,OAAO,KAAA,CAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,KAAA,YAAiB,gBAAgB,MAAM,KAAA;AAC3C,QAAA,MAAM,IAAI,cAAA,CAAe,wBAAA,EAA0B,KAAK,CAAA;AAAA,MAC1D;AAAA,IACF,CAAA;AAAA,IAEA,OAAO,YAAY;AACjB,MAAA,MAAM,OAAO,MAAA,CAAO,eAAA,EAAiB,OAAO,EAAE,QAAO,KAAM;AACzD,QAAA,IAAI;AACF,UAAA,MAAM,oBAAA,CAAqB,MAAA,EAAQ,QAAA,EAAU,eAAA,EAAiB,QAAQ,CAAA;AAAA,QACxE,SAAS,KAAA,EAAO;AACd,UAAAA,OAAAA,CAAO,KAAA,CAAM,gCAAA,EAAkC,KAAK,CAAA;AAAA,QACtD;AAAA,MACF,CAAA,EAAG,EAAE,sBAAA,EAAwB,IAAA,EAAM,CAAA;AAEnC,MAAAA,OAAAA,CAAO,KAAK,wBAAwB,CAAA;AAAA,IACtC,CAAA;AAAA,IAEA,MAAM,YAAY;AAChB,MAAA,MAAM,MAAA,CAAO,SAAS,eAAe,CAAA;AACrC,MAAA,QAAA,CAAS,KAAA,EAAM;AACf,MAAA,eAAA,GAAkB,MAAA;AAClB,MAAAA,OAAAA,CAAO,KAAK,wBAAwB,CAAA;AAAA,IACtC;AAAA,GACF;AACF;AAEA,SAAS,qBAAA,CAAsB,WAAmB,YAAA,EAA8B;AAC9E,EAAA,OAAO,CAAA,EAAG,SAAS,CAAA,iBAAA,EAAoB,YAAY,CAAA,CAAA;AACrD;AAEA,eAAe,oBAAA,CACb,MAAA,EACA,QAAA,EACA,eAAA,EACA,SAAA,EACe;AACf,EAAA,IAAI;AACF,IAAA,MAAM,SAAuB,EAAC;AAC9B,IAAA,WAAA,MAAiB,KAAA,IAAS,OAAO,MAAA,EAAQ;AACvC,MAAA,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,QAAA,EAAU,CAAA;AAAA,IAC9B;AAEA,IAAA,MAAM,OAAO,IAAI,UAAA;AAAA,MACf,MAAA,CAAO,OAAO,CAAC,GAAA,EAAK,UAAU,GAAA,GAAM,KAAA,CAAM,QAAQ,CAAC;AAAA,KACrD;AACA,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAA,CAAK,GAAA,CAAI,OAAO,MAAM,CAAA;AACtB,MAAA,MAAA,IAAU,KAAA,CAAM,MAAA;AAAA,IAClB;AAEA,IAAA,MAAM,QAAA,GAAW,cAAc,IAAI,CAAA;AAEnC,IAAA,IAAI,CAAC,gBAAA,CAAiB,QAAQ,CAAA,EAAG;AAC/B,MAAAA,OAAAA,CAAO,KAAK,mCAAmC,CAAA;AAC/C,MAAA;AAAA,IACF;AAMA,IAAAA,OAAAA,CAAO,KAAK,kBAAA,EAAoB;AAAA,MAC9B,IAAI,QAAA,CAAS,EAAA;AAAA,MACb,MAAM,QAAA,CAAS,IAAA;AAAA,MACf,IAAI,QAAA,CAAS,EAAA;AAAA,MACb,UAAU,QAAA,CAAS,QAAA;AAAA,MACnB,SAAS,QAAA,CAAS;AAAA,KACnB,CAAA;AAED,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,GAAA,CAAI,QAAA,CAAS,QAAQ,CAAA;AAC9C,IAAA,IAAI,QAAA,GAAmC,KAAA,CAAA;AAEvC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,QAAA,GAAW,MAAM,QAAQ,QAAQ,CAAA;AAAA,IACnC,WAAW,eAAA,EAAiB;AAC1B,MAAAA,QAAO,KAAA,CAAM,sCAAA,EAAwC,EAAE,QAAA,EAAU,QAAA,CAAS,UAAU,CAAA;AACpF,MAAA,QAAA,GAAW,MAAM,gBAAgB,QAAQ,CAAA;AAAA,IAC3C,CAAA,MAAO;AACL,MAAAA,QAAO,IAAA,CAAK,yBAAA,EAA2B,EAAE,QAAA,EAAU,QAAA,CAAS,UAAU,CAAA;AAAA,IACxE;AAGA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,OAAA,GAAU,cAAc,QAAQ,CAAA;AACtC,MAAAA,OAAAA,CAAO,KAAK,iCAAA,EAAmC;AAAA,QAC7C,YAAY,QAAA,CAAS,EAAA;AAAA,QACrB,SAAS,QAAA,CAAS,OAAA;AAAA,QAClB,MAAM,OAAA,CAAQ;AAAA,OACf,CAAA;AAED,MAAA,MAAM,MAAA,CAAO,IAAA;AAAA,QAAA,CACV,mBAAmB;AAClB,UAAA,MAAM,OAAA;AAAA,QACR,CAAA;AAAG,OACL;AAAA,IACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAAA,OAAAA,CAAO,KAAA,CAAM,iCAAA,EAAmC,KAAK,CAAA;AAAA,EACvD;AACF;;;AC7RO,IAAM,eAAN,MAAmB;AAAA;AAAA;AAAA;AAAA,EAIxB,cAAA,CAAe,KAAA,EAAyB,YAAA,EAAsB,MAAA,EAA4B;AAExF,IAAA,MAAM,eAAe,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,iBAAA,GAAoB,KAAK,CAAC,CAAA;AAC9D,IAAA,MAAM,gBAAA,GAAmB,MAAM,WAAA,GAAc,YAAA;AAG7C,IAAA,MAAM,iBAAiB,KAAA,CAAM,WAAA;AAE7B,IAAA,OAAO;AAAA,MACL,gBAAA;AAAA,MACA,YAAA;AAAA,MACA,cAAA;AAAA,MACA,cAAc,KAAA,CAAM,eAAA;AAAA,MACpB,MAAA;AAAA,MACA,WAAA,EAAa,KAAK,GAAA;AAAI,KACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAsB,KAAA,EAA2B;AAE/C,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,WAAA,EAAa,GAAA;AAAA,MACb,WAAA,EAAa,GAAA;AAAA,MACb,UAAA,EAAY,GAAA;AAAA,MACZ,MAAA,EAAQ;AAAA,KACV;AAEA,IAAA,MAAM,mBAAmB,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,YAAA,GAAe,IAAI,CAAC,CAAA;AAE5D,IAAA,OACE,KAAA,CAAM,gBAAA,GAAmB,OAAA,CAAQ,WAAA,GACjC,gBAAA,GAAmB,OAAA,CAAQ,WAAA,GAC3B,KAAA,CAAM,cAAA,GAAiB,OAAA,CAAQ,UAAA,GAC/B,KAAA,CAAM,SAAS,OAAA,CAAQ,MAAA;AAAA,EAE3B;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,KAAA,EAAkE;AAC9E,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,qBAAA,CAAsB,KAAK,CAAA;AAEhD,IAAA,IAAI,KAAA,CAAM,gBAAA,KAAqB,CAAA,EAAG,OAAO,KAAA;AACzC,IAAA,IAAI,OAAA,GAAU,KAAK,OAAO,KAAA;AAC1B,IAAA,IAAI,OAAA,GAAU,KAAK,OAAO,QAAA;AAC1B,IAAA,IAAI,OAAA,GAAU,KAAK,OAAO,MAAA;AAC1B,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,CAAgB,OAAmB,QAAA,EAA2B;AAC5D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,qBAAA,CAAsB,KAAK,CAAA;AAChD,IAAA,MAAM,OAAA,GAAU,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AAG/B,IAAA,IAAI,QAAA,GAAW,OAAA,IAAW,OAAA,GAAU,GAAA,EAAK;AACvC,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,UAAU,GAAA,EAAK;AACjB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAKO,SAAS,uBAAA,GAAsC;AACpD,EAAA,OAAO;AAAA,IACL,gBAAA,EAAkB,CAAA;AAAA,IAClB,YAAA,EAAc,CAAA;AAAA,IACd,cAAA,EAAgB,CAAA;AAAA,IAChB,YAAA,EAAc,CAAA;AAAA,IACd,MAAA,EAAQ,CAAA;AAAA;AAAA,IACR,WAAA,EAAa,KAAK,GAAA;AAAI,GACxB;AACF;AC7HA,IAAMA,OAAAA,GAAS,aAAa,qBAAqB,CAAA;AAK1C,IAAM,qBAAN,MAAyB;AAAA,EACtB,EAAA;AAAA,EAER,YAAY,MAAA,EAAgB;AAC1B,IAAA,IAAA,CAAK,KAAK,IAAI,KAAA,CAAM,QAAQ,EAAE,aAAA,EAAe,QAAQ,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,GAAsB;AAC1B,IAAA,MAAM,IAAA,CAAK,GAAG,IAAA,EAAK;AACnB,IAAAA,OAAAA,CAAO,KAAK,qCAAA,EAAuC,EAAE,MAAM,IAAA,CAAK,EAAA,CAAG,UAAU,CAAA;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,IAAA,CAAK,GAAG,KAAA,EAAM;AACpB,IAAAA,OAAAA,CAAO,KAAK,qCAAqC,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,WAAA,EAAyC;AACpD,IAAA,MAAM,MAAM,CAAA,YAAA,EAAe,WAAA,CAAY,QAAQ,CAAA,CAAA,EAAI,YAAY,SAAS,CAAA,CAAA;AACxE,IAAA,MAAM,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,GAAA,EAAK,WAAW,CAAA;AAClC,IAAAA,OAAAA,CAAO,KAAA,CAAM,sBAAA,EAAwB,EAAE,QAAA,EAAU,YAAY,QAAA,EAAU,IAAA,EAAM,WAAA,CAAY,IAAA,EAAM,CAAA;AAAA,EACjG;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CAAW,QAAA,EAAkB,KAAA,GAAQ,GAAA,EAA6B;AACtE,IAAA,MAAM,eAA8B,EAAC;AACrC,IAAA,MAAM,MAAA,GAAS,eAAe,QAAQ,CAAA,CAAA,CAAA;AAEtC,IAAA,IAAI;AACF,MAAA,WAAA,MAAiB,CAAC,CAAA,EAAG,KAAK,CAAA,IAAK,IAAA,CAAK,GAAG,QAAA,CAAS;AAAA,QAC9C,GAAA,EAAK,MAAA;AAAA,QACL,KAAK,MAAA,GAAS,MAAA;AAAA,QACd,KAAA;AAAA,QACA,OAAA,EAAS;AAAA;AAAA,OACV,CAAA,EAAG;AACF,QAAA,YAAA,CAAa,KAAK,KAAK,CAAA;AAAA,MACzB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAAA,QAAO,KAAA,CAAM,mCAAA,EAAqC,EAAE,QAAA,EAAU,OAAO,CAAA;AAAA,IACvE;AAEA,IAAA,OAAO,YAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,QAAA,EAA6C;AAC1D,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,CAAW,UAAU,GAAI,CAAA;AAEpD,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,OAAO;AAAA,QACL,iBAAA,EAAmB,CAAA;AAAA,QACnB,WAAA,EAAa,CAAA;AAAA,QACb,eAAA,EAAiB,CAAA;AAAA,QACjB,eAAA,EAAiB;AAAA,OACnB;AAAA,IACF;AAEA,IAAA,MAAM,eAAe,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,CAAA,CAAE,MAAA;AACpD,IAAA,MAAM,iBAAA,GAAoB,QAAQ,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,YAAA,EAAc,CAAC,CAAA;AAE5E,IAAA,OAAO;AAAA,MACL,mBAAmB,OAAA,CAAQ,MAAA;AAAA,MAC3B,WAAA,EAAa,eAAe,OAAA,CAAQ,MAAA;AAAA,MACpC,eAAA,EAAiB,oBAAoB,OAAA,CAAQ,MAAA;AAAA,MAC7C,eAAA,EAAiB,OAAA,CAAQ,CAAC,CAAA,CAAE;AAAA,KAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,GAAkC;AACtC,IAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAE/B,IAAA,IAAI;AACF,MAAA,WAAA,MAAiB,CAAC,GAAG,CAAA,IAAK,IAAA,CAAK,EAAA,CAAG,UAAS,EAAG;AAC5C,QAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,uBAAuB,CAAA;AAC/C,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,QACrB;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAAA,OAAAA,CAAO,KAAA,CAAM,0BAAA,EAA4B,EAAE,OAAO,CAAA;AAAA,IACpD;AAEA,IAAA,OAAO,KAAA,CAAM,KAAK,MAAM,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,QAAA,EAAiC;AACjD,IAAA,MAAM,MAAA,GAAS,eAAe,QAAQ,CAAA,CAAA,CAAA;AACtC,IAAA,MAAM,eAAyB,EAAC;AAEhC,IAAA,WAAA,MAAiB,CAAC,GAAG,CAAA,IAAK,IAAA,CAAK,GAAG,QAAA,CAAS;AAAA,MACzC,GAAA,EAAK,MAAA;AAAA,MACL,KAAK,MAAA,GAAS;AAAA,KACf,CAAA,EAAG;AACF,MAAA,YAAA,CAAa,KAAK,GAAG,CAAA;AAAA,IACvB;AAEA,IAAA,MAAM,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,YAAA,CAAa,GAAA,CAAI,CAAA,GAAA,MAAQ,EAAE,IAAA,EAAM,KAAA,EAAO,GAAA,EAAI,CAAE,CAAC,CAAA;AACnE,IAAAA,OAAAA,CAAO,KAAK,6BAAA,EAA+B,EAAE,UAAU,KAAA,EAAO,YAAA,CAAa,QAAQ,CAAA;AAAA,EACrF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CAAQ,MAAA,GAAS,KAAK,EAAA,GAAK,EAAA,GAAK,KAAK,GAAA,EAAuB;AAChE,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,EAAI,GAAI,MAAA;AAC5B,IAAA,MAAM,eAAyB,EAAC;AAEhC,IAAA,WAAA,MAAiB,CAAC,GAAA,EAAK,KAAK,KAAK,IAAA,CAAK,EAAA,CAAG,UAAS,EAAG;AACnD,MAAA,IAAI,KAAA,CAAM,YAAY,MAAA,EAAQ;AAC5B,QAAA,YAAA,CAAa,KAAK,GAAG,CAAA;AAAA,MACvB;AAAA,IACF;AAEA,IAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,MAAA,MAAM,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,YAAA,CAAa,GAAA,CAAI,CAAA,GAAA,MAAQ,EAAE,IAAA,EAAM,KAAA,EAAO,GAAA,EAAI,CAAE,CAAC,CAAA;AACnE,MAAAA,QAAO,IAAA,CAAK,6BAAA,EAA+B,EAAE,KAAA,EAAO,YAAA,CAAa,QAAQ,CAAA;AAAA,IAC3E;AAEA,IAAA,OAAO,YAAA,CAAa,MAAA;AAAA,EACtB;AACF;;;ACjJA,IAAMA,OAAAA,GAAS,aAAa,aAAa,CAAA;AA2BlC,IAAM,qBAAN,MAAyB;AAAA,EAC9B,WAAA,CACU,IACA,YAAA,EACR;AAFQ,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA,EAKH,MAAM,OAAA,CACJ,OAAA,EACA,KAAA,EACA,KAAA,EACA,QACA,MAAA,EACsB;AACtB,IAAA,IAAI,KAAA,GAAQ,CAAA,IAAK,KAAA,GAAQ,CAAA,EAAG;AAC1B,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AAEA,IAAA,MAAM,WAAA,GAA8C;AAAA,MAClD,IAAA,EAAM,OAAA;AAAA,MACN,EAAA,EAAI,KAAA;AAAA,MACJ,KAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA;AAAI,KACtB;AAGA,IAAA,MAAM,IAAA,GAAO,IAAI,WAAA,EAAY,CAAE,OAAO,IAAA,CAAK,SAAA,CAAU,WAAW,CAAC,CAAA;AACjE,IAAA,MAAM,cAAA,GAAiB,MAAM,MAAA,CAAO,IAAI,CAAA;AACxC,IAAA,MAAM,YAAY,MAAA,CAAO,IAAA,CAAK,cAAc,CAAA,CAAE,SAAS,KAAK,CAAA;AAE5D,IAAA,MAAM,iBAAA,GAAiC;AAAA,MACrC,GAAG,WAAA;AAAA,MACH;AAAA,KACF;AAEA,IAAAA,OAAAA,CAAO,KAAK,qBAAA,EAAuB,EAAE,MAAM,OAAA,EAAS,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA;AACtE,IAAA,OAAO,iBAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CAAO,WAAA,EAA0B,QAAA,EAA4C;AACjF,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,SAAA,EAAW,GAAG,qBAAA,EAAsB,GAAI,WAAA;AAChD,MAAA,MAAM,IAAA,GAAO,IAAI,WAAA,EAAY,CAAE,OAAO,IAAA,CAAK,SAAA,CAAU,qBAAqB,CAAC,CAAA;AAC3E,MAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,IAAA,CAAK,SAAA,EAAW,KAAK,CAAA;AACnD,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,YAAA,CAAa,YAAY,IAAI,CAAA;AAE1D,MAAA,OAAO,MAAM,QAAA,CAAS,cAAA,EAAgB,IAAA,EAAM,SAAS,CAAA;AAAA,IACvD,SAAS,KAAA,EAAO;AACd,MAAAA,OAAAA,CAAO,KAAA,CAAM,8BAAA,EAAgC,EAAE,OAAO,CAAA;AACtD,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,WAAA,EAAyC;AACrD,IAAA,MAAM,MAAM,CAAA,YAAA,EAAe,WAAA,CAAY,EAAE,CAAA,CAAA,EAAI,YAAY,IAAI,CAAA,CAAA;AAC7D,IAAA,MAAM,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,GAAA,EAAK,WAAW,CAAA;AAClC,IAAAA,OAAAA,CAAO,IAAA,CAAK,uBAAA,EAAyB,EAAE,IAAA,EAAM,YAAY,IAAA,EAAM,EAAA,EAAI,WAAA,CAAY,EAAA,EAAI,CAAA;AAAA,EACrF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,QAAA,EAA0C;AAC9D,IAAA,MAAM,eAA8B,EAAC;AACrC,IAAA,MAAM,MAAA,GAAS,eAAe,QAAQ,CAAA,CAAA,CAAA;AAEtC,IAAA,IAAI;AACF,MAAA,WAAA,MAAiB,CAAC,CAAA,EAAG,KAAK,CAAA,IAAK,IAAA,CAAK,GAAG,QAAA,CAAS;AAAA,QAC9C,GAAA,EAAK,MAAA;AAAA,QACL,KAAK,MAAA,GAAS;AAAA,OACf,CAAA,EAAG;AACF,QAAA,YAAA,CAAa,KAAK,KAAK,CAAA;AAAA,MACzB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAAA,QAAO,KAAA,CAAM,4BAAA,EAA8B,EAAE,QAAA,EAAU,OAAO,CAAA;AAAA,IAChE;AAEA,IAAA,OAAO,YAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,OAAA,EAAyC;AAC/D,IAAA,MAAM,eAA8B,EAAC;AAErC,IAAA,IAAI;AACF,MAAA,WAAA,MAAiB,CAAC,CAAA,EAAG,KAAK,KAAK,IAAA,CAAK,EAAA,CAAG,UAAS,EAAG;AACjD,QAAA,IAAI,KAAA,CAAM,SAAS,OAAA,EAAS;AAC1B,UAAA,YAAA,CAAa,KAAK,KAAK,CAAA;AAAA,QACzB;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAAA,QAAO,KAAA,CAAM,qCAAA,EAAuC,EAAE,OAAA,EAAS,OAAO,CAAA;AAAA,IACxE;AAEA,IAAA,OAAO,YAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,QAAA,EAAmC;AACvD,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA;AAExD,IAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,MAAA,OAAO,CAAA;AAAA,IACT;AAEA,IAAA,MAAM,UAAA,GAAa,aAAa,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,KAAA,EAAO,CAAC,CAAA;AACnE,IAAA,OAAO,aAAa,YAAA,CAAa,MAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,CAAkB,OAAA,EAAiB,KAAA,EAA8B;AACrE,IAAA,MAAM,GAAA,GAAM,CAAA,YAAA,EAAe,KAAK,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AAC3C,IAAA,MAAM,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,GAAG,CAAA;AACrB,IAAAA,OAAAA,CAAO,KAAK,qBAAA,EAAuB,EAAE,MAAM,OAAA,EAAS,EAAA,EAAI,OAAO,CAAA;AAAA,EACjE;AACF;ACzJA,IAAMA,OAAAA,GAAS,aAAa,eAAe,CAAA;AAqCpC,IAAM,eAAN,MAAmB;AAAA,EAChB,UAAA,uBAAiB,GAAA,EAA6B;AAAA,EAC9C,aAAA,uBAAoB,GAAA,EAAoB;AAAA,EAC/B,gBAAA,GAAmB,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AAAA;AAAA,EAClC,iBAAA,GAAoB,KAAK,EAAA,GAAK,GAAA;AAAA;AAAA,EAC9B,gBAAA,GAAmB,EAAA;AAAA;AAAA,EACnB,qBAAA,GAAwB,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAK5D,iBAAA,CAAkB,GAAA,EAAa,UAAA,GAAa,EAAA,EAAe;AACzD,IAAA,MAAM,KAAA,GAAQ,KAAK,aAAA,EAAc;AACjC,IAAA,OAAO;AAAA,MACL,GAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA;AAAI,KACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,QAAA,EAAsC;AACpD,IAAA,MAAM,EAAE,SAAA,EAAW,QAAA,EAAU,aAAA,EAAc,GAAI,QAAA;AAG/C,IAAA,IAAI,KAAK,GAAA,EAAI,GAAI,UAAU,SAAA,GAAY,EAAA,GAAK,KAAK,GAAA,EAAM;AACrD,MAAAA,QAAO,IAAA,CAAK,mBAAA,EAAqB,EAAE,GAAA,EAAK,SAAA,CAAU,KAAK,CAAA;AACvD,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,MAAM,IAAA,GAAO,GAAG,SAAA,CAAU,GAAG,IAAI,SAAA,CAAU,KAAK,IAAI,aAAa,CAAA,CAAA;AACjE,IAAA,MAAM,OAAO,MAAA,CAAO,IAAI,aAAY,CAAE,MAAA,CAAO,IAAI,CAAC,CAAA;AAGlD,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,oBAAA,CAAqB,IAAI,CAAA;AACnD,IAAA,MAAM,KAAA,GAAQ,gBAAgB,SAAA,CAAU,UAAA;AAExC,IAAA,IAAI,KAAA,EAAO;AACT,MAAAA,OAAAA,CAAO,KAAK,oBAAA,EAAsB,EAAE,KAAK,SAAA,CAAU,GAAA,EAAK,cAAc,CAAA;AAAA,IACxE,CAAA,MAAO;AACL,MAAAA,OAAAA,CAAO,IAAA,CAAK,kBAAA,EAAoB,EAAE,GAAA,EAAK,SAAA,CAAU,GAAA,EAAK,YAAA,EAAc,QAAA,EAAU,SAAA,CAAU,UAAA,EAAY,CAAA;AAAA,IACtG;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,GAAA,EAAsB;AAClC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA;AACtC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,SAAA;AAG9B,IAAA,IAAI,QAAA,GAAW,KAAK,gBAAA,EAAkB;AACpC,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,MAAM,cAAA,GAAiB,OAAO,QAAA,CAAS,MAAA;AAAA,MACrC,CAAA,CAAA,KAAK,GAAA,GAAM,CAAA,GAAI,IAAA,CAAK;AAAA,KACtB;AAEA,IAAA,OAAO,cAAA,CAAe,UAAU,IAAA,CAAK,gBAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,GAAA,EAAmB;AAC/B,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,IAAI,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA;AAEpC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAA,GAAS;AAAA,QACP,GAAA;AAAA,QACA,UAAU,EAAC;AAAA,QACX,SAAA,EAAW;AAAA,OACb;AACA,MAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,GAAA,EAAK,MAAM,CAAA;AAAA,IACjC;AAGA,IAAA,MAAA,CAAO,QAAA,CAAS,KAAK,GAAG,CAAA;AAGxB,IAAA,MAAA,CAAO,QAAA,GAAW,OAAO,QAAA,CAAS,MAAA;AAAA,MAChC,CAAA,CAAA,KAAK,GAAA,GAAM,CAAA,GAAI,IAAA,CAAK;AAAA,KACtB;AAEA,IAAAA,OAAAA,CAAO,MAAM,kBAAA,EAAoB,EAAE,KAAK,KAAA,EAAO,MAAA,CAAO,QAAA,CAAS,MAAA,EAAQ,CAAA;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,MAAA,EAAgC;AAChD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,MAAM,CAAA;AAC/C,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAEzB,IAAA,IAAI,GAAA,GAAM,KAAK,gBAAA,EAAkB;AAC/B,MAAA,OAAO,KAAA;AAAA,IACT,CAAA,MAAA,IAAW,GAAA,GAAM,IAAA,CAAK,qBAAA,EAAuB;AAC3C,MAAA,OAAO,aAAA;AAAA,IACT,CAAA,MAAO;AACL,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,MAAA,EAAsB;AACnC,IAAA,IAAI,CAAC,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,MAAM,CAAA,EAAG;AACnC,MAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,MAAA,EAAQ,IAAA,CAAK,KAAK,CAAA;AACzC,MAAAA,OAAAA,CAAO,KAAA,CAAM,mBAAA,EAAqB,EAAE,QAAQ,CAAA;AAAA,IAC9C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,gBAAA;AAG1B,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,MAAM,KAAK,IAAA,CAAK,UAAA,CAAW,SAAQ,EAAG;AACrD,MAAA,IAAI,MAAA,CAAO,YAAY,MAAA,EAAQ;AAC7B,QAAA,IAAA,CAAK,UAAA,CAAW,OAAO,GAAG,CAAA;AAAA,MAC5B;AAAA,IACF;AAEA,IAAAA,OAAAA,CAAO,KAAK,kCAAA,EAAoC;AAAA,MAC9C,UAAA,EAAY,KAAK,UAAA,CAAW,IAAA;AAAA,MAC5B,KAAA,EAAO,KAAK,aAAA,CAAc;AAAA,KAC3B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAA,GAAwB;AAC9B,IAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,EAAE,CAAA;AAC/B,IAAA,MAAA,CAAO,gBAAgB,KAAK,CAAA;AAC5B,IAAA,OAAO,WAAW,KAAK,CAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,IAAA,EAA0B;AACrD,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,MAAA,IAAI,SAAS,CAAA,EAAG;AACd,QAAA,KAAA,IAAS,CAAA;AAAA,MACX,CAAA,MAAO;AAEL,QAAA,IAAI,CAAA,GAAI,IAAA;AACR,QAAA,OAAA,CAAQ,CAAA,GAAI,SAAU,CAAA,EAAG;AACvB,UAAA,KAAA,EAAA;AACA,UAAA,CAAA,KAAM,CAAA;AAAA,QACR;AACA,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACF;ACnNA,IAAMA,OAAAA,GAAS,aAAa,cAAc,CAAA;AAanC,IAAM,cAAN,MAAkB;AAAA,EACf,OAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA,uBAAiB,GAAA,EAAsD;AAAA,EAC9D,SAAA,GAAY,IAAI,EAAA,GAAK,GAAA;AAAA;AAAA,EAEtC,YAAY,MAAA,EAA2B;AACrC,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,YAAA,EAAa;AAChC,IAAA,IAAA,CAAK,UAAU,IAAI,kBAAA,CAAmB,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,aAAA,CAAe,CAAA;AAErE,IAAA,MAAM,gBAAgB,IAAIG,KAAAA,CAA2B,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,aAAA,CAAA,EAAiB;AAAA,MACpF,aAAA,EAAe;AAAA,KAChB,CAAA;AACD,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,kBAAA,CAAmB,aAAA,EAAe,OAAO,YAAY,CAAA;AAC7E,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,YAAA,EAAa;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,IAAA,CAAK,QAAQ,IAAA,EAAK;AACxB,IAAAH,OAAAA,CAAO,KAAK,sBAAsB,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,GAAsB;AAC1B,IAAA,MAAM,IAAA,CAAK,QAAQ,KAAA,EAAM;AACzB,IAAAA,OAAAA,CAAO,KAAK,sBAAsB,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,WAAA,EAAyC;AAC/D,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,WAAW,CAAA;AACrC,IAAA,IAAA,CAAK,YAAA,CAAa,aAAA,CAAc,WAAA,CAAY,QAAQ,CAAA;AAGpD,IAAA,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,WAAA,CAAY,QAAQ,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,QAAA,EAAuC;AAEzD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA;AAC3C,IAAA,IAAI,UAAU,IAAA,CAAK,GAAA,KAAQ,MAAA,CAAO,SAAA,GAAY,KAAK,SAAA,EAAW;AAC5D,MAAA,OAAO,MAAA,CAAO,KAAA;AAAA,IAChB;AAGA,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAS,QAAQ,CAAA;AAClD,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,YAAA,CAAa,gBAAgB,QAAQ,CAAA;AACxE,IAAA,MAAM,MAAA,GAAS,CAAA;AAEf,IAAA,MAAM,QAAQ,IAAA,CAAK,OAAA,CAAQ,eAAe,KAAA,EAAO,eAAA,CAAgB,QAAQ,MAAM,CAAA;AAG/E,IAAA,IAAA,CAAK,UAAA,CAAW,IAAI,QAAA,EAAU,EAAE,OAAO,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,EAAG,CAAA;AAE9D,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CACJ,OAAA,EACA,KAAA,EACA,KAAA,EACA,QACA,MAAA,EACsB;AACtB,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,YAAA,CAAa,QAAQ,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,MAAM,CAAA;AACzF,IAAA,MAAM,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,WAAW,CAAA;AAG3C,IAAA,IAAA,CAAK,UAAA,CAAW,OAAO,KAAK,CAAA;AAE5B,IAAA,OAAO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,QAAA,EAA0C;AAC9D,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,eAAA,CAAgB,QAAQ,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,CAAkB,WAAA,EAA0B,QAAA,EAA4C;AAC5F,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,WAAA,EAAa,QAAQ,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,QAAA,EAA2B;AACvC,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,aAAA,CAAc,QAAQ,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,CAAkB,KAAa,UAAA,EAAqB;AAClD,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,iBAAA,CAAkB,GAAA,EAAK,UAAU,CAAA;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,QAAA,EAAwB;AACtC,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,eAAA,CAAgB,QAAQ,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,MAAA,EAAgB;AAChC,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,iBAAA,CAAkB,MAAM,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,MAAA,EAAsB;AACnC,IAAA,IAAA,CAAK,YAAA,CAAa,eAAe,MAAM,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CAAW,QAAA,EAAkB,KAAA,EAAwC;AACzE,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,QAAA,EAAU,KAAK,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAAyB;AAC7B,IAAA,MAAM,IAAA,CAAK,QAAQ,OAAA,EAAQ;AAC3B,IAAA,IAAA,CAAK,aAAa,OAAA,EAAQ;AAC1B,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AACtB,IAAAA,OAAAA,CAAO,KAAK,gCAAgC,CAAA;AAAA,EAC9C;AACF;AAKO,SAAS,kBAAkB,MAAA,EAAwC;AACxE,EAAA,OAAO,IAAI,YAAY,MAAM,CAAA;AAC/B","file":"index.js","sourcesContent":["export class ClawiverseError extends Error {\n constructor(\n message: string,\n public code: string,\n public details?: unknown\n ) {\n super(message);\n this.name = 'ClawiverseError';\n }\n}\n\nexport class IdentityError extends ClawiverseError {\n constructor(message: string, details?: unknown) {\n super(message, 'IDENTITY_ERROR', details);\n this.name = 'IdentityError';\n }\n}\n\nexport class TransportError extends ClawiverseError {\n constructor(message: string, details?: unknown) {\n super(message, 'TRANSPORT_ERROR', details);\n this.name = 'TransportError';\n }\n}\n\nexport class DiscoveryError extends ClawiverseError {\n constructor(message: string, details?: unknown) {\n super(message, 'DISCOVERY_ERROR', details);\n this.name = 'DiscoveryError';\n }\n}\n\nexport class MessagingError extends ClawiverseError {\n constructor(message: string, details?: unknown) {\n super(message, 'MESSAGING_ERROR', details);\n this.name = 'MessagingError';\n }\n}\n","import * as ed25519 from '@noble/ed25519';\nimport { IdentityError } from '../utils/errors.js';\n\nexport interface KeyPair {\n publicKey: Uint8Array;\n privateKey: Uint8Array;\n}\n\n/**\n * Generate a new Ed25519 key pair\n */\nexport async function generateKeyPair(): Promise<KeyPair> {\n try {\n const privateKey = ed25519.utils.randomPrivateKey();\n const publicKey = await ed25519.getPublicKeyAsync(privateKey);\n\n return {\n publicKey,\n privateKey,\n };\n } catch (error) {\n throw new IdentityError('Failed to generate key pair', error);\n }\n}\n\n/**\n * Sign a message with a private key\n */\nexport async function sign(\n message: Uint8Array,\n privateKey: Uint8Array\n): Promise<Uint8Array> {\n try {\n return await ed25519.signAsync(message, privateKey);\n } catch (error) {\n throw new IdentityError('Failed to sign message', error);\n }\n}\n\n/**\n * Verify a signature\n */\nexport async function verify(\n signature: Uint8Array,\n message: Uint8Array,\n publicKey: Uint8Array\n): Promise<boolean> {\n try {\n return await ed25519.verifyAsync(signature, message, publicKey);\n } catch (error) {\n throw new IdentityError('Failed to verify signature', error);\n }\n}\n\n/**\n * Export key pair to JSON format\n */\nexport function exportKeyPair(keyPair: KeyPair): {\n publicKey: string;\n privateKey: string;\n} {\n return {\n publicKey: Buffer.from(keyPair.publicKey).toString('hex'),\n privateKey: Buffer.from(keyPair.privateKey).toString('hex'),\n };\n}\n\n/**\n * Import key pair from JSON format\n */\nexport function importKeyPair(exported: {\n publicKey: string;\n privateKey: string;\n}): KeyPair {\n return {\n publicKey: new Uint8Array(Buffer.from(exported.publicKey, 'hex')),\n privateKey: new Uint8Array(Buffer.from(exported.privateKey, 'hex')),\n };\n}\n","import { base58btc } from 'multiformats/bases/base58';\nimport { IdentityError } from '../utils/errors.js';\n\n/**\n * Derive a did:clawiverse DID from a public key\n * Format: did:clawiverse:<base58btc-encoded-pubkey>\n */\nexport function deriveDID(publicKey: Uint8Array): string {\n try {\n const encoded = base58btc.encode(publicKey);\n return `did:clawiverse:${encoded}`;\n } catch (error) {\n throw new IdentityError('Failed to derive DID', error);\n }\n}\n\n/**\n * Extract public key from a did:clawiverse DID\n */\nexport function extractPublicKey(did: string): Uint8Array {\n if (!did.startsWith('did:clawiverse:')) {\n throw new IdentityError('Invalid DID format: must start with did:clawiverse:');\n }\n\n try {\n const encoded = did.replace('did:clawiverse:', '');\n return base58btc.decode(encoded);\n } catch (error) {\n throw new IdentityError('Failed to extract public key from DID', error);\n }\n}\n\n/**\n * Validate a did:clawiverse DID format\n */\nexport function validateDID(did: string): boolean {\n if (!did.startsWith('did:clawiverse:')) {\n return false;\n }\n\n try {\n const encoded = did.replace('did:clawiverse:', '');\n base58btc.decode(encoded);\n return true;\n } catch {\n return false;\n }\n}\n","import { sign, verify } from './keys.js';\nimport { deriveDID } from './did.js';\nimport { IdentityError } from '../utils/errors.js';\n\nexport interface SignedMessage {\n payload: Uint8Array;\n signature: Uint8Array;\n signer: string; // DID\n}\n\n/**\n * Sign a message and return a signed message object\n */\nexport async function signMessage(\n payload: Uint8Array,\n privateKey: Uint8Array,\n publicKey: Uint8Array\n): Promise<SignedMessage> {\n try {\n const signature = await sign(payload, privateKey);\n const signer = deriveDID(publicKey);\n\n return {\n payload,\n signature,\n signer,\n };\n } catch (error) {\n throw new IdentityError('Failed to sign message', error);\n }\n}\n\n/**\n * Verify a signed message\n */\nexport async function verifyMessage(\n signedMessage: SignedMessage,\n expectedPublicKey: Uint8Array\n): Promise<boolean> {\n try {\n const expectedDID = deriveDID(expectedPublicKey);\n\n if (signedMessage.signer !== expectedDID) {\n return false;\n }\n\n return await verify(\n signedMessage.signature,\n signedMessage.payload,\n expectedPublicKey\n );\n } catch (error) {\n throw new IdentityError('Failed to verify message', error);\n }\n}\n","export enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n}\n\nexport class Logger {\n private level: LogLevel;\n private prefix: string;\n\n constructor(prefix: string, level: LogLevel = LogLevel.INFO) {\n this.prefix = prefix;\n this.level = level;\n }\n\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n debug(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.DEBUG) {\n console.debug(`[${this.prefix}] DEBUG:`, message, ...args);\n }\n }\n\n info(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.INFO) {\n console.info(`[${this.prefix}] INFO:`, message, ...args);\n }\n }\n\n warn(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.WARN) {\n console.warn(`[${this.prefix}] WARN:`, message, ...args);\n }\n }\n\n error(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.ERROR) {\n console.error(`[${this.prefix}] ERROR:`, message, ...args);\n }\n }\n}\n\nexport const createLogger = (prefix: string, level?: LogLevel): Logger => {\n return new Logger(prefix, level);\n};\n","import { createLibp2p, Libp2p } from 'libp2p';\nimport { tcp } from '@libp2p/tcp';\nimport { noise } from '@chainsafe/libp2p-noise';\nimport { mplex } from '@libp2p/mplex';\nimport { kadDHT, passthroughMapper } from '@libp2p/kad-dht';\nimport { bootstrap } from '@libp2p/bootstrap';\nimport { identify } from '@libp2p/identify';\nimport { ping } from '@libp2p/ping';\nimport {\n circuitRelayTransport,\n circuitRelayServer,\n} from '@libp2p/circuit-relay-v2';\nimport { createLogger } from '../utils/logger.js';\nimport { TransportError } from '../utils/errors.js';\nimport type { KeyPair } from '../identity/keys.js';\nimport type { PrivateKey } from '@libp2p/interface';\n\nconst logger = createLogger('transport');\n\nexport interface TransportConfig {\n keyPair?: KeyPair;\n listenAddresses?: string[];\n bootstrapPeers?: string[];\n enableDHT?: boolean;\n /** Run as a relay server so NAT'd agents can receive messages through this node */\n enableRelay?: boolean;\n /** Reserve a relay slot on bootstrap nodes so others can reach us (only needed for hw1 join) */\n reserveRelaySlot?: boolean;\n /** Enable mDNS local peer discovery (default: false) */\n enableMDNS?: boolean;\n /** libp2p PrivateKey for persistent PeerID (from @libp2p/crypto) */\n privateKey?: PrivateKey;\n}\n\nexport interface ClawiverseNode {\n libp2p: Libp2p;\n start: () => Promise<void>;\n stop: () => Promise<void>;\n getMultiaddrs: () => string[];\n getPeerId: () => string;\n}\n\n/**\n * Create a Clawiverse transport node with libp2p\n */\nexport async function createNode(\n config: TransportConfig\n): Promise<ClawiverseNode> {\n try {\n const {\n listenAddresses = ['/ip4/0.0.0.0/tcp/0'],\n bootstrapPeers = [],\n enableDHT = true,\n enableRelay = false,\n reserveRelaySlot = false,\n enableMDNS = false,\n privateKey,\n } = config;\n\n // Reserve relay slots by adding p2p-circuit listen addresses (for hw1 join)\n const relayListenAddrs = reserveRelaySlot\n ? bootstrapPeers.map((peer) => `${peer}/p2p-circuit`)\n : [];\n\n const libp2pConfig: any = {\n addresses: {\n listen: [...listenAddresses, ...relayListenAddrs],\n },\n ...(privateKey ? { privateKey } : {}),\n transports: [\n tcp(),\n circuitRelayTransport(),\n ],\n connectionEncrypters: [noise()],\n streamMuxers: [mplex()],\n connectionManager: {\n minConnections: bootstrapPeers.length > 0 ? 1 : 0,\n maxConnections: 50,\n },\n services: {\n identify: identify(),\n ping: ping(),\n },\n };\n\n if (enableRelay) {\n libp2pConfig.services.relay = circuitRelayServer({\n reservations: {\n maxReservations: 100, // Allow up to 100 concurrent relay reservations\n },\n });\n }\n\n if (enableDHT) {\n libp2pConfig.services.dht = kadDHT({\n clientMode: false,\n peerInfoMapper: passthroughMapper,\n validators: {\n clawiverse: async () => {},\n },\n selectors: {\n clawiverse: () => 0,\n },\n // Optimize for small networks: reduce replication factor and query timeout\n kBucketSize: 20, // Default K=20, keep for compatibility\n querySelfInterval: 300000, // Self-query every 5 min (default 30s)\n // Allow queries to complete faster in small networks\n allowQueryWithZeroPeers: true,\n });\n }\n\n const peerDiscovery: any[] = [];\n if (bootstrapPeers.length > 0) peerDiscovery.push(bootstrap({ list: bootstrapPeers }));\n if (enableMDNS) {\n const { mdns } = await import('@libp2p/mdns');\n peerDiscovery.push(mdns());\n }\n if (peerDiscovery.length > 0) libp2pConfig.peerDiscovery = peerDiscovery;\n\n const libp2p = await createLibp2p(libp2pConfig);\n\n logger.info('Libp2p node created', {\n listenAddresses: libp2pConfig.addresses.listen,\n reserveRelaySlot,\n });\n\n return {\n libp2p,\n start: async () => {\n await libp2p.start();\n logger.info('Node started', {\n peerId: libp2p.peerId.toString(),\n addresses: libp2p.getMultiaddrs().map((ma) => ma.toString()),\n relay: enableRelay,\n reserveRelaySlot,\n });\n },\n stop: async () => {\n await libp2p.stop();\n logger.info('Node stopped');\n },\n getMultiaddrs: () => {\n return libp2p.getMultiaddrs().map((ma) => ma.toString());\n },\n getPeerId: () => {\n return libp2p.peerId.toString();\n },\n };\n } catch (error) {\n throw new TransportError('Failed to create transport node', error);\n }\n}\n","/**\n * Enhanced Agent Card Types for Phase 2\n *\n * Adds structured capabilities, JSON-LD support, and trust metrics\n */\n\nimport type { TrustScore } from '../trust/trust-score.js';\n\n/**\n * Capability Parameter Definition\n */\nexport interface CapabilityParameter {\n name: string;\n type: 'string' | 'number' | 'boolean' | 'object' | 'array';\n required: boolean;\n description?: string;\n enum?: string[];\n default?: unknown;\n}\n\n/**\n * Structured Capability Definition\n */\nexport interface Capability {\n '@type'?: string; // JSON-LD type (e.g., \"TranslationService\")\n id: string; // Unique capability ID\n name: string; // Human-readable name\n description: string;\n parameters?: CapabilityParameter[];\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Enhanced Agent Card with JSON-LD support\n */\nexport interface AgentCard {\n '@context'?: string[]; // JSON-LD context\n did: string;\n name: string;\n description: string;\n version: string;\n capabilities: Capability[]; // Changed from string[] to Capability[]\n endpoints: string[];\n peerId?: string;\n trust?: TrustScore; // Trust metrics\n metadata?: Record<string, unknown>;\n timestamp: number;\n signature: string;\n}\n\n/**\n * Legacy Agent Card (Phase 1 compatibility)\n */\nexport interface LegacyAgentCard {\n did: string;\n name: string;\n description: string;\n version: string;\n capabilities: string[]; // Flat string array\n endpoints: string[];\n peerId?: string;\n metadata?: Record<string, unknown>;\n timestamp: number;\n signature: string;\n}\n\n/**\n * Check if card is legacy format\n */\nexport function isLegacyCard(card: AgentCard | LegacyAgentCard): card is LegacyAgentCard {\n return Array.isArray(card.capabilities) &&\n card.capabilities.length > 0 &&\n typeof card.capabilities[0] === 'string';\n}\n\n/**\n * Convert legacy card to new format\n */\nexport function upgradeLegacyCard(legacy: LegacyAgentCard): AgentCard {\n return {\n ...legacy,\n capabilities: legacy.capabilities.map(cap => ({\n id: cap,\n name: cap,\n description: `Capability: ${cap}`,\n })),\n };\n}\n\n/**\n * Convert new card to legacy format (for backward compatibility)\n */\nexport function downgradeToLegacyCard(card: AgentCard): LegacyAgentCard {\n const { '@context': _, trust: __, ...rest } = card;\n return {\n ...rest,\n capabilities: card.capabilities.map(cap => cap.id),\n };\n}\n","import Ajv, { JSONSchemaType } from 'ajv';\nimport { DiscoveryError } from '../utils/errors.js';\n\n// Re-export Phase 2 types\nexport type { AgentCard, Capability, CapabilityParameter, LegacyAgentCard } from './agent-card-types.js';\nexport { isLegacyCard, upgradeLegacyCard, downgradeToLegacyCard } from './agent-card-types.js';\n\n// Import for internal use\nimport type { AgentCard, Capability, LegacyAgentCard } from './agent-card-types.js';\nimport { isLegacyCard } from './agent-card-types.js';\n\n// Legacy schema for backward compatibility\nconst legacyAgentCardSchema: JSONSchemaType<Omit<LegacyAgentCard, 'signature'>> = {\n type: 'object',\n properties: {\n did: { type: 'string', pattern: '^did:clawiverse:[1-9A-HJ-NP-Za-km-z]+$' },\n name: { type: 'string', minLength: 1, maxLength: 100 },\n description: { type: 'string', maxLength: 500 },\n version: { type: 'string', pattern: '^\\\\d+\\\\.\\\\d+\\\\.\\\\d+$' },\n capabilities: {\n type: 'array',\n items: { type: 'string' },\n minItems: 0,\n maxItems: 50,\n },\n endpoints: {\n type: 'array',\n items: { type: 'string' },\n minItems: 0,\n maxItems: 10,\n },\n peerId: { type: 'string', nullable: true },\n metadata: {\n type: 'object',\n nullable: true,\n required: [],\n },\n timestamp: { type: 'number' },\n },\n required: ['did', 'name', 'description', 'version', 'capabilities', 'endpoints', 'timestamp'],\n additionalProperties: false,\n};\n\nconst ajv = new Ajv();\nconst validateLegacySchema = ajv.compile(legacyAgentCardSchema);\n\n/**\n * Create a new Agent Card (Phase 2 format with structured capabilities)\n */\nexport function createAgentCard(\n did: string,\n name: string,\n description: string,\n capabilities: Capability[],\n endpoints: string[] = [],\n peerId?: string,\n metadata?: Record<string, unknown>\n): Omit<AgentCard, 'signature'> {\n return {\n did,\n name,\n description,\n version: '1.0.0',\n capabilities,\n endpoints,\n peerId,\n metadata,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Create a legacy Agent Card (Phase 1 format with string capabilities)\n * For backward compatibility\n */\nexport function createLegacyAgentCard(\n did: string,\n name: string,\n description: string,\n capabilities: string[],\n endpoints: string[] = [],\n peerId?: string,\n metadata?: Record<string, unknown>\n): Omit<LegacyAgentCard, 'signature'> {\n return {\n did,\n name,\n description,\n version: '1.0.0',\n capabilities,\n endpoints,\n peerId,\n metadata,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Validate an Agent Card structure (supports both Phase 1 and Phase 2 formats)\n */\nexport function validateAgentCard(card: unknown): card is AgentCard | LegacyAgentCard {\n if (typeof card !== 'object' || card === null) {\n return false;\n }\n\n const c = card as Partial<AgentCard | LegacyAgentCard>;\n\n // Check signature exists\n if (typeof c.signature !== 'string') {\n return false;\n }\n\n // Check if it's legacy format\n if (isLegacyCard(c as any)) {\n return validateLegacySchema(c);\n }\n\n // Phase 2 format - basic validation\n // (Full JSON-LD validation would be more complex)\n return (\n typeof c.did === 'string' &&\n typeof c.name === 'string' &&\n typeof c.description === 'string' &&\n typeof c.version === 'string' &&\n Array.isArray(c.capabilities) &&\n Array.isArray(c.endpoints) &&\n typeof c.timestamp === 'number'\n );\n}\n\n/**\n * Sign an Agent Card\n */\nexport async function signAgentCard(\n card: Omit<AgentCard, 'signature'>,\n signFn: (data: Uint8Array) => Promise<Uint8Array>\n): Promise<AgentCard> {\n try {\n const cardJson = JSON.stringify(card);\n const cardBytes = new TextEncoder().encode(cardJson);\n const signature = await signFn(cardBytes);\n\n return {\n ...card,\n signature: Buffer.from(signature).toString('hex'),\n };\n } catch (error) {\n throw new DiscoveryError('Failed to sign Agent Card', error);\n }\n}\n\n/**\n * Verify an Agent Card signature\n */\nexport async function verifyAgentCard(\n card: AgentCard,\n verifyFn: (signature: Uint8Array, data: Uint8Array) => Promise<boolean>\n): Promise<boolean> {\n try {\n const { signature, ...cardWithoutSig } = card;\n const cardJson = JSON.stringify(cardWithoutSig);\n const cardBytes = new TextEncoder().encode(cardJson);\n const signatureBytes = Buffer.from(signature, 'hex');\n\n return await verifyFn(signatureBytes, cardBytes);\n } catch (error) {\n throw new DiscoveryError('Failed to verify Agent Card', error);\n }\n}\n\n/**\n * Check if an Agent Card matches a capability query\n * Supports both Phase 1 (string[]) and Phase 2 (Capability[]) formats\n */\nexport function matchesCapability(\n card: AgentCard | LegacyAgentCard,\n capability: string\n): boolean {\n if (isLegacyCard(card)) {\n return card.capabilities.some((cap) =>\n cap.toLowerCase().includes(capability.toLowerCase())\n );\n }\n\n return card.capabilities.some((cap) =>\n cap.id.toLowerCase().includes(capability.toLowerCase()) ||\n cap.name.toLowerCase().includes(capability.toLowerCase()) ||\n cap.description.toLowerCase().includes(capability.toLowerCase())\n );\n}\n","/**\n * JSON-LD Schema Definitions for Agent Cards\n *\n * Defines the Clawiverse vocabulary and integrates with Schema.org\n * for semantic interoperability.\n */\n\nexport const CLAWIVERSE_CONTEXT = 'https://clawiverse.org/context/v1';\nexport const SCHEMA_ORG_CONTEXT = 'https://schema.org';\n\n/**\n * Clawiverse JSON-LD Context\n * Defines the vocabulary for Agent Cards and Capabilities\n */\nexport const clawiverseContext = {\n '@context': {\n '@vocab': CLAWIVERSE_CONTEXT,\n 'schema': SCHEMA_ORG_CONTEXT,\n 'AgentCard': 'schema:SoftwareApplication',\n 'Capability': 'schema:Action',\n 'did': '@id',\n 'name': 'schema:name',\n 'description': 'schema:description',\n 'version': 'schema:softwareVersion',\n 'capabilities': {\n '@id': 'schema:potentialAction',\n '@type': '@id',\n '@container': '@list'\n },\n 'endpoints': {\n '@id': 'schema:url',\n '@container': '@list'\n },\n 'peerId': 'clawiverse:peerId',\n 'trust': 'clawiverse:trustScore',\n 'metadata': 'schema:additionalProperty',\n 'timestamp': 'schema:dateModified',\n 'signature': 'clawiverse:signature',\n 'parameters': {\n '@id': 'schema:object',\n '@container': '@list'\n }\n }\n};\n\n/**\n * Capability Type Definitions\n * Common capability types with semantic meaning\n */\nexport const CapabilityTypes = {\n TRANSLATION: 'TranslationService',\n CODE_REVIEW: 'CodeReviewService',\n DATA_ANALYSIS: 'DataAnalysisService',\n TEXT_GENERATION: 'TextGenerationService',\n IMAGE_GENERATION: 'ImageGenerationService',\n SEARCH: 'SearchService',\n COMPUTATION: 'ComputationService',\n STORAGE: 'StorageService',\n MESSAGING: 'MessagingService',\n AUTHENTICATION: 'AuthenticationService',\n} as const;\n\n/**\n * Parameter Type Definitions\n */\nexport const ParameterTypes = {\n STRING: 'string',\n NUMBER: 'number',\n BOOLEAN: 'boolean',\n OBJECT: 'object',\n ARRAY: 'array',\n} as const;\n\n/**\n * Get JSON-LD context for Agent Card\n */\nexport function getAgentCardContext(): string[] {\n return [SCHEMA_ORG_CONTEXT, CLAWIVERSE_CONTEXT];\n}\n\n/**\n * Validate JSON-LD context\n */\nexport function isValidContext(context: unknown): boolean {\n if (!Array.isArray(context)) return false;\n return context.every(c => typeof c === 'string');\n}\n","/**\n * Agent Card Encoder - Dual Encoding Support\n *\n * Provides bidirectional conversion between:\n * - CBOR (compact binary) for DHT storage\n * - JSON-LD (semantic) for Web publishing\n */\n\nimport { encode as cborEncode, decode as cborDecode } from 'cbor-x';\nimport type { AgentCard, LegacyAgentCard } from './agent-card-types.js';\nimport { isLegacyCard, upgradeLegacyCard } from './agent-card-types.js';\nimport { getAgentCardContext } from './agent-card-schema.js';\nimport { DiscoveryError } from '../utils/errors.js';\n\n/**\n * Encode Agent Card as CBOR for DHT storage\n */\nexport function encodeForDHT(card: AgentCard): Uint8Array {\n try {\n // Remove JSON-LD context for compact storage\n const { '@context': _, ...cardWithoutContext } = card;\n return cborEncode(cardWithoutContext);\n } catch (error) {\n throw new DiscoveryError('Failed to encode Agent Card as CBOR', error);\n }\n}\n\n/**\n * Encode Agent Card as JSON-LD for Web publishing\n */\nexport function encodeForWeb(card: AgentCard): string {\n try {\n // Ensure JSON-LD context is present\n const cardWithContext: AgentCard = {\n '@context': card['@context'] || getAgentCardContext(),\n ...card,\n };\n return JSON.stringify(cardWithContext, null, 2);\n } catch (error) {\n throw new DiscoveryError('Failed to encode Agent Card as JSON-LD', error);\n }\n}\n\n/**\n * Decode Agent Card from CBOR\n */\nexport function decodeFromCBOR(data: Uint8Array): AgentCard {\n try {\n const decoded = cborDecode(data) as AgentCard | LegacyAgentCard;\n\n // Handle legacy format\n if (isLegacyCard(decoded)) {\n return upgradeLegacyCard(decoded);\n }\n\n // Add default context if missing\n if (!decoded['@context']) {\n decoded['@context'] = getAgentCardContext();\n }\n\n return decoded;\n } catch (error) {\n throw new DiscoveryError('Failed to decode Agent Card from CBOR', error);\n }\n}\n\n/**\n * Decode Agent Card from JSON-LD\n */\nexport function decodeFromJSON(json: string): AgentCard {\n try {\n const decoded = JSON.parse(json) as AgentCard | LegacyAgentCard;\n\n // Handle legacy format\n if (isLegacyCard(decoded)) {\n return upgradeLegacyCard(decoded);\n }\n\n // Add default context if missing\n if (!decoded['@context']) {\n decoded['@context'] = getAgentCardContext();\n }\n\n return decoded;\n } catch (error) {\n throw new DiscoveryError('Failed to decode Agent Card from JSON', error);\n }\n}\n\n/**\n * Auto-detect format and decode\n */\nexport function decodeAgentCard(data: Uint8Array | string): AgentCard {\n if (typeof data === 'string') {\n return decodeFromJSON(data);\n }\n\n // Try CBOR first, fallback to JSON if it looks like text\n try {\n return decodeFromCBOR(data);\n } catch {\n // Check if it's actually JSON text\n const text = new TextDecoder().decode(data);\n if (text.trim().startsWith('{')) {\n return decodeFromJSON(text);\n }\n throw new DiscoveryError('Unable to decode Agent Card: unknown format');\n }\n}\n\n/**\n * Calculate encoded size for comparison\n */\nexport function getEncodedSize(card: AgentCard): { cbor: number; json: number } {\n return {\n cbor: encodeForDHT(card).length,\n json: encodeForWeb(card).length,\n };\n}\n","/**\n * Search Index for Agent Discovery\n *\n * Maintains a local index of discovered agents for fast semantic search\n */\n\nimport lunr from 'lunr';\nimport Fuse from 'fuse.js';\nimport type { AgentCard } from './agent-card-types.js';\nimport { createLogger } from '../utils/logger.js';\n\nconst logger = createLogger('search-index');\n\n/**\n * Semantic Query Interface\n */\nexport interface SemanticQuery {\n text?: string; // Natural language: \"translate Japanese\"\n capability?: string; // Structured: \"translate\"\n filters?: {\n language?: string;\n minTrustScore?: number;\n maxCost?: number;\n tags?: string[];\n };\n limit?: number;\n}\n\n/**\n * Search Result with Score\n */\nexport interface SearchResult {\n card: AgentCard;\n score: number;\n}\n\n/**\n * Search Index Implementation\n */\nexport class SearchIndex {\n private cards = new Map<string, AgentCard>();\n private lunrIndex?: lunr.Index;\n private fuse?: Fuse<AgentCard>;\n private needsRebuild = false;\n\n /**\n * Add or update an Agent Card in the index\n */\n indexAgentCard(card: AgentCard): void {\n this.cards.set(card.did, card);\n this.needsRebuild = true;\n logger.debug('Indexed Agent Card', { did: card.did, capabilities: card.capabilities.length });\n }\n\n /**\n * Remove an Agent Card from the index\n */\n removeAgentCard(did: string): void {\n this.cards.delete(did);\n this.needsRebuild = true;\n logger.debug('Removed Agent Card from index', { did });\n }\n\n /**\n * Search for agents matching a query\n */\n search(query: SemanticQuery): SearchResult[] {\n if (this.needsRebuild) {\n this.rebuild();\n }\n\n let results: SearchResult[] = [];\n\n // Text search using Lunr\n if (query.text && this.lunrIndex) {\n results = this.searchByText(query.text);\n }\n // Capability search using Fuse\n else if (query.capability && this.fuse) {\n results = this.searchByCapability(query.capability);\n }\n // No query - return all\n else {\n results = Array.from(this.cards.values()).map(card => ({\n card,\n score: 1.0,\n }));\n }\n\n // Apply filters\n if (query.filters) {\n results = this.applyFilters(results, query.filters);\n }\n\n // Sort by score (descending)\n results.sort((a, b) => b.score - a.score);\n\n // Apply limit\n if (query.limit) {\n results = results.slice(0, query.limit);\n }\n\n logger.debug('Search completed', { query, results: results.length });\n return results;\n }\n\n /**\n * Get all indexed cards\n */\n getAllCards(): AgentCard[] {\n return Array.from(this.cards.values());\n }\n\n /**\n * Clear the index\n */\n clear(): void {\n this.cards.clear();\n this.lunrIndex = undefined;\n this.fuse = undefined;\n this.needsRebuild = false;\n logger.info('Search index cleared');\n }\n\n /**\n * Get index size\n */\n size(): number {\n return this.cards.size;\n }\n\n /**\n * Rebuild search indexes\n */\n private rebuild(): void {\n logger.info('Rebuilding search indexes', { cards: this.cards.size });\n\n const cards = Array.from(this.cards.values());\n\n // Build Lunr index for full-text search\n this.lunrIndex = lunr(function (this: lunr.Builder) {\n this.ref('did');\n this.field('name', { boost: 10 });\n this.field('description', { boost: 5 });\n this.field('capabilities');\n\n for (const card of cards) {\n this.add({\n did: card.did,\n name: card.name,\n description: card.description,\n capabilities: card.capabilities\n .map((cap: any) => `${cap.name} ${cap.description}`)\n .join(' '),\n });\n }\n });\n\n // Build Fuse index for fuzzy matching\n this.fuse = new Fuse(Array.from(this.cards.values()), {\n keys: [\n { name: 'name', weight: 0.3 },\n { name: 'description', weight: 0.2 },\n { name: 'capabilities.name', weight: 0.3 },\n { name: 'capabilities.description', weight: 0.2 },\n ],\n threshold: 0.4,\n includeScore: true,\n });\n\n this.needsRebuild = false;\n logger.info('Search indexes rebuilt');\n }\n\n /**\n * Search by text using Lunr\n */\n private searchByText(text: string): SearchResult[] {\n if (!this.lunrIndex) return [];\n\n const lunrResults = this.lunrIndex.search(text);\n return lunrResults.map(result => ({\n card: this.cards.get(result.ref)!,\n score: result.score,\n }));\n }\n\n /**\n * Search by capability using Fuse\n */\n private searchByCapability(capability: string): SearchResult[] {\n if (!this.fuse) return [];\n\n const fuseResults = this.fuse.search(capability);\n return fuseResults.map(result => ({\n card: result.item,\n score: 1 - (result.score || 0), // Fuse score is distance, convert to similarity\n }));\n }\n\n /**\n * Apply filters to search results\n */\n private applyFilters(\n results: SearchResult[],\n filters: NonNullable<SemanticQuery['filters']>\n ): SearchResult[] {\n return results.filter(result => {\n const { card } = result;\n\n // Trust score filter\n if (filters.minTrustScore !== undefined && card.trust) {\n const overallTrust =\n card.trust.interactionScore * 0.4 +\n Math.min(card.trust.endorsements / 10, 1) * 0.2 +\n card.trust.completionRate * 0.2 +\n card.trust.uptime * 0.2;\n\n if (overallTrust < filters.minTrustScore) {\n return false;\n }\n }\n\n // Language filter (check capability metadata)\n if (filters.language) {\n const hasLanguage = card.capabilities.some(\n cap => {\n const metadata = cap.metadata as Record<string, any> | undefined;\n if (!metadata) return false;\n return metadata.language === filters.language ||\n (Array.isArray(metadata.languages) && metadata.languages.includes(filters.language));\n }\n );\n if (!hasLanguage) return false;\n }\n\n // Tags filter\n if (filters.tags && filters.tags.length > 0) {\n const cardTags = Array.isArray(card.metadata?.tags) ? (card.metadata.tags as string[]) : [];\n const hasAllTags = filters.tags.every(tag => cardTags.includes(tag));\n if (!hasAllTags) return false;\n }\n\n return true;\n });\n }\n}\n","/**\n * Capability Matcher\n *\n * Matches semantic queries against agent capabilities\n */\n\nimport type { Capability } from './agent-card-types.js';\nimport type { SemanticQuery } from './search-index.js';\n\n/**\n * Capability Matcher\n */\nexport class CapabilityMatcher {\n /**\n * Match a query against a capability\n * Returns a score between 0 and 1\n */\n match(query: SemanticQuery, capability: Capability): number {\n let score = 0;\n let weights = 0;\n\n // Exact capability ID match\n if (query.capability && capability.id === query.capability) {\n return 1.0;\n }\n\n // Fuzzy capability name match\n if (query.capability) {\n const nameScore = this.fuzzyMatch(query.capability, capability.name);\n score += nameScore * 0.4;\n weights += 0.4;\n }\n\n // Text keyword match\n if (query.text) {\n const keywords = this.extractKeywords(query.text);\n const keywordScore = this.matchKeywords(keywords, capability);\n score += keywordScore * 0.4;\n weights += 0.4;\n }\n\n // Type hierarchy match\n if (query.capability && capability['@type']) {\n const typeScore = this.matchesType(query.capability, capability['@type']) ? 0.6 : 0;\n score += typeScore * 0.2;\n weights += 0.2;\n }\n\n return weights > 0 ? score / weights : 0;\n }\n\n /**\n * Extract keywords from natural language text\n */\n extractKeywords(text: string): string[] {\n // Remove common stop words\n const stopWords = new Set([\n 'a', 'an', 'the', 'is', 'are', 'was', 'were', 'be', 'been',\n 'to', 'from', 'in', 'on', 'at', 'by', 'for', 'with', 'about',\n 'can', 'could', 'should', 'would', 'will', 'do', 'does', 'did',\n 'i', 'you', 'he', 'she', 'it', 'we', 'they', 'me', 'him', 'her',\n ]);\n\n return text\n .toLowerCase()\n .split(/\\W+/)\n .filter(word => word.length > 2 && !stopWords.has(word));\n }\n\n /**\n * Match keywords against capability\n */\n matchKeywords(keywords: string[], capability: Capability): number {\n if (keywords.length === 0) return 0;\n\n const capText = `${capability.name} ${capability.description}`.toLowerCase();\n const matches = keywords.filter(keyword => capText.includes(keyword));\n\n return matches.length / keywords.length;\n }\n\n /**\n * Check if query matches capability type hierarchy\n */\n matchesType(query: string, type: string): boolean {\n const queryLower = query.toLowerCase();\n const typeLower = type.toLowerCase();\n\n // Direct match\n if (typeLower.includes(queryLower)) return true;\n\n // Common type mappings\n const typeMap: Record<string, string[]> = {\n translate: ['translation', 'translationservice'],\n review: ['codereview', 'reviewservice'],\n analyze: ['analysis', 'dataanalysis'],\n generate: ['generation', 'textgeneration', 'imagegeneration'],\n search: ['searchservice', 'query'],\n compute: ['computation', 'computationservice'],\n store: ['storage', 'storageservice'],\n message: ['messaging', 'messagingservice'],\n auth: ['authentication', 'authenticationservice'],\n };\n\n for (const [key, values] of Object.entries(typeMap)) {\n if (queryLower.includes(key) && values.some(v => typeLower.includes(v))) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Fuzzy string matching using Levenshtein distance\n */\n private fuzzyMatch(query: string, target: string): number {\n const queryLower = query.toLowerCase();\n const targetLower = target.toLowerCase();\n\n // Exact match\n if (queryLower === targetLower) return 1.0;\n\n // Substring match\n if (targetLower.includes(queryLower)) return 0.8;\n if (queryLower.includes(targetLower)) return 0.7;\n\n // Levenshtein distance\n const distance = this.levenshteinDistance(queryLower, targetLower);\n const maxLen = Math.max(queryLower.length, targetLower.length);\n const similarity = 1 - distance / maxLen;\n\n // Only return positive scores for reasonable similarity\n return similarity > 0.5 ? similarity * 0.6 : 0;\n }\n\n /**\n * Calculate Levenshtein distance between two strings\n */\n private levenshteinDistance(a: string, b: string): number {\n const matrix: number[][] = [];\n\n for (let i = 0; i <= b.length; i++) {\n matrix[i] = [i];\n }\n\n for (let j = 0; j <= a.length; j++) {\n matrix[0][j] = j;\n }\n\n for (let i = 1; i <= b.length; i++) {\n for (let j = 1; j <= a.length; j++) {\n if (b.charAt(i - 1) === a.charAt(j - 1)) {\n matrix[i][j] = matrix[i - 1][j - 1];\n } else {\n matrix[i][j] = Math.min(\n matrix[i - 1][j - 1] + 1, // substitution\n matrix[i][j - 1] + 1, // insertion\n matrix[i - 1][j] + 1 // deletion\n );\n }\n }\n }\n\n return matrix[b.length][a.length];\n }\n}\n","/**\n * Semantic Search Engine\n *\n * Provides intelligent agent discovery through semantic search\n * with local-first strategy and network fallback\n */\n\nimport type { AgentCard } from './agent-card-types.js';\nimport { SearchIndex } from './search-index.js';\nimport type { SemanticQuery, SearchResult } from './search-index.js';\nimport { CapabilityMatcher } from './capability-matcher.js';\nimport type { DHTOperations } from './dht.js';\nimport { createLogger } from '../utils/logger.js';\n\nconst logger = createLogger('semantic-search');\n\n/**\n * Semantic Search Engine\n */\nexport class SemanticSearchEngine {\n private index: SearchIndex;\n private matcher: CapabilityMatcher;\n\n constructor(private dht?: DHTOperations) {\n this.index = new SearchIndex();\n this.matcher = new CapabilityMatcher();\n }\n\n /**\n * Main search interface\n * Local-first with network fallback\n */\n async search(query: SemanticQuery): Promise<AgentCard[]> {\n logger.info('Searching for agents', { query });\n\n // 1. Search local index\n const localResults = this.index.search(query);\n logger.debug('Local search results', { count: localResults.length });\n\n // 2. If insufficient results, query network\n const limit = query.limit || 10;\n if (localResults.length < limit && this.dht) {\n logger.debug('Insufficient local results, querying network');\n const networkResults = await this.searchNetwork(query);\n return this.mergeResults(localResults, networkResults, limit);\n }\n\n return localResults.map(r => r.card);\n }\n\n /**\n * Index an Agent Card for local search\n */\n indexAgentCard(card: AgentCard): void {\n this.index.indexAgentCard(card);\n }\n\n /**\n * Remove an Agent Card from local index\n */\n removeAgentCard(did: string): void {\n this.index.removeAgentCard(did);\n }\n\n /**\n * Get all indexed cards\n */\n getAllIndexedCards(): AgentCard[] {\n return this.index.getAllCards();\n }\n\n /**\n * Clear local index\n */\n clearIndex(): void {\n this.index.clear();\n }\n\n /**\n * Get index size\n */\n getIndexSize(): number {\n return this.index.size();\n }\n\n /**\n * Search network via DHT\n */\n private async searchNetwork(query: SemanticQuery): Promise<SearchResult[]> {\n if (!this.dht) {\n return [];\n }\n\n try {\n // For now, use capability-based DHT query\n // In future, implement distributed semantic search overlay\n const capability = query.capability || this.extractPrimaryCapability(query.text);\n\n if (!capability) {\n logger.debug('No capability extracted from query, skipping network search');\n return [];\n }\n\n const cards = await this.dht.queryByCapability(capability);\n logger.debug('Network search results', { count: cards.length });\n\n // Score network results\n return cards.map(card => {\n const score = this.scoreCard(card, query);\n return { card, score };\n });\n } catch (error) {\n logger.error('Network search failed', { error });\n return [];\n }\n }\n\n /**\n * Merge local and network results, removing duplicates\n */\n private mergeResults(\n local: SearchResult[],\n network: SearchResult[],\n limit: number\n ): AgentCard[] {\n const seen = new Set<string>();\n const merged: SearchResult[] = [];\n\n // Add local results first (they're already scored and sorted)\n for (const result of local) {\n if (!seen.has(result.card.did)) {\n seen.add(result.card.did);\n merged.push(result);\n }\n }\n\n // Add network results\n for (const result of network) {\n if (!seen.has(result.card.did)) {\n seen.add(result.card.did);\n merged.push(result);\n\n // Also index for future searches\n this.index.indexAgentCard(result.card);\n }\n }\n\n // Sort by score and apply limit\n merged.sort((a, b) => b.score - a.score);\n return merged.slice(0, limit).map(r => r.card);\n }\n\n /**\n * Score a card against a query\n */\n private scoreCard(card: AgentCard, query: SemanticQuery): number {\n let totalScore = 0;\n let count = 0;\n\n for (const capability of card.capabilities) {\n const score = this.matcher.match(query, capability);\n if (score > 0) {\n totalScore += score;\n count++;\n }\n }\n\n // Average score across matching capabilities\n const avgScore = count > 0 ? totalScore / count : 0;\n\n // Boost by trust score if available\n if (card.trust) {\n const trustBoost = card.trust.interactionScore * 0.2;\n return Math.min(avgScore + trustBoost, 1.0);\n }\n\n return avgScore;\n }\n\n /**\n * Extract primary capability from natural language text\n */\n private extractPrimaryCapability(text?: string): string | undefined {\n if (!text) return undefined;\n\n const keywords = this.matcher.extractKeywords(text);\n\n // Common capability keywords\n const capabilityKeywords = [\n 'translate', 'translation',\n 'review', 'code',\n 'analyze', 'analysis',\n 'generate', 'generation',\n 'search', 'query',\n 'compute', 'calculation',\n 'store', 'storage',\n 'message', 'messaging',\n 'auth', 'authentication',\n ];\n\n // Find first matching keyword\n for (const keyword of keywords) {\n if (capabilityKeywords.includes(keyword)) {\n return keyword;\n }\n }\n\n // Return first keyword as fallback\n return keywords[0];\n }\n}\n\n/**\n * Create a semantic search engine\n */\nexport function createSemanticSearch(dht?: DHTOperations): SemanticSearchEngine {\n return new SemanticSearchEngine(dht);\n}\n","import type { Libp2p } from 'libp2p';\nimport type { AgentCard } from './agent-card.js';\nimport { createLogger } from '../utils/logger.js';\nimport { DiscoveryError } from '../utils/errors.js';\nimport { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';\nimport { toString as uint8ArrayToString } from 'uint8arrays/to-string';\nimport { encodeForDHT, decodeFromCBOR } from './agent-card-encoder.js';\nimport { createSemanticSearch } from './semantic-search.js';\nimport type { SemanticQuery } from './search-index.js';\n\nconst logger = createLogger('dht');\n\nexport interface ResolvedDID {\n peerId: string;\n multiaddrs: string[];\n}\n\nexport interface DHTOperations {\n publishAgentCard: (card: AgentCard) => Promise<void>;\n queryAgentCard: (did: string) => Promise<AgentCard | null>;\n queryByCapability: (capability: string) => Promise<AgentCard[]>;\n searchSemantic: (query: SemanticQuery) => Promise<AgentCard[]>;\n resolveDID: (did: string) => Promise<ResolvedDID | null>;\n queryRelayPeers: () => Promise<string[]>;\n}\n\n/** Extract a DHT value from a get() event, handling both VALUE and PEER_RESPONSE */\nfunction extractValue(event: any): Uint8Array | null {\n if (event.name === 'VALUE' && event.value) return event.value;\n if (event.name === 'PEER_RESPONSE' && event.value) return event.value;\n return null;\n}\n\n/** Normalize capability name for use as a DHT key segment */\nfunction capKey(cap: string): string {\n return cap.toLowerCase().replace(/[^a-z0-9_-]/g, '_');\n}\n\n/** Read a DID list stored at a DHT key (newline-separated) */\nasync function readDIDList(dht: any, key: Uint8Array): Promise<string[]> {\n try {\n for await (const event of dht.get(key, { signal: AbortSignal.timeout(30000) })) {\n const raw = extractValue(event);\n if (raw) {\n const text = uint8ArrayToString(raw);\n return text.split('\\n').filter(Boolean);\n }\n }\n } catch {\n // key not found or timeout\n }\n return [];\n}\n\n/** Write a DID list to a DHT key (newline-separated), deduplicating */\nasync function writeDIDList(dht: any, key: Uint8Array, dids: string[]): Promise<void> {\n const value = uint8ArrayFromString([...new Set(dids)].join('\\n'));\n // Retry up to 3 times with 30s timeout each\n for (let attempt = 1; attempt <= 3; attempt++) {\n try {\n for await (const _ of dht.put(key, value, { signal: AbortSignal.timeout(30000) })) { /* consume */ }\n return; // Success\n } catch (e: any) {\n if (e?.name === 'AbortError' && attempt < 3) {\n logger.debug(`DHT put timeout, retrying (${attempt}/3)...`);\n continue;\n }\n if (e?.name !== 'AbortError') throw e;\n }\n }\n}\n\n/**\n * Create DHT operations for a libp2p node\n */\nexport function createDHTOperations(libp2p: Libp2p): DHTOperations {\n const operations: DHTOperations = {} as DHTOperations;\n const searchEngine = createSemanticSearch(operations);\n\n return Object.assign(operations, {\n publishAgentCard: async (card: AgentCard) => {\n try {\n const dht = (libp2p as any).services?.dht;\n if (!dht) throw new DiscoveryError('DHT service not available');\n\n // 1. Store Agent Card under /clawiverse/agent/<did>\n const agentKey = uint8ArrayFromString(`/clawiverse/agent/${card.did}`);\n // Retry up to 3 times with 30s timeout each\n for (let attempt = 1; attempt <= 3; attempt++) {\n try {\n for await (const _ of dht.put(agentKey, encodeForDHT(card), { signal: AbortSignal.timeout(30000) })) { /* consume */ }\n break; // Success\n } catch (e: any) {\n if (e?.name === 'AbortError' && attempt < 3) {\n logger.debug(`DHT put agent card timeout, retrying (${attempt}/3)...`);\n continue;\n }\n logger.warn('DHT put agent card failed (non-fatal)', { error: (e as Error).message });\n break;\n }\n }\n\n // 2. For each capability, append this DID to /clawiverse/cap/<capability>\n // Skip capability indexing in slow networks - rely on local index and semantic search instead\n const caps: string[] = (card.capabilities ?? []).map((c: any) =>\n typeof c === 'string' ? c : c.name\n ).filter(Boolean);\n\n // Always index under the special \"all\" key so name/description search works\n caps.push('__all__');\n\n // Only index __all__ key (most important), skip individual capabilities to speed up join\n const importantCaps = ['__all__'];\n await Promise.all(importantCaps.map(async (cap) => {\n const capKeyStr = `/clawiverse/cap/${capKey(cap)}`;\n const capDHTKey = uint8ArrayFromString(capKeyStr);\n try {\n const existing = await readDIDList(dht, capDHTKey);\n if (!existing.includes(card.did)) {\n await writeDIDList(dht, capDHTKey, [...existing, card.did]);\n logger.debug('Indexed capability in DHT', { cap: capKey(cap), did: card.did });\n }\n } catch (e: any) {\n logger.warn('Failed to index capability (non-fatal)', { cap: capKey(cap), error: (e as Error).message });\n }\n }));\n\n // 3. Index locally for fast in-process search\n searchEngine.indexAgentCard(card);\n\n logger.info('Published Agent Card to DHT', { did: card.did });\n } catch (error) {\n throw new DiscoveryError('Failed to publish Agent Card', error);\n }\n },\n\n queryAgentCard: async (did: string) => {\n try {\n const dht = (libp2p as any).services?.dht;\n if (!dht) throw new DiscoveryError('DHT service not available');\n\n const key = uint8ArrayFromString(`/clawiverse/agent/${did}`);\n for await (const event of dht.get(key)) {\n const raw = extractValue(event);\n if (raw) {\n const card = decodeFromCBOR(raw);\n searchEngine.indexAgentCard(card);\n logger.debug('Found Agent Card in DHT', { did });\n return card;\n }\n }\n\n logger.debug('Agent Card not found in DHT', { did });\n return null;\n } catch (error) {\n logger.warn('Failed to query Agent Card', { did, error });\n return null;\n }\n },\n\n queryByCapability: async (capability: string) => {\n try {\n const dht = (libp2p as any).services?.dht;\n\n // 1. Check local index first\n const local = searchEngine.getAllIndexedCards().filter(card =>\n card.capabilities.some((cap: any) => {\n const name = typeof cap === 'string' ? cap : cap.name;\n return name?.toLowerCase().includes(capability.toLowerCase());\n })\n );\n if (local.length > 0) return local;\n\n // 2. Fall back to DHT capability index\n if (!dht) return [];\n\n const capDHTKey = uint8ArrayFromString(`/clawiverse/cap/${capKey(capability)}`);\n const dids = await readDIDList(dht, capDHTKey);\n logger.debug('DHT capability index', { capability, dids });\n\n // Fetch each Agent Card in parallel\n const cards = await Promise.all(\n dids.map(async (did) => {\n const key = uint8ArrayFromString(`/clawiverse/agent/${did}`);\n try {\n for await (const event of dht.get(key)) {\n const raw = extractValue(event);\n if (raw) {\n const card = decodeFromCBOR(raw);\n searchEngine.indexAgentCard(card);\n return card;\n }\n }\n } catch { /* skip unreachable */ }\n return null;\n })\n );\n\n return cards.filter((c): c is AgentCard => c !== null);\n } catch (error) {\n throw new DiscoveryError('Failed to query by capability', error);\n }\n },\n\n searchSemantic: async (query: SemanticQuery) => {\n try {\n // Always pull from DHT __all__ index to discover remote nodes\n const dht = (libp2p as any).services?.dht;\n if (dht) {\n const allKey = uint8ArrayFromString('/clawiverse/cap/__all__');\n const dids = await readDIDList(dht, allKey);\n logger.debug('DHT __all__ index', { count: dids.length });\n\n await Promise.all(\n dids.map(async (did) => {\n const key = uint8ArrayFromString(`/clawiverse/agent/${did}`);\n try {\n for await (const event of dht.get(key)) {\n const raw = extractValue(event);\n if (raw) {\n searchEngine.indexAgentCard(decodeFromCBOR(raw));\n break;\n }\n }\n } catch { /* skip */ }\n })\n );\n }\n\n return searchEngine.search(query);\n } catch (error) {\n throw new DiscoveryError('Failed to perform semantic search', error);\n }\n },\n\n queryRelayPeers: async (): Promise<string[]> => {\n const dht = (libp2p as any).services?.dht;\n if (!dht) return [];\n const capDHTKey = uint8ArrayFromString('/clawiverse/cap/relay');\n const dids = await readDIDList(dht, capDHTKey);\n const addrs: string[] = [];\n await Promise.all(dids.map(async (did) => {\n const card = await operations.queryAgentCard(did);\n if (card?.endpoints) {\n addrs.push(...card.endpoints.filter((e: string) => !e.includes('/p2p-circuit/')));\n }\n }));\n return addrs;\n },\n\n resolveDID: async (did: string) => {\n try {\n const dht = (libp2p as any).services?.dht;\n if (!dht) throw new DiscoveryError('DHT service not available');\n\n const key = uint8ArrayFromString(`/clawiverse/agent/${did}`);\n for await (const event of dht.get(key)) {\n const raw = extractValue(event);\n if (raw) {\n const card = decodeFromCBOR(raw);\n if (card.peerId) {\n logger.debug('Resolved DID to peer', { did, peerId: card.peerId });\n return { peerId: card.peerId, multiaddrs: card.endpoints || [] };\n }\n logger.warn('Agent Card found but has no peerId', { did });\n return null;\n }\n }\n\n logger.debug('DID not found in DHT', { did });\n return null;\n } catch (error) {\n logger.warn('Failed to resolve DID', { did, error });\n return null;\n }\n },\n });\n}\n","import { MessagingError } from '../utils/errors.js';\n\nexport interface MessageEnvelope {\n id: string;\n from: string; // DID\n to: string; // DID\n type: 'request' | 'response' | 'notification';\n protocol: string;\n payload: unknown;\n timestamp: number;\n signature: string;\n replyTo?: string; // For responses, the ID of the request\n}\n\n/**\n * Create a message envelope\n */\nexport function createEnvelope(\n from: string,\n to: string,\n type: 'request' | 'response' | 'notification',\n protocol: string,\n payload: unknown,\n replyTo?: string\n): Omit<MessageEnvelope, 'signature'> {\n return {\n id: generateMessageId(),\n from,\n to,\n type,\n protocol,\n payload,\n timestamp: Date.now(),\n replyTo,\n };\n}\n\n/**\n * Sign a message envelope\n */\nexport async function signEnvelope(\n envelope: Omit<MessageEnvelope, 'signature'>,\n signFn: (data: Uint8Array) => Promise<Uint8Array>\n): Promise<MessageEnvelope> {\n try {\n const envelopeJson = JSON.stringify(envelope);\n const envelopeBytes = new TextEncoder().encode(envelopeJson);\n const signature = await signFn(envelopeBytes);\n\n return {\n ...envelope,\n signature: Buffer.from(signature).toString('hex'),\n };\n } catch (error) {\n throw new MessagingError('Failed to sign envelope', error);\n }\n}\n\n/**\n * Verify a message envelope signature\n */\nexport async function verifyEnvelope(\n envelope: MessageEnvelope,\n verifyFn: (signature: Uint8Array, data: Uint8Array) => Promise<boolean>\n): Promise<boolean> {\n try {\n const { signature, ...envelopeWithoutSig } = envelope;\n const envelopeJson = JSON.stringify(envelopeWithoutSig);\n const envelopeBytes = new TextEncoder().encode(envelopeJson);\n const signatureBytes = Buffer.from(signature, 'hex');\n\n return await verifyFn(signatureBytes, envelopeBytes);\n } catch (error) {\n throw new MessagingError('Failed to verify envelope', error);\n }\n}\n\n/**\n * Validate message envelope structure\n */\nexport function validateEnvelope(msg: unknown): msg is MessageEnvelope {\n if (typeof msg !== 'object' || msg === null) {\n return false;\n }\n\n const m = msg as Partial<MessageEnvelope>;\n\n return (\n typeof m.id === 'string' &&\n typeof m.from === 'string' &&\n m.from.startsWith('did:clawiverse:') &&\n typeof m.to === 'string' &&\n m.to.startsWith('did:clawiverse:') &&\n (m.type === 'request' || m.type === 'response' || m.type === 'notification') &&\n typeof m.protocol === 'string' &&\n m.payload !== undefined &&\n typeof m.timestamp === 'number' &&\n typeof m.signature === 'string'\n );\n}\n\n/**\n * Generate a unique message ID\n */\nfunction generateMessageId(): string {\n return `msg_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n}\n","import { encode, decode } from 'cbor-x';\nimport type { MessageEnvelope } from './envelope.js';\nimport { MessagingError } from '../utils/errors.js';\n\n/**\n * Encode a message envelope to CBOR\n */\nexport function encodeMessage(envelope: MessageEnvelope): Uint8Array {\n try {\n return encode(envelope);\n } catch (error) {\n throw new MessagingError('Failed to encode message', error);\n }\n}\n\n/**\n * Decode a CBOR message to envelope\n */\nexport function decodeMessage(data: Uint8Array): MessageEnvelope {\n try {\n return decode(data) as MessageEnvelope;\n } catch (error) {\n throw new MessagingError('Failed to decode message', error);\n }\n}\n\n/**\n * Encode message to JSON (for debugging/logging)\n */\nexport function encodeMessageJSON(envelope: MessageEnvelope): string {\n try {\n return JSON.stringify(envelope, null, 2);\n } catch (error) {\n throw new MessagingError('Failed to encode message to JSON', error);\n }\n}\n\n/**\n * Decode JSON message to envelope\n */\nexport function decodeMessageJSON(json: string): MessageEnvelope {\n try {\n return JSON.parse(json) as MessageEnvelope;\n } catch (error) {\n throw new MessagingError('Failed to decode message from JSON', error);\n }\n}\n","import type { Libp2p } from 'libp2p';\nimport { peerIdFromString } from '@libp2p/peer-id';\nimport { multiaddr } from '@multiformats/multiaddr';\nimport type { MessageEnvelope } from './envelope.js';\nimport type { DHTOperations } from '../discovery/dht.js';\nimport { encodeMessage, decodeMessage } from './codec.js';\nimport { validateEnvelope } from './envelope.js';\nimport { createLogger } from '../utils/logger.js';\nimport { MessagingError } from '../utils/errors.js';\n\nconst logger = createLogger('router');\n\nexport type MessageHandler = (\n envelope: MessageEnvelope\n) => Promise<MessageEnvelope | void>;\n\nexport interface PeerHint {\n peerId: string;\n multiaddrs: string[];\n}\n\nexport interface MessageRouter {\n registerHandler: (protocol: string, handler: MessageHandler) => void;\n unregisterHandler: (protocol: string) => void;\n registerCatchAllHandler: (handler: MessageHandler) => void;\n sendMessage: (envelope: MessageEnvelope, peerHint?: PeerHint) => Promise<MessageEnvelope | void>;\n start: () => Promise<void>;\n stop: () => Promise<void>;\n}\n\n/**\n * Create a message router for a libp2p node.\n * When dht is provided, sendMessage can resolve DIDs to peer addresses via DHT lookup.\n * When relayPeers is provided, sendMessage will attempt relay fallback if direct dial fails.\n */\nexport function createMessageRouter(\n libp2p: Libp2p,\n verifyFn: (signature: Uint8Array, data: Uint8Array) => Promise<boolean>,\n dht?: DHTOperations,\n relayPeers?: string[]\n): MessageRouter {\n const handlers = new Map<string, MessageHandler>();\n let catchAllHandler: MessageHandler | undefined;\n const PROTOCOL_PREFIX = '/clawiverse/msg/1.0.0';\n\n return {\n registerHandler: (protocol: string, handler: MessageHandler) => {\n handlers.set(protocol, handler);\n logger.info('Registered message handler', { protocol });\n },\n\n unregisterHandler: (protocol: string) => {\n handlers.delete(protocol);\n logger.info('Unregistered message handler', { protocol });\n },\n\n registerCatchAllHandler: (handler: MessageHandler) => {\n catchAllHandler = handler;\n logger.info('Registered catch-all message handler');\n },\n\n sendMessage: async (envelope: MessageEnvelope, peerHint?: PeerHint) => {\n try {\n if (!validateEnvelope(envelope)) {\n throw new MessagingError('Invalid message envelope');\n }\n\n // Resolve peer: try peerHint first, then DHT\n let targetPeerIdStr: string | undefined;\n let targetMultiaddrs: string[] = [];\n\n if (peerHint) {\n targetPeerIdStr = peerHint.peerId;\n targetMultiaddrs = peerHint.multiaddrs;\n logger.info('Using peer hint for direct addressing', { peerId: targetPeerIdStr });\n } else if (dht) {\n const resolved = await dht.resolveDID(envelope.to);\n if (resolved) {\n targetPeerIdStr = resolved.peerId;\n targetMultiaddrs = resolved.multiaddrs;\n }\n }\n\n if (!targetPeerIdStr) {\n throw new MessagingError(\n `Cannot resolve recipient: ${envelope.to} — provide peerHint or ensure agent is in DHT`\n );\n }\n\n const targetPeerId = peerIdFromString(targetPeerIdStr);\n\n if (targetMultiaddrs.length > 0) {\n const mas = targetMultiaddrs.map((a) => multiaddr(a));\n await libp2p.peerStore.merge(targetPeerId, { multiaddrs: mas });\n }\n\n logger.info('Dialing peer for message delivery', {\n peerId: targetPeerIdStr,\n multiaddrs: targetMultiaddrs,\n });\n\n let stream: any;\n\n // Separate relay addrs from direct addrs\n const relayMultiaddrs = targetMultiaddrs.filter((a) => a.includes('/p2p-circuit/'));\n const directMultiaddrs = targetMultiaddrs.filter((a) => !a.includes('/p2p-circuit/'));\n\n // Try direct addresses first\n for (const addr of directMultiaddrs) {\n try {\n const conn = await libp2p.dial(multiaddr(addr));\n stream = await conn.newStream(PROTOCOL_PREFIX, { runOnLimitedConnection: true });\n logger.info('Direct dial succeeded', { addr });\n break;\n } catch {\n // try next\n }\n }\n\n // Fall back to relay: dial the circuit addr to establish connection, then newStream\n if (!stream) {\n const allRelayAddrs = [\n ...relayMultiaddrs,\n ...(relayPeers ?? []).map((r) => buildCircuitRelayAddr(r, targetPeerIdStr!)),\n ];\n // Deduplicate\n const uniqueRelayAddrs = [...new Set(allRelayAddrs)];\n let lastError: unknown;\n for (const addr of uniqueRelayAddrs) {\n try {\n // Step 1: establish the relay connection\n const conn = await libp2p.dial(multiaddr(addr));\n logger.info('Relay connection established', { addr });\n // Step 2: open a protocol stream on the relay (limited) connection\n stream = await conn.newStream(PROTOCOL_PREFIX, { runOnLimitedConnection: true });\n logger.info('Relay stream opened', { addr });\n break;\n } catch (relayErr) {\n logger.warn('Relay dial failed', { addr, error: (relayErr as Error).message });\n lastError = relayErr;\n }\n }\n if (!stream) throw lastError ?? new MessagingError('All dial attempts failed');\n }\n\n // Last resort: query DHT for relay-capable peers\n if (!stream && dht && 'queryRelayPeers' in dht) {\n const discoveredRelays = await (dht as any).queryRelayPeers();\n for (const relayAddr of discoveredRelays) {\n const circuitAddr = buildCircuitRelayAddr(relayAddr, targetPeerIdStr!);\n try {\n const conn = await libp2p.dial(multiaddr(circuitAddr));\n stream = await conn.newStream(PROTOCOL_PREFIX, { runOnLimitedConnection: true });\n logger.info('DHT-discovered relay succeeded', { relayAddr });\n break;\n } catch (e) {\n logger.warn('DHT relay failed', { relayAddr, error: (e as Error).message });\n }\n }\n if (!stream) throw new MessagingError('All dial attempts failed (including DHT-discovered relays)');\n }\n\n const encoded = encodeMessage(envelope);\n await stream.sink(\n (async function* () {\n yield encoded;\n })()\n );\n\n logger.info('Message sent over libp2p stream', {\n id: envelope.id,\n from: envelope.from,\n to: envelope.to,\n protocol: envelope.protocol,\n });\n\n // If this is a request, wait for response\n if (envelope.type === 'request') {\n logger.debug('Waiting for response to request', { id: envelope.id });\n\n try {\n // Add timeout to prevent infinite blocking\n const RESPONSE_TIMEOUT = 30000; // 30 seconds\n\n const responsePromise = (async () => {\n const responseChunks: Uint8Array[] = [];\n for await (const chunk of stream.source) {\n responseChunks.push(chunk.subarray());\n }\n\n if (responseChunks.length > 0) {\n const responseData = new Uint8Array(\n responseChunks.reduce((acc, chunk) => acc + chunk.length, 0)\n );\n let offset = 0;\n for (const chunk of responseChunks) {\n responseData.set(chunk, offset);\n offset += chunk.length;\n }\n\n const responseEnvelope = decodeMessage(responseData);\n logger.info('Received response', {\n id: responseEnvelope.id,\n replyTo: responseEnvelope.replyTo,\n });\n\n return responseEnvelope;\n } else {\n logger.warn('No response received for request', { id: envelope.id });\n return undefined;\n }\n })();\n\n const timeoutPromise = new Promise<undefined>((resolve) => {\n setTimeout(() => {\n logger.warn('Response timeout', { id: envelope.id, timeout: RESPONSE_TIMEOUT });\n resolve(undefined);\n }, RESPONSE_TIMEOUT);\n });\n\n const response = await Promise.race([responsePromise, timeoutPromise]);\n return response;\n } catch (error) {\n logger.warn('Error reading response', { error });\n return undefined;\n }\n }\n\n return undefined;\n } catch (error) {\n if (error instanceof MessagingError) throw error;\n throw new MessagingError('Failed to send message', error);\n }\n },\n\n start: async () => {\n await libp2p.handle(PROTOCOL_PREFIX, async ({ stream }) => {\n try {\n await handleIncomingStream(stream, handlers, catchAllHandler, verifyFn);\n } catch (error) {\n logger.error('Error handling incoming stream', error);\n }\n }, { runOnLimitedConnection: true });\n\n logger.info('Message router started');\n },\n\n stop: async () => {\n await libp2p.unhandle(PROTOCOL_PREFIX);\n handlers.clear();\n catchAllHandler = undefined;\n logger.info('Message router stopped');\n },\n };\n}\n\nfunction buildCircuitRelayAddr(relayAddr: string, targetPeerId: string): string {\n return `${relayAddr}/p2p-circuit/p2p/${targetPeerId}`;\n}\n\nasync function handleIncomingStream(\n stream: any,\n handlers: Map<string, MessageHandler>,\n catchAllHandler: MessageHandler | undefined,\n _verifyFn: (signature: Uint8Array, data: Uint8Array) => Promise<boolean>\n): Promise<void> {\n try {\n const chunks: Uint8Array[] = [];\n for await (const chunk of stream.source) {\n chunks.push(chunk.subarray());\n }\n\n const data = new Uint8Array(\n chunks.reduce((acc, chunk) => acc + chunk.length, 0)\n );\n let offset = 0;\n for (const chunk of chunks) {\n data.set(chunk, offset);\n offset += chunk.length;\n }\n\n const envelope = decodeMessage(data);\n\n if (!validateEnvelope(envelope)) {\n logger.warn('Received invalid message envelope');\n return;\n }\n\n // Skip signature verification for now — both sides use auto-generated libp2p keys\n // which differ from the Ed25519 DID keys. Full verification comes in Phase 2 when\n // DID keys and libp2p keys are unified.\n\n logger.info('Received message', {\n id: envelope.id,\n from: envelope.from,\n to: envelope.to,\n protocol: envelope.protocol,\n payload: envelope.payload,\n });\n\n const handler = handlers.get(envelope.protocol);\n let response: MessageEnvelope | void = undefined;\n\n if (handler) {\n response = await handler(envelope);\n } else if (catchAllHandler) {\n logger.debug('Using catch-all handler for protocol', { protocol: envelope.protocol });\n response = await catchAllHandler(envelope);\n } else {\n logger.warn('No handler for protocol', { protocol: envelope.protocol });\n }\n\n // Send response back if handler returned one\n if (response) {\n const encoded = encodeMessage(response);\n logger.info('Sending response back to sender', {\n responseId: response.id,\n replyTo: response.replyTo,\n size: encoded.length\n });\n\n await stream.sink(\n (async function* () {\n yield encoded;\n })()\n );\n }\n } catch (error) {\n logger.error('Error handling incoming message', error);\n }\n}\n","/**\n * Trust Score System\n *\n * Tracks agent reputation based on interactions, endorsements,\n * and network behavior.\n */\n\n/**\n * Trust Score Metrics\n */\nexport interface TrustScore {\n interactionScore: number; // 0-1, based on successful interactions\n endorsements: number; // Count of endorsements\n completionRate: number; // % of completed tasks (0-1)\n responseTime: number; // Average response time (ms)\n uptime: number; // % of time online last 30 days (0-1)\n lastUpdated: number; // Timestamp\n}\n\n/**\n * Interaction Record\n */\nexport interface Interaction {\n agentDid: string;\n timestamp: number;\n type: 'message' | 'task' | 'query';\n success: boolean;\n responseTime: number;\n rating?: number; // 1-5 stars (optional user rating)\n feedback?: string;\n}\n\n/**\n * Interaction Statistics\n */\nexport interface InteractionStats {\n totalInteractions: number;\n successRate: number;\n avgResponseTime: number;\n lastInteraction: number;\n}\n\n/**\n * Trust Metrics Calculator\n */\nexport class TrustMetrics {\n /**\n * Calculate trust score from interaction history\n */\n calculateScore(stats: InteractionStats, endorsements: number, uptime: number): TrustScore {\n // Interaction score: weighted by success rate and volume\n const volumeWeight = Math.min(stats.totalInteractions / 100, 1); // Cap at 100 interactions\n const interactionScore = stats.successRate * volumeWeight;\n\n // Completion rate is same as success rate for now\n const completionRate = stats.successRate;\n\n return {\n interactionScore,\n endorsements,\n completionRate,\n responseTime: stats.avgResponseTime,\n uptime,\n lastUpdated: Date.now(),\n };\n }\n\n /**\n * Calculate overall trust level (0-1)\n */\n calculateOverallTrust(score: TrustScore): number {\n // Weighted average of different factors\n const weights = {\n interaction: 0.4,\n endorsement: 0.2,\n completion: 0.2,\n uptime: 0.2,\n };\n\n const endorsementScore = Math.min(score.endorsements / 10, 1); // Cap at 10 endorsements\n\n return (\n score.interactionScore * weights.interaction +\n endorsementScore * weights.endorsement +\n score.completionRate * weights.completion +\n score.uptime * weights.uptime\n );\n }\n\n /**\n * Get trust level category\n */\n getTrustLevel(score: TrustScore): 'new' | 'low' | 'medium' | 'high' | 'trusted' {\n const overall = this.calculateOverallTrust(score);\n\n if (score.interactionScore === 0) return 'new';\n if (overall < 0.3) return 'low';\n if (overall < 0.6) return 'medium';\n if (overall < 0.8) return 'high';\n return 'trusted';\n }\n\n /**\n * Check if agent should be rate limited\n */\n shouldRateLimit(score: TrustScore, agentAge: number): boolean {\n const overall = this.calculateOverallTrust(score);\n const ONE_DAY = 24 * 60 * 60 * 1000;\n\n // New agents (< 24 hours) with low trust\n if (agentAge < ONE_DAY && overall < 0.3) {\n return true;\n }\n\n // Very low trust regardless of age\n if (overall < 0.1) {\n return true;\n }\n\n return false;\n }\n}\n\n/**\n * Default trust score for new agents\n */\nexport function createDefaultTrustScore(): TrustScore {\n return {\n interactionScore: 0,\n endorsements: 0,\n completionRate: 0,\n responseTime: 0,\n uptime: 1.0, // Assume online initially\n lastUpdated: Date.now(),\n };\n}\n","/**\n * Interaction History Tracker\n *\n * Records and queries agent interaction history for trust scoring\n */\n\nimport { Level } from 'level';\nimport type { Interaction, InteractionStats } from './trust-score.js';\nimport { createLogger } from '../utils/logger.js';\n\nconst logger = createLogger('interaction-history');\n\n/**\n * Interaction History Manager\n */\nexport class InteractionHistory {\n private db: Level<string, Interaction>;\n\n constructor(dbPath: string) {\n this.db = new Level(dbPath, { valueEncoding: 'json' });\n }\n\n /**\n * Open database connection\n */\n async open(): Promise<void> {\n await this.db.open();\n logger.info('Interaction history database opened', { path: this.db.location });\n }\n\n /**\n * Close database connection\n */\n async close(): Promise<void> {\n await this.db.close();\n logger.info('Interaction history database closed');\n }\n\n /**\n * Record an interaction\n */\n async record(interaction: Interaction): Promise<void> {\n const key = `interaction:${interaction.agentDid}:${interaction.timestamp}`;\n await this.db.put(key, interaction);\n logger.debug('Recorded interaction', { agentDid: interaction.agentDid, type: interaction.type });\n }\n\n /**\n * Get interaction history for an agent\n */\n async getHistory(agentDid: string, limit = 100): Promise<Interaction[]> {\n const interactions: Interaction[] = [];\n const prefix = `interaction:${agentDid}:`;\n\n try {\n for await (const [_, value] of this.db.iterator({\n gte: prefix,\n lte: prefix + '\\xff',\n limit,\n reverse: true, // Most recent first\n })) {\n interactions.push(value);\n }\n } catch (error) {\n logger.error('Failed to get interaction history', { agentDid, error });\n }\n\n return interactions;\n }\n\n /**\n * Get interaction statistics for an agent\n */\n async getStats(agentDid: string): Promise<InteractionStats> {\n const history = await this.getHistory(agentDid, 1000); // Last 1000 interactions\n\n if (history.length === 0) {\n return {\n totalInteractions: 0,\n successRate: 0,\n avgResponseTime: 0,\n lastInteraction: 0,\n };\n }\n\n const successCount = history.filter(i => i.success).length;\n const totalResponseTime = history.reduce((sum, i) => sum + i.responseTime, 0);\n\n return {\n totalInteractions: history.length,\n successRate: successCount / history.length,\n avgResponseTime: totalResponseTime / history.length,\n lastInteraction: history[0].timestamp,\n };\n }\n\n /**\n * Get all agents with interaction history\n */\n async getAllAgents(): Promise<string[]> {\n const agents = new Set<string>();\n\n try {\n for await (const [key] of this.db.iterator()) {\n const match = key.match(/^interaction:([^:]+):/);\n if (match) {\n agents.add(match[1]);\n }\n }\n } catch (error) {\n logger.error('Failed to get all agents', { error });\n }\n\n return Array.from(agents);\n }\n\n /**\n * Delete all interactions for an agent\n */\n async deleteAgent(agentDid: string): Promise<void> {\n const prefix = `interaction:${agentDid}:`;\n const keysToDelete: string[] = [];\n\n for await (const [key] of this.db.iterator({\n gte: prefix,\n lte: prefix + '\\xff',\n })) {\n keysToDelete.push(key);\n }\n\n await this.db.batch(keysToDelete.map(key => ({ type: 'del', key })));\n logger.info('Deleted interaction history', { agentDid, count: keysToDelete.length });\n }\n\n /**\n * Clean up old interactions (older than 90 days)\n */\n async cleanup(maxAge = 90 * 24 * 60 * 60 * 1000): Promise<number> {\n const cutoff = Date.now() - maxAge;\n const keysToDelete: string[] = [];\n\n for await (const [key, value] of this.db.iterator()) {\n if (value.timestamp < cutoff) {\n keysToDelete.push(key);\n }\n }\n\n if (keysToDelete.length > 0) {\n await this.db.batch(keysToDelete.map(key => ({ type: 'del', key })));\n logger.info('Cleaned up old interactions', { count: keysToDelete.length });\n }\n\n return keysToDelete.length;\n }\n}\n","/**\n * Endorsement System\n *\n * Allows agents to endorse each other, building a web of trust\n */\n\nimport type { Level } from 'level';\nimport { createLogger } from '../utils/logger.js';\n\nconst logger = createLogger('endorsement');\n\n/**\n * Endorsement Record\n */\nexport interface Endorsement {\n from: string; // Endorser DID\n to: string; // Endorsed agent DID\n score: number; // 0-1\n reason: string;\n timestamp: number;\n signature: string; // Signed by endorser\n}\n\n/**\n * Sign function type\n */\nexport type SignFunction = (data: Uint8Array) => Promise<Uint8Array>;\n\n/**\n * Verify function type\n */\nexport type VerifyFunction = (signature: Uint8Array, data: Uint8Array, publicKey: Uint8Array) => Promise<boolean>;\n\n/**\n * Endorsement Manager\n */\nexport class EndorsementManager {\n constructor(\n private db: Level<string, Endorsement>,\n private getPublicKey: (did: string) => Promise<Uint8Array>\n ) {}\n\n /**\n * Create an endorsement\n */\n async endorse(\n fromDid: string,\n toDid: string,\n score: number,\n reason: string,\n signFn: SignFunction\n ): Promise<Endorsement> {\n if (score < 0 || score > 1) {\n throw new Error('Score must be between 0 and 1');\n }\n\n const endorsement: Omit<Endorsement, 'signature'> = {\n from: fromDid,\n to: toDid,\n score,\n reason,\n timestamp: Date.now(),\n };\n\n // Sign the endorsement\n const data = new TextEncoder().encode(JSON.stringify(endorsement));\n const signatureBytes = await signFn(data);\n const signature = Buffer.from(signatureBytes).toString('hex');\n\n const signedEndorsement: Endorsement = {\n ...endorsement,\n signature,\n };\n\n logger.info('Created endorsement', { from: fromDid, to: toDid, score });\n return signedEndorsement;\n }\n\n /**\n * Verify endorsement signature\n */\n async verify(endorsement: Endorsement, verifyFn: VerifyFunction): Promise<boolean> {\n try {\n const { signature, ...endorsementWithoutSig } = endorsement;\n const data = new TextEncoder().encode(JSON.stringify(endorsementWithoutSig));\n const signatureBytes = Buffer.from(signature, 'hex');\n const publicKey = await this.getPublicKey(endorsement.from);\n\n return await verifyFn(signatureBytes, data, publicKey);\n } catch (error) {\n logger.error('Failed to verify endorsement', { error });\n return false;\n }\n }\n\n /**\n * Publish endorsement to local database\n */\n async publish(endorsement: Endorsement): Promise<void> {\n const key = `endorsement:${endorsement.to}:${endorsement.from}`;\n await this.db.put(key, endorsement);\n logger.info('Published endorsement', { from: endorsement.from, to: endorsement.to });\n }\n\n /**\n * Get all endorsements for an agent\n */\n async getEndorsements(agentDid: string): Promise<Endorsement[]> {\n const endorsements: Endorsement[] = [];\n const prefix = `endorsement:${agentDid}:`;\n\n try {\n for await (const [_, value] of this.db.iterator({\n gte: prefix,\n lte: prefix + '\\xff',\n })) {\n endorsements.push(value);\n }\n } catch (error) {\n logger.error('Failed to get endorsements', { agentDid, error });\n }\n\n return endorsements;\n }\n\n /**\n * Get endorsements given by an agent\n */\n async getEndorsementsBy(fromDid: string): Promise<Endorsement[]> {\n const endorsements: Endorsement[] = [];\n\n try {\n for await (const [_, value] of this.db.iterator()) {\n if (value.from === fromDid) {\n endorsements.push(value);\n }\n }\n } catch (error) {\n logger.error('Failed to get endorsements by agent', { fromDid, error });\n }\n\n return endorsements;\n }\n\n /**\n * Calculate average endorsement score\n */\n async getAverageScore(agentDid: string): Promise<number> {\n const endorsements = await this.getEndorsements(agentDid);\n\n if (endorsements.length === 0) {\n return 0;\n }\n\n const totalScore = endorsements.reduce((sum, e) => sum + e.score, 0);\n return totalScore / endorsements.length;\n }\n\n /**\n * Delete an endorsement\n */\n async deleteEndorsement(fromDid: string, toDid: string): Promise<void> {\n const key = `endorsement:${toDid}:${fromDid}`;\n await this.db.del(key);\n logger.info('Deleted endorsement', { from: fromDid, to: toDid });\n }\n}\n","/**\n * Sybil Defense Mechanisms\n *\n * Protects the network from Sybil attacks through:\n * - Entry cost (Hashcash challenges)\n * - Progressive trust (rate limiting for new agents)\n * - DHT region protection (prefer established peers)\n */\n\nimport { createLogger } from '../utils/logger.js';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { bytesToHex } from '@noble/hashes/utils';\n\nconst logger = createLogger('sybil-defense');\n\n/**\n * Hashcash Challenge\n */\nexport interface Challenge {\n did: string;\n difficulty: number; // Number of leading zero bits required\n nonce: string;\n timestamp: number;\n}\n\n/**\n * Challenge Solution\n */\nexport interface ChallengeSolution {\n challenge: Challenge;\n solution: string; // Nonce that produces required hash\n}\n\n/**\n * Rate Limit Record\n */\ninterface RateLimitRecord {\n did: string;\n requests: number[]; // Timestamps of requests\n firstSeen: number;\n}\n\n/**\n * Peer Trust Level\n */\nexport type PeerTrustLevel = 'new' | 'established' | 'trusted';\n\n/**\n * Sybil Defense Manager\n */\nexport class SybilDefense {\n private rateLimits = new Map<string, RateLimitRecord>();\n private peerFirstSeen = new Map<string, number>();\n private readonly NEW_AGENT_WINDOW = 24 * 60 * 60 * 1000; // 24 hours\n private readonly RATE_LIMIT_WINDOW = 60 * 60 * 1000; // 1 hour\n private readonly MAX_REQUESTS_NEW = 10; // Max requests per hour for new agents\n private readonly ESTABLISHED_THRESHOLD = 7 * 24 * 60 * 60 * 1000; // 7 days\n\n /**\n * Generate a Hashcash challenge for a new DID\n */\n generateChallenge(did: string, difficulty = 20): Challenge {\n const nonce = this.generateNonce();\n return {\n did,\n difficulty,\n nonce,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Verify a Hashcash challenge solution\n */\n verifyChallenge(solution: ChallengeSolution): boolean {\n const { challenge, solution: solutionNonce } = solution;\n\n // Check challenge is not too old (valid for 1 hour)\n if (Date.now() - challenge.timestamp > 60 * 60 * 1000) {\n logger.warn('Challenge expired', { did: challenge.did });\n return false;\n }\n\n // Compute hash\n const data = `${challenge.did}:${challenge.nonce}:${solutionNonce}`;\n const hash = sha256(new TextEncoder().encode(data));\n\n // Check leading zeros\n const leadingZeros = this.countLeadingZeroBits(hash);\n const valid = leadingZeros >= challenge.difficulty;\n\n if (valid) {\n logger.info('Challenge verified', { did: challenge.did, leadingZeros });\n } else {\n logger.warn('Challenge failed', { did: challenge.did, leadingZeros, required: challenge.difficulty });\n }\n\n return valid;\n }\n\n /**\n * Check if an agent should be rate limited\n */\n isRateLimited(did: string): boolean {\n const record = this.rateLimits.get(did);\n if (!record) {\n return false;\n }\n\n const now = Date.now();\n const agentAge = now - record.firstSeen;\n\n // Only rate limit new agents\n if (agentAge > this.NEW_AGENT_WINDOW) {\n return false;\n }\n\n // Count recent requests\n const recentRequests = record.requests.filter(\n t => now - t < this.RATE_LIMIT_WINDOW\n );\n\n return recentRequests.length >= this.MAX_REQUESTS_NEW;\n }\n\n /**\n * Record a request from an agent\n */\n recordRequest(did: string): void {\n const now = Date.now();\n let record = this.rateLimits.get(did);\n\n if (!record) {\n record = {\n did,\n requests: [],\n firstSeen: now,\n };\n this.rateLimits.set(did, record);\n }\n\n // Add request timestamp\n record.requests.push(now);\n\n // Clean up old requests\n record.requests = record.requests.filter(\n t => now - t < this.RATE_LIMIT_WINDOW\n );\n\n logger.debug('Recorded request', { did, count: record.requests.length });\n }\n\n /**\n * Get peer trust level based on age\n */\n getPeerTrustLevel(peerId: string): PeerTrustLevel {\n const firstSeen = this.peerFirstSeen.get(peerId);\n if (!firstSeen) {\n return 'new';\n }\n\n const age = Date.now() - firstSeen;\n\n if (age < this.NEW_AGENT_WINDOW) {\n return 'new';\n } else if (age < this.ESTABLISHED_THRESHOLD) {\n return 'established';\n } else {\n return 'trusted';\n }\n }\n\n /**\n * Record first seen time for a peer\n */\n recordPeerSeen(peerId: string): void {\n if (!this.peerFirstSeen.has(peerId)) {\n this.peerFirstSeen.set(peerId, Date.now());\n logger.debug('Recorded new peer', { peerId });\n }\n }\n\n /**\n * Clean up old records\n */\n cleanup(): void {\n const now = Date.now();\n const cutoff = now - this.NEW_AGENT_WINDOW;\n\n // Clean up rate limits for old agents\n for (const [did, record] of this.rateLimits.entries()) {\n if (record.firstSeen < cutoff) {\n this.rateLimits.delete(did);\n }\n }\n\n logger.info('Cleaned up Sybil defense records', {\n rateLimits: this.rateLimits.size,\n peers: this.peerFirstSeen.size,\n });\n }\n\n /**\n * Generate a random nonce\n */\n private generateNonce(): string {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n return bytesToHex(bytes);\n }\n\n /**\n * Count leading zero bits in a hash\n */\n private countLeadingZeroBits(hash: Uint8Array): number {\n let count = 0;\n for (const byte of hash) {\n if (byte === 0) {\n count += 8;\n } else {\n // Count leading zeros in this byte\n let b = byte;\n while ((b & 0x80) === 0) {\n count++;\n b <<= 1;\n }\n break;\n }\n }\n return count;\n }\n}\n","/**\n * Trust System - Main Export\n *\n * Combines all trust components into a unified interface\n */\n\nexport * from './trust-score.js';\nexport * from './interaction-history.js';\nexport * from './endorsement.js';\nexport * from './sybil-defense.js';\n\nimport { Level } from 'level';\nimport { TrustMetrics } from './trust-score.js';\nimport type { TrustScore, Interaction } from './trust-score.js';\nimport { InteractionHistory } from './interaction-history.js';\nimport { EndorsementManager } from './endorsement.js';\nimport type { Endorsement, SignFunction, VerifyFunction } from './endorsement.js';\nimport { SybilDefense } from './sybil-defense.js';\nimport { createLogger } from '../utils/logger.js';\n\nconst logger = createLogger('trust-system');\n\n/**\n * Trust System Configuration\n */\nexport interface TrustSystemConfig {\n dbPath: string;\n getPublicKey: (did: string) => Promise<Uint8Array>;\n}\n\n/**\n * Unified Trust System\n */\nexport class TrustSystem {\n private metrics: TrustMetrics;\n private history: InteractionHistory;\n private endorsements: EndorsementManager;\n private sybilDefense: SybilDefense;\n private trustCache = new Map<string, { score: TrustScore; timestamp: number }>();\n private readonly CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n\n constructor(config: TrustSystemConfig) {\n this.metrics = new TrustMetrics();\n this.history = new InteractionHistory(`${config.dbPath}/interactions`);\n\n const endorsementDb = new Level<string, Endorsement>(`${config.dbPath}/endorsements`, {\n valueEncoding: 'json',\n });\n this.endorsements = new EndorsementManager(endorsementDb, config.getPublicKey);\n this.sybilDefense = new SybilDefense();\n }\n\n /**\n * Initialize the trust system\n */\n async start(): Promise<void> {\n await this.history.open();\n logger.info('Trust system started');\n }\n\n /**\n * Shutdown the trust system\n */\n async stop(): Promise<void> {\n await this.history.close();\n logger.info('Trust system stopped');\n }\n\n /**\n * Record an interaction\n */\n async recordInteraction(interaction: Interaction): Promise<void> {\n await this.history.record(interaction);\n this.sybilDefense.recordRequest(interaction.agentDid);\n\n // Invalidate cache\n this.trustCache.delete(interaction.agentDid);\n }\n\n /**\n * Get trust score for an agent\n */\n async getTrustScore(agentDid: string): Promise<TrustScore> {\n // Check cache\n const cached = this.trustCache.get(agentDid);\n if (cached && Date.now() - cached.timestamp < this.CACHE_TTL) {\n return cached.score;\n }\n\n // Calculate fresh score\n const stats = await this.history.getStats(agentDid);\n const endorsementList = await this.endorsements.getEndorsements(agentDid);\n const uptime = 1.0; // TODO: Implement uptime tracking\n\n const score = this.metrics.calculateScore(stats, endorsementList.length, uptime);\n\n // Cache result\n this.trustCache.set(agentDid, { score, timestamp: Date.now() });\n\n return score;\n }\n\n /**\n * Create an endorsement\n */\n async endorse(\n fromDid: string,\n toDid: string,\n score: number,\n reason: string,\n signFn: SignFunction\n ): Promise<Endorsement> {\n const endorsement = await this.endorsements.endorse(fromDid, toDid, score, reason, signFn);\n await this.endorsements.publish(endorsement);\n\n // Invalidate cache\n this.trustCache.delete(toDid);\n\n return endorsement;\n }\n\n /**\n * Get endorsements for an agent\n */\n async getEndorsements(agentDid: string): Promise<Endorsement[]> {\n return this.endorsements.getEndorsements(agentDid);\n }\n\n /**\n * Verify an endorsement\n */\n async verifyEndorsement(endorsement: Endorsement, verifyFn: VerifyFunction): Promise<boolean> {\n return this.endorsements.verify(endorsement, verifyFn);\n }\n\n /**\n * Check if agent should be rate limited\n */\n isRateLimited(agentDid: string): boolean {\n return this.sybilDefense.isRateLimited(agentDid);\n }\n\n /**\n * Generate Sybil defense challenge\n */\n generateChallenge(did: string, difficulty?: number) {\n return this.sybilDefense.generateChallenge(did, difficulty);\n }\n\n /**\n * Verify Sybil defense challenge\n */\n verifyChallenge(solution: any): boolean {\n return this.sybilDefense.verifyChallenge(solution);\n }\n\n /**\n * Get peer trust level\n */\n getPeerTrustLevel(peerId: string) {\n return this.sybilDefense.getPeerTrustLevel(peerId);\n }\n\n /**\n * Record peer seen\n */\n recordPeerSeen(peerId: string): void {\n this.sybilDefense.recordPeerSeen(peerId);\n }\n\n /**\n * Get interaction history\n */\n async getHistory(agentDid: string, limit?: number): Promise<Interaction[]> {\n return this.history.getHistory(agentDid, limit);\n }\n\n /**\n * Clean up old data\n */\n async cleanup(): Promise<void> {\n await this.history.cleanup();\n this.sybilDefense.cleanup();\n this.trustCache.clear();\n logger.info('Trust system cleanup completed');\n }\n}\n\n/**\n * Create a trust system instance\n */\nexport function createTrustSystem(config: TrustSystemConfig): TrustSystem {\n return new TrustSystem(config);\n}\n"]}
1
+ {"version":3,"sources":["../src/utils/errors.ts","../src/identity/keys.ts","../src/identity/did.ts","../src/identity/signer.ts","../src/utils/logger.ts","../src/transport/node.ts","../src/discovery/agent-card-types.ts","../src/discovery/agent-card.ts","../src/discovery/agent-card-schema.ts","../src/discovery/agent-card-encoder.ts","../src/discovery/search-index.ts","../src/discovery/capability-matcher.ts","../src/discovery/semantic-search.ts","../src/discovery/dht.ts","../src/messaging/envelope.ts","../src/messaging/codec.ts","../src/messaging/router.ts","../src/trust/trust-score.ts","../src/trust/interaction-history.ts","../src/trust/endorsement.ts","../src/trust/sybil-defense.ts","../src/trust/index.ts"],"names":["LogLevel","cborEncode","cborDecode","logger","uint8ArrayToString","uint8ArrayFromString","data","Level"],"mappings":"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","file":"index.js","sourcesContent":["export class ClawiverseError extends Error {\n constructor(\n message: string,\n public code: string,\n public details?: unknown\n ) {\n super(message);\n this.name = 'ClawiverseError';\n }\n}\n\nexport class IdentityError extends ClawiverseError {\n constructor(message: string, details?: unknown) {\n super(message, 'IDENTITY_ERROR', details);\n this.name = 'IdentityError';\n }\n}\n\nexport class TransportError extends ClawiverseError {\n constructor(message: string, details?: unknown) {\n super(message, 'TRANSPORT_ERROR', details);\n this.name = 'TransportError';\n }\n}\n\nexport class DiscoveryError extends ClawiverseError {\n constructor(message: string, details?: unknown) {\n super(message, 'DISCOVERY_ERROR', details);\n this.name = 'DiscoveryError';\n }\n}\n\nexport class MessagingError extends ClawiverseError {\n constructor(message: string, details?: unknown) {\n super(message, 'MESSAGING_ERROR', details);\n this.name = 'MessagingError';\n }\n}\n","import * as ed25519 from '@noble/ed25519';\nimport { IdentityError } from '../utils/errors.js';\n\nexport interface KeyPair {\n publicKey: Uint8Array;\n privateKey: Uint8Array;\n}\n\n/**\n * Generate a new Ed25519 key pair\n */\nexport async function generateKeyPair(): Promise<KeyPair> {\n try {\n const privateKey = ed25519.utils.randomPrivateKey();\n const publicKey = await ed25519.getPublicKeyAsync(privateKey);\n\n return {\n publicKey,\n privateKey,\n };\n } catch (error) {\n throw new IdentityError('Failed to generate key pair', error);\n }\n}\n\n/**\n * Sign a message with a private key\n */\nexport async function sign(\n message: Uint8Array,\n privateKey: Uint8Array\n): Promise<Uint8Array> {\n try {\n return await ed25519.signAsync(message, privateKey);\n } catch (error) {\n throw new IdentityError('Failed to sign message', error);\n }\n}\n\n/**\n * Verify a signature\n */\nexport async function verify(\n signature: Uint8Array,\n message: Uint8Array,\n publicKey: Uint8Array\n): Promise<boolean> {\n try {\n return await ed25519.verifyAsync(signature, message, publicKey);\n } catch (error) {\n throw new IdentityError('Failed to verify signature', error);\n }\n}\n\n/**\n * Export key pair to JSON format\n */\nexport function exportKeyPair(keyPair: KeyPair): {\n publicKey: string;\n privateKey: string;\n} {\n return {\n publicKey: Buffer.from(keyPair.publicKey).toString('hex'),\n privateKey: Buffer.from(keyPair.privateKey).toString('hex'),\n };\n}\n\n/**\n * Import key pair from JSON format\n */\nexport function importKeyPair(exported: {\n publicKey: string;\n privateKey: string;\n}): KeyPair {\n return {\n publicKey: new Uint8Array(Buffer.from(exported.publicKey, 'hex')),\n privateKey: new Uint8Array(Buffer.from(exported.privateKey, 'hex')),\n };\n}\n","import { base58btc } from 'multiformats/bases/base58';\nimport { IdentityError } from '../utils/errors.js';\n\n/**\n * Derive a did:clawiverse DID from a public key\n * Format: did:clawiverse:<base58btc-encoded-pubkey>\n */\nexport function deriveDID(publicKey: Uint8Array): string {\n try {\n const encoded = base58btc.encode(publicKey);\n return `did:clawiverse:${encoded}`;\n } catch (error) {\n throw new IdentityError('Failed to derive DID', error);\n }\n}\n\n/**\n * Extract public key from a did:clawiverse DID\n */\nexport function extractPublicKey(did: string): Uint8Array {\n if (!did.startsWith('did:clawiverse:')) {\n throw new IdentityError('Invalid DID format: must start with did:clawiverse:');\n }\n\n try {\n const encoded = did.replace('did:clawiverse:', '');\n return base58btc.decode(encoded);\n } catch (error) {\n throw new IdentityError('Failed to extract public key from DID', error);\n }\n}\n\n/**\n * Validate a did:clawiverse DID format\n */\nexport function validateDID(did: string): boolean {\n if (!did.startsWith('did:clawiverse:')) {\n return false;\n }\n\n try {\n const encoded = did.replace('did:clawiverse:', '');\n base58btc.decode(encoded);\n return true;\n } catch {\n return false;\n }\n}\n","import { sign, verify } from './keys.js';\nimport { deriveDID } from './did.js';\nimport { IdentityError } from '../utils/errors.js';\n\nexport interface SignedMessage {\n payload: Uint8Array;\n signature: Uint8Array;\n signer: string; // DID\n}\n\n/**\n * Sign a message and return a signed message object\n */\nexport async function signMessage(\n payload: Uint8Array,\n privateKey: Uint8Array,\n publicKey: Uint8Array\n): Promise<SignedMessage> {\n try {\n const signature = await sign(payload, privateKey);\n const signer = deriveDID(publicKey);\n\n return {\n payload,\n signature,\n signer,\n };\n } catch (error) {\n throw new IdentityError('Failed to sign message', error);\n }\n}\n\n/**\n * Verify a signed message\n */\nexport async function verifyMessage(\n signedMessage: SignedMessage,\n expectedPublicKey: Uint8Array\n): Promise<boolean> {\n try {\n const expectedDID = deriveDID(expectedPublicKey);\n\n if (signedMessage.signer !== expectedDID) {\n return false;\n }\n\n return await verify(\n signedMessage.signature,\n signedMessage.payload,\n expectedPublicKey\n );\n } catch (error) {\n throw new IdentityError('Failed to verify message', error);\n }\n}\n","export enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n}\n\nexport class Logger {\n private level: LogLevel;\n private prefix: string;\n\n constructor(prefix: string, level: LogLevel = LogLevel.INFO) {\n this.prefix = prefix;\n this.level = level;\n }\n\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n debug(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.DEBUG) {\n console.debug(`[${this.prefix}] DEBUG:`, message, ...args);\n }\n }\n\n info(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.INFO) {\n console.info(`[${this.prefix}] INFO:`, message, ...args);\n }\n }\n\n warn(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.WARN) {\n console.warn(`[${this.prefix}] WARN:`, message, ...args);\n }\n }\n\n error(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.ERROR) {\n console.error(`[${this.prefix}] ERROR:`, message, ...args);\n }\n }\n}\n\nexport const createLogger = (prefix: string, level?: LogLevel): Logger => {\n return new Logger(prefix, level);\n};\n","import { createLibp2p, Libp2p } from 'libp2p';\nimport { tcp } from '@libp2p/tcp';\nimport { noise } from '@chainsafe/libp2p-noise';\nimport { mplex } from '@libp2p/mplex';\nimport { kadDHT, passthroughMapper } from '@libp2p/kad-dht';\nimport { bootstrap } from '@libp2p/bootstrap';\nimport { identify } from '@libp2p/identify';\nimport { ping } from '@libp2p/ping';\nimport {\n circuitRelayTransport,\n circuitRelayServer,\n} from '@libp2p/circuit-relay-v2';\nimport { createLogger } from '../utils/logger.js';\nimport { TransportError } from '../utils/errors.js';\nimport type { KeyPair } from '../identity/keys.js';\nimport type { PrivateKey } from '@libp2p/interface';\n\nconst logger = createLogger('transport');\n\nexport interface TransportConfig {\n keyPair?: KeyPair;\n listenAddresses?: string[];\n bootstrapPeers?: string[];\n enableDHT?: boolean;\n /** Run as a relay server so NAT'd agents can receive messages through this node */\n enableRelay?: boolean;\n /** Reserve a relay slot on bootstrap nodes so others can reach us (only needed for hw1 join) */\n reserveRelaySlot?: boolean;\n /** Enable mDNS local peer discovery (default: false) */\n enableMDNS?: boolean;\n /** libp2p PrivateKey for persistent PeerID (from @libp2p/crypto) */\n privateKey?: PrivateKey;\n}\n\nexport interface ClawiverseNode {\n libp2p: Libp2p;\n start: () => Promise<void>;\n stop: () => Promise<void>;\n getMultiaddrs: () => string[];\n getPeerId: () => string;\n}\n\n/**\n * Create a Clawiverse transport node with libp2p\n */\nexport async function createNode(\n config: TransportConfig\n): Promise<ClawiverseNode> {\n try {\n const {\n listenAddresses = ['/ip4/0.0.0.0/tcp/0'],\n bootstrapPeers = [],\n enableDHT = true,\n enableRelay = false,\n reserveRelaySlot = false,\n enableMDNS = false,\n privateKey,\n } = config;\n\n // Reserve relay slots by adding p2p-circuit listen addresses (for hw1 join)\n const relayListenAddrs = reserveRelaySlot\n ? bootstrapPeers.map((peer) => `${peer}/p2p-circuit`)\n : [];\n\n const libp2pConfig: any = {\n addresses: {\n listen: [...listenAddresses, ...relayListenAddrs],\n },\n ...(privateKey ? { privateKey } : {}),\n transports: [\n tcp(),\n circuitRelayTransport(),\n ],\n connectionEncrypters: [noise()],\n streamMuxers: [mplex()],\n connectionManager: {\n minConnections: bootstrapPeers.length > 0 ? 1 : 0,\n maxConnections: 50,\n },\n services: {\n identify: identify(),\n ping: ping(),\n },\n };\n\n if (enableRelay) {\n libp2pConfig.services.relay = circuitRelayServer({\n reservations: {\n maxReservations: 100, // Allow up to 100 concurrent relay reservations\n },\n });\n }\n\n if (enableDHT) {\n libp2pConfig.services.dht = kadDHT({\n clientMode: false,\n peerInfoMapper: passthroughMapper,\n validators: {\n clawiverse: async () => {},\n },\n selectors: {\n clawiverse: () => 0,\n },\n // Optimize for small networks: reduce replication factor and query timeout\n kBucketSize: 20, // Default K=20, keep for compatibility\n querySelfInterval: 300000, // Self-query every 5 min (default 30s)\n // Allow queries to complete faster in small networks\n allowQueryWithZeroPeers: true,\n });\n }\n\n const peerDiscovery: any[] = [];\n if (bootstrapPeers.length > 0) peerDiscovery.push(bootstrap({ list: bootstrapPeers }));\n if (enableMDNS) {\n const { mdns } = await import('@libp2p/mdns');\n peerDiscovery.push(mdns());\n }\n if (peerDiscovery.length > 0) libp2pConfig.peerDiscovery = peerDiscovery;\n\n const libp2p = await createLibp2p(libp2pConfig);\n\n logger.info('Libp2p node created', {\n listenAddresses: libp2pConfig.addresses.listen,\n reserveRelaySlot,\n });\n\n return {\n libp2p,\n start: async () => {\n await libp2p.start();\n logger.info('Node started', {\n peerId: libp2p.peerId.toString(),\n addresses: libp2p.getMultiaddrs().map((ma) => ma.toString()),\n relay: enableRelay,\n reserveRelaySlot,\n });\n },\n stop: async () => {\n await libp2p.stop();\n logger.info('Node stopped');\n },\n getMultiaddrs: () => {\n return libp2p.getMultiaddrs().map((ma) => ma.toString());\n },\n getPeerId: () => {\n return libp2p.peerId.toString();\n },\n };\n } catch (error) {\n throw new TransportError('Failed to create transport node', error);\n }\n}\n","/**\n * Enhanced Agent Card Types for Phase 2\n *\n * Adds structured capabilities, JSON-LD support, and trust metrics\n */\n\nimport type { TrustScore } from '../trust/trust-score.js';\n\n/**\n * Capability Parameter Definition\n */\nexport interface CapabilityParameter {\n name: string;\n type: 'string' | 'number' | 'boolean' | 'object' | 'array';\n required: boolean;\n description?: string;\n enum?: string[];\n default?: unknown;\n}\n\n/**\n * Structured Capability Definition\n */\nexport interface Capability {\n '@type'?: string; // JSON-LD type (e.g., \"TranslationService\")\n id: string; // Unique capability ID\n name: string; // Human-readable name\n description: string;\n parameters?: CapabilityParameter[];\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Enhanced Agent Card with JSON-LD support\n */\nexport interface AgentCard {\n '@context'?: string[]; // JSON-LD context\n did: string;\n name: string;\n description: string;\n version: string;\n capabilities: Capability[]; // Changed from string[] to Capability[]\n endpoints: string[];\n peerId?: string;\n trust?: TrustScore; // Trust metrics\n metadata?: Record<string, unknown>;\n timestamp: number;\n signature: string;\n}\n\n/**\n * Legacy Agent Card (Phase 1 compatibility)\n */\nexport interface LegacyAgentCard {\n did: string;\n name: string;\n description: string;\n version: string;\n capabilities: string[]; // Flat string array\n endpoints: string[];\n peerId?: string;\n metadata?: Record<string, unknown>;\n timestamp: number;\n signature: string;\n}\n\n/**\n * Check if card is legacy format\n */\nexport function isLegacyCard(card: AgentCard | LegacyAgentCard): card is LegacyAgentCard {\n return Array.isArray(card.capabilities) &&\n card.capabilities.length > 0 &&\n typeof card.capabilities[0] === 'string';\n}\n\n/**\n * Convert legacy card to new format\n */\nexport function upgradeLegacyCard(legacy: LegacyAgentCard): AgentCard {\n return {\n ...legacy,\n capabilities: legacy.capabilities.map(cap => ({\n id: cap,\n name: cap,\n description: `Capability: ${cap}`,\n })),\n };\n}\n\n/**\n * Convert new card to legacy format (for backward compatibility)\n */\nexport function downgradeToLegacyCard(card: AgentCard): LegacyAgentCard {\n const { '@context': _, trust: __, ...rest } = card;\n return {\n ...rest,\n capabilities: card.capabilities.map(cap => cap.id),\n };\n}\n","import Ajv, { JSONSchemaType } from 'ajv';\nimport { DiscoveryError } from '../utils/errors.js';\n\n// Re-export Phase 2 types\nexport type { AgentCard, Capability, CapabilityParameter, LegacyAgentCard } from './agent-card-types.js';\nexport { isLegacyCard, upgradeLegacyCard, downgradeToLegacyCard } from './agent-card-types.js';\n\n// Import for internal use\nimport type { AgentCard, Capability, LegacyAgentCard } from './agent-card-types.js';\nimport { isLegacyCard } from './agent-card-types.js';\n\n// Legacy schema for backward compatibility\nconst legacyAgentCardSchema: JSONSchemaType<Omit<LegacyAgentCard, 'signature'>> = {\n type: 'object',\n properties: {\n did: { type: 'string', pattern: '^did:clawiverse:[1-9A-HJ-NP-Za-km-z]+$' },\n name: { type: 'string', minLength: 1, maxLength: 100 },\n description: { type: 'string', maxLength: 500 },\n version: { type: 'string', pattern: '^\\\\d+\\\\.\\\\d+\\\\.\\\\d+$' },\n capabilities: {\n type: 'array',\n items: { type: 'string' },\n minItems: 0,\n maxItems: 50,\n },\n endpoints: {\n type: 'array',\n items: { type: 'string' },\n minItems: 0,\n maxItems: 10,\n },\n peerId: { type: 'string', nullable: true },\n metadata: {\n type: 'object',\n nullable: true,\n required: [],\n },\n timestamp: { type: 'number' },\n },\n required: ['did', 'name', 'description', 'version', 'capabilities', 'endpoints', 'timestamp'],\n additionalProperties: false,\n};\n\nconst ajv = new Ajv();\nconst validateLegacySchema = ajv.compile(legacyAgentCardSchema);\n\n/**\n * Create a new Agent Card (Phase 2 format with structured capabilities)\n */\nexport function createAgentCard(\n did: string,\n name: string,\n description: string,\n capabilities: Capability[],\n endpoints: string[] = [],\n peerId?: string,\n metadata?: Record<string, unknown>\n): Omit<AgentCard, 'signature'> {\n return {\n did,\n name,\n description,\n version: '1.0.0',\n capabilities,\n endpoints,\n peerId,\n metadata,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Create a legacy Agent Card (Phase 1 format with string capabilities)\n * For backward compatibility\n */\nexport function createLegacyAgentCard(\n did: string,\n name: string,\n description: string,\n capabilities: string[],\n endpoints: string[] = [],\n peerId?: string,\n metadata?: Record<string, unknown>\n): Omit<LegacyAgentCard, 'signature'> {\n return {\n did,\n name,\n description,\n version: '1.0.0',\n capabilities,\n endpoints,\n peerId,\n metadata,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Validate an Agent Card structure (supports both Phase 1 and Phase 2 formats)\n */\nexport function validateAgentCard(card: unknown): card is AgentCard | LegacyAgentCard {\n if (typeof card !== 'object' || card === null) {\n return false;\n }\n\n const c = card as Partial<AgentCard | LegacyAgentCard>;\n\n // Check signature exists\n if (typeof c.signature !== 'string') {\n return false;\n }\n\n // Check if it's legacy format\n if (isLegacyCard(c as any)) {\n return validateLegacySchema(c);\n }\n\n // Phase 2 format - basic validation\n // (Full JSON-LD validation would be more complex)\n return (\n typeof c.did === 'string' &&\n typeof c.name === 'string' &&\n typeof c.description === 'string' &&\n typeof c.version === 'string' &&\n Array.isArray(c.capabilities) &&\n Array.isArray(c.endpoints) &&\n typeof c.timestamp === 'number'\n );\n}\n\n/**\n * Sign an Agent Card\n */\nexport async function signAgentCard(\n card: Omit<AgentCard, 'signature'>,\n signFn: (data: Uint8Array) => Promise<Uint8Array>\n): Promise<AgentCard> {\n try {\n const cardJson = JSON.stringify(card);\n const cardBytes = new TextEncoder().encode(cardJson);\n const signature = await signFn(cardBytes);\n\n return {\n ...card,\n signature: Buffer.from(signature).toString('hex'),\n };\n } catch (error) {\n throw new DiscoveryError('Failed to sign Agent Card', error);\n }\n}\n\n/**\n * Verify an Agent Card signature\n */\nexport async function verifyAgentCard(\n card: AgentCard,\n verifyFn: (signature: Uint8Array, data: Uint8Array) => Promise<boolean>\n): Promise<boolean> {\n try {\n const { signature, ...cardWithoutSig } = card;\n const cardJson = JSON.stringify(cardWithoutSig);\n const cardBytes = new TextEncoder().encode(cardJson);\n const signatureBytes = Buffer.from(signature, 'hex');\n\n return await verifyFn(signatureBytes, cardBytes);\n } catch (error) {\n throw new DiscoveryError('Failed to verify Agent Card', error);\n }\n}\n\n/**\n * Check if an Agent Card matches a capability query\n * Supports both Phase 1 (string[]) and Phase 2 (Capability[]) formats\n */\nexport function matchesCapability(\n card: AgentCard | LegacyAgentCard,\n capability: string\n): boolean {\n if (isLegacyCard(card)) {\n return card.capabilities.some((cap) =>\n cap.toLowerCase().includes(capability.toLowerCase())\n );\n }\n\n return card.capabilities.some((cap) =>\n cap.id.toLowerCase().includes(capability.toLowerCase()) ||\n cap.name.toLowerCase().includes(capability.toLowerCase()) ||\n cap.description.toLowerCase().includes(capability.toLowerCase())\n );\n}\n","/**\n * JSON-LD Schema Definitions for Agent Cards\n *\n * Defines the Clawiverse vocabulary and integrates with Schema.org\n * for semantic interoperability.\n */\n\nexport const CLAWIVERSE_CONTEXT = 'https://clawiverse.org/context/v1';\nexport const SCHEMA_ORG_CONTEXT = 'https://schema.org';\n\n/**\n * Clawiverse JSON-LD Context\n * Defines the vocabulary for Agent Cards and Capabilities\n */\nexport const clawiverseContext = {\n '@context': {\n '@vocab': CLAWIVERSE_CONTEXT,\n 'schema': SCHEMA_ORG_CONTEXT,\n 'AgentCard': 'schema:SoftwareApplication',\n 'Capability': 'schema:Action',\n 'did': '@id',\n 'name': 'schema:name',\n 'description': 'schema:description',\n 'version': 'schema:softwareVersion',\n 'capabilities': {\n '@id': 'schema:potentialAction',\n '@type': '@id',\n '@container': '@list'\n },\n 'endpoints': {\n '@id': 'schema:url',\n '@container': '@list'\n },\n 'peerId': 'clawiverse:peerId',\n 'trust': 'clawiverse:trustScore',\n 'metadata': 'schema:additionalProperty',\n 'timestamp': 'schema:dateModified',\n 'signature': 'clawiverse:signature',\n 'parameters': {\n '@id': 'schema:object',\n '@container': '@list'\n }\n }\n};\n\n/**\n * Capability Type Definitions\n * Common capability types with semantic meaning\n */\nexport const CapabilityTypes = {\n TRANSLATION: 'TranslationService',\n CODE_REVIEW: 'CodeReviewService',\n DATA_ANALYSIS: 'DataAnalysisService',\n TEXT_GENERATION: 'TextGenerationService',\n IMAGE_GENERATION: 'ImageGenerationService',\n SEARCH: 'SearchService',\n COMPUTATION: 'ComputationService',\n STORAGE: 'StorageService',\n MESSAGING: 'MessagingService',\n AUTHENTICATION: 'AuthenticationService',\n} as const;\n\n/**\n * Parameter Type Definitions\n */\nexport const ParameterTypes = {\n STRING: 'string',\n NUMBER: 'number',\n BOOLEAN: 'boolean',\n OBJECT: 'object',\n ARRAY: 'array',\n} as const;\n\n/**\n * Get JSON-LD context for Agent Card\n */\nexport function getAgentCardContext(): string[] {\n return [SCHEMA_ORG_CONTEXT, CLAWIVERSE_CONTEXT];\n}\n\n/**\n * Validate JSON-LD context\n */\nexport function isValidContext(context: unknown): boolean {\n if (!Array.isArray(context)) return false;\n return context.every(c => typeof c === 'string');\n}\n","/**\n * Agent Card Encoder - Dual Encoding Support\n *\n * Provides bidirectional conversion between:\n * - CBOR (compact binary) for DHT storage\n * - JSON-LD (semantic) for Web publishing\n */\n\nimport { encode as cborEncode, decode as cborDecode } from 'cbor-x';\nimport type { AgentCard, LegacyAgentCard } from './agent-card-types.js';\nimport { isLegacyCard, upgradeLegacyCard } from './agent-card-types.js';\nimport { getAgentCardContext } from './agent-card-schema.js';\nimport { DiscoveryError } from '../utils/errors.js';\n\n/**\n * Encode Agent Card as CBOR for DHT storage\n */\nexport function encodeForDHT(card: AgentCard): Uint8Array {\n try {\n // Remove JSON-LD context for compact storage\n const { '@context': _, ...cardWithoutContext } = card;\n return cborEncode(cardWithoutContext);\n } catch (error) {\n throw new DiscoveryError('Failed to encode Agent Card as CBOR', error);\n }\n}\n\n/**\n * Encode Agent Card as JSON-LD for Web publishing\n */\nexport function encodeForWeb(card: AgentCard): string {\n try {\n // Ensure JSON-LD context is present\n const cardWithContext: AgentCard = {\n '@context': card['@context'] || getAgentCardContext(),\n ...card,\n };\n return JSON.stringify(cardWithContext, null, 2);\n } catch (error) {\n throw new DiscoveryError('Failed to encode Agent Card as JSON-LD', error);\n }\n}\n\n/**\n * Decode Agent Card from CBOR\n */\nexport function decodeFromCBOR(data: Uint8Array): AgentCard {\n try {\n const decoded = cborDecode(data) as AgentCard | LegacyAgentCard;\n\n // Handle legacy format\n if (isLegacyCard(decoded)) {\n return upgradeLegacyCard(decoded);\n }\n\n // Add default context if missing\n if (!decoded['@context']) {\n decoded['@context'] = getAgentCardContext();\n }\n\n return decoded;\n } catch (error) {\n throw new DiscoveryError('Failed to decode Agent Card from CBOR', error);\n }\n}\n\n/**\n * Decode Agent Card from JSON-LD\n */\nexport function decodeFromJSON(json: string): AgentCard {\n try {\n const decoded = JSON.parse(json) as AgentCard | LegacyAgentCard;\n\n // Handle legacy format\n if (isLegacyCard(decoded)) {\n return upgradeLegacyCard(decoded);\n }\n\n // Add default context if missing\n if (!decoded['@context']) {\n decoded['@context'] = getAgentCardContext();\n }\n\n return decoded;\n } catch (error) {\n throw new DiscoveryError('Failed to decode Agent Card from JSON', error);\n }\n}\n\n/**\n * Auto-detect format and decode\n */\nexport function decodeAgentCard(data: Uint8Array | string): AgentCard {\n if (typeof data === 'string') {\n return decodeFromJSON(data);\n }\n\n // Try CBOR first, fallback to JSON if it looks like text\n try {\n return decodeFromCBOR(data);\n } catch {\n // Check if it's actually JSON text\n const text = new TextDecoder().decode(data);\n if (text.trim().startsWith('{')) {\n return decodeFromJSON(text);\n }\n throw new DiscoveryError('Unable to decode Agent Card: unknown format');\n }\n}\n\n/**\n * Calculate encoded size for comparison\n */\nexport function getEncodedSize(card: AgentCard): { cbor: number; json: number } {\n return {\n cbor: encodeForDHT(card).length,\n json: encodeForWeb(card).length,\n };\n}\n","/**\n * Search Index for Agent Discovery\n *\n * Maintains a local index of discovered agents for fast semantic search\n */\n\nimport lunr from 'lunr';\nimport Fuse from 'fuse.js';\nimport type { AgentCard } from './agent-card-types.js';\nimport { createLogger } from '../utils/logger.js';\n\nconst logger = createLogger('search-index');\n\n/**\n * Semantic Query Interface\n */\nexport interface SemanticQuery {\n text?: string; // Natural language: \"translate Japanese\"\n capability?: string; // Structured: \"translate\"\n filters?: {\n language?: string;\n minTrustScore?: number;\n maxCost?: number;\n tags?: string[];\n };\n limit?: number;\n}\n\n/**\n * Search Result with Score\n */\nexport interface SearchResult {\n card: AgentCard;\n score: number;\n}\n\n/**\n * Search Index Implementation\n */\nexport class SearchIndex {\n private cards = new Map<string, AgentCard>();\n private lunrIndex?: lunr.Index;\n private fuse?: Fuse<AgentCard>;\n private needsRebuild = false;\n\n /**\n * Add or update an Agent Card in the index\n */\n indexAgentCard(card: AgentCard): void {\n this.cards.set(card.did, card);\n this.needsRebuild = true;\n logger.debug('Indexed Agent Card', { did: card.did, capabilities: card.capabilities.length });\n }\n\n /**\n * Remove an Agent Card from the index\n */\n removeAgentCard(did: string): void {\n this.cards.delete(did);\n this.needsRebuild = true;\n logger.debug('Removed Agent Card from index', { did });\n }\n\n /**\n * Search for agents matching a query\n */\n search(query: SemanticQuery): SearchResult[] {\n if (this.needsRebuild) {\n this.rebuild();\n }\n\n let results: SearchResult[] = [];\n\n // Text search using Lunr\n if (query.text && this.lunrIndex) {\n results = this.searchByText(query.text);\n }\n // Capability search using Fuse\n else if (query.capability && this.fuse) {\n results = this.searchByCapability(query.capability);\n }\n // No query - return all\n else {\n results = Array.from(this.cards.values()).map(card => ({\n card,\n score: 1.0,\n }));\n }\n\n // Apply filters\n if (query.filters) {\n results = this.applyFilters(results, query.filters);\n }\n\n // Sort by score (descending)\n results.sort((a, b) => b.score - a.score);\n\n // Apply limit\n if (query.limit) {\n results = results.slice(0, query.limit);\n }\n\n logger.debug('Search completed', { query, results: results.length });\n return results;\n }\n\n /**\n * Get all indexed cards\n */\n getAllCards(): AgentCard[] {\n return Array.from(this.cards.values());\n }\n\n /**\n * Clear the index\n */\n clear(): void {\n this.cards.clear();\n this.lunrIndex = undefined;\n this.fuse = undefined;\n this.needsRebuild = false;\n logger.info('Search index cleared');\n }\n\n /**\n * Get index size\n */\n size(): number {\n return this.cards.size;\n }\n\n /**\n * Rebuild search indexes\n */\n private rebuild(): void {\n logger.info('Rebuilding search indexes', { cards: this.cards.size });\n\n const cards = Array.from(this.cards.values());\n\n // Build Lunr index for full-text search\n this.lunrIndex = lunr(function (this: lunr.Builder) {\n this.ref('did');\n this.field('name', { boost: 10 });\n this.field('description', { boost: 5 });\n this.field('capabilities');\n\n for (const card of cards) {\n this.add({\n did: card.did,\n name: card.name,\n description: card.description,\n capabilities: card.capabilities\n .map((cap: any) => `${cap.name} ${cap.description}`)\n .join(' '),\n });\n }\n });\n\n // Build Fuse index for fuzzy matching\n this.fuse = new Fuse(Array.from(this.cards.values()), {\n keys: [\n { name: 'name', weight: 0.3 },\n { name: 'description', weight: 0.2 },\n { name: 'capabilities.name', weight: 0.3 },\n { name: 'capabilities.description', weight: 0.2 },\n ],\n threshold: 0.4,\n includeScore: true,\n });\n\n this.needsRebuild = false;\n logger.info('Search indexes rebuilt');\n }\n\n /**\n * Search by text using Lunr\n */\n private searchByText(text: string): SearchResult[] {\n if (!this.lunrIndex) return [];\n\n const lunrResults = this.lunrIndex.search(text);\n return lunrResults.map(result => ({\n card: this.cards.get(result.ref)!,\n score: result.score,\n }));\n }\n\n /**\n * Search by capability using Fuse\n */\n private searchByCapability(capability: string): SearchResult[] {\n if (!this.fuse) return [];\n\n const fuseResults = this.fuse.search(capability);\n return fuseResults.map(result => ({\n card: result.item,\n score: 1 - (result.score || 0), // Fuse score is distance, convert to similarity\n }));\n }\n\n /**\n * Apply filters to search results\n */\n private applyFilters(\n results: SearchResult[],\n filters: NonNullable<SemanticQuery['filters']>\n ): SearchResult[] {\n return results.filter(result => {\n const { card } = result;\n\n // Trust score filter\n if (filters.minTrustScore !== undefined && card.trust) {\n const overallTrust =\n card.trust.interactionScore * 0.4 +\n Math.min(card.trust.endorsements / 10, 1) * 0.2 +\n card.trust.completionRate * 0.2 +\n card.trust.uptime * 0.2;\n\n if (overallTrust < filters.minTrustScore) {\n return false;\n }\n }\n\n // Language filter (check capability metadata)\n if (filters.language) {\n const hasLanguage = card.capabilities.some(\n cap => {\n const metadata = cap.metadata as Record<string, any> | undefined;\n if (!metadata) return false;\n return metadata.language === filters.language ||\n (Array.isArray(metadata.languages) && metadata.languages.includes(filters.language));\n }\n );\n if (!hasLanguage) return false;\n }\n\n // Tags filter\n if (filters.tags && filters.tags.length > 0) {\n const cardTags = Array.isArray(card.metadata?.tags) ? (card.metadata.tags as string[]) : [];\n const hasAllTags = filters.tags.every(tag => cardTags.includes(tag));\n if (!hasAllTags) return false;\n }\n\n return true;\n });\n }\n}\n","/**\n * Capability Matcher\n *\n * Matches semantic queries against agent capabilities\n */\n\nimport type { Capability } from './agent-card-types.js';\nimport type { SemanticQuery } from './search-index.js';\n\n/**\n * Capability Matcher\n */\nexport class CapabilityMatcher {\n /**\n * Match a query against a capability\n * Returns a score between 0 and 1\n */\n match(query: SemanticQuery, capability: Capability): number {\n let score = 0;\n let weights = 0;\n\n // Exact capability ID match\n if (query.capability && capability.id === query.capability) {\n return 1.0;\n }\n\n // Fuzzy capability name match\n if (query.capability) {\n const nameScore = this.fuzzyMatch(query.capability, capability.name);\n score += nameScore * 0.4;\n weights += 0.4;\n }\n\n // Text keyword match\n if (query.text) {\n const keywords = this.extractKeywords(query.text);\n const keywordScore = this.matchKeywords(keywords, capability);\n score += keywordScore * 0.4;\n weights += 0.4;\n }\n\n // Type hierarchy match\n if (query.capability && capability['@type']) {\n const typeScore = this.matchesType(query.capability, capability['@type']) ? 0.6 : 0;\n score += typeScore * 0.2;\n weights += 0.2;\n }\n\n return weights > 0 ? score / weights : 0;\n }\n\n /**\n * Extract keywords from natural language text\n */\n extractKeywords(text: string): string[] {\n // Remove common stop words\n const stopWords = new Set([\n 'a', 'an', 'the', 'is', 'are', 'was', 'were', 'be', 'been',\n 'to', 'from', 'in', 'on', 'at', 'by', 'for', 'with', 'about',\n 'can', 'could', 'should', 'would', 'will', 'do', 'does', 'did',\n 'i', 'you', 'he', 'she', 'it', 'we', 'they', 'me', 'him', 'her',\n ]);\n\n return text\n .toLowerCase()\n .split(/\\W+/)\n .filter(word => word.length > 2 && !stopWords.has(word));\n }\n\n /**\n * Match keywords against capability\n */\n matchKeywords(keywords: string[], capability: Capability): number {\n if (keywords.length === 0) return 0;\n\n const capText = `${capability.name} ${capability.description}`.toLowerCase();\n const matches = keywords.filter(keyword => capText.includes(keyword));\n\n return matches.length / keywords.length;\n }\n\n /**\n * Check if query matches capability type hierarchy\n */\n matchesType(query: string, type: string): boolean {\n const queryLower = query.toLowerCase();\n const typeLower = type.toLowerCase();\n\n // Direct match\n if (typeLower.includes(queryLower)) return true;\n\n // Common type mappings\n const typeMap: Record<string, string[]> = {\n translate: ['translation', 'translationservice'],\n review: ['codereview', 'reviewservice'],\n analyze: ['analysis', 'dataanalysis'],\n generate: ['generation', 'textgeneration', 'imagegeneration'],\n search: ['searchservice', 'query'],\n compute: ['computation', 'computationservice'],\n store: ['storage', 'storageservice'],\n message: ['messaging', 'messagingservice'],\n auth: ['authentication', 'authenticationservice'],\n };\n\n for (const [key, values] of Object.entries(typeMap)) {\n if (queryLower.includes(key) && values.some(v => typeLower.includes(v))) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Fuzzy string matching using Levenshtein distance\n */\n private fuzzyMatch(query: string, target: string): number {\n const queryLower = query.toLowerCase();\n const targetLower = target.toLowerCase();\n\n // Exact match\n if (queryLower === targetLower) return 1.0;\n\n // Substring match\n if (targetLower.includes(queryLower)) return 0.8;\n if (queryLower.includes(targetLower)) return 0.7;\n\n // Levenshtein distance\n const distance = this.levenshteinDistance(queryLower, targetLower);\n const maxLen = Math.max(queryLower.length, targetLower.length);\n const similarity = 1 - distance / maxLen;\n\n // Only return positive scores for reasonable similarity\n return similarity > 0.5 ? similarity * 0.6 : 0;\n }\n\n /**\n * Calculate Levenshtein distance between two strings\n */\n private levenshteinDistance(a: string, b: string): number {\n const matrix: number[][] = [];\n\n for (let i = 0; i <= b.length; i++) {\n matrix[i] = [i];\n }\n\n for (let j = 0; j <= a.length; j++) {\n matrix[0][j] = j;\n }\n\n for (let i = 1; i <= b.length; i++) {\n for (let j = 1; j <= a.length; j++) {\n if (b.charAt(i - 1) === a.charAt(j - 1)) {\n matrix[i][j] = matrix[i - 1][j - 1];\n } else {\n matrix[i][j] = Math.min(\n matrix[i - 1][j - 1] + 1, // substitution\n matrix[i][j - 1] + 1, // insertion\n matrix[i - 1][j] + 1 // deletion\n );\n }\n }\n }\n\n return matrix[b.length][a.length];\n }\n}\n","/**\n * Semantic Search Engine\n *\n * Provides intelligent agent discovery through semantic search\n * with local-first strategy and network fallback\n */\n\nimport type { AgentCard } from './agent-card-types.js';\nimport { SearchIndex } from './search-index.js';\nimport type { SemanticQuery, SearchResult } from './search-index.js';\nimport { CapabilityMatcher } from './capability-matcher.js';\nimport type { DHTOperations } from './dht.js';\nimport { createLogger } from '../utils/logger.js';\n\nconst logger = createLogger('semantic-search');\n\n/**\n * Semantic Search Engine\n */\nexport class SemanticSearchEngine {\n private index: SearchIndex;\n private matcher: CapabilityMatcher;\n\n constructor(private dht?: DHTOperations) {\n this.index = new SearchIndex();\n this.matcher = new CapabilityMatcher();\n }\n\n /**\n * Main search interface\n * Local-first with network fallback\n */\n async search(query: SemanticQuery): Promise<AgentCard[]> {\n logger.info('Searching for agents', { query });\n\n // 1. Search local index\n const localResults = this.index.search(query);\n logger.debug('Local search results', { count: localResults.length });\n\n // 2. If insufficient results, query network\n const limit = query.limit || 10;\n if (localResults.length < limit && this.dht) {\n logger.debug('Insufficient local results, querying network');\n const networkResults = await this.searchNetwork(query);\n return this.mergeResults(localResults, networkResults, limit);\n }\n\n return localResults.map(r => r.card);\n }\n\n /**\n * Index an Agent Card for local search\n */\n indexAgentCard(card: AgentCard): void {\n this.index.indexAgentCard(card);\n }\n\n /**\n * Remove an Agent Card from local index\n */\n removeAgentCard(did: string): void {\n this.index.removeAgentCard(did);\n }\n\n /**\n * Get all indexed cards\n */\n getAllIndexedCards(): AgentCard[] {\n return this.index.getAllCards();\n }\n\n /**\n * Clear local index\n */\n clearIndex(): void {\n this.index.clear();\n }\n\n /**\n * Get index size\n */\n getIndexSize(): number {\n return this.index.size();\n }\n\n /**\n * Search network via DHT\n */\n private async searchNetwork(query: SemanticQuery): Promise<SearchResult[]> {\n if (!this.dht) {\n return [];\n }\n\n try {\n // For now, use capability-based DHT query\n // In future, implement distributed semantic search overlay\n const capability = query.capability || this.extractPrimaryCapability(query.text);\n\n if (!capability) {\n logger.debug('No capability extracted from query, skipping network search');\n return [];\n }\n\n const cards = await this.dht.queryByCapability(capability);\n logger.debug('Network search results', { count: cards.length });\n\n // Score network results\n return cards.map(card => {\n const score = this.scoreCard(card, query);\n return { card, score };\n });\n } catch (error) {\n logger.error('Network search failed', { error });\n return [];\n }\n }\n\n /**\n * Merge local and network results, removing duplicates\n */\n private mergeResults(\n local: SearchResult[],\n network: SearchResult[],\n limit: number\n ): AgentCard[] {\n const seen = new Set<string>();\n const merged: SearchResult[] = [];\n\n // Add local results first (they're already scored and sorted)\n for (const result of local) {\n if (!seen.has(result.card.did)) {\n seen.add(result.card.did);\n merged.push(result);\n }\n }\n\n // Add network results\n for (const result of network) {\n if (!seen.has(result.card.did)) {\n seen.add(result.card.did);\n merged.push(result);\n\n // Also index for future searches\n this.index.indexAgentCard(result.card);\n }\n }\n\n // Sort by score and apply limit\n merged.sort((a, b) => b.score - a.score);\n return merged.slice(0, limit).map(r => r.card);\n }\n\n /**\n * Score a card against a query\n */\n private scoreCard(card: AgentCard, query: SemanticQuery): number {\n let totalScore = 0;\n let count = 0;\n\n for (const capability of card.capabilities) {\n const score = this.matcher.match(query, capability);\n if (score > 0) {\n totalScore += score;\n count++;\n }\n }\n\n // Average score across matching capabilities\n const avgScore = count > 0 ? totalScore / count : 0;\n\n // Boost by trust score if available\n if (card.trust) {\n const trustBoost = card.trust.interactionScore * 0.2;\n return Math.min(avgScore + trustBoost, 1.0);\n }\n\n return avgScore;\n }\n\n /**\n * Extract primary capability from natural language text\n */\n private extractPrimaryCapability(text?: string): string | undefined {\n if (!text) return undefined;\n\n const keywords = this.matcher.extractKeywords(text);\n\n // Common capability keywords\n const capabilityKeywords = [\n 'translate', 'translation',\n 'review', 'code',\n 'analyze', 'analysis',\n 'generate', 'generation',\n 'search', 'query',\n 'compute', 'calculation',\n 'store', 'storage',\n 'message', 'messaging',\n 'auth', 'authentication',\n ];\n\n // Find first matching keyword\n for (const keyword of keywords) {\n if (capabilityKeywords.includes(keyword)) {\n return keyword;\n }\n }\n\n // Return first keyword as fallback\n return keywords[0];\n }\n}\n\n/**\n * Create a semantic search engine\n */\nexport function createSemanticSearch(dht?: DHTOperations): SemanticSearchEngine {\n return new SemanticSearchEngine(dht);\n}\n","import type { Libp2p } from 'libp2p';\nimport type { AgentCard } from './agent-card.js';\nimport { createLogger } from '../utils/logger.js';\nimport { DiscoveryError } from '../utils/errors.js';\nimport { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';\nimport { toString as uint8ArrayToString } from 'uint8arrays/to-string';\nimport { encodeForDHT, decodeFromCBOR } from './agent-card-encoder.js';\nimport { createSemanticSearch } from './semantic-search.js';\nimport type { SemanticQuery } from './search-index.js';\n\nconst logger = createLogger('dht');\n\nexport interface ResolvedDID {\n peerId: string;\n multiaddrs: string[];\n}\n\nexport interface DHTOperations {\n publishAgentCard: (card: AgentCard) => Promise<void>;\n queryAgentCard: (did: string) => Promise<AgentCard | null>;\n queryByCapability: (capability: string) => Promise<AgentCard[]>;\n searchSemantic: (query: SemanticQuery) => Promise<AgentCard[]>;\n resolveDID: (did: string) => Promise<ResolvedDID | null>;\n queryRelayPeers: () => Promise<string[]>;\n}\n\n/** Extract a DHT value from a get() event, handling both VALUE and PEER_RESPONSE */\nfunction extractValue(event: any): Uint8Array | null {\n if (event.name === 'VALUE' && event.value) return event.value;\n if (event.name === 'PEER_RESPONSE' && event.value) return event.value;\n return null;\n}\n\n/** Normalize capability name for use as a DHT key segment */\nfunction capKey(cap: string): string {\n return cap.toLowerCase().replace(/[^a-z0-9_-]/g, '_');\n}\n\n/** Read a DID list stored at a DHT key (newline-separated) */\nasync function readDIDList(dht: any, key: Uint8Array): Promise<string[]> {\n try {\n for await (const event of dht.get(key, { signal: AbortSignal.timeout(30000) })) {\n const raw = extractValue(event);\n if (raw) {\n const text = uint8ArrayToString(raw);\n return text.split('\\n').filter(Boolean);\n }\n }\n } catch {\n // key not found or timeout\n }\n return [];\n}\n\n/** Write a DID list to a DHT key (newline-separated), deduplicating */\nasync function writeDIDList(dht: any, key: Uint8Array, dids: string[]): Promise<void> {\n const value = uint8ArrayFromString([...new Set(dids)].join('\\n'));\n // Retry up to 3 times with 30s timeout each\n for (let attempt = 1; attempt <= 3; attempt++) {\n try {\n for await (const _ of dht.put(key, value, { signal: AbortSignal.timeout(30000) })) { /* consume */ }\n return; // Success\n } catch (e: any) {\n if (e?.name === 'AbortError' && attempt < 3) {\n logger.debug(`DHT put timeout, retrying (${attempt}/3)...`);\n continue;\n }\n if (e?.name !== 'AbortError') throw e;\n }\n }\n}\n\n/**\n * Create DHT operations for a libp2p node\n */\nexport function createDHTOperations(libp2p: Libp2p): DHTOperations {\n const operations: DHTOperations = {} as DHTOperations;\n const searchEngine = createSemanticSearch(operations);\n\n return Object.assign(operations, {\n publishAgentCard: async (card: AgentCard) => {\n try {\n const dht = (libp2p as any).services?.dht;\n if (!dht) throw new DiscoveryError('DHT service not available');\n\n // 1. Store Agent Card under /clawiverse/agent/<did>\n const agentKey = uint8ArrayFromString(`/clawiverse/agent/${card.did}`);\n // Retry up to 3 times with 30s timeout each\n for (let attempt = 1; attempt <= 3; attempt++) {\n try {\n for await (const _ of dht.put(agentKey, encodeForDHT(card), { signal: AbortSignal.timeout(30000) })) { /* consume */ }\n break; // Success\n } catch (e: any) {\n if (e?.name === 'AbortError' && attempt < 3) {\n logger.debug(`DHT put agent card timeout, retrying (${attempt}/3)...`);\n continue;\n }\n logger.warn('DHT put agent card failed (non-fatal)', { error: (e as Error).message });\n break;\n }\n }\n\n // 2. For each capability, append this DID to /clawiverse/cap/<capability>\n // Skip capability indexing in slow networks - rely on local index and semantic search instead\n const caps: string[] = (card.capabilities ?? []).flatMap((c: any) => {\n if (typeof c === 'string') return [c];\n return [c.name, c.id].filter(Boolean);\n });\n\n // Always index under the special \"all\" key so name/description search works\n caps.push('__all__');\n\n // Keep indexing lightweight, but preserve relay discovery path.\n const importantCaps = ['__all__'];\n if (caps.some((cap) => capKey(cap) === 'relay')) {\n importantCaps.push('relay');\n }\n await Promise.all(importantCaps.map(async (cap) => {\n const capKeyStr = `/clawiverse/cap/${capKey(cap)}`;\n const capDHTKey = uint8ArrayFromString(capKeyStr);\n try {\n const existing = await readDIDList(dht, capDHTKey);\n if (!existing.includes(card.did)) {\n await writeDIDList(dht, capDHTKey, [...existing, card.did]);\n logger.debug('Indexed capability in DHT', { cap: capKey(cap), did: card.did });\n }\n } catch (e: any) {\n logger.warn('Failed to index capability (non-fatal)', { cap: capKey(cap), error: (e as Error).message });\n }\n }));\n\n // 3. Index locally for fast in-process search\n searchEngine.indexAgentCard(card);\n\n logger.info('Published Agent Card to DHT', { did: card.did });\n } catch (error) {\n throw new DiscoveryError('Failed to publish Agent Card', error);\n }\n },\n\n queryAgentCard: async (did: string) => {\n try {\n const dht = (libp2p as any).services?.dht;\n if (!dht) throw new DiscoveryError('DHT service not available');\n\n const key = uint8ArrayFromString(`/clawiverse/agent/${did}`);\n for await (const event of dht.get(key)) {\n const raw = extractValue(event);\n if (raw) {\n const card = decodeFromCBOR(raw);\n searchEngine.indexAgentCard(card);\n logger.debug('Found Agent Card in DHT', { did });\n return card;\n }\n }\n\n logger.debug('Agent Card not found in DHT', { did });\n return null;\n } catch (error) {\n logger.warn('Failed to query Agent Card', { did, error });\n return null;\n }\n },\n\n queryByCapability: async (capability: string) => {\n try {\n const dht = (libp2p as any).services?.dht;\n\n // 1. Check local index first\n const local = searchEngine.getAllIndexedCards().filter(card =>\n card.capabilities.some((cap: any) => {\n const name = typeof cap === 'string' ? cap : cap.name;\n return name?.toLowerCase().includes(capability.toLowerCase());\n })\n );\n if (local.length > 0) return local;\n\n // 2. Fall back to DHT capability index\n if (!dht) return [];\n\n const capDHTKey = uint8ArrayFromString(`/clawiverse/cap/${capKey(capability)}`);\n const dids = await readDIDList(dht, capDHTKey);\n logger.debug('DHT capability index', { capability, dids });\n\n // Fetch each Agent Card in parallel\n const cards = await Promise.all(\n dids.map(async (did) => {\n const key = uint8ArrayFromString(`/clawiverse/agent/${did}`);\n try {\n for await (const event of dht.get(key)) {\n const raw = extractValue(event);\n if (raw) {\n const card = decodeFromCBOR(raw);\n searchEngine.indexAgentCard(card);\n return card;\n }\n }\n } catch { /* skip unreachable */ }\n return null;\n })\n );\n\n return cards.filter((c): c is AgentCard => c !== null);\n } catch (error) {\n throw new DiscoveryError('Failed to query by capability', error);\n }\n },\n\n searchSemantic: async (query: SemanticQuery) => {\n try {\n // Always pull from DHT __all__ index to discover remote nodes\n const dht = (libp2p as any).services?.dht;\n if (dht) {\n const allKey = uint8ArrayFromString('/clawiverse/cap/__all__');\n const dids = await readDIDList(dht, allKey);\n logger.debug('DHT __all__ index', { count: dids.length });\n\n await Promise.all(\n dids.map(async (did) => {\n const key = uint8ArrayFromString(`/clawiverse/agent/${did}`);\n try {\n for await (const event of dht.get(key)) {\n const raw = extractValue(event);\n if (raw) {\n searchEngine.indexAgentCard(decodeFromCBOR(raw));\n break;\n }\n }\n } catch { /* skip */ }\n })\n );\n }\n\n return searchEngine.search(query);\n } catch (error) {\n throw new DiscoveryError('Failed to perform semantic search', error);\n }\n },\n\n queryRelayPeers: async (): Promise<string[]> => {\n const dht = (libp2p as any).services?.dht;\n if (!dht) return [];\n const capDHTKey = uint8ArrayFromString('/clawiverse/cap/relay');\n const dids = await readDIDList(dht, capDHTKey);\n const addrs: string[] = [];\n await Promise.all(dids.map(async (did) => {\n const card = await operations.queryAgentCard(did);\n if (card?.endpoints) {\n addrs.push(...card.endpoints.filter((e: string) => !e.includes('/p2p-circuit/')));\n }\n }));\n return addrs;\n },\n\n resolveDID: async (did: string) => {\n try {\n const dht = (libp2p as any).services?.dht;\n if (!dht) throw new DiscoveryError('DHT service not available');\n\n const key = uint8ArrayFromString(`/clawiverse/agent/${did}`);\n for await (const event of dht.get(key)) {\n const raw = extractValue(event);\n if (raw) {\n const card = decodeFromCBOR(raw);\n if (card.peerId) {\n logger.debug('Resolved DID to peer', { did, peerId: card.peerId });\n return { peerId: card.peerId, multiaddrs: card.endpoints || [] };\n }\n logger.warn('Agent Card found but has no peerId', { did });\n return null;\n }\n }\n\n logger.debug('DID not found in DHT', { did });\n return null;\n } catch (error) {\n logger.warn('Failed to resolve DID', { did, error });\n return null;\n }\n },\n });\n}\n","import { MessagingError } from '../utils/errors.js';\n\nexport interface MessageEnvelope {\n id: string;\n from: string; // DID\n to: string; // DID\n type: 'request' | 'response' | 'notification';\n protocol: string;\n payload: unknown;\n timestamp: number;\n signature: string;\n replyTo?: string; // For responses, the ID of the request\n}\n\n/**\n * Create a message envelope\n */\nexport function createEnvelope(\n from: string,\n to: string,\n type: 'request' | 'response' | 'notification',\n protocol: string,\n payload: unknown,\n replyTo?: string\n): Omit<MessageEnvelope, 'signature'> {\n return {\n id: generateMessageId(),\n from,\n to,\n type,\n protocol,\n payload,\n timestamp: Date.now(),\n replyTo,\n };\n}\n\n/**\n * Sign a message envelope\n */\nexport async function signEnvelope(\n envelope: Omit<MessageEnvelope, 'signature'>,\n signFn: (data: Uint8Array) => Promise<Uint8Array>\n): Promise<MessageEnvelope> {\n try {\n const envelopeJson = JSON.stringify(envelope);\n const envelopeBytes = new TextEncoder().encode(envelopeJson);\n const signature = await signFn(envelopeBytes);\n\n return {\n ...envelope,\n signature: Buffer.from(signature).toString('hex'),\n };\n } catch (error) {\n throw new MessagingError('Failed to sign envelope', error);\n }\n}\n\n/**\n * Verify a message envelope signature\n */\nexport async function verifyEnvelope(\n envelope: MessageEnvelope,\n verifyFn: (signature: Uint8Array, data: Uint8Array) => Promise<boolean>\n): Promise<boolean> {\n try {\n const { signature, ...envelopeWithoutSig } = envelope;\n const envelopeJson = JSON.stringify(envelopeWithoutSig);\n const envelopeBytes = new TextEncoder().encode(envelopeJson);\n const signatureBytes = Buffer.from(signature, 'hex');\n\n return await verifyFn(signatureBytes, envelopeBytes);\n } catch (error) {\n throw new MessagingError('Failed to verify envelope', error);\n }\n}\n\n/**\n * Validate message envelope structure\n */\nexport function validateEnvelope(msg: unknown): msg is MessageEnvelope {\n if (typeof msg !== 'object' || msg === null) {\n return false;\n }\n\n const m = msg as Partial<MessageEnvelope>;\n\n return (\n typeof m.id === 'string' &&\n typeof m.from === 'string' &&\n m.from.startsWith('did:clawiverse:') &&\n typeof m.to === 'string' &&\n m.to.startsWith('did:clawiverse:') &&\n (m.type === 'request' || m.type === 'response' || m.type === 'notification') &&\n typeof m.protocol === 'string' &&\n m.payload !== undefined &&\n typeof m.timestamp === 'number' &&\n typeof m.signature === 'string'\n );\n}\n\n/**\n * Generate a unique message ID\n */\nfunction generateMessageId(): string {\n return `msg_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n}\n","import { encode, decode } from 'cbor-x';\nimport type { MessageEnvelope } from './envelope.js';\nimport { MessagingError } from '../utils/errors.js';\n\n/**\n * Encode a message envelope to CBOR\n */\nexport function encodeMessage(envelope: MessageEnvelope): Uint8Array {\n try {\n return encode(envelope);\n } catch (error) {\n throw new MessagingError('Failed to encode message', error);\n }\n}\n\n/**\n * Decode a CBOR message to envelope\n */\nexport function decodeMessage(data: Uint8Array): MessageEnvelope {\n try {\n return decode(data) as MessageEnvelope;\n } catch (error) {\n throw new MessagingError('Failed to decode message', error);\n }\n}\n\n/**\n * Encode message to JSON (for debugging/logging)\n */\nexport function encodeMessageJSON(envelope: MessageEnvelope): string {\n try {\n return JSON.stringify(envelope, null, 2);\n } catch (error) {\n throw new MessagingError('Failed to encode message to JSON', error);\n }\n}\n\n/**\n * Decode JSON message to envelope\n */\nexport function decodeMessageJSON(json: string): MessageEnvelope {\n try {\n return JSON.parse(json) as MessageEnvelope;\n } catch (error) {\n throw new MessagingError('Failed to decode message from JSON', error);\n }\n}\n","import type { Libp2p } from 'libp2p';\nimport { peerIdFromString } from '@libp2p/peer-id';\nimport { multiaddr } from '@multiformats/multiaddr';\nimport type { MessageEnvelope } from './envelope.js';\nimport type { DHTOperations } from '../discovery/dht.js';\nimport { encodeMessage, decodeMessage } from './codec.js';\nimport { validateEnvelope, verifyEnvelope } from './envelope.js';\nimport { createLogger } from '../utils/logger.js';\nimport { MessagingError } from '../utils/errors.js';\nimport { extractPublicKey } from '../identity/did.js';\nimport { verify } from '../identity/keys.js';\n\nconst logger = createLogger('router');\n\nexport type MessageHandler = (\n envelope: MessageEnvelope\n) => Promise<MessageEnvelope | void>;\n\nexport interface PeerHint {\n peerId: string;\n multiaddrs: string[];\n}\n\nexport interface MessageRouter {\n registerHandler: (protocol: string, handler: MessageHandler) => void;\n unregisterHandler: (protocol: string) => void;\n registerCatchAllHandler: (handler: MessageHandler) => void;\n sendMessage: (envelope: MessageEnvelope, peerHint?: PeerHint) => Promise<MessageEnvelope | void>;\n start: () => Promise<void>;\n stop: () => Promise<void>;\n}\n\n/**\n * Create a message router for a libp2p node.\n * When dht is provided, sendMessage can resolve DIDs to peer addresses via DHT lookup.\n * When relayPeers is provided, sendMessage will attempt relay fallback if direct dial fails.\n */\nexport function createMessageRouter(\n libp2p: Libp2p,\n verifyFn: (signature: Uint8Array, data: Uint8Array) => Promise<boolean>,\n dht?: DHTOperations,\n relayPeers?: string[]\n): MessageRouter {\n const handlers = new Map<string, MessageHandler>();\n let catchAllHandler: MessageHandler | undefined;\n const PROTOCOL_PREFIX = '/clawiverse/msg/1.0.0';\n\n return {\n registerHandler: (protocol: string, handler: MessageHandler) => {\n handlers.set(protocol, handler);\n logger.info('Registered message handler', { protocol });\n },\n\n unregisterHandler: (protocol: string) => {\n handlers.delete(protocol);\n logger.info('Unregistered message handler', { protocol });\n },\n\n registerCatchAllHandler: (handler: MessageHandler) => {\n catchAllHandler = handler;\n logger.info('Registered catch-all message handler');\n },\n\n sendMessage: async (envelope: MessageEnvelope, peerHint?: PeerHint) => {\n try {\n if (!validateEnvelope(envelope)) {\n throw new MessagingError('Invalid message envelope');\n }\n\n // Resolve peer: try peerHint first, then DHT\n let targetPeerIdStr: string | undefined;\n let targetMultiaddrs: string[] = [];\n\n if (peerHint) {\n targetPeerIdStr = peerHint.peerId;\n targetMultiaddrs = peerHint.multiaddrs;\n logger.info('Using peer hint for direct addressing', { peerId: targetPeerIdStr });\n } else if (dht) {\n const resolved = await dht.resolveDID(envelope.to);\n if (resolved) {\n targetPeerIdStr = resolved.peerId;\n targetMultiaddrs = resolved.multiaddrs;\n }\n }\n\n if (!targetPeerIdStr) {\n throw new MessagingError(\n `Cannot resolve recipient: ${envelope.to} — provide peerHint or ensure agent is in DHT`\n );\n }\n\n const targetPeerId = peerIdFromString(targetPeerIdStr);\n\n if (targetMultiaddrs.length > 0) {\n const mas = targetMultiaddrs.map((a) => multiaddr(a));\n await libp2p.peerStore.merge(targetPeerId, { multiaddrs: mas });\n }\n\n logger.info('Dialing peer for message delivery', {\n peerId: targetPeerIdStr,\n multiaddrs: targetMultiaddrs,\n });\n\n let stream: any;\n\n // Separate relay addrs from direct addrs\n const relayMultiaddrs = targetMultiaddrs.filter((a) => a.includes('/p2p-circuit/'));\n const directMultiaddrs = targetMultiaddrs.filter((a) => !a.includes('/p2p-circuit/'));\n\n // Try direct addresses first\n for (const addr of directMultiaddrs) {\n try {\n const conn = await libp2p.dial(multiaddr(addr));\n stream = await conn.newStream(PROTOCOL_PREFIX, { runOnLimitedConnection: true });\n logger.info('Direct dial succeeded', { addr });\n break;\n } catch {\n // try next\n }\n }\n\n let lastError: unknown;\n\n // Fall back to relay: dial the circuit addr to establish connection, then newStream\n if (!stream) {\n const allRelayAddrs = [\n ...relayMultiaddrs,\n ...(relayPeers ?? []).map((r) => buildCircuitRelayAddr(r, targetPeerIdStr!)),\n ];\n // Deduplicate\n const uniqueRelayAddrs = [...new Set(allRelayAddrs)];\n for (const addr of uniqueRelayAddrs) {\n try {\n // Step 1: establish the relay connection\n const conn = await libp2p.dial(multiaddr(addr));\n logger.info('Relay connection established', { addr });\n // Step 2: open a protocol stream on the relay (limited) connection\n stream = await conn.newStream(PROTOCOL_PREFIX, { runOnLimitedConnection: true });\n logger.info('Relay stream opened', { addr });\n break;\n } catch (relayErr) {\n logger.warn('Relay dial failed', { addr, error: (relayErr as Error).message });\n lastError = relayErr;\n }\n }\n }\n\n // Last resort: query DHT for relay-capable peers\n if (!stream && dht && 'queryRelayPeers' in dht) {\n const discoveredRelays = await (dht as any).queryRelayPeers();\n for (const relayAddr of discoveredRelays) {\n const circuitAddr = buildCircuitRelayAddr(relayAddr, targetPeerIdStr!);\n try {\n const conn = await libp2p.dial(multiaddr(circuitAddr));\n stream = await conn.newStream(PROTOCOL_PREFIX, { runOnLimitedConnection: true });\n logger.info('DHT-discovered relay succeeded', { relayAddr });\n break;\n } catch (e) {\n logger.warn('DHT relay failed', { relayAddr, error: (e as Error).message });\n lastError = e;\n }\n }\n }\n\n if (!stream) {\n throw lastError ?? new MessagingError('All dial attempts failed (including DHT-discovered relays)');\n }\n\n const encoded = encodeMessage(envelope);\n await stream.sink(\n (async function* () {\n yield encoded;\n })()\n );\n\n logger.info('Message sent over libp2p stream', {\n id: envelope.id,\n from: envelope.from,\n to: envelope.to,\n protocol: envelope.protocol,\n });\n\n // If this is a request, wait for response\n if (envelope.type === 'request') {\n logger.debug('Waiting for response to request', { id: envelope.id });\n\n try {\n // Add timeout to prevent infinite blocking\n const RESPONSE_TIMEOUT = 30000; // 30 seconds\n\n const responsePromise = (async () => {\n const responseChunks: Uint8Array[] = [];\n for await (const chunk of stream.source) {\n responseChunks.push(chunk.subarray());\n }\n\n if (responseChunks.length > 0) {\n const responseData = new Uint8Array(\n responseChunks.reduce((acc, chunk) => acc + chunk.length, 0)\n );\n let offset = 0;\n for (const chunk of responseChunks) {\n responseData.set(chunk, offset);\n offset += chunk.length;\n }\n\n const responseEnvelope = decodeMessage(responseData);\n logger.info('Received response', {\n id: responseEnvelope.id,\n replyTo: responseEnvelope.replyTo,\n });\n\n return responseEnvelope;\n } else {\n logger.warn('No response received for request', { id: envelope.id });\n return undefined;\n }\n })();\n\n const timeoutPromise = new Promise<undefined>((resolve) => {\n setTimeout(() => {\n logger.warn('Response timeout', { id: envelope.id, timeout: RESPONSE_TIMEOUT });\n resolve(undefined);\n }, RESPONSE_TIMEOUT);\n });\n\n const response = await Promise.race([responsePromise, timeoutPromise]);\n return response;\n } catch (error) {\n logger.warn('Error reading response', { error });\n return undefined;\n }\n }\n\n return undefined;\n } catch (error) {\n if (error instanceof MessagingError) throw error;\n throw new MessagingError('Failed to send message', error);\n }\n },\n\n start: async () => {\n await libp2p.handle(PROTOCOL_PREFIX, async ({ stream }) => {\n try {\n await handleIncomingStream(stream, handlers, catchAllHandler, verifyFn);\n } catch (error) {\n logger.error('Error handling incoming stream', error);\n }\n }, { runOnLimitedConnection: true });\n\n logger.info('Message router started');\n },\n\n stop: async () => {\n await libp2p.unhandle(PROTOCOL_PREFIX);\n handlers.clear();\n catchAllHandler = undefined;\n logger.info('Message router stopped');\n },\n };\n}\n\nfunction buildCircuitRelayAddr(relayAddr: string, targetPeerId: string): string {\n return `${relayAddr}/p2p-circuit/p2p/${targetPeerId}`;\n}\n\nasync function handleIncomingStream(\n stream: any,\n handlers: Map<string, MessageHandler>,\n catchAllHandler: MessageHandler | undefined,\n _verifyFn: (signature: Uint8Array, data: Uint8Array) => Promise<boolean>\n): Promise<void> {\n try {\n const chunks: Uint8Array[] = [];\n for await (const chunk of stream.source) {\n chunks.push(chunk.subarray());\n }\n\n const data = new Uint8Array(\n chunks.reduce((acc, chunk) => acc + chunk.length, 0)\n );\n let offset = 0;\n for (const chunk of chunks) {\n data.set(chunk, offset);\n offset += chunk.length;\n }\n\n const envelope = decodeMessage(data);\n\n if (!validateEnvelope(envelope)) {\n logger.warn('Received invalid message envelope');\n return;\n }\n\n // Verify signature against sender DID embedded public key.\n const isValidSignature = await verifyEnvelope(envelope, async (signature, data) => {\n const senderPublicKey = extractPublicKey(envelope.from);\n return verify(signature, data, senderPublicKey);\n });\n if (!isValidSignature) {\n logger.warn('Received message with invalid signature', {\n id: envelope.id,\n from: envelope.from,\n });\n return;\n }\n\n logger.info('Received message', {\n id: envelope.id,\n from: envelope.from,\n to: envelope.to,\n protocol: envelope.protocol,\n payload: envelope.payload,\n });\n\n const handler = handlers.get(envelope.protocol);\n let response: MessageEnvelope | void = undefined;\n\n if (handler) {\n response = await handler(envelope);\n } else if (catchAllHandler) {\n logger.debug('Using catch-all handler for protocol', { protocol: envelope.protocol });\n response = await catchAllHandler(envelope);\n } else {\n logger.warn('No handler for protocol', { protocol: envelope.protocol });\n }\n\n // Send response back if handler returned one\n if (response) {\n const encoded = encodeMessage(response);\n logger.info('Sending response back to sender', {\n responseId: response.id,\n replyTo: response.replyTo,\n size: encoded.length\n });\n\n await stream.sink(\n (async function* () {\n yield encoded;\n })()\n );\n }\n } catch (error) {\n logger.error('Error handling incoming message', error);\n }\n}\n","/**\n * Trust Score System\n *\n * Tracks agent reputation based on interactions, endorsements,\n * and network behavior.\n */\n\n/**\n * Trust Score Metrics\n */\nexport interface TrustScore {\n interactionScore: number; // 0-1, based on successful interactions\n endorsements: number; // Count of endorsements\n completionRate: number; // % of completed tasks (0-1)\n responseTime: number; // Average response time (ms)\n uptime: number; // % of time online last 30 days (0-1)\n lastUpdated: number; // Timestamp\n}\n\n/**\n * Interaction Record\n */\nexport interface Interaction {\n agentDid: string;\n timestamp: number;\n type: 'message' | 'task' | 'query';\n success: boolean;\n responseTime: number;\n rating?: number; // 1-5 stars (optional user rating)\n feedback?: string;\n}\n\n/**\n * Interaction Statistics\n */\nexport interface InteractionStats {\n totalInteractions: number;\n successRate: number;\n avgResponseTime: number;\n lastInteraction: number;\n}\n\n/**\n * Trust Metrics Calculator\n */\nexport class TrustMetrics {\n /**\n * Calculate trust score from interaction history\n */\n calculateScore(stats: InteractionStats, endorsements: number, uptime: number): TrustScore {\n // Interaction score: weighted by success rate and volume\n const volumeWeight = Math.min(stats.totalInteractions / 100, 1); // Cap at 100 interactions\n const interactionScore = stats.successRate * volumeWeight;\n\n // Completion rate is same as success rate for now\n const completionRate = stats.successRate;\n\n return {\n interactionScore,\n endorsements,\n completionRate,\n responseTime: stats.avgResponseTime,\n uptime,\n lastUpdated: Date.now(),\n };\n }\n\n /**\n * Calculate overall trust level (0-1)\n */\n calculateOverallTrust(score: TrustScore): number {\n // Weighted average of different factors\n const weights = {\n interaction: 0.4,\n endorsement: 0.2,\n completion: 0.2,\n uptime: 0.2,\n };\n\n const endorsementScore = Math.min(score.endorsements / 10, 1); // Cap at 10 endorsements\n\n return (\n score.interactionScore * weights.interaction +\n endorsementScore * weights.endorsement +\n score.completionRate * weights.completion +\n score.uptime * weights.uptime\n );\n }\n\n /**\n * Get trust level category\n */\n getTrustLevel(score: TrustScore): 'new' | 'low' | 'medium' | 'high' | 'trusted' {\n const overall = this.calculateOverallTrust(score);\n\n if (score.interactionScore === 0) return 'new';\n if (overall < 0.3) return 'low';\n if (overall < 0.6) return 'medium';\n if (overall < 0.8) return 'high';\n return 'trusted';\n }\n\n /**\n * Check if agent should be rate limited\n */\n shouldRateLimit(score: TrustScore, agentAge: number): boolean {\n const overall = this.calculateOverallTrust(score);\n const ONE_DAY = 24 * 60 * 60 * 1000;\n\n // New agents (< 24 hours) with low trust\n if (agentAge < ONE_DAY && overall < 0.3) {\n return true;\n }\n\n // Very low trust regardless of age\n if (overall < 0.1) {\n return true;\n }\n\n return false;\n }\n}\n\n/**\n * Default trust score for new agents\n */\nexport function createDefaultTrustScore(): TrustScore {\n return {\n interactionScore: 0,\n endorsements: 0,\n completionRate: 0,\n responseTime: 0,\n uptime: 1.0, // Assume online initially\n lastUpdated: Date.now(),\n };\n}\n","/**\n * Interaction History Tracker\n *\n * Records and queries agent interaction history for trust scoring\n */\n\nimport { Level } from 'level';\nimport type { Interaction, InteractionStats } from './trust-score.js';\nimport { createLogger } from '../utils/logger.js';\n\nconst logger = createLogger('interaction-history');\n\n/**\n * Interaction History Manager\n */\nexport class InteractionHistory {\n private db: Level<string, Interaction>;\n\n constructor(dbPath: string) {\n this.db = new Level(dbPath, { valueEncoding: 'json' });\n }\n\n /**\n * Open database connection\n */\n async open(): Promise<void> {\n await this.db.open();\n logger.info('Interaction history database opened', { path: this.db.location });\n }\n\n /**\n * Close database connection\n */\n async close(): Promise<void> {\n await this.db.close();\n logger.info('Interaction history database closed');\n }\n\n /**\n * Record an interaction\n */\n async record(interaction: Interaction): Promise<void> {\n const key = `interaction:${interaction.agentDid}:${interaction.timestamp}`;\n await this.db.put(key, interaction);\n logger.debug('Recorded interaction', { agentDid: interaction.agentDid, type: interaction.type });\n }\n\n /**\n * Get interaction history for an agent\n */\n async getHistory(agentDid: string, limit = 100): Promise<Interaction[]> {\n const interactions: Interaction[] = [];\n const prefix = `interaction:${agentDid}:`;\n\n try {\n for await (const [_, value] of this.db.iterator({\n gte: prefix,\n lte: prefix + '\\xff',\n limit,\n reverse: true, // Most recent first\n })) {\n interactions.push(value);\n }\n } catch (error) {\n logger.error('Failed to get interaction history', { agentDid, error });\n }\n\n return interactions;\n }\n\n /**\n * Get interaction statistics for an agent\n */\n async getStats(agentDid: string): Promise<InteractionStats> {\n const history = await this.getHistory(agentDid, 1000); // Last 1000 interactions\n\n if (history.length === 0) {\n return {\n totalInteractions: 0,\n successRate: 0,\n avgResponseTime: 0,\n lastInteraction: 0,\n };\n }\n\n const successCount = history.filter(i => i.success).length;\n const totalResponseTime = history.reduce((sum, i) => sum + i.responseTime, 0);\n\n return {\n totalInteractions: history.length,\n successRate: successCount / history.length,\n avgResponseTime: totalResponseTime / history.length,\n lastInteraction: history[0].timestamp,\n };\n }\n\n /**\n * Get all agents with interaction history\n */\n async getAllAgents(): Promise<string[]> {\n const agents = new Set<string>();\n\n try {\n for await (const [key] of this.db.iterator()) {\n const match = key.match(/^interaction:([^:]+):/);\n if (match) {\n agents.add(match[1]);\n }\n }\n } catch (error) {\n logger.error('Failed to get all agents', { error });\n }\n\n return Array.from(agents);\n }\n\n /**\n * Delete all interactions for an agent\n */\n async deleteAgent(agentDid: string): Promise<void> {\n const prefix = `interaction:${agentDid}:`;\n const keysToDelete: string[] = [];\n\n for await (const [key] of this.db.iterator({\n gte: prefix,\n lte: prefix + '\\xff',\n })) {\n keysToDelete.push(key);\n }\n\n await this.db.batch(keysToDelete.map(key => ({ type: 'del', key })));\n logger.info('Deleted interaction history', { agentDid, count: keysToDelete.length });\n }\n\n /**\n * Clean up old interactions (older than 90 days)\n */\n async cleanup(maxAge = 90 * 24 * 60 * 60 * 1000): Promise<number> {\n const cutoff = Date.now() - maxAge;\n const keysToDelete: string[] = [];\n\n for await (const [key, value] of this.db.iterator()) {\n if (value.timestamp < cutoff) {\n keysToDelete.push(key);\n }\n }\n\n if (keysToDelete.length > 0) {\n await this.db.batch(keysToDelete.map(key => ({ type: 'del', key })));\n logger.info('Cleaned up old interactions', { count: keysToDelete.length });\n }\n\n return keysToDelete.length;\n }\n}\n","/**\n * Endorsement System\n *\n * Allows agents to endorse each other, building a web of trust\n */\n\nimport type { Level } from 'level';\nimport { createLogger } from '../utils/logger.js';\n\nconst logger = createLogger('endorsement');\n\n/**\n * Endorsement Record\n */\nexport interface Endorsement {\n from: string; // Endorser DID\n to: string; // Endorsed agent DID\n score: number; // 0-1\n reason: string;\n timestamp: number;\n signature: string; // Signed by endorser\n}\n\n/**\n * Sign function type\n */\nexport type SignFunction = (data: Uint8Array) => Promise<Uint8Array>;\n\n/**\n * Verify function type\n */\nexport type VerifyFunction = (signature: Uint8Array, data: Uint8Array, publicKey: Uint8Array) => Promise<boolean>;\n\n/**\n * Endorsement Manager\n */\nexport class EndorsementManager {\n constructor(\n private db: Level<string, Endorsement>,\n private getPublicKey: (did: string) => Promise<Uint8Array>\n ) {}\n\n /**\n * Create an endorsement\n */\n async endorse(\n fromDid: string,\n toDid: string,\n score: number,\n reason: string,\n signFn: SignFunction\n ): Promise<Endorsement> {\n if (score < 0 || score > 1) {\n throw new Error('Score must be between 0 and 1');\n }\n\n const endorsement: Omit<Endorsement, 'signature'> = {\n from: fromDid,\n to: toDid,\n score,\n reason,\n timestamp: Date.now(),\n };\n\n // Sign the endorsement\n const data = new TextEncoder().encode(JSON.stringify(endorsement));\n const signatureBytes = await signFn(data);\n const signature = Buffer.from(signatureBytes).toString('hex');\n\n const signedEndorsement: Endorsement = {\n ...endorsement,\n signature,\n };\n\n logger.info('Created endorsement', { from: fromDid, to: toDid, score });\n return signedEndorsement;\n }\n\n /**\n * Verify endorsement signature\n */\n async verify(endorsement: Endorsement, verifyFn: VerifyFunction): Promise<boolean> {\n try {\n const { signature, ...endorsementWithoutSig } = endorsement;\n const data = new TextEncoder().encode(JSON.stringify(endorsementWithoutSig));\n const signatureBytes = Buffer.from(signature, 'hex');\n const publicKey = await this.getPublicKey(endorsement.from);\n\n return await verifyFn(signatureBytes, data, publicKey);\n } catch (error) {\n logger.error('Failed to verify endorsement', { error });\n return false;\n }\n }\n\n /**\n * Publish endorsement to local database\n */\n async publish(endorsement: Endorsement): Promise<void> {\n const key = `endorsement:${endorsement.to}:${endorsement.from}`;\n await this.db.put(key, endorsement);\n logger.info('Published endorsement', { from: endorsement.from, to: endorsement.to });\n }\n\n /**\n * Get all endorsements for an agent\n */\n async getEndorsements(agentDid: string): Promise<Endorsement[]> {\n const endorsements: Endorsement[] = [];\n const prefix = `endorsement:${agentDid}:`;\n\n try {\n for await (const [_, value] of this.db.iterator({\n gte: prefix,\n lte: prefix + '\\xff',\n })) {\n endorsements.push(value);\n }\n } catch (error) {\n logger.error('Failed to get endorsements', { agentDid, error });\n }\n\n return endorsements;\n }\n\n /**\n * Get endorsements given by an agent\n */\n async getEndorsementsBy(fromDid: string): Promise<Endorsement[]> {\n const endorsements: Endorsement[] = [];\n\n try {\n for await (const [_, value] of this.db.iterator()) {\n if (value.from === fromDid) {\n endorsements.push(value);\n }\n }\n } catch (error) {\n logger.error('Failed to get endorsements by agent', { fromDid, error });\n }\n\n return endorsements;\n }\n\n /**\n * Calculate average endorsement score\n */\n async getAverageScore(agentDid: string): Promise<number> {\n const endorsements = await this.getEndorsements(agentDid);\n\n if (endorsements.length === 0) {\n return 0;\n }\n\n const totalScore = endorsements.reduce((sum, e) => sum + e.score, 0);\n return totalScore / endorsements.length;\n }\n\n /**\n * Delete an endorsement\n */\n async deleteEndorsement(fromDid: string, toDid: string): Promise<void> {\n const key = `endorsement:${toDid}:${fromDid}`;\n await this.db.del(key);\n logger.info('Deleted endorsement', { from: fromDid, to: toDid });\n }\n}\n","/**\n * Sybil Defense Mechanisms\n *\n * Protects the network from Sybil attacks through:\n * - Entry cost (Hashcash challenges)\n * - Progressive trust (rate limiting for new agents)\n * - DHT region protection (prefer established peers)\n */\n\nimport { createLogger } from '../utils/logger.js';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { bytesToHex } from '@noble/hashes/utils';\n\nconst logger = createLogger('sybil-defense');\n\n/**\n * Hashcash Challenge\n */\nexport interface Challenge {\n did: string;\n difficulty: number; // Number of leading zero bits required\n nonce: string;\n timestamp: number;\n}\n\n/**\n * Challenge Solution\n */\nexport interface ChallengeSolution {\n challenge: Challenge;\n solution: string; // Nonce that produces required hash\n}\n\n/**\n * Rate Limit Record\n */\ninterface RateLimitRecord {\n did: string;\n requests: number[]; // Timestamps of requests\n firstSeen: number;\n}\n\n/**\n * Peer Trust Level\n */\nexport type PeerTrustLevel = 'new' | 'established' | 'trusted';\n\n/**\n * Sybil Defense Manager\n */\nexport class SybilDefense {\n private rateLimits = new Map<string, RateLimitRecord>();\n private peerFirstSeen = new Map<string, number>();\n private readonly NEW_AGENT_WINDOW = 24 * 60 * 60 * 1000; // 24 hours\n private readonly RATE_LIMIT_WINDOW = 60 * 60 * 1000; // 1 hour\n private readonly MAX_REQUESTS_NEW = 10; // Max requests per hour for new agents\n private readonly ESTABLISHED_THRESHOLD = 7 * 24 * 60 * 60 * 1000; // 7 days\n\n /**\n * Generate a Hashcash challenge for a new DID\n */\n generateChallenge(did: string, difficulty = 20): Challenge {\n const nonce = this.generateNonce();\n return {\n did,\n difficulty,\n nonce,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Verify a Hashcash challenge solution\n */\n verifyChallenge(solution: ChallengeSolution): boolean {\n const { challenge, solution: solutionNonce } = solution;\n\n // Check challenge is not too old (valid for 1 hour)\n if (Date.now() - challenge.timestamp > 60 * 60 * 1000) {\n logger.warn('Challenge expired', { did: challenge.did });\n return false;\n }\n\n // Compute hash\n const data = `${challenge.did}:${challenge.nonce}:${solutionNonce}`;\n const hash = sha256(new TextEncoder().encode(data));\n\n // Check leading zeros\n const leadingZeros = this.countLeadingZeroBits(hash);\n const valid = leadingZeros >= challenge.difficulty;\n\n if (valid) {\n logger.info('Challenge verified', { did: challenge.did, leadingZeros });\n } else {\n logger.warn('Challenge failed', { did: challenge.did, leadingZeros, required: challenge.difficulty });\n }\n\n return valid;\n }\n\n /**\n * Check if an agent should be rate limited\n */\n isRateLimited(did: string): boolean {\n const record = this.rateLimits.get(did);\n if (!record) {\n return false;\n }\n\n const now = Date.now();\n const agentAge = now - record.firstSeen;\n\n // Only rate limit new agents\n if (agentAge > this.NEW_AGENT_WINDOW) {\n return false;\n }\n\n // Count recent requests\n const recentRequests = record.requests.filter(\n t => now - t < this.RATE_LIMIT_WINDOW\n );\n\n return recentRequests.length >= this.MAX_REQUESTS_NEW;\n }\n\n /**\n * Record a request from an agent\n */\n recordRequest(did: string): void {\n const now = Date.now();\n let record = this.rateLimits.get(did);\n\n if (!record) {\n record = {\n did,\n requests: [],\n firstSeen: now,\n };\n this.rateLimits.set(did, record);\n }\n\n // Add request timestamp\n record.requests.push(now);\n\n // Clean up old requests\n record.requests = record.requests.filter(\n t => now - t < this.RATE_LIMIT_WINDOW\n );\n\n logger.debug('Recorded request', { did, count: record.requests.length });\n }\n\n /**\n * Get peer trust level based on age\n */\n getPeerTrustLevel(peerId: string): PeerTrustLevel {\n const firstSeen = this.peerFirstSeen.get(peerId);\n if (!firstSeen) {\n return 'new';\n }\n\n const age = Date.now() - firstSeen;\n\n if (age < this.NEW_AGENT_WINDOW) {\n return 'new';\n } else if (age < this.ESTABLISHED_THRESHOLD) {\n return 'established';\n } else {\n return 'trusted';\n }\n }\n\n /**\n * Record first seen time for a peer\n */\n recordPeerSeen(peerId: string): void {\n if (!this.peerFirstSeen.has(peerId)) {\n this.peerFirstSeen.set(peerId, Date.now());\n logger.debug('Recorded new peer', { peerId });\n }\n }\n\n /**\n * Clean up old records\n */\n cleanup(): void {\n const now = Date.now();\n const cutoff = now - this.NEW_AGENT_WINDOW;\n\n // Clean up rate limits for old agents\n for (const [did, record] of this.rateLimits.entries()) {\n if (record.firstSeen < cutoff) {\n this.rateLimits.delete(did);\n }\n }\n\n logger.info('Cleaned up Sybil defense records', {\n rateLimits: this.rateLimits.size,\n peers: this.peerFirstSeen.size,\n });\n }\n\n /**\n * Generate a random nonce\n */\n private generateNonce(): string {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n return bytesToHex(bytes);\n }\n\n /**\n * Count leading zero bits in a hash\n */\n private countLeadingZeroBits(hash: Uint8Array): number {\n let count = 0;\n for (const byte of hash) {\n if (byte === 0) {\n count += 8;\n } else {\n // Count leading zeros in this byte\n let b = byte;\n while ((b & 0x80) === 0) {\n count++;\n b <<= 1;\n }\n break;\n }\n }\n return count;\n }\n}\n","/**\n * Trust System - Main Export\n *\n * Combines all trust components into a unified interface\n */\n\nexport * from './trust-score.js';\nexport * from './interaction-history.js';\nexport * from './endorsement.js';\nexport * from './sybil-defense.js';\n\nimport { Level } from 'level';\nimport { TrustMetrics } from './trust-score.js';\nimport type { TrustScore, Interaction } from './trust-score.js';\nimport { InteractionHistory } from './interaction-history.js';\nimport { EndorsementManager } from './endorsement.js';\nimport type { Endorsement, SignFunction, VerifyFunction } from './endorsement.js';\nimport { SybilDefense } from './sybil-defense.js';\nimport { createLogger } from '../utils/logger.js';\n\nconst logger = createLogger('trust-system');\n\n/**\n * Trust System Configuration\n */\nexport interface TrustSystemConfig {\n dbPath: string;\n getPublicKey: (did: string) => Promise<Uint8Array>;\n}\n\n/**\n * Unified Trust System\n */\nexport class TrustSystem {\n private metrics: TrustMetrics;\n private history: InteractionHistory;\n private endorsements: EndorsementManager;\n private sybilDefense: SybilDefense;\n private trustCache = new Map<string, { score: TrustScore; timestamp: number }>();\n private readonly CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n\n constructor(config: TrustSystemConfig) {\n this.metrics = new TrustMetrics();\n this.history = new InteractionHistory(`${config.dbPath}/interactions`);\n\n const endorsementDb = new Level<string, Endorsement>(`${config.dbPath}/endorsements`, {\n valueEncoding: 'json',\n });\n this.endorsements = new EndorsementManager(endorsementDb, config.getPublicKey);\n this.sybilDefense = new SybilDefense();\n }\n\n /**\n * Initialize the trust system\n */\n async start(): Promise<void> {\n await this.history.open();\n logger.info('Trust system started');\n }\n\n /**\n * Shutdown the trust system\n */\n async stop(): Promise<void> {\n await this.history.close();\n logger.info('Trust system stopped');\n }\n\n /**\n * Record an interaction\n */\n async recordInteraction(interaction: Interaction): Promise<void> {\n await this.history.record(interaction);\n this.sybilDefense.recordRequest(interaction.agentDid);\n\n // Invalidate cache\n this.trustCache.delete(interaction.agentDid);\n }\n\n /**\n * Get trust score for an agent\n */\n async getTrustScore(agentDid: string): Promise<TrustScore> {\n // Check cache\n const cached = this.trustCache.get(agentDid);\n if (cached && Date.now() - cached.timestamp < this.CACHE_TTL) {\n return cached.score;\n }\n\n // Calculate fresh score\n const stats = await this.history.getStats(agentDid);\n const endorsementList = await this.endorsements.getEndorsements(agentDid);\n const uptime = 1.0; // TODO: Implement uptime tracking\n\n const score = this.metrics.calculateScore(stats, endorsementList.length, uptime);\n\n // Cache result\n this.trustCache.set(agentDid, { score, timestamp: Date.now() });\n\n return score;\n }\n\n /**\n * Create an endorsement\n */\n async endorse(\n fromDid: string,\n toDid: string,\n score: number,\n reason: string,\n signFn: SignFunction\n ): Promise<Endorsement> {\n const endorsement = await this.endorsements.endorse(fromDid, toDid, score, reason, signFn);\n await this.endorsements.publish(endorsement);\n\n // Invalidate cache\n this.trustCache.delete(toDid);\n\n return endorsement;\n }\n\n /**\n * Get endorsements for an agent\n */\n async getEndorsements(agentDid: string): Promise<Endorsement[]> {\n return this.endorsements.getEndorsements(agentDid);\n }\n\n /**\n * Verify an endorsement\n */\n async verifyEndorsement(endorsement: Endorsement, verifyFn: VerifyFunction): Promise<boolean> {\n return this.endorsements.verify(endorsement, verifyFn);\n }\n\n /**\n * Check if agent should be rate limited\n */\n isRateLimited(agentDid: string): boolean {\n return this.sybilDefense.isRateLimited(agentDid);\n }\n\n /**\n * Generate Sybil defense challenge\n */\n generateChallenge(did: string, difficulty?: number) {\n return this.sybilDefense.generateChallenge(did, difficulty);\n }\n\n /**\n * Verify Sybil defense challenge\n */\n verifyChallenge(solution: any): boolean {\n return this.sybilDefense.verifyChallenge(solution);\n }\n\n /**\n * Get peer trust level\n */\n getPeerTrustLevel(peerId: string) {\n return this.sybilDefense.getPeerTrustLevel(peerId);\n }\n\n /**\n * Record peer seen\n */\n recordPeerSeen(peerId: string): void {\n this.sybilDefense.recordPeerSeen(peerId);\n }\n\n /**\n * Get interaction history\n */\n async getHistory(agentDid: string, limit?: number): Promise<Interaction[]> {\n return this.history.getHistory(agentDid, limit);\n }\n\n /**\n * Clean up old data\n */\n async cleanup(): Promise<void> {\n await this.history.cleanup();\n this.sybilDefense.cleanup();\n this.trustCache.clear();\n logger.info('Trust system cleanup completed');\n }\n}\n\n/**\n * Create a trust system instance\n */\nexport function createTrustSystem(config: TrustSystemConfig): TrustSystem {\n return new TrustSystem(config);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@highway1/core",
3
- "version": "0.1.29",
3
+ "version": "0.1.30",
4
4
  "description": "Core protocol implementation for Clawiverse",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -102,15 +102,19 @@ export function createDHTOperations(libp2p: Libp2p): DHTOperations {
102
102
 
103
103
  // 2. For each capability, append this DID to /clawiverse/cap/<capability>
104
104
  // Skip capability indexing in slow networks - rely on local index and semantic search instead
105
- const caps: string[] = (card.capabilities ?? []).map((c: any) =>
106
- typeof c === 'string' ? c : c.name
107
- ).filter(Boolean);
105
+ const caps: string[] = (card.capabilities ?? []).flatMap((c: any) => {
106
+ if (typeof c === 'string') return [c];
107
+ return [c.name, c.id].filter(Boolean);
108
+ });
108
109
 
109
110
  // Always index under the special "all" key so name/description search works
110
111
  caps.push('__all__');
111
112
 
112
- // Only index __all__ key (most important), skip individual capabilities to speed up join
113
+ // Keep indexing lightweight, but preserve relay discovery path.
113
114
  const importantCaps = ['__all__'];
115
+ if (caps.some((cap) => capKey(cap) === 'relay')) {
116
+ importantCaps.push('relay');
117
+ }
114
118
  await Promise.all(importantCaps.map(async (cap) => {
115
119
  const capKeyStr = `/clawiverse/cap/${capKey(cap)}`;
116
120
  const capDHTKey = uint8ArrayFromString(capKeyStr);
@@ -4,9 +4,11 @@ import { multiaddr } from '@multiformats/multiaddr';
4
4
  import type { MessageEnvelope } from './envelope.js';
5
5
  import type { DHTOperations } from '../discovery/dht.js';
6
6
  import { encodeMessage, decodeMessage } from './codec.js';
7
- import { validateEnvelope } from './envelope.js';
7
+ import { validateEnvelope, verifyEnvelope } from './envelope.js';
8
8
  import { createLogger } from '../utils/logger.js';
9
9
  import { MessagingError } from '../utils/errors.js';
10
+ import { extractPublicKey } from '../identity/did.js';
11
+ import { verify } from '../identity/keys.js';
10
12
 
11
13
  const logger = createLogger('router');
12
14
 
@@ -117,6 +119,8 @@ export function createMessageRouter(
117
119
  }
118
120
  }
119
121
 
122
+ let lastError: unknown;
123
+
120
124
  // Fall back to relay: dial the circuit addr to establish connection, then newStream
121
125
  if (!stream) {
122
126
  const allRelayAddrs = [
@@ -125,7 +129,6 @@ export function createMessageRouter(
125
129
  ];
126
130
  // Deduplicate
127
131
  const uniqueRelayAddrs = [...new Set(allRelayAddrs)];
128
- let lastError: unknown;
129
132
  for (const addr of uniqueRelayAddrs) {
130
133
  try {
131
134
  // Step 1: establish the relay connection
@@ -140,7 +143,6 @@ export function createMessageRouter(
140
143
  lastError = relayErr;
141
144
  }
142
145
  }
143
- if (!stream) throw lastError ?? new MessagingError('All dial attempts failed');
144
146
  }
145
147
 
146
148
  // Last resort: query DHT for relay-capable peers
@@ -155,9 +157,13 @@ export function createMessageRouter(
155
157
  break;
156
158
  } catch (e) {
157
159
  logger.warn('DHT relay failed', { relayAddr, error: (e as Error).message });
160
+ lastError = e;
158
161
  }
159
162
  }
160
- if (!stream) throw new MessagingError('All dial attempts failed (including DHT-discovered relays)');
163
+ }
164
+
165
+ if (!stream) {
166
+ throw lastError ?? new MessagingError('All dial attempts failed (including DHT-discovered relays)');
161
167
  }
162
168
 
163
169
  const encoded = encodeMessage(envelope);
@@ -262,7 +268,7 @@ async function handleIncomingStream(
262
268
  stream: any,
263
269
  handlers: Map<string, MessageHandler>,
264
270
  catchAllHandler: MessageHandler | undefined,
265
- _verifyFn: (signature: Uint8Array, data: Uint8Array) => Promise<boolean>
271
+ verifyFn: (signature: Uint8Array, data: Uint8Array) => Promise<boolean>
266
272
  ): Promise<void> {
267
273
  try {
268
274
  const chunks: Uint8Array[] = [];
@@ -286,9 +292,40 @@ async function handleIncomingStream(
286
292
  return;
287
293
  }
288
294
 
289
- // Skip signature verification for now both sides use auto-generated libp2p keys
290
- // which differ from the Ed25519 DID keys. Full verification comes in Phase 2 when
291
- // DID keys and libp2p keys are unified.
295
+ // Verify signature against sender DID embedded public key.
296
+ const isValidSignature = await verifyEnvelope(envelope, async (signature, data) => {
297
+ const senderPublicKey = extractPublicKey(envelope.from);
298
+ return verify(signature, data, senderPublicKey);
299
+ });
300
+ if (!isValidSignature) {
301
+ logger.warn('Received message with invalid signature', {
302
+ id: envelope.id,
303
+ from: envelope.from,
304
+ });
305
+ return;
306
+ }
307
+
308
+ // Optional caller-supplied verification hook (e.g. policy checks).
309
+ try {
310
+ const { signature, ...envelopeWithoutSig } = envelope;
311
+ const dataBytes = new TextEncoder().encode(JSON.stringify(envelopeWithoutSig));
312
+ const signatureBytes = Buffer.from(signature, 'hex');
313
+ const hookValid = await verifyFn(signatureBytes, dataBytes);
314
+ if (!hookValid) {
315
+ logger.warn('Message rejected by custom verifier', {
316
+ id: envelope.id,
317
+ from: envelope.from,
318
+ });
319
+ return;
320
+ }
321
+ } catch (error) {
322
+ logger.warn('Custom verification hook failed', {
323
+ id: envelope.id,
324
+ from: envelope.from,
325
+ error: (error as Error).message,
326
+ });
327
+ return;
328
+ }
292
329
 
293
330
  logger.info('Received message', {
294
331
  id: envelope.id,