fireflies-api 0.5.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.
Files changed (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +64 -0
  3. package/dist/action-items-CC9yUxHY.d.cts +380 -0
  4. package/dist/action-items-CC9yUxHY.d.ts +380 -0
  5. package/dist/cli/index.cjs +3909 -0
  6. package/dist/cli/index.cjs.map +1 -0
  7. package/dist/cli/index.d.cts +2 -0
  8. package/dist/cli/index.d.ts +2 -0
  9. package/dist/cli/index.js +3906 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/index.cjs +3389 -0
  12. package/dist/index.cjs.map +1 -0
  13. package/dist/index.d.cts +966 -0
  14. package/dist/index.d.ts +966 -0
  15. package/dist/index.js +3344 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/middleware/express.cjs +2491 -0
  18. package/dist/middleware/express.cjs.map +1 -0
  19. package/dist/middleware/express.d.cts +36 -0
  20. package/dist/middleware/express.d.ts +36 -0
  21. package/dist/middleware/express.js +2489 -0
  22. package/dist/middleware/express.js.map +1 -0
  23. package/dist/middleware/fastify.cjs +2501 -0
  24. package/dist/middleware/fastify.cjs.map +1 -0
  25. package/dist/middleware/fastify.d.cts +66 -0
  26. package/dist/middleware/fastify.d.ts +66 -0
  27. package/dist/middleware/fastify.js +2498 -0
  28. package/dist/middleware/fastify.js.map +1 -0
  29. package/dist/middleware/hono.cjs +2493 -0
  30. package/dist/middleware/hono.cjs.map +1 -0
  31. package/dist/middleware/hono.d.cts +37 -0
  32. package/dist/middleware/hono.d.ts +37 -0
  33. package/dist/middleware/hono.js +2490 -0
  34. package/dist/middleware/hono.js.map +1 -0
  35. package/dist/schemas/index.cjs +307 -0
  36. package/dist/schemas/index.cjs.map +1 -0
  37. package/dist/schemas/index.d.cts +926 -0
  38. package/dist/schemas/index.d.ts +926 -0
  39. package/dist/schemas/index.js +268 -0
  40. package/dist/schemas/index.js.map +1 -0
  41. package/dist/speaker-analytics-Dr46LKyP.d.ts +275 -0
  42. package/dist/speaker-analytics-l45LXqO1.d.cts +275 -0
  43. package/dist/types-BX-3JcRI.d.cts +41 -0
  44. package/dist/types-C_XxdRd1.d.cts +1546 -0
  45. package/dist/types-CaHcwnKw.d.ts +41 -0
  46. package/dist/types-DIPZmUl3.d.ts +1546 -0
  47. package/package.json +126 -0
@@ -0,0 +1,268 @@
1
+ import { z } from 'zod';
2
+
3
+ // src/schemas/helpers.ts
4
+ var ActionItemSourceSentenceSchema = z.object({
5
+ speakerName: z.string(),
6
+ text: z.string(),
7
+ startTime: z.number().nonnegative()
8
+ });
9
+ var ActionItemSchema = z.object({
10
+ text: z.string(),
11
+ assignee: z.string().optional(),
12
+ dueDate: z.string().optional(),
13
+ lineNumber: z.number().int().positive(),
14
+ sourceSentence: ActionItemSourceSentenceSchema.optional()
15
+ });
16
+ var ActionItemsResultSchema = z.object({
17
+ items: z.array(ActionItemSchema),
18
+ totalItems: z.number().int().nonnegative(),
19
+ assignedItems: z.number().int().nonnegative(),
20
+ datedItems: z.number().int().nonnegative(),
21
+ assignees: z.array(z.string())
22
+ });
23
+ var SpeakerStatsSchema = z.object({
24
+ name: z.string(),
25
+ id: z.string(),
26
+ talkTime: z.number().nonnegative(),
27
+ talkTimePercentage: z.number().min(0).max(100),
28
+ sentenceCount: z.number().int().nonnegative(),
29
+ wordCount: z.number().int().nonnegative(),
30
+ wordsPerMinute: z.number().nonnegative(),
31
+ averageSentenceLength: z.number().nonnegative(),
32
+ turnCount: z.number().int().nonnegative()
33
+ });
34
+ var SpeakerAnalyticsSchema = z.object({
35
+ speakers: z.array(SpeakerStatsSchema),
36
+ totalDuration: z.number().nonnegative(),
37
+ totalTalkTime: z.number().nonnegative(),
38
+ totalSentences: z.number().int().nonnegative(),
39
+ totalWords: z.number().int().nonnegative(),
40
+ dominantSpeaker: z.string(),
41
+ dominantSpeakerPercentage: z.number().min(0).max(100),
42
+ balance: z.enum(["balanced", "unbalanced", "dominated"])
43
+ });
44
+ function parseActionItemsResult(data) {
45
+ return ActionItemsResultSchema.parse(data);
46
+ }
47
+ function safeParseActionItemsResult(data) {
48
+ return ActionItemsResultSchema.safeParse(data);
49
+ }
50
+ function parseSpeakerAnalytics(data) {
51
+ return SpeakerAnalyticsSchema.parse(data);
52
+ }
53
+ function safeParseSpeakerAnalytics(data) {
54
+ return SpeakerAnalyticsSchema.safeParse(data);
55
+ }
56
+ var NormalizedSpeakerSchema = z.object({
57
+ id: z.string(),
58
+ name: z.string()
59
+ });
60
+ var NormalizedSentenceSchema = z.object({
61
+ index: z.number().int().nonnegative(),
62
+ speakerId: z.string(),
63
+ speakerName: z.string(),
64
+ text: z.string(),
65
+ rawText: z.string(),
66
+ startTime: z.number().nonnegative(),
67
+ endTime: z.number().nonnegative(),
68
+ sentiment: z.enum(["positive", "negative", "neutral"]).optional(),
69
+ isQuestion: z.boolean().optional(),
70
+ isActionItem: z.boolean().optional()
71
+ });
72
+ var NormalizedParticipantSchema = z.object({
73
+ name: z.string(),
74
+ email: z.string().optional(),
75
+ role: z.enum(["organizer", "attendee"]).optional()
76
+ });
77
+ var NormalizedSummarySchema = z.object({
78
+ overview: z.string().optional(),
79
+ keyPoints: z.array(z.string()).optional(),
80
+ actionItems: z.string().optional(),
81
+ outline: z.string().optional(),
82
+ topics: z.array(z.string()).optional()
83
+ });
84
+ var NormalizedAttendeeSchema = z.object({
85
+ name: z.string(),
86
+ email: z.string().optional(),
87
+ phoneNumber: z.string().optional(),
88
+ joinTime: z.date().optional(),
89
+ leaveTime: z.date().optional()
90
+ });
91
+ var NormalizedChannelSchema = z.object({
92
+ id: z.string(),
93
+ title: z.string(),
94
+ isPrivate: z.boolean()
95
+ });
96
+ var NormalizedAnalyticsSchema = z.object({
97
+ sentiments: z.object({
98
+ positive: z.number().min(0).max(100),
99
+ neutral: z.number().min(0).max(100),
100
+ negative: z.number().min(0).max(100)
101
+ }).optional()
102
+ });
103
+ var NormalizedMeetingSchema = z.object({
104
+ id: z.string().startsWith("fireflies:"),
105
+ title: z.string(),
106
+ date: z.date(),
107
+ duration: z.number().positive(),
108
+ url: z.string().url(),
109
+ speakers: z.array(NormalizedSpeakerSchema),
110
+ sentences: z.array(NormalizedSentenceSchema),
111
+ participants: z.array(NormalizedParticipantSchema),
112
+ summary: NormalizedSummarySchema.optional(),
113
+ attendees: z.array(NormalizedAttendeeSchema).optional(),
114
+ channels: z.array(NormalizedChannelSchema).optional(),
115
+ analytics: NormalizedAnalyticsSchema.optional(),
116
+ source: z.object({
117
+ provider: z.literal("fireflies"),
118
+ originalId: z.string(),
119
+ rawData: z.unknown().optional()
120
+ })
121
+ });
122
+ function parseNormalizedMeeting(data) {
123
+ return NormalizedMeetingSchema.parse(data);
124
+ }
125
+ function safeParseNormalizedMeeting(data) {
126
+ return NormalizedMeetingSchema.safeParse(data);
127
+ }
128
+ var SpeakerSchema = z.object({
129
+ id: z.string(),
130
+ name: z.string()
131
+ });
132
+ var AIFilterSchema = z.object({
133
+ task: z.string().optional(),
134
+ pricing: z.string().optional(),
135
+ metric: z.string().optional(),
136
+ question: z.string().optional(),
137
+ date_and_time: z.string().optional(),
138
+ text_cleanup: z.string().optional(),
139
+ sentiment: z.string().optional()
140
+ });
141
+ var SentenceSchema = z.object({
142
+ index: z.number().int().nonnegative(),
143
+ text: z.string(),
144
+ raw_text: z.string(),
145
+ start_time: z.string(),
146
+ end_time: z.string(),
147
+ speaker_id: z.string(),
148
+ speaker_name: z.string(),
149
+ ai_filters: AIFilterSchema.optional()
150
+ });
151
+ var SummarySectionSchema = z.object({
152
+ title: z.string(),
153
+ content: z.string()
154
+ });
155
+ var SummarySchema = z.object({
156
+ action_items: z.string().optional(),
157
+ keywords: z.string().optional(),
158
+ outline: z.string().optional(),
159
+ overview: z.string().optional(),
160
+ shorthand_bullet: z.string().optional(),
161
+ notes: z.string().optional(),
162
+ gist: z.string().optional(),
163
+ bullet_gist: z.string().optional(),
164
+ short_summary: z.string().optional(),
165
+ short_overview: z.string().optional(),
166
+ meeting_type: z.string().optional(),
167
+ topics_discussed: z.array(z.string()).optional(),
168
+ transcript_chapters: z.array(z.string()).optional(),
169
+ extended_sections: z.array(SummarySectionSchema).optional()
170
+ });
171
+ var MeetingAttendeeSchema = z.object({
172
+ displayName: z.string(),
173
+ email: z.string(),
174
+ phoneNumber: z.string().optional(),
175
+ name: z.string(),
176
+ location: z.string().optional()
177
+ });
178
+ var MeetingAttendanceSchema = z.object({
179
+ name: z.string(),
180
+ join_time: z.string(),
181
+ leave_time: z.string().optional()
182
+ });
183
+ var SummaryStatusSchema = z.enum(["processing", "processed", "failed", "skipped"]);
184
+ var MeetingInfoSchema = z.object({
185
+ fred_joined: z.boolean(),
186
+ silent_meeting: z.boolean(),
187
+ summary_status: SummaryStatusSchema
188
+ });
189
+ var ChannelMemberSchema = z.object({
190
+ user_id: z.string(),
191
+ email: z.string(),
192
+ name: z.string()
193
+ });
194
+ var ChannelSchema = z.object({
195
+ id: z.string(),
196
+ title: z.string(),
197
+ is_private: z.boolean().optional(),
198
+ created_at: z.string().optional(),
199
+ updated_at: z.string().optional(),
200
+ created_by: z.string().optional(),
201
+ members: z.array(ChannelMemberSchema).optional()
202
+ });
203
+ var AIAppOutputSchema = z.object({
204
+ transcript_id: z.string().optional(),
205
+ user_id: z.string().optional(),
206
+ app_id: z.string().optional(),
207
+ created_at: z.number().optional(),
208
+ title: z.string().optional(),
209
+ prompt: z.string().optional(),
210
+ response: z.string().optional()
211
+ });
212
+ var AppsPreviewSchema = z.object({
213
+ outputs: z.array(AIAppOutputSchema)
214
+ });
215
+ var SentimentsSchema = z.object({
216
+ negative_pct: z.number().min(0).max(100).optional(),
217
+ neutral_pct: z.number().min(0).max(100).optional(),
218
+ positive_pct: z.number().min(0).max(100).optional()
219
+ });
220
+ var MeetingAnalyticsSchema = z.object({
221
+ sentiments: SentimentsSchema.optional()
222
+ });
223
+ var UserSchema = z.object({
224
+ user_id: z.string(),
225
+ email: z.string(),
226
+ name: z.string().optional(),
227
+ num_transcripts: z.number().int().nonnegative().optional(),
228
+ is_admin: z.boolean().optional()
229
+ });
230
+ var TranscriptSchema = z.object({
231
+ id: z.string(),
232
+ title: z.string(),
233
+ organizer_email: z.string(),
234
+ host_email: z.string().optional(),
235
+ user: UserSchema.optional(),
236
+ speakers: z.array(SpeakerSchema),
237
+ transcript_url: z.string(),
238
+ participants: z.array(z.string()),
239
+ meeting_attendees: z.array(MeetingAttendeeSchema),
240
+ meeting_attendance: z.array(MeetingAttendanceSchema),
241
+ fireflies_users: z.array(z.string()),
242
+ workspace_users: z.array(z.string()),
243
+ duration: z.number(),
244
+ dateString: z.string(),
245
+ date: z.number(),
246
+ audio_url: z.string().optional(),
247
+ video_url: z.string().optional(),
248
+ sentences: z.array(SentenceSchema),
249
+ calendar_id: z.string().optional(),
250
+ summary: SummarySchema.optional(),
251
+ meeting_info: MeetingInfoSchema.optional(),
252
+ cal_id: z.string().optional(),
253
+ calendar_type: z.string().optional(),
254
+ apps_preview: AppsPreviewSchema.optional(),
255
+ meeting_link: z.string().optional(),
256
+ analytics: MeetingAnalyticsSchema.optional(),
257
+ channels: z.array(ChannelSchema)
258
+ });
259
+ function parseTranscript(data) {
260
+ return TranscriptSchema.parse(data);
261
+ }
262
+ function safeParseTranscript(data) {
263
+ return TranscriptSchema.safeParse(data);
264
+ }
265
+
266
+ export { AIAppOutputSchema, AIFilterSchema, ActionItemSchema, ActionItemSourceSentenceSchema, ActionItemsResultSchema, AppsPreviewSchema, ChannelMemberSchema, ChannelSchema, MeetingAnalyticsSchema, MeetingAttendanceSchema, MeetingAttendeeSchema, MeetingInfoSchema, NormalizedAnalyticsSchema, NormalizedAttendeeSchema, NormalizedChannelSchema, NormalizedMeetingSchema, NormalizedParticipantSchema, NormalizedSentenceSchema, NormalizedSpeakerSchema, NormalizedSummarySchema, SentenceSchema, SentimentsSchema, SpeakerAnalyticsSchema, SpeakerSchema, SpeakerStatsSchema, SummarySchema, SummarySectionSchema, SummaryStatusSchema, TranscriptSchema, UserSchema, parseActionItemsResult, parseNormalizedMeeting, parseSpeakerAnalytics, parseTranscript, safeParseActionItemsResult, safeParseNormalizedMeeting, safeParseSpeakerAnalytics, safeParseTranscript };
267
+ //# sourceMappingURL=index.js.map
268
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/schemas/helpers.ts","../../src/schemas/normalized.ts","../../src/schemas/transcript.ts"],"names":["z"],"mappings":"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","file":"index.js","sourcesContent":["import { z } from 'zod';\nimport type { ActionItemsResult } from '../helpers/action-items.js';\nimport type { SpeakerAnalytics } from '../helpers/speaker-analytics.js';\n\n/**\n * Zod schema for source sentence in an action item.\n */\nexport const ActionItemSourceSentenceSchema = z.object({\n speakerName: z.string(),\n text: z.string(),\n startTime: z.number().nonnegative(),\n});\n\n/**\n * Zod schema for ActionItem.\n * A single action item extracted from a transcript.\n */\nexport const ActionItemSchema = z.object({\n text: z.string(),\n assignee: z.string().optional(),\n dueDate: z.string().optional(),\n lineNumber: z.number().int().positive(),\n sourceSentence: ActionItemSourceSentenceSchema.optional(),\n});\n\n/**\n * Zod schema for ActionItemsResult.\n * Result of action item extraction from a transcript.\n */\nexport const ActionItemsResultSchema = z.object({\n items: z.array(ActionItemSchema),\n totalItems: z.number().int().nonnegative(),\n assignedItems: z.number().int().nonnegative(),\n datedItems: z.number().int().nonnegative(),\n assignees: z.array(z.string()),\n});\n\n/**\n * Zod schema for SpeakerStats.\n * Statistics for a single speaker in the meeting.\n */\nexport const SpeakerStatsSchema = z.object({\n name: z.string(),\n id: z.string(),\n talkTime: z.number().nonnegative(),\n talkTimePercentage: z.number().min(0).max(100),\n sentenceCount: z.number().int().nonnegative(),\n wordCount: z.number().int().nonnegative(),\n wordsPerMinute: z.number().nonnegative(),\n averageSentenceLength: z.number().nonnegative(),\n turnCount: z.number().int().nonnegative(),\n});\n\n/**\n * Zod schema for SpeakerAnalytics.\n * Overall meeting speaker analytics.\n */\nexport const SpeakerAnalyticsSchema = z.object({\n speakers: z.array(SpeakerStatsSchema),\n totalDuration: z.number().nonnegative(),\n totalTalkTime: z.number().nonnegative(),\n totalSentences: z.number().int().nonnegative(),\n totalWords: z.number().int().nonnegative(),\n dominantSpeaker: z.string(),\n dominantSpeakerPercentage: z.number().min(0).max(100),\n balance: z.enum(['balanced', 'unbalanced', 'dominated']),\n});\n\n/**\n * Parse and validate data as an ActionItemsResult.\n *\n * Throws a ZodError if validation fails.\n *\n * @param data - Unknown data to validate\n * @returns Validated ActionItemsResult\n * @throws {z.ZodError} If validation fails\n *\n * @example\n * ```typescript\n * import { parseActionItemsResult } from 'fireflies-api/schemas';\n *\n * const result = parseActionItemsResult(data);\n * console.log(result.totalItems);\n * ```\n */\nexport function parseActionItemsResult(data: unknown): ActionItemsResult {\n return ActionItemsResultSchema.parse(data) as ActionItemsResult;\n}\n\n/**\n * Safely parse and validate data as an ActionItemsResult.\n *\n * Returns a result object with success/error instead of throwing.\n *\n * @param data - Unknown data to validate\n * @returns SafeParseResult with data on success, error on failure\n */\nexport function safeParseActionItemsResult(data: unknown) {\n return ActionItemsResultSchema.safeParse(data);\n}\n\n/**\n * Parse and validate data as SpeakerAnalytics.\n *\n * Throws a ZodError if validation fails.\n *\n * @param data - Unknown data to validate\n * @returns Validated SpeakerAnalytics\n * @throws {z.ZodError} If validation fails\n *\n * @example\n * ```typescript\n * import { parseSpeakerAnalytics } from 'fireflies-api/schemas';\n *\n * const analytics = parseSpeakerAnalytics(data);\n * console.log(analytics.dominantSpeaker);\n * ```\n */\nexport function parseSpeakerAnalytics(data: unknown): SpeakerAnalytics {\n return SpeakerAnalyticsSchema.parse(data) as SpeakerAnalytics;\n}\n\n/**\n * Safely parse and validate data as SpeakerAnalytics.\n *\n * Returns a result object with success/error instead of throwing.\n *\n * @param data - Unknown data to validate\n * @returns SafeParseResult with data on success, error on failure\n */\nexport function safeParseSpeakerAnalytics(data: unknown) {\n return SpeakerAnalyticsSchema.safeParse(data);\n}\n","import { z } from 'zod';\nimport type { NormalizedMeeting } from '../types/normalized.js';\n\n/**\n * Zod schema for NormalizedSpeaker.\n */\nexport const NormalizedSpeakerSchema = z.object({\n id: z.string(),\n name: z.string(),\n});\n\n/**\n * Zod schema for NormalizedSentence.\n */\nexport const NormalizedSentenceSchema = z.object({\n index: z.number().int().nonnegative(),\n speakerId: z.string(),\n speakerName: z.string(),\n text: z.string(),\n rawText: z.string(),\n startTime: z.number().nonnegative(),\n endTime: z.number().nonnegative(),\n sentiment: z.enum(['positive', 'negative', 'neutral']).optional(),\n isQuestion: z.boolean().optional(),\n isActionItem: z.boolean().optional(),\n});\n\n/**\n * Zod schema for NormalizedParticipant.\n */\nexport const NormalizedParticipantSchema = z.object({\n name: z.string(),\n email: z.string().optional(),\n role: z.enum(['organizer', 'attendee']).optional(),\n});\n\n/**\n * Zod schema for NormalizedSummary.\n */\nexport const NormalizedSummarySchema = z.object({\n overview: z.string().optional(),\n keyPoints: z.array(z.string()).optional(),\n actionItems: z.string().optional(),\n outline: z.string().optional(),\n topics: z.array(z.string()).optional(),\n});\n\n/**\n * Zod schema for NormalizedAttendee.\n */\nexport const NormalizedAttendeeSchema = z.object({\n name: z.string(),\n email: z.string().optional(),\n phoneNumber: z.string().optional(),\n joinTime: z.date().optional(),\n leaveTime: z.date().optional(),\n});\n\n/**\n * Zod schema for NormalizedChannel.\n */\nexport const NormalizedChannelSchema = z.object({\n id: z.string(),\n title: z.string(),\n isPrivate: z.boolean(),\n});\n\n/**\n * Zod schema for NormalizedAnalytics.\n */\nexport const NormalizedAnalyticsSchema = z.object({\n sentiments: z\n .object({\n positive: z.number().min(0).max(100),\n neutral: z.number().min(0).max(100),\n negative: z.number().min(0).max(100),\n })\n .optional(),\n});\n\n/**\n * Zod schema for NormalizedMeeting.\n *\n * Use this schema to validate unknown data against the NormalizedMeeting type.\n *\n * @example\n * ```typescript\n * import { NormalizedMeetingSchema } from 'fireflies-api/schemas';\n *\n * const result = NormalizedMeetingSchema.safeParse(data);\n * if (result.success) {\n * const meeting = result.data; // NormalizedMeeting\n * }\n * ```\n */\nexport const NormalizedMeetingSchema = z.object({\n id: z.string().startsWith('fireflies:'),\n title: z.string(),\n date: z.date(),\n duration: z.number().positive(),\n url: z.string().url(),\n speakers: z.array(NormalizedSpeakerSchema),\n sentences: z.array(NormalizedSentenceSchema),\n participants: z.array(NormalizedParticipantSchema),\n summary: NormalizedSummarySchema.optional(),\n attendees: z.array(NormalizedAttendeeSchema).optional(),\n channels: z.array(NormalizedChannelSchema).optional(),\n analytics: NormalizedAnalyticsSchema.optional(),\n source: z.object({\n provider: z.literal('fireflies'),\n originalId: z.string(),\n rawData: z.unknown().optional(),\n }),\n});\n\n/**\n * Parse and validate data as a NormalizedMeeting.\n *\n * Throws a ZodError if validation fails.\n *\n * @param data - Unknown data to validate\n * @returns Validated NormalizedMeeting\n * @throws {z.ZodError} If validation fails\n *\n * @example\n * ```typescript\n * import { parseNormalizedMeeting } from 'fireflies-api/schemas';\n *\n * try {\n * const meeting = parseNormalizedMeeting(untrustedData);\n * console.log(meeting.id);\n * } catch (e) {\n * console.error('Invalid data:', e);\n * }\n * ```\n */\nexport function parseNormalizedMeeting(data: unknown): NormalizedMeeting {\n return NormalizedMeetingSchema.parse(data) as NormalizedMeeting;\n}\n\n/**\n * Safely parse and validate data as a NormalizedMeeting.\n *\n * Returns a result object with success/error instead of throwing.\n *\n * @param data - Unknown data to validate\n * @returns SafeParseResult with data on success, error on failure\n *\n * @example\n * ```typescript\n * import { safeParseNormalizedMeeting } from 'fireflies-api/schemas';\n *\n * const result = safeParseNormalizedMeeting(untrustedData);\n * if (result.success) {\n * console.log(result.data.id);\n * } else {\n * console.error('Validation failed:', result.error);\n * }\n * ```\n */\nexport function safeParseNormalizedMeeting(data: unknown) {\n return NormalizedMeetingSchema.safeParse(data);\n}\n","import { z } from 'zod';\nimport type { Transcript } from '../types/transcript.js';\n\n/**\n * Zod schema for Speaker.\n */\nexport const SpeakerSchema = z.object({\n id: z.string(),\n name: z.string(),\n});\n\n/**\n * Zod schema for AIFilter.\n * All fields are optional AI-detected content filters for a sentence.\n */\nexport const AIFilterSchema = z.object({\n task: z.string().optional(),\n pricing: z.string().optional(),\n metric: z.string().optional(),\n question: z.string().optional(),\n date_and_time: z.string().optional(),\n text_cleanup: z.string().optional(),\n sentiment: z.string().optional(),\n});\n\n/**\n * Zod schema for Sentence.\n */\nexport const SentenceSchema = z.object({\n index: z.number().int().nonnegative(),\n text: z.string(),\n raw_text: z.string(),\n start_time: z.string(),\n end_time: z.string(),\n speaker_id: z.string(),\n speaker_name: z.string(),\n ai_filters: AIFilterSchema.optional(),\n});\n\n/**\n * Zod schema for SummarySection.\n */\nexport const SummarySectionSchema = z.object({\n title: z.string(),\n content: z.string(),\n});\n\n/**\n * Zod schema for Summary.\n * AI-generated meeting summary sections.\n */\nexport const SummarySchema = z.object({\n action_items: z.string().optional(),\n keywords: z.string().optional(),\n outline: z.string().optional(),\n overview: z.string().optional(),\n shorthand_bullet: z.string().optional(),\n notes: z.string().optional(),\n gist: z.string().optional(),\n bullet_gist: z.string().optional(),\n short_summary: z.string().optional(),\n short_overview: z.string().optional(),\n meeting_type: z.string().optional(),\n topics_discussed: z.array(z.string()).optional(),\n transcript_chapters: z.array(z.string()).optional(),\n extended_sections: z.array(SummarySectionSchema).optional(),\n});\n\n/**\n * Zod schema for MeetingAttendee.\n * Attendee information from calendar invite.\n */\nexport const MeetingAttendeeSchema = z.object({\n displayName: z.string(),\n email: z.string(),\n phoneNumber: z.string().optional(),\n name: z.string(),\n location: z.string().optional(),\n});\n\n/**\n * Zod schema for MeetingAttendance.\n * Attendance tracking with join/leave times.\n */\nexport const MeetingAttendanceSchema = z.object({\n name: z.string(),\n join_time: z.string(),\n leave_time: z.string().optional(),\n});\n\n/**\n * Summary processing status enum.\n */\nexport const SummaryStatusSchema = z.enum(['processing', 'processed', 'failed', 'skipped']);\n\n/**\n * Zod schema for MeetingInfo.\n * Meeting metadata and processing status.\n */\nexport const MeetingInfoSchema = z.object({\n fred_joined: z.boolean(),\n silent_meeting: z.boolean(),\n summary_status: SummaryStatusSchema,\n});\n\n/**\n * Zod schema for ChannelMember.\n */\nexport const ChannelMemberSchema = z.object({\n user_id: z.string(),\n email: z.string(),\n name: z.string(),\n});\n\n/**\n * Zod schema for Channel.\n */\nexport const ChannelSchema = z.object({\n id: z.string(),\n title: z.string(),\n is_private: z.boolean().optional(),\n created_at: z.string().optional(),\n updated_at: z.string().optional(),\n created_by: z.string().optional(),\n members: z.array(ChannelMemberSchema).optional(),\n});\n\n/**\n * Zod schema for AIAppOutput.\n */\nexport const AIAppOutputSchema = z.object({\n transcript_id: z.string().optional(),\n user_id: z.string().optional(),\n app_id: z.string().optional(),\n created_at: z.number().optional(),\n title: z.string().optional(),\n prompt: z.string().optional(),\n response: z.string().optional(),\n});\n\n/**\n * Zod schema for AppsPreview.\n */\nexport const AppsPreviewSchema = z.object({\n outputs: z.array(AIAppOutputSchema),\n});\n\n/**\n * Zod schema for Sentiments.\n * Sentiment percentages for a meeting (0-100).\n */\nexport const SentimentsSchema = z.object({\n negative_pct: z.number().min(0).max(100).optional(),\n neutral_pct: z.number().min(0).max(100).optional(),\n positive_pct: z.number().min(0).max(100).optional(),\n});\n\n/**\n * Zod schema for MeetingAnalytics.\n */\nexport const MeetingAnalyticsSchema = z.object({\n sentiments: SentimentsSchema.optional(),\n});\n\n/**\n * Zod schema for User.\n */\nexport const UserSchema = z.object({\n user_id: z.string(),\n email: z.string(),\n name: z.string().optional(),\n num_transcripts: z.number().int().nonnegative().optional(),\n is_admin: z.boolean().optional(),\n});\n\n/**\n * Zod schema for Transcript.\n *\n * Use this schema to validate unknown data against the Transcript type.\n *\n * @example\n * ```typescript\n * import { TranscriptSchema } from 'fireflies-api/schemas';\n *\n * const result = TranscriptSchema.safeParse(apiResponse);\n * if (result.success) {\n * const transcript = result.data;\n * }\n * ```\n */\nexport const TranscriptSchema = z.object({\n id: z.string(),\n title: z.string(),\n organizer_email: z.string(),\n host_email: z.string().optional(),\n user: UserSchema.optional(),\n speakers: z.array(SpeakerSchema),\n transcript_url: z.string(),\n participants: z.array(z.string()),\n meeting_attendees: z.array(MeetingAttendeeSchema),\n meeting_attendance: z.array(MeetingAttendanceSchema),\n fireflies_users: z.array(z.string()),\n workspace_users: z.array(z.string()),\n duration: z.number(),\n dateString: z.string(),\n date: z.number(),\n audio_url: z.string().optional(),\n video_url: z.string().optional(),\n sentences: z.array(SentenceSchema),\n calendar_id: z.string().optional(),\n summary: SummarySchema.optional(),\n meeting_info: MeetingInfoSchema.optional(),\n cal_id: z.string().optional(),\n calendar_type: z.string().optional(),\n apps_preview: AppsPreviewSchema.optional(),\n meeting_link: z.string().optional(),\n analytics: MeetingAnalyticsSchema.optional(),\n channels: z.array(ChannelSchema),\n});\n\n/**\n * Parse and validate data as a Transcript.\n *\n * Throws a ZodError if validation fails.\n *\n * @param data - Unknown data to validate\n * @returns Validated Transcript\n * @throws {z.ZodError} If validation fails\n *\n * @example\n * ```typescript\n * import { parseTranscript } from 'fireflies-api/schemas';\n *\n * try {\n * const transcript = parseTranscript(apiResponse);\n * console.log(transcript.title);\n * } catch (e) {\n * console.error('Invalid data:', e);\n * }\n * ```\n */\nexport function parseTranscript(data: unknown): Transcript {\n return TranscriptSchema.parse(data) as Transcript;\n}\n\n/**\n * Safely parse and validate data as a Transcript.\n *\n * Returns a result object with success/error instead of throwing.\n *\n * @param data - Unknown data to validate\n * @returns SafeParseResult with data on success, error on failure\n *\n * @example\n * ```typescript\n * import { safeParseTranscript } from 'fireflies-api/schemas';\n *\n * const result = safeParseTranscript(apiResponse);\n * if (result.success) {\n * console.log(result.data.title);\n * } else {\n * console.error('Validation failed:', result.error);\n * }\n * ```\n */\nexport function safeParseTranscript(data: unknown) {\n return TranscriptSchema.safeParse(data);\n}\n"]}
@@ -0,0 +1,275 @@
1
+ import { S as Speaker, T as Transcript } from './action-items-CC9yUxHY.js';
2
+
3
+ /**
4
+ * Options for normalizing a Fireflies transcript to provider-agnostic format.
5
+ */
6
+ interface NormalizationOptions {
7
+ /**
8
+ * Time unit for timestamps in sentences.
9
+ * @default 'seconds'
10
+ */
11
+ timeUnit?: 'seconds' | 'milliseconds';
12
+ /**
13
+ * Include original Fireflies data in source.rawData.
14
+ * @default false
15
+ */
16
+ includeRawData?: boolean;
17
+ /**
18
+ * Include AI-detected filters (sentiment, questions, tasks) in sentences.
19
+ * @default true
20
+ */
21
+ includeAIFilters?: boolean;
22
+ /**
23
+ * Include summary data if available.
24
+ * @default true
25
+ */
26
+ includeSummary?: boolean;
27
+ /**
28
+ * Custom speaker name resolver (e.g., map "Speaker 1" to real name).
29
+ */
30
+ resolveSpeakerName?: (speaker: Speaker, transcript: Transcript) => string;
31
+ /**
32
+ * Custom participant enrichment (e.g., add roles from external source).
33
+ */
34
+ enrichParticipant?: (email: string, transcript: Transcript) => Partial<NormalizedParticipant>;
35
+ }
36
+ /**
37
+ * A provider-agnostic normalized meeting transcript.
38
+ */
39
+ interface NormalizedMeeting {
40
+ /** Prefixed ID: "fireflies:abc123" */
41
+ id: string;
42
+ /** Meeting title */
43
+ title: string;
44
+ /** Meeting date */
45
+ date: Date;
46
+ /** Duration in seconds */
47
+ duration: number;
48
+ /** URL to view the transcript */
49
+ url: string;
50
+ /** Speakers identified in the transcript */
51
+ speakers: NormalizedSpeaker[];
52
+ /** Transcribed sentences */
53
+ sentences: NormalizedSentence[];
54
+ /** Meeting participants */
55
+ participants: NormalizedParticipant[];
56
+ /** AI-generated summary (if available and enabled) */
57
+ summary?: NormalizedSummary;
58
+ /** Meeting attendees with join/leave times */
59
+ attendees?: NormalizedAttendee[];
60
+ /** Channels the transcript is shared to */
61
+ channels?: NormalizedChannel[];
62
+ /** Meeting analytics */
63
+ analytics?: NormalizedAnalytics;
64
+ /** Source provider information */
65
+ source: {
66
+ provider: 'fireflies';
67
+ originalId: string;
68
+ rawData?: Transcript;
69
+ };
70
+ }
71
+ /**
72
+ * A normalized speaker in the transcript.
73
+ */
74
+ interface NormalizedSpeaker {
75
+ /** Speaker ID */
76
+ id: string;
77
+ /** Speaker name */
78
+ name: string;
79
+ }
80
+ /**
81
+ * A normalized sentence in the transcript.
82
+ */
83
+ interface NormalizedSentence {
84
+ /** Zero-based index */
85
+ index: number;
86
+ /** Speaker ID */
87
+ speakerId: string;
88
+ /** Speaker name */
89
+ speakerName: string;
90
+ /** Processed text */
91
+ text: string;
92
+ /** Original unprocessed text */
93
+ rawText: string;
94
+ /** Start time (in timeUnit) */
95
+ startTime: number;
96
+ /** End time (in timeUnit) */
97
+ endTime: number;
98
+ /** AI-detected sentiment */
99
+ sentiment?: 'positive' | 'negative' | 'neutral';
100
+ /** Whether this sentence is a question */
101
+ isQuestion?: boolean;
102
+ /** Whether this sentence is an action item */
103
+ isActionItem?: boolean;
104
+ }
105
+ /**
106
+ * A normalized meeting participant.
107
+ */
108
+ interface NormalizedParticipant {
109
+ /** Participant name */
110
+ name: string;
111
+ /** Email address */
112
+ email?: string;
113
+ /** Role in the meeting */
114
+ role?: 'organizer' | 'attendee';
115
+ }
116
+ /**
117
+ * A normalized meeting summary.
118
+ */
119
+ interface NormalizedSummary {
120
+ /** High-level overview */
121
+ overview?: string;
122
+ /** Key points or bullet summary */
123
+ keyPoints?: string[];
124
+ /** Action items text */
125
+ actionItems?: string;
126
+ /** Structured outline */
127
+ outline?: string;
128
+ /** Topics discussed */
129
+ topics?: string[];
130
+ }
131
+ /**
132
+ * A normalized meeting attendee with join/leave times.
133
+ */
134
+ interface NormalizedAttendee {
135
+ /** Attendee name */
136
+ name: string;
137
+ /** Email address */
138
+ email?: string;
139
+ /** Phone number */
140
+ phoneNumber?: string;
141
+ /** Time they joined */
142
+ joinTime?: Date;
143
+ /** Time they left */
144
+ leaveTime?: Date;
145
+ }
146
+ /**
147
+ * A normalized channel.
148
+ */
149
+ interface NormalizedChannel {
150
+ /** Channel ID */
151
+ id: string;
152
+ /** Channel title */
153
+ title: string;
154
+ /** Whether the channel is private */
155
+ isPrivate: boolean;
156
+ }
157
+ /**
158
+ * Normalized meeting analytics.
159
+ */
160
+ interface NormalizedAnalytics {
161
+ /** Sentiment breakdown (percentages 0-100) */
162
+ sentiments?: {
163
+ positive: number;
164
+ neutral: number;
165
+ negative: number;
166
+ };
167
+ }
168
+
169
+ /**
170
+ * Statistics for a single speaker in the meeting.
171
+ */
172
+ interface SpeakerStats {
173
+ /** Speaker name from transcript */
174
+ name: string;
175
+ /** Speaker ID from transcript */
176
+ id: string;
177
+ /** Total talk time in seconds */
178
+ talkTime: number;
179
+ /** Percentage of total meeting talk time (0-100) */
180
+ talkTimePercentage: number;
181
+ /** Number of sentences spoken */
182
+ sentenceCount: number;
183
+ /** Total words spoken */
184
+ wordCount: number;
185
+ /** Words per minute (based on talk time) */
186
+ wordsPerMinute: number;
187
+ /** Average words per sentence */
188
+ averageSentenceLength: number;
189
+ /** Number of speaking turns (consecutive sentence groups) */
190
+ turnCount: number;
191
+ }
192
+ /**
193
+ * Overall meeting speaker analytics.
194
+ */
195
+ interface SpeakerAnalytics {
196
+ /** Per-speaker statistics, sorted by talk time descending */
197
+ speakers: SpeakerStats[];
198
+ /** Total meeting duration from sentences (seconds) */
199
+ totalDuration: number;
200
+ /** Total talk time across all speakers (seconds) */
201
+ totalTalkTime: number;
202
+ /** Total sentences in transcript */
203
+ totalSentences: number;
204
+ /** Total words spoken */
205
+ totalWords: number;
206
+ /** Name of speaker with most talk time */
207
+ dominantSpeaker: string;
208
+ /** Talk time percentage of dominant speaker */
209
+ dominantSpeakerPercentage: number;
210
+ /** Balance indicator: balanced, unbalanced, or dominated */
211
+ balance: 'balanced' | 'unbalanced' | 'dominated';
212
+ }
213
+ /**
214
+ * Options for speaker analysis.
215
+ */
216
+ interface SpeakerAnalyticsOptions {
217
+ /**
218
+ * Merge speakers with identical names into a single entry (default: true).
219
+ *
220
+ * Fireflies' speaker diarization can incorrectly assign multiple speaker IDs
221
+ * to the same person, especially with:
222
+ * - Multiple audio channels/microphones
223
+ * - Short utterances being misattributed
224
+ * - Audio quality issues causing speaker model confusion
225
+ *
226
+ * This commonly manifests as rapid alternation between two IDs for the same
227
+ * speaker name, resulting in inflated turn counts and split statistics.
228
+ *
229
+ * When enabled (default), speakers are grouped by name rather than ID,
230
+ * combining their talk time, word counts, and other metrics. Turn counting
231
+ * uses speaker names, so consecutive sentences from the same person count
232
+ * as one turn regardless of ID changes.
233
+ *
234
+ * Set to `false` to preserve the raw speaker IDs from Fireflies, which may
235
+ * be useful for debugging diarization issues or when you have confirmed that
236
+ * multiple people share the same display name.
237
+ */
238
+ mergeSpeakersByName?: boolean;
239
+ /** Round percentages to integers (default: true) */
240
+ roundPercentages?: boolean;
241
+ /** Threshold for 'unbalanced' classification (default: 40) */
242
+ unbalancedThreshold?: number;
243
+ /** Threshold for 'dominated' classification (default: 60) */
244
+ dominatedThreshold?: number;
245
+ }
246
+ /**
247
+ * Analyze speaker participation in a transcript.
248
+ *
249
+ * Computes talk time percentages, word counts, and participation metrics
250
+ * for each speaker in the meeting.
251
+ *
252
+ * @param transcript - The transcript to analyze
253
+ * @param options - Analysis options
254
+ * @returns Speaker analytics with per-speaker stats and totals
255
+ *
256
+ * @example
257
+ * ```typescript
258
+ * import { FirefliesClient, analyzeSpeakers } from 'fireflies-api';
259
+ *
260
+ * const client = new FirefliesClient({ apiKey: 'your-api-key' });
261
+ * const transcript = await client.transcripts.get({ id: 'transcript-id' });
262
+ *
263
+ * const analytics = analyzeSpeakers(transcript);
264
+ *
265
+ * console.log(`${analytics.speakers.length} speakers`);
266
+ * console.log(`Dominant: ${analytics.dominantSpeaker} (${analytics.dominantSpeakerPercentage}%)`);
267
+ *
268
+ * for (const speaker of analytics.speakers) {
269
+ * console.log(`${speaker.name}: ${speaker.talkTimePercentage}% talk time, ${speaker.wordCount} words`);
270
+ * }
271
+ * ```
272
+ */
273
+ declare function analyzeSpeakers(transcript: Transcript, options?: SpeakerAnalyticsOptions): SpeakerAnalytics;
274
+
275
+ export { type NormalizedMeeting as N, type SpeakerAnalytics as S, type NormalizationOptions as a, type NormalizedAnalytics as b, type NormalizedAttendee as c, type NormalizedChannel as d, type NormalizedParticipant as e, type NormalizedSentence as f, type NormalizedSpeaker as g, type NormalizedSummary as h, type SpeakerAnalyticsOptions as i, type SpeakerStats as j, analyzeSpeakers as k };