@hashgraphonline/standards-sdk 0.1.157 → 0.1.159
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/cjs/hcs-12/validation/schemas.d.ts +2 -2
- package/dist/cjs/hcs-17/types.d.ts +4 -4
- package/dist/cjs/hcs-2/types.d.ts +20 -20
- package/dist/cjs/hcs-20/types.d.ts +8 -8
- package/dist/cjs/hcs-26/base-client.d.ts +83 -0
- package/dist/cjs/hcs-26/base-client.d.ts.map +1 -0
- package/dist/cjs/hcs-26/browser.d.ts +11 -0
- package/dist/cjs/hcs-26/browser.d.ts.map +1 -0
- package/dist/cjs/hcs-26/index.d.ts +7 -0
- package/dist/cjs/hcs-26/index.d.ts.map +1 -0
- package/dist/cjs/hcs-26/memos.d.ts +28 -0
- package/dist/cjs/hcs-26/memos.d.ts.map +1 -0
- package/dist/cjs/hcs-26/resolver.d.ts +60 -0
- package/dist/cjs/hcs-26/resolver.d.ts.map +1 -0
- package/dist/cjs/hcs-26/sdk.d.ts +10 -0
- package/dist/cjs/hcs-26/sdk.d.ts.map +1 -0
- package/dist/cjs/hcs-26/types.d.ts +2752 -0
- package/dist/cjs/hcs-26/types.d.ts.map +1 -0
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/inscribe/inscriber.d.ts +1 -1
- package/dist/cjs/inscribe/inscriber.d.ts.map +1 -1
- package/dist/cjs/inscribe/inscription-cost.d.ts +12 -0
- package/dist/cjs/inscribe/inscription-cost.d.ts.map +1 -0
- package/dist/cjs/inscribe/types.d.ts +5 -1
- package/dist/cjs/inscribe/types.d.ts.map +1 -1
- package/dist/cjs/services/registry-broker/client/base-client.d.ts +19 -1
- package/dist/cjs/services/registry-broker/client/base-client.d.ts.map +1 -1
- package/dist/cjs/services/registry-broker/client/skills.d.ts +20 -1
- package/dist/cjs/services/registry-broker/client/skills.d.ts.map +1 -1
- package/dist/cjs/services/registry-broker/schemas.d.ts +2515 -86
- package/dist/cjs/services/registry-broker/schemas.d.ts.map +1 -1
- package/dist/cjs/services/registry-broker/types.d.ts +21 -3
- package/dist/cjs/services/registry-broker/types.d.ts.map +1 -1
- package/dist/cjs/services/types.d.ts +2 -1
- package/dist/cjs/services/types.d.ts.map +1 -1
- package/dist/cjs/standards-sdk.cjs +2 -2
- package/dist/cjs/standards-sdk.cjs.map +1 -1
- package/dist/cjs/utils/crypto-abstraction.d.ts.map +1 -1
- package/dist/es/hcs-12/validation/schemas.d.ts +2 -2
- package/dist/es/hcs-17/types.d.ts +4 -4
- package/dist/es/hcs-2/types.d.ts +20 -20
- package/dist/es/hcs-20/types.d.ts +8 -8
- package/dist/es/hcs-26/base-client.d.ts +83 -0
- package/dist/es/hcs-26/base-client.d.ts.map +1 -0
- package/dist/es/hcs-26/browser.d.ts +11 -0
- package/dist/es/hcs-26/browser.d.ts.map +1 -0
- package/dist/es/hcs-26/index.d.ts +7 -0
- package/dist/es/hcs-26/index.d.ts.map +1 -0
- package/dist/es/hcs-26/memos.d.ts +28 -0
- package/dist/es/hcs-26/memos.d.ts.map +1 -0
- package/dist/es/hcs-26/resolver.d.ts +60 -0
- package/dist/es/hcs-26/resolver.d.ts.map +1 -0
- package/dist/es/hcs-26/sdk.d.ts +10 -0
- package/dist/es/hcs-26/sdk.d.ts.map +1 -0
- package/dist/es/hcs-26/types.d.ts +2752 -0
- package/dist/es/hcs-26/types.d.ts.map +1 -0
- package/dist/es/index.d.ts +1 -0
- package/dist/es/index.d.ts.map +1 -1
- package/dist/es/inscribe/inscriber.d.ts +1 -1
- package/dist/es/inscribe/inscriber.d.ts.map +1 -1
- package/dist/es/inscribe/inscription-cost.d.ts +12 -0
- package/dist/es/inscribe/inscription-cost.d.ts.map +1 -0
- package/dist/es/inscribe/types.d.ts +5 -1
- package/dist/es/inscribe/types.d.ts.map +1 -1
- package/dist/es/services/registry-broker/client/base-client.d.ts +19 -1
- package/dist/es/services/registry-broker/client/base-client.d.ts.map +1 -1
- package/dist/es/services/registry-broker/client/skills.d.ts +20 -1
- package/dist/es/services/registry-broker/client/skills.d.ts.map +1 -1
- package/dist/es/services/registry-broker/schemas.d.ts +2515 -86
- package/dist/es/services/registry-broker/schemas.d.ts.map +1 -1
- package/dist/es/services/registry-broker/types.d.ts +21 -3
- package/dist/es/services/registry-broker/types.d.ts.map +1 -1
- package/dist/es/services/types.d.ts +2 -1
- package/dist/es/services/types.d.ts.map +1 -1
- package/dist/es/standards-sdk.es.js +70 -32
- package/dist/es/standards-sdk.es.js.map +1 -1
- package/dist/es/standards-sdk.es101.js +2 -2
- package/dist/es/standards-sdk.es103.js +1 -1
- package/dist/es/standards-sdk.es104.js +2 -2
- package/dist/es/standards-sdk.es105.js +247 -137
- package/dist/es/standards-sdk.es105.js.map +1 -1
- package/dist/es/standards-sdk.es106.js +477 -28
- package/dist/es/standards-sdk.es106.js.map +1 -1
- package/dist/es/standards-sdk.es107.js +103 -20
- package/dist/es/standards-sdk.es107.js.map +1 -1
- package/dist/es/standards-sdk.es108.js +141 -141
- package/dist/es/standards-sdk.es108.js.map +1 -1
- package/dist/es/standards-sdk.es109.js +31 -200
- package/dist/es/standards-sdk.es109.js.map +1 -1
- package/dist/es/standards-sdk.es11.js +1 -1
- package/dist/es/standards-sdk.es110.js +9 -787
- package/dist/es/standards-sdk.es110.js.map +1 -1
- package/dist/es/standards-sdk.es111.js +140 -11
- package/dist/es/standards-sdk.es111.js.map +1 -1
- package/dist/es/standards-sdk.es112.js +29 -567
- package/dist/es/standards-sdk.es112.js.map +1 -1
- package/dist/es/standards-sdk.es113.js +17 -597
- package/dist/es/standards-sdk.es113.js.map +1 -1
- package/dist/es/standards-sdk.es114.js +159 -12
- package/dist/es/standards-sdk.es114.js.map +1 -1
- package/dist/es/standards-sdk.es115.js +203 -2
- package/dist/es/standards-sdk.es115.js.map +1 -1
- package/dist/es/standards-sdk.es116.js +774 -71
- package/dist/es/standards-sdk.es116.js.map +1 -1
- package/dist/es/standards-sdk.es117.js +11 -38
- package/dist/es/standards-sdk.es117.js.map +1 -1
- package/dist/es/standards-sdk.es118.js +567 -2
- package/dist/es/standards-sdk.es118.js.map +1 -1
- package/dist/es/standards-sdk.es119.js +576 -205
- package/dist/es/standards-sdk.es119.js.map +1 -1
- package/dist/es/standards-sdk.es12.js +1 -1
- package/dist/es/standards-sdk.es120.js +12 -1139
- package/dist/es/standards-sdk.es120.js.map +1 -1
- package/dist/es/standards-sdk.es121.js +2 -306
- package/dist/es/standards-sdk.es121.js.map +1 -1
- package/dist/es/standards-sdk.es122.js +83 -418
- package/dist/es/standards-sdk.es122.js.map +1 -1
- package/dist/es/standards-sdk.es123.js +36 -351
- package/dist/es/standards-sdk.es123.js.map +1 -1
- package/dist/es/standards-sdk.es124.js +2 -1117
- package/dist/es/standards-sdk.es124.js.map +1 -1
- package/dist/es/standards-sdk.es125.js +215 -188
- package/dist/es/standards-sdk.es125.js.map +1 -1
- package/dist/es/standards-sdk.es126.js +1055 -1482
- package/dist/es/standards-sdk.es126.js.map +1 -1
- package/dist/es/standards-sdk.es127.js +306 -1138
- package/dist/es/standards-sdk.es127.js.map +1 -1
- package/dist/es/standards-sdk.es128.js +419 -14
- package/dist/es/standards-sdk.es128.js.map +1 -1
- package/dist/es/standards-sdk.es129.js +350 -82
- package/dist/es/standards-sdk.es129.js.map +1 -1
- package/dist/es/standards-sdk.es13.js +1 -1
- package/dist/es/standards-sdk.es130.js +1107 -72
- package/dist/es/standards-sdk.es130.js.map +1 -1
- package/dist/es/standards-sdk.es131.js +181 -845
- package/dist/es/standards-sdk.es131.js.map +1 -1
- package/dist/es/standards-sdk.es132.js +1558 -51
- package/dist/es/standards-sdk.es132.js.map +1 -1
- package/dist/es/standards-sdk.es133.js +1236 -159
- package/dist/es/standards-sdk.es133.js.map +1 -1
- package/dist/es/standards-sdk.es134.js +17 -7
- package/dist/es/standards-sdk.es134.js.map +1 -1
- package/dist/es/standards-sdk.es135.js +79 -78
- package/dist/es/standards-sdk.es135.js.map +1 -1
- package/dist/es/standards-sdk.es136.js +75 -59
- package/dist/es/standards-sdk.es136.js.map +1 -1
- package/dist/es/standards-sdk.es137.js +893 -30
- package/dist/es/standards-sdk.es137.js.map +1 -1
- package/dist/es/standards-sdk.es138.js +60 -34
- package/dist/es/standards-sdk.es138.js.map +1 -1
- package/dist/es/standards-sdk.es139.js +159 -28
- package/dist/es/standards-sdk.es139.js.map +1 -1
- package/dist/es/standards-sdk.es14.js +1 -1
- package/dist/es/standards-sdk.es140.js +7 -138
- package/dist/es/standards-sdk.es140.js.map +1 -1
- package/dist/es/standards-sdk.es141.js +80 -36
- package/dist/es/standards-sdk.es141.js.map +1 -1
- package/dist/es/standards-sdk.es142.js +58 -49
- package/dist/es/standards-sdk.es142.js.map +1 -1
- package/dist/es/standards-sdk.es143.js +30 -84
- package/dist/es/standards-sdk.es143.js.map +1 -1
- package/dist/es/standards-sdk.es144.js +34 -12320
- package/dist/es/standards-sdk.es144.js.map +1 -1
- package/dist/es/standards-sdk.es145.js +28 -17
- package/dist/es/standards-sdk.es145.js.map +1 -1
- package/dist/es/standards-sdk.es146.js +118 -152
- package/dist/es/standards-sdk.es146.js.map +1 -1
- package/dist/es/standards-sdk.es147.js +34 -314
- package/dist/es/standards-sdk.es147.js.map +1 -1
- package/dist/es/standards-sdk.es148.js +12426 -290
- package/dist/es/standards-sdk.es148.js.map +1 -1
- package/dist/es/standards-sdk.es149.js +231 -442
- package/dist/es/standards-sdk.es149.js.map +1 -1
- package/dist/es/standards-sdk.es15.js +1 -1
- package/dist/es/standards-sdk.es150.js +142 -301
- package/dist/es/standards-sdk.es150.js.map +1 -1
- package/dist/es/standards-sdk.es151.js +310 -64
- package/dist/es/standards-sdk.es151.js.map +1 -1
- package/dist/es/standards-sdk.es152.js +332 -158
- package/dist/es/standards-sdk.es152.js.map +1 -1
- package/dist/es/standards-sdk.es153.js +441 -210
- package/dist/es/standards-sdk.es153.js.map +1 -1
- package/dist/es/standards-sdk.es154.js +314 -222
- package/dist/es/standards-sdk.es154.js.map +1 -1
- package/dist/es/standards-sdk.es155.js +65 -108
- package/dist/es/standards-sdk.es155.js.map +1 -1
- package/dist/es/standards-sdk.es156.js +14 -123
- package/dist/es/standards-sdk.es156.js.map +1 -1
- package/dist/es/standards-sdk.es157.js +60 -148
- package/dist/es/standards-sdk.es157.js.map +1 -1
- package/dist/es/standards-sdk.es158.js +47 -176
- package/dist/es/standards-sdk.es158.js.map +1 -1
- package/dist/es/standards-sdk.es159.js +65 -120
- package/dist/es/standards-sdk.es159.js.map +1 -1
- package/dist/es/standards-sdk.es16.js +5 -5
- package/dist/es/standards-sdk.es160.js +147 -306
- package/dist/es/standards-sdk.es160.js.map +1 -1
- package/dist/es/standards-sdk.es161.js +205 -242
- package/dist/es/standards-sdk.es161.js.map +1 -1
- package/dist/es/standards-sdk.es162.js +233 -110
- package/dist/es/standards-sdk.es162.js.map +1 -1
- package/dist/es/standards-sdk.es163.js +84 -78
- package/dist/es/standards-sdk.es163.js.map +1 -1
- package/dist/es/standards-sdk.es164.js +129 -0
- package/dist/es/standards-sdk.es164.js.map +1 -0
- package/dist/es/standards-sdk.es165.js +164 -0
- package/dist/es/standards-sdk.es165.js.map +1 -0
- package/dist/es/standards-sdk.es166.js +188 -0
- package/dist/es/standards-sdk.es166.js.map +1 -0
- package/dist/es/standards-sdk.es167.js +142 -0
- package/dist/es/standards-sdk.es167.js.map +1 -0
- package/dist/es/standards-sdk.es168.js +334 -0
- package/dist/es/standards-sdk.es168.js.map +1 -0
- package/dist/es/standards-sdk.es169.js +262 -0
- package/dist/es/standards-sdk.es169.js.map +1 -0
- package/dist/es/standards-sdk.es170.js +119 -0
- package/dist/es/standards-sdk.es170.js.map +1 -0
- package/dist/es/standards-sdk.es18.js +12 -12
- package/dist/es/standards-sdk.es19.js +9 -9
- package/dist/es/standards-sdk.es2.js +2 -2
- package/dist/es/standards-sdk.es20.js +1 -1
- package/dist/es/standards-sdk.es21.js +1 -1
- package/dist/es/standards-sdk.es22.js +1 -1
- package/dist/es/standards-sdk.es23.js +1 -1
- package/dist/es/standards-sdk.es24.js +1 -1
- package/dist/es/standards-sdk.es25.js +1 -1
- package/dist/es/standards-sdk.es26.js +1 -1
- package/dist/es/standards-sdk.es27.js +12 -12
- package/dist/es/standards-sdk.es30.js +2 -2
- package/dist/es/standards-sdk.es31.js +4 -4
- package/dist/es/standards-sdk.es32.js +1 -1
- package/dist/es/standards-sdk.es35.js +6 -6
- package/dist/es/standards-sdk.es36.js +4 -4
- package/dist/es/standards-sdk.es37.js +2 -2
- package/dist/es/standards-sdk.es38.js +2 -2
- package/dist/es/standards-sdk.es39.js +1 -1
- package/dist/es/standards-sdk.es4.js +2 -2
- package/dist/es/standards-sdk.es40.js +1 -1
- package/dist/es/standards-sdk.es41.js +2 -2
- package/dist/es/standards-sdk.es46.js +1 -1
- package/dist/es/standards-sdk.es5.js +2 -2
- package/dist/es/standards-sdk.es51.js +1 -1
- package/dist/es/standards-sdk.es53.js +1 -1
- package/dist/es/standards-sdk.es56.js +2 -2
- package/dist/es/standards-sdk.es58.js +1 -1
- package/dist/es/standards-sdk.es59.js +1 -1
- package/dist/es/standards-sdk.es6.js +2 -2
- package/dist/es/standards-sdk.es60.js +7 -7
- package/dist/es/standards-sdk.es62.js +1 -1
- package/dist/es/standards-sdk.es64.js +2 -2
- package/dist/es/standards-sdk.es65.js +3 -3
- package/dist/es/standards-sdk.es68.js +2 -2
- package/dist/es/standards-sdk.es69.js +3 -3
- package/dist/es/standards-sdk.es7.js +1 -1
- package/dist/es/standards-sdk.es70.js +2 -2
- package/dist/es/standards-sdk.es71.js +1 -1
- package/dist/es/standards-sdk.es74.js +2 -2
- package/dist/es/standards-sdk.es76.js +2 -2
- package/dist/es/standards-sdk.es77.js +4 -4
- package/dist/es/standards-sdk.es78.js +1 -1
- package/dist/es/standards-sdk.es81.js +1 -1
- package/dist/es/standards-sdk.es82.js +2 -2
- package/dist/es/standards-sdk.es83.js +4 -4
- package/dist/es/standards-sdk.es87.js +3 -3
- package/dist/es/standards-sdk.es89.js +2 -2
- package/dist/es/standards-sdk.es9.js +2 -2
- package/dist/es/standards-sdk.es91.js +1 -1
- package/dist/es/standards-sdk.es92.js +3 -3
- package/dist/es/standards-sdk.es94.js +2 -2
- package/dist/es/standards-sdk.es96.js +2 -2
- package/dist/es/standards-sdk.es97.js +1 -1
- package/dist/es/standards-sdk.es99.js +1 -1
- package/dist/es/utils/crypto-abstraction.d.ts.map +1 -1
- package/package.json +5 -4
|
@@ -1,334 +1,175 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
1
|
+
import * as path from "path";
|
|
2
|
+
import { Buffer } from "buffer";
|
|
3
|
+
import { randomBytes } from "crypto";
|
|
4
|
+
import { secp256k1 } from "@noble/curves/secp256k1.js";
|
|
5
|
+
import { registerEncryptionKeyResponseSchema } from "./standards-sdk.es133.js";
|
|
6
|
+
import { optionalImport } from "./standards-sdk.es159.js";
|
|
7
|
+
const getFs = async () => {
|
|
8
|
+
const fsModule = await optionalImport("node:fs");
|
|
9
|
+
if (fsModule && typeof fsModule.existsSync === "function" && typeof fsModule.readFileSync === "function" && typeof fsModule.writeFileSync === "function" && typeof fsModule.appendFileSync === "function") {
|
|
10
|
+
return fsModule;
|
|
11
|
+
}
|
|
12
|
+
return null;
|
|
13
|
+
};
|
|
14
|
+
async function registerEncryptionKey(client, payload) {
|
|
15
|
+
const raw = await client.requestJson("/encryption/keys", {
|
|
16
|
+
method: "POST",
|
|
17
|
+
headers: { "content-type": "application/json" },
|
|
18
|
+
body: payload
|
|
19
|
+
});
|
|
20
|
+
return client.parseWithSchema(
|
|
21
|
+
raw,
|
|
22
|
+
registerEncryptionKeyResponseSchema,
|
|
23
|
+
"register encryption key response"
|
|
24
|
+
);
|
|
19
25
|
}
|
|
20
|
-
|
|
21
|
-
const
|
|
22
|
-
if (
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
if (
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
if (payload.historyTtlSeconds !== void 0) {
|
|
32
|
-
body.historyTtlSeconds = payload.historyTtlSeconds;
|
|
26
|
+
function normalizeAutoRegisterIdentity(config) {
|
|
27
|
+
const identity = {};
|
|
28
|
+
if (config.uaid) {
|
|
29
|
+
identity.uaid = config.uaid;
|
|
30
|
+
}
|
|
31
|
+
if (config.ledgerAccountId) {
|
|
32
|
+
identity.ledgerAccountId = config.ledgerAccountId;
|
|
33
|
+
if (config.ledgerNetwork) {
|
|
34
|
+
identity.ledgerNetwork = config.ledgerNetwork;
|
|
35
|
+
}
|
|
33
36
|
}
|
|
34
|
-
if (
|
|
35
|
-
|
|
37
|
+
if (config.email) {
|
|
38
|
+
identity.email = config.email;
|
|
36
39
|
}
|
|
37
|
-
if (
|
|
38
|
-
|
|
39
|
-
}
|
|
40
|
-
try {
|
|
41
|
-
const raw = await client.requestJson("/chat/session", {
|
|
42
|
-
method: "POST",
|
|
43
|
-
body,
|
|
44
|
-
headers: { "content-type": "application/json" }
|
|
45
|
-
});
|
|
46
|
-
return client.parseWithSchema(
|
|
47
|
-
raw,
|
|
48
|
-
createSessionResponseSchema,
|
|
49
|
-
"chat session response"
|
|
50
|
-
);
|
|
51
|
-
} catch (error) {
|
|
52
|
-
const maybeError = error instanceof Error ? error : null;
|
|
53
|
-
if (allowHistoryAutoTopUp && client.shouldAutoTopUpHistory(payload, maybeError)) {
|
|
54
|
-
await client.executeHistoryAutoTopUp("chat.session");
|
|
55
|
-
return createSession(client, payload, false);
|
|
56
|
-
}
|
|
57
|
-
throw error;
|
|
40
|
+
if (identity.uaid || identity.ledgerAccountId || identity.email) {
|
|
41
|
+
return identity;
|
|
58
42
|
}
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
function derivePublicKeyFromPrivateKey(client, privateKey) {
|
|
46
|
+
const normalized = client.hexToBuffer(privateKey);
|
|
47
|
+
const publicKey = secp256k1.getPublicKey(normalized, true);
|
|
48
|
+
return Buffer.from(publicKey).toString("hex");
|
|
59
49
|
}
|
|
60
|
-
async function
|
|
61
|
-
if (
|
|
62
|
-
return
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
50
|
+
async function resolveAutoRegisterKeyMaterial(client, config) {
|
|
51
|
+
if (config.publicKey?.trim()) {
|
|
52
|
+
return { publicKey: config.publicKey.trim() };
|
|
53
|
+
}
|
|
54
|
+
let privateKey = config.privateKey?.trim();
|
|
55
|
+
const envVar = config.envVar ?? "RB_ENCRYPTION_PRIVATE_KEY";
|
|
56
|
+
if (!privateKey && envVar && process?.env?.[envVar]?.trim()) {
|
|
57
|
+
privateKey = process.env[envVar]?.trim();
|
|
58
|
+
}
|
|
59
|
+
if (!privateKey && config.generateIfMissing) {
|
|
60
|
+
const pair = await client.generateEncryptionKeyPair({
|
|
61
|
+
keyType: config.keyType ?? "secp256k1",
|
|
62
|
+
envVar,
|
|
63
|
+
envPath: config.envPath,
|
|
64
|
+
overwrite: config.overwriteEnv
|
|
69
65
|
});
|
|
66
|
+
return { publicKey: pair.publicKey, privateKey: pair.privateKey };
|
|
70
67
|
}
|
|
71
|
-
if (
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
auth: options.auth,
|
|
75
|
-
historyTtlSeconds: options.historyTtlSeconds,
|
|
76
|
-
senderUaid: options.senderUaid
|
|
77
|
-
});
|
|
78
|
-
options.onSessionCreated?.(session.sessionId);
|
|
79
|
-
return createPlaintextConversationHandle(
|
|
80
|
-
client,
|
|
81
|
-
session.sessionId,
|
|
82
|
-
session.encryption ?? null,
|
|
83
|
-
options.auth,
|
|
84
|
-
{ agentUrl: options.agentUrl, uaid: options.uaid }
|
|
85
|
-
);
|
|
68
|
+
if (privateKey) {
|
|
69
|
+
const publicKey = derivePublicKeyFromPrivateKey(client, privateKey);
|
|
70
|
+
return { publicKey, privateKey };
|
|
86
71
|
}
|
|
87
|
-
|
|
72
|
+
return null;
|
|
88
73
|
}
|
|
89
|
-
async function
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
uaid: options.uaid,
|
|
95
|
-
auth: options.auth,
|
|
96
|
-
historyTtlSeconds: options.historyTtlSeconds,
|
|
97
|
-
senderUaid: options.senderUaid,
|
|
98
|
-
encryptionRequested: false
|
|
99
|
-
});
|
|
100
|
-
options.onSessionCreated?.(session.sessionId);
|
|
101
|
-
return createPlaintextConversationHandle(
|
|
102
|
-
client,
|
|
103
|
-
session.sessionId,
|
|
104
|
-
session.encryption ?? null,
|
|
105
|
-
options.auth,
|
|
106
|
-
{ uaid: options.uaid }
|
|
74
|
+
async function autoRegisterEncryptionKey(client, config) {
|
|
75
|
+
const identity = normalizeAutoRegisterIdentity(config);
|
|
76
|
+
if (!identity) {
|
|
77
|
+
throw new Error(
|
|
78
|
+
"Auto-registration requires uaid, ledgerAccountId, or email"
|
|
107
79
|
);
|
|
108
80
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
handshakeTimeoutMs: options.encryption?.handshakeTimeoutMs,
|
|
115
|
-
pollIntervalMs: options.encryption?.pollIntervalMs,
|
|
116
|
-
onSessionCreated: (sessionId) => {
|
|
117
|
-
options.onSessionCreated?.(sessionId);
|
|
118
|
-
},
|
|
119
|
-
auth: options.auth
|
|
120
|
-
});
|
|
121
|
-
return handle;
|
|
122
|
-
} catch (error) {
|
|
123
|
-
if (error instanceof EncryptionUnavailableError) {
|
|
124
|
-
if (preference === "required") {
|
|
125
|
-
throw error;
|
|
126
|
-
}
|
|
127
|
-
return createPlaintextConversationHandle(
|
|
128
|
-
client,
|
|
129
|
-
error.sessionId,
|
|
130
|
-
error.summary ?? null,
|
|
131
|
-
options.auth,
|
|
132
|
-
{ uaid: options.uaid }
|
|
133
|
-
);
|
|
134
|
-
}
|
|
135
|
-
throw error;
|
|
81
|
+
const material = await resolveAutoRegisterKeyMaterial(client, config);
|
|
82
|
+
if (!material) {
|
|
83
|
+
throw new Error(
|
|
84
|
+
"Unable to resolve encryption public key for auto-registration"
|
|
85
|
+
);
|
|
136
86
|
}
|
|
87
|
+
await registerEncryptionKey(client, {
|
|
88
|
+
keyType: config.keyType ?? "secp256k1",
|
|
89
|
+
publicKey: material.publicKey,
|
|
90
|
+
...identity
|
|
91
|
+
});
|
|
92
|
+
return material;
|
|
137
93
|
}
|
|
138
|
-
async function
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
}
|
|
143
|
-
try {
|
|
144
|
-
const handle = await encryptedManager.acceptSession({
|
|
145
|
-
sessionId: options.sessionId,
|
|
146
|
-
responderUaid: options.responderUaid,
|
|
147
|
-
handshakeTimeoutMs: options.encryption?.handshakeTimeoutMs,
|
|
148
|
-
pollIntervalMs: options.encryption?.pollIntervalMs
|
|
149
|
-
});
|
|
150
|
-
return handle;
|
|
151
|
-
} catch (error) {
|
|
152
|
-
if (error instanceof EncryptionUnavailableError && preference !== "required") {
|
|
153
|
-
return createPlaintextConversationHandle(
|
|
154
|
-
client,
|
|
155
|
-
options.sessionId,
|
|
156
|
-
null,
|
|
157
|
-
void 0,
|
|
158
|
-
{ uaid: options.responderUaid }
|
|
159
|
-
);
|
|
160
|
-
}
|
|
161
|
-
throw error;
|
|
162
|
-
}
|
|
94
|
+
async function ensureAgentEncryptionKey(client, options) {
|
|
95
|
+
return autoRegisterEncryptionKey(client, {
|
|
96
|
+
...options,
|
|
97
|
+
uaid: options.uaid
|
|
98
|
+
});
|
|
163
99
|
}
|
|
164
|
-
function
|
|
165
|
-
const uaid = context?.uaid?.trim();
|
|
166
|
-
const agentUrl = context?.agentUrl?.trim();
|
|
167
|
-
const fetchHistory = async (options) => {
|
|
168
|
-
const snapshot = await client.fetchHistorySnapshot(sessionId, options);
|
|
169
|
-
if (snapshot.decryptedHistory) {
|
|
170
|
-
return snapshot.decryptedHistory;
|
|
171
|
-
}
|
|
172
|
-
return snapshot.history.map((entry) => ({
|
|
173
|
-
entry,
|
|
174
|
-
plaintext: entry.content
|
|
175
|
-
}));
|
|
176
|
-
};
|
|
100
|
+
function createEncryptionApi(client) {
|
|
177
101
|
return {
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
throw new Error("plaintext is required for chat messages");
|
|
185
|
-
}
|
|
186
|
-
const message = options.message ?? plaintext;
|
|
187
|
-
return sendMessage(client, {
|
|
188
|
-
sessionId,
|
|
189
|
-
message,
|
|
190
|
-
streaming: options.streaming,
|
|
191
|
-
auth: options.auth ?? defaultAuth,
|
|
192
|
-
uaid,
|
|
193
|
-
agentUrl
|
|
194
|
-
});
|
|
195
|
-
},
|
|
196
|
-
decryptHistoryEntry: (entry) => entry.content,
|
|
197
|
-
fetchHistory
|
|
102
|
+
registerKey: (payload) => registerEncryptionKey(client, payload),
|
|
103
|
+
generateEphemeralKeyPair: () => client.createEphemeralKeyPair(),
|
|
104
|
+
deriveSharedSecret: (options) => client.deriveSharedSecret(options),
|
|
105
|
+
encryptCipherEnvelope: (options) => client.buildCipherEnvelope(options),
|
|
106
|
+
decryptCipherEnvelope: (options) => client.openCipherEnvelope(options),
|
|
107
|
+
ensureAgentKey: (options) => ensureAgentEncryptionKey(client, options)
|
|
198
108
|
};
|
|
199
109
|
}
|
|
200
|
-
async function
|
|
201
|
-
if (!
|
|
202
|
-
|
|
110
|
+
async function bootstrapEncryptionOptions(client, options) {
|
|
111
|
+
if (!options?.autoRegister || options.autoRegister.enabled === false) {
|
|
112
|
+
return null;
|
|
203
113
|
}
|
|
204
|
-
|
|
205
|
-
if (typeof payload.preserveEntries === "number" && Number.isFinite(payload.preserveEntries) && payload.preserveEntries >= 0) {
|
|
206
|
-
body.preserveEntries = Math.floor(payload.preserveEntries);
|
|
207
|
-
}
|
|
208
|
-
const raw = await client.requestJson(
|
|
209
|
-
`/chat/session/${encodeURIComponent(payload.sessionId)}/compact`,
|
|
210
|
-
{
|
|
211
|
-
method: "POST",
|
|
212
|
-
headers: { "content-type": "application/json" },
|
|
213
|
-
body
|
|
214
|
-
}
|
|
215
|
-
);
|
|
216
|
-
return client.parseWithSchema(
|
|
217
|
-
raw,
|
|
218
|
-
chatHistoryCompactionResponseSchema,
|
|
219
|
-
"chat history compaction response"
|
|
220
|
-
);
|
|
221
|
-
}
|
|
222
|
-
async function fetchEncryptionStatus(client, sessionId) {
|
|
223
|
-
if (!sessionId || sessionId.trim().length === 0) {
|
|
224
|
-
throw new Error("sessionId is required for encryption status");
|
|
225
|
-
}
|
|
226
|
-
const raw = await client.requestJson(
|
|
227
|
-
`/chat/session/${encodeURIComponent(sessionId)}/encryption`,
|
|
228
|
-
{
|
|
229
|
-
method: "GET"
|
|
230
|
-
}
|
|
231
|
-
);
|
|
232
|
-
return client.parseWithSchema(
|
|
233
|
-
raw,
|
|
234
|
-
sessionEncryptionStatusResponseSchema,
|
|
235
|
-
"session encryption status response"
|
|
236
|
-
);
|
|
237
|
-
}
|
|
238
|
-
async function postEncryptionHandshake(client, sessionId, payload) {
|
|
239
|
-
if (!sessionId || sessionId.trim().length === 0) {
|
|
240
|
-
throw new Error("sessionId is required for encryption handshake");
|
|
241
|
-
}
|
|
242
|
-
const raw = await client.requestJson(
|
|
243
|
-
`/chat/session/${encodeURIComponent(sessionId)}/encryption-handshake`,
|
|
244
|
-
{
|
|
245
|
-
method: "POST",
|
|
246
|
-
headers: { "content-type": "application/json" },
|
|
247
|
-
body: {
|
|
248
|
-
role: payload.role,
|
|
249
|
-
keyType: payload.keyType,
|
|
250
|
-
ephemeralPublicKey: payload.ephemeralPublicKey,
|
|
251
|
-
longTermPublicKey: payload.longTermPublicKey,
|
|
252
|
-
signature: payload.signature,
|
|
253
|
-
uaid: payload.uaid,
|
|
254
|
-
userId: payload.userId,
|
|
255
|
-
ledgerAccountId: payload.ledgerAccountId,
|
|
256
|
-
metadata: payload.metadata
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
);
|
|
260
|
-
const response = client.parseWithSchema(
|
|
261
|
-
raw,
|
|
262
|
-
encryptionHandshakeResponseSchema,
|
|
263
|
-
"encryption handshake response"
|
|
264
|
-
);
|
|
265
|
-
return response.handshake;
|
|
114
|
+
return autoRegisterEncryptionKey(client, options.autoRegister);
|
|
266
115
|
}
|
|
267
|
-
async function
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
}
|
|
283
|
-
if ("agentUrl" in payload && payload.agentUrl) {
|
|
284
|
-
body.agentUrl = payload.agentUrl;
|
|
285
|
-
}
|
|
286
|
-
let cipherEnvelope = payload.cipherEnvelope ?? null;
|
|
287
|
-
if (payload.encryption) {
|
|
288
|
-
const sessionIdForEncryption = payload.encryption.sessionId ?? (typeof body.sessionId === "string" ? body.sessionId : void 0);
|
|
289
|
-
if (!sessionIdForEncryption) {
|
|
116
|
+
async function generateEncryptionKeyPair(client, options = {}) {
|
|
117
|
+
client.assertNodeRuntime("generateEncryptionKeyPair");
|
|
118
|
+
const keyType = options.keyType ?? "secp256k1";
|
|
119
|
+
if (keyType !== "secp256k1") {
|
|
120
|
+
throw new Error("Only secp256k1 key generation is supported currently");
|
|
121
|
+
}
|
|
122
|
+
const privateKeyBytes = randomBytes(32);
|
|
123
|
+
const privateKey = Buffer.from(privateKeyBytes).toString("hex");
|
|
124
|
+
const publicKeyBytes = secp256k1.getPublicKey(privateKeyBytes, true);
|
|
125
|
+
const publicKey = Buffer.from(publicKeyBytes).toString("hex");
|
|
126
|
+
const envVar = options.envVar ?? "RB_ENCRYPTION_PRIVATE_KEY";
|
|
127
|
+
const resolvedPath = options.envPath ? path.resolve(options.envPath) : void 0;
|
|
128
|
+
if (resolvedPath) {
|
|
129
|
+
const fsModule = await getFs();
|
|
130
|
+
if (!fsModule) {
|
|
290
131
|
throw new Error(
|
|
291
|
-
"
|
|
132
|
+
"File system module is not available; cannot write encryption key env file"
|
|
292
133
|
);
|
|
293
134
|
}
|
|
294
|
-
|
|
295
|
-
|
|
135
|
+
const envLine = `${envVar}=${privateKey}`;
|
|
136
|
+
if (fsModule.existsSync(resolvedPath)) {
|
|
137
|
+
const content = fsModule.readFileSync(resolvedPath, "utf-8");
|
|
138
|
+
const lineRegex = new RegExp(`^${envVar}=.*$`, "m");
|
|
139
|
+
if (lineRegex.test(content)) {
|
|
140
|
+
if (!options.overwrite) {
|
|
141
|
+
throw new Error(
|
|
142
|
+
`${envVar} already exists in ${resolvedPath}; set overwrite=true to replace it`
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
const updated = content.replace(lineRegex, envLine);
|
|
146
|
+
fsModule.writeFileSync(resolvedPath, updated);
|
|
147
|
+
} else {
|
|
148
|
+
const needsNewline = !content.endsWith("\n");
|
|
149
|
+
fsModule.appendFileSync(
|
|
150
|
+
resolvedPath,
|
|
151
|
+
`${needsNewline ? "\n" : ""}${envLine}
|
|
152
|
+
`
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
} else {
|
|
156
|
+
fsModule.writeFileSync(resolvedPath, `${envLine}
|
|
157
|
+
`);
|
|
296
158
|
}
|
|
297
|
-
cipherEnvelope = client.encryption.encryptCipherEnvelope({
|
|
298
|
-
...payload.encryption,
|
|
299
|
-
sessionId: sessionIdForEncryption
|
|
300
|
-
});
|
|
301
|
-
}
|
|
302
|
-
if (cipherEnvelope) {
|
|
303
|
-
body.cipherEnvelope = toJsonObject(cipherEnvelope);
|
|
304
159
|
}
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
raw,
|
|
312
|
-
sendMessageResponseSchema,
|
|
313
|
-
"chat message response"
|
|
314
|
-
);
|
|
315
|
-
}
|
|
316
|
-
async function endSession(client, sessionId) {
|
|
317
|
-
await client.request(`/chat/session/${encodeURIComponent(sessionId)}`, {
|
|
318
|
-
method: "DELETE"
|
|
319
|
-
});
|
|
160
|
+
return {
|
|
161
|
+
privateKey,
|
|
162
|
+
publicKey,
|
|
163
|
+
envPath: resolvedPath,
|
|
164
|
+
envVar
|
|
165
|
+
};
|
|
320
166
|
}
|
|
321
167
|
export {
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
fetchEncryptionStatus,
|
|
329
|
-
postEncryptionHandshake,
|
|
330
|
-
sendMessage,
|
|
331
|
-
startChat,
|
|
332
|
-
startConversation
|
|
168
|
+
autoRegisterEncryptionKey,
|
|
169
|
+
bootstrapEncryptionOptions,
|
|
170
|
+
createEncryptionApi,
|
|
171
|
+
ensureAgentEncryptionKey,
|
|
172
|
+
generateEncryptionKeyPair,
|
|
173
|
+
registerEncryptionKey
|
|
333
174
|
};
|
|
334
175
|
//# sourceMappingURL=standards-sdk.es160.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-sdk.es160.js","sources":["../../src/services/registry-broker/client/chat.ts"],"sourcesContent":["import type {\n AcceptConversationOptions,\n AcceptEncryptedChatSessionOptions,\n AgentAuthConfig,\n ChatConversationHandle,\n DecryptedHistoryEntry,\n ChatHistoryCompactionResponse,\n ChatHistoryFetchOptions,\n ChatHistorySnapshotWithDecryptedEntries,\n CompactHistoryRequestPayload,\n CreateSessionRequestPayload,\n CreateSessionResponse,\n EncryptionHandshakeRecord,\n EncryptionHandshakeSubmissionPayload,\n EncryptedChatSessionHandle,\n JsonObject,\n JsonValue,\n SendMessageRequestPayload,\n SendMessageResponse,\n SessionEncryptionStatusResponse,\n SessionEncryptionSummary,\n StartChatOptions,\n StartConversationOptions,\n StartEncryptedChatSessionOptions,\n} from '../types';\nimport {\n chatHistoryCompactionResponseSchema,\n createSessionResponseSchema,\n encryptionHandshakeResponseSchema,\n sendMessageResponseSchema,\n sessionEncryptionStatusResponseSchema,\n} from '../schemas';\nimport type { RegistryBrokerClient } from './base-client';\nimport { serialiseAuthConfig, toJsonObject } from './utils';\nimport {\n EncryptedChatManager,\n EncryptionUnavailableError,\n} from './encrypted-chat-manager';\n\nexport interface RegistryBrokerChatApi {\n start: (options: StartChatOptions) => Promise<ChatConversationHandle>;\n createSession: (\n payload: CreateSessionRequestPayload,\n ) => Promise<CreateSessionResponse>;\n sendMessage: (\n payload: SendMessageRequestPayload,\n ) => Promise<SendMessageResponse>;\n endSession: (sessionId: string) => Promise<void>;\n getHistory: (\n sessionId: string,\n options?: ChatHistoryFetchOptions,\n ) => Promise<ChatHistorySnapshotWithDecryptedEntries>;\n compactHistory: (\n payload: CompactHistoryRequestPayload,\n ) => Promise<ChatHistoryCompactionResponse>;\n getEncryptionStatus: (\n sessionId: string,\n ) => Promise<SessionEncryptionStatusResponse>;\n submitEncryptionHandshake: (\n sessionId: string,\n payload: EncryptionHandshakeSubmissionPayload,\n ) => Promise<EncryptionHandshakeRecord>;\n createEncryptedSession: (\n options: StartEncryptedChatSessionOptions,\n ) => Promise<EncryptedChatSessionHandle>;\n acceptEncryptedSession: (\n options: AcceptEncryptedChatSessionOptions,\n ) => Promise<EncryptedChatSessionHandle>;\n startConversation: (\n options: StartConversationOptions,\n ) => Promise<ChatConversationHandle>;\n acceptConversation: (\n options: AcceptConversationOptions,\n ) => Promise<ChatConversationHandle>;\n}\n\nexport function createChatApi(\n client: RegistryBrokerClient,\n encryptedManager: EncryptedChatManager,\n): RegistryBrokerChatApi {\n return {\n start: (options: StartChatOptions) => client.startChat(options),\n createSession: (payload: CreateSessionRequestPayload) =>\n client.createSession(payload),\n sendMessage: (payload: SendMessageRequestPayload) =>\n client.sendMessage(payload),\n endSession: (sessionId: string) => client.endSession(sessionId),\n getHistory: (sessionId: string, options?: ChatHistoryFetchOptions) =>\n client.fetchHistorySnapshot(sessionId, options),\n compactHistory: (payload: CompactHistoryRequestPayload) =>\n client.compactHistory(payload),\n getEncryptionStatus: (sessionId: string) =>\n client.fetchEncryptionStatus(sessionId),\n submitEncryptionHandshake: (\n sessionId: string,\n payload: EncryptionHandshakeSubmissionPayload,\n ) => client.postEncryptionHandshake(sessionId, payload),\n startConversation: (options: StartConversationOptions) =>\n client.startConversation(options),\n acceptConversation: (options: AcceptConversationOptions) =>\n client.acceptConversation(options),\n createEncryptedSession: (options: StartEncryptedChatSessionOptions) =>\n encryptedManager.startSession(options),\n acceptEncryptedSession: (options: AcceptEncryptedChatSessionOptions) =>\n encryptedManager.acceptSession(options),\n };\n}\n\nexport async function createSession(\n client: RegistryBrokerClient,\n payload: CreateSessionRequestPayload,\n allowHistoryAutoTopUp = true,\n): Promise<CreateSessionResponse> {\n const body: JsonObject = {};\n if ('uaid' in payload && payload.uaid) {\n body.uaid = payload.uaid;\n }\n if ('agentUrl' in payload && payload.agentUrl) {\n body.agentUrl = payload.agentUrl;\n }\n if (payload.auth) {\n body.auth = serialiseAuthConfig(payload.auth);\n }\n if (payload.historyTtlSeconds !== undefined) {\n body.historyTtlSeconds = payload.historyTtlSeconds;\n }\n if (payload.encryptionRequested !== undefined) {\n body.encryptionRequested = payload.encryptionRequested;\n }\n if (payload.senderUaid) {\n body.senderUaid = payload.senderUaid;\n }\n try {\n const raw = await client.requestJson<JsonValue>('/chat/session', {\n method: 'POST',\n body,\n headers: { 'content-type': 'application/json' },\n });\n return client.parseWithSchema(\n raw,\n createSessionResponseSchema,\n 'chat session response',\n );\n } catch (error) {\n const maybeError = error instanceof Error ? error : null;\n if (\n allowHistoryAutoTopUp &&\n client.shouldAutoTopUpHistory(payload, maybeError)\n ) {\n await client.executeHistoryAutoTopUp('chat.session');\n return createSession(client, payload, false);\n }\n throw error;\n }\n}\n\nexport async function startChat(\n client: RegistryBrokerClient,\n encryptedManager: EncryptedChatManager,\n options: StartChatOptions,\n): Promise<ChatConversationHandle> {\n if ('uaid' in options && options.uaid) {\n return startConversation(client, encryptedManager, {\n uaid: options.uaid,\n senderUaid: options.senderUaid,\n historyTtlSeconds: options.historyTtlSeconds,\n auth: options.auth,\n encryption: options.encryption,\n onSessionCreated: options.onSessionCreated,\n });\n }\n if ('agentUrl' in options && options.agentUrl) {\n const session = await createSession(client, {\n agentUrl: options.agentUrl,\n auth: options.auth,\n historyTtlSeconds: options.historyTtlSeconds,\n senderUaid: options.senderUaid,\n });\n options.onSessionCreated?.(session.sessionId);\n return createPlaintextConversationHandle(\n client,\n session.sessionId,\n session.encryption ?? null,\n options.auth,\n { agentUrl: options.agentUrl, uaid: options.uaid },\n );\n }\n throw new Error('startChat requires either uaid or agentUrl');\n}\n\nexport async function startConversation(\n client: RegistryBrokerClient,\n encryptedManager: EncryptedChatManager,\n options: StartConversationOptions,\n): Promise<ChatConversationHandle> {\n const preference = options.encryption?.preference ?? 'preferred';\n const requestEncryption = preference !== 'disabled';\n if (!requestEncryption) {\n const session = await createSession(client, {\n uaid: options.uaid,\n auth: options.auth,\n historyTtlSeconds: options.historyTtlSeconds,\n senderUaid: options.senderUaid,\n encryptionRequested: false,\n });\n options.onSessionCreated?.(session.sessionId);\n return createPlaintextConversationHandle(\n client,\n session.sessionId,\n session.encryption ?? null,\n options.auth,\n { uaid: options.uaid },\n );\n }\n try {\n const handle = await encryptedManager.startSession({\n uaid: options.uaid,\n senderUaid: options.senderUaid,\n historyTtlSeconds: options.historyTtlSeconds,\n handshakeTimeoutMs: options.encryption?.handshakeTimeoutMs,\n pollIntervalMs: options.encryption?.pollIntervalMs,\n onSessionCreated: sessionId => {\n options.onSessionCreated?.(sessionId);\n },\n auth: options.auth,\n });\n return handle;\n } catch (error) {\n if (error instanceof EncryptionUnavailableError) {\n if (preference === 'required') {\n throw error;\n }\n return createPlaintextConversationHandle(\n client,\n error.sessionId,\n error.summary ?? null,\n options.auth,\n { uaid: options.uaid },\n );\n }\n throw error;\n }\n}\n\nexport async function acceptConversation(\n client: RegistryBrokerClient,\n encryptedManager: EncryptedChatManager,\n options: AcceptConversationOptions,\n): Promise<ChatConversationHandle> {\n const preference = options.encryption?.preference ?? 'preferred';\n if (preference === 'disabled') {\n return createPlaintextConversationHandle(client, options.sessionId, null);\n }\n try {\n const handle = await encryptedManager.acceptSession({\n sessionId: options.sessionId,\n responderUaid: options.responderUaid,\n handshakeTimeoutMs: options.encryption?.handshakeTimeoutMs,\n pollIntervalMs: options.encryption?.pollIntervalMs,\n });\n return handle;\n } catch (error) {\n if (\n error instanceof EncryptionUnavailableError &&\n preference !== 'required'\n ) {\n return createPlaintextConversationHandle(\n client,\n options.sessionId,\n null,\n undefined,\n { uaid: options.responderUaid },\n );\n }\n throw error;\n }\n}\n\nexport function createPlaintextConversationHandle(\n client: RegistryBrokerClient,\n sessionId: string,\n summary: SessionEncryptionSummary | null,\n defaultAuth?: AgentAuthConfig,\n context?: { uaid?: string; agentUrl?: string },\n): ChatConversationHandle {\n const uaid = context?.uaid?.trim();\n const agentUrl = context?.agentUrl?.trim();\n const fetchHistory = async (\n options?: ChatHistoryFetchOptions,\n ): Promise<DecryptedHistoryEntry[]> => {\n const snapshot = await client.fetchHistorySnapshot(sessionId, options);\n if (snapshot.decryptedHistory) {\n return snapshot.decryptedHistory;\n }\n return snapshot.history.map(entry => ({\n entry,\n plaintext: entry.content,\n }));\n };\n return {\n sessionId,\n mode: 'plaintext',\n summary: summary ?? null,\n send: async options => {\n const plaintext = options.plaintext;\n if (!plaintext || plaintext.trim().length === 0) {\n throw new Error('plaintext is required for chat messages');\n }\n const message = options.message ?? plaintext;\n return sendMessage(client, {\n sessionId,\n message,\n streaming: options.streaming,\n auth: options.auth ?? defaultAuth,\n uaid,\n agentUrl,\n });\n },\n decryptHistoryEntry: entry => entry.content,\n fetchHistory,\n };\n}\n\nexport async function compactHistory(\n client: RegistryBrokerClient,\n payload: CompactHistoryRequestPayload,\n): Promise<ChatHistoryCompactionResponse> {\n if (!payload.sessionId || payload.sessionId.trim().length === 0) {\n throw new Error('sessionId is required to compact chat history');\n }\n const body: JsonObject = {};\n if (\n typeof payload.preserveEntries === 'number' &&\n Number.isFinite(payload.preserveEntries) &&\n payload.preserveEntries >= 0\n ) {\n body.preserveEntries = Math.floor(payload.preserveEntries);\n }\n const raw = await client.requestJson<JsonValue>(\n `/chat/session/${encodeURIComponent(payload.sessionId)}/compact`,\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body,\n },\n );\n return client.parseWithSchema(\n raw,\n chatHistoryCompactionResponseSchema,\n 'chat history compaction response',\n );\n}\n\nexport async function fetchEncryptionStatus(\n client: RegistryBrokerClient,\n sessionId: string,\n): Promise<SessionEncryptionStatusResponse> {\n if (!sessionId || sessionId.trim().length === 0) {\n throw new Error('sessionId is required for encryption status');\n }\n const raw = await client.requestJson<JsonValue>(\n `/chat/session/${encodeURIComponent(sessionId)}/encryption`,\n {\n method: 'GET',\n },\n );\n return client.parseWithSchema(\n raw,\n sessionEncryptionStatusResponseSchema,\n 'session encryption status response',\n );\n}\n\nexport async function postEncryptionHandshake(\n client: RegistryBrokerClient,\n sessionId: string,\n payload: EncryptionHandshakeSubmissionPayload,\n): Promise<EncryptionHandshakeRecord> {\n if (!sessionId || sessionId.trim().length === 0) {\n throw new Error('sessionId is required for encryption handshake');\n }\n const raw = await client.requestJson<JsonValue>(\n `/chat/session/${encodeURIComponent(sessionId)}/encryption-handshake`,\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: {\n role: payload.role,\n keyType: payload.keyType,\n ephemeralPublicKey: payload.ephemeralPublicKey,\n longTermPublicKey: payload.longTermPublicKey,\n signature: payload.signature,\n uaid: payload.uaid,\n userId: payload.userId,\n ledgerAccountId: payload.ledgerAccountId,\n metadata: payload.metadata,\n },\n },\n );\n const response = client.parseWithSchema(\n raw,\n encryptionHandshakeResponseSchema,\n 'encryption handshake response',\n );\n return response.handshake;\n}\n\nexport async function sendMessage(\n client: RegistryBrokerClient,\n payload: SendMessageRequestPayload,\n): Promise<SendMessageResponse> {\n const body: JsonObject = {\n message: payload.message,\n };\n if (payload.streaming !== undefined) {\n body.streaming = payload.streaming;\n }\n if (payload.auth) {\n body.auth = serialiseAuthConfig(payload.auth);\n }\n if ('uaid' in payload) {\n body.uaid = payload.uaid;\n }\n if ('sessionId' in payload && payload.sessionId) {\n body.sessionId = payload.sessionId;\n }\n if ('agentUrl' in payload && payload.agentUrl) {\n body.agentUrl = payload.agentUrl;\n }\n let cipherEnvelope = payload.cipherEnvelope ?? null;\n if (payload.encryption) {\n const sessionIdForEncryption =\n payload.encryption.sessionId ??\n (typeof body.sessionId === 'string' ? body.sessionId : undefined);\n if (!sessionIdForEncryption) {\n throw new Error(\n 'sessionId is required when using encrypted chat payloads',\n );\n }\n if (!payload.encryption.recipients?.length) {\n throw new Error('recipients are required for encrypted chat payloads');\n }\n cipherEnvelope = client.encryption.encryptCipherEnvelope({\n ...payload.encryption,\n sessionId: sessionIdForEncryption,\n });\n }\n if (cipherEnvelope) {\n body.cipherEnvelope = toJsonObject(cipherEnvelope);\n }\n const raw = await client.requestJson<JsonValue>('/chat/message', {\n method: 'POST',\n body,\n headers: { 'content-type': 'application/json' },\n });\n return client.parseWithSchema(\n raw,\n sendMessageResponseSchema,\n 'chat message response',\n );\n}\n\nexport async function endSession(\n client: RegistryBrokerClient,\n sessionId: string,\n): Promise<void> {\n await client.request(`/chat/session/${encodeURIComponent(sessionId)}`, {\n method: 'DELETE',\n });\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"standards-sdk.es160.js","sources":["../../src/services/registry-broker/client/encryption.ts"],"sourcesContent":["import * as path from 'path';\nimport { Buffer } from 'buffer';\nimport { randomBytes } from 'crypto';\nimport { secp256k1 } from '@noble/curves/secp256k1.js';\nimport type {\n AutoRegisterEncryptionKeyOptions,\n CipherEnvelope,\n ClientEncryptionOptions,\n DecryptCipherEnvelopeOptions,\n DeriveSharedSecretOptions,\n EncryptCipherEnvelopeOptions,\n EphemeralKeyPair,\n EnsureAgentKeyOptions,\n RegisterEncryptionKeyPayload,\n RegisterEncryptionKeyResponse,\n SharedSecretInput,\n} from '../types';\nimport { registerEncryptionKeyResponseSchema } from '../schemas';\nimport { optionalImport } from '../../../utils/dynamic-import';\nimport type {\n RegistryBrokerClient,\n GenerateEncryptionKeyPairOptions,\n} from './base-client';\n\ntype FsModule = {\n existsSync: (path: string) => boolean;\n readFileSync: (path: string, encoding: BufferEncoding) => string;\n writeFileSync: (path: string, data: string) => void;\n appendFileSync: (path: string, data: string) => void;\n};\n\nconst getFs = async (): Promise<FsModule | null> => {\n const fsModule = await optionalImport<Partial<FsModule>>('node:fs');\n\n if (\n fsModule &&\n typeof fsModule.existsSync === 'function' &&\n typeof fsModule.readFileSync === 'function' &&\n typeof fsModule.writeFileSync === 'function' &&\n typeof fsModule.appendFileSync === 'function'\n ) {\n return fsModule as FsModule;\n }\n\n return null;\n};\n\nexport interface RegistryBrokerEncryptionApi {\n registerKey: (\n payload: RegisterEncryptionKeyPayload,\n ) => Promise<RegisterEncryptionKeyResponse>;\n generateEphemeralKeyPair: () => EphemeralKeyPair;\n deriveSharedSecret: (options: DeriveSharedSecretOptions) => Buffer;\n encryptCipherEnvelope: (\n options: EncryptCipherEnvelopeOptions,\n ) => CipherEnvelope;\n decryptCipherEnvelope: (options: DecryptCipherEnvelopeOptions) => string;\n ensureAgentKey: (\n options: EnsureAgentKeyOptions,\n ) => Promise<{ publicKey: string; privateKey?: string }>;\n}\n\nexport async function registerEncryptionKey(\n client: RegistryBrokerClient,\n payload: RegisterEncryptionKeyPayload,\n): Promise<RegisterEncryptionKeyResponse> {\n const raw = await client.requestJson('/encryption/keys', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: payload,\n });\n return client.parseWithSchema(\n raw,\n registerEncryptionKeyResponseSchema,\n 'register encryption key response',\n );\n}\n\nfunction normalizeAutoRegisterIdentity(\n config: AutoRegisterEncryptionKeyOptions,\n): Pick<\n RegisterEncryptionKeyPayload,\n 'uaid' | 'ledgerAccountId' | 'ledgerNetwork' | 'email'\n> | null {\n const identity: Pick<\n RegisterEncryptionKeyPayload,\n 'uaid' | 'ledgerAccountId' | 'ledgerNetwork' | 'email'\n > = {};\n if (config.uaid) {\n identity.uaid = config.uaid;\n }\n if (config.ledgerAccountId) {\n identity.ledgerAccountId = config.ledgerAccountId;\n if (config.ledgerNetwork) {\n identity.ledgerNetwork = config.ledgerNetwork;\n }\n }\n if (config.email) {\n identity.email = config.email;\n }\n if (identity.uaid || identity.ledgerAccountId || identity.email) {\n return identity;\n }\n return null;\n}\n\nfunction derivePublicKeyFromPrivateKey(\n client: RegistryBrokerClient,\n privateKey: string,\n): string {\n const normalized = client.hexToBuffer(privateKey);\n const publicKey = secp256k1.getPublicKey(normalized, true);\n return Buffer.from(publicKey).toString('hex');\n}\n\nasync function resolveAutoRegisterKeyMaterial(\n client: RegistryBrokerClient,\n config: AutoRegisterEncryptionKeyOptions,\n): Promise<{ publicKey: string; privateKey?: string } | null> {\n if (config.publicKey?.trim()) {\n return { publicKey: config.publicKey.trim() };\n }\n let privateKey = config.privateKey?.trim();\n const envVar = config.envVar ?? 'RB_ENCRYPTION_PRIVATE_KEY';\n if (!privateKey && envVar && process?.env?.[envVar]?.trim()) {\n privateKey = process.env[envVar]?.trim();\n }\n if (!privateKey && config.generateIfMissing) {\n const pair = await client.generateEncryptionKeyPair({\n keyType: config.keyType ?? 'secp256k1',\n envVar,\n envPath: config.envPath,\n overwrite: config.overwriteEnv,\n });\n return { publicKey: pair.publicKey, privateKey: pair.privateKey };\n }\n if (privateKey) {\n const publicKey = derivePublicKeyFromPrivateKey(client, privateKey);\n return { publicKey, privateKey };\n }\n return null;\n}\n\nexport async function autoRegisterEncryptionKey(\n client: RegistryBrokerClient,\n config: AutoRegisterEncryptionKeyOptions,\n): Promise<{ publicKey: string; privateKey?: string }> {\n const identity = normalizeAutoRegisterIdentity(config);\n if (!identity) {\n throw new Error(\n 'Auto-registration requires uaid, ledgerAccountId, or email',\n );\n }\n const material = await resolveAutoRegisterKeyMaterial(client, config);\n if (!material) {\n throw new Error(\n 'Unable to resolve encryption public key for auto-registration',\n );\n }\n await registerEncryptionKey(client, {\n keyType: config.keyType ?? 'secp256k1',\n publicKey: material.publicKey,\n ...identity,\n });\n return material;\n}\n\nexport async function ensureAgentEncryptionKey(\n client: RegistryBrokerClient,\n options: EnsureAgentKeyOptions,\n): Promise<{ publicKey: string; privateKey?: string }> {\n return autoRegisterEncryptionKey(client, {\n ...options,\n uaid: options.uaid,\n enabled: true,\n });\n}\n\nexport function createEncryptionApi(\n client: RegistryBrokerClient,\n): RegistryBrokerEncryptionApi {\n return {\n registerKey: (payload: RegisterEncryptionKeyPayload) =>\n registerEncryptionKey(client, payload),\n generateEphemeralKeyPair: () => client.createEphemeralKeyPair(),\n deriveSharedSecret: (options: DeriveSharedSecretOptions) =>\n client.deriveSharedSecret(options),\n encryptCipherEnvelope: (options: EncryptCipherEnvelopeOptions) =>\n client.buildCipherEnvelope(options),\n decryptCipherEnvelope: (options: DecryptCipherEnvelopeOptions) =>\n client.openCipherEnvelope(options),\n ensureAgentKey: (options: EnsureAgentKeyOptions) =>\n ensureAgentEncryptionKey(client, options),\n };\n}\n\nexport async function bootstrapEncryptionOptions(\n client: RegistryBrokerClient,\n options?: ClientEncryptionOptions,\n): Promise<{ publicKey: string; privateKey?: string } | null> {\n if (!options?.autoRegister || options.autoRegister.enabled === false) {\n return null;\n }\n return autoRegisterEncryptionKey(client, options.autoRegister);\n}\n\nexport async function generateEncryptionKeyPair(\n client: RegistryBrokerClient,\n options: GenerateEncryptionKeyPairOptions = {},\n): Promise<{\n privateKey: string;\n publicKey: string;\n envPath?: string;\n envVar: string;\n}> {\n client.assertNodeRuntime('generateEncryptionKeyPair');\n\n const keyType = options.keyType ?? 'secp256k1';\n if (keyType !== 'secp256k1') {\n throw new Error('Only secp256k1 key generation is supported currently');\n }\n\n const privateKeyBytes = randomBytes(32);\n const privateKey = Buffer.from(privateKeyBytes).toString('hex');\n const publicKeyBytes = secp256k1.getPublicKey(privateKeyBytes, true);\n const publicKey = Buffer.from(publicKeyBytes).toString('hex');\n\n const envVar = options.envVar ?? 'RB_ENCRYPTION_PRIVATE_KEY';\n const resolvedPath = options.envPath\n ? path.resolve(options.envPath)\n : undefined;\n\n if (resolvedPath) {\n const fsModule = await getFs();\n\n if (!fsModule) {\n throw new Error(\n 'File system module is not available; cannot write encryption key env file',\n );\n }\n\n const envLine = `${envVar}=${privateKey}`;\n if (fsModule.existsSync(resolvedPath)) {\n const content = fsModule.readFileSync(resolvedPath, 'utf-8');\n const lineRegex = new RegExp(`^${envVar}=.*$`, 'm');\n if (lineRegex.test(content)) {\n if (!options.overwrite) {\n throw new Error(\n `${envVar} already exists in ${resolvedPath}; set overwrite=true to replace it`,\n );\n }\n const updated = content.replace(lineRegex, envLine);\n fsModule.writeFileSync(resolvedPath, updated);\n } else {\n const needsNewline = !content.endsWith('\\n');\n fsModule.appendFileSync(\n resolvedPath,\n `${needsNewline ? '\\n' : ''}${envLine}\\n`,\n );\n }\n } else {\n fsModule.writeFileSync(resolvedPath, `${envLine}\\n`);\n }\n }\n\n return {\n privateKey,\n publicKey,\n envPath: resolvedPath,\n envVar,\n };\n}\n"],"names":[],"mappings":"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"}
|