types.ts
Language TypeScript3.3 KB89 lines
/*** Fathom shapes, projected from the OpenAPI spec and corrected against live* responses.** Strict about the fields decisions are made from, permissive about the rest* (rule 4). Everything here that we do not act on is optional,* and unknown keys are simply ignored rather than rejected.*//*** A person as Fathom sends one. Both fields are nullable and that is not* theoretical: live assignees arrive with `email: null`, and occasionally with* both null. Attribution lives in* config/fathom-people.ts, not here; a client package has no roster.*/export interface FathomPerson {name: string | nullemail: string | null/** Fathom's own team label. Null on most records; we do not read it. */team?: string | null}/** An invitee, which is a person plus Fathom's own verdict on whether they are external. */export interface FathomInvitee extends FathomPerson {email_domain?: string | null/*** Trusted over any domain list. Northgate alone arrives under two domains,* northgate.example and northgate-studio.example, so a hand-kept table would* silently treat half their staff as internal.*/is_external: boolean}export interface FathomActionItem {description: string/** True when a human typed it rather than the model extracting it. */user_generated?: booleancompleted?: boolean/** HH:MM:SS from the start of the recording. */recording_timestamp?: string | null/** Deep link straight to the moment it was said. The reason this beats a bare list. */recording_playback_url?: string | null/** Null, or `{name: null, email: null}`, both mean nobody was named. */assignee: FathomPerson | null}export interface FathomMeeting {title: stringmeeting_title?: string | nullmeeting_type?: string | nullrecording_id: numberurl: stringshare_url?: string | nullcreated_at: stringrecording_start_time?: string | nullrecording_end_time?: string | null/*** Who inside the org may see this, in Fathom's own words: `no_teams` means* private to the recorder. Every meeting on this account reads `no_teams`,* which is why the board cannot rely on Fathom's permissions and gates by* participant itself. Why it reads that way is not established (rule 1).** This field does not describe who can see a meeting either: keys return* `no_teams` meetings recorded by someone other than the key's owner. Read it* as a team-sharing flag and nothing more.*/shared_with?: 'no_teams' | 'single_team' | 'multiple_teams' | 'all_teams' | stringcalendar_invitees_domains_type?: string | nullcalendar_invitees: FathomInvitee[]recorded_by: FathomPerson/** Present only when include_action_items was set. Null otherwise, not []. */action_items?: FathomActionItem[] | null/** Never requested by this client. See constants.ts on the heavy bucket. */transcript?: nulldefault_summary?: null}/*** A window of meetings, plus whether it is the whole window.** `truncated` is not cosmetic, same contract as OrderWindow and LeadWindow: a* caller cannot tell a complete sweep from a capped one by looking at the rows,* and a floor presented as a total misstates the window (rule 5).*/export interface MeetingWindow {meetings: FathomMeeting[]truncated: booleanpages: number}