Polish permission flag definition foundation
This commit is contained in:
@@ -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'];
|
||||
|
||||
+1
@@ -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`,
|
||||
|
||||
+5
-1
@@ -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
@@ -1 +0,0 @@
|
||||
export const EXA_WEB_SEARCH_TOOL_NAME = 'app_exa_web_search';
|
||||
-20
@@ -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:
|
||||
|
||||
+3
-1
@@ -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 {
|
||||
|
||||
+39
@@ -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;
|
||||
};
|
||||
+22
@@ -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);
|
||||
}
|
||||
}
|
||||
-1
@@ -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,
|
||||
|
||||
-10
@@ -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',
|
||||
|
||||
Reference in New Issue
Block a user