From f7397cabce413409f5188124c1e3bf4d4816755f Mon Sep 17 00:00:00 2001 From: Zita Szupera Date: Tue, 14 Apr 2026 09:06:14 +0200 Subject: [PATCH 1/2] feat: update to open api version 225.16.0 --- src/gen/feeds/FeedsApi.ts | 2 + src/gen/models/index.ts | 163 ++++++++++++++++++++++++---- src/gen/moderation/ModerationApi.ts | 43 +++++++- 3 files changed, 180 insertions(+), 28 deletions(-) diff --git a/src/gen/feeds/FeedsApi.ts b/src/gen/feeds/FeedsApi.ts index 56e27e7..ccc66ec 100644 --- a/src/gen/feeds/FeedsApi.ts +++ b/src/gen/feeds/FeedsApi.ts @@ -1506,12 +1506,14 @@ export class FeedsApi { feed_id: request?.feed_id, }; const body = { + clear_location: request?.clear_location, created_by_id: request?.created_by_id, description: request?.description, enrich_own_fields: request?.enrich_own_fields, name: request?.name, filter_tags: request?.filter_tags, custom: request?.custom, + location: request?.location, }; const response = await this.apiClient.sendRequest< diff --git a/src/gen/models/index.ts b/src/gen/models/index.ts index beba561..11863f6 100644 --- a/src/gen/models/index.ts +++ b/src/gen/models/index.ts @@ -450,18 +450,6 @@ export interface ActivityFeedbackResponse { duration: string; } -export interface ActivityLocation { - /** - * Latitude coordinate - */ - lat: number; - - /** - * Longitude coordinate - */ - lng: number; -} - export interface ActivityMarkEvent { /** * Date/time of creation @@ -775,7 +763,7 @@ export interface ActivityRequest { */ custom?: Record; - location?: ActivityLocation; + location?: Location; /** * Additional data for search indexing @@ -979,7 +967,7 @@ export interface ActivityResponse { current_feed?: FeedResponse; - location?: ActivityLocation; + location?: Location; metrics?: Record; @@ -1270,7 +1258,7 @@ export interface AddActivityRequest { */ custom?: Record; - location?: ActivityLocation; + location?: Location; /** * Additional data for search indexing @@ -1593,6 +1581,12 @@ export interface AggregatedActivityResponse { } export interface AggregationConfig { + /** + * Order of member activities inside each aggregated group for non-stories feeds: created_at_desc (newest first, default) or created_at_asc (oldest first). Stories feeds ignore this and always use oldest first. + */ + + activities_sort?: 'created_at_asc' | 'created_at_desc'; + /** * Format for activity aggregation */ @@ -2679,6 +2673,26 @@ export interface BulkImageModerationResponse { task_id: string; } +export interface BypassActionRequest { + enabled?: boolean; +} + +export interface BypassRequest { + /** + * Whether to enable moderation bypass for this user + */ + enabled: boolean; + + /** + * ID of the user to update + */ + target_user_id: string; +} + +export interface BypassResponse { + duration: string; +} + export interface CallAcceptedEvent { call_cid: string; @@ -3888,10 +3902,18 @@ export interface CallStatsParticipantCounts { sessions: number; + sfus_used: number; + + average_jitter_ms?: number; + + average_latency_ms?: number; + call_event_count?: number; cq_score?: number; + max_freezes_duration_ms?: number; + total_participant_duration?: number; } @@ -3916,6 +3938,12 @@ export interface CallStatsParticipantSession { ended_at?: Date; + freezes_duration_ms?: number; + + jitter_ms?: number; + + latency_ms?: number; + os?: string; publisher_type?: string; @@ -8358,11 +8386,6 @@ export interface EnrichmentOptions { */ enrich_own_followings?: boolean; - /** - * Default: false. When true, includes the top-level flat 'activities' array in responses for aggregated feeds. By default, aggregated feeds only return 'aggregated_activities'. - */ - include_flat_activities?: boolean; - /** * Default: false. When true, includes score_vars in activity responses containing variable values used at ranking time. */ @@ -8498,6 +8521,8 @@ export interface EntityCreatorResponse { ban_expires?: Date; + bypass_moderation?: boolean; + deactivated_at?: Date; deleted_at?: Date; @@ -8978,6 +9003,8 @@ export interface FeedInput { members?: FeedMemberRequest[]; custom?: Record; + + location?: Location; } export interface FeedMemberAddedEvent { @@ -9222,6 +9249,8 @@ export interface FeedRequest { * Custom data for the feed */ custom?: Record; + + location?: Location; } export interface FeedResponse { @@ -9320,6 +9349,8 @@ export interface FeedResponse { */ custom?: Record; + location?: Location; + own_membership?: FeedMemberResponse; } @@ -9425,6 +9456,8 @@ export interface FeedSuggestionResponse { */ custom?: Record; + location?: Location; + own_membership?: FeedMemberResponse; } @@ -10205,6 +10238,8 @@ export interface FullUserResponse { ban_expires?: Date; + bypass_moderation?: boolean; + deactivated_at?: Date; deleted_at?: Date; @@ -10722,6 +10757,8 @@ export interface GetImportV2TaskResponse { updated_at: Date; settings: ImportV2TaskSettings; + + result?: Record; } export interface GetManyMessagesResponse { @@ -11405,6 +11442,8 @@ export interface ImportV2TaskItem { updated_at: Date; settings: ImportV2TaskSettings; + + result?: Record; } export interface ImportV2TaskSettings { @@ -12069,6 +12108,18 @@ export interface ListUserGroupsResponse { user_groups: UserGroupResponse[]; } +export interface Location { + /** + * Latitude coordinate + */ + lat: number; + + /** + * Longitude coordinate + */ + lng: number; +} + export interface LocationResponse { /** * Continent code @@ -16221,7 +16272,7 @@ export interface QueryCommentReactionsResponse { export interface QueryCommentsRequest { /** - * MongoDB-style filter for querying comments + * Filter to apply to the query */ filter: Record; @@ -16240,7 +16291,7 @@ export interface QueryCommentsRequest { prev?: string; /** - * first (oldest), last (newest) or top. One of: first, last, top, best, controversial + * Array of sort parameters */ sort?: 'first' | 'last' | 'top' | 'best' | 'controversial'; @@ -17384,6 +17435,8 @@ export interface RankingConfig { export interface RawRecordSettings { mode: 'available' | 'disabled' | 'auto-on'; + + audio_only?: boolean; } export interface RawRecordingResponse { @@ -17396,10 +17449,17 @@ export interface RawRecordingSettingsRequest { */ mode: 'available' | 'disabled' | 'auto-on'; + + /** + * If true, only audio tracks will be recorded + */ + audio_only?: boolean; } export interface RawRecordingSettingsResponse { mode: 'available' | 'disabled' | 'auto-on'; + + audio_only?: boolean; } export interface Reaction { @@ -20042,7 +20102,8 @@ export interface SubmitActionRequest { | 'end_call' | 'reject_appeal' | 'escalate' - | 'de_escalate'; + | 'de_escalate' + | 'bypass'; /** * UUID of the appeal to act on (required for reject_appeal, optional for other actions) @@ -20060,6 +20121,8 @@ export interface SubmitActionRequest { block?: BlockActionRequestPayload; + bypass?: BypassActionRequest; + custom?: CustomActionRequestPayload; delete_activity?: DeleteActivityRequestPayload; @@ -21318,7 +21381,7 @@ export interface UpdateActivityRequest { */ custom?: Record; - location?: ActivityLocation; + location?: Location; /** * Additional data for search indexing @@ -22134,6 +22197,11 @@ export interface UpdateFeedMembersResponse { } export interface UpdateFeedRequest { + /** + * If true, removes the geographic location from the feed + */ + clear_location?: boolean; + /** * ID of the new feed creator (owner) */ @@ -22163,6 +22231,8 @@ export interface UpdateFeedRequest { * Custom data for the feed */ custom?: Record; + + location?: Location; } export interface UpdateFeedResponse { @@ -22798,6 +22868,9 @@ export interface UpsertConfigRequest { */ team?: string; + /** + * Optional user ID to associate with the audit log entry + */ user_id?: string; ai_image_config?: AIImageConfig; @@ -22861,29 +22934,69 @@ export interface UpsertExternalStorageResponse { } export interface UpsertModerationRuleRequest { + /** + * Unique rule name + */ name: string; + /** + * Type of rule: user, content, or call + */ rule_type: string; + /** + * Duration before rule can trigger again (e.g. 24h, 7d) + */ cooldown_period?: string; + /** + * Optional description of the rule + */ description?: string; + /** + * Whether the rule is active + */ enabled?: boolean; + /** + * Logical operator between conditions/groups: AND or OR + */ logic?: string; + /** + * Team scope for the rule + */ team?: string; + /** + * Optional user ID to associate with the audit log entry + */ + user_id?: string; + + /** + * Escalation sequences for call rules + */ action_sequences?: CallRuleActionSequence[]; + /** + * Flat list of conditions (legacy) + */ conditions?: RuleBuilderCondition[]; + /** + * List of config keys this rule applies to + */ config_keys?: string[]; + /** + * Nested condition groups + */ groups?: RuleBuilderConditionGroup[]; action?: RuleBuilderAction; + + user?: UserRequest; } export interface UpsertModerationRuleResponse { @@ -23612,6 +23725,8 @@ export interface UserResponse { */ ban_expires?: Date; + bypass_moderation?: boolean; + /** * Date of deactivation */ diff --git a/src/gen/moderation/ModerationApi.ts b/src/gen/moderation/ModerationApi.ts index b97229e..b175104 100644 --- a/src/gen/moderation/ModerationApi.ts +++ b/src/gen/moderation/ModerationApi.ts @@ -6,6 +6,8 @@ import { BanResponse, BulkImageModerationRequest, BulkImageModerationResponse, + BypassRequest, + BypassResponse, CheckRequest, CheckResponse, CheckS3AccessRequest, @@ -211,6 +213,30 @@ export class ModerationApi { return { ...response.body, metadata: response.metadata }; } + async bypass( + request: BypassRequest, + ): Promise> { + const body = { + enabled: request?.enabled, + target_user_id: request?.target_user_id, + }; + + const response = await this.apiClient.sendRequest< + StreamResponse + >( + 'POST', + '/api/v2/moderation/bypass', + undefined, + undefined, + body, + 'application/json', + ); + + decoders.BypassResponse?.(response.body); + + return { ...response.body, metadata: response.metadata }; + } + async check(request: CheckRequest): Promise> { const body = { entity_creator_id: request?.entity_creator_id, @@ -311,9 +337,11 @@ export class ModerationApi { async deleteConfig(request: { key: string; team?: string; + user_id?: string; }): Promise> { const queryParams = { team: request?.team, + user_id: request?.user_id, }; const pathParams = { key: request?.key, @@ -583,11 +611,13 @@ export class ModerationApi { enabled: request?.enabled, logic: request?.logic, team: request?.team, + user_id: request?.user_id, action_sequences: request?.action_sequences, conditions: request?.conditions, config_keys: request?.config_keys, groups: request?.groups, action: request?.action, + user: request?.user, }; const response = await this.apiClient.sendRequest< @@ -606,16 +636,20 @@ export class ModerationApi { return { ...response.body, metadata: response.metadata }; } - async deleteModerationRule(): Promise< - StreamResponse - > { + async deleteModerationRule(request?: { + user_id?: string; + }): Promise> { + const queryParams = { + user_id: request?.user_id, + }; + const response = await this.apiClient.sendRequest< StreamResponse >( 'DELETE', '/api/v2/moderation/moderation_rule/{id}', undefined, - undefined, + queryParams, ); decoders.DeleteModerationRuleResponse?.(response.body); @@ -747,6 +781,7 @@ export class ModerationApi { user_id: request?.user_id, ban: request?.ban, block: request?.block, + bypass: request?.bypass, custom: request?.custom, delete_activity: request?.delete_activity, delete_comment: request?.delete_comment, From 24b8aa18be5817a48dd9e89866fd2e8a56e460bd Mon Sep 17 00:00:00 2001 From: Zita Szupera Date: Wed, 15 Apr 2026 10:37:54 +0200 Subject: [PATCH 2/2] fix decoders --- __tests__/date-transform.test.ts | 3 +- src/gen/model-decoders/decoders.ts | 90 ++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 2 deletions(-) diff --git a/__tests__/date-transform.test.ts b/__tests__/date-transform.test.ts index 1e64800..72f4a1f 100644 --- a/__tests__/date-transform.test.ts +++ b/__tests__/date-transform.test.ts @@ -61,8 +61,7 @@ describe('Date conversion', () => { await call.delete(); }); - // Skipping for now, will fix in a follow up PR - it.skip('channel + members', async () => { + it('channel + members', async () => { const id = uuidv4(); const channel = client.chat.channel('messaging', id); const response = await channel.getOrCreate({ diff --git a/src/gen/model-decoders/decoders.ts b/src/gen/model-decoders/decoders.ts index 71b2537..b0c26f0 100644 --- a/src/gen/model-decoders/decoders.ts +++ b/src/gen/model-decoders/decoders.ts @@ -948,6 +948,8 @@ decoders.CallResponse = (input?: Record) => { created_by: { type: 'UserResponse', isSingle: true }, + egress: { type: 'EgressResponse', isSingle: true }, + ended_at: { type: 'DatetimeType', isSingle: true }, starts_at: { type: 'DatetimeType', isSingle: true }, @@ -1578,6 +1580,13 @@ decoders.ChatActivityStatsResponse = (input?: Record) => { return decode(typeMappings, input); }; +decoders.CheckResponse = (input?: Record) => { + const typeMappings: TypeMapping = { + item: { type: 'ReviewQueueItemResponse', isSingle: true }, + }; + return decode(typeMappings, input); +}; + decoders.ClosedCaptionEvent = (input?: Record) => { const typeMappings: TypeMapping = { created_at: { type: 'DatetimeType', isSingle: true }, @@ -1986,6 +1995,13 @@ decoders.EgressRTMPResponse = (input?: Record) => { return decode(typeMappings, input); }; +decoders.EgressResponse = (input?: Record) => { + const typeMappings: TypeMapping = { + rtmps: { type: 'EgressRTMPResponse', isSingle: false }, + }; + return decode(typeMappings, input); +}; + decoders.EnrichedCollection = (input?: Record) => { const typeMappings: TypeMapping = { created_at: { type: 'DatetimeType', isSingle: true }, @@ -2502,12 +2518,16 @@ decoders.GetCallParticipantSessionMetricsResponse = ( ) => { const typeMappings: TypeMapping = { joined_at: { type: 'DatetimeType', isSingle: true }, + + published_tracks: { type: 'PublishedTrackMetrics', isSingle: false }, }; return decode(typeMappings, input); }; decoders.GetCallReportResponse = (input?: Record) => { const typeMappings: TypeMapping = { + report: { type: 'ReportResponse', isSingle: true }, + video_reactions: { type: 'VideoReactionsResponse', isSingle: false }, chat_activity: { type: 'ChatActivityStatsResponse', isSingle: true }, @@ -2526,6 +2546,15 @@ decoders.GetCallResponse = (input?: Record) => { return decode(typeMappings, input); }; +decoders.GetCallSessionParticipantStatsDetailsResponse = ( + input?: Record, +) => { + const typeMappings: TypeMapping = { + timeframe: { type: 'ParticipantSeriesTimeframe', isSingle: true }, + }; + return decode(typeMappings, input); +}; + decoders.GetCallTypeResponse = (input?: Record) => { const typeMappings: TypeMapping = { created_at: { type: 'DatetimeType', isSingle: true }, @@ -2535,6 +2564,13 @@ decoders.GetCallTypeResponse = (input?: Record) => { return decode(typeMappings, input); }; +decoders.GetCampaignResponse = (input?: Record) => { + const typeMappings: TypeMapping = { + campaign: { type: 'CampaignResponse', isSingle: true }, + }; + return decode(typeMappings, input); +}; + decoders.GetChannelTypeResponse = (input?: Record) => { const typeMappings: TypeMapping = { created_at: { type: 'DatetimeType', isSingle: true }, @@ -3495,6 +3531,16 @@ decoders.ParticipantCountOverTimeResponse = (input?: Record) => { return decode(typeMappings, input); }; +decoders.ParticipantReportResponse = (input?: Record) => { + const typeMappings: TypeMapping = { + count_over_time: { + type: 'ParticipantCountOverTimeResponse', + isSingle: true, + }, + }; + return decode(typeMappings, input); +}; + decoders.ParticipantSeriesTimeframe = (input?: Record) => { const typeMappings: TypeMapping = { since: { type: 'DatetimeType', isSingle: true }, @@ -3606,6 +3652,13 @@ decoders.PollVotesResponse = (input?: Record) => { return decode(typeMappings, input); }; +decoders.PublishedTrackMetrics = (input?: Record) => { + const typeMappings: TypeMapping = { + warnings: { type: 'SessionWarningResponse', isSingle: false }, + }; + return decode(typeMappings, input); +}; + decoders.PushNotificationFields = (input?: Record) => { const typeMappings: TypeMapping = { providers: { type: 'PushProvider', isSingle: false }, @@ -3801,6 +3854,13 @@ decoders.QueryCampaignsResponse = (input?: Record) => { return decode(typeMappings, input); }; +decoders.QueryChannelsResponse = (input?: Record) => { + const typeMappings: TypeMapping = { + channels: { type: 'ChannelStateResponseFields', isSingle: false }, + }; + return decode(typeMappings, input); +}; + decoders.QueryCollectionsResponse = (input?: Record) => { const typeMappings: TypeMapping = { collections: { type: 'CollectionResponse', isSingle: false }, @@ -3952,6 +4012,13 @@ decoders.QueryRemindersResponse = (input?: Record) => { return decode(typeMappings, input); }; +decoders.QueryReviewQueueResponse = (input?: Record) => { + const typeMappings: TypeMapping = { + items: { type: 'ReviewQueueItemResponse', isSingle: false }, + }; + return decode(typeMappings, input); +}; + decoders.QuerySegmentTargetsResponse = (input?: Record) => { const typeMappings: TypeMapping = { targets: { type: 'SegmentTargetResponse', isSingle: false }, @@ -4184,6 +4251,15 @@ decoders.RemoveUserGroupMembersResponse = (input?: Record) => { return decode(typeMappings, input); }; +decoders.ReportResponse = (input?: Record) => { + const typeMappings: TypeMapping = { + call: { type: 'CallReportResponse', isSingle: true }, + + participants: { type: 'ParticipantReportResponse', isSingle: true }, + }; + return decode(typeMappings, input); +}; + decoders.ResolveSipInboundResponse = (input?: Record) => { const typeMappings: TypeMapping = { sip_routing_rule: { type: 'SIPInboundRoutingRuleResponse', isSingle: true }, @@ -4319,6 +4395,13 @@ decoders.SIPTrunkResponse = (input?: Record) => { return decode(typeMappings, input); }; +decoders.SearchResponse = (input?: Record) => { + const typeMappings: TypeMapping = { + results: { type: 'SearchResult', isSingle: false }, + }; + return decode(typeMappings, input); +}; + decoders.SearchResult = (input?: Record) => { const typeMappings: TypeMapping = { message: { type: 'SearchResultMessage', isSingle: true }, @@ -4484,6 +4567,13 @@ decoders.SingleFollowResponse = (input?: Record) => { return decode(typeMappings, input); }; +decoders.StartCampaignResponse = (input?: Record) => { + const typeMappings: TypeMapping = { + campaign: { type: 'CampaignResponse', isSingle: true }, + }; + return decode(typeMappings, input); +}; + decoders.StopLiveResponse = (input?: Record) => { const typeMappings: TypeMapping = { call: { type: 'CallResponse', isSingle: true },