From f74c550d9b798e7f7f3198dad81c62ad54febbdc Mon Sep 17 00:00:00 2001 From: Yun Wang Date: Thu, 18 Jun 2026 12:58:38 +0200 Subject: [PATCH] feat: openapi update 20260618 --- src/Generated/ChatTrait.php | 46 ++++++++++++++++ src/Generated/CommonTrait.php | 15 +++++ src/Generated/FeedsTrait.php | 47 ++++++++++++++++ src/Generated/ModerationTrait.php | 55 +++++++++++++++++++ src/Generated/VideoTrait.php | 14 +++++ src/Generated/Webhook.php | 6 ++ .../AddSegmentTargetsRequest.php | 15 +++++ src/GeneratedModels/AnalyzeImageField.php | 24 ++++++++ src/GeneratedModels/AnalyzeRequest.php | 25 +++++++++ src/GeneratedModels/AnalyzeResponse.php | 22 ++++++++ src/GeneratedModels/AnalyzeTextField.php | 22 ++++++++ src/GeneratedModels/AppResponseFields.php | 3 + src/GeneratedModels/AppealItemResponse.php | 16 ++++++ src/GeneratedModels/AppealRequest.php | 1 + src/GeneratedModels/BlockListResponse.php | 1 + .../BulkActionAppealsRequest.php | 23 ++++++++ .../BulkActionAppealsResponse.php | 21 +++++++ src/GeneratedModels/BulkAppealError.php | 16 ++++++ src/GeneratedModels/BulkAppealResult.php | 16 ++++++ .../CallStatsParticipantCounts.php | 2 + .../CancelImportV2TaskRequest.php | 14 +++++ .../CancelImportV2TaskResponse.php | 18 ++++++ src/GeneratedModels/ChannelConfig.php | 51 ++++++----------- src/GeneratedModels/ChatMessageResponse.php | 3 + src/GeneratedModels/Classification.php | 20 +++++++ src/GeneratedModels/ClientEvent.php | 43 +++++++++++++++ .../ClosedCaptionRuleParameters.php | 1 + src/GeneratedModels/ConfigResponse.php | 1 + .../ContentCustomPropertyCountParameters.php | 18 ++++++ .../ContentCustomPropertyParameters.php | 16 ++++++ .../CreateBlockListRequest.php | 1 + src/GeneratedModels/CreateDeviceRequest.php | 1 + src/GeneratedModels/CreateSegmentRequest.php | 21 +++++++ src/GeneratedModels/CreateSegmentResponse.php | 19 +++++++ src/GeneratedModels/DeviceResponse.php | 1 + src/GeneratedModels/FilterConfigResponse.php | 7 ++- src/GeneratedModels/FloodConfig.php | 16 ++++++ src/GeneratedModels/FloodIdenticalConfig.php | 18 ++++++ src/GeneratedModels/FloodSimilarConfig.php | 19 +++++++ src/GeneratedModels/FollowRequest.php | 2 +- .../GetOrCreateFeedRequest.php | 1 + .../GetOrCreateFollowResponse.php | 18 ++++++ .../GetOrCreateUnfollowRequest.php | 19 +++++++ .../GetOrCreateUnfollowResponse.php | 17 ++++++ .../GetSetupSessionResponse.php | 16 ++++++ .../GetUserInterestsResponse.php | 21 +++++++ src/GeneratedModels/GroupedChannelsBucket.php | 2 + .../GroupedChannelsGroupRequest.php | 17 ++++++ .../GroupedQueryChannelsRequest.php | 5 +- src/GeneratedModels/ImportV2TaskSettings.php | 1 + src/GeneratedModels/InterestTagResponse.php | 19 +++++++ .../KeyframeOCRRuleParameters.php | 17 ++++++ .../KeyframeRuleParameters.php | 1 + src/GeneratedModels/LabelResultResponse.php | 1 + src/GeneratedModels/LabelsRequest.php | 2 +- src/GeneratedModels/LabelsResponse.php | 1 + src/GeneratedModels/MatchedContent.php | 25 +++++++++ src/GeneratedModels/MessageResponse.php | 3 + .../MessageWithChannelResponse.php | 3 + src/GeneratedModels/ModerationConfig.php | 1 + .../ModerationDashboardPreferences.php | 3 + .../ModerationImageAnalysisCompleteEvent.php | 32 +++++++++++ .../ModerationRulesTriggeredEvent.php | 3 + .../ModerationTextAnalysisCompleteEvent.php | 29 ++++++++++ .../QueryModerationRulesResponse.php | 2 + .../QueryReviewQueueRequest.php | 2 +- .../ReportClientEventRequest.php | 20 +++++++ .../ReportClientEventResponse.php | 18 ++++++ src/GeneratedModels/RuleBuilderAction.php | 1 + src/GeneratedModels/RuleBuilderCondition.php | 3 + src/GeneratedModels/SearchResultMessage.php | 3 + src/GeneratedModels/SetupSession.php | 20 +++++++ src/GeneratedModels/SubmitActionResponse.php | 1 + src/GeneratedModels/TextContentParameters.php | 2 + src/GeneratedModels/UpdateAppRequest.php | 3 + .../UpdateBlockListRequest.php | 1 + src/GeneratedModels/UpdateFollowRequest.php | 2 +- src/GeneratedModels/UpdateSegmentRequest.php | 17 ++++++ src/GeneratedModels/UpdateSegmentResponse.php | 16 ++++++ src/GeneratedModels/UpsertConfigRequest.php | 1 + .../UpsertSetupSessionRequest.php | 17 ++++++ .../UpsertSetupSessionResponse.php | 16 ++++++ src/GeneratedModels/UserBannedEvent.php | 1 + src/GeneratedModels/UserGroupResponse.php | 6 +- tests/WebhookTest.php | 4 +- 85 files changed, 1046 insertions(+), 47 deletions(-) create mode 100644 src/GeneratedModels/AddSegmentTargetsRequest.php create mode 100644 src/GeneratedModels/AnalyzeImageField.php create mode 100644 src/GeneratedModels/AnalyzeRequest.php create mode 100644 src/GeneratedModels/AnalyzeResponse.php create mode 100644 src/GeneratedModels/AnalyzeTextField.php create mode 100644 src/GeneratedModels/BulkActionAppealsRequest.php create mode 100644 src/GeneratedModels/BulkActionAppealsResponse.php create mode 100644 src/GeneratedModels/BulkAppealError.php create mode 100644 src/GeneratedModels/BulkAppealResult.php create mode 100644 src/GeneratedModels/CancelImportV2TaskRequest.php create mode 100644 src/GeneratedModels/CancelImportV2TaskResponse.php create mode 100644 src/GeneratedModels/Classification.php create mode 100644 src/GeneratedModels/ClientEvent.php create mode 100644 src/GeneratedModels/ContentCustomPropertyCountParameters.php create mode 100644 src/GeneratedModels/ContentCustomPropertyParameters.php create mode 100644 src/GeneratedModels/CreateSegmentRequest.php create mode 100644 src/GeneratedModels/CreateSegmentResponse.php create mode 100644 src/GeneratedModels/FloodConfig.php create mode 100644 src/GeneratedModels/FloodIdenticalConfig.php create mode 100644 src/GeneratedModels/FloodSimilarConfig.php create mode 100644 src/GeneratedModels/GetOrCreateFollowResponse.php create mode 100644 src/GeneratedModels/GetOrCreateUnfollowRequest.php create mode 100644 src/GeneratedModels/GetOrCreateUnfollowResponse.php create mode 100644 src/GeneratedModels/GetSetupSessionResponse.php create mode 100644 src/GeneratedModels/GetUserInterestsResponse.php create mode 100644 src/GeneratedModels/GroupedChannelsGroupRequest.php create mode 100644 src/GeneratedModels/InterestTagResponse.php create mode 100644 src/GeneratedModels/KeyframeOCRRuleParameters.php create mode 100644 src/GeneratedModels/MatchedContent.php create mode 100644 src/GeneratedModels/ModerationImageAnalysisCompleteEvent.php create mode 100644 src/GeneratedModels/ModerationTextAnalysisCompleteEvent.php create mode 100644 src/GeneratedModels/ReportClientEventRequest.php create mode 100644 src/GeneratedModels/ReportClientEventResponse.php create mode 100644 src/GeneratedModels/SetupSession.php create mode 100644 src/GeneratedModels/UpdateSegmentRequest.php create mode 100644 src/GeneratedModels/UpdateSegmentResponse.php create mode 100644 src/GeneratedModels/UpsertSetupSessionRequest.php create mode 100644 src/GeneratedModels/UpsertSetupSessionResponse.php diff --git a/src/Generated/ChatTrait.php b/src/Generated/ChatTrait.php index 20088a5e..67034fce 100644 --- a/src/Generated/ChatTrait.php +++ b/src/Generated/ChatTrait.php @@ -1456,6 +1456,20 @@ public function search(GeneratedModels\SearchPayload $payload): StreamResponse { $requestData = null; return StreamResponse::fromJson($this->makeRequest('GET', $path, $queryParams, $requestData), GeneratedModels\SearchResponse::class); } + /** + * Create a segment + * + * @param GeneratedModels\CreateSegmentRequest $requestData + * @return StreamResponse + * @throws StreamException + */ + public function createSegment(GeneratedModels\CreateSegmentRequest $requestData): StreamResponse { + $path = '/api/v2/chat/segments'; + + $queryParams = []; + // Use the provided request data array directly + return StreamResponse::fromJson($this->makeRequest('POST', $path, $queryParams, $requestData), GeneratedModels\CreateSegmentResponse::class); + } /** * Query segments * @@ -1500,6 +1514,38 @@ public function getSegment(string $id): StreamResponse { $requestData = null; return StreamResponse::fromJson($this->makeRequest('GET', $path, $queryParams, $requestData), GeneratedModels\GetSegmentResponse::class); } + /** + * Update an existing segment + * + * @param string $id + * @param GeneratedModels\UpdateSegmentRequest $requestData + * @return StreamResponse + * @throws StreamException + */ + public function updateSegment(string $id, GeneratedModels\UpdateSegmentRequest $requestData): StreamResponse { + $path = '/api/v2/chat/segments/{id}'; + $path = str_replace('{id}', (string) $id, $path); + + $queryParams = []; + // Use the provided request data array directly + return StreamResponse::fromJson($this->makeRequest('PUT', $path, $queryParams, $requestData), GeneratedModels\UpdateSegmentResponse::class); + } + /** + * Add targets to a segment + * + * @param string $id + * @param GeneratedModels\AddSegmentTargetsRequest $requestData + * @return StreamResponse + * @throws StreamException + */ + public function addSegmentTargets(string $id, GeneratedModels\AddSegmentTargetsRequest $requestData): StreamResponse { + $path = '/api/v2/chat/segments/{id}/addtargets'; + $path = str_replace('{id}', (string) $id, $path); + + $queryParams = []; + // Use the provided request data array directly + return StreamResponse::fromJson($this->makeRequest('POST', $path, $queryParams, $requestData), GeneratedModels\Response::class); + } /** * Delete targets from a segment * diff --git a/src/Generated/CommonTrait.php b/src/Generated/CommonTrait.php index 29957c09..c2a7db67 100644 --- a/src/Generated/CommonTrait.php +++ b/src/Generated/CommonTrait.php @@ -473,6 +473,21 @@ public function getImportV2Task(string $id): StreamResponse { $requestData = null; return StreamResponse::fromJson($this->makeRequest('GET', $path, $queryParams, $requestData), GeneratedModels\GetImportV2TaskResponse::class); } + /** + * Requests a controlled stop of an import v2 task. Allowed only for tasks in queued or processing state; a processing import stops cleanly on its next progress tick. + * + * @param string $id + * @return StreamResponse + * @throws StreamException + */ + public function cancelImportV2Task(string $id): StreamResponse { + $path = '/api/v2/imports/v2/{id}/cancel'; + $path = str_replace('{id}', (string) $id, $path); + + $queryParams = []; + $requestData = null; + return StreamResponse::fromJson($this->makeRequest('POST', $path, $queryParams, $requestData), GeneratedModels\CancelImportV2TaskResponse::class); + } /** * Gets an import * diff --git a/src/Generated/FeedsTrait.php b/src/Generated/FeedsTrait.php index 2ad7bacd..426be133 100644 --- a/src/Generated/FeedsTrait.php +++ b/src/Generated/FeedsTrait.php @@ -1579,6 +1579,20 @@ public function rejectFollow(GeneratedModels\RejectFollowRequest $requestData): // Use the provided request data array directly return StreamResponse::fromJson($this->makeRequest('POST', $path, $queryParams, $requestData), GeneratedModels\RejectFollowResponse::class); } + /** + * Creates a follow if it does not exist, or returns the existing one. Broadcasts feeds.follow.created (FollowCreatedEvent) only when the follow is newly created. + * + * @param GeneratedModels\FollowRequest $requestData + * @return StreamResponse + * @throws StreamException + */ + public function getOrCreateFollow(GeneratedModels\FollowRequest $requestData): StreamResponse { + $path = '/api/v2/feeds/follows/upsert'; + + $queryParams = []; + // Use the provided request data array directly + return StreamResponse::fromJson($this->makeRequest('POST', $path, $queryParams, $requestData), GeneratedModels\GetOrCreateFollowResponse::class); + } /** * Removes a follow and broadcasts FollowRemovedEvent * @@ -1725,6 +1739,20 @@ public function getOrCreateUnfollows(GeneratedModels\UnfollowBatchRequest $reque // Use the provided request data array directly return StreamResponse::fromJson($this->makeRequest('POST', $path, $queryParams, $requestData), GeneratedModels\UnfollowBatchResponse::class); } + /** + * Removes a follow and broadcasts feeds.follow.deleted (FollowDeletedEvent). Does not return an error if the follow does not exist. + * + * @param GeneratedModels\GetOrCreateUnfollowRequest $requestData + * @return StreamResponse + * @throws StreamException + */ + public function getOrCreateUnfollow(GeneratedModels\GetOrCreateUnfollowRequest $requestData): StreamResponse { + $path = '/api/v2/feeds/unfollow/upsert'; + + $queryParams = []; + // Use the provided request data array directly + return StreamResponse::fromJson($this->makeRequest('POST', $path, $queryParams, $requestData), GeneratedModels\GetOrCreateUnfollowResponse::class); + } /** * Delete all feed data for a user including: feeds, activities, follows, comments, feed reactions, bookmark folders, bookmarks, and collections owned by the user * @@ -1756,4 +1784,23 @@ public function exportFeedUserData(string $userID): StreamResponse { $requestData = null; return StreamResponse::fromJson($this->makeRequest('POST', $path, $queryParams, $requestData), GeneratedModels\ExportFeedUserDataResponse::class); } + /** + * Returns the user's most common interest tags ranked by the number of distinct activities they reacted to that carried each tag. Client-side callers may only read their own interests; server-side callers may fetch any user. Results are sorted by descending count, then alphabetically by tag. + * + * @param string $userID + * @param int $limit + * @return StreamResponse + * @throws StreamException + */ + public function getUserInterests(string $userID, int $limit): StreamResponse { + $path = '/api/v2/feeds/users/{user_id}/interests'; + $path = str_replace('{user_id}', (string) $userID, $path); + + $queryParams = []; + if ($limit !== null) { + $queryParams['limit'] = $limit; + } + $requestData = null; + return StreamResponse::fromJson($this->makeRequest('GET', $path, $queryParams, $requestData), GeneratedModels\GetUserInterestsResponse::class); + } } diff --git a/src/Generated/ModerationTrait.php b/src/Generated/ModerationTrait.php index 17872440..33c8e783 100644 --- a/src/Generated/ModerationTrait.php +++ b/src/Generated/ModerationTrait.php @@ -122,6 +122,20 @@ public function insertActionLog(GeneratedModels\InsertActionLogRequest $requestD // Use the provided request data array directly return StreamResponse::fromJson($this->makeRequest('POST', $path, $queryParams, $requestData), GeneratedModels\InsertActionLogResponse::class); } + /** + * Moderate named text fields and raw image bytes via multipart/form-data. Returns a per-field lightweight verdict. + * + * @param GeneratedModels\AnalyzeRequest $requestData + * @return StreamResponse + * @throws StreamException + */ + public function analyze(GeneratedModels\AnalyzeRequest $requestData): StreamResponse { + $path = '/api/v2/moderation/analyze'; + + $queryParams = []; + // Use the provided request data array directly + return StreamResponse::fromJson($this->makeRequest('POST', $path, $queryParams, $requestData), GeneratedModels\AnalyzeResponse::class); + } /** * Appeal against the moderation decision * @@ -165,6 +179,20 @@ public function queryAppeals(GeneratedModels\QueryAppealsRequest $requestData): // Use the provided request data array directly return StreamResponse::fromJson($this->makeRequest('POST', $path, $queryParams, $requestData), GeneratedModels\QueryAppealsResponse::class); } + /** + * Process multiple appeals in a single request by applying the specified action to each. Supported actions: unban, restore, unblock, mark_reviewed, reject_appeal. Each appeal goes through the same path as a single submit_action call. + * + * @param GeneratedModels\BulkActionAppealsRequest $requestData + * @return StreamResponse + * @throws StreamException + */ + public function bulkActionAppeals(GeneratedModels\BulkActionAppealsRequest $requestData): StreamResponse { + $path = '/api/v2/moderation/appeals/bulk_action'; + + $queryParams = []; + // Use the provided request data array directly + return StreamResponse::fromJson($this->makeRequest('POST', $path, $queryParams, $requestData), GeneratedModels\BulkActionAppealsResponse::class); + } /** * Ban a user from a channel or the entire app * @@ -544,6 +572,33 @@ public function getReviewQueueItem(string $id): StreamResponse { $requestData = null; return StreamResponse::fromJson($this->makeRequest('GET', $path, $queryParams, $requestData), GeneratedModels\GetReviewQueueItemResponse::class); } + /** + * Retrieve a setup session for an app + * + * @return StreamResponse + * @throws StreamException + */ + public function getSetupSession(): StreamResponse { + $path = '/api/v2/moderation/setup'; + + $queryParams = []; + $requestData = null; + return StreamResponse::fromJson($this->makeRequest('GET', $path, $queryParams, $requestData), GeneratedModels\GetSetupSessionResponse::class); + } + /** + * Update a setup session for an app + * + * @param GeneratedModels\UpsertSetupSessionRequest $requestData + * @return StreamResponse + * @throws StreamException + */ + public function upsertSetupSession(GeneratedModels\UpsertSetupSessionRequest $requestData): StreamResponse { + $path = '/api/v2/moderation/setup'; + + $queryParams = []; + // Use the provided request data array directly + return StreamResponse::fromJson($this->makeRequest('POST', $path, $queryParams, $requestData), GeneratedModels\UpsertSetupSessionResponse::class); + } /** * Take action on flagged content, such as marking content as safe, deleting content, banning users, or executing custom moderation actions. Supports various action types with configurable parameters. * diff --git a/src/Generated/VideoTrait.php b/src/Generated/VideoTrait.php index 4a9ed265..bc368af2 100644 --- a/src/Generated/VideoTrait.php +++ b/src/Generated/VideoTrait.php @@ -872,6 +872,20 @@ public function deleteTranscription(string $type, string $id, string $session, s $requestData = null; return StreamResponse::fromJson($this->makeRequest('DELETE', $path, $queryParams, $requestData), GeneratedModels\DeleteTranscriptionResponse::class); } + /** + * Reports a batch of client-side telemetry events. Events are processed independently; one invalid event does not block the rest of the batch, but the request fails if any event is invalid. + * + * @param GeneratedModels\ReportClientEventRequest $requestData + * @return StreamResponse + * @throws StreamException + */ + public function reportClientCallEvent(GeneratedModels\ReportClientEventRequest $requestData): StreamResponse { + $path = '/api/v2/video/call_client_event'; + + $queryParams = []; + // Use the provided request data array directly + return StreamResponse::fromJson($this->makeRequest('POST', $path, $queryParams, $requestData), GeneratedModels\ReportClientEventResponse::class); + } /** * * @param GeneratedModels\QueryCallSessionStatsRequest $requestData diff --git a/src/Generated/Webhook.php b/src/Generated/Webhook.php index 1bfe3d34..c815aeb8 100644 --- a/src/Generated/Webhook.php +++ b/src/Generated/Webhook.php @@ -133,8 +133,10 @@ use GetStream\GeneratedModels\ModerationCheckCompletedEvent; use GetStream\GeneratedModels\ModerationCustomActionEvent; use GetStream\GeneratedModels\ModerationFlaggedEvent; +use GetStream\GeneratedModels\ModerationImageAnalysisCompleteEvent; use GetStream\GeneratedModels\ModerationMarkReviewedEvent; use GetStream\GeneratedModels\ModerationRulesTriggeredEvent; +use GetStream\GeneratedModels\ModerationTextAnalysisCompleteEvent; use GetStream\GeneratedModels\NotificationFeedUpdatedEvent; use GetStream\GeneratedModels\NotificationMarkUnreadEvent; use GetStream\GeneratedModels\NotificationThreadMessageNewEvent; @@ -318,7 +320,9 @@ class Webhook public const EVENT_TYPE_MESSAGE_UPDATED = 'message.updated'; public const EVENT_TYPE_MODERATION_CUSTOM_ACTION = 'moderation.custom_action'; public const EVENT_TYPE_MODERATION_FLAGGED = 'moderation.flagged'; + public const EVENT_TYPE_MODERATION_IMAGE_ANALYSIS_COMPLETE = 'moderation.image_analysis.complete'; public const EVENT_TYPE_MODERATION_MARK_REVIEWED = 'moderation.mark_reviewed'; + public const EVENT_TYPE_MODERATION_TEXT_ANALYSIS_COMPLETE = 'moderation.text_analysis.complete'; public const EVENT_TYPE_MODERATION_CHECK_COMPLETED = 'moderation_check.completed'; public const EVENT_TYPE_MODERATION_RULE_TRIGGERED = 'moderation_rule.triggered'; public const EVENT_TYPE_NOTIFICATION_MARK_UNREAD = 'notification.mark_unread'; @@ -555,7 +559,9 @@ private static function getEventClass(string $eventType): ?string 'message.updated' => MessageUpdatedEvent::class, 'moderation.custom_action' => ModerationCustomActionEvent::class, 'moderation.flagged' => ModerationFlaggedEvent::class, + 'moderation.image_analysis.complete' => ModerationImageAnalysisCompleteEvent::class, 'moderation.mark_reviewed' => ModerationMarkReviewedEvent::class, + 'moderation.text_analysis.complete' => ModerationTextAnalysisCompleteEvent::class, 'moderation_check.completed' => ModerationCheckCompletedEvent::class, 'moderation_rule.triggered' => ModerationRulesTriggeredEvent::class, 'notification.mark_unread' => NotificationMarkUnreadEvent::class, diff --git a/src/GeneratedModels/AddSegmentTargetsRequest.php b/src/GeneratedModels/AddSegmentTargetsRequest.php new file mode 100644 index 00000000..5ebbbc2b --- /dev/null +++ b/src/GeneratedModels/AddSegmentTargetsRequest.php @@ -0,0 +1,15 @@ +|null */ + #[ArrayOf(Classification::class)] + public ?array $classifications = null, // Hierarchical list of L1 (parent) classifications. Each entry: `name`, `confidence` (0–1), and nested `subclassifications` (L2 leaves with their own confidence). Resolved against the app's effective taxonomy (custom taxonomy when configured, otherwise the standard Bodyguard catalogue). + /** @var array|null */ + #[ArrayOf(Classification::class)] + public ?array $ocrClassifications = null, // Flat list of Bodyguard OCR text-moderation labels on the image's extracted text (e.g. VULGARITY, PII). Each entry: `name` + `severity`. Populated when BG's OCR pipeline returned non-empty results for this image. + public ?string $error = null, // Set when moderation couldn't be determined for this image — action is absent. + ) { + } + + // BaseModel automatically handles jsonSerialize(), toArray(), and fromJson() using constructor types! + // Use #[JsonKey('user_id')] to override field names if needed. +} diff --git a/src/GeneratedModels/AnalyzeRequest.php b/src/GeneratedModels/AnalyzeRequest.php new file mode 100644 index 00000000..6c43692f --- /dev/null +++ b/src/GeneratedModels/AnalyzeRequest.php @@ -0,0 +1,25 @@ +` multipart label) to a caller-supplied per-instance identifier. Echoed on per-field verdicts and surfaced in `matched_contents` when an aggregation rule fires. + public ?bool $asyncResponse = null, // When true, the response carries no verdicts (status `pending`) and per-modality results arrive via `moderation.text_analysis.complete` and `moderation.image_analysis.complete` webhooks. Image moderation runs on a background worker; text moderation runs synchronously and is then delivered via webhook. + public ?string $userID = null, + public ?UserRequest $user = null, + ) { + } + + // BaseModel automatically handles jsonSerialize(), toArray(), and fromJson() using constructor types! + // Use #[JsonKey('user_id')] to override field names if needed. +} diff --git a/src/GeneratedModels/AnalyzeResponse.php b/src/GeneratedModels/AnalyzeResponse.php new file mode 100644 index 00000000..85ec4866 --- /dev/null +++ b/src/GeneratedModels/AnalyzeResponse.php @@ -0,0 +1,22 @@ +|null */ + #[MapOf(AnalyzeTextField::class)] + public ?array $texts = null, // Per-text-field moderation verdicts keyed by caller label. + /** @var array|null */ + #[MapOf(AnalyzeImageField::class)] + public ?array $images = null, // Per-image moderation verdicts keyed by caller label. + public ?string $duration = null, + ) { + } + + // BaseModel automatically handles jsonSerialize(), toArray(), and fromJson() using constructor types! + // Use #[JsonKey('user_id')] to override field names if needed. +} diff --git a/src/GeneratedModels/AnalyzeTextField.php b/src/GeneratedModels/AnalyzeTextField.php new file mode 100644 index 00000000..1541cd15 --- /dev/null +++ b/src/GeneratedModels/AnalyzeTextField.php @@ -0,0 +1,22 @@ +|null */ + #[ArrayOf(Classification::class)] + public ?array $classifications = null, // Flat list of detected Bodyguard text labels (e.g. INSULT, VULGARITY). Each entry carries `name` and `severity`. + public ?string $severity = null, // Aggregate severity across the field: LOW | MEDIUM | HIGH | CRITICAL. + public ?string $language = null, // Detected language code. + public ?string $error = null, // Set when moderation couldn't be determined for this field — action is absent. + ) { + } + + // BaseModel automatically handles jsonSerialize(), toArray(), and fromJson() using constructor types! + // Use #[JsonKey('user_id')] to override field names if needed. +} diff --git a/src/GeneratedModels/AppResponseFields.php b/src/GeneratedModels/AppResponseFields.php index 9baa6348..d4dedf26 100644 --- a/src/GeneratedModels/AppResponseFields.php +++ b/src/GeneratedModels/AppResponseFields.php @@ -34,8 +34,10 @@ public function __construct( public ?array $allowedFlagReasons = null, public ?bool $autoTranslationEnabled = null, public ?string $beforeMessageSendHookUrl = null, + public ?int $beforeMessageSendHookAttemptTimeoutMs = null, public ?string $customActionHandlerUrl = null, public ?string $enforceUniqueUsernames = null, + public ?string $videoPrimaryUseCase = null, public ?string $sqsUrl = null, public ?string $sqsKey = null, public ?string $sqsSecret = null, @@ -66,6 +68,7 @@ public function __construct( public ?bool $moderationLlmConfigurabilityEnabled = null, public ?int $maxAggregatedActivitiesLength = null, public ?bool $feedAuditLogsEnabled = null, + public ?bool $moderationOnboardingComplete = null, public ?bool $moderationVideoCallModerationEnabled = null, public ?bool $moderationAudioCallModerationEnabled = null, public ?string $moderationS3ImageAccessRoleArn = null, diff --git a/src/GeneratedModels/AppealItemResponse.php b/src/GeneratedModels/AppealItemResponse.php index cdf04775..d7a8eef7 100644 --- a/src/GeneratedModels/AppealItemResponse.php +++ b/src/GeneratedModels/AppealItemResponse.php @@ -17,6 +17,22 @@ public function __construct( public ?array $attachments = null, // Attachments(e.g. Images) of the Appeal Item public ?\DateTime $createdAt = null, // When the flag was created public ?\DateTime $updatedAt = null, // When the flag was last updated + public ?ActionLogResponse $moderationAction = null, + public ?ActionLogResponse $originalModerationAction = null, + /** @var array|null */ + #[ArrayOf(ActionLogResponse::class)] + public ?array $actions = null, // Full chronological history of all moderation actions on the review queue item + public ?string $recommendedAction = null, // Action recommended by the automated moderation system (e.g. flag, remove, shadow) + public ?string $channelCid = null, // CID of the channel the entity belongs to, if applicable + public ?array $flagTypes = null, // Types of flags applied to the entity (e.g. user_report, bodyguard) + public ?array $flagLabels = null, // Classification labels from automated and manual review + /** @var array|null */ + #[ArrayOf(ModerationFlagResponse::class)] + public ?array $flags = null, // Per-provider flag records explaining why the action was taken + public ?int $severity = null, // Overall content severity score (1–100) + public ?string $aiTextSeverity = null, // Text severity level assigned by the AI provider + public ?string $configKey = null, // Moderation policy key that was applied + public ?string $reviewQueueItemID = null, // ID of the review queue item linked to this appeal, if the appeal was submitted with one ) { } diff --git a/src/GeneratedModels/AppealRequest.php b/src/GeneratedModels/AppealRequest.php index e3333d2b..be4eac6f 100644 --- a/src/GeneratedModels/AppealRequest.php +++ b/src/GeneratedModels/AppealRequest.php @@ -10,6 +10,7 @@ public function __construct( public ?string $entityType = null, // Type of entity being appealed (e.g., message, user) public ?string $appealReason = null, // Explanation for why the content is being appealed public ?array $attachments = null, // Array of Attachment URLs(e.g., images) + public ?string $reviewQueueItemID = null, // ID of the review queue item (flagged message) that triggered the ban. Applicable only for user ban appeals. public ?string $userID = null, public ?UserRequest $user = null, ) { diff --git a/src/GeneratedModels/BlockListResponse.php b/src/GeneratedModels/BlockListResponse.php index 0bb94f0b..9499bc48 100644 --- a/src/GeneratedModels/BlockListResponse.php +++ b/src/GeneratedModels/BlockListResponse.php @@ -18,6 +18,7 @@ public function __construct( public ?string $team = null, public ?bool $isLeetCheckEnabled = null, public ?bool $isPluralCheckEnabled = null, + public ?bool $isConfusableFoldingEnabled = null, ) { } diff --git a/src/GeneratedModels/BulkActionAppealsRequest.php b/src/GeneratedModels/BulkActionAppealsRequest.php new file mode 100644 index 00000000..d02fa111 --- /dev/null +++ b/src/GeneratedModels/BulkActionAppealsRequest.php @@ -0,0 +1,23 @@ +|null */ + #[ArrayOf(BulkAppealResult::class)] + public ?array $results = null, // Successfully processed appeals + /** @var array|null */ + #[ArrayOf(BulkAppealError::class)] + public ?array $errors = null, // Appeals that could not be processed, with per-item error messages + public ?string $duration = null, + ) { + } + + // BaseModel automatically handles jsonSerialize(), toArray(), and fromJson() using constructor types! + // Use #[JsonKey('user_id')] to override field names if needed. +} diff --git a/src/GeneratedModels/BulkAppealError.php b/src/GeneratedModels/BulkAppealError.php new file mode 100644 index 00000000..4a80d129 --- /dev/null +++ b/src/GeneratedModels/BulkAppealError.php @@ -0,0 +1,16 @@ +|null */ - #[ArrayOf(BlockListOptions::class)] - public ?array $blocklists = null, - public ?array $allowedFlagReasons = null, - public ?Thresholds $automodThresholds = null, - public ?int $partitionSize = null, - public ?string $partitionTtl = null, - public ?bool $skipLastMsgUpdateForSystemMsgs = null, - public ?string $pushLevel = null, - public ?ChatPreferences $chatPreferences = null, - public ?\DateTime $createdAt = null, - public ?\DateTime $updatedAt = null, + public ?array $grants = null, public ?array $commands = null, // List of commands that channel supports + public ?string $pushLevel = null, // Overrides the push notification level for this channel + public ?ChatPreferences $chatPreferences = null, + public ?bool $userMessageReminders = null, // Enable/disable user message reminders + public ?bool $sharedLocations = null, // Enable/disable shared locations + public ?bool $countMessages = null, // Enable/disable message counting ) { } diff --git a/src/GeneratedModels/ChatMessageResponse.php b/src/GeneratedModels/ChatMessageResponse.php index a52a0e3f..59c5111a 100644 --- a/src/GeneratedModels/ChatMessageResponse.php +++ b/src/GeneratedModels/ChatMessageResponse.php @@ -49,6 +49,9 @@ public function __construct( public ?array $mentionedUsers = null, public ?array $mentionedRoles = null, public ?array $mentionedGroupIds = null, + /** @var array|null */ + #[ArrayOf(UserGroupResponse::class)] + public ?array $mentionedGroups = null, public ?bool $mentionedChannel = null, public ?bool $mentionedHere = null, public ?array $i18n = null, diff --git a/src/GeneratedModels/Classification.php b/src/GeneratedModels/Classification.php new file mode 100644 index 00000000..7b67d8bd --- /dev/null +++ b/src/GeneratedModels/Classification.php @@ -0,0 +1,20 @@ +|null */ + #[ArrayOf(Classification::class)] + public ?array $subclassifications = null, + ) { + } + + // BaseModel automatically handles jsonSerialize(), toArray(), and fromJson() using constructor types! + // Use #[JsonKey('user_id')] to override field names if needed. +} diff --git a/src/GeneratedModels/ClientEvent.php b/src/GeneratedModels/ClientEvent.php new file mode 100644 index 00000000..41deda6c --- /dev/null +++ b/src/GeneratedModels/ClientEvent.php @@ -0,0 +1,43 @@ +|null */ + #[ArrayOf(InterestTagResponse::class)] + public ?array $interests = null, // Top-N interest tags sorted by descending count, then alphabetically by tag + public ?string $duration = null, + ) { + } + + // BaseModel automatically handles jsonSerialize(), toArray(), and fromJson() using constructor types! + // Use #[JsonKey('user_id')] to override field names if needed. +} diff --git a/src/GeneratedModels/GroupedChannelsBucket.php b/src/GeneratedModels/GroupedChannelsBucket.php index fa5fd626..fb21d8d4 100644 --- a/src/GeneratedModels/GroupedChannelsBucket.php +++ b/src/GeneratedModels/GroupedChannelsBucket.php @@ -10,6 +10,8 @@ public function __construct( #[ArrayOf(ChannelStateResponseFields::class)] public ?array $channels = null, // Channels returned for this bucket public ?int $unreadChannels = null, // Unread channels currently classified into this bucket + public ?string $next = null, // Cursor for the next page of this group + public ?string $prev = null, // Cursor for the previous page of this group ) { } diff --git a/src/GeneratedModels/GroupedChannelsGroupRequest.php b/src/GeneratedModels/GroupedChannelsGroupRequest.php new file mode 100644 index 00000000..3bf369d9 --- /dev/null +++ b/src/GeneratedModels/GroupedChannelsGroupRequest.php @@ -0,0 +1,17 @@ +|null */ + #[MapOf(GroupedChannelsGroupRequest::class)] + public ?array $groups = null, // Groups to return, keyed by group name. Each group can define limit, next, or prev. 'next' and 'prev' cursors are only allowed when the request contains exactly one group; multi-group pagination is rejected. public ?string $userID = null, public ?UserRequest $user = null, ) { diff --git a/src/GeneratedModels/ImportV2TaskSettings.php b/src/GeneratedModels/ImportV2TaskSettings.php index 8fb6ca2d..cde38e47 100644 --- a/src/GeneratedModels/ImportV2TaskSettings.php +++ b/src/GeneratedModels/ImportV2TaskSettings.php @@ -12,6 +12,7 @@ public function __construct( public ?string $path = null, public ?bool $skipReferencesCheck = null, public ?bool $mergeCustom = null, + public ?bool $useImportTimeAsOpTime = null, ) { } diff --git a/src/GeneratedModels/InterestTagResponse.php b/src/GeneratedModels/InterestTagResponse.php new file mode 100644 index 00000000..3f72258a --- /dev/null +++ b/src/GeneratedModels/InterestTagResponse.php @@ -0,0 +1,19 @@ +|null */ + #[ArrayOf(Classification::class)] + public ?array $classifications = null, // Image-classification entries (keyframe rule, Type=image) carry nested L1 → L2 classifications. Text entries (closed_caption rule, Type=text) carry flat label + severity. Resolved against the app's effective taxonomy on the image side. + public ?float $confidence = null, // Image-classification entries only. Aggregate (max) confidence score across the entry's classifications + sub-classifications. Absent on text and OCR entries. + /** @var array|null */ + #[ArrayOf(Classification::class)] + public ?array $ocrClassifications = null, // OCR entries only (keyframe_ocr rule, Type=image). Bodyguard labels that fired against the keyframe's OCR-extracted text (e.g. `INSULT`, `HATE_SPEECH`). Distinct from `classifications` so consumers can route OCR matches separately from image-classification matches. + public ?string $severity = null, // Text and OCR entries. Aggregate (max) Bodyguard severity level (`LOW` / `MEDIUM` / `HIGH` / `CRITICAL`). Absent on image-classification entries. + ) { + } + + // BaseModel automatically handles jsonSerialize(), toArray(), and fromJson() using constructor types! + // Use #[JsonKey('user_id')] to override field names if needed. +} diff --git a/src/GeneratedModels/MessageResponse.php b/src/GeneratedModels/MessageResponse.php index aea5665c..14e1e47c 100644 --- a/src/GeneratedModels/MessageResponse.php +++ b/src/GeneratedModels/MessageResponse.php @@ -52,6 +52,9 @@ public function __construct( public ?array $mentionedUsers = null, // List of mentioned users public ?array $mentionedRoles = null, // List of roles mentioned in the message (e.g. admin, channel_moderator, custom roles). Members with matching roles will receive push notifications based on their push preferences. Max 10 roles public ?array $mentionedGroupIds = null, // List of user group IDs mentioned in the message. Group members who are also channel members will receive push notifications based on their push preferences. Max 10 groups + /** @var array|null */ + #[ArrayOf(UserGroupResponse::class)] + public ?array $mentionedGroups = null, // List of mentioned user group objects. public ?bool $mentionedChannel = null, // Whether the message mentioned the channel tag public ?bool $mentionedHere = null, // Whether the message mentioned online users with @here tag public ?array $i18n = null, // Object with translations. Key `language` contains the original language key. Other keys contain translations diff --git a/src/GeneratedModels/MessageWithChannelResponse.php b/src/GeneratedModels/MessageWithChannelResponse.php index d486963f..e8dac454 100644 --- a/src/GeneratedModels/MessageWithChannelResponse.php +++ b/src/GeneratedModels/MessageWithChannelResponse.php @@ -52,6 +52,9 @@ public function __construct( public ?array $mentionedUsers = null, // List of mentioned users public ?array $mentionedRoles = null, // List of roles mentioned in the message (e.g. admin, channel_moderator, custom roles). Members with matching roles will receive push notifications based on their push preferences. Max 10 roles public ?array $mentionedGroupIds = null, // List of user group IDs mentioned in the message. Group members who are also channel members will receive push notifications based on their push preferences. Max 10 groups + /** @var array|null */ + #[ArrayOf(UserGroupResponse::class)] + public ?array $mentionedGroups = null, // List of mentioned user group objects. public ?bool $mentionedChannel = null, // Whether the message mentioned the channel tag public ?bool $mentionedHere = null, // Whether the message mentioned online users with @here tag public ?array $i18n = null, // Object with translations. Key `language` contains the original language key. Other keys contain translations diff --git a/src/GeneratedModels/ModerationConfig.php b/src/GeneratedModels/ModerationConfig.php index 29eefe43..a49e88f7 100644 --- a/src/GeneratedModels/ModerationConfig.php +++ b/src/GeneratedModels/ModerationConfig.php @@ -19,6 +19,7 @@ public function __construct( public ?AIVideoConfig $aiVideoConfig = null, public ?GoogleVisionConfig $googleVisionConfig = null, public ?VelocityFilterConfig $velocityFilterConfig = null, + public ?FloodConfig $floodConfig = null, public ?LLMConfig $llmConfig = null, public ?\DateTime $createdAt = null, public ?\DateTime $updatedAt = null, diff --git a/src/GeneratedModels/ModerationDashboardPreferences.php b/src/GeneratedModels/ModerationDashboardPreferences.php index bbea1172..46236222 100644 --- a/src/GeneratedModels/ModerationDashboardPreferences.php +++ b/src/GeneratedModels/ModerationDashboardPreferences.php @@ -17,6 +17,9 @@ public function __construct( public ?array $escalationReasons = null, public ?bool $escalationQueueEnabled = null, public ?bool $includeAttachmentPayload = null, + public ?string $webhookHeaderClientRequestIDKey = null, + public ?array $filterableCustomKeys = null, + public ?int $analyzeMaxImageSizeBytes = null, ) { } diff --git a/src/GeneratedModels/ModerationImageAnalysisCompleteEvent.php b/src/GeneratedModels/ModerationImageAnalysisCompleteEvent.php new file mode 100644 index 00000000..80e946f7 --- /dev/null +++ b/src/GeneratedModels/ModerationImageAnalysisCompleteEvent.php @@ -0,0 +1,32 @@ +|null */ + #[MapOf(AnalyzeTextField::class)] + public ?array $texts = null, // Per-text-field verdicts, same shape as the /analyze HTTP response. Each entry carries `id` when the request supplied `content_ids`. + /** @var array|null */ + #[MapOf(AnalyzeImageField::class)] + public ?array $images = null, // Per-image verdicts, same shape as the /analyze HTTP response. Each entry carries `id` when the request supplied `content_ids`. + public ?object $custom = null, // Echo of the `custom` metadata on the /analyze request. + ) { + } + + // BaseModel automatically handles jsonSerialize(), toArray(), and fromJson() using constructor types! + // Use #[JsonKey('user_id')] to override field names if needed. +} diff --git a/src/GeneratedModels/ModerationRulesTriggeredEvent.php b/src/GeneratedModels/ModerationRulesTriggeredEvent.php index 58d0bcfc..7a254b3c 100644 --- a/src/GeneratedModels/ModerationRulesTriggeredEvent.php +++ b/src/GeneratedModels/ModerationRulesTriggeredEvent.php @@ -20,6 +20,9 @@ public function __construct( public ?string $userID = null, // The ID of the user who triggered the rule public ?array $triggeredActions = null, // Array of action types that were triggered public ?string $reviewQueueItemID = null, // The review queue item ID if applicable + /** @var array|null */ + #[ArrayOf(MatchedContent::class)] + public ?array $matchedContents = null, // Ordered list of contents whose verdicts contributed to an aggregation rule's threshold. Populated only for aggregation rules when callers supplied `content_ids`. ) { } diff --git a/src/GeneratedModels/ModerationTextAnalysisCompleteEvent.php b/src/GeneratedModels/ModerationTextAnalysisCompleteEvent.php new file mode 100644 index 00000000..1f490942 --- /dev/null +++ b/src/GeneratedModels/ModerationTextAnalysisCompleteEvent.php @@ -0,0 +1,29 @@ +|null */ + #[MapOf(AnalyzeTextField::class)] + public ?array $texts = null, // Per-text-field verdicts, same shape as the /analyze HTTP response. Each entry carries `id` when the request supplied `content_ids`. + public ?object $custom = null, // Echo of the `custom` metadata on the /analyze request. + ) { + } + + // BaseModel automatically handles jsonSerialize(), toArray(), and fromJson() using constructor types! + // Use #[JsonKey('user_id')] to override field names if needed. +} diff --git a/src/GeneratedModels/QueryModerationRulesResponse.php b/src/GeneratedModels/QueryModerationRulesResponse.php index 27494925..9a856b6c 100644 --- a/src/GeneratedModels/QueryModerationRulesResponse.php +++ b/src/GeneratedModels/QueryModerationRulesResponse.php @@ -10,9 +10,11 @@ public function __construct( #[ArrayOf(ModerationRuleV2Response::class)] public ?array $rules = null, // List of moderation rules public ?array $defaultLlmLabels = null, // Default LLM label descriptions + public ?array $defaultUsernameLlmLabels = null, // Recommended LLM label descriptions for username-scoped policies (key starts with 'username:'). Used by /moderation/v2/labels fast-path. public ?array $keyframeLabels = null, // Deprecated: use keyframe_label_classifications instead. Available L1 harm labels for keyframe rules public ?array $keyframeLabelClassifications = null, // L1 to L2 mapping of keyframe harm label classifications public ?array $closedCaptionLabels = null, // Available harm labels for closed caption rules + public ?array $ocrLabels = null, // Available harm labels for keyframe OCR rules. Mirrors `closed_caption_labels` today but kept as a separate field so the two pickers can diverge later. /** @var array|null */ #[ArrayOf(AIImageLabelDefinition::class)] public ?array $aiImageLabelDefinitions = null, // AI image label definitions with metadata for dashboard rendering diff --git a/src/GeneratedModels/QueryReviewQueueRequest.php b/src/GeneratedModels/QueryReviewQueueRequest.php index ce3e5ef8..1631238f 100644 --- a/src/GeneratedModels/QueryReviewQueueRequest.php +++ b/src/GeneratedModels/QueryReviewQueueRequest.php @@ -6,7 +6,7 @@ class QueryReviewQueueRequest extends BaseModel { public function __construct( - public ?object $filter = null, // Filter conditions for review queue items + public ?object $filter = null, // Filter conditions for review queue items. Accepts built-in fields (e.g. status, channel_cid, severity, recommended_action) and customer-supplied moderation_payload.custom keys: any key that is not a built-in field is matched against the item's custom moderation data (e.g. {"location_id": "loc-42"}). Use filter_config.filterable_custom_keys to discover which custom keys the app exposes as chips. /** @var array|null */ #[ArrayOf(SortParamRequest::class)] public ?array $sort = null, // Sorting parameters for the results diff --git a/src/GeneratedModels/ReportClientEventRequest.php b/src/GeneratedModels/ReportClientEventRequest.php new file mode 100644 index 00000000..8b2ea7ec --- /dev/null +++ b/src/GeneratedModels/ReportClientEventRequest.php @@ -0,0 +1,20 @@ +|null */ + #[ArrayOf(ClientEvent::class)] + public ?array $events = null, // Client-side events to report (1-100 per request) + ) { + } + + // BaseModel automatically handles jsonSerialize(), toArray(), and fromJson() using constructor types! + // Use #[JsonKey('user_id')] to override field names if needed. +} diff --git a/src/GeneratedModels/ReportClientEventResponse.php b/src/GeneratedModels/ReportClientEventResponse.php new file mode 100644 index 00000000..bbad550d --- /dev/null +++ b/src/GeneratedModels/ReportClientEventResponse.php @@ -0,0 +1,18 @@ +|null */ + #[ArrayOf(UserGroupResponse::class)] + public ?array $mentionedGroups = null, public ?bool $mentionedChannel = null, public ?bool $mentionedHere = null, public ?array $i18n = null, diff --git a/src/GeneratedModels/SetupSession.php b/src/GeneratedModels/SetupSession.php new file mode 100644 index 00000000..f994a513 --- /dev/null +++ b/src/GeneratedModels/SetupSession.php @@ -0,0 +1,20 @@ +|null */ - #[ArrayOf(UserGroupMember::class)] - public ?array $members = null, public ?\DateTime $createdAt = null, public ?\DateTime $updatedAt = null, public ?string $createdBy = null, + /** @var array|null */ + #[ArrayOf(UserGroupMember::class)] + public ?array $members = null, ) { } diff --git a/tests/WebhookTest.php b/tests/WebhookTest.php index f574f13f..63698691 100644 --- a/tests/WebhookTest.php +++ b/tests/WebhookTest.php @@ -221,7 +221,9 @@ public static function webhookEventProvider(): array 'message.updated' => ['message.updated', 'MessageUpdatedEvent'], 'moderation.custom_action' => ['moderation.custom_action', 'ModerationCustomActionEvent'], 'moderation.flagged' => ['moderation.flagged', 'ModerationFlaggedEvent'], + 'moderation.image_analysis.complete' => ['moderation.image_analysis.complete', 'ModerationImageAnalysisCompleteEvent'], 'moderation.mark_reviewed' => ['moderation.mark_reviewed', 'ModerationMarkReviewedEvent'], + 'moderation.text_analysis.complete' => ['moderation.text_analysis.complete', 'ModerationTextAnalysisCompleteEvent'], 'moderation_check.completed' => ['moderation_check.completed', 'ModerationCheckCompletedEvent'], 'moderation_rule.triggered' => ['moderation_rule.triggered', 'ModerationRulesTriggeredEvent'], 'notification.mark_unread' => ['notification.mark_unread', 'NotificationMarkUnreadEvent'], @@ -277,7 +279,7 @@ public function testParseWebhookEventInvalidJson(): void } // ------------------------------------------------------------------------- - // Webhook helpers + composites: parseEvent, gunzipPayload, decodeSqsPayload, + // Spec §6 helpers + composites: parseEvent, gunzipPayload, decodeSqsPayload, // decodeSnsPayload, verifyAndParseWebhook, parseSqs, parseSns. // -------------------------------------------------------------------------