@contractspec/integration.providers-impls 1.57.0 → 1.58.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analytics.d.ts +1 -8
- package/dist/analytics.d.ts.map +1 -1
- package/dist/analytics.js +3 -3
- package/dist/calendar.d.ts +1 -8
- package/dist/calendar.d.ts.map +1 -1
- package/dist/calendar.js +3 -3
- package/dist/database.d.ts +1 -8
- package/dist/database.d.ts.map +1 -1
- package/dist/database.js +3 -3
- package/dist/email.d.ts +1 -8
- package/dist/email.d.ts.map +1 -1
- package/dist/email.js +3 -3
- package/dist/embedding.d.ts +1 -8
- package/dist/embedding.d.ts.map +1 -1
- package/dist/embedding.js +3 -3
- package/dist/impls/elevenlabs-voice.d.ts +14 -18
- package/dist/impls/elevenlabs-voice.d.ts.map +1 -1
- package/dist/impls/elevenlabs-voice.js +98 -88
- package/dist/impls/fal-voice.d.ts +22 -26
- package/dist/impls/fal-voice.d.ts.map +1 -1
- package/dist/impls/fal-voice.js +103 -78
- package/dist/impls/fathom-meeting-recorder.d.ts +35 -39
- package/dist/impls/fathom-meeting-recorder.d.ts.map +1 -1
- package/dist/impls/fathom-meeting-recorder.js +285 -142
- package/dist/impls/fathom-meeting-recorder.mapper.d.ts +4 -8
- package/dist/impls/fathom-meeting-recorder.mapper.d.ts.map +1 -1
- package/dist/impls/fathom-meeting-recorder.mapper.js +102 -38
- package/dist/impls/fathom-meeting-recorder.types.d.ts +16 -20
- package/dist/impls/fathom-meeting-recorder.types.d.ts.map +1 -1
- package/dist/impls/fathom-meeting-recorder.types.js +1 -0
- package/dist/impls/fathom-meeting-recorder.utils.d.ts +10 -14
- package/dist/impls/fathom-meeting-recorder.utils.d.ts.map +1 -1
- package/dist/impls/fathom-meeting-recorder.utils.js +58 -41
- package/dist/impls/fathom-meeting-recorder.webhooks.d.ts +3 -7
- package/dist/impls/fathom-meeting-recorder.webhooks.d.ts.map +1 -1
- package/dist/impls/fathom-meeting-recorder.webhooks.js +25 -20
- package/dist/impls/fireflies-meeting-recorder.d.ts +21 -25
- package/dist/impls/fireflies-meeting-recorder.d.ts.map +1 -1
- package/dist/impls/fireflies-meeting-recorder.js +272 -149
- package/dist/impls/fireflies-meeting-recorder.queries.d.ts +3 -6
- package/dist/impls/fireflies-meeting-recorder.queries.d.ts.map +1 -1
- package/dist/impls/fireflies-meeting-recorder.queries.js +10 -8
- package/dist/impls/fireflies-meeting-recorder.types.d.ts +26 -29
- package/dist/impls/fireflies-meeting-recorder.types.d.ts.map +1 -1
- package/dist/impls/fireflies-meeting-recorder.types.js +1 -0
- package/dist/impls/fireflies-meeting-recorder.utils.d.ts +4 -7
- package/dist/impls/fireflies-meeting-recorder.utils.d.ts.map +1 -1
- package/dist/impls/fireflies-meeting-recorder.utils.js +34 -27
- package/dist/impls/gcs-storage.d.ts +18 -22
- package/dist/impls/gcs-storage.d.ts.map +1 -1
- package/dist/impls/gcs-storage.js +92 -84
- package/dist/impls/gmail-inbound.d.ts +20 -24
- package/dist/impls/gmail-inbound.d.ts.map +1 -1
- package/dist/impls/gmail-inbound.js +212 -185
- package/dist/impls/gmail-outbound.d.ts +12 -16
- package/dist/impls/gmail-outbound.d.ts.map +1 -1
- package/dist/impls/gmail-outbound.js +126 -92
- package/dist/impls/google-calendar.d.ts +17 -21
- package/dist/impls/google-calendar.d.ts.map +1 -1
- package/dist/impls/google-calendar.js +182 -145
- package/dist/impls/gradium-voice.d.ts +20 -22
- package/dist/impls/gradium-voice.d.ts.map +1 -1
- package/dist/impls/gradium-voice.js +85 -74
- package/dist/impls/granola-meeting-recorder.d.ts +31 -24
- package/dist/impls/granola-meeting-recorder.d.ts.map +1 -1
- package/dist/impls/granola-meeting-recorder.js +511 -143
- package/dist/impls/granola-meeting-recorder.mcp.d.ts +25 -0
- package/dist/impls/granola-meeting-recorder.mcp.d.ts.map +1 -0
- package/dist/impls/granola-meeting-recorder.mcp.js +279 -0
- package/dist/impls/granola-meeting-recorder.types.d.ts +60 -49
- package/dist/impls/granola-meeting-recorder.types.d.ts.map +1 -1
- package/dist/impls/granola-meeting-recorder.types.js +1 -0
- package/dist/impls/index.d.ts +28 -28
- package/dist/impls/index.d.ts.map +1 -0
- package/dist/impls/index.js +4659 -29
- package/dist/impls/jira.d.ts +18 -22
- package/dist/impls/jira.d.ts.map +1 -1
- package/dist/impls/jira.js +112 -101
- package/dist/impls/linear.d.ts +17 -21
- package/dist/impls/linear.d.ts.map +1 -1
- package/dist/impls/linear.js +78 -69
- package/dist/impls/mistral-embedding.d.ts +17 -21
- package/dist/impls/mistral-embedding.d.ts.map +1 -1
- package/dist/impls/mistral-embedding.js +41 -39
- package/dist/impls/mistral-llm.d.ts +25 -29
- package/dist/impls/mistral-llm.d.ts.map +1 -1
- package/dist/impls/mistral-llm.js +266 -244
- package/dist/impls/notion.d.ts +20 -24
- package/dist/impls/notion.d.ts.map +1 -1
- package/dist/impls/notion.js +145 -110
- package/dist/impls/posthog-reader.d.ts +18 -22
- package/dist/impls/posthog-reader.d.ts.map +1 -1
- package/dist/impls/posthog-reader.js +148 -129
- package/dist/impls/posthog-utils.d.ts +4 -7
- package/dist/impls/posthog-utils.d.ts.map +1 -1
- package/dist/impls/posthog-utils.js +31 -22
- package/dist/impls/posthog.d.ts +33 -37
- package/dist/impls/posthog.d.ts.map +1 -1
- package/dist/impls/posthog.js +320 -119
- package/dist/impls/postmark-email.d.ts +13 -17
- package/dist/impls/postmark-email.d.ts.map +1 -1
- package/dist/impls/postmark-email.js +55 -50
- package/dist/impls/powens-client.d.ts +111 -114
- package/dist/impls/powens-client.d.ts.map +1 -1
- package/dist/impls/powens-client.js +194 -170
- package/dist/impls/powens-openbanking.d.ts +22 -26
- package/dist/impls/powens-openbanking.d.ts.map +1 -1
- package/dist/impls/powens-openbanking.js +425 -217
- package/dist/impls/provider-factory.d.ts +29 -33
- package/dist/impls/provider-factory.d.ts.map +1 -1
- package/dist/impls/provider-factory.js +4072 -275
- package/dist/impls/qdrant-vector.d.ts +18 -22
- package/dist/impls/qdrant-vector.d.ts.map +1 -1
- package/dist/impls/qdrant-vector.js +76 -69
- package/dist/impls/stripe-payments.d.ts +22 -26
- package/dist/impls/stripe-payments.d.ts.map +1 -1
- package/dist/impls/stripe-payments.js +219 -193
- package/dist/impls/supabase-psql.d.ts +21 -25
- package/dist/impls/supabase-psql.d.ts.map +1 -1
- package/dist/impls/supabase-psql.js +138 -98
- package/dist/impls/supabase-vector.d.ts +29 -33
- package/dist/impls/supabase-vector.d.ts.map +1 -1
- package/dist/impls/supabase-vector.js +278 -103
- package/dist/impls/tldv-meeting-recorder.d.ts +18 -22
- package/dist/impls/tldv-meeting-recorder.d.ts.map +1 -1
- package/dist/impls/tldv-meeting-recorder.js +142 -127
- package/dist/impls/twilio-sms.d.ts +14 -17
- package/dist/impls/twilio-sms.d.ts.map +1 -1
- package/dist/impls/twilio-sms.js +62 -55
- package/dist/index.d.ts +15 -64
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4700 -107
- package/dist/llm.d.ts +1 -8
- package/dist/llm.d.ts.map +1 -1
- package/dist/llm.js +3 -3
- package/dist/meeting-recorder.d.ts +1 -8
- package/dist/meeting-recorder.d.ts.map +1 -1
- package/dist/meeting-recorder.js +3 -3
- package/dist/node/analytics.js +2 -0
- package/dist/node/calendar.js +2 -0
- package/dist/node/database.js +2 -0
- package/dist/node/email.js +2 -0
- package/dist/node/embedding.js +2 -0
- package/dist/node/impls/elevenlabs-voice.js +102 -0
- package/dist/node/impls/fal-voice.js +112 -0
- package/dist/node/impls/fathom-meeting-recorder.js +287 -0
- package/dist/node/impls/fathom-meeting-recorder.mapper.js +105 -0
- package/dist/node/impls/fathom-meeting-recorder.types.js +0 -0
- package/dist/node/impls/fathom-meeting-recorder.utils.js +72 -0
- package/dist/node/impls/fathom-meeting-recorder.webhooks.js +29 -0
- package/dist/node/impls/fireflies-meeting-recorder.js +274 -0
- package/dist/node/impls/fireflies-meeting-recorder.queries.js +85 -0
- package/dist/node/impls/fireflies-meeting-recorder.types.js +0 -0
- package/dist/node/impls/fireflies-meeting-recorder.utils.js +42 -0
- package/dist/node/impls/gcs-storage.js +97 -0
- package/dist/node/impls/gmail-inbound.js +227 -0
- package/dist/node/impls/gmail-outbound.js +139 -0
- package/dist/node/impls/google-calendar.js +191 -0
- package/dist/node/impls/gradium-voice.js +90 -0
- package/dist/node/impls/granola-meeting-recorder.js +512 -0
- package/dist/node/impls/granola-meeting-recorder.mcp.js +278 -0
- package/dist/node/impls/granola-meeting-recorder.types.js +0 -0
- package/dist/node/impls/index.js +4658 -0
- package/dist/node/impls/jira.js +124 -0
- package/dist/node/impls/linear.js +83 -0
- package/dist/node/impls/mistral-embedding.js +43 -0
- package/dist/node/impls/mistral-llm.js +269 -0
- package/dist/node/impls/notion.js +160 -0
- package/dist/node/impls/posthog-reader.js +159 -0
- package/dist/node/impls/posthog-utils.js +38 -0
- package/dist/node/impls/posthog.js +322 -0
- package/dist/node/impls/postmark-email.js +60 -0
- package/dist/node/impls/powens-client.js +195 -0
- package/dist/node/impls/powens-openbanking.js +426 -0
- package/dist/node/impls/provider-factory.js +4080 -0
- package/dist/node/impls/qdrant-vector.js +78 -0
- package/dist/node/impls/stripe-payments.js +228 -0
- package/dist/node/impls/supabase-psql.js +150 -0
- package/dist/node/impls/supabase-vector.js +323 -0
- package/dist/node/impls/tldv-meeting-recorder.js +145 -0
- package/dist/node/impls/twilio-sms.js +65 -0
- package/dist/node/index.js +4699 -0
- package/dist/node/llm.js +2 -0
- package/dist/node/meeting-recorder.js +2 -0
- package/dist/node/openbanking.js +2 -0
- package/dist/node/payments.js +2 -0
- package/dist/node/project-management.js +2 -0
- package/dist/node/runtime.js +0 -0
- package/dist/node/secrets/provider.js +11 -0
- package/dist/node/sms.js +2 -0
- package/dist/node/storage.js +2 -0
- package/dist/node/vector-store.js +2 -0
- package/dist/node/voice.js +2 -0
- package/dist/openbanking.d.ts +1 -8
- package/dist/openbanking.d.ts.map +1 -1
- package/dist/openbanking.js +3 -3
- package/dist/payments.d.ts +1 -8
- package/dist/payments.d.ts.map +1 -1
- package/dist/payments.js +3 -3
- package/dist/project-management.d.ts +1 -8
- package/dist/project-management.d.ts.map +1 -1
- package/dist/project-management.js +3 -3
- package/dist/runtime.d.ts +2 -2
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +1 -0
- package/dist/secrets/provider.d.ts +3 -2
- package/dist/secrets/provider.d.ts.map +1 -0
- package/dist/secrets/provider.js +12 -3
- package/dist/sms.d.ts +1 -8
- package/dist/sms.d.ts.map +1 -1
- package/dist/sms.js +3 -3
- package/dist/storage.d.ts +1 -8
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +3 -3
- package/dist/vector-store.d.ts +1 -8
- package/dist/vector-store.d.ts.map +1 -1
- package/dist/vector-store.js +3 -3
- package/dist/voice.d.ts +1 -8
- package/dist/voice.d.ts.map +1 -1
- package/dist/voice.js +3 -3
- package/package.json +405 -114
- package/dist/_virtual/_rolldown/runtime.js +0 -36
- package/dist/impls/elevenlabs-voice.js.map +0 -1
- package/dist/impls/fal-voice.js.map +0 -1
- package/dist/impls/fathom-meeting-recorder.js.map +0 -1
- package/dist/impls/fathom-meeting-recorder.mapper.js.map +0 -1
- package/dist/impls/fathom-meeting-recorder.utils.js.map +0 -1
- package/dist/impls/fathom-meeting-recorder.webhooks.js.map +0 -1
- package/dist/impls/fireflies-meeting-recorder.js.map +0 -1
- package/dist/impls/fireflies-meeting-recorder.queries.js.map +0 -1
- package/dist/impls/fireflies-meeting-recorder.utils.js.map +0 -1
- package/dist/impls/gcs-storage.js.map +0 -1
- package/dist/impls/gmail-inbound.js.map +0 -1
- package/dist/impls/gmail-outbound.js.map +0 -1
- package/dist/impls/google-calendar.js.map +0 -1
- package/dist/impls/gradium-voice.js.map +0 -1
- package/dist/impls/granola-meeting-recorder.js.map +0 -1
- package/dist/impls/jira.js.map +0 -1
- package/dist/impls/linear.js.map +0 -1
- package/dist/impls/mistral-embedding.js.map +0 -1
- package/dist/impls/mistral-llm.js.map +0 -1
- package/dist/impls/notion.js.map +0 -1
- package/dist/impls/posthog-reader.js.map +0 -1
- package/dist/impls/posthog-utils.js.map +0 -1
- package/dist/impls/posthog.js.map +0 -1
- package/dist/impls/postmark-email.js.map +0 -1
- package/dist/impls/powens-client.js.map +0 -1
- package/dist/impls/powens-openbanking.js.map +0 -1
- package/dist/impls/provider-factory.js.map +0 -1
- package/dist/impls/qdrant-vector.js.map +0 -1
- package/dist/impls/stripe-payments.js.map +0 -1
- package/dist/impls/supabase-psql.js.map +0 -1
- package/dist/impls/supabase-vector.js.map +0 -1
- package/dist/impls/tldv-meeting-recorder.js.map +0 -1
- package/dist/impls/twilio-sms.js.map +0 -1
- package/dist/index.js.map +0 -1
|
@@ -1,42 +1,38 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
maxPages?: number;
|
|
15
|
-
client?: Fathom;
|
|
1
|
+
import { Fathom } from 'fathom-typescript';
|
|
2
|
+
import type { MeetingRecord, MeetingRecorderGetMeetingParams, MeetingRecorderGetTranscriptParams, MeetingRecorderListMeetingsParams, MeetingRecorderListMeetingsResult, MeetingRecorderProvider, MeetingRecorderWebhookEvent, MeetingRecorderWebhookRegistration, MeetingRecorderWebhookRequest, MeetingTranscriptRecord } from '../meeting-recorder';
|
|
3
|
+
export interface FathomMeetingRecorderProviderOptions {
|
|
4
|
+
apiKey: string;
|
|
5
|
+
baseUrl?: string;
|
|
6
|
+
includeTranscript?: boolean;
|
|
7
|
+
includeSummary?: boolean;
|
|
8
|
+
includeActionItems?: boolean;
|
|
9
|
+
includeCrmMatches?: boolean;
|
|
10
|
+
triggeredFor?: string[];
|
|
11
|
+
webhookSecret?: string;
|
|
12
|
+
maxPages?: number;
|
|
13
|
+
client?: Fathom;
|
|
16
14
|
}
|
|
17
|
-
declare class FathomMeetingRecorderProvider implements
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
15
|
+
export declare class FathomMeetingRecorderProvider implements MeetingRecorderProvider {
|
|
16
|
+
private readonly client;
|
|
17
|
+
private readonly apiKey;
|
|
18
|
+
private readonly baseUrl;
|
|
19
|
+
private readonly includeTranscript;
|
|
20
|
+
private readonly includeSummary;
|
|
21
|
+
private readonly includeActionItems;
|
|
22
|
+
private readonly includeCrmMatches;
|
|
23
|
+
private readonly triggeredFor?;
|
|
24
|
+
private readonly webhookSecret?;
|
|
25
|
+
private readonly maxPages;
|
|
26
|
+
constructor(options: FathomMeetingRecorderProviderOptions);
|
|
27
|
+
listMeetings(params: MeetingRecorderListMeetingsParams): Promise<MeetingRecorderListMeetingsResult>;
|
|
28
|
+
getMeeting(params: MeetingRecorderGetMeetingParams): Promise<MeetingRecord>;
|
|
29
|
+
getTranscript(params: MeetingRecorderGetTranscriptParams): Promise<MeetingTranscriptRecord>;
|
|
30
|
+
parseWebhook(request: MeetingRecorderWebhookRequest): Promise<MeetingRecorderWebhookEvent>;
|
|
31
|
+
verifyWebhook(request: MeetingRecorderWebhookRequest): Promise<boolean>;
|
|
32
|
+
registerWebhook(registration: MeetingRecorderWebhookRegistration): Promise<{
|
|
33
|
+
id: string;
|
|
34
|
+
secret?: string;
|
|
35
|
+
}>;
|
|
36
|
+
private request;
|
|
39
37
|
}
|
|
40
|
-
//#endregion
|
|
41
|
-
export { FathomMeetingRecorderProvider, FathomMeetingRecorderProviderOptions };
|
|
42
38
|
//# sourceMappingURL=fathom-meeting-recorder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fathom-meeting-recorder.d.ts","
|
|
1
|
+
{"version":3,"file":"fathom-meeting-recorder.d.ts","sourceRoot":"","sources":["../../src/impls/fathom-meeting-recorder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAG3C,OAAO,KAAK,EACV,aAAa,EACb,+BAA+B,EAC/B,kCAAkC,EAClC,iCAAiC,EACjC,iCAAiC,EACjC,uBAAuB,EACvB,2BAA2B,EAC3B,kCAAkC,EAClC,6BAA6B,EAC7B,uBAAuB,EACxB,MAAM,qBAAqB,CAAC;AAkB7B,MAAM,WAAW,oCAAoC;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAID,qBAAa,6BAA8B,YAAW,uBAAuB;IAC3E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAU;IAC5C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;IACzC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAU;IAC7C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAU;IAC5C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAW;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,OAAO,EAAE,oCAAoC;IAoBnD,YAAY,CAChB,MAAM,EAAE,iCAAiC,GACxC,OAAO,CAAC,iCAAiC,CAAC;IA8BvC,UAAU,CACd,MAAM,EAAE,+BAA+B,GACtC,OAAO,CAAC,aAAa,CAAC;IAwBnB,aAAa,CACjB,MAAM,EAAE,kCAAkC,GACzC,OAAO,CAAC,uBAAuB,CAAC;IA0B7B,YAAY,CAChB,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,2BAA2B,CAAC;IAuBjC,aAAa,CACjB,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,OAAO,CAAC;IAYb,eAAe,CACnB,YAAY,EAAE,kCAAkC,GAC/C,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;YAiB7B,OAAO;CAatB"}
|
|
@@ -1,145 +1,288 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
// @bun
|
|
2
|
+
// src/impls/fathom-meeting-recorder.utils.ts
|
|
3
|
+
function extractItems(page) {
|
|
4
|
+
if (Array.isArray(page.items))
|
|
5
|
+
return page.items;
|
|
6
|
+
if (Array.isArray(page.data)) {
|
|
7
|
+
return page.data;
|
|
8
|
+
}
|
|
9
|
+
return [];
|
|
10
|
+
}
|
|
11
|
+
function extractNextCursor(page) {
|
|
12
|
+
return page.nextCursor ?? page.next_cursor ?? undefined;
|
|
13
|
+
}
|
|
14
|
+
function mapInvitee(invitee) {
|
|
15
|
+
const email = invitee.email;
|
|
16
|
+
const name = invitee.name;
|
|
17
|
+
if (!email && !name)
|
|
18
|
+
return;
|
|
19
|
+
return {
|
|
20
|
+
email,
|
|
21
|
+
name,
|
|
22
|
+
role: "attendee",
|
|
23
|
+
isExternal: invitee.is_external
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function matchRecordingId(meeting, targetId) {
|
|
27
|
+
return meeting.recordingId === targetId;
|
|
28
|
+
}
|
|
29
|
+
function durationSeconds(start, end) {
|
|
30
|
+
if (!start || !end)
|
|
31
|
+
return;
|
|
32
|
+
const startDate = start instanceof Date ? start : new Date(start);
|
|
33
|
+
const endDate = end instanceof Date ? end : new Date(end);
|
|
34
|
+
if (Number.isNaN(startDate.valueOf()) || Number.isNaN(endDate.valueOf())) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
return Math.max(0, (endDate.valueOf() - startDate.valueOf()) / 1000);
|
|
38
|
+
}
|
|
39
|
+
function mapTranscriptSegment(segment, index) {
|
|
40
|
+
return {
|
|
41
|
+
index,
|
|
42
|
+
speakerName: segment.speaker?.display_name ?? undefined,
|
|
43
|
+
speakerEmail: segment.speaker?.matched_calendar_invitee_email ?? undefined,
|
|
44
|
+
text: segment.text,
|
|
45
|
+
startTimeMs: parseTimestamp(segment.timestamp)
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function parseTimestamp(value) {
|
|
49
|
+
const parts = value.split(":").map((part) => Number(part));
|
|
50
|
+
if (parts.length !== 3 || parts.some((part) => Number.isNaN(part))) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const [hours = 0, minutes = 0, seconds = 0] = parts;
|
|
54
|
+
return (hours * 3600 + minutes * 60 + seconds) * 1000;
|
|
55
|
+
}
|
|
56
|
+
async function safeReadError(response) {
|
|
57
|
+
try {
|
|
58
|
+
const data = await response.json();
|
|
59
|
+
return data?.message ?? response.statusText;
|
|
60
|
+
} catch {
|
|
61
|
+
return response.statusText;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
6
64
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
includeSummary;
|
|
15
|
-
includeActionItems;
|
|
16
|
-
includeCrmMatches;
|
|
17
|
-
triggeredFor;
|
|
18
|
-
webhookSecret;
|
|
19
|
-
maxPages;
|
|
20
|
-
constructor(options) {
|
|
21
|
-
this.apiKey = options.apiKey;
|
|
22
|
-
this.baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;
|
|
23
|
-
this.includeTranscript = options.includeTranscript ?? false;
|
|
24
|
-
this.includeSummary = options.includeSummary ?? false;
|
|
25
|
-
this.includeActionItems = options.includeActionItems ?? false;
|
|
26
|
-
this.includeCrmMatches = options.includeCrmMatches ?? false;
|
|
27
|
-
this.triggeredFor = options.triggeredFor;
|
|
28
|
-
this.webhookSecret = options.webhookSecret;
|
|
29
|
-
this.maxPages = options.maxPages ?? 5;
|
|
30
|
-
this.client = options.client ?? new Fathom({
|
|
31
|
-
serverURL: this.baseUrl,
|
|
32
|
-
security: { apiKeyAuth: this.apiKey }
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
async listMeetings(params) {
|
|
36
|
-
const request = {
|
|
37
|
-
cursor: params.cursor,
|
|
38
|
-
createdAfter: params.from,
|
|
39
|
-
createdBefore: params.to,
|
|
40
|
-
includeTranscript: params.includeTranscript ?? this.includeTranscript,
|
|
41
|
-
includeSummary: params.includeSummary ?? this.includeSummary,
|
|
42
|
-
includeActionItems: this.includeActionItems,
|
|
43
|
-
includeCrmMatches: this.includeCrmMatches
|
|
44
|
-
};
|
|
45
|
-
const result = await this.client.listMeetings(request);
|
|
46
|
-
let firstPage;
|
|
47
|
-
for await (const page of result) {
|
|
48
|
-
firstPage = page;
|
|
49
|
-
break;
|
|
50
|
-
}
|
|
51
|
-
if (!firstPage) return { meetings: [] };
|
|
52
|
-
return {
|
|
53
|
-
meetings: extractItems(firstPage).map((meeting) => mapFathomMeeting(meeting, params)),
|
|
54
|
-
nextCursor: extractNextCursor(firstPage) ?? void 0,
|
|
55
|
-
hasMore: Boolean(extractNextCursor(firstPage))
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
async getMeeting(params) {
|
|
59
|
-
const result = await this.client.listMeetings({
|
|
60
|
-
includeTranscript: params.includeTranscript ?? this.includeTranscript,
|
|
61
|
-
includeSummary: params.includeSummary ?? this.includeSummary,
|
|
62
|
-
includeActionItems: this.includeActionItems,
|
|
63
|
-
includeCrmMatches: this.includeCrmMatches
|
|
64
|
-
});
|
|
65
|
-
let pageCount = 0;
|
|
66
|
-
const targetId = Number.parseInt(params.meetingId, 10);
|
|
67
|
-
for await (const page of result) {
|
|
68
|
-
pageCount += 1;
|
|
69
|
-
const match = extractItems(page).find((meeting) => matchRecordingId(meeting, targetId));
|
|
70
|
-
if (match) return mapFathomMeeting(match, params);
|
|
71
|
-
if (pageCount >= this.maxPages) break;
|
|
72
|
-
}
|
|
73
|
-
throw new Error(`Fathom meeting "${targetId}" not found.`);
|
|
74
|
-
}
|
|
75
|
-
async getTranscript(params) {
|
|
76
|
-
const response = await this.request(`/recordings/${encodeURIComponent(params.meetingId)}/transcript`);
|
|
77
|
-
if (!Array.isArray(response.transcript)) throw new Error("Fathom transcript response did not include transcript.");
|
|
78
|
-
const segments = response.transcript.map((segment, index) => mapTranscriptSegment(segment, index));
|
|
79
|
-
return {
|
|
80
|
-
id: params.meetingId,
|
|
81
|
-
meetingId: params.meetingId,
|
|
82
|
-
tenantId: params.tenantId,
|
|
83
|
-
connectionId: params.connectionId ?? "unknown",
|
|
84
|
-
externalId: params.meetingId,
|
|
85
|
-
format: "segments",
|
|
86
|
-
text: segments.map((segment) => segment.text).join("\n"),
|
|
87
|
-
segments,
|
|
88
|
-
metadata: { provider: "fathom" },
|
|
89
|
-
raw: response.transcript
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
async parseWebhook(request) {
|
|
93
|
-
const payload = request.parsedBody ?? JSON.parse(request.rawBody);
|
|
94
|
-
const body = payload;
|
|
95
|
-
const recordingId = body.recording_id ?? body.recordingId ?? body.meeting_id ?? body.meetingId;
|
|
96
|
-
const verified = this.webhookSecret ? await this.verifyWebhook(request) : void 0;
|
|
97
|
-
return {
|
|
98
|
-
providerKey: "meeting-recorder.fathom",
|
|
99
|
-
eventType: body.event_type ?? body.eventType,
|
|
100
|
-
meetingId: recordingId,
|
|
101
|
-
recordingId,
|
|
102
|
-
verified,
|
|
103
|
-
payload
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
async verifyWebhook(request) {
|
|
107
|
-
if (!this.webhookSecret) return true;
|
|
108
|
-
const headers = normalizeWebhookHeaders(request.headers);
|
|
109
|
-
try {
|
|
110
|
-
return Boolean(Fathom.verifyWebhook(this.webhookSecret, headers, request.rawBody));
|
|
111
|
-
} catch {
|
|
112
|
-
return false;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
async registerWebhook(registration) {
|
|
116
|
-
const triggeredFor = normalizeTriggeredFor(registration.triggeredFor) ?? normalizeTriggeredFor(this.triggeredFor) ?? [TriggeredFor.MyRecordings];
|
|
117
|
-
const webhook = await this.client.createWebhook({
|
|
118
|
-
destinationUrl: registration.url,
|
|
119
|
-
includeTranscript: registration.includeTranscript ?? true,
|
|
120
|
-
includeSummary: registration.includeSummary ?? false,
|
|
121
|
-
includeActionItems: registration.includeActionItems ?? false,
|
|
122
|
-
includeCrmMatches: registration.includeCrmMatches ?? false,
|
|
123
|
-
triggeredFor
|
|
124
|
-
});
|
|
125
|
-
return {
|
|
126
|
-
id: webhook.id,
|
|
127
|
-
secret: webhook.secret
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
async request(path) {
|
|
131
|
-
const response = await fetch(`${this.baseUrl}${path}`, { headers: {
|
|
132
|
-
"Content-Type": "application/json",
|
|
133
|
-
"X-Api-Key": this.apiKey
|
|
134
|
-
} });
|
|
135
|
-
if (!response.ok) {
|
|
136
|
-
const message = await safeReadError(response);
|
|
137
|
-
throw new Error(`Fathom API error (${response.status}): ${message}`);
|
|
138
|
-
}
|
|
139
|
-
return await response.json();
|
|
140
|
-
}
|
|
65
|
+
// src/impls/fathom-meeting-recorder.mapper.ts
|
|
66
|
+
var mapFathomMeetingInvites = (invitees) => {
|
|
67
|
+
return invitees.map((invitee) => ({
|
|
68
|
+
...invitee,
|
|
69
|
+
name: invitee.name ?? undefined,
|
|
70
|
+
email: invitee.email ?? undefined
|
|
71
|
+
}));
|
|
141
72
|
};
|
|
73
|
+
function mapFathomMeeting(meeting, params) {
|
|
74
|
+
const connectionId = params.connectionId ?? "unknown";
|
|
75
|
+
return {
|
|
76
|
+
id: meeting.recordingId.toString(),
|
|
77
|
+
tenantId: params.tenantId,
|
|
78
|
+
connectionId,
|
|
79
|
+
externalId: meeting.recordingId.toString(),
|
|
80
|
+
title: meeting.title ?? meeting.meetingTitle,
|
|
81
|
+
organizer: meeting.recordedBy ? {
|
|
82
|
+
name: meeting.recordedBy.name ?? undefined,
|
|
83
|
+
email: meeting.recordedBy.email ?? undefined,
|
|
84
|
+
role: "organizer"
|
|
85
|
+
} : undefined,
|
|
86
|
+
invitees: meeting.calendarInvitees.length ? mapFathomMeetingInvites(meeting.calendarInvitees) : undefined,
|
|
87
|
+
participants: meeting.calendarInvitees.length ? mapFathomMeetingInvites(meeting.calendarInvitees) : undefined,
|
|
88
|
+
scheduledStartAt: meeting.scheduledStartTime?.toISOString(),
|
|
89
|
+
scheduledEndAt: meeting.scheduledEndTime?.toISOString(),
|
|
90
|
+
recordingStartAt: meeting.recordingStartTime?.toISOString(),
|
|
91
|
+
recordingEndAt: meeting.recordingEndTime?.toISOString(),
|
|
92
|
+
durationSeconds: durationSeconds(meeting.recordingStartTime, meeting.recordingEndTime),
|
|
93
|
+
meetingUrl: meeting.url ?? undefined,
|
|
94
|
+
shareUrl: meeting.shareUrl ?? undefined,
|
|
95
|
+
transcriptAvailable: Array.isArray(meeting.transcript),
|
|
96
|
+
sourcePlatform: "fathom",
|
|
97
|
+
language: meeting.transcriptLanguage,
|
|
98
|
+
metadata: {
|
|
99
|
+
calendarInviteesDomainsType: meeting.calendarInviteesDomainsType
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// src/impls/fathom-meeting-recorder.webhooks.ts
|
|
105
|
+
import { TriggeredFor } from "fathom-typescript/sdk/models/operations";
|
|
106
|
+
function normalizeWebhookHeaders(headers) {
|
|
107
|
+
const normalized = {};
|
|
108
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
109
|
+
if (value == null)
|
|
110
|
+
continue;
|
|
111
|
+
const normalizedKey = key.toLowerCase();
|
|
112
|
+
if (Array.isArray(value)) {
|
|
113
|
+
if (value.length === 0)
|
|
114
|
+
continue;
|
|
115
|
+
normalized[normalizedKey] = value.join(", ");
|
|
116
|
+
} else {
|
|
117
|
+
normalized[normalizedKey] = value;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return normalized;
|
|
121
|
+
}
|
|
122
|
+
function normalizeTriggeredFor(values) {
|
|
123
|
+
if (!values)
|
|
124
|
+
return;
|
|
125
|
+
const allowed = new Set(Object.values(TriggeredFor));
|
|
126
|
+
const normalized = values.map((value) => value.trim()).filter((value) => allowed.has(value));
|
|
127
|
+
return normalized.length ? normalized : undefined;
|
|
128
|
+
}
|
|
142
129
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
130
|
+
// src/impls/fathom-meeting-recorder.ts
|
|
131
|
+
import { Fathom } from "fathom-typescript";
|
|
132
|
+
import { TriggeredFor as TriggeredFor2 } from "fathom-typescript/sdk/models/operations";
|
|
133
|
+
var DEFAULT_BASE_URL = "https://api.fathom.ai/external/v1";
|
|
134
|
+
|
|
135
|
+
class FathomMeetingRecorderProvider {
|
|
136
|
+
client;
|
|
137
|
+
apiKey;
|
|
138
|
+
baseUrl;
|
|
139
|
+
includeTranscript;
|
|
140
|
+
includeSummary;
|
|
141
|
+
includeActionItems;
|
|
142
|
+
includeCrmMatches;
|
|
143
|
+
triggeredFor;
|
|
144
|
+
webhookSecret;
|
|
145
|
+
maxPages;
|
|
146
|
+
constructor(options) {
|
|
147
|
+
this.apiKey = options.apiKey;
|
|
148
|
+
this.baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;
|
|
149
|
+
this.includeTranscript = options.includeTranscript ?? false;
|
|
150
|
+
this.includeSummary = options.includeSummary ?? false;
|
|
151
|
+
this.includeActionItems = options.includeActionItems ?? false;
|
|
152
|
+
this.includeCrmMatches = options.includeCrmMatches ?? false;
|
|
153
|
+
this.triggeredFor = options.triggeredFor;
|
|
154
|
+
this.webhookSecret = options.webhookSecret;
|
|
155
|
+
this.maxPages = options.maxPages ?? 5;
|
|
156
|
+
this.client = options.client ?? new Fathom({
|
|
157
|
+
serverURL: this.baseUrl,
|
|
158
|
+
security: {
|
|
159
|
+
apiKeyAuth: this.apiKey
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
async listMeetings(params) {
|
|
164
|
+
const request = {
|
|
165
|
+
cursor: params.cursor,
|
|
166
|
+
createdAfter: params.from,
|
|
167
|
+
createdBefore: params.to,
|
|
168
|
+
includeTranscript: params.includeTranscript ?? this.includeTranscript,
|
|
169
|
+
includeSummary: params.includeSummary ?? this.includeSummary,
|
|
170
|
+
includeActionItems: this.includeActionItems,
|
|
171
|
+
includeCrmMatches: this.includeCrmMatches
|
|
172
|
+
};
|
|
173
|
+
const result = await this.client.listMeetings(request);
|
|
174
|
+
let firstPage;
|
|
175
|
+
for await (const page of result) {
|
|
176
|
+
firstPage = page;
|
|
177
|
+
break;
|
|
178
|
+
}
|
|
179
|
+
if (!firstPage) {
|
|
180
|
+
return { meetings: [] };
|
|
181
|
+
}
|
|
182
|
+
const rawItems = extractItems(firstPage);
|
|
183
|
+
const meetings = rawItems.map((meeting) => mapFathomMeeting(meeting, params));
|
|
184
|
+
return {
|
|
185
|
+
meetings,
|
|
186
|
+
nextCursor: extractNextCursor(firstPage) ?? undefined,
|
|
187
|
+
hasMore: Boolean(extractNextCursor(firstPage))
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
async getMeeting(params) {
|
|
191
|
+
const result = await this.client.listMeetings({
|
|
192
|
+
includeTranscript: params.includeTranscript ?? this.includeTranscript,
|
|
193
|
+
includeSummary: params.includeSummary ?? this.includeSummary,
|
|
194
|
+
includeActionItems: this.includeActionItems,
|
|
195
|
+
includeCrmMatches: this.includeCrmMatches
|
|
196
|
+
});
|
|
197
|
+
let pageCount = 0;
|
|
198
|
+
const targetId = Number.parseInt(params.meetingId, 10);
|
|
199
|
+
for await (const page of result) {
|
|
200
|
+
pageCount += 1;
|
|
201
|
+
const match = extractItems(page).find((meeting) => matchRecordingId(meeting, targetId));
|
|
202
|
+
if (match) {
|
|
203
|
+
return mapFathomMeeting(match, params);
|
|
204
|
+
}
|
|
205
|
+
if (pageCount >= this.maxPages) {
|
|
206
|
+
break;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
throw new Error(`Fathom meeting "${targetId}" not found.`);
|
|
210
|
+
}
|
|
211
|
+
async getTranscript(params) {
|
|
212
|
+
const response = await this.request(`/recordings/${encodeURIComponent(params.meetingId)}/transcript`);
|
|
213
|
+
if (!Array.isArray(response.transcript)) {
|
|
214
|
+
throw new Error("Fathom transcript response did not include transcript.");
|
|
215
|
+
}
|
|
216
|
+
const segments = response.transcript.map((segment, index) => mapTranscriptSegment(segment, index));
|
|
217
|
+
return {
|
|
218
|
+
id: params.meetingId,
|
|
219
|
+
meetingId: params.meetingId,
|
|
220
|
+
tenantId: params.tenantId,
|
|
221
|
+
connectionId: params.connectionId ?? "unknown",
|
|
222
|
+
externalId: params.meetingId,
|
|
223
|
+
format: "segments",
|
|
224
|
+
text: segments.map((segment) => segment.text).join(`
|
|
225
|
+
`),
|
|
226
|
+
segments,
|
|
227
|
+
metadata: {
|
|
228
|
+
provider: "fathom"
|
|
229
|
+
},
|
|
230
|
+
raw: response.transcript
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
async parseWebhook(request) {
|
|
234
|
+
const payload = request.parsedBody ?? JSON.parse(request.rawBody);
|
|
235
|
+
const body = payload;
|
|
236
|
+
const recordingId = body.recording_id ?? body.recordingId ?? body.meeting_id ?? body.meetingId;
|
|
237
|
+
const verified = this.webhookSecret ? await this.verifyWebhook(request) : undefined;
|
|
238
|
+
return {
|
|
239
|
+
providerKey: "meeting-recorder.fathom",
|
|
240
|
+
eventType: body.event_type ?? body.eventType,
|
|
241
|
+
meetingId: recordingId,
|
|
242
|
+
recordingId,
|
|
243
|
+
verified,
|
|
244
|
+
payload
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
async verifyWebhook(request) {
|
|
248
|
+
if (!this.webhookSecret)
|
|
249
|
+
return true;
|
|
250
|
+
const headers = normalizeWebhookHeaders(request.headers);
|
|
251
|
+
try {
|
|
252
|
+
return Boolean(Fathom.verifyWebhook(this.webhookSecret, headers, request.rawBody));
|
|
253
|
+
} catch {
|
|
254
|
+
return false;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
async registerWebhook(registration) {
|
|
258
|
+
const triggeredFor = normalizeTriggeredFor(registration.triggeredFor) ?? normalizeTriggeredFor(this.triggeredFor) ?? [TriggeredFor2.MyRecordings];
|
|
259
|
+
const webhook = await this.client.createWebhook({
|
|
260
|
+
destinationUrl: registration.url,
|
|
261
|
+
includeTranscript: registration.includeTranscript ?? true,
|
|
262
|
+
includeSummary: registration.includeSummary ?? false,
|
|
263
|
+
includeActionItems: registration.includeActionItems ?? false,
|
|
264
|
+
includeCrmMatches: registration.includeCrmMatches ?? false,
|
|
265
|
+
triggeredFor
|
|
266
|
+
});
|
|
267
|
+
return {
|
|
268
|
+
id: webhook.id,
|
|
269
|
+
secret: webhook.secret
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
async request(path) {
|
|
273
|
+
const response = await fetch(`${this.baseUrl}${path}`, {
|
|
274
|
+
headers: {
|
|
275
|
+
"Content-Type": "application/json",
|
|
276
|
+
"X-Api-Key": this.apiKey
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
if (!response.ok) {
|
|
280
|
+
const message = await safeReadError(response);
|
|
281
|
+
throw new Error(`Fathom API error (${response.status}): ${message}`);
|
|
282
|
+
}
|
|
283
|
+
return await response.json();
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
export {
|
|
287
|
+
FathomMeetingRecorderProvider
|
|
288
|
+
};
|
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { FathomMeeting, FathomMeetingInvitee } from
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
declare const mapFathomMeetingInvites: (invitees: FathomMeetingInvitee[]) => meeting_recorder_d_exports.MeetingParticipant[];
|
|
6
|
-
declare function mapFathomMeeting(meeting: FathomMeeting, params: meeting_recorder_d_exports.MeetingRecorderListMeetingsParams | meeting_recorder_d_exports.MeetingRecorderGetMeetingParams): meeting_recorder_d_exports.MeetingRecord;
|
|
7
|
-
//#endregion
|
|
8
|
-
export { mapFathomMeeting, mapFathomMeetingInvites };
|
|
1
|
+
import type { MeetingParticipant, MeetingRecord, MeetingRecorderGetMeetingParams, MeetingRecorderListMeetingsParams } from '../meeting-recorder';
|
|
2
|
+
import type { FathomMeeting, FathomMeetingInvitee } from './fathom-meeting-recorder.types';
|
|
3
|
+
export declare const mapFathomMeetingInvites: (invitees: FathomMeetingInvitee[]) => MeetingParticipant[];
|
|
4
|
+
export declare function mapFathomMeeting(meeting: FathomMeeting, params: MeetingRecorderListMeetingsParams | MeetingRecorderGetMeetingParams): MeetingRecord;
|
|
9
5
|
//# sourceMappingURL=fathom-meeting-recorder.mapper.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fathom-meeting-recorder.mapper.d.ts","
|
|
1
|
+
{"version":3,"file":"fathom-meeting-recorder.mapper.d.ts","sourceRoot":"","sources":["../../src/impls/fathom-meeting-recorder.mapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,aAAa,EACb,+BAA+B,EAC/B,iCAAiC,EAClC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EACV,aAAa,EACb,oBAAoB,EACrB,MAAM,iCAAiC,CAAC;AAGzC,eAAO,MAAM,uBAAuB,GAClC,UAAU,oBAAoB,EAAE,KAC/B,kBAAkB,EAMpB,CAAC;AAEF,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,iCAAiC,GAAG,+BAA+B,GAC1E,aAAa,CAsCf"}
|