@hashgraphonline/standards-sdk 0.1.143 → 0.1.144

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 (185) hide show
  1. package/dist/cjs/hcs-12/validation/schemas.d.ts +8 -8
  2. package/dist/cjs/hcs-21/types.d.ts +75 -75
  3. package/dist/cjs/services/registry-broker/client/adapters.d.ts +20 -0
  4. package/dist/cjs/services/registry-broker/client/adapters.d.ts.map +1 -0
  5. package/dist/cjs/services/registry-broker/client/agents.d.ts +16 -0
  6. package/dist/cjs/services/registry-broker/client/agents.d.ts.map +1 -0
  7. package/dist/cjs/services/registry-broker/client/base-client.d.ts +57 -0
  8. package/dist/cjs/services/registry-broker/client/base-client.d.ts.map +1 -0
  9. package/dist/cjs/services/registry-broker/client/chat-history.d.ts +23 -0
  10. package/dist/cjs/services/registry-broker/client/chat-history.d.ts.map +1 -0
  11. package/dist/cjs/services/registry-broker/client/chat.d.ts +33 -0
  12. package/dist/cjs/services/registry-broker/client/chat.d.ts.map +1 -0
  13. package/dist/cjs/services/registry-broker/client/credits.d.ts +40 -0
  14. package/dist/cjs/services/registry-broker/client/credits.d.ts.map +1 -0
  15. package/dist/cjs/services/registry-broker/client/encrypted-chat-manager.d.ts +35 -0
  16. package/dist/cjs/services/registry-broker/client/encrypted-chat-manager.d.ts.map +1 -0
  17. package/dist/cjs/services/registry-broker/client/encryption.d.ts +33 -0
  18. package/dist/cjs/services/registry-broker/client/encryption.d.ts.map +1 -0
  19. package/dist/cjs/services/registry-broker/client/errors.d.ts +19 -0
  20. package/dist/cjs/services/registry-broker/client/errors.d.ts.map +1 -0
  21. package/dist/cjs/services/registry-broker/client/ledger-auth.d.ts +10 -0
  22. package/dist/cjs/services/registry-broker/client/ledger-auth.d.ts.map +1 -0
  23. package/dist/cjs/services/registry-broker/client/search.d.ts +19 -0
  24. package/dist/cjs/services/registry-broker/client/search.d.ts.map +1 -0
  25. package/dist/cjs/services/registry-broker/client/utils.d.ts +21 -0
  26. package/dist/cjs/services/registry-broker/client/utils.d.ts.map +1 -0
  27. package/dist/cjs/services/registry-broker/client.d.ts +2 -205
  28. package/dist/cjs/services/registry-broker/client.d.ts.map +1 -1
  29. package/dist/cjs/services/registry-broker/schemas.d.ts +1426 -154
  30. package/dist/cjs/services/registry-broker/schemas.d.ts.map +1 -1
  31. package/dist/cjs/services/registry-broker/types.d.ts +45 -2
  32. package/dist/cjs/services/registry-broker/types.d.ts.map +1 -1
  33. package/dist/cjs/standards-sdk.cjs +3 -3
  34. package/dist/cjs/standards-sdk.cjs.map +1 -1
  35. package/dist/es/hcs-12/validation/schemas.d.ts +8 -8
  36. package/dist/es/hcs-21/types.d.ts +75 -75
  37. package/dist/es/services/registry-broker/client/adapters.d.ts +20 -0
  38. package/dist/es/services/registry-broker/client/adapters.d.ts.map +1 -0
  39. package/dist/es/services/registry-broker/client/agents.d.ts +16 -0
  40. package/dist/es/services/registry-broker/client/agents.d.ts.map +1 -0
  41. package/dist/es/services/registry-broker/client/base-client.d.ts +57 -0
  42. package/dist/es/services/registry-broker/client/base-client.d.ts.map +1 -0
  43. package/dist/es/services/registry-broker/client/chat-history.d.ts +23 -0
  44. package/dist/es/services/registry-broker/client/chat-history.d.ts.map +1 -0
  45. package/dist/es/services/registry-broker/client/chat.d.ts +33 -0
  46. package/dist/es/services/registry-broker/client/chat.d.ts.map +1 -0
  47. package/dist/es/services/registry-broker/client/credits.d.ts +40 -0
  48. package/dist/es/services/registry-broker/client/credits.d.ts.map +1 -0
  49. package/dist/es/services/registry-broker/client/encrypted-chat-manager.d.ts +35 -0
  50. package/dist/es/services/registry-broker/client/encrypted-chat-manager.d.ts.map +1 -0
  51. package/dist/es/services/registry-broker/client/encryption.d.ts +33 -0
  52. package/dist/es/services/registry-broker/client/encryption.d.ts.map +1 -0
  53. package/dist/es/services/registry-broker/client/errors.d.ts +19 -0
  54. package/dist/es/services/registry-broker/client/errors.d.ts.map +1 -0
  55. package/dist/es/services/registry-broker/client/ledger-auth.d.ts +10 -0
  56. package/dist/es/services/registry-broker/client/ledger-auth.d.ts.map +1 -0
  57. package/dist/es/services/registry-broker/client/search.d.ts +19 -0
  58. package/dist/es/services/registry-broker/client/search.d.ts.map +1 -0
  59. package/dist/es/services/registry-broker/client/utils.d.ts +21 -0
  60. package/dist/es/services/registry-broker/client/utils.d.ts.map +1 -0
  61. package/dist/es/services/registry-broker/client.d.ts +2 -205
  62. package/dist/es/services/registry-broker/client.d.ts.map +1 -1
  63. package/dist/es/services/registry-broker/schemas.d.ts +1426 -154
  64. package/dist/es/services/registry-broker/schemas.d.ts.map +1 -1
  65. package/dist/es/services/registry-broker/types.d.ts +45 -2
  66. package/dist/es/services/registry-broker/types.d.ts.map +1 -1
  67. package/dist/es/standards-sdk.es.js +16 -7
  68. package/dist/es/standards-sdk.es.js.map +1 -1
  69. package/dist/es/standards-sdk.es100.js +1 -1
  70. package/dist/es/standards-sdk.es102.js +1 -1
  71. package/dist/es/standards-sdk.es104.js +1 -1
  72. package/dist/es/standards-sdk.es110.js +11 -5
  73. package/dist/es/standards-sdk.es110.js.map +1 -1
  74. package/dist/es/standards-sdk.es111.js +5 -5
  75. package/dist/es/standards-sdk.es12.js +1 -1
  76. package/dist/es/standards-sdk.es121.js +1 -1
  77. package/dist/es/standards-sdk.es122.js +1 -1
  78. package/dist/es/standards-sdk.es123.js +5 -5
  79. package/dist/es/standards-sdk.es125.js +1 -1
  80. package/dist/es/standards-sdk.es126.js +1 -1
  81. package/dist/es/standards-sdk.es128.js +140 -2176
  82. package/dist/es/standards-sdk.es128.js.map +1 -1
  83. package/dist/es/standards-sdk.es129.js +200 -60
  84. package/dist/es/standards-sdk.es129.js.map +1 -1
  85. package/dist/es/standards-sdk.es13.js +1 -1
  86. package/dist/es/standards-sdk.es130.js +96 -79
  87. package/dist/es/standards-sdk.es130.js.map +1 -1
  88. package/dist/es/standards-sdk.es131.js +115 -153
  89. package/dist/es/standards-sdk.es131.js.map +1 -1
  90. package/dist/es/standards-sdk.es132.js +248 -8
  91. package/dist/es/standards-sdk.es132.js.map +1 -1
  92. package/dist/es/standards-sdk.es133.js +169 -75
  93. package/dist/es/standards-sdk.es133.js.map +1 -1
  94. package/dist/es/standards-sdk.es134.js +118 -61
  95. package/dist/es/standards-sdk.es134.js.map +1 -1
  96. package/dist/es/standards-sdk.es135.js +327 -29
  97. package/dist/es/standards-sdk.es135.js.map +1 -1
  98. package/dist/es/standards-sdk.es136.js +352 -124
  99. package/dist/es/standards-sdk.es136.js.map +1 -1
  100. package/dist/es/standards-sdk.es137.js +13 -38
  101. package/dist/es/standards-sdk.es137.js.map +1 -1
  102. package/dist/es/standards-sdk.es138.js +66 -765
  103. package/dist/es/standards-sdk.es138.js.map +1 -1
  104. package/dist/es/standards-sdk.es139.js +74 -12261
  105. package/dist/es/standards-sdk.es139.js.map +1 -1
  106. package/dist/es/standards-sdk.es140.js +152 -49
  107. package/dist/es/standards-sdk.es140.js.map +1 -1
  108. package/dist/es/standards-sdk.es141.js +7 -82
  109. package/dist/es/standards-sdk.es141.js.map +1 -1
  110. package/dist/es/standards-sdk.es142.js +81 -12
  111. package/dist/es/standards-sdk.es142.js.map +1 -1
  112. package/dist/es/standards-sdk.es143.js +55 -162
  113. package/dist/es/standards-sdk.es143.js.map +1 -1
  114. package/dist/es/standards-sdk.es144.js +28 -322
  115. package/dist/es/standards-sdk.es144.js.map +1 -1
  116. package/dist/es/standards-sdk.es145.js +120 -328
  117. package/dist/es/standards-sdk.es145.js.map +1 -1
  118. package/dist/es/standards-sdk.es146.js +40 -451
  119. package/dist/es/standards-sdk.es146.js.map +1 -1
  120. package/dist/es/standards-sdk.es147.js +12225 -267
  121. package/dist/es/standards-sdk.es147.js.map +1 -1
  122. package/dist/es/standards-sdk.es148.js +15 -74
  123. package/dist/es/standards-sdk.es148.js.map +1 -1
  124. package/dist/es/standards-sdk.es149.js +59 -0
  125. package/dist/es/standards-sdk.es149.js.map +1 -0
  126. package/dist/es/standards-sdk.es150.js +85 -0
  127. package/dist/es/standards-sdk.es150.js.map +1 -0
  128. package/dist/es/standards-sdk.es151.js +175 -0
  129. package/dist/es/standards-sdk.es151.js.map +1 -0
  130. package/dist/es/standards-sdk.es152.js +325 -0
  131. package/dist/es/standards-sdk.es152.js.map +1 -0
  132. package/dist/es/standards-sdk.es153.js +349 -0
  133. package/dist/es/standards-sdk.es153.js.map +1 -0
  134. package/dist/es/standards-sdk.es154.js +456 -0
  135. package/dist/es/standards-sdk.es154.js.map +1 -0
  136. package/dist/es/standards-sdk.es155.js +334 -0
  137. package/dist/es/standards-sdk.es155.js.map +1 -0
  138. package/dist/es/standards-sdk.es156.js +79 -0
  139. package/dist/es/standards-sdk.es156.js.map +1 -0
  140. package/dist/es/standards-sdk.es157.js +874 -0
  141. package/dist/es/standards-sdk.es157.js.map +1 -0
  142. package/dist/es/standards-sdk.es158.js +242 -0
  143. package/dist/es/standards-sdk.es158.js.map +1 -0
  144. package/dist/es/standards-sdk.es159.js +247 -0
  145. package/dist/es/standards-sdk.es159.js.map +1 -0
  146. package/dist/es/standards-sdk.es17.js +11 -5
  147. package/dist/es/standards-sdk.es17.js.map +1 -1
  148. package/dist/es/standards-sdk.es19.js +14 -9
  149. package/dist/es/standards-sdk.es19.js.map +1 -1
  150. package/dist/es/standards-sdk.es20.js +12 -7
  151. package/dist/es/standards-sdk.es20.js.map +1 -1
  152. package/dist/es/standards-sdk.es23.js +1 -1
  153. package/dist/es/standards-sdk.es28.js +14 -9
  154. package/dist/es/standards-sdk.es28.js.map +1 -1
  155. package/dist/es/standards-sdk.es31.js +1 -1
  156. package/dist/es/standards-sdk.es32.js +1 -1
  157. package/dist/es/standards-sdk.es36.js +11 -6
  158. package/dist/es/standards-sdk.es36.js.map +1 -1
  159. package/dist/es/standards-sdk.es37.js +3 -3
  160. package/dist/es/standards-sdk.es38.js +1 -1
  161. package/dist/es/standards-sdk.es5.js +1 -1
  162. package/dist/es/standards-sdk.es54.js +1 -1
  163. package/dist/es/standards-sdk.es57.js +1 -1
  164. package/dist/es/standards-sdk.es59.js +1 -1
  165. package/dist/es/standards-sdk.es60.js +1 -1
  166. package/dist/es/standards-sdk.es61.js +12 -7
  167. package/dist/es/standards-sdk.es61.js.map +1 -1
  168. package/dist/es/standards-sdk.es63.js +1 -1
  169. package/dist/es/standards-sdk.es65.js +1 -1
  170. package/dist/es/standards-sdk.es66.js +2 -2
  171. package/dist/es/standards-sdk.es69.js +2 -2
  172. package/dist/es/standards-sdk.es70.js +1 -1
  173. package/dist/es/standards-sdk.es72.js +1 -1
  174. package/dist/es/standards-sdk.es77.js +1 -1
  175. package/dist/es/standards-sdk.es78.js +11 -5
  176. package/dist/es/standards-sdk.es78.js.map +1 -1
  177. package/dist/es/standards-sdk.es79.js +1 -1
  178. package/dist/es/standards-sdk.es8.js +1 -1
  179. package/dist/es/standards-sdk.es82.js +1 -1
  180. package/dist/es/standards-sdk.es84.js +1 -1
  181. package/dist/es/standards-sdk.es88.js +1 -1
  182. package/dist/es/standards-sdk.es92.js +1 -1
  183. package/dist/es/standards-sdk.es93.js +1 -1
  184. package/dist/es/standards-sdk.es98.js +1 -1
  185. package/package.json +11 -12
@@ -1,89 +1,183 @@
1
- import { Logger } from "./standards-sdk.es106.js";
2
- class ContentResolverRegistryImpl {
3
- constructor() {
4
- this.resolver = null;
5
- this.onUnavailableCallbacks = [];
6
- this.logger = Logger.getInstance({ module: "ContentResolverRegistry" });
1
+ import { Buffer } from "buffer";
2
+ import { ledgerChallengeResponseSchema, ledgerVerifyResponseSchema } from "./standards-sdk.es157.js";
3
+ import { canonicalizeLedgerNetwork } from "./standards-sdk.es139.js";
4
+ import { createPrivateKeySigner } from "./standards-sdk.es138.js";
5
+ import { RegistryBrokerClient } from "./standards-sdk.es136.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;
7
16
  }
8
- static getInstance() {
9
- if (!ContentResolverRegistryImpl._instance) {
10
- ContentResolverRegistryImpl._instance = new ContentResolverRegistryImpl();
17
+ }
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.");
11
23
  }
12
- return ContentResolverRegistryImpl._instance;
24
+ return result;
13
25
  }
14
- /**
15
- * Register a content resolver (typically called by ContentStoreManager)
16
- */
17
- register(resolver) {
18
- if (this.resolver) {
19
- this.logger.warn("Resolver already registered, replacing existing");
20
- }
21
- this.resolver = resolver;
22
- this.logger.info("Content resolver registered");
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
+ );
23
30
  }
24
- /**
25
- * Get the registered content resolver
26
- */
27
- getResolver() {
28
- return this.resolver;
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.");
29
36
  }
30
- /**
31
- * Check if a resolver is available
32
- */
33
- isAvailable() {
34
- return this.resolver !== null;
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
+ }
35
45
  }
36
- /**
37
- * Unregister the current resolver
38
- */
39
- unregister() {
40
- if (this.resolver) {
41
- this.resolver = null;
42
- this.logger.info("Content resolver unregistered");
43
- this.onUnavailableCallbacks.forEach((callback) => {
44
- try {
45
- callback();
46
- } catch (error) {
47
- this.logger.error("Error in unavailable callback:", error);
48
- }
49
- });
46
+ return {
47
+ signature: Buffer.from(signatureEntry.signature).toString("base64"),
48
+ signatureKind: "raw",
49
+ publicKey: derivedPublicKey
50
+ };
51
+ }
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
50
61
  }
62
+ });
63
+ return this.parseWithSchema(
64
+ raw,
65
+ ledgerChallengeResponseSchema,
66
+ "ledger challenge response"
67
+ );
68
+ };
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;
51
80
  }
52
- /**
53
- * Register callback for when resolver becomes unavailable
54
- */
55
- onUnavailable(callback) {
56
- this.onUnavailableCallbacks.push(callback);
81
+ if (payload.publicKey) {
82
+ body.publicKey = payload.publicKey;
57
83
  }
58
- /**
59
- * Remove unavailable callback
60
- */
61
- offUnavailable(callback) {
62
- const index = this.onUnavailableCallbacks.indexOf(callback);
63
- if (index !== -1) {
64
- this.onUnavailableCallbacks.splice(index, 1);
65
- }
84
+ if (typeof payload.expiresInMinutes === "number") {
85
+ body.expiresInMinutes = payload.expiresInMinutes;
66
86
  }
67
- /**
68
- * Execute operation with resolver or fallback
69
- */
70
- async withResolver(operation, fallback) {
71
- if (this.resolver) {
72
- try {
73
- return await operation(this.resolver);
74
- } catch (error) {
75
- this.logger.warn("Resolver operation failed, using fallback:", error);
76
- return await fallback();
77
- }
78
- } else {
79
- this.logger.warn("No resolver available, using fallback");
80
- return await fallback();
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;
99
+ };
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
137
+ };
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 = createPrivateKeySigner({
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
+ );
81
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
+ });
166
+ } else {
167
+ throw new Error(
168
+ "Provide a signer, sign function, hederaPrivateKey, or evmPrivateKey to authenticate with the ledger."
169
+ );
82
170
  }
83
- }
84
- const ContentResolverRegistry = ContentResolverRegistryImpl.getInstance();
85
- export {
86
- ContentResolverRegistry,
87
- ContentResolverRegistryImpl
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);
177
+ }
178
+ logger?.info?.(
179
+ `Ledger authentication complete${labelSuffix}. Issued key prefix: ${verification.apiKey.prefix}…${verification.apiKey.lastFour}`
180
+ );
181
+ return verification;
88
182
  };
89
183
  //# sourceMappingURL=standards-sdk.es133.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es133.js","sources":["../../src/content-store/ContentResolverRegistry.ts"],"sourcesContent":["/**\n * Content Resolver Registry\n *\n * Dependency injection registry for content resolvers.\n * Allows tools to access content resolution without circular dependencies.\n */\n\nimport type { ContentResolverInterface } from './types';\nimport { Logger } from '../utils/logger';\n\nexport class ContentResolverRegistryImpl {\n private static _instance: ContentResolverRegistryImpl;\n private resolver: ContentResolverInterface | null = null;\n private onUnavailableCallbacks: (() => void)[] = [];\n private logger = Logger.getInstance({ module: 'ContentResolverRegistry' });\n\n static getInstance(): ContentResolverRegistryImpl {\n if (!ContentResolverRegistryImpl._instance) {\n ContentResolverRegistryImpl._instance = new ContentResolverRegistryImpl();\n }\n return ContentResolverRegistryImpl._instance;\n }\n\n /**\n * Register a content resolver (typically called by ContentStoreManager)\n */\n register(resolver: ContentResolverInterface): void {\n if (this.resolver) {\n this.logger.warn('Resolver already registered, replacing existing');\n }\n this.resolver = resolver;\n this.logger.info('Content resolver registered');\n }\n\n /**\n * Get the registered content resolver\n */\n getResolver(): ContentResolverInterface | null {\n return this.resolver;\n }\n\n /**\n * Check if a resolver is available\n */\n isAvailable(): boolean {\n return this.resolver !== null;\n }\n\n /**\n * Unregister the current resolver\n */\n unregister(): void {\n if (this.resolver) {\n this.resolver = null;\n this.logger.info('Content resolver unregistered');\n this.onUnavailableCallbacks.forEach(callback => {\n try {\n callback();\n } catch (error) {\n this.logger.error('Error in unavailable callback:', error);\n }\n });\n }\n }\n\n /**\n * Register callback for when resolver becomes unavailable\n */\n onUnavailable(callback: () => void): void {\n this.onUnavailableCallbacks.push(callback);\n }\n\n /**\n * Remove unavailable callback\n */\n offUnavailable(callback: () => void): void {\n const index = this.onUnavailableCallbacks.indexOf(callback);\n if (index !== -1) {\n this.onUnavailableCallbacks.splice(index, 1);\n }\n }\n\n /**\n * Execute operation with resolver or fallback\n */\n async withResolver<T>(\n operation: (resolver: ContentResolverInterface) => Promise<T>,\n fallback: () => Promise<T>,\n ): Promise<T> {\n if (this.resolver) {\n try {\n return await operation(this.resolver);\n } catch (error) {\n this.logger.warn('Resolver operation failed, using fallback:', error);\n return await fallback();\n }\n } else {\n this.logger.warn('No resolver available, using fallback');\n return await fallback();\n }\n }\n}\n\nexport const ContentResolverRegistry =\n ContentResolverRegistryImpl.getInstance();\n"],"names":[],"mappings":";AAUO,MAAM,4BAA4B;AAAA,EAAlC,cAAA;AAEL,SAAQ,WAA4C;AACpD,SAAQ,yBAAyC,CAAA;AACjD,SAAQ,SAAS,OAAO,YAAY,EAAE,QAAQ,2BAA2B;AAAA,EAAA;AAAA,EAEzE,OAAO,cAA2C;AAChD,QAAI,CAAC,4BAA4B,WAAW;AAC1C,kCAA4B,YAAY,IAAI,4BAAA;AAAA,IAC9C;AACA,WAAO,4BAA4B;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,UAA0C;AACjD,QAAI,KAAK,UAAU;AACjB,WAAK,OAAO,KAAK,iDAAiD;AAAA,IACpE;AACA,SAAK,WAAW;AAChB,SAAK,OAAO,KAAK,6BAA6B;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,cAA+C;AAC7C,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,cAAuB;AACrB,WAAO,KAAK,aAAa;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,aAAmB;AACjB,QAAI,KAAK,UAAU;AACjB,WAAK,WAAW;AAChB,WAAK,OAAO,KAAK,+BAA+B;AAChD,WAAK,uBAAuB,QAAQ,CAAA,aAAY;AAC9C,YAAI;AACF,mBAAA;AAAA,QACF,SAAS,OAAO;AACd,eAAK,OAAO,MAAM,kCAAkC,KAAK;AAAA,QAC3D;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,UAA4B;AACxC,SAAK,uBAAuB,KAAK,QAAQ;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,UAA4B;AACzC,UAAM,QAAQ,KAAK,uBAAuB,QAAQ,QAAQ;AAC1D,QAAI,UAAU,IAAI;AAChB,WAAK,uBAAuB,OAAO,OAAO,CAAC;AAAA,IAC7C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aACJ,WACA,UACY;AACZ,QAAI,KAAK,UAAU;AACjB,UAAI;AACF,eAAO,MAAM,UAAU,KAAK,QAAQ;AAAA,MACtC,SAAS,OAAO;AACd,aAAK,OAAO,KAAK,8CAA8C,KAAK;AACpE,eAAO,MAAM,SAAA;AAAA,MACf;AAAA,IACF,OAAO;AACL,WAAK,OAAO,KAAK,uCAAuC;AACxD,aAAO,MAAM,SAAA;AAAA,IACf;AAAA,EACF;AACF;AAEO,MAAM,0BACX,4BAA4B,YAAA;"}
1
+ {"version":3,"file":"standards-sdk.es133.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 { createPrivateKeySigner } 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 = createPrivateKeySigner({\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,68 +1,125 @@
1
- import { Logger } from "./standards-sdk.es106.js";
2
- const REFERENCE_THRESHOLD = 50 * 1024;
3
- class ContentStoreServiceImpl {
4
- constructor() {
5
- this.contentStore = null;
6
- this.logger = Logger.getInstance({ module: "ContentStoreService" });
7
- }
8
- static getInstance() {
9
- if (!ContentStoreServiceImpl._instance) {
10
- ContentStoreServiceImpl._instance = new ContentStoreServiceImpl();
11
- }
12
- return ContentStoreServiceImpl._instance;
13
- }
14
- /**
15
- * Set the content store instance
16
- */
17
- async setInstance(store) {
18
- if (this.contentStore) {
19
- this.logger.warn("Content store already set, replacing");
20
- }
21
- this.contentStore = store;
22
- this.logger.info("Content store instance set");
23
- }
24
- /**
25
- * Get the content store instance
26
- */
27
- getInstance() {
28
- return this.contentStore;
29
- }
30
- /**
31
- * Clear the content store instance
32
- */
33
- dispose() {
34
- this.contentStore = null;
35
- this.logger.info("Content store disposed");
36
- }
37
- /**
38
- * Check if content store is available
39
- */
40
- isAvailable() {
41
- return this.contentStore !== null;
1
+ import { Buffer } from "buffer";
2
+ import { chatHistorySnapshotResponseSchema } from "./standards-sdk.es157.js";
3
+ import { RegistryBrokerClient } from "./standards-sdk.es136.js";
4
+ const conversationContexts = /* @__PURE__ */ new WeakMap();
5
+ function getConversationContextMap(client) {
6
+ const existing = conversationContexts.get(client);
7
+ if (existing) {
8
+ return existing;
42
9
  }
10
+ const created = /* @__PURE__ */ new Map();
11
+ conversationContexts.set(client, created);
12
+ return created;
43
13
  }
44
- function extractReferenceId(input) {
45
- const trimmed = input.trim();
46
- const exactMatch = trimmed.match(/^content-ref:([a-f0-9]+)$/);
47
- if (exactMatch) {
48
- return exactMatch[1];
14
+ function identitiesMatch(a, b) {
15
+ if (!a && !b) {
16
+ return true;
49
17
  }
50
- const embeddedMatch = trimmed.match(/content-ref:([a-f0-9]+)/);
51
- if (embeddedMatch) {
52
- return embeddedMatch[1];
18
+ if (!a || !b) {
19
+ return false;
53
20
  }
54
- return null;
55
- }
56
- function shouldUseReference(content) {
57
- const size = typeof content === "string" ? Buffer.byteLength(content, "utf8") : content.length;
58
- return size > REFERENCE_THRESHOLD;
21
+ if (a.uaid && b.uaid && a.uaid.toLowerCase() === b.uaid.toLowerCase()) {
22
+ return true;
23
+ }
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;
59
34
  }
60
- const ContentStoreService = ContentStoreServiceImpl.getInstance();
61
- export {
62
- ContentStoreService,
63
- ContentStoreServiceImpl,
64
- REFERENCE_THRESHOLD,
65
- extractReferenceId,
66
- shouldUseReference
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"
43
+ }
44
+ );
45
+ const snapshot = this.parseWithSchema(
46
+ raw,
47
+ chatHistorySnapshotResponseSchema,
48
+ "chat history snapshot response"
49
+ );
50
+ return this.attachDecryptedHistory(sessionId, snapshot, options);
51
+ };
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;
56
+ }
57
+ const context = this.resolveDecryptionContext(sessionId, options);
58
+ if (!context) {
59
+ throw new Error(
60
+ "Unable to decrypt chat history: encryption context unavailable"
61
+ );
62
+ }
63
+ const decryptedHistory = snapshot.history.map((entry) => ({
64
+ entry,
65
+ plaintext: this.decryptHistoryEntryFromContext(sessionId, entry, context)
66
+ }));
67
+ return { ...snapshot, decryptedHistory };
68
+ };
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
74
+ };
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;
82
+ } else {
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)
103
+ );
104
+ if (match) {
105
+ return match;
106
+ }
107
+ }
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;
123
+ }
67
124
  };
68
125
  //# sourceMappingURL=standards-sdk.es134.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es134.js","sources":["../../src/content-store/ContentStoreService.ts"],"sourcesContent":["/**\n * Content Store Service\n *\n * Provides utility functions for content storage and reference handling.\n */\n\nimport type { ContentStoreInterface } from './types';\nimport { Logger } from '../utils/logger';\n\n/**\n * Maximum content size before using references (50KB)\n */\nexport const REFERENCE_THRESHOLD = 50 * 1024;\n\n/**\n * Content store service for managing large content\n */\nexport class ContentStoreServiceImpl {\n private static _instance: ContentStoreServiceImpl;\n private contentStore: ContentStoreInterface | null = null;\n private logger = Logger.getInstance({ module: 'ContentStoreService' });\n\n static getInstance(): ContentStoreServiceImpl {\n if (!ContentStoreServiceImpl._instance) {\n ContentStoreServiceImpl._instance = new ContentStoreServiceImpl();\n }\n return ContentStoreServiceImpl._instance;\n }\n\n /**\n * Set the content store instance\n */\n async setInstance(store: ContentStoreInterface): Promise<void> {\n if (this.contentStore) {\n this.logger.warn('Content store already set, replacing');\n }\n this.contentStore = store;\n this.logger.info('Content store instance set');\n }\n\n /**\n * Get the content store instance\n */\n getInstance(): ContentStoreInterface | null {\n return this.contentStore;\n }\n\n /**\n * Clear the content store instance\n */\n dispose(): void {\n this.contentStore = null;\n this.logger.info('Content store disposed');\n }\n\n /**\n * Check if content store is available\n */\n isAvailable(): boolean {\n return this.contentStore !== null;\n }\n}\n\n/**\n * Extract reference ID from input string\n */\nexport function extractReferenceId(input: string): string | null {\n const trimmed = input.trim();\n\n const exactMatch = trimmed.match(/^content-ref:([a-f0-9]+)$/);\n if (exactMatch) {\n return exactMatch[1];\n }\n\n const embeddedMatch = trimmed.match(/content-ref:([a-f0-9]+)/);\n if (embeddedMatch) {\n return embeddedMatch[1];\n }\n\n return null;\n}\n\n/**\n * Check if content should use reference based on size\n */\nexport function shouldUseReference(content: string | Buffer): boolean {\n const size =\n typeof content === 'string'\n ? Buffer.byteLength(content, 'utf8')\n : content.length;\n\n return size > REFERENCE_THRESHOLD;\n}\n\nexport const ContentStoreService = ContentStoreServiceImpl.getInstance();\n"],"names":[],"mappings":";AAYO,MAAM,sBAAsB,KAAK;AAKjC,MAAM,wBAAwB;AAAA,EAA9B,cAAA;AAEL,SAAQ,eAA6C;AACrD,SAAQ,SAAS,OAAO,YAAY,EAAE,QAAQ,uBAAuB;AAAA,EAAA;AAAA,EAErE,OAAO,cAAuC;AAC5C,QAAI,CAAC,wBAAwB,WAAW;AACtC,8BAAwB,YAAY,IAAI,wBAAA;AAAA,IAC1C;AACA,WAAO,wBAAwB;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,OAA6C;AAC7D,QAAI,KAAK,cAAc;AACrB,WAAK,OAAO,KAAK,sCAAsC;AAAA,IACzD;AACA,SAAK,eAAe;AACpB,SAAK,OAAO,KAAK,4BAA4B;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,cAA4C;AAC1C,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,SAAK,eAAe;AACpB,SAAK,OAAO,KAAK,wBAAwB;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,cAAuB;AACrB,WAAO,KAAK,iBAAiB;AAAA,EAC/B;AACF;AAKO,SAAS,mBAAmB,OAA8B;AAC/D,QAAM,UAAU,MAAM,KAAA;AAEtB,QAAM,aAAa,QAAQ,MAAM,2BAA2B;AAC5D,MAAI,YAAY;AACd,WAAO,WAAW,CAAC;AAAA,EACrB;AAEA,QAAM,gBAAgB,QAAQ,MAAM,yBAAyB;AAC7D,MAAI,eAAe;AACjB,WAAO,cAAc,CAAC;AAAA,EACxB;AAEA,SAAO;AACT;AAKO,SAAS,mBAAmB,SAAmC;AACpE,QAAM,OACJ,OAAO,YAAY,WACf,OAAO,WAAW,SAAS,MAAM,IACjC,QAAQ;AAEd,SAAO,OAAO;AAChB;AAEO,MAAM,sBAAsB,wBAAwB,YAAA;"}
1
+ {"version":3,"file":"standards-sdk.es134.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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"}