@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.
- package/dist/channel.d.ts.map +1 -1
- package/dist/cli.js +178 -12
- package/dist/cli.js.map +3 -3
- package/dist/index.js +178 -12
- package/dist/index.js.map +3 -3
- package/dist/openclaw-entry.d.ts.map +1 -1
- package/dist/openclaw-entry.js +13 -8
- package/dist/openclaw-entry.js.map +2 -2
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/channel.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAqB3C,OAAO,KAAK,EACV,mBAAmB,EACnB,YAAY,EAMZ,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,cAAc,EACd,oBAAoB,EACpB,QAAQ,EAER,UAAU,EAEX,MAAM,YAAY,CAAC;AAoDpB,qBAAa,aAAc,SAAQ,YAAY;IA0CjC,OAAO,CAAC,MAAM;IAzC1B,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,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,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,iBAAiB,CAA+C;IACxE,OAAO,CAAC,eAAe,CAA4B;IAEnD,0GAA0G;IAC1G,OAAO,CAAC,gBAAgB,CAAiF;IACzG,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,mBAAmB,CAAK;IAIhC,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;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsC5B;;OAEG;YACW,eAAe;IAiB7B;;OAEG;IACH,OAAO,CAAC,cAAc;IAuBtB;;;OAGG;IACG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
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
|
-
|
|
45761
|
-
|
|
45762
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
47299
|
+
plaintext: messageText,
|
|
47300
|
+
messageType,
|
|
47135
47301
|
timestamp: msgData.created_at ?? (/* @__PURE__ */ new Date()).toISOString()
|
|
47136
47302
|
});
|
|
47137
|
-
this.config.onMessage?.(
|
|
47303
|
+
this.config.onMessage?.(messageText, metadata);
|
|
47138
47304
|
}
|
|
47139
47305
|
/**
|
|
47140
47306
|
* Find the pairwise conversation ID for a given sender in a room.
|