@hashgraphonline/standards-sdk 0.1.146-chore-jsr-improvements.canary.6bc8731.90 → 0.1.146-chore-jsr-improvements.canary.01d3174.92

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.
Files changed (142) hide show
  1. package/dist/cjs/jsr-entry.d.ts +30 -10
  2. package/dist/cjs/jsr-entry.d.ts.map +1 -1
  3. package/dist/cjs/services/registry-broker/client/base-client.d.ts +14 -1
  4. package/dist/cjs/services/registry-broker/client/base-client.d.ts.map +1 -1
  5. package/dist/cjs/services/registry-broker/client/search-helpers.d.ts +16 -0
  6. package/dist/cjs/services/registry-broker/client/search-helpers.d.ts.map +1 -0
  7. package/dist/cjs/services/registry-broker/client/search.d.ts +5 -18
  8. package/dist/cjs/services/registry-broker/client/search.d.ts.map +1 -1
  9. package/dist/cjs/standards-sdk.cjs +1 -1
  10. package/dist/cjs/standards-sdk.cjs.map +1 -1
  11. package/dist/es/jsr-entry.d.ts +30 -10
  12. package/dist/es/jsr-entry.d.ts.map +1 -1
  13. package/dist/es/services/registry-broker/client/base-client.d.ts +14 -1
  14. package/dist/es/services/registry-broker/client/base-client.d.ts.map +1 -1
  15. package/dist/es/services/registry-broker/client/search-helpers.d.ts +16 -0
  16. package/dist/es/services/registry-broker/client/search-helpers.d.ts.map +1 -0
  17. package/dist/es/services/registry-broker/client/search.d.ts +5 -18
  18. package/dist/es/services/registry-broker/client/search.d.ts.map +1 -1
  19. package/dist/es/standards-sdk.es.js +9 -10
  20. package/dist/es/standards-sdk.es.js.map +1 -1
  21. package/dist/es/standards-sdk.es101.js +1 -1
  22. package/dist/es/standards-sdk.es103.js +1 -1
  23. package/dist/es/standards-sdk.es109.js +2 -3
  24. package/dist/es/standards-sdk.es109.js.map +1 -1
  25. package/dist/es/standards-sdk.es11.js +1 -1
  26. package/dist/es/standards-sdk.es110.js +5 -5
  27. package/dist/es/standards-sdk.es12.js +1 -1
  28. package/dist/es/standards-sdk.es120.js +1 -1
  29. package/dist/es/standards-sdk.es121.js +1 -1
  30. package/dist/es/standards-sdk.es122.js +5 -5
  31. package/dist/es/standards-sdk.es124.js +1 -1
  32. package/dist/es/standards-sdk.es125.js +1 -1
  33. package/dist/es/standards-sdk.es127.js +3 -3
  34. package/dist/es/standards-sdk.es128.js +61 -164
  35. package/dist/es/standards-sdk.es128.js.map +1 -1
  36. package/dist/es/standards-sdk.es129.js +102 -85
  37. package/dist/es/standards-sdk.es129.js.map +1 -1
  38. package/dist/es/standards-sdk.es130.js +222 -96
  39. package/dist/es/standards-sdk.es130.js.map +1 -1
  40. package/dist/es/standards-sdk.es131.js +153 -220
  41. package/dist/es/standards-sdk.es131.js.map +1 -1
  42. package/dist/es/standards-sdk.es132.js +104 -162
  43. package/dist/es/standards-sdk.es132.js.map +1 -1
  44. package/dist/es/standards-sdk.es133.js +296 -92
  45. package/dist/es/standards-sdk.es133.js.map +1 -1
  46. package/dist/es/standards-sdk.es134.js +587 -288
  47. package/dist/es/standards-sdk.es134.js.map +1 -1
  48. package/dist/es/standards-sdk.es135.js +14 -461
  49. package/dist/es/standards-sdk.es135.js.map +1 -1
  50. package/dist/es/standards-sdk.es136.js +79 -15
  51. package/dist/es/standards-sdk.es136.js.map +1 -1
  52. package/dist/es/standards-sdk.es137.js +77 -71
  53. package/dist/es/standards-sdk.es137.js.map +1 -1
  54. package/dist/es/standards-sdk.es138.js +53 -80
  55. package/dist/es/standards-sdk.es138.js.map +1 -1
  56. package/dist/es/standards-sdk.es139.js +152 -53
  57. package/dist/es/standards-sdk.es139.js.map +1 -1
  58. package/dist/es/standards-sdk.es140.js +7 -159
  59. package/dist/es/standards-sdk.es140.js.map +1 -1
  60. package/dist/es/standards-sdk.es141.js +86 -7
  61. package/dist/es/standards-sdk.es141.js.map +1 -1
  62. package/dist/es/standards-sdk.es142.js +43 -64
  63. package/dist/es/standards-sdk.es142.js.map +1 -1
  64. package/dist/es/standards-sdk.es143.js +30 -65
  65. package/dist/es/standards-sdk.es143.js.map +1 -1
  66. package/dist/es/standards-sdk.es144.js +34 -30
  67. package/dist/es/standards-sdk.es144.js.map +1 -1
  68. package/dist/es/standards-sdk.es145.js +28 -34
  69. package/dist/es/standards-sdk.es145.js.map +1 -1
  70. package/dist/es/standards-sdk.es146.js +138 -28
  71. package/dist/es/standards-sdk.es146.js.map +1 -1
  72. package/dist/es/standards-sdk.es147.js +34 -12281
  73. package/dist/es/standards-sdk.es147.js.map +1 -1
  74. package/dist/es/standards-sdk.es148.js +17 -959
  75. package/dist/es/standards-sdk.es148.js.map +1 -1
  76. package/dist/es/standards-sdk.es149.js +12256 -105
  77. package/dist/es/standards-sdk.es149.js.map +1 -1
  78. package/dist/es/standards-sdk.es150.js +959 -42
  79. package/dist/es/standards-sdk.es150.js.map +1 -1
  80. package/dist/es/standards-sdk.es151.js +54 -15
  81. package/dist/es/standards-sdk.es151.js.map +1 -1
  82. package/dist/es/standards-sdk.es152.js +76 -48
  83. package/dist/es/standards-sdk.es152.js.map +1 -1
  84. package/dist/es/standards-sdk.es153.js +160 -72
  85. package/dist/es/standards-sdk.es153.js.map +1 -1
  86. package/dist/es/standards-sdk.es154.js +289 -139
  87. package/dist/es/standards-sdk.es154.js.map +1 -1
  88. package/dist/es/standards-sdk.es155.js +298 -274
  89. package/dist/es/standards-sdk.es155.js.map +1 -1
  90. package/dist/es/standards-sdk.es156.js +369 -262
  91. package/dist/es/standards-sdk.es156.js.map +1 -1
  92. package/dist/es/standards-sdk.es157.js +194 -316
  93. package/dist/es/standards-sdk.es157.js.map +1 -1
  94. package/dist/es/standards-sdk.es158.js +64 -319
  95. package/dist/es/standards-sdk.es158.js.map +1 -1
  96. package/dist/es/standards-sdk.es159.js +231 -68
  97. package/dist/es/standards-sdk.es159.js.map +1 -1
  98. package/dist/es/standards-sdk.es16.js +2 -3
  99. package/dist/es/standards-sdk.es16.js.map +1 -1
  100. package/dist/es/standards-sdk.es160.js +223 -218
  101. package/dist/es/standards-sdk.es160.js.map +1 -1
  102. package/dist/es/standards-sdk.es18.js +5 -6
  103. package/dist/es/standards-sdk.es18.js.map +1 -1
  104. package/dist/es/standards-sdk.es19.js +3 -4
  105. package/dist/es/standards-sdk.es19.js.map +1 -1
  106. package/dist/es/standards-sdk.es22.js +1 -1
  107. package/dist/es/standards-sdk.es27.js +5 -6
  108. package/dist/es/standards-sdk.es27.js.map +1 -1
  109. package/dist/es/standards-sdk.es30.js +1 -1
  110. package/dist/es/standards-sdk.es31.js +1 -1
  111. package/dist/es/standards-sdk.es35.js +3 -4
  112. package/dist/es/standards-sdk.es35.js.map +1 -1
  113. package/dist/es/standards-sdk.es36.js +3 -3
  114. package/dist/es/standards-sdk.es37.js +1 -1
  115. package/dist/es/standards-sdk.es4.js +1 -1
  116. package/dist/es/standards-sdk.es53.js +1 -1
  117. package/dist/es/standards-sdk.es56.js +1 -1
  118. package/dist/es/standards-sdk.es58.js +1 -1
  119. package/dist/es/standards-sdk.es59.js +1 -1
  120. package/dist/es/standards-sdk.es60.js +3 -4
  121. package/dist/es/standards-sdk.es60.js.map +1 -1
  122. package/dist/es/standards-sdk.es62.js +1 -1
  123. package/dist/es/standards-sdk.es64.js +1 -1
  124. package/dist/es/standards-sdk.es65.js +2 -2
  125. package/dist/es/standards-sdk.es68.js +2 -2
  126. package/dist/es/standards-sdk.es69.js +1 -1
  127. package/dist/es/standards-sdk.es7.js +1 -1
  128. package/dist/es/standards-sdk.es71.js +1 -1
  129. package/dist/es/standards-sdk.es76.js +1 -1
  130. package/dist/es/standards-sdk.es77.js +2 -3
  131. package/dist/es/standards-sdk.es77.js.map +1 -1
  132. package/dist/es/standards-sdk.es78.js +1 -1
  133. package/dist/es/standards-sdk.es81.js +1 -1
  134. package/dist/es/standards-sdk.es83.js +1 -1
  135. package/dist/es/standards-sdk.es87.js +3 -3
  136. package/dist/es/standards-sdk.es91.js +1 -1
  137. package/dist/es/standards-sdk.es92.js +1 -1
  138. package/dist/es/standards-sdk.es97.js +1 -1
  139. package/dist/es/standards-sdk.es99.js +1 -1
  140. package/package.json +1 -1
  141. package/dist/es/standards-sdk.es161.js +0 -247
  142. package/dist/es/standards-sdk.es161.js.map +0 -1
@@ -1,183 +1,125 @@
1
1
  import { Buffer } from "buffer";
2
- import { ledgerChallengeResponseSchema, ledgerVerifyResponseSchema } from "./standards-sdk.es148.js";
3
- import { canonicalizeLedgerNetwork } from "./standards-sdk.es138.js";
4
- import { createPrivateKeySignerAsync } from "./standards-sdk.es137.js";
5
- import { RegistryBrokerClient } from "./standards-sdk.es135.js";
6
- async function loadViemAccount(privateKey) {
7
- try {
8
- const viem = await import("viem/accounts");
9
- return viem.privateKeyToAccount(privateKey);
10
- } catch (error) {
11
- const err = new Error(
12
- 'EVM ledger authentication requires the optional dependency "viem". Install it to use evmPrivateKey flows.'
13
- );
14
- err.cause = error;
15
- throw err;
2
+ import { chatHistorySnapshotResponseSchema } from "./standards-sdk.es150.js";
3
+ import { RegistryBrokerClient } from "./standards-sdk.es134.js";
4
+ const conversationContexts = /* @__PURE__ */ new WeakMap();
5
+ function getConversationContextMap(client) {
6
+ const existing = conversationContexts.get(client);
7
+ if (existing) {
8
+ return existing;
16
9
  }
10
+ const created = /* @__PURE__ */ new Map();
11
+ conversationContexts.set(client, created);
12
+ return created;
17
13
  }
18
- async function resolveLedgerAuthSignature(message, options) {
19
- if (typeof options.sign === "function") {
20
- const result = await options.sign(message);
21
- if (!result || typeof result.signature !== "string" || result.signature.length === 0) {
22
- throw new Error("Custom ledger signer failed to produce a signature.");
23
- }
24
- return result;
14
+ function identitiesMatch(a, b) {
15
+ if (!a && !b) {
16
+ return true;
25
17
  }
26
- if (!options.signer || typeof options.signer.sign !== "function") {
27
- throw new Error(
28
- "Ledger authentication requires a Hedera Signer or custom sign function."
29
- );
18
+ if (!a || !b) {
19
+ return false;
30
20
  }
31
- const payload = Buffer.from(message, "utf8");
32
- const signatures = await options.signer.sign([payload]);
33
- const signatureEntry = signatures?.[0];
34
- if (!signatureEntry) {
35
- throw new Error("Signer did not return any signatures.");
36
- }
37
- let derivedPublicKey;
38
- if (signatureEntry.publicKey) {
39
- derivedPublicKey = signatureEntry.publicKey.toString();
40
- } else if (typeof options.signer.getAccountKey === "function") {
41
- const accountKey = await options.signer.getAccountKey();
42
- if (accountKey && typeof accountKey.toString === "function") {
43
- derivedPublicKey = accountKey.toString();
44
- }
21
+ if (a.uaid && b.uaid && a.uaid.toLowerCase() === b.uaid.toLowerCase()) {
22
+ return true;
45
23
  }
46
- return {
47
- signature: Buffer.from(signatureEntry.signature).toString("base64"),
48
- signatureKind: "raw",
49
- publicKey: derivedPublicKey
50
- };
24
+ if (a.ledgerAccountId && b.ledgerAccountId && a.ledgerAccountId.toLowerCase() === b.ledgerAccountId.toLowerCase()) {
25
+ return true;
26
+ }
27
+ if (a.userId && b.userId && a.userId === b.userId) {
28
+ return true;
29
+ }
30
+ if (a.email && b.email && a.email.toLowerCase() === b.email.toLowerCase()) {
31
+ return true;
32
+ }
33
+ return false;
51
34
  }
52
- RegistryBrokerClient.prototype.createLedgerChallenge = async function(payload) {
53
- const resolvedNetwork = canonicalizeLedgerNetwork(payload.network);
54
- const network = resolvedNetwork.kind === "hedera" ? resolvedNetwork.hederaNetwork ?? resolvedNetwork.canonical : resolvedNetwork.canonical;
55
- const raw = await this.requestJson("/auth/ledger/challenge", {
56
- method: "POST",
57
- headers: { "content-type": "application/json" },
58
- body: {
59
- accountId: payload.accountId,
60
- network
35
+ RegistryBrokerClient.prototype.fetchHistorySnapshot = async function(sessionId, options) {
36
+ if (!sessionId || sessionId.trim().length === 0) {
37
+ throw new Error("sessionId is required to fetch chat history");
38
+ }
39
+ const raw = await this.requestJson(
40
+ `/chat/session/${encodeURIComponent(sessionId)}/history`,
41
+ {
42
+ method: "GET"
61
43
  }
62
- });
63
- return this.parseWithSchema(
44
+ );
45
+ const snapshot = this.parseWithSchema(
64
46
  raw,
65
- ledgerChallengeResponseSchema,
66
- "ledger challenge response"
47
+ chatHistorySnapshotResponseSchema,
48
+ "chat history snapshot response"
67
49
  );
50
+ return this.attachDecryptedHistory(sessionId, snapshot, options);
68
51
  };
69
- RegistryBrokerClient.prototype.verifyLedgerChallenge = async function(payload) {
70
- const resolvedNetwork = canonicalizeLedgerNetwork(payload.network);
71
- const network = resolvedNetwork.kind === "hedera" ? resolvedNetwork.hederaNetwork ?? resolvedNetwork.canonical : resolvedNetwork.canonical;
72
- const body = {
73
- challengeId: payload.challengeId,
74
- accountId: payload.accountId,
75
- network,
76
- signature: payload.signature
77
- };
78
- if (payload.signatureKind) {
79
- body.signatureKind = payload.signatureKind;
80
- }
81
- if (payload.publicKey) {
82
- body.publicKey = payload.publicKey;
52
+ RegistryBrokerClient.prototype.attachDecryptedHistory = function(sessionId, snapshot, options) {
53
+ const shouldDecrypt = options?.decrypt !== void 0 ? options.decrypt : this.encryptionOptions?.autoDecryptHistory === true;
54
+ if (!shouldDecrypt) {
55
+ return snapshot;
83
56
  }
84
- if (typeof payload.expiresInMinutes === "number") {
85
- body.expiresInMinutes = payload.expiresInMinutes;
57
+ const context = this.resolveDecryptionContext(sessionId, options);
58
+ if (!context) {
59
+ throw new Error(
60
+ "Unable to decrypt chat history: encryption context unavailable"
61
+ );
86
62
  }
87
- const raw = await this.requestJson("/auth/ledger/verify", {
88
- method: "POST",
89
- headers: { "content-type": "application/json" },
90
- body
91
- });
92
- const result = this.parseWithSchema(
93
- raw,
94
- ledgerVerifyResponseSchema,
95
- "ledger verification response"
96
- );
97
- this.setLedgerApiKey(result.key);
98
- return result;
63
+ const decryptedHistory = snapshot.history.map((entry) => ({
64
+ entry,
65
+ plaintext: this.decryptHistoryEntryFromContext(sessionId, entry, context)
66
+ }));
67
+ return { ...snapshot, decryptedHistory };
99
68
  };
100
- RegistryBrokerClient.prototype.authenticateWithLedger = async function(options) {
101
- const challenge = await this.createLedgerChallenge({
102
- accountId: options.accountId,
103
- network: options.network
104
- });
105
- const signed = await resolveLedgerAuthSignature(challenge.message, options);
106
- const verification = await this.verifyLedgerChallenge({
107
- challengeId: challenge.challengeId,
108
- accountId: options.accountId,
109
- network: options.network,
110
- signature: signed.signature,
111
- signatureKind: signed.signatureKind,
112
- publicKey: signed.publicKey,
113
- expiresInMinutes: options.expiresInMinutes
114
- });
115
- return verification;
116
- };
117
- RegistryBrokerClient.prototype.authenticateWithLedgerCredentials = async function(options) {
118
- const {
119
- accountId,
120
- network,
121
- signer,
122
- sign,
123
- hederaPrivateKey,
124
- evmPrivateKey,
125
- expiresInMinutes,
126
- setAccountHeader = true,
127
- label,
128
- logger
129
- } = options;
130
- const resolvedNetwork = canonicalizeLedgerNetwork(network);
131
- const labelSuffix = label ? ` for ${label}` : "";
132
- const networkPayload = resolvedNetwork.canonical;
133
- const authOptions = {
134
- accountId,
135
- network: networkPayload,
136
- expiresInMinutes
69
+ RegistryBrokerClient.prototype.registerConversationContextForEncryption = function(context) {
70
+ const normalized = {
71
+ sessionId: context.sessionId,
72
+ sharedSecret: Buffer.from(context.sharedSecret),
73
+ identity: context.identity ? { ...context.identity } : void 0
137
74
  };
138
- if (sign) {
139
- authOptions.sign = sign;
140
- } else if (signer) {
141
- authOptions.signer = signer;
142
- } else if (hederaPrivateKey) {
143
- if (resolvedNetwork.kind !== "hedera" || !resolvedNetwork.hederaNetwork) {
144
- throw new Error(
145
- "hederaPrivateKey can only be used with hedera:mainnet or hedera:testnet networks."
146
- );
147
- }
148
- authOptions.signer = await createPrivateKeySignerAsync({
149
- accountId,
150
- privateKey: hederaPrivateKey,
151
- network: resolvedNetwork.hederaNetwork
152
- });
153
- } else if (evmPrivateKey) {
154
- if (resolvedNetwork.kind !== "evm") {
155
- throw new Error(
156
- "evmPrivateKey can only be used with CAIP-2 EVM networks (eip155:<chainId>)."
157
- );
158
- }
159
- const formattedKey = evmPrivateKey.startsWith("0x") ? evmPrivateKey : `0x${evmPrivateKey}`;
160
- const account = await loadViemAccount(formattedKey);
161
- authOptions.sign = async (message) => ({
162
- signature: await account.signMessage({ message }),
163
- signatureKind: "evm",
164
- publicKey: account.publicKey
165
- });
75
+ const map = getConversationContextMap(this);
76
+ const entries = map.get(context.sessionId) ?? [];
77
+ const existingIndex = entries.findIndex(
78
+ (existing) => identitiesMatch(existing.identity, normalized.identity)
79
+ );
80
+ if (existingIndex >= 0) {
81
+ entries[existingIndex] = normalized;
166
82
  } else {
167
- throw new Error(
168
- "Provide a signer, sign function, hederaPrivateKey, or evmPrivateKey to authenticate with the ledger."
83
+ entries.push(normalized);
84
+ }
85
+ map.set(context.sessionId, entries);
86
+ };
87
+ RegistryBrokerClient.prototype.resolveDecryptionContext = function(sessionId, options) {
88
+ if (options?.sharedSecret) {
89
+ return {
90
+ sessionId,
91
+ sharedSecret: this.normalizeSharedSecret(options.sharedSecret),
92
+ identity: options.identity
93
+ };
94
+ }
95
+ const map = getConversationContextMap(this);
96
+ const contexts = map.get(sessionId);
97
+ if (!contexts || contexts.length === 0) {
98
+ return null;
99
+ }
100
+ if (options?.identity) {
101
+ const match = contexts.find(
102
+ (context) => identitiesMatch(context.identity, options.identity)
169
103
  );
104
+ if (match) {
105
+ return match;
106
+ }
170
107
  }
171
- logger?.info?.(
172
- `Authenticating ledger account ${accountId} (${resolvedNetwork.canonical})${labelSuffix}...`
173
- );
174
- const verification = await this.authenticateWithLedger(authOptions);
175
- if (setAccountHeader) {
176
- this.setDefaultHeader("x-account-id", verification.accountId);
108
+ return contexts[0];
109
+ };
110
+ RegistryBrokerClient.prototype.decryptHistoryEntryFromContext = function(sessionId, entry, context) {
111
+ const envelope = entry.cipherEnvelope;
112
+ if (!envelope) {
113
+ return entry.content;
114
+ }
115
+ const secret = Buffer.from(context.sharedSecret);
116
+ try {
117
+ return this.encryption.decryptCipherEnvelope({
118
+ envelope,
119
+ sharedSecret: secret
120
+ });
121
+ } catch (_error) {
122
+ return null;
177
123
  }
178
- logger?.info?.(
179
- `Ledger authentication complete${labelSuffix}. Issued key prefix: ${verification.apiKey.prefix}…${verification.apiKey.lastFour}`
180
- );
181
- return verification;
182
124
  };
183
125
  //# sourceMappingURL=standards-sdk.es132.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es132.js","sources":["../../src/services/registry-broker/client/ledger-auth.ts"],"sourcesContent":["import { Buffer } from 'buffer';\nimport type { SignerSignature } from '@hashgraph/sdk';\nimport type {\n JsonObject,\n JsonValue,\n LedgerAuthenticationOptions,\n LedgerAuthenticationSignerResult,\n LedgerChallengeRequest,\n LedgerChallengeResponse,\n LedgerCredentialAuthOptions,\n LedgerVerifyRequest,\n LedgerVerifyResponse,\n} from '../types';\nimport {\n ledgerChallengeResponseSchema,\n ledgerVerifyResponseSchema,\n} from '../schemas';\nimport { canonicalizeLedgerNetwork } from '../ledger-network';\nimport { createPrivateKeySignerAsync } from '../private-key-signer';\nimport { RegistryBrokerClient } from './base-client';\n\ndeclare module './base-client' {\n interface RegistryBrokerClient {\n createLedgerChallenge(\n payload: LedgerChallengeRequest,\n ): Promise<LedgerChallengeResponse>;\n verifyLedgerChallenge(\n payload: LedgerVerifyRequest,\n ): Promise<LedgerVerifyResponse>;\n authenticateWithLedger(\n options: LedgerAuthenticationOptions,\n ): Promise<LedgerVerifyResponse>;\n authenticateWithLedgerCredentials(\n options: LedgerCredentialAuthOptions,\n ): Promise<LedgerVerifyResponse>;\n }\n}\n\nasync function loadViemAccount(privateKey: `0x${string}`): Promise<{\n publicKey: string;\n signMessage: (input: { message: string }) => Promise<string>;\n}> {\n try {\n const viem = await import('viem/accounts');\n return viem.privateKeyToAccount(privateKey);\n } catch (error) {\n const err = new Error(\n 'EVM ledger authentication requires the optional dependency \"viem\". Install it to use evmPrivateKey flows.',\n );\n (err as { cause?: unknown }).cause = error;\n throw err;\n }\n}\n\nasync function resolveLedgerAuthSignature(\n message: string,\n options: LedgerAuthenticationOptions,\n): Promise<LedgerAuthenticationSignerResult> {\n if (typeof options.sign === 'function') {\n const result = await options.sign(message);\n if (\n !result ||\n typeof result.signature !== 'string' ||\n result.signature.length === 0\n ) {\n throw new Error('Custom ledger signer failed to produce a signature.');\n }\n return result;\n }\n\n if (!options.signer || typeof options.signer.sign !== 'function') {\n throw new Error(\n 'Ledger authentication requires a Hedera Signer or custom sign function.',\n );\n }\n\n const payload = Buffer.from(message, 'utf8');\n const signatures: SignerSignature[] = await options.signer.sign([payload]);\n const signatureEntry = signatures?.[0];\n if (!signatureEntry) {\n throw new Error('Signer did not return any signatures.');\n }\n\n let derivedPublicKey: string | undefined;\n if (signatureEntry.publicKey) {\n derivedPublicKey = signatureEntry.publicKey.toString();\n } else if (typeof options.signer.getAccountKey === 'function') {\n const accountKey = await options.signer.getAccountKey();\n if (accountKey && typeof accountKey.toString === 'function') {\n derivedPublicKey = accountKey.toString();\n }\n }\n\n return {\n signature: Buffer.from(signatureEntry.signature).toString('base64'),\n signatureKind: 'raw',\n publicKey: derivedPublicKey,\n };\n}\n\nRegistryBrokerClient.prototype.createLedgerChallenge = async function (\n this: RegistryBrokerClient,\n payload: LedgerChallengeRequest,\n): Promise<LedgerChallengeResponse> {\n const resolvedNetwork = canonicalizeLedgerNetwork(payload.network);\n const network =\n resolvedNetwork.kind === 'hedera'\n ? (resolvedNetwork.hederaNetwork ?? resolvedNetwork.canonical)\n : resolvedNetwork.canonical;\n const raw = await this.requestJson<JsonValue>('/auth/ledger/challenge', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: {\n accountId: payload.accountId,\n network,\n },\n });\n\n return this.parseWithSchema(\n raw,\n ledgerChallengeResponseSchema,\n 'ledger challenge response',\n );\n};\n\nRegistryBrokerClient.prototype.verifyLedgerChallenge = async function (\n this: RegistryBrokerClient,\n payload: LedgerVerifyRequest,\n): Promise<LedgerVerifyResponse> {\n const resolvedNetwork = canonicalizeLedgerNetwork(payload.network);\n const network =\n resolvedNetwork.kind === 'hedera'\n ? (resolvedNetwork.hederaNetwork ?? resolvedNetwork.canonical)\n : resolvedNetwork.canonical;\n const body: JsonObject = {\n challengeId: payload.challengeId,\n accountId: payload.accountId,\n network,\n signature: payload.signature,\n };\n\n if (payload.signatureKind) {\n body.signatureKind = payload.signatureKind;\n }\n if (payload.publicKey) {\n body.publicKey = payload.publicKey;\n }\n if (typeof payload.expiresInMinutes === 'number') {\n body.expiresInMinutes = payload.expiresInMinutes;\n }\n\n const raw = await this.requestJson<JsonValue>('/auth/ledger/verify', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body,\n });\n\n const result = this.parseWithSchema(\n raw,\n ledgerVerifyResponseSchema,\n 'ledger verification response',\n );\n\n this.setLedgerApiKey(result.key);\n return result;\n};\n\nRegistryBrokerClient.prototype.authenticateWithLedger = async function (\n this: RegistryBrokerClient,\n options: LedgerAuthenticationOptions,\n): Promise<LedgerVerifyResponse> {\n const challenge = await this.createLedgerChallenge({\n accountId: options.accountId,\n network: options.network,\n });\n const signed = await resolveLedgerAuthSignature(challenge.message, options);\n const verification = await this.verifyLedgerChallenge({\n challengeId: challenge.challengeId,\n accountId: options.accountId,\n network: options.network,\n signature: signed.signature,\n signatureKind: signed.signatureKind,\n publicKey: signed.publicKey,\n expiresInMinutes: options.expiresInMinutes,\n });\n return verification;\n};\n\nRegistryBrokerClient.prototype.authenticateWithLedgerCredentials =\n async function (\n this: RegistryBrokerClient,\n options: LedgerCredentialAuthOptions,\n ): Promise<LedgerVerifyResponse> {\n const {\n accountId,\n network,\n signer,\n sign,\n hederaPrivateKey,\n evmPrivateKey,\n expiresInMinutes,\n setAccountHeader = true,\n label,\n logger,\n } = options;\n\n const resolvedNetwork = canonicalizeLedgerNetwork(network);\n const labelSuffix = label ? ` for ${label}` : '';\n\n const networkPayload = resolvedNetwork.canonical;\n\n const authOptions: LedgerAuthenticationOptions = {\n accountId,\n network: networkPayload,\n expiresInMinutes,\n };\n\n if (sign) {\n authOptions.sign = sign;\n } else if (signer) {\n authOptions.signer = signer;\n } else if (hederaPrivateKey) {\n if (resolvedNetwork.kind !== 'hedera' || !resolvedNetwork.hederaNetwork) {\n throw new Error(\n 'hederaPrivateKey can only be used with hedera:mainnet or hedera:testnet networks.',\n );\n }\n authOptions.signer = await createPrivateKeySignerAsync({\n accountId,\n privateKey: hederaPrivateKey,\n network: resolvedNetwork.hederaNetwork,\n });\n } else if (evmPrivateKey) {\n if (resolvedNetwork.kind !== 'evm') {\n throw new Error(\n 'evmPrivateKey can only be used with CAIP-2 EVM networks (eip155:<chainId>).',\n );\n }\n const formattedKey = evmPrivateKey.startsWith('0x')\n ? (evmPrivateKey as `0x${string}`)\n : (`0x${evmPrivateKey}` as `0x${string}`);\n const account = await loadViemAccount(formattedKey);\n authOptions.sign = async message => ({\n signature: await account.signMessage({ message }),\n signatureKind: 'evm',\n publicKey: account.publicKey,\n });\n } else {\n throw new Error(\n 'Provide a signer, sign function, hederaPrivateKey, or evmPrivateKey to authenticate with the ledger.',\n );\n }\n\n logger?.info?.(\n `Authenticating ledger account ${accountId} (${resolvedNetwork.canonical})${labelSuffix}...`,\n );\n const verification = await this.authenticateWithLedger(authOptions);\n if (setAccountHeader) {\n this.setDefaultHeader('x-account-id', verification.accountId);\n }\n logger?.info?.(\n `Ledger authentication complete${labelSuffix}. Issued key prefix: ${verification.apiKey.prefix}…${verification.apiKey.lastFour}`,\n );\n return verification;\n };\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"standards-sdk.es132.js","sources":["../../src/services/registry-broker/client/chat-history.ts"],"sourcesContent":["import { Buffer } from 'buffer';\nimport type {\n ChatHistoryEntry,\n ChatHistoryFetchOptions,\n ChatHistorySnapshotResponse,\n ChatHistorySnapshotWithDecryptedEntries,\n JsonValue,\n RecipientIdentity,\n} from '../types';\nimport { chatHistorySnapshotResponseSchema } from '../schemas';\nimport { RegistryBrokerClient } from './base-client';\n\ninterface ConversationContextInput {\n sessionId: string;\n sharedSecret: Uint8Array | Buffer;\n identity?: RecipientIdentity;\n}\n\ninterface ConversationContextState {\n sessionId: string;\n sharedSecret: Buffer;\n identity?: RecipientIdentity;\n}\n\nconst conversationContexts = new WeakMap<\n RegistryBrokerClient,\n Map<string, ConversationContextState[]>\n>();\n\nfunction getConversationContextMap(\n client: RegistryBrokerClient,\n): Map<string, ConversationContextState[]> {\n const existing = conversationContexts.get(client);\n if (existing) {\n return existing;\n }\n const created = new Map<string, ConversationContextState[]>();\n conversationContexts.set(client, created);\n return created;\n}\n\nfunction identitiesMatch(\n a?: RecipientIdentity,\n b?: RecipientIdentity,\n): boolean {\n if (!a && !b) {\n return true;\n }\n if (!a || !b) {\n return false;\n }\n if (a.uaid && b.uaid && a.uaid.toLowerCase() === b.uaid.toLowerCase()) {\n return true;\n }\n if (\n a.ledgerAccountId &&\n b.ledgerAccountId &&\n a.ledgerAccountId.toLowerCase() === b.ledgerAccountId.toLowerCase()\n ) {\n return true;\n }\n if (a.userId && b.userId && a.userId === b.userId) {\n return true;\n }\n if (a.email && b.email && a.email.toLowerCase() === b.email.toLowerCase()) {\n return true;\n }\n return false;\n}\n\ndeclare module './base-client' {\n interface RegistryBrokerClient {\n fetchHistorySnapshot(\n sessionId: string,\n options?: ChatHistoryFetchOptions,\n ): Promise<ChatHistorySnapshotWithDecryptedEntries>;\n attachDecryptedHistory(\n sessionId: string,\n snapshot: ChatHistorySnapshotResponse,\n options?: ChatHistoryFetchOptions,\n ): ChatHistorySnapshotWithDecryptedEntries;\n registerConversationContextForEncryption(\n context: ConversationContextInput,\n ): void;\n resolveDecryptionContext(\n sessionId: string,\n options?: ChatHistoryFetchOptions,\n ): ConversationContextState | null;\n decryptHistoryEntryFromContext(\n sessionId: string,\n entry: ChatHistoryEntry,\n context: ConversationContextState,\n ): string | null;\n }\n}\n\nRegistryBrokerClient.prototype.fetchHistorySnapshot = async function (\n this: RegistryBrokerClient,\n sessionId: string,\n options?: ChatHistoryFetchOptions,\n): Promise<ChatHistorySnapshotWithDecryptedEntries> {\n if (!sessionId || sessionId.trim().length === 0) {\n throw new Error('sessionId is required to fetch chat history');\n }\n const raw = await this.requestJson<JsonValue>(\n `/chat/session/${encodeURIComponent(sessionId)}/history`,\n {\n method: 'GET',\n },\n );\n const snapshot = this.parseWithSchema(\n raw,\n chatHistorySnapshotResponseSchema,\n 'chat history snapshot response',\n );\n return this.attachDecryptedHistory(sessionId, snapshot, options);\n};\n\nRegistryBrokerClient.prototype.attachDecryptedHistory = function (\n this: RegistryBrokerClient,\n sessionId: string,\n snapshot: ChatHistorySnapshotResponse,\n options?: ChatHistoryFetchOptions,\n): ChatHistorySnapshotWithDecryptedEntries {\n const shouldDecrypt =\n options?.decrypt !== undefined\n ? options.decrypt\n : this.encryptionOptions?.autoDecryptHistory === true;\n if (!shouldDecrypt) {\n return snapshot;\n }\n const context = this.resolveDecryptionContext(sessionId, options);\n if (!context) {\n throw new Error(\n 'Unable to decrypt chat history: encryption context unavailable',\n );\n }\n const decryptedHistory = snapshot.history.map(entry => ({\n entry,\n plaintext: this.decryptHistoryEntryFromContext(sessionId, entry, context),\n }));\n return { ...snapshot, decryptedHistory };\n};\n\nRegistryBrokerClient.prototype.registerConversationContextForEncryption =\n function (\n this: RegistryBrokerClient,\n context: ConversationContextInput,\n ): void {\n const normalized: ConversationContextState = {\n sessionId: context.sessionId,\n sharedSecret: Buffer.from(context.sharedSecret),\n identity: context.identity ? { ...context.identity } : undefined,\n };\n const map = getConversationContextMap(this);\n const entries = map.get(context.sessionId) ?? [];\n const existingIndex = entries.findIndex(existing =>\n identitiesMatch(existing.identity, normalized.identity),\n );\n if (existingIndex >= 0) {\n entries[existingIndex] = normalized;\n } else {\n entries.push(normalized);\n }\n map.set(context.sessionId, entries);\n };\n\nRegistryBrokerClient.prototype.resolveDecryptionContext = function (\n this: RegistryBrokerClient,\n sessionId: string,\n options?: ChatHistoryFetchOptions,\n): ConversationContextState | null {\n if (options?.sharedSecret) {\n return {\n sessionId,\n sharedSecret: this.normalizeSharedSecret(options.sharedSecret),\n identity: options.identity,\n };\n }\n const map = getConversationContextMap(this);\n const contexts = map.get(sessionId);\n if (!contexts || contexts.length === 0) {\n return null;\n }\n if (options?.identity) {\n const match = contexts.find(context =>\n identitiesMatch(context.identity, options.identity),\n );\n if (match) {\n return match;\n }\n }\n return contexts[0];\n};\n\nRegistryBrokerClient.prototype.decryptHistoryEntryFromContext = function (\n this: RegistryBrokerClient,\n sessionId: string,\n entry: ChatHistoryEntry,\n context: ConversationContextState,\n): string | null {\n const envelope = entry.cipherEnvelope;\n if (!envelope) {\n return entry.content;\n }\n const secret = Buffer.from(context.sharedSecret);\n try {\n return this.encryption.decryptCipherEnvelope({\n envelope,\n sharedSecret: secret,\n });\n } catch (_error) {\n return null;\n }\n};\n"],"names":[],"mappings":"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"}