Polish permission flag definition foundation

This commit is contained in:
ehconitin
2026-05-08 01:59:36 +05:30
parent b6f66c20d8
commit ef61f247f8
15 changed files with 609 additions and 223 deletions
@@ -2840,6 +2840,23 @@ enum MessageFolderPendingSyncAction {
NONE
}
type PermissionFlagDefinition {
id: UUID!
universalIdentifier: UUID!
key: String!
label: String!
description: String
iconKey: String
category: String!
isRelevantForAgents: Boolean!
isRelevantForUsers: Boolean!
isRelevantForApiKeys: Boolean!
isCustom: Boolean!
applicationId: UUID!
createdAt: DateTime!
updatedAt: DateTime!
}
type CollectionHash {
collectionName: AllMetadataName!
hash: String!
@@ -2869,6 +2886,7 @@ enum AllMetadataName {
commandMenuItem
navigationMenuItem
permissionFlag
permissionFlagDefinition
objectPermission
fieldPermission
frontComponent
@@ -3005,6 +3023,8 @@ type Query {
myCalendarChannels(connectedAccountId: UUID): [CalendarChannel!]!
webhooks: [Webhook!]!
webhook(id: UUID!): Webhook
permissionFlagDefinitions: [PermissionFlagDefinition!]!
permissionFlagDefinition(id: UUID!): PermissionFlagDefinition
minimalMetadata: MinimalMetadata!
chatThreads: [AgentChatThread!]!
chatThread(id: UUID!): AgentChatThread!
@@ -3244,6 +3264,9 @@ type Mutation {
createWebhook(input: CreateWebhookInput!): Webhook!
updateWebhook(input: UpdateWebhookInput!): Webhook!
deleteWebhook(id: UUID!): Webhook!
createPermissionFlagDefinition(input: CreatePermissionFlagDefinitionInput!): PermissionFlagDefinition!
updatePermissionFlagDefinition(input: UpdatePermissionFlagDefinitionInput!): PermissionFlagDefinition!
deletePermissionFlagDefinition(id: UUID!): PermissionFlagDefinition!
createChatThread: AgentChatThread!
sendChatMessage(threadId: UUID!, text: String!, messageId: UUID!, browsingContext: JSON, modelId: String, fileIds: [UUID!]): SendChatMessageResult!
stopAgentChatStream(threadId: UUID!): Boolean!
@@ -4202,6 +4225,37 @@ input UpdateWebhookInputUpdates {
secret: String
}
input CreatePermissionFlagDefinitionInput {
id: UUID
universalIdentifier: UUID
key: String!
label: String!
description: String
iconKey: String
category: String!
isRelevantForAgents: Boolean
isRelevantForUsers: Boolean
isRelevantForApiKeys: Boolean
}
input UpdatePermissionFlagDefinitionInput {
"""The id of the permission flag definition to update"""
id: UUID!
"""The fields to update"""
update: UpdatePermissionFlagDefinitionInputUpdates!
}
input UpdatePermissionFlagDefinitionInputUpdates {
label: String
description: String
iconKey: String
category: String
isRelevantForAgents: Boolean
isRelevantForUsers: Boolean
isRelevantForApiKeys: Boolean
}
input CreateSkillInput {
id: UUID
name: String!
@@ -2490,13 +2490,31 @@ export interface MessageFolder {
export type MessageFolderPendingSyncAction = 'FOLDER_DELETION' | 'NONE'
export interface PermissionFlagDefinition {
id: Scalars['UUID']
universalIdentifier: Scalars['UUID']
key: Scalars['String']
label: Scalars['String']
description?: Scalars['String']
iconKey?: Scalars['String']
category: Scalars['String']
isRelevantForAgents: Scalars['Boolean']
isRelevantForUsers: Scalars['Boolean']
isRelevantForApiKeys: Scalars['Boolean']
isCustom: Scalars['Boolean']
applicationId: Scalars['UUID']
createdAt: Scalars['DateTime']
updatedAt: Scalars['DateTime']
__typename: 'PermissionFlagDefinition'
}
export interface CollectionHash {
collectionName: AllMetadataName
hash: Scalars['String']
__typename: 'CollectionHash'
}
export type AllMetadataName = 'fieldMetadata' | 'objectMetadata' | 'view' | 'viewField' | 'viewFieldGroup' | 'viewGroup' | 'viewSort' | 'rowLevelPermissionPredicate' | 'rowLevelPermissionPredicateGroup' | 'viewFilterGroup' | 'index' | 'logicFunction' | 'viewFilter' | 'role' | 'roleTarget' | 'agent' | 'skill' | 'pageLayout' | 'pageLayoutWidget' | 'pageLayoutTab' | 'commandMenuItem' | 'navigationMenuItem' | 'permissionFlag' | 'objectPermission' | 'fieldPermission' | 'frontComponent' | 'webhook' | 'applicationVariable' | 'connectionProvider'
export type AllMetadataName = 'fieldMetadata' | 'objectMetadata' | 'view' | 'viewField' | 'viewFieldGroup' | 'viewGroup' | 'viewSort' | 'rowLevelPermissionPredicate' | 'rowLevelPermissionPredicateGroup' | 'viewFilterGroup' | 'index' | 'logicFunction' | 'viewFilter' | 'role' | 'roleTarget' | 'agent' | 'skill' | 'pageLayout' | 'pageLayoutWidget' | 'pageLayoutTab' | 'commandMenuItem' | 'navigationMenuItem' | 'permissionFlag' | 'permissionFlagDefinition' | 'objectPermission' | 'fieldPermission' | 'frontComponent' | 'webhook' | 'applicationVariable' | 'connectionProvider'
export interface MinimalObjectMetadata {
id: Scalars['UUID']
@@ -2603,6 +2621,8 @@ export interface Query {
myCalendarChannels: CalendarChannel[]
webhooks: Webhook[]
webhook?: Webhook
permissionFlagDefinitions: PermissionFlagDefinition[]
permissionFlagDefinition?: PermissionFlagDefinition
minimalMetadata: MinimalMetadata
chatThreads: AgentChatThread[]
chatThread: AgentChatThread
@@ -2775,6 +2795,9 @@ export interface Mutation {
createWebhook: Webhook
updateWebhook: Webhook
deleteWebhook: Webhook
createPermissionFlagDefinition: PermissionFlagDefinition
updatePermissionFlagDefinition: PermissionFlagDefinition
deletePermissionFlagDefinition: PermissionFlagDefinition
createChatThread: AgentChatThread
sendChatMessage: SendChatMessageResult
stopAgentChatStream: Scalars['Boolean']
@@ -5502,6 +5525,25 @@ export interface MessageFolderGenqlSelection{
__scalar?: boolean | number
}
export interface PermissionFlagDefinitionGenqlSelection{
id?: boolean | number
universalIdentifier?: boolean | number
key?: boolean | number
label?: boolean | number
description?: boolean | number
iconKey?: boolean | number
category?: boolean | number
isRelevantForAgents?: boolean | number
isRelevantForUsers?: boolean | number
isRelevantForApiKeys?: boolean | number
isCustom?: boolean | number
applicationId?: boolean | number
createdAt?: boolean | number
updatedAt?: boolean | number
__typename?: boolean | number
__scalar?: boolean | number
}
export interface CollectionHashGenqlSelection{
collectionName?: boolean | number
hash?: boolean | number
@@ -5636,6 +5678,8 @@ export interface QueryGenqlSelection{
myCalendarChannels?: (CalendarChannelGenqlSelection & { __args?: {connectedAccountId?: (Scalars['UUID'] | null)} })
webhooks?: WebhookGenqlSelection
webhook?: (WebhookGenqlSelection & { __args: {id: Scalars['UUID']} })
permissionFlagDefinitions?: PermissionFlagDefinitionGenqlSelection
permissionFlagDefinition?: (PermissionFlagDefinitionGenqlSelection & { __args: {id: Scalars['UUID']} })
minimalMetadata?: MinimalMetadataGenqlSelection
chatThreads?: AgentChatThreadGenqlSelection
chatThread?: (AgentChatThreadGenqlSelection & { __args: {id: Scalars['UUID']} })
@@ -5829,6 +5873,9 @@ export interface MutationGenqlSelection{
createWebhook?: (WebhookGenqlSelection & { __args: {input: CreateWebhookInput} })
updateWebhook?: (WebhookGenqlSelection & { __args: {input: UpdateWebhookInput} })
deleteWebhook?: (WebhookGenqlSelection & { __args: {id: Scalars['UUID']} })
createPermissionFlagDefinition?: (PermissionFlagDefinitionGenqlSelection & { __args: {input: CreatePermissionFlagDefinitionInput} })
updatePermissionFlagDefinition?: (PermissionFlagDefinitionGenqlSelection & { __args: {input: UpdatePermissionFlagDefinitionInput} })
deletePermissionFlagDefinition?: (PermissionFlagDefinitionGenqlSelection & { __args: {id: Scalars['UUID']} })
createChatThread?: AgentChatThreadGenqlSelection
sendChatMessage?: (SendChatMessageResultGenqlSelection & { __args: {threadId: Scalars['UUID'], text: Scalars['String'], messageId: Scalars['UUID'], browsingContext?: (Scalars['JSON'] | null), modelId?: (Scalars['String'] | null), fileIds?: (Scalars['UUID'][] | null)} })
stopAgentChatStream?: { __args: {threadId: Scalars['UUID']} }
@@ -6216,6 +6263,16 @@ update: UpdateWebhookInputUpdates}
export interface UpdateWebhookInputUpdates {targetUrl?: (Scalars['String'] | null),operations?: (Scalars['String'][] | null),description?: (Scalars['String'] | null),secret?: (Scalars['String'] | null)}
export interface CreatePermissionFlagDefinitionInput {id?: (Scalars['UUID'] | null),universalIdentifier?: (Scalars['UUID'] | null),key: Scalars['String'],label: Scalars['String'],description?: (Scalars['String'] | null),iconKey?: (Scalars['String'] | null),category: Scalars['String'],isRelevantForAgents?: (Scalars['Boolean'] | null),isRelevantForUsers?: (Scalars['Boolean'] | null),isRelevantForApiKeys?: (Scalars['Boolean'] | null)}
export interface UpdatePermissionFlagDefinitionInput {
/** The id of the permission flag definition to update */
id: Scalars['UUID'],
/** The fields to update */
update: UpdatePermissionFlagDefinitionInputUpdates}
export interface UpdatePermissionFlagDefinitionInputUpdates {label?: (Scalars['String'] | null),description?: (Scalars['String'] | null),iconKey?: (Scalars['String'] | null),category?: (Scalars['String'] | null),isRelevantForAgents?: (Scalars['Boolean'] | null),isRelevantForUsers?: (Scalars['Boolean'] | null),isRelevantForApiKeys?: (Scalars['Boolean'] | null)}
export interface CreateSkillInput {id?: (Scalars['UUID'] | null),name: Scalars['String'],label: Scalars['String'],icon?: (Scalars['String'] | null),description?: (Scalars['String'] | null),content: Scalars['String']}
export interface UpdateSkillInput {id: Scalars['UUID'],name?: (Scalars['String'] | null),label?: (Scalars['String'] | null),icon?: (Scalars['String'] | null),description?: (Scalars['String'] | null),content?: (Scalars['String'] | null),isActive?: (Scalars['Boolean'] | null)}
@@ -8167,6 +8224,14 @@ export interface LogicFunctionLogsInput {applicationId?: (Scalars['UUID'] | null
const PermissionFlagDefinition_possibleTypes: string[] = ['PermissionFlagDefinition']
export const isPermissionFlagDefinition = (obj?: { __typename?: any } | null): obj is PermissionFlagDefinition => {
if (!obj?.__typename) throw new Error('__typename is missing in "isPermissionFlagDefinition"')
return PermissionFlagDefinition_possibleTypes.includes(obj.__typename)
}
const CollectionHash_possibleTypes: string[] = ['CollectionHash']
export const isCollectionHash = (obj?: { __typename?: any } | null): obj is CollectionHash => {
if (!obj?.__typename) throw new Error('__typename is missing in "isCollectionHash"')
@@ -8852,6 +8917,7 @@ export const enumAllMetadataName = {
commandMenuItem: 'commandMenuItem' as const,
navigationMenuItem: 'navigationMenuItem' as const,
permissionFlag: 'permissionFlag' as const,
permissionFlagDefinition: 'permissionFlagDefinition' as const,
objectPermission: 'objectPermission' as const,
fieldPermission: 'fieldPermission' as const,
frontComponent: 'frontComponent' as const,
File diff suppressed because it is too large Load Diff
@@ -200,6 +200,7 @@ export enum AllMetadataName {
pageLayoutTab = 'pageLayoutTab',
pageLayoutWidget = 'pageLayoutWidget',
permissionFlag = 'permissionFlag',
permissionFlagDefinition = 'permissionFlagDefinition',
role = 'role',
roleTarget = 'roleTarget',
rowLevelPermissionPredicate = 'rowLevelPermissionPredicate',
@@ -1148,6 +1149,19 @@ export type CreatePageLayoutWidgetInput = {
type: WidgetType;
};
export type CreatePermissionFlagDefinitionInput = {
category: Scalars['String'];
description?: InputMaybe<Scalars['String']>;
iconKey?: InputMaybe<Scalars['String']>;
id?: InputMaybe<Scalars['UUID']>;
isRelevantForAgents?: InputMaybe<Scalars['Boolean']>;
isRelevantForApiKeys?: InputMaybe<Scalars['Boolean']>;
isRelevantForUsers?: InputMaybe<Scalars['Boolean']>;
key: Scalars['String'];
label: Scalars['String'];
universalIdentifier?: InputMaybe<Scalars['UUID']>;
};
export type CreateRoleInput = {
canAccessAllTools?: InputMaybe<Scalars['Boolean']>;
canBeAssignedToAgents?: InputMaybe<Scalars['Boolean']>;
@@ -2373,6 +2387,7 @@ export type Mutation = {
createPageLayout: PageLayout;
createPageLayoutTab: PageLayoutTab;
createPageLayoutWidget: PageLayoutWidget;
createPermissionFlagDefinition: PermissionFlagDefinition;
createPublicDomain: PublicDomain;
createSAMLIdentityProvider: SetupSso;
createSkill: Skill;
@@ -2401,6 +2416,7 @@ export type Mutation = {
deleteOneLogicFunction: LogicFunction;
deleteOneObject: Object;
deleteOneRole: Scalars['String'];
deletePermissionFlagDefinition: PermissionFlagDefinition;
deletePublicDomain: Scalars['Boolean'];
deleteQueuedChatMessage: Scalars['Boolean'];
deleteSSOIdentityProvider: DeleteSso;
@@ -2508,6 +2524,7 @@ export type Mutation = {
updatePageLayoutWidget: PageLayoutWidget;
updatePageLayoutWithTabsAndWidgets: PageLayout;
updatePasswordViaResetToken: InvalidatePassword;
updatePermissionFlagDefinition: PermissionFlagDefinition;
updateSkill: Skill;
updateUserEmail: Scalars['Boolean'];
updateView: View;
@@ -2724,6 +2741,11 @@ export type MutationCreatePageLayoutWidgetArgs = {
};
export type MutationCreatePermissionFlagDefinitionArgs = {
input: CreatePermissionFlagDefinitionInput;
};
export type MutationCreatePublicDomainArgs = {
domain: Scalars['String'];
};
@@ -2859,6 +2881,11 @@ export type MutationDeleteOneRoleArgs = {
};
export type MutationDeletePermissionFlagDefinitionArgs = {
id: Scalars['UUID'];
};
export type MutationDeletePublicDomainArgs = {
domain: Scalars['String'];
};
@@ -3382,6 +3409,11 @@ export type MutationUpdatePasswordViaResetTokenArgs = {
};
export type MutationUpdatePermissionFlagDefinitionArgs = {
input: UpdatePermissionFlagDefinitionInput;
};
export type MutationUpdateSkillArgs = {
input: UpdateSkillInput;
};
@@ -3903,6 +3935,24 @@ export type PermissionFlag = {
roleId: Scalars['UUID'];
};
export type PermissionFlagDefinition = {
__typename?: 'PermissionFlagDefinition';
applicationId: Scalars['UUID'];
category: Scalars['String'];
createdAt: Scalars['DateTime'];
description?: Maybe<Scalars['String']>;
iconKey?: Maybe<Scalars['String']>;
id: Scalars['UUID'];
isCustom: Scalars['Boolean'];
isRelevantForAgents: Scalars['Boolean'];
isRelevantForApiKeys: Scalars['Boolean'];
isRelevantForUsers: Scalars['Boolean'];
key: Scalars['String'];
label: Scalars['String'];
universalIdentifier: Scalars['UUID'];
updatedAt: Scalars['DateTime'];
};
export enum PermissionFlagType {
AI = 'AI',
AI_SETTINGS = 'AI_SETTINGS',
@@ -4151,6 +4201,8 @@ export type Query = {
object: Object;
objectRecordCounts: Array<ObjectRecordCount>;
objects: ObjectConnection;
permissionFlagDefinition?: Maybe<PermissionFlagDefinition>;
permissionFlagDefinitions: Array<PermissionFlagDefinition>;
pieChartData: PieChartData;
skill?: Maybe<Skill>;
skills: Array<Skill>;
@@ -4506,6 +4558,11 @@ export type QueryObjectsArgs = {
};
export type QueryPermissionFlagDefinitionArgs = {
id: Scalars['UUID'];
};
export type QueryPieChartDataArgs = {
input: PieChartDataInput;
};
@@ -5162,6 +5219,23 @@ export type UpdatePageLayoutWithTabsInput = {
type: PageLayoutType;
};
export type UpdatePermissionFlagDefinitionInput = {
/** The id of the permission flag definition to update */
id: Scalars['UUID'];
/** The fields to update */
update: UpdatePermissionFlagDefinitionInputUpdates;
};
export type UpdatePermissionFlagDefinitionInputUpdates = {
category?: InputMaybe<Scalars['String']>;
description?: InputMaybe<Scalars['String']>;
iconKey?: InputMaybe<Scalars['String']>;
isRelevantForAgents?: InputMaybe<Scalars['Boolean']>;
isRelevantForApiKeys?: InputMaybe<Scalars['Boolean']>;
isRelevantForUsers?: InputMaybe<Scalars['Boolean']>;
label?: InputMaybe<Scalars['String']>;
};
export type UpdateRoleInput = {
/** The id of the role to update */
id: Scalars['UUID'];
@@ -31,6 +31,7 @@ export const useMetadataErrorHandler = () => {
index: t`index`,
logicFunction: t`logic function`,
permissionFlag: t`permission flag`,
permissionFlagDefinition: t`permission flag definition`,
objectPermission: t`object permission`,
fieldPermission: t`field permission`,
role: t`role`,
@@ -109,7 +109,7 @@ export abstract class WorkspaceCommandRunner<
}
try {
await this.workspaceIteratorService.iterate({
const report = await this.workspaceIteratorService.iterate({
workspaceIds:
options.workspaceId && options.workspaceId.size > 0
? Array.from(options.workspaceId)
@@ -129,6 +129,10 @@ export abstract class WorkspaceCommandRunner<
},
});
if (report.fail.length > 0) {
throw new Error(`Command failed for ${report.fail.length} workspace(s)`);
}
this.logger.log(chalk.blue('Command completed!'));
} catch (error) {
this.logger.error(chalk.red(`Command failed`));
@@ -1 +0,0 @@
export const EXA_WEB_SEARCH_TOOL_NAME = 'app_exa_web_search';
@@ -1,10 +1,8 @@
import { Injectable } from '@nestjs/common';
import { PermissionFlagType } from 'twenty-shared/constants';
import { isDefined } from 'twenty-shared/utils';
import { DEFAULT_TOOL_INPUT_SCHEMA } from 'twenty-shared/logic-function';
import { EXA_WEB_SEARCH_TOOL_NAME } from 'src/engine/core-modules/tool-provider/constants/exa-web-search-tool-name.const';
import { type GenerateDescriptorOptions } from 'src/engine/core-modules/tool-provider/interfaces/generate-descriptor-options.type';
import { type ToolProvider } from 'src/engine/core-modules/tool-provider/interfaces/tool-provider.interface';
import { type ToolProviderContext } from 'src/engine/core-modules/tool-provider/interfaces/tool-provider-context.type';
@@ -15,7 +13,6 @@ import { type ToolIndexEntry } from 'src/engine/core-modules/tool-provider/types
import { type ToolOutput } from 'src/engine/core-modules/tool/types/tool-output.type';
import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service';
import { type FlatLogicFunction } from 'src/engine/metadata-modules/logic-function/types/flat-logic-function.type';
import { PermissionsService } from 'src/engine/metadata-modules/permissions/permissions.service';
@Injectable()
export class LogicFunctionToolProvider implements ToolProvider {
@@ -23,7 +20,6 @@ export class LogicFunctionToolProvider implements ToolProvider {
constructor(
private readonly flatEntityMapsCacheService: WorkspaceManyOrAllFlatEntityMapsCacheService,
private readonly permissionsService: PermissionsService,
) {}
async isAvailable(_context: ToolProviderContext): Promise<boolean> {
@@ -72,22 +68,6 @@ export class LogicFunctionToolProvider implements ToolProvider {
for (const logicFunction of logicFunctionsWithSchema) {
const toolName = this.buildLogicFunctionToolName(logicFunction.name);
// Exa web search is registered as a logic-function tool, gated by
// WEB_SEARCH_TOOL flag (declared by the standard application now,
// intended to migrate to an Exa-app-owned definition once the SDK
// exposes definePermissionFlag).
if (toolName === EXA_WEB_SEARCH_TOOL_NAME) {
const isPermitted = await this.permissionsService.hasToolPermission(
context.rolePermissionConfig,
context.workspaceId,
PermissionFlagType.WEB_SEARCH_TOOL,
);
if (!isPermitted) {
continue;
}
}
const base: ToolIndexEntry = {
name: toolName,
description:
@@ -1,4 +1,4 @@
import { UseGuards, UseInterceptors } from '@nestjs/common';
import { UseFilters, UseGuards, UseInterceptors } from '@nestjs/common';
import { Args, Mutation, Query } from '@nestjs/graphql';
import { PermissionFlagType } from 'twenty-shared/constants';
@@ -13,9 +13,11 @@ import { CreatePermissionFlagDefinitionInput } from 'src/engine/metadata-modules
import { PermissionFlagDefinitionDTO } from 'src/engine/metadata-modules/permission-flag-definition/dtos/permission-flag-definition.dto';
import { UpdatePermissionFlagDefinitionInput } from 'src/engine/metadata-modules/permission-flag-definition/dtos/update-permission-flag-definition.input';
import { PermissionFlagDefinitionService } from 'src/engine/metadata-modules/permission-flag-definition/permission-flag-definition.service';
import { PermissionFlagDefinitionGraphqlApiExceptionFilter } from 'src/engine/metadata-modules/permission-flag-definition/utils/permission-flag-definition-graphql-api-exception.filter';
import { WorkspaceMigrationGraphqlApiExceptionInterceptor } from 'src/engine/workspace-manager/workspace-migration/interceptors/workspace-migration-graphql-api-exception.interceptor';
@UseGuards(WorkspaceAuthGuard)
@UseFilters(PermissionFlagDefinitionGraphqlApiExceptionFilter)
@UseInterceptors(WorkspaceMigrationGraphqlApiExceptionInterceptor)
@MetadataResolver(() => PermissionFlagDefinitionDTO)
export class PermissionFlagDefinitionResolver {
@@ -0,0 +1,39 @@
import { assertUnreachable } from 'twenty-shared/utils';
import {
ConflictError,
ForbiddenError,
NotFoundError,
UserInputError,
} from 'src/engine/core-modules/graphql/utils/graphql-errors.util';
import {
PermissionFlagDefinitionException,
PermissionFlagDefinitionExceptionCode,
} from 'src/engine/metadata-modules/permission-flag-definition/permission-flag-definition.exception';
export const permissionFlagDefinitionGraphqlApiExceptionHandler = (
error: Error,
) => {
if (error instanceof PermissionFlagDefinitionException) {
switch (error.code) {
case PermissionFlagDefinitionExceptionCode.PERMISSION_FLAG_DEFINITION_NOT_FOUND:
throw new NotFoundError(error);
case PermissionFlagDefinitionExceptionCode.PERMISSION_FLAG_DEFINITION_ALREADY_EXISTS:
throw new ConflictError(error);
case PermissionFlagDefinitionExceptionCode.PERMISSION_FLAG_DEFINITION_IS_STANDARD:
throw new ForbiddenError(error);
case PermissionFlagDefinitionExceptionCode.INVALID_PERMISSION_FLAG_DEFINITION_INPUT:
case PermissionFlagDefinitionExceptionCode.INVALID_PERMISSION_FLAG_DEFINITION_KEY:
case PermissionFlagDefinitionExceptionCode.INVALID_PERMISSION_FLAG_DEFINITION_CATEGORY:
case PermissionFlagDefinitionExceptionCode.PERMISSION_FLAG_DEFINITION_KEY_IMMUTABLE:
case PermissionFlagDefinitionExceptionCode.PERMISSION_FLAG_DEFINITION_APPLICATION_IMMUTABLE:
case PermissionFlagDefinitionExceptionCode.PERMISSION_FLAG_DEFINITION_IN_USE:
throw new UserInputError(error);
default: {
return assertUnreachable(error.code);
}
}
}
throw error;
};
@@ -0,0 +1,22 @@
import {
Catch,
type ExceptionFilter,
type ExecutionContext,
Injectable,
} from '@nestjs/common';
import { PermissionFlagDefinitionException } from 'src/engine/metadata-modules/permission-flag-definition/permission-flag-definition.exception';
import { permissionFlagDefinitionGraphqlApiExceptionHandler } from 'src/engine/metadata-modules/permission-flag-definition/utils/permission-flag-definition-graphql-api-exception-handler.util';
@Catch(PermissionFlagDefinitionException)
@Injectable()
export class PermissionFlagDefinitionGraphqlApiExceptionFilter
implements ExceptionFilter
{
catch(
exception: PermissionFlagDefinitionException,
_host: ExecutionContext,
) {
return permissionFlagDefinitionGraphqlApiExceptionHandler(exception);
}
}
@@ -10,5 +10,4 @@ export const TOOL_PERMISSION_FLAGS = [
'CONNECTED_ACCOUNTS',
'PROFILE_INFORMATION',
'CODE_INTERPRETER_TOOL',
'WEB_SEARCH_TOOL',
];
@@ -118,7 +118,6 @@ export class PermissionsService {
[PermissionFlagType.SEND_EMAIL_TOOL]: false,
[PermissionFlagType.HTTP_REQUEST_TOOL]: false,
[PermissionFlagType.CODE_INTERPRETER_TOOL]: false,
[PermissionFlagType.WEB_SEARCH_TOOL]: false,
[PermissionFlagType.IMPORT_CSV]: false,
[PermissionFlagType.EXPORT_CSV]: false,
[PermissionFlagType.CONNECTED_ACCOUNTS]: false,
@@ -231,16 +231,6 @@ export const STANDARD_PERMISSION_FLAG_DEFINITION = {
isRelevantForUsers: true,
isRelevantForApiKeys: false,
},
WEB_SEARCH_TOOL: {
universalIdentifier: '20202021-1001-4001-9001-00000000001a',
label: 'Web Search',
description: 'Search the web via configured action tools (e.g. Exa)',
iconKey: 'IconWorld',
category: 'tool',
isRelevantForAgents: true,
isRelevantForUsers: false,
isRelevantForApiKeys: false,
},
IMPORT_CSV: {
universalIdentifier: '20202021-1001-4001-9001-000000000016',
label: 'Import CSV',
@@ -23,7 +23,6 @@ export enum PermissionFlagType {
SEND_EMAIL_TOOL = 'SEND_EMAIL_TOOL',
HTTP_REQUEST_TOOL = 'HTTP_REQUEST_TOOL',
CODE_INTERPRETER_TOOL = 'CODE_INTERPRETER_TOOL',
WEB_SEARCH_TOOL = 'WEB_SEARCH_TOOL',
IMPORT_CSV = 'IMPORT_CSV',
EXPORT_CSV = 'EXPORT_CSV',
CONNECTED_ACCOUNTS = 'CONNECTED_ACCOUNTS',