diff --git a/components/header/UserMenu.vue b/components/header/UserMenu.vue index 8089618..00c3e6d 100644 --- a/components/header/UserMenu.vue +++ b/components/header/UserMenu.vue @@ -160,10 +160,11 @@ const isDisableCacheSupported = computed(() => { if (nonSharpApps.includes(appName.toLowerCase())) return false // always show in dev environments - if (version.includes('dev') || version.includes('local')) return true + if (version.includes('dev') || version.includes('local') || version.includes('1.0.0')) + return true // for sharp connectors, check if version is >= 3.18.0 - const targetVersion = '3.18.0' + const targetVersion = '3.19.0' return ( version.localeCompare(targetVersion, undefined, { numeric: true, diff --git a/lib/common/generated/gql/graphql.ts b/lib/common/generated/gql/graphql.ts index 5a9cad1..65a0db8 100644 --- a/lib/common/generated/gql/graphql.ts +++ b/lib/common/generated/gql/graphql.ts @@ -569,7 +569,6 @@ export type AutomateAuthCodePayloadTest = { action: Scalars['String']['input']; code: Scalars['String']['input']; userId: Scalars['String']['input']; - workspaceId?: InputMaybe; }; /** Additional resources to validate user access to. */ @@ -874,7 +873,7 @@ export type BlobMetadata = { streamId: Scalars['String']['output']; uploadError?: Maybe; uploadStatus: Scalars['Int']['output']; - userId: Scalars['String']['output']; + userId?: Maybe; }; export type BlobMetadataCollection = { @@ -1269,6 +1268,14 @@ export type CreateEmbedTokenReturn = { tokenMetadata: EmbedToken; }; +export type CreateFromTemplateInput = { + modelIds: Array; + /** Override the template's name for this insight */ + name?: InputMaybe; + projectId: Scalars['String']['input']; + templateId: Scalars['String']['input']; +}; + export type CreateIssueInput = { assigneeId?: InputMaybe; attachmentBlobIds?: InputMaybe>; @@ -1530,6 +1537,17 @@ export type DashboardUpdateInput = { state?: InputMaybe; }; +export type DataSourceColumn = { + __typename?: 'DataSourceColumn'; + name: Scalars['String']['output']; + type: Scalars['String']['output']; +}; + +export type DataSourceRefInput = { + alias: Scalars['String']['input']; + dataSourceId: Scalars['String']['input']; +}; + export type DateIntervalFilter = { after?: InputMaybe; before?: InputMaybe; @@ -1625,6 +1643,26 @@ export type EmbedTokenCreateInput = { resourceIdString: Scalars['String']['input']; }; +export type ExecuteQueryInput = { + dataSources?: InputMaybe>; + modelIds: Array; + projectId: Scalars['String']['input']; + query: Scalars['JSONObject']['input']; +}; + +export type ExecuteQueryResult = { + __typename?: 'ExecuteQueryResult'; + aggregate: ModelExecutionResult; + perModel: Array; +}; + +export type ExecuteVersionQueryInput = { + modelId: Scalars['String']['input']; + projectId: Scalars['String']['input']; + query: Scalars['JSONObject']['input']; + versionId: Scalars['String']['input']; +}; + export type ExtendedViewerResources = { __typename?: 'ExtendedViewerResources'; /** The groups of viewer resources themselves */ @@ -1646,6 +1684,19 @@ export type ExtendedViewerResourcesRequest = { savedViewId?: Maybe; }; +export type ExternalDataSource = { + __typename?: 'ExternalDataSource'; + columns: Array; + createdAt: Scalars['DateTime']['output']; + filename: Scalars['String']['output']; + id: Scalars['String']['output']; + name: Scalars['String']['output']; + projectId?: Maybe; + rowCount: Scalars['Int']['output']; + updatedAt: Scalars['DateTime']['output']; + workspaceId: Scalars['String']['output']; +}; + export type FileImportResultInput = { /** Duration of the file download before parsing started in seconds */ downloadDurationSeconds: Scalars['Float']['input']; @@ -1812,6 +1863,277 @@ export type IngestionHistoryInput = { limit?: InputMaybe; }; +export type Insight = { + __typename?: 'Insight'; + /** + * Aggregate results across all tracked models (newest first). + * Use limit=1 for KPI badge. + */ + aggregateResults: Array; + createdAt: Scalars['DateTime']['output']; + createdBy: Scalars['String']['output']; + customized: Scalars['Boolean']['output']; + dataSources: Array; + /** Version history (previous snapshots) */ + history: Array; + id: Scalars['String']['output']; + /** Latest result per model (excludes aggregate) */ + latestResults: Array; + metadata: Scalars['JSONObject']['output']; + modelIds: Array; + /** Historical results for a specific model (newest first) */ + modelResults: Array; + name: Scalars['String']['output']; + projectId: Scalars['String']['output']; + query: Scalars['JSONObject']['output']; + /** The template this insight was created from (null if ad-hoc or template deleted) */ + template?: Maybe; + /** Which template version was snapshotted at creation/last sync */ + templateVersion?: Maybe; + trigger: Scalars['String']['output']; + type: Scalars['String']['output']; + updatedAt: Scalars['DateTime']['output']; + updatedBy?: Maybe; + version: Scalars['Int']['output']; + /** Stored results for a specific version */ + versionResults: Array; +}; + + +export type InsightAggregateResultsArgs = { + limit?: InputMaybe; +}; + + +export type InsightModelResultsArgs = { + limit?: InputMaybe; + modelId: Scalars['String']['input']; +}; + + +export type InsightVersionResultsArgs = { + modelId: Scalars['String']['input']; + versionId: Scalars['String']['input']; +}; + +export type InsightCreateInput = { + metadata?: InputMaybe; + modelIds?: InputMaybe>; + name: Scalars['String']['input']; + projectId: Scalars['String']['input']; + query: Scalars['JSONObject']['input']; + trigger?: InputMaybe; + type?: InputMaybe; +}; + +export type InsightDataSourceLink = { + __typename?: 'InsightDataSourceLink'; + alias: Scalars['String']['output']; + dataSource?: Maybe; + dataSourceId: Scalars['String']['output']; + insightId: Scalars['String']['output']; +}; + +export type InsightMutations = { + __typename?: 'InsightMutations'; + addModels: Insight; + create: Insight; + /** Create an insight by snapshotting a workspace template */ + createFromTemplate: Insight; + delete: Scalars['Boolean']['output']; + /** Execute a query ad-hoc against selected models (preview, no persistence) */ + executeQuery: ExecuteQueryResult; + /** Execute a query against a single specific version of a model */ + executeVersionQuery: VersionQueryResult; + linkDataSource: Scalars['Boolean']['output']; + removeModel: Insight; + /** Reset a customized insight back to its template's latest version */ + resetToTemplate: Insight; + /** Rollback an insight to a previous version */ + rollbackInsight: Insight; + update: Insight; +}; + + +export type InsightMutationsAddModelsArgs = { + insightId: Scalars['String']['input']; + modelIds: Array; + projectId: Scalars['String']['input']; +}; + + +export type InsightMutationsCreateArgs = { + input: InsightCreateInput; +}; + + +export type InsightMutationsCreateFromTemplateArgs = { + input: CreateFromTemplateInput; +}; + + +export type InsightMutationsDeleteArgs = { + id: Scalars['String']['input']; + projectId: Scalars['String']['input']; +}; + + +export type InsightMutationsExecuteQueryArgs = { + input: ExecuteQueryInput; +}; + + +export type InsightMutationsExecuteVersionQueryArgs = { + input: ExecuteVersionQueryInput; +}; + + +export type InsightMutationsLinkDataSourceArgs = { + alias: Scalars['String']['input']; + dataSourceId: Scalars['String']['input']; + insightId: Scalars['String']['input']; + projectId: Scalars['String']['input']; +}; + + +export type InsightMutationsRemoveModelArgs = { + insightId: Scalars['String']['input']; + modelId: Scalars['String']['input']; + projectId: Scalars['String']['input']; +}; + + +export type InsightMutationsResetToTemplateArgs = { + insightId: Scalars['String']['input']; + projectId: Scalars['String']['input']; +}; + + +export type InsightMutationsRollbackInsightArgs = { + insightId: Scalars['String']['input']; + projectId: Scalars['String']['input']; + toVersion: Scalars['Int']['input']; +}; + + +export type InsightMutationsUpdateArgs = { + input: InsightUpdateInput; +}; + +export type InsightResult = { + __typename?: 'InsightResult'; + id: Scalars['String']['output']; + insightId: Scalars['String']['output']; + modelId?: Maybe; + result: Scalars['JSONObject']['output']; + summary: Scalars['JSONObject']['output']; + timestamp: Scalars['DateTime']['output']; + versionId?: Maybe; +}; + +export type InsightTemplate = { + __typename?: 'InsightTemplate'; + createdAt: Scalars['DateTime']['output']; + createdBy: Scalars['String']['output']; + description?: Maybe; + /** Version history (previous snapshots) */ + history: Array; + id: Scalars['String']['output']; + metadata: Scalars['JSONObject']['output']; + name: Scalars['String']['output']; + query: Scalars['JSONObject']['output']; + type: Scalars['String']['output']; + updatedAt: Scalars['DateTime']['output']; + updatedBy: Scalars['String']['output']; + version: Scalars['Int']['output']; + workspaceId: Scalars['String']['output']; +}; + +export type InsightTemplateCreateInput = { + description?: InputMaybe; + metadata?: InputMaybe; + name: Scalars['String']['input']; + query: Scalars['JSONObject']['input']; + type: Scalars['String']['input']; + workspaceId: Scalars['String']['input']; +}; + +export type InsightTemplateMutations = { + __typename?: 'InsightTemplateMutations'; + create: InsightTemplate; + delete: Scalars['Boolean']['output']; + rollback: InsightTemplate; + update: InsightTemplate; +}; + + +export type InsightTemplateMutationsCreateArgs = { + input: InsightTemplateCreateInput; +}; + + +export type InsightTemplateMutationsDeleteArgs = { + id: Scalars['String']['input']; + workspaceId: Scalars['String']['input']; +}; + + +export type InsightTemplateMutationsRollbackArgs = { + id: Scalars['String']['input']; + toVersion: Scalars['Int']['input']; + workspaceId: Scalars['String']['input']; +}; + + +export type InsightTemplateMutationsUpdateArgs = { + input: InsightTemplateUpdateInput; +}; + +export type InsightTemplateUpdateInput = { + description?: InputMaybe; + id: Scalars['String']['input']; + metadata?: InputMaybe; + name?: InputMaybe; + /** If true, propagate changes to all non-customized insights using this template */ + propagateToInsights?: InputMaybe; + query?: InputMaybe; + type?: InputMaybe; + workspaceId: Scalars['String']['input']; +}; + +export type InsightTemplateVersion = { + __typename?: 'InsightTemplateVersion'; + metadata: Scalars['JSONObject']['output']; + name: Scalars['String']['output']; + query: Scalars['JSONObject']['output']; + type: Scalars['String']['output']; + updatedAt: Scalars['DateTime']['output']; + updatedBy: Scalars['String']['output']; + version: Scalars['Int']['output']; +}; + +export type InsightUpdateInput = { + id: Scalars['String']['input']; + metadata?: InputMaybe; + name?: InputMaybe; + projectId: Scalars['String']['input']; + query?: InputMaybe; + trigger?: InputMaybe; + type?: InputMaybe; +}; + +export type InsightVersion = { + __typename?: 'InsightVersion'; + customized: Scalars['Boolean']['output']; + metadata: Scalars['JSONObject']['output']; + name: Scalars['String']['output']; + query: Scalars['JSONObject']['output']; + type: Scalars['String']['output']; + updatedAt: Scalars['DateTime']['output']; + updatedBy?: Maybe; + version: Scalars['Int']['output']; +}; + export type InvitableCollaboratorsFilter = { search?: InputMaybe; }; @@ -2234,7 +2556,7 @@ export type LimitedWorkspace = { id: Scalars['ID']['output']; /** * Optional base64 encoded workspace logo image - * @deprecated Use the `workspace.logoUrl` field instead. Will be removed after June 2025. + * @deprecated Use the `workspace.logoUrl` field instead. Will be removed after June 2026. */ logo?: Maybe; /** URL for pulling the workspace logo image */ @@ -2385,6 +2707,15 @@ export type ModelCollection = { totalCount: Scalars['Int']['output']; }; +export type ModelExecutionResult = { + __typename?: 'ModelExecutionResult'; + durationMs: Scalars['Int']['output']; + modelId?: Maybe; + result: Scalars['JSONObject']['output']; + summary: Scalars['JSONObject']['output']; + versionId?: Maybe; +}; + export type ModelIngestion = { __typename?: 'ModelIngestion'; authorUser?: Maybe; @@ -2668,6 +2999,8 @@ export type Mutation = { commitsMove: Scalars['Boolean']['output']; dashboardMutations: DashboardMutations; fileUploadMutations: FileUploadMutations; + insightMutations: InsightMutations; + insightTemplateMutations: InsightTemplateMutations; /** * Delete a pending invite * Note: The required scope to invoke this is not given out to app or personal access tokens @@ -2710,30 +3043,8 @@ export type Mutation = { * @deprecated Part of the old API surface and will be removed in the future. Use ProjectMutations.create instead. */ streamCreate?: Maybe; - /** - * Deletes an existing stream. - * @deprecated Part of the old API surface and will be removed in the future. Use ProjectMutations.delete instead. Field will be deleted on January 1st, 2026. - */ - streamDelete: Scalars['Boolean']['output']; /** @deprecated Part of the old API surface and will be removed in the future. */ streamFavorite?: Maybe; - /** - * Note: The required scope to invoke this is not given out to app or personal access tokens - * @deprecated Part of the old API surface and will be removed in the future. Use ProjectInviteMutations.batchCreate instead. Field will be deleted on January 1st, 2026. - */ - streamInviteBatchCreate: Scalars['Boolean']['output']; - /** - * Cancel a pending stream invite. Can only be invoked by a stream owner. - * Note: The required scope to invoke this is not given out to app or personal access tokens - * @deprecated Part of the old API surface and will be removed in the future. Use ProjectInviteMutations.cancel instead. Field will be deleted on January 1st, 2026. - */ - streamInviteCancel: Scalars['Boolean']['output']; - /** - * Invite a new or registered user to the specified stream - * Note: The required scope to invoke this is not given out to app or personal access tokens - * @deprecated Part of the old API surface and will be removed in the future. Use ProjectInviteMutations.create instead. Field will be deleted on January 1st, 2026. - */ - streamInviteCreate: Scalars['Boolean']['output']; /** * Accept or decline a stream invite * @deprecated Part of the old API surface and will be removed in the future. Use ProjectInviteMutations.use instead. @@ -2744,23 +3055,11 @@ export type Mutation = { * @deprecated Part of the old API surface and will be removed in the future. Use ProjectMutations.leave instead. */ streamLeave: Scalars['Boolean']['output']; - /** - * Revokes the permissions of a user on a given stream. - * @deprecated Part of the old API surface and will be removed in the future. Use ProjectMutations.updateRole instead. Field will be deleted on January 1st, 2026. - */ - streamRevokePermission?: Maybe; /** * Updates an existing stream. * @deprecated Part of the old API surface and will be removed in the future. Use ProjectMutations.update instead. */ streamUpdate: Scalars['Boolean']['output']; - /** - * Update permissions of a user on a given stream. - * @deprecated Part of the old API surface and will be removed in the future. Use ProjectMutations.updateRole instead. Field will be deleted on January 1st, 2026. - */ - streamUpdatePermission?: Maybe; - /** @deprecated Part of the old API surface and will be removed in the future. Use ProjectMutations.batchDelete instead. Field will be deleted on January 1st, 2026. */ - streamsDelete: Scalars['Boolean']['output']; /** Delete a user's account. */ userDelete: Scalars['Boolean']['output']; userNotificationPreferencesUpdate?: Maybe; @@ -2931,33 +3230,12 @@ export type MutationStreamCreateArgs = { }; -export type MutationStreamDeleteArgs = { - id: Scalars['String']['input']; -}; - - export type MutationStreamFavoriteArgs = { favorited: Scalars['Boolean']['input']; streamId: Scalars['String']['input']; }; -export type MutationStreamInviteBatchCreateArgs = { - input: Array; -}; - - -export type MutationStreamInviteCancelArgs = { - inviteId: Scalars['String']['input']; - streamId: Scalars['String']['input']; -}; - - -export type MutationStreamInviteCreateArgs = { - input: StreamInviteCreateInput; -}; - - export type MutationStreamInviteUseArgs = { accept: Scalars['Boolean']['input']; streamId: Scalars['String']['input']; @@ -2970,26 +3248,11 @@ export type MutationStreamLeaveArgs = { }; -export type MutationStreamRevokePermissionArgs = { - permissionParams: StreamRevokePermissionInput; -}; - - export type MutationStreamUpdateArgs = { stream: StreamUpdateInput; }; -export type MutationStreamUpdatePermissionArgs = { - permissionParams: StreamUpdatePermissionInput; -}; - - -export type MutationStreamsDeleteArgs = { - ids?: InputMaybe>; -}; - - export type MutationUserDeleteArgs = { userConfirmation: UserDeleteInput; }; @@ -3228,6 +3491,8 @@ export type Project = { allowPublicComments: Scalars['Boolean']['output']; /** List of allowed assignees for this issue */ allowedIssueAssignees: IssueParticipantCollection; + /** When the project was archived. Null if the project is active. */ + archivedAt?: Maybe; /** Get a single automation by id. Error will be thrown if automation is not found or inaccessible. */ automation: Automation; automations: AutomationCollection; @@ -4051,6 +4316,8 @@ export type ProjectMutations = { __typename?: 'ProjectMutations'; /** Access request related mutations */ accessRequestMutations: ProjectAccessRequestMutations; + /** Archive an existing project. Only project owners can archive. */ + archive: Project; automationMutations: ProjectAutomationMutations; /** Batch delete projects */ batchDelete: Scalars['Boolean']['output']; @@ -4071,6 +4338,8 @@ export type ProjectMutations = { /** @deprecated Part of the old API surface and will be removed in the future. Field will be deleted on October 1st, 2026. */ revokeEmbedTokens: Scalars['Boolean']['output']; savedViewMutations: SavedViewMutations; + /** Unarchive an archived project. Only project owners can unarchive. */ + unarchive: Project; /** Updates an existing project */ update: Project; /** Update role for a collaborator */ @@ -4078,6 +4347,11 @@ export type ProjectMutations = { }; +export type ProjectMutationsArchiveArgs = { + id: Scalars['String']['input']; +}; + + export type ProjectMutationsAutomationMutationsArgs = { projectId: Scalars['ID']['input']; }; @@ -4119,6 +4393,11 @@ export type ProjectMutationsRevokeEmbedTokensArgs = { }; +export type ProjectMutationsUnarchiveArgs = { + id: Scalars['String']['input']; +}; + + export type ProjectMutationsUpdateArgs = { update: ProjectUpdateInput; }; @@ -4158,6 +4437,7 @@ export type ProjectPermissionChecks = { __typename?: 'ProjectPermissionChecks'; canAccessIssuesFeature: PermissionCheckResult; canAccessViewerTableFeature: PermissionCheckResult; + canArchive: PermissionCheckResult; canBroadcastActivity: PermissionCheckResult; canCreateAutomation: PermissionCheckResult; /** @deprecated Comments were moved to issues. Use canCreateIssue instead. This check will be removed after 01 Jun 2026. */ @@ -4188,6 +4468,7 @@ export type ProjectPermissionChecks = { canRequestRender: PermissionCheckResult; /** @deprecated Part of the old API surface and will be removed in the future. Use canRevoke on ShareToken. Field will be deleted on October 1st, 2026. */ canRevokeEmbedTokens: PermissionCheckResult; + canUnarchive: PermissionCheckResult; canUpdate: PermissionCheckResult; canUpdateAllowPublicComments: PermissionCheckResult; canUpdateRole: PermissionCheckResult; @@ -4358,6 +4639,13 @@ export enum ProjectVisibility { Workspace = 'WORKSPACE' } +export type PropagationResult = { + __typename?: 'PropagationResult'; + failed: Scalars['Int']['output']; + skipped: Scalars['Int']['output']; + updated: Scalars['Int']['output']; +}; + export type Query = { __typename?: 'Query'; /** Stare into the void. */ @@ -4395,6 +4683,14 @@ export type Query = { * @deprecated Part of the old API surface and will be removed in the future. */ discoverableStreams?: Maybe; + /** Get a single insight by ID */ + insight?: Maybe; + /** Get a single insight result by ID */ + insightResult?: Maybe; + /** Get a single insight template by ID */ + insightTemplate?: Maybe; + /** List all insights tracking a specific model */ + modelInsights: Array; /** Get the (limited) profile information of another server user */ otherUser?: Maybe; permissions: RootPermissionChecks; @@ -4403,6 +4699,8 @@ export type Query = { * to see it, for example, if a project isn't public and the user doesn't have the appropriate rights. */ project: Project; + /** List all insights for a project, optionally filtered by type */ + projectInsights: Array; /** * Look for an invitation to a project, for the current user (authed or not). If token * isn't specified, the server will look for any valid invite. @@ -4432,11 +4730,6 @@ export type Query = { * @deprecated Part of the old API surface and will be removed in the future. Use Query.projectInvite instead. */ streamInvite?: Maybe; - /** - * Get all invitations to streams that the active user has - * @deprecated Part of the old API surface and will be removed in the future. Use User.projectInvites instead. Field will be deleted on January 1st, 2026. - */ - streamInvites: Array; /** * Returns all streams that the active user is a collaborator on. * Pass in the `query` parameter to search by name, description or ID. @@ -4467,6 +4760,8 @@ export type Query = { validateWorkspaceSlug: Scalars['Boolean']['output']; workspace: Workspace; workspaceBySlug: Workspace; + /** List templates for a workspace, optionally filtered by type */ + workspaceInsightTemplates: Array; /** * Look for an invitation to a workspace, for the current user (authed or not). * @@ -4524,6 +4819,30 @@ export type QueryDiscoverableStreamsArgs = { }; +export type QueryInsightArgs = { + id: Scalars['String']['input']; + projectId: Scalars['String']['input']; +}; + + +export type QueryInsightResultArgs = { + id: Scalars['String']['input']; + projectId: Scalars['String']['input']; +}; + + +export type QueryInsightTemplateArgs = { + id: Scalars['String']['input']; + workspaceId: Scalars['String']['input']; +}; + + +export type QueryModelInsightsArgs = { + modelId: Scalars['String']['input']; + projectId: Scalars['String']['input']; +}; + + export type QueryOtherUserArgs = { id: Scalars['String']['input']; }; @@ -4534,6 +4853,12 @@ export type QueryProjectArgs = { }; +export type QueryProjectInsightsArgs = { + projectId: Scalars['String']['input']; + type?: InputMaybe; +}; + + export type QueryProjectInviteArgs = { projectId: Scalars['String']['input']; token?: InputMaybe; @@ -4628,6 +4953,12 @@ export type QueryWorkspaceBySlugArgs = { }; +export type QueryWorkspaceInsightTemplatesArgs = { + type?: InputMaybe; + workspaceId: Scalars['String']['input']; +}; + + export type QueryWorkspaceInviteArgs = { options?: InputMaybe; token?: InputMaybe; @@ -5018,6 +5349,8 @@ export type ServerAutomateInfo = { export type ServerConfiguration = { __typename?: 'ServerConfiguration'; blobSizeLimitBytes: Scalars['Int']['output']; + /** Origin URL of the dashboards service */ + dashboardsOrigin?: Maybe; /** Email verification code timeout in minutes */ emailVerificationTimeoutMinutes: Scalars['Int']['output']; /** Active server-level feature flags */ @@ -5140,6 +5473,7 @@ export enum ServerRole { ServerAdmin = 'SERVER_ADMIN', ServerArchivedUser = 'SERVER_ARCHIVED_USER', ServerGuest = 'SERVER_GUEST', + ServerSupport = 'SERVER_SUPPORT', ServerUser = 'SERVER_USER' } @@ -5313,11 +5647,6 @@ export type StartFileImportInput = { export type Stream = { __typename?: 'Stream'; - /** - * All the recent activity on this stream in chronological order - * @deprecated Part of the old API surface and will be removed in the future. Field will be deleted on January 1st, 2026. - */ - activity?: Maybe; allowPublicComments: Scalars['Boolean']['output']; /** @deprecated Part of the old API surface and will be removed in the future. Use Project.blob instead. */ blob?: Maybe; @@ -5390,15 +5719,6 @@ export type Stream = { }; -export type StreamActivityArgs = { - actionType?: InputMaybe; - after?: InputMaybe; - before?: InputMaybe; - cursor?: InputMaybe; - limit?: Scalars['Int']['input']; -}; - - export type StreamBlobArgs = { id: Scalars['String']['input']; }; @@ -5490,22 +5810,6 @@ export type StreamCreateInput = { withContributors?: InputMaybe>; }; -export type StreamInviteCreateInput = { - email?: InputMaybe; - message?: InputMaybe; - /** Defaults to the contributor role, if not specified */ - role?: InputMaybe; - /** Can only be specified if guest mode is on or if the user is an admin */ - serverRole?: InputMaybe; - streamId: Scalars['String']['input']; - userId?: InputMaybe; -}; - -export type StreamRevokePermissionInput = { - streamId: Scalars['String']['input']; - userId: Scalars['String']['input']; -}; - export enum StreamRole { StreamContributor = 'STREAM_CONTRIBUTOR', StreamOwner = 'STREAM_OWNER', @@ -5526,12 +5830,6 @@ export type StreamUpdateInput = { name?: InputMaybe; }; -export type StreamUpdatePermissionInput = { - role: Scalars['String']['input']; - streamId: Scalars['String']['input']; - userId: Scalars['String']['input']; -}; - export type Subscription = { __typename?: 'Subscription'; /** It's lonely in the void. */ @@ -5644,7 +5942,7 @@ export type Subscription = { * Track support session changes for a specific workspace. * Fires when sessions are requested, approved, revoked, or expire. */ - workspaceSupportSessionUpdated: WorkspaceSupportSessionUpdatedMessage; + workspaceSupportSessionUpdated?: Maybe; /** * Track updates to a specific workspace. * Either slug or id must be set. @@ -5998,7 +6296,7 @@ export type User = { /** * Get commits authored by the user. If requested for another user, then only commits * from public streams will be returned. - * @deprecated Part of the old API surface and will be removed in the future. Use User.versions instead. Field will be deleted on January 1st, 2026. + * @deprecated Part of the old API surface and will be removed in the future. Use User.versions instead. */ commits?: Maybe; company?: Maybe; @@ -6017,12 +6315,6 @@ export type User = { * (3) The user does not have a valid SSO session for the given SSO provider */ expiredSsoSessions: Array; - /** - * All the streams that a active user has favorited. - * Note: You can't use this to retrieve another user's favorite streams. - * @deprecated Part of the old API surface and will be removed in the future. Field will be deleted on January 1st, 2026. - */ - favoriteStreams: StreamCollection; /** Whether the user has a pending/active email verification token */ hasPendingVerification?: Maybe; id: Scalars['ID']['output']; @@ -6045,7 +6337,7 @@ export type User = { /** * Returns all streams that the user is a collaborator on. If requested for a user, who isn't the * authenticated user, then this will only return discoverable streams. - * @deprecated Part of the old API surface and will be removed in the future. Use User.projects instead. Field will be deleted on January 1st, 2026. + * @deprecated Part of the old API surface and will be removed in the future. Use User.projects instead. */ streams: UserStreamCollection; /** @@ -6108,16 +6400,6 @@ export type UserCommitsArgs = { }; -/** - * Full user type, should only be used in the context of admin operations or - * when a user is reading/writing info about himself - */ -export type UserFavoriteStreamsArgs = { - cursor?: InputMaybe; - limit?: Scalars['Int']['input']; -}; - - /** * Full user type, should only be used in the context of admin operations or * when a user is reading/writing info about himself @@ -6499,6 +6781,15 @@ export type VersionPermissionChecks = { canUpdate: PermissionCheckResult; }; +export type VersionQueryResult = { + __typename?: 'VersionQueryResult'; + createdAt: Scalars['DateTime']['output']; + durationMs: Scalars['Int']['output']; + result: Scalars['JSONObject']['output']; + summary: Scalars['JSONObject']['output']; + versionId: Scalars['String']['output']; +}; + /** * If only one is set, the other will be resolved automatically * If none are set, the view will be added to the end of the list @@ -6696,7 +6987,7 @@ export type Workspace = { issueLabels: IssueLabelCollection; /** * Logo image as base64-encoded string - * @deprecated Use the `workspace.logoUrl` field instead. Will be removed after June 2025. + * @deprecated Use the `workspace.logoUrl` field instead. Will be removed after June 2026. */ logo?: Maybe; /** URL for pulling the workspace logo image */ @@ -6706,6 +6997,13 @@ export type Workspace = { plan?: Maybe; /** Shows the plan prices localized for the given workspace */ planPrices?: Maybe; + /** + * Bulk project activity data for the workspace timeline widget. + * Returns versions created within a date window, grouped by project. + * First call discovers top N projects; pass the returned cursor to load older data. + * Internal API — may change without notice. + */ + projectActivityTimeline?: Maybe; projects: ProjectCollection; /** A Workspace is marked as readOnly if its trial period is finished or a paid plan is subscribed but payment has failed */ readOnly: Scalars['Boolean']['output']; @@ -6767,6 +7065,11 @@ export type WorkspaceIssueLabelsArgs = { }; +export type WorkspaceProjectActivityTimelineArgs = { + input: WorkspaceProjectActivityTimelineInput; +}; + + export type WorkspaceProjectsArgs = { cursor?: InputMaybe; filter?: InputMaybe; @@ -6905,6 +7208,7 @@ export enum WorkspaceFeatureName { DomainDiscoverability = 'domainDiscoverability', EmbedPrivateProjects = 'embedPrivateProjects', ExclusiveMembership = 'exclusiveMembership', + Frontend3 = 'frontend3', HideSpeckleBranding = 'hideSpeckleBranding', Issues = 'issues', Markup = 'markup', @@ -6914,6 +7218,7 @@ export enum WorkspaceFeatureName { Presentation = 'presentation', /** @deprecated Use presentation instead. Value will be dropped after July 19, 2026. */ Presentations = 'presentations', + ProjectArchival = 'projectArchival', ProjectDashboards = 'projectDashboards', SavedViews = 'savedViews', ViewerTable = 'viewerTable', @@ -7402,6 +7707,43 @@ export enum WorkspacePlans { Unlimited = 'unlimited' } +export type WorkspaceProjectActivityTimelineInput = { + /** + * Opaque cursor from a previous response. When provided, withProjectRoleOnly and projectLimit are ignored. + * Encodes the locked-in project set and next date boundary. + */ + cursor?: InputMaybe; + /** + * Size of each date window in days. Default: 7. + * Used for both discovery (now - N days) and pagination (cursor.before - N days). + * Can change between pages — the cursor locks the project set and boundary, + * while this controls how far back from that boundary to look. + */ + dateRangeDays?: InputMaybe; + /** Max projects to discover by updatedAt DESC. Default: 20. Ignored when cursor is provided. */ + projectLimit?: InputMaybe; + /** + * Only return projects where the active user has an explicit project role. + * Used on first call (discovery). Ignored when cursor is provided (as projects are pre-determined then). + */ + withProjectRoleOnly?: InputMaybe; +}; + +export type WorkspaceProjectActivityTimelineProjectGroup = { + __typename?: 'WorkspaceProjectActivityTimelineProjectGroup'; + project: Project; + /** Versions within the date range, ordered by createdAt DESC. */ + versions: Array; +}; + +export type WorkspaceProjectActivityTimelineResult = { + __typename?: 'WorkspaceProjectActivityTimelineResult'; + /** Opaque cursor for loading older data. Null when no more data is available. */ + cursor?: Maybe; + /** Projects with their versions, ordered by most recent version DESC. */ + projectGroups: Array; +}; + export type WorkspaceProjectCreateInput = { description?: InputMaybe; name?: InputMaybe; @@ -7464,6 +7806,8 @@ export type WorkspaceProjectMutationsUpdateRoleArgs = { }; export type WorkspaceProjectsFilter = { + /** Include archived projects in results. Only respected for workspace admins; silently ignored for non-admins. */ + includeArchived?: InputMaybe; /** Filter out projects by name */ search?: InputMaybe; /** Only return workspace projects that the active user has an explicit project role in */