diff --git a/packages/create-twenty-app/package.json b/packages/create-twenty-app/package.json
index 5f94af29c1..579dafd73e 100644
--- a/packages/create-twenty-app/package.json
+++ b/packages/create-twenty-app/package.json
@@ -1,6 +1,6 @@
{
"name": "create-twenty-app",
- "version": "0.8.0-canary.5",
+ "version": "0.8.0-canary.6",
"description": "Command-line interface to create Twenty application",
"main": "dist/cli.cjs",
"bin": "dist/cli.cjs",
diff --git a/packages/create-twenty-app/src/create-app.command.ts b/packages/create-twenty-app/src/create-app.command.ts
index be9256c4c7..5ec77be3af 100644
--- a/packages/create-twenty-app/src/create-app.command.ts
+++ b/packages/create-twenty-app/src/create-app.command.ts
@@ -211,14 +211,14 @@ export class CreateAppCommand {
if (!result.success) {
console.log(
chalk.yellow(
- 'Authentication skipped. Run `yarn twenty remote add --local` manually.',
+ 'Authentication skipped. Run `yarn twenty remote add` manually.',
),
);
}
} catch {
console.log(
chalk.yellow(
- 'Authentication skipped. Run `yarn twenty remote add --local` manually.',
+ 'Authentication skipped. Run `yarn twenty remote add` manually.',
),
);
}
@@ -236,7 +236,7 @@ export class CreateAppCommand {
if (!serverResult) {
console.log(
chalk.gray(
- '- yarn twenty remote add --local # Authenticate with Twenty',
+ '- yarn twenty remote add # Authenticate with Twenty',
),
);
}
diff --git a/packages/create-twenty-app/src/utils/app-template.ts b/packages/create-twenty-app/src/utils/app-template.ts
index 572108afc6..519298d429 100644
--- a/packages/create-twenty-app/src/utils/app-template.ts
+++ b/packages/create-twenty-app/src/utils/app-template.ts
@@ -794,6 +794,7 @@ const createPackageJson = async ({
npm: 'please-use-yarn',
yarn: '>=4.0.2',
},
+ keywords: ['twenty-app'],
packageManager: 'yarn@4.9.2',
scripts,
devDependencies,
diff --git a/packages/twenty-apps/fixtures/postcard-app/package.json b/packages/twenty-apps/fixtures/postcard-app/package.json
index 4c3a0ac420..bf09dab12b 100644
--- a/packages/twenty-apps/fixtures/postcard-app/package.json
+++ b/packages/twenty-apps/fixtures/postcard-app/package.json
@@ -9,22 +9,11 @@
},
"packageManager": "yarn@4.9.2",
"scripts": {
- "remote:add": "twenty remote add --local",
- "remote:status": "twenty remote status",
- "remote:switch": "twenty remote switch",
- "remote:list": "twenty remote list",
- "remote:remove": "twenty remote remove",
- "dev": "twenty dev",
- "add": "twenty add",
- "logs": "twenty logs",
- "exec": "twenty exec",
- "uninstall": "twenty uninstall",
- "help": "twenty help",
- "lint": "oxlint -c .oxlintrc.json .",
- "lint:fix": "oxlint --fix -c .oxlintrc.json ."
+ "twenty": "twenty"
},
"dependencies": {
- "twenty-sdk": "latest"
+ "twenty-sdk": "latest",
+ "twenty-client-sdk": "latest"
},
"devDependencies": {
"typescript": "^5.9.3",
diff --git a/packages/twenty-client-sdk/package.json b/packages/twenty-client-sdk/package.json
index b1f8aea918..d33a56c04c 100644
--- a/packages/twenty-client-sdk/package.json
+++ b/packages/twenty-client-sdk/package.json
@@ -1,6 +1,6 @@
{
"name": "twenty-client-sdk",
- "version": "0.8.0-canary.5",
+ "version": "0.8.0-canary.6",
"sideEffects": false,
"license": "AGPL-3.0",
"scripts": {
diff --git a/packages/twenty-client-sdk/src/metadata/generated/schema.graphql b/packages/twenty-client-sdk/src/metadata/generated/schema.graphql
index 75a6949144..e88d30e421 100644
--- a/packages/twenty-client-sdk/src/metadata/generated/schema.graphql
+++ b/packages/twenty-client-sdk/src/metadata/generated/schema.graphql
@@ -38,9 +38,6 @@ type ApplicationRegistration {
id: UUID!
universalIdentifier: String!
name: String!
- description: String
- logoUrl: String
- author: String
oAuthClientId: String!
oAuthRedirectUris: [String!]!
oAuthScopes: [String!]!
@@ -48,8 +45,6 @@ type ApplicationRegistration {
sourceType: ApplicationRegistrationSourceType!
sourcePackage: String
latestAvailableVersion: String
- websiteUrl: String
- termsUrl: String
isListed: Boolean!
isFeatured: Boolean!
createdAt: DateTime!
@@ -2421,91 +2416,30 @@ type File {
createdAt: DateTime!
}
-type MarketplaceAppField {
- name: String!
- type: String!
- label: String!
- description: String
- icon: String
- objectUniversalIdentifier: String
- universalIdentifier: String
-}
-
-type MarketplaceAppObject {
- universalIdentifier: String!
- nameSingular: String!
- namePlural: String!
- labelSingular: String!
- labelPlural: String!
- description: String
- icon: String
- fields: [MarketplaceAppField!]!
-}
-
-type MarketplaceAppLogicFunction {
- name: String!
- description: String
- timeoutSeconds: Int
-}
-
-type MarketplaceAppFrontComponent {
- name: String!
- description: String
-}
-
-type MarketplaceAppRoleObjectPermission {
- objectUniversalIdentifier: String!
- canReadObjectRecords: Boolean
- canUpdateObjectRecords: Boolean
- canSoftDeleteObjectRecords: Boolean
- canDestroyObjectRecords: Boolean
-}
-
-type MarketplaceAppRoleFieldPermission {
- objectUniversalIdentifier: String!
- fieldUniversalIdentifier: String!
- canReadFieldValue: Boolean
- canUpdateFieldValue: Boolean
-}
-
-type MarketplaceAppDefaultRole {
- id: String!
- label: String!
- description: String
- canReadAllObjectRecords: Boolean!
- canUpdateAllObjectRecords: Boolean!
- canSoftDeleteAllObjectRecords: Boolean!
- canDestroyAllObjectRecords: Boolean!
- canUpdateAllSettings: Boolean!
- canAccessAllTools: Boolean!
- objectPermissions: [MarketplaceAppRoleObjectPermission!]!
- fieldPermissions: [MarketplaceAppRoleFieldPermission!]!
- permissionFlags: [String!]!
-}
-
type MarketplaceApp {
id: String!
name: String!
description: String!
icon: String!
- version: String!
author: String!
category: String!
logo: String
- screenshots: [String!]!
- aboutDescription: String!
- providers: [String!]!
- websiteUrl: String
- termsUrl: String
- objects: [MarketplaceAppObject!]!
- fields: [MarketplaceAppField!]!
- logicFunctions: [MarketplaceAppLogicFunction!]!
- frontComponents: [MarketplaceAppFrontComponent!]!
- defaultRole: MarketplaceAppDefaultRole
sourcePackage: String
isFeatured: Boolean!
}
+type MarketplaceAppDetail {
+ universalIdentifier: String!
+ id: String!
+ name: String!
+ sourceType: ApplicationRegistrationSourceType!
+ sourcePackage: String
+ latestAvailableVersion: String
+ isListed: Boolean!
+ isFeatured: Boolean!
+ manifest: JSON
+}
+
type PublicDomain {
id: UUID!
domain: String!
@@ -3249,6 +3183,7 @@ type Query {
findApplicationRegistrationStats(id: String!): ApplicationRegistrationStats!
findApplicationRegistrationVariables(applicationRegistrationId: String!): [ApplicationRegistrationVariable!]!
applicationRegistrationTarballUrl(id: String!): String
+ getApplicationShareLink(id: String!): String!
currentUser: User!
currentWorkspace: Workspace!
getPublicWorkspaceDataByDomain(origin: String): PublicWorkspaceData!
@@ -3274,7 +3209,7 @@ type Query {
findManyPublicDomains: [PublicDomain!]!
getEmailingDomains: [EmailingDomain!]!
findManyMarketplaceApps: [MarketplaceApp!]!
- findOneMarketplaceApp(universalIdentifier: String!): MarketplaceApp!
+ findMarketplaceAppDetail(universalIdentifier: String!): MarketplaceAppDetail!
findManyApplications: [Application!]!
findOneApplication(id: UUID, universalIdentifier: UUID): Application!
}
@@ -3596,6 +3531,7 @@ type Mutation {
verifyEmailingDomain(id: String!): EmailingDomain!
createOneAppToken(input: CreateOneAppTokenInput!): AppToken!
installMarketplaceApp(universalIdentifier: String!, version: String): Boolean!
+ syncMarketplaceCatalog: Boolean!
installApplication(appRegistrationId: String!, version: String): Boolean!
runWorkspaceMigration(workspaceMigration: WorkspaceMigrationInput!): Boolean!
uninstallApplication(universalIdentifier: String!): Boolean!
@@ -4441,14 +4377,9 @@ input GetAuthorizationUrlForSSOInput {
input CreateApplicationRegistrationInput {
name: String!
- description: String
- logoUrl: String
- author: String
universalIdentifier: String
oAuthRedirectUris: [String!]
oAuthScopes: [String!]
- websiteUrl: String
- termsUrl: String
}
input UpdateApplicationRegistrationInput {
@@ -4458,13 +4389,8 @@ input UpdateApplicationRegistrationInput {
input UpdateApplicationRegistrationPayload {
name: String
- description: String
- logoUrl: String
- author: String
oAuthRedirectUris: [String!]
oAuthScopes: [String!]
- websiteUrl: String
- termsUrl: String
isListed: Boolean
}
diff --git a/packages/twenty-client-sdk/src/metadata/generated/schema.ts b/packages/twenty-client-sdk/src/metadata/generated/schema.ts
index d278d95299..c8f4c2bf22 100644
--- a/packages/twenty-client-sdk/src/metadata/generated/schema.ts
+++ b/packages/twenty-client-sdk/src/metadata/generated/schema.ts
@@ -42,9 +42,6 @@ export interface ApplicationRegistration {
id: Scalars['UUID']
universalIdentifier: Scalars['String']
name: Scalars['String']
- description?: Scalars['String']
- logoUrl?: Scalars['String']
- author?: Scalars['String']
oAuthClientId: Scalars['String']
oAuthRedirectUris: Scalars['String'][]
oAuthScopes: Scalars['String'][]
@@ -52,8 +49,6 @@ export interface ApplicationRegistration {
sourceType: ApplicationRegistrationSourceType
sourcePackage?: Scalars['String']
latestAvailableVersion?: Scalars['String']
- websiteUrl?: Scalars['String']
- termsUrl?: Scalars['String']
isListed: Scalars['Boolean']
isFeatured: Scalars['Boolean']
createdAt: Scalars['DateTime']
@@ -2120,99 +2115,32 @@ export interface File {
__typename: 'File'
}
-export interface MarketplaceAppField {
- name: Scalars['String']
- type: Scalars['String']
- label: Scalars['String']
- description?: Scalars['String']
- icon?: Scalars['String']
- objectUniversalIdentifier?: Scalars['String']
- universalIdentifier?: Scalars['String']
- __typename: 'MarketplaceAppField'
-}
-
-export interface MarketplaceAppObject {
- universalIdentifier: Scalars['String']
- nameSingular: Scalars['String']
- namePlural: Scalars['String']
- labelSingular: Scalars['String']
- labelPlural: Scalars['String']
- description?: Scalars['String']
- icon?: Scalars['String']
- fields: MarketplaceAppField[]
- __typename: 'MarketplaceAppObject'
-}
-
-export interface MarketplaceAppLogicFunction {
- name: Scalars['String']
- description?: Scalars['String']
- timeoutSeconds?: Scalars['Int']
- __typename: 'MarketplaceAppLogicFunction'
-}
-
-export interface MarketplaceAppFrontComponent {
- name: Scalars['String']
- description?: Scalars['String']
- __typename: 'MarketplaceAppFrontComponent'
-}
-
-export interface MarketplaceAppRoleObjectPermission {
- objectUniversalIdentifier: Scalars['String']
- canReadObjectRecords?: Scalars['Boolean']
- canUpdateObjectRecords?: Scalars['Boolean']
- canSoftDeleteObjectRecords?: Scalars['Boolean']
- canDestroyObjectRecords?: Scalars['Boolean']
- __typename: 'MarketplaceAppRoleObjectPermission'
-}
-
-export interface MarketplaceAppRoleFieldPermission {
- objectUniversalIdentifier: Scalars['String']
- fieldUniversalIdentifier: Scalars['String']
- canReadFieldValue?: Scalars['Boolean']
- canUpdateFieldValue?: Scalars['Boolean']
- __typename: 'MarketplaceAppRoleFieldPermission'
-}
-
-export interface MarketplaceAppDefaultRole {
- id: Scalars['String']
- label: Scalars['String']
- description?: Scalars['String']
- canReadAllObjectRecords: Scalars['Boolean']
- canUpdateAllObjectRecords: Scalars['Boolean']
- canSoftDeleteAllObjectRecords: Scalars['Boolean']
- canDestroyAllObjectRecords: Scalars['Boolean']
- canUpdateAllSettings: Scalars['Boolean']
- canAccessAllTools: Scalars['Boolean']
- objectPermissions: MarketplaceAppRoleObjectPermission[]
- fieldPermissions: MarketplaceAppRoleFieldPermission[]
- permissionFlags: Scalars['String'][]
- __typename: 'MarketplaceAppDefaultRole'
-}
-
export interface MarketplaceApp {
id: Scalars['String']
name: Scalars['String']
description: Scalars['String']
icon: Scalars['String']
- version: Scalars['String']
author: Scalars['String']
category: Scalars['String']
logo?: Scalars['String']
- screenshots: Scalars['String'][]
- aboutDescription: Scalars['String']
- providers: Scalars['String'][]
- websiteUrl?: Scalars['String']
- termsUrl?: Scalars['String']
- objects: MarketplaceAppObject[]
- fields: MarketplaceAppField[]
- logicFunctions: MarketplaceAppLogicFunction[]
- frontComponents: MarketplaceAppFrontComponent[]
- defaultRole?: MarketplaceAppDefaultRole
sourcePackage?: Scalars['String']
isFeatured: Scalars['Boolean']
__typename: 'MarketplaceApp'
}
+export interface MarketplaceAppDetail {
+ universalIdentifier: Scalars['String']
+ id: Scalars['String']
+ name: Scalars['String']
+ sourceType: ApplicationRegistrationSourceType
+ sourcePackage?: Scalars['String']
+ latestAvailableVersion?: Scalars['String']
+ isListed: Scalars['Boolean']
+ isFeatured: Scalars['Boolean']
+ manifest?: Scalars['JSON']
+ __typename: 'MarketplaceAppDetail'
+}
+
export interface PublicDomain {
id: Scalars['UUID']
domain: Scalars['String']
@@ -2805,6 +2733,7 @@ export interface Query {
findApplicationRegistrationStats: ApplicationRegistrationStats
findApplicationRegistrationVariables: ApplicationRegistrationVariable[]
applicationRegistrationTarballUrl?: Scalars['String']
+ getApplicationShareLink: Scalars['String']
currentUser: User
currentWorkspace: Workspace
getPublicWorkspaceDataByDomain: PublicWorkspaceData
@@ -2830,7 +2759,7 @@ export interface Query {
findManyPublicDomains: PublicDomain[]
getEmailingDomains: EmailingDomain[]
findManyMarketplaceApps: MarketplaceApp[]
- findOneMarketplaceApp: MarketplaceApp
+ findMarketplaceAppDetail: MarketplaceAppDetail
findManyApplications: Application[]
findOneApplication: Application
__typename: 'Query'
@@ -3047,6 +2976,7 @@ export interface Mutation {
verifyEmailingDomain: EmailingDomain
createOneAppToken: AppToken
installMarketplaceApp: Scalars['Boolean']
+ syncMarketplaceCatalog: Scalars['Boolean']
installApplication: Scalars['Boolean']
runWorkspaceMigration: Scalars['Boolean']
uninstallApplication: Scalars['Boolean']
@@ -3114,9 +3044,6 @@ export interface ApplicationRegistrationGenqlSelection{
id?: boolean | number
universalIdentifier?: boolean | number
name?: boolean | number
- description?: boolean | number
- logoUrl?: boolean | number
- author?: boolean | number
oAuthClientId?: boolean | number
oAuthRedirectUris?: boolean | number
oAuthScopes?: boolean | number
@@ -3124,8 +3051,6 @@ export interface ApplicationRegistrationGenqlSelection{
sourceType?: boolean | number
sourcePackage?: boolean | number
latestAvailableVersion?: boolean | number
- websiteUrl?: boolean | number
- termsUrl?: boolean | number
isListed?: boolean | number
isFeatured?: boolean | number
createdAt?: boolean | number
@@ -5314,107 +5239,34 @@ export interface FileGenqlSelection{
__scalar?: boolean | number
}
-export interface MarketplaceAppFieldGenqlSelection{
- name?: boolean | number
- type?: boolean | number
- label?: boolean | number
- description?: boolean | number
- icon?: boolean | number
- objectUniversalIdentifier?: boolean | number
- universalIdentifier?: boolean | number
- __typename?: boolean | number
- __scalar?: boolean | number
-}
-
-export interface MarketplaceAppObjectGenqlSelection{
- universalIdentifier?: boolean | number
- nameSingular?: boolean | number
- namePlural?: boolean | number
- labelSingular?: boolean | number
- labelPlural?: boolean | number
- description?: boolean | number
- icon?: boolean | number
- fields?: MarketplaceAppFieldGenqlSelection
- __typename?: boolean | number
- __scalar?: boolean | number
-}
-
-export interface MarketplaceAppLogicFunctionGenqlSelection{
- name?: boolean | number
- description?: boolean | number
- timeoutSeconds?: boolean | number
- __typename?: boolean | number
- __scalar?: boolean | number
-}
-
-export interface MarketplaceAppFrontComponentGenqlSelection{
- name?: boolean | number
- description?: boolean | number
- __typename?: boolean | number
- __scalar?: boolean | number
-}
-
-export interface MarketplaceAppRoleObjectPermissionGenqlSelection{
- objectUniversalIdentifier?: boolean | number
- canReadObjectRecords?: boolean | number
- canUpdateObjectRecords?: boolean | number
- canSoftDeleteObjectRecords?: boolean | number
- canDestroyObjectRecords?: boolean | number
- __typename?: boolean | number
- __scalar?: boolean | number
-}
-
-export interface MarketplaceAppRoleFieldPermissionGenqlSelection{
- objectUniversalIdentifier?: boolean | number
- fieldUniversalIdentifier?: boolean | number
- canReadFieldValue?: boolean | number
- canUpdateFieldValue?: boolean | number
- __typename?: boolean | number
- __scalar?: boolean | number
-}
-
-export interface MarketplaceAppDefaultRoleGenqlSelection{
- id?: boolean | number
- label?: boolean | number
- description?: boolean | number
- canReadAllObjectRecords?: boolean | number
- canUpdateAllObjectRecords?: boolean | number
- canSoftDeleteAllObjectRecords?: boolean | number
- canDestroyAllObjectRecords?: boolean | number
- canUpdateAllSettings?: boolean | number
- canAccessAllTools?: boolean | number
- objectPermissions?: MarketplaceAppRoleObjectPermissionGenqlSelection
- fieldPermissions?: MarketplaceAppRoleFieldPermissionGenqlSelection
- permissionFlags?: boolean | number
- __typename?: boolean | number
- __scalar?: boolean | number
-}
-
export interface MarketplaceAppGenqlSelection{
id?: boolean | number
name?: boolean | number
description?: boolean | number
icon?: boolean | number
- version?: boolean | number
author?: boolean | number
category?: boolean | number
logo?: boolean | number
- screenshots?: boolean | number
- aboutDescription?: boolean | number
- providers?: boolean | number
- websiteUrl?: boolean | number
- termsUrl?: boolean | number
- objects?: MarketplaceAppObjectGenqlSelection
- fields?: MarketplaceAppFieldGenqlSelection
- logicFunctions?: MarketplaceAppLogicFunctionGenqlSelection
- frontComponents?: MarketplaceAppFrontComponentGenqlSelection
- defaultRole?: MarketplaceAppDefaultRoleGenqlSelection
sourcePackage?: boolean | number
isFeatured?: boolean | number
__typename?: boolean | number
__scalar?: boolean | number
}
+export interface MarketplaceAppDetailGenqlSelection{
+ universalIdentifier?: boolean | number
+ id?: boolean | number
+ name?: boolean | number
+ sourceType?: boolean | number
+ sourcePackage?: boolean | number
+ latestAvailableVersion?: boolean | number
+ isListed?: boolean | number
+ isFeatured?: boolean | number
+ manifest?: boolean | number
+ __typename?: boolean | number
+ __scalar?: boolean | number
+}
+
export interface PublicDomainGenqlSelection{
id?: boolean | number
domain?: boolean | number
@@ -6042,6 +5894,7 @@ export interface QueryGenqlSelection{
findApplicationRegistrationStats?: (ApplicationRegistrationStatsGenqlSelection & { __args: {id: Scalars['String']} })
findApplicationRegistrationVariables?: (ApplicationRegistrationVariableGenqlSelection & { __args: {applicationRegistrationId: Scalars['String']} })
applicationRegistrationTarballUrl?: { __args: {id: Scalars['String']} }
+ getApplicationShareLink?: { __args: {id: Scalars['String']} }
currentUser?: UserGenqlSelection
currentWorkspace?: WorkspaceGenqlSelection
getPublicWorkspaceDataByDomain?: (PublicWorkspaceDataGenqlSelection & { __args?: {origin?: (Scalars['String'] | null)} })
@@ -6067,7 +5920,7 @@ export interface QueryGenqlSelection{
findManyPublicDomains?: PublicDomainGenqlSelection
getEmailingDomains?: EmailingDomainGenqlSelection
findManyMarketplaceApps?: MarketplaceAppGenqlSelection
- findOneMarketplaceApp?: (MarketplaceAppGenqlSelection & { __args: {universalIdentifier: Scalars['String']} })
+ findMarketplaceAppDetail?: (MarketplaceAppDetailGenqlSelection & { __args: {universalIdentifier: Scalars['String']} })
findManyApplications?: ApplicationGenqlSelection
findOneApplication?: (ApplicationGenqlSelection & { __args?: {id?: (Scalars['UUID'] | null), universalIdentifier?: (Scalars['UUID'] | null)} })
__typename?: boolean | number
@@ -6303,6 +6156,7 @@ export interface MutationGenqlSelection{
verifyEmailingDomain?: (EmailingDomainGenqlSelection & { __args: {id: Scalars['String']} })
createOneAppToken?: (AppTokenGenqlSelection & { __args: {input: CreateOneAppTokenInput} })
installMarketplaceApp?: { __args: {universalIdentifier: Scalars['String'], version?: (Scalars['String'] | null)} }
+ syncMarketplaceCatalog?: boolean | number
installApplication?: { __args: {appRegistrationId: Scalars['String'], version?: (Scalars['String'] | null)} }
runWorkspaceMigration?: { __args: {workspaceMigration: WorkspaceMigrationInput} }
uninstallApplication?: { __args: {universalIdentifier: Scalars['String']} }
@@ -6597,11 +6451,11 @@ export interface UpdateSkillInput {id: Scalars['UUID'],name?: (Scalars['String']
export interface GetAuthorizationUrlForSSOInput {identityProviderId: Scalars['UUID'],workspaceInviteHash?: (Scalars['String'] | null)}
-export interface CreateApplicationRegistrationInput {name: Scalars['String'],description?: (Scalars['String'] | null),logoUrl?: (Scalars['String'] | null),author?: (Scalars['String'] | null),universalIdentifier?: (Scalars['String'] | null),oAuthRedirectUris?: (Scalars['String'][] | null),oAuthScopes?: (Scalars['String'][] | null),websiteUrl?: (Scalars['String'] | null),termsUrl?: (Scalars['String'] | null)}
+export interface CreateApplicationRegistrationInput {name: Scalars['String'],universalIdentifier?: (Scalars['String'] | null),oAuthRedirectUris?: (Scalars['String'][] | null),oAuthScopes?: (Scalars['String'][] | null)}
export interface UpdateApplicationRegistrationInput {id: Scalars['String'],update: UpdateApplicationRegistrationPayload}
-export interface UpdateApplicationRegistrationPayload {name?: (Scalars['String'] | null),description?: (Scalars['String'] | null),logoUrl?: (Scalars['String'] | null),author?: (Scalars['String'] | null),oAuthRedirectUris?: (Scalars['String'][] | null),oAuthScopes?: (Scalars['String'][] | null),websiteUrl?: (Scalars['String'] | null),termsUrl?: (Scalars['String'] | null),isListed?: (Scalars['Boolean'] | null)}
+export interface UpdateApplicationRegistrationPayload {name?: (Scalars['String'] | null),oAuthRedirectUris?: (Scalars['String'][] | null),oAuthScopes?: (Scalars['String'][] | null),isListed?: (Scalars['Boolean'] | null)}
export interface CreateApplicationRegistrationVariableInput {applicationRegistrationId: Scalars['String'],key: Scalars['String'],value: Scalars['String'],description?: (Scalars['String'] | null),isSecret?: (Scalars['Boolean'] | null)}
@@ -8295,62 +8149,6 @@ export interface LogicFunctionLogsInput {applicationId?: (Scalars['UUID'] | null
- const MarketplaceAppField_possibleTypes: string[] = ['MarketplaceAppField']
- export const isMarketplaceAppField = (obj?: { __typename?: any } | null): obj is MarketplaceAppField => {
- if (!obj?.__typename) throw new Error('__typename is missing in "isMarketplaceAppField"')
- return MarketplaceAppField_possibleTypes.includes(obj.__typename)
- }
-
-
-
- const MarketplaceAppObject_possibleTypes: string[] = ['MarketplaceAppObject']
- export const isMarketplaceAppObject = (obj?: { __typename?: any } | null): obj is MarketplaceAppObject => {
- if (!obj?.__typename) throw new Error('__typename is missing in "isMarketplaceAppObject"')
- return MarketplaceAppObject_possibleTypes.includes(obj.__typename)
- }
-
-
-
- const MarketplaceAppLogicFunction_possibleTypes: string[] = ['MarketplaceAppLogicFunction']
- export const isMarketplaceAppLogicFunction = (obj?: { __typename?: any } | null): obj is MarketplaceAppLogicFunction => {
- if (!obj?.__typename) throw new Error('__typename is missing in "isMarketplaceAppLogicFunction"')
- return MarketplaceAppLogicFunction_possibleTypes.includes(obj.__typename)
- }
-
-
-
- const MarketplaceAppFrontComponent_possibleTypes: string[] = ['MarketplaceAppFrontComponent']
- export const isMarketplaceAppFrontComponent = (obj?: { __typename?: any } | null): obj is MarketplaceAppFrontComponent => {
- if (!obj?.__typename) throw new Error('__typename is missing in "isMarketplaceAppFrontComponent"')
- return MarketplaceAppFrontComponent_possibleTypes.includes(obj.__typename)
- }
-
-
-
- const MarketplaceAppRoleObjectPermission_possibleTypes: string[] = ['MarketplaceAppRoleObjectPermission']
- export const isMarketplaceAppRoleObjectPermission = (obj?: { __typename?: any } | null): obj is MarketplaceAppRoleObjectPermission => {
- if (!obj?.__typename) throw new Error('__typename is missing in "isMarketplaceAppRoleObjectPermission"')
- return MarketplaceAppRoleObjectPermission_possibleTypes.includes(obj.__typename)
- }
-
-
-
- const MarketplaceAppRoleFieldPermission_possibleTypes: string[] = ['MarketplaceAppRoleFieldPermission']
- export const isMarketplaceAppRoleFieldPermission = (obj?: { __typename?: any } | null): obj is MarketplaceAppRoleFieldPermission => {
- if (!obj?.__typename) throw new Error('__typename is missing in "isMarketplaceAppRoleFieldPermission"')
- return MarketplaceAppRoleFieldPermission_possibleTypes.includes(obj.__typename)
- }
-
-
-
- const MarketplaceAppDefaultRole_possibleTypes: string[] = ['MarketplaceAppDefaultRole']
- export const isMarketplaceAppDefaultRole = (obj?: { __typename?: any } | null): obj is MarketplaceAppDefaultRole => {
- if (!obj?.__typename) throw new Error('__typename is missing in "isMarketplaceAppDefaultRole"')
- return MarketplaceAppDefaultRole_possibleTypes.includes(obj.__typename)
- }
-
-
-
const MarketplaceApp_possibleTypes: string[] = ['MarketplaceApp']
export const isMarketplaceApp = (obj?: { __typename?: any } | null): obj is MarketplaceApp => {
if (!obj?.__typename) throw new Error('__typename is missing in "isMarketplaceApp"')
@@ -8359,6 +8157,14 @@ export interface LogicFunctionLogsInput {applicationId?: (Scalars['UUID'] | null
+ const MarketplaceAppDetail_possibleTypes: string[] = ['MarketplaceAppDetail']
+ export const isMarketplaceAppDetail = (obj?: { __typename?: any } | null): obj is MarketplaceAppDetail => {
+ if (!obj?.__typename) throw new Error('__typename is missing in "isMarketplaceAppDetail"')
+ return MarketplaceAppDetail_possibleTypes.includes(obj.__typename)
+ }
+
+
+
const PublicDomain_possibleTypes: string[] = ['PublicDomain']
export const isPublicDomain = (obj?: { __typename?: any } | null): obj is PublicDomain => {
if (!obj?.__typename) throw new Error('__typename is missing in "isPublicDomain"')
diff --git a/packages/twenty-client-sdk/src/metadata/generated/types.ts b/packages/twenty-client-sdk/src/metadata/generated/types.ts
index 577440f629..b444994fe5 100644
--- a/packages/twenty-client-sdk/src/metadata/generated/types.ts
+++ b/packages/twenty-client-sdk/src/metadata/generated/types.ts
@@ -63,34 +63,34 @@ export default {
211,
228,
245,
- 287,
- 288,
- 299,
- 300,
+ 281,
+ 282,
+ 293,
+ 294,
+ 319,
+ 320,
+ 321,
+ 322,
325,
326,
327,
328,
+ 329,
+ 330,
331,
- 332,
333,
- 334,
335,
- 336,
- 337,
- 339,
- 341,
+ 343,
349,
- 355,
- 356,
- 357,
- 359,
- 366,
- 373,
- 399,
- 483,
- 488,
- 489
+ 350,
+ 351,
+ 353,
+ 360,
+ 367,
+ 393,
+ 477,
+ 482,
+ 483
],
"types": {
"BillingProductDTO": {
@@ -185,15 +185,6 @@ export default {
"name": [
1
],
- "description": [
- 1
- ],
- "logoUrl": [
- 1
- ],
- "author": [
- 1
- ],
"oAuthClientId": [
1
],
@@ -215,12 +206,6 @@ export default {
"latestAvailableVersion": [
1
],
- "websiteUrl": [
- 1
- ],
- "termsUrl": [
- 1
- ],
"isListed": [
6
],
@@ -4789,164 +4774,6 @@ export default {
1
]
},
- "MarketplaceAppField": {
- "name": [
- 1
- ],
- "type": [
- 1
- ],
- "label": [
- 1
- ],
- "description": [
- 1
- ],
- "icon": [
- 1
- ],
- "objectUniversalIdentifier": [
- 1
- ],
- "universalIdentifier": [
- 1
- ],
- "__typename": [
- 1
- ]
- },
- "MarketplaceAppObject": {
- "universalIdentifier": [
- 1
- ],
- "nameSingular": [
- 1
- ],
- "namePlural": [
- 1
- ],
- "labelSingular": [
- 1
- ],
- "labelPlural": [
- 1
- ],
- "description": [
- 1
- ],
- "icon": [
- 1
- ],
- "fields": [
- 276
- ],
- "__typename": [
- 1
- ]
- },
- "MarketplaceAppLogicFunction": {
- "name": [
- 1
- ],
- "description": [
- 1
- ],
- "timeoutSeconds": [
- 21
- ],
- "__typename": [
- 1
- ]
- },
- "MarketplaceAppFrontComponent": {
- "name": [
- 1
- ],
- "description": [
- 1
- ],
- "__typename": [
- 1
- ]
- },
- "MarketplaceAppRoleObjectPermission": {
- "objectUniversalIdentifier": [
- 1
- ],
- "canReadObjectRecords": [
- 6
- ],
- "canUpdateObjectRecords": [
- 6
- ],
- "canSoftDeleteObjectRecords": [
- 6
- ],
- "canDestroyObjectRecords": [
- 6
- ],
- "__typename": [
- 1
- ]
- },
- "MarketplaceAppRoleFieldPermission": {
- "objectUniversalIdentifier": [
- 1
- ],
- "fieldUniversalIdentifier": [
- 1
- ],
- "canReadFieldValue": [
- 6
- ],
- "canUpdateFieldValue": [
- 6
- ],
- "__typename": [
- 1
- ]
- },
- "MarketplaceAppDefaultRole": {
- "id": [
- 1
- ],
- "label": [
- 1
- ],
- "description": [
- 1
- ],
- "canReadAllObjectRecords": [
- 6
- ],
- "canUpdateAllObjectRecords": [
- 6
- ],
- "canSoftDeleteAllObjectRecords": [
- 6
- ],
- "canDestroyAllObjectRecords": [
- 6
- ],
- "canUpdateAllSettings": [
- 6
- ],
- "canAccessAllTools": [
- 6
- ],
- "objectPermissions": [
- 280
- ],
- "fieldPermissions": [
- 281
- ],
- "permissionFlags": [
- 1
- ],
- "__typename": [
- 1
- ]
- },
"MarketplaceApp": {
"id": [
1
@@ -4960,9 +4787,6 @@ export default {
"icon": [
1
],
- "version": [
- 1
- ],
"author": [
1
],
@@ -4972,36 +4796,6 @@ export default {
"logo": [
1
],
- "screenshots": [
- 1
- ],
- "aboutDescription": [
- 1
- ],
- "providers": [
- 1
- ],
- "websiteUrl": [
- 1
- ],
- "termsUrl": [
- 1
- ],
- "objects": [
- 277
- ],
- "fields": [
- 276
- ],
- "logicFunctions": [
- 278
- ],
- "frontComponents": [
- 279
- ],
- "defaultRole": [
- 282
- ],
"sourcePackage": [
1
],
@@ -5012,6 +4806,38 @@ export default {
1
]
},
+ "MarketplaceAppDetail": {
+ "universalIdentifier": [
+ 1
+ ],
+ "id": [
+ 1
+ ],
+ "name": [
+ 1
+ ],
+ "sourceType": [
+ 8
+ ],
+ "sourcePackage": [
+ 1
+ ],
+ "latestAvailableVersion": [
+ 1
+ ],
+ "isListed": [
+ 6
+ ],
+ "isFeatured": [
+ 6
+ ],
+ "manifest": [
+ 15
+ ],
+ "__typename": [
+ 1
+ ]
+ },
"PublicDomain": {
"id": [
3
@@ -5060,13 +4886,13 @@ export default {
1
],
"driver": [
- 287
+ 281
],
"status": [
- 288
+ 282
],
"verificationRecords": [
- 285
+ 279
],
"verifiedAt": [
4
@@ -5113,7 +4939,7 @@ export default {
1
],
"location": [
- 290
+ 284
],
"__typename": [
1
@@ -5141,13 +4967,13 @@ export default {
},
"ImapSmtpCaldavConnectionParameters": {
"IMAP": [
- 292
+ 286
],
"SMTP": [
- 292
+ 286
],
"CALDAV": [
- 292
+ 286
],
"__typename": [
1
@@ -5167,7 +4993,7 @@ export default {
3
],
"connectionParameters": [
- 293
+ 287
],
"__typename": [
1
@@ -5259,10 +5085,10 @@ export default {
3
],
"frontComponent": [
- 297
+ 291
],
"engineComponentKey": [
- 299
+ 293
],
"label": [
1
@@ -5280,7 +5106,7 @@ export default {
6
],
"availabilityType": [
- 300
+ 294
],
"hotKeys": [
1
@@ -5439,7 +5265,7 @@ export default {
1
],
"series": [
- 304
+ 298
],
"xAxisLabel": [
1
@@ -5488,7 +5314,7 @@ export default {
1
],
"data": [
- 306
+ 300
],
"__typename": [
1
@@ -5496,7 +5322,7 @@ export default {
},
"LineChartData": {
"series": [
- 307
+ 301
],
"xAxisLabel": [
1
@@ -5533,7 +5359,7 @@ export default {
},
"PieChartData": {
"data": [
- 309
+ 303
],
"showLegend": [
6
@@ -5616,13 +5442,13 @@ export default {
},
"EventLogQueryResult": {
"records": [
- 312
+ 306
],
"totalCount": [
21
],
"pageInfo": [
- 313
+ 307
],
"__typename": [
1
@@ -5718,7 +5544,7 @@ export default {
1
],
"parts": [
- 302
+ 296
],
"createdAt": [
4
@@ -5743,7 +5569,7 @@ export default {
},
"AISystemPromptPreview": {
"sections": [
- 318
+ 312
],
"estimatedTokenCount": [
21
@@ -5754,7 +5580,7 @@ export default {
},
"AgentChatThreadEdge": {
"node": [
- 316
+ 310
],
"cursor": [
40
@@ -5768,7 +5594,7 @@ export default {
232
],
"edges": [
- 320
+ 314
],
"__typename": [
1
@@ -5805,10 +5631,10 @@ export default {
3
],
"evaluations": [
- 322
+ 316
],
"messages": [
- 317
+ 311
],
"createdAt": [
4
@@ -5825,19 +5651,19 @@ export default {
1
],
"syncStatus": [
- 325
+ 319
],
"syncStage": [
- 326
+ 320
],
"visibility": [
- 327
+ 321
],
"isContactAutoCreationEnabled": [
6
],
"contactAutoCreationPolicy": [
- 328
+ 322
],
"isSyncEnabled": [
6
@@ -5911,22 +5737,22 @@ export default {
3
],
"visibility": [
- 331
+ 325
],
"handle": [
1
],
"type": [
- 332
+ 326
],
"isContactAutoCreationEnabled": [
6
],
"contactAutoCreationPolicy": [
- 333
+ 327
],
"messageFolderImportPolicy": [
- 334
+ 328
],
"excludeNonProfessionalEmails": [
6
@@ -5935,7 +5761,7 @@ export default {
6
],
"pendingGroupEmailsAction": [
- 335
+ 329
],
"isSyncEnabled": [
6
@@ -5944,10 +5770,10 @@ export default {
4
],
"syncStatus": [
- 336
+ 330
],
"syncStage": [
- 337
+ 331
],
"syncStageStartedAt": [
4
@@ -5998,7 +5824,7 @@ export default {
1
],
"pendingSyncAction": [
- 339
+ 333
],
"messageChannelId": [
3
@@ -6016,7 +5842,7 @@ export default {
"MessageFolderPendingSyncAction": {},
"CollectionHash": {
"collectionName": [
- 341
+ 335
],
"hash": [
1
@@ -6083,13 +5909,13 @@ export default {
},
"MinimalMetadata": {
"objectMetadataItems": [
- 342
+ 336
],
"views": [
- 343
+ 337
],
"collectionHashes": [
- 340
+ 334
],
"__typename": [
1
@@ -6237,7 +6063,7 @@ export default {
2,
{
"input": [
- 347,
+ 341,
"GetApiKeyInput!"
]
}
@@ -6341,7 +6167,7 @@ export default {
32,
{
"input": [
- 348,
+ 342,
"LogicFunctionIdInput!"
]
}
@@ -6353,7 +6179,7 @@ export default {
15,
{
"input": [
- 348,
+ 342,
"LogicFunctionIdInput!"
]
}
@@ -6362,16 +6188,16 @@ export default {
1,
{
"input": [
- 348,
+ 342,
"LogicFunctionIdInput!"
]
}
],
"commandMenuItems": [
- 298
+ 292
],
"commandMenuItem": [
- 298,
+ 292,
{
"id": [
3,
@@ -6380,10 +6206,10 @@ export default {
}
],
"frontComponents": [
- 297
+ 291
],
"frontComponent": [
- 297,
+ 291,
{
"id": [
3,
@@ -6463,7 +6289,7 @@ export default {
25,
{
"input": [
- 350,
+ 344,
"AgentIdInput!"
]
}
@@ -6472,7 +6298,7 @@ export default {
29
],
"getToolIndex": [
- 301
+ 295
],
"getToolInputSchema": [
15,
@@ -6523,7 +6349,7 @@ export default {
}
],
"myMessageFolders": [
- 338,
+ 332,
{
"messageChannelId": [
3
@@ -6531,20 +6357,6 @@ export default {
}
],
"myMessageChannels": [
- 330,
- {
- "connectedAccountId": [
- 3
- ]
- }
- ],
- "myConnectedAccounts": [
- 329
- ],
- "connectedAccounts": [
- 329
- ],
- "myCalendarChannels": [
324,
{
"connectedAccountId": [
@@ -6552,11 +6364,25 @@ export default {
]
}
],
+ "myConnectedAccounts": [
+ 323
+ ],
+ "connectedAccounts": [
+ 323
+ ],
+ "myCalendarChannels": [
+ 318,
+ {
+ "connectedAccountId": [
+ 3
+ ]
+ }
+ ],
"webhooks": [
- 345
+ 339
],
"webhook": [
- 345,
+ 339,
{
"id": [
3,
@@ -6565,10 +6391,10 @@ export default {
}
],
"minimalMetadata": [
- 344
+ 338
],
"chatThread": [
- 316,
+ 310,
{
"id": [
3,
@@ -6577,7 +6403,7 @@ export default {
}
],
"chatMessages": [
- 317,
+ 311,
{
"threadId": [
3,
@@ -6586,13 +6412,13 @@ export default {
}
],
"getAISystemPromptPreview": [
- 319
+ 313
],
"skills": [
- 315
+ 309
],
"skill": [
- 315,
+ 309,
{
"id": [
3,
@@ -6601,24 +6427,24 @@ export default {
}
],
"chatThreads": [
- 321,
+ 315,
{
"paging": [
39,
"CursorPaging!"
],
"filter": [
- 351,
+ 345,
"AgentChatThreadFilter!"
],
"sorting": [
- 354,
+ 348,
"[AgentChatThreadSort!]!"
]
}
],
"agentTurns": [
- 323,
+ 317,
{
"agentId": [
3,
@@ -6627,37 +6453,37 @@ export default {
}
],
"eventLogs": [
- 314,
+ 308,
{
"input": [
- 358,
+ 352,
"EventLogQueryInput!"
]
}
],
"pieChartData": [
- 310,
+ 304,
{
"input": [
- 362,
+ 356,
"PieChartDataInput!"
]
}
],
"lineChartData": [
- 308,
+ 302,
{
"input": [
- 363,
+ 357,
"LineChartDataInput!"
]
}
],
"barChartData": [
- 305,
+ 299,
{
"input": [
- 364,
+ 358,
"BarChartDataInput!"
]
}
@@ -6758,6 +6584,15 @@ export default {
]
}
],
+ "getApplicationShareLink": [
+ 1,
+ {
+ "id": [
+ 1,
+ "String!"
+ ]
+ }
+ ],
"currentUser": [
69
],
@@ -6776,7 +6611,7 @@ export default {
221
],
"getConnectedImapSmtpCaldavAccount": [
- 294,
+ 288,
{
"id": [
3,
@@ -6785,7 +6620,7 @@ export default {
}
],
"getAutoCompleteAddress": [
- 289,
+ 283,
{
"address": [
1,
@@ -6804,7 +6639,7 @@ export default {
}
],
"getAddressDetails": [
- 291,
+ 285,
{
"placeId": [
1,
@@ -6910,24 +6745,24 @@ export default {
271,
{
"input": [
- 365
+ 359
]
}
],
"getPostgresCredentials": [
- 296
+ 290
],
"findManyPublicDomains": [
- 284
+ 278
],
"getEmailingDomains": [
- 286
+ 280
],
"findManyMarketplaceApps": [
- 283
+ 276
],
- "findOneMarketplaceApp": [
- 283,
+ "findMarketplaceAppDetail": [
+ 277,
{
"universalIdentifier": [
1,
@@ -6963,7 +6798,7 @@ export default {
},
"LogicFunctionIdInput": {
"id": [
- 349
+ 343
],
"__typename": [
1
@@ -6980,16 +6815,16 @@ export default {
},
"AgentChatThreadFilter": {
"and": [
- 351
+ 345
],
"or": [
- 351
+ 345
],
"id": [
42
],
"updatedAt": [
- 352
+ 346
],
"__typename": [
1
@@ -7027,10 +6862,10 @@ export default {
4
],
"between": [
- 353
+ 347
],
"notBetween": [
- 353
+ 347
],
"__typename": [
1
@@ -7049,13 +6884,13 @@ export default {
},
"AgentChatThreadSort": {
"field": [
- 355
+ 349
],
"direction": [
- 356
+ 350
],
"nulls": [
- 357
+ 351
],
"__typename": [
1
@@ -7066,10 +6901,10 @@ export default {
"SortNulls": {},
"EventLogQueryInput": {
"table": [
- 359
+ 353
],
"filters": [
- 360
+ 354
],
"first": [
21
@@ -7090,7 +6925,7 @@ export default {
1
],
"dateRange": [
- 361
+ 355
],
"recordId": [
1
@@ -7157,7 +6992,7 @@ export default {
1
],
"operationTypes": [
- 366
+ 360
],
"__typename": [
1
@@ -7169,7 +7004,7 @@ export default {
6,
{
"input": [
- 368,
+ 362,
"AddQuerySubscriptionInput!"
]
}
@@ -7178,7 +7013,7 @@ export default {
6,
{
"input": [
- 369,
+ 363,
"RemoveQueryFromEventStreamInput!"
]
}
@@ -7187,7 +7022,7 @@ export default {
145,
{
"inputs": [
- 370,
+ 364,
"[CreateNavigationMenuItemInput!]!"
]
}
@@ -7196,7 +7031,7 @@ export default {
145,
{
"input": [
- 370,
+ 364,
"CreateNavigationMenuItemInput!"
]
}
@@ -7205,7 +7040,7 @@ export default {
145,
{
"inputs": [
- 371,
+ 365,
"[UpdateOneNavigationMenuItemInput!]!"
]
}
@@ -7214,7 +7049,7 @@ export default {
145,
{
"input": [
- 371,
+ 365,
"UpdateOneNavigationMenuItemInput!"
]
}
@@ -7241,7 +7076,7 @@ export default {
141,
{
"file": [
- 373,
+ 367,
"Upload!"
]
}
@@ -7250,7 +7085,7 @@ export default {
141,
{
"file": [
- 373,
+ 367,
"Upload!"
]
}
@@ -7259,7 +7094,7 @@ export default {
141,
{
"file": [
- 373,
+ 367,
"Upload!"
]
}
@@ -7268,7 +7103,7 @@ export default {
141,
{
"file": [
- 373,
+ 367,
"Upload!"
]
}
@@ -7277,7 +7112,7 @@ export default {
141,
{
"file": [
- 373,
+ 367,
"Upload!"
],
"fieldMetadataId": [
@@ -7290,7 +7125,7 @@ export default {
141,
{
"file": [
- 373,
+ 367,
"Upload!"
],
"fieldMetadataUniversalIdentifier": [
@@ -7303,7 +7138,7 @@ export default {
52,
{
"input": [
- 374,
+ 368,
"CreateViewFilterGroupInput!"
]
}
@@ -7316,7 +7151,7 @@ export default {
"String!"
],
"input": [
- 375,
+ 369,
"UpdateViewFilterGroupInput!"
]
}
@@ -7343,7 +7178,7 @@ export default {
54,
{
"input": [
- 376,
+ 370,
"CreateViewFilterInput!"
]
}
@@ -7352,7 +7187,7 @@ export default {
54,
{
"input": [
- 377,
+ 371,
"UpdateViewFilterInput!"
]
}
@@ -7361,7 +7196,7 @@ export default {
54,
{
"input": [
- 379,
+ 373,
"DeleteViewFilterInput!"
]
}
@@ -7370,7 +7205,7 @@ export default {
54,
{
"input": [
- 380,
+ 374,
"DestroyViewFilterInput!"
]
}
@@ -7379,7 +7214,7 @@ export default {
60,
{
"input": [
- 381,
+ 375,
"CreateViewInput!"
]
}
@@ -7392,7 +7227,7 @@ export default {
"String!"
],
"input": [
- 382,
+ 376,
"UpdateViewInput!"
]
}
@@ -7419,7 +7254,7 @@ export default {
57,
{
"input": [
- 383,
+ 377,
"CreateViewSortInput!"
]
}
@@ -7428,7 +7263,7 @@ export default {
57,
{
"input": [
- 384,
+ 378,
"UpdateViewSortInput!"
]
}
@@ -7437,7 +7272,7 @@ export default {
6,
{
"input": [
- 386,
+ 380,
"DeleteViewSortInput!"
]
}
@@ -7446,7 +7281,7 @@ export default {
6,
{
"input": [
- 387,
+ 381,
"DestroyViewSortInput!"
]
}
@@ -7455,7 +7290,7 @@ export default {
59,
{
"input": [
- 388,
+ 382,
"UpdateViewFieldGroupInput!"
]
}
@@ -7464,7 +7299,7 @@ export default {
59,
{
"input": [
- 390,
+ 384,
"CreateViewFieldGroupInput!"
]
}
@@ -7473,7 +7308,7 @@ export default {
59,
{
"inputs": [
- 390,
+ 384,
"[CreateViewFieldGroupInput!]!"
]
}
@@ -7482,7 +7317,7 @@ export default {
59,
{
"input": [
- 391,
+ 385,
"DeleteViewFieldGroupInput!"
]
}
@@ -7491,7 +7326,7 @@ export default {
59,
{
"input": [
- 392,
+ 386,
"DestroyViewFieldGroupInput!"
]
}
@@ -7500,7 +7335,7 @@ export default {
60,
{
"input": [
- 393,
+ 387,
"UpsertFieldsWidgetInput!"
]
}
@@ -7509,7 +7344,7 @@ export default {
2,
{
"input": [
- 396,
+ 390,
"CreateApiKeyInput!"
]
}
@@ -7518,7 +7353,7 @@ export default {
2,
{
"input": [
- 397,
+ 391,
"UpdateApiKeyInput!"
]
}
@@ -7527,7 +7362,7 @@ export default {
2,
{
"input": [
- 398,
+ 392,
"RevokeApiKeyInput!"
]
}
@@ -7569,7 +7404,7 @@ export default {
115,
{
"type": [
- 399,
+ 393,
"AnalyticsType!"
],
"name": [
@@ -7682,7 +7517,7 @@ export default {
140,
{
"input": [
- 400,
+ 394,
"CreateApprovedAccessDomainInput!"
]
}
@@ -7691,7 +7526,7 @@ export default {
6,
{
"input": [
- 401,
+ 395,
"DeleteApprovedAccessDomainInput!"
]
}
@@ -7700,7 +7535,7 @@ export default {
140,
{
"input": [
- 402,
+ 396,
"ValidateApprovedAccessDomainInput!"
]
}
@@ -7709,7 +7544,7 @@ export default {
112,
{
"input": [
- 403,
+ 397,
"CreatePageLayoutTabInput!"
]
}
@@ -7722,7 +7557,7 @@ export default {
"String!"
],
"input": [
- 404,
+ 398,
"UpdatePageLayoutTabInput!"
]
}
@@ -7740,7 +7575,7 @@ export default {
113,
{
"input": [
- 405,
+ 399,
"CreatePageLayoutInput!"
]
}
@@ -7753,7 +7588,7 @@ export default {
"String!"
],
"input": [
- 406,
+ 400,
"UpdatePageLayoutInput!"
]
}
@@ -7775,7 +7610,7 @@ export default {
"String!"
],
"input": [
- 407,
+ 401,
"UpdatePageLayoutWithTabsInput!"
]
}
@@ -7784,7 +7619,7 @@ export default {
75,
{
"input": [
- 411,
+ 405,
"CreatePageLayoutWidgetInput!"
]
}
@@ -7797,7 +7632,7 @@ export default {
"String!"
],
"input": [
- 412,
+ 406,
"UpdatePageLayoutWidgetInput!"
]
}
@@ -7815,7 +7650,7 @@ export default {
32,
{
"input": [
- 348,
+ 342,
"LogicFunctionIdInput!"
]
}
@@ -7824,7 +7659,7 @@ export default {
32,
{
"input": [
- 413,
+ 407,
"CreateLogicFunctionFromSourceInput!"
]
}
@@ -7833,7 +7668,7 @@ export default {
154,
{
"input": [
- 414,
+ 408,
"ExecuteOneLogicFunctionInput!"
]
}
@@ -7842,31 +7677,31 @@ export default {
6,
{
"input": [
- 415,
+ 409,
"UpdateLogicFunctionFromSourceInput!"
]
}
],
"createCommandMenuItem": [
- 298,
+ 292,
{
"input": [
- 417,
+ 411,
"CreateCommandMenuItemInput!"
]
}
],
"updateCommandMenuItem": [
- 298,
+ 292,
{
"input": [
- 418,
+ 412,
"UpdateCommandMenuItemInput!"
]
}
],
"deleteCommandMenuItem": [
- 298,
+ 292,
{
"id": [
3,
@@ -7875,25 +7710,25 @@ export default {
}
],
"createFrontComponent": [
- 297,
+ 291,
{
"input": [
- 419,
+ 413,
"CreateFrontComponentInput!"
]
}
],
"updateFrontComponent": [
- 297,
+ 291,
{
"input": [
- 420,
+ 414,
"UpdateFrontComponentInput!"
]
}
],
"deleteFrontComponent": [
- 297,
+ 291,
{
"id": [
3,
@@ -7905,7 +7740,7 @@ export default {
46,
{
"input": [
- 422,
+ 416,
"CreateOneObjectInput!"
]
}
@@ -7914,7 +7749,7 @@ export default {
46,
{
"input": [
- 424,
+ 418,
"DeleteOneObjectInput!"
]
}
@@ -7923,7 +7758,7 @@ export default {
46,
{
"input": [
- 425,
+ 419,
"UpdateOneObjectInput!"
]
}
@@ -7932,7 +7767,7 @@ export default {
50,
{
"input": [
- 427,
+ 421,
"UpdateViewFieldInput!"
]
}
@@ -7941,7 +7776,7 @@ export default {
50,
{
"input": [
- 429,
+ 423,
"CreateViewFieldInput!"
]
}
@@ -7950,7 +7785,7 @@ export default {
50,
{
"inputs": [
- 429,
+ 423,
"[CreateViewFieldInput!]!"
]
}
@@ -7959,7 +7794,7 @@ export default {
50,
{
"input": [
- 430,
+ 424,
"DeleteViewFieldInput!"
]
}
@@ -7968,7 +7803,7 @@ export default {
50,
{
"input": [
- 431,
+ 425,
"DestroyViewFieldInput!"
]
}
@@ -7977,7 +7812,7 @@ export default {
25,
{
"input": [
- 432,
+ 426,
"CreateAgentInput!"
]
}
@@ -7986,7 +7821,7 @@ export default {
25,
{
"input": [
- 433,
+ 427,
"UpdateAgentInput!"
]
}
@@ -7995,7 +7830,7 @@ export default {
25,
{
"input": [
- 350,
+ 344,
"AgentIdInput!"
]
}
@@ -8017,7 +7852,7 @@ export default {
29,
{
"createRoleInput": [
- 434,
+ 428,
"CreateRoleInput!"
]
}
@@ -8026,7 +7861,7 @@ export default {
29,
{
"updateRoleInput": [
- 435,
+ 429,
"UpdateRoleInput!"
]
}
@@ -8044,7 +7879,7 @@ export default {
16,
{
"upsertObjectPermissionsInput": [
- 437,
+ 431,
"UpsertObjectPermissionsInput!"
]
}
@@ -8053,7 +7888,7 @@ export default {
27,
{
"upsertPermissionFlagsInput": [
- 439,
+ 433,
"UpsertPermissionFlagsInput!"
]
}
@@ -8062,7 +7897,7 @@ export default {
26,
{
"upsertFieldPermissionsInput": [
- 440,
+ 434,
"UpsertFieldPermissionsInput!"
]
}
@@ -8071,7 +7906,7 @@ export default {
243,
{
"input": [
- 442,
+ 436,
"UpsertRowLevelPermissionPredicatesInput!"
]
}
@@ -8102,7 +7937,7 @@ export default {
34,
{
"input": [
- 445,
+ 439,
"CreateOneFieldMetadataInput!"
]
}
@@ -8111,7 +7946,7 @@ export default {
34,
{
"input": [
- 447,
+ 441,
"UpdateOneFieldMetadataInput!"
]
}
@@ -8120,7 +7955,7 @@ export default {
34,
{
"input": [
- 449,
+ 443,
"DeleteOneFieldInput!"
]
}
@@ -8129,7 +7964,7 @@ export default {
56,
{
"input": [
- 450,
+ 444,
"CreateViewGroupInput!"
]
}
@@ -8138,7 +7973,7 @@ export default {
56,
{
"inputs": [
- 450,
+ 444,
"[CreateViewGroupInput!]!"
]
}
@@ -8147,7 +7982,7 @@ export default {
56,
{
"input": [
- 451,
+ 445,
"UpdateViewGroupInput!"
]
}
@@ -8156,7 +7991,7 @@ export default {
56,
{
"inputs": [
- 451,
+ 445,
"[UpdateViewGroupInput!]!"
]
}
@@ -8165,7 +8000,7 @@ export default {
56,
{
"input": [
- 453,
+ 447,
"DeleteViewGroupInput!"
]
}
@@ -8174,40 +8009,40 @@ export default {
56,
{
"input": [
- 454,
+ 448,
"DestroyViewGroupInput!"
]
}
],
"updateMessageFolder": [
- 338,
+ 332,
{
"input": [
- 455,
+ 449,
"UpdateMessageFolderInput!"
]
}
],
"updateMessageFolders": [
- 338,
+ 332,
{
"input": [
- 457,
+ 451,
"UpdateMessageFoldersInput!"
]
}
],
"updateMessageChannel": [
- 330,
+ 324,
{
"input": [
- 458,
+ 452,
"UpdateMessageChannelInput!"
]
}
],
"deleteConnectedAccount": [
- 329,
+ 323,
{
"id": [
3,
@@ -8216,34 +8051,34 @@ export default {
}
],
"updateCalendarChannel": [
- 324,
+ 318,
{
"input": [
- 460,
+ 454,
"UpdateCalendarChannelInput!"
]
}
],
"createWebhook": [
- 345,
+ 339,
{
"input": [
- 462,
+ 456,
"CreateWebhookInput!"
]
}
],
"updateWebhook": [
- 345,
+ 339,
{
"input": [
- 463,
+ 457,
"UpdateWebhookInput!"
]
}
],
"deleteWebhook": [
- 345,
+ 339,
{
"id": [
3,
@@ -8252,28 +8087,28 @@ export default {
}
],
"createChatThread": [
- 316
+ 310
],
"createSkill": [
- 315,
+ 309,
{
"input": [
- 465,
+ 459,
"CreateSkillInput!"
]
}
],
"updateSkill": [
- 315,
+ 309,
{
"input": [
- 466,
+ 460,
"UpdateSkillInput!"
]
}
],
"deleteSkill": [
- 315,
+ 309,
{
"id": [
3,
@@ -8282,7 +8117,7 @@ export default {
}
],
"activateSkill": [
- 315,
+ 309,
{
"id": [
3,
@@ -8291,7 +8126,7 @@ export default {
}
],
"deactivateSkill": [
- 315,
+ 309,
{
"id": [
3,
@@ -8300,7 +8135,7 @@ export default {
}
],
"evaluateAgentTurn": [
- 322,
+ 316,
{
"turnId": [
3,
@@ -8309,7 +8144,7 @@ export default {
}
],
"runEvaluationInput": [
- 323,
+ 317,
{
"agentId": [
3,
@@ -8322,7 +8157,7 @@ export default {
}
],
"duplicateDashboard": [
- 311,
+ 305,
{
"id": [
3,
@@ -8334,7 +8169,7 @@ export default {
256,
{
"input": [
- 467,
+ 461,
"GetAuthorizationUrlForSSOInput!"
]
}
@@ -8588,7 +8423,7 @@ export default {
214,
{
"input": [
- 468,
+ 462,
"CreateApplicationRegistrationInput!"
]
}
@@ -8597,7 +8432,7 @@ export default {
7,
{
"input": [
- 469,
+ 463,
"UpdateApplicationRegistrationInput!"
]
}
@@ -8624,7 +8459,7 @@ export default {
5,
{
"input": [
- 471,
+ 465,
"CreateApplicationRegistrationVariableInput!"
]
}
@@ -8633,7 +8468,7 @@ export default {
5,
{
"input": [
- 472,
+ 466,
"UpdateApplicationRegistrationVariableInput!"
]
}
@@ -8651,7 +8486,7 @@ export default {
7,
{
"file": [
- 373,
+ 367,
"Upload!"
],
"universalIdentifier": [
@@ -8747,7 +8582,7 @@ export default {
66,
{
"data": [
- 474,
+ 468,
"ActivateWorkspaceInput!"
]
}
@@ -8756,7 +8591,7 @@ export default {
66,
{
"data": [
- 475,
+ 469,
"UpdateWorkspaceInput!"
]
}
@@ -8771,7 +8606,7 @@ export default {
222,
{
"input": [
- 476,
+ 470,
"SetupOIDCSsoInput!"
]
}
@@ -8780,7 +8615,7 @@ export default {
222,
{
"input": [
- 477,
+ 471,
"SetupSAMLSsoInput!"
]
}
@@ -8789,7 +8624,7 @@ export default {
218,
{
"input": [
- 478,
+ 472,
"DeleteSsoInput!"
]
}
@@ -8798,7 +8633,7 @@ export default {
219,
{
"input": [
- 479,
+ 473,
"EditSsoInput!"
]
}
@@ -8817,7 +8652,7 @@ export default {
}
],
"startChannelSync": [
- 303,
+ 297,
{
"connectedAccountId": [
3,
@@ -8826,7 +8661,7 @@ export default {
}
],
"saveImapSmtpCaldavAccount": [
- 295,
+ 289,
{
"accountOwnerId": [
3,
@@ -8837,7 +8672,7 @@ export default {
"String!"
],
"connectionParameters": [
- 480,
+ 474,
"EmailAccountConnectionParameters!"
],
"id": [
@@ -8849,7 +8684,7 @@ export default {
198,
{
"input": [
- 482,
+ 476,
"UpdateLabPublicFeatureFlagInput!"
]
}
@@ -8910,7 +8745,7 @@ export default {
6,
{
"role": [
- 483,
+ 477,
"AiModelRole!"
],
"modelId": [
@@ -9029,13 +8864,13 @@ export default {
}
],
"enablePostgresProxy": [
- 296
+ 290
],
"disablePostgresProxy": [
- 296
+ 290
],
"createPublicDomain": [
- 284,
+ 278,
{
"domain": [
1,
@@ -9062,14 +8897,14 @@ export default {
}
],
"createEmailingDomain": [
- 286,
+ 280,
{
"domain": [
1,
"String!"
],
"driver": [
- 287,
+ 281,
"EmailingDomainDriver!"
]
}
@@ -9084,7 +8919,7 @@ export default {
}
],
"verifyEmailingDomain": [
- 286,
+ 280,
{
"id": [
1,
@@ -9096,7 +8931,7 @@ export default {
68,
{
"input": [
- 484,
+ 478,
"CreateOneAppTokenInput!"
]
}
@@ -9113,6 +8948,9 @@ export default {
]
}
],
+ "syncMarketplaceCatalog": [
+ 6
+ ],
"installApplication": [
6,
{
@@ -9129,7 +8967,7 @@ export default {
6,
{
"workspaceMigration": [
- 486,
+ 480,
"WorkspaceMigrationInput!"
]
}
@@ -9195,7 +9033,7 @@ export default {
275,
{
"file": [
- 373,
+ 367,
"Upload!"
],
"applicationUniversalIdentifier": [
@@ -9203,7 +9041,7 @@ export default {
"String!"
],
"fileFolder": [
- 489,
+ 483,
"FileFolder!"
],
"filePath": [
@@ -9309,7 +9147,7 @@ export default {
3
],
"update": [
- 372
+ 366
],
"__typename": [
1
@@ -9413,7 +9251,7 @@ export default {
3
],
"update": [
- 378
+ 372
],
"__typename": [
1
@@ -9586,7 +9424,7 @@ export default {
3
],
"update": [
- 385
+ 379
],
"__typename": [
1
@@ -9621,7 +9459,7 @@ export default {
3
],
"update": [
- 389
+ 383
],
"__typename": [
1
@@ -9685,10 +9523,10 @@ export default {
3
],
"groups": [
- 394
+ 388
],
"fields": [
- 395
+ 389
],
"__typename": [
1
@@ -9708,7 +9546,7 @@ export default {
6
],
"fields": [
- 395
+ 389
],
"__typename": [
1
@@ -9874,7 +9712,7 @@ export default {
3
],
"tabs": [
- 408
+ 402
],
"__typename": [
1
@@ -9897,7 +9735,7 @@ export default {
79
],
"widgets": [
- 409
+ 403
],
"__typename": [
1
@@ -9920,7 +9758,7 @@ export default {
3
],
"gridPosition": [
- 410
+ 404
],
"position": [
15
@@ -9966,7 +9804,7 @@ export default {
3
],
"gridPosition": [
- 410
+ 404
],
"position": [
15
@@ -9989,7 +9827,7 @@ export default {
3
],
"gridPosition": [
- 410
+ 404
],
"position": [
15
@@ -10058,7 +9896,7 @@ export default {
3
],
"update": [
- 416
+ 410
],
"__typename": [
1
@@ -10110,7 +9948,7 @@ export default {
3
],
"engineComponentKey": [
- 299
+ 293
],
"label": [
1
@@ -10128,7 +9966,7 @@ export default {
6
],
"availabilityType": [
- 300
+ 294
],
"hotKeys": [
1
@@ -10163,13 +10001,13 @@ export default {
6
],
"availabilityType": [
- 300
+ 294
],
"availabilityObjectMetadataId": [
3
],
"engineComponentKey": [
- 299
+ 293
],
"hotKeys": [
1
@@ -10209,7 +10047,7 @@ export default {
3
],
"update": [
- 421
+ 415
],
"__typename": [
1
@@ -10228,7 +10066,7 @@ export default {
},
"CreateOneObjectInput": {
"object": [
- 423
+ 417
],
"__typename": [
1
@@ -10288,7 +10126,7 @@ export default {
},
"UpdateOneObjectInput": {
"update": [
- 426
+ 420
],
"id": [
3
@@ -10346,7 +10184,7 @@ export default {
3
],
"update": [
- 428
+ 422
],
"__typename": [
1
@@ -10536,7 +10374,7 @@ export default {
},
"UpdateRoleInput": {
"update": [
- 436
+ 430
],
"id": [
3
@@ -10591,7 +10429,7 @@ export default {
3
],
"objectPermissions": [
- 438
+ 432
],
"__typename": [
1
@@ -10633,7 +10471,7 @@ export default {
3
],
"fieldPermissions": [
- 441
+ 435
],
"__typename": [
1
@@ -10664,10 +10502,10 @@ export default {
3
],
"predicates": [
- 443
+ 437
],
"predicateGroups": [
- 444
+ 438
],
"__typename": [
1
@@ -10727,7 +10565,7 @@ export default {
},
"CreateOneFieldMetadataInput": {
"field": [
- 446
+ 440
],
"__typename": [
1
@@ -10800,7 +10638,7 @@ export default {
3
],
"update": [
- 448
+ 442
],
"__typename": [
1
@@ -10892,7 +10730,7 @@ export default {
3
],
"update": [
- 452
+ 446
],
"__typename": [
1
@@ -10936,7 +10774,7 @@ export default {
3
],
"update": [
- 456
+ 450
],
"__typename": [
1
@@ -10955,7 +10793,7 @@ export default {
3
],
"update": [
- 456
+ 450
],
"__typename": [
1
@@ -10966,7 +10804,7 @@ export default {
3
],
"update": [
- 459
+ 453
],
"__typename": [
1
@@ -10974,16 +10812,16 @@ export default {
},
"UpdateMessageChannelInputUpdates": {
"visibility": [
- 331
+ 325
],
"isContactAutoCreationEnabled": [
6
],
"contactAutoCreationPolicy": [
- 333
+ 327
],
"messageFolderImportPolicy": [
- 334
+ 328
],
"isSyncEnabled": [
6
@@ -11003,7 +10841,7 @@ export default {
3
],
"update": [
- 461
+ 455
],
"__typename": [
1
@@ -11011,13 +10849,13 @@ export default {
},
"UpdateCalendarChannelInputUpdates": {
"visibility": [
- 327
+ 321
],
"isContactAutoCreationEnabled": [
6
],
"contactAutoCreationPolicy": [
- 328
+ 322
],
"isSyncEnabled": [
6
@@ -11051,7 +10889,7 @@ export default {
3
],
"update": [
- 464
+ 458
],
"__typename": [
1
@@ -11138,15 +10976,6 @@ export default {
"name": [
1
],
- "description": [
- 1
- ],
- "logoUrl": [
- 1
- ],
- "author": [
- 1
- ],
"universalIdentifier": [
1
],
@@ -11156,12 +10985,6 @@ export default {
"oAuthScopes": [
1
],
- "websiteUrl": [
- 1
- ],
- "termsUrl": [
- 1
- ],
"__typename": [
1
]
@@ -11171,7 +10994,7 @@ export default {
1
],
"update": [
- 470
+ 464
],
"__typename": [
1
@@ -11181,27 +11004,12 @@ export default {
"name": [
1
],
- "description": [
- 1
- ],
- "logoUrl": [
- 1
- ],
- "author": [
- 1
- ],
"oAuthRedirectUris": [
1
],
"oAuthScopes": [
1
],
- "websiteUrl": [
- 1
- ],
- "termsUrl": [
- 1
- ],
"isListed": [
6
],
@@ -11234,7 +11042,7 @@ export default {
1
],
"update": [
- 473
+ 467
],
"__typename": [
1
@@ -11394,13 +11202,13 @@ export default {
},
"EmailAccountConnectionParameters": {
"IMAP": [
- 481
+ 475
],
"SMTP": [
- 481
+ 475
],
"CALDAV": [
- 481
+ 475
],
"__typename": [
1
@@ -11440,7 +11248,7 @@ export default {
"AiModelRole": {},
"CreateOneAppTokenInput": {
"appToken": [
- 485
+ 479
],
"__typename": [
1
@@ -11456,7 +11264,7 @@ export default {
},
"WorkspaceMigrationInput": {
"actions": [
- 487
+ 481
],
"__typename": [
1
@@ -11464,10 +11272,10 @@ export default {
},
"WorkspaceMigrationDeleteActionInput": {
"type": [
- 488
+ 482
],
"metadataName": [
- 341
+ 335
],
"universalIdentifier": [
1
@@ -11492,7 +11300,7 @@ export default {
247,
{
"input": [
- 491,
+ 485,
"LogicFunctionLogsInput!"
]
}
diff --git a/packages/twenty-docs/developers/extend/apps/building.mdx b/packages/twenty-docs/developers/extend/apps/building.mdx
index b28a09324b..fd021470ce 100644
--- a/packages/twenty-docs/developers/extend/apps/building.mdx
+++ b/packages/twenty-docs/developers/extend/apps/building.mdx
@@ -19,15 +19,17 @@ The SDK provides helper functions for defining your app entities. As described i
|----------|---------|
| `defineApplication` | Configure application metadata (required, one per app) |
| `defineObject` | Define custom objects with fields |
+| `defineField` | Extend existing objects with additional fields or define standalone relation fields |
| `defineLogicFunction` | Define logic functions with handlers |
| `definePreInstallLogicFunction` | Define a pre-install logic function (one per app) |
| `definePostInstallLogicFunction` | Define a post-install logic function (one per app) |
| `defineFrontComponent` | Define front components for custom UI |
| `defineRole` | Configure role permissions and object access |
-| `defineField` | Extend existing objects with additional fields |
| `defineView` | Define saved views for objects |
| `defineNavigationMenuItem` | Define sidebar navigation links |
| `defineSkill` | Define AI agent skills |
+| `defineAgent` | Define AI agents |
+| `definePageLayout` | Define custom page layouts |
These functions validate your configuration at build time and provide IDE autocompletion and type safety.
@@ -36,7 +38,7 @@ These functions validate your configuration at build time and provide IDE autoco
Custom objects describe both schema and behavior for records in your workspace. Use `defineObject()` to define objects with built-in validation:
```typescript
-// src/app/postCard.object.ts
+// src/objects/postCard.object.ts
import { defineObject, FieldType } from 'twenty-sdk';
enum PostCardStatus {
@@ -110,7 +112,7 @@ Key points:
- The `universalIdentifier` must be unique and stable across deployments.
- Each field requires a `name`, `type`, `label`, and its own stable `universalIdentifier`.
- The `fields` array is optional — you can define objects without custom fields.
-- You can scaffold new objects using `yarn twenty entity:add`, which guides you through naming, fields, and relationships.
+- You can scaffold new objects using `yarn twenty add`, which guides you through naming, fields, and relationships.
**Base fields are created automatically.** When you define a custom object, Twenty automatically adds standard fields
@@ -120,6 +122,195 @@ Key points:
but this is not recommended.
+### Defining fields on existing objects
+
+Use `defineField()` to add fields to objects you don't own — such as standard Twenty objects (Person, Company, etc.) or objects from other apps. Unlike inline fields in `defineObject()`, standalone fields require an `objectUniversalIdentifier` to specify which object they extend:
+
+```typescript
+// src/fields/company-loyalty-tier.field.ts
+import { defineField, FieldType } from 'twenty-sdk';
+
+export default defineField({
+ universalIdentifier: 'f2a1b3c4-d5e6-7890-abcd-ef1234567890',
+ objectUniversalIdentifier: '701aecb9-eb1c-4d84-9d94-b954b231b64b', // Company object
+ name: 'loyaltyTier',
+ type: FieldType.SELECT,
+ label: 'Loyalty Tier',
+ icon: 'IconStar',
+ options: [
+ { value: 'BRONZE', label: 'Bronze', position: 0, color: 'orange' },
+ { value: 'SILVER', label: 'Silver', position: 1, color: 'gray' },
+ { value: 'GOLD', label: 'Gold', position: 2, color: 'yellow' },
+ ],
+});
+```
+
+Key points:
+- `objectUniversalIdentifier` identifies the target object. For standard objects, use `STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS` exported from `twenty-sdk`.
+- When defining fields inline in `defineObject()`, you do **not** need `objectUniversalIdentifier` — it's inherited from the parent object.
+- `defineField()` is the only way to add fields to objects you didn't create with `defineObject()`.
+
+### Relations
+
+Relations connect objects together. In Twenty, relations are always **bidirectional** — you define both sides, and each side references the other.
+
+There are two relation types:
+
+| Relation type | Description | Has foreign key? |
+|---------------|-------------|-----------------|
+| `MANY_TO_ONE` | Many records of this object point to one record of the target | Yes (`joinColumnName`) |
+| `ONE_TO_MANY` | One record of this object has many records of the target | No (inverse side) |
+
+#### How relations work
+
+Every relation requires **two fields** that reference each other:
+
+1. The **MANY_TO_ONE** side — lives on the object that holds the foreign key
+2. The **ONE_TO_MANY** side — lives on the object that owns the collection
+
+Both fields use `FieldType.RELATION` and cross-reference each other via `relationTargetFieldMetadataUniversalIdentifier`.
+
+#### Example: Post Card has many Recipients
+
+Suppose a `PostCard` can be sent to many `PostCardRecipient` records. Each recipient belongs to exactly one post card.
+
+**Step 1: Define the ONE_TO_MANY side on PostCard** (the "one" side):
+
+```typescript
+// src/fields/post-card-recipients-on-post-card.field.ts
+import { defineField, FieldType, RelationType } from 'twenty-sdk';
+import { POST_CARD_UNIVERSAL_IDENTIFIER } from '../objects/post-card.object';
+import { POST_CARD_RECIPIENT_UNIVERSAL_IDENTIFIER } from '../objects/post-card-recipient.object';
+
+// Export so the other side can reference it
+export const POST_CARD_RECIPIENTS_FIELD_ID = 'a1111111-1111-1111-1111-111111111111';
+// Import from the other side
+import { POST_CARD_FIELD_ID } from './post-card-on-post-card-recipient.field';
+
+export default defineField({
+ universalIdentifier: POST_CARD_RECIPIENTS_FIELD_ID,
+ objectUniversalIdentifier: POST_CARD_UNIVERSAL_IDENTIFIER,
+ type: FieldType.RELATION,
+ name: 'postCardRecipients',
+ label: 'Post Card Recipients',
+ icon: 'IconUsers',
+ relationTargetObjectMetadataUniversalIdentifier: POST_CARD_RECIPIENT_UNIVERSAL_IDENTIFIER,
+ relationTargetFieldMetadataUniversalIdentifier: POST_CARD_FIELD_ID,
+ universalSettings: {
+ relationType: RelationType.ONE_TO_MANY,
+ },
+});
+```
+
+**Step 2: Define the MANY_TO_ONE side on PostCardRecipient** (the "many" side — holds the foreign key):
+
+```typescript
+// src/fields/post-card-on-post-card-recipient.field.ts
+import { defineField, FieldType, RelationType, OnDeleteAction } from 'twenty-sdk';
+import { POST_CARD_UNIVERSAL_IDENTIFIER } from '../objects/post-card.object';
+import { POST_CARD_RECIPIENT_UNIVERSAL_IDENTIFIER } from '../objects/post-card-recipient.object';
+
+// Export so the other side can reference it
+export const POST_CARD_FIELD_ID = 'b2222222-2222-2222-2222-222222222222';
+// Import from the other side
+import { POST_CARD_RECIPIENTS_FIELD_ID } from './post-card-recipients-on-post-card.field';
+
+export default defineField({
+ universalIdentifier: POST_CARD_FIELD_ID,
+ objectUniversalIdentifier: POST_CARD_RECIPIENT_UNIVERSAL_IDENTIFIER,
+ type: FieldType.RELATION,
+ name: 'postCard',
+ label: 'Post Card',
+ icon: 'IconMail',
+ relationTargetObjectMetadataUniversalIdentifier: POST_CARD_UNIVERSAL_IDENTIFIER,
+ relationTargetFieldMetadataUniversalIdentifier: POST_CARD_RECIPIENTS_FIELD_ID,
+ universalSettings: {
+ relationType: RelationType.MANY_TO_ONE,
+ onDelete: OnDeleteAction.CASCADE,
+ joinColumnName: 'postCardId',
+ },
+});
+```
+
+
+**Circular imports:** Both relation fields reference each other's `universalIdentifier`. To avoid circular import issues, export your field IDs as named constants from each file, and import them in the other file. The build system resolves these at compile time.
+
+
+#### Relating to standard objects
+
+To create a relation with a built-in Twenty object (Person, Company, etc.), use `STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS`:
+
+```typescript
+// src/fields/person-on-self-hosting-user.field.ts
+import {
+ defineField,
+ FieldType,
+ RelationType,
+ OnDeleteAction,
+ STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS,
+} from 'twenty-sdk';
+import { SELF_HOSTING_USER_UNIVERSAL_IDENTIFIER } from '../objects/self-hosting-user.object';
+
+export const PERSON_FIELD_ID = 'c3333333-3333-3333-3333-333333333333';
+export const SELF_HOSTING_USER_REVERSE_FIELD_ID = 'd4444444-4444-4444-4444-444444444444';
+
+export default defineField({
+ universalIdentifier: PERSON_FIELD_ID,
+ objectUniversalIdentifier: SELF_HOSTING_USER_UNIVERSAL_IDENTIFIER,
+ type: FieldType.RELATION,
+ name: 'person',
+ label: 'Person',
+ description: 'Person matching with the self hosting user',
+ isNullable: true,
+ relationTargetObjectMetadataUniversalIdentifier:
+ STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.person.universalIdentifier,
+ relationTargetFieldMetadataUniversalIdentifier: SELF_HOSTING_USER_REVERSE_FIELD_ID,
+ universalSettings: {
+ relationType: RelationType.MANY_TO_ONE,
+ onDelete: OnDeleteAction.SET_NULL,
+ joinColumnName: 'personId',
+ },
+});
+```
+
+#### Relation field properties
+
+| Property | Required | Description |
+|----------|----------|-------------|
+| `type` | Yes | Must be `FieldType.RELATION` |
+| `relationTargetObjectMetadataUniversalIdentifier` | Yes | The `universalIdentifier` of the target object |
+| `relationTargetFieldMetadataUniversalIdentifier` | Yes | The `universalIdentifier` of the matching field on the target object |
+| `universalSettings.relationType` | Yes | `RelationType.MANY_TO_ONE` or `RelationType.ONE_TO_MANY` |
+| `universalSettings.onDelete` | MANY_TO_ONE only | What happens when the referenced record is deleted: `CASCADE`, `SET_NULL`, `RESTRICT`, or `NO_ACTION` |
+| `universalSettings.joinColumnName` | MANY_TO_ONE only | Database column name for the foreign key (e.g., `postCardId`) |
+
+#### Inline relation fields in defineObject
+
+You can also define relation fields directly inside `defineObject()`. In that case, omit `objectUniversalIdentifier` — it's inherited from the parent object:
+
+```typescript
+export default defineObject({
+ universalIdentifier: '...',
+ nameSingular: 'postCardRecipient',
+ // ...
+ fields: [
+ {
+ universalIdentifier: POST_CARD_FIELD_ID,
+ type: FieldType.RELATION,
+ name: 'postCard',
+ label: 'Post Card',
+ relationTargetObjectMetadataUniversalIdentifier: POST_CARD_UNIVERSAL_IDENTIFIER,
+ relationTargetFieldMetadataUniversalIdentifier: POST_CARD_RECIPIENTS_FIELD_ID,
+ universalSettings: {
+ relationType: RelationType.MANY_TO_ONE,
+ onDelete: OnDeleteAction.CASCADE,
+ joinColumnName: 'postCardId',
+ },
+ },
+ // ... other fields
+ ],
+});
+```
### Application config (application-config.ts)
@@ -161,13 +352,29 @@ Notes:
- `defaultRoleUniversalIdentifier` must match the role file (see below).
- Pre-install and post-install functions are automatically detected during the manifest build. See [Pre-install functions](#pre-install-functions) and [Post-install functions](#post-install-functions).
+#### Marketplace metadata
+
+If you plan to [publish your app](/developers/extend/apps/publishing), these optional fields control how your app appears in the marketplace:
+
+| Field | Description |
+|-------|-------------|
+| `author` | Author or company name |
+| `category` | App category for marketplace filtering |
+| `logoUrl` | Path to your app logo (relative to `./assets/`) |
+| `screenshots` | Array of screenshot paths (relative to `./assets/`) |
+| `aboutDescription` | Longer markdown description for the "About" tab |
+| `websiteUrl` | Link to your website |
+| `termsUrl` | Link to terms of service |
+| `emailSupport` | Support email address |
+| `issueReportUrl` | Link to issue tracker |
+
#### Roles and permissions
Applications can define roles that encapsulate permissions on your workspace's objects and actions. The field `defaultRoleUniversalIdentifier` in `application-config.ts` designates the default role used by your app's logic functions.
- The runtime API key injected as `TWENTY_API_KEY` is derived from this default function role.
- The typed client will be restricted to the permissions granted to that role.
-- Follow least‑privilege: create a dedicated role with only the permissions your functions need, then reference its universal identifier.
+- Follow least-privilege: create a dedicated role with only the permissions your functions need, then reference its universal identifier.
##### Default function role (*.role.ts)
@@ -219,7 +426,7 @@ The `universalIdentifier` of this role is then referenced in `application-config
- **application-config.ts** points to that role so your functions inherit its permissions.
Notes:
-- Start from the scaffolded role, then progressively restrict it following least‑privilege.
+- Start from the scaffolded role, then progressively restrict it following least-privilege.
- Replace the `objectPermissions` and `fieldPermissions` with the objects/fields your functions need.
- `permissionFlags` control access to platform-level capabilities. Keep them minimal; add only what you need.
- See a working example in the Hello World app: [`packages/twenty-apps/hello-world/src/roles/function-role.ts`](https://github.com/twentyhq/twenty/blob/main/packages/twenty-apps/hello-world/src/roles/function-role.ts).
@@ -229,7 +436,7 @@ Notes:
Each function file uses `defineLogicFunction()` to export a configuration with a handler and optional triggers.
```typescript
-// src/app/createPostCard.logic-function.ts
+// src/logic-functions/createPostCard.logic-function.ts
import { defineLogicFunction } from 'twenty-sdk';
import type { DatabaseEventPayload, ObjectRecordCreateEvent, CronPayload, RoutePayload } from 'twenty-sdk';
import { CoreApiClient, type Person } from 'twenty-sdk/generated';
@@ -318,7 +525,7 @@ export default definePreInstallLogicFunction({
You can also manually execute the pre-install function at any time using the CLI:
```bash filename="Terminal"
-yarn twenty function:execute --preInstall
+yarn twenty exec --preInstall
```
Key points:
@@ -327,7 +534,7 @@ Key points:
- Only one pre-install function is allowed per application. The manifest build will error if more than one is detected.
- The function's `universalIdentifier` is automatically set as `preInstallLogicFunctionUniversalIdentifier` on the application manifest during the build — you do not need to reference it in `defineApplication()`.
- The default timeout is set to 300 seconds (5 minutes) to allow for longer preparation tasks.
-- Pre-install functions do not need triggers — they are invoked by the platform before installation or manually via `function:execute --preInstall`.
+- Pre-install functions do not need triggers — they are invoked by the platform before installation or manually via `exec --preInstall`.
### Post-install functions
@@ -355,7 +562,7 @@ export default definePostInstallLogicFunction({
You can also manually execute the post-install function at any time using the CLI:
```bash filename="Terminal"
-yarn twenty function:execute --postInstall
+yarn twenty exec --postInstall
```
Key points:
@@ -364,7 +571,7 @@ Key points:
- Only one post-install function is allowed per application. The manifest build will error if more than one is detected.
- The function's `universalIdentifier` is automatically set as `postInstallLogicFunctionUniversalIdentifier` on the application manifest during the build — you do not need to reference it in `defineApplication()`.
- The default timeout is set to 300 seconds (5 minutes) to allow for longer setup tasks like data seeding.
-- Post-install functions do not need triggers — they are invoked by the platform during installation or manually via `function:execute --postInstall`.
+- Post-install functions do not need triggers — they are invoked by the platform during installation or manually via `exec --postInstall`.
### Route trigger payload
@@ -412,7 +619,7 @@ The `RoutePayload` type has the following structure:
|----------|------|-------------|
| `headers` | `Record` | HTTP headers (only those listed in `forwardedRequestHeaders`) |
| `queryStringParameters` | `Record` | Query string parameters (multiple values joined with commas) |
-| `pathParameters` | `Record` | Path parameters extracted from the route pattern (e.g., `/users/:id` → `{ id: '123' }`) |
+| `pathParameters` | `Record` | Path parameters extracted from the route pattern (e.g., `/users/:id` -> `{ id: '123' }`) |
| `body` | `object \| null` | Parsed request body (JSON) |
| `isBase64Encoded` | `boolean` | Whether the body is base64 encoded |
| `requestContext.http.method` | `string` | HTTP method (GET, POST, PUT, PATCH, DELETE) |
@@ -458,7 +665,7 @@ const handler = async (event: RoutePayload) => {
You can create new functions in two ways:
-- **Scaffolded**: Run `yarn twenty entity:add` and choose the option to add a new logic function. This generates a starter file with a handler and config.
+- **Scaffolded**: Run `yarn twenty add` and choose the option to add a new logic function. This generates a starter file with a handler and config.
- **Manual**: Create a new `*.logic-function.ts` file and use `defineLogicFunction()`, following the same pattern.
### Marking a logic function as a tool
@@ -470,7 +677,7 @@ To mark a logic function as a tool, set `isTool: true` and provide a `toolInputS
```typescript
// src/logic-functions/enrich-company.logic-function.ts
import { defineLogicFunction } from 'twenty-sdk';
-import { CoreApiClient } from 'twenty-sdk/generated';
+import { CoreApiClient } from 'twenty-client-sdk/core';
const handler = async (params: { companyName: string; domain?: string }) => {
const client = new CoreApiClient();
@@ -558,7 +765,7 @@ Key points:
You can create new front components in two ways:
-- **Scaffolded**: Run `yarn twenty entity:add` and choose the option to add a new front component.
+- **Scaffolded**: Run `yarn twenty add` and choose the option to add a new front component.
- **Manual**: Create a new `.tsx` file and use `defineFrontComponent()`, following the same pattern.
### Skills
@@ -592,46 +799,122 @@ Key points:
You can create new skills in two ways:
-- **Scaffolded**: Run `yarn twenty entity:add` and choose the option to add a new skill.
+- **Scaffolded**: Run `yarn twenty add` and choose the option to add a new skill.
- **Manual**: Create a new file and use `defineSkill()`, following the same pattern.
-### Generated typed clients
+### Typed API clients (`twenty-client-sdk`)
-Two typed clients are auto-generated by `yarn twenty dev` and stored in `node_modules/twenty-sdk/generated` based on your workspace schema:
+The `twenty-client-sdk` package provides two typed GraphQL clients for interacting with the Twenty API from your logic functions and front components:
-- **`CoreApiClient`** — queries the `/graphql` endpoint for workspace data
-- **`MetadataApiClient`** — queries the `/metadata` endpoint for workspace configuration and file uploads
+| Client | Import | Endpoint | Generated? |
+|--------|--------|----------|------------|
+| `CoreApiClient` | `twenty-client-sdk/core` | `/graphql` — workspace data (records, objects) | Yes, at dev/build time |
+| `MetadataApiClient` | `twenty-client-sdk/metadata` | `/metadata` — workspace config, file uploads | No, ships pre-built |
+
+#### CoreApiClient
+
+`CoreApiClient` is the main client for querying and mutating workspace data. It is **generated from your workspace schema** during `yarn twenty dev` or `yarn twenty build`, so it's fully typed to match your objects and fields.
```typescript
-import { CoreApiClient, MetadataApiClient } from 'twenty-sdk/generated';
+import { CoreApiClient } from 'twenty-client-sdk/core';
const client = new CoreApiClient();
-const { me } = await client.query({ me: { id: true, displayName: true } });
-const metadataClient = new MetadataApiClient();
-const { currentWorkspace } = await metadataClient.query({ currentWorkspace: { id: true } });
+// Query records
+const { companies } = await client.query({
+ companies: {
+ edges: {
+ node: {
+ id: true,
+ name: true,
+ domainName: true,
+ },
+ },
+ },
+});
+
+// Create a record
+const { createCompany } = await client.mutation({
+ createCompany: {
+ __args: {
+ data: {
+ name: 'Acme Corp',
+ },
+ },
+ id: true,
+ name: true,
+ },
+});
```
-Both clients are re-generated automatically by `yarn twenty dev` whenever your objects or fields change.
+The client uses a selection-set syntax: pass `true` to include a field, use `__args` for arguments, and nest objects for relations. You get full autocompletion and type checking based on your workspace schema.
-#### Runtime credentials in logic functions
+
+**CoreApiClient is generated at dev/build time.** If you try to use it without running `yarn twenty dev` or `yarn twenty build` first, it throws an error. The generation happens automatically — the CLI introspects your workspace's GraphQL schema, generates a typed client using `@genql/cli`, writes the generated sources to `node_modules/twenty-client-sdk/dist/core/generated/`, and replaces the stubs in `node_modules/twenty-client-sdk/dist/core.mjs` and `node_modules/twenty-client-sdk/dist/core.cjs`.
+
-When your function runs on Twenty, the platform injects credentials as environment variables before your code executes:
+#### Using CoreSchema for type annotations
-- `TWENTY_API_URL`: Base URL of the Twenty API your app targets.
-- `TWENTY_API_KEY`: Short‑lived key scoped to your application's default function role.
+`CoreSchema` provides TypeScript types matching your workspace objects, useful for typing component state or function parameters:
-Notes:
-- You do not need to pass URL or API key to the generated client. It reads `TWENTY_API_URL` and `TWENTY_API_KEY` from process.env at runtime.
-- The API key's permissions are determined by the role referenced in your `application-config.ts` via `defaultRoleUniversalIdentifier`. This is the default role used by logic functions of your application.
-- Applications can define roles to follow least‑privilege. Grant only the permissions your functions need, then point `defaultRoleUniversalIdentifier` to that role's universal identifier.
+```typescript
+import { CoreApiClient, CoreSchema } from 'twenty-client-sdk/core';
+import { useState } from 'react';
+
+const [company, setCompany] = useState<
+ Pick | undefined
+>(undefined);
+
+const client = new CoreApiClient();
+const result = await client.query({
+ company: {
+ __args: { filter: { position: { eq: 1 } } },
+ id: true,
+ name: true,
+ },
+});
+setCompany(result.company);
+```
+
+#### MetadataApiClient
+
+`MetadataApiClient` ships pre-built with the SDK (no generation required). It queries the `/metadata` endpoint for workspace configuration, applications, and file uploads:
+
+```typescript
+import { MetadataApiClient } from 'twenty-client-sdk/metadata';
+
+const metadataClient = new MetadataApiClient();
+
+// Query workspace info
+const { currentWorkspace } = await metadataClient.query({
+ currentWorkspace: { id: true, displayName: true },
+});
+
+// List installed applications
+const { findManyApplications } = await metadataClient.query({
+ findManyApplications: {
+ id: true,
+ name: true,
+ version: true,
+ },
+});
+```
+
+#### Runtime credentials
+
+When your code runs on Twenty (logic functions or front components), the platform injects credentials as environment variables:
+
+- `TWENTY_API_URL` — Base URL of the Twenty API
+- `TWENTY_API_KEY` — Short-lived key scoped to your application's default function role
+
+You do **not** need to pass these to the clients — they read from `process.env` automatically. The API key's permissions are determined by the role referenced in `defaultRoleUniversalIdentifier` in your `application-config.ts`.
#### Uploading files
-The generated `MetadataApiClient` includes an `uploadFile` method for attaching files to file-type fields on your workspace objects. Because standard GraphQL clients do not support multipart file uploads natively, the client provides this dedicated method that implements the [GraphQL multipart request specification](https://github.com/jaydenseric/graphql-multipart-request-spec) under the hood.
+`MetadataApiClient` includes an `uploadFile` method for attaching files to file-type fields. It implements the [GraphQL multipart request specification](https://github.com/jaydenseric/graphql-multipart-request-spec):
```typescript
-import { MetadataApiClient } from 'twenty-sdk/generated';
+import { MetadataApiClient } from 'twenty-client-sdk/metadata';
import * as fs from 'fs';
const metadataClient = new MetadataApiClient();
@@ -641,25 +924,14 @@ const fileBuffer = fs.readFileSync('./invoice.pdf');
const uploadedFile = await metadataClient.uploadFile(
fileBuffer, // file contents as a Buffer
'invoice.pdf', // filename
- 'application/pdf', // MIME type (defaults to 'application/octet-stream')
- '58a0a314-d7ea-4865-9850-7fb84e72f30b', // field universal identifier
+ 'application/pdf', // MIME type
+ '58a0a314-d7ea-4865-9850-7fb84e72f30b', // field universalIdentifier
);
console.log(uploadedFile);
// { id: '...', path: '...', size: 12345, createdAt: '...', url: 'https://...' }
```
-The method signature:
-
-```typescript
-uploadFile(
- fileBuffer: Buffer,
- filename: string,
- contentType: string,
- fieldMetadataUniversalIdentifier: string,
-): Promise<{ id: string; path: string; size: number; createdAt: string; url: string }>
-```
-
| Parameter | Type | Description |
|-----------|------|-------------|
| `fileBuffer` | `Buffer` | The raw file contents |
@@ -668,8 +940,7 @@ uploadFile(
| `fieldMetadataUniversalIdentifier` | `string` | The `universalIdentifier` of the file-type field on your object |
Key points:
-- The `uploadFile` method is available on `MetadataApiClient` because the upload mutation is resolved by the `/metadata` endpoint.
-- It uses the field's `universalIdentifier` (not its workspace-specific ID), so your upload code works across any workspace where your app is installed — consistent with how apps reference fields everywhere else.
+- Uses the field's `universalIdentifier` (not its workspace-specific ID), so your upload code works across any workspace where your app is installed.
- The returned `url` is a signed URL you can use to access the uploaded file.
### Hello World example
diff --git a/packages/twenty-docs/developers/extend/apps/getting-started.mdx b/packages/twenty-docs/developers/extend/apps/getting-started.mdx
index 65d851c097..46d71760a5 100644
--- a/packages/twenty-docs/developers/extend/apps/getting-started.mdx
+++ b/packages/twenty-docs/developers/extend/apps/getting-started.mdx
@@ -48,7 +48,7 @@ From here you can:
```bash filename="Terminal"
# Add a new entity to your application (guided)
-yarn twenty entity:add
+yarn twenty add
# Watch your application's function logs
yarn twenty function:logs
@@ -122,7 +122,7 @@ With `--minimal`, only the core files are created (`application-config.ts`, `rol
At a high level:
- **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus a `twenty` script that delegates to the local `twenty` CLI. Run `yarn twenty help` to list all available commands.
-- **.gitignore**: Ignores common artifacts such as `node_modules`, `.yarn`, `generated/` (typed client), `dist/`, `build/`, coverage folders, log files, and `.env*` files.
+- **.gitignore**: Ignores common artifacts such as `node_modules`, `.yarn`, `.twenty/`, `dist/`, `build/`, coverage folders, log files, and `.env*` files.
- **yarn.lock**, **.yarnrc.yml**, **.yarn/**: Lock and configure the Yarn 4 toolchain used by the project.
- **.nvmrc**: Pins the Node.js version expected by the project.
- **.oxlintrc.json** and **tsconfig.json**: Provide linting and TypeScript configuration for your app's TypeScript sources.
@@ -165,8 +165,8 @@ export default defineObject({
Later commands will add more files and folders:
-- `yarn twenty dev` will auto-generate two typed API clients in `node_modules/twenty-sdk/generated`: `CoreApiClient` (for workspace data via `/graphql`) and `MetadataApiClient` (for workspace configuration and file uploads via `/metadata`).
-- `yarn twenty entity:add` will add entity definition files under `src/` for your custom objects, functions, front components, roles, skills, and more.
+- `yarn twenty dev` will auto-generate the typed `CoreApiClient` (for workspace data via `/graphql`) into `node_modules/twenty-client-sdk/`. The `MetadataApiClient` (for workspace configuration and file uploads via `/metadata`) ships pre-built and is available immediately. Import them from `twenty-client-sdk/core` and `twenty-client-sdk/metadata` respectively.
+- `yarn twenty add` will add entity definition files under `src/` for your custom objects, functions, front components, roles, skills, and more.
## Authentication
diff --git a/packages/twenty-docs/developers/extend/apps/publishing.mdx b/packages/twenty-docs/developers/extend/apps/publishing.mdx
index 3cbcfaee14..fa76d658ba 100644
--- a/packages/twenty-docs/developers/extend/apps/publishing.mdx
+++ b/packages/twenty-docs/developers/extend/apps/publishing.mdx
@@ -12,7 +12,25 @@ Apps are currently in alpha testing. The feature is functional but still evolvin
Once your app is [built and tested locally](/developers/extend/apps/building), you have two paths for distributing it:
- **Publish to npm** — list your app in the Twenty marketplace for any workspace to discover and install.
-- **Push a tarball** — deploy your app to a specific Twenty server for internal use without making it publicly available.
+- **Deploy a tarball** — upload your app directly to a specific Twenty server for internal or private use.
+
+Both paths start from the same **build** step.
+
+## Building your app
+
+The `build` command compiles your TypeScript sources, transpiles logic functions and front components, and generates a `manifest.json` that describes your app's contents:
+
+```bash filename="Terminal"
+yarn twenty build
+```
+
+The output is written to `.twenty/output/`. This directory contains everything needed for distribution: compiled code, assets, the manifest, and a copy of your `package.json`.
+
+To also create a `.tgz` tarball (used by the deploy command internally, or for manual distribution):
+
+```bash filename="Terminal"
+yarn twenty build --tarball
+```
## Publishing to npm
@@ -21,29 +39,72 @@ Publishing to npm makes your app discoverable in the Twenty marketplace. Any Twe
### Requirements
- An [npm](https://www.npmjs.com) account
-- Your package name **must** use the `twenty-app-` prefix (e.g., `twenty-app-postcard-sender`)
+- The `twenty-app` keyword **must** be listed in your `package.json` `keywords` array
+
+### Adding the required keyword
+
+The Twenty marketplace discovers apps by searching the npm registry for packages with the `twenty-app` keyword. Add it to your `package.json`:
+
+```json filename="package.json"
+{
+ "name": "twenty-app-postcard-sender",
+ "version": "1.0.0",
+ "keywords": ["twenty-app"],
+ ...
+}
+```
+
+
+The marketplace searches for `keywords:twenty-app` on the npm registry. Without this keyword, your package won't appear in the marketplace even if it has the `twenty-app-` name prefix.
+
### Steps
-1. **Build your app** — the CLI compiles your TypeScript sources and generates the application manifest:
+1. **Build your app:**
```bash filename="Terminal"
yarn twenty build
```
-2. **Publish to npm** — push the built package to the npm registry:
+2. **Publish to npm:**
```bash filename="Terminal"
-npx twenty publish
+yarn twenty publish
```
-### Auto-discovery
+This runs `npm publish` from the `.twenty/output/` directory.
-Packages with the `twenty-app-` prefix are automatically discovered by the Twenty marketplace catalog. Once published, your app appears in the marketplace within a few minutes — no manual registration or approval required.
+To publish under a specific dist-tag (e.g., `beta` or `next`):
+
+```bash filename="Terminal"
+yarn twenty publish --tag beta
+```
+
+### How marketplace discovery works
+
+The Twenty server syncs its marketplace catalog from the npm registry **every hour**:
+
+1. It searches for all npm packages with the `keywords:twenty-app` keyword
+2. For each package, it fetches the `manifest.json` from the npm CDN
+3. The app's metadata (name, description, author, logo, screenshots, category) is extracted from the manifest and displayed in the marketplace
+
+After publishing, your app can take up to one hour to appear in the marketplace. To trigger the sync immediately instead of waiting for the next hourly run:
+
+```bash filename="Terminal"
+yarn twenty catalog-sync
+```
+
+To target a specific remote:
+
+```bash filename="Terminal"
+yarn twenty catalog-sync -r production
+```
+
+The metadata shown in the marketplace comes from your `defineApplication()` call in your app source code — fields like `displayName`, `description`, `author`, `category`, `logoUrl`, `screenshots`, `aboutDescription`, `websiteUrl`, and `termsUrl`.
### CI publishing
-The scaffolded project includes a GitHub Actions workflow that publishes on every release. It runs `app:build`, then `npm publish --provenance` from the build output:
+The scaffolded project includes a GitHub Actions workflow that publishes on every release:
```yaml filename=".github/workflows/publish.yml"
name: Publish
@@ -72,48 +133,117 @@ jobs:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
```
-For other CI systems (GitLab CI, CircleCI, etc.), the same three commands apply: `yarn install`, `npx twenty build`, then `npm publish` from `.twenty/output`.
+For other CI systems (GitLab CI, CircleCI, etc.), the same three commands apply: `yarn install`, `yarn twenty build`, then `npm publish` from `.twenty/output`.
**npm provenance** is optional but recommended. Publishing with `--provenance` adds a trust badge to your npm listing, letting users verify the package was built from a specific commit in a public CI pipeline. See the [npm provenance docs](https://docs.npmjs.com/generating-provenance-statements) for setup instructions.
-## Internal distribution
+## Deploying to a server (tarball)
-For apps you don't want publicly available — proprietary tools, enterprise-only integrations, or experimental builds — you can push a tarball directly to a Twenty server.
+For apps you don't want publicly available — proprietary tools, enterprise-only integrations, or experimental builds — you can deploy a tarball directly to a Twenty server.
-### Push a tarball
+### Prerequisites
-Build your app and deploy it to a specific server in one step:
+Before deploying, you need a configured remote pointing to the target server. Remotes store the server URL and authentication credentials locally in `~/.twenty/config.json`.
+
+Add a remote:
```bash filename="Terminal"
-npx twenty publish --server
+yarn twenty remote add --url https://your-twenty-server.com --as production
```
-Any workspace on that server can then install and upgrade the app from the **Applications** settings page.
+For a local development server:
+
+```bash filename="Terminal"
+yarn twenty remote add --local --as local
+```
+
+You can also authenticate with an API key for non-interactive environments:
+
+```bash filename="Terminal"
+yarn twenty remote add --url https://your-twenty-server.com --token --as production
+```
+
+Manage your remotes:
+
+```bash filename="Terminal"
+yarn twenty remote list # List all configured remotes
+yarn twenty remote switch prod # Set the default remote
+yarn twenty remote status # Show active remote and auth status
+yarn twenty remote remove old # Remove a remote
+```
+
+### Deploying
+
+Build and upload your app to the server in one step:
+
+```bash filename="Terminal"
+yarn twenty deploy
+```
+
+This builds the app with `--tarball`, then uploads the tarball to the default remote via a GraphQL multipart upload.
+
+To deploy to a specific remote:
+
+```bash filename="Terminal"
+yarn twenty deploy -r production
+```
+
+### Sharing a deployed app
+
+Tarball apps are not listed in the public marketplace, so other workspaces on the same server won't discover them by browsing. To share a deployed app:
+
+1. Go to **Settings > Applications > Registrations** and open your app
+2. In the **Distribution** tab, click **Copy share link**
+3. Share this link with users on other workspaces — it takes them directly to the app's install page
+
+The share link uses the server's base URL (without any workspace subdomain) so it works for any workspace on the server.
### Version management
To release an update:
1. Bump the `version` field in your `package.json`
-2. Push a new tarball with `npx twenty publish --server `
-3. Workspaces on that server will see the upgrade available in their settings
+2. Run `yarn twenty deploy` (or `yarn twenty deploy -r production`)
+3. Workspaces that have the app installed will see the upgrade available in their settings
-
-Internal apps are scoped to the server they're pushed to. They won't appear in the public marketplace and can't be installed by workspaces on other servers.
-
+## Installing apps
-## App categories
+Once an app is published (npm) or deployed (tarball), workspaces install it through the UI:
+
+```bash filename="Terminal"
+yarn twenty install
+```
+
+Or from the **Settings > Applications** page in the Twenty UI, where both marketplace and tarball-deployed apps can be browsed and installed.
+
+## App distribution categories
Twenty organizes apps into three categories based on how they're distributed:
| Category | How it works | Visible in marketplace? |
|----------|-------------|------------------------|
| **Development** | Local dev mode apps running via `yarn twenty dev`. Used for building and testing. | No |
-| **Published** | Apps published to npm with the `twenty-app-` prefix. Listed in the marketplace for any workspace to install. | Yes |
-| **Internal** | Apps deployed via tarball to a specific server. Available only to workspaces on that server. | No |
+| **Published (npm)** | Apps published to npm with the `twenty-app` keyword. Listed in the marketplace for any workspace to install. | Yes |
+| **Internal (tarball)** | Apps deployed via tarball to a specific server. Available only to workspaces on that server via a share link. | No |
Start in **Development** mode while building your app. When it's ready, choose **Published** (npm) for broad distribution or **Internal** (tarball) for private deployment.
+
+## CLI reference
+
+| Command | Description | Key flags |
+|---------|-------------|-----------|
+| `yarn twenty build` | Compile app and generate manifest | `--tarball` — also create a `.tgz` package |
+| `yarn twenty publish` | Build and publish to npm | `--tag ` — npm dist-tag (e.g., `beta`, `next`) |
+| `yarn twenty deploy` | Build and upload tarball to a server | `-r, --remote ` — target remote |
+| `yarn twenty catalog-sync` | Trigger marketplace catalog sync on the server | `-r, --remote ` — target remote |
+| `yarn twenty install` | Install a deployed app on a workspace | `-r, --remote ` — target remote |
+| `yarn twenty dev` | Watch and sync local changes | Uses default remote |
+| `yarn twenty remote add` | Add a server connection | `--url`, `--token`, `--as`, `--local`, `--port` |
+| `yarn twenty remote list` | List configured remotes | — |
+| `yarn twenty remote switch` | Set default remote | — |
+| `yarn twenty remote status` | Show connection status | — |
+| `yarn twenty remote remove` | Remove a remote | — |
diff --git a/packages/twenty-front/src/generated-metadata/graphql.ts b/packages/twenty-front/src/generated-metadata/graphql.ts
index 8a7f8c192e..ce50e1be32 100644
--- a/packages/twenty-front/src/generated-metadata/graphql.ts
+++ b/packages/twenty-front/src/generated-metadata/graphql.ts
@@ -367,14 +367,11 @@ export type Application = {
export type ApplicationRegistration = {
__typename?: 'ApplicationRegistration';
- author?: Maybe;
createdAt: Scalars['DateTime'];
- description?: Maybe;
id: Scalars['UUID'];
isFeatured: Scalars['Boolean'];
isListed: Scalars['Boolean'];
latestAvailableVersion?: Maybe;
- logoUrl?: Maybe;
name: Scalars['String'];
oAuthClientId: Scalars['String'];
oAuthRedirectUris: Array;
@@ -382,10 +379,8 @@ export type ApplicationRegistration = {
ownerWorkspaceId?: Maybe;
sourcePackage?: Maybe;
sourceType: ApplicationRegistrationSourceType;
- termsUrl?: Maybe;
universalIdentifier: Scalars['String'];
updatedAt: Scalars['DateTime'];
- websiteUrl?: Maybe;
};
export enum ApplicationRegistrationSourceType {
@@ -1068,15 +1063,10 @@ export type CreateApplicationRegistration = {
};
export type CreateApplicationRegistrationInput = {
- author?: InputMaybe;
- description?: InputMaybe;
- logoUrl?: InputMaybe;
name: Scalars['String'];
oAuthRedirectUris?: InputMaybe>;
oAuthScopes?: InputMaybe>;
- termsUrl?: InputMaybe;
universalIdentifier?: InputMaybe;
- websiteUrl?: InputMaybe;
};
export type CreateApplicationRegistrationVariableInput = {
@@ -2285,97 +2275,30 @@ export type LoginToken = {
export type MarketplaceApp = {
__typename?: 'MarketplaceApp';
- aboutDescription: Scalars['String'];
author: Scalars['String'];
category: Scalars['String'];
- defaultRole?: Maybe;
description: Scalars['String'];
- fields: Array;
- frontComponents: Array;
icon: Scalars['String'];
id: Scalars['String'];
isFeatured: Scalars['Boolean'];
- logicFunctions: Array;
logo?: Maybe;
name: Scalars['String'];
- objects: Array;
- providers: Array;
- screenshots: Array;
sourcePackage?: Maybe;
- termsUrl?: Maybe;
- version: Scalars['String'];
- websiteUrl?: Maybe;
};
-export type MarketplaceAppDefaultRole = {
- __typename?: 'MarketplaceAppDefaultRole';
- canAccessAllTools: Scalars['Boolean'];
- canDestroyAllObjectRecords: Scalars['Boolean'];
- canReadAllObjectRecords: Scalars['Boolean'];
- canSoftDeleteAllObjectRecords: Scalars['Boolean'];
- canUpdateAllObjectRecords: Scalars['Boolean'];
- canUpdateAllSettings: Scalars['Boolean'];
- description?: Maybe;
- fieldPermissions: Array;
+export type MarketplaceAppDetail = {
+ __typename?: 'MarketplaceAppDetail';
id: Scalars['String'];
- label: Scalars['String'];
- objectPermissions: Array;
- permissionFlags: Array;
-};
-
-export type MarketplaceAppField = {
- __typename?: 'MarketplaceAppField';
- description?: Maybe;
- icon?: Maybe;
- label: Scalars['String'];
+ isFeatured: Scalars['Boolean'];
+ isListed: Scalars['Boolean'];
+ latestAvailableVersion?: Maybe;
+ manifest?: Maybe;
name: Scalars['String'];
- objectUniversalIdentifier?: Maybe;
- type: Scalars['String'];
- universalIdentifier?: Maybe;
-};
-
-export type MarketplaceAppFrontComponent = {
- __typename?: 'MarketplaceAppFrontComponent';
- description?: Maybe;
- name: Scalars['String'];
-};
-
-export type MarketplaceAppLogicFunction = {
- __typename?: 'MarketplaceAppLogicFunction';
- description?: Maybe;
- name: Scalars['String'];
- timeoutSeconds?: Maybe;
-};
-
-export type MarketplaceAppObject = {
- __typename?: 'MarketplaceAppObject';
- description?: Maybe;
- fields: Array;
- icon?: Maybe;
- labelPlural: Scalars['String'];
- labelSingular: Scalars['String'];
- namePlural: Scalars['String'];
- nameSingular: Scalars['String'];
+ sourcePackage?: Maybe;
+ sourceType: ApplicationRegistrationSourceType;
universalIdentifier: Scalars['String'];
};
-export type MarketplaceAppRoleFieldPermission = {
- __typename?: 'MarketplaceAppRoleFieldPermission';
- canReadFieldValue?: Maybe;
- canUpdateFieldValue?: Maybe;
- fieldUniversalIdentifier: Scalars['String'];
- objectUniversalIdentifier: Scalars['String'];
-};
-
-export type MarketplaceAppRoleObjectPermission = {
- __typename?: 'MarketplaceAppRoleObjectPermission';
- canDestroyObjectRecords?: Maybe;
- canReadObjectRecords?: Maybe;
- canSoftDeleteObjectRecords?: Maybe;
- canUpdateObjectRecords?: Maybe;
- objectUniversalIdentifier: Scalars['String'];
-};
-
export type MessageChannel = {
__typename?: 'MessageChannel';
connectedAccountId: Scalars['UUID'];
@@ -2688,6 +2611,7 @@ export type Mutation = {
switchBillingPlan: BillingUpdate;
switchSubscriptionInterval: BillingUpdate;
syncApplication: WorkspaceMigration;
+ syncMarketplaceCatalog: Scalars['Boolean'];
trackAnalytics: Analytics;
transferApplicationRegistrationOwnership: ApplicationRegistration;
uninstallApplication: Scalars['Boolean'];
@@ -4259,11 +4183,11 @@ export type Query = {
findManyLogicFunctions: Array;
findManyMarketplaceApps: Array;
findManyPublicDomains: Array;
+ findMarketplaceAppDetail: MarketplaceAppDetail;
findOneAgent: Agent;
findOneApplication: Application;
findOneApplicationRegistration: ApplicationRegistration;
findOneLogicFunction: LogicFunction;
- findOneMarketplaceApp: MarketplaceApp;
findWorkspaceFromInviteHash: Workspace;
findWorkspaceInvitations: Array;
frontComponent?: Maybe;
@@ -4273,6 +4197,7 @@ export type Query = {
getAdminAiModels: AdminAiModels;
getAdminAiUsageByWorkspace: Array;
getAiProviders: Scalars['JSON'];
+ getApplicationShareLink: Scalars['String'];
getApprovedAccessDomains: Array;
getAutoCompleteAddress: Array;
getAvailablePackages: Scalars['JSON'];
@@ -4443,6 +4368,11 @@ export type QueryFindApplicationRegistrationVariablesArgs = {
};
+export type QueryFindMarketplaceAppDetailArgs = {
+ universalIdentifier: Scalars['String'];
+};
+
+
export type QueryFindOneAgentArgs = {
input: AgentIdInput;
};
@@ -4464,11 +4394,6 @@ export type QueryFindOneLogicFunctionArgs = {
};
-export type QueryFindOneMarketplaceAppArgs = {
- universalIdentifier: Scalars['String'];
-};
-
-
export type QueryFindWorkspaceFromInviteHashArgs = {
inviteHash: Scalars['String'];
};
@@ -4491,6 +4416,11 @@ export type QueryGetAdminAiUsageByWorkspaceArgs = {
};
+export type QueryGetApplicationShareLinkArgs = {
+ id: Scalars['String'];
+};
+
+
export type QueryGetAutoCompleteAddressArgs = {
address: Scalars['String'];
country?: InputMaybe;
@@ -5190,15 +5120,10 @@ export type UpdateApplicationRegistrationInput = {
};
export type UpdateApplicationRegistrationPayload = {
- author?: InputMaybe;
- description?: InputMaybe;
isListed?: InputMaybe;
- logoUrl?: InputMaybe;
name?: InputMaybe;
oAuthRedirectUris?: InputMaybe>;
oAuthScopes?: InputMaybe>;
- termsUrl?: InputMaybe;
- websiteUrl?: InputMaybe;
};
export type UpdateApplicationRegistrationVariableInput = {
@@ -6408,7 +6333,7 @@ export type FindOneApplicationByUniversalIdentifierQueryVariables = Exact<{
}>;
-export type FindOneApplicationByUniversalIdentifierQuery = { __typename?: 'Query', findOneApplication: { __typename?: 'Application', id: string } };
+export type FindOneApplicationByUniversalIdentifierQuery = { __typename?: 'Query', findOneApplication: { __typename?: 'Application', id: string, name: string, description?: string | null, version?: string | null, universalIdentifier: string, applicationRegistrationId?: string | null, canBeUninstalled: boolean, defaultRoleId?: string | null, settingsCustomTabFrontComponentId?: string | null, availablePackages: any, applicationRegistration?: { __typename?: 'ApplicationRegistrationSummary', id: string, latestAvailableVersion?: string | null, sourceType: ApplicationRegistrationSourceType } | null, applicationVariables: Array<{ __typename?: 'ApplicationVariable', id: string, key: string, value: string, description: string, isSecret: boolean }>, agents: Array<{ __typename?: 'Agent', id: string, name: string, label: string, description?: string | null, icon?: string | null, prompt: string, modelId: string, responseFormat?: any | null, roleId?: string | null, isCustom: boolean, modelConfiguration?: any | null, evaluationInputs: Array, applicationId?: string | null, createdAt: string, updatedAt: string }>, objects: Array<{ __typename?: 'Object', id: string, universalIdentifier: string, nameSingular: string, namePlural: string, labelSingular: string, labelPlural: string, color?: string | null, description?: string | null, icon?: string | null, isCustom: boolean, isRemote: boolean, isActive: boolean, isSystem: boolean, isUIReadOnly: boolean, createdAt: string, updatedAt: string, labelIdentifierFieldMetadataId?: string | null, imageIdentifierFieldMetadataId?: string | null, applicationId: string, shortcut?: string | null, isLabelSyncedWithName: boolean, isSearchable: boolean, duplicateCriteria?: Array> | null, indexMetadataList: Array<{ __typename?: 'Index', id: string, createdAt: string, updatedAt: string, name: string, indexWhereClause?: string | null, indexType: IndexType, isUnique: boolean, isCustom?: boolean | null, indexFieldMetadataList: Array<{ __typename?: 'IndexField', id: string, fieldMetadataId: string, createdAt: string, updatedAt: string, order: number }> }>, fieldsList: Array<{ __typename?: 'Field', id: string, universalIdentifier: string, type: FieldMetadataType, name: string, label: string, description?: string | null, icon?: string | null, isCustom?: boolean | null, isActive?: boolean | null, isSystem?: boolean | null, isUIReadOnly?: boolean | null, isNullable?: boolean | null, isUnique?: boolean | null, createdAt: string, updatedAt: string, defaultValue?: any | null, options?: any | null, settings?: any | null, isLabelSyncedWithName?: boolean | null, morphId?: string | null, applicationId: string, relation?: { __typename?: 'Relation', type: RelationType, sourceObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, targetObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, sourceFieldMetadata: { __typename?: 'Field', id: string, name: string }, targetFieldMetadata: { __typename?: 'Field', id: string, name: string } } | null, morphRelations?: Array<{ __typename?: 'Relation', type: RelationType, sourceObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, targetObjectMetadata: { __typename?: 'Object', id: string, nameSingular: string, namePlural: string }, sourceFieldMetadata: { __typename?: 'Field', id: string, name: string }, targetFieldMetadata: { __typename?: 'Field', id: string, name: string } }> | null }> }>, logicFunctions: Array<{ __typename?: 'LogicFunction', id: string, name: string, description?: string | null, runtime: string, timeoutSeconds: number, sourceHandlerPath: string, handlerName: string, toolInputSchema?: any | null, isTool: boolean, cronTriggerSettings?: any | null, databaseEventTriggerSettings?: any | null, httpRouteTriggerSettings?: any | null, applicationId?: string | null, createdAt: string, updatedAt: string }> } };
export type AuthTokenFragmentFragment = { __typename?: 'AuthToken', token: string, expiresAt: string };
@@ -6739,7 +6664,9 @@ export type GetLogicFunctionSourceCodeQueryVariables = Exact<{
export type GetLogicFunctionSourceCodeQuery = { __typename?: 'Query', getLogicFunctionSourceCode?: string | null };
-export type MarketplaceAppFieldsFragment = { __typename?: 'MarketplaceApp', id: string, name: string, description: string, icon: string, version: string, author: string, category: string, logo?: string | null, screenshots: Array, aboutDescription: string, providers: Array, websiteUrl?: string | null, termsUrl?: string | null, sourcePackage?: string | null, isFeatured: boolean, objects: Array<{ __typename?: 'MarketplaceAppObject', universalIdentifier: string, nameSingular: string, namePlural: string, labelSingular: string, labelPlural: string, description?: string | null, icon?: string | null, fields: Array<{ __typename?: 'MarketplaceAppField', universalIdentifier?: string | null, name: string, type: string, label: string, description?: string | null, icon?: string | null }> }>, fields: Array<{ __typename?: 'MarketplaceAppField', name: string, type: string, label: string, description?: string | null, icon?: string | null, objectUniversalIdentifier?: string | null }>, logicFunctions: Array<{ __typename?: 'MarketplaceAppLogicFunction', name: string, description?: string | null, timeoutSeconds?: number | null }>, frontComponents: Array<{ __typename?: 'MarketplaceAppFrontComponent', name: string, description?: string | null }>, defaultRole?: { __typename?: 'MarketplaceAppDefaultRole', id: string, label: string, description?: string | null, canReadAllObjectRecords: boolean, canUpdateAllObjectRecords: boolean, canSoftDeleteAllObjectRecords: boolean, canDestroyAllObjectRecords: boolean, canUpdateAllSettings: boolean, canAccessAllTools: boolean, permissionFlags: Array, objectPermissions: Array<{ __typename?: 'MarketplaceAppRoleObjectPermission', objectUniversalIdentifier: string, canReadObjectRecords?: boolean | null, canUpdateObjectRecords?: boolean | null, canSoftDeleteObjectRecords?: boolean | null, canDestroyObjectRecords?: boolean | null }>, fieldPermissions: Array<{ __typename?: 'MarketplaceAppRoleFieldPermission', objectUniversalIdentifier: string, fieldUniversalIdentifier: string, canReadFieldValue?: boolean | null, canUpdateFieldValue?: boolean | null }> } | null };
+export type MarketplaceAppDetailFieldsFragment = { __typename?: 'MarketplaceAppDetail', id: string, universalIdentifier: string, name: string, sourceType: ApplicationRegistrationSourceType, sourcePackage?: string | null, latestAvailableVersion?: string | null, isListed: boolean, isFeatured: boolean, manifest?: any | null };
+
+export type MarketplaceAppFieldsFragment = { __typename?: 'MarketplaceApp', id: string, name: string, description: string, icon: string, author: string, category: string, logo?: string | null, sourcePackage?: string | null, isFeatured: boolean };
export type InstallMarketplaceAppMutationVariables = Exact<{
universalIdentifier: Scalars['String'];
@@ -6760,14 +6687,14 @@ export type UpgradeApplicationMutation = { __typename?: 'Mutation', upgradeAppli
export type FindManyMarketplaceAppsQueryVariables = Exact<{ [key: string]: never; }>;
-export type FindManyMarketplaceAppsQuery = { __typename?: 'Query', findManyMarketplaceApps: Array<{ __typename?: 'MarketplaceApp', id: string, name: string, description: string, icon: string, version: string, author: string, category: string, logo?: string | null, screenshots: Array, aboutDescription: string, providers: Array, websiteUrl?: string | null, termsUrl?: string | null, sourcePackage?: string | null, isFeatured: boolean, objects: Array<{ __typename?: 'MarketplaceAppObject', universalIdentifier: string, nameSingular: string, namePlural: string, labelSingular: string, labelPlural: string, description?: string | null, icon?: string | null, fields: Array<{ __typename?: 'MarketplaceAppField', universalIdentifier?: string | null, name: string, type: string, label: string, description?: string | null, icon?: string | null }> }>, fields: Array<{ __typename?: 'MarketplaceAppField', name: string, type: string, label: string, description?: string | null, icon?: string | null, objectUniversalIdentifier?: string | null }>, logicFunctions: Array<{ __typename?: 'MarketplaceAppLogicFunction', name: string, description?: string | null, timeoutSeconds?: number | null }>, frontComponents: Array<{ __typename?: 'MarketplaceAppFrontComponent', name: string, description?: string | null }>, defaultRole?: { __typename?: 'MarketplaceAppDefaultRole', id: string, label: string, description?: string | null, canReadAllObjectRecords: boolean, canUpdateAllObjectRecords: boolean, canSoftDeleteAllObjectRecords: boolean, canDestroyAllObjectRecords: boolean, canUpdateAllSettings: boolean, canAccessAllTools: boolean, permissionFlags: Array, objectPermissions: Array<{ __typename?: 'MarketplaceAppRoleObjectPermission', objectUniversalIdentifier: string, canReadObjectRecords?: boolean | null, canUpdateObjectRecords?: boolean | null, canSoftDeleteObjectRecords?: boolean | null, canDestroyObjectRecords?: boolean | null }>, fieldPermissions: Array<{ __typename?: 'MarketplaceAppRoleFieldPermission', objectUniversalIdentifier: string, fieldUniversalIdentifier: string, canReadFieldValue?: boolean | null, canUpdateFieldValue?: boolean | null }> } | null }> };
+export type FindManyMarketplaceAppsQuery = { __typename?: 'Query', findManyMarketplaceApps: Array<{ __typename?: 'MarketplaceApp', id: string, name: string, description: string, icon: string, author: string, category: string, logo?: string | null, sourcePackage?: string | null, isFeatured: boolean }> };
-export type FindOneMarketplaceAppQueryVariables = Exact<{
+export type FindMarketplaceAppDetailQueryVariables = Exact<{
universalIdentifier: Scalars['String'];
}>;
-export type FindOneMarketplaceAppQuery = { __typename?: 'Query', findOneMarketplaceApp: { __typename?: 'MarketplaceApp', id: string, name: string, description: string, icon: string, version: string, author: string, category: string, logo?: string | null, screenshots: Array, aboutDescription: string, providers: Array, websiteUrl?: string | null, termsUrl?: string | null, sourcePackage?: string | null, isFeatured: boolean, objects: Array<{ __typename?: 'MarketplaceAppObject', universalIdentifier: string, nameSingular: string, namePlural: string, labelSingular: string, labelPlural: string, description?: string | null, icon?: string | null, fields: Array<{ __typename?: 'MarketplaceAppField', universalIdentifier?: string | null, name: string, type: string, label: string, description?: string | null, icon?: string | null }> }>, fields: Array<{ __typename?: 'MarketplaceAppField', name: string, type: string, label: string, description?: string | null, icon?: string | null, objectUniversalIdentifier?: string | null }>, logicFunctions: Array<{ __typename?: 'MarketplaceAppLogicFunction', name: string, description?: string | null, timeoutSeconds?: number | null }>, frontComponents: Array<{ __typename?: 'MarketplaceAppFrontComponent', name: string, description?: string | null }>, defaultRole?: { __typename?: 'MarketplaceAppDefaultRole', id: string, label: string, description?: string | null, canReadAllObjectRecords: boolean, canUpdateAllObjectRecords: boolean, canSoftDeleteAllObjectRecords: boolean, canDestroyAllObjectRecords: boolean, canUpdateAllSettings: boolean, canAccessAllTools: boolean, permissionFlags: Array, objectPermissions: Array<{ __typename?: 'MarketplaceAppRoleObjectPermission', objectUniversalIdentifier: string, canReadObjectRecords?: boolean | null, canUpdateObjectRecords?: boolean | null, canSoftDeleteObjectRecords?: boolean | null, canDestroyObjectRecords?: boolean | null }>, fieldPermissions: Array<{ __typename?: 'MarketplaceAppRoleFieldPermission', objectUniversalIdentifier: string, fieldUniversalIdentifier: string, canReadFieldValue?: boolean | null, canUpdateFieldValue?: boolean | null }> } | null } };
+export type FindMarketplaceAppDetailQuery = { __typename?: 'Query', findMarketplaceAppDetail: { __typename?: 'MarketplaceAppDetail', id: string, universalIdentifier: string, name: string, sourceType: ApplicationRegistrationSourceType, sourcePackage?: string | null, latestAvailableVersion?: string | null, isListed: boolean, isFeatured: boolean, manifest?: any | null } };
export type NavigationMenuItemFieldsFragment = { __typename?: 'NavigationMenuItem', id: string, type: NavigationMenuItemType, userWorkspaceId?: string | null, targetRecordId?: string | null, targetObjectMetadataId?: string | null, viewId?: string | null, folderId?: string | null, name?: string | null, link?: string | null, icon?: string | null, color?: string | null, position: number, applicationId?: string | null, createdAt: string, updatedAt: string };
@@ -7093,7 +7020,7 @@ export type GetModelsDevSuggestionsQuery = { __typename?: 'Query', getModelsDevS
export type FindAllApplicationRegistrationsQueryVariables = Exact<{ [key: string]: never; }>;
-export type FindAllApplicationRegistrationsQuery = { __typename?: 'Query', findAllApplicationRegistrations: Array<{ __typename?: 'ApplicationRegistration', id: string, universalIdentifier: string, name: string, description?: string | null, logoUrl?: string | null, author?: string | null, oAuthClientId: string, oAuthRedirectUris: Array, oAuthScopes: Array, sourceType: ApplicationRegistrationSourceType, sourcePackage?: string | null, latestAvailableVersion?: string | null, websiteUrl?: string | null, termsUrl?: string | null, isListed: boolean, isFeatured: boolean, ownerWorkspaceId?: string | null, createdAt: string, updatedAt: string }> };
+export type FindAllApplicationRegistrationsQuery = { __typename?: 'Query', findAllApplicationRegistrations: Array<{ __typename?: 'ApplicationRegistration', id: string, universalIdentifier: string, name: string, oAuthClientId: string, oAuthRedirectUris: Array, oAuthScopes: Array, sourceType: ApplicationRegistrationSourceType, sourcePackage?: string | null, latestAvailableVersion?: string | null, isListed: boolean, isFeatured: boolean, ownerWorkspaceId?: string | null, createdAt: string, updatedAt: string }> };
export type CreateDatabaseConfigVariableMutationVariables = Exact<{
key: Scalars['String'];
@@ -7197,7 +7124,7 @@ export type GetSystemHealthStatusQueryVariables = Exact<{ [key: string]: never;
export type GetSystemHealthStatusQuery = { __typename?: 'Query', getSystemHealthStatus: { __typename?: 'SystemHealth', services: Array<{ __typename?: 'SystemHealthService', id: HealthIndicatorId, label: string, status: AdminPanelHealthServiceStatus }> } };
-export type ApplicationRegistrationFragmentFragment = { __typename?: 'ApplicationRegistration', id: string, universalIdentifier: string, name: string, description?: string | null, logoUrl?: string | null, author?: string | null, oAuthClientId: string, oAuthRedirectUris: Array, oAuthScopes: Array, sourceType: ApplicationRegistrationSourceType, sourcePackage?: string | null, latestAvailableVersion?: string | null, websiteUrl?: string | null, termsUrl?: string | null, isListed: boolean, isFeatured: boolean, ownerWorkspaceId?: string | null, createdAt: string, updatedAt: string };
+export type ApplicationRegistrationFragmentFragment = { __typename?: 'ApplicationRegistration', id: string, universalIdentifier: string, name: string, oAuthClientId: string, oAuthRedirectUris: Array, oAuthScopes: Array, sourceType: ApplicationRegistrationSourceType, sourcePackage?: string | null, latestAvailableVersion?: string | null, isListed: boolean, isFeatured: boolean, ownerWorkspaceId?: string | null, createdAt: string, updatedAt: string };
export type DeleteApplicationRegistrationMutationVariables = Exact<{
id: Scalars['String'];
@@ -7226,7 +7153,7 @@ export type UpdateApplicationRegistrationMutationVariables = Exact<{
}>;
-export type UpdateApplicationRegistrationMutation = { __typename?: 'Mutation', updateApplicationRegistration: { __typename?: 'ApplicationRegistration', id: string, universalIdentifier: string, name: string, description?: string | null, logoUrl?: string | null, author?: string | null, oAuthClientId: string, oAuthRedirectUris: Array, oAuthScopes: Array, sourceType: ApplicationRegistrationSourceType, sourcePackage?: string | null, latestAvailableVersion?: string | null, websiteUrl?: string | null, termsUrl?: string | null, isListed: boolean, isFeatured: boolean, ownerWorkspaceId?: string | null, createdAt: string, updatedAt: string } };
+export type UpdateApplicationRegistrationMutation = { __typename?: 'Mutation', updateApplicationRegistration: { __typename?: 'ApplicationRegistration', id: string, universalIdentifier: string, name: string, oAuthClientId: string, oAuthRedirectUris: Array, oAuthScopes: Array, sourceType: ApplicationRegistrationSourceType, sourcePackage?: string | null, latestAvailableVersion?: string | null, isListed: boolean, isFeatured: boolean, ownerWorkspaceId?: string | null, createdAt: string, updatedAt: string } };
export type UpdateApplicationRegistrationVariableMutationVariables = Exact<{
input: UpdateApplicationRegistrationVariableInput;
@@ -7259,14 +7186,21 @@ export type FindApplicationRegistrationVariablesQuery = { __typename?: 'Query',
export type FindManyApplicationRegistrationsQueryVariables = Exact<{ [key: string]: never; }>;
-export type FindManyApplicationRegistrationsQuery = { __typename?: 'Query', findManyApplicationRegistrations: Array<{ __typename?: 'ApplicationRegistration', id: string, universalIdentifier: string, name: string, description?: string | null, logoUrl?: string | null, author?: string | null, oAuthClientId: string, oAuthRedirectUris: Array, oAuthScopes: Array, sourceType: ApplicationRegistrationSourceType, sourcePackage?: string | null, latestAvailableVersion?: string | null, websiteUrl?: string | null, termsUrl?: string | null, isListed: boolean, isFeatured: boolean, ownerWorkspaceId?: string | null, createdAt: string, updatedAt: string }> };
+export type FindManyApplicationRegistrationsQuery = { __typename?: 'Query', findManyApplicationRegistrations: Array<{ __typename?: 'ApplicationRegistration', id: string, universalIdentifier: string, name: string, oAuthClientId: string, oAuthRedirectUris: Array, oAuthScopes: Array, sourceType: ApplicationRegistrationSourceType, sourcePackage?: string | null, latestAvailableVersion?: string | null, isListed: boolean, isFeatured: boolean, ownerWorkspaceId?: string | null, createdAt: string, updatedAt: string }> };
export type FindOneApplicationRegistrationQueryVariables = Exact<{
id: Scalars['String'];
}>;
-export type FindOneApplicationRegistrationQuery = { __typename?: 'Query', findOneApplicationRegistration: { __typename?: 'ApplicationRegistration', id: string, universalIdentifier: string, name: string, description?: string | null, logoUrl?: string | null, author?: string | null, oAuthClientId: string, oAuthRedirectUris: Array, oAuthScopes: Array, sourceType: ApplicationRegistrationSourceType, sourcePackage?: string | null, latestAvailableVersion?: string | null, websiteUrl?: string | null, termsUrl?: string | null, isListed: boolean, isFeatured: boolean, ownerWorkspaceId?: string | null, createdAt: string, updatedAt: string } };
+export type FindOneApplicationRegistrationQuery = { __typename?: 'Query', findOneApplicationRegistration: { __typename?: 'ApplicationRegistration', id: string, universalIdentifier: string, name: string, oAuthClientId: string, oAuthRedirectUris: Array, oAuthScopes: Array, sourceType: ApplicationRegistrationSourceType, sourcePackage?: string | null, latestAvailableVersion?: string | null, isListed: boolean, isFeatured: boolean, ownerWorkspaceId?: string | null, createdAt: string, updatedAt: string } };
+
+export type GetApplicationShareLinkQueryVariables = Exact<{
+ id: Scalars['String'];
+}>;
+
+
+export type GetApplicationShareLinkQuery = { __typename?: 'Query', getApplicationShareLink: string };
export type UninstallApplicationMutationVariables = Exact<{
universalIdentifier: Scalars['String'];
@@ -8134,10 +8068,11 @@ export const CommandMenuItemFieldsFragmentDoc = {"kind":"Document","definitions"
export const PageLayoutWidgetFragmentFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"PageLayoutWidgetFragment"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"PageLayoutWidget"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"objectMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"isOverridden"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"deletedAt"}},{"kind":"Field","name":{"kind":"Name","value":"conditionalDisplay"}},{"kind":"Field","name":{"kind":"Name","value":"gridPosition"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"column"}},{"kind":"Field","name":{"kind":"Name","value":"columnSpan"}},{"kind":"Field","name":{"kind":"Name","value":"row"}},{"kind":"Field","name":{"kind":"Name","value":"rowSpan"}}]}},{"kind":"Field","name":{"kind":"Name","value":"position"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"PageLayoutWidgetGridPosition"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"layoutMode"}},{"kind":"Field","name":{"kind":"Name","value":"row"}},{"kind":"Field","name":{"kind":"Name","value":"column"}},{"kind":"Field","name":{"kind":"Name","value":"rowSpan"}},{"kind":"Field","name":{"kind":"Name","value":"columnSpan"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"PageLayoutWidgetVerticalListPosition"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"layoutMode"}},{"kind":"Field","name":{"kind":"Name","value":"index"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"PageLayoutWidgetCanvasPosition"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"layoutMode"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"configuration"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"BarChartConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}},{"kind":"Field","name":{"kind":"Name","value":"aggregateFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"aggregateOperation"}},{"kind":"Field","name":{"kind":"Name","value":"primaryAxisGroupByFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"primaryAxisGroupBySubFieldName"}},{"kind":"Field","name":{"kind":"Name","value":"primaryAxisDateGranularity"}},{"kind":"Field","name":{"kind":"Name","value":"primaryAxisOrderBy"}},{"kind":"Field","name":{"kind":"Name","value":"primaryAxisManualSortOrder"}},{"kind":"Field","name":{"kind":"Name","value":"secondaryAxisGroupByFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"secondaryAxisGroupBySubFieldName"}},{"kind":"Field","name":{"kind":"Name","value":"secondaryAxisGroupByDateGranularity"}},{"kind":"Field","name":{"kind":"Name","value":"secondaryAxisOrderBy"}},{"kind":"Field","name":{"kind":"Name","value":"secondaryAxisManualSortOrder"}},{"kind":"Field","name":{"kind":"Name","value":"omitNullValues"}},{"kind":"Field","name":{"kind":"Name","value":"axisNameDisplay"}},{"kind":"Field","name":{"kind":"Name","value":"displayDataLabel"}},{"kind":"Field","name":{"kind":"Name","value":"displayLegend"}},{"kind":"Field","name":{"kind":"Name","value":"rangeMin"}},{"kind":"Field","name":{"kind":"Name","value":"rangeMax"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"filter"}},{"kind":"Field","name":{"kind":"Name","value":"groupMode"}},{"kind":"Field","name":{"kind":"Name","value":"layout"}},{"kind":"Field","name":{"kind":"Name","value":"isCumulative"}},{"kind":"Field","name":{"kind":"Name","value":"splitMultiValueFields"}},{"kind":"Field","name":{"kind":"Name","value":"timezone"}},{"kind":"Field","name":{"kind":"Name","value":"firstDayOfTheWeek"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"LineChartConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}},{"kind":"Field","name":{"kind":"Name","value":"aggregateFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"aggregateOperation"}},{"kind":"Field","name":{"kind":"Name","value":"primaryAxisGroupByFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"primaryAxisGroupBySubFieldName"}},{"kind":"Field","name":{"kind":"Name","value":"primaryAxisDateGranularity"}},{"kind":"Field","name":{"kind":"Name","value":"primaryAxisOrderBy"}},{"kind":"Field","name":{"kind":"Name","value":"primaryAxisManualSortOrder"}},{"kind":"Field","name":{"kind":"Name","value":"secondaryAxisGroupByFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"secondaryAxisGroupBySubFieldName"}},{"kind":"Field","name":{"kind":"Name","value":"secondaryAxisGroupByDateGranularity"}},{"kind":"Field","name":{"kind":"Name","value":"secondaryAxisOrderBy"}},{"kind":"Field","name":{"kind":"Name","value":"secondaryAxisManualSortOrder"}},{"kind":"Field","name":{"kind":"Name","value":"omitNullValues"}},{"kind":"Field","name":{"kind":"Name","value":"axisNameDisplay"}},{"kind":"Field","name":{"kind":"Name","value":"displayDataLabel"}},{"kind":"Field","name":{"kind":"Name","value":"displayLegend"}},{"kind":"Field","name":{"kind":"Name","value":"rangeMin"}},{"kind":"Field","name":{"kind":"Name","value":"rangeMax"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"filter"}},{"kind":"Field","name":{"kind":"Name","value":"isStacked"}},{"kind":"Field","name":{"kind":"Name","value":"isCumulative"}},{"kind":"Field","name":{"kind":"Name","value":"splitMultiValueFields"}},{"kind":"Field","name":{"kind":"Name","value":"timezone"}},{"kind":"Field","name":{"kind":"Name","value":"firstDayOfTheWeek"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"PieChartConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}},{"kind":"Field","name":{"kind":"Name","value":"groupByFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"aggregateFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"aggregateOperation"}},{"kind":"Field","name":{"kind":"Name","value":"groupBySubFieldName"}},{"kind":"Field","name":{"kind":"Name","value":"dateGranularity"}},{"kind":"Field","name":{"kind":"Name","value":"orderBy"}},{"kind":"Field","name":{"kind":"Name","value":"manualSortOrder"}},{"kind":"Field","name":{"kind":"Name","value":"displayDataLabel"}},{"kind":"Field","name":{"kind":"Name","value":"showCenterMetric"}},{"kind":"Field","name":{"kind":"Name","value":"displayLegend"}},{"kind":"Field","name":{"kind":"Name","value":"hideEmptyCategory"}},{"kind":"Field","name":{"kind":"Name","value":"splitMultiValueFields"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"filter"}},{"kind":"Field","name":{"kind":"Name","value":"timezone"}},{"kind":"Field","name":{"kind":"Name","value":"firstDayOfTheWeek"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AggregateChartConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}},{"kind":"Field","name":{"kind":"Name","value":"aggregateFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"aggregateOperation"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"displayDataLabel"}},{"kind":"Field","name":{"kind":"Name","value":"format"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"filter"}},{"kind":"Field","name":{"kind":"Name","value":"prefix"}},{"kind":"Field","name":{"kind":"Name","value":"suffix"}},{"kind":"Field","name":{"kind":"Name","value":"timezone"}},{"kind":"Field","name":{"kind":"Name","value":"firstDayOfTheWeek"}},{"kind":"Field","name":{"kind":"Name","value":"ratioAggregateConfig"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"fieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"optionValue"}}]}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"GaugeChartConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}},{"kind":"Field","name":{"kind":"Name","value":"aggregateFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"aggregateOperation"}},{"kind":"Field","name":{"kind":"Name","value":"displayDataLabel"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"filter"}},{"kind":"Field","name":{"kind":"Name","value":"timezone"}},{"kind":"Field","name":{"kind":"Name","value":"firstDayOfTheWeek"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"IframeConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}},{"kind":"Field","name":{"kind":"Name","value":"url"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"StandaloneRichTextConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}},{"kind":"Field","name":{"kind":"Name","value":"body"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"blocknote"}},{"kind":"Field","name":{"kind":"Name","value":"markdown"}}]}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CalendarConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"EmailsConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"FieldConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}},{"kind":"Field","name":{"kind":"Name","value":"fieldDisplayMode"}},{"kind":"Field","name":{"kind":"Name","value":"fieldMetadataId"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"FieldRichTextConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"FieldsConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}},{"kind":"Field","name":{"kind":"Name","value":"viewId"}},{"kind":"Field","name":{"kind":"Name","value":"newFieldDefaultVisibility"}},{"kind":"Field","name":{"kind":"Name","value":"shouldAllowUserToSeeHiddenFields"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"FilesConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"NotesConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"TasksConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"TimelineConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ViewConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"RecordTableConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}},{"kind":"Field","name":{"kind":"Name","value":"viewId"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkflowConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkflowRunConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkflowVersionConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"FrontComponentConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}},{"kind":"Field","name":{"kind":"Name","value":"frontComponentId"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"pageLayoutTabId"}}]}}]} as unknown as DocumentNode;
export const PageLayoutTabFragmentFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"PageLayoutTabFragment"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"PageLayoutTab"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"position"}},{"kind":"Field","name":{"kind":"Name","value":"layoutMode"}},{"kind":"Field","name":{"kind":"Name","value":"isOverridden"}},{"kind":"Field","name":{"kind":"Name","value":"widgets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"PageLayoutWidgetFragment"}}]}},{"kind":"Field","name":{"kind":"Name","value":"pageLayoutId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"PageLayoutWidgetFragment"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"PageLayoutWidget"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"objectMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"isOverridden"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"deletedAt"}},{"kind":"Field","name":{"kind":"Name","value":"conditionalDisplay"}},{"kind":"Field","name":{"kind":"Name","value":"gridPosition"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"column"}},{"kind":"Field","name":{"kind":"Name","value":"columnSpan"}},{"kind":"Field","name":{"kind":"Name","value":"row"}},{"kind":"Field","name":{"kind":"Name","value":"rowSpan"}}]}},{"kind":"Field","name":{"kind":"Name","value":"position"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"PageLayoutWidgetGridPosition"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"layoutMode"}},{"kind":"Field","name":{"kind":"Name","value":"row"}},{"kind":"Field","name":{"kind":"Name","value":"column"}},{"kind":"Field","name":{"kind":"Name","value":"rowSpan"}},{"kind":"Field","name":{"kind":"Name","value":"columnSpan"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"PageLayoutWidgetVerticalListPosition"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"layoutMode"}},{"kind":"Field","name":{"kind":"Name","value":"index"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"PageLayoutWidgetCanvasPosition"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"layoutMode"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"configuration"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"BarChartConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}},{"kind":"Field","name":{"kind":"Name","value":"aggregateFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"aggregateOperation"}},{"kind":"Field","name":{"kind":"Name","value":"primaryAxisGroupByFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"primaryAxisGroupBySubFieldName"}},{"kind":"Field","name":{"kind":"Name","value":"primaryAxisDateGranularity"}},{"kind":"Field","name":{"kind":"Name","value":"primaryAxisOrderBy"}},{"kind":"Field","name":{"kind":"Name","value":"primaryAxisManualSortOrder"}},{"kind":"Field","name":{"kind":"Name","value":"secondaryAxisGroupByFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"secondaryAxisGroupBySubFieldName"}},{"kind":"Field","name":{"kind":"Name","value":"secondaryAxisGroupByDateGranularity"}},{"kind":"Field","name":{"kind":"Name","value":"secondaryAxisOrderBy"}},{"kind":"Field","name":{"kind":"Name","value":"secondaryAxisManualSortOrder"}},{"kind":"Field","name":{"kind":"Name","value":"omitNullValues"}},{"kind":"Field","name":{"kind":"Name","value":"axisNameDisplay"}},{"kind":"Field","name":{"kind":"Name","value":"displayDataLabel"}},{"kind":"Field","name":{"kind":"Name","value":"displayLegend"}},{"kind":"Field","name":{"kind":"Name","value":"rangeMin"}},{"kind":"Field","name":{"kind":"Name","value":"rangeMax"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"filter"}},{"kind":"Field","name":{"kind":"Name","value":"groupMode"}},{"kind":"Field","name":{"kind":"Name","value":"layout"}},{"kind":"Field","name":{"kind":"Name","value":"isCumulative"}},{"kind":"Field","name":{"kind":"Name","value":"splitMultiValueFields"}},{"kind":"Field","name":{"kind":"Name","value":"timezone"}},{"kind":"Field","name":{"kind":"Name","value":"firstDayOfTheWeek"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"LineChartConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}},{"kind":"Field","name":{"kind":"Name","value":"aggregateFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"aggregateOperation"}},{"kind":"Field","name":{"kind":"Name","value":"primaryAxisGroupByFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"primaryAxisGroupBySubFieldName"}},{"kind":"Field","name":{"kind":"Name","value":"primaryAxisDateGranularity"}},{"kind":"Field","name":{"kind":"Name","value":"primaryAxisOrderBy"}},{"kind":"Field","name":{"kind":"Name","value":"primaryAxisManualSortOrder"}},{"kind":"Field","name":{"kind":"Name","value":"secondaryAxisGroupByFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"secondaryAxisGroupBySubFieldName"}},{"kind":"Field","name":{"kind":"Name","value":"secondaryAxisGroupByDateGranularity"}},{"kind":"Field","name":{"kind":"Name","value":"secondaryAxisOrderBy"}},{"kind":"Field","name":{"kind":"Name","value":"secondaryAxisManualSortOrder"}},{"kind":"Field","name":{"kind":"Name","value":"omitNullValues"}},{"kind":"Field","name":{"kind":"Name","value":"axisNameDisplay"}},{"kind":"Field","name":{"kind":"Name","value":"displayDataLabel"}},{"kind":"Field","name":{"kind":"Name","value":"displayLegend"}},{"kind":"Field","name":{"kind":"Name","value":"rangeMin"}},{"kind":"Field","name":{"kind":"Name","value":"rangeMax"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"filter"}},{"kind":"Field","name":{"kind":"Name","value":"isStacked"}},{"kind":"Field","name":{"kind":"Name","value":"isCumulative"}},{"kind":"Field","name":{"kind":"Name","value":"splitMultiValueFields"}},{"kind":"Field","name":{"kind":"Name","value":"timezone"}},{"kind":"Field","name":{"kind":"Name","value":"firstDayOfTheWeek"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"PieChartConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}},{"kind":"Field","name":{"kind":"Name","value":"groupByFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"aggregateFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"aggregateOperation"}},{"kind":"Field","name":{"kind":"Name","value":"groupBySubFieldName"}},{"kind":"Field","name":{"kind":"Name","value":"dateGranularity"}},{"kind":"Field","name":{"kind":"Name","value":"orderBy"}},{"kind":"Field","name":{"kind":"Name","value":"manualSortOrder"}},{"kind":"Field","name":{"kind":"Name","value":"displayDataLabel"}},{"kind":"Field","name":{"kind":"Name","value":"showCenterMetric"}},{"kind":"Field","name":{"kind":"Name","value":"displayLegend"}},{"kind":"Field","name":{"kind":"Name","value":"hideEmptyCategory"}},{"kind":"Field","name":{"kind":"Name","value":"splitMultiValueFields"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"filter"}},{"kind":"Field","name":{"kind":"Name","value":"timezone"}},{"kind":"Field","name":{"kind":"Name","value":"firstDayOfTheWeek"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AggregateChartConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}},{"kind":"Field","name":{"kind":"Name","value":"aggregateFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"aggregateOperation"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"displayDataLabel"}},{"kind":"Field","name":{"kind":"Name","value":"format"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"filter"}},{"kind":"Field","name":{"kind":"Name","value":"prefix"}},{"kind":"Field","name":{"kind":"Name","value":"suffix"}},{"kind":"Field","name":{"kind":"Name","value":"timezone"}},{"kind":"Field","name":{"kind":"Name","value":"firstDayOfTheWeek"}},{"kind":"Field","name":{"kind":"Name","value":"ratioAggregateConfig"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"fieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"optionValue"}}]}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"GaugeChartConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}},{"kind":"Field","name":{"kind":"Name","value":"aggregateFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"aggregateOperation"}},{"kind":"Field","name":{"kind":"Name","value":"displayDataLabel"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"filter"}},{"kind":"Field","name":{"kind":"Name","value":"timezone"}},{"kind":"Field","name":{"kind":"Name","value":"firstDayOfTheWeek"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"IframeConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}},{"kind":"Field","name":{"kind":"Name","value":"url"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"StandaloneRichTextConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}},{"kind":"Field","name":{"kind":"Name","value":"body"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"blocknote"}},{"kind":"Field","name":{"kind":"Name","value":"markdown"}}]}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CalendarConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"EmailsConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"FieldConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}},{"kind":"Field","name":{"kind":"Name","value":"fieldDisplayMode"}},{"kind":"Field","name":{"kind":"Name","value":"fieldMetadataId"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"FieldRichTextConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"FieldsConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}},{"kind":"Field","name":{"kind":"Name","value":"viewId"}},{"kind":"Field","name":{"kind":"Name","value":"newFieldDefaultVisibility"}},{"kind":"Field","name":{"kind":"Name","value":"shouldAllowUserToSeeHiddenFields"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"FilesConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"NotesConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"TasksConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"TimelineConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ViewConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"RecordTableConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}},{"kind":"Field","name":{"kind":"Name","value":"viewId"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkflowConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkflowRunConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkflowVersionConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"FrontComponentConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}},{"kind":"Field","name":{"kind":"Name","value":"frontComponentId"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"pageLayoutTabId"}}]}}]} as unknown as DocumentNode;
export const PageLayoutFragmentFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"PageLayoutFragment"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"PageLayout"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"objectMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"defaultTabToFocusOnMobileAndSidePanelId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"tabs"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"PageLayoutTabFragment"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"PageLayoutWidgetFragment"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"PageLayoutWidget"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"objectMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"isOverridden"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"deletedAt"}},{"kind":"Field","name":{"kind":"Name","value":"conditionalDisplay"}},{"kind":"Field","name":{"kind":"Name","value":"gridPosition"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"column"}},{"kind":"Field","name":{"kind":"Name","value":"columnSpan"}},{"kind":"Field","name":{"kind":"Name","value":"row"}},{"kind":"Field","name":{"kind":"Name","value":"rowSpan"}}]}},{"kind":"Field","name":{"kind":"Name","value":"position"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"PageLayoutWidgetGridPosition"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"layoutMode"}},{"kind":"Field","name":{"kind":"Name","value":"row"}},{"kind":"Field","name":{"kind":"Name","value":"column"}},{"kind":"Field","name":{"kind":"Name","value":"rowSpan"}},{"kind":"Field","name":{"kind":"Name","value":"columnSpan"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"PageLayoutWidgetVerticalListPosition"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"layoutMode"}},{"kind":"Field","name":{"kind":"Name","value":"index"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"PageLayoutWidgetCanvasPosition"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"layoutMode"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"configuration"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"BarChartConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}},{"kind":"Field","name":{"kind":"Name","value":"aggregateFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"aggregateOperation"}},{"kind":"Field","name":{"kind":"Name","value":"primaryAxisGroupByFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"primaryAxisGroupBySubFieldName"}},{"kind":"Field","name":{"kind":"Name","value":"primaryAxisDateGranularity"}},{"kind":"Field","name":{"kind":"Name","value":"primaryAxisOrderBy"}},{"kind":"Field","name":{"kind":"Name","value":"primaryAxisManualSortOrder"}},{"kind":"Field","name":{"kind":"Name","value":"secondaryAxisGroupByFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"secondaryAxisGroupBySubFieldName"}},{"kind":"Field","name":{"kind":"Name","value":"secondaryAxisGroupByDateGranularity"}},{"kind":"Field","name":{"kind":"Name","value":"secondaryAxisOrderBy"}},{"kind":"Field","name":{"kind":"Name","value":"secondaryAxisManualSortOrder"}},{"kind":"Field","name":{"kind":"Name","value":"omitNullValues"}},{"kind":"Field","name":{"kind":"Name","value":"axisNameDisplay"}},{"kind":"Field","name":{"kind":"Name","value":"displayDataLabel"}},{"kind":"Field","name":{"kind":"Name","value":"displayLegend"}},{"kind":"Field","name":{"kind":"Name","value":"rangeMin"}},{"kind":"Field","name":{"kind":"Name","value":"rangeMax"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"filter"}},{"kind":"Field","name":{"kind":"Name","value":"groupMode"}},{"kind":"Field","name":{"kind":"Name","value":"layout"}},{"kind":"Field","name":{"kind":"Name","value":"isCumulative"}},{"kind":"Field","name":{"kind":"Name","value":"splitMultiValueFields"}},{"kind":"Field","name":{"kind":"Name","value":"timezone"}},{"kind":"Field","name":{"kind":"Name","value":"firstDayOfTheWeek"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"LineChartConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}},{"kind":"Field","name":{"kind":"Name","value":"aggregateFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"aggregateOperation"}},{"kind":"Field","name":{"kind":"Name","value":"primaryAxisGroupByFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"primaryAxisGroupBySubFieldName"}},{"kind":"Field","name":{"kind":"Name","value":"primaryAxisDateGranularity"}},{"kind":"Field","name":{"kind":"Name","value":"primaryAxisOrderBy"}},{"kind":"Field","name":{"kind":"Name","value":"primaryAxisManualSortOrder"}},{"kind":"Field","name":{"kind":"Name","value":"secondaryAxisGroupByFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"secondaryAxisGroupBySubFieldName"}},{"kind":"Field","name":{"kind":"Name","value":"secondaryAxisGroupByDateGranularity"}},{"kind":"Field","name":{"kind":"Name","value":"secondaryAxisOrderBy"}},{"kind":"Field","name":{"kind":"Name","value":"secondaryAxisManualSortOrder"}},{"kind":"Field","name":{"kind":"Name","value":"omitNullValues"}},{"kind":"Field","name":{"kind":"Name","value":"axisNameDisplay"}},{"kind":"Field","name":{"kind":"Name","value":"displayDataLabel"}},{"kind":"Field","name":{"kind":"Name","value":"displayLegend"}},{"kind":"Field","name":{"kind":"Name","value":"rangeMin"}},{"kind":"Field","name":{"kind":"Name","value":"rangeMax"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"filter"}},{"kind":"Field","name":{"kind":"Name","value":"isStacked"}},{"kind":"Field","name":{"kind":"Name","value":"isCumulative"}},{"kind":"Field","name":{"kind":"Name","value":"splitMultiValueFields"}},{"kind":"Field","name":{"kind":"Name","value":"timezone"}},{"kind":"Field","name":{"kind":"Name","value":"firstDayOfTheWeek"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"PieChartConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}},{"kind":"Field","name":{"kind":"Name","value":"groupByFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"aggregateFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"aggregateOperation"}},{"kind":"Field","name":{"kind":"Name","value":"groupBySubFieldName"}},{"kind":"Field","name":{"kind":"Name","value":"dateGranularity"}},{"kind":"Field","name":{"kind":"Name","value":"orderBy"}},{"kind":"Field","name":{"kind":"Name","value":"manualSortOrder"}},{"kind":"Field","name":{"kind":"Name","value":"displayDataLabel"}},{"kind":"Field","name":{"kind":"Name","value":"showCenterMetric"}},{"kind":"Field","name":{"kind":"Name","value":"displayLegend"}},{"kind":"Field","name":{"kind":"Name","value":"hideEmptyCategory"}},{"kind":"Field","name":{"kind":"Name","value":"splitMultiValueFields"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"filter"}},{"kind":"Field","name":{"kind":"Name","value":"timezone"}},{"kind":"Field","name":{"kind":"Name","value":"firstDayOfTheWeek"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"AggregateChartConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}},{"kind":"Field","name":{"kind":"Name","value":"aggregateFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"aggregateOperation"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"displayDataLabel"}},{"kind":"Field","name":{"kind":"Name","value":"format"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"filter"}},{"kind":"Field","name":{"kind":"Name","value":"prefix"}},{"kind":"Field","name":{"kind":"Name","value":"suffix"}},{"kind":"Field","name":{"kind":"Name","value":"timezone"}},{"kind":"Field","name":{"kind":"Name","value":"firstDayOfTheWeek"}},{"kind":"Field","name":{"kind":"Name","value":"ratioAggregateConfig"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"fieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"optionValue"}}]}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"GaugeChartConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}},{"kind":"Field","name":{"kind":"Name","value":"aggregateFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"aggregateOperation"}},{"kind":"Field","name":{"kind":"Name","value":"displayDataLabel"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"filter"}},{"kind":"Field","name":{"kind":"Name","value":"timezone"}},{"kind":"Field","name":{"kind":"Name","value":"firstDayOfTheWeek"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"IframeConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}},{"kind":"Field","name":{"kind":"Name","value":"url"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"StandaloneRichTextConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}},{"kind":"Field","name":{"kind":"Name","value":"body"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"blocknote"}},{"kind":"Field","name":{"kind":"Name","value":"markdown"}}]}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CalendarConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"EmailsConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"FieldConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}},{"kind":"Field","name":{"kind":"Name","value":"fieldDisplayMode"}},{"kind":"Field","name":{"kind":"Name","value":"fieldMetadataId"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"FieldRichTextConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"FieldsConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}},{"kind":"Field","name":{"kind":"Name","value":"viewId"}},{"kind":"Field","name":{"kind":"Name","value":"newFieldDefaultVisibility"}},{"kind":"Field","name":{"kind":"Name","value":"shouldAllowUserToSeeHiddenFields"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"FilesConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"NotesConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"TasksConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"TimelineConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ViewConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"RecordTableConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}},{"kind":"Field","name":{"kind":"Name","value":"viewId"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkflowConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkflowRunConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"WorkflowVersionConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"FrontComponentConfiguration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"configurationType"}},{"kind":"Field","name":{"kind":"Name","value":"frontComponentId"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"pageLayoutTabId"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"PageLayoutTabFragment"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"PageLayoutTab"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"position"}},{"kind":"Field","name":{"kind":"Name","value":"layoutMode"}},{"kind":"Field","name":{"kind":"Name","value":"isOverridden"}},{"kind":"Field","name":{"kind":"Name","value":"widgets"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"PageLayoutWidgetFragment"}}]}},{"kind":"Field","name":{"kind":"Name","value":"pageLayoutId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]} as unknown as DocumentNode;
-export const MarketplaceAppFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MarketplaceAppFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"MarketplaceApp"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"author"}},{"kind":"Field","name":{"kind":"Name","value":"category"}},{"kind":"Field","name":{"kind":"Name","value":"logo"}},{"kind":"Field","name":{"kind":"Name","value":"screenshots"}},{"kind":"Field","name":{"kind":"Name","value":"aboutDescription"}},{"kind":"Field","name":{"kind":"Name","value":"providers"}},{"kind":"Field","name":{"kind":"Name","value":"websiteUrl"}},{"kind":"Field","name":{"kind":"Name","value":"termsUrl"}},{"kind":"Field","name":{"kind":"Name","value":"objects"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}},{"kind":"Field","name":{"kind":"Name","value":"labelSingular"}},{"kind":"Field","name":{"kind":"Name","value":"labelPlural"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"fields"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"fields"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"objectUniversalIdentifier"}}]}},{"kind":"Field","name":{"kind":"Name","value":"logicFunctions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"timeoutSeconds"}}]}},{"kind":"Field","name":{"kind":"Name","value":"frontComponents"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sourcePackage"}},{"kind":"Field","name":{"kind":"Name","value":"isFeatured"}},{"kind":"Field","name":{"kind":"Name","value":"defaultRole"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"canReadAllObjectRecords"}},{"kind":"Field","name":{"kind":"Name","value":"canUpdateAllObjectRecords"}},{"kind":"Field","name":{"kind":"Name","value":"canSoftDeleteAllObjectRecords"}},{"kind":"Field","name":{"kind":"Name","value":"canDestroyAllObjectRecords"}},{"kind":"Field","name":{"kind":"Name","value":"canUpdateAllSettings"}},{"kind":"Field","name":{"kind":"Name","value":"canAccessAllTools"}},{"kind":"Field","name":{"kind":"Name","value":"objectPermissions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"objectUniversalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"canReadObjectRecords"}},{"kind":"Field","name":{"kind":"Name","value":"canUpdateObjectRecords"}},{"kind":"Field","name":{"kind":"Name","value":"canSoftDeleteObjectRecords"}},{"kind":"Field","name":{"kind":"Name","value":"canDestroyObjectRecords"}}]}},{"kind":"Field","name":{"kind":"Name","value":"fieldPermissions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"objectUniversalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"fieldUniversalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"canReadFieldValue"}},{"kind":"Field","name":{"kind":"Name","value":"canUpdateFieldValue"}}]}},{"kind":"Field","name":{"kind":"Name","value":"permissionFlags"}}]}}]}}]} as unknown as DocumentNode;
+export const MarketplaceAppDetailFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MarketplaceAppDetailFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"MarketplaceAppDetail"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"sourceType"}},{"kind":"Field","name":{"kind":"Name","value":"sourcePackage"}},{"kind":"Field","name":{"kind":"Name","value":"latestAvailableVersion"}},{"kind":"Field","name":{"kind":"Name","value":"isListed"}},{"kind":"Field","name":{"kind":"Name","value":"isFeatured"}},{"kind":"Field","name":{"kind":"Name","value":"manifest"}}]}}]} as unknown as DocumentNode;
+export const MarketplaceAppFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MarketplaceAppFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"MarketplaceApp"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"author"}},{"kind":"Field","name":{"kind":"Name","value":"category"}},{"kind":"Field","name":{"kind":"Name","value":"logo"}},{"kind":"Field","name":{"kind":"Name","value":"sourcePackage"}},{"kind":"Field","name":{"kind":"Name","value":"isFeatured"}}]}}]} as unknown as DocumentNode;
export const NavigationMenuItemFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"NavigationMenuItemFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"NavigationMenuItem"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"userWorkspaceId"}},{"kind":"Field","name":{"kind":"Name","value":"targetRecordId"}},{"kind":"Field","name":{"kind":"Name","value":"targetObjectMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"viewId"}},{"kind":"Field","name":{"kind":"Name","value":"folderId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"link"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"position"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]} as unknown as DocumentNode;
export const NavigationMenuItemQueryFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"NavigationMenuItemQueryFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"NavigationMenuItem"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"NavigationMenuItemFields"}},{"kind":"Field","name":{"kind":"Name","value":"targetRecordIdentifier"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"labelIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"imageIdentifier"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"NavigationMenuItemFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"NavigationMenuItem"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"userWorkspaceId"}},{"kind":"Field","name":{"kind":"Name","value":"targetRecordId"}},{"kind":"Field","name":{"kind":"Name","value":"targetObjectMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"viewId"}},{"kind":"Field","name":{"kind":"Name","value":"folderId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"link"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"position"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]} as unknown as DocumentNode;
-export const ApplicationRegistrationFragmentFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ApplicationRegistrationFragment"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ApplicationRegistration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"logoUrl"}},{"kind":"Field","name":{"kind":"Name","value":"author"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthClientId"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthRedirectUris"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthScopes"}},{"kind":"Field","name":{"kind":"Name","value":"sourceType"}},{"kind":"Field","name":{"kind":"Name","value":"sourcePackage"}},{"kind":"Field","name":{"kind":"Name","value":"latestAvailableVersion"}},{"kind":"Field","name":{"kind":"Name","value":"websiteUrl"}},{"kind":"Field","name":{"kind":"Name","value":"termsUrl"}},{"kind":"Field","name":{"kind":"Name","value":"isListed"}},{"kind":"Field","name":{"kind":"Name","value":"isFeatured"}},{"kind":"Field","name":{"kind":"Name","value":"ownerWorkspaceId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]} as unknown as DocumentNode;
+export const ApplicationRegistrationFragmentFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ApplicationRegistrationFragment"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ApplicationRegistration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthClientId"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthRedirectUris"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthScopes"}},{"kind":"Field","name":{"kind":"Name","value":"sourceType"}},{"kind":"Field","name":{"kind":"Name","value":"sourcePackage"}},{"kind":"Field","name":{"kind":"Name","value":"latestAvailableVersion"}},{"kind":"Field","name":{"kind":"Name","value":"isListed"}},{"kind":"Field","name":{"kind":"Name","value":"isFeatured"}},{"kind":"Field","name":{"kind":"Name","value":"ownerWorkspaceId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]} as unknown as DocumentNode;
export const BillingPriceLicensedFragmentFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"BillingPriceLicensedFragment"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"BillingPriceLicensed"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"stripePriceId"}},{"kind":"Field","name":{"kind":"Name","value":"unitAmount"}},{"kind":"Field","name":{"kind":"Name","value":"recurringInterval"}},{"kind":"Field","name":{"kind":"Name","value":"priceUsageType"}}]}}]} as unknown as DocumentNode;
export const BillingPriceMeteredFragmentFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"BillingPriceMeteredFragment"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"BillingPriceMetered"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"priceUsageType"}},{"kind":"Field","name":{"kind":"Name","value":"recurringInterval"}},{"kind":"Field","name":{"kind":"Name","value":"stripePriceId"}},{"kind":"Field","name":{"kind":"Name","value":"tiers"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"flatAmount"}},{"kind":"Field","name":{"kind":"Name","value":"unitAmount"}},{"kind":"Field","name":{"kind":"Name","value":"upTo"}}]}}]}}]} as unknown as DocumentNode;
export const ApiKeyFragmentFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ApiKeyFragment"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ApiKey"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"expiresAt"}},{"kind":"Field","name":{"kind":"Name","value":"revokedAt"}},{"kind":"Field","name":{"kind":"Name","value":"role"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}}]}}]}}]} as unknown as DocumentNode;
@@ -8193,7 +8128,7 @@ export const GetToolInputSchemaDocument = {"kind":"Document","definitions":[{"ki
export const TrackAnalyticsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"TrackAnalytics"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"type"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"AnalyticsType"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"event"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"name"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"properties"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"JSON"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"trackAnalytics"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"type"},"value":{"kind":"Variable","name":{"kind":"Name","value":"type"}}},{"kind":"Argument","name":{"kind":"Name","value":"event"},"value":{"kind":"Variable","name":{"kind":"Name","value":"event"}}},{"kind":"Argument","name":{"kind":"Name","value":"name"},"value":{"kind":"Variable","name":{"kind":"Name","value":"name"}}},{"kind":"Argument","name":{"kind":"Name","value":"properties"},"value":{"kind":"Variable","name":{"kind":"Name","value":"properties"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"success"}}]}}]}}]} as unknown as DocumentNode;
export const FindManyApplicationsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"FindManyApplications"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"findManyApplications"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"applicationRegistrationId"}},{"kind":"Field","name":{"kind":"Name","value":"applicationRegistration"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"latestAvailableVersion"}},{"kind":"Field","name":{"kind":"Name","value":"sourceType"}}]}}]}}]}}]} as unknown as DocumentNode;
export const FindOneApplicationDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"FindOneApplication"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UUID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"findOneApplication"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ApplicationFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AgentFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Agent"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"prompt"}},{"kind":"Field","name":{"kind":"Name","value":"modelId"}},{"kind":"Field","name":{"kind":"Name","value":"responseFormat"}},{"kind":"Field","name":{"kind":"Name","value":"roleId"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"modelConfiguration"}},{"kind":"Field","name":{"kind":"Name","value":"evaluationInputs"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ObjectMetadataFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Object"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}},{"kind":"Field","name":{"kind":"Name","value":"labelSingular"}},{"kind":"Field","name":{"kind":"Name","value":"labelPlural"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"isRemote"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"isUIReadOnly"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"labelIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"imageIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"shortcut"}},{"kind":"Field","name":{"kind":"Name","value":"isLabelSyncedWithName"}},{"kind":"Field","name":{"kind":"Name","value":"isSearchable"}},{"kind":"Field","name":{"kind":"Name","value":"duplicateCriteria"}},{"kind":"Field","name":{"kind":"Name","value":"indexMetadataList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"indexWhereClause"}},{"kind":"Field","name":{"kind":"Name","value":"indexType"}},{"kind":"Field","name":{"kind":"Name","value":"isUnique"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"indexFieldMetadataList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"fieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"order"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"fieldsList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"isUIReadOnly"}},{"kind":"Field","name":{"kind":"Name","value":"isNullable"}},{"kind":"Field","name":{"kind":"Name","value":"isUnique"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"defaultValue"}},{"kind":"Field","name":{"kind":"Name","value":"options"}},{"kind":"Field","name":{"kind":"Name","value":"settings"}},{"kind":"Field","name":{"kind":"Name","value":"isLabelSyncedWithName"}},{"kind":"Field","name":{"kind":"Name","value":"morphId"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"relation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"sourceObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sourceFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"morphRelations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"sourceObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sourceFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"LogicFunctionFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"LogicFunction"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"runtime"}},{"kind":"Field","name":{"kind":"Name","value":"timeoutSeconds"}},{"kind":"Field","name":{"kind":"Name","value":"sourceHandlerPath"}},{"kind":"Field","name":{"kind":"Name","value":"handlerName"}},{"kind":"Field","name":{"kind":"Name","value":"toolInputSchema"}},{"kind":"Field","name":{"kind":"Name","value":"isTool"}},{"kind":"Field","name":{"kind":"Name","value":"cronTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"databaseEventTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"httpRouteTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ApplicationFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Application"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"applicationRegistrationId"}},{"kind":"Field","name":{"kind":"Name","value":"applicationRegistration"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"latestAvailableVersion"}},{"kind":"Field","name":{"kind":"Name","value":"sourceType"}}]}},{"kind":"Field","name":{"kind":"Name","value":"canBeUninstalled"}},{"kind":"Field","name":{"kind":"Name","value":"defaultRoleId"}},{"kind":"Field","name":{"kind":"Name","value":"settingsCustomTabFrontComponentId"}},{"kind":"Field","name":{"kind":"Name","value":"availablePackages"}},{"kind":"Field","name":{"kind":"Name","value":"applicationVariables"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"value"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"isSecret"}}]}},{"kind":"Field","name":{"kind":"Name","value":"agents"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"AgentFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"objects"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ObjectMetadataFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"logicFunctions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"LogicFunctionFields"}}]}}]}}]} as unknown as DocumentNode;
-export const FindOneApplicationByUniversalIdentifierDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"FindOneApplicationByUniversalIdentifier"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"universalIdentifier"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UUID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"findOneApplication"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"universalIdentifier"},"value":{"kind":"Variable","name":{"kind":"Name","value":"universalIdentifier"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]} as unknown as DocumentNode;
+export const FindOneApplicationByUniversalIdentifierDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"FindOneApplicationByUniversalIdentifier"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"universalIdentifier"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UUID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"findOneApplication"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"universalIdentifier"},"value":{"kind":"Variable","name":{"kind":"Name","value":"universalIdentifier"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ApplicationFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"AgentFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Agent"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"prompt"}},{"kind":"Field","name":{"kind":"Name","value":"modelId"}},{"kind":"Field","name":{"kind":"Name","value":"responseFormat"}},{"kind":"Field","name":{"kind":"Name","value":"roleId"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"modelConfiguration"}},{"kind":"Field","name":{"kind":"Name","value":"evaluationInputs"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ObjectMetadataFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Object"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}},{"kind":"Field","name":{"kind":"Name","value":"labelSingular"}},{"kind":"Field","name":{"kind":"Name","value":"labelPlural"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"isRemote"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"isUIReadOnly"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"labelIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"imageIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"shortcut"}},{"kind":"Field","name":{"kind":"Name","value":"isLabelSyncedWithName"}},{"kind":"Field","name":{"kind":"Name","value":"isSearchable"}},{"kind":"Field","name":{"kind":"Name","value":"duplicateCriteria"}},{"kind":"Field","name":{"kind":"Name","value":"indexMetadataList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"indexWhereClause"}},{"kind":"Field","name":{"kind":"Name","value":"indexType"}},{"kind":"Field","name":{"kind":"Name","value":"isUnique"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"indexFieldMetadataList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"fieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"order"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"fieldsList"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"isUIReadOnly"}},{"kind":"Field","name":{"kind":"Name","value":"isNullable"}},{"kind":"Field","name":{"kind":"Name","value":"isUnique"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"defaultValue"}},{"kind":"Field","name":{"kind":"Name","value":"options"}},{"kind":"Field","name":{"kind":"Name","value":"settings"}},{"kind":"Field","name":{"kind":"Name","value":"isLabelSyncedWithName"}},{"kind":"Field","name":{"kind":"Name","value":"morphId"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"relation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"sourceObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sourceFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"morphRelations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"sourceObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sourceFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"LogicFunctionFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"LogicFunction"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"runtime"}},{"kind":"Field","name":{"kind":"Name","value":"timeoutSeconds"}},{"kind":"Field","name":{"kind":"Name","value":"sourceHandlerPath"}},{"kind":"Field","name":{"kind":"Name","value":"handlerName"}},{"kind":"Field","name":{"kind":"Name","value":"toolInputSchema"}},{"kind":"Field","name":{"kind":"Name","value":"isTool"}},{"kind":"Field","name":{"kind":"Name","value":"cronTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"databaseEventTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"httpRouteTriggerSettings"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ApplicationFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Application"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"applicationRegistrationId"}},{"kind":"Field","name":{"kind":"Name","value":"applicationRegistration"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"latestAvailableVersion"}},{"kind":"Field","name":{"kind":"Name","value":"sourceType"}}]}},{"kind":"Field","name":{"kind":"Name","value":"canBeUninstalled"}},{"kind":"Field","name":{"kind":"Name","value":"defaultRoleId"}},{"kind":"Field","name":{"kind":"Name","value":"settingsCustomTabFrontComponentId"}},{"kind":"Field","name":{"kind":"Name","value":"availablePackages"}},{"kind":"Field","name":{"kind":"Name","value":"applicationVariables"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"value"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"isSecret"}}]}},{"kind":"Field","name":{"kind":"Name","value":"agents"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"AgentFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"objects"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ObjectMetadataFields"}}]}},{"kind":"Field","name":{"kind":"Name","value":"logicFunctions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"LogicFunctionFields"}}]}}]}}]} as unknown as DocumentNode;
export const AuthorizeAppDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"authorizeApp"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"clientId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"codeChallenge"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"redirectUrl"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"state"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"authorizeApp"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"clientId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"clientId"}}},{"kind":"Argument","name":{"kind":"Name","value":"codeChallenge"},"value":{"kind":"Variable","name":{"kind":"Name","value":"codeChallenge"}}},{"kind":"Argument","name":{"kind":"Name","value":"redirectUrl"},"value":{"kind":"Variable","name":{"kind":"Name","value":"redirectUrl"}}},{"kind":"Argument","name":{"kind":"Name","value":"state"},"value":{"kind":"Variable","name":{"kind":"Name","value":"state"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"redirectUrl"}}]}}]}}]} as unknown as DocumentNode;
export const EmailPasswordResetLinkDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"EmailPasswordResetLink"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"email"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"workspaceId"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"UUID"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"emailPasswordResetLink"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"email"},"value":{"kind":"Variable","name":{"kind":"Name","value":"email"}}},{"kind":"Argument","name":{"kind":"Name","value":"workspaceId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"workspaceId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"success"}}]}}]}}]} as unknown as DocumentNode;
export const GenerateApiKeyTokenDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"GenerateApiKeyToken"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"apiKeyId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UUID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"expiresAt"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"generateApiKeyToken"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"apiKeyId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"apiKeyId"}}},{"kind":"Argument","name":{"kind":"Name","value":"expiresAt"},"value":{"kind":"Variable","name":{"kind":"Name","value":"expiresAt"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"token"}}]}}]}}]} as unknown as DocumentNode;
@@ -8237,8 +8172,8 @@ export const FindOneLogicFunctionDocument = {"kind":"Document","definitions":[{"
export const GetLogicFunctionSourceCodeDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetLogicFunctionSourceCode"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"LogicFunctionIdInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getLogicFunctionSourceCode"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}]}]}}]} as unknown as DocumentNode;
export const InstallMarketplaceAppDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"InstallMarketplaceApp"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"universalIdentifier"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"version"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"installMarketplaceApp"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"universalIdentifier"},"value":{"kind":"Variable","name":{"kind":"Name","value":"universalIdentifier"}}},{"kind":"Argument","name":{"kind":"Name","value":"version"},"value":{"kind":"Variable","name":{"kind":"Name","value":"version"}}}]}]}}]} as unknown as DocumentNode;
export const UpgradeApplicationDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpgradeApplication"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"appRegistrationId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"targetVersion"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"upgradeApplication"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"appRegistrationId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"appRegistrationId"}}},{"kind":"Argument","name":{"kind":"Name","value":"targetVersion"},"value":{"kind":"Variable","name":{"kind":"Name","value":"targetVersion"}}}]}]}}]} as unknown as DocumentNode;
-export const FindManyMarketplaceAppsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"FindManyMarketplaceApps"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"findManyMarketplaceApps"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"MarketplaceAppFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MarketplaceAppFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"MarketplaceApp"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"author"}},{"kind":"Field","name":{"kind":"Name","value":"category"}},{"kind":"Field","name":{"kind":"Name","value":"logo"}},{"kind":"Field","name":{"kind":"Name","value":"screenshots"}},{"kind":"Field","name":{"kind":"Name","value":"aboutDescription"}},{"kind":"Field","name":{"kind":"Name","value":"providers"}},{"kind":"Field","name":{"kind":"Name","value":"websiteUrl"}},{"kind":"Field","name":{"kind":"Name","value":"termsUrl"}},{"kind":"Field","name":{"kind":"Name","value":"objects"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}},{"kind":"Field","name":{"kind":"Name","value":"labelSingular"}},{"kind":"Field","name":{"kind":"Name","value":"labelPlural"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"fields"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"fields"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"objectUniversalIdentifier"}}]}},{"kind":"Field","name":{"kind":"Name","value":"logicFunctions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"timeoutSeconds"}}]}},{"kind":"Field","name":{"kind":"Name","value":"frontComponents"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sourcePackage"}},{"kind":"Field","name":{"kind":"Name","value":"isFeatured"}},{"kind":"Field","name":{"kind":"Name","value":"defaultRole"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"canReadAllObjectRecords"}},{"kind":"Field","name":{"kind":"Name","value":"canUpdateAllObjectRecords"}},{"kind":"Field","name":{"kind":"Name","value":"canSoftDeleteAllObjectRecords"}},{"kind":"Field","name":{"kind":"Name","value":"canDestroyAllObjectRecords"}},{"kind":"Field","name":{"kind":"Name","value":"canUpdateAllSettings"}},{"kind":"Field","name":{"kind":"Name","value":"canAccessAllTools"}},{"kind":"Field","name":{"kind":"Name","value":"objectPermissions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"objectUniversalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"canReadObjectRecords"}},{"kind":"Field","name":{"kind":"Name","value":"canUpdateObjectRecords"}},{"kind":"Field","name":{"kind":"Name","value":"canSoftDeleteObjectRecords"}},{"kind":"Field","name":{"kind":"Name","value":"canDestroyObjectRecords"}}]}},{"kind":"Field","name":{"kind":"Name","value":"fieldPermissions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"objectUniversalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"fieldUniversalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"canReadFieldValue"}},{"kind":"Field","name":{"kind":"Name","value":"canUpdateFieldValue"}}]}},{"kind":"Field","name":{"kind":"Name","value":"permissionFlags"}}]}}]}}]} as unknown as DocumentNode;
-export const FindOneMarketplaceAppDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"FindOneMarketplaceApp"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"universalIdentifier"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"findOneMarketplaceApp"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"universalIdentifier"},"value":{"kind":"Variable","name":{"kind":"Name","value":"universalIdentifier"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"MarketplaceAppFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MarketplaceAppFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"MarketplaceApp"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"author"}},{"kind":"Field","name":{"kind":"Name","value":"category"}},{"kind":"Field","name":{"kind":"Name","value":"logo"}},{"kind":"Field","name":{"kind":"Name","value":"screenshots"}},{"kind":"Field","name":{"kind":"Name","value":"aboutDescription"}},{"kind":"Field","name":{"kind":"Name","value":"providers"}},{"kind":"Field","name":{"kind":"Name","value":"websiteUrl"}},{"kind":"Field","name":{"kind":"Name","value":"termsUrl"}},{"kind":"Field","name":{"kind":"Name","value":"objects"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}},{"kind":"Field","name":{"kind":"Name","value":"labelSingular"}},{"kind":"Field","name":{"kind":"Name","value":"labelPlural"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"fields"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"fields"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"objectUniversalIdentifier"}}]}},{"kind":"Field","name":{"kind":"Name","value":"logicFunctions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"timeoutSeconds"}}]}},{"kind":"Field","name":{"kind":"Name","value":"frontComponents"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sourcePackage"}},{"kind":"Field","name":{"kind":"Name","value":"isFeatured"}},{"kind":"Field","name":{"kind":"Name","value":"defaultRole"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"canReadAllObjectRecords"}},{"kind":"Field","name":{"kind":"Name","value":"canUpdateAllObjectRecords"}},{"kind":"Field","name":{"kind":"Name","value":"canSoftDeleteAllObjectRecords"}},{"kind":"Field","name":{"kind":"Name","value":"canDestroyAllObjectRecords"}},{"kind":"Field","name":{"kind":"Name","value":"canUpdateAllSettings"}},{"kind":"Field","name":{"kind":"Name","value":"canAccessAllTools"}},{"kind":"Field","name":{"kind":"Name","value":"objectPermissions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"objectUniversalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"canReadObjectRecords"}},{"kind":"Field","name":{"kind":"Name","value":"canUpdateObjectRecords"}},{"kind":"Field","name":{"kind":"Name","value":"canSoftDeleteObjectRecords"}},{"kind":"Field","name":{"kind":"Name","value":"canDestroyObjectRecords"}}]}},{"kind":"Field","name":{"kind":"Name","value":"fieldPermissions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"objectUniversalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"fieldUniversalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"canReadFieldValue"}},{"kind":"Field","name":{"kind":"Name","value":"canUpdateFieldValue"}}]}},{"kind":"Field","name":{"kind":"Name","value":"permissionFlags"}}]}}]}}]} as unknown as DocumentNode;
+export const FindManyMarketplaceAppsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"FindManyMarketplaceApps"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"findManyMarketplaceApps"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"MarketplaceAppFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MarketplaceAppFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"MarketplaceApp"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"author"}},{"kind":"Field","name":{"kind":"Name","value":"category"}},{"kind":"Field","name":{"kind":"Name","value":"logo"}},{"kind":"Field","name":{"kind":"Name","value":"sourcePackage"}},{"kind":"Field","name":{"kind":"Name","value":"isFeatured"}}]}}]} as unknown as DocumentNode;
+export const FindMarketplaceAppDetailDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"FindMarketplaceAppDetail"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"universalIdentifier"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"findMarketplaceAppDetail"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"universalIdentifier"},"value":{"kind":"Variable","name":{"kind":"Name","value":"universalIdentifier"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"MarketplaceAppDetailFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MarketplaceAppDetailFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"MarketplaceAppDetail"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"sourceType"}},{"kind":"Field","name":{"kind":"Name","value":"sourcePackage"}},{"kind":"Field","name":{"kind":"Name","value":"latestAvailableVersion"}},{"kind":"Field","name":{"kind":"Name","value":"isListed"}},{"kind":"Field","name":{"kind":"Name","value":"isFeatured"}},{"kind":"Field","name":{"kind":"Name","value":"manifest"}}]}}]} as unknown as DocumentNode;
export const CreateManyNavigationMenuItemsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateManyNavigationMenuItems"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"inputs"}},"type":{"kind":"NonNullType","type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"CreateNavigationMenuItemInput"}}}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createManyNavigationMenuItems"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"inputs"},"value":{"kind":"Variable","name":{"kind":"Name","value":"inputs"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"NavigationMenuItemQueryFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"NavigationMenuItemFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"NavigationMenuItem"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"userWorkspaceId"}},{"kind":"Field","name":{"kind":"Name","value":"targetRecordId"}},{"kind":"Field","name":{"kind":"Name","value":"targetObjectMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"viewId"}},{"kind":"Field","name":{"kind":"Name","value":"folderId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"link"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"position"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"NavigationMenuItemQueryFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"NavigationMenuItem"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"NavigationMenuItemFields"}},{"kind":"Field","name":{"kind":"Name","value":"targetRecordIdentifier"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"labelIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"imageIdentifier"}}]}}]}}]} as unknown as DocumentNode;
export const DeleteManyNavigationMenuItemsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DeleteManyNavigationMenuItems"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"ids"}},"type":{"kind":"NonNullType","type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UUID"}}}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"deleteManyNavigationMenuItems"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"ids"},"value":{"kind":"Variable","name":{"kind":"Name","value":"ids"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"NavigationMenuItemQueryFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"NavigationMenuItemFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"NavigationMenuItem"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"userWorkspaceId"}},{"kind":"Field","name":{"kind":"Name","value":"targetRecordId"}},{"kind":"Field","name":{"kind":"Name","value":"targetObjectMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"viewId"}},{"kind":"Field","name":{"kind":"Name","value":"folderId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"link"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"position"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"NavigationMenuItemQueryFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"NavigationMenuItem"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"NavigationMenuItemFields"}},{"kind":"Field","name":{"kind":"Name","value":"targetRecordIdentifier"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"labelIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"imageIdentifier"}}]}}]}}]} as unknown as DocumentNode;
export const UpdateManyNavigationMenuItemsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateManyNavigationMenuItems"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"inputs"}},"type":{"kind":"NonNullType","type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UpdateOneNavigationMenuItemInput"}}}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateManyNavigationMenuItems"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"inputs"},"value":{"kind":"Variable","name":{"kind":"Name","value":"inputs"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"NavigationMenuItemQueryFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"NavigationMenuItemFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"NavigationMenuItem"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"userWorkspaceId"}},{"kind":"Field","name":{"kind":"Name","value":"targetRecordId"}},{"kind":"Field","name":{"kind":"Name","value":"targetObjectMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"viewId"}},{"kind":"Field","name":{"kind":"Name","value":"folderId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"link"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"position"}},{"kind":"Field","name":{"kind":"Name","value":"applicationId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"NavigationMenuItemQueryFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"NavigationMenuItem"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"NavigationMenuItemFields"}},{"kind":"Field","name":{"kind":"Name","value":"targetRecordIdentifier"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"labelIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"imageIdentifier"}}]}}]}}]} as unknown as DocumentNode;
@@ -8285,7 +8220,7 @@ export const GetAdminAiUsageByWorkspaceDocument = {"kind":"Document","definition
export const GetAiProvidersDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetAiProviders"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getAiProviders"}}]}}]} as unknown as DocumentNode;
export const GetModelsDevProvidersDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetModelsDevProviders"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getModelsDevProviders"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"modelCount"}},{"kind":"Field","name":{"kind":"Name","value":"npm"}}]}}]}}]} as unknown as DocumentNode;
export const GetModelsDevSuggestionsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetModelsDevSuggestions"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"providerType"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getModelsDevSuggestions"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"providerType"},"value":{"kind":"Variable","name":{"kind":"Name","value":"providerType"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"modelId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"inputCostPerMillionTokens"}},{"kind":"Field","name":{"kind":"Name","value":"outputCostPerMillionTokens"}},{"kind":"Field","name":{"kind":"Name","value":"cachedInputCostPerMillionTokens"}},{"kind":"Field","name":{"kind":"Name","value":"cacheCreationCostPerMillionTokens"}},{"kind":"Field","name":{"kind":"Name","value":"contextWindowTokens"}},{"kind":"Field","name":{"kind":"Name","value":"maxOutputTokens"}},{"kind":"Field","name":{"kind":"Name","value":"modalities"}},{"kind":"Field","name":{"kind":"Name","value":"supportsReasoning"}}]}}]}}]} as unknown as DocumentNode;
-export const FindAllApplicationRegistrationsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"FindAllApplicationRegistrations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"findAllApplicationRegistrations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ApplicationRegistrationFragment"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ApplicationRegistrationFragment"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ApplicationRegistration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"logoUrl"}},{"kind":"Field","name":{"kind":"Name","value":"author"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthClientId"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthRedirectUris"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthScopes"}},{"kind":"Field","name":{"kind":"Name","value":"sourceType"}},{"kind":"Field","name":{"kind":"Name","value":"sourcePackage"}},{"kind":"Field","name":{"kind":"Name","value":"latestAvailableVersion"}},{"kind":"Field","name":{"kind":"Name","value":"websiteUrl"}},{"kind":"Field","name":{"kind":"Name","value":"termsUrl"}},{"kind":"Field","name":{"kind":"Name","value":"isListed"}},{"kind":"Field","name":{"kind":"Name","value":"isFeatured"}},{"kind":"Field","name":{"kind":"Name","value":"ownerWorkspaceId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]} as unknown as DocumentNode;
+export const FindAllApplicationRegistrationsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"FindAllApplicationRegistrations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"findAllApplicationRegistrations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ApplicationRegistrationFragment"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ApplicationRegistrationFragment"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ApplicationRegistration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthClientId"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthRedirectUris"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthScopes"}},{"kind":"Field","name":{"kind":"Name","value":"sourceType"}},{"kind":"Field","name":{"kind":"Name","value":"sourcePackage"}},{"kind":"Field","name":{"kind":"Name","value":"latestAvailableVersion"}},{"kind":"Field","name":{"kind":"Name","value":"isListed"}},{"kind":"Field","name":{"kind":"Name","value":"isFeatured"}},{"kind":"Field","name":{"kind":"Name","value":"ownerWorkspaceId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]} as unknown as DocumentNode;
export const CreateDatabaseConfigVariableDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateDatabaseConfigVariable"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"key"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"value"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"JSON"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createDatabaseConfigVariable"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"key"},"value":{"kind":"Variable","name":{"kind":"Name","value":"key"}}},{"kind":"Argument","name":{"kind":"Name","value":"value"},"value":{"kind":"Variable","name":{"kind":"Name","value":"value"}}}]}]}}]} as unknown as DocumentNode;
export const DeleteDatabaseConfigVariableDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DeleteDatabaseConfigVariable"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"key"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"deleteDatabaseConfigVariable"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"key"},"value":{"kind":"Variable","name":{"kind":"Name","value":"key"}}}]}]}}]} as unknown as DocumentNode;
export const UpdateDatabaseConfigVariableDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateDatabaseConfigVariable"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"key"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"value"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"JSON"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateDatabaseConfigVariable"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"key"},"value":{"kind":"Variable","name":{"kind":"Name","value":"key"}}},{"kind":"Argument","name":{"kind":"Name","value":"value"},"value":{"kind":"Variable","name":{"kind":"Name","value":"value"}}}]}]}}]} as unknown as DocumentNode;
@@ -8303,13 +8238,14 @@ export const GetSystemHealthStatusDocument = {"kind":"Document","definitions":[{
export const DeleteApplicationRegistrationDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DeleteApplicationRegistration"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"deleteApplicationRegistration"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}]}]}}]} as unknown as DocumentNode;
export const RotateApplicationRegistrationClientSecretDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"RotateApplicationRegistrationClientSecret"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"rotateApplicationRegistrationClientSecret"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"clientSecret"}}]}}]}}]} as unknown as DocumentNode;
export const TransferApplicationRegistrationOwnershipDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"TransferApplicationRegistrationOwnership"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"applicationRegistrationId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"targetWorkspaceSubdomain"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"transferApplicationRegistrationOwnership"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"applicationRegistrationId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"applicationRegistrationId"}}},{"kind":"Argument","name":{"kind":"Name","value":"targetWorkspaceSubdomain"},"value":{"kind":"Variable","name":{"kind":"Name","value":"targetWorkspaceSubdomain"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]} as unknown as DocumentNode;
-export const UpdateApplicationRegistrationDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateApplicationRegistration"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UpdateApplicationRegistrationInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateApplicationRegistration"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ApplicationRegistrationFragment"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ApplicationRegistrationFragment"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ApplicationRegistration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"logoUrl"}},{"kind":"Field","name":{"kind":"Name","value":"author"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthClientId"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthRedirectUris"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthScopes"}},{"kind":"Field","name":{"kind":"Name","value":"sourceType"}},{"kind":"Field","name":{"kind":"Name","value":"sourcePackage"}},{"kind":"Field","name":{"kind":"Name","value":"latestAvailableVersion"}},{"kind":"Field","name":{"kind":"Name","value":"websiteUrl"}},{"kind":"Field","name":{"kind":"Name","value":"termsUrl"}},{"kind":"Field","name":{"kind":"Name","value":"isListed"}},{"kind":"Field","name":{"kind":"Name","value":"isFeatured"}},{"kind":"Field","name":{"kind":"Name","value":"ownerWorkspaceId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]} as unknown as DocumentNode;
+export const UpdateApplicationRegistrationDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateApplicationRegistration"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UpdateApplicationRegistrationInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateApplicationRegistration"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ApplicationRegistrationFragment"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ApplicationRegistrationFragment"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ApplicationRegistration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthClientId"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthRedirectUris"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthScopes"}},{"kind":"Field","name":{"kind":"Name","value":"sourceType"}},{"kind":"Field","name":{"kind":"Name","value":"sourcePackage"}},{"kind":"Field","name":{"kind":"Name","value":"latestAvailableVersion"}},{"kind":"Field","name":{"kind":"Name","value":"isListed"}},{"kind":"Field","name":{"kind":"Name","value":"isFeatured"}},{"kind":"Field","name":{"kind":"Name","value":"ownerWorkspaceId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]} as unknown as DocumentNode;
export const UpdateApplicationRegistrationVariableDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateApplicationRegistrationVariable"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UpdateApplicationRegistrationVariableInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateApplicationRegistrationVariable"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"isSecret"}},{"kind":"Field","name":{"kind":"Name","value":"isRequired"}},{"kind":"Field","name":{"kind":"Name","value":"isFilled"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]}}]} as unknown as DocumentNode;
export const ApplicationRegistrationTarballUrlDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ApplicationRegistrationTarballUrl"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"applicationRegistrationTarballUrl"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}]}]}}]} as unknown as DocumentNode;
export const FindApplicationRegistrationStatsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"FindApplicationRegistrationStats"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"findApplicationRegistrationStats"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"activeInstalls"}},{"kind":"Field","name":{"kind":"Name","value":"mostInstalledVersion"}},{"kind":"Field","name":{"kind":"Name","value":"versionDistribution"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"count"}}]}}]}}]}}]} as unknown as DocumentNode;
export const FindApplicationRegistrationVariablesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"FindApplicationRegistrationVariables"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"applicationRegistrationId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"findApplicationRegistrationVariables"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"applicationRegistrationId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"applicationRegistrationId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"isSecret"}},{"kind":"Field","name":{"kind":"Name","value":"isRequired"}},{"kind":"Field","name":{"kind":"Name","value":"isFilled"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]}}]} as unknown as DocumentNode;
-export const FindManyApplicationRegistrationsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"FindManyApplicationRegistrations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"findManyApplicationRegistrations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ApplicationRegistrationFragment"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ApplicationRegistrationFragment"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ApplicationRegistration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"logoUrl"}},{"kind":"Field","name":{"kind":"Name","value":"author"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthClientId"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthRedirectUris"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthScopes"}},{"kind":"Field","name":{"kind":"Name","value":"sourceType"}},{"kind":"Field","name":{"kind":"Name","value":"sourcePackage"}},{"kind":"Field","name":{"kind":"Name","value":"latestAvailableVersion"}},{"kind":"Field","name":{"kind":"Name","value":"websiteUrl"}},{"kind":"Field","name":{"kind":"Name","value":"termsUrl"}},{"kind":"Field","name":{"kind":"Name","value":"isListed"}},{"kind":"Field","name":{"kind":"Name","value":"isFeatured"}},{"kind":"Field","name":{"kind":"Name","value":"ownerWorkspaceId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]} as unknown as DocumentNode;
-export const FindOneApplicationRegistrationDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"FindOneApplicationRegistration"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"findOneApplicationRegistration"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ApplicationRegistrationFragment"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ApplicationRegistrationFragment"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ApplicationRegistration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"logoUrl"}},{"kind":"Field","name":{"kind":"Name","value":"author"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthClientId"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthRedirectUris"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthScopes"}},{"kind":"Field","name":{"kind":"Name","value":"sourceType"}},{"kind":"Field","name":{"kind":"Name","value":"sourcePackage"}},{"kind":"Field","name":{"kind":"Name","value":"latestAvailableVersion"}},{"kind":"Field","name":{"kind":"Name","value":"websiteUrl"}},{"kind":"Field","name":{"kind":"Name","value":"termsUrl"}},{"kind":"Field","name":{"kind":"Name","value":"isListed"}},{"kind":"Field","name":{"kind":"Name","value":"isFeatured"}},{"kind":"Field","name":{"kind":"Name","value":"ownerWorkspaceId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]} as unknown as DocumentNode;
+export const FindManyApplicationRegistrationsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"FindManyApplicationRegistrations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"findManyApplicationRegistrations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ApplicationRegistrationFragment"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ApplicationRegistrationFragment"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ApplicationRegistration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthClientId"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthRedirectUris"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthScopes"}},{"kind":"Field","name":{"kind":"Name","value":"sourceType"}},{"kind":"Field","name":{"kind":"Name","value":"sourcePackage"}},{"kind":"Field","name":{"kind":"Name","value":"latestAvailableVersion"}},{"kind":"Field","name":{"kind":"Name","value":"isListed"}},{"kind":"Field","name":{"kind":"Name","value":"isFeatured"}},{"kind":"Field","name":{"kind":"Name","value":"ownerWorkspaceId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]} as unknown as DocumentNode;
+export const FindOneApplicationRegistrationDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"FindOneApplicationRegistration"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"findOneApplicationRegistration"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ApplicationRegistrationFragment"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ApplicationRegistrationFragment"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ApplicationRegistration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthClientId"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthRedirectUris"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthScopes"}},{"kind":"Field","name":{"kind":"Name","value":"sourceType"}},{"kind":"Field","name":{"kind":"Name","value":"sourcePackage"}},{"kind":"Field","name":{"kind":"Name","value":"latestAvailableVersion"}},{"kind":"Field","name":{"kind":"Name","value":"isListed"}},{"kind":"Field","name":{"kind":"Name","value":"isFeatured"}},{"kind":"Field","name":{"kind":"Name","value":"ownerWorkspaceId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]} as unknown as DocumentNode;
+export const GetApplicationShareLinkDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetApplicationShareLink"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getApplicationShareLink"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}]}]}}]} as unknown as DocumentNode;
export const UninstallApplicationDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UninstallApplication"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"universalIdentifier"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"uninstallApplication"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"universalIdentifier"},"value":{"kind":"Variable","name":{"kind":"Name","value":"universalIdentifier"}}}]}]}}]} as unknown as DocumentNode;
export const UpdateOneApplicationVariableDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateOneApplicationVariable"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"key"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"value"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"applicationId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UUID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateOneApplicationVariable"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"key"},"value":{"kind":"Variable","name":{"kind":"Name","value":"key"}}},{"kind":"Argument","name":{"kind":"Name","value":"value"},"value":{"kind":"Variable","name":{"kind":"Name","value":"value"}}},{"kind":"Argument","name":{"kind":"Name","value":"applicationId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"applicationId"}}}]}]}}]} as unknown as DocumentNode;
export const CancelSwitchBillingIntervalDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CancelSwitchBillingInterval"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"cancelSwitchBillingInterval"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"currentBillingSubscription"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CurrentBillingSubscriptionFragment"}}]}},{"kind":"Field","name":{"kind":"Name","value":"billingSubscriptions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"BillingSubscriptionFragment"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"BillingSubscriptionSchedulePhaseItemFragment"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"BillingSubscriptionSchedulePhaseItem"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"price"}},{"kind":"Field","name":{"kind":"Name","value":"quantity"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"BillingSubscriptionSchedulePhaseFragment"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"BillingSubscriptionSchedulePhase"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"start_date"}},{"kind":"Field","name":{"kind":"Name","value":"end_date"}},{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"BillingSubscriptionSchedulePhaseItemFragment"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CurrentBillingSubscriptionFragment"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"BillingSubscription"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"interval"}},{"kind":"Field","name":{"kind":"Name","value":"metadata"}},{"kind":"Field","name":{"kind":"Name","value":"currentPeriodEnd"}},{"kind":"Field","name":{"kind":"Name","value":"phases"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"BillingSubscriptionSchedulePhaseFragment"}}]}},{"kind":"Field","name":{"kind":"Name","value":"billingSubscriptionItems"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"hasReachedCurrentPeriodCap"}},{"kind":"Field","name":{"kind":"Name","value":"quantity"}},{"kind":"Field","name":{"kind":"Name","value":"stripePriceId"}},{"kind":"Field","name":{"kind":"Name","value":"billingProduct"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"images"}},{"kind":"Field","name":{"kind":"Name","value":"metadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"productKey"}},{"kind":"Field","name":{"kind":"Name","value":"planKey"}},{"kind":"Field","name":{"kind":"Name","value":"priceUsageBased"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"BillingSubscriptionFragment"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"BillingSubscription"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"metadata"}},{"kind":"Field","name":{"kind":"Name","value":"phases"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"BillingSubscriptionSchedulePhaseFragment"}}]}}]}}]} as unknown as DocumentNode;
diff --git a/packages/twenty-front/src/modules/ai/components/LazyMarkdownRendererStyledComponents.tsx b/packages/twenty-front/src/modules/ai/components/LazyMarkdownRendererStyledComponents.tsx
index 3104cc0f51..ee9f2b4a0e 100644
--- a/packages/twenty-front/src/modules/ai/components/LazyMarkdownRendererStyledComponents.tsx
+++ b/packages/twenty-front/src/modules/ai/components/LazyMarkdownRendererStyledComponents.tsx
@@ -5,6 +5,7 @@ export const StyledMarkdownContainer = styled.div`
border-radius: ${themeCssVariables.border.radius.sm};
line-height: 150%;
margin: ${themeCssVariables.spacing['1.5']} 0;
+ overflow-x: auto;
position: relative;
scroll-margin-bottom: ${themeCssVariables.spacing[10]};
scroll-margin-top: ${themeCssVariables.spacing[10]};
@@ -134,6 +135,7 @@ export const StyledMarkdownContainer = styled.div`
background-color: ${themeCssVariables.background.secondary};
border: 1px solid ${themeCssVariables.border.color.medium};
border-radius: ${themeCssVariables.border.radius.md} !important;
+ overflow-x: auto;
}
.markdown-block-code * {
diff --git a/packages/twenty-front/src/modules/applications/graphql/queries/findOneApplicationByUniversalIdentifier.ts b/packages/twenty-front/src/modules/applications/graphql/queries/findOneApplicationByUniversalIdentifier.ts
index d914982a87..f7976d5acb 100644
--- a/packages/twenty-front/src/modules/applications/graphql/queries/findOneApplicationByUniversalIdentifier.ts
+++ b/packages/twenty-front/src/modules/applications/graphql/queries/findOneApplicationByUniversalIdentifier.ts
@@ -1,9 +1,11 @@
import { gql } from '@apollo/client';
+import { APPLICATION_FRAGMENT } from '@/applications/graphql/fragments/applicationFragment';
export const FIND_ONE_APPLICATION_BY_UNIVERSAL_IDENTIFIER = gql`
+ ${APPLICATION_FRAGMENT}
query FindOneApplicationByUniversalIdentifier($universalIdentifier: UUID!) {
findOneApplication(universalIdentifier: $universalIdentifier) {
- id
+ ...ApplicationFields
}
}
`;
diff --git a/packages/twenty-front/src/modules/marketplace/graphql/fragments/marketplaceAppDetailFragment.ts b/packages/twenty-front/src/modules/marketplace/graphql/fragments/marketplaceAppDetailFragment.ts
new file mode 100644
index 0000000000..39a1721cc6
--- /dev/null
+++ b/packages/twenty-front/src/modules/marketplace/graphql/fragments/marketplaceAppDetailFragment.ts
@@ -0,0 +1,15 @@
+import gql from 'graphql-tag';
+
+export const MARKETPLACE_APP_DETAIL_FRAGMENT = gql`
+ fragment MarketplaceAppDetailFields on MarketplaceAppDetail {
+ id
+ universalIdentifier
+ name
+ sourceType
+ sourcePackage
+ latestAvailableVersion
+ isListed
+ isFeatured
+ manifest
+ }
+`;
diff --git a/packages/twenty-front/src/modules/marketplace/graphql/fragments/marketplaceAppFragment.ts b/packages/twenty-front/src/modules/marketplace/graphql/fragments/marketplaceAppFragment.ts
index d3fa666561..59e32d534d 100644
--- a/packages/twenty-front/src/modules/marketplace/graphql/fragments/marketplaceAppFragment.ts
+++ b/packages/twenty-front/src/modules/marketplace/graphql/fragments/marketplaceAppFragment.ts
@@ -6,75 +6,10 @@ export const MARKETPLACE_APP_FRAGMENT = gql`
name
description
icon
- version
author
category
logo
- screenshots
- aboutDescription
- providers
- websiteUrl
- termsUrl
- objects {
- universalIdentifier
- nameSingular
- namePlural
- labelSingular
- labelPlural
- description
- icon
- fields {
- universalIdentifier
- name
- type
- label
- description
- icon
- }
- }
- fields {
- name
- type
- label
- description
- icon
- objectUniversalIdentifier
- }
- logicFunctions {
- name
- description
- timeoutSeconds
- }
- frontComponents {
- name
- description
- }
sourcePackage
isFeatured
- defaultRole {
- id
- label
- description
- canReadAllObjectRecords
- canUpdateAllObjectRecords
- canSoftDeleteAllObjectRecords
- canDestroyAllObjectRecords
- canUpdateAllSettings
- canAccessAllTools
- objectPermissions {
- objectUniversalIdentifier
- canReadObjectRecords
- canUpdateObjectRecords
- canSoftDeleteObjectRecords
- canDestroyObjectRecords
- }
- fieldPermissions {
- objectUniversalIdentifier
- fieldUniversalIdentifier
- canReadFieldValue
- canUpdateFieldValue
- }
- permissionFlags
- }
}
`;
diff --git a/packages/twenty-front/src/modules/marketplace/graphql/queries/findMarketplaceAppDetail.ts b/packages/twenty-front/src/modules/marketplace/graphql/queries/findMarketplaceAppDetail.ts
new file mode 100644
index 0000000000..7b19e52aba
--- /dev/null
+++ b/packages/twenty-front/src/modules/marketplace/graphql/queries/findMarketplaceAppDetail.ts
@@ -0,0 +1,12 @@
+import gql from 'graphql-tag';
+
+import { MARKETPLACE_APP_DETAIL_FRAGMENT } from '@/marketplace/graphql/fragments/marketplaceAppDetailFragment';
+
+export const FIND_MARKETPLACE_APP_DETAIL = gql`
+ ${MARKETPLACE_APP_DETAIL_FRAGMENT}
+ query FindMarketplaceAppDetail($universalIdentifier: String!) {
+ findMarketplaceAppDetail(universalIdentifier: $universalIdentifier) {
+ ...MarketplaceAppDetailFields
+ }
+ }
+`;
diff --git a/packages/twenty-front/src/modules/marketplace/graphql/queries/findOneMarketplaceApp.ts b/packages/twenty-front/src/modules/marketplace/graphql/queries/findOneMarketplaceApp.ts
deleted file mode 100644
index 913fb4927b..0000000000
--- a/packages/twenty-front/src/modules/marketplace/graphql/queries/findOneMarketplaceApp.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import gql from 'graphql-tag';
-
-import { MARKETPLACE_APP_FRAGMENT } from '@/marketplace/graphql/fragments/marketplaceAppFragment';
-
-export const FIND_ONE_MARKETPLACE_APP = gql`
- ${MARKETPLACE_APP_FRAGMENT}
- query FindOneMarketplaceApp($universalIdentifier: String!) {
- findOneMarketplaceApp(universalIdentifier: $universalIdentifier) {
- ...MarketplaceAppFields
- }
- }
-`;
diff --git a/packages/twenty-front/src/modules/marketplace/hooks/useMarketplaceApps.ts b/packages/twenty-front/src/modules/marketplace/hooks/useMarketplaceApps.ts
index 3905b82eac..6e6efb72d4 100644
--- a/packages/twenty-front/src/modules/marketplace/hooks/useMarketplaceApps.ts
+++ b/packages/twenty-front/src/modules/marketplace/hooks/useMarketplaceApps.ts
@@ -1,42 +1,11 @@
import { useQuery } from '@apollo/client/react';
-import {
- type MarketplaceApp,
- FindManyMarketplaceAppsDocument,
-} from '~/generated-metadata/graphql';
-
-export type MarketplaceAppWithContentCounts = MarketplaceApp & {
- content: {
- objects: number;
- fields: number;
- functions: number;
- frontComponents: number;
- };
-};
+import { FindManyMarketplaceAppsDocument } from '~/generated-metadata/graphql';
export const useMarketplaceApps = () => {
const { data, loading, error } = useQuery(FindManyMarketplaceAppsDocument);
- const marketplaceApps: MarketplaceAppWithContentCounts[] =
- data?.findManyMarketplaceApps.map((app) => {
- const totalFieldsCount =
- (app.objects ?? []).reduce(
- (count, appObject) => count + appObject.fields.length,
- 0,
- ) + (app.fields ?? []).length;
-
- return {
- ...app,
- content: {
- objects: (app.objects ?? []).length,
- fields: totalFieldsCount,
- functions: (app.logicFunctions ?? []).length,
- frontComponents: (app.frontComponents ?? []).length,
- },
- };
- }) ?? [];
-
return {
- data: marketplaceApps,
+ data: data?.findManyMarketplaceApps ?? [],
isLoading: loading,
error,
};
diff --git a/packages/twenty-front/src/modules/settings/application-registrations/graphql/fragments/applicationRegistrationFragment.ts b/packages/twenty-front/src/modules/settings/application-registrations/graphql/fragments/applicationRegistrationFragment.ts
index 87ff0263cf..8573730c1b 100644
--- a/packages/twenty-front/src/modules/settings/application-registrations/graphql/fragments/applicationRegistrationFragment.ts
+++ b/packages/twenty-front/src/modules/settings/application-registrations/graphql/fragments/applicationRegistrationFragment.ts
@@ -5,17 +5,12 @@ export const APPLICATION_REGISTRATION_FRAGMENT = gql`
id
universalIdentifier
name
- description
- logoUrl
- author
oAuthClientId
oAuthRedirectUris
oAuthScopes
sourceType
sourcePackage
latestAvailableVersion
- websiteUrl
- termsUrl
isListed
isFeatured
ownerWorkspaceId
diff --git a/packages/twenty-front/src/modules/settings/application-registrations/graphql/queries/getApplicationShareLink.ts b/packages/twenty-front/src/modules/settings/application-registrations/graphql/queries/getApplicationShareLink.ts
new file mode 100644
index 0000000000..4aa6883f44
--- /dev/null
+++ b/packages/twenty-front/src/modules/settings/application-registrations/graphql/queries/getApplicationShareLink.ts
@@ -0,0 +1,7 @@
+import { gql } from '@apollo/client';
+
+export const GET_APPLICATION_SHARE_LINK = gql`
+ query GetApplicationShareLink($id: String!) {
+ getApplicationShareLink(id: $id)
+ }
+`;
diff --git a/packages/twenty-front/src/pages/settings/applications/SettingsApplicationDetails.tsx b/packages/twenty-front/src/pages/settings/applications/SettingsApplicationDetails.tsx
index 50b46d05b4..7cbd177235 100644
--- a/packages/twenty-front/src/pages/settings/applications/SettingsApplicationDetails.tsx
+++ b/packages/twenty-front/src/pages/settings/applications/SettingsApplicationDetails.tsx
@@ -14,6 +14,7 @@ import {
IconSettings,
} from 'twenty-ui/display';
import { SettingsApplicationDetailSkeletonLoader } from '~/pages/settings/applications/components/SettingsApplicationDetailSkeletonLoader';
+import { SettingsApplicationDetailTitle } from '~/pages/settings/applications/components/SettingsApplicationDetailTitle';
import { TabList } from '@/ui/layout/tab-list/components/TabList';
import { activeTabIdComponentState } from '@/ui/layout/tab-list/states/activeTabIdComponentState';
import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue';
@@ -40,11 +41,8 @@ export const SettingsApplicationDetails = () => {
const application = data?.findOneApplication;
- const applicationName = application?.name;
-
- const title = !isDefined(application)
- ? t`Application details`
- : applicationName;
+ const applicationName = application?.name ?? t`Application details`;
+ const applicationDescription = application?.description ?? undefined;
const settingsCustomTabFrontComponentId =
application?.settingsCustomTabFrontComponentId;
@@ -94,7 +92,12 @@ export const SettingsApplicationDetails = () => {
return (
+ }
links={[
{
children: t`Workspace`,
@@ -104,7 +107,7 @@ export const SettingsApplicationDetails = () => {
children: t`Applications`,
href: getSettingsPath(SettingsPath.Applications),
},
- { children: `${title}` },
+ { children: applicationName },
]}
>
diff --git a/packages/twenty-front/src/pages/settings/applications/SettingsAvailableApplicationDetails.tsx b/packages/twenty-front/src/pages/settings/applications/SettingsAvailableApplicationDetails.tsx
index 5601dcb9c6..49dba49382 100644
--- a/packages/twenty-front/src/pages/settings/applications/SettingsAvailableApplicationDetails.tsx
+++ b/packages/twenty-front/src/pages/settings/applications/SettingsAvailableApplicationDetails.tsx
@@ -1,3 +1,4 @@
+import { LazyMarkdownRenderer } from '@/ai/components/LazyMarkdownRenderer';
import { useInstallMarketplaceApp } from '@/marketplace/hooks/useInstallMarketplaceApp';
import { SettingsPageContainer } from '@/settings/components/SettingsPageContainer';
import { useHasPermissionFlag } from '@/settings/roles/hooks/useHasPermissionFlag';
@@ -9,21 +10,26 @@ import { styled } from '@linaria/react';
import { t } from '@lingui/core/macro';
import { useState } from 'react';
import { useParams } from 'react-router-dom';
+import { type Manifest } from 'twenty-shared/application';
import { SettingsPath } from 'twenty-shared/types';
import { getSettingsPath, isDefined } from 'twenty-shared/utils';
import {
- IconApps,
+ IconAlertTriangle,
+ IconBook,
IconBox,
IconCheck,
- IconColumns,
IconCommand,
IconDownload,
- IconEyeOff,
- IconFileText,
+ IconGraph,
IconInfoCircle,
- IconLayoutGrid,
+ IconLego,
+ IconLink,
+ IconListDetails,
IconLock,
+ IconMail,
IconSettings,
+ IconShield,
+ IconUpload,
IconWorld,
} from 'twenty-ui/display';
import { Button } from 'twenty-ui/input';
@@ -33,89 +39,32 @@ import { useQuery } from '@apollo/client/react';
import {
PermissionFlagType,
FindOneApplicationByUniversalIdentifierDocument,
- FindOneMarketplaceAppDocument,
+ FindMarketplaceAppDetailDocument,
+ ApplicationRegistrationSourceType,
} from '~/generated-metadata/graphql';
-import { useMarketplaceApps } from '~/modules/marketplace/hooks/useMarketplaceApps';
import { SettingsApplicationPermissionsTab } from '~/pages/settings/applications/tabs/SettingsApplicationPermissionsTab';
import { SettingsAvailableApplicationDetailContentTab } from '~/pages/settings/applications/tabs/SettingsAvailableApplicationDetailContentTab';
+import { SettingsApplicationDetailTitle } from '~/pages/settings/applications/components/SettingsApplicationDetailTitle';
+import { isNewerSemver } from '~/pages/settings/applications/utils/isNewerSemver';
+import { useUpgradeApplication } from '@/marketplace/hooks/useUpgradeApplication';
+import { SettingsApplicationDetailSettingsTab } from '~/pages/settings/applications/tabs/SettingsApplicationDetailSettingsTab';
const AVAILABLE_APPLICATION_DETAIL_ID = 'available-application-detail';
-const StyledHeader = styled.div`
- align-items: center;
- display: flex;
- gap: ${themeCssVariables.spacing[4]};
- justify-content: space-between;
- margin-bottom: ${themeCssVariables.spacing[4]};
-`;
-
-const StyledHeaderLeft = styled.div`
- align-items: center;
- display: flex;
- gap: ${themeCssVariables.spacing[3]};
-`;
-
-const StyledLogo = styled.div`
- align-items: center;
- background-color: ${themeCssVariables.background.tertiary};
- border-radius: ${themeCssVariables.border.radius.sm};
- display: flex;
- flex-shrink: 0;
- height: 48px;
- justify-content: center;
- overflow: hidden;
- width: 48px;
-`;
-
-const StyledLogoImage = styled.img`
- height: 32px;
- object-fit: contain;
- width: 32px;
-`;
-
-const StyledLogoPlaceholder = styled.div`
- align-items: center;
- background-color: ${themeCssVariables.color.blue};
- border-radius: ${themeCssVariables.border.radius.xs};
- color: ${themeCssVariables.font.color.inverted};
- display: flex;
- font-size: ${themeCssVariables.font.size.lg};
- font-weight: ${themeCssVariables.font.weight.medium};
- height: 32px;
- justify-content: center;
- width: 32px;
-`;
-
-const StyledHeaderInfo = styled.div`
- display: flex;
- flex-direction: column;
- gap: ${themeCssVariables.spacing[1]};
-`;
-
-const StyledAppName = styled.div`
- color: ${themeCssVariables.font.color.primary};
- font-size: ${themeCssVariables.font.size.lg};
- font-weight: ${themeCssVariables.font.weight.semiBold};
-`;
-
-const StyledAppDescription = styled.div`
- color: ${themeCssVariables.font.color.secondary};
- font-size: ${themeCssVariables.font.size.md};
-`;
-
const StyledContentContainer = styled.div`
display: flex;
- gap: ${themeCssVariables.spacing[8]};
+ gap: ${themeCssVariables.spacing[4]};
`;
const StyledMainContent = styled.div`
flex: 1;
min-width: 0;
+ overflow: hidden;
`;
const StyledSidebar = styled.div`
flex-shrink: 0;
- width: 180px;
+ width: 140px;
`;
const StyledSidebarSection = styled.div`
@@ -177,7 +126,7 @@ const StyledScreenshotsContainer = styled.div`
display: flex;
height: 300px;
justify-content: center;
- margin-bottom: ${themeCssVariables.spacing[4]};
+ margin-bottom: ${themeCssVariables.spacing[2]};
overflow: hidden;
`;
@@ -222,43 +171,12 @@ const StyledThumbnailImage = styled.img`
const StyledSectionTitle = styled.h2`
color: ${themeCssVariables.font.color.primary};
- font-size: ${themeCssVariables.font.size.lg};
+ font-size: ${themeCssVariables.font.size.xl};
font-weight: ${themeCssVariables.font.weight.semiBold};
margin: 0 0 ${themeCssVariables.spacing[3]} 0;
`;
-const StyledAboutText = styled.p`
- color: ${themeCssVariables.font.color.secondary};
- font-size: ${themeCssVariables.font.size.md};
- line-height: 1.6;
- margin: 0 0 ${themeCssVariables.spacing[6]} 0;
- white-space: pre-line;
-`;
-
-const StyledProvidersList = styled.ul`
- color: ${themeCssVariables.font.color.secondary};
- font-size: ${themeCssVariables.font.size.md};
- list-style-type: disc;
- margin: 0;
- padding-left: ${themeCssVariables.spacing[5]};
-`;
-
-const StyledProviderItem = styled.li`
- margin-bottom: ${themeCssVariables.spacing[1]};
-`;
-
-const StyledUnlistedBanner = styled.div`
- align-items: center;
- background-color: ${themeCssVariables.background.transparent.lighter};
- border: 1px solid ${themeCssVariables.border.color.medium};
- border-radius: ${themeCssVariables.border.radius.sm};
- color: ${themeCssVariables.font.color.secondary};
- display: flex;
- font-size: ${themeCssVariables.font.size.md};
- gap: ${themeCssVariables.spacing[2]};
- margin-bottom: ${themeCssVariables.spacing[4]};
- padding: ${themeCssVariables.spacing[3]} ${themeCssVariables.spacing[4]};
-`;
+const StyledAboutContainer = styled.div``;
export const SettingsAvailableApplicationDetails = () => {
const { availableApplicationId = '' } = useParams<{
@@ -267,12 +185,13 @@ export const SettingsAvailableApplicationDetails = () => {
const [selectedScreenshotIndex, setSelectedScreenshotIndex] = useState(0);
- const { data: marketplaceApps } = useMarketplaceApps();
const { install, isInstalling } = useInstallMarketplaceApp();
+
const canInstallMarketplaceApps = useHasPermissionFlag(
PermissionFlagType.MARKETPLACE_APPS,
);
- const { data: installedAppData } = useQuery(
+
+ const { data: applicationData } = useQuery(
FindOneApplicationByUniversalIdentifierDocument,
{
variables: { universalIdentifier: availableApplicationId },
@@ -280,47 +199,177 @@ export const SettingsAvailableApplicationDetails = () => {
},
);
- const listedApp = marketplaceApps?.find(
- (app) => app.id === availableApplicationId,
- );
-
- const { data: singleAppData } = useQuery(FindOneMarketplaceAppDocument, {
+ const { data: detailData } = useQuery(FindMarketplaceAppDetailDocument, {
variables: { universalIdentifier: availableApplicationId },
- skip: isDefined(listedApp) || !availableApplicationId,
+ skip: !availableApplicationId,
});
- const singleApp = singleAppData?.findOneMarketplaceApp;
+ const application = applicationData?.findOneApplication;
- const application = isDefined(listedApp)
- ? listedApp
- : isDefined(singleApp)
- ? {
- ...singleApp,
- content: {
- objects: (singleApp.objects ?? []).length,
- fields:
- (singleApp.objects ?? []).reduce(
- (count, appObject) => count + appObject.fields.length,
- 0,
- ) + (singleApp.fields ?? []).length,
- functions: (singleApp.logicFunctions ?? []).length,
- frontComponents: (singleApp.frontComponents ?? []).length,
- },
- }
- : undefined;
+ const detail = detailData?.findMarketplaceAppDetail;
+ const manifest = detail?.manifest as Manifest | undefined;
+ const app = manifest?.application;
- const isUnlisted = !isDefined(listedApp) && isDefined(application);
+ const displayName = app?.displayName ?? detail?.name ?? '';
+ const description = app?.description ?? '';
+ const screenshots = app?.screenshots ?? [];
+ const aboutDescription = app?.aboutDescription;
- const isAlreadyInstalled = isDefined(installedAppData?.findOneApplication);
+ const currentVersion = application?.version;
+ const latestAvailableVersion = detail?.latestAvailableVersion;
+
+ const sourceType = detail?.sourceType;
+ const isNpmApp = sourceType === ApplicationRegistrationSourceType.NPM;
+ const registrationId = detail?.id;
+
+ const isUnlisted = isDefined(detail) && !detail.isListed;
+ const installedApp = applicationData?.findOneApplication;
+ const isAlreadyInstalled = isDefined(installedApp);
+ const hasScreenshots = screenshots.length > 0;
+
+ const defaultRole = manifest?.roles?.find(
+ (r) => r.universalIdentifier === app?.defaultRoleUniversalIdentifier,
+ );
const handleInstall = async () => {
- if (isDefined(application)) {
+ if (isDefined(detail)) {
await install({
- universalIdentifier: application.id,
+ universalIdentifier: detail.universalIdentifier,
});
}
};
+ const hasUpdate =
+ isNpmApp &&
+ isDefined(latestAvailableVersion) &&
+ isDefined(currentVersion) &&
+ isNewerSemver(latestAvailableVersion, currentVersion);
+
+ const { upgrade, isUpgrading } = useUpgradeApplication();
+
+ const handleUpgrade = async () => {
+ if (!isDefined(registrationId) || !isDefined(latestAvailableVersion)) {
+ return;
+ }
+
+ await upgrade({
+ appRegistrationId: registrationId,
+ targetVersion: latestAvailableVersion,
+ });
+ };
+
+ const getActionButton = () => {
+ if (!canInstallMarketplaceApps) {
+ return null;
+ }
+ if (!isAlreadyInstalled) {
+ return (
+
+
+
+ );
+ }
+ if (hasUpdate && isDefined(registrationId)) {
+ return (
+
+
+
+ );
+ }
+ return (
+
+
+
+ );
+ };
+
+ const contentEntries = [
+ {
+ icon: IconBox,
+ count: (manifest?.objects ?? []).length,
+ one: t`object`,
+ many: t`objects`,
+ },
+ {
+ icon: IconListDetails,
+ count: (manifest?.fields ?? []).length,
+ one: t`field`,
+ many: t`fields`,
+ },
+ {
+ icon: IconCommand,
+ count: (manifest?.logicFunctions ?? []).length,
+ one: t`logic function`,
+ many: t`logic functions`,
+ },
+ {
+ icon: IconGraph,
+ count: (manifest?.frontComponents ?? []).filter(
+ (fc) =>
+ !isDefined(fc.command) &&
+ fc.universalIdentifier !==
+ manifest?.application
+ .settingsCustomTabFrontComponentUniversalIdentifier,
+ ).length,
+ one: t`widget`,
+ many: t`widgets`,
+ },
+ {
+ icon: IconCommand,
+ count: (manifest?.frontComponents ?? []).filter(
+ (fc) => isDefined(fc.command) && !fc.isHeadless,
+ ).length,
+ one: t`command`,
+ many: t`commands`,
+ },
+ {
+ icon: IconShield,
+ count: (manifest?.roles ?? []).filter(
+ (role) =>
+ role.universalIdentifier !==
+ manifest?.application.defaultRoleUniversalIdentifier,
+ ).length,
+ one: t`role`,
+ many: t`roles`,
+ },
+ {
+ icon: IconBook,
+ count: (manifest?.skills ?? []).length,
+ one: t`skill`,
+ many: t`skills`,
+ },
+ {
+ icon: IconLego,
+ count: (manifest?.agents ?? []).length,
+ one: t`agent`,
+ many: t`agents`,
+ },
+ ].filter((entry) => entry.count > 0);
+
const activeTabId = useAtomComponentStateValue(
activeTabIdComponentState,
AVAILABLE_APPLICATION_DETAIL_ID,
@@ -333,123 +382,145 @@ export const SettingsAvailableApplicationDetails = () => {
{ id: 'settings', title: t`Settings`, Icon: IconSettings },
];
- const getInitials = (name: string) => {
- return name.charAt(0).toUpperCase();
- };
-
- const hasScreenshots =
- application?.screenshots && application.screenshots.length > 0;
-
const renderActiveTabContent = () => {
- if (!application) return null;
+ if (!detail) return null;
switch (activeTabId) {
case 'about':
return (
<>
{hasScreenshots && (
- <>
+
- {application.screenshots
- .slice(0, 6)
- .map((screenshot, index) => (
- setSelectedScreenshotIndex(index)}
- >
-
-
- ))}
+ {screenshots.slice(0, 6).map((screenshot, index) => (
+ setSelectedScreenshotIndex(index)}
+ >
+
+
+ ))}
- >
+
)}
{t`About`}
-
- {application.aboutDescription}
-
-
- {t`Providers`}
-
- {application.providers.map((provider) => (
-
- {provider}
-
- ))}
-
+
+ {getActionButton()}
{t`Created by`}
- {application.author}
-
-
-
- {t`Category`}
- {application.category}
+ {app?.author ?? 'Unknown'}
-
- {t`Content`}
-
-
- {application.content.objects} {t`objects`}
-
-
-
- {application.content.fields} {t`fields`}
-
-
-
- {application.content.frontComponents} {t`front components`}
-
-
-
- {application.content.functions} {t`functions`}
-
-
+ {app?.category && (
+
+ {t`Category`}
+ {app.category}
+
+ )}
+
+ {contentEntries.length > 0 && (
+
+ {t`Content`}
+ {contentEntries.map((entry) => (
+
+
+ {entry.count}{' '}
+ {entry.count === 1 ? entry.one : entry.many}
+
+ ))}
+
+ )}
+
+ {isAlreadyInstalled && (
+
+ {t`Current`}
+
+ {installedApp?.version ?? t`Unknown`}
+
+
+ )}
{t`Latest`}
- {application.version}
+
+ {detail.latestAvailableVersion ?? '0.0.0'}
+
-
- {t`Developers links`}
-
-
- {t`Website`}
-
-
-
- {t`Terms / Privacy`}
-
-
+ {(app?.websiteUrl ||
+ app?.termsUrl ||
+ app?.emailSupport ||
+ app?.issueReportUrl) && (
+
+ {t`Developers links`}
+ {app?.websiteUrl && (
+
+
+ {t`Website`}
+
+ )}
+ {app?.termsUrl && (
+
+
+ {t`Terms / Privacy`}
+
+ )}
+ {app?.emailSupport && (
+
+
+ {t`Email support`}
+
+ )}
+ {app?.issueReportUrl && (
+
+
+ {t`Report and issue`}
+
+ )}
+
+ )}
>
@@ -457,30 +528,32 @@ export const SettingsAvailableApplicationDetails = () => {
case 'content':
return (
);
case 'permissions':
return (
);
case 'settings':
- return {t`Settings tab`}
;
+ return (
+
+ );
default:
return null;
}
};
- if (!application) {
+ if (!detail) {
return null;
}
return (
{
children: t`Applications`,
href: getSettingsPath(SettingsPath.Applications),
},
- { children: application.name },
+ { children: displayName },
]}
+ title={
+
+ }
>
- {isUnlisted && (
-
-
- {t`This application is not listed on the marketplace. It was shared via a direct link.`}
-
- )}
-
-
-
- {application.logo ? (
-
- ) : (
-
- {getInitials(application.name)}
-
- )}
-
-
- {application.name}
-
- {application.description}
-
-
-
- {canInstallMarketplaceApps && (
-
- )}
-
-
{
+ return OBJECT_SETTINGS_WIDTH + 'px';
+ }};
+`;
+
+const StyledHeader = styled.div`
+ align-items: center;
+ display: flex;
+ gap: ${themeCssVariables.spacing[4]};
+ justify-content: space-between;
+`;
+
+const StyledHeaderLeft = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: ${themeCssVariables.spacing[2]};
+`;
+
+const StyledHeaderTop = styled.div`
+ align-items: center;
+ display: flex;
+ gap: ${themeCssVariables.spacing[3]};
+`;
+
+const StyledLogo = styled.div`
+ align-items: center;
+ background-color: ${themeCssVariables.background.tertiary};
+ border-radius: ${themeCssVariables.border.radius.sm};
+ display: flex;
+ flex-shrink: 0;
+ height: 24px;
+ justify-content: center;
+ overflow: hidden;
+ width: 24px;
+`;
+
+const StyledLogoImage = styled.img`
+ height: 32px;
+ object-fit: contain;
+ width: 32px;
+`;
+
+const StyledLogoPlaceholder = styled.div`
+ align-items: center;
+ background-color: ${themeCssVariables.color.blue};
+ border-radius: ${themeCssVariables.border.radius.xs};
+ color: ${themeCssVariables.font.color.inverted};
+ display: flex;
+ font-size: ${themeCssVariables.font.size.lg};
+ font-weight: ${themeCssVariables.font.weight.medium};
+ height: 32px;
+ justify-content: center;
+ width: 32px;
+`;
+
+const StyledAppName = styled.div`
+ color: ${themeCssVariables.font.color.primary};
+ font-size: ${themeCssVariables.font.size.lg};
+ font-weight: ${themeCssVariables.font.weight.semiBold};
+`;
+
+const StyledAppDescription = styled.div`
+ color: ${themeCssVariables.font.color.secondary};
+ font-size: ${themeCssVariables.font.size.md};
+ font-weight: ${themeCssVariables.font.weight.regular};
+`;
+
+const StyledUnlistedBanner = styled.div`
+ align-items: center;
+ background-color: ${themeCssVariables.background.transparent.lighter};
+ border: 1px solid ${themeCssVariables.border.color.medium};
+ border-radius: ${themeCssVariables.border.radius.sm};
+ color: ${themeCssVariables.font.color.secondary};
+ display: flex;
+ font-size: ${themeCssVariables.font.size.md};
+ gap: ${themeCssVariables.spacing[2]};
+ margin-bottom: ${themeCssVariables.spacing[4]};
+ padding: ${themeCssVariables.spacing[3]} ${themeCssVariables.spacing[4]};
+`;
+
+export const SettingsApplicationDetailTitle = ({
+ displayName,
+ description,
+ logoUrl,
+ isUnlisted = false,
+}: SettingsApplicationDetailTitleProps) => {
+ return (
+
+ {isUnlisted && (
+
+
+ {t`This application is not listed on the marketplace. It was shared via a direct link.`}
+
+ )}
+
+
+
+
+ {logoUrl ? (
+
+ ) : (
+
+ {displayName.charAt(0).toUpperCase()}
+
+ )}
+
+ {displayName}
+
+ {description && (
+ {description}
+ )}
+
+
+
+ );
+};
diff --git a/packages/twenty-front/src/pages/settings/applications/components/SettingsApplicationVersionContainer.tsx b/packages/twenty-front/src/pages/settings/applications/components/SettingsApplicationVersionContainer.tsx
index f7841cfc73..a3d93a5fdf 100644
--- a/packages/twenty-front/src/pages/settings/applications/components/SettingsApplicationVersionContainer.tsx
+++ b/packages/twenty-front/src/pages/settings/applications/components/SettingsApplicationVersionContainer.tsx
@@ -1,3 +1,5 @@
+import { styled } from '@linaria/react';
+import { themeCssVariables } from 'twenty-ui/theme-constants';
import { SettingsAdminTableCard } from '@/settings/admin-panel/components/SettingsAdminTableCard';
import { SettingsAdminVersionDisplay } from '@/settings/admin-panel/components/SettingsAdminVersionDisplay';
import { useUpgradeApplication } from '@/marketplace/hooks/useUpgradeApplication';
@@ -11,6 +13,12 @@ import {
} from '~/generated-metadata/graphql';
import { isNewerSemver } from '~/pages/settings/applications/utils/isNewerSemver';
+const StyledContainer = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: ${themeCssVariables.spacing[4]};
+`;
+
export const SettingsApplicationVersionContainer = ({
application,
latestAvailableVersion,
@@ -81,7 +89,7 @@ export const SettingsApplicationVersionContainer = ({
];
return (
- <>
+
)}
- >
+
);
};
diff --git a/packages/twenty-front/src/pages/settings/applications/tabs/SettingsApplicationDetailAboutTab.tsx b/packages/twenty-front/src/pages/settings/applications/tabs/SettingsApplicationDetailAboutTab.tsx
index c186d52529..ce31ace490 100644
--- a/packages/twenty-front/src/pages/settings/applications/tabs/SettingsApplicationDetailAboutTab.tsx
+++ b/packages/twenty-front/src/pages/settings/applications/tabs/SettingsApplicationDetailAboutTab.tsx
@@ -71,31 +71,6 @@ export const SettingsApplicationDetailAboutTab = ({
return (
<>
-
-
-
0
+ ? t`Set your application configuration variables`
+ : t`No variables to set for this application`;
return (
-
+
{editedEnvVariables.map((editedEnvVariable) => (
& {
- objects: { id: string }[];
- };
+ application?: Pick<
+ Application,
+ 'applicationVariables' | 'id' | 'universalIdentifier' | 'canBeUninstalled'
+ >;
}) => {
const { updateOneApplicationVariable } = useUpdateOneApplicationVariable();
- if (!isDefined(application)) {
- return null;
- }
-
- const envVariables = [...(application.applicationVariables ?? [])].sort(
+ const envVariables = [...(application?.applicationVariables ?? [])].sort(
(a, b) => a.key.localeCompare(b.key),
);
return (
- <>
-
- updateOneApplicationVariable({
- key,
- value,
- applicationId: application.id,
- })
- }
- />
- >
+
+ application?.id
+ ? updateOneApplicationVariable({
+ key,
+ value,
+ applicationId: application.id,
+ })
+ : null
+ }
+ />
);
};
diff --git a/packages/twenty-front/src/pages/settings/applications/tabs/SettingsApplicationPermissionsTab.tsx b/packages/twenty-front/src/pages/settings/applications/tabs/SettingsApplicationPermissionsTab.tsx
index 033a6809da..68855d7297 100644
--- a/packages/twenty-front/src/pages/settings/applications/tabs/SettingsApplicationPermissionsTab.tsx
+++ b/packages/twenty-front/src/pages/settings/applications/tabs/SettingsApplicationPermissionsTab.tsx
@@ -9,14 +9,16 @@ import { useSetAtomFamilyState } from '@/ui/utilities/state/jotai/hooks/useSetAt
import { t } from '@lingui/core/macro';
import { useCallback, useEffect, useMemo, useState } from 'react';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
+import {
+ type ObjectFieldManifest,
+ type ObjectManifest,
+ type RoleManifest,
+} from 'twenty-shared/application';
import { STANDARD_OBJECTS } from 'twenty-shared/metadata';
import { isDefined } from 'twenty-shared/utils';
import { v4 as uuidv4 } from 'uuid';
import {
FieldMetadataType,
- type MarketplaceAppDefaultRole,
- type MarketplaceAppField,
- type MarketplaceAppObject,
type PermissionFlagType,
} from '~/generated-metadata/graphql';
@@ -24,12 +26,12 @@ import { findObjectNameByUniversalIdentifier } from '~/pages/settings/applicatio
type SettingsApplicationPermissionsTabProps = {
defaultRoleId?: string | null;
- marketplaceAppDefaultRole?: MarketplaceAppDefaultRole | null;
- marketplaceAppObjects?: MarketplaceAppObject[];
+ marketplaceAppDefaultRole?: RoleManifest;
+ marketplaceAppObjects?: ObjectManifest[];
};
const resolvePermissionIds = (
- defaultRole: MarketplaceAppDefaultRole,
+ defaultRole: RoleManifest,
objectMetadataItems: EnrichedObjectMetadataItem[],
): {
objectUniversalIdToIdMap: Record;
@@ -40,10 +42,10 @@ const resolvePermissionIds = (
const allObjectUniversalIds = new Set();
- for (const permission of defaultRole.objectPermissions) {
+ for (const permission of defaultRole.objectPermissions ?? []) {
allObjectUniversalIds.add(permission.objectUniversalIdentifier);
}
- for (const permission of defaultRole.fieldPermissions) {
+ for (const permission of defaultRole.fieldPermissions ?? []) {
allObjectUniversalIds.add(permission.objectUniversalIdentifier);
}
@@ -61,7 +63,7 @@ const resolvePermissionIds = (
}
}
- for (const permission of defaultRole.fieldPermissions) {
+ for (const permission of defaultRole.fieldPermissions ?? []) {
const objectName = findObjectNameByUniversalIdentifier(
permission.objectUniversalIdentifier,
);
@@ -100,22 +102,23 @@ const resolvePermissionIds = (
};
const buildSyntheticRole = (
- defaultRole: MarketplaceAppDefaultRole,
+ defaultRole: RoleManifest,
objectUniversalIdToIdMap: Record,
fieldUniversalIdToIdMap: Record,
): RoleWithPartialMembers => ({
__typename: 'Role',
- id: defaultRole.id,
+ id: defaultRole.universalIdentifier,
label: defaultRole.label,
description: defaultRole.description ?? '',
icon: '',
isEditable: false,
- canReadAllObjectRecords: defaultRole.canReadAllObjectRecords,
- canUpdateAllObjectRecords: defaultRole.canUpdateAllObjectRecords,
- canSoftDeleteAllObjectRecords: defaultRole.canSoftDeleteAllObjectRecords,
- canDestroyAllObjectRecords: defaultRole.canDestroyAllObjectRecords,
- canUpdateAllSettings: defaultRole.canUpdateAllSettings,
- canAccessAllTools: defaultRole.canAccessAllTools,
+ canReadAllObjectRecords: defaultRole.canReadAllObjectRecords ?? false,
+ canUpdateAllObjectRecords: defaultRole.canUpdateAllObjectRecords ?? false,
+ canSoftDeleteAllObjectRecords:
+ defaultRole.canSoftDeleteAllObjectRecords ?? false,
+ canDestroyAllObjectRecords: defaultRole.canDestroyAllObjectRecords ?? false,
+ canUpdateAllSettings: defaultRole.canUpdateAllSettings ?? false,
+ canAccessAllTools: defaultRole.canAccessAllTools ?? false,
canBeAssignedToUsers: false,
canBeAssignedToAgents: false,
canBeAssignedToApiKeys: false,
@@ -124,20 +127,22 @@ const buildSyntheticRole = (
apiKeys: [],
rowLevelPermissionPredicates: [],
rowLevelPermissionPredicateGroups: [],
- objectPermissions: defaultRole.objectPermissions.map((permission) => ({
- __typename: 'ObjectPermission' as const,
- objectMetadataId:
- objectUniversalIdToIdMap[permission.objectUniversalIdentifier] ??
- permission.objectUniversalIdentifier,
- canReadObjectRecords: permission.canReadObjectRecords,
- canUpdateObjectRecords: permission.canUpdateObjectRecords,
- canSoftDeleteObjectRecords: permission.canSoftDeleteObjectRecords,
- canDestroyObjectRecords: permission.canDestroyObjectRecords,
- })),
- fieldPermissions: defaultRole.fieldPermissions.map((permission) => ({
+ objectPermissions: (defaultRole.objectPermissions ?? []).map(
+ (permission) => ({
+ __typename: 'ObjectPermission' as const,
+ objectMetadataId:
+ objectUniversalIdToIdMap[permission.objectUniversalIdentifier] ??
+ permission.objectUniversalIdentifier,
+ canReadObjectRecords: permission.canReadObjectRecords,
+ canUpdateObjectRecords: permission.canUpdateObjectRecords,
+ canSoftDeleteObjectRecords: permission.canSoftDeleteObjectRecords,
+ canDestroyObjectRecords: permission.canDestroyObjectRecords,
+ }),
+ ),
+ fieldPermissions: (defaultRole.fieldPermissions ?? []).map((permission) => ({
__typename: 'FieldPermission' as const,
id: uuidv4(),
- roleId: defaultRole.id,
+ roleId: defaultRole.universalIdentifier,
objectMetadataId:
objectUniversalIdToIdMap[permission.objectUniversalIdentifier] ??
permission.objectUniversalIdentifier,
@@ -147,16 +152,16 @@ const buildSyntheticRole = (
canReadFieldValue: permission.canReadFieldValue,
canUpdateFieldValue: permission.canUpdateFieldValue,
})),
- permissionFlags: defaultRole.permissionFlags.map((flag) => ({
+ permissionFlags: (defaultRole.permissionFlags ?? []).map((flag) => ({
__typename: 'PermissionFlag' as const,
id: uuidv4(),
- roleId: defaultRole.id,
+ roleId: defaultRole.universalIdentifier,
flag: flag as PermissionFlagType,
})),
});
const buildFieldMetadataItemFromMarketplaceField = (
- field: MarketplaceAppField,
+ field: ObjectFieldManifest,
): FieldMetadataItem => {
const now = new Date().toISOString();
@@ -184,20 +189,20 @@ const buildFieldMetadataItemFromMarketplaceField = (
};
const buildobjectMetadataItemsFromMarketplaceApp = (
- defaultRole: MarketplaceAppDefaultRole,
+ defaultRole: RoleManifest,
objectUniversalIdToIdMap: Record,
- marketplaceAppObjects: MarketplaceAppObject[],
+ marketplaceAppObjects: ObjectManifest[],
): EnrichedObjectMetadataItem[] => {
const unresolvedUniversalIds = new Set();
- for (const permission of defaultRole.objectPermissions) {
+ for (const permission of defaultRole.objectPermissions ?? []) {
if (
!isDefined(objectUniversalIdToIdMap[permission.objectUniversalIdentifier])
) {
unresolvedUniversalIds.add(permission.objectUniversalIdentifier);
}
}
- for (const permission of defaultRole.fieldPermissions) {
+ for (const permission of defaultRole.fieldPermissions ?? []) {
if (
!isDefined(objectUniversalIdToIdMap[permission.objectUniversalIdentifier])
) {
@@ -221,7 +226,9 @@ const buildobjectMetadataItemsFromMarketplaceApp = (
buildFieldMetadataItemFromMarketplaceField,
);
- const objectFieldPermissions = defaultRole.fieldPermissions.filter(
+ const objectFieldPermissions = (
+ defaultRole.fieldPermissions ?? []
+ ).filter(
(permission) => permission.objectUniversalIdentifier === universalId,
);
@@ -277,8 +284,8 @@ const MarketplaceRoleEffect = ({
marketplaceAppObjects,
onObjectMetadataItemsFromMarketplaceApp,
}: {
- defaultRole: MarketplaceAppDefaultRole;
- marketplaceAppObjects: MarketplaceAppObject[];
+ defaultRole: RoleManifest;
+ marketplaceAppObjects: ObjectManifest[];
onObjectMetadataItemsFromMarketplaceApp: (
items: EnrichedObjectMetadataItem[],
) => void;
@@ -286,7 +293,7 @@ const MarketplaceRoleEffect = ({
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const setSettingsDraftRole = useSetAtomFamilyState(
settingsDraftRoleFamilyState,
- defaultRole.id,
+ defaultRole.universalIdentifier,
);
const { resolvedRole, objectMetadataItemsFromMarketplaceApp } =
@@ -329,8 +336,8 @@ const MarketplaceAppPermissions = ({
defaultRole,
marketplaceAppObjects,
}: {
- defaultRole: MarketplaceAppDefaultRole;
- marketplaceAppObjects: MarketplaceAppObject[];
+ defaultRole: RoleManifest;
+ marketplaceAppObjects: ObjectManifest[];
}) => {
const [
objectMetadataItemsFromMarketplaceApp,
@@ -353,7 +360,7 @@ const MarketplaceAppPermissions = ({
}
/>
)}
+ {isTarballSource && (
+
+
+
+
+
+ )}
+
{hasStats && (
{
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
- const { objects, fields, logicFunctions, frontComponents } = application;
+ const objects = content?.objects ?? [];
+ const fields = content?.fields ?? [];
+ const logicFunctions = content?.logicFunctions ?? [];
+ const frontComponents = content?.frontComponents ?? [];
const objectRows = useMemo(
(): ApplicationDataTableRow[] =>
- (objects ?? []).map((appObject) => ({
+ objects.map((appObject) => ({
key: appObject.nameSingular,
labelPlural: appObject.labelPlural,
icon: appObject.icon ?? undefined,
@@ -37,13 +42,13 @@ export const SettingsAvailableApplicationDetailContentTab = ({
type: field.type,
}),
),
- tagItem: { applicationId: application.id },
+ tagItem: { applicationId },
})),
- [objects, application.id],
+ [objects, applicationId],
);
const fieldGroupRows = useMemo((): ApplicationDataTableRow[] => {
- if (!isDefined(fields) || fields.length === 0) {
+ if (fields.length === 0) {
return [];
}
@@ -56,11 +61,9 @@ export const SettingsAvailableApplicationDetailContentTab = ({
>();
for (const field of fields) {
- if (!isDefined(field.objectUniversalIdentifier)) {
- continue;
- }
+ const objectUid = field.objectUniversalIdentifier;
- const existing = groupMap.get(field.objectUniversalIdentifier);
+ const existing = groupMap.get(objectUid);
const fieldItem: ApplicationDataTableFieldItem = {
key: field.name,
label: field.label,
@@ -71,17 +74,16 @@ export const SettingsAvailableApplicationDetailContentTab = ({
if (isDefined(existing)) {
existing.fieldItems.push(fieldItem);
} else {
- groupMap.set(field.objectUniversalIdentifier, {
- objectUniversalIdentifier: field.objectUniversalIdentifier,
+ groupMap.set(objectUid, {
+ objectUniversalIdentifier: objectUid,
fieldItems: [fieldItem],
});
}
}
return Array.from(groupMap.values()).map((group) => {
- const appObject = objects?.find(
- (appObj) =>
- appObj.universalIdentifier === group.objectUniversalIdentifier,
+ const appObject = objects.find(
+ (obj) => obj.universalIdentifier === group.objectUniversalIdentifier,
);
if (isDefined(appObject)) {
@@ -91,7 +93,7 @@ export const SettingsAvailableApplicationDetailContentTab = ({
icon: appObject.icon ?? undefined,
fieldsCount: group.fieldItems.length,
fields: group.fieldItems,
- tagItem: { applicationId: application.id },
+ tagItem: { applicationId },
};
}
@@ -123,7 +125,14 @@ export const SettingsAvailableApplicationDetailContentTab = ({
tagItem: {},
};
});
- }, [fields, objectMetadataItems, objects, application.id]);
+ }, [fields, objectMetadataItems, objects, applicationId]);
+
+ const roles = content?.roles ?? [];
+ const skills = content?.skills ?? [];
+ const agents = content?.agents ?? [];
+ const views = content?.views ?? [];
+ const navigationMenuItems = content?.navigationMenuItems ?? [];
+ const pageLayouts = content?.pageLayouts ?? [];
return (
<>
@@ -132,16 +141,73 @@ export const SettingsAvailableApplicationDetailContentTab = ({
fieldGroupRows={fieldGroupRows}
/>
({
+ name: lf.name ?? lf.universalIdentifier,
+ description: lf.description,
+ }))}
/>
({
+ name: fc.name ?? fc.universalIdentifier,
+ description: fc.description,
+ }))}
+ />
+ ({
+ name: role.label,
+ description: role.description,
+ }))}
+ />
+ ({
+ name: skill.label ?? skill.name,
+ description: skill.description,
+ }))}
+ />
+ ({
+ name: agent.label ?? agent.name,
+ description: agent.description,
+ }))}
+ />
+ ({
+ name: view.name,
+ }))}
+ />
+ ({
+ name: item.name ?? item.universalIdentifier,
+ }))}
+ />
+ ({
+ name: layout.name,
+ }))}
/>
>
);
diff --git a/packages/twenty-sdk/package.json b/packages/twenty-sdk/package.json
index d8ac1c9042..f663860d0c 100644
--- a/packages/twenty-sdk/package.json
+++ b/packages/twenty-sdk/package.json
@@ -1,6 +1,6 @@
{
"name": "twenty-sdk",
- "version": "0.8.0-canary.5",
+ "version": "0.8.0-canary.6",
"main": "dist/index.cjs",
"module": "dist/index.mjs",
"types": "dist/sdk/index.d.ts",
diff --git a/packages/twenty-sdk/src/cli/commands/app-command.ts b/packages/twenty-sdk/src/cli/commands/app-command.ts
index 67ec637c1c..3703c1eca1 100644
--- a/packages/twenty-sdk/src/cli/commands/app-command.ts
+++ b/packages/twenty-sdk/src/cli/commands/app-command.ts
@@ -7,6 +7,7 @@ import { AppInstallCommand } from './install';
import { AppPublishCommand } from './publish';
import { AppTypecheckCommand } from './typecheck';
import { AppUninstallCommand } from './uninstall';
+import { CatalogSyncCommand } from './catalog-sync';
import { DeployCommand } from './deploy';
import { LogicFunctionExecuteCommand } from './exec';
import { LogicFunctionLogsCommand } from './logs';
@@ -22,6 +23,7 @@ export const registerCommands = (program: Command): void => {
const publishCommand = new AppPublishCommand();
const typecheckCommand = new AppTypecheckCommand();
const uninstallCommand = new AppUninstallCommand();
+ const catalogSyncCommand = new CatalogSyncCommand();
const deployCommand = new DeployCommand();
const addCommand = new EntityAddCommand();
const logsCommand = new LogicFunctionLogsCommand();
@@ -80,6 +82,16 @@ export const registerCommands = (program: Command): void => {
});
});
+ program
+ .command('catalog-sync')
+ .description('Trigger marketplace catalog sync on the server')
+ .option('-r, --remote ', 'Sync on a specific remote')
+ .action(async (options) => {
+ await catalogSyncCommand.execute({
+ remote: options.remote,
+ });
+ });
+
program
.command('typecheck [appPath]')
.description('Run TypeScript type checking on the application')
diff --git a/packages/twenty-sdk/src/cli/commands/catalog-sync.ts b/packages/twenty-sdk/src/cli/commands/catalog-sync.ts
new file mode 100644
index 0000000000..2ef4c1fcc3
--- /dev/null
+++ b/packages/twenty-sdk/src/cli/commands/catalog-sync.ts
@@ -0,0 +1,32 @@
+import { ApiService } from '@/cli/utilities/api/api-service';
+import { ConfigService } from '@/cli/utilities/config/config-service';
+import chalk from 'chalk';
+
+export type CatalogSyncCommandOptions = {
+ remote?: string;
+};
+
+export class CatalogSyncCommand {
+ async execute(options: CatalogSyncCommandOptions): Promise {
+ if (options.remote) {
+ ConfigService.setActiveRemote(options.remote);
+ }
+
+ console.log(chalk.blue('Syncing marketplace catalog...'));
+
+ const apiService = new ApiService();
+
+ const result = await apiService.syncMarketplaceCatalog();
+
+ if (!result.success) {
+ console.error(
+ chalk.red(
+ `Catalog sync failed: ${result.error instanceof Error ? result.error.message : String(result.error)}`,
+ ),
+ );
+ process.exit(1);
+ }
+
+ console.log(chalk.green('✓ Marketplace catalog synced successfully'));
+ }
+}
diff --git a/packages/twenty-sdk/src/cli/commands/remote.ts b/packages/twenty-sdk/src/cli/commands/remote.ts
index 21a4fccde8..52fd47962d 100644
--- a/packages/twenty-sdk/src/cli/commands/remote.ts
+++ b/packages/twenty-sdk/src/cli/commands/remote.ts
@@ -71,6 +71,7 @@ export const registerRemoteCommands = (program: Command): void => {
.option('--as ', 'Name for this remote')
.option('--token ', 'API key for non-interactive auth')
.option('--url ', 'Server URL (alternative to positional arg)')
+ .option('--local', 'Connect to a local Twenty server (auto-detect)')
.action(
async (
nameOrUrl: string | undefined,
@@ -78,6 +79,7 @@ export const registerRemoteCommands = (program: Command): void => {
as?: string;
token?: string;
url?: string;
+ local?: boolean;
},
) => {
const configService = new ConfigService();
@@ -96,30 +98,50 @@ export const registerRemoteCommands = (program: Command): void => {
return;
}
- // Resolve the URL — from args, flags, or interactive prompt
- const apiUrl =
- nameOrUrl ??
- options.url ??
- (options.token
- ? ((await detectLocalServer()) ?? 'http://localhost:2020')
- : (
- await inquirer.prompt<{ apiUrl: string }>([
- {
- type: 'input',
- name: 'apiUrl',
- message: 'Twenty server URL:',
- validate: (input: string) => {
- try {
- new URL(input);
+ // Resolve the URL — from args, flags, auto-detect, or interactive prompt
+ let apiUrl = nameOrUrl ?? options.url;
- return true;
- } catch {
- return 'Please enter a valid URL';
- }
- },
+ if (!apiUrl) {
+ const detectedUrl = await detectLocalServer();
+
+ if (options.local) {
+ if (!detectedUrl) {
+ console.error(
+ chalk.red(
+ 'No local Twenty server found on ports 2020 or 3000.\n' +
+ 'Start one with: yarn twenty server start',
+ ),
+ );
+ process.exit(1);
+ }
+
+ apiUrl = detectedUrl;
+ } else if (detectedUrl) {
+ console.log(chalk.gray(`Found local server at ${detectedUrl}`));
+ apiUrl = detectedUrl;
+ } else if (options.token) {
+ apiUrl = 'http://localhost:2020';
+ } else {
+ apiUrl = (
+ await inquirer.prompt<{ apiUrl: string }>([
+ {
+ type: 'input',
+ name: 'apiUrl',
+ message: 'Twenty server URL:',
+ validate: (input: string) => {
+ try {
+ new URL(input);
+
+ return true;
+ } catch {
+ return 'Please enter a valid URL';
+ }
},
- ])
- ).apiUrl);
+ },
+ ])
+ ).apiUrl;
+ }
+ }
const name = options.as ?? deriveRemoteName(apiUrl);
diff --git a/packages/twenty-sdk/src/cli/operations/publish.ts b/packages/twenty-sdk/src/cli/operations/publish.ts
index 9e71c14472..d82d5aef4f 100644
--- a/packages/twenty-sdk/src/cli/operations/publish.ts
+++ b/packages/twenty-sdk/src/cli/operations/publish.ts
@@ -42,8 +42,7 @@ const innerAppPublish = async (
success: false,
error: {
code: APP_ERROR_CODES.PUBLISH_FAILED,
- message:
- 'npm publish failed. Make sure you are logged in (`npm login`) and the package name is available.',
+ message: `npm publish failed`,
},
};
}
diff --git a/packages/twenty-sdk/src/cli/utilities/api/api-service.ts b/packages/twenty-sdk/src/cli/utilities/api/api-service.ts
index f4f1d6a289..c03c1588a0 100644
--- a/packages/twenty-sdk/src/cli/utilities/api/api-service.ts
+++ b/packages/twenty-sdk/src/cli/utilities/api/api-service.ts
@@ -66,6 +66,10 @@ export class ApiService {
return this.applicationApi.uninstallApplication(universalIdentifier);
}
+ syncMarketplaceCatalog(): Promise> {
+ return this.applicationApi.syncMarketplaceCatalog();
+ }
+
getSchema(options?: { authToken?: string }): Promise> {
return this.schemaApi.getSchema(options);
}
diff --git a/packages/twenty-sdk/src/cli/utilities/api/application-api.ts b/packages/twenty-sdk/src/cli/utilities/api/application-api.ts
index ee300b7071..7752faaf6d 100644
--- a/packages/twenty-sdk/src/cli/utilities/api/application-api.ts
+++ b/packages/twenty-sdk/src/cli/utilities/api/application-api.ts
@@ -5,6 +5,44 @@ import { type Manifest } from 'twenty-shared/application';
export class ApplicationApi {
constructor(private readonly client: AxiosInstance) {}
+ async syncMarketplaceCatalog(): Promise> {
+ try {
+ const query = `
+ mutation SyncMarketplaceCatalog {
+ syncMarketplaceCatalog
+ }
+ `;
+
+ const response = await this.client.post(
+ '/metadata',
+ { query },
+ {
+ headers: {
+ 'Content-Type': 'application/json',
+ Accept: '*/*',
+ },
+ },
+ );
+
+ if (response.data.errors) {
+ return {
+ success: false,
+ error: response.data.errors[0],
+ };
+ }
+
+ return {
+ success: true,
+ data: response.data.data.syncMarketplaceCatalog,
+ };
+ } catch (error) {
+ return {
+ success: false,
+ error,
+ };
+ }
+ }
+
async findApplicationRegistrationByUniversalIdentifier(
universalIdentifier: string,
): Promise<
@@ -63,7 +101,6 @@ export class ApplicationApi {
async createApplicationRegistration(input: {
name: string;
- description?: string;
universalIdentifier: string;
}): Promise<
ApiResponse<{
diff --git a/packages/twenty-sdk/src/cli/utilities/build/common/synchronize-built-application.ts b/packages/twenty-sdk/src/cli/utilities/build/common/synchronize-built-application.ts
deleted file mode 100644
index 2fa09be7ad..0000000000
--- a/packages/twenty-sdk/src/cli/utilities/build/common/synchronize-built-application.ts
+++ /dev/null
@@ -1,147 +0,0 @@
-import { APP_ERROR_CODES, type CommandResult } from '@/cli/types';
-import { ApiService } from '@/cli/utilities/api/api-service';
-import { type BuiltFileInfo } from '@/cli/utilities/build/common/build-application';
-import { manifestUpdateChecksums } from '@/cli/utilities/build/manifest/manifest-update-checksums';
-import { writeManifestToOutput } from '@/cli/utilities/build/manifest/manifest-writer';
-import { serializeError } from '@/cli/utilities/error/serialize-error';
-import { FileUploader } from '@/cli/utilities/file/file-uploader';
-import { type Manifest } from 'twenty-shared/application';
-
-export type AppSyncOptions = {
- appPath: string;
- remote?: string;
-};
-
-const ensureApplicationRegistrationExists = async (
- apiService: ApiService,
- manifest: Manifest,
-): Promise => {
- const universalIdentifier = manifest.application.universalIdentifier;
-
- const findResult =
- await apiService.findApplicationRegistrationByUniversalIdentifier(
- universalIdentifier,
- );
-
- if (findResult.success && findResult.data) {
- return { success: true, data: undefined };
- }
-
- const createResult = await apiService.createApplicationRegistration({
- name: manifest.application.displayName,
- description: manifest.application.description,
- universalIdentifier,
- });
-
- if (!createResult.success) {
- return {
- success: false,
- error: {
- code: APP_ERROR_CODES.SYNC_FAILED,
- message: `Failed to create application registration: ${serializeError(createResult.error)}`,
- },
- };
- }
-
- return { success: true, data: undefined };
-};
-
-const ensureDevelopmentApplicationExists = async (
- apiService: ApiService,
- manifest: Manifest,
-): Promise => {
- const result = await apiService.createDevelopmentApplication({
- universalIdentifier: manifest.application.universalIdentifier,
- name: manifest.application.displayName,
- });
-
- if (!result.success) {
- return {
- success: false,
- error: {
- code: APP_ERROR_CODES.SYNC_FAILED,
- message: `Failed to create development application: ${serializeError(result.error)}`,
- },
- };
- }
-
- return { success: true, data: undefined };
-};
-
-export const synchronizeBuiltApplication = async ({
- appPath,
- manifest,
- builtFileInfos,
-}: {
- appPath: string;
- manifest: Manifest;
- builtFileInfos: Map;
-}): Promise => {
- const apiService = new ApiService();
- const universalIdentifier = manifest.application.universalIdentifier;
-
- const registrationResult = await ensureApplicationRegistrationExists(
- apiService,
- manifest,
- );
-
- if (!registrationResult.success) {
- return registrationResult;
- }
-
- const applicationResult = await ensureDevelopmentApplicationExists(
- apiService,
- manifest,
- );
-
- if (!applicationResult.success) {
- return applicationResult;
- }
-
- const fileUploader = new FileUploader({
- applicationUniversalIdentifier: universalIdentifier,
- appPath,
- });
-
- const uploadResults = await Promise.all(
- [...builtFileInfos.values()].map((fileInfo) =>
- fileUploader.uploadFile({
- builtPath: fileInfo.builtPath,
- fileFolder: fileInfo.fileFolder,
- }),
- ),
- );
-
- const failedUploads = uploadResults.filter((result) => !result.success);
-
- if (failedUploads.length > 0) {
- return {
- success: false,
- error: {
- code: APP_ERROR_CODES.SYNC_FAILED,
- message: `Failed to upload ${failedUploads.length} file(s).`,
- },
- };
- }
-
- const updatedManifest = manifestUpdateChecksums({
- manifest,
- builtFileInfos,
- });
-
- await writeManifestToOutput(appPath, updatedManifest);
-
- const syncResult = await apiService.syncApplication(updatedManifest);
-
- if (!syncResult.success) {
- return {
- success: false,
- error: {
- code: APP_ERROR_CODES.SYNC_FAILED,
- message: `Sync failed: ${serializeError(syncResult.error)}`,
- },
- };
- }
-
- return { success: true, data: undefined };
-};
diff --git a/packages/twenty-sdk/src/cli/utilities/dev/orchestrator/steps/register-app-orchestrator-step.ts b/packages/twenty-sdk/src/cli/utilities/dev/orchestrator/steps/register-app-orchestrator-step.ts
index a2403e87d2..de1ae293c0 100644
--- a/packages/twenty-sdk/src/cli/utilities/dev/orchestrator/steps/register-app-orchestrator-step.ts
+++ b/packages/twenty-sdk/src/cli/utilities/dev/orchestrator/steps/register-app-orchestrator-step.ts
@@ -70,7 +70,6 @@ export class RegisterAppOrchestratorStep {
const createResult = await this.apiService.createApplicationRegistration({
name: input.manifest.application.displayName,
- description: input.manifest.application.description,
universalIdentifier,
});
diff --git a/packages/twenty-server/src/database/typeorm/core/migrations/common/1774472400000-rename-marketplace-display-data-to-manifest.ts b/packages/twenty-server/src/database/typeorm/core/migrations/common/1774472400000-rename-marketplace-display-data-to-manifest.ts
new file mode 100644
index 0000000000..ed5d648a43
--- /dev/null
+++ b/packages/twenty-server/src/database/typeorm/core/migrations/common/1774472400000-rename-marketplace-display-data-to-manifest.ts
@@ -0,0 +1,49 @@
+import { MigrationInterface, QueryRunner } from 'typeorm';
+
+export class RenameMarketplaceDisplayDataToManifest1774472400000
+ implements MigrationInterface
+{
+ name = 'RenameMarketplaceDisplayDataToManifest1774472400000';
+
+ public async up(queryRunner: QueryRunner): Promise {
+ await queryRunner.query(
+ `ALTER TABLE "core"."applicationRegistration" RENAME COLUMN "marketplaceDisplayData" TO "manifest"`,
+ );
+ await queryRunner.query(
+ `ALTER TABLE "core"."applicationRegistration" DROP COLUMN IF EXISTS "description"`,
+ );
+ await queryRunner.query(
+ `ALTER TABLE "core"."applicationRegistration" DROP COLUMN IF EXISTS "logoUrl"`,
+ );
+ await queryRunner.query(
+ `ALTER TABLE "core"."applicationRegistration" DROP COLUMN IF EXISTS "author"`,
+ );
+ await queryRunner.query(
+ `ALTER TABLE "core"."applicationRegistration" DROP COLUMN IF EXISTS "websiteUrl"`,
+ );
+ await queryRunner.query(
+ `ALTER TABLE "core"."applicationRegistration" DROP COLUMN IF EXISTS "termsUrl"`,
+ );
+ }
+
+ public async down(queryRunner: QueryRunner): Promise {
+ await queryRunner.query(
+ `ALTER TABLE "core"."applicationRegistration" ADD "termsUrl" text`,
+ );
+ await queryRunner.query(
+ `ALTER TABLE "core"."applicationRegistration" ADD "websiteUrl" text`,
+ );
+ await queryRunner.query(
+ `ALTER TABLE "core"."applicationRegistration" ADD "author" text`,
+ );
+ await queryRunner.query(
+ `ALTER TABLE "core"."applicationRegistration" ADD "logoUrl" text`,
+ );
+ await queryRunner.query(
+ `ALTER TABLE "core"."applicationRegistration" ADD "description" text`,
+ );
+ await queryRunner.query(
+ `ALTER TABLE "core"."applicationRegistration" RENAME COLUMN "manifest" TO "marketplaceDisplayData"`,
+ );
+ }
+}
diff --git a/packages/twenty-server/src/engine/core-modules/application/application-development/application-development.resolver.ts b/packages/twenty-server/src/engine/core-modules/application/application-development/application-development.resolver.ts
index 31bd5b133f..c1e88a1e7c 100644
--- a/packages/twenty-server/src/engine/core-modules/application/application-development/application-development.resolver.ts
+++ b/packages/twenty-server/src/engine/core-modules/application/application-development/application-development.resolver.ts
@@ -24,6 +24,7 @@ import { ApplicationExceptionFilter } from 'src/engine/core-modules/application/
import { ApplicationSyncService } from 'src/engine/core-modules/application/application-manifest/application-sync.service';
import { ApplicationTokenPairDTO } from 'src/engine/core-modules/application/application-oauth/dtos/application-token-pair.dto';
import { ApplicationRegistrationVariableService } from 'src/engine/core-modules/application/application-registration-variable/application-registration-variable.service';
+import { resolveManifestAssetUrls } from 'src/engine/core-modules/application/application-marketplace/utils/resolve-manifest-asset-urls.util';
import { ApplicationRegistrationService } from 'src/engine/core-modules/application/application-registration/application-registration.service';
import { ApplicationRegistrationSourceType } from 'src/engine/core-modules/application/application-registration/enums/application-registration-source-type.enum';
import {
@@ -36,6 +37,7 @@ import { FileStorageService } from 'src/engine/core-modules/file-storage/file-st
import { FileDTO } from 'src/engine/core-modules/file/dtos/file.dto';
import { ResolverValidationPipe } from 'src/engine/core-modules/graphql/pipes/resolver-validation.pipe';
import { SdkClientGenerationService } from 'src/engine/core-modules/sdk-client/sdk-client-generation.service';
+import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { type WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity';
import { AuthUser } from 'src/engine/decorators/auth/auth-user.decorator';
import { AuthUserWorkspaceId } from 'src/engine/decorators/auth/auth-user-workspace-id.decorator';
@@ -64,6 +66,7 @@ export class ApplicationDevelopmentResolver {
private readonly applicationRegistrationVariableService: ApplicationRegistrationVariableService,
private readonly fileStorageService: FileStorageService,
private readonly sdkClientGenerationService: SdkClientGenerationService,
+ private readonly twentyConfigService: TwentyConfigService,
) {}
@Mutation(() => DevelopmentApplicationDTO)
@@ -71,10 +74,8 @@ export class ApplicationDevelopmentResolver {
@Args() { universalIdentifier, name }: CreateDevelopmentApplicationInput,
@AuthWorkspace() { id: workspaceId }: WorkspaceEntity,
): Promise {
- const applicationRegistrationId = await this.findApplicationRegistrationId(
- universalIdentifier,
- workspaceId,
- );
+ const applicationRegistrationId =
+ await this.findApplicationRegistrationId(universalIdentifier);
const existing = await this.applicationService.findByUniversalIdentifier({
universalIdentifier,
@@ -125,7 +126,6 @@ export class ApplicationDevelopmentResolver {
): Promise {
const applicationRegistrationId = await this.findApplicationRegistrationId(
manifest.application.universalIdentifier,
- workspaceId,
);
const application = await this.applicationService.findByUniversalIdentifier(
@@ -164,6 +164,7 @@ export class ApplicationDevelopmentResolver {
applicationRegistrationId,
manifest,
workspaceId,
+ application.id,
);
return {
@@ -216,7 +217,6 @@ export class ApplicationDevelopmentResolver {
private async findApplicationRegistrationId(
universalIdentifier: string,
- workspaceId: string,
): Promise {
const existingRegistration =
await this.applicationRegistrationService.findOneByUniversalIdentifier(
@@ -230,55 +230,33 @@ export class ApplicationDevelopmentResolver {
);
}
- const isOwner =
- await this.applicationRegistrationService.isOwnedByWorkspace(
- existingRegistration.id,
- workspaceId,
- );
-
- if (!isOwner) {
- throw new ApplicationException(
- 'Cannot sync application: registration is owned by another workspace',
- ApplicationExceptionCode.FORBIDDEN,
- );
- }
-
return existingRegistration.id;
}
private async syncRegistrationMetadata(
applicationRegistrationId: string,
- manifest: { application: ApplicationInput['manifest']['application'] },
+ manifest: ApplicationInput['manifest'],
workspaceId: string,
+ applicationId: string,
): Promise {
- const isOwner =
- await this.applicationRegistrationService.isOwnedByWorkspace(
+ const serverUrl = this.twentyConfigService.get('SERVER_URL');
+
+ const manifestWithResolvedUrls = resolveManifestAssetUrls(
+ manifest,
+ (filePath) =>
+ `${serverUrl}/public-assets/${workspaceId}/${applicationId}/${filePath}`,
+ );
+
+ await this.applicationRegistrationService.updateFromManifest(
+ applicationRegistrationId,
+ manifestWithResolvedUrls,
+ );
+
+ if (manifest.application.serverVariables) {
+ await this.applicationRegistrationVariableService.syncVariableSchemas(
applicationRegistrationId,
- workspaceId,
+ manifest.application.serverVariables,
);
-
- if (isOwner) {
- await this.applicationRegistrationService.update(
- {
- id: applicationRegistrationId,
- update: {
- name: manifest.application.displayName,
- description: manifest.application.description,
- logoUrl: manifest.application.logoUrl,
- author: manifest.application.author,
- websiteUrl: manifest.application.websiteUrl,
- termsUrl: manifest.application.termsUrl,
- },
- },
- workspaceId,
- );
-
- if (manifest.application.serverVariables) {
- await this.applicationRegistrationVariableService.syncVariableSchemas(
- applicationRegistrationId,
- manifest.application.serverVariables,
- );
- }
}
}
}
diff --git a/packages/twenty-server/src/engine/core-modules/application/application-marketplace/constants/marketplace-catalog-index.constant.ts b/packages/twenty-server/src/engine/core-modules/application/application-marketplace/constants/marketplace-catalog-index.constant.ts
index fb6e4cd047..24f425cc98 100644
--- a/packages/twenty-server/src/engine/core-modules/application/application-marketplace/constants/marketplace-catalog-index.constant.ts
+++ b/packages/twenty-server/src/engine/core-modules/application/application-marketplace/constants/marketplace-catalog-index.constant.ts
@@ -1,32 +1,22 @@
-import { type MarketplaceDisplayData } from 'src/engine/core-modules/application/application-marketplace/types/marketplace-display-data.type';
-
export type CuratedAppEntry = {
universalIdentifier: string;
sourcePackage: string;
isFeatured: boolean;
-
name: string;
description: string;
author: string;
logoUrl?: string;
websiteUrl?: string;
termsUrl?: string;
-
- richDisplayData: MarketplaceDisplayData;
+ latestAvailableVersion?: string;
};
-const MOCK_ENRICHMENT_APP_ID = 'a1b2c3d4-0000-0000-0000-000000000001';
-const MOCK_ENRICHMENT_JOB_ID = 'a1b2c3d4-0000-0000-0000-000000000100';
-
-const COMPANY_UNIVERSAL_ID = '20202020-b374-4779-a561-80086cb2e17f';
-const PERSON_UNIVERSAL_ID = '20202020-e674-48e5-a542-72570eee7213';
-
const MOCK_LOGO_SVG = ``;
const ENCODED_MOCK_LOGO = `data:image/svg+xml,${encodeURIComponent(MOCK_LOGO_SVG)}`;
export const MARKETPLACE_CATALOG_INDEX: CuratedAppEntry[] = [
{
- universalIdentifier: MOCK_ENRICHMENT_APP_ID,
+ universalIdentifier: 'a1b2c3d4-0000-0000-0000-000000000001',
sourcePackage: '@twentyhq/app-data-enrichment',
isFeatured: true,
name: 'Data Enrichment',
@@ -34,146 +24,6 @@ export const MARKETPLACE_CATALOG_INDEX: CuratedAppEntry[] = [
author: 'Twenty',
logoUrl: ENCODED_MOCK_LOGO,
websiteUrl: 'https://twenty.com',
- richDisplayData: {
- icon: 'IconSparkles',
- version: '1.0.0',
- category: 'Data',
- logo: ENCODED_MOCK_LOGO,
- screenshots: [
- 'https://placehold.co/800x400/f5f5f5/666?text=Screenshot+1',
- 'https://placehold.co/800x400/f5f5f5/666?text=Screenshot+2',
- 'https://placehold.co/800x400/f5f5f5/666?text=Screenshot+3',
- ],
- aboutDescription:
- 'Enhance your workspace with automated data intelligence. This app monitors your new records and automatically populates missing details such as job titles, company size, social profiles, and industry insights.',
- providers: ['Clearbit', 'Apollo', 'Hunter.io'],
- objects: [
- {
- universalIdentifier: MOCK_ENRICHMENT_JOB_ID,
- nameSingular: 'enrichmentJob',
- namePlural: 'enrichmentJobs',
- labelSingular: 'Enrichment Job',
- labelPlural: 'Enrichment Jobs',
- description: 'Tracks data enrichment requests and their status',
- icon: 'IconSparkles',
- fields: [
- {
- name: 'status',
- type: 'SELECT',
- label: 'Status',
- description: 'Current status of the enrichment job',
- icon: 'IconProgressCheck',
- universalIdentifier: 'a1b2c3d4-0000-0000-0000-000000000101',
- objectUniversalIdentifier: MOCK_ENRICHMENT_JOB_ID,
- },
- {
- name: 'provider',
- type: 'TEXT',
- label: 'Provider',
- description: 'Enrichment provider used',
- icon: 'IconCloud',
- universalIdentifier: 'a1b2c3d4-0000-0000-0000-000000000102',
- objectUniversalIdentifier: MOCK_ENRICHMENT_JOB_ID,
- },
- ],
- },
- ],
- fields: [
- {
- name: 'industry',
- type: 'TEXT',
- label: 'Industry',
- description: 'Company industry from enrichment',
- icon: 'IconBuildingFactory2',
- objectUniversalIdentifier: COMPANY_UNIVERSAL_ID,
- universalIdentifier: 'a1b2c3d4-0000-0000-0000-000000000201',
- },
- {
- name: 'linkedInUrl',
- type: 'LINKS',
- label: 'LinkedIn URL',
- description: 'LinkedIn profile URL from enrichment',
- icon: 'IconBrandLinkedin',
- objectUniversalIdentifier: PERSON_UNIVERSAL_ID,
- universalIdentifier: 'a1b2c3d4-0000-0000-0000-000000000203',
- },
- ],
- logicFunctions: [
- {
- name: 'enrich-on-create',
- description:
- 'Automatically enriches new records when they are created',
- timeoutSeconds: 30,
- },
- ],
- frontComponents: [],
- defaultRole: {
- id: 'a1b2c3d4-0000-0000-0000-000000000010',
- label: 'Data Enrichment default role',
- description: 'Default permissions for the Data Enrichment app',
- canReadAllObjectRecords: true,
- canUpdateAllObjectRecords: true,
- canSoftDeleteAllObjectRecords: true,
- canDestroyAllObjectRecords: true,
- canUpdateAllSettings: false,
- canAccessAllTools: false,
- objectPermissions: [
- {
- objectUniversalIdentifier: COMPANY_UNIVERSAL_ID,
- canReadObjectRecords: true,
- canUpdateObjectRecords: true,
- canSoftDeleteObjectRecords: false,
- canDestroyObjectRecords: false,
- },
- {
- objectUniversalIdentifier: PERSON_UNIVERSAL_ID,
- canReadObjectRecords: true,
- canUpdateObjectRecords: true,
- canSoftDeleteObjectRecords: true,
- canDestroyObjectRecords: false,
- },
- ],
- fieldPermissions: [],
- permissionFlags: ['DATA_MODEL', 'API_KEYS_AND_WEBHOOKS'],
- },
- },
- },
- {
- universalIdentifier: '4ec0391d-18d5-411c-b2f3-266ddc1c3ef7',
- sourcePackage: '@twentyhq/hello-world',
- isFeatured: false,
- name: 'Hello World',
- description: 'A simple hello world app to get started with Twenty apps.',
- author: 'Twenty',
- websiteUrl: 'https://twenty.com',
- richDisplayData: {
- icon: 'IconWorld',
- version: '0.2.2',
- category: 'Getting Started',
- screenshots: [],
- aboutDescription:
- 'A minimal example app that demonstrates the Twenty app framework. Creates a PostCard object and a logic function to generate new postcards. Great starting point for building your own apps.',
- providers: [],
- objects: [
- {
- universalIdentifier: 'e2c3d4f5-0000-0000-0000-000000000001',
- nameSingular: 'postCard',
- namePlural: 'postCards',
- labelSingular: 'Post Card',
- labelPlural: 'Post Cards',
- description: 'A simple postcard object',
- icon: 'IconMail',
- fields: [],
- },
- ],
- fields: [],
- logicFunctions: [
- {
- name: 'create-new-post-card',
- description: 'Creates a new postcard record',
- },
- ],
- frontComponents: [],
- },
+ latestAvailableVersion: '1.0.0',
},
];
diff --git a/packages/twenty-server/src/engine/core-modules/application/application-marketplace/crons/commands/marketplace-catalog-sync.command.ts b/packages/twenty-server/src/engine/core-modules/application/application-marketplace/crons/commands/marketplace-catalog-sync.command.ts
new file mode 100644
index 0000000000..b1cca8cdad
--- /dev/null
+++ b/packages/twenty-server/src/engine/core-modules/application/application-marketplace/crons/commands/marketplace-catalog-sync.command.ts
@@ -0,0 +1,19 @@
+import { Command, CommandRunner } from 'nest-commander';
+
+import { MarketplaceCatalogSyncService } from 'src/engine/core-modules/application/application-marketplace/marketplace-catalog-sync.service';
+
+@Command({
+ name: 'marketplace:catalog-sync',
+ description: 'Sync the marketplace catalog into ApplicationRegistration',
+})
+export class MarketplaceCatalogSyncCommand extends CommandRunner {
+ constructor(
+ private readonly marketplaceCatalogSyncService: MarketplaceCatalogSyncService,
+ ) {
+ super();
+ }
+
+ async run(): Promise {
+ await this.marketplaceCatalogSyncService.syncCatalog();
+ }
+}
diff --git a/packages/twenty-server/src/engine/core-modules/application/application-marketplace/dtos/marketplace-app-detail.dto.ts b/packages/twenty-server/src/engine/core-modules/application/application-marketplace/dtos/marketplace-app-detail.dto.ts
new file mode 100644
index 0000000000..77750267a4
--- /dev/null
+++ b/packages/twenty-server/src/engine/core-modules/application/application-marketplace/dtos/marketplace-app-detail.dto.ts
@@ -0,0 +1,49 @@
+import { Field, ObjectType } from '@nestjs/graphql';
+
+import { IsBoolean, IsNotEmpty, IsOptional, IsString } from 'class-validator';
+import { GraphQLJSON } from 'graphql-type-json';
+import { type Manifest } from 'twenty-shared/application';
+
+import { ApplicationRegistrationSourceType } from 'src/engine/core-modules/application/application-registration/enums/application-registration-source-type.enum';
+
+@ObjectType('MarketplaceAppDetail')
+export class MarketplaceAppDetailDTO {
+ @IsString()
+ @IsNotEmpty()
+ @Field()
+ universalIdentifier: string;
+
+ @IsString()
+ @IsNotEmpty()
+ @Field()
+ id: string;
+
+ @IsString()
+ @IsNotEmpty()
+ @Field()
+ name: string;
+
+ @Field(() => ApplicationRegistrationSourceType)
+ sourceType: ApplicationRegistrationSourceType;
+
+ @IsOptional()
+ @IsString()
+ @Field({ nullable: true })
+ sourcePackage?: string;
+
+ @IsOptional()
+ @IsString()
+ @Field({ nullable: true })
+ latestAvailableVersion?: string;
+
+ @IsBoolean()
+ @Field(() => Boolean)
+ isListed: boolean;
+
+ @IsBoolean()
+ @Field(() => Boolean)
+ isFeatured: boolean;
+
+ @Field(() => GraphQLJSON, { nullable: true })
+ manifest?: Manifest;
+}
diff --git a/packages/twenty-server/src/engine/core-modules/application/application-marketplace/dtos/marketplace-app.dto.ts b/packages/twenty-server/src/engine/core-modules/application/application-marketplace/dtos/marketplace-app.dto.ts
index 4ae1794af5..0914a0a9cd 100644
--- a/packages/twenty-server/src/engine/core-modules/application/application-marketplace/dtos/marketplace-app.dto.ts
+++ b/packages/twenty-server/src/engine/core-modules/application/application-marketplace/dtos/marketplace-app.dto.ts
@@ -1,204 +1,12 @@
-import { Field, Int, ObjectType } from '@nestjs/graphql';
+import { Field, ObjectType } from '@nestjs/graphql';
import {
- IsArray,
IsBoolean,
IsNotEmpty,
- IsNumber,
IsOptional,
IsString,
MaxLength,
- ValidateNested,
} from 'class-validator';
-import { Type } from 'class-transformer';
-
-@ObjectType('MarketplaceAppField')
-export class MarketplaceAppFieldDTO {
- @IsString()
- @Field()
- name: string;
-
- @IsString()
- @Field()
- type: string;
-
- @IsString()
- @Field()
- label: string;
-
- @IsOptional()
- @IsString()
- @Field({ nullable: true })
- description?: string;
-
- @IsOptional()
- @IsString()
- @Field({ nullable: true })
- icon?: string;
-
- @IsString()
- @Field({ nullable: true })
- objectUniversalIdentifier: string;
-
- @IsString()
- @Field({ nullable: true })
- universalIdentifier: string;
-}
-
-@ObjectType('MarketplaceAppObject')
-export class MarketplaceAppObjectDTO {
- @IsString()
- @Field()
- universalIdentifier: string;
-
- @IsString()
- @Field()
- nameSingular: string;
-
- @IsString()
- @Field()
- namePlural: string;
-
- @IsString()
- @Field()
- labelSingular: string;
-
- @IsString()
- @Field()
- labelPlural: string;
-
- @IsOptional()
- @IsString()
- @Field({ nullable: true })
- description?: string;
-
- @IsOptional()
- @IsString()
- @Field({ nullable: true })
- icon?: string;
-
- @IsArray()
- @Field(() => [MarketplaceAppFieldDTO])
- fields: MarketplaceAppFieldDTO[];
-}
-
-@ObjectType('MarketplaceAppLogicFunction')
-export class MarketplaceAppLogicFunctionDTO {
- @IsString()
- @Field()
- name: string;
-
- @IsOptional()
- @IsString()
- @Field({ nullable: true })
- description?: string;
-
- @IsOptional()
- @IsNumber()
- @Field(() => Int, { nullable: true })
- timeoutSeconds?: number;
-}
-
-@ObjectType('MarketplaceAppFrontComponent')
-export class MarketplaceAppFrontComponentDTO {
- @IsString()
- @Field()
- name: string;
-
- @IsOptional()
- @IsString()
- @Field({ nullable: true })
- description?: string;
-}
-
-@ObjectType('MarketplaceAppRoleObjectPermission')
-export class MarketplaceAppRoleObjectPermissionDTO {
- @IsString()
- @Field()
- objectUniversalIdentifier: string;
-
- @IsOptional()
- @Field(() => Boolean, { nullable: true })
- canReadObjectRecords?: boolean;
-
- @IsOptional()
- @Field(() => Boolean, { nullable: true })
- canUpdateObjectRecords?: boolean;
-
- @IsOptional()
- @Field(() => Boolean, { nullable: true })
- canSoftDeleteObjectRecords?: boolean;
-
- @IsOptional()
- @Field(() => Boolean, { nullable: true })
- canDestroyObjectRecords?: boolean;
-}
-
-@ObjectType('MarketplaceAppRoleFieldPermission')
-export class MarketplaceAppRoleFieldPermissionDTO {
- @IsString()
- @Field()
- objectUniversalIdentifier: string;
-
- @IsString()
- @Field()
- fieldUniversalIdentifier: string;
-
- @IsOptional()
- @Field(() => Boolean, { nullable: true })
- canReadFieldValue?: boolean;
-
- @IsOptional()
- @Field(() => Boolean, { nullable: true })
- canUpdateFieldValue?: boolean;
-}
-
-@ObjectType('MarketplaceAppDefaultRole')
-export class MarketplaceAppDefaultRoleDTO {
- @IsString()
- @IsNotEmpty()
- @Field()
- id: string;
-
- @IsString()
- @Field()
- label: string;
-
- @IsOptional()
- @IsString()
- @Field({ nullable: true })
- description?: string;
-
- @Field(() => Boolean)
- canReadAllObjectRecords: boolean;
-
- @Field(() => Boolean)
- canUpdateAllObjectRecords: boolean;
-
- @Field(() => Boolean)
- canSoftDeleteAllObjectRecords: boolean;
-
- @Field(() => Boolean)
- canDestroyAllObjectRecords: boolean;
-
- @Field(() => Boolean)
- canUpdateAllSettings: boolean;
-
- @Field(() => Boolean)
- canAccessAllTools: boolean;
-
- @IsArray()
- @Field(() => [MarketplaceAppRoleObjectPermissionDTO])
- objectPermissions: MarketplaceAppRoleObjectPermissionDTO[];
-
- @IsArray()
- @Field(() => [MarketplaceAppRoleFieldPermissionDTO])
- fieldPermissions: MarketplaceAppRoleFieldPermissionDTO[];
-
- @IsArray()
- @Field(() => [String])
- permissionFlags: string[];
-}
@ObjectType('MarketplaceApp')
export class MarketplaceAppDTO {
@@ -221,10 +29,6 @@ export class MarketplaceAppDTO {
@Field()
icon: string;
- @IsString()
- @Field()
- version: string;
-
@IsString()
@Field()
author: string;
@@ -238,50 +42,6 @@ export class MarketplaceAppDTO {
@Field({ nullable: true })
logo?: string;
- @IsArray()
- @Field(() => [String])
- screenshots: string[];
-
- @IsString()
- @Field()
- aboutDescription: string;
-
- @IsArray()
- @Field(() => [String])
- providers: string[];
-
- @IsOptional()
- @IsString()
- @Field({ nullable: true })
- websiteUrl?: string;
-
- @IsOptional()
- @IsString()
- @Field({ nullable: true })
- termsUrl?: string;
-
- @IsArray()
- @Field(() => [MarketplaceAppObjectDTO])
- objects: MarketplaceAppObjectDTO[];
-
- @IsArray()
- @Field(() => [MarketplaceAppFieldDTO])
- fields: MarketplaceAppFieldDTO[];
-
- @IsArray()
- @Field(() => [MarketplaceAppLogicFunctionDTO])
- logicFunctions: MarketplaceAppLogicFunctionDTO[];
-
- @IsArray()
- @Field(() => [MarketplaceAppFrontComponentDTO])
- frontComponents: MarketplaceAppFrontComponentDTO[];
-
- @IsOptional()
- @ValidateNested()
- @Type(() => MarketplaceAppDefaultRoleDTO)
- @Field(() => MarketplaceAppDefaultRoleDTO, { nullable: true })
- defaultRole?: MarketplaceAppDefaultRoleDTO;
-
@IsOptional()
@IsString()
@Field({ nullable: true })
diff --git a/packages/twenty-server/src/engine/core-modules/application/application-marketplace/marketplace-catalog-sync.service.ts b/packages/twenty-server/src/engine/core-modules/application/application-marketplace/marketplace-catalog-sync.service.ts
index 2203e99518..386fbdff5b 100644
--- a/packages/twenty-server/src/engine/core-modules/application/application-marketplace/marketplace-catalog-sync.service.ts
+++ b/packages/twenty-server/src/engine/core-modules/application/application-marketplace/marketplace-catalog-sync.service.ts
@@ -4,6 +4,9 @@ import { ApplicationRegistrationService } from 'src/engine/core-modules/applicat
import { ApplicationRegistrationSourceType } from 'src/engine/core-modules/application/application-registration/enums/application-registration-source-type.enum';
import { MARKETPLACE_CATALOG_INDEX } from 'src/engine/core-modules/application/application-marketplace/constants/marketplace-catalog-index.constant';
import { MarketplaceService } from 'src/engine/core-modules/application/application-marketplace/marketplace.service';
+import { buildRegistryCdnUrl } from 'src/engine/core-modules/application/application-marketplace/utils/build-registry-cdn-url.util';
+import { resolveManifestAssetUrls } from 'src/engine/core-modules/application/application-marketplace/utils/resolve-manifest-asset-urls.util';
+import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
@Injectable()
export class MarketplaceCatalogSyncService {
@@ -12,11 +15,12 @@ export class MarketplaceCatalogSyncService {
constructor(
private readonly applicationRegistrationService: ApplicationRegistrationService,
private readonly marketplaceService: MarketplaceService,
+ private readonly twentyConfigService: TwentyConfigService,
) {}
async syncCatalog(): Promise {
await this.syncCuratedApps();
- await this.syncNpmApps();
+ await this.syncRegistryApps();
this.logger.log('Marketplace catalog sync completed');
}
@@ -27,18 +31,12 @@ export class MarketplaceCatalogSyncService {
await this.applicationRegistrationService.upsertFromCatalog({
universalIdentifier: entry.universalIdentifier,
name: entry.name,
- description:
- entry.richDisplayData.aboutDescription ?? entry.description,
- author: entry.author,
sourceType: ApplicationRegistrationSourceType.NPM,
sourcePackage: entry.sourcePackage,
- logoUrl: entry.logoUrl ?? null,
- websiteUrl: entry.websiteUrl ?? null,
- termsUrl: entry.termsUrl ?? null,
- latestAvailableVersion: entry.richDisplayData.version ?? null,
+ latestAvailableVersion: entry.latestAvailableVersion ?? null,
isListed: true,
isFeatured: entry.isFeatured,
- marketplaceDisplayData: entry.richDisplayData,
+ manifest: null,
ownerWorkspaceId: null,
});
} catch (error) {
@@ -49,38 +47,59 @@ export class MarketplaceCatalogSyncService {
}
}
- private async syncNpmApps(): Promise {
- const npmApps = await this.marketplaceService.fetchAppsFromNpmRegistry();
+ private async syncRegistryApps(): Promise {
+ const packages = await this.marketplaceService.fetchAppsFromRegistry();
const curatedIdentifiers = new Set(
MARKETPLACE_CATALOG_INDEX.map((entry) => entry.universalIdentifier),
);
- for (const app of npmApps) {
- if (curatedIdentifiers.has(app.id)) {
- continue;
- }
-
+ for (const pkg of packages) {
try {
+ const manifest =
+ await this.marketplaceService.fetchManifestFromRegistryCdn(
+ pkg.name,
+ pkg.version,
+ );
+
+ if (!manifest) {
+ this.logger.debug(`Skipping ${pkg.name}: no manifest found on CDN`);
+ continue;
+ }
+
+ const universalIdentifier = manifest.application.universalIdentifier;
+
+ if (curatedIdentifiers.has(universalIdentifier)) {
+ continue;
+ }
+
+ const cdnBaseUrl = this.twentyConfigService.get('APP_REGISTRY_CDN_URL');
+
+ const manifestWithResolvedUrls = resolveManifestAssetUrls(
+ manifest,
+ (filePath) =>
+ buildRegistryCdnUrl({
+ cdnBaseUrl,
+ packageName: pkg.name,
+ version: pkg.version,
+ filePath,
+ }),
+ );
+
await this.applicationRegistrationService.upsertFromCatalog({
- universalIdentifier: app.id,
- name: app.name,
- description: app.description,
- author: app.author,
+ universalIdentifier,
+ name: manifest.application.displayName ?? pkg.name,
sourceType: ApplicationRegistrationSourceType.NPM,
- sourcePackage: app.sourcePackage ?? app.name,
- logoUrl: null,
- websiteUrl: app.websiteUrl ?? null,
- termsUrl: null,
- latestAvailableVersion: app.version ?? null,
+ sourcePackage: pkg.name,
+ latestAvailableVersion: pkg.version ?? null,
isListed: true,
isFeatured: false,
- marketplaceDisplayData: null,
+ manifest: manifestWithResolvedUrls,
ownerWorkspaceId: null,
});
} catch (error) {
this.logger.error(
- `Failed to sync npm app "${app.name}": ${error instanceof Error ? error.message : String(error)}`,
+ `Failed to sync registry app "${pkg.name}": ${error instanceof Error ? error.message : String(error)}`,
);
}
}
diff --git a/packages/twenty-server/src/engine/core-modules/application/application-marketplace/marketplace-query.service.ts b/packages/twenty-server/src/engine/core-modules/application/application-marketplace/marketplace-query.service.ts
index 329653409a..46d59d72ad 100644
--- a/packages/twenty-server/src/engine/core-modules/application/application-marketplace/marketplace-query.service.ts
+++ b/packages/twenty-server/src/engine/core-modules/application/application-marketplace/marketplace-query.service.ts
@@ -10,17 +10,14 @@ import {
import { ApplicationRegistrationService } from 'src/engine/core-modules/application/application-registration/application-registration.service';
import { MarketplaceCatalogSyncCronJob } from 'src/engine/core-modules/application/application-marketplace/crons/marketplace-catalog-sync.cron.job';
import { MarketplaceAppDTO } from 'src/engine/core-modules/application/application-marketplace/dtos/marketplace-app.dto';
+import { MarketplaceAppDetailDTO } from 'src/engine/core-modules/application/application-marketplace/dtos/marketplace-app-detail.dto';
import { InjectMessageQueue } from 'src/engine/core-modules/message-queue/decorators/message-queue.decorator';
import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants';
import { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service';
-const MARKETPLACE_CACHE_TTL_MS = 5 * 60 * 1000;
-
@Injectable()
export class MarketplaceQueryService {
private readonly logger = new Logger(MarketplaceQueryService.name);
- private cachedApps: MarketplaceAppDTO[] | null = null;
- private cacheExpiresAt = 0;
private hasSyncBeenEnqueued = false;
constructor(
@@ -30,10 +27,6 @@ export class MarketplaceQueryService {
) {}
async findManyMarketplaceApps(): Promise {
- if (this.cachedApps !== null && Date.now() < this.cacheExpiresAt) {
- return this.cachedApps;
- }
-
const registrations =
await this.applicationRegistrationService.findManyListed();
@@ -46,27 +39,25 @@ export class MarketplaceQueryService {
await this.messageQueueService.add(
MarketplaceCatalogSyncCronJob.name,
{},
+ { id: 'marketplace-catalog-sync' }, // Avoids triggering multiple pending jobs
);
}
return [];
}
- this.cachedApps = registrations.map((registration) =>
+ return registrations.map((registration) =>
this.toMarketplaceAppDTO(registration),
);
- this.cacheExpiresAt = Date.now() + MARKETPLACE_CACHE_TTL_MS;
-
- return this.cachedApps;
}
- async findOneMarketplaceApp(
+ async findMarketplaceAppDetail(
universalIdentifier: string,
- ): Promise {
+ ): Promise {
const registration =
await this.findRegistrationByUniversalIdentifier(universalIdentifier);
- return this.toMarketplaceAppDTO(registration);
+ return this.toMarketplaceAppDetailDTO(registration);
}
async findRegistrationByUniversalIdentifier(
@@ -87,34 +78,37 @@ export class MarketplaceQueryService {
return registration;
}
- toMarketplaceAppDTO(
+ private toMarketplaceAppDTO(
registration: ApplicationRegistrationEntity,
): MarketplaceAppDTO {
- const displayData = registration.marketplaceDisplayData;
+ const app = registration.manifest?.application;
return {
id: registration.universalIdentifier,
- name: registration.name,
- description: registration.description ?? '',
- icon: displayData?.icon ?? 'IconApps',
- version:
- displayData?.version ?? registration.latestAvailableVersion ?? '0.0.0',
- author: registration.author ?? 'Unknown',
- category: displayData?.category ?? '',
- logo: displayData?.logo,
- screenshots: displayData?.screenshots ?? [],
- aboutDescription:
- displayData?.aboutDescription ?? registration.description ?? '',
- providers: displayData?.providers ?? [],
- websiteUrl: registration.websiteUrl ?? undefined,
- termsUrl: registration.termsUrl ?? undefined,
- objects: displayData?.objects ?? [],
- fields: displayData?.fields ?? [],
- logicFunctions: displayData?.logicFunctions ?? [],
- frontComponents: displayData?.frontComponents ?? [],
+ name: app?.displayName ?? registration.name,
+ description: app?.description ?? '',
+ icon: app?.icon ?? 'IconApps',
+ author: app?.author ?? 'Unknown',
+ category: app?.category ?? '',
+ logo: app?.logoUrl ?? undefined,
sourcePackage: registration.sourcePackage ?? undefined,
- defaultRole: displayData?.defaultRole,
isFeatured: registration.isFeatured,
};
}
+
+ private toMarketplaceAppDetailDTO(
+ registration: ApplicationRegistrationEntity,
+ ): MarketplaceAppDetailDTO {
+ return {
+ id: registration.id,
+ universalIdentifier: registration.universalIdentifier,
+ name: registration.name,
+ sourceType: registration.sourceType,
+ sourcePackage: registration.sourcePackage ?? undefined,
+ latestAvailableVersion: registration.latestAvailableVersion ?? undefined,
+ isListed: registration.isListed,
+ isFeatured: registration.isFeatured,
+ manifest: registration.manifest ?? undefined,
+ };
+ }
}
diff --git a/packages/twenty-server/src/engine/core-modules/application/application-marketplace/marketplace.module.ts b/packages/twenty-server/src/engine/core-modules/application/application-marketplace/marketplace.module.ts
index 3a8f409504..e825cb7e0e 100644
--- a/packages/twenty-server/src/engine/core-modules/application/application-marketplace/marketplace.module.ts
+++ b/packages/twenty-server/src/engine/core-modules/application/application-marketplace/marketplace.module.ts
@@ -11,6 +11,7 @@ import { MarketplaceService } from 'src/engine/core-modules/application/applicat
import { FeatureFlagModule } from 'src/engine/core-modules/feature-flag/feature-flag.module';
import { TwentyConfigModule } from 'src/engine/core-modules/twenty-config/twenty-config.module';
import { PermissionsModule } from 'src/engine/metadata-modules/permissions/permissions.module';
+import { MarketplaceCatalogSyncCommand } from 'src/engine/core-modules/application/application-marketplace/crons/commands/marketplace-catalog-sync.command';
@Module({
imports: [
@@ -26,6 +27,7 @@ import { PermissionsModule } from 'src/engine/metadata-modules/permissions/permi
MarketplaceQueryService,
MarketplaceCatalogSyncCronJob,
MarketplaceCatalogSyncCronCommand,
+ MarketplaceCatalogSyncCommand,
MarketplaceResolver,
],
exports: [
diff --git a/packages/twenty-server/src/engine/core-modules/application/application-marketplace/marketplace.resolver.ts b/packages/twenty-server/src/engine/core-modules/application/application-marketplace/marketplace.resolver.ts
index f04ea1caf6..9d4f1765e5 100644
--- a/packages/twenty-server/src/engine/core-modules/application/application-marketplace/marketplace.resolver.ts
+++ b/packages/twenty-server/src/engine/core-modules/application/application-marketplace/marketplace.resolver.ts
@@ -6,6 +6,7 @@ import { MetadataResolver } from 'src/engine/api/graphql/graphql-config/decorato
import { ApplicationRegistrationExceptionFilter } from 'src/engine/core-modules/application/application-registration/application-registration-exception-filter';
import { ApplicationInstallService } from 'src/engine/core-modules/application/application-install/application-install.service';
import { MarketplaceAppDTO } from 'src/engine/core-modules/application/application-marketplace/dtos/marketplace-app.dto';
+import { MarketplaceAppDetailDTO } from 'src/engine/core-modules/application/application-marketplace/dtos/marketplace-app-detail.dto';
import { MarketplaceQueryService } from 'src/engine/core-modules/application/application-marketplace/marketplace-query.service';
import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity';
import { AuthWorkspace } from 'src/engine/decorators/auth/auth-workspace.decorator';
@@ -13,6 +14,10 @@ import { NoPermissionGuard } from 'src/engine/guards/no-permission.guard';
import { SettingsPermissionGuard } from 'src/engine/guards/settings-permission.guard';
import { UserAuthGuard } from 'src/engine/guards/user-auth.guard';
import { WorkspaceAuthGuard } from 'src/engine/guards/workspace-auth.guard';
+import { MarketplaceCatalogSyncCronJob } from 'src/engine/core-modules/application/application-marketplace/crons/marketplace-catalog-sync.cron.job';
+import { InjectMessageQueue } from 'src/engine/core-modules/message-queue/decorators/message-queue.decorator';
+import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants';
+import { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service';
@MetadataResolver()
@UseFilters(ApplicationRegistrationExceptionFilter)
@@ -21,6 +26,8 @@ export class MarketplaceResolver {
constructor(
private readonly marketplaceQueryService: MarketplaceQueryService,
private readonly applicationInstallService: ApplicationInstallService,
+ @InjectMessageQueue(MessageQueue.cronQueue)
+ private readonly messageQueueService: MessageQueueService,
) {}
@Query(() => [MarketplaceAppDTO])
@@ -28,11 +35,11 @@ export class MarketplaceResolver {
return this.marketplaceQueryService.findManyMarketplaceApps();
}
- @Query(() => MarketplaceAppDTO)
- async findOneMarketplaceApp(
+ @Query(() => MarketplaceAppDetailDTO)
+ async findMarketplaceAppDetail(
@Args('universalIdentifier') universalIdentifier: string,
- ): Promise {
- return this.marketplaceQueryService.findOneMarketplaceApp(
+ ): Promise {
+ return this.marketplaceQueryService.findMarketplaceAppDetail(
universalIdentifier,
);
}
@@ -56,4 +63,16 @@ export class MarketplaceResolver {
workspaceId: workspace.id,
});
}
+
+ @Mutation(() => Boolean)
+ @UseGuards(SettingsPermissionGuard(PermissionFlagType.MARKETPLACE_APPS))
+ async syncMarketplaceCatalog(): Promise {
+ await this.messageQueueService.add(
+ MarketplaceCatalogSyncCronJob.name,
+ {},
+ { id: 'marketplace-catalog-sync' }, // Avoids triggering multiple pending jobs
+ );
+
+ return true;
+ }
}
diff --git a/packages/twenty-server/src/engine/core-modules/application/application-marketplace/marketplace.service.ts b/packages/twenty-server/src/engine/core-modules/application/application-marketplace/marketplace.service.ts
index 1e0544ce0f..5dd7f24a0e 100644
--- a/packages/twenty-server/src/engine/core-modules/application/application-marketplace/marketplace.service.ts
+++ b/packages/twenty-server/src/engine/core-modules/application/application-marketplace/marketplace.service.ts
@@ -1,13 +1,21 @@
import { Injectable, Logger } from '@nestjs/common';
import axios from 'axios';
-import { isDefined } from 'twenty-shared/utils';
+import { type Manifest } from 'twenty-shared/application';
import { z } from 'zod';
-import { MarketplaceAppDTO } from 'src/engine/core-modules/application/application-marketplace/dtos/marketplace-app.dto';
+import { buildRegistryCdnUrl } from 'src/engine/core-modules/application/application-marketplace/utils/build-registry-cdn-url.util';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
-const npmSearchResultSchema = z.object({
+export type RegistryPackageInfo = {
+ name: string;
+ version: string;
+ description: string;
+ author: string;
+ websiteUrl?: string;
+};
+
+const registrySearchResultSchema = z.object({
objects: z.array(
z.object({
package: z.object({
@@ -16,7 +24,12 @@ const npmSearchResultSchema = z.object({
description: z.string().optional(),
keywords: z.array(z.string()).optional(),
author: z.object({ name: z.string().optional() }).optional(),
- links: z.object({ homepage: z.string().optional() }).optional(),
+ links: z
+ .object({
+ homepage: z.string().optional(),
+ npm: z.string().optional(),
+ })
+ .optional(),
}),
}),
),
@@ -28,7 +41,39 @@ export class MarketplaceService {
constructor(private readonly twentyConfigService: TwentyConfigService) {}
- async fetchAppsFromNpmRegistry(): Promise {
+ async fetchManifestFromRegistryCdn(
+ packageName: string,
+ version: string,
+ ): Promise {
+ const cdnBaseUrl = this.twentyConfigService.get('APP_REGISTRY_CDN_URL');
+ const url = buildRegistryCdnUrl({
+ cdnBaseUrl,
+ packageName,
+ version,
+ filePath: 'manifest.json',
+ });
+
+ try {
+ const { data } = await axios.get(url, {
+ headers: { 'User-Agent': 'Twenty-Marketplace' },
+ timeout: 5_000,
+ });
+
+ if (!data?.application) {
+ return null;
+ }
+
+ return data as Manifest;
+ } catch {
+ this.logger.debug(
+ `Could not fetch manifest from CDN for ${packageName}@${version}`,
+ );
+
+ return null;
+ }
+ }
+
+ async fetchAppsFromRegistry(): Promise {
const registryUrl = this.twentyConfigService.get('APP_REGISTRY_URL');
try {
@@ -40,53 +85,30 @@ export class MarketplaceService {
},
);
- const parsed = npmSearchResultSchema.safeParse(data);
+ const parsed = registrySearchResultSchema.safeParse(data);
if (!parsed.success) {
this.logger.warn(
- `Unexpected npm search response shape: ${parsed.error.message}`,
+ `Unexpected registry search response shape: ${parsed.error.message}`,
);
return [];
}
- return parsed.data.objects
- .map((result) => {
- const { name, version, description, author, links } = result.package;
- const twentyKeyword = (result.package.keywords ?? []).find(
- (keyword) => keyword.startsWith('twenty-uid:'),
- );
+ return parsed.data.objects.map((result) => {
+ const { name, version, description, author, links } = result.package;
- if (!isDefined(twentyKeyword)) {
- return null;
- }
-
- const universalIdentifier = twentyKeyword.replace('twenty-uid:', '');
-
- return {
- id: universalIdentifier,
- name,
- description: description ?? '',
- icon: 'IconApps',
- version,
- author: author?.name ?? 'Unknown',
- category: '',
- screenshots: [],
- aboutDescription: description ?? '',
- providers: [],
- websiteUrl: links?.homepage,
- objects: [],
- fields: [],
- logicFunctions: [],
- frontComponents: [],
- sourcePackage: name,
- isFeatured: false,
- };
- })
- .filter(isDefined);
+ return {
+ name,
+ version,
+ description: description ?? '',
+ author: author?.name ?? 'Unknown',
+ websiteUrl: links?.homepage ?? links?.npm,
+ };
+ });
} catch (error) {
this.logger.warn(
- `Failed to fetch apps from npm registry: ${error instanceof Error ? error.message : String(error)}`,
+ `Failed to fetch apps from registry ${registryUrl}: ${error instanceof Error ? error.message : String(error)}`,
);
return [];
diff --git a/packages/twenty-server/src/engine/core-modules/application/application-marketplace/types/marketplace-display-data.type.ts b/packages/twenty-server/src/engine/core-modules/application/application-marketplace/types/marketplace-display-data.type.ts
deleted file mode 100644
index 67765f8b06..0000000000
--- a/packages/twenty-server/src/engine/core-modules/application/application-marketplace/types/marketplace-display-data.type.ts
+++ /dev/null
@@ -1,75 +0,0 @@
-// Rich display data stored alongside ApplicationRegistration for marketplace
-// rendering. This is denormalized from the catalog source so it can be displayed
-// pre-install without resolving the package.
-export type MarketplaceDisplayData = {
- icon?: string;
- version?: string;
- category?: string;
- logo?: string;
- screenshots?: string[];
- aboutDescription?: string;
- providers?: string[];
- objects?: MarketplaceDisplayObject[];
- fields?: MarketplaceDisplayField[];
- logicFunctions?: MarketplaceDisplayLogicFunction[];
- frontComponents?: MarketplaceDisplayFrontComponent[];
- defaultRole?: MarketplaceDisplayDefaultRole;
-};
-
-type MarketplaceDisplayObject = {
- universalIdentifier: string;
- nameSingular: string;
- namePlural: string;
- labelSingular: string;
- labelPlural: string;
- description?: string;
- icon?: string;
- fields: MarketplaceDisplayField[];
-};
-
-type MarketplaceDisplayField = {
- name: string;
- type: string;
- label: string;
- description?: string;
- icon?: string;
- objectUniversalIdentifier: string;
- universalIdentifier: string;
-};
-
-type MarketplaceDisplayLogicFunction = {
- name: string;
- description?: string;
- timeoutSeconds?: number;
-};
-
-type MarketplaceDisplayFrontComponent = {
- name: string;
- description?: string;
-};
-
-type MarketplaceDisplayDefaultRole = {
- id: string;
- label: string;
- description?: string;
- canReadAllObjectRecords: boolean;
- canUpdateAllObjectRecords: boolean;
- canSoftDeleteAllObjectRecords: boolean;
- canDestroyAllObjectRecords: boolean;
- canUpdateAllSettings: boolean;
- canAccessAllTools: boolean;
- objectPermissions: Array<{
- objectUniversalIdentifier: string;
- canReadObjectRecords?: boolean;
- canUpdateObjectRecords?: boolean;
- canSoftDeleteObjectRecords?: boolean;
- canDestroyObjectRecords?: boolean;
- }>;
- fieldPermissions: Array<{
- objectUniversalIdentifier: string;
- fieldUniversalIdentifier: string;
- canReadFieldValue?: boolean;
- canUpdateFieldValue?: boolean;
- }>;
- permissionFlags: string[];
-};
diff --git a/packages/twenty-server/src/engine/core-modules/application/application-marketplace/utils/__tests__/resolve-manifest-asset-urls.util.spec.ts b/packages/twenty-server/src/engine/core-modules/application/application-marketplace/utils/__tests__/resolve-manifest-asset-urls.util.spec.ts
new file mode 100644
index 0000000000..1e0c9206d6
--- /dev/null
+++ b/packages/twenty-server/src/engine/core-modules/application/application-marketplace/utils/__tests__/resolve-manifest-asset-urls.util.spec.ts
@@ -0,0 +1,145 @@
+import { type Manifest } from 'twenty-shared/application';
+
+import { resolveManifestAssetUrls } from 'src/engine/core-modules/application/application-marketplace/utils/resolve-manifest-asset-urls.util';
+
+const buildMinimalManifest = (
+ overrides: Partial = {},
+): Manifest => ({
+ application: {
+ universalIdentifier: 'app-1',
+ defaultRoleUniversalIdentifier: 'role-1',
+ displayName: 'Test App',
+ description: 'A test app',
+ packageJsonChecksum: null,
+ yarnLockChecksum: null,
+ ...overrides,
+ },
+ objects: [],
+ fields: [],
+ logicFunctions: [],
+ frontComponents: [],
+ roles: [],
+ skills: [],
+ agents: [],
+ publicAssets: [],
+ views: [],
+ navigationMenuItems: [],
+ pageLayouts: [],
+});
+
+describe('resolveManifestAssetUrls', () => {
+ const urlBuilder = (filePath: string) =>
+ `https://cdn.example.com/pkg/${filePath}`;
+
+ it('should resolve a relative logoUrl', () => {
+ const manifest = buildMinimalManifest({ logoUrl: 'logo.png' });
+
+ const result = resolveManifestAssetUrls(manifest, urlBuilder);
+
+ expect(result.application.logoUrl).toBe(
+ 'https://cdn.example.com/pkg/logo.png',
+ );
+ });
+
+ it('should not modify an absolute logoUrl', () => {
+ const manifest = buildMinimalManifest({
+ logoUrl: 'https://example.com/logo.png',
+ });
+
+ const result = resolveManifestAssetUrls(manifest, urlBuilder);
+
+ expect(result.application.logoUrl).toBe('https://example.com/logo.png');
+ });
+
+ it('should not modify an http logoUrl', () => {
+ const manifest = buildMinimalManifest({
+ logoUrl: 'http://example.com/logo.png',
+ });
+
+ const result = resolveManifestAssetUrls(manifest, urlBuilder);
+
+ expect(result.application.logoUrl).toBe('http://example.com/logo.png');
+ });
+
+ it('should leave logoUrl undefined when not set', () => {
+ const manifest = buildMinimalManifest();
+
+ const result = resolveManifestAssetUrls(manifest, urlBuilder);
+
+ expect(result.application.logoUrl).toBeUndefined();
+ });
+
+ it('should resolve relative screenshot paths', () => {
+ const manifest = buildMinimalManifest({
+ screenshots: ['screen1.png', 'screen2.png'],
+ });
+
+ const result = resolveManifestAssetUrls(manifest, urlBuilder);
+
+ expect(result.application.screenshots).toEqual([
+ 'https://cdn.example.com/pkg/screen1.png',
+ 'https://cdn.example.com/pkg/screen2.png',
+ ]);
+ });
+
+ it('should not modify absolute screenshot URLs', () => {
+ const manifest = buildMinimalManifest({
+ screenshots: [
+ 'https://example.com/screen1.png',
+ 'https://example.com/screen2.png',
+ ],
+ });
+
+ const result = resolveManifestAssetUrls(manifest, urlBuilder);
+
+ expect(result.application.screenshots).toEqual([
+ 'https://example.com/screen1.png',
+ 'https://example.com/screen2.png',
+ ]);
+ });
+
+ it('should handle a mix of relative and absolute screenshot URLs', () => {
+ const manifest = buildMinimalManifest({
+ screenshots: ['relative.png', 'https://example.com/absolute.png'],
+ });
+
+ const result = resolveManifestAssetUrls(manifest, urlBuilder);
+
+ expect(result.application.screenshots).toEqual([
+ 'https://cdn.example.com/pkg/relative.png',
+ 'https://example.com/absolute.png',
+ ]);
+ });
+
+ it('should handle empty screenshots array', () => {
+ const manifest = buildMinimalManifest({ screenshots: [] });
+
+ const result = resolveManifestAssetUrls(manifest, urlBuilder);
+
+ expect(result.application.screenshots).toEqual([]);
+ });
+
+ it('should handle undefined screenshots', () => {
+ const manifest = buildMinimalManifest();
+
+ const result = resolveManifestAssetUrls(manifest, urlBuilder);
+
+ expect(result.application.screenshots).toEqual([]);
+ });
+
+ it('should preserve all other manifest properties', () => {
+ const manifest = buildMinimalManifest({
+ logoUrl: 'logo.png',
+ author: 'Test Author',
+ websiteUrl: 'https://test.com',
+ });
+ manifest.objects = [{ universalIdentifier: 'obj-1' } as never];
+
+ const result = resolveManifestAssetUrls(manifest, urlBuilder);
+
+ expect(result.application.author).toBe('Test Author');
+ expect(result.application.websiteUrl).toBe('https://test.com');
+ expect(result.application.displayName).toBe('Test App');
+ expect(result.objects).toEqual([{ universalIdentifier: 'obj-1' }]);
+ });
+});
diff --git a/packages/twenty-server/src/engine/core-modules/application/application-marketplace/utils/build-registry-cdn-url.util.ts b/packages/twenty-server/src/engine/core-modules/application/application-marketplace/utils/build-registry-cdn-url.util.ts
new file mode 100644
index 0000000000..df253e6196
--- /dev/null
+++ b/packages/twenty-server/src/engine/core-modules/application/application-marketplace/utils/build-registry-cdn-url.util.ts
@@ -0,0 +1,8 @@
+export const buildRegistryCdnUrl = (params: {
+ cdnBaseUrl: string;
+ packageName: string;
+ version: string;
+ filePath: string;
+}): string => {
+ return `${params.cdnBaseUrl}/${params.packageName}@${params.version}/${params.filePath}`;
+};
diff --git a/packages/twenty-server/src/engine/core-modules/application/application-marketplace/utils/resolve-manifest-asset-urls.util.ts b/packages/twenty-server/src/engine/core-modules/application/application-marketplace/utils/resolve-manifest-asset-urls.util.ts
new file mode 100644
index 0000000000..a9cf6a9759
--- /dev/null
+++ b/packages/twenty-server/src/engine/core-modules/application/application-marketplace/utils/resolve-manifest-asset-urls.util.ts
@@ -0,0 +1,23 @@
+import { type Manifest } from 'twenty-shared/application';
+
+const isAbsoluteUrl = (url: string): boolean =>
+ url.startsWith('http://') || url.startsWith('https://');
+
+export const resolveManifestAssetUrls = (
+ manifest: Manifest,
+ urlBuilder: (filePath: string) => string,
+): Manifest => {
+ const resolveUrl = (url: string): string =>
+ isAbsoluteUrl(url) ? url : urlBuilder(url);
+
+ return {
+ ...manifest,
+ application: {
+ ...manifest.application,
+ logoUrl: manifest.application.logoUrl
+ ? resolveUrl(manifest.application.logoUrl)
+ : undefined,
+ screenshots: (manifest.application.screenshots ?? []).map(resolveUrl),
+ },
+ };
+};
diff --git a/packages/twenty-server/src/engine/core-modules/application/application-oauth/controllers/oauth-registration.controller.ts b/packages/twenty-server/src/engine/core-modules/application/application-oauth/controllers/oauth-registration.controller.ts
index 4b9b75f72a..95e3c26e4d 100644
--- a/packages/twenty-server/src/engine/core-modules/application/application-oauth/controllers/oauth-registration.controller.ts
+++ b/packages/twenty-server/src/engine/core-modules/application/application-oauth/controllers/oauth-registration.controller.ts
@@ -140,9 +140,6 @@ export class OAuthRegistrationController {
const registration = this.applicationRegistrationRepository.create({
universalIdentifier: v4(),
name: body.client_name,
- description: null,
- logoUrl: body.logo_uri ?? null,
- author: null,
oAuthClientId: clientId,
oAuthClientSecretHash: null,
oAuthRedirectUris: body.redirect_uris,
@@ -150,7 +147,6 @@ export class OAuthRegistrationController {
createdByUserId: null,
ownerWorkspaceId: null,
sourceType: ApplicationRegistrationSourceType.OAUTH_ONLY,
- websiteUrl: body.client_uri ?? null,
});
await this.applicationRegistrationRepository.save(registration);
diff --git a/packages/twenty-server/src/engine/core-modules/application/application-oauth/oauth.service.ts b/packages/twenty-server/src/engine/core-modules/application/application-oauth/oauth.service.ts
index 56cbeda98f..96b1c8b41e 100644
--- a/packages/twenty-server/src/engine/core-modules/application/application-oauth/oauth.service.ts
+++ b/packages/twenty-server/src/engine/core-modules/application/application-oauth/oauth.service.ts
@@ -586,7 +586,6 @@ export class OAuthService {
return this.applicationService.create({
universalIdentifier: applicationRegistration.universalIdentifier,
name: applicationRegistration.name,
- description: applicationRegistration.description,
version: '0.0.0',
sourcePath: 'oauth-install',
applicationRegistrationId: applicationRegistration.id,
diff --git a/packages/twenty-server/src/engine/core-modules/application/application-registration/application-registration.entity.ts b/packages/twenty-server/src/engine/core-modules/application/application-registration/application-registration.entity.ts
index a16388ffcd..aa291d1d83 100644
--- a/packages/twenty-server/src/engine/core-modules/application/application-registration/application-registration.entity.ts
+++ b/packages/twenty-server/src/engine/core-modules/application/application-registration/application-registration.entity.ts
@@ -18,7 +18,7 @@ import {
} from 'typeorm';
import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars';
-import { type MarketplaceDisplayData } from 'src/engine/core-modules/application/application-marketplace/types/marketplace-display-data.type';
+import { type Manifest } from 'twenty-shared/application';
import { ApplicationRegistrationVariableEntity } from 'src/engine/core-modules/application/application-registration-variable/application-registration-variable.entity';
import { ApplicationRegistrationSourceType } from 'src/engine/core-modules/application/application-registration/enums/application-registration-source-type.enum';
import { FileEntity } from 'src/engine/core-modules/file/entities/file.entity';
@@ -62,18 +62,6 @@ export class ApplicationRegistrationEntity {
@Column({ nullable: false, type: 'text' })
name: string;
- @Field(() => String, { nullable: true })
- @Column({ nullable: true, type: 'text' })
- description: string | null;
-
- @Field(() => String, { nullable: true })
- @Column({ nullable: true, type: 'text' })
- logoUrl: string | null;
-
- @Field(() => String, { nullable: true })
- @Column({ nullable: true, type: 'text' })
- author: string | null;
-
@Field()
@Column({ nullable: false, type: 'text' })
oAuthClientId: string;
@@ -128,14 +116,6 @@ export class ApplicationRegistrationEntity {
@Column({ nullable: true, type: 'text' })
latestAvailableVersion: string | null;
- @Field(() => String, { nullable: true })
- @Column({ nullable: true, type: 'text' })
- websiteUrl: string | null;
-
- @Field(() => String, { nullable: true })
- @Column({ nullable: true, type: 'text' })
- termsUrl: string | null;
-
@Field(() => Boolean)
@Column({ type: 'boolean', default: false })
isListed: boolean;
@@ -145,7 +125,7 @@ export class ApplicationRegistrationEntity {
isFeatured: boolean;
@Column({ type: 'jsonb', nullable: true })
- marketplaceDisplayData: MarketplaceDisplayData | null;
+ manifest: Manifest | null;
@OneToMany(
() => ApplicationRegistrationVariableEntity,
diff --git a/packages/twenty-server/src/engine/core-modules/application/application-registration/application-registration.module.ts b/packages/twenty-server/src/engine/core-modules/application/application-registration/application-registration.module.ts
index bab0837e36..ae2a7bc679 100644
--- a/packages/twenty-server/src/engine/core-modules/application/application-registration/application-registration.module.ts
+++ b/packages/twenty-server/src/engine/core-modules/application/application-registration/application-registration.module.ts
@@ -8,6 +8,7 @@ import { ApplicationRegistrationVariableModule } from 'src/engine/core-modules/a
import { ApplicationTarballService } from 'src/engine/core-modules/application/application-registration/application-tarball.service';
import { ApplicationEntity } from 'src/engine/core-modules/application/application.entity';
import { ApplicationModule } from 'src/engine/core-modules/application/application.module';
+import { DomainServerConfigModule } from 'src/engine/core-modules/domain/domain-server-config/domain-server-config.module';
import { FeatureFlagModule } from 'src/engine/core-modules/feature-flag/feature-flag.module';
import { FileStorageModule } from 'src/engine/core-modules/file-storage/file-storage.module';
import { FileUrlModule } from 'src/engine/core-modules/file/file-url/file-url.module';
@@ -24,6 +25,7 @@ import { WorkspaceCacheStorageModule } from 'src/engine/workspace-cache-storage/
]),
ApplicationRegistrationVariableModule,
ApplicationModule,
+ DomainServerConfigModule,
FeatureFlagModule,
PermissionsModule,
FileStorageModule,
diff --git a/packages/twenty-server/src/engine/core-modules/application/application-registration/application-registration.resolver.ts b/packages/twenty-server/src/engine/core-modules/application/application-registration/application-registration.resolver.ts
index 47fa498fa0..052a230f6d 100644
--- a/packages/twenty-server/src/engine/core-modules/application/application-registration/application-registration.resolver.ts
+++ b/packages/twenty-server/src/engine/core-modules/application/application-registration/application-registration.resolver.ts
@@ -32,6 +32,7 @@ import { RotateClientSecretDTO } from 'src/engine/core-modules/application/appli
import { TransferApplicationRegistrationOwnershipInput } from 'src/engine/core-modules/application/application-registration/dtos/transfer-application-registration-ownership.input';
import { UpdateApplicationRegistrationInput } from 'src/engine/core-modules/application/application-registration/dtos/update-application-registration.input';
import { ApplicationRegistrationSourceType } from 'src/engine/core-modules/application/application-registration/enums/application-registration-source-type.enum';
+import { DomainServerConfigService } from 'src/engine/core-modules/domain/domain-server-config/services/domain-server-config.service';
import { AuthGraphqlApiExceptionFilter } from 'src/engine/core-modules/auth/filters/auth-graphql-api-exception.filter';
import { FileUrlService } from 'src/engine/core-modules/file/file-url/file-url.service';
import { PreventNestToAutoLogGraphqlErrorsFilter } from 'src/engine/core-modules/graphql/filters/prevent-nest-to-auto-log-graphql-errors.filter';
@@ -59,6 +60,7 @@ export class ApplicationRegistrationResolver {
private readonly applicationRegistrationVariableService: ApplicationRegistrationVariableService,
private readonly applicationTarballService: ApplicationTarballService,
private readonly fileUrlService: FileUrlService,
+ private readonly domainServerConfigService: DomainServerConfigService,
) {}
@UseGuards(PublicEndpointGuard, NoPermissionGuard)
@@ -290,6 +292,25 @@ export class ApplicationRegistrationResolver {
});
}
+ @UseGuards(
+ WorkspaceAuthGuard,
+ SettingsPermissionGuard(PermissionFlagType.API_KEYS_AND_WEBHOOKS),
+ )
+ @Query(() => String)
+ async getApplicationShareLink(
+ @Args('id') id: string,
+ @AuthWorkspace() { id: workspaceId }: WorkspaceEntity,
+ ): Promise {
+ const registration = await this.applicationRegistrationService.findOneById(
+ id,
+ workspaceId,
+ );
+
+ const frontUrl = this.domainServerConfigService.getFrontUrl();
+
+ return `${frontUrl.origin}/settings/applications/available/${registration.universalIdentifier}`;
+ }
+
@UseGuards(
WorkspaceAuthGuard,
SettingsPermissionGuard(PermissionFlagType.APPLICATIONS),
diff --git a/packages/twenty-server/src/engine/core-modules/application/application-registration/application-registration.service.ts b/packages/twenty-server/src/engine/core-modules/application/application-registration/application-registration.service.ts
index 88bdff92ca..2789e9a738 100644
--- a/packages/twenty-server/src/engine/core-modules/application/application-registration/application-registration.service.ts
+++ b/packages/twenty-server/src/engine/core-modules/application/application-registration/application-registration.service.ts
@@ -4,6 +4,7 @@ import { InjectRepository } from '@nestjs/typeorm';
import crypto from 'crypto';
import * as bcrypt from 'bcrypt';
+import { type Manifest } from 'twenty-shared/application';
import { isDefined } from 'twenty-shared/utils';
import { IsNull, type Repository } from 'typeorm';
import { v4 } from 'uuid';
@@ -102,7 +103,7 @@ export class ApplicationRegistrationService {
): Promise {
const registration = await this.applicationRegistrationRepository.findOne({
where: { oAuthClientId: clientId },
- select: ['id', 'name', 'logoUrl', 'websiteUrl', 'oAuthScopes'],
+ select: ['id', 'name', 'manifest', 'oAuthScopes'],
});
if (!registration) {
@@ -112,22 +113,12 @@ export class ApplicationRegistrationService {
return {
id: registration.id,
name: registration.name,
- logoUrl: registration.logoUrl,
- websiteUrl: registration.websiteUrl,
+ logoUrl: registration.manifest?.application?.logoUrl ?? null,
+ websiteUrl: registration.manifest?.application?.websiteUrl ?? null,
oAuthScopes: registration.oAuthScopes,
};
}
- async isOwnedByWorkspace(id: string, workspaceId: string): Promise {
- const registration = await this.applicationRegistrationRepository.findOne({
- where: { id },
- select: ['id', 'ownerWorkspaceId'],
- });
-
- return registration?.ownerWorkspaceId === workspaceId;
- }
-
- // Global lookup — used by app sync to find existing registrations
async findOneByUniversalIdentifier(
universalIdentifier: string,
): Promise {
@@ -172,17 +163,12 @@ export class ApplicationRegistrationService {
this.applicationRegistrationRepository.create({
universalIdentifier,
name: input.name,
- description: input.description ?? null,
- logoUrl: input.logoUrl ?? null,
- author: input.author ?? null,
oAuthClientId: clientId,
oAuthClientSecretHash: clientSecretHash,
oAuthRedirectUris: input.oAuthRedirectUris ?? [],
oAuthScopes: input.oAuthScopes ?? [],
createdByUserId,
ownerWorkspaceId,
- websiteUrl: input.websiteUrl ?? null,
- termsUrl: input.termsUrl ?? null,
});
const saved = await this.applicationRegistrationRepository.save(
@@ -211,16 +197,10 @@ export class ApplicationRegistrationService {
const updateData: Record = {};
if (isDefined(update.name)) updateData.name = update.name;
- if (isDefined(update.description))
- updateData.description = update.description;
- if (isDefined(update.logoUrl)) updateData.logoUrl = update.logoUrl;
- if (isDefined(update.author)) updateData.author = update.author;
if (isDefined(update.oAuthRedirectUris))
updateData.oAuthRedirectUris = update.oAuthRedirectUris;
if (isDefined(update.oAuthScopes))
updateData.oAuthScopes = update.oAuthScopes;
- if (isDefined(update.websiteUrl)) updateData.websiteUrl = update.websiteUrl;
- if (isDefined(update.termsUrl)) updateData.termsUrl = update.termsUrl;
if (isDefined(update.isListed)) updateData.isListed = update.isListed;
if (Object.keys(updateData).length > 0) {
@@ -230,6 +210,21 @@ export class ApplicationRegistrationService {
return this.findOneById(id, ownerWorkspaceId);
}
+ async updateFromManifest(
+ applicationRegistrationId: string,
+ manifest: Manifest,
+ ): Promise {
+ const existing = await this.applicationRegistrationRepository.findOneOrFail(
+ { where: { id: applicationRegistrationId } },
+ );
+
+ await this.applicationRegistrationRepository.save({
+ ...existing,
+ name: manifest.application.displayName,
+ manifest,
+ });
+ }
+
async delete(id: string, ownerWorkspaceId: string): Promise {
await this.findOneById(id, ownerWorkspaceId);
await this.applicationRegistrationRepository.softDelete(id);
@@ -269,17 +264,12 @@ export class ApplicationRegistrationService {
ApplicationRegistrationEntity,
| 'universalIdentifier'
| 'name'
- | 'description'
- | 'author'
| 'sourceType'
| 'sourcePackage'
- | 'logoUrl'
- | 'websiteUrl'
- | 'termsUrl'
| 'latestAvailableVersion'
| 'isListed'
| 'isFeatured'
- | 'marketplaceDisplayData'
+ | 'manifest'
| 'ownerWorkspaceId'
>,
): Promise {
@@ -291,15 +281,12 @@ export class ApplicationRegistrationService {
await this.applicationRegistrationRepository.save({
...existing,
name: params.name,
- description: params.description,
- author: params.author,
sourceType: params.sourceType,
sourcePackage: params.sourcePackage,
- logoUrl: params.logoUrl,
- websiteUrl: params.websiteUrl,
- termsUrl: params.termsUrl,
latestAvailableVersion: params.latestAvailableVersion,
- marketplaceDisplayData: params.marketplaceDisplayData,
+ manifest: params.manifest,
+ isListed: params.isListed,
+ isFeatured: params.isFeatured,
});
return;
@@ -308,17 +295,12 @@ export class ApplicationRegistrationService {
const registration = this.applicationRegistrationRepository.create({
universalIdentifier: params.universalIdentifier,
name: params.name,
- description: params.description,
- author: params.author,
sourceType: params.sourceType,
sourcePackage: params.sourcePackage,
- logoUrl: params.logoUrl,
- websiteUrl: params.websiteUrl,
- termsUrl: params.termsUrl,
latestAvailableVersion: params.latestAvailableVersion,
isListed: params.isListed,
isFeatured: params.isFeatured,
- marketplaceDisplayData: params.marketplaceDisplayData,
+ manifest: params.manifest,
oAuthClientId: v4(),
oAuthRedirectUris: [],
oAuthScopes: [],
@@ -341,7 +323,6 @@ export class ApplicationRegistrationService {
universalIdentifier:
TWENTY_CLI_APPLICATION_REGISTRATION.universalIdentifier,
name: TWENTY_CLI_APPLICATION_REGISTRATION.name,
- description: TWENTY_CLI_APPLICATION_REGISTRATION.description,
oAuthClientId: v4(),
oAuthClientSecretHash: null,
oAuthRedirectUris: [],
diff --git a/packages/twenty-server/src/engine/core-modules/application/application-registration/application-tarball.service.ts b/packages/twenty-server/src/engine/core-modules/application/application-registration/application-tarball.service.ts
index 9ce07460b9..2696054354 100644
--- a/packages/twenty-server/src/engine/core-modules/application/application-registration/application-tarball.service.ts
+++ b/packages/twenty-server/src/engine/core-modules/application/application-registration/application-tarball.service.ts
@@ -63,6 +63,10 @@ export class ApplicationTarballService {
};
}>(contentDir, 'manifest.json');
+ const packageJson = await readJsonFile<{
+ version: string;
+ }>(contentDir, 'package.json');
+
if (manifest === null) {
throw new ApplicationRegistrationException(
'manifest.json not found or invalid in tarball',
@@ -104,6 +108,10 @@ export class ApplicationTarballService {
universalIdentifier,
name: manifest.application?.displayName ?? 'Unknown App',
sourceType: ApplicationRegistrationSourceType.TARBALL,
+ manifest,
+ latestAvailableVersion: packageJson?.version ?? null,
+ isListed: false,
+ isFeatured: false,
oAuthClientId: v4(),
oAuthRedirectUris: [],
oAuthScopes: [],
@@ -137,6 +145,12 @@ export class ApplicationTarballService {
await this.appRegistrationRepository.update(appRegistration.id, {
sourceType: ApplicationRegistrationSourceType.TARBALL,
tarballFileId: savedFile.id,
+ name: manifest.application?.displayName ?? 'Unknown App',
+ manifest,
+ latestAvailableVersion: packageJson?.version ?? null,
+ isListed: false,
+ isFeatured: false,
+ ownerWorkspaceId: params.ownerWorkspaceId,
});
this.logger.log(
diff --git a/packages/twenty-server/src/engine/core-modules/application/application-registration/dtos/create-application-registration.input.ts b/packages/twenty-server/src/engine/core-modules/application/application-registration/dtos/create-application-registration.input.ts
index b5df254383..7b52883527 100644
--- a/packages/twenty-server/src/engine/core-modules/application/application-registration/dtos/create-application-registration.input.ts
+++ b/packages/twenty-server/src/engine/core-modules/application/application-registration/dtos/create-application-registration.input.ts
@@ -16,24 +16,6 @@ export class CreateApplicationRegistrationInput {
@MaxLength(256)
name: string;
- @Field({ nullable: true })
- @IsString()
- @MaxLength(2000)
- @IsOptional()
- description?: string;
-
- @Field({ nullable: true })
- @IsString()
- @MaxLength(2048)
- @IsOptional()
- logoUrl?: string;
-
- @Field({ nullable: true })
- @IsString()
- @MaxLength(256)
- @IsOptional()
- author?: string;
-
@Field({ nullable: true })
@IsUUID()
@IsOptional()
@@ -54,16 +36,4 @@ export class CreateApplicationRegistrationInput {
@MaxLength(256, { each: true })
@IsOptional()
oAuthScopes?: string[];
-
- @Field({ nullable: true })
- @IsString()
- @MaxLength(2048)
- @IsOptional()
- websiteUrl?: string;
-
- @Field({ nullable: true })
- @IsString()
- @MaxLength(2048)
- @IsOptional()
- termsUrl?: string;
}
diff --git a/packages/twenty-server/src/engine/core-modules/application/application-registration/dtos/update-application-registration.input.ts b/packages/twenty-server/src/engine/core-modules/application/application-registration/dtos/update-application-registration.input.ts
index ea4784094f..f60cd17a3d 100644
--- a/packages/twenty-server/src/engine/core-modules/application/application-registration/dtos/update-application-registration.input.ts
+++ b/packages/twenty-server/src/engine/core-modules/application/application-registration/dtos/update-application-registration.input.ts
@@ -21,24 +21,6 @@ export class UpdateApplicationRegistrationPayload {
@IsOptional()
name?: string;
- @Field({ nullable: true })
- @IsString()
- @MaxLength(2000)
- @IsOptional()
- description?: string;
-
- @Field({ nullable: true })
- @IsString()
- @MaxLength(2048)
- @IsOptional()
- logoUrl?: string;
-
- @Field({ nullable: true })
- @IsString()
- @MaxLength(256)
- @IsOptional()
- author?: string;
-
@Field(() => [String], { nullable: true })
@IsArray()
@ArrayMaxSize(20)
@@ -55,18 +37,6 @@ export class UpdateApplicationRegistrationPayload {
@IsOptional()
oAuthScopes?: string[];
- @Field({ nullable: true })
- @IsString()
- @MaxLength(2048)
- @IsOptional()
- websiteUrl?: string;
-
- @Field({ nullable: true })
- @IsString()
- @MaxLength(2048)
- @IsOptional()
- termsUrl?: string;
-
@Field(() => Boolean, { nullable: true })
@IsBoolean()
@IsOptional()
diff --git a/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts b/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts
index 4ce920fc72..ba20ae498c 100644
--- a/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts
+++ b/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts
@@ -1602,6 +1602,16 @@ export class ConfigVariables {
@IsOptional()
APP_REGISTRY_URL: string = 'https://registry.npmjs.org';
+ @ConfigVariablesMetadata({
+ group: ConfigVariablesGroup.ADVANCED_SETTINGS,
+ description:
+ 'CDN base URL for serving files from registry (e.g. https://unpkg.com)',
+ type: ConfigVariableType.STRING,
+ })
+ @IsUrl({ require_tld: false })
+ @IsOptional()
+ APP_REGISTRY_CDN_URL: string = 'https://unpkg.com';
+
@ConfigVariablesMetadata({
group: ConfigVariablesGroup.ADVANCED_SETTINGS,
isSensitive: true,
diff --git a/packages/twenty-server/test/integration/metadata/suites/application-registration-variable/application-registration-variable.integration-spec.ts b/packages/twenty-server/test/integration/metadata/suites/application-registration-variable/application-registration-variable.integration-spec.ts
index 6b76ba13fa..5c588db4fb 100644
--- a/packages/twenty-server/test/integration/metadata/suites/application-registration-variable/application-registration-variable.integration-spec.ts
+++ b/packages/twenty-server/test/integration/metadata/suites/application-registration-variable/application-registration-variable.integration-spec.ts
@@ -248,7 +248,6 @@ describe('ApplicationRegistrationVariable (integration)', () => {
variables: {
input: {
name: 'GQL Variable Test App',
- description: 'Created via GraphQL for variable testing',
},
},
});
diff --git a/packages/twenty-server/test/integration/metadata/suites/application/marketplace-catalog-sync.integration-spec.ts b/packages/twenty-server/test/integration/metadata/suites/application/marketplace-catalog-sync.integration-spec.ts
index a0c6594e82..8058a2fb25 100644
--- a/packages/twenty-server/test/integration/metadata/suites/application/marketplace-catalog-sync.integration-spec.ts
+++ b/packages/twenty-server/test/integration/metadata/suites/application/marketplace-catalog-sync.integration-spec.ts
@@ -14,8 +14,9 @@ const MARKETPLACE_QUERY = `
author
sourcePackage
icon
- version
category
+ logo
+ isFeatured
}
}
`;
@@ -58,7 +59,7 @@ describe('Marketplace Catalog Sync (integration)', () => {
name: string;
sourcePackage: string;
latestAvailableVersion?: string;
- marketplaceDisplayData?: Record;
+ manifest?: Record;
}): Promise => {
const id = crypto.randomUUID();
const oAuthClientId = crypto.randomUUID();
@@ -68,7 +69,7 @@ describe('Marketplace Catalog Sync (integration)', () => {
(id, "universalIdentifier", name, "oAuthClientId",
"oAuthRedirectUris", "oAuthScopes", "workspaceId",
"sourceType", "sourcePackage", "latestAvailableVersion",
- "marketplaceDisplayData", "isListed")
+ "manifest", "isListed")
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)`,
[
id,
@@ -81,9 +82,7 @@ describe('Marketplace Catalog Sync (integration)', () => {
'npm',
params.sourcePackage,
params.latestAvailableVersion ?? '1.0.0',
- params.marketplaceDisplayData
- ? JSON.stringify(params.marketplaceDisplayData)
- : null,
+ params.manifest ? JSON.stringify(params.manifest) : null,
true,
],
);
@@ -134,10 +133,11 @@ describe('Marketplace Catalog Sync (integration)', () => {
universalIdentifier: curatedUid,
name: 'Data Enrichment',
sourcePackage: '@twentyhq/app-data-enrichment',
- marketplaceDisplayData: {
- icon: 'IconSparkles',
- version: '1.0.0',
- category: 'Data',
+ manifest: {
+ application: {
+ icon: 'IconSparkles',
+ category: 'Data',
+ },
},
});
});
diff --git a/packages/twenty-server/test/integration/metadata/suites/application/utils/setup-application-for-sync.util.ts b/packages/twenty-server/test/integration/metadata/suites/application/utils/setup-application-for-sync.util.ts
index c205aaad59..8739965373 100644
--- a/packages/twenty-server/test/integration/metadata/suites/application/utils/setup-application-for-sync.util.ts
+++ b/packages/twenty-server/test/integration/metadata/suites/application/utils/setup-application-for-sync.util.ts
@@ -21,14 +21,13 @@ export const setupApplicationForSync = async ({
await globalThis.testDataSource.query(
`INSERT INTO core."applicationRegistration"
- (id, "universalIdentifier", name, description, "oAuthClientId",
+ (id, "universalIdentifier", name, "oAuthClientId",
"oAuthRedirectUris", "oAuthScopes", "workspaceId", "sourceType")
- VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)`,
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8)`,
[
registrationId,
applicationUniversalIdentifier,
name,
- description,
oAuthClientId,
[],
[],
diff --git a/packages/twenty-server/test/integration/oauth/suites/oauth.integration-spec.ts b/packages/twenty-server/test/integration/oauth/suites/oauth.integration-spec.ts
index c7368899f5..2bf882ab9b 100644
--- a/packages/twenty-server/test/integration/oauth/suites/oauth.integration-spec.ts
+++ b/packages/twenty-server/test/integration/oauth/suites/oauth.integration-spec.ts
@@ -14,7 +14,6 @@ type TestRegistration = {
id: string;
universalIdentifier: string;
name: string;
- description: string | null;
oAuthClientId: string;
oAuthRedirectUris: string[];
oAuthScopes: string[];
@@ -28,7 +27,6 @@ const insertRegistration = async (
ds: DataSource,
params: {
name: string;
- description?: string;
clientSecretHash: string;
redirectUris: string[];
scopes: string[];
@@ -40,13 +38,12 @@ const insertRegistration = async (
await ds.query(
`INSERT INTO core."applicationRegistration"
- (id, "universalIdentifier", name, description, "oAuthClientId", "oAuthClientSecretHash", "oAuthRedirectUris", "oAuthScopes", "workspaceId")
- VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)`,
+ (id, "universalIdentifier", name, "oAuthClientId", "oAuthClientSecretHash", "oAuthRedirectUris", "oAuthScopes", "workspaceId")
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8)`,
[
id,
universalIdentifier,
params.name,
- params.description ?? null,
oAuthClientId,
params.clientSecretHash,
params.redirectUris,
@@ -59,7 +56,6 @@ const insertRegistration = async (
id,
universalIdentifier,
name: params.name,
- description: params.description ?? null,
oAuthClientId,
oAuthRedirectUris: params.redirectUris,
oAuthScopes: params.scopes,
@@ -169,7 +165,6 @@ describe('OAuth (integration)', () => {
autoInstallRegistration = await insertRegistration(ds, {
name: 'OAuth Auto-Install Test App',
- description: 'App for testing OAuth auto-install',
clientSecretHash: autoInstallSecretHash,
redirectUris: ['https://example.com/callback'],
scopes: ['api'],
@@ -583,9 +578,6 @@ describe('OAuth (integration)', () => {
const autoCreatedApp = rows[0];
expect(autoCreatedApp.name).toBe('OAuth Auto-Install Test App');
- expect(autoCreatedApp.description).toBe(
- 'App for testing OAuth auto-install',
- );
expect(autoCreatedApp.sourcePath).toBe('oauth-install');
expect(autoCreatedApp.universalIdentifier).toBe(
autoInstallRegistration.universalIdentifier,
diff --git a/packages/twenty-server/test/integration/utils/teardown-test.ts b/packages/twenty-server/test/integration/utils/teardown-test.ts
index 72549ea134..8522241514 100644
--- a/packages/twenty-server/test/integration/utils/teardown-test.ts
+++ b/packages/twenty-server/test/integration/utils/teardown-test.ts
@@ -1,6 +1,6 @@
import 'tsconfig-paths/register';
export default async () => {
- global.testDataSource.destroy();
- global.app.close();
+ await global.app.close();
+ await global.testDataSource.destroy();
};
diff --git a/packages/twenty-shared/src/application/applicationType.ts b/packages/twenty-shared/src/application/applicationType.ts
index e30946bf60..7ae44e556a 100644
--- a/packages/twenty-shared/src/application/applicationType.ts
+++ b/packages/twenty-shared/src/application/applicationType.ts
@@ -14,9 +14,10 @@ export type ApplicationManifest = SyncableEntityOptions & {
logoUrl?: string;
screenshots?: string[];
aboutDescription?: string;
- providers?: string[];
websiteUrl?: string;
termsUrl?: string;
+ emailSupport?: string;
+ issueReportUrl?: string;
preInstallLogicFunctionUniversalIdentifier?: string;
postInstallLogicFunctionUniversalIdentifier?: string;
settingsCustomTabFrontComponentUniversalIdentifier?: string;
diff --git a/packages/twenty-ui/src/display/icon/components/TablerIcons.ts b/packages/twenty-ui/src/display/icon/components/TablerIcons.ts
index 5629fa6ace..229b827fef 100644
--- a/packages/twenty-ui/src/display/icon/components/TablerIcons.ts
+++ b/packages/twenty-ui/src/display/icon/components/TablerIcons.ts
@@ -32,6 +32,7 @@ export {
IconBlockquote,
IconBold,
IconBolt,
+ IconBook,
IconBook2,
IconBookmark,
IconBookmarkPlus,
@@ -198,6 +199,7 @@ export {
IconGitBranchDeleted,
IconGitCommit,
IconGizmo,
+ IconGraph,
IconGripVertical,
IconH1,
IconH2,
@@ -242,6 +244,7 @@ export {
IconLayoutSidebarRight,
IconLayoutSidebarRightCollapse,
IconLayoutSidebarRightExpand,
+ IconLego,
IconLetterK,
IconLibraryPlus,
IconLifebuoy,
diff --git a/packages/twenty-ui/src/display/index.ts b/packages/twenty-ui/src/display/index.ts
index 6b9a917260..924bdd0da9 100644
--- a/packages/twenty-ui/src/display/index.ts
+++ b/packages/twenty-ui/src/display/index.ts
@@ -110,6 +110,7 @@ export {
IconBlockquote,
IconBold,
IconBolt,
+ IconBook,
IconBook2,
IconBookmark,
IconBookmarkPlus,
@@ -276,6 +277,7 @@ export {
IconGitBranchDeleted,
IconGitCommit,
IconGizmo,
+ IconGraph,
IconGripVertical,
IconH1,
IconH2,
@@ -320,6 +322,7 @@ export {
IconLayoutSidebarRight,
IconLayoutSidebarRightCollapse,
IconLayoutSidebarRightExpand,
+ IconLego,
IconLetterK,
IconLibraryPlus,
IconLifebuoy,