@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,125 +1,329 @@
1
- import { Buffer } from "buffer";
2
- import { chatHistorySnapshotResponseSchema } from "./standards-sdk.es148.js";
3
- import { RegistryBrokerClient } from "./standards-sdk.es135.js";
4
- const conversationContexts = /* @__PURE__ */ new WeakMap();
5
- function getConversationContextMap(client) {
6
- const existing = conversationContexts.get(client);
1
+ import { createSessionResponseSchema, chatHistoryCompactionResponseSchema, sessionEncryptionStatusResponseSchema, encryptionHandshakeResponseSchema, sendMessageResponseSchema } from "./standards-sdk.es150.js";
2
+ import { RegistryBrokerClient } from "./standards-sdk.es134.js";
3
+ import { serialiseAuthConfig, toJsonObject } from "./standards-sdk.es159.js";
4
+ import { EncryptionUnavailableError, EncryptedChatManager } from "./standards-sdk.es160.js";
5
+ const encryptedManagers = /* @__PURE__ */ new WeakMap();
6
+ const chatApis = /* @__PURE__ */ new WeakMap();
7
+ function getEncryptedChatManager(client) {
8
+ const existing = encryptedManagers.get(client);
7
9
  if (existing) {
8
10
  return existing;
9
11
  }
10
- const created = /* @__PURE__ */ new Map();
11
- conversationContexts.set(client, created);
12
+ const created = new EncryptedChatManager(client);
13
+ encryptedManagers.set(client, created);
12
14
  return created;
13
15
  }
14
- function identitiesMatch(a, b) {
15
- if (!a && !b) {
16
- return true;
16
+ Object.defineProperty(RegistryBrokerClient.prototype, "chat", {
17
+ get() {
18
+ const existing = chatApis.get(this);
19
+ if (existing) {
20
+ return existing;
21
+ }
22
+ const encryptedManager = getEncryptedChatManager(this);
23
+ const api = {
24
+ start: (options) => this.startChat(options),
25
+ createSession: (payload) => this.createSession(payload),
26
+ sendMessage: (payload) => this.sendMessage(payload),
27
+ endSession: (sessionId) => this.endSession(sessionId),
28
+ getHistory: (sessionId, options) => this.fetchHistorySnapshot(sessionId, options),
29
+ compactHistory: (payload) => this.compactHistory(payload),
30
+ getEncryptionStatus: (sessionId) => this.fetchEncryptionStatus(sessionId),
31
+ submitEncryptionHandshake: (sessionId, payload) => this.postEncryptionHandshake(sessionId, payload),
32
+ startConversation: (options) => this.startConversation(options),
33
+ acceptConversation: (options) => this.acceptConversation(options),
34
+ createEncryptedSession: (options) => encryptedManager.startSession(options),
35
+ acceptEncryptedSession: (options) => encryptedManager.acceptSession(options)
36
+ };
37
+ chatApis.set(this, api);
38
+ return api;
17
39
  }
18
- if (!a || !b) {
19
- return false;
40
+ });
41
+ RegistryBrokerClient.prototype.createSession = async function(payload, allowHistoryAutoTopUp = true) {
42
+ const body = {};
43
+ if ("uaid" in payload && payload.uaid) {
44
+ body.uaid = payload.uaid;
20
45
  }
21
- if (a.uaid && b.uaid && a.uaid.toLowerCase() === b.uaid.toLowerCase()) {
22
- return true;
46
+ if ("agentUrl" in payload && payload.agentUrl) {
47
+ body.agentUrl = payload.agentUrl;
23
48
  }
24
- if (a.ledgerAccountId && b.ledgerAccountId && a.ledgerAccountId.toLowerCase() === b.ledgerAccountId.toLowerCase()) {
25
- return true;
49
+ if (payload.auth) {
50
+ body.auth = serialiseAuthConfig(payload.auth);
26
51
  }
27
- if (a.userId && b.userId && a.userId === b.userId) {
28
- return true;
52
+ if (payload.historyTtlSeconds !== void 0) {
53
+ body.historyTtlSeconds = payload.historyTtlSeconds;
29
54
  }
30
- if (a.email && b.email && a.email.toLowerCase() === b.email.toLowerCase()) {
31
- return true;
55
+ if (payload.encryptionRequested !== void 0) {
56
+ body.encryptionRequested = payload.encryptionRequested;
32
57
  }
33
- return false;
34
- }
35
- RegistryBrokerClient.prototype.fetchHistorySnapshot = async function(sessionId, options) {
58
+ if (payload.senderUaid) {
59
+ body.senderUaid = payload.senderUaid;
60
+ }
61
+ try {
62
+ const raw = await this.requestJson("/chat/session", {
63
+ method: "POST",
64
+ body,
65
+ headers: { "content-type": "application/json" }
66
+ });
67
+ return this.parseWithSchema(
68
+ raw,
69
+ createSessionResponseSchema,
70
+ "chat session response"
71
+ );
72
+ } catch (error) {
73
+ const maybeError = error instanceof Error ? error : null;
74
+ if (allowHistoryAutoTopUp && this.shouldAutoTopUpHistory(payload, maybeError)) {
75
+ await this.executeHistoryAutoTopUp("chat.session");
76
+ return this.createSession(payload, false);
77
+ }
78
+ throw error;
79
+ }
80
+ };
81
+ RegistryBrokerClient.prototype.startChat = async function(options) {
82
+ if ("uaid" in options && options.uaid) {
83
+ return this.startConversation({
84
+ uaid: options.uaid,
85
+ senderUaid: options.senderUaid,
86
+ historyTtlSeconds: options.historyTtlSeconds,
87
+ auth: options.auth,
88
+ encryption: options.encryption,
89
+ onSessionCreated: options.onSessionCreated
90
+ });
91
+ }
92
+ if ("agentUrl" in options && options.agentUrl) {
93
+ const session = await this.createSession({
94
+ agentUrl: options.agentUrl,
95
+ auth: options.auth,
96
+ historyTtlSeconds: options.historyTtlSeconds,
97
+ senderUaid: options.senderUaid
98
+ });
99
+ options.onSessionCreated?.(session.sessionId);
100
+ return this.createPlaintextConversationHandle(
101
+ session.sessionId,
102
+ session.encryption ?? null,
103
+ options.auth,
104
+ { agentUrl: options.agentUrl, uaid: options.uaid }
105
+ );
106
+ }
107
+ throw new Error("startChat requires either uaid or agentUrl");
108
+ };
109
+ RegistryBrokerClient.prototype.startConversation = async function(options) {
110
+ const preference = options.encryption?.preference ?? "preferred";
111
+ const requestEncryption = preference !== "disabled";
112
+ if (!requestEncryption) {
113
+ const session = await this.createSession({
114
+ uaid: options.uaid,
115
+ auth: options.auth,
116
+ historyTtlSeconds: options.historyTtlSeconds,
117
+ senderUaid: options.senderUaid,
118
+ encryptionRequested: false
119
+ });
120
+ options.onSessionCreated?.(session.sessionId);
121
+ return this.createPlaintextConversationHandle(
122
+ session.sessionId,
123
+ session.encryption ?? null,
124
+ options.auth,
125
+ { uaid: options.uaid }
126
+ );
127
+ }
128
+ try {
129
+ const encryptedManager = getEncryptedChatManager(this);
130
+ const handle = await encryptedManager.startSession({
131
+ uaid: options.uaid,
132
+ senderUaid: options.senderUaid,
133
+ historyTtlSeconds: options.historyTtlSeconds,
134
+ handshakeTimeoutMs: options.encryption?.handshakeTimeoutMs,
135
+ pollIntervalMs: options.encryption?.pollIntervalMs,
136
+ onSessionCreated: (sessionId) => {
137
+ options.onSessionCreated?.(sessionId);
138
+ },
139
+ auth: options.auth
140
+ });
141
+ return handle;
142
+ } catch (error) {
143
+ if (error instanceof EncryptionUnavailableError) {
144
+ if (preference === "required") {
145
+ throw error;
146
+ }
147
+ return this.createPlaintextConversationHandle(
148
+ error.sessionId,
149
+ error.summary ?? null,
150
+ options.auth,
151
+ { uaid: options.uaid }
152
+ );
153
+ }
154
+ throw error;
155
+ }
156
+ };
157
+ RegistryBrokerClient.prototype.acceptConversation = async function(options) {
158
+ const preference = options.encryption?.preference ?? "preferred";
159
+ if (preference === "disabled") {
160
+ return this.createPlaintextConversationHandle(options.sessionId, null);
161
+ }
162
+ try {
163
+ const encryptedManager = getEncryptedChatManager(this);
164
+ const handle = await encryptedManager.acceptSession({
165
+ sessionId: options.sessionId,
166
+ responderUaid: options.responderUaid,
167
+ handshakeTimeoutMs: options.encryption?.handshakeTimeoutMs,
168
+ pollIntervalMs: options.encryption?.pollIntervalMs
169
+ });
170
+ return handle;
171
+ } catch (error) {
172
+ if (error instanceof EncryptionUnavailableError && preference !== "required") {
173
+ return this.createPlaintextConversationHandle(
174
+ options.sessionId,
175
+ null,
176
+ void 0,
177
+ { uaid: options.responderUaid }
178
+ );
179
+ }
180
+ throw error;
181
+ }
182
+ };
183
+ RegistryBrokerClient.prototype.createPlaintextConversationHandle = function(sessionId, summary, defaultAuth, context) {
184
+ const uaid = context?.uaid?.trim();
185
+ const agentUrl = context?.agentUrl?.trim();
186
+ return {
187
+ sessionId,
188
+ mode: "plaintext",
189
+ summary: summary ?? null,
190
+ send: async (options) => {
191
+ const plaintext = options.plaintext;
192
+ if (!plaintext || plaintext.trim().length === 0) {
193
+ throw new Error("plaintext is required for chat messages");
194
+ }
195
+ const message = options.message ?? plaintext;
196
+ return this.sendMessage({
197
+ sessionId,
198
+ message,
199
+ streaming: options.streaming,
200
+ auth: options.auth ?? defaultAuth,
201
+ uaid,
202
+ agentUrl
203
+ });
204
+ },
205
+ decryptHistoryEntry: (entry) => entry.content
206
+ };
207
+ };
208
+ RegistryBrokerClient.prototype.compactHistory = async function(payload) {
209
+ if (!payload.sessionId || payload.sessionId.trim().length === 0) {
210
+ throw new Error("sessionId is required to compact chat history");
211
+ }
212
+ const body = {};
213
+ if (typeof payload.preserveEntries === "number" && Number.isFinite(payload.preserveEntries) && payload.preserveEntries >= 0) {
214
+ body.preserveEntries = Math.floor(payload.preserveEntries);
215
+ }
216
+ const raw = await this.requestJson(
217
+ `/chat/session/${encodeURIComponent(payload.sessionId)}/compact`,
218
+ {
219
+ method: "POST",
220
+ headers: { "content-type": "application/json" },
221
+ body
222
+ }
223
+ );
224
+ return this.parseWithSchema(
225
+ raw,
226
+ chatHistoryCompactionResponseSchema,
227
+ "chat history compaction response"
228
+ );
229
+ };
230
+ RegistryBrokerClient.prototype.fetchEncryptionStatus = async function(sessionId) {
36
231
  if (!sessionId || sessionId.trim().length === 0) {
37
- throw new Error("sessionId is required to fetch chat history");
232
+ throw new Error("sessionId is required for encryption status");
38
233
  }
39
234
  const raw = await this.requestJson(
40
- `/chat/session/${encodeURIComponent(sessionId)}/history`,
235
+ `/chat/session/${encodeURIComponent(sessionId)}/encryption`,
41
236
  {
42
237
  method: "GET"
43
238
  }
44
239
  );
45
- const snapshot = this.parseWithSchema(
240
+ return this.parseWithSchema(
46
241
  raw,
47
- chatHistorySnapshotResponseSchema,
48
- "chat history snapshot response"
242
+ sessionEncryptionStatusResponseSchema,
243
+ "session encryption status response"
49
244
  );
50
- return this.attachDecryptedHistory(sessionId, snapshot, options);
51
245
  };
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
- );
246
+ RegistryBrokerClient.prototype.postEncryptionHandshake = async function(sessionId, payload) {
247
+ if (!sessionId || sessionId.trim().length === 0) {
248
+ throw new Error("sessionId is required for encryption handshake");
62
249
  }
63
- const decryptedHistory = snapshot.history.map((entry) => ({
64
- entry,
65
- plaintext: this.decryptHistoryEntryFromContext(sessionId, entry, context)
66
- }));
67
- return { ...snapshot, decryptedHistory };
250
+ const raw = await this.requestJson(
251
+ `/chat/session/${encodeURIComponent(sessionId)}/encryption-handshake`,
252
+ {
253
+ method: "POST",
254
+ headers: { "content-type": "application/json" },
255
+ body: {
256
+ role: payload.role,
257
+ keyType: payload.keyType,
258
+ ephemeralPublicKey: payload.ephemeralPublicKey,
259
+ longTermPublicKey: payload.longTermPublicKey,
260
+ signature: payload.signature,
261
+ uaid: payload.uaid,
262
+ userId: payload.userId,
263
+ ledgerAccountId: payload.ledgerAccountId,
264
+ metadata: payload.metadata
265
+ }
266
+ }
267
+ );
268
+ const response = this.parseWithSchema(
269
+ raw,
270
+ encryptionHandshakeResponseSchema,
271
+ "encryption handshake response"
272
+ );
273
+ return response.handshake;
68
274
  };
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
275
+ RegistryBrokerClient.prototype.sendMessage = async function(payload) {
276
+ const body = {
277
+ message: payload.message
74
278
  };
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);
279
+ if (payload.streaming !== void 0) {
280
+ body.streaming = payload.streaming;
84
281
  }
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
- };
282
+ if (payload.auth) {
283
+ body.auth = serialiseAuthConfig(payload.auth);
94
284
  }
95
- const map = getConversationContextMap(this);
96
- const contexts = map.get(sessionId);
97
- if (!contexts || contexts.length === 0) {
98
- return null;
285
+ if ("uaid" in payload) {
286
+ body.uaid = payload.uaid;
99
287
  }
100
- if (options?.identity) {
101
- const match = contexts.find(
102
- (context) => identitiesMatch(context.identity, options.identity)
103
- );
104
- if (match) {
105
- return match;
106
- }
288
+ if ("sessionId" in payload && payload.sessionId) {
289
+ body.sessionId = payload.sessionId;
107
290
  }
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;
291
+ if ("agentUrl" in payload && payload.agentUrl) {
292
+ body.agentUrl = payload.agentUrl;
114
293
  }
115
- const secret = Buffer.from(context.sharedSecret);
116
- try {
117
- return this.encryption.decryptCipherEnvelope({
118
- envelope,
119
- sharedSecret: secret
294
+ let cipherEnvelope = payload.cipherEnvelope ?? null;
295
+ if (payload.encryption) {
296
+ const sessionIdForEncryption = payload.encryption.sessionId ?? (typeof body.sessionId === "string" ? body.sessionId : void 0);
297
+ if (!sessionIdForEncryption) {
298
+ throw new Error(
299
+ "sessionId is required when using encrypted chat payloads"
300
+ );
301
+ }
302
+ if (!payload.encryption.recipients?.length) {
303
+ throw new Error("recipients are required for encrypted chat payloads");
304
+ }
305
+ cipherEnvelope = this.encryption.encryptCipherEnvelope({
306
+ ...payload.encryption,
307
+ sessionId: sessionIdForEncryption
120
308
  });
121
- } catch (_error) {
122
- return null;
123
309
  }
310
+ if (cipherEnvelope) {
311
+ body.cipherEnvelope = toJsonObject(cipherEnvelope);
312
+ }
313
+ const raw = await this.requestJson("/chat/message", {
314
+ method: "POST",
315
+ body,
316
+ headers: { "content-type": "application/json" }
317
+ });
318
+ return this.parseWithSchema(
319
+ raw,
320
+ sendMessageResponseSchema,
321
+ "chat message response"
322
+ );
323
+ };
324
+ RegistryBrokerClient.prototype.endSession = async function(sessionId) {
325
+ await this.request(`/chat/session/${encodeURIComponent(sessionId)}`, {
326
+ method: "DELETE"
327
+ });
124
328
  };
125
329
  //# sourceMappingURL=standards-sdk.es133.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es133.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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"}
1
+ {"version":3,"file":"standards-sdk.es133.js","sources":["../../src/services/registry-broker/client/chat.ts"],"sourcesContent":["import type {\n AcceptConversationOptions,\n AcceptEncryptedChatSessionOptions,\n AgentAuthConfig,\n ChatConversationHandle,\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 { RegistryBrokerClient } from './base-client';\nimport { serialiseAuthConfig, toJsonObject } from './utils';\nimport {\n EncryptedChatManager,\n EncryptionUnavailableError,\n} from './encrypted-chat-manager';\nconst encryptedManagers = new WeakMap<\n RegistryBrokerClient,\n EncryptedChatManager\n>();\nconst chatApis = new WeakMap<\n RegistryBrokerClient,\n RegistryBrokerClient['chat']\n>();\nfunction getEncryptedChatManager(\n client: RegistryBrokerClient,\n): EncryptedChatManager {\n const existing = encryptedManagers.get(client);\n if (existing) {\n return existing;\n }\n const created = new EncryptedChatManager(client);\n encryptedManagers.set(client, created);\n return created;\n}\ndeclare module './base-client' {\n interface RegistryBrokerClient {\n readonly chat: {\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 createSession(\n payload: CreateSessionRequestPayload,\n allowHistoryAutoTopUp?: boolean,\n ): Promise<CreateSessionResponse>;\n startChat(options: StartChatOptions): Promise<ChatConversationHandle>;\n startConversation(\n options: StartConversationOptions,\n ): Promise<ChatConversationHandle>;\n acceptConversation(\n options: AcceptConversationOptions,\n ): Promise<ChatConversationHandle>;\n compactHistory(\n payload: CompactHistoryRequestPayload,\n ): Promise<ChatHistoryCompactionResponse>;\n fetchEncryptionStatus(\n sessionId: string,\n ): Promise<SessionEncryptionStatusResponse>;\n postEncryptionHandshake(\n sessionId: string,\n payload: EncryptionHandshakeSubmissionPayload,\n ): Promise<EncryptionHandshakeRecord>;\n sendMessage(\n payload: SendMessageRequestPayload,\n ): Promise<SendMessageResponse>;\n endSession(sessionId: string): Promise<void>;\n createPlaintextConversationHandle(\n sessionId: string,\n summary: SessionEncryptionSummary | null,\n defaultAuth?: AgentAuthConfig,\n context?: { uaid?: string; agentUrl?: string },\n ): ChatConversationHandle;\n }\n}\nObject.defineProperty(RegistryBrokerClient.prototype, 'chat', {\n get(this: RegistryBrokerClient) {\n const existing = chatApis.get(this);\n if (existing) {\n return existing;\n }\n const encryptedManager = getEncryptedChatManager(this);\n const api = {\n start: (options: StartChatOptions) => this.startChat(options),\n createSession: (payload: CreateSessionRequestPayload) =>\n this.createSession(payload),\n sendMessage: (payload: SendMessageRequestPayload) =>\n this.sendMessage(payload),\n endSession: (sessionId: string) => this.endSession(sessionId),\n getHistory: (sessionId: string, options?: ChatHistoryFetchOptions) =>\n this.fetchHistorySnapshot(sessionId, options),\n compactHistory: (payload: CompactHistoryRequestPayload) =>\n this.compactHistory(payload),\n getEncryptionStatus: (sessionId: string) =>\n this.fetchEncryptionStatus(sessionId),\n submitEncryptionHandshake: (\n sessionId: string,\n payload: EncryptionHandshakeSubmissionPayload,\n ) => this.postEncryptionHandshake(sessionId, payload),\n startConversation: (options: StartConversationOptions) =>\n this.startConversation(options),\n acceptConversation: (options: AcceptConversationOptions) =>\n this.acceptConversation(options),\n createEncryptedSession: (options: StartEncryptedChatSessionOptions) =>\n encryptedManager.startSession(options),\n acceptEncryptedSession: (options: AcceptEncryptedChatSessionOptions) =>\n encryptedManager.acceptSession(options),\n };\n chatApis.set(this, api);\n return api;\n },\n});\nRegistryBrokerClient.prototype.createSession = async function (\n this: 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 this.requestJson<JsonValue>('/chat/session', {\n method: 'POST',\n body,\n headers: { 'content-type': 'application/json' },\n });\n return this.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 this.shouldAutoTopUpHistory(payload, maybeError)\n ) {\n await this.executeHistoryAutoTopUp('chat.session');\n return this.createSession(payload, false);\n }\n throw error;\n }\n};\nRegistryBrokerClient.prototype.startChat = async function (\n this: RegistryBrokerClient,\n options: StartChatOptions,\n): Promise<ChatConversationHandle> {\n if ('uaid' in options && options.uaid) {\n return this.startConversation({\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 this.createSession({\n agentUrl: options.agentUrl,\n auth: options.auth,\n historyTtlSeconds: options.historyTtlSeconds,\n senderUaid: options.senderUaid,\n });\n options.onSessionCreated?.(session.sessionId);\n return this.createPlaintextConversationHandle(\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};\nRegistryBrokerClient.prototype.startConversation = async function (\n this: RegistryBrokerClient,\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 this.createSession({\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 this.createPlaintextConversationHandle(\n session.sessionId,\n session.encryption ?? null,\n options.auth,\n { uaid: options.uaid },\n );\n }\n try {\n const encryptedManager = getEncryptedChatManager(this);\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 this.createPlaintextConversationHandle(\n error.sessionId,\n error.summary ?? null,\n options.auth,\n { uaid: options.uaid },\n );\n }\n throw error;\n }\n};\nRegistryBrokerClient.prototype.acceptConversation = async function (\n this: RegistryBrokerClient,\n options: AcceptConversationOptions,\n): Promise<ChatConversationHandle> {\n const preference = options.encryption?.preference ?? 'preferred';\n if (preference === 'disabled') {\n return this.createPlaintextConversationHandle(options.sessionId, null);\n }\n try {\n const encryptedManager = getEncryptedChatManager(this);\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 this.createPlaintextConversationHandle(\n options.sessionId,\n null,\n undefined,\n { uaid: options.responderUaid },\n );\n }\n throw error;\n }\n};\nRegistryBrokerClient.prototype.createPlaintextConversationHandle = function (\n this: 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 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 this.sendMessage({\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 };\n};\nRegistryBrokerClient.prototype.compactHistory = async function (\n this: 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 this.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 this.parseWithSchema(\n raw,\n chatHistoryCompactionResponseSchema,\n 'chat history compaction response',\n );\n};\nRegistryBrokerClient.prototype.fetchEncryptionStatus = async function (\n this: 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 this.requestJson<JsonValue>(\n `/chat/session/${encodeURIComponent(sessionId)}/encryption`,\n {\n method: 'GET',\n },\n );\n return this.parseWithSchema(\n raw,\n sessionEncryptionStatusResponseSchema,\n 'session encryption status response',\n );\n};\nRegistryBrokerClient.prototype.postEncryptionHandshake = async function (\n this: 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 this.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 = this.parseWithSchema(\n raw,\n encryptionHandshakeResponseSchema,\n 'encryption handshake response',\n );\n return response.handshake;\n};\nRegistryBrokerClient.prototype.sendMessage = async function (\n this: 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 = this.encryption.encryptCipherEnvelope({\n ...payload.encryption,\n sessionId: sessionIdForEncryption,\n });\n }\n if (cipherEnvelope) {\n body.cipherEnvelope = toJsonObject(cipherEnvelope);\n }\n const raw = await this.requestJson<JsonValue>('/chat/message', {\n method: 'POST',\n body,\n headers: { 'content-type': 'application/json' },\n });\n return this.parseWithSchema(\n raw,\n sendMessageResponseSchema,\n 'chat message response',\n );\n};\nRegistryBrokerClient.prototype.endSession = async function (\n this: RegistryBrokerClient,\n sessionId: string,\n): Promise<void> {\n await this.request(`/chat/session/${encodeURIComponent(sessionId)}`, {\n method: 'DELETE',\n });\n};\n"],"names":[],"mappings":"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"}