@corti/dictation-web 0.6.0 → 0.7.0-ambient

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 (91) hide show
  1. package/dist/bundle.js +1838 -1455
  2. package/dist/components/ambient-recording-button.d.ts +16 -0
  3. package/dist/components/ambient-recording-button.js +68 -0
  4. package/dist/components/ambient-recording-button.js.map +1 -0
  5. package/dist/components/corti-ambient.d.ts +27 -0
  6. package/dist/components/corti-ambient.js +97 -0
  7. package/dist/components/corti-ambient.js.map +1 -0
  8. package/dist/components/corti-dictation.d.ts +9 -109
  9. package/dist/components/corti-dictation.js +12 -187
  10. package/dist/components/corti-dictation.js.map +1 -1
  11. package/dist/components/corti-root.d.ts +121 -0
  12. package/dist/components/corti-root.js +196 -0
  13. package/dist/components/corti-root.js.map +1 -0
  14. package/dist/components/device-selector.js +1 -1
  15. package/dist/components/device-selector.js.map +1 -1
  16. package/dist/components/dictation-recording-button.d.ts +13 -0
  17. package/dist/components/dictation-recording-button.js +30 -0
  18. package/dist/components/dictation-recording-button.js.map +1 -0
  19. package/dist/components/keybinding-input.js +1 -1
  20. package/dist/components/keybinding-input.js.map +1 -1
  21. package/dist/components/keybinding-selector.js +1 -1
  22. package/dist/components/keybinding-selector.js.map +1 -1
  23. package/dist/components/language-selector.js +2 -1
  24. package/dist/components/language-selector.js.map +1 -1
  25. package/dist/components/{recording-button.d.ts → recording-button-base.d.ts} +7 -9
  26. package/dist/components/recording-button-base.js +321 -0
  27. package/dist/components/recording-button-base.js.map +1 -0
  28. package/dist/components/settings-menu.js +1 -1
  29. package/dist/components/settings-menu.js.map +1 -1
  30. package/dist/constants.d.ts +1 -0
  31. package/dist/constants.js +9 -0
  32. package/dist/constants.js.map +1 -1
  33. package/dist/contexts/ambient-context.d.ts +18 -0
  34. package/dist/contexts/ambient-context.js +48 -0
  35. package/dist/contexts/ambient-context.js.map +1 -0
  36. package/dist/contexts/dictation-context.d.ts +3 -92
  37. package/dist/contexts/dictation-context.js +5 -257
  38. package/dist/contexts/dictation-context.js.map +1 -1
  39. package/dist/contexts/mixins/auth-context.d.ts +32 -0
  40. package/dist/contexts/mixins/auth-context.js +116 -0
  41. package/dist/contexts/mixins/auth-context.js.map +1 -0
  42. package/dist/contexts/mixins/devices-context.d.ts +14 -0
  43. package/dist/contexts/mixins/devices-context.js +58 -0
  44. package/dist/contexts/mixins/devices-context.js.map +1 -0
  45. package/dist/contexts/mixins/keybindings-context.d.ts +13 -0
  46. package/dist/contexts/mixins/keybindings-context.js +62 -0
  47. package/dist/contexts/mixins/keybindings-context.js.map +1 -0
  48. package/dist/contexts/mixins/languages-context.d.ts +11 -0
  49. package/dist/contexts/mixins/languages-context.js +54 -0
  50. package/dist/contexts/mixins/languages-context.js.map +1 -0
  51. package/dist/contexts/mixins/proxy-context.d.ts +14 -0
  52. package/dist/contexts/mixins/proxy-context.js +24 -0
  53. package/dist/contexts/mixins/proxy-context.js.map +1 -0
  54. package/dist/contexts/mixins/recording-state-context.d.ts +13 -0
  55. package/dist/contexts/mixins/recording-state-context.js +30 -0
  56. package/dist/contexts/mixins/recording-state-context.js.map +1 -0
  57. package/dist/contexts/mixins/types.d.ts +5 -0
  58. package/dist/contexts/mixins/types.js +2 -0
  59. package/dist/contexts/mixins/types.js.map +1 -0
  60. package/dist/contexts/root-context.d.ts +8 -0
  61. package/dist/contexts/root-context.js +34 -0
  62. package/dist/contexts/root-context.js.map +1 -0
  63. package/dist/controllers/ambient-controller.d.ts +16 -0
  64. package/dist/controllers/ambient-controller.js +24 -0
  65. package/dist/controllers/ambient-controller.js.map +1 -0
  66. package/dist/controllers/dictation-controller.d.ts +8 -31
  67. package/dist/controllers/dictation-controller.js +17 -283
  68. package/dist/controllers/dictation-controller.js.map +1 -1
  69. package/dist/controllers/languages-controller.js +0 -4
  70. package/dist/controllers/languages-controller.js.map +1 -1
  71. package/dist/controllers/socket-controller.d.ts +51 -0
  72. package/dist/controllers/socket-controller.js +281 -0
  73. package/dist/controllers/socket-controller.js.map +1 -0
  74. package/dist/index.d.ts +5 -2
  75. package/dist/index.js +12 -2
  76. package/dist/index.js.map +1 -1
  77. package/dist/tsconfig.tsbuildinfo +1 -1
  78. package/dist/types.d.ts +3 -0
  79. package/dist/types.js.map +1 -1
  80. package/dist/utils/devices.d.ts +12 -8
  81. package/dist/utils/devices.js +39 -28
  82. package/dist/utils/devices.js.map +1 -1
  83. package/dist/utils/events.d.ts +5 -3
  84. package/dist/utils/events.js +7 -0
  85. package/dist/utils/events.js.map +1 -1
  86. package/dist/utils/keybinding.d.ts +2 -1
  87. package/dist/utils/keybinding.js +12 -6
  88. package/dist/utils/keybinding.js.map +1 -1
  89. package/package.json +1 -1
  90. package/dist/components/recording-button.js +0 -331
  91. package/dist/components/recording-button.js.map +0 -1
@@ -0,0 +1,281 @@
1
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
2
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
3
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
4
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
+ };
6
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
7
+ if (kind === "m") throw new TypeError("Private method is not writable");
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
9
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
10
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
11
+ };
12
+ var _SocketController_instances, _SocketController_webSocket, _SocketController_cortiClient, _SocketController_connectionGeneration, _SocketController_socketReady, _SocketController_closeTimeout, _SocketController_outboundQueue, _SocketController_callbacks, _SocketController_lastConfig, _SocketController_lastSocketUrl, _SocketController_lastSocketProxy, _SocketController_connectingPromise, _SocketController_isConnecting, _SocketController_openViaProxy, _SocketController_openViaAuth, _SocketController_doConnect, _SocketController_isSocketOpen, _SocketController_configHasChanged, _SocketController_drain, _SocketController_setupWebSocketHandlers;
13
+ import { CortiClient } from "@corti/sdk";
14
+ import { errorEvent } from "../utils/events.js";
15
+ export class SocketController {
16
+ constructor(host) {
17
+ _SocketController_instances.add(this);
18
+ _SocketController_webSocket.set(this, null);
19
+ _SocketController_cortiClient.set(this, null);
20
+ _SocketController_connectionGeneration.set(this, 0);
21
+ _SocketController_socketReady.set(this, false);
22
+ _SocketController_closeTimeout.set(this, void 0);
23
+ _SocketController_outboundQueue.set(this, []);
24
+ _SocketController_callbacks.set(this, void 0);
25
+ _SocketController_lastConfig.set(this, null);
26
+ _SocketController_lastSocketUrl.set(this, void 0);
27
+ _SocketController_lastSocketProxy.set(this, void 0);
28
+ _SocketController_connectingPromise.set(this, null);
29
+ _SocketController_isConnecting.set(this, false);
30
+ this.mediaRecorderHandler = (data) => {
31
+ if (__classPrivateFieldGet(this, _SocketController_socketReady, "f") && __classPrivateFieldGet(this, _SocketController_instances, "m", _SocketController_isSocketOpen).call(this)) {
32
+ __classPrivateFieldGet(this, _SocketController_webSocket, "f")?.send(data);
33
+ __classPrivateFieldGet(this, _SocketController_callbacks, "f")?.onNetworkActivity?.("sent", {
34
+ size: data.size,
35
+ type: "audio",
36
+ });
37
+ return;
38
+ }
39
+ __classPrivateFieldGet(this, _SocketController_outboundQueue, "f").push(data);
40
+ };
41
+ this.host = host;
42
+ host.addController(this);
43
+ }
44
+ async connect(config, callbacks) {
45
+ // If a connection attempt is already in progress with the same config, reuse it
46
+ // to avoid opening multiple sockets when connect() is called concurrently.
47
+ if (__classPrivateFieldGet(this, _SocketController_connectingPromise, "f") && !__classPrivateFieldGet(this, _SocketController_instances, "m", _SocketController_configHasChanged).call(this, config)) {
48
+ return __classPrivateFieldGet(this, _SocketController_connectingPromise, "f");
49
+ }
50
+ // #isConnecting must be set synchronously before #doConnect runs, because
51
+ // #doConnect calls cleanup() which closes the old socket, firing its "close"
52
+ // event synchronously. Handlers that check isConnecting() need to see true
53
+ // at that point — before #connectingPromise is even assigned.
54
+ __classPrivateFieldSet(this, _SocketController_isConnecting, true, "f");
55
+ __classPrivateFieldSet(this, _SocketController_connectingPromise, __classPrivateFieldGet(this, _SocketController_instances, "m", _SocketController_doConnect).call(this, config, callbacks).finally(() => {
56
+ __classPrivateFieldSet(this, _SocketController_isConnecting, false, "f");
57
+ __classPrivateFieldSet(this, _SocketController_connectingPromise, null, "f");
58
+ }), "f");
59
+ return __classPrivateFieldGet(this, _SocketController_connectingPromise, "f");
60
+ }
61
+ hostDisconnected() {
62
+ this.cleanup();
63
+ }
64
+ isConnectionOpen() {
65
+ return (__classPrivateFieldGet(this, _SocketController_webSocket, "f") !== null &&
66
+ (__classPrivateFieldGet(this, _SocketController_webSocket, "f").readyState === WebSocket.OPEN ||
67
+ __classPrivateFieldGet(this, _SocketController_webSocket, "f").readyState === WebSocket.CONNECTING));
68
+ }
69
+ isConnecting() {
70
+ return __classPrivateFieldGet(this, _SocketController_isConnecting, "f");
71
+ }
72
+ async waitForConnection() {
73
+ await __classPrivateFieldGet(this, _SocketController_connectingPromise, "f");
74
+ }
75
+ async pause() {
76
+ if (__classPrivateFieldGet(this, _SocketController_socketReady, "f") && __classPrivateFieldGet(this, _SocketController_instances, "m", _SocketController_isSocketOpen).call(this)) {
77
+ __classPrivateFieldGet(this, _SocketController_webSocket, "f")?.send(JSON.stringify({ type: "flush" }));
78
+ __classPrivateFieldGet(this, _SocketController_callbacks, "f")?.onNetworkActivity?.("sent", { type: "flush" });
79
+ return;
80
+ }
81
+ __classPrivateFieldGet(this, _SocketController_outboundQueue, "f").push({ type: "flush" });
82
+ }
83
+ async stopRecording() {
84
+ await this.pause();
85
+ }
86
+ async closeConnection(onClose) {
87
+ await new Promise((resolve, reject) => {
88
+ const oldSocket = __classPrivateFieldGet(this, _SocketController_webSocket, "f");
89
+ __classPrivateFieldSet(this, _SocketController_webSocket, null, "f");
90
+ if (!oldSocket ||
91
+ (oldSocket.readyState !== WebSocket.OPEN &&
92
+ oldSocket.readyState !== WebSocket.CONNECTING)) {
93
+ __classPrivateFieldSet(this, _SocketController_socketReady, false, "f");
94
+ resolve();
95
+ return;
96
+ }
97
+ oldSocket.on("close", (event) => {
98
+ if (__classPrivateFieldGet(this, _SocketController_closeTimeout, "f")) {
99
+ clearTimeout(__classPrivateFieldGet(this, _SocketController_closeTimeout, "f"));
100
+ __classPrivateFieldSet(this, _SocketController_closeTimeout, undefined, "f");
101
+ }
102
+ if (onClose) {
103
+ onClose(event);
104
+ }
105
+ else if (__classPrivateFieldGet(this, _SocketController_callbacks, "f")?.onClose) {
106
+ __classPrivateFieldGet(this, _SocketController_callbacks, "f").onClose(event);
107
+ }
108
+ resolve();
109
+ });
110
+ const wasReady = __classPrivateFieldGet(this, _SocketController_socketReady, "f");
111
+ __classPrivateFieldSet(this, _SocketController_socketReady, false, "f");
112
+ oldSocket.on("message", (message) => {
113
+ __classPrivateFieldGet(this, _SocketController_callbacks, "f")?.onNetworkActivity?.("received", message);
114
+ if (__classPrivateFieldGet(this, _SocketController_callbacks, "f")?.onMessage) {
115
+ __classPrivateFieldGet(this, _SocketController_callbacks, "f").onMessage(message);
116
+ }
117
+ // closeConnection() may be called before CONFIG_ACCEPTED arrives (e.g.
118
+ // openConnection() followed immediately by closeConnection()). We can't
119
+ // use the outbound queue here because #webSocket is already null, so we
120
+ // send "end" directly on oldSocket as soon as config is accepted.
121
+ if (!wasReady && message.type === "CONFIG_ACCEPTED") {
122
+ oldSocket.sendEnd({ type: "end" });
123
+ __classPrivateFieldGet(this, _SocketController_callbacks, "f")?.onNetworkActivity?.("sent", { type: "end" });
124
+ return;
125
+ }
126
+ if (message.type === "ended" || message.type === "ENDED") {
127
+ if (__classPrivateFieldGet(this, _SocketController_closeTimeout, "f")) {
128
+ clearTimeout(__classPrivateFieldGet(this, _SocketController_closeTimeout, "f"));
129
+ __classPrivateFieldSet(this, _SocketController_closeTimeout, undefined, "f");
130
+ }
131
+ resolve();
132
+ return;
133
+ }
134
+ });
135
+ if (wasReady) {
136
+ oldSocket.sendEnd({ type: "end" });
137
+ __classPrivateFieldGet(this, _SocketController_callbacks, "f")?.onNetworkActivity?.("sent", { type: "end" });
138
+ }
139
+ __classPrivateFieldSet(this, _SocketController_closeTimeout, window.setTimeout(() => {
140
+ reject(new Error("Connection close timeout"));
141
+ if (oldSocket?.readyState === WebSocket.OPEN) {
142
+ oldSocket.close();
143
+ }
144
+ }, 10000), "f");
145
+ });
146
+ }
147
+ cleanup() {
148
+ var _a;
149
+ __classPrivateFieldSet(this, _SocketController_connectionGeneration, (_a = __classPrivateFieldGet(this, _SocketController_connectionGeneration, "f"), _a++, _a), "f");
150
+ __classPrivateFieldSet(this, _SocketController_socketReady, false, "f");
151
+ if (__classPrivateFieldGet(this, _SocketController_closeTimeout, "f")) {
152
+ clearTimeout(__classPrivateFieldGet(this, _SocketController_closeTimeout, "f"));
153
+ __classPrivateFieldSet(this, _SocketController_closeTimeout, undefined, "f");
154
+ }
155
+ if (this.isConnectionOpen()) {
156
+ __classPrivateFieldGet(this, _SocketController_webSocket, "f")?.close();
157
+ }
158
+ __classPrivateFieldSet(this, _SocketController_webSocket, null, "f");
159
+ __classPrivateFieldSet(this, _SocketController_cortiClient, null, "f");
160
+ __classPrivateFieldSet(this, _SocketController_lastConfig, null, "f");
161
+ __classPrivateFieldSet(this, _SocketController_lastSocketUrl, undefined, "f");
162
+ __classPrivateFieldSet(this, _SocketController_lastSocketProxy, undefined, "f");
163
+ if (__classPrivateFieldGet(this, _SocketController_outboundQueue, "f").length > 0) {
164
+ this.host.dispatchEvent(errorEvent(`${__classPrivateFieldGet(this, _SocketController_outboundQueue, "f").length} unsent message(s) were discarded because the configuration changed before the connection was closed`));
165
+ }
166
+ __classPrivateFieldSet(this, _SocketController_outboundQueue, [], "f");
167
+ }
168
+ }
169
+ _SocketController_webSocket = new WeakMap(), _SocketController_cortiClient = new WeakMap(), _SocketController_connectionGeneration = new WeakMap(), _SocketController_socketReady = new WeakMap(), _SocketController_closeTimeout = new WeakMap(), _SocketController_outboundQueue = new WeakMap(), _SocketController_callbacks = new WeakMap(), _SocketController_lastConfig = new WeakMap(), _SocketController_lastSocketUrl = new WeakMap(), _SocketController_lastSocketProxy = new WeakMap(), _SocketController_connectingPromise = new WeakMap(), _SocketController_isConnecting = new WeakMap(), _SocketController_instances = new WeakSet(), _SocketController_openViaProxy = async function _SocketController_openViaProxy(config) {
170
+ const proxyOptions = this.host._socketProxy || {
171
+ url: this.host._socketUrl || "",
172
+ };
173
+ if (!proxyOptions.url) {
174
+ throw new Error("Proxy URL is required when using proxy client");
175
+ }
176
+ return this._connectThroughProxy(config, proxyOptions);
177
+ }, _SocketController_openViaAuth = async function _SocketController_openViaAuth(config) {
178
+ if (!this.host._authConfig && !this.host._accessToken) {
179
+ throw new Error("Auth configuration or access token is required to connect");
180
+ }
181
+ const auth = this.host._authConfig || {
182
+ accessToken: this.host._accessToken || "",
183
+ refreshAccessToken: () => ({
184
+ accessToken: this.host._accessToken || "",
185
+ }),
186
+ };
187
+ __classPrivateFieldSet(this, _SocketController_cortiClient, new CortiClient({
188
+ auth,
189
+ environment: this.host._region,
190
+ tenantName: this.host._tenantName,
191
+ }), "f");
192
+ return this._connectThroughAuth(__classPrivateFieldGet(this, _SocketController_cortiClient, "f"), config);
193
+ }, _SocketController_doConnect = async function _SocketController_doConnect(config, callbacks) {
194
+ const newConnection = __classPrivateFieldGet(this, _SocketController_instances, "m", _SocketController_configHasChanged).call(this, config) || !this.isConnectionOpen();
195
+ if (newConnection) {
196
+ this.cleanup();
197
+ __classPrivateFieldSet(this, _SocketController_lastConfig, config, "f");
198
+ __classPrivateFieldSet(this, _SocketController_lastSocketUrl, this.host._socketUrl, "f");
199
+ __classPrivateFieldSet(this, _SocketController_lastSocketProxy, this.host._socketProxy, "f");
200
+ const generation = __classPrivateFieldGet(this, _SocketController_connectionGeneration, "f");
201
+ const socket = this.host._socketUrl || this.host._socketProxy
202
+ ? await __classPrivateFieldGet(this, _SocketController_instances, "m", _SocketController_openViaProxy).call(this, config)
203
+ : await __classPrivateFieldGet(this, _SocketController_instances, "m", _SocketController_openViaAuth).call(this, config);
204
+ // If cleanup() was called while we were awaiting (e.g. config changed),
205
+ // the generation counter will have advanced — discard this stale socket.
206
+ if (__classPrivateFieldGet(this, _SocketController_connectionGeneration, "f") !== generation) {
207
+ socket.close();
208
+ return "superseded";
209
+ }
210
+ __classPrivateFieldSet(this, _SocketController_webSocket, socket, "f");
211
+ __classPrivateFieldGet(this, _SocketController_callbacks, "f")?.onNetworkActivity?.("sent", {
212
+ configuration: config,
213
+ type: "config",
214
+ });
215
+ }
216
+ __classPrivateFieldSet(this, _SocketController_callbacks, callbacks, "f");
217
+ __classPrivateFieldGet(this, _SocketController_instances, "m", _SocketController_setupWebSocketHandlers).call(this, callbacks);
218
+ if (!newConnection && this.isConnectionOpen()) {
219
+ __classPrivateFieldSet(this, _SocketController_socketReady, true, "f");
220
+ __classPrivateFieldGet(this, _SocketController_instances, "m", _SocketController_drain).call(this);
221
+ }
222
+ return newConnection;
223
+ }, _SocketController_isSocketOpen = function _SocketController_isSocketOpen() {
224
+ return (__classPrivateFieldGet(this, _SocketController_webSocket, "f") !== null && __classPrivateFieldGet(this, _SocketController_webSocket, "f").readyState === WebSocket.OPEN);
225
+ }, _SocketController_configHasChanged = function _SocketController_configHasChanged(nextConfig) {
226
+ return (JSON.stringify(nextConfig) !== JSON.stringify(__classPrivateFieldGet(this, _SocketController_lastConfig, "f")) ||
227
+ this.host._socketUrl !== __classPrivateFieldGet(this, _SocketController_lastSocketUrl, "f") ||
228
+ JSON.stringify(this.host._socketProxy) !==
229
+ JSON.stringify(__classPrivateFieldGet(this, _SocketController_lastSocketProxy, "f")));
230
+ }, _SocketController_drain = function _SocketController_drain() {
231
+ if (!__classPrivateFieldGet(this, _SocketController_socketReady, "f") ||
232
+ !__classPrivateFieldGet(this, _SocketController_instances, "m", _SocketController_isSocketOpen).call(this) ||
233
+ __classPrivateFieldGet(this, _SocketController_outboundQueue, "f").length === 0) {
234
+ return;
235
+ }
236
+ while (__classPrivateFieldGet(this, _SocketController_outboundQueue, "f").length > 0 && __classPrivateFieldGet(this, _SocketController_instances, "m", _SocketController_isSocketOpen).call(this)) {
237
+ const item = __classPrivateFieldGet(this, _SocketController_outboundQueue, "f").shift();
238
+ if (item === undefined) {
239
+ break;
240
+ }
241
+ if (item instanceof Blob) {
242
+ __classPrivateFieldGet(this, _SocketController_webSocket, "f").send(item);
243
+ __classPrivateFieldGet(this, _SocketController_callbacks, "f")?.onNetworkActivity?.("sent", {
244
+ size: item.size,
245
+ type: "audio",
246
+ });
247
+ continue;
248
+ }
249
+ __classPrivateFieldGet(this, _SocketController_webSocket, "f").send(JSON.stringify(item));
250
+ __classPrivateFieldGet(this, _SocketController_callbacks, "f")?.onNetworkActivity?.("sent", {
251
+ type: item.type,
252
+ });
253
+ }
254
+ }, _SocketController_setupWebSocketHandlers = function _SocketController_setupWebSocketHandlers(callbacks) {
255
+ if (!__classPrivateFieldGet(this, _SocketController_webSocket, "f")) {
256
+ throw new Error("WebSocket not initialized");
257
+ }
258
+ __classPrivateFieldGet(this, _SocketController_webSocket, "f").on("message", (message) => {
259
+ if (message.type === "CONFIG_ACCEPTED") {
260
+ __classPrivateFieldSet(this, _SocketController_socketReady, true, "f");
261
+ __classPrivateFieldGet(this, _SocketController_instances, "m", _SocketController_drain).call(this);
262
+ }
263
+ callbacks.onNetworkActivity?.("received", message);
264
+ if (callbacks.onMessage) {
265
+ callbacks.onMessage(message);
266
+ }
267
+ });
268
+ __classPrivateFieldGet(this, _SocketController_webSocket, "f").on("error", (event) => {
269
+ __classPrivateFieldSet(this, _SocketController_socketReady, false, "f");
270
+ if (callbacks.onError) {
271
+ callbacks.onError(event);
272
+ }
273
+ });
274
+ __classPrivateFieldGet(this, _SocketController_webSocket, "f").on("close", (event) => {
275
+ __classPrivateFieldSet(this, _SocketController_socketReady, false, "f");
276
+ if (callbacks.onClose) {
277
+ callbacks.onClose(event);
278
+ }
279
+ });
280
+ };
281
+ //# sourceMappingURL=socket-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket-controller.js","sourceRoot":"","sources":["../../src/controllers/socket-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { type CortiAuth, CortiClient } from \"@corti/sdk\";\nimport type { ReactiveController, ReactiveControllerHost } from \"lit\";\nimport type { ProxyOptions } from \"../types.js\";\nimport { errorEvent } from \"../utils/events.js\";\n\nexport interface SocketControllerHost extends ReactiveControllerHost {\n dispatchEvent: (event: Event) => void;\n _accessToken?: string;\n _authConfig?: CortiAuth.AuthTokenDerivable;\n _region?: string;\n _tenantName?: string;\n _socketUrl?: string;\n _socketProxy?: ProxyOptions;\n}\n\nexport type SocketControllerWebSocket = {\n readyState: number;\n close(): void;\n on(event: \"message\", handler: (message: { type: string }) => void): void;\n on(event: \"error\", handler: (error: Error) => void): void;\n on(event: \"close\", handler: (event: unknown) => void): void;\n send(data: Blob | ArrayBufferLike | string): void;\n sendEnd(message: { type: \"end\" }): void;\n};\n\nexport type SocketControllerCallbacks<TMessage = unknown> = {\n onMessage?: (message: TMessage) => void;\n onError?: (error: Error) => void;\n onClose?: (event: unknown) => void;\n onNetworkActivity?: (direction: \"sent\" | \"received\", data: unknown) => void;\n};\n\nexport type SocketControllerOutboundItem = Blob | { type: string };\n\nexport abstract class SocketController<\n TOutbound extends SocketControllerOutboundItem,\n TMessage = unknown,\n TConfig = unknown,\n TSocket extends SocketControllerWebSocket = SocketControllerWebSocket,\n> implements ReactiveController\n{\n readonly host: SocketControllerHost;\n\n #webSocket: TSocket | null = null;\n #cortiClient: CortiClient | null = null;\n #connectionGeneration = 0;\n #socketReady = false;\n #closeTimeout?: number;\n #outboundQueue: TOutbound[] = [];\n #callbacks?: SocketControllerCallbacks<TMessage>;\n #lastConfig: TConfig | null = null;\n #lastSocketUrl?: string;\n #lastSocketProxy?: ProxyOptions;\n #connectingPromise: Promise<boolean | \"superseded\"> | null = null;\n #isConnecting = false;\n\n protected abstract _connectThroughProxy(\n config: TConfig,\n proxy: ProxyOptions,\n ): Promise<TSocket>;\n protected abstract _connectThroughAuth(\n client: CortiClient,\n config: TConfig,\n ): Promise<TSocket>;\n\n constructor(host: SocketControllerHost) {\n this.host = host;\n host.addController(this);\n }\n\n async #openViaProxy(config: TConfig): Promise<TSocket> {\n const proxyOptions = this.host._socketProxy || {\n url: this.host._socketUrl || \"\",\n };\n\n if (!proxyOptions.url) {\n throw new Error(\"Proxy URL is required when using proxy client\");\n }\n\n return this._connectThroughProxy(config, proxyOptions);\n }\n\n async #openViaAuth(config: TConfig): Promise<TSocket> {\n if (!this.host._authConfig && !this.host._accessToken) {\n throw new Error(\n \"Auth configuration or access token is required to connect\",\n );\n }\n\n const auth: CortiAuth.AuthTokenDerivable = this.host._authConfig || {\n accessToken: this.host._accessToken || \"\",\n refreshAccessToken: () => ({\n accessToken: this.host._accessToken || \"\",\n }),\n };\n\n this.#cortiClient = new CortiClient({\n auth,\n environment: this.host._region,\n tenantName: this.host._tenantName,\n });\n\n return this._connectThroughAuth(this.#cortiClient, config);\n }\n\n async connect(\n config: TConfig,\n callbacks: SocketControllerCallbacks<TMessage>,\n ): Promise<boolean | \"superseded\"> {\n // If a connection attempt is already in progress with the same config, reuse it\n // to avoid opening multiple sockets when connect() is called concurrently.\n if (this.#connectingPromise && !this.#configHasChanged(config)) {\n return this.#connectingPromise;\n }\n\n // #isConnecting must be set synchronously before #doConnect runs, because\n // #doConnect calls cleanup() which closes the old socket, firing its \"close\"\n // event synchronously. Handlers that check isConnecting() need to see true\n // at that point — before #connectingPromise is even assigned.\n this.#isConnecting = true;\n this.#connectingPromise = this.#doConnect(config, callbacks).finally(() => {\n this.#isConnecting = false;\n this.#connectingPromise = null;\n });\n\n return this.#connectingPromise;\n }\n\n async #doConnect(\n config: TConfig,\n callbacks: SocketControllerCallbacks<TMessage>,\n ): Promise<boolean | \"superseded\"> {\n const newConnection =\n this.#configHasChanged(config) || !this.isConnectionOpen();\n\n if (newConnection) {\n this.cleanup();\n\n this.#lastConfig = config;\n this.#lastSocketUrl = this.host._socketUrl;\n this.#lastSocketProxy = this.host._socketProxy;\n\n const generation = this.#connectionGeneration;\n\n const socket =\n this.host._socketUrl || this.host._socketProxy\n ? await this.#openViaProxy(config)\n : await this.#openViaAuth(config);\n\n // If cleanup() was called while we were awaiting (e.g. config changed),\n // the generation counter will have advanced — discard this stale socket.\n if (this.#connectionGeneration !== generation) {\n socket.close();\n return \"superseded\";\n }\n\n this.#webSocket = socket;\n\n this.#callbacks?.onNetworkActivity?.(\"sent\", {\n configuration: config,\n type: \"config\",\n });\n }\n\n this.#callbacks = callbacks;\n this.#setupWebSocketHandlers(callbacks);\n\n if (!newConnection && this.isConnectionOpen()) {\n this.#socketReady = true;\n this.#drain();\n }\n\n return newConnection;\n }\n\n hostDisconnected(): void {\n this.cleanup();\n }\n\n isConnectionOpen(): boolean {\n return (\n this.#webSocket !== null &&\n (this.#webSocket.readyState === WebSocket.OPEN ||\n this.#webSocket.readyState === WebSocket.CONNECTING)\n );\n }\n\n isConnecting(): boolean {\n return this.#isConnecting;\n }\n\n async waitForConnection(): Promise<void> {\n await this.#connectingPromise;\n }\n\n #isSocketOpen(): boolean {\n return (\n this.#webSocket !== null && this.#webSocket.readyState === WebSocket.OPEN\n );\n }\n\n #configHasChanged(nextConfig: TConfig): boolean {\n return (\n JSON.stringify(nextConfig) !== JSON.stringify(this.#lastConfig) ||\n this.host._socketUrl !== this.#lastSocketUrl ||\n JSON.stringify(this.host._socketProxy) !==\n JSON.stringify(this.#lastSocketProxy)\n );\n }\n\n #drain(): void {\n if (\n !this.#socketReady ||\n !this.#isSocketOpen() ||\n this.#outboundQueue.length === 0\n ) {\n return;\n }\n\n while (this.#outboundQueue.length > 0 && this.#isSocketOpen()) {\n const item = this.#outboundQueue.shift();\n\n if (item === undefined) {\n break;\n }\n\n if (item instanceof Blob) {\n this.#webSocket!.send(item);\n this.#callbacks?.onNetworkActivity?.(\"sent\", {\n size: item.size,\n type: \"audio\",\n });\n continue;\n }\n\n this.#webSocket!.send(JSON.stringify(item));\n this.#callbacks?.onNetworkActivity?.(\"sent\", {\n type: item.type,\n });\n }\n }\n\n mediaRecorderHandler = (data: Blob): void => {\n if (this.#socketReady && this.#isSocketOpen()) {\n this.#webSocket?.send(data);\n this.#callbacks?.onNetworkActivity?.(\"sent\", {\n size: data.size,\n type: \"audio\",\n });\n return;\n }\n\n this.#outboundQueue.push(data as TOutbound);\n };\n\n async pause(): Promise<void> {\n if (this.#socketReady && this.#isSocketOpen()) {\n this.#webSocket?.send(JSON.stringify({ type: \"flush\" }));\n this.#callbacks?.onNetworkActivity?.(\"sent\", { type: \"flush\" });\n return;\n }\n\n this.#outboundQueue.push({ type: \"flush\" } as TOutbound);\n }\n\n async stopRecording(): Promise<void> {\n await this.pause();\n }\n\n async closeConnection(onClose?: (event: unknown) => void): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const oldSocket = this.#webSocket;\n this.#webSocket = null;\n\n if (\n !oldSocket ||\n (oldSocket.readyState !== WebSocket.OPEN &&\n oldSocket.readyState !== WebSocket.CONNECTING)\n ) {\n this.#socketReady = false;\n resolve();\n return;\n }\n\n oldSocket.on(\"close\", (event) => {\n if (this.#closeTimeout) {\n clearTimeout(this.#closeTimeout);\n this.#closeTimeout = undefined;\n }\n\n if (onClose) {\n onClose(event);\n } else if (this.#callbacks?.onClose) {\n this.#callbacks.onClose(event);\n }\n\n resolve();\n });\n\n const wasReady = this.#socketReady;\n this.#socketReady = false;\n\n oldSocket.on(\"message\", (message) => {\n this.#callbacks?.onNetworkActivity?.(\"received\", message);\n\n if (this.#callbacks?.onMessage) {\n this.#callbacks.onMessage(message as TMessage);\n }\n\n // closeConnection() may be called before CONFIG_ACCEPTED arrives (e.g.\n // openConnection() followed immediately by closeConnection()). We can't\n // use the outbound queue here because #webSocket is already null, so we\n // send \"end\" directly on oldSocket as soon as config is accepted.\n if (!wasReady && message.type === \"CONFIG_ACCEPTED\") {\n oldSocket.sendEnd({ type: \"end\" });\n this.#callbacks?.onNetworkActivity?.(\"sent\", { type: \"end\" });\n return;\n }\n\n if (message.type === \"ended\" || message.type === \"ENDED\") {\n if (this.#closeTimeout) {\n clearTimeout(this.#closeTimeout);\n this.#closeTimeout = undefined;\n }\n\n resolve();\n return;\n }\n });\n\n if (wasReady) {\n oldSocket.sendEnd({ type: \"end\" });\n this.#callbacks?.onNetworkActivity?.(\"sent\", { type: \"end\" });\n }\n\n this.#closeTimeout = window.setTimeout(() => {\n reject(new Error(\"Connection close timeout\"));\n\n if (oldSocket?.readyState === WebSocket.OPEN) {\n oldSocket.close();\n }\n }, 10000);\n });\n }\n\n cleanup(): void {\n this.#connectionGeneration++;\n this.#socketReady = false;\n\n if (this.#closeTimeout) {\n clearTimeout(this.#closeTimeout);\n this.#closeTimeout = undefined;\n }\n\n if (this.isConnectionOpen()) {\n this.#webSocket?.close();\n }\n\n this.#webSocket = null;\n this.#cortiClient = null;\n this.#lastConfig = null;\n this.#lastSocketUrl = undefined;\n this.#lastSocketProxy = undefined;\n\n if (this.#outboundQueue.length > 0) {\n this.host.dispatchEvent(\n errorEvent(\n `${this.#outboundQueue.length} unsent message(s) were discarded because the configuration changed before the connection was closed`,\n ),\n );\n }\n\n this.#outboundQueue = [];\n }\n\n #setupWebSocketHandlers(\n callbacks: SocketControllerCallbacks<TMessage>,\n ): void {\n if (!this.#webSocket) {\n throw new Error(\"WebSocket not initialized\");\n }\n\n this.#webSocket.on(\"message\", (message) => {\n if (message.type === \"CONFIG_ACCEPTED\") {\n this.#socketReady = true;\n this.#drain();\n }\n\n callbacks.onNetworkActivity?.(\"received\", message);\n\n if (callbacks.onMessage) {\n callbacks.onMessage(message as TMessage);\n }\n });\n\n this.#webSocket.on(\"error\", (event: Error) => {\n this.#socketReady = false;\n if (callbacks.onError) {\n callbacks.onError(event);\n }\n });\n\n this.#webSocket.on(\"close\", (event: unknown) => {\n this.#socketReady = false;\n if (callbacks.onClose) {\n callbacks.onClose(event);\n }\n });\n }\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -1,11 +1,14 @@
1
1
  import { CortiDictation } from "./components/corti-dictation.js";
2
+ export { AmbientRecordingButton } from "./components/ambient-recording-button.js";
3
+ export { CortiAmbient } from "./components/corti-ambient.js";
2
4
  export { CortiDictation } from "./components/corti-dictation.js";
3
5
  export { DictationDeviceSelector } from "./components/device-selector.js";
6
+ export { DictationRecordingButton } from "./components/dictation-recording-button.js";
4
7
  export { DictationKeybindingSelector } from "./components/keybinding-selector.js";
5
8
  export { DictationLanguageSelector } from "./components/language-selector.js";
6
- export { DictationRecordingButton } from "./components/recording-button.js";
7
9
  export { DictationSettingsMenu } from "./components/settings-menu.js";
8
10
  export { DictationRoot } from "./contexts/dictation-context.js";
11
+ export type { AmbientStreamSessionConfig } from "./controllers/ambient-controller.js";
9
12
  export type { ConfigurableSettings, Keybinding, RecordingState, } from "./types.js";
10
- export type { AudioLevelChangedEventDetail, CommandEventDetail, DeltaUsageEventDetail, ErrorEventDetail, KeybindingActivatedEventDetail, KeybindingChangedEventDetail, LanguageChangedEventDetail, LanguagesChangedEventDetail, NetworkActivityEventDetail, RecordingDevicesChangedEventDetail, RecordingStateChangedEventDetail, TranscriptEventDetail, UsageEventDetail, } from "./utils/events.js";
13
+ export type { AudioLevelChangedEventDetail, CommandEventDetail, DeltaUsageEventDetail, ErrorEventDetail, FactsEventDetail, KeybindingActivatedEventDetail, KeybindingChangedEventDetail, LanguageChangedEventDetail, LanguagesChangedEventDetail, NetworkActivityEventDetail, RecordingDevicesChangedEventDetail, RecordingStateChangedEventDetail, TranscriptEventDetail, UsageEventDetail, } from "./utils/events.js";
11
14
  export default CortiDictation;
package/dist/index.js CHANGED
@@ -1,10 +1,18 @@
1
+ import { AmbientRecordingButton } from "./components/ambient-recording-button.js";
2
+ import { CortiAmbient } from "./components/corti-ambient.js";
1
3
  import { CortiDictation } from "./components/corti-dictation.js";
2
4
  import { DictationDeviceSelector } from "./components/device-selector.js";
5
+ import { DictationRecordingButton } from "./components/dictation-recording-button.js";
3
6
  import { DictationKeybindingSelector } from "./components/keybinding-selector.js";
4
7
  import { DictationLanguageSelector } from "./components/language-selector.js";
5
- import { DictationRecordingButton } from "./components/recording-button.js";
6
8
  import { DictationSettingsMenu } from "./components/settings-menu.js";
7
9
  import { DictationRoot } from "./contexts/dictation-context.js";
10
+ if (!customElements.get("ambient-recording-button")) {
11
+ customElements.define("ambient-recording-button", AmbientRecordingButton);
12
+ }
13
+ if (!customElements.get("corti-ambient")) {
14
+ customElements.define("corti-ambient", CortiAmbient);
15
+ }
8
16
  if (!customElements.get("corti-dictation")) {
9
17
  customElements.define("corti-dictation", CortiDictation);
10
18
  }
@@ -26,11 +34,13 @@ if (!customElements.get("dictation-settings-menu")) {
26
34
  if (!customElements.get("dictation-root")) {
27
35
  customElements.define("dictation-root", DictationRoot);
28
36
  }
37
+ export { AmbientRecordingButton } from "./components/ambient-recording-button.js";
38
+ export { CortiAmbient } from "./components/corti-ambient.js";
29
39
  export { CortiDictation } from "./components/corti-dictation.js";
30
40
  export { DictationDeviceSelector } from "./components/device-selector.js";
41
+ export { DictationRecordingButton } from "./components/dictation-recording-button.js";
31
42
  export { DictationKeybindingSelector } from "./components/keybinding-selector.js";
32
43
  export { DictationLanguageSelector } from "./components/language-selector.js";
33
- export { DictationRecordingButton } from "./components/recording-button.js";
34
44
  export { DictationSettingsMenu } from "./components/settings-menu.js";
35
45
  export { DictationRoot } from "./contexts/dictation-context.js";
36
46
  export default CortiDictation;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAEhE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;IAC3C,cAAc,CAAC,MAAM,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;AAC3D,CAAC;AAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,4BAA4B,CAAC,EAAE,CAAC;IACtD,cAAc,CAAC,MAAM,CAAC,4BAA4B,EAAE,wBAAwB,CAAC,CAAC;AAChF,CAAC;AAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,2BAA2B,CAAC,EAAE,CAAC;IACrD,cAAc,CAAC,MAAM,CAAC,2BAA2B,EAAE,uBAAuB,CAAC,CAAC;AAC9E,CAAC;AAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,6BAA6B,CAAC,EAAE,CAAC;IACvD,cAAc,CAAC,MAAM,CACnB,6BAA6B,EAC7B,yBAAyB,CAC1B,CAAC;AACJ,CAAC;AAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,+BAA+B,CAAC,EAAE,CAAC;IACzD,cAAc,CAAC,MAAM,CACnB,+BAA+B,EAC/B,2BAA2B,CAC5B,CAAC;AACJ,CAAC;AAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAE,CAAC;IACnD,cAAc,CAAC,MAAM,CAAC,yBAAyB,EAAE,qBAAqB,CAAC,CAAC;AAC1E,CAAC;AAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;IAC1C,cAAc,CAAC,MAAM,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;AACzD,CAAC;AAED,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAuBhE,eAAe,cAAc,CAAC","sourcesContent":["import { CortiDictation } from \"./components/corti-dictation.js\";\nimport { DictationDeviceSelector } from \"./components/device-selector.js\";\nimport { DictationKeybindingSelector } from \"./components/keybinding-selector.js\";\nimport { DictationLanguageSelector } from \"./components/language-selector.js\";\nimport { DictationRecordingButton } from \"./components/recording-button.js\";\nimport { DictationSettingsMenu } from \"./components/settings-menu.js\";\nimport { DictationRoot } from \"./contexts/dictation-context.js\";\n\nif (!customElements.get(\"corti-dictation\")) {\n customElements.define(\"corti-dictation\", CortiDictation);\n}\n\nif (!customElements.get(\"dictation-recording-button\")) {\n customElements.define(\"dictation-recording-button\", DictationRecordingButton);\n}\n\nif (!customElements.get(\"dictation-device-selector\")) {\n customElements.define(\"dictation-device-selector\", DictationDeviceSelector);\n}\n\nif (!customElements.get(\"dictation-language-selector\")) {\n customElements.define(\n \"dictation-language-selector\",\n DictationLanguageSelector,\n );\n}\n\nif (!customElements.get(\"dictation-keybinding-selector\")) {\n customElements.define(\n \"dictation-keybinding-selector\",\n DictationKeybindingSelector,\n );\n}\n\nif (!customElements.get(\"dictation-settings-menu\")) {\n customElements.define(\"dictation-settings-menu\", DictationSettingsMenu);\n}\n\nif (!customElements.get(\"dictation-root\")) {\n customElements.define(\"dictation-root\", DictationRoot);\n}\n\nexport { CortiDictation } from \"./components/corti-dictation.js\";\nexport { DictationDeviceSelector } from \"./components/device-selector.js\";\nexport { DictationKeybindingSelector } from \"./components/keybinding-selector.js\";\nexport { DictationLanguageSelector } from \"./components/language-selector.js\";\nexport { DictationRecordingButton } from \"./components/recording-button.js\";\nexport { DictationSettingsMenu } from \"./components/settings-menu.js\";\nexport { DictationRoot } from \"./contexts/dictation-context.js\";\n\nexport type {\n ConfigurableSettings,\n Keybinding,\n RecordingState,\n} from \"./types.js\";\nexport type {\n AudioLevelChangedEventDetail,\n CommandEventDetail,\n DeltaUsageEventDetail,\n ErrorEventDetail,\n KeybindingActivatedEventDetail,\n KeybindingChangedEventDetail,\n LanguageChangedEventDetail,\n LanguagesChangedEventDetail,\n NetworkActivityEventDetail,\n RecordingDevicesChangedEventDetail,\n RecordingStateChangedEventDetail,\n TranscriptEventDetail,\n UsageEventDetail,\n} from \"./utils/events.js\";\n\nexport default CortiDictation;\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AACtF,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAEhE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,0BAA0B,CAAC,EAAE,CAAC;IACpD,cAAc,CAAC,MAAM,CAAC,0BAA0B,EAAE,sBAAsB,CAAC,CAAC;AAC5E,CAAC;AAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;IACzC,cAAc,CAAC,MAAM,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;AACvD,CAAC;AAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;IAC3C,cAAc,CAAC,MAAM,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;AAC3D,CAAC;AAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,4BAA4B,CAAC,EAAE,CAAC;IACtD,cAAc,CAAC,MAAM,CAAC,4BAA4B,EAAE,wBAAwB,CAAC,CAAC;AAChF,CAAC;AAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,2BAA2B,CAAC,EAAE,CAAC;IACrD,cAAc,CAAC,MAAM,CAAC,2BAA2B,EAAE,uBAAuB,CAAC,CAAC;AAC9E,CAAC;AAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,6BAA6B,CAAC,EAAE,CAAC;IACvD,cAAc,CAAC,MAAM,CACnB,6BAA6B,EAC7B,yBAAyB,CAC1B,CAAC;AACJ,CAAC;AAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,+BAA+B,CAAC,EAAE,CAAC;IACzD,cAAc,CAAC,MAAM,CACnB,+BAA+B,EAC/B,2BAA2B,CAC5B,CAAC;AACJ,CAAC;AAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAE,CAAC;IACnD,cAAc,CAAC,MAAM,CAAC,yBAAyB,EAAE,qBAAqB,CAAC,CAAC;AAC1E,CAAC;AAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;IAC1C,cAAc,CAAC,MAAM,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;AACzD,CAAC;AAED,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AACtF,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAyBhE,eAAe,cAAc,CAAC","sourcesContent":["import { AmbientRecordingButton } from \"./components/ambient-recording-button.js\";\nimport { CortiAmbient } from \"./components/corti-ambient.js\";\nimport { CortiDictation } from \"./components/corti-dictation.js\";\nimport { DictationDeviceSelector } from \"./components/device-selector.js\";\nimport { DictationRecordingButton } from \"./components/dictation-recording-button.js\";\nimport { DictationKeybindingSelector } from \"./components/keybinding-selector.js\";\nimport { DictationLanguageSelector } from \"./components/language-selector.js\";\nimport { DictationSettingsMenu } from \"./components/settings-menu.js\";\nimport { DictationRoot } from \"./contexts/dictation-context.js\";\n\nif (!customElements.get(\"ambient-recording-button\")) {\n customElements.define(\"ambient-recording-button\", AmbientRecordingButton);\n}\n\nif (!customElements.get(\"corti-ambient\")) {\n customElements.define(\"corti-ambient\", CortiAmbient);\n}\n\nif (!customElements.get(\"corti-dictation\")) {\n customElements.define(\"corti-dictation\", CortiDictation);\n}\n\nif (!customElements.get(\"dictation-recording-button\")) {\n customElements.define(\"dictation-recording-button\", DictationRecordingButton);\n}\n\nif (!customElements.get(\"dictation-device-selector\")) {\n customElements.define(\"dictation-device-selector\", DictationDeviceSelector);\n}\n\nif (!customElements.get(\"dictation-language-selector\")) {\n customElements.define(\n \"dictation-language-selector\",\n DictationLanguageSelector,\n );\n}\n\nif (!customElements.get(\"dictation-keybinding-selector\")) {\n customElements.define(\n \"dictation-keybinding-selector\",\n DictationKeybindingSelector,\n );\n}\n\nif (!customElements.get(\"dictation-settings-menu\")) {\n customElements.define(\"dictation-settings-menu\", DictationSettingsMenu);\n}\n\nif (!customElements.get(\"dictation-root\")) {\n customElements.define(\"dictation-root\", DictationRoot);\n}\n\nexport { AmbientRecordingButton } from \"./components/ambient-recording-button.js\";\nexport { CortiAmbient } from \"./components/corti-ambient.js\";\nexport { CortiDictation } from \"./components/corti-dictation.js\";\nexport { DictationDeviceSelector } from \"./components/device-selector.js\";\nexport { DictationRecordingButton } from \"./components/dictation-recording-button.js\";\nexport { DictationKeybindingSelector } from \"./components/keybinding-selector.js\";\nexport { DictationLanguageSelector } from \"./components/language-selector.js\";\nexport { DictationSettingsMenu } from \"./components/settings-menu.js\";\nexport { DictationRoot } from \"./contexts/dictation-context.js\";\n\nexport type { AmbientStreamSessionConfig } from \"./controllers/ambient-controller.js\";\nexport type {\n ConfigurableSettings,\n Keybinding,\n RecordingState,\n} from \"./types.js\";\nexport type {\n AudioLevelChangedEventDetail,\n CommandEventDetail,\n DeltaUsageEventDetail,\n ErrorEventDetail,\n FactsEventDetail,\n KeybindingActivatedEventDetail,\n KeybindingChangedEventDetail,\n LanguageChangedEventDetail,\n LanguagesChangedEventDetail,\n NetworkActivityEventDetail,\n RecordingDevicesChangedEventDetail,\n RecordingStateChangedEventDetail,\n TranscriptEventDetail,\n UsageEventDetail,\n} from \"./utils/events.js\";\n\nexport default CortiDictation;\n"]}