@hashgraphonline/standards-sdk 0.1.157 → 0.1.159

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