@ctchealth/plato-sdk 0.0.10 → 0.0.12
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 +269 -1
- package/package.json +1 -1
- package/src/lib/constants.d.ts +15 -0
- package/src/lib/constants.js +19 -0
- package/src/lib/constants.js.map +1 -0
- package/src/lib/plato-intefaces.d.ts +83 -17
- package/src/lib/plato-intefaces.js +30 -1
- package/src/lib/plato-intefaces.js.map +1 -1
- package/src/lib/plato-sdk.d.ts +7 -2
- package/src/lib/plato-sdk.js +108 -4
- package/src/lib/plato-sdk.js.map +1 -1
- package/src/lib/utils.d.ts +29 -0
- package/src/lib/utils.js +50 -0
- package/src/lib/utils.js.map +1 -0
package/README.md
CHANGED
|
@@ -6,6 +6,16 @@ A TypeScript SDK for interacting with the Plato API to create and manage AI-powe
|
|
|
6
6
|
|
|
7
7
|
The Plato SDK provides a simple and type-safe way to integrate with the Plato platform, allowing you to create medical training simulations with AI personas and manage voice-based interactions.
|
|
8
8
|
|
|
9
|
+
## Authentication
|
|
10
|
+
|
|
11
|
+
All API requests require authentication using a Bearer token. Include your JWT token in the `API-AUTH` header:
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
API-AUTH: Bearer <your-jwt-token>
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Requests without a valid JWT token will be rejected with a `401 Unauthorized` response.
|
|
18
|
+
|
|
9
19
|
## Features
|
|
10
20
|
|
|
11
21
|
- Create AI personas with customizable professional profiles and personalities
|
|
@@ -24,7 +34,7 @@ npm install plato-sdk
|
|
|
24
34
|
## Quick Start
|
|
25
35
|
|
|
26
36
|
```typescript
|
|
27
|
-
import { PlatoApiClient } from 'plato-sdk';
|
|
37
|
+
import { PlatoApiClient, AvatarLanguage } from 'plato-sdk';
|
|
28
38
|
|
|
29
39
|
// Initialize the client
|
|
30
40
|
const client = new PlatoApiClient({
|
|
@@ -33,6 +43,9 @@ const client = new PlatoApiClient({
|
|
|
33
43
|
user: 'test@test.test',
|
|
34
44
|
});
|
|
35
45
|
|
|
46
|
+
// Get available assistant images
|
|
47
|
+
const images = await client.getAssistantImages();
|
|
48
|
+
|
|
36
49
|
// Create a simulation
|
|
37
50
|
const simulation = await client.createSimulation({
|
|
38
51
|
persona: {
|
|
@@ -69,6 +82,8 @@ const simulation = await client.createSimulation({
|
|
|
69
82
|
'Demonstrate efficacy of Ibuprofen in pain management Highlight safety profile and contraindications Encourage patient adherence',
|
|
70
83
|
anticipatedObjections:
|
|
71
84
|
'Concerns about gastrointestinal side effects Preference for lower-cost generic alternatives Potential interactions with other medications',
|
|
85
|
+
imageId: images[0]._id,
|
|
86
|
+
avatarLanguage: AvatarLanguage.English,
|
|
72
87
|
});
|
|
73
88
|
|
|
74
89
|
// Check the simulation status - If simulation creation phase is equals to FINISHED, the simulation is ready to use
|
|
@@ -217,6 +232,153 @@ const recordingUrl = await client.getCallRecording(call._id);
|
|
|
217
232
|
console.log('Recording URL:', recordingUrl);
|
|
218
233
|
```
|
|
219
234
|
|
|
235
|
+
##### uploadPdfSlides(file: File | Blob)
|
|
236
|
+
|
|
237
|
+
Uploads a PDF file for slide analysis. The file will be uploaded to S3 and analyzed asynchronously.
|
|
238
|
+
|
|
239
|
+
**Parameters:**
|
|
240
|
+
|
|
241
|
+
- `file` (File | Blob): The PDF file to upload
|
|
242
|
+
|
|
243
|
+
**Returns:** `Promise<string>` — A success message if the upload was successful.
|
|
244
|
+
|
|
245
|
+
**Example:**
|
|
246
|
+
|
|
247
|
+
```typescript
|
|
248
|
+
// Upload a PDF file from an input element
|
|
249
|
+
const fileInput = document.querySelector('input[type="file"]') as HTMLInputElement;
|
|
250
|
+
const file = fileInput.files?.[0];
|
|
251
|
+
|
|
252
|
+
if (file) {
|
|
253
|
+
const result = await client.uploadPdfSlides(file);
|
|
254
|
+
console.log('PDF upload initiated');
|
|
255
|
+
}
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
##### getSlidesAnalysis(queryParams: PdfSlidesAnalysisQueryDto)
|
|
259
|
+
|
|
260
|
+
Retrieves a paginated and sorted list of PDF slide analysis records.
|
|
261
|
+
|
|
262
|
+
**Parameters:**
|
|
263
|
+
|
|
264
|
+
- `queryParams` (PdfSlidesAnalysisQueryDto):
|
|
265
|
+
- `limit` (optional): Number of records per page
|
|
266
|
+
- `page` (optional): Page number
|
|
267
|
+
- `sort` (optional): Sort order (`'asc'` or `'desc'`)
|
|
268
|
+
- `sortBy` (optional): Field to sort by (`'createdAt'`, `'originalFilename'`, or `'totalSlides'`)
|
|
269
|
+
|
|
270
|
+
**Returns:** `Promise<PdfSlidesDto[]>`
|
|
271
|
+
|
|
272
|
+
**Example:**
|
|
273
|
+
|
|
274
|
+
```typescript
|
|
275
|
+
const analysisList = await client.getSlidesAnalysis({
|
|
276
|
+
limit: 10,
|
|
277
|
+
page: 0,
|
|
278
|
+
sort: 'desc',
|
|
279
|
+
sortBy: 'createdAt',
|
|
280
|
+
});
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
##### getSlideAnalysis(id: string)
|
|
284
|
+
|
|
285
|
+
Retrieves the detailed analysis data for a specific PDF slide record, including the overview and individual slide analysis.
|
|
286
|
+
|
|
287
|
+
**Parameters:**
|
|
288
|
+
|
|
289
|
+
- `id` (string): The unique ID of the PDF slide record
|
|
290
|
+
|
|
291
|
+
**Returns:** `Promise<PdfSlideDto>`
|
|
292
|
+
|
|
293
|
+
**Example:**
|
|
294
|
+
|
|
295
|
+
```typescript
|
|
296
|
+
const details = await client.getSlideAnalysis('pdf-slide-id');
|
|
297
|
+
console.log('Lesson Overview:', details.lessonOverview);
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
##### deleteSlideAnalysis(id: string)
|
|
301
|
+
|
|
302
|
+
Deletes a PDF slide analysis record from the database and removes the corresponding file from S3 storage.
|
|
303
|
+
|
|
304
|
+
**Parameters:**
|
|
305
|
+
|
|
306
|
+
- `id` (string): The unique ID of the PDF slide record to delete
|
|
307
|
+
|
|
308
|
+
**Returns:** `Promise<void>`
|
|
309
|
+
|
|
310
|
+
**Example:**
|
|
311
|
+
|
|
312
|
+
```typescript
|
|
313
|
+
await client.deleteSlideAnalysis('pdf-slide-id');
|
|
314
|
+
console.log('Analysis deleted successfully');
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
##### getAssistantImages()
|
|
318
|
+
|
|
319
|
+
Retrieves all available assistant images that can be used when creating a simulation.
|
|
320
|
+
|
|
321
|
+
**Returns:** `Promise<AssistantImageDto[]>` — An array of assistant image objects, each containing:
|
|
322
|
+
|
|
323
|
+
- `_id`: Unique identifier for the image
|
|
324
|
+
- `imageUrl`: URL of the assistant image
|
|
325
|
+
|
|
326
|
+
**Example:**
|
|
327
|
+
|
|
328
|
+
```typescript
|
|
329
|
+
// Get all available assistant images
|
|
330
|
+
const images = await client.getAssistantImages();
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
##### getRecommendations()
|
|
334
|
+
|
|
335
|
+
Retrieves recommendations based on the user's recent call performance. Analyzes up to 10 of the most recent calls to identify patterns and provide actionable insights.
|
|
336
|
+
|
|
337
|
+
**Returns:** `Promise<RecommendationsResponseDto>` — An object containing:
|
|
338
|
+
|
|
339
|
+
- `recommendations`: Array of recommendation objects, each with:
|
|
340
|
+
- `title`: Brief title of the recommendation
|
|
341
|
+
- `description`: Detailed, actionable description
|
|
342
|
+
- `priority`: Priority level (`'high'`, `'medium'`, or `'low'`)
|
|
343
|
+
- `strengths`: Array of identified strengths, each with:
|
|
344
|
+
- `strength`: Description of the strength
|
|
345
|
+
- `frequency`: Number of calls where this strength appeared
|
|
346
|
+
- `improvementAreas`: Array of areas needing improvement, each with:
|
|
347
|
+
- `area`: Description of the improvement area
|
|
348
|
+
- `frequency`: Number of calls where this weakness appeared
|
|
349
|
+
- `summary`: A 2-3 sentence overall summary of performance trends
|
|
350
|
+
- `callsAnalyzed`: Number of calls that were analyzed
|
|
351
|
+
- `generatedAt`: Timestamp when the recommendations were generated
|
|
352
|
+
|
|
353
|
+
**Example:**
|
|
354
|
+
|
|
355
|
+
```typescript
|
|
356
|
+
// Get personalized recommendations based on call history
|
|
357
|
+
const recommendations = await client.getRecommendations();
|
|
358
|
+
|
|
359
|
+
console.log(`Analyzed ${recommendations.callsAnalyzed} calls`);
|
|
360
|
+
console.log('Summary:', recommendations.summary);
|
|
361
|
+
|
|
362
|
+
// Display high-priority recommendations
|
|
363
|
+
recommendations.recommendations
|
|
364
|
+
.filter(rec => rec.priority === 'high')
|
|
365
|
+
.forEach(rec => {
|
|
366
|
+
console.log(`[HIGH] ${rec.title}: ${rec.description}`);
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
// Show recurring strengths
|
|
370
|
+
recommendations.strengths.forEach(s => {
|
|
371
|
+
console.log(`Strength (${s.frequency} calls): ${s.strength}`);
|
|
372
|
+
});
|
|
373
|
+
|
|
374
|
+
// Show areas for improvement
|
|
375
|
+
recommendations.improvementAreas.forEach(area => {
|
|
376
|
+
console.log(`Needs work (${area.frequency} calls): ${area.area}`);
|
|
377
|
+
});
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
**Note:** This method requires the user to have at least one completed call. If no calls are found, a `BadRequestException` will be thrown.
|
|
381
|
+
|
|
220
382
|
## Checking Simulation Status
|
|
221
383
|
|
|
222
384
|
You can check the current phase/status of a simulation using the `checkSimulationStatus` method. This is useful for polling the simulation creation process until it is ready or has failed.
|
|
@@ -330,6 +492,8 @@ interface CreateSimulationDto {
|
|
|
330
492
|
objectives?: string;
|
|
331
493
|
anticipatedObjections?: string;
|
|
332
494
|
trainingConfiguration: TrainingConfigurationDto;
|
|
495
|
+
imageId: string;
|
|
496
|
+
avatarLanguage: AvatarLanguage;
|
|
333
497
|
}
|
|
334
498
|
```
|
|
335
499
|
|
|
@@ -380,6 +544,110 @@ enum CreationPhase {
|
|
|
380
544
|
}
|
|
381
545
|
```
|
|
382
546
|
|
|
547
|
+
### RecommendationsResponseDto
|
|
548
|
+
|
|
549
|
+
Response object from `getRecommendations()`:
|
|
550
|
+
|
|
551
|
+
```typescript
|
|
552
|
+
interface RecommendationsResponseDto {
|
|
553
|
+
recommendations: RecommendationItemDto[];
|
|
554
|
+
strengths: PerformancePatternDto[];
|
|
555
|
+
improvementAreas: ImprovementAreaDto[];
|
|
556
|
+
summary: string;
|
|
557
|
+
callsAnalyzed: number;
|
|
558
|
+
generatedAt: Date;
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
interface RecommendationItemDto {
|
|
562
|
+
title: string;
|
|
563
|
+
description: string;
|
|
564
|
+
priority: 'high' | 'medium' | 'low';
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
interface PerformancePatternDto {
|
|
568
|
+
strength: string;
|
|
569
|
+
frequency: number;
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
interface ImprovementAreaDto {
|
|
573
|
+
area: string;
|
|
574
|
+
frequency: number;
|
|
575
|
+
}
|
|
576
|
+
```
|
|
577
|
+
|
|
578
|
+
### PdfSlidesDto
|
|
579
|
+
|
|
580
|
+
Simplified data structure for PDF slide records (used in lists):
|
|
581
|
+
|
|
582
|
+
```typescript
|
|
583
|
+
interface PdfSlidesDto {
|
|
584
|
+
_id: string;
|
|
585
|
+
originalFilename: string;
|
|
586
|
+
totalSlides?: number;
|
|
587
|
+
lessonOverview?: string;
|
|
588
|
+
createdAt: Date;
|
|
589
|
+
updatedAt: Date;
|
|
590
|
+
}
|
|
591
|
+
```
|
|
592
|
+
|
|
593
|
+
### PdfSlideDto
|
|
594
|
+
|
|
595
|
+
Detailed data structure for a single PDF slide analysis:
|
|
596
|
+
|
|
597
|
+
```typescript
|
|
598
|
+
interface PdfSlideDto {
|
|
599
|
+
_id: string;
|
|
600
|
+
originalFilename: string;
|
|
601
|
+
totalSlides?: number;
|
|
602
|
+
lessonOverview?: string;
|
|
603
|
+
slideAnalysis?: Array<{
|
|
604
|
+
slideNumber: number;
|
|
605
|
+
title: string;
|
|
606
|
+
textExtraction: string;
|
|
607
|
+
}>;
|
|
608
|
+
createdAt: Date;
|
|
609
|
+
updatedAt: Date;
|
|
610
|
+
}
|
|
611
|
+
```
|
|
612
|
+
|
|
613
|
+
### PdfSlidesAnalysisQueryDto
|
|
614
|
+
|
|
615
|
+
Query parameters for retrieving slide analysis records:
|
|
616
|
+
|
|
617
|
+
```typescript
|
|
618
|
+
interface PdfSlidesAnalysisQueryDto {
|
|
619
|
+
limit?: 5 | 10 | 25;
|
|
620
|
+
page?: number;
|
|
621
|
+
sort?: 'asc' | 'desc';
|
|
622
|
+
sortBy?: 'createdAt' | 'originalFilename' | 'totalSlides';
|
|
623
|
+
}
|
|
624
|
+
```
|
|
625
|
+
|
|
626
|
+
### AssistantImageDto
|
|
627
|
+
|
|
628
|
+
Data structure for assistant images:
|
|
629
|
+
|
|
630
|
+
```typescript
|
|
631
|
+
interface AssistantImageDto {
|
|
632
|
+
_id: string;
|
|
633
|
+
imageUrl: string;
|
|
634
|
+
}
|
|
635
|
+
```
|
|
636
|
+
|
|
637
|
+
### AvatarLanguage
|
|
638
|
+
|
|
639
|
+
Enum representing available avatar languages:
|
|
640
|
+
|
|
641
|
+
```typescript
|
|
642
|
+
enum AvatarLanguage {
|
|
643
|
+
English = 'en',
|
|
644
|
+
German = 'de',
|
|
645
|
+
Spanish = 'es',
|
|
646
|
+
Italian = 'it',
|
|
647
|
+
French = 'fr',
|
|
648
|
+
}
|
|
649
|
+
```
|
|
650
|
+
|
|
383
651
|
## Error Handling
|
|
384
652
|
|
|
385
653
|
The SDK throws errors for invalid configurations and API failures:
|
package/package.json
CHANGED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 ctcHealth. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* This file is part of the ctcHealth Plato Platform, a proprietary software system developed by ctcHealth.
|
|
5
|
+
*
|
|
6
|
+
* This source code and all related materials are confidential and proprietary to ctcHealth.
|
|
7
|
+
* Unauthorized access, use, copying, modification, distribution, or disclosure is strictly prohibited
|
|
8
|
+
* and may result in disciplinary action and civil and/or criminal penalties.
|
|
9
|
+
*
|
|
10
|
+
* This software is intended solely for authorized use within ctcHealth and its designated partners.
|
|
11
|
+
*
|
|
12
|
+
* For internal use only.
|
|
13
|
+
*/
|
|
14
|
+
export declare const MAX_PDF_FILE_SIZE: number;
|
|
15
|
+
export declare const ALLOWED_PDF_MIME_TYPES: string[];
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ALLOWED_PDF_MIME_TYPES = exports.MAX_PDF_FILE_SIZE = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Copyright (c) 2025 ctcHealth. All rights reserved.
|
|
6
|
+
*
|
|
7
|
+
* This file is part of the ctcHealth Plato Platform, a proprietary software system developed by ctcHealth.
|
|
8
|
+
*
|
|
9
|
+
* This source code and all related materials are confidential and proprietary to ctcHealth.
|
|
10
|
+
* Unauthorized access, use, copying, modification, distribution, or disclosure is strictly prohibited
|
|
11
|
+
* and may result in disciplinary action and civil and/or criminal penalties.
|
|
12
|
+
*
|
|
13
|
+
* This software is intended solely for authorized use within ctcHealth and its designated partners.
|
|
14
|
+
*
|
|
15
|
+
* For internal use only.
|
|
16
|
+
*/
|
|
17
|
+
exports.MAX_PDF_FILE_SIZE = 20 * 1024 * 1024; // 20MB
|
|
18
|
+
exports.ALLOWED_PDF_MIME_TYPES = ['application/pdf'];
|
|
19
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../../libs/plato-sdk/src/lib/constants.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;GAYG;AACU,QAAA,iBAAiB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO;AAC7C,QAAA,sBAAsB,GAAG,CAAC,iBAAiB,CAAC,CAAC"}
|
|
@@ -35,6 +35,13 @@ export declare enum AssistantVoiceGender {
|
|
|
35
35
|
Male = "Male",
|
|
36
36
|
Female = "Female"
|
|
37
37
|
}
|
|
38
|
+
export declare enum AvatarLanguage {
|
|
39
|
+
English = "en",
|
|
40
|
+
German = "de",
|
|
41
|
+
Spanish = "es",
|
|
42
|
+
Italian = "it",
|
|
43
|
+
French = "fr"
|
|
44
|
+
}
|
|
38
45
|
export declare class PersonalityAndBehaviourDto {
|
|
39
46
|
riskTolerance: number;
|
|
40
47
|
researchOrientation: number;
|
|
@@ -72,6 +79,8 @@ export declare class CreateSimulationDto {
|
|
|
72
79
|
scenario: string;
|
|
73
80
|
objectives?: string;
|
|
74
81
|
anticipatedObjections?: string;
|
|
82
|
+
imageId: string;
|
|
83
|
+
avatarLanguage: AvatarLanguage;
|
|
75
84
|
}
|
|
76
85
|
export type RecordingsLimit = 5 | 10 | 25;
|
|
77
86
|
export declare class SimulationRecordingsQueryDto {
|
|
@@ -213,25 +222,18 @@ export declare enum CreationPhase {
|
|
|
213
222
|
ERROR = "ERROR"
|
|
214
223
|
}
|
|
215
224
|
/**
|
|
216
|
-
*
|
|
225
|
+
* Presigned POST data for S3 upload.
|
|
217
226
|
*/
|
|
218
|
-
export interface
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
227
|
+
export interface PresignedPost {
|
|
228
|
+
url: string;
|
|
229
|
+
fields: Record<string, string>;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Response for requesting a PDF upload.
|
|
233
|
+
*/
|
|
234
|
+
export interface RequestPdfUploadResponse {
|
|
235
|
+
presignedPost: PresignedPost;
|
|
222
236
|
objectKey: string;
|
|
223
|
-
/**
|
|
224
|
-
* The original filename
|
|
225
|
-
*/
|
|
226
|
-
filename: string;
|
|
227
|
-
/**
|
|
228
|
-
* The file size in bytes
|
|
229
|
-
*/
|
|
230
|
-
size: number;
|
|
231
|
-
/**
|
|
232
|
-
* The content type of the file
|
|
233
|
-
*/
|
|
234
|
-
contentType: string;
|
|
235
237
|
}
|
|
236
238
|
export interface SimulationDetailsDto {
|
|
237
239
|
simulationId: string;
|
|
@@ -241,3 +243,67 @@ export interface SimulationDetailsDto {
|
|
|
241
243
|
createdAt: Date;
|
|
242
244
|
updatedAt: Date;
|
|
243
245
|
}
|
|
246
|
+
export declare enum RecommendationPriority {
|
|
247
|
+
HIGH = "high",
|
|
248
|
+
MEDIUM = "medium",
|
|
249
|
+
LOW = "low"
|
|
250
|
+
}
|
|
251
|
+
export interface RecommendationItemDto {
|
|
252
|
+
title: string;
|
|
253
|
+
description: string;
|
|
254
|
+
priority: RecommendationPriority;
|
|
255
|
+
}
|
|
256
|
+
export interface PerformancePatternDto {
|
|
257
|
+
strength: string;
|
|
258
|
+
frequency: number;
|
|
259
|
+
}
|
|
260
|
+
export interface ImprovementAreaDto {
|
|
261
|
+
area: string;
|
|
262
|
+
frequency: number;
|
|
263
|
+
}
|
|
264
|
+
export interface RecommendationsResponseDto {
|
|
265
|
+
recommendations: RecommendationItemDto[];
|
|
266
|
+
strengths: PerformancePatternDto[];
|
|
267
|
+
improvementAreas: ImprovementAreaDto[];
|
|
268
|
+
summary: string;
|
|
269
|
+
callsAnalyzed: number;
|
|
270
|
+
generatedAt: Date;
|
|
271
|
+
}
|
|
272
|
+
export declare enum PdfSlidesSortField {
|
|
273
|
+
CREATED_AT = "createdAt",
|
|
274
|
+
FILENAME = "originalFilename",
|
|
275
|
+
TOTAL_SLIDES = "totalSlides"
|
|
276
|
+
}
|
|
277
|
+
export declare class PdfSlidesAnalysisQueryDto {
|
|
278
|
+
limit?: RecordingsLimit;
|
|
279
|
+
page?: number;
|
|
280
|
+
sort?: SortOrder;
|
|
281
|
+
sortBy?: PdfSlidesSortField;
|
|
282
|
+
}
|
|
283
|
+
export interface SlideAnalysis {
|
|
284
|
+
slideNumber: number;
|
|
285
|
+
title?: string;
|
|
286
|
+
textExtraction?: string;
|
|
287
|
+
visualDescription?: string;
|
|
288
|
+
}
|
|
289
|
+
export interface PdfSlidesDto {
|
|
290
|
+
_id: string;
|
|
291
|
+
originalFilename: string;
|
|
292
|
+
totalSlides?: number;
|
|
293
|
+
lessonOverview?: string;
|
|
294
|
+
createdAt: Date;
|
|
295
|
+
updatedAt: Date;
|
|
296
|
+
}
|
|
297
|
+
export interface PdfSlideDto {
|
|
298
|
+
_id: string;
|
|
299
|
+
originalFilename: string;
|
|
300
|
+
totalSlides?: number;
|
|
301
|
+
lessonOverview?: string;
|
|
302
|
+
slideAnalysis?: SlideAnalysis[];
|
|
303
|
+
createdAt: Date;
|
|
304
|
+
updatedAt: Date;
|
|
305
|
+
}
|
|
306
|
+
export interface AssistantImageDto {
|
|
307
|
+
_id: string;
|
|
308
|
+
imageUrl: string;
|
|
309
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CreationPhase = exports.SimulationRecordingsDto = exports.RecordingStatus = exports.SortOrder = exports.SimulationRecordingsQueryDto = exports.CreateSimulationDto = exports.ProductConfig = exports.CharacterCreateDto = exports.ContextDto = exports.ProfessionalProfileDto = exports.PersonalityAndBehaviourDto = exports.AssistantVoiceGender = exports.SegmentType = exports.PracticeType = exports.YearOfExperience = void 0;
|
|
3
|
+
exports.PdfSlidesAnalysisQueryDto = exports.PdfSlidesSortField = exports.RecommendationPriority = exports.CreationPhase = exports.SimulationRecordingsDto = exports.RecordingStatus = exports.SortOrder = exports.SimulationRecordingsQueryDto = exports.CreateSimulationDto = exports.ProductConfig = exports.CharacterCreateDto = exports.ContextDto = exports.ProfessionalProfileDto = exports.PersonalityAndBehaviourDto = exports.AvatarLanguage = exports.AssistantVoiceGender = exports.SegmentType = exports.PracticeType = exports.YearOfExperience = void 0;
|
|
4
4
|
/**
|
|
5
5
|
* Copyright (c) 2025 ctcHealth. All rights reserved.
|
|
6
6
|
*
|
|
@@ -42,6 +42,14 @@ var AssistantVoiceGender;
|
|
|
42
42
|
AssistantVoiceGender["Male"] = "Male";
|
|
43
43
|
AssistantVoiceGender["Female"] = "Female";
|
|
44
44
|
})(AssistantVoiceGender || (exports.AssistantVoiceGender = AssistantVoiceGender = {}));
|
|
45
|
+
var AvatarLanguage;
|
|
46
|
+
(function (AvatarLanguage) {
|
|
47
|
+
AvatarLanguage["English"] = "en";
|
|
48
|
+
AvatarLanguage["German"] = "de";
|
|
49
|
+
AvatarLanguage["Spanish"] = "es";
|
|
50
|
+
AvatarLanguage["Italian"] = "it";
|
|
51
|
+
AvatarLanguage["French"] = "fr";
|
|
52
|
+
})(AvatarLanguage || (exports.AvatarLanguage = AvatarLanguage = {}));
|
|
45
53
|
class PersonalityAndBehaviourDto {
|
|
46
54
|
riskTolerance;
|
|
47
55
|
researchOrientation;
|
|
@@ -84,6 +92,8 @@ class CreateSimulationDto {
|
|
|
84
92
|
scenario;
|
|
85
93
|
objectives;
|
|
86
94
|
anticipatedObjections;
|
|
95
|
+
imageId;
|
|
96
|
+
avatarLanguage;
|
|
87
97
|
}
|
|
88
98
|
exports.CreateSimulationDto = CreateSimulationDto;
|
|
89
99
|
class SimulationRecordingsQueryDto {
|
|
@@ -121,4 +131,23 @@ var CreationPhase;
|
|
|
121
131
|
CreationPhase["FINISHED"] = "FINISHED";
|
|
122
132
|
CreationPhase["ERROR"] = "ERROR";
|
|
123
133
|
})(CreationPhase || (exports.CreationPhase = CreationPhase = {}));
|
|
134
|
+
var RecommendationPriority;
|
|
135
|
+
(function (RecommendationPriority) {
|
|
136
|
+
RecommendationPriority["HIGH"] = "high";
|
|
137
|
+
RecommendationPriority["MEDIUM"] = "medium";
|
|
138
|
+
RecommendationPriority["LOW"] = "low";
|
|
139
|
+
})(RecommendationPriority || (exports.RecommendationPriority = RecommendationPriority = {}));
|
|
140
|
+
var PdfSlidesSortField;
|
|
141
|
+
(function (PdfSlidesSortField) {
|
|
142
|
+
PdfSlidesSortField["CREATED_AT"] = "createdAt";
|
|
143
|
+
PdfSlidesSortField["FILENAME"] = "originalFilename";
|
|
144
|
+
PdfSlidesSortField["TOTAL_SLIDES"] = "totalSlides";
|
|
145
|
+
})(PdfSlidesSortField || (exports.PdfSlidesSortField = PdfSlidesSortField = {}));
|
|
146
|
+
class PdfSlidesAnalysisQueryDto {
|
|
147
|
+
limit;
|
|
148
|
+
page;
|
|
149
|
+
sort;
|
|
150
|
+
sortBy;
|
|
151
|
+
}
|
|
152
|
+
exports.PdfSlidesAnalysisQueryDto = PdfSlidesAnalysisQueryDto;
|
|
124
153
|
//# sourceMappingURL=plato-intefaces.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plato-intefaces.js","sourceRoot":"","sources":["../../../../../libs/plato-sdk/src/lib/plato-intefaces.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;GAYG;AACH,IAAY,gBAKX;AALD,WAAY,gBAAgB;IAC1B,qCAAmB,CAAA;IACnB,uCAAqB,CAAA;IACrB,yCAAuB,CAAA;IACvB,qCAAmB,CAAA;AACrB,CAAC,EALW,gBAAgB,gCAAhB,gBAAgB,QAK3B;AAED,IAAY,YAKX;AALD,WAAY,YAAY;IACtB,4CAA4B,CAAA;IAC5B,qCAAqB,CAAA;IACrB,iEAAiD,CAAA;IACjD,iCAAiB,CAAA;AACnB,CAAC,EALW,YAAY,4BAAZ,YAAY,QAKvB;AACD,IAAY,WAOX;AAPD,WAAY,WAAW;IACrB,oDAAqC,CAAA;IACrC,0CAA2B,CAAA;IAC3B,0EAA2D,CAAA;IAC3D,gFAAiE,CAAA;IACjE,qDAAsC,CAAA;IACtC,wEAAyD,CAAA;AAC3D,CAAC,EAPW,WAAW,2BAAX,WAAW,QAOtB;AAED,IAAY,oBAGX;AAHD,WAAY,oBAAoB;IAC9B,qCAAa,CAAA;IACb,yCAAiB,CAAA;AACnB,CAAC,EAHW,oBAAoB,oCAApB,oBAAoB,QAG/B;AAED,MAAa,0BAA0B;IACrC,aAAa,CAAU;IACvB,mBAAmB,CAAU;IAC7B,eAAe,CAAU;IACzB,YAAY,CAAU;IACtB,cAAc,CAAU;CACzB;AAND,gEAMC;AAED,MAAa,sBAAsB;IACjC,gBAAgB,CAAU;IAC1B,gBAAgB,CAAU;IAC1B,uBAAuB,CAAU;IACjC,QAAQ,CAAU;CACnB;AALD,wDAKC;AAED,MAAa,UAAU;IACrB,2BAA2B,CAAU;IACrC,iBAAiB,CAAU;IAC3B,kBAAkB,CAAU;CAC7B;AAJD,gCAIC;AAED,MAAa,kBAAkB;IAC7B,IAAI,CAAU;IACd,mBAAmB,CAA0B;IAC7C,OAAO,CAAe;IACtB,uBAAuB,CAA8B;IACrD,OAAO,CAAc;IACrB,eAAe,CAAwB;CACxC;AAPD,gDAOC;AAED,MAAa,aAAa;IACxB,IAAI,CAAU;IACd,WAAW,CAAU;CACtB;AAHD,sCAGC;AAED,MAAa,mBAAmB;IAC9B,OAAO,CAAsB;IAC7B,OAAO,CAAiB;IACxB,YAAY,CAAU;IACtB,QAAQ,CAAU;IAClB,UAAU,CAAU;IACpB,qBAAqB,CAAU;
|
|
1
|
+
{"version":3,"file":"plato-intefaces.js","sourceRoot":"","sources":["../../../../../libs/plato-sdk/src/lib/plato-intefaces.ts"],"names":[],"mappings":"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"}
|
package/src/lib/plato-sdk.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CallDTO, CreateSimulationDto, CreationPhase, SimulationRecordingsDto, SimulationRecordingsQueryDto,
|
|
1
|
+
import { CallDTO, CreateSimulationDto, CreationPhase, SimulationRecordingsDto, SimulationRecordingsQueryDto, SimulationDetailsDto, RecommendationsResponseDto, PdfSlidesDto, PdfSlideDto, PdfSlidesAnalysisQueryDto, AssistantImageDto } from './plato-intefaces';
|
|
2
2
|
export interface ApiClientConfig {
|
|
3
3
|
baseUrl: string;
|
|
4
4
|
token?: string;
|
|
@@ -98,5 +98,10 @@ export declare class PlatoApiClient {
|
|
|
98
98
|
off: <K extends CallEventNames>(event: K, listener: CallEventListener<K>) => void;
|
|
99
99
|
}>;
|
|
100
100
|
private createCall;
|
|
101
|
-
uploadPdfSlides(file: File | Blob): Promise<
|
|
101
|
+
uploadPdfSlides(file: File | Blob): Promise<string>;
|
|
102
|
+
getRecommendations(): Promise<RecommendationsResponseDto>;
|
|
103
|
+
getSlidesAnalysis(queryParams: PdfSlidesAnalysisQueryDto): Promise<PdfSlidesDto[]>;
|
|
104
|
+
getSlideAnalysis(id: string): Promise<PdfSlideDto>;
|
|
105
|
+
deleteSlideAnalysis(id: string): Promise<void>;
|
|
106
|
+
getAssistantImages(): Promise<AssistantImageDto[]>;
|
|
102
107
|
}
|
package/src/lib/plato-sdk.js
CHANGED
|
@@ -17,6 +17,8 @@ const tslib_1 = require("tslib");
|
|
|
17
17
|
*/
|
|
18
18
|
const axios_1 = tslib_1.__importDefault(require("axios"));
|
|
19
19
|
const web_1 = tslib_1.__importDefault(require("@vapi-ai/web"));
|
|
20
|
+
const utils_1 = require("./utils");
|
|
21
|
+
const constants_1 = require("./constants");
|
|
20
22
|
class PlatoApiClient {
|
|
21
23
|
config;
|
|
22
24
|
http;
|
|
@@ -247,10 +249,112 @@ class PlatoApiClient {
|
|
|
247
249
|
return response.data;
|
|
248
250
|
}
|
|
249
251
|
async uploadPdfSlides(file) {
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
252
|
+
try {
|
|
253
|
+
const checkResult = (0, utils_1.checkFile)(file, constants_1.MAX_PDF_FILE_SIZE, constants_1.ALLOWED_PDF_MIME_TYPES);
|
|
254
|
+
if (checkResult !== true) {
|
|
255
|
+
throw new Error(checkResult);
|
|
256
|
+
}
|
|
257
|
+
const contentHash = await (0, utils_1.calculateHash)(file);
|
|
258
|
+
const filename = file instanceof File ? file.name : file.filename;
|
|
259
|
+
if (!filename) {
|
|
260
|
+
throw new Error('Invalid input: could not extract filename from the provided file or blob.');
|
|
261
|
+
}
|
|
262
|
+
if (/[^a-zA-Z0-9._ -]/.test(filename)) {
|
|
263
|
+
throw new Error('Filename contains invalid characters. Only English letters, numbers, dots, hyphens, and underscores are allowed.');
|
|
264
|
+
}
|
|
265
|
+
const { presignedPost } = (await this.http.post('/api/v1/pdfSlides/request-upload', {
|
|
266
|
+
contentHash,
|
|
267
|
+
filename,
|
|
268
|
+
})).data;
|
|
269
|
+
const formData = new FormData();
|
|
270
|
+
Object.entries(presignedPost.fields).forEach(([key, value]) => {
|
|
271
|
+
formData.append(key, value);
|
|
272
|
+
});
|
|
273
|
+
formData.append('file', file);
|
|
274
|
+
await axios_1.default.post(presignedPost.url, formData, {
|
|
275
|
+
headers: {
|
|
276
|
+
'Content-Type': 'multipart/form-data',
|
|
277
|
+
},
|
|
278
|
+
});
|
|
279
|
+
/*
|
|
280
|
+
// replace const { presignedPost } with const { presignedPost, objectKey }
|
|
281
|
+
// Uncomment this block if you are testing locally without AWS EventBridge
|
|
282
|
+
await this.http.post('/api/v1/pdfSlides/test-event-bridge', {
|
|
283
|
+
s3Name: objectKey,
|
|
284
|
+
});
|
|
285
|
+
*/
|
|
286
|
+
return 'PDF upload successful';
|
|
287
|
+
}
|
|
288
|
+
catch (e) {
|
|
289
|
+
if (axios_1.default.isAxiosError(e)) {
|
|
290
|
+
console.error('Error uploading PDF slides:', e.response?.data?.message || e.message);
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
console.error('Error uploading PDF slides:', e instanceof Error ? e.message : 'Unknown error');
|
|
294
|
+
}
|
|
295
|
+
throw e;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
async getRecommendations() {
|
|
299
|
+
try {
|
|
300
|
+
const res = await this.http.get('/api/v1/recommendations');
|
|
301
|
+
return res.data;
|
|
302
|
+
}
|
|
303
|
+
catch (e) {
|
|
304
|
+
if (axios_1.default.isAxiosError(e)) {
|
|
305
|
+
console.error('Error getting recommendations:', e.response?.data.message);
|
|
306
|
+
}
|
|
307
|
+
throw e;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
async getSlidesAnalysis(queryParams) {
|
|
311
|
+
try {
|
|
312
|
+
const res = await this.http.get('/api/v1/pdfSlides', {
|
|
313
|
+
params: queryParams,
|
|
314
|
+
});
|
|
315
|
+
return res.data;
|
|
316
|
+
}
|
|
317
|
+
catch (e) {
|
|
318
|
+
if (axios_1.default.isAxiosError(e)) {
|
|
319
|
+
console.error('Error getting PDF slides analysis:', e.response?.data.message);
|
|
320
|
+
}
|
|
321
|
+
throw e;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
async getSlideAnalysis(id) {
|
|
325
|
+
try {
|
|
326
|
+
const res = await this.http.get(`/api/v1/pdfSlides/${id}`);
|
|
327
|
+
return res.data;
|
|
328
|
+
}
|
|
329
|
+
catch (e) {
|
|
330
|
+
if (axios_1.default.isAxiosError(e)) {
|
|
331
|
+
console.error('Error getting PDF slide analysis by ID:', e.response?.data.message);
|
|
332
|
+
}
|
|
333
|
+
throw e;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
async deleteSlideAnalysis(id) {
|
|
337
|
+
try {
|
|
338
|
+
await this.http.delete(`/api/v1/pdfSlides/${id}`);
|
|
339
|
+
}
|
|
340
|
+
catch (e) {
|
|
341
|
+
if (axios_1.default.isAxiosError(e)) {
|
|
342
|
+
console.error('Error deleting PDF slide analysis:', e.response?.data.message);
|
|
343
|
+
}
|
|
344
|
+
throw e;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
async getAssistantImages() {
|
|
348
|
+
try {
|
|
349
|
+
const res = await this.http.get('/api/v1/assistant-images');
|
|
350
|
+
return res.data;
|
|
351
|
+
}
|
|
352
|
+
catch (e) {
|
|
353
|
+
if (axios_1.default.isAxiosError(e)) {
|
|
354
|
+
console.error('Error getting assistant images:', e.response?.data.message);
|
|
355
|
+
}
|
|
356
|
+
throw e;
|
|
357
|
+
}
|
|
254
358
|
}
|
|
255
359
|
}
|
|
256
360
|
exports.PlatoApiClient = PlatoApiClient;
|
package/src/lib/plato-sdk.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plato-sdk.js","sourceRoot":"","sources":["../../../../../libs/plato-sdk/src/lib/plato-sdk.ts"],"names":[],"mappings":";;;;AAAA;;;;;;;;;;;;GAYG;AACH,0DAA6C;
|
|
1
|
+
{"version":3,"file":"plato-sdk.js","sourceRoot":"","sources":["../../../../../libs/plato-sdk/src/lib/plato-sdk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 ctcHealth. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* This file is part of the ctcHealth Plato Platform, a proprietary software system developed by ctcHealth.
|
|
5
|
+
*
|
|
6
|
+
* This source code and all related materials are confidential and proprietary to ctcHealth.
|
|
7
|
+
* Unauthorized access, use, copying, modification, distribution, or disclosure is strictly prohibited
|
|
8
|
+
* and may result in disciplinary action and civil and/or criminal penalties.
|
|
9
|
+
*
|
|
10
|
+
* This software is intended solely for authorized use within ctcHealth and its designated partners.
|
|
11
|
+
*
|
|
12
|
+
* For internal use only.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Validates a file against size and type constraints.
|
|
16
|
+
*
|
|
17
|
+
* @param file - The file to check.
|
|
18
|
+
* @param maxFileSize - The maximum allowed file size in bytes.
|
|
19
|
+
* @param allowedMimeTypes - An array of allowed MIME types.
|
|
20
|
+
* @returns true if valid, or a descriptive error message if invalid.
|
|
21
|
+
*/
|
|
22
|
+
export declare function checkFile(file: File | Blob, maxFileSize: number, allowedMimeTypes: string[]): true | string;
|
|
23
|
+
/**
|
|
24
|
+
* Calculates the SHA-256 hash of a file or blob.
|
|
25
|
+
*
|
|
26
|
+
* @param file - The file or blob to hash.
|
|
27
|
+
* @returns A promise that resolves to the hexadecimal SHA-256 hash.
|
|
28
|
+
*/
|
|
29
|
+
export declare function calculateHash(file: File | Blob): Promise<string>;
|
package/src/lib/utils.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.checkFile = checkFile;
|
|
4
|
+
exports.calculateHash = calculateHash;
|
|
5
|
+
/**
|
|
6
|
+
* Copyright (c) 2025 ctcHealth. All rights reserved.
|
|
7
|
+
*
|
|
8
|
+
* This file is part of the ctcHealth Plato Platform, a proprietary software system developed by ctcHealth.
|
|
9
|
+
*
|
|
10
|
+
* This source code and all related materials are confidential and proprietary to ctcHealth.
|
|
11
|
+
* Unauthorized access, use, copying, modification, distribution, or disclosure is strictly prohibited
|
|
12
|
+
* and may result in disciplinary action and civil and/or criminal penalties.
|
|
13
|
+
*
|
|
14
|
+
* This software is intended solely for authorized use within ctcHealth and its designated partners.
|
|
15
|
+
*
|
|
16
|
+
* For internal use only.
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Validates a file against size and type constraints.
|
|
20
|
+
*
|
|
21
|
+
* @param file - The file to check.
|
|
22
|
+
* @param maxFileSize - The maximum allowed file size in bytes.
|
|
23
|
+
* @param allowedMimeTypes - An array of allowed MIME types.
|
|
24
|
+
* @returns true if valid, or a descriptive error message if invalid.
|
|
25
|
+
*/
|
|
26
|
+
function checkFile(file, maxFileSize, allowedMimeTypes) {
|
|
27
|
+
if (file.size > maxFileSize) {
|
|
28
|
+
const uploadedSizeMB = (file.size / (1024 * 1024)).toFixed(2);
|
|
29
|
+
const maxSizeMB = (maxFileSize / (1024 * 1024)).toFixed(2);
|
|
30
|
+
return `File size (${uploadedSizeMB} MB) exceeds the maximum allowed size of ${maxSizeMB} MB.`;
|
|
31
|
+
}
|
|
32
|
+
if (!allowedMimeTypes.includes(file.type)) {
|
|
33
|
+
return `Invalid file type: ${file.type}. Allowed types are: ${allowedMimeTypes.join(', ')}.`;
|
|
34
|
+
}
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Calculates the SHA-256 hash of a file or blob.
|
|
39
|
+
*
|
|
40
|
+
* @param file - The file or blob to hash.
|
|
41
|
+
* @returns A promise that resolves to the hexadecimal SHA-256 hash.
|
|
42
|
+
*/
|
|
43
|
+
async function calculateHash(file) {
|
|
44
|
+
const arrayBuffer = await file.arrayBuffer();
|
|
45
|
+
const hashBuffer = await crypto.subtle.digest('SHA-256', arrayBuffer);
|
|
46
|
+
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
|
47
|
+
const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
|
|
48
|
+
return hashHex;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../libs/plato-sdk/src/lib/utils.ts"],"names":[],"mappings":";;AAqBA,8BAgBC;AAQD,sCAMC;AAnDD;;;;;;;;;;;;GAYG;AACH;;;;;;;GAOG;AACH,SAAgB,SAAS,CACvB,IAAiB,EACjB,WAAmB,EACnB,gBAA0B;IAE1B,IAAI,IAAI,CAAC,IAAI,GAAG,WAAW,EAAE,CAAC;QAC5B,MAAM,cAAc,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC9D,MAAM,SAAS,GAAG,CAAC,WAAW,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3D,OAAO,cAAc,cAAc,4CAA4C,SAAS,MAAM,CAAC;IACjG,CAAC;IAED,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,OAAO,sBAAsB,IAAI,CAAC,IAAI,wBAAwB,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IAC/F,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,aAAa,CAAC,IAAiB;IACnD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;IAC7C,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7E,OAAO,OAAO,CAAC;AACjB,CAAC"}
|