@agentvault/agentvault 0.19.25 → 0.19.27

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/channel.d.ts CHANGED
@@ -46,6 +46,10 @@ export declare class SecureChannel extends EventEmitter {
46
46
  /** Dedup buffer for A2A message IDs (prevents double-delivery via direct + Redis) */
47
47
  private _a2aSeenMessageIds;
48
48
  private static readonly A2A_SEEN_MAX;
49
+ /** Whether A2A channel sync has completed after (re)connect */
50
+ private _a2aSyncComplete;
51
+ /** Messages buffered while A2A sync is in progress */
52
+ private _a2aBufferedMessages;
49
53
  /** Dedup buffer for regular message IDs (prevents double-decrypt via direct WS + Redis pub/sub) */
50
54
  private _seenMessageIds;
51
55
  private static readonly SEEN_MSG_MAX;
@@ -364,6 +368,11 @@ export declare class SecureChannel extends EventEmitter {
364
368
  * Sync missed messages across ALL sessions.
365
369
  * For each conversation, fetches messages since last sync and decrypts.
366
370
  */
371
+ /**
372
+ * Handle an incoming A2A message (extracted from WS handler for reuse during buffer replay).
373
+ * Includes dedup, encrypted path (with on-demand key exchange), and legacy plaintext path.
374
+ */
375
+ private _handleA2AMessage;
367
376
  /**
368
377
  * Paginated sync: fetch missed messages in pages of 200, up to 5 pages (1000 messages).
369
378
  * Tracks message IDs in _syncMessageIds to prevent duplicate processing from concurrent WS messages.
@@ -1 +1 @@
1
- {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQ3C,OAAO,EAWL,iBAAiB,EAClB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EACV,mBAAmB,EACnB,YAAY,EAKZ,YAAY,EACZ,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,cAAc,EACd,oBAAoB,EACpB,QAAQ,EAER,UAAU,EAEV,cAAc,EACd,eAAe,EACf,eAAe,EACf,eAAe,EACf,UAAU,EAGX,MAAM,YAAY,CAAC;AAmEpB,qBAAa,aAAc,SAAQ,YAAY;IAiFjC,OAAO,CAAC,MAAM;IAhF1B,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,sBAAsB,CAAc;IAC5C,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,SAAS,CAGH;IACd,OAAO,CAAC,GAAG,CAA0B;IACrC,OAAO,CAAC,UAAU,CAA8C;IAChE,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,eAAe,CAA8C;IACrE,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,UAAU,CAA8D;IAChF,OAAO,CAAC,kBAAkB,CAA+C;IACzE,OAAO,CAAC,eAAe,CAA+C;IACtE,OAAO,CAAC,kBAAkB,CAAwC;IAClE,OAAO,CAAC,yBAAyB,CAAa;IAC9C,OAAO,CAAC,kBAAkB,CAA+C;IACzE,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,oBAAoB,CAAuB;IACnD,OAAO,CAAC,mBAAmB,CAA+C;IAC1E,OAAO,CAAC,iBAAiB,CAA+C;IACxE,OAAO,CAAC,eAAe,CAA4B;IAEnD,iEAAiE;IACjE,OAAO,CAAC,gBAAgB,CAA0C;IAClE,kEAAkE;IAClE,OAAO,CAAC,gBAAgB,CAA0C;IAElE,oFAAoF;IACpF,OAAO,CAAC,gBAAgB,CAAyB;IAEjD,0GAA0G;IAC1G,OAAO,CAAC,gBAAgB,CAAiF;IACzG,qFAAqF;IACrF,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAO;IAC3C,+DAA+D;IAC/D,OAAO,CAAC,gBAAgB,CAAS;IACjC,sDAAsD;IACtD,OAAO,CAAC,oBAAoB,CAA4B;IACxD,mGAAmG;IACnG,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAO;IAC3C,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,kBAAkB,CAAkC;IAE5D,oFAAoF;IACpF,OAAO,CAAC,oBAAoB,CAAqB;IAEjD,mGAAmG;IACnG,OAAO,CAAC,kBAAkB,CAAqB;IAE/C,mFAAmF;IACnF,OAAO,CAAC,kBAAkB,CAAkC;IAE5D,sDAAsD;IACtD,OAAO,CAAC,kBAAkB,CAA8C;IACxE,OAAO,CAAC,oBAAoB,CAAS;IAIrC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAU;IAClD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAU;IACpD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAAU;IAC3D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAU;gBAEnC,MAAM,EAAE,mBAAmB;IAI/C,IAAI,KAAK,IAAI,YAAY,CAExB;IAED,IAAI,QAAQ,IAAI,MAAM,GAAG,IAAI,CAE5B;IAED,IAAI,WAAW,IAAI,MAAM,GAAG,IAAI,CAE/B;IAED,iEAAiE;IACjE,IAAI,cAAc,IAAI,MAAM,GAAG,IAAI,CAElC;IAED,2CAA2C;IAC3C,IAAI,eAAe,IAAI,MAAM,EAAE,CAE9B;IAED,6CAA6C;IAC7C,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,mFAAmF;IACnF,IAAI,iBAAiB,IAAI,MAAM,GAAG,SAAS,CAE1C;IAED,mFAAmF;IACnF,IAAI,OAAO,IAAI,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAGrD;IAED,gEAAgE;IAChE,IAAI,gBAAgB,IAAI,MAAM,EAAE,CAG/B;IAED,kFAAkF;IAClF,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAKtD,kFAAkF;IAClF,IAAI,SAAS,IAAI,iBAAiB,GAAG,IAAI,CAExC;IAED;;OAEG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;IAI7G,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAoF5B;;OAEG;YACW,eAAe;IAiB7B;;OAEG;IACH,OAAO,CAAC,cAAc;IAuBtB;;;OAGG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,SAAK,GAAG,YAAY,EAAE;IAMhE;;;OAGG;IACG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IA0HnE;;;OAGG;IACH,UAAU,IAAI,IAAI;IAYlB;;;OAGG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAazD;;;;OAIG;IACG,mBAAmB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IA6BpE;;;;;;OAMG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAuClF;;;OAGG;IACG,QAAQ,CAAC,QAAQ,EAAE;QACvB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,cAAc,EAAE,CAAC;QAC1B,aAAa,EAAE,oBAAoB,EAAE,CAAC;QACtC,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,GAAG,OAAO,CAAC,IAAI,CAAC;IAuJjB;;;OAGG;IACG,UAAU,CACd,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE;QACL,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACpC,GACA,OAAO,CAAC,IAAI,CAAC;IAyHhB;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB9C;;OAEG;IACH,QAAQ,IAAI,QAAQ,EAAE;IAYtB,cAAc,CACZ,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,eAAe,GACpC,IAAI;IAUD,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB9B,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBlD,YAAY,CAAC,QAAQ,EAAE;QAC3B,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC,IAAI,CAAC;IA2CX,sBAAsB,CAAC,YAAY,EAAE;QACzC,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;QAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBX,4BAA4B,CAChC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;QAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,GACA,OAAO,CAAC,IAAI,CAAC;IA0BhB;;;OAGG;IACG,OAAO,CACX,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,eAAe,EACxB,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,eAAe,CAAC;IAwK3B;;OAEG;IACH,WAAW,IAAI,UAAU,EAAE;IAqC3B,OAAO,CAAC,cAAc;IAoBtB,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAKzC,IAAI,UAAU,IAAI,MAAM,GAAG,IAAI,CAE9B;IAED,IAAI,SAAS,IAAI,MAAM,GAAG,IAAI,CAE7B;IAED,IAAI,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAEvC;IAEK,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBxC,sBAAsB,IAAI,IAAI;IAS9B,qBAAqB,IAAI,IAAI;IAOvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAsC3B,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA0GnC,OAAO,CAAC,eAAe;IAOvB;;;OAGG;IACH,YAAY,CAAC,SAAS,EAAE,OAAO,iBAAiB,EAAE,mBAAmB,GAAG,IAAI;IAI5E,uCAAuC;IACvC,IAAI,SAAS,IAAI,OAAO,iBAAiB,EAAE,mBAAmB,GAAG,IAAI,CAEpE;IAID;;;OAGG;IACG,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;IAsC1F;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAiCpF;;;OAGG;IACG,iBAAiB,CAAC,mBAAmB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA0CrE;;;;;;;;;;OAUG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA6HpG;;;OAGG;IACG,eAAe,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YAkFhC,OAAO;IAgDrB,OAAO,CAAC,KAAK;YAsCC,SAAS;IAyIvB,OAAO,CAAC,QAAQ;IAguBhB;;;;OAIG;YACW,sBAAsB;IAwRpC;;;OAGG;YACW,6BAA6B;IA6C3C;;;OAGG;YACW,iBAAiB;IAwD/B;;;OAGG;IACG,kBAAkB,CACtB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAC7B,OAAO,CAAC,IAAI,CAAC;IA8ChB;;;OAGG;YACW,oBAAoB;IAkDlC;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAqC5B;;;OAGG;YACW,oBAAoB;IAyBlC;;;OAGG;YACW,uBAAuB;IAkCrC;;;;OAIG;YACW,mBAAmB;IAuEjC;;;;OAIG;YACW,oBAAoB;IA8ElC;;;OAGG;YACW,kBAAkB;IAgPhC;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAsEhC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAiB1B,mDAAmD;IACnD,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,uBAAuB,EAAE,gBAAgB,GAAG,SAAS;IAIxG,mFAAmF;IACnF,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,uBAAuB,EAAE,gBAAgB,EAAE;IAIlF,uEAAuE;IACvE,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAIxD,wDAAwD;IACxD,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO;IAInD,6DAA6D;IAC7D,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI1C;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAiBlC;;;;OAIG;YACW,oBAAoB;IAuClC;;;OAGG;YACW,4BAA4B;IA2F1C;;OAEG;YACW,oBAAoB;IAkHlC;;;OAGG;IACH;;;OAGG;YACW,iBAAiB;IAqI/B;;;OAGG;YACW,mBAAmB;IA8KjC,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,UAAU;YAMJ,mBAAmB;IAmCjC,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,kBAAkB;IAe1B,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,gBAAgB;YAOV,qBAAqB;IAuCnC,OAAO,CAAC,kBAAkB;IA4C1B,OAAO,CAAC,SAAS;IAejB,OAAO,CAAC,kBAAkB;IA2H1B,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,YAAY;IAKpB;;;OAGG;YACW,aAAa;IAyB3B;;;OAGG;IACH,OAAO,CAAC,qBAAqB;CAqB9B"}
package/dist/cli.js CHANGED
@@ -47084,6 +47084,10 @@ var init_channel = __esm({
47084
47084
  /** Dedup buffer for A2A message IDs (prevents double-delivery via direct + Redis) */
47085
47085
  _a2aSeenMessageIds = /* @__PURE__ */ new Set();
47086
47086
  static A2A_SEEN_MAX = 500;
47087
+ /** Whether A2A channel sync has completed after (re)connect */
47088
+ _a2aSyncComplete = false;
47089
+ /** Messages buffered while A2A sync is in progress */
47090
+ _a2aBufferedMessages = [];
47087
47091
  /** Dedup buffer for regular message IDs (prevents double-decrypt via direct WS + Redis pub/sub) */
47088
47092
  _seenMessageIds = /* @__PURE__ */ new Set();
47089
47093
  static SEEN_MSG_MAX = 500;
@@ -48735,6 +48739,8 @@ var init_channel = __esm({
48735
48739
  ws.on("open", async () => {
48736
48740
  try {
48737
48741
  this._reconnectAttempt = 0;
48742
+ this._a2aSyncComplete = false;
48743
+ this._a2aBufferedMessages = [];
48738
48744
  this._lastWsOpenTime = Date.now();
48739
48745
  this._startPing(ws);
48740
48746
  this._startWakeDetector();
@@ -48780,8 +48786,21 @@ var init_channel = __esm({
48780
48786
  }, 3e3);
48781
48787
  }
48782
48788
  }
48789
+ this._a2aSyncComplete = true;
48790
+ if (this._a2aBufferedMessages.length > 0) {
48791
+ console.log(`[SecureChannel] Replaying ${this._a2aBufferedMessages.length} buffered A2A message(s)`);
48792
+ const buffered = this._a2aBufferedMessages.splice(0);
48793
+ for (const msg of buffered) {
48794
+ try {
48795
+ await this._handleA2AMessage(msg.data);
48796
+ } catch (err) {
48797
+ console.warn("[SecureChannel] Failed to replay buffered A2A message:", err);
48798
+ }
48799
+ }
48800
+ }
48783
48801
  } catch (err) {
48784
48802
  console.warn("[SecureChannel] A2A channel sync failed (non-fatal):", err);
48803
+ this._a2aSyncComplete = true;
48785
48804
  }
48786
48805
  if (!this._telemetryReporter && this._persisted?.deviceJwt && this._persisted?.hubId) {
48787
48806
  this._telemetryReporter = new TelemetryReporter({
@@ -49272,99 +49291,13 @@ var init_channel = __esm({
49272
49291
  this.emit("error", new Error(`Server: ${detail}`));
49273
49292
  }
49274
49293
  if (data.event === "a2a_message") {
49275
- const msgData = data.data || data;
49276
- const a2aMsgId = msgData.message_id;
49277
- if (a2aMsgId && this._a2aSeenMessageIds.has(a2aMsgId)) {
49294
+ if (!this._a2aSyncComplete) {
49295
+ const msgId = (data.data || data).message_id;
49296
+ console.log(`[SecureChannel] Buffering A2A message (sync not complete): ${msgId?.slice(0, 8)}`);
49297
+ this._a2aBufferedMessages.push({ data });
49278
49298
  return;
49279
49299
  }
49280
- if (a2aMsgId) {
49281
- this._a2aSeenMessageIds.add(a2aMsgId);
49282
- if (this._a2aSeenMessageIds.size > _SecureChannel.A2A_SEEN_MAX) {
49283
- const first = this._a2aSeenMessageIds.values().next().value;
49284
- if (first) this._a2aSeenMessageIds.delete(first);
49285
- }
49286
- }
49287
- if (msgData.ciphertext && msgData.header_blob) {
49288
- const channelId = msgData.channel_id || "";
49289
- const channelEntry = this._persisted?.a2aChannels?.[channelId];
49290
- if (channelEntry?.session?.ratchetState) {
49291
- try {
49292
- const headerJson = Buffer.from(msgData.header_blob, "hex").toString("utf-8");
49293
- const headerObj = JSON.parse(headerJson);
49294
- const encryptedMessage = {
49295
- header: {
49296
- dhPublicKey: hexToBytes(headerObj.dhPublicKey),
49297
- previousChainLength: headerObj.previousChainLength,
49298
- messageNumber: headerObj.messageNumber
49299
- },
49300
- headerSignature: hexToBytes(msgData.header_signature),
49301
- ciphertext: hexToBytes(msgData.ciphertext),
49302
- nonce: hexToBytes(msgData.nonce)
49303
- };
49304
- const ratchet = DoubleRatchet.deserialize(channelEntry.session.ratchetState);
49305
- const ratchetSnapshot = channelEntry.session.ratchetState;
49306
- let a2aPlaintext;
49307
- try {
49308
- a2aPlaintext = ratchet.decrypt(encryptedMessage);
49309
- } catch (decryptErr) {
49310
- console.error(`[SecureChannel] A2A decrypt failed \u2014 restoring ratchet state:`, decryptErr);
49311
- channelEntry.session.ratchetState = ratchetSnapshot;
49312
- return;
49313
- }
49314
- channelEntry.session.ratchetState = ratchet.serialize();
49315
- if (channelEntry.role === "responder" && !channelEntry.session.activated) {
49316
- channelEntry.session.activated = true;
49317
- console.log(
49318
- `[SecureChannel] A2A responder ratchet activated for ${channelId.slice(0, 8)}...`
49319
- );
49320
- const queued = this._a2aPendingQueue[channelId];
49321
- if (queued && queued.length > 0) {
49322
- delete this._a2aPendingQueue[channelId];
49323
- console.log(`[SecureChannel] Flushing ${queued.length} queued A2A message(s)`);
49324
- await this._persistState();
49325
- for (const pending of queued) {
49326
- try {
49327
- await this.sendToAgent(channelEntry.hubAddress, pending.text, pending.opts);
49328
- } catch (flushErr) {
49329
- console.error("[SecureChannel] Failed to flush queued A2A message:", flushErr);
49330
- }
49331
- }
49332
- }
49333
- }
49334
- await this._persistState();
49335
- const a2aMsg = {
49336
- text: a2aPlaintext,
49337
- fromHubAddress: msgData.from_hub_address || msgData.hub_address || "",
49338
- channelId,
49339
- conversationId: msgData.conversation_id || "",
49340
- parentSpanId: msgData.parent_span_id,
49341
- timestamp: msgData.timestamp || (/* @__PURE__ */ new Date()).toISOString()
49342
- };
49343
- this.emit("a2a_message", a2aMsg);
49344
- if (this.config.onA2AMessage) {
49345
- this.config.onA2AMessage(a2aMsg);
49346
- }
49347
- } catch (decryptErr) {
49348
- console.error(`[SecureChannel] A2A decrypt failed for channel ${channelId.slice(0, 8)}...:`, decryptErr);
49349
- this.emit("error", decryptErr);
49350
- }
49351
- } else {
49352
- console.warn(`[SecureChannel] Received encrypted A2A message but no session for channel ${channelId}`);
49353
- }
49354
- } else {
49355
- const a2aMsg = {
49356
- text: msgData.plaintext || msgData.text,
49357
- fromHubAddress: msgData.from_hub_address || msgData.hub_address || "",
49358
- channelId: msgData.channel_id || "",
49359
- conversationId: msgData.conversation_id || "",
49360
- parentSpanId: msgData.parent_span_id,
49361
- timestamp: msgData.timestamp || (/* @__PURE__ */ new Date()).toISOString()
49362
- };
49363
- this.emit("a2a_message", a2aMsg);
49364
- if (this.config.onA2AMessage) {
49365
- this.config.onA2AMessage(a2aMsg);
49366
- }
49367
- }
49300
+ await this._handleA2AMessage(data);
49368
49301
  }
49369
49302
  } catch (err) {
49370
49303
  this.emit("error", err);
@@ -50443,6 +50376,123 @@ ${messageText}`;
50443
50376
  * Sync missed messages across ALL sessions.
50444
50377
  * For each conversation, fetches messages since last sync and decrypts.
50445
50378
  */
50379
+ /**
50380
+ * Handle an incoming A2A message (extracted from WS handler for reuse during buffer replay).
50381
+ * Includes dedup, encrypted path (with on-demand key exchange), and legacy plaintext path.
50382
+ */
50383
+ async _handleA2AMessage(data) {
50384
+ const msgData = data.data || data;
50385
+ const a2aMsgId = msgData.message_id;
50386
+ if (a2aMsgId && this._a2aSeenMessageIds.has(a2aMsgId)) {
50387
+ return;
50388
+ }
50389
+ if (a2aMsgId) {
50390
+ this._a2aSeenMessageIds.add(a2aMsgId);
50391
+ if (this._a2aSeenMessageIds.size > _SecureChannel.A2A_SEEN_MAX) {
50392
+ const first = this._a2aSeenMessageIds.values().next().value;
50393
+ if (first) this._a2aSeenMessageIds.delete(first);
50394
+ }
50395
+ }
50396
+ if (msgData.ciphertext && msgData.header_blob) {
50397
+ const channelId = msgData.channel_id || "";
50398
+ const channelEntry = this._persisted?.a2aChannels?.[channelId];
50399
+ if (channelEntry?.session?.ratchetState) {
50400
+ try {
50401
+ const headerJson = Buffer.from(msgData.header_blob, "hex").toString("utf-8");
50402
+ const headerObj = JSON.parse(headerJson);
50403
+ const encryptedMessage = {
50404
+ header: {
50405
+ dhPublicKey: hexToBytes(headerObj.dhPublicKey),
50406
+ previousChainLength: headerObj.previousChainLength,
50407
+ messageNumber: headerObj.messageNumber
50408
+ },
50409
+ headerSignature: msgData.header_signature ? hexToBytes(msgData.header_signature) : new Uint8Array(64),
50410
+ ciphertext: hexToBytes(msgData.ciphertext),
50411
+ nonce: hexToBytes(msgData.nonce)
50412
+ };
50413
+ const ratchet = DoubleRatchet.deserialize(channelEntry.session.ratchetState);
50414
+ const ratchetSnapshot = channelEntry.session.ratchetState;
50415
+ let a2aPlaintext;
50416
+ try {
50417
+ a2aPlaintext = ratchet.decrypt(encryptedMessage);
50418
+ } catch (decryptErr) {
50419
+ console.error(`[SecureChannel] A2A decrypt failed \u2014 restoring ratchet state:`, decryptErr);
50420
+ channelEntry.session.ratchetState = ratchetSnapshot;
50421
+ return;
50422
+ }
50423
+ channelEntry.session.ratchetState = ratchet.serialize();
50424
+ if (channelEntry.role === "responder" && !channelEntry.session.activated) {
50425
+ channelEntry.session.activated = true;
50426
+ console.log(
50427
+ `[SecureChannel] A2A responder ratchet activated for ${channelId.slice(0, 8)}...`
50428
+ );
50429
+ const queued = this._a2aPendingQueue[channelId];
50430
+ if (queued && queued.length > 0) {
50431
+ delete this._a2aPendingQueue[channelId];
50432
+ console.log(`[SecureChannel] Flushing ${queued.length} queued A2A message(s)`);
50433
+ await this._persistState();
50434
+ for (const pending of queued) {
50435
+ try {
50436
+ await this.sendToAgent(channelEntry.hubAddress, pending.text, pending.opts);
50437
+ } catch (flushErr) {
50438
+ console.error("[SecureChannel] Failed to flush queued A2A message:", flushErr);
50439
+ }
50440
+ }
50441
+ }
50442
+ }
50443
+ await this._persistState();
50444
+ const a2aMsg = {
50445
+ text: a2aPlaintext,
50446
+ fromHubAddress: msgData.from_hub_address || msgData.hub_address || "",
50447
+ channelId,
50448
+ conversationId: msgData.conversation_id || "",
50449
+ parentSpanId: msgData.parent_span_id,
50450
+ timestamp: msgData.timestamp || (/* @__PURE__ */ new Date()).toISOString()
50451
+ };
50452
+ this.emit("a2a_message", a2aMsg);
50453
+ if (this.config.onA2AMessage) {
50454
+ this.config.onA2AMessage(a2aMsg);
50455
+ }
50456
+ } catch (decryptErr) {
50457
+ console.error(`[SecureChannel] A2A decrypt failed for channel ${channelId.slice(0, 8)}...:`, decryptErr);
50458
+ this.emit("error", decryptErr);
50459
+ }
50460
+ } else {
50461
+ console.warn(
50462
+ `[SecureChannel] Received encrypted A2A but no session for ${channelId.slice(0, 8)} \u2014 triggering key exchange`
50463
+ );
50464
+ const entry = this._persisted?.a2aChannels?.[channelId];
50465
+ if (entry && !entry.pendingEphemeralPrivateKey && !entry.session) {
50466
+ try {
50467
+ const a2aEphemeral = await generateEphemeralKeypair();
50468
+ const ephPubHex = bytesToHex(a2aEphemeral.publicKey);
50469
+ entry.pendingEphemeralPrivateKey = bytesToHex(a2aEphemeral.privateKey);
50470
+ this._ws?.send(JSON.stringify({
50471
+ event: "a2a_key_exchange",
50472
+ data: { channel_id: channelId, ephemeral_key: ephPubHex }
50473
+ }));
50474
+ await this._persistState();
50475
+ console.log(`[SecureChannel] On-demand A2A key exchange for ${channelId.slice(0, 8)}`);
50476
+ } catch (kxErr) {
50477
+ console.warn(`[SecureChannel] On-demand key exchange failed:`, kxErr);
50478
+ }
50479
+ }
50480
+ }
50481
+ } else {
50482
+ const a2aMsg = {
50483
+ text: msgData.plaintext || msgData.text,
50484
+ fromHubAddress: msgData.from_hub_address || msgData.hub_address || "",
50485
+ channelId: msgData.channel_id || "",
50486
+ conversationId: msgData.conversation_id || "",
50487
+ parentSpanId: msgData.parent_span_id,
50488
+ timestamp: msgData.timestamp || (/* @__PURE__ */ new Date()).toISOString()
50489
+ };
50490
+ this.emit("a2a_message", a2aMsg);
50491
+ if (this.config.onA2AMessage) {
50492
+ this.config.onA2AMessage(a2aMsg);
50493
+ }
50494
+ }
50495
+ }
50446
50496
  /**
50447
50497
  * Paginated sync: fetch missed messages in pages of 200, up to 5 pages (1000 messages).
50448
50498
  * Tracks message IDs in _syncMessageIds to prevent duplicate processing from concurrent WS messages.