[SDK] Agent in manifest (#18431)

# Introduction
Adding agent in the manifest, required for twenty standard app
extraction out of twenty-server
This commit is contained in:
Paul Rastoin
2026-03-09 12:10:14 +01:00
committed by GitHub
parent a9696705c1
commit 06bdb5ad6a
24 changed files with 476 additions and 5 deletions
@@ -1,6 +1,5 @@
import { type Manifest } from 'twenty-shared/application';
import { type FlatApplication } from 'src/engine/core-modules/application/types/flat-application.type';
import { fromCommandMenuItemManifestToUniversalFlatCommandMenuItem } from 'src/engine/core-modules/application/application-manifest/converters/from-command-menu-item-manifest-to-universal-flat-command-menu-item.util';
import { fromFieldManifestToUniversalFlatFieldMetadata } from 'src/engine/core-modules/application/application-manifest/converters/from-field-manifest-to-universal-flat-field-metadata.util';
import { fromFrontComponentManifestToUniversalFlatFrontComponent } from 'src/engine/core-modules/application/application-manifest/converters/from-front-component-manifest-to-universal-flat-front-component.util';
@@ -18,6 +17,8 @@ import { fromViewFilterGroupManifestToUniversalFlatViewFilterGroup } from 'src/e
import { fromViewFilterManifestToUniversalFlatViewFilter } from 'src/engine/core-modules/application/application-manifest/converters/from-view-filter-manifest-to-universal-flat-view-filter.util';
import { fromViewGroupManifestToUniversalFlatViewGroup } from 'src/engine/core-modules/application/application-manifest/converters/from-view-group-manifest-to-universal-flat-view-group.util';
import { fromViewManifestToUniversalFlatView } from 'src/engine/core-modules/application/application-manifest/converters/from-view-manifest-to-universal-flat-view.util';
import { type FlatApplication } from 'src/engine/core-modules/application/types/flat-application.type';
import { fromAgentManifestToUniversalFlatAgent } from 'src/engine/core-modules/application/utils/from-agent-manifest-to-universal-flat-agent.util';
import { createEmptyAllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/constant/create-empty-all-flat-entity-maps.constant';
import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
import { addUniversalFlatEntityToUniversalFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/utils/add-universal-flat-entity-to-universal-flat-entity-maps-through-mutation-or-throw.util';
@@ -140,6 +141,17 @@ export const computeApplicationManifestAllUniversalFlatEntityMaps = ({
});
}
for (const agentManifest of manifest.agents ?? []) {
addUniversalFlatEntityToUniversalFlatEntityMapsThroughMutationOrThrow({
universalFlatEntity: fromAgentManifestToUniversalFlatAgent({
agentManifest,
applicationUniversalIdentifier,
now,
}),
universalFlatEntityMapsToMutate: allUniversalFlatEntityMaps.flatAgentMaps,
});
}
for (const viewManifest of manifest.views ?? []) {
addUniversalFlatEntityToUniversalFlatEntityMapsThroughMutationOrThrow({
universalFlatEntity: fromViewManifestToUniversalFlatView({
@@ -7,6 +7,7 @@ export const APPLICATION_MANIFEST_METADATA_NAMES = [
'frontComponent',
'role',
'skill',
'agent',
'view',
'viewField',
'viewFieldGroup',
@@ -0,0 +1,35 @@
import { type AgentManifest } from 'twenty-shared/application';
import {
DEFAULT_SMART_MODEL,
type ModelId,
} from 'src/engine/metadata-modules/ai/ai-models/constants/ai-models.const';
import { type UniversalFlatAgent } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-agent.type';
export const fromAgentManifestToUniversalFlatAgent = ({
agentManifest,
applicationUniversalIdentifier,
now,
}: {
agentManifest: AgentManifest;
applicationUniversalIdentifier: string;
now: string;
}): UniversalFlatAgent => {
return {
universalIdentifier: agentManifest.universalIdentifier,
applicationUniversalIdentifier,
name: agentManifest.name,
label: agentManifest.label,
icon: agentManifest.icon ?? null,
description: agentManifest.description ?? null,
prompt: agentManifest.prompt,
modelId: (agentManifest.modelId as ModelId) ?? DEFAULT_SMART_MODEL,
responseFormat: { type: 'text' },
modelConfiguration: null,
evaluationInputs: [],
isCustom: false,
createdAt: now,
updatedAt: now,
deletedAt: null,
};
};