@softomnitel/omnicall-kit 0.1.0-rc.0

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 (183) hide show
  1. package/LICENSE +4 -0
  2. package/README.md +34 -0
  3. package/dist/index.d.ts +21 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +16 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/internal/account-activate-commands.d.ts +30 -0
  8. package/dist/internal/account-activate-commands.d.ts.map +1 -0
  9. package/dist/internal/account-activate-commands.js +94 -0
  10. package/dist/internal/account-activate-commands.js.map +1 -0
  11. package/dist/internal/account-activate-wire.d.ts +16 -0
  12. package/dist/internal/account-activate-wire.d.ts.map +1 -0
  13. package/dist/internal/account-activate-wire.js +22 -0
  14. package/dist/internal/account-activate-wire.js.map +1 -0
  15. package/dist/internal/account-logout-commands.d.ts +23 -0
  16. package/dist/internal/account-logout-commands.d.ts.map +1 -0
  17. package/dist/internal/account-logout-commands.js +51 -0
  18. package/dist/internal/account-logout-commands.js.map +1 -0
  19. package/dist/internal/account-logout-wire.d.ts +15 -0
  20. package/dist/internal/account-logout-wire.d.ts.map +1 -0
  21. package/dist/internal/account-logout-wire.js +24 -0
  22. package/dist/internal/account-logout-wire.js.map +1 -0
  23. package/dist/internal/auth-grants.d.ts +6 -0
  24. package/dist/internal/auth-grants.d.ts.map +1 -0
  25. package/dist/internal/auth-grants.js +16 -0
  26. package/dist/internal/auth-grants.js.map +1 -0
  27. package/dist/internal/auth-inbound.d.ts +35 -0
  28. package/dist/internal/auth-inbound.d.ts.map +1 -0
  29. package/dist/internal/auth-inbound.js +86 -0
  30. package/dist/internal/auth-inbound.js.map +1 -0
  31. package/dist/internal/auth-orchestrator.d.ts +36 -0
  32. package/dist/internal/auth-orchestrator.d.ts.map +1 -0
  33. package/dist/internal/auth-orchestrator.js +217 -0
  34. package/dist/internal/auth-orchestrator.js.map +1 -0
  35. package/dist/internal/auth-pop-flow.d.ts +38 -0
  36. package/dist/internal/auth-pop-flow.d.ts.map +1 -0
  37. package/dist/internal/auth-pop-flow.js +80 -0
  38. package/dist/internal/auth-pop-flow.js.map +1 -0
  39. package/dist/internal/auth-wire.d.ts +37 -0
  40. package/dist/internal/auth-wire.d.ts.map +1 -0
  41. package/dist/internal/auth-wire.js +62 -0
  42. package/dist/internal/auth-wire.js.map +1 -0
  43. package/dist/internal/base64url.d.ts +7 -0
  44. package/dist/internal/base64url.d.ts.map +1 -0
  45. package/dist/internal/base64url.js +28 -0
  46. package/dist/internal/base64url.js.map +1 -0
  47. package/dist/internal/browser-websocket-transport.d.ts +36 -0
  48. package/dist/internal/browser-websocket-transport.d.ts.map +1 -0
  49. package/dist/internal/browser-websocket-transport.js +131 -0
  50. package/dist/internal/browser-websocket-transport.js.map +1 -0
  51. package/dist/internal/call-commands.d.ts +32 -0
  52. package/dist/internal/call-commands.d.ts.map +1 -0
  53. package/dist/internal/call-commands.js +60 -0
  54. package/dist/internal/call-commands.js.map +1 -0
  55. package/dist/internal/call-wire.d.ts +24 -0
  56. package/dist/internal/call-wire.d.ts.map +1 -0
  57. package/dist/internal/call-wire.js +37 -0
  58. package/dist/internal/call-wire.js.map +1 -0
  59. package/dist/internal/client-error-details.d.ts +60 -0
  60. package/dist/internal/client-error-details.d.ts.map +1 -0
  61. package/dist/internal/client-error-details.js +98 -0
  62. package/dist/internal/client-error-details.js.map +1 -0
  63. package/dist/internal/client-errors.d.ts +38 -0
  64. package/dist/internal/client-errors.d.ts.map +1 -0
  65. package/dist/internal/client-errors.js +37 -0
  66. package/dist/internal/client-errors.js.map +1 -0
  67. package/dist/internal/command-classification.d.ts +7 -0
  68. package/dist/internal/command-classification.d.ts.map +1 -0
  69. package/dist/internal/command-classification.js +14 -0
  70. package/dist/internal/command-classification.js.map +1 -0
  71. package/dist/internal/connection-session.d.ts +61 -0
  72. package/dist/internal/connection-session.d.ts.map +1 -0
  73. package/dist/internal/connection-session.js +333 -0
  74. package/dist/internal/connection-session.js.map +1 -0
  75. package/dist/internal/connection-state.d.ts +13 -0
  76. package/dist/internal/connection-state.d.ts.map +1 -0
  77. package/dist/internal/connection-state.js +75 -0
  78. package/dist/internal/connection-state.js.map +1 -0
  79. package/dist/internal/diagnostics.d.ts +36 -0
  80. package/dist/internal/diagnostics.d.ts.map +1 -0
  81. package/dist/internal/diagnostics.js +51 -0
  82. package/dist/internal/diagnostics.js.map +1 -0
  83. package/dist/internal/event-subscription.d.ts +23 -0
  84. package/dist/internal/event-subscription.d.ts.map +1 -0
  85. package/dist/internal/event-subscription.js +62 -0
  86. package/dist/internal/event-subscription.js.map +1 -0
  87. package/dist/internal/heartbeat-controller.d.ts +27 -0
  88. package/dist/internal/heartbeat-controller.d.ts.map +1 -0
  89. package/dist/internal/heartbeat-controller.js +58 -0
  90. package/dist/internal/heartbeat-controller.js.map +1 -0
  91. package/dist/internal/operator-commands.d.ts +46 -0
  92. package/dist/internal/operator-commands.d.ts.map +1 -0
  93. package/dist/internal/operator-commands.js +93 -0
  94. package/dist/internal/operator-commands.js.map +1 -0
  95. package/dist/internal/operator-wire.d.ts +20 -0
  96. package/dist/internal/operator-wire.d.ts.map +1 -0
  97. package/dist/internal/operator-wire.js +33 -0
  98. package/dist/internal/operator-wire.js.map +1 -0
  99. package/dist/internal/origin-policy-errors.d.ts +22 -0
  100. package/dist/internal/origin-policy-errors.d.ts.map +1 -0
  101. package/dist/internal/origin-policy-errors.js +67 -0
  102. package/dist/internal/origin-policy-errors.js.map +1 -0
  103. package/dist/internal/pop-crypto.d.ts +23 -0
  104. package/dist/internal/pop-crypto.d.ts.map +1 -0
  105. package/dist/internal/pop-crypto.js +48 -0
  106. package/dist/internal/pop-crypto.js.map +1 -0
  107. package/dist/internal/pop-key-store.d.ts +28 -0
  108. package/dist/internal/pop-key-store.d.ts.map +1 -0
  109. package/dist/internal/pop-key-store.js +153 -0
  110. package/dist/internal/pop-key-store.js.map +1 -0
  111. package/dist/internal/product-commands.d.ts +33 -0
  112. package/dist/internal/product-commands.d.ts.map +1 -0
  113. package/dist/internal/product-commands.js +70 -0
  114. package/dist/internal/product-commands.js.map +1 -0
  115. package/dist/internal/product-inbound.d.ts +15 -0
  116. package/dist/internal/product-inbound.d.ts.map +1 -0
  117. package/dist/internal/product-inbound.js +31 -0
  118. package/dist/internal/product-inbound.js.map +1 -0
  119. package/dist/internal/product-orchestrator.d.ts +46 -0
  120. package/dist/internal/product-orchestrator.d.ts.map +1 -0
  121. package/dist/internal/product-orchestrator.js +188 -0
  122. package/dist/internal/product-orchestrator.js.map +1 -0
  123. package/dist/internal/product-wire.d.ts +29 -0
  124. package/dist/internal/product-wire.d.ts.map +1 -0
  125. package/dist/internal/product-wire.js +54 -0
  126. package/dist/internal/product-wire.js.map +1 -0
  127. package/dist/internal/public-event-map.d.ts +27 -0
  128. package/dist/internal/public-event-map.d.ts.map +1 -0
  129. package/dist/internal/public-event-map.js +38 -0
  130. package/dist/internal/public-event-map.js.map +1 -0
  131. package/dist/internal/reconnect-policy.d.ts +16 -0
  132. package/dist/internal/reconnect-policy.d.ts.map +1 -0
  133. package/dist/internal/reconnect-policy.js +23 -0
  134. package/dist/internal/reconnect-policy.js.map +1 -0
  135. package/dist/internal/request-correlator.d.ts +41 -0
  136. package/dist/internal/request-correlator.d.ts.map +1 -0
  137. package/dist/internal/request-correlator.js +130 -0
  138. package/dist/internal/request-correlator.js.map +1 -0
  139. package/dist/internal/requested-capabilities.d.ts +10 -0
  140. package/dist/internal/requested-capabilities.d.ts.map +1 -0
  141. package/dist/internal/requested-capabilities.js +25 -0
  142. package/dist/internal/requested-capabilities.js.map +1 -0
  143. package/dist/internal/scheduler.d.ts +41 -0
  144. package/dist/internal/scheduler.d.ts.map +1 -0
  145. package/dist/internal/scheduler.js +104 -0
  146. package/dist/internal/scheduler.js.map +1 -0
  147. package/dist/internal/session-identity.d.ts +16 -0
  148. package/dist/internal/session-identity.d.ts.map +1 -0
  149. package/dist/internal/session-identity.js +13 -0
  150. package/dist/internal/session-identity.js.map +1 -0
  151. package/dist/internal/snapshot-acquisition.d.ts +21 -0
  152. package/dist/internal/snapshot-acquisition.d.ts.map +1 -0
  153. package/dist/internal/snapshot-acquisition.js +40 -0
  154. package/dist/internal/snapshot-acquisition.js.map +1 -0
  155. package/dist/internal/snapshot-cache.d.ts +13 -0
  156. package/dist/internal/snapshot-cache.d.ts.map +1 -0
  157. package/dist/internal/snapshot-cache.js +18 -0
  158. package/dist/internal/snapshot-cache.js.map +1 -0
  159. package/dist/internal/transport-port.d.ts +34 -0
  160. package/dist/internal/transport-port.d.ts.map +1 -0
  161. package/dist/internal/transport-port.js +7 -0
  162. package/dist/internal/transport-port.js.map +1 -0
  163. package/dist/internal/window-commands.d.ts +23 -0
  164. package/dist/internal/window-commands.d.ts.map +1 -0
  165. package/dist/internal/window-commands.js +76 -0
  166. package/dist/internal/window-commands.js.map +1 -0
  167. package/dist/public/auth-client.d.ts +87 -0
  168. package/dist/public/auth-client.d.ts.map +1 -0
  169. package/dist/public/auth-client.js +116 -0
  170. package/dist/public/auth-client.js.map +1 -0
  171. package/dist/public/omnicall-client-api.d.ts +159 -0
  172. package/dist/public/omnicall-client-api.d.ts.map +1 -0
  173. package/dist/public/omnicall-client-api.js +5 -0
  174. package/dist/public/omnicall-client-api.js.map +1 -0
  175. package/dist/public/omnicall-client.d.ts +22 -0
  176. package/dist/public/omnicall-client.d.ts.map +1 -0
  177. package/dist/public/omnicall-client.js +171 -0
  178. package/dist/public/omnicall-client.js.map +1 -0
  179. package/dist/public/protocol-reexports.d.ts +41 -0
  180. package/dist/public/protocol-reexports.d.ts.map +1 -0
  181. package/dist/public/protocol-reexports.js +7 -0
  182. package/dist/public/protocol-reexports.js.map +1 -0
  183. package/package.json +46 -0
@@ -0,0 +1,217 @@
1
+ /**
2
+ * Pairing + PoP orchestration composed onto ConnectionSession.
3
+ */
4
+ import { PROTOCOL_MAX, PROTOCOL_MIN } from '@softomnitel/omnicall-protocol';
5
+ import { parseGrantedCapabilities } from './auth-grants.js';
6
+ import { challengeFromHello, parseInboundAuthMessage } from './auth-inbound.js';
7
+ import { completePopAuth, sendPairingRequest } from './auth-pop-flow.js';
8
+ import { buildClientHelloBody, isoNow } from './auth-wire.js';
9
+ import { createOriginDeniedError } from './origin-policy-errors.js';
10
+ import { generatePopKeyPair } from './pop-crypto.js';
11
+ import { sanitizeRequestedCapabilities } from './requested-capabilities.js';
12
+ export function createAuthOrchestrator(deps) {
13
+ const usedChallengeIds = new Set();
14
+ let identity;
15
+ let session;
16
+ let lastServerInstanceId;
17
+ let identityReady = Promise.resolve();
18
+ let helloInFlight = false;
19
+ let authInFlight = false;
20
+ let droppedPreauthCount = 0;
21
+ const requestedCapabilities = sanitizeRequestedCapabilities({
22
+ profile: deps.requestedProfile,
23
+ requested: deps.requestedCapabilities
24
+ });
25
+ const prepareConnect = async () => {
26
+ identityReady = deps.keyStore.load().then((loaded) => {
27
+ identity = loaded;
28
+ });
29
+ await identityReady;
30
+ };
31
+ const sendClientHello = async () => {
32
+ if (helloInFlight || deps.connection.getState() !== 'handshaking') {
33
+ return;
34
+ }
35
+ helloInFlight = true;
36
+ try {
37
+ await identityReady;
38
+ deps.connection.sendRaw(buildClientHelloBody({
39
+ sdkVersion: deps.sdkVersion,
40
+ application: deps.application,
41
+ clientId: identity?.clientId,
42
+ requestedCapabilities,
43
+ occurredAt: isoNow(deps.scheduler.now())
44
+ }));
45
+ }
46
+ finally {
47
+ helloInFlight = false;
48
+ }
49
+ };
50
+ const ensureIdentityKeys = async () => {
51
+ await identityReady;
52
+ if (identity !== undefined) {
53
+ return identity;
54
+ }
55
+ const loaded = await deps.keyStore.load();
56
+ if (loaded !== undefined) {
57
+ identity = loaded;
58
+ return loaded;
59
+ }
60
+ const keys = await generatePopKeyPair();
61
+ const created = {
62
+ clientId: crypto.randomUUID(),
63
+ publicKeySpkiBase64Url: keys.publicKeySpkiBase64Url,
64
+ privateKey: keys.privateKey,
65
+ profile: undefined,
66
+ grantedCapabilities: []
67
+ };
68
+ await deps.keyStore.save(created);
69
+ identity = created;
70
+ return created;
71
+ };
72
+ const completeAuth = async (hello) => {
73
+ const challenge = challengeFromHello(hello);
74
+ if (challenge === undefined || authInFlight) {
75
+ if (challenge === undefined) {
76
+ deps.connection.signalFailed();
77
+ }
78
+ return;
79
+ }
80
+ authInFlight = true;
81
+ try {
82
+ const keys = await ensureIdentityKeys();
83
+ const result = await completePopAuth({
84
+ connection: deps.connection,
85
+ origin: deps.origin,
86
+ hello,
87
+ keys,
88
+ scheduler: deps.scheduler,
89
+ usedChallengeIds
90
+ });
91
+ if (!result.ok) {
92
+ deps.connection.signalFailed();
93
+ return;
94
+ }
95
+ session = result.session;
96
+ lastServerInstanceId = hello.serverInstanceId;
97
+ deps.connection.signalReady(hello.heartbeatSeconds);
98
+ }
99
+ finally {
100
+ authInFlight = false;
101
+ }
102
+ };
103
+ const handleServerHello = async (hello) => {
104
+ if (hello.selectedProtocolVersion < PROTOCOL_MIN ||
105
+ hello.selectedProtocolVersion > PROTOCOL_MAX) {
106
+ deps.connection.signalIncompatible();
107
+ return;
108
+ }
109
+ if (lastServerInstanceId !== undefined &&
110
+ lastServerInstanceId !== hello.serverInstanceId) {
111
+ usedChallengeIds.clear();
112
+ session = undefined;
113
+ }
114
+ if (hello.pairingRequired) {
115
+ const keys = await ensureIdentityKeys();
116
+ sendPairingRequest({
117
+ connection: deps.connection,
118
+ origin: deps.origin,
119
+ application: deps.application,
120
+ requestedProfile: deps.requestedProfile,
121
+ requestedCapabilities,
122
+ keys,
123
+ scheduler: deps.scheduler,
124
+ onPairingRequired: deps.onPairingRequired
125
+ });
126
+ return;
127
+ }
128
+ await completeAuth(hello);
129
+ };
130
+ const handleInbound = async (raw) => {
131
+ const message = parseInboundAuthMessage(raw);
132
+ const state = deps.connection.getState();
133
+ if (message.kind === 'preauth_product') {
134
+ if (state !== 'ready') {
135
+ droppedPreauthCount += 1;
136
+ deps.diagnostics?.emit({
137
+ level: 'warn',
138
+ code: 'auth.preauth_drop',
139
+ connectionState: state
140
+ });
141
+ }
142
+ return;
143
+ }
144
+ if (message.kind === 'incompatible') {
145
+ deps.connection.signalIncompatible();
146
+ return;
147
+ }
148
+ if (message.kind === 'server_hello') {
149
+ await handleServerHello(message.message);
150
+ return;
151
+ }
152
+ if (message.kind === 'pairing_pending') {
153
+ return;
154
+ }
155
+ if (message.kind === 'pairing_approved') {
156
+ const keys = await ensureIdentityKeys();
157
+ const updated = {
158
+ clientId: message.message.clientId,
159
+ publicKeySpkiBase64Url: keys.publicKeySpkiBase64Url,
160
+ privateKey: keys.privateKey,
161
+ profile: message.message.profile,
162
+ grantedCapabilities: [...message.message.grantedCapabilities]
163
+ };
164
+ await deps.keyStore.save(updated);
165
+ identity = updated;
166
+ deps.connection.requestReauth();
167
+ return;
168
+ }
169
+ if (message.kind === 'pairing_denied') {
170
+ deps.connection.signalFailed();
171
+ return;
172
+ }
173
+ if (message.kind === 'origin_denied') {
174
+ deps.connection.signalOriginPolicyFailure(createOriginDeniedError());
175
+ return;
176
+ }
177
+ if (message.kind === 'permission_changed') {
178
+ if (state !== 'ready' || session === undefined || identity === undefined) {
179
+ return;
180
+ }
181
+ const granted = parseGrantedCapabilities(message.grantedCapabilities);
182
+ if (granted === undefined) {
183
+ return;
184
+ }
185
+ identity = { ...identity, grantedCapabilities: granted };
186
+ session = Object.freeze({
187
+ ...session,
188
+ grantedCapabilities: Object.freeze([...granted])
189
+ });
190
+ await deps.keyStore.save(identity);
191
+ return;
192
+ }
193
+ if (message.kind === 'revoked') {
194
+ await deps.keyStore.clear();
195
+ identity = undefined;
196
+ session = undefined;
197
+ usedChallengeIds.clear();
198
+ deps.connection.signalRevoked();
199
+ }
200
+ };
201
+ return {
202
+ getSession: () => session,
203
+ getGrantedCapabilities: () => session?.grantedCapabilities ?? [],
204
+ preauthDropCount: () => droppedPreauthCount,
205
+ prepareConnect,
206
+ onHandshaking: () => {
207
+ void sendClientHello();
208
+ },
209
+ onUnhandledMessage: (raw) => {
210
+ void handleInbound(raw);
211
+ },
212
+ clearSession: () => {
213
+ session = undefined;
214
+ }
215
+ };
216
+ }
217
+ //# sourceMappingURL=auth-orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-orchestrator.js","sourceRoot":"","sources":["../../src/internal/auth-orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Pairing request + PoP challenge completion helpers for AuthOrchestrator.
3
+ */
4
+ import type { ApplicationIdentity, CapabilityId, PairingProfile, ServerHello } from '@softomnitel/omnicall-protocol';
5
+ import type { ConnectionSession } from './connection-session.js';
6
+ import type { StoredPopIdentity } from './pop-key-store.js';
7
+ import type { SessionIdentity } from './session-identity.js';
8
+ import type { Scheduler } from './scheduler.js';
9
+ export declare function sendPairingRequest(input: {
10
+ readonly connection: ConnectionSession;
11
+ readonly origin: string;
12
+ readonly application: ApplicationIdentity;
13
+ readonly requestedProfile: PairingProfile;
14
+ readonly requestedCapabilities: readonly CapabilityId[];
15
+ readonly keys: StoredPopIdentity;
16
+ readonly scheduler: Scheduler;
17
+ readonly onPairingRequired: (info: {
18
+ readonly origin: string;
19
+ readonly requestedProfile: PairingProfile;
20
+ readonly clientId: string | undefined;
21
+ }) => void;
22
+ }): void;
23
+ export type CompletePopAuthResult = {
24
+ readonly ok: true;
25
+ readonly session: SessionIdentity;
26
+ } | {
27
+ readonly ok: false;
28
+ readonly reason: 'no_challenge' | 'replay' | 'ping_failed';
29
+ };
30
+ export declare function completePopAuth(input: {
31
+ readonly connection: ConnectionSession;
32
+ readonly origin: string;
33
+ readonly hello: ServerHello;
34
+ readonly keys: StoredPopIdentity;
35
+ readonly scheduler: Scheduler;
36
+ readonly usedChallengeIds: Set<string>;
37
+ }): Promise<CompletePopAuthResult>;
38
+ //# sourceMappingURL=auth-pop-flow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-pop-flow.d.ts","sourceRoot":"","sources":["../../src/internal/auth-pop-flow.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,mBAAmB,EACnB,YAAY,EACZ,cAAc,EACd,WAAW,EACZ,MAAM,gCAAgC,CAAC;AASxC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAC;IAC1C,QAAQ,CAAC,gBAAgB,EAAE,cAAc,CAAC;IAC1C,QAAQ,CAAC,qBAAqB,EAAE,SAAS,YAAY,EAAE,CAAC;IACxD,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,iBAAiB,EAAE,CAAC,IAAI,EAAE;QACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,gBAAgB,EAAE,cAAc,CAAC;QAC1C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;KACvC,KAAK,IAAI,CAAC;CACZ,GAAG,IAAI,CAiBP;AAED,MAAM,MAAM,qBAAqB,GAC7B;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,QAAQ,GAAG,aAAa,CAAA;CAAE,CAAC;AAEvF,wBAAsB,eAAe,CAAC,KAAK,EAAE;IAC3C,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACxC,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA0DjC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Pairing request + PoP challenge completion helpers for AuthOrchestrator.
3
+ */
4
+ import { buildAuthProofBody, buildPairingRequestBody, buildPingBody, isoNow } from './auth-wire.js';
5
+ import { challengeFromHello } from './auth-inbound.js';
6
+ import { signPopChallenge } from './pop-crypto.js';
7
+ export function sendPairingRequest(input) {
8
+ input.connection.signalPairingRequired();
9
+ input.onPairingRequired({
10
+ origin: input.origin,
11
+ requestedProfile: input.requestedProfile,
12
+ clientId: input.keys.clientId
13
+ });
14
+ input.connection.sendRaw(buildPairingRequestBody({
15
+ clientId: input.keys.clientId,
16
+ publicKeySpkiBase64Url: input.keys.publicKeySpkiBase64Url,
17
+ application: input.application,
18
+ requestedProfile: input.requestedProfile,
19
+ requestedCapabilities: input.requestedCapabilities,
20
+ occurredAt: isoNow(input.scheduler.now())
21
+ }));
22
+ }
23
+ export async function completePopAuth(input) {
24
+ const challenge = challengeFromHello(input.hello);
25
+ if (challenge === undefined) {
26
+ return { ok: false, reason: 'no_challenge' };
27
+ }
28
+ if (input.usedChallengeIds.has(challenge.challengeId)) {
29
+ return { ok: false, reason: 'replay' };
30
+ }
31
+ input.usedChallengeIds.add(challenge.challengeId);
32
+ input.connection.signalAuthenticating();
33
+ const signature = await signPopChallenge({
34
+ privateKey: input.keys.privateKey,
35
+ serverInstanceId: input.hello.serverInstanceId,
36
+ sessionEpoch: input.hello.sessionEpoch,
37
+ origin: input.origin,
38
+ clientId: input.keys.clientId,
39
+ challengeId: challenge.challengeId,
40
+ nonce: challenge.nonce
41
+ });
42
+ input.connection.sendRaw(buildAuthProofBody({
43
+ challengeId: challenge.challengeId,
44
+ clientId: input.keys.clientId,
45
+ signature,
46
+ occurredAt: isoNow(input.scheduler.now())
47
+ }));
48
+ input.connection.setWireIdentity({
49
+ serverInstanceId: input.hello.serverInstanceId,
50
+ sessionEpoch: input.hello.sessionEpoch
51
+ });
52
+ const requestId = `auth_ping_${input.scheduler.now()}`;
53
+ const pingResult = await input.connection.request({
54
+ requestId,
55
+ commandType: 'sdk:ping',
56
+ body: buildPingBody({
57
+ requestId,
58
+ serverInstanceId: input.hello.serverInstanceId,
59
+ sessionEpoch: input.hello.sessionEpoch,
60
+ occurredAt: isoNow(input.scheduler.now())
61
+ })
62
+ });
63
+ if (!pingResult.ok) {
64
+ return { ok: false, reason: 'ping_failed' };
65
+ }
66
+ return {
67
+ ok: true,
68
+ session: Object.freeze({
69
+ serverInstanceId: input.hello.serverInstanceId,
70
+ sessionEpoch: input.hello.sessionEpoch,
71
+ selectedProtocolVersion: input.hello.selectedProtocolVersion,
72
+ clientId: input.keys.clientId,
73
+ profile: input.keys.profile,
74
+ grantedCapabilities: Object.freeze([...input.keys.grantedCapabilities]),
75
+ heartbeatSeconds: input.hello.heartbeatSeconds,
76
+ maxMessageBytes: input.hello.maxMessageBytes
77
+ })
78
+ };
79
+ }
80
+ //# sourceMappingURL=auth-pop-flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-pop-flow.js","sourceRoot":"","sources":["../../src/internal/auth-pop-flow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Auth/pairing/handshake wire builders. Schemas from @softomnitel/omnicall-protocol.
3
+ */
4
+ import { type ApplicationIdentity, type AuthChallenge, type CapabilityId, type PairingProfile, type ServerHello } from '@softomnitel/omnicall-protocol';
5
+ export declare function buildClientHelloBody(input: {
6
+ readonly sdkVersion: string;
7
+ readonly application: ApplicationIdentity;
8
+ readonly clientId: string | undefined;
9
+ readonly requestedCapabilities: readonly CapabilityId[];
10
+ readonly occurredAt: string;
11
+ }): string;
12
+ export declare function buildPairingRequestBody(input: {
13
+ readonly clientId: string;
14
+ readonly publicKeySpkiBase64Url: string;
15
+ readonly application: ApplicationIdentity;
16
+ readonly requestedProfile: PairingProfile;
17
+ readonly requestedCapabilities: readonly CapabilityId[];
18
+ readonly occurredAt: string;
19
+ }): string;
20
+ export declare function buildAuthProofBody(input: {
21
+ readonly challengeId: string;
22
+ readonly clientId: string;
23
+ readonly signature: string;
24
+ readonly occurredAt: string;
25
+ }): string;
26
+ export declare function buildPingBody(input: {
27
+ readonly requestId: string;
28
+ readonly serverInstanceId: string;
29
+ readonly sessionEpoch: string;
30
+ readonly occurredAt: string;
31
+ }): string;
32
+ export declare function isoNow(epochMs: number): string;
33
+ export type NegotiatedServerHello = {
34
+ readonly hello: ServerHello;
35
+ readonly challenge: AuthChallenge | undefined;
36
+ };
37
+ //# sourceMappingURL=auth-wire.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-wire.d.ts","sourceRoot":"","sources":["../../src/internal/auth-wire.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAIL,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,WAAW,EACjB,MAAM,gCAAgC,CAAC;AAKxC,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAC;IAC1C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,qBAAqB,EAAE,SAAS,YAAY,EAAE,CAAC;IACxD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,GAAG,MAAM,CAcT;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAC7C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAC;IAC1C,QAAQ,CAAC,gBAAgB,EAAE,cAAc,CAAC;IAC1C,QAAQ,CAAC,qBAAqB,EAAE,SAAS,YAAY,EAAE,CAAC;IACxD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,GAAG,MAAM,CAaT;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,GAAG,MAAM,CAUT;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,GAAG,MAAM,CAWT;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,aAAa,GAAG,SAAS,CAAC;CAC/C,CAAC"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Auth/pairing/handshake wire builders. Schemas from @softomnitel/omnicall-protocol.
3
+ */
4
+ import { PROTOCOL_MAJOR, PROTOCOL_MAX, PROTOCOL_MIN } from '@softomnitel/omnicall-protocol';
5
+ import { randomBase64Url } from './base64url.js';
6
+ import { popKeyAlgorithmId } from './pop-crypto.js';
7
+ export function buildClientHelloBody(input) {
8
+ return JSON.stringify({
9
+ protocolVersion: PROTOCOL_MAJOR,
10
+ kind: 'handshake',
11
+ type: 'sdk:client-hello',
12
+ protocolMin: PROTOCOL_MIN,
13
+ protocolMax: PROTOCOL_MAX,
14
+ sdkVersion: input.sdkVersion,
15
+ application: input.application,
16
+ ...(input.clientId !== undefined ? { clientId: input.clientId } : {}),
17
+ requestedCapabilities: [...input.requestedCapabilities],
18
+ clientNonce: randomBase64Url(16),
19
+ occurredAt: input.occurredAt
20
+ });
21
+ }
22
+ export function buildPairingRequestBody(input) {
23
+ return JSON.stringify({
24
+ protocolVersion: PROTOCOL_MAJOR,
25
+ kind: 'pairing',
26
+ type: 'pairing:request',
27
+ clientId: input.clientId,
28
+ clientPublicKey: input.publicKeySpkiBase64Url,
29
+ keyAlgorithm: popKeyAlgorithmId(),
30
+ application: input.application,
31
+ requestedProfile: input.requestedProfile,
32
+ requestedCapabilities: [...input.requestedCapabilities],
33
+ occurredAt: input.occurredAt
34
+ });
35
+ }
36
+ export function buildAuthProofBody(input) {
37
+ return JSON.stringify({
38
+ protocolVersion: PROTOCOL_MAJOR,
39
+ kind: 'auth',
40
+ type: 'sdk:auth-proof',
41
+ challengeId: input.challengeId,
42
+ clientId: input.clientId,
43
+ signature: input.signature,
44
+ occurredAt: input.occurredAt
45
+ });
46
+ }
47
+ export function buildPingBody(input) {
48
+ return JSON.stringify({
49
+ protocolVersion: PROTOCOL_MAJOR,
50
+ kind: 'command',
51
+ type: 'sdk:ping',
52
+ requestId: input.requestId,
53
+ serverInstanceId: input.serverInstanceId,
54
+ sessionEpoch: input.sessionEpoch,
55
+ occurredAt: input.occurredAt,
56
+ payload: {}
57
+ });
58
+ }
59
+ export function isoNow(epochMs) {
60
+ return new Date(epochMs).toISOString();
61
+ }
62
+ //# sourceMappingURL=auth-wire.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-wire.js","sourceRoot":"","sources":["../../src/internal/auth-wire.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,cAAc,EACd,YAAY,EACZ,YAAY,EAMb,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,MAAM,UAAU,oBAAoB,CAAC,KAMpC;IACC,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,eAAe,EAAE,cAAc;QAC/B,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,YAAY;QACzB,WAAW,EAAE,YAAY;QACzB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,qBAAqB,EAAE,CAAC,GAAG,KAAK,CAAC,qBAAqB,CAAC;QACvD,WAAW,EAAE,eAAe,CAAC,EAAE,CAAC;QAChC,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAOvC;IACC,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,eAAe,EAAE,cAAc;QAC/B,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,iBAAiB;QACvB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,eAAe,EAAE,KAAK,CAAC,sBAAsB;QAC7C,YAAY,EAAE,iBAAiB,EAAE;QACjC,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,qBAAqB,EAAE,CAAC,GAAG,KAAK,CAAC,qBAAqB,CAAC;QACvD,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAKlC;IACC,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,eAAe,EAAE,cAAc;QAC/B,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAK7B;IACC,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,eAAe,EAAE,cAAc;QAC/B,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,UAAU;QAChB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,OAAO,EAAE,EAAE;KACZ,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,OAAe;IACpC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;AACzC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Base64url helpers for PoP wire fields (ADR-0016).
3
+ */
4
+ export declare function bytesToBase64Url(bytes: ArrayBuffer | Uint8Array): string;
5
+ export declare function base64UrlToBytes(value: string): Uint8Array;
6
+ export declare function randomBase64Url(byteLength: number): string;
7
+ //# sourceMappingURL=base64url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base64url.d.ts","sourceRoot":"","sources":["../../src/internal/base64url.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,UAAU,GAAG,MAAM,CAOxE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAU1D;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAI1D"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Base64url helpers for PoP wire fields (ADR-0016).
3
+ */
4
+ export function bytesToBase64Url(bytes) {
5
+ const view = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);
6
+ let binary = '';
7
+ for (let index = 0; index < view.length; index += 1) {
8
+ binary += String.fromCharCode(view[index]);
9
+ }
10
+ return btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/u, '');
11
+ }
12
+ export function base64UrlToBytes(value) {
13
+ const padded = value.replace(/-/g, '+').replace(/_/g, '/');
14
+ const padLength = (4 - (padded.length % 4)) % 4;
15
+ const withPad = padded + '='.repeat(padLength);
16
+ const binary = atob(withPad);
17
+ const out = new Uint8Array(binary.length);
18
+ for (let index = 0; index < binary.length; index += 1) {
19
+ out[index] = binary.charCodeAt(index);
20
+ }
21
+ return out;
22
+ }
23
+ export function randomBase64Url(byteLength) {
24
+ const bytes = new Uint8Array(byteLength);
25
+ crypto.getRandomValues(bytes);
26
+ return bytesToBase64Url(bytes);
27
+ }
28
+ //# sourceMappingURL=base64url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base64url.js","sourceRoot":"","sources":["../../src/internal/base64url.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,gBAAgB,CAAC,KAA+B;IAC9D,MAAM,IAAI,GAAG,KAAK,YAAY,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IACzE,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAE,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7B,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACtD,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,UAAkB;IAChD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Official browser WebSocket adapter for {@link TransportPort}.
3
+ * Protocol / reconnect / auth stay in the connection session — this is bytes only.
4
+ */
5
+ import type { TransportPort } from './transport-port.js';
6
+ /** Minimal WebSocket surface used by the adapter (browser or injectable test double). @public */
7
+ export type BrowserWebSocketLike = {
8
+ readonly readyState: number;
9
+ binaryType: string;
10
+ onopen: ((ev: Event) => void) | null;
11
+ onmessage: ((ev: MessageEvent) => void) | null;
12
+ onerror: ((ev: Event) => void) | null;
13
+ onclose: ((ev: CloseEvent) => void) | null;
14
+ send: (data: string) => void;
15
+ close: (code?: number, reason?: string) => void;
16
+ };
17
+ /** Constructor shape compatible with `globalThis.WebSocket`. @public */
18
+ export type BrowserWebSocketConstructor = {
19
+ new (url: string): BrowserWebSocketLike;
20
+ readonly OPEN: number;
21
+ };
22
+ /**
23
+ * Options for {@link createBrowserWebSocketTransport}.
24
+ * @public
25
+ */
26
+ export type CreateBrowserWebSocketTransportOptions = {
27
+ /** Inject a WebSocket constructor (tests). Defaults to `globalThis.WebSocket`. */
28
+ readonly webSocket?: BrowserWebSocketConstructor;
29
+ };
30
+ /**
31
+ * Create one browser WebSocket transport instance.
32
+ * Call once per connect/reconnect attempt (via `transportFactory`).
33
+ * @public
34
+ */
35
+ export declare function createBrowserWebSocketTransport(options?: CreateBrowserWebSocketTransportOptions): TransportPort;
36
+ //# sourceMappingURL=browser-websocket-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-websocket-transport.d.ts","sourceRoot":"","sources":["../../src/internal/browser-websocket-transport.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAGV,aAAa,EACd,MAAM,qBAAqB,CAAC;AAI7B,iGAAiG;AACjG,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IACrC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,YAAY,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IAC/C,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IACtC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,UAAU,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3C,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CACjD,CAAC;AAEF,wEAAwE;AACxE,MAAM,MAAM,2BAA2B,GAAG;IACxC,KAAK,GAAG,EAAE,MAAM,GAAG,oBAAoB,CAAC;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,sCAAsC,GAAG;IACnD,kFAAkF;IAClF,QAAQ,CAAC,SAAS,CAAC,EAAE,2BAA2B,CAAC;CAClD,CAAC;AAyDF;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC7C,OAAO,CAAC,EAAE,sCAAsC,GAC/C,aAAa,CA4Ff"}