/** * # Meetings SDK namespace (admin surface) * * ## PHI and encryption at rest (post PR-A) * * All free-text and free-form fields on the three Meetings resources are * PHI-class and are encrypted at rest with AES-256-GCM via AshCloak * (HKDF-SHA256 from the platform vault). Seven attributes are stored as * ciphertext at the database layer: * * | Resource | Field | Default response | * |----------------------|------------------|----------------------------------------| * | meetings.meetings | summary_text | decrypted | * | meetings.meetings | key_topics | decrypted | * | meetings.meetings | decisions | decrypted | * | meetings.meetings | attendees | decrypted | * | meetings.transcripts | transcript_text | OMITTED — opt-in via sparse fieldset | * | meetings.transcripts | segments | OMITTED — opt-in via sparse fieldset | * | meetings.actionItems | task_text | decrypted | * * `MeetingTranscript` PHI requires the sparse-fieldset opt-in. Use the * `includePhi: true` flag on `transcripts.list` / `transcripts.get` (which * injects `fields[meeting-transcript]=transcript_text,segments`) or send * the query parameter directly. Sorting / filtering / aggregating on * encrypted fields is not supported. * * ## Capability & error codes * * Capability-gated on `:meeting_intelligence`. ISV-admin keys (`sk_srv_`) * authorize via `meetings:read` and `meetings:write` scopes. * * - `meeting_intelligence_capability_disabled` (HTTP 403) — surfaced by * every facade-dispatch endpoint and propagates to read / write * endpoints when the Application has not enabled * `:meeting_intelligence`. Error body shape: * `{ errors: [{ code, detail, status: "403" }] }`. */ import type { Meeting, MeetingTranscript, MeetingActionItem } from "../_internal/types.gen"; import type { RequestOptions } from "../base-client"; import { RequestBuilder } from "../request-builder"; /** * Per-attendee metadata. PHI — the parent `attendees` map is encrypted at * rest via AshCloak. The shape is server-validated by `ValidAttendees` * (max 1000 entries; key length <= 254; value length <= 200). All members * are optional; only the email key is required. */ export type MeetingAttendee = { /** Display name of the attendee. */ name?: string; /** Free-form role string (e.g., "host", "presenter"). */ role?: string; /** Whether the attendee is optional for the meeting. */ optional?: boolean; /** RSVP / response status (e.g., "accepted", "declined", "tentative", "needs_action"). */ response_status?: string; }; /** Attributes accepted when creating a Meeting (admin surface). */ export type CreateMeetingAttributes = { source_system: "microsoft_365" | "google_calendar" | "manual"; source_id: string; title: string; status?: "scheduled" | "in_progress" | "completed" | "cancelled"; start_time?: string | null; end_time?: string | null; organizer_email?: string | null; /** * Map of attendee email -> attendee metadata. PHI — encrypted at rest * (AshCloak). Server-side validated for shape and size. */ attendees?: Record; join_url?: string | null; location?: string | null; /** ISV-defined freeform metadata. */ custom_fields?: Record; external_url?: string | null; }; /** Attributes accepted when updating a Meeting (admin surface, all optional). */ export type UpdateMeetingAttributes = { title?: string; status?: "scheduled" | "in_progress" | "completed" | "cancelled"; start_time?: string | null; end_time?: string | null; organizer_email?: string | null; /** * Map of attendee email -> attendee metadata. PHI — encrypted at rest * (AshCloak). PATCH semantics: omit the key to leave the stored value * unchanged; send `{}` to replace with an empty map. The server replaces * (not merges) the persisted value when this attribute is present. */ attendees?: Record; join_url?: string | null; location?: string | null; /** * ISV-defined freeform metadata. PATCH semantics: omit to leave the * stored value unchanged; send `{}` to replace with an empty map. */ custom_fields?: Record; external_url?: string | null; }; /** * Admin surface for the Meetings domain — full CRUD on Meeting plus read * access to MeetingTranscript and MeetingActionItem. Capability-gated on * `:meeting_intelligence`. ISV-admin keys (`sk_srv_`) authorize via * `meetings:read` and `meetings:write` scopes. * * Sub-resources: * - `meetings` — Meeting aggregates. `summary_text` / `key_topics` / * `decisions` are PHI-adjacent + system-stamped (LLM output of * `:apply_processing`); `attendees` is PHI. All four are AshCloak- * encrypted at rest and decrypted by default on read. * - `transcripts` — MeetingTranscript records (1:1 with Meeting). * `transcript_text` and `segments` are PHI, encrypted at rest, and * require sparse-fieldset opt-in via `includePhi: true`. * - `actionItems` — MeetingActionItem rows. `task_text` is PHI, * encrypted at rest, decrypted on read. * * Sync, transcript upload, and processing flows are NOT exposed as SDK * methods — they reach end users via AshAi tools + the Meetings facade. * Every facade-dispatch endpoint can return HTTP 403 with code * `meeting_intelligence_capability_disabled` when the workspace's * Application lacks `:meeting_intelligence`. * * @example * ```typescript * const admin = new GptAdmin({ apiKey: "sk_srv_..." }); * * // List meetings across the workspace * const meetings = await admin.meetings.meetings.list(); * * // Create a manual meeting * const m = await admin.meetings.meetings.create({ * source_system: "manual", * source_id: "manual-2026-001", * title: "Quarterly Planning", * }); * * // List action items * const items = await admin.meetings.actionItems.list(); * * // Opt in to PHI on a transcript read * const t = await admin.meetings.transcripts.get(transcriptId, { * includePhi: true, * }); * ``` */ export declare function createMeetingsNamespace(rb: RequestBuilder): { /** * Meeting aggregates — admin surface (full CRUD). */ meetings: { /** * List Meetings across the workspace (admin scope). * * @param options - Optional pagination and request settings. * @returns A promise resolving to Meeting records. * @throws GptApiError with code * `meeting_intelligence_capability_disabled` (HTTP 403) when the * workspace's Application lacks the capability. */ list: (options?: { page?: number; pageSize?: number; } & RequestOptions) => Promise; /** * Fetch a Meeting by id. * * @param id - Meeting id. * @param options - Optional request settings. * @returns A promise resolving to the Meeting. * @throws GptApiError with code * `meeting_intelligence_capability_disabled` (HTTP 403) when the * workspace's Application lacks the capability. */ get: (id: string, options?: RequestOptions) => Promise; /** * Create a manual Meeting. The `source_system` MUST be `"manual"` for * caller-initiated creates — Microsoft 365 and Google Calendar rows * arrive via the connector sync pipeline (`:sync_upsert`, system-only). * * Body shape: `{ data: { type: "meeting", attributes: {...} } }`. * * @param attributes - Accepted Meeting create attributes. * @param options - Optional request settings. * @returns A promise resolving to the created Meeting. * @throws GptApiError with code * `meeting_intelligence_capability_disabled` (HTTP 403) when the * workspace's Application lacks the capability. * * @example * ```typescript * await admin.meetings.meetings.create({ * source_system: "manual", * source_id: "manual-1", * title: "Standup", * status: "scheduled", * }); * ``` */ create: (attributes: CreateMeetingAttributes, options?: RequestOptions) => Promise; /** * Update mutable Meeting fields. * * Note: `attendees` and `custom_fields` use REPLACE semantics on * PATCH (omit to leave unchanged; send `{}` to clear). * * @param id - Meeting id. * @param attributes - Accepted Meeting update attributes. * @param options - Optional request settings. * @returns A promise resolving to the updated Meeting. * @throws GptApiError with code * `meeting_intelligence_capability_disabled` (HTTP 403) when the * workspace's Application lacks the capability. * * @example * ```typescript * await admin.meetings.meetings.update(meetingId, { * status: "completed", * end_time: "2026-05-10T16:30:00Z", * }); * ``` */ update: (id: string, attributes: UpdateMeetingAttributes, options?: RequestOptions) => Promise; /** * Delete a Meeting. Cascades to its MeetingTranscript and * MeetingActionItem rows at the FK level. A single * `meetings.meeting.deleted` event covers the entire subtree — no * per-child events fire on cascade. * * @param id - Meeting id. * @param options - Optional request settings. * @returns A promise resolving to `true` on success. * @throws GptApiError with code * `meeting_intelligence_capability_disabled` (HTTP 403) when the * workspace's Application lacks the capability. * * @example * ```typescript * await admin.meetings.meetings.delete(meetingId); * ``` */ delete: (id: string, options?: RequestOptions) => Promise; }; /** * MeetingTranscript records — one per Meeting. * * **PHI default-deny contract (post PR-A):** `transcript_text` and * `segments` are encrypted at rest via AshCloak and are NOT returned * by default. Use `includePhi: true` on `list` / `get` to opt in via * sparse fieldsets (`fields[meeting-transcript]=transcript_text,segments`). * Downstream PHI handling (storage, redaction, retention) is the * ISV's responsibility under their own HIPAA / data-protection * controls. */ transcripts: { /** * List MeetingTranscript records across the workspace. * * Pass `includePhi: true` to opt in to the AshCloak-encrypted PHI * fields (`transcript_text`, `segments`) via sparse fieldset. * * @param options - Optional pagination, PHI opt-in, and request settings. * @returns A promise resolving to MeetingTranscript records. * @throws GptApiError with code * `meeting_intelligence_capability_disabled` (HTTP 403) when the * workspace's Application lacks the capability. */ list: (options?: { page?: number; pageSize?: number; includePhi?: boolean; } & RequestOptions) => Promise; /** * Fetch a MeetingTranscript by id. * * Pass `includePhi: true` to opt in to the AshCloak-encrypted PHI * fields (`transcript_text`, `segments`) via sparse fieldset. * * @param id - MeetingTranscript id. * @param options - Optional PHI opt-in and request settings. * @returns A promise resolving to the MeetingTranscript. * @throws GptApiError with code * `meeting_intelligence_capability_disabled` (HTTP 403) when the * workspace's Application lacks the capability. * * @example * ```typescript * const t = await admin.meetings.transcripts.get(id, { * includePhi: true, * }); * ``` */ get: (id: string, options?: RequestOptions & { includePhi?: boolean; }) => Promise; }; /** * MeetingActionItem records — typed action items extracted by the * `MeetingProcessor` LLM pipeline. `task_text` is PHI (may contain * participant names), encrypted at rest via AshCloak, decrypted on * read. */ actionItems: { /** * List MeetingActionItem records across the workspace. * * @param options - Optional pagination and request settings. * @returns A promise resolving to MeetingActionItem records. * @throws GptApiError with code * `meeting_intelligence_capability_disabled` (HTTP 403) when the * workspace's Application lacks the capability. */ list: (options?: { page?: number; pageSize?: number; } & RequestOptions) => Promise; /** * Fetch a MeetingActionItem by id. * * @param id - MeetingActionItem id. * @param options - Optional request settings. * @returns A promise resolving to the MeetingActionItem. * @throws GptApiError with code * `meeting_intelligence_capability_disabled` (HTTP 403) when the * workspace's Application lacks the capability. */ get: (id: string, options?: RequestOptions) => Promise; }; }; /** Public type alias for the admin meetings namespace return shape. */ export type MeetingsAPI = ReturnType; //# sourceMappingURL=meetings.d.ts.map