@corti/embedded-web 0.2.0 → 0.3.1
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.
- package/README.md +50 -11
- package/dist/CortiEmbedded.d.ts +30 -4
- package/dist/CortiEmbedded.js +89 -4
- package/dist/CortiEmbedded.js.map +1 -1
- package/dist/bundle.js +89 -5
- package/dist/corti-embedded.d.ts +1 -1
- package/dist/corti-embedded.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/public-types.d.ts +185 -0
- package/dist/public-types.js +2 -0
- package/dist/public-types.js.map +1 -0
- package/dist/react/CortiEmbeddedReact.d.ts +4 -2
- package/dist/react/CortiEmbeddedReact.js +3 -1
- package/dist/react/CortiEmbeddedReact.js.map +1 -1
- package/dist/types/api.d.ts +32 -7
- package/dist/types/api.js.map +1 -1
- package/dist/types/config.d.ts +16 -2
- package/dist/types/config.js.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/payloads.d.ts +35 -0
- package/dist/types/payloads.js.map +1 -1
- package/dist/types/protocol.d.ts +9 -3
- package/dist/types/protocol.js.map +1 -1
- package/dist/types/responses.d.ts +10 -2
- package/dist/types/responses.js.map +1 -1
- package/dist/web-bundle.js +87 -5
- package/dist/web-index.d.ts +1 -1
- package/dist/web-index.js +2 -2
- package/dist/web-index.js.map +1 -1
- package/package.json +3 -1
package/README.md
CHANGED
|
@@ -43,9 +43,16 @@ const interaction = await myComponent.createInteraction({
|
|
|
43
43
|
}
|
|
44
44
|
});
|
|
45
45
|
|
|
46
|
-
await myComponent.
|
|
46
|
+
await myComponent.setInteractionOptions({
|
|
47
|
+
templates: {
|
|
48
|
+
defaultTemplate: {
|
|
49
|
+
behaviour: "fallback",
|
|
50
|
+
template: { source: "standard", id: "soap_note" },
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
});
|
|
47
54
|
await myComponent.addFacts([{"text": "Chest pain", "group": "other"}]);
|
|
48
|
-
await myComponent.navigate(
|
|
55
|
+
await myComponent.navigate({ path: "/interactions/123" });
|
|
49
56
|
await myComponent.show()
|
|
50
57
|
```
|
|
51
58
|
|
|
@@ -100,7 +107,14 @@ function App() {
|
|
|
100
107
|
});
|
|
101
108
|
console.log("Authenticated:", user);
|
|
102
109
|
|
|
103
|
-
await api.
|
|
110
|
+
await api.setInteractionOptions({
|
|
111
|
+
templates: {
|
|
112
|
+
defaultTemplate: {
|
|
113
|
+
behaviour: "fallback",
|
|
114
|
+
template: { source: "standard", id: "soap_note" },
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
});
|
|
104
118
|
await api.createInteraction({
|
|
105
119
|
encounter: {
|
|
106
120
|
identifier: `encounter-${Date.now()}`,
|
|
@@ -172,14 +186,37 @@ const authResponse = await component.auth({
|
|
|
172
186
|
});
|
|
173
187
|
```
|
|
174
188
|
|
|
175
|
-
####
|
|
189
|
+
#### configureApp
|
|
176
190
|
|
|
177
191
|
```javascript
|
|
178
|
-
await component.
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
192
|
+
await component.configureApp({
|
|
193
|
+
ui: {
|
|
194
|
+
aiChat: true,
|
|
195
|
+
navigation: false,
|
|
196
|
+
},
|
|
197
|
+
appearance: {
|
|
198
|
+
primaryColor: "#000000",
|
|
199
|
+
},
|
|
200
|
+
});
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
#### setInteractionOptions
|
|
204
|
+
|
|
205
|
+
```javascript
|
|
206
|
+
await component.setInteractionOptions({
|
|
207
|
+
mode: {
|
|
208
|
+
fallback: "virtual",
|
|
209
|
+
options: ["in-person", "virtual"],
|
|
210
|
+
},
|
|
211
|
+
spokenLanguage: {
|
|
212
|
+
fallback: "en",
|
|
213
|
+
},
|
|
214
|
+
templates: {
|
|
215
|
+
defaultTemplate: {
|
|
216
|
+
behaviour: "fallback",
|
|
217
|
+
template: { source: "standard", id: "discharge-summary" },
|
|
218
|
+
},
|
|
219
|
+
},
|
|
183
220
|
});
|
|
184
221
|
```
|
|
185
222
|
|
|
@@ -195,7 +232,7 @@ await component.addFacts([
|
|
|
195
232
|
#### navigate
|
|
196
233
|
|
|
197
234
|
```javascript
|
|
198
|
-
await component.navigate("/interactions/123");
|
|
235
|
+
await component.navigate({ path: "/interactions/123" });
|
|
199
236
|
```
|
|
200
237
|
|
|
201
238
|
#### createInteraction
|
|
@@ -302,7 +339,7 @@ function Example() {
|
|
|
302
339
|
const run = async () => {
|
|
303
340
|
await api.auth({ access_token: '...', token_type: 'Bearer' });
|
|
304
341
|
const created = await api.createInteraction({ encounter: { ... } });
|
|
305
|
-
await api.navigate(`/session/${created.id}`);
|
|
342
|
+
await api.navigate({ path: `/session/${created.id}` });
|
|
306
343
|
};
|
|
307
344
|
|
|
308
345
|
return (
|
|
@@ -316,6 +353,8 @@ function Example() {
|
|
|
316
353
|
|
|
317
354
|
For detailed React usage examples, see [docs/react-usage.md](./docs/react-usage.md).
|
|
318
355
|
|
|
356
|
+
For configuration migration details, see [docs/migration-guide.md](./docs/migration-guide.md) and [docs/deprecation-timeline.md](./docs/deprecation-timeline.md).
|
|
357
|
+
|
|
319
358
|
## Package Structure
|
|
320
359
|
|
|
321
360
|
- **Default export**: Web component only (`dist/web-bundle.js`, readable non-minified bundle)
|
package/dist/CortiEmbedded.d.ts
CHANGED
|
@@ -1,12 +1,24 @@
|
|
|
1
1
|
import type { Corti } from "@corti/sdk";
|
|
2
2
|
import { LitElement, type PropertyValues } from "lit";
|
|
3
|
-
import type {
|
|
3
|
+
import type { ConfigureApplicationPayload, ConfigureApplicationResponse, ConfigurePayload, ConfigureResponse, CreateInteractionPayload, NavigatePayload, SetInteractionOptionsPayload, SetCredentialsPayload, CortiEmbeddedAPI, InteractionDetails, SessionConfig, User, GetStatusResponse, GetTemplatesResponse, KeycloakTokenResponse } from "./public-types.js";
|
|
4
|
+
type DOMEventListener = ((event: Event) => void) | {
|
|
5
|
+
handleEvent(event: Event): void;
|
|
6
|
+
};
|
|
7
|
+
type DOMAddEventListenerOptions = boolean | {
|
|
8
|
+
capture?: boolean;
|
|
9
|
+
once?: boolean;
|
|
10
|
+
passive?: boolean;
|
|
11
|
+
signal?: AbortSignal;
|
|
12
|
+
};
|
|
4
13
|
export declare class CortiEmbedded extends LitElement implements CortiEmbeddedAPI {
|
|
5
14
|
static styles: import("lit").CSSResult[];
|
|
6
15
|
visibility: string;
|
|
7
16
|
baseURL: string;
|
|
8
17
|
private postMessageHandler;
|
|
9
18
|
private normalizedBaseURL;
|
|
19
|
+
private warnedDeprecatedEventSubscriptions;
|
|
20
|
+
addEventListener(type: string, callback: DOMEventListener, options?: DOMAddEventListenerOptions): void;
|
|
21
|
+
private warnDeprecatedEventSubscription;
|
|
10
22
|
private getIframeAllowPolicy;
|
|
11
23
|
connectedCallback(): void;
|
|
12
24
|
disconnectedCallback(): void;
|
|
@@ -14,6 +26,7 @@ export declare class CortiEmbedded extends LitElement implements CortiEmbeddedAP
|
|
|
14
26
|
private dispatchPublicEvent;
|
|
15
27
|
private dispatchEmbeddedEvent;
|
|
16
28
|
private dispatchErrorEvent;
|
|
29
|
+
private static warnDeprecatedAPI;
|
|
17
30
|
private isRealIframeLoad;
|
|
18
31
|
private handleIframeLoad;
|
|
19
32
|
private getIframe;
|
|
@@ -44,10 +57,10 @@ export declare class CortiEmbedded extends LitElement implements CortiEmbeddedAP
|
|
|
44
57
|
addFacts(facts: Corti.FactsCreateInput[]): Promise<void>;
|
|
45
58
|
/**
|
|
46
59
|
* Navigate to a specific path within the embedded UI
|
|
47
|
-
* @param
|
|
60
|
+
* @param payload Navigation request payload or legacy path string
|
|
48
61
|
* @returns Promise that resolves when navigation is complete
|
|
49
62
|
*/
|
|
50
|
-
navigate(
|
|
63
|
+
navigate(payload: NavigatePayload | string): Promise<void>;
|
|
51
64
|
/**
|
|
52
65
|
* Start recording
|
|
53
66
|
* @returns Promise that resolves when recording starts
|
|
@@ -68,7 +81,19 @@ export declare class CortiEmbedded extends LitElement implements CortiEmbeddedAP
|
|
|
68
81
|
* @param config Component configuration
|
|
69
82
|
* @returns Promise that resolves when configuration is applied
|
|
70
83
|
*/
|
|
71
|
-
|
|
84
|
+
configureApp(config: ConfigureApplicationPayload): Promise<ConfigureApplicationResponse>;
|
|
85
|
+
/**
|
|
86
|
+
* Configure the component
|
|
87
|
+
* @param config Component configuration
|
|
88
|
+
* @returns Promise that resolves when configuration is applied
|
|
89
|
+
*/
|
|
90
|
+
configure(config: ConfigurePayload): Promise<ConfigureResponse>;
|
|
91
|
+
/**
|
|
92
|
+
* Set one-shot interaction options for the embedded instance.
|
|
93
|
+
* @param config Interaction/session-level options
|
|
94
|
+
* @returns Promise that resolves when options are applied
|
|
95
|
+
*/
|
|
96
|
+
setInteractionOptions(config: SetInteractionOptionsPayload): Promise<void>;
|
|
72
97
|
/**
|
|
73
98
|
* Set authentication credentials without triggering auth flow
|
|
74
99
|
* @param credentials Authentication credentials to store
|
|
@@ -105,3 +130,4 @@ export declare class CortiEmbedded extends LitElement implements CortiEmbeddedAP
|
|
|
105
130
|
};
|
|
106
131
|
render(): import("lit-html").TemplateResult<1>;
|
|
107
132
|
}
|
|
133
|
+
export {};
|
package/dist/CortiEmbedded.js
CHANGED
|
@@ -13,12 +13,41 @@ import { buildEmbeddedUrl, isRealEmbeddedLoad } from "./utils/embedUrl.js";
|
|
|
13
13
|
import { formatError } from "./utils/errorFormatter.js";
|
|
14
14
|
import { PostMessageHandler, } from "./utils/PostMessageHandler.js";
|
|
15
15
|
const IFRAME_SANDBOX_POLICY = "allow-forms allow-modals allow-scripts allow-same-origin";
|
|
16
|
+
const DEPRECATION_TIMELINE_URL = "https://docs.corti.ai/assistant/deprecation-timeline";
|
|
17
|
+
const CONFIGURATION_MIGRATION_URL = "https://docs.corti.ai/assistant/configuration-migration";
|
|
18
|
+
const DEPRECATED_EVENT_SUBSCRIPTIONS = new Set([
|
|
19
|
+
"ready",
|
|
20
|
+
"loaded",
|
|
21
|
+
"recordingStarted",
|
|
22
|
+
"recordingStopped",
|
|
23
|
+
"documentGenerated",
|
|
24
|
+
"documentUpdated",
|
|
25
|
+
"documentSynced",
|
|
26
|
+
"authChanged",
|
|
27
|
+
"interactionCreated",
|
|
28
|
+
"navigationChanged",
|
|
29
|
+
"usage",
|
|
30
|
+
"embedded-event",
|
|
31
|
+
]);
|
|
16
32
|
export class CortiEmbedded extends LitElement {
|
|
17
33
|
constructor() {
|
|
18
34
|
super(...arguments);
|
|
19
35
|
this.visibility = "hidden";
|
|
20
36
|
this.postMessageHandler = null;
|
|
21
37
|
this.normalizedBaseURL = null;
|
|
38
|
+
this.warnedDeprecatedEventSubscriptions = new Set();
|
|
39
|
+
}
|
|
40
|
+
addEventListener(type, callback, options) {
|
|
41
|
+
this.warnDeprecatedEventSubscription(type);
|
|
42
|
+
super.addEventListener(type, callback, options);
|
|
43
|
+
}
|
|
44
|
+
warnDeprecatedEventSubscription(eventName) {
|
|
45
|
+
if (!DEPRECATED_EVENT_SUBSCRIPTIONS.has(eventName) ||
|
|
46
|
+
this.warnedDeprecatedEventSubscriptions.has(eventName)) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
this.warnedDeprecatedEventSubscriptions.add(eventName);
|
|
50
|
+
console.warn(`[Corti Embedded] The '${eventName}' event subscription is deprecated and will be removed in a future release. Subscribe to the canonical 'event' stream instead. See ${DEPRECATION_TIMELINE_URL}.`);
|
|
22
51
|
}
|
|
23
52
|
// eslint-disable-next-line class-methods-use-this
|
|
24
53
|
getIframeAllowPolicy(normalizedBaseURL) {
|
|
@@ -109,6 +138,9 @@ export class CortiEmbedded extends LitElement {
|
|
|
109
138
|
dispatchErrorEvent(error) {
|
|
110
139
|
this.dispatchPublicEvent("error", error);
|
|
111
140
|
}
|
|
141
|
+
static warnDeprecatedAPI(methodName, replacement) {
|
|
142
|
+
console.warn(`[Corti Embedded] ${methodName} is deprecated and will be removed in a future release. Use ${replacement} instead. See ${CONFIGURATION_MIGRATION_URL} and ${DEPRECATION_TIMELINE_URL}.`);
|
|
143
|
+
}
|
|
112
144
|
isRealIframeLoad(iframe) {
|
|
113
145
|
const src = iframe.getAttribute("src") || "";
|
|
114
146
|
if (!this.normalizedBaseURL)
|
|
@@ -250,6 +282,7 @@ export class CortiEmbedded extends LitElement {
|
|
|
250
282
|
throw new Error("Component not ready");
|
|
251
283
|
}
|
|
252
284
|
try {
|
|
285
|
+
CortiEmbedded.warnDeprecatedAPI("configureSession()", "setInteractionOptions()");
|
|
253
286
|
const payload = {
|
|
254
287
|
defaultLanguage: config.defaultLanguage,
|
|
255
288
|
defaultOutputLanguage: config.defaultOutputLanguage,
|
|
@@ -293,20 +326,20 @@ export class CortiEmbedded extends LitElement {
|
|
|
293
326
|
}
|
|
294
327
|
/**
|
|
295
328
|
* Navigate to a specific path within the embedded UI
|
|
296
|
-
* @param
|
|
329
|
+
* @param payload Navigation request payload or legacy path string
|
|
297
330
|
* @returns Promise that resolves when navigation is complete
|
|
298
331
|
*/
|
|
299
|
-
async navigate(
|
|
332
|
+
async navigate(payload) {
|
|
300
333
|
if (!this.postMessageHandler) {
|
|
301
334
|
throw new Error("Component not ready");
|
|
302
335
|
}
|
|
303
336
|
try {
|
|
304
|
-
const
|
|
337
|
+
const normalizedPayload = typeof payload === "string" ? { path: payload } : payload;
|
|
305
338
|
await this.postMessageHandler.postMessage({
|
|
306
339
|
type: "CORTI_EMBEDDED",
|
|
307
340
|
version: "v1",
|
|
308
341
|
action: "navigate",
|
|
309
|
-
payload,
|
|
342
|
+
payload: normalizedPayload,
|
|
310
343
|
});
|
|
311
344
|
}
|
|
312
345
|
catch (error) {
|
|
@@ -388,6 +421,32 @@ export class CortiEmbedded extends LitElement {
|
|
|
388
421
|
throw new Error(JSON.stringify(formattedError));
|
|
389
422
|
}
|
|
390
423
|
}
|
|
424
|
+
/**
|
|
425
|
+
* Configure the component
|
|
426
|
+
* @param config Component configuration
|
|
427
|
+
* @returns Promise that resolves when configuration is applied
|
|
428
|
+
*/
|
|
429
|
+
async configureApp(config) {
|
|
430
|
+
if (!this.postMessageHandler) {
|
|
431
|
+
throw new Error("Component not ready");
|
|
432
|
+
}
|
|
433
|
+
try {
|
|
434
|
+
const response = await this.postMessageHandler.postMessage({
|
|
435
|
+
type: "CORTI_EMBEDDED",
|
|
436
|
+
version: "v1",
|
|
437
|
+
action: "configureApp",
|
|
438
|
+
payload: config,
|
|
439
|
+
});
|
|
440
|
+
if (response.success && response.payload) {
|
|
441
|
+
return response.payload;
|
|
442
|
+
}
|
|
443
|
+
throw new Error(response.error);
|
|
444
|
+
}
|
|
445
|
+
catch (error) {
|
|
446
|
+
const formattedError = formatError(error, "Failed to configure app");
|
|
447
|
+
throw new Error(JSON.stringify(formattedError));
|
|
448
|
+
}
|
|
449
|
+
}
|
|
391
450
|
/**
|
|
392
451
|
* Configure the component
|
|
393
452
|
* @param config Component configuration
|
|
@@ -398,6 +457,7 @@ export class CortiEmbedded extends LitElement {
|
|
|
398
457
|
throw new Error("Component not ready");
|
|
399
458
|
}
|
|
400
459
|
try {
|
|
460
|
+
CortiEmbedded.warnDeprecatedAPI("configure()", "configureApp()");
|
|
401
461
|
const response = await this.postMessageHandler.postMessage({
|
|
402
462
|
type: "CORTI_EMBEDDED",
|
|
403
463
|
version: "v1",
|
|
@@ -414,6 +474,31 @@ export class CortiEmbedded extends LitElement {
|
|
|
414
474
|
throw new Error(JSON.stringify(formattedError));
|
|
415
475
|
}
|
|
416
476
|
}
|
|
477
|
+
/**
|
|
478
|
+
* Set one-shot interaction options for the embedded instance.
|
|
479
|
+
* @param config Interaction/session-level options
|
|
480
|
+
* @returns Promise that resolves when options are applied
|
|
481
|
+
*/
|
|
482
|
+
async setInteractionOptions(config) {
|
|
483
|
+
if (!this.postMessageHandler) {
|
|
484
|
+
throw new Error("Component not ready");
|
|
485
|
+
}
|
|
486
|
+
try {
|
|
487
|
+
const response = await this.postMessageHandler.postMessage({
|
|
488
|
+
type: "CORTI_EMBEDDED",
|
|
489
|
+
version: "v1",
|
|
490
|
+
action: "setInteractionOptions",
|
|
491
|
+
payload: config,
|
|
492
|
+
});
|
|
493
|
+
if (response.success === false || response.error) {
|
|
494
|
+
throw new Error(response.error);
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
catch (error) {
|
|
498
|
+
const formattedError = formatError(error, "Failed to set interaction options");
|
|
499
|
+
throw new Error(JSON.stringify(formattedError));
|
|
500
|
+
}
|
|
501
|
+
}
|
|
417
502
|
/**
|
|
418
503
|
* Set authentication credentials without triggering auth flow
|
|
419
504
|
* @param credentials Authentication credentials to store
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CortiEmbedded.js","sourceRoot":"","sources":["../src/CortiEmbedded.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-console */\nimport type { Corti } from \"@corti/sdk\";\nimport { html, LitElement, type PropertyValues } from \"lit\";\nimport { property } from \"lit/decorators.js\";\nimport type {\n AuthResponse,\n AddFactsPayload,\n ConfigureAppPayload,\n ConfigureAppResponse,\n ConfigureSessionPayload,\n CreateInteractionPayload,\n CreateInteractionResponse,\n NavigatePayload,\n SetCredentialsPayload,\n CortiEmbeddedAPI,\n InteractionDetails,\n SessionConfig,\n User,\n GetStatusResponse,\n GetTemplatesResponse,\n KeycloakTokenResponse,\n} from \"./types\";\nimport { baseStyles } from \"./styles/base.js\";\nimport { containerStyles } from \"./styles/container-styles.js\";\nimport { validateAndNormalizeBaseURL } from \"./utils/baseUrl.js\";\nimport { buildEmbeddedUrl, isRealEmbeddedLoad } from \"./utils/embedUrl.js\";\nimport { formatError } from \"./utils/errorFormatter.js\";\nimport {\n PostMessageHandler,\n type PostMessageHandlerCallbacks,\n} from \"./utils/PostMessageHandler.js\";\n\nconst IFRAME_SANDBOX_POLICY =\n \"allow-forms allow-modals allow-scripts allow-same-origin\";\n\nexport class CortiEmbedded extends LitElement implements CortiEmbeddedAPI {\n static styles = [baseStyles, containerStyles];\n\n @property({ type: String, reflect: true })\n visibility = \"hidden\";\n\n @property({ type: String, reflect: true })\n baseURL!: string;\n\n private postMessageHandler: PostMessageHandler | null = null;\n\n private normalizedBaseURL: string | null = null;\n\n // eslint-disable-next-line class-methods-use-this\n private getIframeAllowPolicy(normalizedBaseURL?: string | null): string {\n const permissionTarget = normalizedBaseURL\n ? new URL(normalizedBaseURL).origin\n : \"*\";\n\n return [\n `microphone ${permissionTarget}`,\n `camera ${permissionTarget}`,\n `device-capture ${permissionTarget}`,\n `display-capture ${permissionTarget}`,\n `clipboard-write ${permissionTarget}`,\n ].join(\"; \");\n }\n\n connectedCallback() {\n super.connectedCallback();\n\n // Ensure baseURL is provided\n if (!this.baseURL) {\n this.dispatchErrorEvent({\n message: \"baseURL is required\",\n });\n return;\n }\n\n // Validate and normalize the initial baseURL early (fail fast)\n try {\n this.normalizedBaseURL = validateAndNormalizeBaseURL(this.baseURL);\n } catch (error) {\n this.dispatchErrorEvent({\n message: (error as Error).message || \"Invalid baseURL\",\n });\n // Dispatch the error event rather than throwing so consumers can handle it\n // via the 'error' event listener without wrapping connectedCallback in try/catch.\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n if (this.postMessageHandler) {\n this.postMessageHandler.destroy();\n this.postMessageHandler = null;\n }\n }\n\n private async setupPostMessageHandler() {\n // Prevent multiple setups\n if (this.postMessageHandler) {\n return;\n }\n\n const iframe = this.getIframe();\n\n if (iframe?.contentWindow) {\n const callbacks: PostMessageHandlerCallbacks = {\n onEvent: event => {\n this.dispatchEmbeddedEvent(event.name, event.payload);\n },\n onError: error => {\n this.dispatchErrorEvent(error);\n },\n };\n\n this.postMessageHandler = new PostMessageHandler(iframe, callbacks);\n } else {\n this.dispatchErrorEvent({\n message: \"No iframe or contentWindow available\",\n });\n }\n }\n\n private dispatchPublicEvent(event: string, data: unknown) {\n this.dispatchEvent(new CustomEvent(event, { detail: data }));\n }\n\n private dispatchEmbeddedEvent(rawEventName: string, payload: unknown) {\n if (rawEventName === \"ready\" || rawEventName === \"loaded\") return;\n // Pass all other events through as raw DOM events for direct listeners.\n this.dispatchPublicEvent(rawEventName, payload);\n\n // Forward supported embedded events through the generic 'event' stream so\n // consumers can observe them without subscribing to each raw event name.\n this.dispatchPublicEvent(\"event\", {\n name: rawEventName,\n payload,\n });\n\n // Also emit the legacy 'embedded-event' stream for backward compatibility.\n // This allows existing integrations listening for 'embedded-event' to continue\n // working while newer consumers can use the 'event' stream.\n this.dispatchPublicEvent(\"embedded-event\", {\n name: rawEventName,\n payload,\n });\n }\n\n private dispatchErrorEvent(error: {\n message: string;\n code?: string;\n details?: unknown;\n }) {\n this.dispatchPublicEvent(\"error\", error);\n }\n\n private isRealIframeLoad(iframe: HTMLIFrameElement): boolean {\n const src = iframe.getAttribute(\"src\") || \"\";\n if (!this.normalizedBaseURL) return false;\n return isRealEmbeddedLoad(src, this.normalizedBaseURL);\n }\n\n private async handleIframeLoad(event: Event) {\n const iframe = event.target as HTMLIFrameElement | null;\n if (!iframe) {\n return;\n }\n // Only initialize on real URL load, ignore about:blank\n if (!this.isRealIframeLoad(iframe)) {\n return;\n }\n try {\n await this.setupPostMessageHandler();\n } catch (error) {\n this.dispatchErrorEvent({\n message: `Failed to setup PostMessageHandler on iframe load: ${error}`,\n });\n }\n }\n\n private getIframe(): HTMLIFrameElement | null {\n return this.shadowRoot?.querySelector(\"iframe\") || null;\n }\n\n protected updated(changedProps: PropertyValues) {\n super.updated(changedProps);\n if (changedProps.has(\"baseURL\")) {\n // Tear down the existing handler; the new one is created in handleIframeLoad\n if (this.postMessageHandler) {\n this.postMessageHandler.destroy();\n this.postMessageHandler = null;\n }\n\n // Validate the new URL\n try {\n this.normalizedBaseURL = validateAndNormalizeBaseURL(this.baseURL);\n } catch (error) {\n this.normalizedBaseURL = null;\n const iframe = this.getIframe();\n if (iframe) {\n iframe.setAttribute(\"src\", \"about:blank\");\n }\n this.dispatchErrorEvent({\n message: (error as Error).message || \"Invalid baseURL\",\n });\n return;\n }\n\n // Update the iframe to the new URL\n const iframe = this.getIframe();\n if (iframe) {\n const expected = buildEmbeddedUrl(this.normalizedBaseURL);\n iframe.setAttribute(\"allow\", this.getIframeAllowPolicy(expected));\n if (iframe.getAttribute(\"src\") !== expected) {\n iframe.setAttribute(\"src\", expected);\n }\n }\n }\n }\n\n // Public API Implementation\n\n /**\n * Authenticate with the Corti system\n * @param credentials Authentication credentials\n * @returns Promise resolving to user information\n */\n async auth(credentials: KeycloakTokenResponse): Promise<User> {\n if (!this.postMessageHandler) {\n throw new Error(\"Component not ready\");\n }\n\n try {\n const payload: KeycloakTokenResponse = {\n access_token: credentials.access_token,\n token_type: credentials.token_type,\n expires_at: credentials.expires_at,\n expires_in: credentials.expires_in,\n refresh_expires_in: credentials.refresh_expires_in,\n refresh_token: credentials.refresh_token,\n id_token: credentials.id_token,\n \"not-before-policy\": credentials[\"not-before-policy\"],\n session_state: credentials.session_state,\n scope: credentials.scope,\n profile: credentials.profile,\n };\n\n const response = await this.postMessageHandler.postMessage({\n type: \"CORTI_EMBEDDED\",\n version: \"v1\",\n action: \"auth\",\n payload,\n });\n\n if (response.success && response.payload) {\n return (response.payload as AuthResponse).user;\n }\n throw new Error(response.error);\n } catch (error) {\n const formattedError = formatError(error, \"Authentication failed\");\n throw new Error(JSON.stringify(formattedError));\n }\n }\n\n /**\n * Create a new interaction\n * @param encounter Encounter request data\n * @returns Promise resolving to interaction details\n */\n async createInteraction(\n encounter: CreateInteractionPayload,\n ): Promise<InteractionDetails> {\n if (!this.postMessageHandler) {\n throw new Error(\"Component not ready\");\n }\n\n try {\n const response = await this.postMessageHandler.postMessage({\n type: \"CORTI_EMBEDDED\",\n version: \"v1\",\n action: \"createInteraction\",\n payload: encounter,\n });\n\n if (response.success && response.payload) {\n const result = response.payload as CreateInteractionResponse;\n return {\n id: result.id,\n createdAt: result.createdAt,\n };\n }\n throw new Error(response.error);\n } catch (error) {\n const formattedError = formatError(error, \"Failed to create interaction\");\n throw new Error(JSON.stringify(formattedError));\n }\n }\n\n /**\n * Configure the current session\n * @param config Session configuration\n * @returns Promise that resolves when configuration is complete\n */\n async configureSession(config: SessionConfig): Promise<void> {\n if (!this.postMessageHandler) {\n throw new Error(\"Component not ready\");\n }\n\n try {\n const payload: ConfigureSessionPayload = {\n defaultLanguage: config.defaultLanguage,\n defaultOutputLanguage: config.defaultOutputLanguage,\n defaultTemplateKey: config.defaultTemplateKey,\n defaultMode: config.defaultMode,\n };\n\n await this.postMessageHandler.postMessage({\n type: \"CORTI_EMBEDDED\",\n version: \"v1\",\n action: \"configureSession\",\n payload,\n });\n } catch (error) {\n const formattedError = formatError(error, \"Failed to configure session\");\n throw new Error(JSON.stringify(formattedError));\n }\n }\n\n /**\n * Add facts to the current session\n * @param facts Array of facts to add\n * @returns Promise that resolves when facts are added\n */\n async addFacts(facts: Corti.FactsCreateInput[]): Promise<void> {\n if (!this.postMessageHandler) {\n throw new Error(\"Component not ready\");\n }\n\n try {\n const payload: AddFactsPayload = { facts };\n await this.postMessageHandler.postMessage({\n type: \"CORTI_EMBEDDED\",\n version: \"v1\",\n action: \"addFacts\",\n payload,\n });\n } catch (error) {\n const formattedError = formatError(error, \"Failed to add facts\");\n throw new Error(JSON.stringify(formattedError));\n }\n }\n\n /**\n * Navigate to a specific path within the embedded UI\n * @param path Path to navigate to\n * @returns Promise that resolves when navigation is complete\n */\n async navigate(path: string): Promise<void> {\n if (!this.postMessageHandler) {\n throw new Error(\"Component not ready\");\n }\n\n try {\n const payload: NavigatePayload = { path };\n await this.postMessageHandler.postMessage({\n type: \"CORTI_EMBEDDED\",\n version: \"v1\",\n action: \"navigate\",\n payload,\n });\n } catch (error) {\n const formattedError = formatError(error, \"Failed to navigate\");\n throw new Error(JSON.stringify(formattedError));\n }\n }\n\n /**\n * Start recording\n * @returns Promise that resolves when recording starts\n */\n async startRecording(): Promise<void> {\n if (!this.postMessageHandler) {\n throw new Error(\"Component not ready\");\n }\n\n try {\n await this.postMessageHandler.postMessage({\n type: \"CORTI_EMBEDDED\",\n version: \"v1\",\n action: \"startRecording\",\n payload: {},\n });\n } catch (error) {\n const formattedError = formatError(error, \"Failed to start recording\");\n throw new Error(JSON.stringify(formattedError));\n }\n }\n\n /**\n * Stop recording\n * @returns Promise that resolves when recording stops\n */\n async stopRecording(): Promise<void> {\n if (!this.postMessageHandler) {\n throw new Error(\"Component not ready\");\n }\n\n try {\n await this.postMessageHandler.postMessage({\n type: \"CORTI_EMBEDDED\",\n version: \"v1\",\n action: \"stopRecording\",\n payload: {},\n });\n } catch (error) {\n const formattedError = formatError(error, \"Failed to stop recording\");\n throw new Error(JSON.stringify(formattedError));\n }\n }\n\n /**\n * Get current component status\n * @returns Promise resolving to current status\n */\n async getStatus(): Promise<GetStatusResponse> {\n if (!this.postMessageHandler) {\n return {\n auth: {\n isAuthenticated: false,\n user: undefined,\n },\n currentUrl: \"\",\n interaction: null,\n };\n }\n\n try {\n const response = await this.postMessageHandler.postMessage({\n type: \"CORTI_EMBEDDED\",\n version: \"v1\",\n action: \"getStatus\",\n payload: {},\n });\n\n if (response.success && response.payload) {\n return response.payload as GetStatusResponse;\n }\n throw new Error(response.error);\n } catch (error) {\n const formattedError = formatError(error, \"Failed to get status\");\n throw new Error(JSON.stringify(formattedError));\n }\n }\n\n /**\n * Configure the component\n * @param config Component configuration\n * @returns Promise that resolves when configuration is applied\n */\n async configure(config: ConfigureAppPayload): Promise<ConfigureAppResponse> {\n if (!this.postMessageHandler) {\n throw new Error(\"Component not ready\");\n }\n\n try {\n const response = await this.postMessageHandler.postMessage({\n type: \"CORTI_EMBEDDED\",\n version: \"v1\",\n action: \"configure\",\n payload: config,\n });\n\n if (response.success && response.payload) {\n return response.payload as ConfigureAppResponse;\n }\n throw new Error(response.error);\n } catch (error) {\n const formattedError = formatError(\n error,\n \"Failed to configure component\",\n );\n throw new Error(JSON.stringify(formattedError));\n }\n }\n\n /**\n * Set authentication credentials without triggering auth flow\n * @param credentials Authentication credentials to store\n * @returns Promise that resolves when credentials are set\n */\n async setCredentials(credentials: SetCredentialsPayload): Promise<void> {\n if (!this.postMessageHandler) {\n throw new Error(\"Component not ready\");\n }\n\n try {\n if (!credentials.password) {\n throw new Error(\"Password is required\");\n }\n await this.postMessageHandler.postMessage({\n type: \"CORTI_EMBEDDED\",\n version: \"v1\",\n action: \"setCredentials\",\n payload: credentials,\n });\n } catch (error) {\n const formattedError = formatError(error, \"Failed to set credentials\");\n throw new Error(JSON.stringify(formattedError));\n }\n }\n\n /**\n * Show the embedded UI\n */\n show(): void {\n this.visibility = \"visible\";\n }\n\n /**\n * Hide the embedded UI\n */\n hide(): void {\n this.visibility = \"hidden\";\n }\n\n /**\n * Get templates\n */\n async getTemplates(): Promise<GetTemplatesResponse> {\n if (!this.postMessageHandler) {\n throw new Error(\"Component not ready\");\n }\n\n try {\n const response = await this.postMessageHandler.postMessage({\n type: \"CORTI_EMBEDDED\",\n version: \"v1\",\n action: \"getTemplates\",\n });\n\n if (response.success && response.payload) {\n return response.payload as GetTemplatesResponse;\n }\n throw new Error(response.error);\n } catch (error) {\n const formattedError = formatError(error, \"Failed to get templates\");\n throw new Error(JSON.stringify(formattedError));\n }\n }\n\n /**\n * Check the current status of the iframe and PostMessageHandler\n * Useful for debugging\n * @deprecated Use getStatus() instead\n */\n getDebugStatus() {\n const iframe = this.getIframe();\n return {\n ready: iframe?.contentDocument?.readyState === \"complete\",\n iframeExists: !!iframe,\n iframeSrc: iframe?.src,\n iframeContentWindow: !!iframe?.contentWindow,\n iframeContentDocument: !!iframe?.contentDocument,\n iframeReadyState: iframe?.contentDocument?.readyState,\n postMessageHandlerExists: !!this.postMessageHandler,\n postMessageHandlerReady: this.postMessageHandler?.ready || false,\n baseURL: this.baseURL,\n };\n }\n\n render() {\n // Use the pre-validated normalizedBaseURL so render() never throws.\n // normalizedBaseURL is set in connectedCallback (before first render) and\n // kept up to date by updated() on each baseURL change.\n if (!this.normalizedBaseURL) {\n return html``;\n }\n\n return html`\n <iframe\n src=${buildEmbeddedUrl(this.normalizedBaseURL)}\n title=\"Corti Embedded UI\"\n sandbox=${IFRAME_SANDBOX_POLICY}\n allow=${this.getIframeAllowPolicy(this.normalizedBaseURL)}\n @load=${(event: Event) => this.handleIframeLoad(event)}\n @unload=${() => this.postMessageHandler?.destroy()}\n style=${this.visibility === \"hidden\"\n ? \"display: none;\"\n : \"display: block;\"}\n ></iframe>\n `;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"CortiEmbedded.js","sourceRoot":"","sources":["../src/CortiEmbedded.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-console */\nimport type { Corti } from \"@corti/sdk\";\nimport { html, LitElement, type PropertyValues } from \"lit\";\nimport { property } from \"lit/decorators.js\";\nimport type {\n AuthResponse,\n AddFactsPayload,\n ConfigureApplicationPayload,\n ConfigureApplicationResponse,\n ConfigurePayload,\n ConfigureResponse,\n ConfigureSessionPayload,\n CreateInteractionPayload,\n CreateInteractionResponse,\n NavigatePayload,\n SetInteractionOptionsPayload,\n SetCredentialsPayload,\n CortiEmbeddedAPI,\n InteractionDetails,\n SessionConfig,\n User,\n GetStatusResponse,\n GetTemplatesResponse,\n KeycloakTokenResponse,\n} from \"./public-types.js\";\nimport { baseStyles } from \"./styles/base.js\";\nimport { containerStyles } from \"./styles/container-styles.js\";\nimport { validateAndNormalizeBaseURL } from \"./utils/baseUrl.js\";\nimport { buildEmbeddedUrl, isRealEmbeddedLoad } from \"./utils/embedUrl.js\";\nimport { formatError } from \"./utils/errorFormatter.js\";\nimport {\n PostMessageHandler,\n type PostMessageHandlerCallbacks,\n} from \"./utils/PostMessageHandler.js\";\n\nconst IFRAME_SANDBOX_POLICY =\n \"allow-forms allow-modals allow-scripts allow-same-origin\";\n\nconst DEPRECATION_TIMELINE_URL =\n \"https://docs.corti.ai/assistant/deprecation-timeline\";\n\nconst CONFIGURATION_MIGRATION_URL =\n \"https://docs.corti.ai/assistant/configuration-migration\";\n\nconst DEPRECATED_EVENT_SUBSCRIPTIONS = new Set([\n \"ready\",\n \"loaded\",\n \"recordingStarted\",\n \"recordingStopped\",\n \"documentGenerated\",\n \"documentUpdated\",\n \"documentSynced\",\n \"authChanged\",\n \"interactionCreated\",\n \"navigationChanged\",\n \"usage\",\n \"embedded-event\",\n]);\n\ntype DOMEventListener =\n | ((event: Event) => void)\n | { handleEvent(event: Event): void };\n\ntype DOMAddEventListenerOptions =\n | boolean\n | {\n capture?: boolean;\n once?: boolean;\n passive?: boolean;\n signal?: AbortSignal;\n };\n\nexport class CortiEmbedded extends LitElement implements CortiEmbeddedAPI {\n static styles = [baseStyles, containerStyles];\n\n @property({ type: String, reflect: true })\n visibility = \"hidden\";\n\n @property({ type: String, reflect: true })\n baseURL!: string;\n\n private postMessageHandler: PostMessageHandler | null = null;\n\n private normalizedBaseURL: string | null = null;\n\n private warnedDeprecatedEventSubscriptions = new Set<string>();\n\n addEventListener(\n type: string,\n callback: DOMEventListener,\n options?: DOMAddEventListenerOptions,\n ): void {\n this.warnDeprecatedEventSubscription(type);\n super.addEventListener(type, callback, options);\n }\n\n private warnDeprecatedEventSubscription(eventName: string): void {\n if (\n !DEPRECATED_EVENT_SUBSCRIPTIONS.has(eventName) ||\n this.warnedDeprecatedEventSubscriptions.has(eventName)\n ) {\n return;\n }\n\n this.warnedDeprecatedEventSubscriptions.add(eventName);\n console.warn(\n `[Corti Embedded] The '${eventName}' event subscription is deprecated and will be removed in a future release. Subscribe to the canonical 'event' stream instead. See ${DEPRECATION_TIMELINE_URL}.`,\n );\n }\n\n // eslint-disable-next-line class-methods-use-this\n private getIframeAllowPolicy(normalizedBaseURL?: string | null): string {\n const permissionTarget = normalizedBaseURL\n ? new URL(normalizedBaseURL).origin\n : \"*\";\n\n return [\n `microphone ${permissionTarget}`,\n `camera ${permissionTarget}`,\n `device-capture ${permissionTarget}`,\n `display-capture ${permissionTarget}`,\n `clipboard-write ${permissionTarget}`,\n ].join(\"; \");\n }\n\n connectedCallback() {\n super.connectedCallback();\n\n // Ensure baseURL is provided\n if (!this.baseURL) {\n this.dispatchErrorEvent({\n message: \"baseURL is required\",\n });\n return;\n }\n\n // Validate and normalize the initial baseURL early (fail fast)\n try {\n this.normalizedBaseURL = validateAndNormalizeBaseURL(this.baseURL);\n } catch (error) {\n this.dispatchErrorEvent({\n message: (error as Error).message || \"Invalid baseURL\",\n });\n // Dispatch the error event rather than throwing so consumers can handle it\n // via the 'error' event listener without wrapping connectedCallback in try/catch.\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n if (this.postMessageHandler) {\n this.postMessageHandler.destroy();\n this.postMessageHandler = null;\n }\n }\n\n private async setupPostMessageHandler() {\n // Prevent multiple setups\n if (this.postMessageHandler) {\n return;\n }\n\n const iframe = this.getIframe();\n\n if (iframe?.contentWindow) {\n const callbacks: PostMessageHandlerCallbacks = {\n onEvent: event => {\n this.dispatchEmbeddedEvent(event.name, event.payload);\n },\n onError: error => {\n this.dispatchErrorEvent(error);\n },\n };\n\n this.postMessageHandler = new PostMessageHandler(iframe, callbacks);\n } else {\n this.dispatchErrorEvent({\n message: \"No iframe or contentWindow available\",\n });\n }\n }\n\n private dispatchPublicEvent(event: string, data: unknown) {\n this.dispatchEvent(new CustomEvent(event, { detail: data }));\n }\n\n private dispatchEmbeddedEvent(rawEventName: string, payload: unknown) {\n if (rawEventName === \"ready\" || rawEventName === \"loaded\") return;\n // Pass all other events through as raw DOM events for direct listeners.\n this.dispatchPublicEvent(rawEventName, payload);\n\n // Forward supported embedded events through the generic 'event' stream so\n // consumers can observe them without subscribing to each raw event name.\n this.dispatchPublicEvent(\"event\", {\n name: rawEventName,\n payload,\n });\n\n // Also emit the legacy 'embedded-event' stream for backward compatibility.\n // This allows existing integrations listening for 'embedded-event' to continue\n // working while newer consumers can use the 'event' stream.\n this.dispatchPublicEvent(\"embedded-event\", {\n name: rawEventName,\n payload,\n });\n }\n\n private dispatchErrorEvent(error: {\n message: string;\n code?: string;\n details?: unknown;\n }) {\n this.dispatchPublicEvent(\"error\", error);\n }\n\n private static warnDeprecatedAPI(\n methodName: string,\n replacement: string,\n ): void {\n console.warn(\n `[Corti Embedded] ${methodName} is deprecated and will be removed in a future release. Use ${replacement} instead. See ${CONFIGURATION_MIGRATION_URL} and ${DEPRECATION_TIMELINE_URL}.`,\n );\n }\n\n private isRealIframeLoad(iframe: HTMLIFrameElement): boolean {\n const src = iframe.getAttribute(\"src\") || \"\";\n if (!this.normalizedBaseURL) return false;\n return isRealEmbeddedLoad(src, this.normalizedBaseURL);\n }\n\n private async handleIframeLoad(event: Event) {\n const iframe = event.target as HTMLIFrameElement | null;\n if (!iframe) {\n return;\n }\n // Only initialize on real URL load, ignore about:blank\n if (!this.isRealIframeLoad(iframe)) {\n return;\n }\n try {\n await this.setupPostMessageHandler();\n } catch (error) {\n this.dispatchErrorEvent({\n message: `Failed to setup PostMessageHandler on iframe load: ${error}`,\n });\n }\n }\n\n private getIframe(): HTMLIFrameElement | null {\n return this.shadowRoot?.querySelector(\"iframe\") || null;\n }\n\n protected updated(changedProps: PropertyValues) {\n super.updated(changedProps);\n if (changedProps.has(\"baseURL\")) {\n // Tear down the existing handler; the new one is created in handleIframeLoad\n if (this.postMessageHandler) {\n this.postMessageHandler.destroy();\n this.postMessageHandler = null;\n }\n\n // Validate the new URL\n try {\n this.normalizedBaseURL = validateAndNormalizeBaseURL(this.baseURL);\n } catch (error) {\n this.normalizedBaseURL = null;\n const iframe = this.getIframe();\n if (iframe) {\n iframe.setAttribute(\"src\", \"about:blank\");\n }\n this.dispatchErrorEvent({\n message: (error as Error).message || \"Invalid baseURL\",\n });\n return;\n }\n\n // Update the iframe to the new URL\n const iframe = this.getIframe();\n if (iframe) {\n const expected = buildEmbeddedUrl(this.normalizedBaseURL);\n iframe.setAttribute(\"allow\", this.getIframeAllowPolicy(expected));\n if (iframe.getAttribute(\"src\") !== expected) {\n iframe.setAttribute(\"src\", expected);\n }\n }\n }\n }\n\n // Public API Implementation\n\n /**\n * Authenticate with the Corti system\n * @param credentials Authentication credentials\n * @returns Promise resolving to user information\n */\n async auth(credentials: KeycloakTokenResponse): Promise<User> {\n if (!this.postMessageHandler) {\n throw new Error(\"Component not ready\");\n }\n\n try {\n const payload: KeycloakTokenResponse = {\n access_token: credentials.access_token,\n token_type: credentials.token_type,\n expires_at: credentials.expires_at,\n expires_in: credentials.expires_in,\n refresh_expires_in: credentials.refresh_expires_in,\n refresh_token: credentials.refresh_token,\n id_token: credentials.id_token,\n \"not-before-policy\": credentials[\"not-before-policy\"],\n session_state: credentials.session_state,\n scope: credentials.scope,\n profile: credentials.profile,\n };\n\n const response = await this.postMessageHandler.postMessage({\n type: \"CORTI_EMBEDDED\",\n version: \"v1\",\n action: \"auth\",\n payload,\n });\n\n if (response.success && response.payload) {\n return (response.payload as AuthResponse).user;\n }\n throw new Error(response.error);\n } catch (error) {\n const formattedError = formatError(error, \"Authentication failed\");\n throw new Error(JSON.stringify(formattedError));\n }\n }\n\n /**\n * Create a new interaction\n * @param encounter Encounter request data\n * @returns Promise resolving to interaction details\n */\n async createInteraction(\n encounter: CreateInteractionPayload,\n ): Promise<InteractionDetails> {\n if (!this.postMessageHandler) {\n throw new Error(\"Component not ready\");\n }\n\n try {\n const response = await this.postMessageHandler.postMessage({\n type: \"CORTI_EMBEDDED\",\n version: \"v1\",\n action: \"createInteraction\",\n payload: encounter,\n });\n\n if (response.success && response.payload) {\n const result = response.payload as CreateInteractionResponse;\n return {\n id: result.id,\n createdAt: result.createdAt,\n };\n }\n throw new Error(response.error);\n } catch (error) {\n const formattedError = formatError(error, \"Failed to create interaction\");\n throw new Error(JSON.stringify(formattedError));\n }\n }\n\n /**\n * Configure the current session\n * @param config Session configuration\n * @returns Promise that resolves when configuration is complete\n */\n async configureSession(config: SessionConfig): Promise<void> {\n if (!this.postMessageHandler) {\n throw new Error(\"Component not ready\");\n }\n\n try {\n CortiEmbedded.warnDeprecatedAPI(\n \"configureSession()\",\n \"setInteractionOptions()\",\n );\n const payload: ConfigureSessionPayload = {\n defaultLanguage: config.defaultLanguage,\n defaultOutputLanguage: config.defaultOutputLanguage,\n defaultTemplateKey: config.defaultTemplateKey,\n defaultMode: config.defaultMode,\n };\n\n await this.postMessageHandler.postMessage({\n type: \"CORTI_EMBEDDED\",\n version: \"v1\",\n action: \"configureSession\",\n payload,\n });\n } catch (error) {\n const formattedError = formatError(error, \"Failed to configure session\");\n throw new Error(JSON.stringify(formattedError));\n }\n }\n\n /**\n * Add facts to the current session\n * @param facts Array of facts to add\n * @returns Promise that resolves when facts are added\n */\n async addFacts(facts: Corti.FactsCreateInput[]): Promise<void> {\n if (!this.postMessageHandler) {\n throw new Error(\"Component not ready\");\n }\n\n try {\n const payload: AddFactsPayload = { facts };\n await this.postMessageHandler.postMessage({\n type: \"CORTI_EMBEDDED\",\n version: \"v1\",\n action: \"addFacts\",\n payload,\n });\n } catch (error) {\n const formattedError = formatError(error, \"Failed to add facts\");\n throw new Error(JSON.stringify(formattedError));\n }\n }\n\n /**\n * Navigate to a specific path within the embedded UI\n * @param payload Navigation request payload or legacy path string\n * @returns Promise that resolves when navigation is complete\n */\n async navigate(payload: NavigatePayload | string): Promise<void> {\n if (!this.postMessageHandler) {\n throw new Error(\"Component not ready\");\n }\n\n try {\n const normalizedPayload: NavigatePayload =\n typeof payload === \"string\" ? { path: payload } : payload;\n await this.postMessageHandler.postMessage({\n type: \"CORTI_EMBEDDED\",\n version: \"v1\",\n action: \"navigate\",\n payload: normalizedPayload,\n });\n } catch (error) {\n const formattedError = formatError(error, \"Failed to navigate\");\n throw new Error(JSON.stringify(formattedError));\n }\n }\n\n /**\n * Start recording\n * @returns Promise that resolves when recording starts\n */\n async startRecording(): Promise<void> {\n if (!this.postMessageHandler) {\n throw new Error(\"Component not ready\");\n }\n\n try {\n await this.postMessageHandler.postMessage({\n type: \"CORTI_EMBEDDED\",\n version: \"v1\",\n action: \"startRecording\",\n payload: {},\n });\n } catch (error) {\n const formattedError = formatError(error, \"Failed to start recording\");\n throw new Error(JSON.stringify(formattedError));\n }\n }\n\n /**\n * Stop recording\n * @returns Promise that resolves when recording stops\n */\n async stopRecording(): Promise<void> {\n if (!this.postMessageHandler) {\n throw new Error(\"Component not ready\");\n }\n\n try {\n await this.postMessageHandler.postMessage({\n type: \"CORTI_EMBEDDED\",\n version: \"v1\",\n action: \"stopRecording\",\n payload: {},\n });\n } catch (error) {\n const formattedError = formatError(error, \"Failed to stop recording\");\n throw new Error(JSON.stringify(formattedError));\n }\n }\n\n /**\n * Get current component status\n * @returns Promise resolving to current status\n */\n async getStatus(): Promise<GetStatusResponse> {\n if (!this.postMessageHandler) {\n return {\n auth: {\n isAuthenticated: false,\n user: undefined,\n },\n currentUrl: \"\",\n interaction: null,\n };\n }\n\n try {\n const response = await this.postMessageHandler.postMessage({\n type: \"CORTI_EMBEDDED\",\n version: \"v1\",\n action: \"getStatus\",\n payload: {},\n });\n\n if (response.success && response.payload) {\n return response.payload as GetStatusResponse;\n }\n throw new Error(response.error);\n } catch (error) {\n const formattedError = formatError(error, \"Failed to get status\");\n throw new Error(JSON.stringify(formattedError));\n }\n }\n\n /**\n * Configure the component\n * @param config Component configuration\n * @returns Promise that resolves when configuration is applied\n */\n async configureApp(\n config: ConfigureApplicationPayload,\n ): Promise<ConfigureApplicationResponse> {\n if (!this.postMessageHandler) {\n throw new Error(\"Component not ready\");\n }\n\n try {\n const response = await this.postMessageHandler.postMessage({\n type: \"CORTI_EMBEDDED\",\n version: \"v1\",\n action: \"configureApp\",\n payload: config,\n });\n\n if (response.success && response.payload) {\n return response.payload as ConfigureApplicationResponse;\n }\n throw new Error(response.error);\n } catch (error) {\n const formattedError = formatError(error, \"Failed to configure app\");\n throw new Error(JSON.stringify(formattedError));\n }\n }\n\n /**\n * Configure the component\n * @param config Component configuration\n * @returns Promise that resolves when configuration is applied\n */\n async configure(config: ConfigurePayload): Promise<ConfigureResponse> {\n if (!this.postMessageHandler) {\n throw new Error(\"Component not ready\");\n }\n\n try {\n CortiEmbedded.warnDeprecatedAPI(\"configure()\", \"configureApp()\");\n const response = await this.postMessageHandler.postMessage({\n type: \"CORTI_EMBEDDED\",\n version: \"v1\",\n action: \"configure\",\n payload: config,\n });\n\n if (response.success && response.payload) {\n return response.payload as ConfigureResponse;\n }\n throw new Error(response.error);\n } catch (error) {\n const formattedError = formatError(\n error,\n \"Failed to configure component\",\n );\n throw new Error(JSON.stringify(formattedError));\n }\n }\n\n /**\n * Set one-shot interaction options for the embedded instance.\n * @param config Interaction/session-level options\n * @returns Promise that resolves when options are applied\n */\n async setInteractionOptions(\n config: SetInteractionOptionsPayload,\n ): Promise<void> {\n if (!this.postMessageHandler) {\n throw new Error(\"Component not ready\");\n }\n\n try {\n const response = await this.postMessageHandler.postMessage({\n type: \"CORTI_EMBEDDED\",\n version: \"v1\",\n action: \"setInteractionOptions\",\n payload: config,\n });\n\n if (response.success === false || response.error) {\n throw new Error(response.error);\n }\n } catch (error) {\n const formattedError = formatError(\n error,\n \"Failed to set interaction options\",\n );\n throw new Error(JSON.stringify(formattedError));\n }\n }\n\n /**\n * Set authentication credentials without triggering auth flow\n * @param credentials Authentication credentials to store\n * @returns Promise that resolves when credentials are set\n */\n async setCredentials(credentials: SetCredentialsPayload): Promise<void> {\n if (!this.postMessageHandler) {\n throw new Error(\"Component not ready\");\n }\n\n try {\n if (!credentials.password) {\n throw new Error(\"Password is required\");\n }\n await this.postMessageHandler.postMessage({\n type: \"CORTI_EMBEDDED\",\n version: \"v1\",\n action: \"setCredentials\",\n payload: credentials,\n });\n } catch (error) {\n const formattedError = formatError(error, \"Failed to set credentials\");\n throw new Error(JSON.stringify(formattedError));\n }\n }\n\n /**\n * Show the embedded UI\n */\n show(): void {\n this.visibility = \"visible\";\n }\n\n /**\n * Hide the embedded UI\n */\n hide(): void {\n this.visibility = \"hidden\";\n }\n\n /**\n * Get templates\n */\n async getTemplates(): Promise<GetTemplatesResponse> {\n if (!this.postMessageHandler) {\n throw new Error(\"Component not ready\");\n }\n\n try {\n const response = await this.postMessageHandler.postMessage({\n type: \"CORTI_EMBEDDED\",\n version: \"v1\",\n action: \"getTemplates\",\n });\n\n if (response.success && response.payload) {\n return response.payload as GetTemplatesResponse;\n }\n throw new Error(response.error);\n } catch (error) {\n const formattedError = formatError(error, \"Failed to get templates\");\n throw new Error(JSON.stringify(formattedError));\n }\n }\n\n /**\n * Check the current status of the iframe and PostMessageHandler\n * Useful for debugging\n * @deprecated Use getStatus() instead\n */\n getDebugStatus() {\n const iframe = this.getIframe();\n return {\n ready: iframe?.contentDocument?.readyState === \"complete\",\n iframeExists: !!iframe,\n iframeSrc: iframe?.src,\n iframeContentWindow: !!iframe?.contentWindow,\n iframeContentDocument: !!iframe?.contentDocument,\n iframeReadyState: iframe?.contentDocument?.readyState,\n postMessageHandlerExists: !!this.postMessageHandler,\n postMessageHandlerReady: this.postMessageHandler?.ready || false,\n baseURL: this.baseURL,\n };\n }\n\n render() {\n // Use the pre-validated normalizedBaseURL so render() never throws.\n // normalizedBaseURL is set in connectedCallback (before first render) and\n // kept up to date by updated() on each baseURL change.\n if (!this.normalizedBaseURL) {\n return html``;\n }\n\n return html`\n <iframe\n src=${buildEmbeddedUrl(this.normalizedBaseURL)}\n title=\"Corti Embedded UI\"\n sandbox=${IFRAME_SANDBOX_POLICY}\n allow=${this.getIframeAllowPolicy(this.normalizedBaseURL)}\n @load=${(event: Event) => this.handleIframeLoad(event)}\n @unload=${() => this.postMessageHandler?.destroy()}\n style=${this.visibility === \"hidden\"\n ? \"display: none;\"\n : \"display: block;\"}\n ></iframe>\n `;\n }\n}\n"]}
|