Files
twenty/packages/twenty-shared/src/application/index.ts
T
martmull 9423af7f67 feat(server): add public marketplace resolver for vetted app catalog (#22647)
## What

Adds a public GraphQL resolver so unauthenticated clients (the public
website) can read the listed/vetted marketplace catalog without a
workspace token.

- `MarketplacePublicResolver` (metadata schema) exposes two public
queries guarded by `PublicEndpointGuard` + `NoPermissionGuard`:
  - `publicMarketplaceApps`
  - `publicMarketplaceAppDetail(universalIdentifier)`
  
Both delegate to the existing `MarketplaceQueryService` (no new logic,
no new REST routing). The existing workspace-guarded
`findManyMarketplaceApps` / `findMarketplaceAppDetail` queries are
untouched.
- Adds a shared `ApplicationCategory` type in `twenty-shared` (known
values plus `string` for backward compatibility) used to type
`ApplicationManifest.category`. A warning is logged server-side when an
app declares a category outside the known set.

## Why

This is the backend half of the public apps marketplace on the website.
Splitting it out so the server-side catalog exposure can be reviewed
independently from the website UI.

## Follow-up

The website PR (the `/apps` marketplace UI) consumes
`publicMarketplaceApps` and should merge after this one.

---
_Generated by [Claude
Code](https://claude.ai/code/session_01GBfegArtJcoiTLSsnWPH8R)_

<!-- This is an auto-generated description by cubic. -->
<a
href="https://cubic.dev/pr/twentyhq/twenty/pull/22647?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="Review in cubic"
src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a>
<!-- End of auto-generated description by cubic. -->

---------

Co-authored-by: martmull <martin@twenty.com>
2026-07-08 15:43:17 +00:00

153 lines
8.4 KiB
TypeScript

/*
* _____ _
*|_ _|_ _____ _ __ | |_ _ _
* | | \ \ /\ / / _ \ '_ \| __| | | | Auto-generated file
* | | \ V V / __/ | | | |_| |_| | Any edits to this will be overridden
* |_| \_/\_/ \___|_| |_|\__|\__, |
* |___/
*/
export type { AgentManifest } from './agentManifestType';
export type { AppConnection } from './appConnectionType';
export type {
KnownApplicationCategory,
ApplicationCategory,
} from './applicationCategoryType';
export {
APPLICATION_CATEGORIES,
isKnownApplicationCategory,
} from './applicationCategoryType';
export type { ApplicationManifest } from './applicationType';
export type {
ApplicationVariableType,
ApplicationVariableOption,
ApplicationVariableValue,
ApplicationVariable,
ApplicationVariables,
} from './applicationVariablesType';
export { APPLICATION_VARIABLE_FIELD_METADATA_TYPES } from './applicationVariablesType';
export type { AssetManifest } from './assetManifestType';
export type { ConnectionProviderManifest } from './connectionProviderManifestType';
export type { ConnectionProviderType } from './connectionProviderType';
export { ASSETS_DIR } from './constants/AssetDirectory';
export { DEFAULT_API_KEY_NAME } from './constants/DefaultApiKeyName';
export { DEFAULT_API_URL_NAME } from './constants/DefaultApiUrlName';
export { DEFAULT_APP_ACCESS_TOKEN_NAME } from './constants/DefaultAppAccessTokenName';
export { DEFAULT_FUNCTIONS_URL_NAME } from './constants/DefaultFunctionsUrlName';
export { GENERATED_DIR } from './constants/GeneratedDirectory';
export { NODE_ESM_CJS_BANNER } from './constants/NodeEsmCjsBanner';
export { OUTPUT_DIR } from './constants/OutputDirectory';
export { TWENTY_STANDARD_APPLICATION_NAME } from './constants/TwentyStandardApplicationName';
export { TWENTY_STANDARD_APPLICATION_UNIVERSAL_IDENTIFIER } from './constants/TwentyStandardApplicationUniversalIdentifier';
export { computeDeterministicUuid } from './deterministic-identifier/compute-deterministic-uuid.util';
export type { DeterministicEntityNamespace } from './deterministic-identifier/deterministic-entity-namespace.type';
export { getAgentUniversalIdentifier } from './deterministic-identifier/get-agent-universal-identifier.util';
export { getApplicationVariableUniversalIdentifier } from './deterministic-identifier/get-application-variable-universal-identifier.util';
export {
getGlobalCommandMenuItemUniversalIdentifier,
getGlobalObjectContextCommandMenuItemUniversalIdentifier,
getRecordSelectionCommandMenuItemUniversalIdentifier,
getNavigationCommandUniversalIdentifier,
} from './deterministic-identifier/get-command-menu-item-universal-identifier.util';
export { getConnectionProviderUniversalIdentifier } from './deterministic-identifier/get-connection-provider-universal-identifier.util';
export { getFieldPermissionUniversalIdentifier } from './deterministic-identifier/get-field-permission-universal-identifier.util';
export { getFieldUniversalIdentifier } from './deterministic-identifier/get-field-universal-identifier.util';
export { getFrontComponentUniversalIdentifier } from './deterministic-identifier/get-front-component-universal-identifier.util';
export { getIndexUniversalIdentifier } from './deterministic-identifier/get-index-universal-identifier.util';
export { getLogicFunctionUniversalIdentifier } from './deterministic-identifier/get-logic-function-universal-identifier.util';
export {
getFolderNavigationMenuItemUniversalIdentifier,
getObjectNavigationMenuItemUniversalIdentifier,
getViewNavigationMenuItemUniversalIdentifier,
getLinkNavigationMenuItemUniversalIdentifier,
} from './deterministic-identifier/get-navigation-menu-item-universal-identifier.util';
export { getObjectPermissionUniversalIdentifier } from './deterministic-identifier/get-object-permission-universal-identifier.util';
export { getObjectUniversalIdentifier } from './deterministic-identifier/get-object-universal-identifier.util';
export { getPageLayoutTabUniversalIdentifier } from './deterministic-identifier/get-page-layout-tab-universal-identifier.util';
export {
getPageLayoutUniversalIdentifier,
getRecordPageLayoutUniversalIdentifier,
} from './deterministic-identifier/get-page-layout-universal-identifier.util';
export { getPageLayoutWidgetUniversalIdentifier } from './deterministic-identifier/get-page-layout-widget-universal-identifier.util';
export { getPermissionFlagUniversalIdentifier } from './deterministic-identifier/get-permission-flag-universal-identifier.util';
export { getRolePermissionFlagUniversalIdentifier } from './deterministic-identifier/get-role-permission-flag-universal-identifier.util';
export { getRoleUniversalIdentifier } from './deterministic-identifier/get-role-universal-identifier.util';
export { getSearchFieldUniversalIdentifier } from './deterministic-identifier/get-search-field-universal-identifier.util';
export { getSelectOptionUniversalIdentifier } from './deterministic-identifier/get-select-option-universal-identifier.util';
export { getSkillUniversalIdentifier } from './deterministic-identifier/get-skill-universal-identifier.util';
export { getViewFieldGroupUniversalIdentifier } from './deterministic-identifier/get-view-field-group-universal-identifier.util';
export { getViewFieldUniversalIdentifier } from './deterministic-identifier/get-view-field-universal-identifier.util';
export { getViewFilterUniversalIdentifier } from './deterministic-identifier/get-view-filter-universal-identifier.util';
export { getViewGroupUniversalIdentifier } from './deterministic-identifier/get-view-group-universal-identifier.util';
export { getViewSortUniversalIdentifier } from './deterministic-identifier/get-view-sort-universal-identifier.util';
export {
getViewUniversalIdentifier,
getIndexViewUniversalIdentifier,
getFieldsWidgetViewUniversalIdentifier,
} from './deterministic-identifier/get-view-universal-identifier.util';
export { SyncableEntity } from './enums/syncable-entities.enum';
export type {
RegularFieldManifest,
RelationFieldManifest,
FieldManifest,
} from './fieldManifestType';
export type {
CommandMenuItemManifest,
FrontComponentManifest,
} from './frontComponentManifestType';
export type { IndexFieldManifest } from './indexFieldManifestType';
export type { IndexManifest } from './indexManifestType';
export type {
LogicFunctionManifest,
CronTriggerSettings,
DatabaseEventTriggerSettings,
HttpRouteTriggerSettings,
} from './logicFunctionManifestType';
export type { TranslationsManifest, Manifest } from './manifestType';
export type { NavigationMenuItemManifest } from './navigationMenuItemManifestType';
export type { OAuthConnectionProviderConfig } from './oauthConnectionProviderConfigType';
export type { OAuthProviderTokenRequestContentType } from './oauthProviderTokenRequestContentType.type';
export type { ObjectFieldManifest } from './objectFieldManifest.type';
export type { ObjectManifest } from './objectManifestType';
export type {
PageLayoutWidgetManifest,
PageLayoutTabManifest,
PageLayoutManifest,
} from './pageLayoutManifestType';
export type {
PermissionFlagPermissionType,
PermissionFlagManifest,
} from './permissionFlagManifestType';
export type { PostInstallLogicFunctionApplicationManifest } from './postInstallLogicFunctionApplicationType';
export type { PreInstallLogicFunctionApplicationManifest } from './preInstallLogicFunctionApplicationType';
export type {
ObjectPermissionManifest,
FieldPermissionManifest,
RowLevelPermissionPredicateGroupManifest,
RowLevelPermissionPredicateManifest,
RoleManifest,
} from './roleManifestType';
export type { RunAgentInput, RunAgentResult } from './runAgentType';
export type { ServerVariables } from './server-variables.type';
export type { ServerRouteTriggerSettings } from './serverRouteTriggerSettingsType';
export type { SkillManifest } from './skillManifestType';
export type { StoredOAuthConnectionProviderConfig } from './storedOAuthConnectionProviderConfigType';
export type { SyncableEntityOptions } from './syncableEntityOptionsType';
export type { ToolTriggerSettings } from './toolTriggerSettingsType';
export {
serializeApplicationVariableValue,
deserializeApplicationVariableValue,
} from './utils/applicationVariableValueSerialization';
export type {
ViewManifestFilterValue,
ViewFieldManifest,
StandaloneViewFieldManifest,
ViewFilterManifest,
ViewFilterGroupManifest,
ViewGroupManifest,
ViewFieldGroupManifest,
ViewSortManifest,
ViewManifest,
} from './viewManifestType';
export type { WorkflowActionTriggerSettings } from './workflowActionTriggerSettingsType';