diff --git a/ee/tabby-ui/app/(dashboard)/page.tsx b/ee/tabby-ui/app/(dashboard)/page.tsx index c72cb3a..704f94e 100644 --- a/ee/tabby-ui/app/(dashboard)/page.tsx +++ b/ee/tabby-ui/app/(dashboard)/page.tsx @@ -17,8 +17,8 @@ import WorkerCard from './components/worker-card' import { useWorkers } from '@/lib/hooks/use-workers' import { WorkerKind } from '@/lib/gql/generates/graphql' import { useGraphQL } from '@/lib/hooks/use-graphql' -import { getRegistrationTokenDocument } from '@/lib/gql/request-documents' import { CopyButton } from '@/components/copy-button' +import { graphql } from '@/lib/gql/generates' const COMMUNITY_DIALOG_SHOWN_KEY = 'community-dialog-shown' @@ -75,6 +75,12 @@ function toBadgeString(str: string) { return encodeURIComponent(str.replaceAll('-', '--')) } +const getRegistrationTokenDocument = graphql(/* GraphQL */ ` + query GetRegistrationToken { + registrationToken + } +`) + function MainPanel() { const { data: healthInfo } = useHealth() const workers = useWorkers(healthInfo) diff --git a/ee/tabby-ui/codegen.ts b/ee/tabby-ui/codegen.ts index caf3dc3..a8a91ef 100644 --- a/ee/tabby-ui/codegen.ts +++ b/ee/tabby-ui/codegen.ts @@ -4,7 +4,7 @@ import type { CodegenConfig } from '@graphql-codegen/cli'; const config: CodegenConfig = { overwrite: true, schema: "../tabby-webserver/graphql/schema.graphql", - documents: "./**/*.tsx", + documents: "./**/*.(tsx|ts)", ignoreNoDocuments: true, generates: { "lib/gql/generates/": { diff --git a/ee/tabby-ui/lib/gql/generates/gql.ts b/ee/tabby-ui/lib/gql/generates/gql.ts index 0af4c32..4c6b1d5 100644 --- a/ee/tabby-ui/lib/gql/generates/gql.ts +++ b/ee/tabby-ui/lib/gql/generates/gql.ts @@ -13,10 +13,10 @@ import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/ * Therefore it is highly recommended to use the babel or swc plugin for production. */ const documents = { - '\n query GetWorkers {\n workers {\n kind\n name\n addr\n device\n arch\n cpuInfo\n cpuCount\n cudaDevices\n }\n }\n': - types.GetWorkersDocument, '\n query GetRegistrationToken {\n registrationToken\n }\n': - types.GetRegistrationTokenDocument + types.GetRegistrationTokenDocument, + '\n query GetWorkers {\n workers {\n kind\n name\n addr\n device\n arch\n cpuInfo\n cpuCount\n cudaDevices\n }\n }\n': + types.GetWorkersDocument } /** @@ -37,14 +37,14 @@ export function graphql(source: string): unknown * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ export function graphql( - source: '\n query GetWorkers {\n workers {\n kind\n name\n addr\n device\n arch\n cpuInfo\n cpuCount\n cudaDevices\n }\n }\n' -): (typeof documents)['\n query GetWorkers {\n workers {\n kind\n name\n addr\n device\n arch\n cpuInfo\n cpuCount\n cudaDevices\n }\n }\n'] + source: '\n query GetRegistrationToken {\n registrationToken\n }\n' +): (typeof documents)['\n query GetRegistrationToken {\n registrationToken\n }\n'] /** * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ export function graphql( - source: '\n query GetRegistrationToken {\n registrationToken\n }\n' -): (typeof documents)['\n query GetRegistrationToken {\n registrationToken\n }\n'] + source: '\n query GetWorkers {\n workers {\n kind\n name\n addr\n device\n arch\n cpuInfo\n cpuCount\n cudaDevices\n }\n }\n' +): (typeof documents)['\n query GetWorkers {\n workers {\n kind\n name\n addr\n device\n arch\n cpuInfo\n cpuCount\n cudaDevices\n }\n }\n'] export function graphql(source: string) { return (documents as any)[source] ?? {} diff --git a/ee/tabby-ui/lib/gql/generates/graphql.ts b/ee/tabby-ui/lib/gql/generates/graphql.ts index adadd03..c1233b4 100644 --- a/ee/tabby-ui/lib/gql/generates/graphql.ts +++ b/ee/tabby-ui/lib/gql/generates/graphql.ts @@ -29,17 +29,99 @@ export type Scalars = { Float: { input: number; output: number } } +export type Claims = { + __typename?: 'Claims' + exp: Scalars['Float']['output'] + iat: Scalars['Float']['output'] + user: UserInfo +} + +export type Invitation = { + __typename?: 'Invitation' + code: Scalars['String']['output'] + createdAt: Scalars['String']['output'] + email: Scalars['String']['output'] + id: Scalars['Int']['output'] +} + export type Mutation = { __typename?: 'Mutation' + createInvitation: Scalars['Int']['output'] + deleteInvitation: Scalars['Int']['output'] + refreshToken: RefreshTokenResponse + register: RegisterResponse resetRegistrationToken: Scalars['String']['output'] + tokenAuth: TokenAuthResponse + verifyToken: VerifyTokenResponse +} + +export type MutationCreateInvitationArgs = { + email: Scalars['String']['input'] +} + +export type MutationDeleteInvitationArgs = { + id: Scalars['Int']['input'] +} + +export type MutationRefreshTokenArgs = { + refreshToken: Scalars['String']['input'] +} + +export type MutationRegisterArgs = { + email: Scalars['String']['input'] + invitationCode?: InputMaybe + password1: Scalars['String']['input'] + password2: Scalars['String']['input'] +} + +export type MutationTokenAuthArgs = { + email: Scalars['String']['input'] + password: Scalars['String']['input'] +} + +export type MutationVerifyTokenArgs = { + token: Scalars['String']['input'] } export type Query = { __typename?: 'Query' + invitations: Array + isAdminInitialized: Scalars['Boolean']['output'] + me: UserInfo registrationToken: Scalars['String']['output'] workers: Array } +export type RefreshTokenResponse = { + __typename?: 'RefreshTokenResponse' + accessToken: Scalars['String']['output'] + refreshExpiresAt: Scalars['Float']['output'] + refreshToken: Scalars['String']['output'] +} + +export type RegisterResponse = { + __typename?: 'RegisterResponse' + accessToken: Scalars['String']['output'] + refreshToken: Scalars['String']['output'] +} + +export type TokenAuthResponse = { + __typename?: 'TokenAuthResponse' + accessToken: Scalars['String']['output'] + refreshToken: Scalars['String']['output'] +} + +export type UserInfo = { + __typename?: 'UserInfo' + email: Scalars['String']['output'] + isAdmin: Scalars['Boolean']['output'] +} + +export type VerifyTokenResponse = { + __typename?: 'VerifyTokenResponse' + claims: Claims +} + export type Worker = { __typename?: 'Worker' addr: Scalars['String']['output'] @@ -57,6 +139,13 @@ export enum WorkerKind { Completion = 'COMPLETION' } +export type GetRegistrationTokenQueryVariables = Exact<{ [key: string]: never }> + +export type GetRegistrationTokenQuery = { + __typename?: 'Query' + registrationToken: string +} + export type GetWorkersQueryVariables = Exact<{ [key: string]: never }> export type GetWorkersQuery = { @@ -74,13 +163,25 @@ export type GetWorkersQuery = { }> } -export type GetRegistrationTokenQueryVariables = Exact<{ [key: string]: never }> - -export type GetRegistrationTokenQuery = { - __typename?: 'Query' - registrationToken: string -} - +export const GetRegistrationTokenDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'query', + name: { kind: 'Name', value: 'GetRegistrationToken' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'registrationToken' } } + ] + } + } + ] +} as unknown as DocumentNode< + GetRegistrationTokenQuery, + GetRegistrationTokenQueryVariables +> export const GetWorkersDocument = { kind: 'Document', definitions: [ @@ -113,22 +214,3 @@ export const GetWorkersDocument = { } ] } as unknown as DocumentNode -export const GetRegistrationTokenDocument = { - kind: 'Document', - definitions: [ - { - kind: 'OperationDefinition', - operation: 'query', - name: { kind: 'Name', value: 'GetRegistrationToken' }, - selectionSet: { - kind: 'SelectionSet', - selections: [ - { kind: 'Field', name: { kind: 'Name', value: 'registrationToken' } } - ] - } - } - ] -} as unknown as DocumentNode< - GetRegistrationTokenQuery, - GetRegistrationTokenQueryVariables -> diff --git a/ee/tabby-ui/lib/gql/request-documents.tsx b/ee/tabby-ui/lib/gql/request-documents.tsx deleted file mode 100644 index 3c3df64..0000000 --- a/ee/tabby-ui/lib/gql/request-documents.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { graphql } from './generates' - -export const getAllWorkersDocument = graphql(/* GraphQL */ ` - query GetWorkers { - workers { - kind - name - addr - device - arch - cpuInfo - cpuCount - cudaDevices - } - } -`) - -export const getRegistrationTokenDocument = graphql(/* GraphQL */ ` - query GetRegistrationToken { - registrationToken - } -`) diff --git a/ee/tabby-ui/lib/hooks/use-workers.ts b/ee/tabby-ui/lib/hooks/use-workers.ts index af1ffdd..3ecc478 100644 --- a/ee/tabby-ui/lib/hooks/use-workers.ts +++ b/ee/tabby-ui/lib/hooks/use-workers.ts @@ -1,9 +1,9 @@ import React from 'react' import { groupBy, findIndex, slice } from 'lodash-es' import { Worker, WorkerKind } from '@/lib/gql/generates/graphql' -import { getAllWorkersDocument } from '@/lib/gql/request-documents' import { useGraphQL } from './use-graphql' import type { HealthInfo } from './use-health' +import { graphql } from '@/lib/gql/generates' const modelNameMap: Record = { [WorkerKind.Chat]: 'chat_model', @@ -26,6 +26,21 @@ function transformHealthInfoToWorker( } } +export const getAllWorkersDocument = graphql(/* GraphQL */ ` + query GetWorkers { + workers { + kind + name + addr + device + arch + cpuInfo + cpuCount + cudaDevices + } + } +`) + function useWorkers(healthInfo?: HealthInfo) { const { data } = useGraphQL(getAllWorkersDocument) let workers = data?.workers