@contractspec/example.meeting-recorder-providers 3.7.6 → 3.7.10

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.
@@ -1,121 +1,121 @@
1
1
  import type { IntegrationConnection } from '@contractspec/lib.contracts-integrations';
2
2
 
3
3
  export const granolaMeetingRecorderConnection: IntegrationConnection = {
4
- meta: {
5
- id: 'conn-granola-demo',
6
- tenantId: 'acme-inc',
7
- integrationKey: 'meeting-recorder.granola',
8
- integrationVersion: '1',
9
- label: 'Granola Meeting Recorder',
10
- environment: 'production',
11
- createdAt: '2026-01-01T00:00:00.000Z',
12
- updatedAt: '2026-01-01T00:00:00.000Z',
13
- },
14
- ownershipMode: 'byok',
15
- config: {
16
- transport: 'api',
17
- baseUrl: 'https://public-api.granola.ai',
18
- pageSize: 10,
19
- },
20
- secretProvider: 'vault',
21
- secretRef: 'vault://integrations/acme-inc/conn-granola-demo',
22
- status: 'connected',
4
+ meta: {
5
+ id: 'conn-granola-demo',
6
+ tenantId: 'acme-inc',
7
+ integrationKey: 'meeting-recorder.granola',
8
+ integrationVersion: '1',
9
+ label: 'Granola Meeting Recorder',
10
+ environment: 'production',
11
+ createdAt: '2026-01-01T00:00:00.000Z',
12
+ updatedAt: '2026-01-01T00:00:00.000Z',
13
+ },
14
+ ownershipMode: 'byok',
15
+ config: {
16
+ transport: 'api',
17
+ baseUrl: 'https://public-api.granola.ai',
18
+ pageSize: 10,
19
+ },
20
+ secretProvider: 'vault',
21
+ secretRef: 'vault://integrations/acme-inc/conn-granola-demo',
22
+ status: 'connected',
23
23
  };
24
24
 
25
25
  export const granolaMcpMeetingRecorderConnection: IntegrationConnection = {
26
- meta: {
27
- id: 'conn-granola-mcp-demo',
28
- tenantId: 'acme-inc',
29
- integrationKey: 'meeting-recorder.granola',
30
- integrationVersion: '1',
31
- label: 'Granola MCP Meeting Recorder',
32
- environment: 'production',
33
- createdAt: '2026-01-01T00:00:00.000Z',
34
- updatedAt: '2026-01-01T00:00:00.000Z',
35
- },
36
- ownershipMode: 'byok',
37
- config: {
38
- transport: 'mcp',
39
- mcpUrl: 'https://mcp.granola.ai/mcp',
40
- pageSize: 10,
41
- },
42
- secretProvider: 'vault',
43
- secretRef: 'vault://integrations/acme-inc/conn-granola-mcp-demo',
44
- status: 'connected',
26
+ meta: {
27
+ id: 'conn-granola-mcp-demo',
28
+ tenantId: 'acme-inc',
29
+ integrationKey: 'meeting-recorder.granola',
30
+ integrationVersion: '1',
31
+ label: 'Granola MCP Meeting Recorder',
32
+ environment: 'production',
33
+ createdAt: '2026-01-01T00:00:00.000Z',
34
+ updatedAt: '2026-01-01T00:00:00.000Z',
35
+ },
36
+ ownershipMode: 'byok',
37
+ config: {
38
+ transport: 'mcp',
39
+ mcpUrl: 'https://mcp.granola.ai/mcp',
40
+ pageSize: 10,
41
+ },
42
+ secretProvider: 'vault',
43
+ secretRef: 'vault://integrations/acme-inc/conn-granola-mcp-demo',
44
+ status: 'connected',
45
45
  };
46
46
 
47
47
  export const tldvMeetingRecorderConnection: IntegrationConnection = {
48
- meta: {
49
- id: 'conn-tldv-demo',
50
- tenantId: 'acme-inc',
51
- integrationKey: 'meeting-recorder.tldv',
52
- integrationVersion: '1',
53
- label: 'tl;dv Meeting Recorder',
54
- environment: 'production',
55
- createdAt: '2026-01-01T00:00:00.000Z',
56
- updatedAt: '2026-01-01T00:00:00.000Z',
57
- },
58
- ownershipMode: 'byok',
59
- config: {
60
- baseUrl: 'https://pasta.tldv.io/v1alpha1',
61
- pageSize: 25,
62
- },
63
- secretProvider: 'vault',
64
- secretRef: 'vault://integrations/acme-inc/conn-tldv-demo',
65
- status: 'connected',
48
+ meta: {
49
+ id: 'conn-tldv-demo',
50
+ tenantId: 'acme-inc',
51
+ integrationKey: 'meeting-recorder.tldv',
52
+ integrationVersion: '1',
53
+ label: 'tl;dv Meeting Recorder',
54
+ environment: 'production',
55
+ createdAt: '2026-01-01T00:00:00.000Z',
56
+ updatedAt: '2026-01-01T00:00:00.000Z',
57
+ },
58
+ ownershipMode: 'byok',
59
+ config: {
60
+ baseUrl: 'https://pasta.tldv.io/v1alpha1',
61
+ pageSize: 25,
62
+ },
63
+ secretProvider: 'vault',
64
+ secretRef: 'vault://integrations/acme-inc/conn-tldv-demo',
65
+ status: 'connected',
66
66
  };
67
67
 
68
68
  export const firefliesMeetingRecorderConnection: IntegrationConnection = {
69
- meta: {
70
- id: 'conn-fireflies-demo',
71
- tenantId: 'acme-inc',
72
- integrationKey: 'meeting-recorder.fireflies',
73
- integrationVersion: '1',
74
- label: 'Fireflies Meeting Recorder',
75
- environment: 'production',
76
- createdAt: '2026-01-01T00:00:00.000Z',
77
- updatedAt: '2026-01-01T00:00:00.000Z',
78
- },
79
- ownershipMode: 'byok',
80
- config: {
81
- baseUrl: 'https://api.fireflies.ai/graphql',
82
- transcriptsPageSize: 25,
83
- },
84
- secretProvider: 'vault',
85
- secretRef: 'vault://integrations/acme-inc/conn-fireflies-demo',
86
- status: 'connected',
69
+ meta: {
70
+ id: 'conn-fireflies-demo',
71
+ tenantId: 'acme-inc',
72
+ integrationKey: 'meeting-recorder.fireflies',
73
+ integrationVersion: '1',
74
+ label: 'Fireflies Meeting Recorder',
75
+ environment: 'production',
76
+ createdAt: '2026-01-01T00:00:00.000Z',
77
+ updatedAt: '2026-01-01T00:00:00.000Z',
78
+ },
79
+ ownershipMode: 'byok',
80
+ config: {
81
+ baseUrl: 'https://api.fireflies.ai/graphql',
82
+ transcriptsPageSize: 25,
83
+ },
84
+ secretProvider: 'vault',
85
+ secretRef: 'vault://integrations/acme-inc/conn-fireflies-demo',
86
+ status: 'connected',
87
87
  };
88
88
 
89
89
  export const fathomMeetingRecorderConnection: IntegrationConnection = {
90
- meta: {
91
- id: 'conn-fathom-demo',
92
- tenantId: 'acme-inc',
93
- integrationKey: 'meeting-recorder.fathom',
94
- integrationVersion: '1',
95
- label: 'Fathom Meeting Recorder',
96
- environment: 'production',
97
- createdAt: '2026-01-01T00:00:00.000Z',
98
- updatedAt: '2026-01-01T00:00:00.000Z',
99
- },
100
- ownershipMode: 'byok',
101
- config: {
102
- baseUrl: 'https://api.fathom.ai/external/v1',
103
- includeTranscript: true,
104
- includeSummary: true,
105
- includeActionItems: false,
106
- includeCrmMatches: false,
107
- triggeredFor: ['my_recordings'],
108
- maxPages: 5,
109
- },
110
- secretProvider: 'vault',
111
- secretRef: 'vault://integrations/acme-inc/conn-fathom-demo',
112
- status: 'connected',
90
+ meta: {
91
+ id: 'conn-fathom-demo',
92
+ tenantId: 'acme-inc',
93
+ integrationKey: 'meeting-recorder.fathom',
94
+ integrationVersion: '1',
95
+ label: 'Fathom Meeting Recorder',
96
+ environment: 'production',
97
+ createdAt: '2026-01-01T00:00:00.000Z',
98
+ updatedAt: '2026-01-01T00:00:00.000Z',
99
+ },
100
+ ownershipMode: 'byok',
101
+ config: {
102
+ baseUrl: 'https://api.fathom.ai/external/v1',
103
+ includeTranscript: true,
104
+ includeSummary: true,
105
+ includeActionItems: false,
106
+ includeCrmMatches: false,
107
+ triggeredFor: ['my_recordings'],
108
+ maxPages: 5,
109
+ },
110
+ secretProvider: 'vault',
111
+ secretRef: 'vault://integrations/acme-inc/conn-fathom-demo',
112
+ status: 'connected',
113
113
  };
114
114
 
115
115
  export const meetingRecorderSampleConnections: IntegrationConnection[] = [
116
- granolaMeetingRecorderConnection,
117
- granolaMcpMeetingRecorderConnection,
118
- tldvMeetingRecorderConnection,
119
- firefliesMeetingRecorderConnection,
120
- fathomMeetingRecorderConnection,
116
+ granolaMeetingRecorderConnection,
117
+ granolaMcpMeetingRecorderConnection,
118
+ tldvMeetingRecorderConnection,
119
+ firefliesMeetingRecorderConnection,
120
+ fathomMeetingRecorderConnection,
121
121
  ];
@@ -2,51 +2,51 @@ import type { DocBlock } from '@contractspec/lib.contracts-spec/docs';
2
2
  import { registerDocBlocks } from '@contractspec/lib.contracts-spec/docs';
3
3
 
4
4
  const blocks: DocBlock[] = [
5
- {
6
- id: 'docs.examples.meeting-recorder-providers',
7
- title: 'Meeting Recorder Providers (example)',
8
- summary:
9
- 'Multi-provider meeting recorder example covering list, transcript fetch, and webhook ingestion.',
10
- kind: 'reference',
11
- visibility: 'public',
12
- route: '/docs/examples/meeting-recorder-providers',
13
- tags: ['meeting-recorder', 'integration', 'example', 'transcripts'],
14
- body:
15
- '## What this example shows\n' +
16
- '- Provider selection for Granola (API and MCP), tl;dv, Fireflies, and Fathom.\n' +
17
- '- List meetings + fetch transcripts using the MeetingRecorderProvider interface.\n' +
18
- '- Webhook verification and normalization into a single event shape.\n\n' +
19
- '## Secrets and config\n' +
20
- '- apiKey (all providers)\n' +
21
- '- Granola MCP: set transport=mcp and provide mcpAccessToken (or apiKey fallback for MCP proxy).\n' +
22
- '- webhookSecret (Fireflies and Fathom)\n' +
23
- '- baseUrl overrides for sandbox or proxy setups\n' +
24
- '- mcpUrl and mcpHeaders for custom MCP routing\n' +
25
- '- pageSize / transcriptsPageSize for pagination\n' +
26
- '- Fathom options: includeTranscript, includeSummary, includeActionItems, includeCrmMatches, triggeredFor\n\n' +
27
- '## Guardrails\n' +
28
- '- Keep secrets in a dedicated secret provider.\n' +
29
- '- Verify webhook signatures before triggering workflows.\n' +
30
- '- Treat transcript ingestion as async workflows, not inline writes.',
31
- },
32
- {
33
- id: 'docs.examples.meeting-recorder-providers.usage',
34
- title: 'Meeting Recorder Providers - Usage',
35
- summary: 'How to wire the provider factory and handlers in a runtime.',
36
- kind: 'usage',
37
- visibility: 'public',
38
- route: '/docs/examples/meeting-recorder-providers/usage',
39
- tags: ['meeting-recorder', 'usage'],
40
- body:
41
- '## Usage\n' +
42
- '- Call `createMeetingRecorderProvider` with an integration key, secrets, and config.\n' +
43
- '- Use `listMeetingRecorderMeetings` to fetch metadata pages.\n' +
44
- '- Use `getMeetingRecorderTranscript` to fetch transcript content.\n' +
45
- '- Wire `handleMeetingRecorderWebhook` to your webhook endpoint.\n\n' +
46
- '## Notes\n' +
47
- '- Replace the placeholder stores with your app persistence.\n' +
48
- '- Record the raw webhook payload for replay or debugging.',
49
- },
5
+ {
6
+ id: 'docs.examples.meeting-recorder-providers',
7
+ title: 'Meeting Recorder Providers (example)',
8
+ summary:
9
+ 'Multi-provider meeting recorder example covering list, transcript fetch, and webhook ingestion.',
10
+ kind: 'reference',
11
+ visibility: 'public',
12
+ route: '/docs/examples/meeting-recorder-providers',
13
+ tags: ['meeting-recorder', 'integration', 'example', 'transcripts'],
14
+ body:
15
+ '## What this example shows\n' +
16
+ '- Provider selection for Granola (API and MCP), tl;dv, Fireflies, and Fathom.\n' +
17
+ '- List meetings + fetch transcripts using the MeetingRecorderProvider interface.\n' +
18
+ '- Webhook verification and normalization into a single event shape.\n\n' +
19
+ '## Secrets and config\n' +
20
+ '- apiKey (all providers)\n' +
21
+ '- Granola MCP: set transport=mcp and provide mcpAccessToken (or apiKey fallback for MCP proxy).\n' +
22
+ '- webhookSecret (Fireflies and Fathom)\n' +
23
+ '- baseUrl overrides for sandbox or proxy setups\n' +
24
+ '- mcpUrl and mcpHeaders for custom MCP routing\n' +
25
+ '- pageSize / transcriptsPageSize for pagination\n' +
26
+ '- Fathom options: includeTranscript, includeSummary, includeActionItems, includeCrmMatches, triggeredFor\n\n' +
27
+ '## Guardrails\n' +
28
+ '- Keep secrets in a dedicated secret provider.\n' +
29
+ '- Verify webhook signatures before triggering workflows.\n' +
30
+ '- Treat transcript ingestion as async workflows, not inline writes.',
31
+ },
32
+ {
33
+ id: 'docs.examples.meeting-recorder-providers.usage',
34
+ title: 'Meeting Recorder Providers - Usage',
35
+ summary: 'How to wire the provider factory and handlers in a runtime.',
36
+ kind: 'usage',
37
+ visibility: 'public',
38
+ route: '/docs/examples/meeting-recorder-providers/usage',
39
+ tags: ['meeting-recorder', 'usage'],
40
+ body:
41
+ '## Usage\n' +
42
+ '- Call `createMeetingRecorderProvider` with an integration key, secrets, and config.\n' +
43
+ '- Use `listMeetingRecorderMeetings` to fetch metadata pages.\n' +
44
+ '- Use `getMeetingRecorderTranscript` to fetch transcript content.\n' +
45
+ '- Wire `handleMeetingRecorderWebhook` to your webhook endpoint.\n\n' +
46
+ '## Notes\n' +
47
+ '- Replace the placeholder stores with your app persistence.\n' +
48
+ '- Record the raw webhook payload for replay or debugging.',
49
+ },
50
50
  ];
51
51
 
52
52
  registerDocBlocks(blocks);
package/src/example.ts CHANGED
@@ -1,32 +1,32 @@
1
1
  import { defineExample } from '@contractspec/lib.contracts-spec';
2
2
 
3
3
  const example = defineExample({
4
- meta: {
5
- key: 'meeting-recorder-providers',
6
- version: '1.0.0',
7
- title: 'Meeting Recorder Providers',
8
- description:
9
- 'Multi-provider meeting recorder integration example with list, transcript, and webhook handling.',
10
- kind: 'integration',
11
- visibility: 'public',
12
- stability: 'experimental',
13
- owners: ['@platform.integrations'],
14
- tags: ['meeting-recorder', 'transcripts', 'webhooks', 'integrations'],
15
- },
16
- docs: {
17
- rootDocId: 'docs.examples.meeting-recorder-providers',
18
- usageDocId: 'docs.examples.meeting-recorder-providers.usage',
19
- },
20
- entrypoints: {
21
- packageName: '@contractspec/example.meeting-recorder-providers',
22
- docs: './docs',
23
- },
24
- surfaces: {
25
- templates: true,
26
- sandbox: { enabled: true, modes: ['markdown', 'specs'] },
27
- studio: { enabled: true, installable: true },
28
- mcp: { enabled: true },
29
- },
4
+ meta: {
5
+ key: 'meeting-recorder-providers',
6
+ version: '1.0.0',
7
+ title: 'Meeting Recorder Providers',
8
+ description:
9
+ 'Multi-provider meeting recorder integration example with list, transcript, and webhook handling.',
10
+ kind: 'integration',
11
+ visibility: 'public',
12
+ stability: 'experimental',
13
+ owners: ['@platform.integrations'],
14
+ tags: ['meeting-recorder', 'transcripts', 'webhooks', 'integrations'],
15
+ },
16
+ docs: {
17
+ rootDocId: 'docs.examples.meeting-recorder-providers',
18
+ usageDocId: 'docs.examples.meeting-recorder-providers.usage',
19
+ },
20
+ entrypoints: {
21
+ packageName: '@contractspec/example.meeting-recorder-providers',
22
+ docs: './docs',
23
+ },
24
+ surfaces: {
25
+ templates: true,
26
+ sandbox: { enabled: true, modes: ['markdown', 'specs'] },
27
+ studio: { enabled: true, installable: true },
28
+ mcp: { enabled: true },
29
+ },
30
30
  });
31
31
 
32
32
  export default example;
@@ -1,103 +1,103 @@
1
+ import { FathomMeetingRecorderProvider } from '@contractspec/integration.providers-impls/impls/fathom-meeting-recorder';
2
+ import { FirefliesMeetingRecorderProvider } from '@contractspec/integration.providers-impls/impls/fireflies-meeting-recorder';
1
3
  import { GranolaMeetingRecorderProvider } from '@contractspec/integration.providers-impls/impls/granola-meeting-recorder';
2
4
  import { TldvMeetingRecorderProvider } from '@contractspec/integration.providers-impls/impls/tldv-meeting-recorder';
3
- import { FirefliesMeetingRecorderProvider } from '@contractspec/integration.providers-impls/impls/fireflies-meeting-recorder';
4
- import { FathomMeetingRecorderProvider } from '@contractspec/integration.providers-impls/impls/fathom-meeting-recorder';
5
5
  import type { MeetingRecorderProvider } from '@contractspec/lib.contracts-integrations';
6
6
 
7
7
  export type MeetingRecorderIntegrationKey =
8
- | 'meeting-recorder.granola'
9
- | 'meeting-recorder.tldv'
10
- | 'meeting-recorder.fireflies'
11
- | 'meeting-recorder.fathom';
8
+ | 'meeting-recorder.granola'
9
+ | 'meeting-recorder.tldv'
10
+ | 'meeting-recorder.fireflies'
11
+ | 'meeting-recorder.fathom';
12
12
 
13
13
  export interface MeetingRecorderProviderSecrets {
14
- apiKey?: string;
15
- mcpAccessToken?: string;
16
- webhookSecret?: string;
14
+ apiKey?: string;
15
+ mcpAccessToken?: string;
16
+ webhookSecret?: string;
17
17
  }
18
18
 
19
19
  export interface MeetingRecorderProviderConfig {
20
- baseUrl?: string;
21
- transport?: 'api' | 'mcp';
22
- mcpUrl?: string;
23
- mcpHeaders?: Record<string, string>;
24
- pageSize?: number;
25
- transcriptsPageSize?: number;
26
- includeTranscript?: boolean;
27
- includeSummary?: boolean;
28
- includeActionItems?: boolean;
29
- includeCrmMatches?: boolean;
30
- triggeredFor?: string[];
31
- maxPages?: number;
20
+ baseUrl?: string;
21
+ transport?: 'api' | 'mcp';
22
+ mcpUrl?: string;
23
+ mcpHeaders?: Record<string, string>;
24
+ pageSize?: number;
25
+ transcriptsPageSize?: number;
26
+ includeTranscript?: boolean;
27
+ includeSummary?: boolean;
28
+ includeActionItems?: boolean;
29
+ includeCrmMatches?: boolean;
30
+ triggeredFor?: string[];
31
+ maxPages?: number;
32
32
  }
33
33
 
34
34
  export interface MeetingRecorderProviderFactoryInput {
35
- integrationKey: MeetingRecorderIntegrationKey;
36
- secrets: MeetingRecorderProviderSecrets;
37
- config?: MeetingRecorderProviderConfig;
35
+ integrationKey: MeetingRecorderIntegrationKey;
36
+ secrets: MeetingRecorderProviderSecrets;
37
+ config?: MeetingRecorderProviderConfig;
38
38
  }
39
39
 
40
40
  export function createMeetingRecorderProvider(
41
- input: MeetingRecorderProviderFactoryInput
41
+ input: MeetingRecorderProviderFactoryInput
42
42
  ): MeetingRecorderProvider {
43
- const { integrationKey, secrets, config } = input;
43
+ const { integrationKey, secrets, config } = input;
44
44
 
45
- switch (integrationKey) {
46
- case 'meeting-recorder.granola':
47
- if (config?.transport === 'mcp') {
48
- return new GranolaMeetingRecorderProvider({
49
- transport: 'mcp',
50
- mcpUrl: config?.mcpUrl,
51
- mcpHeaders: config?.mcpHeaders,
52
- mcpAccessToken: secrets.mcpAccessToken ?? secrets.apiKey,
53
- pageSize: config?.pageSize,
54
- });
55
- }
56
- if (!secrets.apiKey) {
57
- throw new Error('Granola apiKey is required for API transport.');
58
- }
59
- return new GranolaMeetingRecorderProvider({
60
- apiKey: secrets.apiKey,
61
- baseUrl: config?.baseUrl,
62
- pageSize: config?.pageSize,
63
- });
64
- case 'meeting-recorder.tldv':
65
- if (!secrets.apiKey) {
66
- throw new Error('tl;dv apiKey is required.');
67
- }
68
- return new TldvMeetingRecorderProvider({
69
- apiKey: secrets.apiKey,
70
- baseUrl: config?.baseUrl,
71
- pageSize: config?.pageSize,
72
- });
73
- case 'meeting-recorder.fireflies':
74
- if (!secrets.apiKey) {
75
- throw new Error('Fireflies apiKey is required.');
76
- }
77
- return new FirefliesMeetingRecorderProvider({
78
- apiKey: secrets.apiKey,
79
- baseUrl: config?.baseUrl,
80
- pageSize: config?.transcriptsPageSize ?? config?.pageSize,
81
- webhookSecret: secrets.webhookSecret,
82
- });
83
- case 'meeting-recorder.fathom':
84
- if (!secrets.apiKey) {
85
- throw new Error('Fathom apiKey is required.');
86
- }
87
- return new FathomMeetingRecorderProvider({
88
- apiKey: secrets.apiKey,
89
- baseUrl: config?.baseUrl,
90
- includeTranscript: config?.includeTranscript,
91
- includeSummary: config?.includeSummary,
92
- includeActionItems: config?.includeActionItems,
93
- includeCrmMatches: config?.includeCrmMatches,
94
- triggeredFor: config?.triggeredFor,
95
- maxPages: config?.maxPages,
96
- webhookSecret: secrets.webhookSecret,
97
- });
98
- default:
99
- throw new Error(
100
- `Unsupported meeting recorder provider: ${integrationKey}`
101
- );
102
- }
45
+ switch (integrationKey) {
46
+ case 'meeting-recorder.granola':
47
+ if (config?.transport === 'mcp') {
48
+ return new GranolaMeetingRecorderProvider({
49
+ transport: 'mcp',
50
+ mcpUrl: config?.mcpUrl,
51
+ mcpHeaders: config?.mcpHeaders,
52
+ mcpAccessToken: secrets.mcpAccessToken ?? secrets.apiKey,
53
+ pageSize: config?.pageSize,
54
+ });
55
+ }
56
+ if (!secrets.apiKey) {
57
+ throw new Error('Granola apiKey is required for API transport.');
58
+ }
59
+ return new GranolaMeetingRecorderProvider({
60
+ apiKey: secrets.apiKey,
61
+ baseUrl: config?.baseUrl,
62
+ pageSize: config?.pageSize,
63
+ });
64
+ case 'meeting-recorder.tldv':
65
+ if (!secrets.apiKey) {
66
+ throw new Error('tl;dv apiKey is required.');
67
+ }
68
+ return new TldvMeetingRecorderProvider({
69
+ apiKey: secrets.apiKey,
70
+ baseUrl: config?.baseUrl,
71
+ pageSize: config?.pageSize,
72
+ });
73
+ case 'meeting-recorder.fireflies':
74
+ if (!secrets.apiKey) {
75
+ throw new Error('Fireflies apiKey is required.');
76
+ }
77
+ return new FirefliesMeetingRecorderProvider({
78
+ apiKey: secrets.apiKey,
79
+ baseUrl: config?.baseUrl,
80
+ pageSize: config?.transcriptsPageSize ?? config?.pageSize,
81
+ webhookSecret: secrets.webhookSecret,
82
+ });
83
+ case 'meeting-recorder.fathom':
84
+ if (!secrets.apiKey) {
85
+ throw new Error('Fathom apiKey is required.');
86
+ }
87
+ return new FathomMeetingRecorderProvider({
88
+ apiKey: secrets.apiKey,
89
+ baseUrl: config?.baseUrl,
90
+ includeTranscript: config?.includeTranscript,
91
+ includeSummary: config?.includeSummary,
92
+ includeActionItems: config?.includeActionItems,
93
+ includeCrmMatches: config?.includeCrmMatches,
94
+ triggeredFor: config?.triggeredFor,
95
+ maxPages: config?.maxPages,
96
+ webhookSecret: secrets.webhookSecret,
97
+ });
98
+ default:
99
+ throw new Error(
100
+ `Unsupported meeting recorder provider: ${integrationKey}`
101
+ );
102
+ }
103
103
  }
@@ -1,20 +1,21 @@
1
1
  import type {
2
- MeetingRecorderGetTranscriptParams,
3
- MeetingTranscriptRecord,
2
+ MeetingRecorderGetTranscriptParams,
3
+ MeetingTranscriptRecord,
4
4
  } from '@contractspec/lib.contracts-integrations';
5
5
 
6
6
  import {
7
- createMeetingRecorderProvider,
8
- type MeetingRecorderProviderFactoryInput,
7
+ createMeetingRecorderProvider,
8
+ type MeetingRecorderProviderFactoryInput,
9
9
  } from './create-provider';
10
10
 
11
- export interface GetMeetingRecorderTranscriptInput extends MeetingRecorderProviderFactoryInput {
12
- params: MeetingRecorderGetTranscriptParams;
11
+ export interface GetMeetingRecorderTranscriptInput
12
+ extends MeetingRecorderProviderFactoryInput {
13
+ params: MeetingRecorderGetTranscriptParams;
13
14
  }
14
15
 
15
16
  export async function getMeetingRecorderTranscript(
16
- input: GetMeetingRecorderTranscriptInput
17
+ input: GetMeetingRecorderTranscriptInput
17
18
  ): Promise<MeetingTranscriptRecord> {
18
- const provider = createMeetingRecorderProvider(input);
19
- return provider.getTranscript(input.params);
19
+ const provider = createMeetingRecorderProvider(input);
20
+ return provider.getTranscript(input.params);
20
21
  }
@@ -1,20 +1,21 @@
1
1
  import type {
2
- MeetingRecorderListMeetingsParams,
3
- MeetingRecorderListMeetingsResult,
2
+ MeetingRecorderListMeetingsParams,
3
+ MeetingRecorderListMeetingsResult,
4
4
  } from '@contractspec/lib.contracts-integrations';
5
5
 
6
6
  import {
7
- createMeetingRecorderProvider,
8
- type MeetingRecorderProviderFactoryInput,
7
+ createMeetingRecorderProvider,
8
+ type MeetingRecorderProviderFactoryInput,
9
9
  } from './create-provider';
10
10
 
11
- export interface ListMeetingRecorderMeetingsInput extends MeetingRecorderProviderFactoryInput {
12
- params: MeetingRecorderListMeetingsParams;
11
+ export interface ListMeetingRecorderMeetingsInput
12
+ extends MeetingRecorderProviderFactoryInput {
13
+ params: MeetingRecorderListMeetingsParams;
13
14
  }
14
15
 
15
16
  export async function listMeetingRecorderMeetings(
16
- input: ListMeetingRecorderMeetingsInput
17
+ input: ListMeetingRecorderMeetingsInput
17
18
  ): Promise<MeetingRecorderListMeetingsResult> {
18
- const provider = createMeetingRecorderProvider(input);
19
- return provider.listMeetings(input.params);
19
+ const provider = createMeetingRecorderProvider(input);
20
+ return provider.listMeetings(input.params);
20
21
  }