* Converts a CalendarEvent to an ExternalDocument. * * Backward compatibility: when only a single calendar is configured (the only * code path that existed before multi-calendar support), externalId and * contentHash use the legacy non-namespaced format so existing connectors see * zero churn o
( event: CalendarEvent, calendarId: string, isMultiCalendar: boolean )
| 203 | * single calendar. |
| 204 | */ |
| 205 | function eventToDocument( |
| 206 | event: CalendarEvent, |
| 207 | calendarId: string, |
| 208 | isMultiCalendar: boolean |
| 209 | ): ExternalDocument | null { |
| 210 | if (event.status === 'cancelled') return null |
| 211 | |
| 212 | const content = eventToContent(event) |
| 213 | if (!content.trim()) return null |
| 214 | |
| 215 | const startTime = event.start?.dateTime || event.start?.date || '' |
| 216 | const attendeeCount = event.attendees?.filter((a) => !a.resource).length || 0 |
| 217 | |
| 218 | const externalId = isMultiCalendar ? `${calendarId}:${event.id}` : event.id |
| 219 | const contentHash = isMultiCalendar |
| 220 | ? `gcal:${calendarId}:${event.id}:${event.updated ?? ''}` |
| 221 | : `gcal:${event.id}:${event.updated ?? ''}` |
| 222 | |
| 223 | return { |
| 224 | externalId, |
| 225 | title: event.summary || 'Untitled Event', |
| 226 | content, |
| 227 | mimeType: 'text/plain', |
| 228 | sourceUrl: event.htmlLink || `https://calendar.google.com/calendar/event?eid=${event.id}`, |
| 229 | contentHash, |
| 230 | metadata: { |
| 231 | calendarId, |
| 232 | startTime, |
| 233 | endTime: event.end?.dateTime || event.end?.date || '', |
| 234 | location: event.location || '', |
| 235 | organizer: formatOrganizer(event.organizer), |
| 236 | attendeeCount, |
| 237 | isAllDay: isAllDayEvent(event), |
| 238 | eventDate: startTime, |
| 239 | updatedTime: event.updated, |
| 240 | createdTime: event.created, |
| 241 | }, |
| 242 | } |
| 243 | } |
| 244 | |
| 245 | export const googleCalendarConnector: ConnectorConfig = { |
| 246 | ...googleCalendarConnectorMeta, |
no test coverage detected