[Apps] Apps marketplace (first draft) (#17562)

https://github.com/user-attachments/assets/c4e63edb-6e98-44bc-841f-ee110ae712d4

How it works
- `manifest.json` files are now committed when apps are published to our
repo
- to display available apps, from the server, we read into our github
repo, using a pod-scoped cache
- feature flagged
- app installation will be behind permission gate MARKETPLACE_APPS

Limitations and what is yet to develop
- content and settings tabs
- installed apps tab
- app installation
- test and potentially fix reading from .manifest.json once [Reshape
manifest
structure](https://github.com/twentyhq/core-team-issues/issues/2183) is
done. additional work is expected on assets notably. (couldnt properly
do it here as manifest.json will only be committed after this pr)
- we only read in community/ folder for now - we may want tochange that
- the cache is rather artisanal for now and scoped by pod - we may want
to change that
This commit is contained in:
Marie
2026-01-30 18:32:32 +01:00
committed by GitHub
parent 36cf388c81
commit 0001c2e7d0
98 changed files with 1713 additions and 280 deletions
@@ -1414,6 +1414,7 @@ export enum FeatureFlagKey {
IS_FILES_FIELD_ENABLED = 'IS_FILES_FIELD_ENABLED',
IS_JSON_FILTER_ENABLED = 'IS_JSON_FILTER_ENABLED',
IS_JUNCTION_RELATIONS_ENABLED = 'IS_JUNCTION_RELATIONS_ENABLED',
IS_MARKETPLACE_ENABLED = 'IS_MARKETPLACE_ENABLED',
IS_NAVIGATION_MENU_ITEM_ENABLED = 'IS_NAVIGATION_MENU_ITEM_ENABLED',
IS_PUBLIC_DOMAIN_ENABLED = 'IS_PUBLIC_DOMAIN_ENABLED',
IS_RECORD_PAGE_LAYOUT_EDITING_ENABLED = 'IS_RECORD_PAGE_LAYOUT_EDITING_ENABLED',
@@ -1978,6 +1979,23 @@ export type LoginTokenOutput = {
loginToken: AuthToken;
};
export type MarketplaceApp = {
__typename?: 'MarketplaceApp';
aboutDescription: Scalars['String'];
author: Scalars['String'];
category: Scalars['String'];
description: Scalars['String'];
icon: Scalars['String'];
id: Scalars['String'];
logo?: Maybe<Scalars['String']>;
name: Scalars['String'];
providers: Array<Scalars['String']>;
screenshots: Array<Scalars['String']>;
termsUrl?: Maybe<Scalars['String']>;
version: Scalars['String'];
websiteUrl?: Maybe<Scalars['String']>;
};
export enum MessageChannelVisibility {
METADATA = 'METADATA',
SHARE_EVERYTHING = 'SHARE_EVERYTHING',
@@ -2106,6 +2124,7 @@ export type Mutation = {
initiateOTPProvisioning: InitiateTwoFactorAuthenticationProvisioningOutput;
initiateOTPProvisioningForAuthenticatedUser: InitiateTwoFactorAuthenticationProvisioningOutput;
installApplication: Scalars['Boolean'];
installMarketplaceApp: Scalars['Boolean'];
removeQueryFromEventStream: Scalars['Boolean'];
removeRoleFromAgent: Scalars['Boolean'];
renewToken: AuthTokens;
@@ -3415,6 +3434,7 @@ export enum PermissionFlagType {
IMPERSONATE = 'IMPERSONATE',
IMPORT_CSV = 'IMPORT_CSV',
LAYOUTS = 'LAYOUTS',
MARKETPLACE_APPS = 'MARKETPLACE_APPS',
PROFILE_INFORMATION = 'PROFILE_INFORMATION',
ROLES = 'ROLES',
SECURITY = 'SECURITY',
@@ -3538,6 +3558,7 @@ export type Query = {
findManyAgents: Array<Agent>;
findManyApplications: Array<Application>;
findManyLogicFunctions: Array<LogicFunction>;
findManyMarketplaceApps: Array<MarketplaceApp>;
findManyPublicDomains: Array<PublicDomain>;
findOneAgent: Agent;
findOneApplication: Application;