Compare commits

..

2 Commits

Author SHA1 Message Date
Dean Wenstrand
f40c223dfc Add getUsageStats operation + hook
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 10:30:13 -07:00
Dean Wenstrand
4758c95149 Add getUsageStats admin query types
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 10:29:07 -07:00
7 changed files with 18 additions and 962 deletions

View File

@@ -243,15 +243,6 @@ export type ClusterAssignmentInput = {
userId?: InputMaybe<Scalars['Int']['input']>;
};
export type CohortStatsGql = {
__typename?: 'CohortStatsGQL';
activated7d: Scalars['Int']['output'];
activatedNotPaid7d: Scalars['Int']['output'];
paid7d: Scalars['Int']['output'];
signups: Scalars['Int']['output'];
weekStart: Scalars['Date']['output'];
};
export type CommentGql = {
__typename?: 'CommentGQL';
id: Scalars['Int']['output'];
@@ -321,15 +312,6 @@ export type CueObjectFeaturesGql = {
spinType?: Maybe<SpinTypeEnum>;
};
export type CueStrikeGql = {
__typename?: 'CueStrikeGQL';
a: Scalars['Float']['output'];
b: Scalars['Float']['output'];
phi: Scalars['Float']['output'];
theta: Scalars['Float']['output'];
v0: Scalars['Float']['output'];
};
export type CueStrikeInputGql = {
a?: Scalars['Float']['input'];
b?: Scalars['Float']['input'];
@@ -492,20 +474,6 @@ export type FloatRangeFilter = {
lessThanInclusive?: Scalars['Boolean']['input'];
};
export type FunnelStatsGql = {
__typename?: 'FunnelStatsGQL';
activationActivated: Scalars['Int']['output'];
activationCohort: Scalars['Int']['output'];
eraPaying: Scalars['Int']['output'];
eraSignups: Scalars['Int']['output'];
freemiumEpoch: Scalars['Date']['output'];
newPaid7d: Scalars['Int']['output'];
newPaid30d: Scalars['Int']['output'];
payingUsers: Scalars['Int']['output'];
retentionPrevActive: Scalars['Int']['output'];
retentionReturned: Scalars['Int']['output'];
};
export type GameTypeTagMetric = {
__typename?: 'GameTypeTagMetric';
madeShots: Scalars['Int']['output'];
@@ -588,17 +556,12 @@ export type Header = {
value: Scalars['String']['output'];
};
export enum HomographyBackendGql {
Classic = 'CLASSIC',
Tablenet = 'TABLENET'
}
export type HomographyInfoGql = {
__typename?: 'HomographyInfoGQL';
crop: BoundingBoxGql;
destPoints: PocketPointsGql;
frameIndex: Scalars['Int']['output'];
id?: Maybe<Scalars['Int']['output']>;
id: Scalars['Int']['output'];
pockets: Array<BoundingBoxGql>;
sourcePoints: PocketPointsGql;
};
@@ -1252,27 +1215,6 @@ export type PoolHallCameraStreamCredentials = {
streamKey: Scalars['String']['output'];
};
export type PositionShotCandidateGql = {
__typename?: 'PositionShotCandidateGQL';
cueFinalPosition: Array<Scalars['Float']['output']>;
distanceToTargetArea: Scalars['Float']['output'];
inTargetArea: Scalars['Boolean']['output'];
potted: Scalars['Boolean']['output'];
projection?: Maybe<ShotProjectionGql>;
robustness: Scalars['Int']['output'];
scratched: Scalars['Boolean']['output'];
strike: CueStrikeGql;
};
export type PositionSuggestionGql = {
__typename?: 'PositionSuggestionGQL';
achievable: Scalars['Boolean']['output'];
alternates: Array<PositionShotCandidateGql>;
best?: Maybe<PositionShotCandidateGql>;
evaluatedCount: Scalars['Int']['output'];
successfulCount: Scalars['Int']['output'];
};
export type PotAimGql = {
__typename?: 'PotAimGQL';
converged: Scalars['Boolean']['output'];
@@ -1337,9 +1279,7 @@ export type Query = {
getQuotaStatus: QuotaStatusGql;
getResolvedTier: ResolvedTierGql;
getRuns: GetRunsResult;
getSessionCoach: SessionCoachGql;
getShotAnnotationTypes: Array<ShotAnnotationTypeGql>;
getShotTableState: ShotTableStateGql;
getShots: Array<ShotGql>;
getShotsByIds: Array<ShotGql>;
getShotsWithMetadata: GetShotsResult;
@@ -1366,7 +1306,6 @@ export type Query = {
poolHalls: Array<PoolHall>;
ruleSets: Array<RuleSet>;
simulateShot: ShotProjectionGql;
suggestPositionShot: PositionSuggestionGql;
unreadNotificationCount: Scalars['Int']['output'];
videoExportJob?: Maybe<VideoExportJobGql>;
videoPlayerClusters: Array<PlayerClusterGql>;
@@ -1503,21 +1442,11 @@ export type QueryGetRunsArgs = {
};
export type QueryGetSessionCoachArgs = {
videoId: Scalars['Int']['input'];
};
export type QueryGetShotAnnotationTypesArgs = {
errorTypes?: InputMaybe<Scalars['Boolean']['input']>;
};
export type QueryGetShotTableStateArgs = {
shotId: Scalars['Int']['input'];
};
export type QueryGetShotsArgs = {
countRespectsLimit?: Scalars['Boolean']['input'];
filterInput: FilterInput;
@@ -1637,11 +1566,6 @@ export type QuerySimulateShotArgs = {
};
export type QuerySuggestPositionShotArgs = {
suggestionInput: SuggestPositionShotInputGql;
};
export type QueryVideoExportJobArgs = {
jobId: Scalars['Int']['input'];
};
@@ -1851,84 +1775,6 @@ export type SerializedShotPathsGql = {
b64EncodedBuffer?: Maybe<Scalars['String']['output']>;
};
export enum SessionCoachCandidateFamilyEnum {
Aiming = 'AIMING',
BackCut = 'BACK_CUT',
CueToObjectDistance = 'CUE_TO_OBJECT_DISTANCE',
CutAngle = 'CUT_ANGLE',
ObjectToPocketDistance = 'OBJECT_TO_POCKET_DISTANCE',
Spin = 'SPIN'
}
export type SessionCoachCandidateGql = {
__typename?: 'SessionCoachCandidateGQL';
action: Scalars['String']['output'];
body: Scalars['String']['output'];
drillId?: Maybe<Scalars['String']['output']>;
evidence: SessionCoachEvidenceGql;
family: SessionCoachCandidateFamilyEnum;
id: Scalars['ID']['output'];
kind: SessionCoachCandidateKindEnum;
limitations: Array<Scalars['String']['output']>;
rank: Scalars['Int']['output'];
supportingShotIds: Array<Scalars['Int']['output']>;
title: Scalars['String']['output'];
};
export enum SessionCoachCandidateKindEnum {
DirectionalMiss = 'DIRECTIONAL_MISS',
OutcomePattern = 'OUTCOME_PATTERN',
UsagePattern = 'USAGE_PATTERN'
}
export type SessionCoachEvidenceGql = {
__typename?: 'SessionCoachEvidenceGQL';
attemptCount: Scalars['Int']['output'];
bucketKey: Scalars['String']['output'];
bucketLabel: Scalars['String']['output'];
comparisonAttemptCount: Scalars['Int']['output'];
comparisonMadeCount: Scalars['Int']['output'];
comparisonMakePercentage?: Maybe<Scalars['Float']['output']>;
madeCount: Scalars['Int']['output'];
makePercentage: Scalars['Float']['output'];
missedCount: Scalars['Int']['output'];
patternShotCount: Scalars['Int']['output'];
rankReason: Scalars['String']['output'];
score: Scalars['Float']['output'];
};
export type SessionCoachGql = {
__typename?: 'SessionCoachGQL';
analysisVersion: Scalars['String']['output'];
analyzedShotCount: Scalars['Int']['output'];
candidates: Array<SessionCoachCandidateGql>;
generatedAt: Scalars['DateTime']['output'];
ineligibilityReason?: Maybe<SessionCoachIneligibilityReasonEnum>;
madeCount: Scalars['Int']['output'];
makePercentage?: Maybe<Scalars['Float']['output']>;
missedCount: Scalars['Int']['output'];
primaryCandidate?: Maybe<SessionCoachCandidateGql>;
processingId?: Maybe<Scalars['Int']['output']>;
processingStatus?: Maybe<Scalars['String']['output']>;
shotCount: Scalars['Int']['output'];
state: SessionCoachStateEnum;
summary?: Maybe<Scalars['String']['output']>;
unknownOutcomeCount: Scalars['Int']['output'];
videoId: Scalars['Int']['output'];
};
export enum SessionCoachIneligibilityReasonEnum {
Multiplayer = 'MULTIPLAYER'
}
export enum SessionCoachStateEnum {
Failed = 'FAILED',
Ineligible = 'INELIGIBLE',
NoTrackedShots = 'NO_TRACKED_SHOTS',
Processing = 'PROCESSING',
Ready = 'READY'
}
export type ShotAnnotationGql = {
__typename?: 'ShotAnnotationGQL';
createdAt?: Maybe<Scalars['DateTime']['output']>;
@@ -2001,14 +1847,6 @@ export type ShotProjectionGql = {
trajectories: Array<BallTrajectoryGql>;
};
export type ShotTableStateGql = {
__typename?: 'ShotTableStateGQL';
frameIndex: Scalars['Int']['output'];
shotId: Scalars['Int']['output'];
tableState: TableStateGql;
videoId: Scalars['Int']['output'];
};
export type ShotsOrderingComponent =
{ difficulty: FloatOrdering; marginOfError?: never; runLength?: never; startFrame?: never; videoCreation?: never; videoId?: never; }
| { difficulty?: never; marginOfError: FloatOrdering; runLength?: never; startFrame?: never; videoCreation?: never; videoId?: never; }
@@ -2173,17 +2011,6 @@ export type SuccessfulAdd = {
export type SuccessfulAddAddShotAnnotationErrors = AddShotAnnotationErrors | SuccessfulAdd;
export type SuggestPositionShotInputGql = {
b64Image?: InputMaybe<Scalars['String']['input']>;
balls?: InputMaybe<Array<SimulationBallStateInputGql>>;
cueBallId: Scalars['Int']['input'];
pocket: PocketIdentifier;
tableSize?: InputMaybe<Scalars['Float']['input']>;
targetArea: Array<Array<Scalars['Float']['input']>>;
targetBallId: Scalars['Int']['input'];
useHomography?: InputMaybe<HomographyInputGql>;
};
export type SyncAppleSubscriptionInputGql = {
signedRenewalInfo?: InputMaybe<Scalars['String']['input']>;
signedTransactionInfo: Scalars['String']['input'];
@@ -2350,9 +2177,7 @@ export type UsageStatsDailyGql = {
export type UsageStatsGql = {
__typename?: 'UsageStatsGQL';
cohorts: Array<CohortStatsGql>;
daily: Array<UsageStatsDailyGql>;
funnel: FunnelStatsGql;
processingLast24h: Array<ProcessingStatusCountGql>;
totalRuns: Scalars['Int']['output'];
totalShots: Scalars['Int']['output'];
@@ -2523,7 +2348,6 @@ export type VideoMetadataInput = {
framesPerSecond?: InputMaybe<Scalars['Float']['input']>;
/** @deprecated `game_type` is deprecated. Use `tags` instead. */
gameType?: InputMaybe<Scalars['String']['input']>;
homographyBackend?: InputMaybe<HomographyBackendGql>;
lastIntendedSegmentBound?: InputMaybe<Scalars['Int']['input']>;
pocketSize?: InputMaybe<Scalars['Float']['input']>;
private?: InputMaybe<Scalars['Boolean']['input']>;
@@ -2792,11 +2616,11 @@ export type GetFeedQueryVariables = Exact<{
}>;
export type GetFeedQuery = { __typename?: 'Query', getUserVideos: { __typename?: 'VideoHistoryGQL', videos: Array<{ __typename?: 'VideoGQL', id: number, name?: string | null, screenshotUri?: string | null, totalShots: number, makePercentage: number, averageTimeBetweenShots?: number | null, averageDifficulty?: number | null, startTime?: any | null, private: boolean, elapsedTime?: number | null, tableSize: number, pocketSize?: number | null, owner?: { __typename?: 'UserGQL', id: number, username: string, profileImageUri?: string | null } | null, stream?: { __typename?: 'UploadStreamGQL', id: string, lastIntendedSegmentBound?: number | null, uploadCompletionCursor: number, streamSegmentType: StreamSegmentTypeEnum, isCompleted: boolean, lastSegmentUploadedAt?: any | null, clientUploadStatus?: ClientUploadStatusEnum | null } | null, tags: Array<{ __typename?: 'VideoTag', name: string, tagClasses: Array<{ __typename?: 'VideoTagClass', name: string }> }>, playerSummaries: Array<{ __typename?: 'PlayerSummaryGQL', clusterId: number, userId?: number | null, username?: string | null, profileImageUri?: string | null, representativeFullFrameUrl?: string | null, totalShots: number, totalShotsMade: number, makePercentage: number, score?: number | null, longestRun: number, runLengths: Array<number>, averageDifficulty?: number | null, averageTimeBetweenShots?: number | null, spinTypeBreakdown: { __typename?: 'SpinTypeBreakdownGQL', draw: number, center: number, follow: number } }>, currentProcessing?: { __typename?: 'VideoProcessingGQL', id: number, status: ProcessingStatusEnum } | null, reactions: Array<{ __typename?: 'ReactionGQL', videoId: number, reaction: ReactionEnum, user: { __typename?: 'UserGQL', id: number, username: string, profileImageUri?: string | null, isFollowedByCurrentUser?: boolean | null } }>, comments: Array<{ __typename?: 'CommentGQL', id: number, message: string, user: { __typename?: 'UserGQL', id: number, username: string, profileImageUri?: string | null, isFollowedByCurrentUser?: boolean | null }, replies: Array<{ __typename?: 'CommentGQL', id: number, message: string, user: { __typename?: 'UserGQL', id: number, username: string, profileImageUri?: string | null, isFollowedByCurrentUser?: boolean | null } }> }> }>, pageInfo: { __typename?: 'PageInfoGQL', hasNextPage: boolean, endCursor?: string | null } } };
export type GetFeedQuery = { __typename?: 'Query', getUserVideos: { __typename?: 'VideoHistoryGQL', videos: Array<{ __typename?: 'VideoGQL', id: number, name?: string | null, screenshotUri?: string | null, totalShots: number, makePercentage: number, averageTimeBetweenShots?: number | null, averageDifficulty?: number | null, startTime?: any | null, private: boolean, elapsedTime?: number | null, tableSize: number, pocketSize?: number | null, owner?: { __typename?: 'UserGQL', id: number, username: string, profileImageUri?: string | null } | null, stream?: { __typename?: 'UploadStreamGQL', id: string, lastIntendedSegmentBound?: number | null, streamSegmentType: StreamSegmentTypeEnum, isCompleted: boolean, lastSegmentUploadedAt?: any | null, clientUploadStatus?: ClientUploadStatusEnum | null } | null, tags: Array<{ __typename?: 'VideoTag', name: string, tagClasses: Array<{ __typename?: 'VideoTagClass', name: string }> }>, playerSummaries: Array<{ __typename?: 'PlayerSummaryGQL', clusterId: number, userId?: number | null, username?: string | null, profileImageUri?: string | null, representativeFullFrameUrl?: string | null, totalShots: number, totalShotsMade: number, makePercentage: number, score?: number | null, longestRun: number, runLengths: Array<number>, averageDifficulty?: number | null, averageTimeBetweenShots?: number | null, spinTypeBreakdown: { __typename?: 'SpinTypeBreakdownGQL', draw: number, center: number, follow: number } }>, currentProcessing?: { __typename?: 'VideoProcessingGQL', id: number, status: ProcessingStatusEnum } | null, reactions: Array<{ __typename?: 'ReactionGQL', videoId: number, reaction: ReactionEnum, user: { __typename?: 'UserGQL', id: number, username: string, profileImageUri?: string | null, isFollowedByCurrentUser?: boolean | null } }>, comments: Array<{ __typename?: 'CommentGQL', id: number, message: string, user: { __typename?: 'UserGQL', id: number, username: string, profileImageUri?: string | null, isFollowedByCurrentUser?: boolean | null }, replies: Array<{ __typename?: 'CommentGQL', id: number, message: string, user: { __typename?: 'UserGQL', id: number, username: string, profileImageUri?: string | null, isFollowedByCurrentUser?: boolean | null } }> }> }>, pageInfo: { __typename?: 'PageInfoGQL', hasNextPage: boolean, endCursor?: string | null } } };
export type UserSocialsFieldsFragment = { __typename?: 'UserGQL', id: number, username: string, profileImageUri?: string | null, isFollowedByCurrentUser?: boolean | null };
export type VideoCardFieldsFragment = { __typename?: 'VideoGQL', id: number, name?: string | null, screenshotUri?: string | null, totalShots: number, makePercentage: number, averageTimeBetweenShots?: number | null, averageDifficulty?: number | null, startTime?: any | null, private: boolean, elapsedTime?: number | null, tableSize: number, pocketSize?: number | null, owner?: { __typename?: 'UserGQL', id: number, username: string, profileImageUri?: string | null } | null, stream?: { __typename?: 'UploadStreamGQL', id: string, lastIntendedSegmentBound?: number | null, uploadCompletionCursor: number, streamSegmentType: StreamSegmentTypeEnum, isCompleted: boolean, lastSegmentUploadedAt?: any | null, clientUploadStatus?: ClientUploadStatusEnum | null } | null, tags: Array<{ __typename?: 'VideoTag', name: string, tagClasses: Array<{ __typename?: 'VideoTagClass', name: string }> }>, playerSummaries: Array<{ __typename?: 'PlayerSummaryGQL', clusterId: number, userId?: number | null, username?: string | null, profileImageUri?: string | null, representativeFullFrameUrl?: string | null, totalShots: number, totalShotsMade: number, makePercentage: number, score?: number | null, longestRun: number, runLengths: Array<number>, averageDifficulty?: number | null, averageTimeBetweenShots?: number | null, spinTypeBreakdown: { __typename?: 'SpinTypeBreakdownGQL', draw: number, center: number, follow: number } }>, currentProcessing?: { __typename?: 'VideoProcessingGQL', id: number, status: ProcessingStatusEnum } | null, reactions: Array<{ __typename?: 'ReactionGQL', videoId: number, reaction: ReactionEnum, user: { __typename?: 'UserGQL', id: number, username: string, profileImageUri?: string | null, isFollowedByCurrentUser?: boolean | null } }>, comments: Array<{ __typename?: 'CommentGQL', id: number, message: string, user: { __typename?: 'UserGQL', id: number, username: string, profileImageUri?: string | null, isFollowedByCurrentUser?: boolean | null }, replies: Array<{ __typename?: 'CommentGQL', id: number, message: string, user: { __typename?: 'UserGQL', id: number, username: string, profileImageUri?: string | null, isFollowedByCurrentUser?: boolean | null } }> }> };
export type VideoCardFieldsFragment = { __typename?: 'VideoGQL', id: number, name?: string | null, screenshotUri?: string | null, totalShots: number, makePercentage: number, averageTimeBetweenShots?: number | null, averageDifficulty?: number | null, startTime?: any | null, private: boolean, elapsedTime?: number | null, tableSize: number, pocketSize?: number | null, owner?: { __typename?: 'UserGQL', id: number, username: string, profileImageUri?: string | null } | null, stream?: { __typename?: 'UploadStreamGQL', id: string, lastIntendedSegmentBound?: number | null, streamSegmentType: StreamSegmentTypeEnum, isCompleted: boolean, lastSegmentUploadedAt?: any | null, clientUploadStatus?: ClientUploadStatusEnum | null } | null, tags: Array<{ __typename?: 'VideoTag', name: string, tagClasses: Array<{ __typename?: 'VideoTagClass', name: string }> }>, playerSummaries: Array<{ __typename?: 'PlayerSummaryGQL', clusterId: number, userId?: number | null, username?: string | null, profileImageUri?: string | null, representativeFullFrameUrl?: string | null, totalShots: number, totalShotsMade: number, makePercentage: number, score?: number | null, longestRun: number, runLengths: Array<number>, averageDifficulty?: number | null, averageTimeBetweenShots?: number | null, spinTypeBreakdown: { __typename?: 'SpinTypeBreakdownGQL', draw: number, center: number, follow: number } }>, currentProcessing?: { __typename?: 'VideoProcessingGQL', id: number, status: ProcessingStatusEnum } | null, reactions: Array<{ __typename?: 'ReactionGQL', videoId: number, reaction: ReactionEnum, user: { __typename?: 'UserGQL', id: number, username: string, profileImageUri?: string | null, isFollowedByCurrentUser?: boolean | null } }>, comments: Array<{ __typename?: 'CommentGQL', id: number, message: string, user: { __typename?: 'UserGQL', id: number, username: string, profileImageUri?: string | null, isFollowedByCurrentUser?: boolean | null }, replies: Array<{ __typename?: 'CommentGQL', id: number, message: string, user: { __typename?: 'UserGQL', id: number, username: string, profileImageUri?: string | null, isFollowedByCurrentUser?: boolean | null } }> }> };
export type GetVideoFeedSessionCountQueryVariables = Exact<{
limit?: Scalars['Int']['input'];
@@ -2827,7 +2651,7 @@ export type GetVideoFeedQueryVariables = Exact<{
}>;
export type GetVideoFeedQuery = { __typename?: 'Query', getFeedVideos: { __typename?: 'VideoHistoryGQL', hasFollowing: boolean, followingCount: number, videos: Array<{ __typename?: 'VideoGQL', id: number, name?: string | null, screenshotUri?: string | null, totalShots: number, makePercentage: number, averageTimeBetweenShots?: number | null, averageDifficulty?: number | null, startTime?: any | null, private: boolean, elapsedTime?: number | null, tableSize: number, pocketSize?: number | null, owner?: { __typename?: 'UserGQL', id: number, username: string, profileImageUri?: string | null } | null, stream?: { __typename?: 'UploadStreamGQL', id: string, lastIntendedSegmentBound?: number | null, uploadCompletionCursor: number, streamSegmentType: StreamSegmentTypeEnum, isCompleted: boolean, lastSegmentUploadedAt?: any | null, clientUploadStatus?: ClientUploadStatusEnum | null } | null, tags: Array<{ __typename?: 'VideoTag', name: string, tagClasses: Array<{ __typename?: 'VideoTagClass', name: string }> }>, playerSummaries: Array<{ __typename?: 'PlayerSummaryGQL', clusterId: number, userId?: number | null, username?: string | null, profileImageUri?: string | null, representativeFullFrameUrl?: string | null, totalShots: number, totalShotsMade: number, makePercentage: number, score?: number | null, longestRun: number, runLengths: Array<number>, averageDifficulty?: number | null, averageTimeBetweenShots?: number | null, spinTypeBreakdown: { __typename?: 'SpinTypeBreakdownGQL', draw: number, center: number, follow: number } }>, currentProcessing?: { __typename?: 'VideoProcessingGQL', id: number, status: ProcessingStatusEnum } | null, reactions: Array<{ __typename?: 'ReactionGQL', videoId: number, reaction: ReactionEnum, user: { __typename?: 'UserGQL', id: number, username: string, profileImageUri?: string | null, isFollowedByCurrentUser?: boolean | null } }>, comments: Array<{ __typename?: 'CommentGQL', id: number, message: string, user: { __typename?: 'UserGQL', id: number, username: string, profileImageUri?: string | null, isFollowedByCurrentUser?: boolean | null }, replies: Array<{ __typename?: 'CommentGQL', id: number, message: string, user: { __typename?: 'UserGQL', id: number, username: string, profileImageUri?: string | null, isFollowedByCurrentUser?: boolean | null } }> }> }>, pageInfo: { __typename?: 'PageInfoGQL', hasNextPage: boolean, endCursor?: string | null } } };
export type GetVideoFeedQuery = { __typename?: 'Query', getFeedVideos: { __typename?: 'VideoHistoryGQL', hasFollowing: boolean, followingCount: number, videos: Array<{ __typename?: 'VideoGQL', id: number, name?: string | null, screenshotUri?: string | null, totalShots: number, makePercentage: number, averageTimeBetweenShots?: number | null, averageDifficulty?: number | null, startTime?: any | null, private: boolean, elapsedTime?: number | null, tableSize: number, pocketSize?: number | null, owner?: { __typename?: 'UserGQL', id: number, username: string, profileImageUri?: string | null } | null, stream?: { __typename?: 'UploadStreamGQL', id: string, lastIntendedSegmentBound?: number | null, streamSegmentType: StreamSegmentTypeEnum, isCompleted: boolean, lastSegmentUploadedAt?: any | null, clientUploadStatus?: ClientUploadStatusEnum | null } | null, tags: Array<{ __typename?: 'VideoTag', name: string, tagClasses: Array<{ __typename?: 'VideoTagClass', name: string }> }>, playerSummaries: Array<{ __typename?: 'PlayerSummaryGQL', clusterId: number, userId?: number | null, username?: string | null, profileImageUri?: string | null, representativeFullFrameUrl?: string | null, totalShots: number, totalShotsMade: number, makePercentage: number, score?: number | null, longestRun: number, runLengths: Array<number>, averageDifficulty?: number | null, averageTimeBetweenShots?: number | null, spinTypeBreakdown: { __typename?: 'SpinTypeBreakdownGQL', draw: number, center: number, follow: number } }>, currentProcessing?: { __typename?: 'VideoProcessingGQL', id: number, status: ProcessingStatusEnum } | null, reactions: Array<{ __typename?: 'ReactionGQL', videoId: number, reaction: ReactionEnum, user: { __typename?: 'UserGQL', id: number, username: string, profileImageUri?: string | null, isFollowedByCurrentUser?: boolean | null } }>, comments: Array<{ __typename?: 'CommentGQL', id: number, message: string, user: { __typename?: 'UserGQL', id: number, username: string, profileImageUri?: string | null, isFollowedByCurrentUser?: boolean | null }, replies: Array<{ __typename?: 'CommentGQL', id: number, message: string, user: { __typename?: 'UserGQL', id: number, username: string, profileImageUri?: string | null, isFollowedByCurrentUser?: boolean | null } }> }> }>, pageInfo: { __typename?: 'PageInfoGQL', hasNextPage: boolean, endCursor?: string | null } } };
export type GetMakesLeaderboardQueryVariables = Exact<{
interval?: InputMaybe<TimeInterval>;
@@ -3121,21 +2945,6 @@ export type ReactToVideoMutationVariables = Exact<{
export type ReactToVideoMutation = { __typename?: 'Mutation', reactToVideo: boolean };
export type GetRecordedStreamsQueryVariables = Exact<{
limit?: Scalars['Int']['input'];
}>;
export type GetRecordedStreamsQuery = { __typename?: 'Query', getFeedVideos: { __typename?: 'VideoHistoryGQL', videos: Array<{ __typename?: 'VideoGQL', id: number, name?: string | null, createdAt?: any | null, screenshotUri?: string | null, framesPerSecond: number, totalShots: number, owner?: { __typename?: 'UserGQL', id: number, username: string, profileImageUri?: string | null } | null }> } };
export type GetRecordedStreamShotsQueryVariables = Exact<{
videoId: Scalars['Int']['input'];
limit?: Scalars['Int']['input'];
}>;
export type GetRecordedStreamShotsQuery = { __typename?: 'Query', getOrderedShots: { __typename?: 'GetShotsResult', shots: Array<{ __typename?: 'ShotGQL', id: number, videoId: number, startFrame: number, endFrame: number, serializedShotPaths?: { __typename?: 'SerializedShotPathsGQL', b64EncodedBuffer?: string | null } | null, cueObjectFeatures?: { __typename?: 'CueObjectFeaturesGQL', cueObjectDistance?: number | null, cueObjectAngle?: number | null, cueBallSpeed?: number | null, shotDirection?: ShotDirectionEnum | null, spinType?: SpinTypeEnum | null } | null, pocketingIntentionFeatures?: { __typename?: 'PocketingIntentionFeaturesGQL', make?: boolean | null, targetPocketDistance?: number | null, targetPocketAngle?: number | null, targetPocketAngleDirection?: ShotDirectionEnum | null, marginOfErrorInDegrees?: number | null, intendedPocketType?: PocketEnum | null, difficulty?: number | null } | null, pocketingIntentionInfo?: { __typename?: 'PocketingIntentionInfoGQL', ballId: number, pocketId: PocketIdentifier, pathMetadataIndex: number } | null }> } };
export type GetRunsForHighlightsQueryVariables = Exact<{
filterInput: RunFilterInput;
runIds?: InputMaybe<Array<Scalars['Int']['input']> | Scalars['Int']['input']>;
@@ -3158,15 +2967,6 @@ export type GetRunsWithTimestampsQueryVariables = Exact<{
export type GetRunsWithTimestampsQuery = { __typename?: 'Query', getRuns: { __typename?: 'GetRunsResult', count?: number | null, runIds: Array<number>, runs: Array<{ __typename?: 'RunGQL', id: number, runLength: number, userId: number, videoId: number, shots: Array<{ __typename?: 'ShotGQL', videoId: number, id: number, createdAt?: any | null, pocketingIntentionFeatures?: { __typename?: 'PocketingIntentionFeaturesGQL', make?: boolean | null, targetPocketDistance?: number | null, targetPocketAngle?: number | null, targetPocketAngleDirection?: ShotDirectionEnum | null, marginOfErrorInDegrees?: number | null, intendedPocketType?: PocketEnum | null, difficulty?: number | null } | null }> }> } };
export type GetSessionCoachQueryVariables = Exact<{
videoId: Scalars['Int']['input'];
}>;
export type GetSessionCoachQuery = { __typename?: 'Query', getSessionCoach: { __typename?: 'SessionCoachGQL', videoId: number, processingId?: number | null, analysisVersion: string, state: SessionCoachStateEnum, generatedAt: any, processingStatus?: string | null, ineligibilityReason?: SessionCoachIneligibilityReasonEnum | null, summary?: string | null, shotCount: number, madeCount: number, missedCount: number, unknownOutcomeCount: number, analyzedShotCount: number, makePercentage?: number | null, primaryCandidate?: { __typename?: 'SessionCoachCandidateGQL', id: string, rank: number, family: SessionCoachCandidateFamilyEnum, kind: SessionCoachCandidateKindEnum, title: string, body: string, action: string, supportingShotIds: Array<number>, drillId?: string | null, limitations: Array<string>, evidence: { __typename?: 'SessionCoachEvidenceGQL', bucketKey: string, bucketLabel: string, attemptCount: number, madeCount: number, missedCount: number, makePercentage: number, comparisonAttemptCount: number, comparisonMadeCount: number, comparisonMakePercentage?: number | null, patternShotCount: number, score: number, rankReason: string } } | null, candidates: Array<{ __typename?: 'SessionCoachCandidateGQL', id: string, rank: number, family: SessionCoachCandidateFamilyEnum, kind: SessionCoachCandidateKindEnum, title: string, body: string, action: string, supportingShotIds: Array<number>, drillId?: string | null, limitations: Array<string>, evidence: { __typename?: 'SessionCoachEvidenceGQL', bucketKey: string, bucketLabel: string, attemptCount: number, madeCount: number, missedCount: number, makePercentage: number, comparisonAttemptCount: number, comparisonMadeCount: number, comparisonMakePercentage?: number | null, patternShotCount: number, score: number, rankReason: string } }> } };
export type SessionCoachCandidateFieldsFragment = { __typename?: 'SessionCoachCandidateGQL', id: string, rank: number, family: SessionCoachCandidateFamilyEnum, kind: SessionCoachCandidateKindEnum, title: string, body: string, action: string, supportingShotIds: Array<number>, drillId?: string | null, limitations: Array<string>, evidence: { __typename?: 'SessionCoachEvidenceGQL', bucketKey: string, bucketLabel: string, attemptCount: number, madeCount: number, missedCount: number, makePercentage: number, comparisonAttemptCount: number, comparisonMadeCount: number, comparisonMakePercentage?: number | null, patternShotCount: number, score: number, rankReason: string } };
export type PlayerSummaryFieldsFragment = { __typename?: 'PlayerSummaryGQL', clusterId: number, userId?: number | null, username?: string | null, profileImageUri?: string | null, representativeFullFrameUrl?: string | null, totalShots: number, totalShotsMade: number, makePercentage: number, score?: number | null, longestRun: number, runLengths: Array<number>, averageDifficulty?: number | null, averageTimeBetweenShots?: number | null, spinTypeBreakdown: { __typename?: 'SpinTypeBreakdownGQL', draw: number, center: number, follow: number } };
export type PlayerClusterShotFieldsFragment = { __typename?: 'PlayerClusterShotGQL', shotId: number, bboxX1: number, bboxY1: number, bboxX2: number, bboxY2: number, confidence: number, isConfirmed: boolean, cropUrl?: string | null, fullFrameUrl?: string | null };
@@ -3194,21 +2994,14 @@ export type GetTableStateQueryVariables = Exact<{
}>;
export type GetTableStateQuery = { __typename?: 'Query', getTableState: { __typename?: 'TableStateGQL', identifierToPosition: Array<Array<number>>, identifierToColor: Array<{ __typename?: 'RGBColorGQL', hex: string } | null> } };
export type GetTableStateQuery = { __typename?: 'Query', getTableState: { __typename?: 'TableStateGQL', identifierToPosition: Array<Array<number>> } };
export type GetLiveTableStateQueryVariables = Exact<{
videoId: Scalars['Int']['input'];
}>;
export type GetLiveTableStateQuery = { __typename?: 'Query', getLiveTableState: { __typename?: 'LiveTableStateGQL', videoId: number, frameIndex: number, tableState: { __typename?: 'TableStateGQL', identifierToPosition: Array<Array<number>>, identifierToColor: Array<{ __typename?: 'RGBColorGQL', hex: string } | null> } } };
export type GetShotTableStateQueryVariables = Exact<{
shotId: Scalars['Int']['input'];
}>;
export type GetShotTableStateQuery = { __typename?: 'Query', getShotTableState: { __typename?: 'ShotTableStateGQL', shotId: number, videoId: number, frameIndex: number, tableState: { __typename?: 'TableStateGQL', identifierToPosition: Array<Array<number>>, identifierToColor: Array<{ __typename?: 'RGBColorGQL', hex: string } | null> } } };
export type GetLiveTableStateQuery = { __typename?: 'Query', getLiveTableState: { __typename?: 'LiveTableStateGQL', videoId: number, frameIndex: number, tableState: { __typename?: 'TableStateGQL', identifierToPosition: Array<Array<number>>, homography?: { __typename?: 'HomographyInfoGQL', id: number, frameIndex: number, crop: { __typename?: 'BoundingBoxGQL', left: number, top: number, width: number, height: number }, pockets: Array<{ __typename?: 'BoundingBoxGQL', left: number, top: number, width: number, height: number }>, sourcePoints: { __typename?: 'PocketPointsGQL', topLeft: { __typename?: 'IntPoint2D', x: number, y: number }, topSide: { __typename?: 'IntPoint2D', x: number, y: number }, topRight: { __typename?: 'IntPoint2D', x: number, y: number }, bottomLeft: { __typename?: 'IntPoint2D', x: number, y: number }, bottomSide: { __typename?: 'IntPoint2D', x: number, y: number }, bottomRight: { __typename?: 'IntPoint2D', x: number, y: number } } } | null } } };
export type SimulateShotQueryVariables = Exact<{
simulationInput: SimulateShotInputGql;
@@ -3226,15 +3019,6 @@ export type ComputePotAimQueryVariables = Exact<{
export type ComputePotAimQuery = { __typename?: 'Query', computePotAim: { __typename?: 'PotAimGQL', phi: number, geometricPhi: number, cutAngle: number, requiredPrecision: number, feasible: boolean, potted: boolean, converged: boolean, occludingBallIds: Array<number> } };
export type PositionShotCandidateFragment = { __typename?: 'PositionShotCandidateGQL', cueFinalPosition: Array<number>, inTargetArea: boolean, distanceToTargetArea: number, robustness: number, potted: boolean, scratched: boolean, strike: { __typename?: 'CueStrikeGQL', v0: number, phi: number, theta: number, a: number, b: number }, projection?: { __typename?: 'ShotProjectionGQL', pottedBallIds: Array<number>, trajectories: Array<{ __typename?: 'BallTrajectoryGQL', ballId: number, points: Array<{ __typename?: 'TrajectoryPointGQL', time: number, position: Array<number> }> }>, events: Array<{ __typename?: 'SimulationEventGQL', eventType: SimulationEventType, time: number, ballIds: Array<number>, position?: Array<number> | null }>, finalState: Array<{ __typename?: 'SimulationBallStateGQL', ballId: number, position: Array<number> }> } | null };
export type SuggestPositionShotQueryVariables = Exact<{
suggestionInput: SuggestPositionShotInputGql;
}>;
export type SuggestPositionShotQuery = { __typename?: 'Query', suggestPositionShot: { __typename?: 'PositionSuggestionGQL', achievable: boolean, evaluatedCount: number, successfulCount: number, best?: { __typename?: 'PositionShotCandidateGQL', cueFinalPosition: Array<number>, inTargetArea: boolean, distanceToTargetArea: number, robustness: number, potted: boolean, scratched: boolean, strike: { __typename?: 'CueStrikeGQL', v0: number, phi: number, theta: number, a: number, b: number }, projection?: { __typename?: 'ShotProjectionGQL', pottedBallIds: Array<number>, trajectories: Array<{ __typename?: 'BallTrajectoryGQL', ballId: number, points: Array<{ __typename?: 'TrajectoryPointGQL', time: number, position: Array<number> }> }>, events: Array<{ __typename?: 'SimulationEventGQL', eventType: SimulationEventType, time: number, ballIds: Array<number>, position?: Array<number> | null }>, finalState: Array<{ __typename?: 'SimulationBallStateGQL', ballId: number, position: Array<number> }> } | null } | null, alternates: Array<{ __typename?: 'PositionShotCandidateGQL', cueFinalPosition: Array<number>, inTargetArea: boolean, distanceToTargetArea: number, robustness: number, potted: boolean, scratched: boolean, strike: { __typename?: 'CueStrikeGQL', v0: number, phi: number, theta: number, a: number, b: number }, projection?: { __typename?: 'ShotProjectionGQL', pottedBallIds: Array<number>, trajectories: Array<{ __typename?: 'BallTrajectoryGQL', ballId: number, points: Array<{ __typename?: 'TrajectoryPointGQL', time: number, position: Array<number> }> }>, events: Array<{ __typename?: 'SimulationEventGQL', eventType: SimulationEventType, time: number, ballIds: Array<number>, position?: Array<number> | null }>, finalState: Array<{ __typename?: 'SimulationBallStateGQL', ballId: number, position: Array<number> }> } | null }> } };
export type GetSerializedShotPathsQueryVariables = Exact<{
filterInput: FilterInput;
}>;
@@ -3343,7 +3127,7 @@ export type GetUsageStatsQueryVariables = Exact<{
}>;
export type GetUsageStatsQuery = { __typename?: 'Query', getUsageStats: { __typename?: 'UsageStatsGQL', totalUsers: number, totalVideos: number, totalShots: number, totalRuns: number, funnel: { __typename?: 'FunnelStatsGQL', freemiumEpoch: any, eraSignups: number, eraPaying: number, activationCohort: number, activationActivated: number, payingUsers: number, newPaid7d: number, newPaid30d: number, retentionPrevActive: number, retentionReturned: number }, cohorts: Array<{ __typename?: 'CohortStatsGQL', weekStart: any, signups: number, activated7d: number, paid7d: number, activatedNotPaid7d: number }>, windows: Array<{ __typename?: 'UsageStatsWindowGQL', label: string, newUsers: number, activeUsers: number, sessions: number, shots: number }>, daily: Array<{ __typename?: 'UsageStatsDailyGQL', day: any, newUsers: number, activeUsers: number, sessions: number, shots: number }>, processingLast24h: Array<{ __typename?: 'ProcessingStatusCountGQL', status: string, count: number }> } };
export type GetUsageStatsQuery = { __typename?: 'Query', getUsageStats: { __typename?: 'UsageStatsGQL', totalUsers: number, totalVideos: number, totalShots: number, totalRuns: number, windows: Array<{ __typename?: 'UsageStatsWindowGQL', label: string, newUsers: number, activeUsers: number, sessions: number, shots: number }>, daily: Array<{ __typename?: 'UsageStatsDailyGQL', day: any, newUsers: number, activeUsers: number, sessions: number, shots: number }>, processingLast24h: Array<{ __typename?: 'ProcessingStatusCountGQL', status: string, count: number }> } };
export type GetProfileImageUploadLinkMutationVariables = Exact<{
fileExt?: InputMaybe<Scalars['String']['input']>;
@@ -3477,7 +3261,7 @@ export type GetStreamMonitoringDetailsQueryVariables = Exact<{
}>;
export type GetStreamMonitoringDetailsQuery = { __typename?: 'Query', getVideo: { __typename?: 'VideoGQL', id: number, totalShots: number, makePercentage: number, elapsedTime?: number | null, currentHomography?: { __typename?: 'HomographyInfoGQL', id?: number | null, frameIndex: number, crop: { __typename?: 'BoundingBoxGQL', left: number, top: number, width: number, height: number }, pockets: Array<{ __typename?: 'BoundingBoxGQL', left: number, top: number, width: number, height: number }>, sourcePoints: { __typename?: 'PocketPointsGQL', topLeft: { __typename?: 'IntPoint2D', x: number, y: number }, topSide: { __typename?: 'IntPoint2D', x: number, y: number }, topRight: { __typename?: 'IntPoint2D', x: number, y: number }, bottomLeft: { __typename?: 'IntPoint2D', x: number, y: number }, bottomSide: { __typename?: 'IntPoint2D', x: number, y: number }, bottomRight: { __typename?: 'IntPoint2D', x: number, y: number } } } | null, stream?: { __typename?: 'UploadStreamGQL', id: string, linksRequested: number, lowestUnuploadedSegmentIndex: number, uploadsCompleted: number, segmentProcessingCursor: number, isCompleted: boolean, uploadCompletionCursor: number, lastIntendedSegmentBound?: number | null, initPlaylistUploadStatus?: InitPlaylistUploadStatusEnum | null } | null, currentProcessing?: { __typename?: 'VideoProcessingGQL', id: number, errors: Array<{ __typename?: 'VideoProcessingErrorGQL', message: string, startSegmentIndex?: number | null, endSegmentIndex?: number | null }> } | null } };
export type GetStreamMonitoringDetailsQuery = { __typename?: 'Query', getVideo: { __typename?: 'VideoGQL', id: number, totalShots: number, makePercentage: number, elapsedTime?: number | null, currentHomography?: { __typename?: 'HomographyInfoGQL', id: number, frameIndex: number, crop: { __typename?: 'BoundingBoxGQL', left: number, top: number, width: number, height: number }, pockets: Array<{ __typename?: 'BoundingBoxGQL', left: number, top: number, width: number, height: number }>, sourcePoints: { __typename?: 'PocketPointsGQL', topLeft: { __typename?: 'IntPoint2D', x: number, y: number }, topSide: { __typename?: 'IntPoint2D', x: number, y: number }, topRight: { __typename?: 'IntPoint2D', x: number, y: number }, bottomLeft: { __typename?: 'IntPoint2D', x: number, y: number }, bottomSide: { __typename?: 'IntPoint2D', x: number, y: number }, bottomRight: { __typename?: 'IntPoint2D', x: number, y: number } } } | null, stream?: { __typename?: 'UploadStreamGQL', id: string, linksRequested: number, lowestUnuploadedSegmentIndex: number, uploadsCompleted: number, segmentProcessingCursor: number, isCompleted: boolean, uploadCompletionCursor: number, lastIntendedSegmentBound?: number | null, initPlaylistUploadStatus?: InitPlaylistUploadStatusEnum | null } | null, currentProcessing?: { __typename?: 'VideoProcessingGQL', id: number, errors: Array<{ __typename?: 'VideoProcessingErrorGQL', message: string, startSegmentIndex?: number | null, endSegmentIndex?: number | null }> } | null } };
export type GetVideoUpdatePageDetailsQueryVariables = Exact<{
videoId: Scalars['Int']['input'];
@@ -3512,7 +3296,7 @@ export type GetVideoCardQueryVariables = Exact<{
}>;
export type GetVideoCardQuery = { __typename?: 'Query', getVideo: { __typename?: 'VideoGQL', id: number, name?: string | null, screenshotUri?: string | null, totalShots: number, makePercentage: number, averageTimeBetweenShots?: number | null, averageDifficulty?: number | null, startTime?: any | null, private: boolean, elapsedTime?: number | null, tableSize: number, pocketSize?: number | null, owner?: { __typename?: 'UserGQL', id: number, username: string, profileImageUri?: string | null } | null, stream?: { __typename?: 'UploadStreamGQL', id: string, lastIntendedSegmentBound?: number | null, uploadCompletionCursor: number, streamSegmentType: StreamSegmentTypeEnum, isCompleted: boolean, lastSegmentUploadedAt?: any | null, clientUploadStatus?: ClientUploadStatusEnum | null } | null, tags: Array<{ __typename?: 'VideoTag', name: string, tagClasses: Array<{ __typename?: 'VideoTagClass', name: string }> }>, playerSummaries: Array<{ __typename?: 'PlayerSummaryGQL', clusterId: number, userId?: number | null, username?: string | null, profileImageUri?: string | null, representativeFullFrameUrl?: string | null, totalShots: number, totalShotsMade: number, makePercentage: number, score?: number | null, longestRun: number, runLengths: Array<number>, averageDifficulty?: number | null, averageTimeBetweenShots?: number | null, spinTypeBreakdown: { __typename?: 'SpinTypeBreakdownGQL', draw: number, center: number, follow: number } }>, currentProcessing?: { __typename?: 'VideoProcessingGQL', id: number, status: ProcessingStatusEnum } | null, reactions: Array<{ __typename?: 'ReactionGQL', videoId: number, reaction: ReactionEnum, user: { __typename?: 'UserGQL', id: number, username: string, profileImageUri?: string | null, isFollowedByCurrentUser?: boolean | null } }>, comments: Array<{ __typename?: 'CommentGQL', id: number, message: string, user: { __typename?: 'UserGQL', id: number, username: string, profileImageUri?: string | null, isFollowedByCurrentUser?: boolean | null }, replies: Array<{ __typename?: 'CommentGQL', id: number, message: string, user: { __typename?: 'UserGQL', id: number, username: string, profileImageUri?: string | null, isFollowedByCurrentUser?: boolean | null } }> }> } };
export type GetVideoCardQuery = { __typename?: 'Query', getVideo: { __typename?: 'VideoGQL', id: number, name?: string | null, screenshotUri?: string | null, totalShots: number, makePercentage: number, averageTimeBetweenShots?: number | null, averageDifficulty?: number | null, startTime?: any | null, private: boolean, elapsedTime?: number | null, tableSize: number, pocketSize?: number | null, owner?: { __typename?: 'UserGQL', id: number, username: string, profileImageUri?: string | null } | null, stream?: { __typename?: 'UploadStreamGQL', id: string, lastIntendedSegmentBound?: number | null, streamSegmentType: StreamSegmentTypeEnum, isCompleted: boolean, lastSegmentUploadedAt?: any | null, clientUploadStatus?: ClientUploadStatusEnum | null } | null, tags: Array<{ __typename?: 'VideoTag', name: string, tagClasses: Array<{ __typename?: 'VideoTagClass', name: string }> }>, playerSummaries: Array<{ __typename?: 'PlayerSummaryGQL', clusterId: number, userId?: number | null, username?: string | null, profileImageUri?: string | null, representativeFullFrameUrl?: string | null, totalShots: number, totalShotsMade: number, makePercentage: number, score?: number | null, longestRun: number, runLengths: Array<number>, averageDifficulty?: number | null, averageTimeBetweenShots?: number | null, spinTypeBreakdown: { __typename?: 'SpinTypeBreakdownGQL', draw: number, center: number, follow: number } }>, currentProcessing?: { __typename?: 'VideoProcessingGQL', id: number, status: ProcessingStatusEnum } | null, reactions: Array<{ __typename?: 'ReactionGQL', videoId: number, reaction: ReactionEnum, user: { __typename?: 'UserGQL', id: number, username: string, profileImageUri?: string | null, isFollowedByCurrentUser?: boolean | null } }>, comments: Array<{ __typename?: 'CommentGQL', id: number, message: string, user: { __typename?: 'UserGQL', id: number, username: string, profileImageUri?: string | null, isFollowedByCurrentUser?: boolean | null }, replies: Array<{ __typename?: 'CommentGQL', id: number, message: string, user: { __typename?: 'UserGQL', id: number, username: string, profileImageUri?: string | null, isFollowedByCurrentUser?: boolean | null } }> }> } };
export type GetVideosQueryVariables = Exact<{
videoIds: Array<Scalars['Int']['input']> | Scalars['Int']['input'];
@@ -3535,7 +3319,7 @@ export type GetVideoQueryVariables = Exact<{
}>;
export type GetVideoQuery = { __typename?: 'Query', getVideo: { __typename?: 'VideoGQL', id: number, playlist?: { __typename?: 'HLSPlaylistGQL', segmentDurations: Array<number> } | null, homographyHistory: Array<{ __typename?: 'HomographyInfoGQL', id?: number | null, frameIndex: number, crop: { __typename?: 'BoundingBoxGQL', left: number, top: number, width: number, height: number }, pockets: Array<{ __typename?: 'BoundingBoxGQL', left: number, top: number, width: number, height: number }>, sourcePoints: { __typename?: 'PocketPointsGQL', topLeft: { __typename?: 'IntPoint2D', x: number, y: number }, topSide: { __typename?: 'IntPoint2D', x: number, y: number }, topRight: { __typename?: 'IntPoint2D', x: number, y: number }, bottomLeft: { __typename?: 'IntPoint2D', x: number, y: number }, bottomSide: { __typename?: 'IntPoint2D', x: number, y: number }, bottomRight: { __typename?: 'IntPoint2D', x: number, y: number } } }>, stream?: { __typename?: 'UploadStreamGQL', id: string, streamSegmentType: StreamSegmentTypeEnum, segments: Array<{ __typename?: 'UploadSegmentGQL', segmentIndex: number, endFrameIndex?: number | null, framesPerSecond?: number | null }>, resolution: { __typename?: 'VideoResolutionGQL', width?: number | null, height?: number | null } } | null } };
export type GetVideoQuery = { __typename?: 'Query', getVideo: { __typename?: 'VideoGQL', id: number, playlist?: { __typename?: 'HLSPlaylistGQL', segmentDurations: Array<number> } | null, homographyHistory: Array<{ __typename?: 'HomographyInfoGQL', id: number, frameIndex: number, crop: { __typename?: 'BoundingBoxGQL', left: number, top: number, width: number, height: number }, pockets: Array<{ __typename?: 'BoundingBoxGQL', left: number, top: number, width: number, height: number }>, sourcePoints: { __typename?: 'PocketPointsGQL', topLeft: { __typename?: 'IntPoint2D', x: number, y: number }, topSide: { __typename?: 'IntPoint2D', x: number, y: number }, topRight: { __typename?: 'IntPoint2D', x: number, y: number }, bottomLeft: { __typename?: 'IntPoint2D', x: number, y: number }, bottomSide: { __typename?: 'IntPoint2D', x: number, y: number }, bottomRight: { __typename?: 'IntPoint2D', x: number, y: number } } }>, stream?: { __typename?: 'UploadStreamGQL', id: string, streamSegmentType: StreamSegmentTypeEnum, segments: Array<{ __typename?: 'UploadSegmentGQL', segmentIndex: number, endFrameIndex?: number | null, framesPerSecond?: number | null }>, resolution: { __typename?: 'VideoResolutionGQL', width?: number | null, height?: number | null } } | null } };
export type GetAverageTimePerShotForVideoQueryVariables = Exact<{
videoId: Scalars['Int']['input'];
@@ -3602,9 +3386,9 @@ export type FindPrerecordTableLayoutMutationVariables = Exact<{
}>;
export type FindPrerecordTableLayoutMutation = { __typename?: 'Mutation', findPrerecordTableLayout?: { __typename?: 'HomographyInfoGQL', id?: number | null, frameIndex: number, crop: { __typename?: 'BoundingBoxGQL', left: number, top: number, width: number, height: number }, pockets: Array<{ __typename?: 'BoundingBoxGQL', left: number, top: number, width: number, height: number }>, sourcePoints: { __typename?: 'PocketPointsGQL', topLeft: { __typename?: 'IntPoint2D', x: number, y: number }, topSide: { __typename?: 'IntPoint2D', x: number, y: number }, topRight: { __typename?: 'IntPoint2D', x: number, y: number }, bottomLeft: { __typename?: 'IntPoint2D', x: number, y: number }, bottomSide: { __typename?: 'IntPoint2D', x: number, y: number }, bottomRight: { __typename?: 'IntPoint2D', x: number, y: number } } } | null };
export type FindPrerecordTableLayoutMutation = { __typename?: 'Mutation', findPrerecordTableLayout?: { __typename?: 'HomographyInfoGQL', id: number, frameIndex: number, crop: { __typename?: 'BoundingBoxGQL', left: number, top: number, width: number, height: number }, pockets: Array<{ __typename?: 'BoundingBoxGQL', left: number, top: number, width: number, height: number }>, sourcePoints: { __typename?: 'PocketPointsGQL', topLeft: { __typename?: 'IntPoint2D', x: number, y: number }, topSide: { __typename?: 'IntPoint2D', x: number, y: number }, topRight: { __typename?: 'IntPoint2D', x: number, y: number }, bottomLeft: { __typename?: 'IntPoint2D', x: number, y: number }, bottomSide: { __typename?: 'IntPoint2D', x: number, y: number }, bottomRight: { __typename?: 'IntPoint2D', x: number, y: number } } } | null };
export type HomographyInfoFragment = { __typename?: 'HomographyInfoGQL', id?: number | null, frameIndex: number, crop: { __typename?: 'BoundingBoxGQL', left: number, top: number, width: number, height: number }, pockets: Array<{ __typename?: 'BoundingBoxGQL', left: number, top: number, width: number, height: number }>, sourcePoints: { __typename?: 'PocketPointsGQL', topLeft: { __typename?: 'IntPoint2D', x: number, y: number }, topSide: { __typename?: 'IntPoint2D', x: number, y: number }, topRight: { __typename?: 'IntPoint2D', x: number, y: number }, bottomLeft: { __typename?: 'IntPoint2D', x: number, y: number }, bottomSide: { __typename?: 'IntPoint2D', x: number, y: number }, bottomRight: { __typename?: 'IntPoint2D', x: number, y: number } } };
export type HomographyInfoFragment = { __typename?: 'HomographyInfoGQL', id: number, frameIndex: number, crop: { __typename?: 'BoundingBoxGQL', left: number, top: number, width: number, height: number }, pockets: Array<{ __typename?: 'BoundingBoxGQL', left: number, top: number, width: number, height: number }>, sourcePoints: { __typename?: 'PocketPointsGQL', topLeft: { __typename?: 'IntPoint2D', x: number, y: number }, topSide: { __typename?: 'IntPoint2D', x: number, y: number }, topRight: { __typename?: 'IntPoint2D', x: number, y: number }, bottomLeft: { __typename?: 'IntPoint2D', x: number, y: number }, bottomSide: { __typename?: 'IntPoint2D', x: number, y: number }, bottomRight: { __typename?: 'IntPoint2D', x: number, y: number } } };
export type VideoExportJobFieldsFragment = { __typename?: 'VideoExportJobGQL', id: number, videoId: number, mode: VideoExportModeEnum, status: VideoExportStatusEnum, videoName?: string | null, videoThumbnailUri?: string | null, shotIds?: Array<number> | null, runId?: number | null, downloadUrl?: string | null, fileSizeBytes?: number | null, expiresAt?: any | null, createdAt?: any | null };
@@ -3771,7 +3555,6 @@ export const VideoCardFieldsFragmentDoc = gql`
stream {
id
lastIntendedSegmentBound
uploadCompletionCursor
streamSegmentType
isCompleted
lastSegmentUploadedAt
@@ -3954,34 +3737,6 @@ export const PocketingIntentionFragmentFragmentDoc = gql`
difficulty
}
`;
export const SessionCoachCandidateFieldsFragmentDoc = gql`
fragment SessionCoachCandidateFields on SessionCoachCandidateGQL {
id
rank
family
kind
title
body
action
supportingShotIds
drillId
limitations
evidence {
bucketKey
bucketLabel
attemptCount
madeCount
missedCount
makePercentage
comparisonAttemptCount
comparisonMadeCount
comparisonMakePercentage
patternShotCount
score
rankReason
}
}
`;
export const PlayerClusterShotFieldsFragmentDoc = gql`
fragment PlayerClusterShotFields on PlayerClusterShotGQL {
shotId
@@ -4010,43 +3765,6 @@ export const PlayerClusterFieldsFragmentDoc = gql`
}
}
${PlayerClusterShotFieldsFragmentDoc}`;
export const PositionShotCandidateFragmentDoc = gql`
fragment PositionShotCandidate on PositionShotCandidateGQL {
strike {
v0
phi
theta
a
b
}
cueFinalPosition
inTargetArea
distanceToTargetArea
robustness
potted
scratched
projection {
trajectories {
ballId
points {
time
position
}
}
events {
eventType
time
ballIds
position
}
finalState {
ballId
position
}
pottedBallIds
}
}
`;
export const ShotClipRangeFragmentDoc = gql`
fragment ShotClipRange on ShotGQL {
id
@@ -7301,137 +7019,6 @@ export function useReactToVideoMutation(baseOptions?: Apollo.MutationHookOptions
export type ReactToVideoMutationHookResult = ReturnType<typeof useReactToVideoMutation>;
export type ReactToVideoMutationResult = Apollo.MutationResult<ReactToVideoMutation>;
export type ReactToVideoMutationOptions = Apollo.BaseMutationOptions<ReactToVideoMutation, ReactToVideoMutationVariables>;
export const GetRecordedStreamsDocument = gql`
query GetRecordedStreams($limit: Int! = 25) {
getFeedVideos(
limit: $limit
filters: {isStreamCompleted: true, excludeVideosWithNoShots: true}
includePrivate: MINE
feedInput: {allUsers: true}
) {
videos {
id
name
createdAt
screenshotUri
framesPerSecond
totalShots
owner {
id
username
profileImageUri
}
}
}
}
`;
/**
* __useGetRecordedStreamsQuery__
*
* To run a query within a React component, call `useGetRecordedStreamsQuery` and pass it any options that fit your needs.
* When your component renders, `useGetRecordedStreamsQuery` returns an object from Apollo Client that contains loading, error, and data properties
* you can use to render your UI.
*
* @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;
*
* @example
* const { data, loading, error } = useGetRecordedStreamsQuery({
* variables: {
* limit: // value for 'limit'
* },
* });
*/
export function useGetRecordedStreamsQuery(baseOptions?: Apollo.QueryHookOptions<GetRecordedStreamsQuery, GetRecordedStreamsQueryVariables>) {
const options = {...defaultOptions, ...baseOptions}
return Apollo.useQuery<GetRecordedStreamsQuery, GetRecordedStreamsQueryVariables>(GetRecordedStreamsDocument, options);
}
export function useGetRecordedStreamsLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions<GetRecordedStreamsQuery, GetRecordedStreamsQueryVariables>) {
const options = {...defaultOptions, ...baseOptions}
return Apollo.useLazyQuery<GetRecordedStreamsQuery, GetRecordedStreamsQueryVariables>(GetRecordedStreamsDocument, options);
}
export function useGetRecordedStreamsSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions<GetRecordedStreamsQuery, GetRecordedStreamsQueryVariables>) {
const options = {...defaultOptions, ...baseOptions}
return Apollo.useSuspenseQuery<GetRecordedStreamsQuery, GetRecordedStreamsQueryVariables>(GetRecordedStreamsDocument, options);
}
export type GetRecordedStreamsQueryHookResult = ReturnType<typeof useGetRecordedStreamsQuery>;
export type GetRecordedStreamsLazyQueryHookResult = ReturnType<typeof useGetRecordedStreamsLazyQuery>;
export type GetRecordedStreamsSuspenseQueryHookResult = ReturnType<typeof useGetRecordedStreamsSuspenseQuery>;
export type GetRecordedStreamsQueryResult = Apollo.QueryResult<GetRecordedStreamsQuery, GetRecordedStreamsQueryVariables>;
export const GetRecordedStreamShotsDocument = gql`
query GetRecordedStreamShots($videoId: Int!, $limit: Int! = 200) {
getOrderedShots(
filterInput: {videoId: [$videoId]}
shotsOrdering: {orderings: [{startFrame: {descending: false}}]}
limit: $limit
) {
shots {
id
videoId
startFrame
endFrame
serializedShotPaths {
b64EncodedBuffer
}
cueObjectFeatures {
cueObjectDistance
cueObjectAngle
cueBallSpeed
shotDirection
spinType
}
pocketingIntentionFeatures {
make
targetPocketDistance
targetPocketAngle
targetPocketAngleDirection
marginOfErrorInDegrees
intendedPocketType
difficulty
}
pocketingIntentionInfo {
ballId
pocketId
pathMetadataIndex
}
}
}
}
`;
/**
* __useGetRecordedStreamShotsQuery__
*
* To run a query within a React component, call `useGetRecordedStreamShotsQuery` and pass it any options that fit your needs.
* When your component renders, `useGetRecordedStreamShotsQuery` returns an object from Apollo Client that contains loading, error, and data properties
* you can use to render your UI.
*
* @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;
*
* @example
* const { data, loading, error } = useGetRecordedStreamShotsQuery({
* variables: {
* videoId: // value for 'videoId'
* limit: // value for 'limit'
* },
* });
*/
export function useGetRecordedStreamShotsQuery(baseOptions: Apollo.QueryHookOptions<GetRecordedStreamShotsQuery, GetRecordedStreamShotsQueryVariables>) {
const options = {...defaultOptions, ...baseOptions}
return Apollo.useQuery<GetRecordedStreamShotsQuery, GetRecordedStreamShotsQueryVariables>(GetRecordedStreamShotsDocument, options);
}
export function useGetRecordedStreamShotsLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions<GetRecordedStreamShotsQuery, GetRecordedStreamShotsQueryVariables>) {
const options = {...defaultOptions, ...baseOptions}
return Apollo.useLazyQuery<GetRecordedStreamShotsQuery, GetRecordedStreamShotsQueryVariables>(GetRecordedStreamShotsDocument, options);
}
export function useGetRecordedStreamShotsSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions<GetRecordedStreamShotsQuery, GetRecordedStreamShotsQueryVariables>) {
const options = {...defaultOptions, ...baseOptions}
return Apollo.useSuspenseQuery<GetRecordedStreamShotsQuery, GetRecordedStreamShotsQueryVariables>(GetRecordedStreamShotsDocument, options);
}
export type GetRecordedStreamShotsQueryHookResult = ReturnType<typeof useGetRecordedStreamShotsQuery>;
export type GetRecordedStreamShotsLazyQueryHookResult = ReturnType<typeof useGetRecordedStreamShotsLazyQuery>;
export type GetRecordedStreamShotsSuspenseQueryHookResult = ReturnType<typeof useGetRecordedStreamShotsSuspenseQuery>;
export type GetRecordedStreamShotsQueryResult = Apollo.QueryResult<GetRecordedStreamShotsQuery, GetRecordedStreamShotsQueryVariables>;
export const GetRunsForHighlightsDocument = gql`
query GetRunsForHighlights($filterInput: RunFilterInput!, $runIds: [Int!] = null, $runsOrdering: GetRunsOrdering, $limit: Int! = 500, $countRespectsLimit: Boolean! = false) {
getRuns(
@@ -7550,65 +7137,6 @@ export type GetRunsWithTimestampsQueryHookResult = ReturnType<typeof useGetRunsW
export type GetRunsWithTimestampsLazyQueryHookResult = ReturnType<typeof useGetRunsWithTimestampsLazyQuery>;
export type GetRunsWithTimestampsSuspenseQueryHookResult = ReturnType<typeof useGetRunsWithTimestampsSuspenseQuery>;
export type GetRunsWithTimestampsQueryResult = Apollo.QueryResult<GetRunsWithTimestampsQuery, GetRunsWithTimestampsQueryVariables>;
export const GetSessionCoachDocument = gql`
query GetSessionCoach($videoId: Int!) {
getSessionCoach(videoId: $videoId) {
videoId
processingId
analysisVersion
state
generatedAt
processingStatus
ineligibilityReason
summary
shotCount
madeCount
missedCount
unknownOutcomeCount
analyzedShotCount
makePercentage
primaryCandidate {
...SessionCoachCandidateFields
}
candidates {
...SessionCoachCandidateFields
}
}
}
${SessionCoachCandidateFieldsFragmentDoc}`;
/**
* __useGetSessionCoachQuery__
*
* To run a query within a React component, call `useGetSessionCoachQuery` and pass it any options that fit your needs.
* When your component renders, `useGetSessionCoachQuery` returns an object from Apollo Client that contains loading, error, and data properties
* you can use to render your UI.
*
* @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;
*
* @example
* const { data, loading, error } = useGetSessionCoachQuery({
* variables: {
* videoId: // value for 'videoId'
* },
* });
*/
export function useGetSessionCoachQuery(baseOptions: Apollo.QueryHookOptions<GetSessionCoachQuery, GetSessionCoachQueryVariables>) {
const options = {...defaultOptions, ...baseOptions}
return Apollo.useQuery<GetSessionCoachQuery, GetSessionCoachQueryVariables>(GetSessionCoachDocument, options);
}
export function useGetSessionCoachLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions<GetSessionCoachQuery, GetSessionCoachQueryVariables>) {
const options = {...defaultOptions, ...baseOptions}
return Apollo.useLazyQuery<GetSessionCoachQuery, GetSessionCoachQueryVariables>(GetSessionCoachDocument, options);
}
export function useGetSessionCoachSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions<GetSessionCoachQuery, GetSessionCoachQueryVariables>) {
const options = {...defaultOptions, ...baseOptions}
return Apollo.useSuspenseQuery<GetSessionCoachQuery, GetSessionCoachQueryVariables>(GetSessionCoachDocument, options);
}
export type GetSessionCoachQueryHookResult = ReturnType<typeof useGetSessionCoachQuery>;
export type GetSessionCoachLazyQueryHookResult = ReturnType<typeof useGetSessionCoachLazyQuery>;
export type GetSessionCoachSuspenseQueryHookResult = ReturnType<typeof useGetSessionCoachSuspenseQuery>;
export type GetSessionCoachQueryResult = Apollo.QueryResult<GetSessionCoachQuery, GetSessionCoachQueryVariables>;
export const VideoPlayerClustersDocument = gql`
query VideoPlayerClusters($videoId: Int!) {
videoPlayerClusters(videoId: $videoId) {
@@ -7690,9 +7218,6 @@ export const GetTableStateDocument = gql`
useHomography: $useHomography
) {
identifierToPosition
identifierToColor {
hex
}
}
}
`;
@@ -7738,13 +7263,13 @@ export const GetLiveTableStateDocument = gql`
frameIndex
tableState {
identifierToPosition
identifierToColor {
hex
homography {
...HomographyInfo
}
}
}
}
`;
${HomographyInfoFragmentDoc}`;
/**
* __useGetLiveTableStateQuery__
@@ -7778,54 +7303,6 @@ export type GetLiveTableStateQueryHookResult = ReturnType<typeof useGetLiveTable
export type GetLiveTableStateLazyQueryHookResult = ReturnType<typeof useGetLiveTableStateLazyQuery>;
export type GetLiveTableStateSuspenseQueryHookResult = ReturnType<typeof useGetLiveTableStateSuspenseQuery>;
export type GetLiveTableStateQueryResult = Apollo.QueryResult<GetLiveTableStateQuery, GetLiveTableStateQueryVariables>;
export const GetShotTableStateDocument = gql`
query GetShotTableState($shotId: Int!) {
getShotTableState(shotId: $shotId) {
shotId
videoId
frameIndex
tableState {
identifierToPosition
identifierToColor {
hex
}
}
}
}
`;
/**
* __useGetShotTableStateQuery__
*
* To run a query within a React component, call `useGetShotTableStateQuery` and pass it any options that fit your needs.
* When your component renders, `useGetShotTableStateQuery` returns an object from Apollo Client that contains loading, error, and data properties
* you can use to render your UI.
*
* @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;
*
* @example
* const { data, loading, error } = useGetShotTableStateQuery({
* variables: {
* shotId: // value for 'shotId'
* },
* });
*/
export function useGetShotTableStateQuery(baseOptions: Apollo.QueryHookOptions<GetShotTableStateQuery, GetShotTableStateQueryVariables>) {
const options = {...defaultOptions, ...baseOptions}
return Apollo.useQuery<GetShotTableStateQuery, GetShotTableStateQueryVariables>(GetShotTableStateDocument, options);
}
export function useGetShotTableStateLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions<GetShotTableStateQuery, GetShotTableStateQueryVariables>) {
const options = {...defaultOptions, ...baseOptions}
return Apollo.useLazyQuery<GetShotTableStateQuery, GetShotTableStateQueryVariables>(GetShotTableStateDocument, options);
}
export function useGetShotTableStateSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions<GetShotTableStateQuery, GetShotTableStateQueryVariables>) {
const options = {...defaultOptions, ...baseOptions}
return Apollo.useSuspenseQuery<GetShotTableStateQuery, GetShotTableStateQueryVariables>(GetShotTableStateDocument, options);
}
export type GetShotTableStateQueryHookResult = ReturnType<typeof useGetShotTableStateQuery>;
export type GetShotTableStateLazyQueryHookResult = ReturnType<typeof useGetShotTableStateLazyQuery>;
export type GetShotTableStateSuspenseQueryHookResult = ReturnType<typeof useGetShotTableStateSuspenseQuery>;
export type GetShotTableStateQueryResult = Apollo.QueryResult<GetShotTableStateQuery, GetShotTableStateQueryVariables>;
export const SimulateShotDocument = gql`
query SimulateShot($simulationInput: SimulateShotInputGQL!) {
simulateShot(simulationInput: $simulationInput) {
@@ -7936,54 +7413,6 @@ export type ComputePotAimQueryHookResult = ReturnType<typeof useComputePotAimQue
export type ComputePotAimLazyQueryHookResult = ReturnType<typeof useComputePotAimLazyQuery>;
export type ComputePotAimSuspenseQueryHookResult = ReturnType<typeof useComputePotAimSuspenseQuery>;
export type ComputePotAimQueryResult = Apollo.QueryResult<ComputePotAimQuery, ComputePotAimQueryVariables>;
export const SuggestPositionShotDocument = gql`
query SuggestPositionShot($suggestionInput: SuggestPositionShotInputGQL!) {
suggestPositionShot(suggestionInput: $suggestionInput) {
achievable
evaluatedCount
successfulCount
best {
...PositionShotCandidate
}
alternates {
...PositionShotCandidate
}
}
}
${PositionShotCandidateFragmentDoc}`;
/**
* __useSuggestPositionShotQuery__
*
* To run a query within a React component, call `useSuggestPositionShotQuery` and pass it any options that fit your needs.
* When your component renders, `useSuggestPositionShotQuery` returns an object from Apollo Client that contains loading, error, and data properties
* you can use to render your UI.
*
* @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;
*
* @example
* const { data, loading, error } = useSuggestPositionShotQuery({
* variables: {
* suggestionInput: // value for 'suggestionInput'
* },
* });
*/
export function useSuggestPositionShotQuery(baseOptions: Apollo.QueryHookOptions<SuggestPositionShotQuery, SuggestPositionShotQueryVariables>) {
const options = {...defaultOptions, ...baseOptions}
return Apollo.useQuery<SuggestPositionShotQuery, SuggestPositionShotQueryVariables>(SuggestPositionShotDocument, options);
}
export function useSuggestPositionShotLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions<SuggestPositionShotQuery, SuggestPositionShotQueryVariables>) {
const options = {...defaultOptions, ...baseOptions}
return Apollo.useLazyQuery<SuggestPositionShotQuery, SuggestPositionShotQueryVariables>(SuggestPositionShotDocument, options);
}
export function useSuggestPositionShotSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions<SuggestPositionShotQuery, SuggestPositionShotQueryVariables>) {
const options = {...defaultOptions, ...baseOptions}
return Apollo.useSuspenseQuery<SuggestPositionShotQuery, SuggestPositionShotQueryVariables>(SuggestPositionShotDocument, options);
}
export type SuggestPositionShotQueryHookResult = ReturnType<typeof useSuggestPositionShotQuery>;
export type SuggestPositionShotLazyQueryHookResult = ReturnType<typeof useSuggestPositionShotLazyQuery>;
export type SuggestPositionShotSuspenseQueryHookResult = ReturnType<typeof useSuggestPositionShotSuspenseQuery>;
export type SuggestPositionShotQueryResult = Apollo.QueryResult<SuggestPositionShotQuery, SuggestPositionShotQueryVariables>;
export const GetSerializedShotPathsDocument = gql`
query GetSerializedShotPaths($filterInput: FilterInput!) {
getShots(filterInput: $filterInput) {
@@ -8524,25 +7953,6 @@ export type DeleteTagsMutationOptions = Apollo.BaseMutationOptions<DeleteTagsMut
export const GetUsageStatsDocument = gql`
query getUsageStats($days: Int! = 30) {
getUsageStats(days: $days) {
funnel {
freemiumEpoch
eraSignups
eraPaying
activationCohort
activationActivated
payingUsers
newPaid7d
newPaid30d
retentionPrevActive
retentionReturned
}
cohorts {
weekStart
signups
activated7d
paid7d
activatedNotPaid7d
}
totalUsers
totalVideos
totalShots

View File

@@ -41,7 +41,6 @@ fragment VideoCardFields on VideoGQL {
stream {
id
lastIntendedSegmentBound
uploadCompletionCursor
streamSegmentType
isCompleted
lastSegmentUploadedAt

View File

@@ -1,62 +0,0 @@
# Lightweight two-step picker data for loading a recorded shot into Shot Lab.
query GetRecordedStreams($limit: Int! = 25) {
getFeedVideos(
limit: $limit
filters: { isStreamCompleted: true, excludeVideosWithNoShots: true }
includePrivate: MINE
feedInput: { allUsers: true }
) {
videos {
id
name
createdAt
screenshotUri
framesPerSecond
totalShots
owner {
id
username
profileImageUri
}
}
}
}
query GetRecordedStreamShots($videoId: Int!, $limit: Int! = 200) {
getOrderedShots(
filterInput: { videoId: [$videoId] }
shotsOrdering: { orderings: [{ startFrame: { descending: false } }] }
limit: $limit
) {
shots {
id
videoId
startFrame
endFrame
serializedShotPaths {
b64EncodedBuffer
}
cueObjectFeatures {
cueObjectDistance
cueObjectAngle
cueBallSpeed
shotDirection
spinType
}
pocketingIntentionFeatures {
make
targetPocketDistance
targetPocketAngle
targetPocketAngleDirection
marginOfErrorInDegrees
intendedPocketType
difficulty
}
pocketingIntentionInfo {
ballId
pocketId
pathMetadataIndex
}
}
}
}

View File

@@ -1,51 +0,0 @@
query GetSessionCoach($videoId: Int!) {
getSessionCoach(videoId: $videoId) {
videoId
processingId
analysisVersion
state
generatedAt
processingStatus
ineligibilityReason
summary
shotCount
madeCount
missedCount
unknownOutcomeCount
analyzedShotCount
makePercentage
primaryCandidate {
...SessionCoachCandidateFields
}
candidates {
...SessionCoachCandidateFields
}
}
}
fragment SessionCoachCandidateFields on SessionCoachCandidateGQL {
id
rank
family
kind
title
body
action
supportingShotIds
drillId
limitations
evidence {
bucketKey
bucketLabel
attemptCount
madeCount
missedCount
makePercentage
comparisonAttemptCount
comparisonMadeCount
comparisonMakePercentage
patternShotCount
score
rankReason
}
}

View File

@@ -9,9 +9,6 @@ query GetTableState(
useHomography: $useHomography
) {
identifierToPosition
identifierToColor {
hex
}
}
}
@@ -21,22 +18,8 @@ query GetLiveTableState($videoId: Int!) {
frameIndex
tableState {
identifierToPosition
identifierToColor {
hex
}
}
}
}
query GetShotTableState($shotId: Int!) {
getShotTableState(shotId: $shotId) {
shotId
videoId
frameIndex
tableState {
identifierToPosition
identifierToColor {
hex
homography {
...HomographyInfo
}
}
}
@@ -85,53 +68,3 @@ query ComputePotAim(
occludingBallIds
}
}
fragment PositionShotCandidate on PositionShotCandidateGQL {
strike {
v0
phi
theta
a
b
}
cueFinalPosition
inTargetArea
distanceToTargetArea
robustness
potted
scratched
projection {
trajectories {
ballId
points {
time
position
}
}
events {
eventType
time
ballIds
position
}
finalState {
ballId
position
}
pottedBallIds
}
}
query SuggestPositionShot($suggestionInput: SuggestPositionShotInputGQL!) {
suggestPositionShot(suggestionInput: $suggestionInput) {
achievable
evaluatedCount
successfulCount
best {
...PositionShotCandidate
}
alternates {
...PositionShotCandidate
}
}
}

View File

@@ -1,24 +1,5 @@
query getUsageStats($days: Int! = 30) {
getUsageStats(days: $days) {
funnel {
freemiumEpoch
eraSignups
eraPaying
activationCohort
activationActivated
payingUsers
newPaid7d
newPaid30d
retentionPrevActive
retentionReturned
}
cohorts {
weekStart
signups
activated7d
paid7d
activatedNotPaid7d
}
totalUsers
totalVideos
totalShots

View File

@@ -65,7 +65,6 @@ type Query {
limit: Int! = 500
countRespectsLimit: Boolean! = false
): GetRunsResult!
getSessionCoach(videoId: Int!): SessionCoachGQL!
videoPlayerClusters(videoId: Int!): [PlayerClusterGQL!]!
getShotAnnotationTypes(errorTypes: Boolean = false): [ShotAnnotationTypeGQL!]!
getTableState(
@@ -74,16 +73,12 @@ type Query {
useHomography: HomographyInputGQL = null
): TableStateGQL!
getLiveTableState(videoId: Int!): LiveTableStateGQL!
getShotTableState(shotId: Int!): ShotTableStateGQL!
simulateShot(simulationInput: SimulateShotInputGQL!): ShotProjectionGQL!
computePotAim(
simulationInput: SimulateShotInputGQL!
targetBallId: Int!
pocket: PocketIdentifier!
): PotAimGQL!
suggestPositionShot(
suggestionInput: SuggestPositionShotInputGQL!
): PositionSuggestionGQL!
getOrderedShots(
filterInput: FilterInput!
ids: [Int!] = null
@@ -614,7 +609,7 @@ type VideoTagClass {
}
type HomographyInfoGQL {
id: Int
id: Int!
frameIndex: Int!
crop: BoundingBoxGQL!
pockets: [BoundingBoxGQL!]!
@@ -999,81 +994,6 @@ input DatetimeOrdering {
startingAt: DateTime = null
}
type SessionCoachGQL {
videoId: Int!
processingId: Int
analysisVersion: String!
state: SessionCoachStateEnum!
generatedAt: DateTime!
processingStatus: String
ineligibilityReason: SessionCoachIneligibilityReasonEnum
summary: String
shotCount: Int!
madeCount: Int!
missedCount: Int!
unknownOutcomeCount: Int!
analyzedShotCount: Int!
makePercentage: Float
primaryCandidate: SessionCoachCandidateGQL
candidates: [SessionCoachCandidateGQL!]!
}
enum SessionCoachStateEnum {
PROCESSING
READY
NO_TRACKED_SHOTS
INELIGIBLE
FAILED
}
enum SessionCoachIneligibilityReasonEnum {
MULTIPLAYER
}
type SessionCoachCandidateGQL {
id: ID!
rank: Int!
family: SessionCoachCandidateFamilyEnum!
kind: SessionCoachCandidateKindEnum!
title: String!
body: String!
action: String!
supportingShotIds: [Int!]!
drillId: String
evidence: SessionCoachEvidenceGQL!
limitations: [String!]!
}
enum SessionCoachCandidateFamilyEnum {
AIMING
CUT_ANGLE
SPIN
OBJECT_TO_POCKET_DISTANCE
CUE_TO_OBJECT_DISTANCE
BACK_CUT
}
enum SessionCoachCandidateKindEnum {
DIRECTIONAL_MISS
OUTCOME_PATTERN
USAGE_PATTERN
}
type SessionCoachEvidenceGQL {
bucketKey: String!
bucketLabel: String!
attemptCount: Int!
madeCount: Int!
missedCount: Int!
makePercentage: Float!
comparisonAttemptCount: Int!
comparisonMadeCount: Int!
comparisonMakePercentage: Float
patternShotCount: Int!
score: Float!
rankReason: String!
}
type PlayerClusterGQL {
videoId: Int!
clusterId: Int!
@@ -1145,13 +1065,6 @@ type LiveTableStateGQL {
tableState: TableStateGQL!
}
type ShotTableStateGQL {
shotId: Int!
videoId: Int!
frameIndex: Int!
tableState: TableStateGQL!
}
type ShotProjectionGQL {
trajectories: [BallTrajectoryGQL!]!
events: [SimulationEventGQL!]!
@@ -1222,44 +1135,6 @@ type PotAimGQL {
occludingBallIds: [Int!]!
}
type PositionSuggestionGQL {
achievable: Boolean!
best: PositionShotCandidateGQL
alternates: [PositionShotCandidateGQL!]!
evaluatedCount: Int!
successfulCount: Int!
}
type PositionShotCandidateGQL {
strike: CueStrikeGQL!
cueFinalPosition: [Float!]!
inTargetArea: Boolean!
distanceToTargetArea: Float!
robustness: Int!
potted: Boolean!
scratched: Boolean!
projection: ShotProjectionGQL
}
type CueStrikeGQL {
v0: Float!
phi: Float!
theta: Float!
a: Float!
b: Float!
}
input SuggestPositionShotInputGQL {
cueBallId: Int!
targetBallId: Int!
pocket: PocketIdentifier!
targetArea: [[Float!]!]!
balls: [SimulationBallStateInputGQL!] = null
b64Image: String = null
useHomography: HomographyInputGQL = null
tableSize: Float = null
}
type GetShotsResult {
shots: [ShotGQL!]!
count: Int
@@ -1295,38 +1170,15 @@ input CreatedAfter @oneOf {
}
type UsageStatsGQL {
funnel: FunnelStatsGQL!
totalUsers: Int!
totalVideos: Int!
totalShots: Int!
totalRuns: Int!
cohorts: [CohortStatsGQL!]!
windows: [UsageStatsWindowGQL!]!
daily: [UsageStatsDailyGQL!]!
processingLast24h: [ProcessingStatusCountGQL!]!
}
type FunnelStatsGQL {
freemiumEpoch: Date!
eraSignups: Int!
eraPaying: Int!
activationCohort: Int!
activationActivated: Int!
payingUsers: Int!
newPaid7d: Int!
newPaid30d: Int!
retentionPrevActive: Int!
retentionReturned: Int!
}
type CohortStatsGQL {
weekStart: Date!
signups: Int!
activated7d: Int!
paid7d: Int!
activatedNotPaid7d: Int!
}
type UsageStatsWindowGQL {
label: String!
newUsers: Int!
@@ -1942,7 +1794,6 @@ input VideoMetadataInput {
clientUploadStatus: ClientUploadStatusEnum = null
resolution: VideoResolution = null
framesPerSecond: Float = null
homographyBackend: HomographyBackendGQL = null
}
input VideoResolution {
@@ -1950,11 +1801,6 @@ input VideoResolution {
height: Int!
}
enum HomographyBackendGQL {
CLASSIC
TABLENET
}
type GetUploadLinkReturn {
value: UploadLinkGetUploadLinkErrors!
stream: UploadStreamGQL