@agentvault/agentvault 0.9.0 → 0.9.1

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.
@@ -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":"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"}
package/dist/cli.js CHANGED
@@ -45522,9 +45522,18 @@ var init_channel = __esm({
45522
45522
  scanStatus = scanResult.status;
45523
45523
  }
45524
45524
  this._appendHistory("agent", plaintext, topicId);
45525
+ const roomConvIds = /* @__PURE__ */ new Set();
45526
+ if (this._persisted?.rooms) {
45527
+ for (const room of Object.values(this._persisted.rooms)) {
45528
+ for (const cid of room.conversationIds) {
45529
+ roomConvIds.add(cid);
45530
+ }
45531
+ }
45532
+ }
45525
45533
  const messageGroupId = randomUUID();
45526
45534
  for (const [convId, session] of this._sessions) {
45527
45535
  if (!session.activated) continue;
45536
+ if (roomConvIds.has(convId)) continue;
45528
45537
  const encrypted = session.ratchet.encrypt(plaintext);
45529
45538
  const transport = encryptedMessageToTransport(encrypted);
45530
45539
  const msg = {
@@ -45670,6 +45679,10 @@ var init_channel = __esm({
45670
45679
  if (conv.participantA !== myDeviceId && conv.participantB !== myDeviceId) {
45671
45680
  continue;
45672
45681
  }
45682
+ if (this._sessions.has(conv.id)) {
45683
+ conversationIds.push(conv.id);
45684
+ continue;
45685
+ }
45673
45686
  const otherDeviceId = conv.participantA === myDeviceId ? conv.participantB : conv.participantA;
45674
45687
  const otherMember = roomData.members.find((m2) => m2.deviceId === otherDeviceId);
45675
45688
  if (!otherMember?.identityPublicKey) {
@@ -45679,13 +45692,12 @@ var init_channel = __esm({
45679
45692
  continue;
45680
45693
  }
45681
45694
  const isInitiator = myDeviceId < otherDeviceId;
45695
+ const theirEphKey = otherMember.ephemeralPublicKey ?? otherMember.identityPublicKey;
45682
45696
  const sharedSecret = performX3DH({
45683
45697
  myIdentityPrivate: hexToBytes(identity.privateKey),
45684
45698
  myEphemeralPrivate: hexToBytes(ephemeral.privateKey),
45685
45699
  theirIdentityPublic: hexToBytes(otherMember.identityPublicKey),
45686
- theirEphemeralPublic: hexToBytes(
45687
- otherMember.ephemeralPublicKey ?? otherMember.identityPublicKey
45688
- ),
45700
+ theirEphemeralPublic: hexToBytes(theirEphKey),
45689
45701
  isInitiator
45690
45702
  });
45691
45703
  const ratchet = isInitiator ? DoubleRatchet.initSender(sharedSecret, {
@@ -45757,9 +45769,11 @@ var init_channel = __esm({
45757
45769
  this._ws.send(
45758
45770
  JSON.stringify({
45759
45771
  event: "room_message",
45760
- room_id: roomId,
45761
- recipients,
45762
- message_type: messageType
45772
+ data: {
45773
+ room_id: roomId,
45774
+ recipients,
45775
+ message_type: messageType
45776
+ }
45763
45777
  })
45764
45778
  );
45765
45779
  } else {
@@ -46185,6 +46199,23 @@ var init_channel = __esm({
46185
46199
  if (this._persisted.hubAddress) {
46186
46200
  payload2.hub_address = this._persisted.hubAddress;
46187
46201
  }
46202
+ if (channelEntry.observerSession?.ratchetState) {
46203
+ try {
46204
+ const obsRatchet = DoubleRatchet.deserialize(channelEntry.observerSession.ratchetState);
46205
+ const obsEncrypted = obsRatchet.encrypt(text);
46206
+ const obsHeaderObj = {
46207
+ dhPublicKey: bytesToHex(obsEncrypted.header.dhPublicKey),
46208
+ previousChainLength: obsEncrypted.header.previousChainLength,
46209
+ messageNumber: obsEncrypted.header.messageNumber
46210
+ };
46211
+ payload2.observer_header_blob = Buffer.from(JSON.stringify(obsHeaderObj)).toString("hex");
46212
+ payload2.observer_ciphertext = bytesToHex(obsEncrypted.ciphertext);
46213
+ payload2.observer_nonce = bytesToHex(obsEncrypted.nonce);
46214
+ channelEntry.observerSession.ratchetState = obsRatchet.serialize();
46215
+ } catch (obsErr) {
46216
+ console.error("[SecureChannel] Observer encryption failed (sending without observer copy):", obsErr);
46217
+ }
46218
+ }
46188
46219
  channelEntry.session.ratchetState = ratchet.serialize();
46189
46220
  await this._persistState();
46190
46221
  this._ws.send(
@@ -46487,7 +46518,7 @@ var init_channel = __esm({
46487
46518
  const d2 = data.data;
46488
46519
  this.joinRoom({
46489
46520
  roomId: d2.room_id,
46490
- name: d2.name,
46521
+ name: d2.room_name ?? d2.name ?? "Room",
46491
46522
  members: (d2.members || []).map((m2) => ({
46492
46523
  deviceId: m2.device_id,
46493
46524
  entityType: m2.entity_type,
@@ -46640,6 +46671,74 @@ var init_channel = __esm({
46640
46671
  }
46641
46672
  this.emit("a2a_channel_activated", actData);
46642
46673
  }
46674
+ if (data.event === "a2a_observer_enabled") {
46675
+ const obsData = data.data || data;
46676
+ const obsChannelId = obsData.channel_id;
46677
+ const obsChannelEntry = this._persisted?.a2aChannels?.[obsChannelId];
46678
+ if (obsChannelEntry && this._persisted && this._ws) {
46679
+ try {
46680
+ const obsEphemeral = await generateEphemeralKeypair();
46681
+ const obsEphPubHex = bytesToHex(obsEphemeral.publicKey);
46682
+ const obsEphPrivHex = bytesToHex(obsEphemeral.privateKey);
46683
+ obsChannelEntry.pendingObserverEphemeralPrivateKey = obsEphPrivHex;
46684
+ await this._persistState();
46685
+ this._ws.send(
46686
+ JSON.stringify({
46687
+ event: "a2a_observer_key_submit",
46688
+ data: {
46689
+ channel_id: obsChannelId,
46690
+ ephemeral_key: obsEphPubHex,
46691
+ side: obsChannelEntry.role || "initiator"
46692
+ }
46693
+ })
46694
+ );
46695
+ console.log(
46696
+ `[SecureChannel] Observer key submitted for channel ${obsChannelId.slice(0, 8)}... (side=${obsChannelEntry.role})`
46697
+ );
46698
+ } catch (err) {
46699
+ console.error("[SecureChannel] Observer key submission failed:", err);
46700
+ }
46701
+ }
46702
+ }
46703
+ if (data.event === "a2a_observer_key_accepted") {
46704
+ const obsAccData = data.data || data;
46705
+ const obsAccChannelId = obsAccData.channel_id;
46706
+ const observerIdentityHex = obsAccData.observer_identity_key;
46707
+ const obsAccSide = obsAccData.side;
46708
+ const obsAccEntry = this._persisted?.a2aChannels?.[obsAccChannelId];
46709
+ if (obsAccEntry && obsAccEntry.pendingObserverEphemeralPrivateKey && this._persisted) {
46710
+ try {
46711
+ const myIdentityPrivate = hexToBytes(this._persisted.identityKeypair.privateKey);
46712
+ const myIdentityPublic = hexToBytes(this._persisted.identityKeypair.publicKey);
46713
+ const myObsEphemeralPrivate = hexToBytes(obsAccEntry.pendingObserverEphemeralPrivateKey);
46714
+ const ownerIdentityPublic = hexToBytes(observerIdentityHex);
46715
+ const obsSharedSecret = performX3DH({
46716
+ myIdentityPrivate,
46717
+ myEphemeralPrivate: myObsEphemeralPrivate,
46718
+ theirIdentityPublic: ownerIdentityPublic,
46719
+ theirEphemeralPublic: ownerIdentityPublic,
46720
+ // owner uses identity as ephemeral
46721
+ isInitiator: true
46722
+ });
46723
+ const identityKp = {
46724
+ publicKey: myIdentityPublic,
46725
+ privateKey: myIdentityPrivate,
46726
+ keyType: "ed25519"
46727
+ };
46728
+ const obsRatchet = DoubleRatchet.initSender(obsSharedSecret, identityKp);
46729
+ obsAccEntry.observerSession = {
46730
+ ratchetState: obsRatchet.serialize()
46731
+ };
46732
+ delete obsAccEntry.pendingObserverEphemeralPrivateKey;
46733
+ await this._persistState();
46734
+ console.log(
46735
+ `[SecureChannel] Observer ratchet initialized for channel ${obsAccChannelId.slice(0, 8)}... (side=${obsAccSide})`
46736
+ );
46737
+ } catch (err) {
46738
+ console.error("[SecureChannel] Observer ratchet init failed:", err);
46739
+ }
46740
+ }
46741
+ }
46643
46742
  if (data.event === "a2a_channel_rejected") {
46644
46743
  this.emit("a2a_channel_rejected", data.data || data);
46645
46744
  }
@@ -47110,7 +47209,73 @@ ${messageText}`;
47110
47209
  header_blob: msgData.header_blob,
47111
47210
  ciphertext: msgData.ciphertext
47112
47211
  });
47113
- const plaintext = session.ratchet.decrypt(encrypted);
47212
+ let plaintext;
47213
+ try {
47214
+ plaintext = session.ratchet.decrypt(encrypted);
47215
+ } catch (decryptErr) {
47216
+ console.warn(
47217
+ `[SecureChannel] Room decrypt failed for conv ${convId.slice(0, 8)}...: ${String(decryptErr)}, re-initializing ratchet`
47218
+ );
47219
+ try {
47220
+ const roomEntry = this._persisted?.rooms ? Object.values(this._persisted.rooms).find(
47221
+ (r2) => r2.conversationIds.includes(convId)
47222
+ ) : null;
47223
+ if (!roomEntry) throw new Error("Room not found for conversation");
47224
+ const otherMember = roomEntry.members.find(
47225
+ (m2) => m2.deviceId === msgData.sender_device_id
47226
+ );
47227
+ if (!otherMember?.identityPublicKey) throw new Error("No key for sender");
47228
+ const isInitiator = this._deviceId < msgData.sender_device_id;
47229
+ const identity = this._persisted.identityKeypair;
47230
+ const ephemeral = this._persisted.ephemeralKeypair;
47231
+ const sharedSecret = performX3DH({
47232
+ myIdentityPrivate: hexToBytes(identity.privateKey),
47233
+ myEphemeralPrivate: hexToBytes(ephemeral.privateKey),
47234
+ theirIdentityPublic: hexToBytes(otherMember.identityPublicKey),
47235
+ theirEphemeralPublic: hexToBytes(
47236
+ otherMember.ephemeralPublicKey ?? otherMember.identityPublicKey
47237
+ ),
47238
+ isInitiator
47239
+ });
47240
+ const newRatchet = isInitiator ? DoubleRatchet.initSender(sharedSecret, {
47241
+ publicKey: hexToBytes(identity.publicKey),
47242
+ privateKey: hexToBytes(identity.privateKey),
47243
+ keyType: "ed25519"
47244
+ }) : DoubleRatchet.initReceiver(sharedSecret, {
47245
+ publicKey: hexToBytes(identity.publicKey),
47246
+ privateKey: hexToBytes(identity.privateKey),
47247
+ keyType: "ed25519"
47248
+ });
47249
+ session.ratchet = newRatchet;
47250
+ session.activated = false;
47251
+ this._persisted.sessions[convId] = {
47252
+ ownerDeviceId: session.ownerDeviceId,
47253
+ ratchetState: newRatchet.serialize(),
47254
+ activated: false
47255
+ };
47256
+ await this._persistState();
47257
+ console.log(
47258
+ `[SecureChannel] Room ratchet re-initialized for conv ${convId.slice(0, 8)}...`
47259
+ );
47260
+ plaintext = session.ratchet.decrypt(encrypted);
47261
+ } catch (reinitErr) {
47262
+ console.error(
47263
+ `[SecureChannel] Room ratchet re-init failed for conv ${convId.slice(0, 8)}...:`,
47264
+ reinitErr
47265
+ );
47266
+ return;
47267
+ }
47268
+ }
47269
+ let messageText;
47270
+ let messageType;
47271
+ try {
47272
+ const parsed = JSON.parse(plaintext);
47273
+ messageType = parsed.type || "message";
47274
+ messageText = parsed.text || plaintext;
47275
+ } catch {
47276
+ messageType = "message";
47277
+ messageText = plaintext;
47278
+ }
47114
47279
  if (!session.activated) {
47115
47280
  session.activated = true;
47116
47281
  console.log(
@@ -47125,16 +47290,17 @@ ${messageText}`;
47125
47290
  messageId: msgData.message_id ?? "",
47126
47291
  conversationId: convId,
47127
47292
  timestamp: msgData.created_at ?? (/* @__PURE__ */ new Date()).toISOString(),
47128
- messageType: msgData.message_type ?? "text"
47293
+ messageType,
47294
+ roomId: msgData.room_id
47129
47295
  };
47130
47296
  this.emit("room_message", {
47131
47297
  roomId: msgData.room_id,
47132
47298
  senderDeviceId: msgData.sender_device_id,
47133
- plaintext,
47134
- messageType: msgData.message_type ?? "text",
47299
+ plaintext: messageText,
47300
+ messageType,
47135
47301
  timestamp: msgData.created_at ?? (/* @__PURE__ */ new Date()).toISOString()
47136
47302
  });
47137
- this.config.onMessage?.(plaintext, metadata);
47303
+ this.config.onMessage?.(messageText, metadata);
47138
47304
  }
47139
47305
  /**
47140
47306
  * Find the pairwise conversation ID for a given sender in a room.