@memberjunction/graphql-dataprovider 2.126.0 → 2.126.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/FieldMapper.ts","../src/graphQLTransactionGroup.ts","../src/graphQLAIClient.ts","../src/graphQLDataProvider.ts","../src/config.ts","../src/rolesAndUsersType.ts","../src/graphQLSystemUserClient.ts","../src/graphQLActionClient.ts","../src/graphQLTestingClient.ts","../src/GraphQLComponentRegistryClient.ts"],"sourcesContent":["import { RegisterClass } from '@memberjunction/global';\n\n/**\n * FieldMapper is used to map fields from one name to another. This is useful when we need to map\n * fields from one system to another, or when we need to map fields from one version of a system\n * to another. Uses an internal field mapping but may be overridden or extended as needed.\n */\nexport class FieldMapper {\n private _fieldMap: Record<string, string> = {\n __mj_CreatedAt: '_mj__CreatedAt',\n __mj_UpdatedAt: '_mj__UpdatedAt',\n __mj_DeletedAt: '_mj__DeletedAt',\n };\n\n /**\n * Creates a new FieldMapper instance.\n * @param fieldMap An optional field map to use for mapping fields. If not provided, the default field map will be used.\n */\n constructor() {}\n\n /**\n * Maps fields from one name to another mutating the object in place.\n * @param obj The object to mutate\n */\n public MapFields(obj?: Record<string, unknown>) {\n if (obj) {\n for (const k in obj) {\n if (k in this._fieldMap) {\n obj[this._fieldMap[k]] = obj[k];\n delete obj[k];\n }\n }\n }\n return obj;\n }\n\n /**\n * Maps a field name from one name to another.\n * @param fieldName The field name to map.\n * @returns The mapped field name, or the original field name if no mapping is found.\n */\n public MapFieldName(fieldName: string): string {\n return this._fieldMap[fieldName] ?? fieldName;\n }\n\n /**\n * Maps a field name from one name to another using the reverse mapping.\n * @param fieldName The field name to map.\n * @returns The mapped field name, or the original field name if no mapping is found.\n */\n public ReverseMapFieldName(fieldName: string): string {\n return Object.entries(this._fieldMap).find(([k, v]) => v === fieldName)?.[0] ?? fieldName;\n }\n\n /**\n * Maps fields from one name to another mutating the object in place using the reverse mapping.\n * @param obj The object to mutate\n */\n public ReverseMapFields(obj: Record<string, unknown>) {\n const reversed = Object.fromEntries(Object.entries(this._fieldMap).map(([k, v]) => [v, k]));\n for (const k in obj) {\n if (k in reversed) {\n obj[reversed[k]] = obj[k];\n delete obj[k];\n }\n }\n return obj;\n }\n}\n","import { TransactionGroupBase, TransactionResult } from \"@memberjunction/core\";\nimport { GraphQLDataProvider } from \"./graphQLDataProvider\";\nimport { gql } from \"graphql-request\";\nimport { SafeJSONParse } from \"@memberjunction/global\";\n\nexport class GraphQLTransactionGroup extends TransactionGroupBase {\n private _provider: GraphQLDataProvider;\n constructor(provider: GraphQLDataProvider) {\n super();\n this._provider = provider;\n }\n\n // protected async HandleSubmit(): Promise<TransactionResult[]> {\n // // iterate through each instruction and build up the combined query string\n // // and the combined variables object\n // let combinedQuery = '';\n // let mutationParams = '';\n // const combinedVars: any = {};\n\n // for (let i = 0; i < this.PendingTransactions.length; i++) {\n // const item = this.PendingTransactions[i];\n // let itemMutation = item.Instruction;\n // if (item.Vars) {\n // const keys = Object.keys(item.Vars);\n // // rename the variables to avoid collisions and aggregate the varisables\n // // from the item into our combined variables\n // for (let j = 0; j < keys.length; j++) {\n // const key = keys[j];\n // const newKey = `${key}_${i}`;\n // combinedVars[newKey] = item.Vars[key];\n\n // const keyRegEx = new RegExp('\\\\$' + key, 'g'); // Create the RegExp dynamically with the global flag.\n // itemMutation = itemMutation.replace(keyRegEx, '$' + newKey);\n // const mutationInputType = item.ExtraData.mutationInputTypes.find((t: any) => t.varName === key)?.inputType;\n // //{varName: pk.CodeName, inputType: pk.EntityFieldInfo.GraphQLType + '!'}\n // mutationParams += `$${newKey}: ${mutationInputType} \\n`;\n // }\n // }\n // // add in the specific mutation and give it an alias so we can easily figure out the results\n // // from each of them and pass back properly\n // combinedQuery += `mutation_${i}: ` + itemMutation + '\\n';\n // }\n\n // combinedQuery = `mutation TransactionGroup(${mutationParams}){ \\n` + combinedQuery+ '\\n}'; // wrap it up in a mutation so we can execute it\n // const execResults = await this._provider.ExecuteGQL(combinedQuery, combinedVars)\n // const returnResults: TransactionResult[] = [];\n // for (let i = 0; i < this.PendingTransactions.length; i++) {\n // /// NEED TO TEST TO SEE WHAT ORDER WE GET RESULTS BACK AS\n // const result = execResults[`mutation_${i}`];\n // const item = this.PendingTransactions[i];\n // returnResults.push(new TransactionResult(item, result, result !== null));\n // }\n // return returnResults;\n // }\n\n // new implementation\n protected async HandleSubmit(): Promise<TransactionResult[]> {\n // Define the mutation\n const mutation = gql`\n mutation ExecuteTransactionGroup($group: TransactionInputType!) {\n ExecuteTransactionGroup(group: $group) {\n Success\n ErrorMessages\n ResultsJSON\n }\n }\n `;\n\n // Example variables for the mutation\n const items = [];\n for (const pt of this.PendingTransactions) {\n items.push({\n EntityName: pt.BaseEntity.EntityInfo.Name,\n EntityObjectJSON: await pt.BaseEntity.GetDataObjectJSON(),\n OperationType: pt.OperationType\n });\n }\n const vars = {\n group: {\n Items: items,\n Variables: this.Variables.map(v => {\n return {\n Name: v.Name,\n ItemIndex: this.MapVariableEntityObjectToPosition(v),\n FieldName: v.FieldName,\n Type: v.Type\n }\n }) \n }\n }; \n\n const results = await this._provider.ExecuteGQL(mutation, vars)\n if (results && results.ExecuteTransactionGroup) {\n const data = results.ExecuteTransactionGroup;\n const returnResults: TransactionResult[] = [];\n for (let i = 0; i < this.PendingTransactions.length; i++) {\n const resultJSON = data.ResultsJSON[i];\n const resultObject = SafeJSONParse(resultJSON);\n const item = this.PendingTransactions[i];\n returnResults.push(new TransactionResult(item, resultObject, resultObject !== null));\n }\n return returnResults;\n }\n else {\n throw new Error('Failed to execute transaction group');\n }\n }\n}","import { LogError, LogStatusEx } from \"@memberjunction/core\";\nimport { GraphQLDataProvider } from \"./graphQLDataProvider\";\nimport { gql } from \"graphql-request\";\nimport { ExecuteAgentParams, ExecuteAgentResult } from \"@memberjunction/ai-core-plus\";\nimport { SafeJSONParse } from \"@memberjunction/global\";\n\n/**\n * Client for executing AI operations through GraphQL.\n * This class provides an easy way to execute AI prompts and agents from a client application.\n * \n * The GraphQLAIClient follows the same naming convention as other GraphQL clients\n * in the MemberJunction ecosystem, such as GraphQLActionClient and GraphQLSystemUserClient.\n * \n * @example\n * ```typescript\n * // Create the client\n * const aiClient = new GraphQLAIClient(graphQLProvider);\n * \n * // Run an AI prompt\n * const promptResult = await aiClient.RunAIPrompt({\n * promptId: \"prompt-id\",\n * data: { context: \"user data\" },\n * temperature: 0.7\n * });\n * \n * // Run an AI agent\n * const agentResult = await aiClient.RunAIAgent({\n * agentId: \"agent-id\",\n * messages: [{ role: \"user\", content: \"Hello\" }],\n * sessionId: \"session-123\"\n * });\n * ```\n */\nexport class GraphQLAIClient {\n /**\n * The GraphQLDataProvider instance used to execute GraphQL requests\n * @private\n */\n private _dataProvider: GraphQLDataProvider;\n\n /**\n * Creates a new GraphQLAIClient instance.\n * @param dataProvider The GraphQL data provider to use for queries\n */\n constructor(dataProvider: GraphQLDataProvider) {\n this._dataProvider = dataProvider;\n }\n\n /**\n * Run an AI prompt with the specified parameters.\n * \n * This method invokes an AI prompt on the server through GraphQL and returns the result.\n * Parameters are automatically serialized as needed, and results are parsed for consumption.\n * \n * @param params The parameters for running the AI prompt\n * @returns A Promise that resolves to a RunAIPromptResult object\n * \n * @example\n * ```typescript\n * const result = await aiClient.RunAIPrompt({\n * promptId: \"prompt-id\",\n * data: { key: \"value\" },\n * temperature: 0.7,\n * topP: 0.9\n * });\n * \n * if (result.success) {\n * console.log('Output:', result.output);\n * console.log('Parsed Result:', result.parsedResult);\n * } else {\n * console.error('Error:', result.error);\n * }\n * ```\n */\n public async RunAIPrompt(params: RunAIPromptParams): Promise<RunAIPromptResult> {\n try {\n // Build the mutation with all possible parameters\n const mutation = gql`\n mutation RunAIPrompt(\n $promptId: String!,\n $data: String,\n $overrideModelId: String,\n $overrideVendorId: String,\n $configurationId: String,\n $skipValidation: Boolean,\n $templateData: String,\n $responseFormat: String,\n $temperature: Float,\n $topP: Float,\n $topK: Int,\n $minP: Float,\n $frequencyPenalty: Float,\n $presencePenalty: Float,\n $seed: Int,\n $stopSequences: [String!],\n $includeLogProbs: Boolean,\n $topLogProbs: Int,\n $messages: String,\n $rerunFromPromptRunID: String,\n $systemPromptOverride: String\n ) {\n RunAIPrompt(\n promptId: $promptId,\n data: $data,\n overrideModelId: $overrideModelId,\n overrideVendorId: $overrideVendorId,\n configurationId: $configurationId,\n skipValidation: $skipValidation,\n templateData: $templateData,\n responseFormat: $responseFormat,\n temperature: $temperature,\n topP: $topP,\n topK: $topK,\n minP: $minP,\n frequencyPenalty: $frequencyPenalty,\n presencePenalty: $presencePenalty,\n seed: $seed,\n stopSequences: $stopSequences,\n includeLogProbs: $includeLogProbs,\n topLogProbs: $topLogProbs,\n messages: $messages,\n rerunFromPromptRunID: $rerunFromPromptRunID,\n systemPromptOverride: $systemPromptOverride\n ) {\n success\n output\n parsedResult\n error\n executionTimeMs\n tokensUsed\n promptRunId\n rawResult\n validationResult\n chatResult\n }\n }\n `;\n\n // Prepare variables, serializing complex objects to JSON strings\n const variables = this.preparePromptVariables(params);\n\n // Execute the mutation\n const result = await this._dataProvider.ExecuteGQL(mutation, variables);\n\n // Process and return the result\n return this.processPromptResult(result);\n } catch (e) {\n return this.handlePromptError(e);\n }\n }\n\n /**\n * Prepares variables for the AI prompt mutation\n * @param params The prompt parameters\n * @returns The prepared variables for GraphQL\n * @private\n */\n private preparePromptVariables(params: RunAIPromptParams): Record<string, any> {\n const variables: Record<string, any> = {\n promptId: params.promptId\n };\n\n // Serialize complex objects to JSON strings\n if (params.data !== undefined) {\n variables.data = typeof params.data === 'object' ? JSON.stringify(params.data) : params.data;\n }\n if (params.templateData !== undefined) {\n variables.templateData = typeof params.templateData === 'object' ? JSON.stringify(params.templateData) : params.templateData;\n }\n if (params.messages !== undefined) {\n variables.messages = JSON.stringify(params.messages);\n }\n\n // Add optional scalar parameters\n if (params.overrideModelId !== undefined) variables.overrideModelId = params.overrideModelId;\n if (params.overrideVendorId !== undefined) variables.overrideVendorId = params.overrideVendorId;\n if (params.configurationId !== undefined) variables.configurationId = params.configurationId;\n if (params.skipValidation !== undefined) variables.skipValidation = params.skipValidation;\n if (params.responseFormat !== undefined) variables.responseFormat = params.responseFormat;\n if (params.temperature !== undefined) variables.temperature = params.temperature;\n if (params.topP !== undefined) variables.topP = params.topP;\n if (params.topK !== undefined) variables.topK = params.topK;\n if (params.minP !== undefined) variables.minP = params.minP;\n if (params.frequencyPenalty !== undefined) variables.frequencyPenalty = params.frequencyPenalty;\n if (params.presencePenalty !== undefined) variables.presencePenalty = params.presencePenalty;\n if (params.seed !== undefined) variables.seed = params.seed;\n if (params.stopSequences !== undefined) variables.stopSequences = params.stopSequences;\n if (params.includeLogProbs !== undefined) variables.includeLogProbs = params.includeLogProbs;\n if (params.topLogProbs !== undefined) variables.topLogProbs = params.topLogProbs;\n if (params.rerunFromPromptRunID !== undefined) variables.rerunFromPromptRunID = params.rerunFromPromptRunID;\n if (params.systemPromptOverride !== undefined) variables.systemPromptOverride = params.systemPromptOverride;\n\n return variables;\n }\n\n /**\n * Processes the result from the AI prompt mutation\n * @param result The raw GraphQL result\n * @returns The processed RunAIPromptResult\n * @private\n */\n private processPromptResult(result: any): RunAIPromptResult {\n if (!result?.RunAIPrompt) {\n throw new Error(\"Invalid response from server\");\n }\n\n const promptResult = result.RunAIPrompt;\n\n // Parse JSON results if they exist\n let parsedResult: any;\n let validationResult: any;\n let chatResult: any;\n\n try {\n if (promptResult.parsedResult) {\n parsedResult = JSON.parse(promptResult.parsedResult);\n }\n } catch (e) {\n // Keep as string if parsing fails\n parsedResult = promptResult.parsedResult;\n }\n\n try {\n if (promptResult.validationResult) {\n validationResult = JSON.parse(promptResult.validationResult);\n }\n } catch (e) {\n validationResult = promptResult.validationResult;\n }\n\n try {\n if (promptResult.chatResult) {\n chatResult = JSON.parse(promptResult.chatResult);\n }\n } catch (e) {\n chatResult = promptResult.chatResult;\n }\n\n return {\n success: promptResult.success,\n output: promptResult.output,\n parsedResult,\n error: promptResult.error,\n executionTimeMs: promptResult.executionTimeMs,\n tokensUsed: promptResult.tokensUsed,\n promptRunId: promptResult.promptRunId,\n rawResult: promptResult.rawResult,\n validationResult,\n chatResult\n };\n }\n\n /**\n * Handles errors in the AI prompt execution\n * @param e The error\n * @returns An error result\n * @private\n */\n private handlePromptError(e: unknown): RunAIPromptResult {\n const error = e as Error;\n LogError(`Error running AI prompt: ${error}`);\n return {\n success: false,\n error: error.message || 'Unknown error occurred'\n };\n }\n\n /**\n * Run an AI agent with the specified parameters.\n *\n * This method invokes an AI agent on the server through GraphQL and returns the result.\n * The agent can maintain conversation context across multiple interactions.\n *\n * If a progress callback is provided in params.onProgress, this method will subscribe\n * to real-time progress updates from the GraphQL server and forward them to the callback.\n *\n * @param params The parameters for running the AI agent\n * @returns A Promise that resolves to a RunAIAgentResult object\n *\n * @example\n * ```typescript\n * const result = await aiClient.RunAIAgent({\n * agentId: \"agent-id\",\n * messages: [\n * { role: \"user\", content: \"What's the weather like?\" }\n * ],\n * sessionId: \"session-123\",\n * data: { location: \"New York\" },\n * onProgress: (progress) => {\n * console.log(`Progress: ${progress.message} (${progress.percentage}%)`);\n * }\n * });\n *\n * if (result.success) {\n * console.log('Response:', result.payload);\n * console.log('Execution time:', result.executionTimeMs, 'ms');\n * } else {\n * console.error('Error:', result.errorMessage);\n * }\n * ```\n */\n public async RunAIAgent(\n params: ExecuteAgentParams,\n sourceArtifactId?: string,\n sourceArtifactVersionId?: string\n ): Promise<ExecuteAgentResult> {\n let subscription: any;\n\n try {\n // Subscribe to progress updates if callback provided\n if (params.onProgress) {\n subscription = this._dataProvider.PushStatusUpdates(this._dataProvider.sessionId)\n .subscribe((message: string) => {\n try {\n LogStatusEx({message: '[GraphQLAIClient] Received statusUpdate message', verboseOnly: true, additionalArgs: [message]});\n const parsed = JSON.parse(message);\n LogStatusEx({message: '[GraphQLAIClient] Parsed message', verboseOnly: true, additionalArgs: [parsed]});\n\n // Filter for ExecutionProgress messages from RunAIAgentResolver\n if (parsed.resolver === 'RunAIAgentResolver' &&\n parsed.type === 'ExecutionProgress' &&\n parsed.status === 'ok' &&\n parsed.data?.progress) {\n\n LogStatusEx({message: '[GraphQLAIClient] Forwarding progress to callback', verboseOnly: true, additionalArgs: [parsed.data.progress]});\n // Forward progress to callback with agentRunId in metadata\n const progressWithRunId = {\n ...parsed.data.progress,\n metadata: {\n ...(parsed.data.progress.metadata || {}),\n agentRunId: parsed.data.agentRunId\n }\n };\n params.onProgress!(progressWithRunId);\n } else {\n LogStatusEx({message: '[GraphQLAIClient] Message does not match filter criteria', verboseOnly: true, additionalArgs: [{\n resolver: parsed.resolver,\n type: parsed.type,\n status: parsed.status,\n hasProgress: !!parsed.data?.progress\n }]});\n }\n } catch (e) {\n // Log parsing errors for debugging\n console.error('[GraphQLAIClient] Failed to parse progress message:', e, 'Raw message:', message);\n }\n });\n }\n\n // Build the mutation\n const mutation = gql`\n mutation RunAIAgent(\n $agentId: String!,\n $messages: String!,\n $sessionId: String!,\n $data: String,\n $payload: String,\n $templateData: String,\n $lastRunId: String,\n $autoPopulateLastRunPayload: Boolean,\n $configurationId: String,\n $conversationDetailId: String,\n $createArtifacts: Boolean,\n $createNotification: Boolean,\n $sourceArtifactId: String,\n $sourceArtifactVersionId: String\n ) {\n RunAIAgent(\n agentId: $agentId,\n messages: $messages,\n sessionId: $sessionId,\n data: $data,\n payload: $payload,\n templateData: $templateData,\n lastRunId: $lastRunId,\n autoPopulateLastRunPayload: $autoPopulateLastRunPayload,\n configurationId: $configurationId,\n conversationDetailId: $conversationDetailId,\n createArtifacts: $createArtifacts,\n createNotification: $createNotification,\n sourceArtifactId: $sourceArtifactId,\n sourceArtifactVersionId: $sourceArtifactVersionId\n ) {\n success\n errorMessage\n executionTimeMs\n result\n }\n }\n `;\n\n // Prepare variables\n const variables = this.prepareAgentVariables(params, sourceArtifactId, sourceArtifactVersionId);\n\n // Execute the mutation\n const result = await this._dataProvider.ExecuteGQL(mutation, variables);\n\n // Process and return the result\n return this.processAgentResult(result.RunAIAgent?.result);\n } catch (e) {\n return this.handleAgentError(e);\n } finally {\n // Always clean up subscription\n if (subscription) {\n subscription.unsubscribe();\n }\n }\n }\n\n /**\n * Prepares variables for the AI agent mutation\n * @param params The agent parameters\n * @param sourceArtifactId Optional source artifact ID for versioning\n * @param sourceArtifactVersionId Optional source artifact version ID for versioning\n * @returns The prepared variables for GraphQL\n * @private\n */\n private prepareAgentVariables(\n params: ExecuteAgentParams,\n sourceArtifactId?: string,\n sourceArtifactVersionId?: string\n ): Record<string, any> {\n const variables: Record<string, any> = {\n agentId: params.agent.ID,\n messages: JSON.stringify(params.conversationMessages),\n sessionId: this._dataProvider.sessionId\n };\n\n // Serialize optional complex objects to JSON strings\n if (params.data !== undefined) {\n variables.data = typeof params.data === 'object' ? JSON.stringify(params.data) : params.data;\n } \n if (params.payload !== undefined) {\n variables.payload = typeof params.payload === 'object' ? JSON.stringify(params.payload) : params.payload;\n }\n\n // Add optional scalar parameters\n if (params.lastRunId !== undefined) variables.lastRunId = params.lastRunId;\n if (params.autoPopulateLastRunPayload !== undefined) variables.autoPopulateLastRunPayload = params.autoPopulateLastRunPayload;\n if (params.configurationId !== undefined) variables.configurationId = params.configurationId;\n if (params.conversationDetailId !== undefined) {\n variables.conversationDetailId = params.conversationDetailId;\n // When conversationDetailId is provided, enable server-side artifact and notification creation\n // This is a GraphQL resolver-level concern, not agent execution concern\n variables.createArtifacts = true;\n variables.createNotification = true;\n }\n // Add source artifact tracking for versioning (GraphQL resolver-level concern)\n if (sourceArtifactId !== undefined) variables.sourceArtifactId = sourceArtifactId;\n if (sourceArtifactVersionId !== undefined) variables.sourceArtifactVersionId = sourceArtifactVersionId;\n\n return variables;\n }\n\n /**\n * Processes the result from the AI agent mutation\n * @param result The raw GraphQL result\n * @returns The processed RunAIAgentResult\n * @private\n */\n private processAgentResult(result: string): ExecuteAgentResult {\n return SafeJSONParse(result) as ExecuteAgentResult; \n }\n\n /**\n * Handles errors in the AI agent execution\n * @param e The error\n * @returns An error result\n * @private\n */\n private handleAgentError(e: unknown): ExecuteAgentResult {\n const error = e as Error;\n LogError(`Error running AI agent: ${error}`);\n return {\n success: false,\n agentRun: undefined\n };\n }\n\n /**\n * Execute a simple prompt without requiring a stored AI Prompt entity.\n * This method is designed for interactive components that need quick AI responses.\n * \n * @param params The parameters for the simple prompt execution\n * @returns A Promise that resolves to a SimplePromptResult object\n * \n * @example\n * ```typescript\n * const result = await aiClient.ExecuteSimplePrompt({\n * systemPrompt: \"You are a helpful assistant\",\n * messages: [\n * { message: \"What's the weather?\", role: \"user\" }\n * ],\n * modelPower: \"medium\"\n * });\n * \n * if (result.success) {\n * console.log('Response:', result.result);\n * if (result.resultObject) {\n * console.log('Parsed JSON:', JSON.parse(result.resultObject));\n * }\n * }\n * ```\n */\n public async ExecuteSimplePrompt(params: ExecuteSimplePromptParams): Promise<SimplePromptResult> {\n try {\n const mutation = gql`\n mutation ExecuteSimplePrompt(\n $systemPrompt: String!,\n $messages: String,\n $preferredModels: [String!],\n $modelPower: String,\n $responseFormat: String\n ) {\n ExecuteSimplePrompt(\n systemPrompt: $systemPrompt,\n messages: $messages,\n preferredModels: $preferredModels,\n modelPower: $modelPower,\n responseFormat: $responseFormat\n ) {\n success\n result\n resultObject\n modelName\n error\n executionTimeMs\n }\n }\n `;\n\n // Prepare variables\n const variables: Record<string, any> = {\n systemPrompt: params.systemPrompt\n };\n\n // Convert messages array to JSON string if provided\n if (params.messages && params.messages.length > 0) {\n variables.messages = JSON.stringify(params.messages);\n }\n\n if (params.preferredModels) {\n variables.preferredModels = params.preferredModels;\n }\n\n if (params.modelPower) {\n variables.modelPower = params.modelPower;\n }\n\n if (params.responseFormat) {\n variables.responseFormat = params.responseFormat;\n }\n\n // Execute the mutation\n const result = await this._dataProvider.ExecuteGQL(mutation, variables);\n\n if (!result?.ExecuteSimplePrompt) {\n throw new Error(\"Invalid response from server\");\n }\n\n const promptResult = result.ExecuteSimplePrompt;\n\n // Parse resultObject if it exists\n let resultObject: any;\n if (promptResult.resultObject) {\n try {\n resultObject = JSON.parse(promptResult.resultObject);\n } catch (e) {\n resultObject = promptResult.resultObject;\n }\n }\n\n return {\n success: promptResult.success,\n result: promptResult.result,\n resultObject,\n modelName: promptResult.modelName,\n error: promptResult.error,\n executionTimeMs: promptResult.executionTimeMs\n };\n\n } catch (e) {\n const error = e as Error;\n LogError(`Error executing simple prompt: ${error}`);\n return {\n success: false,\n modelName: 'Unknown',\n error: error.message || 'Unknown error occurred'\n };\n }\n }\n\n /**\n * Generate embeddings for text using local embedding models.\n * This method is designed for interactive components that need fast similarity calculations.\n * \n * @param params The parameters for embedding generation\n * @returns A Promise that resolves to an EmbedTextResult object\n * \n * @example\n * ```typescript\n * const result = await aiClient.EmbedText({\n * textToEmbed: [\"Hello world\", \"How are you?\"],\n * modelSize: \"small\"\n * });\n * \n * console.log('Embeddings:', result.embeddings);\n * console.log('Model used:', result.modelName);\n * console.log('Dimensions:', result.vectorDimensions);\n * ```\n */\n public async EmbedText(params: EmbedTextParams): Promise<EmbedTextResult> {\n try {\n const mutation = gql`\n mutation EmbedText(\n $textToEmbed: [String!]!,\n $modelSize: String!\n ) {\n EmbedText(\n textToEmbed: $textToEmbed,\n modelSize: $modelSize\n ) {\n embeddings\n modelName\n vectorDimensions\n error\n }\n }\n `;\n\n // Prepare variables - handle both single string and array\n const textArray = Array.isArray(params.textToEmbed) \n ? params.textToEmbed \n : [params.textToEmbed];\n\n const variables = {\n textToEmbed: textArray,\n modelSize: params.modelSize\n };\n\n // Execute the mutation\n const result = await this._dataProvider.ExecuteGQL(mutation, variables);\n\n if (!result?.EmbedText) {\n throw new Error(\"Invalid response from server\");\n }\n\n const embedResult = result.EmbedText;\n\n // Return single embedding or array based on input\n const returnEmbeddings = Array.isArray(params.textToEmbed)\n ? embedResult.embeddings\n : embedResult.embeddings[0];\n\n return {\n embeddings: returnEmbeddings,\n modelName: embedResult.modelName,\n vectorDimensions: embedResult.vectorDimensions,\n error: embedResult.error\n };\n\n } catch (e) {\n const error = e as Error;\n LogError(`Error generating embeddings: ${error}`);\n return {\n embeddings: Array.isArray(params.textToEmbed) ? [] : [],\n modelName: 'Unknown',\n vectorDimensions: 0,\n error: error.message || 'Unknown error occurred'\n };\n }\n }\n}\n\n/**\n * Parameters for executing a simple prompt\n */\nexport interface ExecuteSimplePromptParams {\n /**\n * The system prompt to set context for the model\n */\n systemPrompt: string;\n \n /**\n * Optional message history\n */\n messages?: Array<{message: string, role: 'user' | 'assistant'}>;\n \n /**\n * Preferred model names to use\n */\n preferredModels?: string[];\n \n /**\n * Power level for model selection\n */\n modelPower?: 'lowest' | 'medium' | 'highest';\n \n /**\n * Response format (e.g., \"json\")\n */\n responseFormat?: string;\n}\n\n/**\n * Result from executing a simple prompt\n */\nexport interface SimplePromptResult {\n /**\n * Whether the execution was successful\n */\n success: boolean;\n \n /**\n * The text response from the model\n */\n result?: string;\n \n /**\n * Parsed JSON object if the response contained JSON\n */\n resultObject?: any;\n \n /**\n * Name of the model used\n */\n modelName: string;\n \n /**\n * Error message if execution failed\n */\n error?: string;\n \n /**\n * Execution time in milliseconds\n */\n executionTimeMs?: number;\n}\n\n/**\n * Parameters for generating text embeddings\n */\nexport interface EmbedTextParams {\n /**\n * Text or array of texts to embed\n */\n textToEmbed: string | string[];\n \n /**\n * Size of the embedding model to use\n */\n modelSize: 'small' | 'medium';\n}\n\n/**\n * Result from generating text embeddings\n */\nexport interface EmbedTextResult {\n /**\n * Single embedding vector or array of vectors\n */\n embeddings: number[] | number[][];\n \n /**\n * Name of the model used\n */\n modelName: string;\n \n /**\n * Number of dimensions in each vector\n */\n vectorDimensions: number;\n \n /**\n * Error message if generation failed\n */\n error?: string;\n}\n\n/**\n * Parameters for running an AI prompt\n */\nexport interface RunAIPromptParams {\n /**\n * The ID of the AI prompt to run\n */\n promptId: string;\n \n /**\n * Data context to pass to the prompt (will be JSON serialized)\n */\n data?: Record<string, any>;\n \n /**\n * Override the default model ID\n */\n overrideModelId?: string;\n \n /**\n * Override the default vendor ID\n */\n overrideVendorId?: string;\n \n /**\n * Configuration ID to use\n */\n configurationId?: string;\n \n /**\n * Skip validation of the prompt\n */\n skipValidation?: boolean;\n \n /**\n * Template data for prompt templating (will be JSON serialized)\n */\n templateData?: Record<string, any>;\n \n /**\n * Response format (e.g., \"json\", \"text\")\n */\n responseFormat?: string;\n \n /**\n * Temperature parameter for the model (0.0 to 1.0)\n */\n temperature?: number;\n \n /**\n * Top-p sampling parameter\n */\n topP?: number;\n \n /**\n * Top-k sampling parameter\n */\n topK?: number;\n \n /**\n * Min-p sampling parameter\n */\n minP?: number;\n \n /**\n * Frequency penalty parameter\n */\n frequencyPenalty?: number;\n \n /**\n * Presence penalty parameter\n */\n presencePenalty?: number;\n \n /**\n * Random seed for reproducible outputs\n */\n seed?: number;\n \n /**\n * Stop sequences for the model\n */\n stopSequences?: string[];\n \n /**\n * Include log probabilities in the response\n */\n includeLogProbs?: boolean;\n \n /**\n * Number of top log probabilities to include\n */\n topLogProbs?: number;\n \n /**\n * Conversation messages (will be JSON serialized)\n */\n messages?: Array<{ role: string; content: string }>;\n \n /**\n * ID of a previous prompt run to rerun from\n */\n rerunFromPromptRunID?: string;\n \n /**\n * Override the system prompt\n */\n systemPromptOverride?: string;\n}\n\n/**\n * Result from running an AI prompt\n */\nexport interface RunAIPromptResult {\n /**\n * Whether the prompt execution was successful\n */\n success: boolean;\n \n /**\n * The output from the prompt\n */\n output?: string;\n \n /**\n * Parsed result data (if applicable)\n */\n parsedResult?: any;\n \n /**\n * Error message if the execution failed\n */\n error?: string;\n \n /**\n * Execution time in milliseconds\n */\n executionTimeMs?: number;\n \n /**\n * Number of tokens used\n */\n tokensUsed?: number;\n \n /**\n * ID of the prompt run record\n */\n promptRunId?: string;\n \n /**\n * Raw result from the model\n */\n rawResult?: string;\n \n /**\n * Validation result data\n */\n validationResult?: any;\n \n /**\n * Chat completion result data\n */\n chatResult?: any;\n}\n ","/**************************************************************************************************************\n * The graphQLDataProvider provides a data provider for the entities framework that uses GraphQL to communicate\n * with the server.\n * In practice - this FILE will NOT exist in the entities library, we need to move to its own separate project\n * so it is only included by the consumer of the entities library if they want to use it.\n**************************************************************************************************************/\n\nimport { BaseEntity, IEntityDataProvider, IMetadataProvider, IRunViewProvider, ProviderConfigDataBase, RunViewResult,\n EntityInfo, EntityFieldInfo, EntityFieldTSType,\n RunViewParams, ProviderBase, ProviderType, UserInfo, UserRoleInfo, RecordChange,\n ILocalStorageProvider, EntitySaveOptions, EntityMergeOptions, LogError,\n TransactionGroupBase, TransactionItem, TransactionResult, DatasetItemFilterType, DatasetResultType, DatasetStatusResultType, EntityRecordNameInput,\n EntityRecordNameResult, IRunReportProvider, RunReportResult, RunReportParams, RecordDependency, RecordMergeRequest, RecordMergeResult,\n IRunQueryProvider, RunQueryResult, PotentialDuplicateRequest, PotentialDuplicateResponse, CompositeKey, EntityDeleteOptions,\n RunQueryParams, BaseEntityResult,\n KeyValuePair } from \"@memberjunction/core\";\nimport { UserViewEntityExtended, ViewInfo } from '@memberjunction/core-entities'\n\nimport { gql, GraphQLClient } from 'graphql-request'\nimport { openDB, DBSchema, IDBPDatabase } from '@tempfix/idb';\nimport { Observable, Subject, Subscription } from 'rxjs';\nimport { Client, createClient } from 'graphql-ws';\nimport { FieldMapper } from './FieldMapper';\nimport { v4 as uuidv4 } from 'uuid';\nimport { GraphQLTransactionGroup } from \"./graphQLTransactionGroup\";\nimport { GraphQLAIClient } from \"./graphQLAIClient\";\n\n// define the shape for a RefreshToken function that can be called by the GraphQLDataProvider whenever it receives an exception that the JWT it has already is expired\nexport type RefreshTokenFunction = () => Promise<string>;\n\n/**\n * The GraphQLProviderConfigData class is used to configure the GraphQLDataProvider. It is passed to the Config method of the GraphQLDataProvider\n */\nexport class GraphQLProviderConfigData extends ProviderConfigDataBase {\n /**\n * Token is the JWT token that is used to authenticate the user with the server\n */\n get Token(): string { return this.Data.Token }\n\n set Token(token: string) { this.Data.Token = token}\n\n /**\n * This optional parameter is used when using a shared secret key that is static and provided by the publisher of the MJAPI server. Providing this value will result in \n * a special header x-mj-api-key being set with this value in the HTTP request to the server. This is useful when the server is configured to require this key for certain requests.\n * \n * WARNING: This should NEVER BE USED IN A CLIENT APP like a browser. The only suitable use for this is if you are using GraphQLDataProvider on the server side from another MJAPI, or \n * some other secure computing environment where the key can be kept secure.\n */\n get MJAPIKey(): string { return this.Data.MJAPIKey }\n set MJAPIKey(key: string) { this.Data.MJAPIKey = key }\n\n /**\n * URL is the URL to the GraphQL endpoint\n */\n get URL(): string { return this.Data.URL }\n /**\n * WSURL is the URL to the GraphQL websocket endpoint. This is used for subscriptions, if you are not using subscriptions, you can pass in a blank string for this\n */\n get WSURL(): string { return this.Data.WSURL }\n\n /**\n * RefreshTokenFunction is a function that can be called by the GraphQLDataProvider whenever it receives an exception that the JWT it has already is expired\n */\n get RefreshTokenFunction(): RefreshTokenFunction { return this.Data.RefreshFunction }\n\n\n /**\n *\n * @param token Token is the JWT token that is used to authenticate the user with the server\n * @param url the URL to the GraphQL endpoint\n * @param wsurl the URL to the GraphQL websocket endpoint. This is used for subscriptions, if you are not using subscriptions, you can pass in a blank string for this\n * @param refreshTokenFunction is a function that can be called by the GraphQLDataProvider whenever it receives an exception that the JWT it has already is expired\n * @param MJCoreSchemaName the name of the MJ Core schema, if it is not the default name of __mj\n * @param includeSchemas optional, an array of schema names to include in the metadata. If not passed, all schemas are included\n * @param excludeSchemas optional, an array of schema names to exclude from the metadata. If not passed, no schemas are excluded\n * @param mjAPIKey optional, a shared secret key that is static and provided by the publisher of the MJAPI server. \n */\n constructor(token: string,\n url: string,\n wsurl: string,\n refreshTokenFunction: RefreshTokenFunction,\n MJCoreSchemaName?: string,\n includeSchemas?: string[],\n excludeSchemas?: string[],\n mjAPIKey?: string) {\n super(\n {\n Token: token,\n URL: url,\n WSURL: wsurl,\n MJAPIKey: mjAPIKey,\n RefreshTokenFunction: refreshTokenFunction,\n },\n MJCoreSchemaName,\n includeSchemas,\n excludeSchemas\n );\n }\n}\n\n\n\n// The GraphQLDataProvider implements both the IEntityDataProvider and IMetadataProvider interfaces.\n/**\n * The GraphQLDataProvider class is a data provider for MemberJunction that implements the IEntityDataProvider, IMetadataProvider, IRunViewProvider, IRunReportProvider, IRunQueryProvider interfaces and connects to the\n * MJAPI server using GraphQL. This class is used to interact with the server to get and save data, as well as to get metadata about the entities and fields in the system.\n */\nexport class GraphQLDataProvider extends ProviderBase implements IEntityDataProvider, IMetadataProvider, IRunViewProvider, IRunReportProvider, IRunQueryProvider {\n private static _instance: GraphQLDataProvider;\n public static get Instance(): GraphQLDataProvider {\n return GraphQLDataProvider._instance;\n }\n\n constructor() {\n super();\n if (!GraphQLDataProvider._instance)\n GraphQLDataProvider._instance = this;\n }\n\n private _client: GraphQLClient;\n private _configData: GraphQLProviderConfigData;\n private _sessionId: string;\n private _aiClient: GraphQLAIClient;\n\n public get ConfigData(): GraphQLProviderConfigData {\n return this._configData;\n }\n\n /**\n * The core schema name constant. This should match the mjCoreSchema config value.\n * TODO: Move this to @memberjunction/core once npm registration issues are resolved\n * @see https://github.com/MemberJunction/MJ/issues/1452\n */\n protected static readonly MJ_CORE_SCHEMA = '__mj';\n\n /**\n * Sanitizes a string to be a valid GraphQL name component, preserving original capitalization.\n * GraphQL names must match the pattern [_A-Za-z][_0-9A-Za-z]* and cannot start with double underscore\n *\n * TODO: Move this to @memberjunction/core once npm registration issues are resolved\n * @see https://github.com/MemberJunction/MJ/issues/1452\n *\n * Copied from @memberjunction/codegen-lib GraphQLServerGeneratorBase.sanitizeGraphQLName()\n */\n protected sanitizeGraphQLName(input: string): string {\n if (!input || input.length === 0) {\n return '';\n }\n\n // Replace any non-alphanumeric characters (except underscore) with nothing to preserve capitalization\n let sanitized = input.replace(/[^A-Za-z0-9_]/g, '');\n\n // If the name starts with two underscores, remove them\n // (double underscore is reserved for GraphQL introspection)\n if (sanitized.startsWith('__')) {\n sanitized = sanitized.substring(2);\n }\n\n // Remove any remaining underscores\n sanitized = sanitized.replace(/_/g, '');\n\n // If the result starts with a digit or is empty, prepend an underscore\n if (sanitized.length === 0 || /^[0-9]/.test(sanitized)) {\n return '_' + sanitized;\n }\n\n return sanitized;\n }\n\n /**\n * Generates the base GraphQL type name for an entity using SchemaBaseTable pattern.\n * Preserves original capitalization. Special case: MJ core schema uses \"MJ\" prefix.\n * This ensures unique type names across different schemas.\n *\n * TODO: Move this to @memberjunction/core once npm registration issues are resolved\n * @see https://github.com/MemberJunction/MJ/issues/1452\n *\n * Copied from @memberjunction/codegen-lib GraphQLServerGeneratorBase.getServerGraphQLTypeNameBase()\n *\n * @param entity - The entity to generate the type name for\n * @returns The base GraphQL type name (without suffix like ViewByID, DynamicView, etc.)\n */\n protected getGraphQLTypeNameBase(entity: EntityInfo): string {\n // Special case for MJ core schema - use \"MJ\" instead of the schema name\n const schemaPrefix = entity.SchemaName.trim().toLowerCase() === GraphQLDataProvider.MJ_CORE_SCHEMA.trim().toLowerCase()\n ? 'MJ'\n : this.sanitizeGraphQLName(entity.SchemaName);\n\n const sanitizedBaseTable = this.sanitizeGraphQLName(entity.BaseTable);\n return `${schemaPrefix}${sanitizedBaseTable}`;\n }\n\n /**\n * Gets the AI client for executing AI operations through GraphQL.\n * The client is lazily initialized on first access.\n * @returns The GraphQLAIClient instance\n */\n public get AI(): GraphQLAIClient {\n if (!this._aiClient) {\n this._aiClient = new GraphQLAIClient(this);\n }\n return this._aiClient;\n }\n\n /**\n * This getter is not implemented for the GraphQLDataProvider class.\n */\n public get DatabaseConnection(): any {\n throw new Error(\"DatabaseConnection not implemented for the GraphQLDataProvider\");\n }\n\n /**\n * The connection string for each GraphQLProvider instance is simply the URL for the GraphQL endpoint. This is because each GraphQLDataProvider instance can be configured with a different URL and each URL\n * is a unique combination of host/port/etc.\n */\n public get InstanceConnectionString(): string {\n return this._configData.URL\n }\n\n public GenerateUUID() {\n return uuidv4();\n }\n\n /**\n * The GraphQLDataProvider uses a prefix for local storage that is equal to the URL of the GraphQL endpoint. This is because the GraphQLDataProvider can be configured multiple times with different URLs and each\n * configuration will have its own local storage. This is useful when you want to have multiple connections to different servers and you don't want the local storage to be shared between them. The URL is \n * normalized to remove special characters and replace anything other than alphanumeric characters with an underscore.\n */\n protected override get LocalStoragePrefix(): string {\n if (this._configData === undefined || this._configData.URL === undefined) {\n throw new Error(\"GraphQLDataProvider: ConfigData is not set. Please call Config() first.\");\n }\n\n const replacementString = this._configData.URL.replace(/[^a-zA-Z0-9]/g, '_');\n return replacementString + \".\"; // add a period at the end to separate the prefix from the key\n }\n\n /**\n * Retrieves the stored session ID from the LocalStorageProvider if available.\n * If no session ID is found, returns null.\n * The session ID is stored using the same storage mechanism as other persistent data\n * with a key specific to the current URL to ensure uniqueness across different \n * server connections.\n * \n * @returns The stored session ID or null if not found\n */\n public async GetStoredSessionID(): Promise<string> {\n try {\n const ls = this.LocalStorageProvider;\n if (ls) {\n const key = this.LocalStoragePrefix + \"sessionId\";\n const storedSession = await ls.GetItem(key);\n return storedSession;\n }\n return null;\n } catch (e) {\n // If any error occurs, return null\n console.error(\"Error retrieving session ID from local storage:\", e);\n return null;\n }\n }\n\n /**\n * Stores the session ID using the configured LocalStorageProvider for persistence.\n * Uses the same URL-specific key pattern as other storage methods to ensure\n * proper isolation between different server connections.\n * \n * @param sessionId The session ID to store\n */\n private async SaveStoredSessionID(sessionId: string): Promise<void> {\n try {\n const ls = this.LocalStorageProvider;\n if (ls) {\n const key = this.LocalStoragePrefix + \"sessionId\";\n await ls.SetItem(key, sessionId);\n }\n } catch (e) {\n // Silently fail if storage is not available\n }\n }\n\n public async GetPreferredUUID(forceRefreshSessionId?: boolean): Promise<string> {\n // Try to get the stored session ID\n const oldUUID = await this.GetStoredSessionID();\n const UUID = forceRefreshSessionId || !oldUUID ? this.GenerateUUID() : oldUUID;\n return UUID;\n }\n\n\n /**\n * This method configures the class instance. If separateConnection is false or not provided, the global/static variables are set that means that the Config() call\n * will affect all callers to the GraphQLDataProvider including via wrappers like the Metadata class. If separateConnection is true, then the instance variables are set\n * and only this instance of the GraphQLDataProvider will be affected by the Config() call.\n * @important If separateConnection is true, metadata for the provider will be loaded but will NOT affect the Metadata class/singleton. \n * This is because the Metadata class is a singleton that binds to the first Config() call in the process where separateConnection is falsy. \n * @param configData \n * @param separateConnection \n * @returns \n */\n public async Config(configData: GraphQLProviderConfigData, providerToUse?: IMetadataProvider, separateConnection?: boolean, forceRefreshSessionId?: boolean): Promise<boolean> {\n try {\n if (separateConnection) {\n this._configData = configData;\n // Get UUID after setting the configData, so that it can be used to get any stored session ID\n this._sessionId = await this.GetPreferredUUID(forceRefreshSessionId);;\n\n this._client = this.CreateNewGraphQLClient(configData.URL, configData.Token, this._sessionId, configData.MJAPIKey);\n // Store the session ID for this connection\n await this.SaveStoredSessionID(this._sessionId);\n }\n else {\n GraphQLDataProvider.Instance._configData = configData;\n\n if (GraphQLDataProvider.Instance._sessionId === undefined) {\n GraphQLDataProvider.Instance._sessionId = await this.GetPreferredUUID(forceRefreshSessionId);;\n }\n \n // now create the new client, if it isn't already created\n if (!GraphQLDataProvider.Instance._client)\n GraphQLDataProvider.Instance._client = this.CreateNewGraphQLClient(configData.URL, configData.Token, GraphQLDataProvider.Instance._sessionId, configData.MJAPIKey); \n \n // Store the session ID for the global instance\n await GraphQLDataProvider.Instance.SaveStoredSessionID(GraphQLDataProvider.Instance._sessionId);\n }\n return super.Config(configData); // now parent class can do it's config\n }\n catch (e) {\n LogError(e);\n throw (e)\n }\n }\n\n public get sessionId(): string {\n return this._sessionId;\n }\n\n protected get AllowRefresh(): boolean {\n return true; // this provider doesn't have any issues with allowing refreshes at any time\n }\n\n protected async GetCurrentUser(): Promise<UserInfo> {\n const d = await this.ExecuteGQL(this._currentUserQuery, null);\n if (d) {\n // convert the user and the user roles _mj__*** fields back to __mj_***\n const u = this.ConvertBackToMJFields(d.CurrentUser);\n const roles = u.UserRoles_UserIDArray.map(r => this.ConvertBackToMJFields(r));\n u.UserRoles_UserIDArray = roles;\n return new UserInfo(this, {...u, UserRoles: roles}) // need to pass in the UserRoles as a separate property that is what is expected here\n }\n }\n\n\n /**************************************************************************/\n // START ---- IRunReportProvider\n /**************************************************************************/\n public async RunReport(params: RunReportParams, contextUser?: UserInfo): Promise<RunReportResult> {\n const query = gql`\n query GetReportDataQuery ($ReportID: String!) {\n GetReportData(ReportID: $ReportID) {\n Success\n Results\n RowCount\n ExecutionTime\n ErrorMessage\n }\n }`\n\n const result = await this.ExecuteGQL(query, {ReportID: params.ReportID} );\n if (result && result.GetReportData)\n return {\n ReportID: params.ReportID,\n Success: result.GetReportData.Success,\n Results: JSON.parse(result.GetReportData.Results),\n RowCount: result.GetReportData.RowCount,\n ExecutionTime: result.GetReportData.ExecutionTime,\n ErrorMessage: result.GetReportData.ErrorMessage,\n };\n }\n /**************************************************************************/\n // END ---- IRunReportProvider\n /**************************************************************************/\n\n /**************************************************************************/\n // START ---- IRunQueryProvider\n /**************************************************************************/\n public async RunQuery(params: RunQueryParams, contextUser?: UserInfo): Promise<RunQueryResult> {\n if (params.QueryID) {\n return this.RunQueryByID(params.QueryID, params.CategoryID, params.CategoryPath, contextUser, params.Parameters, params.MaxRows, params.StartRow);\n }\n else if (params.QueryName) {\n return this.RunQueryByName(params.QueryName, params.CategoryID, params.CategoryPath, contextUser, params.Parameters, params.MaxRows, params.StartRow);\n }\n else {\n throw new Error(\"No QueryID or QueryName provided to RunQuery\");\n }\n }\n\n public async RunQueryByID(QueryID: string, CategoryID?: string, CategoryPath?: string, contextUser?: UserInfo, Parameters?: Record<string, any>, MaxRows?: number, StartRow?: number): Promise<RunQueryResult> {\n const query = gql`\n query GetQueryDataQuery($QueryID: String!, $CategoryID: String, $CategoryPath: String, $Parameters: JSONObject, $MaxRows: Int, $StartRow: Int) {\n GetQueryData(QueryID: $QueryID, CategoryID: $CategoryID, CategoryPath: $CategoryPath, Parameters: $Parameters, MaxRows: $MaxRows, StartRow: $StartRow) {\n ${this.QueryReturnFieldList}\n }\n }\n `;\n \n // Build the variables object, adding optional parameters if defined.\n const variables: { QueryID: string; CategoryID?: string; CategoryPath?: string; Parameters?: Record<string, any>; MaxRows?: number; StartRow?: number } = { QueryID };\n if (CategoryID !== undefined) {\n variables.CategoryID = CategoryID;\n }\n if (CategoryPath !== undefined) {\n variables.CategoryPath = CategoryPath;\n }\n if (Parameters !== undefined) {\n variables.Parameters = Parameters;\n }\n if (MaxRows !== undefined) {\n variables.MaxRows = MaxRows;\n }\n if (StartRow !== undefined) {\n variables.StartRow = StartRow;\n }\n \n const result = await this.ExecuteGQL(query, variables);\n if (result && result.GetQueryData) {\n return this.TransformQueryPayload(result.GetQueryData);\n }\n }\n \n public async RunQueryByName(QueryName: string, CategoryID?: string, CategoryPath?: string, contextUser?: UserInfo, Parameters?: Record<string, any>, MaxRows?: number, StartRow?: number): Promise<RunQueryResult> {\n const query = gql`\n query GetQueryDataByNameQuery($QueryName: String!, $CategoryID: String, $CategoryPath: String, $Parameters: JSONObject, $MaxRows: Int, $StartRow: Int) {\n GetQueryDataByName(QueryName: $QueryName, CategoryID: $CategoryID, CategoryPath: $CategoryPath, Parameters: $Parameters, MaxRows: $MaxRows, StartRow: $StartRow) {\n ${this.QueryReturnFieldList}\n }\n }\n `;\n \n // Build the variables object, adding optional parameters if defined.\n const variables: { QueryName: string; CategoryID?: string; CategoryPath?: string; Parameters?: Record<string, any>; MaxRows?: number; StartRow?: number } = { QueryName };\n if (CategoryID !== undefined) {\n variables.CategoryID = CategoryID;\n }\n if (CategoryPath !== undefined) {\n variables.CategoryPath = CategoryPath;\n }\n if (Parameters !== undefined) {\n variables.Parameters = Parameters;\n }\n if (MaxRows !== undefined) {\n variables.MaxRows = MaxRows;\n }\n if (StartRow !== undefined) {\n variables.StartRow = StartRow;\n }\n \n const result = await this.ExecuteGQL(query, variables);\n if (result && result.GetQueryDataByName) {\n return this.TransformQueryPayload(result.GetQueryDataByName);\n }\n }\n\n protected get QueryReturnFieldList(): string {\n return `\n Success\n QueryID\n QueryName\n Results\n RowCount\n TotalRowCount\n ExecutionTime\n ErrorMessage\n AppliedParameters`\n }\n protected TransformQueryPayload(data: any): RunQueryResult {\n try {\n return {\n QueryID: data.QueryID,\n QueryName: data.QueryName,\n Success: data.Success,\n Results: JSON.parse(data.Results),\n RowCount: data.RowCount,\n TotalRowCount: data.TotalRowCount,\n ExecutionTime: data.ExecutionTime,\n ErrorMessage: data.ErrorMessage,\n AppliedParameters: data.AppliedParameters ? JSON.parse(data.AppliedParameters) : undefined\n }; \n }\n catch (e) {\n LogError(`Error transforming query payload: ${e}`);\n return null;\n }\n }\n\n /**************************************************************************/\n // END ---- IRunReportProvider\n /**************************************************************************/\n\n\n\n /**************************************************************************/\n // START ---- IRunViewProvider\n /**************************************************************************/\n public async RunView<T = any>(params: RunViewParams, contextUser?: UserInfo): Promise<RunViewResult<T>> {\n // pre-process via the base-class \n await this.PreProcessRunView(params, contextUser);\n\n try {\n let qName: string = ''\n let paramType: string = ''\n if (params) {\n const innerParams: any = {}\n let entity: string, viewEntity: any;\n if (params.ViewEntity) {\n viewEntity = params.ViewEntity\n entity = viewEntity.Entity\n }\n else {\n const {entityName, v} = await this.getEntityNameAndUserView(params, contextUser)\n viewEntity = v;\n entity = entityName;\n }\n\n // get entity metadata\n const e = this.Entities.find(e => e.Name === entity);\n if (!e)\n throw new Error(`Entity ${entity} not found in metadata`);\n\n let dynamicView = false;\n const graphQLTypeName = this.getGraphQLTypeNameBase(e);\n\n if (params.ViewID) {\n qName = `Run${graphQLTypeName}ViewByID`;\n paramType = 'RunViewByIDInput';\n innerParams.ViewID = params.ViewID;\n }\n else if (params.ViewName) {\n qName = `Run${graphQLTypeName}ViewByName`;\n paramType = 'RunViewByNameInput';\n innerParams.ViewName = params.ViewName;\n }\n else {\n dynamicView = true;\n qName = `Run${graphQLTypeName}DynamicView`;\n paramType = 'RunDynamicViewInput';\n innerParams.EntityName = params.EntityName;\n }\n innerParams.ExtraFilter = params.ExtraFilter ? params.ExtraFilter : '';\n innerParams.OrderBy = params.OrderBy ? params.OrderBy : '';\n innerParams.UserSearchString = params.UserSearchString ? params.UserSearchString : '';\n innerParams.Fields = params.Fields; // pass it straight through, either null or array of strings\n innerParams.IgnoreMaxRows = params.IgnoreMaxRows ? params.IgnoreMaxRows : false;\n if (params.MaxRows !== undefined)\n innerParams.MaxRows = params.MaxRows;\n if (params.StartRow !== undefined)\n innerParams.StartRow = params.StartRow; // Add StartRow parameter\n innerParams.ForceAuditLog = params.ForceAuditLog ? params.ForceAuditLog : false;\n innerParams.ResultType = params.ResultType ? params.ResultType : 'simple';\n if (params.AuditLogDescription && params.AuditLogDescription.length > 0)\n innerParams.AuditLogDescription = params.AuditLogDescription;\n\n if (!dynamicView) {\n innerParams.ExcludeUserViewRunID = params.ExcludeUserViewRunID ? params.ExcludeUserViewRunID : \"\";\n innerParams.ExcludeDataFromAllPriorViewRuns = params.ExcludeDataFromAllPriorViewRuns ? params.ExcludeDataFromAllPriorViewRuns : false;\n innerParams.OverrideExcludeFilter = params.OverrideExcludeFilter ? params.OverrideExcludeFilter : '';\n innerParams.SaveViewResults = params.SaveViewResults ? params.SaveViewResults : false;\n }\n\n const fieldList = this.getViewRunTimeFieldList(e, viewEntity, params, dynamicView);\n const query = gql`\n query RunViewQuery ($input: ${paramType}!) {\n ${qName}(input: $input) {\n Results {\n ${fieldList.join(\"\\n \")}\n }\n UserViewRunID\n RowCount\n TotalRowCount\n ExecutionTime\n Success\n ErrorMessage\n }\n }`\n\n const viewData = await this.ExecuteGQL(query, {input: innerParams} );\n if (viewData && viewData[qName]) {\n // now, if we have any results in viewData that are for the CodeName, we need to convert them to the Name\n // so that the caller gets back what they expect\n const results = viewData[qName].Results;\n if (results && results.length > 0) {\n const codeNameDiffFields = e.Fields.filter(f => f.CodeName !== f.Name && f.CodeName !== undefined);\n results.forEach(r => {\n // for _mj__ results, we need to convert them back to the Name\n this.ConvertBackToMJFields(r);\n codeNameDiffFields.forEach(f => {\n r[f.Name] = r[f.CodeName];\n // delete r[f.CodeName]; // Leave the CodeName in the results, it is useful to have both\n })\n })\n }\n const result = viewData[qName];\n\n // post-process via the base class\n await this.PostProcessRunView(result, params, contextUser);\n\n return result;\n }\n }\n else\n throw (\"No parameters passed to RunView\");\n\n return null;\n }\n catch (e) {\n LogError(e);\n throw (e)\n }\n }\n\n public async RunViews<T = any>(params: RunViewParams[], contextUser?: UserInfo): Promise<RunViewResult<T>[]> {\n // pre-process via the base class\n await this.PreProcessRunViews(params, contextUser);\n\n try {\n let innerParams: any[] = [];\n let entityInfos: EntityInfo[] = [];\n let fieldList: string[] = [];\n\n for(const param of params){\n let qName: string = ''\n let paramType: string = ''\n const innerParam: any = {}\n let entity: string | null = null;\n let viewEntity: UserViewEntityExtended | null = null;\n if (param.ViewEntity) {\n viewEntity = param.ViewEntity as UserViewEntityExtended;\n entity = viewEntity.Get(\"Entity\");\n }\n else {\n const {entityName, v} = await this.getEntityNameAndUserView(param, contextUser)\n viewEntity = v;\n entity = entityName;\n }\n\n // get entity metadata\n const e = this.Entities.find(e => e.Name === entity);\n if (!e){\n throw new Error(`Entity ${entity} not found in metadata`);\n }\n\n entityInfos.push(e);\n let dynamicView: boolean = false;\n const graphQLTypeName = this.getGraphQLTypeNameBase(e);\n\n if (param.ViewID) {\n qName = `Run${graphQLTypeName}ViewByID`;\n paramType = 'RunViewByIDInput';\n innerParam.ViewID = param.ViewID;\n }\n else if (param.ViewName) {\n qName = `Run${graphQLTypeName}ViewByName`;\n paramType = 'RunViewByNameInput';\n innerParam.ViewName = param.ViewName;\n }\n else {\n dynamicView = true;\n qName = `Run${graphQLTypeName}DynamicView`;\n paramType = 'RunDynamicViewInput';\n innerParam.EntityName = param.EntityName;\n }\n\n innerParam.ExtraFilter = param.ExtraFilter || '';\n innerParam.OrderBy = param.OrderBy || '';\n innerParam.UserSearchString = param.UserSearchString || '';\n // pass it straight through, either null or array of strings\n innerParam.Fields = param.Fields;\n innerParam.IgnoreMaxRows = param.IgnoreMaxRows || false;\n if (param.MaxRows !== undefined)\n innerParam.MaxRows = param.MaxRows;\n if (param.StartRow !== undefined)\n innerParam.StartRow = param.StartRow; // Add StartRow parameter\n innerParam.ForceAuditLog = param.ForceAuditLog || false;\n innerParam.ResultType = param.ResultType || 'simple';\n if (param.AuditLogDescription && param.AuditLogDescription.length > 0){\n innerParam.AuditLogDescription = param.AuditLogDescription;\n }\n\n if (!dynamicView) {\n innerParam.ExcludeUserViewRunID = param.ExcludeUserViewRunID || \"\";\n innerParam.ExcludeDataFromAllPriorViewRuns = param.ExcludeDataFromAllPriorViewRuns || false;\n innerParam.OverrideExcludeFilter = param.OverrideExcludeFilter || '';\n innerParam.SaveViewResults = param.SaveViewResults || false;\n }\n\n innerParams.push(innerParam);\n fieldList.push(...this.getViewRunTimeFieldList(e, viewEntity, param, dynamicView));\n }\n\n const query = gql`\n query RunViewsQuery ($input: [RunViewGenericInput!]!) {\n RunViews(input: $input) {\n Results {\n PrimaryKey {\n FieldName\n Value\n }\n EntityID\n Data\n }\n UserViewRunID\n RowCount\n TotalRowCount\n ExecutionTime\n Success\n ErrorMessage\n }\n }`;\n\n const viewData: unknown = await this.ExecuteGQL(query, {input: innerParams} );\n if (viewData && viewData[\"RunViews\"]) {\n // now, if we have any results in viewData that are for the CodeName, we need to convert them to the Name\n // so that the caller gets back what they expect\n const results: RunViewResult[] = viewData[\"RunViews\"];\n for(const [index, result] of results.entries()){\n //const codeNameDiffFields = entityInfos[index].Fields.filter(f => f.CodeName !== f.Name && f.CodeName !== undefined);\n result.Results = result.Results.map((data: unknown) => {\n let deserializeData: Record<string, unknown> = JSON.parse(data[\"Data\"]);\n // for _mj__ results, we need to convert them back to the Name\n this.ConvertBackToMJFields(deserializeData);\n /*\n codeNameDiffFields.forEach(f => {\n deserializeData[f.Name] = deserializeData[f.CodeName];\n // delete r[f.CodeName]; // Leave the CodeName in the results, it is useful to have both\n });\n */\n return deserializeData;\n });\n }\n\n // post-process via the base class\n await this.PostProcessRunViews(results, params, contextUser);\n \n return results;\n }\n\n return null;\n\n }\n catch (e) {\n LogError(e);\n throw (e);\n }\n }\n\n protected async getEntityNameAndUserView(params: RunViewParams, contextUser?: UserInfo): Promise<{entityName: string, v: UserViewEntityExtended}> {\n let entityName: string;\n let v: UserViewEntityExtended;\n\n if (!params.EntityName) {\n if (params.ViewID) {\n v = await ViewInfo.GetViewEntity(params.ViewID, contextUser)\n entityName = v.Entity\n }\n else if (params.ViewName) {\n v = await ViewInfo.GetViewEntityByName(params.ViewName, contextUser);\n entityName = v.Entity\n }\n else\n throw new Error(`No EntityName, ViewID or ViewName passed to RunView`)\n }\n else\n entityName = params.EntityName\n\n return {entityName, v}\n }\n\n protected getViewRunTimeFieldList(e: EntityInfo, v: UserViewEntityExtended, params: RunViewParams, dynamicView: boolean): string[] {\n const fieldList = [];\n const mapper = new FieldMapper();\n if (params.Fields) {\n for (const kv of e.PrimaryKeys) {\n if (params.Fields.find(f => f.trim().toLowerCase() === kv.Name.toLowerCase()) === undefined)\n fieldList.push(kv.Name); // always include the primary key fields in view run time field list\n }\n\n // now add any other fields that were passed in\n params.Fields.forEach(f => {\n fieldList.push(mapper.MapFieldName(f))\n });\n }\n else {\n // no fields were passed in. So, let's check to see if we are running an dynamic view.\n // If so, we need to include all fields since the caller didn't specify the fields they want\n // otherwise, we include the fields that are part of the view definition.\n if (dynamicView) {\n // include all fields since no fields were passed in\n e.Fields.forEach(f => {\n if (!f.IsBinaryFieldType) {\n fieldList.push(mapper.MapFieldName(f.CodeName));\n }\n });\n }\n else {\n // NOTE: in the below, c.EntityField SHOULD always exist, however there is a possibility that at some point a VIEW was created that used fields\n // and those fields are NO LONGER part of an entity, in that situation we should just remove them, rather than letting the whole view blow up which\n // would happen if we dno't check for c.EntityField? in the below\n\n // first make sure we have the primary key field in the view column list, always should, but make sure\n for (const kv of e.PrimaryKeys) {\n if (fieldList.find(f => f.trim().toLowerCase() === kv.Name.toLowerCase()) === undefined)\n fieldList.push(kv.Name); // always include the primary key fields in view run time field list\n }\n\n // Now: include the fields that are part of the view definition\n v.Columns.forEach(c => {\n if (c.hidden === false && !fieldList.find(item => item.trim().toLowerCase() === c.EntityField?.Name.trim().toLowerCase())) { // don't include hidden fields and don't include the pkey field again\n if (!c.EntityField) {\n // this can happen if a field was previously included in a view, but is no longer part of the entity\n // simply don't include it in the field list\n }\n else\n fieldList.push(mapper.MapFieldName(c.EntityField.CodeName));\n }\n });\n }\n }\n return fieldList;\n }\n /**************************************************************************/\n // END ---- IRunViewProvider\n /**************************************************************************/\n\n\n /**************************************************************************/\n // START ---- IEntityDataProvider\n /**************************************************************************/\n public get ProviderType(): ProviderType {\n return ProviderType.Network;\n }\n\n public async GetRecordChanges(entityName: string, primaryKey: CompositeKey): Promise<RecordChange[]> {\n try {\n const p: RunViewParams = {\n EntityName: 'Record Changes',\n ExtraFilter: `RecordID = '${primaryKey.Values()}' AND Entity = '${entityName}'`,\n //OrderBy: 'ChangedAt DESC',\n }\n const result = await this.RunView(p);\n if (result) {\n // sort the results client side because, for now, the RunViewParams doesn't support OrderBy dynamically like we tried. Later change this to do via the SQL query\n return result.Results.sort((a: RecordChange, b: RecordChange) => {\n return (a.ChangedAt > b.ChangedAt) ? -1 : 1 // sort descending on the date.... GraphQL passes back the date as time since base date\n });\n }\n else\n return null;\n }\n catch (e) {\n LogError(e);\n throw (e)\n }\n }\n\n\n /**\n * Returns a list of dependencies - records that are linked to the specified Entity/KeyValuePairs combination. A dependency is as defined by the relationships in the database. The MemberJunction metadata that is used\n * for this simply reflects the foreign key relationships that exist in the database. The CodeGen tool is what detects all of the relationships and generates the metadata that is used by MemberJunction. The metadata in question\n * is within the EntityField table and specifically the RelatedEntity and RelatedEntityField columns. In turn, this method uses that metadata and queries the database to determine the dependencies. To get the list of entity dependencies\n * you can use the utility method GetEntityDependencies(), which doesn't check for dependencies on a specific record, but rather gets the metadata in one shot that can be used for dependency checking.\n * @param entityName the name of the entity to check\n * @param KeyValuePairs the KeyValuePairs of the record to check\n */\n public async GetRecordDependencies(entityName: string, primaryKey: CompositeKey): Promise<RecordDependency[]> {\n try {\n // execute the gql query to get the dependencies\n const query = gql`query GetRecordDependenciesQuery ($entityName: String!, $CompositeKey: CompositeKeyInputType!) {\n GetRecordDependencies(entityName: $entityName, CompositeKey: $CompositeKey) {\n EntityName\n RelatedEntityName\n FieldName\n CompositeKey {\n KeyValuePairs {\n FieldName\n Value\n }\n }\n }\n }`\n\n // now we have our query built, execute it\n const vars = {\n entityName: entityName,\n CompositeKey: {KeyValuePairs: this.ensureKeyValuePairValueIsString(primaryKey.KeyValuePairs)}\n };\n const data = await this.ExecuteGQL(query, vars);\n\n return data?.GetRecordDependencies; // shape of the result should exactly match the RecordDependency type\n }\n catch (e) {\n LogError(e);\n throw (e)\n }\n }\n\n protected ensureKeyValuePairValueIsString(kvps: KeyValuePair[]): {FieldName: string, Value: string}[] {\n return kvps.map(kv => {\n return {FieldName: kv.FieldName, Value: kv.Value.toString()}\n })\n }\n\n public async GetRecordDuplicates(params: PotentialDuplicateRequest, contextUser?: UserInfo): Promise<PotentialDuplicateResponse>\n {\n if(!params){\n return null;\n }\n\n const query: string = gql`query GetRecordDuplicatesQuery ($params: PotentialDuplicateRequestType!) {\n GetRecordDuplicates(params: $params) {\n Status\n ErrorMessage\n PotentialDuplicateResult {\n EntityID\n DuplicateRunDetailMatchRecordIDs\n RecordPrimaryKeys {\n KeyValuePairs {\n FieldName\n Value\n }\n }\n Duplicates {\n ProbabilityScore\n KeyValuePairs {\n FieldName\n Value\n }\n }\n }\n }\n }`\n\n let request = {\n EntityID: params.EntityID,\n EntityDocumentID: params.EntityDocumentID,\n ListID: params.ListID,\n ProbabilityScore: params.ProbabilityScore,\n Options: params.Options,\n RecordIDs: params.RecordIDs.map(recordID => {\n return recordID.Copy();\n })\n }\n const data = await this.ExecuteGQL(query, {params: request});\n\n if(data && data.GetRecordDuplicates){\n return data.GetRecordDuplicates;\n }\n }\n\n public async MergeRecords(request: RecordMergeRequest, contextUser?: UserInfo, options?: EntityMergeOptions): Promise<RecordMergeResult> {\n const e = this.Entities.find(e=>e.Name.trim().toLowerCase() === request.EntityName.trim().toLowerCase());\n if (!e || !e.AllowRecordMerge)\n throw new Error(`Entity ${request.EntityName} does not allow record merging, check the AllowRecordMerge property in the entity metadata`);\n\n try {\n // execute the gql query to get the dependencies\n const mutation = gql`mutation MergeRecordsMutation ($request: RecordMergeRequest!) {\n MergeRecords(request: $request) {\n Success\n OverallStatus\n RecordMergeLogID\n RecordStatus {\n CompositeKey {\n KeyValuePairs {\n FieldName\n Value\n }\n }\n Success\n RecordMergeDeletionLogID\n Message\n }\n }\n }`\n\n // create a new request that is compatible with the server's expectations where field maps and also the primary key values are all strings\n const newRequest = {\n EntityName: request.EntityName,\n SurvivingRecordCompositeKey: {KeyValuePairs: this.ensureKeyValuePairValueIsString(request.SurvivingRecordCompositeKey.KeyValuePairs)},\n FieldMap: request.FieldMap?.map(fm => {\n return {\n FieldName: fm.FieldName,\n Value: fm.Value.toString() // turn the value into a string, since that is what the server expects\n }\n }),\n RecordsToMerge: request.RecordsToMerge.map(r => {\n return r.Copy();\n })\n }\n\n // now we have our query built, execute it\n const data = await this.ExecuteGQL(mutation, {request: newRequest});\n\n return data?.MergeRecords; // shape of the result should exactly match the RecordDependency type\n }\n catch (e) {\n LogError(e);\n return {\n Success: false,\n OverallStatus: e && e.message ? e.message : e,\n RecordStatus: [],\n RecordMergeLogID: \"\",\n Request: request,\n }\n throw (e)\n }\n }\n\n public async Save(entity: BaseEntity, user: UserInfo, options: EntitySaveOptions) : Promise<{}> {\n const result = new BaseEntityResult();\n try {\n entity.RegisterTransactionPreprocessing(); // as of the time of writing, this isn't technically needed because we are not doing any async preprocessing, but it is good to have it here for future use in case something is added with async between here and the TransactionItem being added.\n\n const vars = { input: {} };\n const type: string = entity.IsSaved ? \"Update\" : \"Create\";\n\n result.StartedAt = new Date();\n result.Type = entity.IsSaved ? 'update' : 'create';\n result.OriginalValues = entity.Fields.map(f => { return {FieldName: f.CodeName, Value: f.Value} });\n entity.ResultHistory.push(result); // push the new result as we have started a process\n\n // Create the query for the mutation first, we will provide the specific\n // input values later in the loop below. Here we are just setting up the mutation\n // and the fields that will be returned since the mutation returns back the latest\n // values for the entity and we need to have those values to update the entity after the\n // save\n\n const graphQLTypeName = this.getGraphQLTypeNameBase(entity.EntityInfo);\n const mutationName = `${type}${graphQLTypeName}`\n\n // only pass along writable fields, AND the PKEY value if this is an update\n const filteredFields = entity.Fields.filter(f => !f.ReadOnly || (f.IsPrimaryKey && entity.IsSaved));\n const mapper = new FieldMapper();\n const inner = ` ${mutationName}(input: $input) {\n ${entity.Fields.map(f => mapper.MapFieldName(f.CodeName)).join(\"\\n \")}\n }`\n const outer = gql`mutation ${type}${graphQLTypeName} ($input: ${mutationName}Input!) {\n ${inner}\n }\n `\n for (let i = 0; i < filteredFields.length; i++) {\n const f = filteredFields[i];\n let val = f.Value;\n if (val) {\n // type conversions as needed for GraphQL\n switch(f.EntityFieldInfo.TSType) {\n case EntityFieldTSType.Date:\n val = val.getTime();\n break;\n case EntityFieldTSType.Boolean:\n if (typeof val !== 'boolean') {\n val = parseInt(val) === 0 ? false : true; // convert to boolean\n }\n break;\n case EntityFieldTSType.Number:\n if (typeof val !== 'number') {\n const numValue = Number(val);\n if (!isNaN(numValue)) {\n val = numValue;\n } \n }\n break;\n }\n }\n\n if (val === null && f.EntityFieldInfo.AllowsNull === false) {\n // no value, field doesn't allow nulls, so set to default value, if available and then fall back to either 0 or empty string depending on type\n if (f.EntityFieldInfo.DefaultValue !== null) {\n // no value, but there is a default value, so use that, since field does NOT allow NULL\n val = f.EntityFieldInfo.DefaultValue;\n }\n else {\n // no default value, null value and field doesn't allow nulls, so set to either 0 or empty string\n if (f.FieldType === EntityFieldTSType.Number || f.FieldType === EntityFieldTSType.Boolean)\n val = 0;\n else\n val = '';\n }\n }\n vars.input[f.CodeName] = val;\n }\n\n // now add an OldValues prop to the vars IF the type === 'update' and the options.SkipOldValuesCheck === false\n if (type.trim().toLowerCase() === 'update' &&\n options.SkipOldValuesCheck === false) {\n const ov = [];\n entity.Fields.forEach(f => {\n let val = null;\n if (f.OldValue !== null && f.OldValue !== undefined) {\n if (f.EntityFieldInfo.TSType === EntityFieldTSType.Date) \n val = f.OldValue.getTime().toString();\n else if (f.EntityFieldInfo.TSType === EntityFieldTSType.Boolean)\n val = f.OldValue === true ? \"1\" : \"0\";\n else if (typeof f.OldValue !== \"string\")\n val = f.OldValue.toString();\n else\n val = f.OldValue;\n }\n ov.push({Key: f.CodeName, Value: val }); // pass ALL old values to server, slightly inefficient but we want full record\n });\n vars.input['OldValues___'] = ov; // add the OldValues prop to the input property that is part of the vars already\n }\n\n if (entity.TransactionGroup) {\n const mutationInputTypes = [\n {\n varName: 'input',\n inputType: mutationName + 'Input!'\n }\n ];\n\n entity.RaiseReadyForTransaction(); // let the entity know we're ready to be part of the transaction\n\n // we are part of a transaction group, so just add our query to the list\n // and when the transaction is committed, we will send all the queries at once\n entity.TransactionGroup.AddTransaction(new TransactionItem( entity, \n result.Type === 'create' ? 'Create' : 'Update', \n inner, vars, \n {\n mutationName,\n mutationInputTypes: mutationInputTypes\n },\n (results: any, success: boolean) => {\n // we get here whenever the transaction group does gets around to committing\n // our query. We need to update our entity with the values that were returned\n // from the mutation if it was successful.\n result.EndedAt = new Date();\n if (success && results) {\n // got our data, send it back to the caller, which is the entity object\n // and that object needs to update itself from this data.\n result.Success = true;\n result.NewValues = this.ConvertBackToMJFields(results);\n }\n else {\n // the transaction failed, nothing to update, but we need to call Reject so the\n // promise resolves with a rejection so our outer caller knows\n result.Success = false;\n result.Message = 'Transaction failed';\n }\n }));\n\n return true; // part of a TG always return true after we setup the transaction group item above\n }\n else {\n // not part of a transaction group, so just go for it and send across our GQL\n const d = await this.ExecuteGQL(outer, vars)\n if (d && d[mutationName]) {\n result.Success = true;\n result.EndedAt = new Date();\n result.NewValues = this.ConvertBackToMJFields(d[mutationName]);\n return result.NewValues;\n }\n else\n throw new Error(`Save failed for ${entity.EntityInfo.ClassName}`);\n }\n }\n catch (e) {\n result.Success = false;\n result.EndedAt = new Date();\n result.Message = e.response?.errors?.length > 0 ? e.response.errors[0].message : e.message;\n LogError(e);\n return null;\n }\n }\n public async Load(entity: BaseEntity, primaryKey: CompositeKey, EntityRelationshipsToLoad: string[] = null, user: UserInfo) : Promise<{}> {\n try {\n const vars = {};\n let pkeyInnerParamString: string = '';\n let pkeyOuterParamString: string = '';\n\n for (let i = 0; i < primaryKey.KeyValuePairs.length; i++) {\n const field: EntityFieldInfo = entity.Fields.find(f => f.Name.trim().toLowerCase() === primaryKey.KeyValuePairs[i].FieldName.trim().toLowerCase()).EntityFieldInfo;\n const val = primaryKey.GetValueByIndex(i);\n const pkeyGraphQLType: string = field.GraphQLType;\n\n // build up the param string for the outer query definition\n if (pkeyOuterParamString.length > 0)\n pkeyOuterParamString += ', ';\n pkeyOuterParamString += `$${field.CodeName}: ${pkeyGraphQLType}!`;\n\n // build up the param string for the inner query call\n if (pkeyInnerParamString.length > 0)\n pkeyInnerParamString += ', ';\n pkeyInnerParamString += `${field.CodeName}: $${field.CodeName}`;\n\n // build up the variables we are passing along to the query\n if (field.TSType === EntityFieldTSType.Number) {\n if (isNaN(primaryKey.GetValueByIndex(i)))\n throw new Error(`Primary Key value ${val} (${field.Name}) is not a valid number`);\n vars[field.CodeName] = parseInt(val); // converting to number here for graphql type to work properly\n }\n else\n vars[field.CodeName] = val;\n }\n\n const rel = EntityRelationshipsToLoad && EntityRelationshipsToLoad.length > 0 ? this.getRelatedEntityString(entity.EntityInfo, EntityRelationshipsToLoad) : '';\n\n const graphQLTypeName = this.getGraphQLTypeNameBase(entity.EntityInfo);\n const mapper = new FieldMapper();\n const query = gql`query Single${graphQLTypeName}${rel.length > 0 ? 'Full' : ''} (${pkeyOuterParamString}) {\n ${graphQLTypeName}(${pkeyInnerParamString}) {\n ${entity.Fields.filter((f) => !f.EntityFieldInfo.IsBinaryFieldType)\n .map((f) => {\n if (f.EntityFieldInfo.Name.trim().toLowerCase().startsWith('__mj_')) {\n // fields that start with __mj_ need to be converted to _mj__ for the GraphQL query\n return f.CodeName.replace('__mj_', '_mj__');\n } else {\n return f.CodeName;\n }\n })\n .join('\\n ')}\n ${rel}\n }\n }\n `;\n\n const d = await this.ExecuteGQL(query, vars)\n if (d && d[graphQLTypeName]) {\n // the resulting object has all the values in it, but we need to convert any elements that start with _mj__ back to __mj_\n return this.ConvertBackToMJFields(d[graphQLTypeName]);\n }\n else\n return null;\n }\n catch (e) {\n LogError(e);\n return null;\n }\n }\n\n /**\n * This method will convert back any fields that start with _mj__ back to __mj_ so that the entity object can properly update itself with the data that was returned from the server\n * @param ret\n * @returns\n */\n protected ConvertBackToMJFields(ret: any): any {\n const mapper = new FieldMapper();\n mapper.ReverseMapFields(ret);\n return ret; // clean object to pass back here\n }\n\n protected getRelatedEntityString(entityInfo: EntityInfo, EntityRelationshipsToLoad: string[]): string {\n let rel = '';\n for (let i = 0; i < entityInfo.RelatedEntities.length; i++) {\n if (EntityRelationshipsToLoad.indexOf(entityInfo.RelatedEntities[i].RelatedEntity) >= 0) {\n const r = entityInfo.RelatedEntities[i];\n const re = this.Entities.find(e => e.ID === r.RelatedEntityID);\n let uniqueCodeName: string = '';\n if (r.Type.toLowerCase().trim() === 'many to many') {\n uniqueCodeName = `${r.RelatedEntityCodeName}_${r.JoinEntityJoinField.replace(/\\s/g, '')}`;\n }\n else {\n uniqueCodeName = `${r.RelatedEntityCodeName}_${r.RelatedEntityJoinField.replace(/\\s/g, '')}`;\n }\n rel += `\n ${uniqueCodeName} {\n ${re.Fields.map(f => f.CodeName).join(\"\\n \")}\n }\n `;\n }\n }\n return rel;\n }\n\n public async Delete(entity: BaseEntity, options: EntityDeleteOptions, user: UserInfo) : Promise<boolean> {\n const result = new BaseEntityResult();\n try {\n entity.RegisterTransactionPreprocessing();\n\n result.StartedAt = new Date();\n result.Type = 'delete';\n result.OriginalValues = entity.Fields.map(f => { return {FieldName: f.CodeName, Value: f.Value} });\n entity.ResultHistory.push(result); // push the new result as we have started a process\n\n const vars = {};\n const mutationInputTypes = [];\n let pkeyInnerParamString: string = '';\n let pkeyOuterParamString: string = '';\n let returnValues: string = '';\n for (let kv of entity.PrimaryKey.KeyValuePairs) {\n const pk = entity.Fields.find(f => f.Name.trim().toLowerCase() === kv.FieldName.trim().toLowerCase()); // get the field for the primary key field\n vars[pk.CodeName] = pk.Value;\n mutationInputTypes.push({varName: pk.CodeName, inputType: pk.EntityFieldInfo.GraphQLType + '!'}); // only used when doing a transaction group, but it is easier to do in this main loop\n if (pkeyInnerParamString.length > 0)\n pkeyInnerParamString += ', ';\n pkeyInnerParamString += `${pk.CodeName}: $${pk.CodeName}`;\n\n if (pkeyOuterParamString.length > 0)\n pkeyOuterParamString += ', ';\n pkeyOuterParamString += `$${pk.CodeName}: ${pk.EntityFieldInfo.GraphQLType}!`;\n\n if (returnValues.length > 0)\n returnValues += '\\n ';\n returnValues += `${pk.CodeName}`;\n }\n\n mutationInputTypes.push({varName: \"options___\", inputType: 'DeleteOptionsInput!'}); // only used when doing a transaction group, but it is easier to do in this main loop\n vars[\"options___\"] = options ? options : {SkipEntityAIActions: false, SkipEntityActions: false};\n\n const graphQLTypeName = this.getGraphQLTypeNameBase(entity.EntityInfo);\n const queryName: string = 'Delete' + graphQLTypeName;\n const inner = gql`${queryName}(${pkeyInnerParamString}, options___: $options___) {\n ${returnValues}\n }\n `\n const query = gql`mutation ${queryName} (${pkeyOuterParamString}, $options___: DeleteOptionsInput!) {\n ${inner}\n }\n `\n\n if (entity.TransactionGroup) {\n // we have a transaction group, need to play nice and be part of it\n entity.RaiseReadyForTransaction();\n // we are part of a transaction group, so just add our query to the list\n // and when the transaction is committed, we will send all the queries at once\n entity.TransactionGroup.AddTransaction(new TransactionItem(entity, 'Delete', inner, vars, {mutationName: queryName,\n mutationInputTypes: mutationInputTypes},\n (results: any, success: boolean) => {\n // we get here whenever the transaction group does gets around to committing\n // our query.\n result.EndedAt = new Date(); // done processing\n if (success && results) {\n // success indicated by the entity.PrimaryKey.Value matching the return value of the mutation\n let success: boolean = true;\n for (const pk of entity.PrimaryKey.KeyValuePairs) {\n // check each primary key value to see if it matches the return value of the mutation\n if (pk.Value !== results[pk.FieldName]) {\n success = false;\n }\n }\n if (success) {\n result.Success = true;\n }\n else {\n // the transaction failed, nothing to update, but we need to call Reject so the\n // promise resolves with a rejection so our outer caller knows\n result.Success = false;\n result.Message = 'Transaction failed to commit'\n }\n }\n else {\n // the transaction failed, nothing to update, but we need to call Reject so the\n // promise resolves with a rejection so our outer caller knows\n result.Success = false;\n result.Message = 'Transaction failed to commit'\n }\n }));\n return true;\n }\n else {\n // no transaction just go for it\n const d = await this.ExecuteGQL(query, vars)\n if (d && d[queryName]) {\n const data = d[queryName];\n for (let key of entity.PrimaryKey.KeyValuePairs) {\n // we want to now compare key.Value against data[key.FieldName]\n let returnedVal = data[key.FieldName];\n let originalVal = key.Value;\n // we want to ignore types so we should convert numbers to strings for the comparison\n if (typeof originalVal === 'number')\n originalVal = originalVal.toString();\n if (typeof returnedVal === 'number')\n returnedVal = returnedVal.toString();\n // now compare the two values\n if (originalVal !== returnedVal) {\n throw new Error (`Primary key value mismatch in server Delete response. Field: ${key.FieldName}, Original: ${originalVal}, Returned: ${returnedVal}`);\n }\n }\n result.Success = true;\n result.EndedAt = new Date(); // done processing\n return true; // all of the return values match the primary key values, so we are good and delete worked\n }\n else\n throw new Error(`Delete failed for ${entity.EntityInfo.Name}: ${entity.PrimaryKey.ToString()} `);\n }\n }\n catch (e) {\n result.EndedAt = new Date(); // done processing\n result.Success = false;\n result.Message = e.response?.errors?.length > 0 ? e.response.errors[0].message : e.message;\n LogError(e);\n\n return false;\n }\n }\n /**************************************************************************/\n // END ---- IEntityDataProvider\n /**************************************************************************/\n\n\n /**************************************************************************/\n // START ---- IMetadataProvider\n /**************************************************************************/\n /**\n * Returns a dataset by name\n * @param datasetName \n * @param itemFilters \n * @returns \n */\n public async GetDatasetByName(datasetName: string, itemFilters?: DatasetItemFilterType[]): Promise<DatasetResultType> {\n const query = gql`query GetDatasetByName($DatasetName: String!, $ItemFilters: [DatasetItemFilterTypeGQL!]) {\n GetDatasetByName(DatasetName: $DatasetName, ItemFilters: $ItemFilters) {\n DatasetID\n DatasetName\n Success\n Status\n LatestUpdateDate\n Results\n }\n }`\n const data = await this.ExecuteGQL(query, {DatasetName: datasetName, ItemFilters: itemFilters });\n if (data && data.GetDatasetByName && data.GetDatasetByName.Success) {\n return {\n DatasetID: data.GetDatasetByName.DatasetID,\n DatasetName: data.GetDatasetByName.DatasetName,\n Success: data.GetDatasetByName.Success,\n Status: data.GetDatasetByName.Status,\n LatestUpdateDate: new Date(data.GetDatasetByName.LatestUpdateDate),\n Results: JSON.parse(data.GetDatasetByName.Results)\n }\n }\n else {\n return {\n DatasetID: \"\",\n DatasetName: datasetName,\n Success: false,\n Status: 'Unknown',\n LatestUpdateDate: null,\n Results: null\n };\n }\n }\n\n public async GetDatasetStatusByName(datasetName: string, itemFilters?: DatasetItemFilterType[]): Promise<DatasetStatusResultType> {\n const query = gql`query GetDatasetStatusByName($DatasetName: String!, $ItemFilters: [DatasetItemFilterTypeGQL!]) {\n GetDatasetStatusByName(DatasetName: $DatasetName, ItemFilters: $ItemFilters) {\n DatasetID\n DatasetName\n Success\n Status\n LatestUpdateDate\n EntityUpdateDates\n }\n }`\n const data = await this.ExecuteGQL(query, {DatasetName: datasetName, ItemFilters: itemFilters});\n if (data && data.GetDatasetStatusByName && data.GetDatasetStatusByName.Success) {\n return {\n DatasetID: data.GetDatasetStatusByName.DatasetID,\n DatasetName: data.GetDatasetStatusByName.DatasetName,\n Success: data.GetDatasetStatusByName.Success,\n Status: data.GetDatasetStatusByName.Status,\n LatestUpdateDate: new Date(data.GetDatasetStatusByName.LatestUpdateDate),\n EntityUpdateDates: JSON.parse(data.GetDatasetStatusByName.EntityUpdateDates)\n }\n }\n else {\n return {\n DatasetID: \"\",\n DatasetName: datasetName,\n Success: false,\n Status: 'Unknown',\n LatestUpdateDate: null,\n EntityUpdateDates: null\n };\n }\n }\n\n public async CreateTransactionGroup(): Promise<TransactionGroupBase> {\n return new GraphQLTransactionGroup(this);\n }\n\n public async GetRecordFavoriteStatus(userId: string, entityName: string, primaryKey: CompositeKey): Promise<boolean> {\n const valResult = primaryKey.Validate();\n if (!valResult.IsValid)\n return false;\n\n const e = this.Entities.find(e => e.Name === entityName)\n if (!e)\n throw new Error(`Entity ${entityName} not found in metadata`);\n\n const query = gql`query GetRecordFavoriteStatus($params: UserFavoriteSearchParams!) {\n GetRecordFavoriteStatus(params: $params) {\n Success\n IsFavorite\n }\n }`\n\n const data = await this.ExecuteGQL(query, {params: {\n UserID: userId,\n EntityID: e.ID,\n CompositeKey: {KeyValuePairs: this.ensureKeyValuePairValueIsString(primaryKey.KeyValuePairs)}\n }\n }\n );\n if (data && data.GetRecordFavoriteStatus && data.GetRecordFavoriteStatus.Success)\n return data.GetRecordFavoriteStatus.IsFavorite;\n }\n\n public async SetRecordFavoriteStatus(userId: string, entityName: string, primaryKey: CompositeKey, isFavorite: boolean, contextUser: UserInfo): Promise<void> {\n const e = this.Entities.find(e => e.Name === entityName)\n if (!e){\n throw new Error(`Entity ${entityName} not found in metadata`);\n }\n\n const query = gql`mutation SetRecordFavoriteStatus($params: UserFavoriteSetParams!) {\n SetRecordFavoriteStatus(params: $params){\n Success\n }\n }`\n\n const data = await this.ExecuteGQL(query, { params: {\n UserID: userId,\n EntityID: e.ID,\n CompositeKey: {KeyValuePairs: this.ensureKeyValuePairValueIsString(primaryKey.KeyValuePairs)},\n IsFavorite: isFavorite}\n }\n );\n if (data && data.SetRecordFavoriteStatus !== null)\n return data.SetRecordFavoriteStatus.Success;\n }\n\n public async GetEntityRecordName(entityName: string, primaryKey: CompositeKey): Promise<string> {\n if (!entityName || !primaryKey || primaryKey.KeyValuePairs?.length === 0){\n return null;\n }\n\n const query = gql`query GetEntityRecordNameQuery ($EntityName: String!, $CompositeKey: CompositeKeyInputType!) {\n GetEntityRecordName(EntityName: $EntityName, CompositeKey: $CompositeKey) {\n Success\n Status\n RecordName\n }\n }`\n\n const data = await this.ExecuteGQL(query, {\n EntityName: entityName,\n CompositeKey: {KeyValuePairs: this.ensureKeyValuePairValueIsString(primaryKey.KeyValuePairs)}\n });\n if (data && data.GetEntityRecordName && data.GetEntityRecordName.Success)\n return data.GetEntityRecordName.RecordName;\n }\n\n public async GetEntityRecordNames(info: EntityRecordNameInput[]): Promise<EntityRecordNameResult[]> {\n if (!info)\n return null;\n\n const query = gql`query GetEntityRecordNamesQuery ($info: [EntityRecordNameInput!]!) {\n GetEntityRecordNames(info: $info) {\n Success\n Status\n CompositeKey {\n KeyValuePairs {\n FieldName\n Value\n }\n }\n EntityName\n RecordName\n }\n }`\n\n const data = await this.ExecuteGQL(query, {info: info.map(i => {\n return {\n EntityName: i.EntityName,\n CompositeKey: {KeyValuePairs: this.ensureKeyValuePairValueIsString(i.CompositeKey.KeyValuePairs)}\n }\n })});\n if (data && data.GetEntityRecordNames)\n return data.GetEntityRecordNames;\n }\n\n /**\n * Retrieves all of the data context data for the specified data context ID.\n * @param dataContextID \n * @returns \n */\n public async GetDataContextData(dataContextID: string) {\n try {\n const query = gql`query GetDataContextData ($DataContextID: String!) {\n GetDataContextData(DataContextID: $DataContextID) {\n Success\n ErrorMessages\n Results\n }\n }`\n \n const data = await this.ExecuteGQL(query, {DataContextID: dataContextID});\n if (data && data.GetDataContextData) {\n if (data.GetDataContextData.Success) {\n return data.GetDataContextData.Results.map((item: any) => {\n return JSON.parse(item);\n });\n }\n else {\n throw new Error(data.GetDataContextData.ErrorMessages.join(', '));\n }\n }\n else {\n throw new Error('GraphQL query failed');\n } \n }\n catch (e) {\n LogError(e);\n throw e;\n }\n }\n\n /**\n * Retrieves the data context item data for the specified data context item ID.\n * @param dataContextItemID \n * @returns \n */\n public async GetDataContextItemData(dataContextItemID: string) {\n try {\n const query = gql`query GetDataContextItemData ($DataContextItemID: String!) {\n GetDataContextItemData(DataContextItemID: $DataContextItemID) {\n Success\n ErrorMessage\n Result\n }\n }`\n \n const data = await this.ExecuteGQL(query, {DataContextItemID: dataContextItemID});\n if (data && data.GetDataContextItemData) {\n if (data.GetDataContextItemData.Success) {\n return JSON.parse(data.GetDataContextItemData.Result);\n }\n else {\n throw new Error(data.GetDataContextItemData.ErrorMessage);\n }\n }\n else {\n throw new Error('GraphQL query failed');\n } \n }\n catch (e) {\n LogError(e);\n throw e;\n }\n }\n\n /**\n * Static version of the ExecuteGQL method that will use the global instance of the GraphQLDataProvider and execute the specified query with the provided variables. \n * If the token is expired, it will attempt to refresh the token and then re-execute the query. If the token is expired and the refresh fails, it will throw an error.\n * @param query \n * @param variables \n * @param refreshTokenIfNeeded \n * @returns \n */\n public static async ExecuteGQL(query: string, variables: any, refreshTokenIfNeeded: boolean = true): Promise<any> {\n return GraphQLDataProvider.Instance.ExecuteGQL(query, variables, refreshTokenIfNeeded);\n }\n\n /**\n * Executes the GQL query with the provided variables. If the token is expired, it will attempt to refresh the token and then re-execute the query. If the token is expired and the refresh fails, it will throw an error.\n * @param query \n * @param variables \n * @param refreshTokenIfNeeded \n * @returns \n */\n public async ExecuteGQL(query: string, variables: any, refreshTokenIfNeeded: boolean = true): Promise<any> {\n try {\n const data = await this._client.request(query, variables);\n return data;\n }\n catch (e) {\n if (e && e.response && e.response.errors?.length > 0) {//e.code === 'JWT_EXPIRED') {\n const error = e.response.errors[0];\n const code = error?.extensions?.code?.toUpperCase().trim()\n if (code === 'JWT_EXPIRED') {\n if (refreshTokenIfNeeded) {\n // token expired, so we need to refresh it and try again\n await this.RefreshToken();\n return await this.ExecuteGQL(query, variables, false/*don't attempt to refresh again*/);\n }\n else {\n // token expired but the caller doesn't want a refresh, so just return the error\n LogError(`JWT_EXPIRED and refreshTokenIfNeeded is false`);\n throw e;\n }\n }\n else\n throw e;\n }\n else {\n LogError(e);\n throw e; // force the caller to handle the error\n }\n }\n }\n\n public async RefreshToken(): Promise<void> {\n if (this._configData.Data.RefreshTokenFunction) {\n const newToken = await this._configData.Data.RefreshTokenFunction();\n if (newToken) {\n this._configData.Token = newToken; // update the token\n this._client = this.CreateNewGraphQLClient(this._configData.URL,\n this._configData.Token,\n this._sessionId,\n this._configData.MJAPIKey); \n }\n else {\n throw new Error('Refresh token function returned null or undefined token');\n }\n }\n else {\n throw new Error('No refresh token function provided');\n }\n }\n\n public static async RefreshToken(): Promise<void> {\n return GraphQLDataProvider.Instance.RefreshToken();\n }\n\n protected CreateNewGraphQLClient(url: string, token: string, sessionId: string, mjAPIKey: string): GraphQLClient {\n const headers: Record<string, string> = { \n 'x-session-id': sessionId,\n };\n if (token)\n headers.authorization = 'Bearer ' + token;\n if (mjAPIKey)\n headers['x-mj-api-key'] = mjAPIKey;\n\n return new GraphQLClient(url, {\n headers\n });\n }\n\n private _innerCurrentUserQueryString = `CurrentUser {\n ${this.userInfoString()}\n UserRoles_UserIDArray {\n ${this.userRoleInfoString()}\n }\n }\n `\n\n\n private _currentUserQuery = gql`query CurrentUserAndRoles {\n ${this._innerCurrentUserQueryString}\n }`\n\n\n\n private userInfoString(): string {\n return this.infoString(new UserInfo(null, null))\n }\n private userRoleInfoString(): string {\n return this.infoString(new UserRoleInfo(null))\n }\n private infoString(object: any): string {\n let sOutput: string = '';\n const keys = Object.keys(object)\n for (const k of keys) {\n if (k.startsWith('__mj_')) {\n sOutput += k.replace('__mj_', '_mj__') + '\\n '\n }\n else if (!k.startsWith('_')) {\n sOutput += k + '\\n '\n }\n }\n return sOutput\n }\n\n\n private _localStorageProvider: ILocalStorageProvider;\n get LocalStorageProvider(): ILocalStorageProvider {\n if (!this._localStorageProvider)\n this._localStorageProvider = new BrowserIndexedDBStorageProvider();\n\n return this._localStorageProvider;\n }\n\n\n /**************************************************************************/\n // END ---- IMetadataProvider\n /**************************************************************************/\n protected get Metadata(): IMetadataProvider {\n return this;\n }\n\n private _wsClient: Client = null;\n private _wsClientCreatedAt: number = null;\n private _pushStatusSubjects: Map<string, {\n subject: Subject<string>,\n subscription: Subscription,\n createdAt: number,\n lastRequestedAt: number,\n lastEmissionAt: number,\n activeSubscribers: number\n }> = new Map();\n // Tracks total WebSocket subscriptions (not component subscribers)\n // Used to prevent disposing client when subscriptions are active\n private _activeSubscriptionCount = 0;\n private readonly WS_CLIENT_MAX_AGE_MS = 30 * 60 * 1000; // 30 minutes\n private readonly SUBSCRIPTION_CLEANUP_INTERVAL_MS = 5 * 60 * 1000; // 5 minutes\n private readonly SUBSCRIPTION_IDLE_TIMEOUT_MS = 10 * 60 * 1000; // 10 minutes\n private _subscriptionCleanupTimer: NodeJS.Timeout = null;\n private _isCleaningUp = false; // Prevent concurrent cleanup\n\n /**\n * Gets or creates a WebSocket client with health checking and automatic cleanup\n * @returns Active WebSocket client\n */\n private getOrCreateWSClient(): Client {\n const now = Date.now();\n\n // Check if existing client is too old and should be recreated\n if (this._wsClient && this._wsClientCreatedAt) {\n const age = now - this._wsClientCreatedAt;\n if (age > this.WS_CLIENT_MAX_AGE_MS && this._activeSubscriptionCount === 0) {\n // Client is old and no active subscriptions, recreate it\n this.disposeWSClient();\n }\n }\n\n // Create new client if needed\n if (!this._wsClient) {\n this._wsClient = createClient({\n url: this.ConfigData.WSURL,\n connectionParams: {\n Authorization: 'Bearer ' + this.ConfigData.Token,\n },\n keepAlive: 30000, // Send keepalive ping every 30 seconds\n retryAttempts: 3,\n shouldRetry: () => true,\n });\n this._wsClientCreatedAt = now;\n\n // Start cleanup timer if not already running\n if (!this._subscriptionCleanupTimer) {\n this._subscriptionCleanupTimer = setInterval(() => {\n this.cleanupStaleSubscriptions();\n }, this.SUBSCRIPTION_CLEANUP_INTERVAL_MS);\n }\n }\n\n return this._wsClient;\n }\n\n /**\n * Disposes of the WebSocket client\n * Does NOT complete subjects - caller should handle that separately to avoid double-cleanup\n */\n private disposeWSClient(): void {\n if (this._wsClient) {\n try {\n this._wsClient.dispose();\n } catch (e) {\n console.error('[GraphQLDataProvider] Error disposing WebSocket client:', e);\n }\n this._wsClient = null;\n this._wsClientCreatedAt = null;\n }\n }\n\n /**\n * Completes all subjects and clears the cache\n * Separate from disposeWSClient to avoid double-cleanup\n */\n private completeAllSubjects(): void {\n this._pushStatusSubjects.forEach((entry, sessionId) => {\n try {\n entry.subject.complete();\n entry.subscription.unsubscribe();\n } catch (e) {\n console.error(`[GraphQLDataProvider] Error cleaning up subject for ${sessionId}:`, e);\n }\n });\n this._pushStatusSubjects.clear();\n }\n\n /**\n * Cleans up stale subscription subjects that haven't been used recently\n * Uses cleanup flag to prevent concurrent execution\n * Uses Map snapshot to avoid concurrent modification issues\n */\n private cleanupStaleSubscriptions(): void {\n // Prevent concurrent cleanup\n if (this._isCleaningUp) {\n return;\n }\n this._isCleaningUp = true;\n\n try {\n const now = Date.now();\n const initialCount = this._pushStatusSubjects.size;\n\n // Create snapshot to avoid concurrent modification during iteration\n const entries = Array.from(this._pushStatusSubjects.entries());\n const toRemove: string[] = [];\n\n // Identify stale subscriptions (must have no active subscribers AND be idle)\n entries.forEach(([sessionId, value]) => {\n const timeSinceRequested = now - value.lastRequestedAt;\n const timeSinceEmission = now - value.lastEmissionAt;\n\n // Clean up if ALL conditions are true:\n // 1. No active subscribers (no component is listening)\n // 2. Not requested recently (no component has requested it)\n // 3. Not receiving data (no active server communication)\n const shouldCleanup = value.activeSubscribers === 0 &&\n timeSinceRequested >= this.SUBSCRIPTION_IDLE_TIMEOUT_MS &&\n timeSinceEmission >= this.SUBSCRIPTION_IDLE_TIMEOUT_MS;\n\n if (shouldCleanup) {\n console.log(`[GraphQLDataProvider] Marking session ${sessionId} for cleanup: ` +\n `activeSubscribers=${value.activeSubscribers}, ` +\n `timeSinceRequested=${Math.round(timeSinceRequested/1000)}s, ` +\n `timeSinceEmission=${Math.round(timeSinceEmission/1000)}s`);\n toRemove.push(sessionId);\n }\n });\n\n // Complete subjects and unsubscribe from WebSocket\n toRemove.forEach(sessionId => {\n const entry = this._pushStatusSubjects.get(sessionId);\n if (entry) {\n try {\n entry.subject.complete(); // Completes for ALL subscribers\n entry.subscription.unsubscribe(); // Closes WebSocket subscription\n this._pushStatusSubjects.delete(sessionId);\n console.log(`[GraphQLDataProvider] Cleaned up stale subscription for session: ${sessionId}`);\n } catch (e) {\n console.error(`[GraphQLDataProvider] Error cleaning up subscription for ${sessionId}:`, e);\n }\n }\n });\n\n if (toRemove.length > 0) {\n console.log(`[GraphQLDataProvider] Cleaned up ${toRemove.length} stale subscription(s)`);\n }\n\n // If no subscriptions remain and client is old, dispose of it\n if (this._pushStatusSubjects.size === 0 && this._wsClient && this._wsClientCreatedAt) {\n const clientAge = now - this._wsClientCreatedAt;\n if (clientAge > this.WS_CLIENT_MAX_AGE_MS) {\n console.log('[GraphQLDataProvider] Disposing of idle WebSocket client');\n this.disposeWSClient();\n }\n }\n } finally {\n this._isCleaningUp = false;\n }\n }\n\n /**\n * Generic subscription method for GraphQL subscriptions\n * @param subscription The GraphQL subscription query\n * @param variables Variables to pass to the subscription\n * @returns Observable that emits subscription data\n */\n public subscribe(subscription: string, variables?: any): Observable<any> {\n return new Observable((observer) => {\n const client = this.getOrCreateWSClient();\n this._activeSubscriptionCount++;\n\n const unsubscribe = client.subscribe(\n { query: subscription, variables },\n {\n next: (data) => {\n observer.next(data.data);\n },\n error: async (error: unknown) => {\n // Check if error is JWT_EXPIRED\n const errorObj = error as { extensions?: { code?: string }, message?: string };\n const isTokenExpired =\n errorObj?.extensions?.code === 'JWT_EXPIRED' ||\n errorObj?.message?.includes('token has expired') ||\n errorObj?.message?.includes('JWT_EXPIRED');\n\n if (isTokenExpired) {\n console.log('[GraphQLDataProvider] WebSocket JWT token expired, refreshing and reconnecting...');\n try {\n // Refresh the token\n await this.RefreshToken();\n\n // Dispose old WebSocket client\n this.disposeWSClient();\n\n // Observer will be completed, and caller should re-subscribe\n // which will create a new WebSocket connection with the new token\n observer.complete();\n } catch (refreshError) {\n console.error('[GraphQLDataProvider] Failed to refresh token for WebSocket:', refreshError);\n observer.error(refreshError);\n }\n } else {\n observer.error(error);\n }\n },\n complete: () => {\n observer.complete();\n },\n }\n );\n\n // Return cleanup function - this is ALWAYS called when subscription ends\n // whether by error, completion, or manual unsubscribe\n return () => {\n this._activeSubscriptionCount--;\n unsubscribe();\n };\n });\n }\n\n public PushStatusUpdates(sessionId: string = null): Observable<string> {\n if (!sessionId)\n sessionId = this.sessionId;\n\n const now = Date.now();\n\n // Check for existing subject\n const existing = this._pushStatusSubjects.get(sessionId);\n if (existing) {\n // Update last requested time\n existing.lastRequestedAt = now;\n // Wrap with defer to increment on subscribe and finalize to decrement on unsubscribe\n return new Observable<string>((observer) => {\n // Increment subscriber count when Observable is subscribed to\n existing.activeSubscribers++;\n\n // Subscribe to the underlying Subject\n const subscription = existing.subject.subscribe(observer);\n\n // Return teardown function that decrements count\n return () => {\n const entry = this._pushStatusSubjects.get(sessionId);\n if (entry && entry.activeSubscribers > 0) {\n entry.activeSubscribers--;\n }\n subscription.unsubscribe();\n };\n });\n }\n\n const SUBSCRIBE_TO_STATUS = gql`subscription StatusUpdates($sessionId: String!) {\n statusUpdates(sessionId: $sessionId) {\n date\n message\n sessionId\n }\n }\n `;\n\n // Create new Subject for status updates (no buffering - status updates are ephemeral)\n const subject = new Subject<string>();\n const client = this.getOrCreateWSClient();\n\n // Subscribe to WebSocket and pipe data to Subject\n const subscription = new Subscription();\n subscription.add(\n new Observable((observer) => {\n const unsubscribe = client.subscribe(\n { query: SUBSCRIBE_TO_STATUS, variables: { sessionId } },\n {\n next: (data: any) => {\n // Update last emission time\n const entry = this._pushStatusSubjects.get(sessionId);\n if (entry) {\n entry.lastEmissionAt = Date.now();\n }\n // Extract the message and emit to subject\n observer.next(data.data.statusUpdates.message);\n },\n error: async (error: unknown) => {\n // Check if error is JWT_EXPIRED\n const errorObj = error as { extensions?: { code?: string }, message?: string };\n const isTokenExpired =\n errorObj?.extensions?.code === 'JWT_EXPIRED' ||\n errorObj?.message?.includes('token has expired') ||\n errorObj?.message?.includes('JWT_EXPIRED');\n\n if (isTokenExpired) {\n console.log('[GraphQLDataProvider] PushStatusUpdates JWT token expired, refreshing and reconnecting...');\n try {\n // Refresh the token\n await this.RefreshToken();\n\n // Dispose old WebSocket client\n this.disposeWSClient();\n\n // Complete the subscription - components will auto-reconnect via RxJS retry logic\n observer.complete();\n } catch (refreshError) {\n console.error('[GraphQLDataProvider] Failed to refresh token for PushStatusUpdates:', refreshError);\n observer.error(refreshError);\n }\n } else {\n observer.error(error);\n }\n },\n complete: () => {\n observer.complete();\n },\n }\n );\n\n // Increment AFTER successful subscription setup\n this._activeSubscriptionCount++;\n\n return () => {\n this._activeSubscriptionCount--;\n unsubscribe();\n };\n }).subscribe({\n next: (message: string) => subject.next(message),\n error: (error) => {\n // On error, complete subject and remove from cache\n subject.error(error);\n this._pushStatusSubjects.delete(sessionId);\n },\n complete: () => {\n // On completion, complete subject and remove from cache\n subject.complete();\n this._pushStatusSubjects.delete(sessionId);\n }\n })\n );\n\n // Store subject with tracking data\n this._pushStatusSubjects.set(sessionId, {\n subject,\n subscription,\n createdAt: now,\n lastRequestedAt: now,\n lastEmissionAt: now,\n activeSubscribers: 0 // Will be incremented when first component subscribes\n });\n\n // Wrap return Observable to track subscribers\n return new Observable<string>((observer) => {\n // Increment subscriber count when Observable is subscribed to\n const entry = this._pushStatusSubjects.get(sessionId);\n if (entry) {\n entry.activeSubscribers++;\n }\n\n // Subscribe to the underlying Subject\n const sub = subject.subscribe(observer);\n\n // Return teardown function that decrements count\n return () => {\n const entry = this._pushStatusSubjects.get(sessionId);\n if (entry && entry.activeSubscribers > 0) {\n entry.activeSubscribers--;\n }\n sub.unsubscribe();\n };\n });\n }\n\n /**\n * Public method to dispose of WebSocket resources\n * Call this when shutting down the provider or on logout\n */\n public disposeWebSocketResources(): void {\n // Stop cleanup timer\n if (this._subscriptionCleanupTimer) {\n clearInterval(this._subscriptionCleanupTimer);\n this._subscriptionCleanupTimer = null;\n }\n\n // Complete all subjects and clear cache\n this.completeAllSubjects();\n\n // Reset counters\n this._activeSubscriptionCount = 0;\n\n // Dispose WebSocket client\n this.disposeWSClient();\n }\n}\n\n\n// this class implements a simple in-memory only storage as a fallback if the browser doesn't support local storage\nclass BrowserStorageProviderBase implements ILocalStorageProvider {\n private _localStorage: { [key: string]: string } = {};\n\n public async GetItem(key: string): Promise<string | null> {\n return new Promise((resolve) => {\n if (this._localStorage.hasOwnProperty(key))\n resolve(this._localStorage[key]);\n else\n resolve(null);\n });\n }\n\n public async SetItem(key: string, value: string): Promise<void> {\n return new Promise((resolve) => {\n this._localStorage[key] = value;\n resolve();\n });\n }\n\n public async Remove(key: string): Promise<void> {\n return new Promise((resolve) => {\n if (this._localStorage.hasOwnProperty(key)) {\n delete this._localStorage[key];\n }\n resolve();\n });\n }\n}\n\n\n// This implementation just wraps the browser local storage and if for some reason the browser doesn't\n// have a localStorage object, we just use a simple object to store the data in memory.\nclass BrowserLocalStorageProvider extends BrowserStorageProviderBase {\n public async getItem(key: string): Promise<string | null> {\n if (localStorage)\n return localStorage.getItem(key);\n else\n return await super.GetItem(key)\n }\n\n public async setItem(key: string, value: string): Promise<void> {\n if (localStorage)\n localStorage.setItem(key, value);\n else\n await super.SetItem(key, value)\n }\n\n public async remove(key: string): Promise<void> {\n if (localStorage)\n localStorage.removeItem(key);\n else\n await super.Remove(key)\n }\n}\n\n\n\nconst IDB_DB_NAME = 'MJ_Metadata';\nconst IDB_DB_ObjectStoreName = 'Metadata_KVPairs';\n\ninterface MJ_MetadataDB extends DBSchema {\n 'Metadata_KVPairs': {\n key: string;\n value: any;\n };\n}\n\nclass BrowserIndexedDBStorageProvider extends BrowserStorageProviderBase {\n private dbPromise: Promise<IDBPDatabase<MJ_MetadataDB>>;\n\n constructor() {\n super();\n\n this.dbPromise = openDB<MJ_MetadataDB>(IDB_DB_NAME, 1, {\n upgrade(db) {\n if (!db.objectStoreNames.contains(IDB_DB_ObjectStoreName)) {\n db.createObjectStore(IDB_DB_ObjectStoreName);\n }\n },\n });\n }\n\n async setItem(key: string, value: any): Promise<void> {\n const db = await this.dbPromise;\n const tx = db.transaction(IDB_DB_ObjectStoreName, 'readwrite');\n await tx.objectStore(IDB_DB_ObjectStoreName).put(value, key);\n await tx.done;\n }\n\n async getItem(key: string): Promise<any> {\n const db = await this.dbPromise;\n const value = await db.transaction(IDB_DB_ObjectStoreName).objectStore(IDB_DB_ObjectStoreName).get(key);\n return value;\n }\n\n async remove(key: string): Promise<void> {\n const db = await this.dbPromise;\n const tx = db.transaction(IDB_DB_ObjectStoreName, 'readwrite');\n await tx.objectStore(IDB_DB_ObjectStoreName).delete(key);\n await tx.done;\n }\n}\n","import { RunReport, BaseEntity, Metadata, RunView, RunQuery, SetProvider } from \"@memberjunction/core\";\nimport { GraphQLDataProvider, GraphQLProviderConfigData } from \"./graphQLDataProvider\";\nimport { MJGlobal, MJEventType } from \"@memberjunction/global\";\n\n/**\n * Setup the GraphQL client for the project using the provided configuration data.\n */\nexport async function setupGraphQLClient(config: GraphQLProviderConfigData): Promise<GraphQLDataProvider> {\n // Set the provider for all entities to be GraphQL in this project, can use a different provider in other situations....\n const provider = new GraphQLDataProvider()\n\n // BaseEntity + Metadata share the same GraphQLDataProvider instance\n SetProvider(provider);\n\n await provider.Config(config);\n\n // fire off the logged in event if we get here\n MJGlobal.Instance.RaiseEvent({ event: MJEventType.LoggedIn, eventCode: null, component: this, args: null });\n\n return provider;\n}","import { CompositeKey } from \"@memberjunction/core\";\n\n\n\nexport class SyncRolesAndUsersResult {\n Success: boolean;\n}\n \nexport class RoleInput {\n ID: string;\n\n Name: string;\n \n Description: string;\n}\n\n\nexport class UserInput {\n ID!: string;\n\n Name!: string;\n\n Email!: string;\n\n Type!: 'Owner' | 'User';\n\n FirstName: string;\n\n LastName: string;\n \n Title: string;\n\n Roles?: RoleInput[];\n}\n\nexport class RolesAndUsersInput {\n public Users: UserInput[];\n \n public Roles: RoleInput[];\n}\n\n\n\n/**\n * This type defines the possible list of actions that can be taken in syncing data: Create, Update, CreateOrUpdate, Delete, or DeleteWithFilter\n * DeleteWithFilter is where you specify a valid SQL expression that can be used in a where clause to get a list of records in a given entity to delete\n * this can be used to ensure cleaning out data from a subset of a given table.\n */\nexport enum SyncDataAction {\n Create = \"Create\",\n Update = \"Update\",\n CreateOrUpdate = \"CreateOrUpdate\",\n Delete = \"Delete\",\n DeleteWithFilter = \"DeleteWithFilter\"\n}\n \nexport class ActionItemInput {\n /**\n * The name of the entity where action is to be taken\n */\n EntityName!: string;\n /**\n * For Update, CreateOrUpdate and Delete operations either a PrimaryKey or an AlternateKey must be provided. For Create and DeleteWithFilter operations, neither is used. \n */\n PrimaryKey?: CompositeKey;\n /**\n * For Update, CreateOrUpdate and Delete operations either a PrimaryKey or an AlternateKey must be provided. For Create and DeleteWithFilter operations, neither is used. \n */\n AlternateKey?: CompositeKey;\n /**\n * The type of action requested. The possible values are Create, Update, CreateOrUpdate, Delete, DeleteWithFilter\n */\n Type!: SyncDataAction;\n /**\n * This field is a JSON representation of the field values of the entity to be created or updated. It is used for all ActionTypes except for \n */\n RecordJSON?: string;\n\n /**\n * This field is only provided when the Action Type is DeleteWithFilter. It is a valid SQL expression that can be used in a where clause to get a list of records in a given entity to delete\n */\n DeleteFilter?: string;\n}\n \n\nexport class SyncDataResult {\n Success: boolean;\n \n Results: ActionItemOutput[] = [];\n}\n\nexport class ActionItemOutput {\n Success: boolean;\n ErrorMessage: string;\n EntityName!: string;\n PrimaryKey?: CompositeKey;\n AlternateKey?: CompositeKey;\n Type!: SyncDataAction;\n\n /**\n * This field is a JSON representation of the field values of the entity to be created or updated. It is used for all ActionTypes except for \n */\n RecordJSON?: string;\n\n /**\n * This field is only provided when the Action Type is DeleteWithFilter. It is a valid SQL expression that can be used in a where clause to get a list of records in a given entity to delete\n */\n DeleteFilter?: string;\n}","import { CompositeKey, LogError, KeyValuePair, IsVerboseLoggingEnabled } from '@memberjunction/core';\nimport { SafeJSONParse } from '@memberjunction/global';\nimport { gql, GraphQLClient } from 'graphql-request'\nimport { ActionItemInput, RolesAndUsersInput, SyncDataResult, SyncRolesAndUsersResult } from './rolesAndUsersType';\nimport { \n RunAIPromptParams, \n RunAIPromptResult, \n ExecuteSimplePromptParams,\n SimplePromptResult,\n EmbedTextParams,\n EmbedTextResult\n} from './graphQLAIClient';\nimport { ExecuteAgentParams, ExecuteAgentResult } from '@memberjunction/ai-core-plus';\n\n/**\n * Specialized client that is designed to be used exclusively on the server side\n * by the System User using the MJ API KEY. This is designed to allow server side\n * code such as within the context of an MJAPI server to talk to another MAJPI server\n * but as the client.\n * \n * It is possible for a server to use the regular @GraphQLDataProvider client to talk\n * to another MJAPI server, but that would require the server to have a user account\n * and the server would have to be able to log in as that user via a JWT token. This\n * is not always possible or convenient in the flow. \n * \n * Also the standard client configuration process has a certain amount over overhead\n * in always loading up certain metadata that is not necessary for many system user\n * operations.\n * \n * Finaly, this client can be used in parallel with the regular client to allow a server\n * to mix and match the two as needed.\n */\nexport class GraphQLSystemUserClient {\n private _client: GraphQLClient;\n private _sessionId: string;\n /**\n * Returns the underlying GraphQL client which is an instance of the GraphQLClient object\n * from the graphql-request package. This is useful if you want to perform any operation\n * that is not directly supported by this class via specialized methods.\n */\n public get Client(): GraphQLClient {\n return this._client;\n }\n\n /**\n * @param url MJAPI server URL\n * @param token Optional, JWT token that is used for a normal user authentication flow. This is required if mjAPIKey is not provided.\n * @param sessionId Optional, UUID that is used to track a session. This can be any string.\n * @param mjAPIKey Shared Secret key that is provided for system user authentication. This is required if token is not provided.\n * @returns \n */\n constructor (url: string, token: string, sessionId: string, mjAPIKey: string) {\n const headers: Record<string, string> = { \n 'x-session-id': sessionId,\n };\n this._sessionId = sessionId;\n if (token)\n headers.authorization = 'Bearer ' + token;\n if (mjAPIKey)\n headers['x-mj-api-key'] = mjAPIKey;\n\n this._client = new GraphQLClient(url, {\n headers\n });\n }\n\n /**\n * Calls the GetData() query on the server to execute any number of provided SQL queries in parallel and returns the results.\n * The queries MUST BE read only and not perform any DML operations. The remote server will execute the queries using a special\n * lower-privilege user that is not allowed to perform any form of write operations.\n * @param queries an array of SQL queries to execute on the remote server\n * @param accessToken the short-lived access token that is required to perform this operation. This is different from the MJAPI key and is used for a second factor and is a short-lived token. You will receive this token \n * when an MJAPI calls your server to request something along with the URL to call back.\n * @returns \n */\n public async GetData(queries: string[], accessToken: string): Promise<GetDataOutput> {\n try {\n const query = `query GetData($input: GetDataInputType!) {\n GetData(input: $input) {\n Success\n ErrorMessages\n Queries\n Results\n }\n }`\n const result = await this.Client.request(query, {input: {Queries: queries, Token: accessToken}}) as {GetData: GetDataOutput};\n if (result && result.GetData) {\n // for each succesful item, we will parse and return the array of objects instead of the string\n return {\n Success: result.GetData.Success,\n Results: result.GetData.Results.map(r => r ? SafeJSONParse(r) : null),\n ErrorMessages: result.GetData.ErrorMessages,\n Queries: result.GetData.Queries \n }\n }\n else {\n return {\n Success: false,\n Results: [],\n ErrorMessages: result.GetData?.ErrorMessages ?? ['Unknown error'],\n Queries: result.GetData?.Queries ?? queries\n }\n }\n }\n catch (e) {\n // Extract clean error message - the GraphQL error response contains the actual SQL error\n let cleanError = e instanceof Error ? e.message : String(e);\n\n // Try to extract just the SQL error from GraphQL response\n // Look for the actual error message before the JSON payload\n const match = cleanError.match(/Error: ([^:]+)\\./);\n if (match) {\n cleanError = match[1] + '.';\n }\n\n // Only log verbose details if in verbose mode\n if (IsVerboseLoggingEnabled()) {\n const verboseError = `GraphQLSystemUserClient::GetData - Error getting data - ${e}`;\n LogError(verboseError);\n }\n\n return {\n Success: false,\n Results: [],\n ErrorMessages: [cleanError],\n Queries: queries\n }\n }\n }\n\n /**\n * This method will return a list of all entities that are available on the remote server. This is a lightweight call that only returns the basic metadata for each entity and does not include all of the attributes at \n * either the entity or the field level. This is useful for getting a list of entities that are available on the remote server and knowing their IDs and Entity Field IDs on the remote server. For core MemberJunction \n * entities and entity fields, the ID values are globally unique and set by the MemberJunction distribution, however, for other entities that are generated on each target system they can vary so it is best to use\n * lookups name or a combination of SchemaName and BaseTable to uniquely identify an entity.\n * @param client \n * @returns \n */\n public async GetAllRemoteEntities(): Promise<SimpleRemoteEntityOutput> {\n try {\n const query = `query GetAllEntities {\n GetAllEntities {\n Success\n ErrorMessage\n Results {\n ID\n Name\n Description\n SchemaName\n BaseView\n BaseTable\n CodeName\n ClassName\n Fields {\n ID\n Name\n Description\n Type\n AllowsNull\n MaxLength\n }\n }\n }\n }`\n\n const result = (await this.Client.request(query)) as {GetAllEntities: SimpleRemoteEntityOutput};\n if (result && result.GetAllEntities) {\n return result.GetAllEntities;\n }\n else {\n return {\n Success: false,\n Results: [],\n ErrorMessage: result.GetAllEntities?.ErrorMessage ?? 'Unknown error'\n }\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::GetAllRemoteEntities - Error getting remote entities - ${e}`);\n return {\n Success: false,\n Results: [],\n ErrorMessage: e\n }\n }\n }\n\n /**\n * This method is used to invoke the data synchronization mutation on the remote server. This method is used to create, update, or delete records in the remote server. The method takes an array of ActionItemInput objects\n * Each of the ActionItemInput objects represents a single action to take on a single entity. The action can be Create, Update, CreateOrUpdate, Delete, or DeleteWithFilter. The RecordJSON field is used for Create, CreateOrUpdate and Update whereas\n * the DeleteFilter field is used for DeleteWithFilter. The PrimaryKey and AlternateKey fields are used to identify the record to be acted upon. \n * \n * Use of the AlternateKey is important for situations where you might have divergent primary keys across systems. For example for user entities that are individually generated on each system by CodeGen, the primary key will\n * be different per system, so you would use the combination of the SchemaName and BaseTable to identify the entity and then use the AlternateKey to provide the combination of these fields to uniquely identify the record for updates.\n * @param items \n * @returns \n */\n public async SyncData(items: ActionItemInput[]): Promise<SyncDataResult> {\n try {\n // call the resolver to sync the roles and users\n const query = `mutation SyncData($items: [ActionItemInputType!]!) {\n SyncData(items: $items) {\n Success\n Results {\n Success\n ErrorMessage\n EntityName\n Type\n PrimaryKey {\n KeyValuePairs {\n FieldName\n Value \n }\n }\n AlternateKey {\n KeyValuePairs {\n FieldName\n Value \n }\n }\n DeleteFilter\n RecordJSON\n }\n }\n }`\n const d = <{SyncData: SyncDataResult}>await this.Client.request(query, {items});\n if (d && d.SyncData) {\n return d.SyncData;\n }\n else {\n return {\n Success: false,\n Results: []\n }\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::SyncData - Error syncing data - ${e}`);\n return {\n Success: false,\n Results: []\n }\n }\n }\n\n /**\n * This method will sync the roles and users on the remote server. This method is used to create, update, or delete roles and users on the remote server. \n * The method takes a RolesAndUsersInput object that contains an array of RoleInput objects. Note that this will not result in the removal of roles on the \n * remote server that are deemed to be built-in MemberJunction roles such as Developer, Integration and UI.\n * @param data \n * @returns \n */\n public async SyncRolesAndUsers(data: RolesAndUsersInput): Promise<SyncRolesAndUsersResult> {\n try {\n // call the resolver to sync the roles and users\n const query = `mutation SyncRolesAndUsers($data: RolesAndUsersInputType!) {\n SyncRolesAndUsers(data: $data) {\n Success\n }\n }`\n const d = await this.Client.request(query, {data}) as {SyncRolesAndUsers: SyncRolesAndUsersResult};\n if (d && d.SyncRolesAndUsers) {\n return d.SyncRolesAndUsers;\n }\n else {\n return {\n Success: false\n }\n }\n } \n catch (e) {\n LogError(`GraphQLSystemUserClient::SyncRolesAndUsers - Error syncing roles and users - ${e}`);\n return {\n Success: false\n }\n } \n }\n\n /**\n * Runs a view by name using the RunViewByNameSystemUser resolver.\n * @param input - View input parameters for running by name\n * @returns Promise containing the view execution results\n */\n public async RunViewByName(input: RunViewByNameSystemUserInput): Promise<RunViewSystemUserResult> {\n try {\n const query = `query RunViewByNameSystemUser($input: RunViewByNameInput!) {\n RunViewByNameSystemUser(input: $input) {\n Results {\n PrimaryKey {\n FieldName\n Value\n }\n EntityID\n Data\n }\n UserViewRunID\n RowCount\n TotalRowCount\n ExecutionTime\n ErrorMessage\n Success\n }\n }`\n\n const result = await this.Client.request(query, { input }) as { RunViewByNameSystemUser: RunViewSystemUserResult };\n if (result && result.RunViewByNameSystemUser) {\n return result.RunViewByNameSystemUser;\n } else {\n return {\n Results: [],\n Success: false,\n ErrorMessage: 'Failed to execute view by name'\n };\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::RunViewByNameSystemUser - Error running view by name - ${e}`);\n return {\n Results: [],\n Success: false,\n ErrorMessage: e.toString()\n };\n }\n }\n\n /**\n * Runs a view by ID using the RunViewByIDSystemUser resolver.\n * @param input - View input parameters for running by ID\n * @returns Promise containing the view execution results\n */\n public async RunViewByID(input: RunViewByIDSystemUserInput): Promise<RunViewSystemUserResult> {\n try {\n const query = `query RunViewByIDSystemUser($input: RunViewByIDInput!) {\n RunViewByIDSystemUser(input: $input) {\n Results {\n PrimaryKey {\n FieldName\n Value\n }\n EntityID\n Data\n }\n UserViewRunID\n RowCount\n TotalRowCount\n ExecutionTime\n ErrorMessage\n Success\n }\n }`\n\n const result = await this.Client.request(query, { input }) as { RunViewByIDSystemUser: RunViewSystemUserResult };\n if (result && result.RunViewByIDSystemUser) {\n return result.RunViewByIDSystemUser;\n } else {\n return {\n Results: [],\n Success: false,\n ErrorMessage: 'Failed to execute view by ID'\n };\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::RunViewByIDSystemUser - Error running view by ID - ${e}`);\n return {\n Results: [],\n Success: false,\n ErrorMessage: e.toString()\n };\n }\n }\n\n /**\n * Runs a dynamic view using the RunDynamicViewSystemUser resolver.\n * @param input - View input parameters for dynamic view execution\n * @returns Promise containing the view execution results\n */\n public async RunDynamicView(input: RunDynamicViewSystemUserInput): Promise<RunViewSystemUserResult> {\n try {\n const query = `query RunDynamicViewSystemUser($input: RunDynamicViewInput!) {\n RunDynamicViewSystemUser(input: $input) {\n Results {\n PrimaryKey {\n FieldName\n Value\n }\n EntityID\n Data\n }\n UserViewRunID\n RowCount\n TotalRowCount\n ExecutionTime\n ErrorMessage\n Success\n }\n }`\n\n const result = await this.Client.request(query, { input }) as { RunDynamicViewSystemUser: RunViewSystemUserResult };\n if (result && result.RunDynamicViewSystemUser) {\n return result.RunDynamicViewSystemUser;\n } else {\n return {\n Results: [],\n Success: false,\n ErrorMessage: 'Failed to execute dynamic view'\n };\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::RunDynamicViewSystemUser - Error running dynamic view - ${e}`);\n return {\n Results: [],\n Success: false,\n ErrorMessage: e.toString()\n };\n }\n }\n\n /**\n * Runs multiple views using the RunViewsSystemUser resolver. This method allows system users\n * to execute view queries with the same functionality as regular users but with system-level privileges.\n * @param input - Array of view input parameters\n * @returns Promise containing the results from all view executions\n */\n public async RunViews(input: RunViewSystemUserInput[]): Promise<RunViewSystemUserResult[]> {\n try {\n const query = `query RunViewsSystemUser($input: [RunViewGenericInput!]!) {\n RunViewsSystemUser(input: $input) {\n Results {\n PrimaryKey {\n FieldName\n Value\n }\n EntityID\n Data\n }\n UserViewRunID\n RowCount\n TotalRowCount\n ExecutionTime\n ErrorMessage\n Success\n }\n }`\n\n const result = await this.Client.request(query, { input }) as { RunViewsSystemUser: RunViewSystemUserResult[] };\n if (result && result.RunViewsSystemUser) {\n return result.RunViewsSystemUser;\n } else {\n return [];\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::RunViewsSystemUser - Error running views - ${e}`);\n return [];\n }\n }\n\n /**\n * Executes a stored query by ID using the GetQueryDataSystemUser resolver.\n * @param input - Query input parameters for execution by ID\n * @returns Promise containing the query execution results\n */\n public async GetQueryData(input: GetQueryDataSystemUserInput): Promise<RunQuerySystemUserResult> {\n try {\n // Validate that Parameters is a JSON object, not an array\n if (input.Parameters !== undefined && Array.isArray(input.Parameters)) {\n throw new Error('Parameters must be a JSON object, not an array. Use {} for empty parameters instead of [].');\n }\n\n const query = `query GetQueryDataSystemUser($QueryID: String!, $CategoryID: String, $CategoryPath: String, $Parameters: JSONObject, $MaxRows: Int, $StartRow: Int) {\n GetQueryDataSystemUser(QueryID: $QueryID, CategoryID: $CategoryID, CategoryPath: $CategoryPath, Parameters: $Parameters, MaxRows: $MaxRows, StartRow: $StartRow) {\n QueryID\n QueryName\n Success\n Results\n RowCount\n TotalRowCount\n ExecutionTime\n ErrorMessage\n AppliedParameters\n }\n }`\n\n const variables: any = { QueryID: input.QueryID };\n if (input.CategoryID !== undefined) variables.CategoryID = input.CategoryID;\n if (input.CategoryPath !== undefined) variables.CategoryPath = input.CategoryPath;\n if (input.Parameters !== undefined) variables.Parameters = input.Parameters;\n if (input.MaxRows !== undefined) variables.MaxRows = input.MaxRows;\n if (input.StartRow !== undefined) variables.StartRow = input.StartRow;\n\n const result = await this.Client.request(query, variables) as { GetQueryDataSystemUser: RunQuerySystemUserResult };\n \n if (result && result.GetQueryDataSystemUser) {\n // Parse the JSON results for easier consumption\n return {\n ...result.GetQueryDataSystemUser,\n Results: result.GetQueryDataSystemUser.Results ? SafeJSONParse(result.GetQueryDataSystemUser.Results) : null\n };\n } else {\n return {\n QueryID: input.QueryID,\n QueryName: '',\n Success: false,\n Results: null,\n RowCount: 0,\n TotalRowCount: 0,\n ExecutionTime: 0,\n ErrorMessage: 'Query execution failed'\n };\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::GetQueryDataSystemUser - Error executing query - ${e}`);\n return {\n QueryID: input.QueryID,\n QueryName: '',\n Success: false,\n Results: null,\n RowCount: 0,\n TotalRowCount: 0,\n ExecutionTime: 0,\n ErrorMessage: e.toString()\n };\n }\n }\n\n /**\n * Executes a stored query by name using the GetQueryDataByNameSystemUser resolver.\n * @param input - Query input parameters for execution by name\n * @returns Promise containing the query execution results\n */\n public async GetQueryDataByName(input: GetQueryDataByNameSystemUserInput): Promise<RunQuerySystemUserResult> {\n try {\n // Validate that Parameters is a JSON object, not an array\n if (input.Parameters !== undefined && Array.isArray(input.Parameters)) {\n throw new Error('Parameters must be a JSON object, not an array. Use {} for empty parameters instead of [].');\n }\n\n const query = `query GetQueryDataByNameSystemUser($QueryName: String!, $CategoryID: String, $CategoryPath: String, $Parameters: JSONObject, $MaxRows: Int, $StartRow: Int) {\n GetQueryDataByNameSystemUser(QueryName: $QueryName, CategoryID: $CategoryID, CategoryPath: $CategoryPath, Parameters: $Parameters, MaxRows: $MaxRows, StartRow: $StartRow) {\n QueryID\n QueryName\n Success\n Results\n RowCount\n TotalRowCount\n ExecutionTime\n ErrorMessage\n AppliedParameters\n }\n }`\n\n const variables: any = { QueryName: input.QueryName };\n if (input.CategoryID !== undefined) variables.CategoryID = input.CategoryID;\n if (input.CategoryPath !== undefined) variables.CategoryPath = input.CategoryPath;\n if (input.Parameters !== undefined) variables.Parameters = input.Parameters;\n if (input.MaxRows !== undefined) variables.MaxRows = input.MaxRows;\n if (input.StartRow !== undefined) variables.StartRow = input.StartRow;\n\n const result = await this.Client.request(query, variables) as { GetQueryDataByNameSystemUser: RunQuerySystemUserResult };\n \n if (result && result.GetQueryDataByNameSystemUser) {\n // Parse the JSON results for easier consumption\n return {\n ...result.GetQueryDataByNameSystemUser,\n Results: result.GetQueryDataByNameSystemUser.Results ? SafeJSONParse(result.GetQueryDataByNameSystemUser.Results) : null\n };\n } else {\n return {\n QueryID: '',\n QueryName: input.QueryName,\n Success: false,\n Results: null,\n RowCount: 0,\n TotalRowCount: 0,\n ExecutionTime: 0,\n ErrorMessage: 'Query execution failed'\n };\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::GetQueryDataByNameSystemUser - Error executing query - ${e}`);\n return {\n QueryID: '',\n QueryName: input.QueryName,\n Success: false,\n Results: null,\n RowCount: 0,\n TotalRowCount: 0,\n ExecutionTime: 0,\n ErrorMessage: e.toString()\n };\n }\n }\n\n /**\n * Creates a new query using the CreateQuerySystemUser mutation. This method is restricted to system users only.\n * @param input - CreateQuerySystemUserInput containing all the query attributes including optional CategoryPath\n * @returns Promise containing the result of the query creation\n */\n public async CreateQuery(input: CreateQueryInput): Promise<CreateQueryResult> {\n try {\n const query = `mutation CreateQuerySystemUser($input: CreateQuerySystemUserInput!) {\n CreateQuerySystemUser(input: $input) {\n Success\n ErrorMessage\n ID\n Name\n Description\n CategoryID\n Category\n SQL\n Status\n QualityRank\n EmbeddingVector\n EmbeddingModelID\n EmbeddingModelName\n Fields {\n ID\n QueryID\n Name\n Description\n Sequence\n SQLBaseType\n SQLFullType\n SourceEntityID\n SourceEntity\n SourceFieldName\n IsComputed\n ComputationDescription\n IsSummary\n SummaryDescription\n }\n Parameters {\n ID\n QueryID\n Name\n Description\n Type\n IsRequired\n DefaultValue\n SampleValue\n ValidationFilters\n }\n Entities {\n ID\n QueryID\n EntityID\n Entity\n }\n Permissions {\n ID\n QueryID\n RoleID\n Role\n }\n }\n }`\n\n const result = await this.Client.request(query, { input }) as { CreateQuerySystemUser: CreateQueryResult };\n if (result && result.CreateQuerySystemUser) {\n return result.CreateQuerySystemUser;\n } else {\n return {\n Success: false,\n ErrorMessage: 'Failed to create query'\n };\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::CreateQuery - Error creating query - ${e}`);\n return {\n Success: false,\n ErrorMessage: e.toString()\n };\n }\n }\n\n /**\n * Updates an existing query with the provided attributes. This method is restricted to system users only.\n * @param input - UpdateQueryInput containing the query ID and fields to update\n * @returns Promise containing the result of the query update including updated fields, parameters, entities, and permissions\n */\n public async UpdateQuery(input: UpdateQueryInput): Promise<UpdateQueryResult> {\n try {\n const query = `mutation UpdateQuerySystemUser($input: UpdateQuerySystemUserInput!) {\n UpdateQuerySystemUser(input: $input) {\n Success\n ErrorMessage\n ID\n Name\n Description\n CategoryID\n Category\n SQL\n Status\n QualityRank\n EmbeddingVector\n EmbeddingModelID\n EmbeddingModelName\n Fields {\n ID\n QueryID\n Name\n Description\n Sequence\n SQLBaseType\n SQLFullType\n SourceEntityID\n SourceEntity\n SourceFieldName\n IsComputed\n ComputationDescription\n IsSummary\n SummaryDescription\n }\n Parameters {\n ID\n QueryID\n Name\n Description\n Type\n IsRequired\n DefaultValue\n SampleValue\n ValidationFilters\n }\n Entities {\n ID\n QueryID\n EntityID\n Entity\n }\n Permissions {\n ID\n QueryID\n RoleID\n Role\n }\n }\n }`\n\n const result = await this.Client.request(query, { input }) as { UpdateQuerySystemUser: UpdateQueryResult };\n if (result && result.UpdateQuerySystemUser) {\n return result.UpdateQuerySystemUser;\n } else {\n return {\n Success: false,\n ErrorMessage: 'Failed to update query'\n };\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::UpdateQuery - Error updating query - ${e}`);\n return {\n Success: false,\n ErrorMessage: e.toString()\n };\n }\n }\n\n /**\n * Deletes a query by ID using the DeleteQuerySystemResolver mutation. This method is restricted to system users only.\n * @param ID - The ID of the query to delete\n * @param options - Optional delete options controlling action execution\n * @returns Promise containing the result of the query deletion\n */\n public async DeleteQuery(ID: string, options?: DeleteQueryOptionsInput): Promise<DeleteQueryResult> {\n try {\n // Validate ID is not null/undefined/empty\n if (!ID || ID.trim() === '') {\n LogError('GraphQLSystemUserClient::DeleteQuery - Invalid query ID: ID cannot be null or empty');\n return {\n Success: false,\n ErrorMessage: 'Invalid query ID: ID cannot be null or empty'\n };\n }\n\n const query = `mutation DeleteQuerySystemResolver($ID: String!, $options: DeleteOptionsInput) {\n DeleteQuerySystemResolver(ID: $ID, options: $options) {\n Success\n ErrorMessage\n ID\n Name\n }\n }`\n\n const variables: any = { ID: ID };\n if (options !== undefined) {\n variables.options = options;\n }\n\n const result = await this.Client.request(query, variables) as { DeleteQuerySystemResolver: DeleteQueryResult };\n \n if (result && result.DeleteQuerySystemResolver) {\n return result.DeleteQuerySystemResolver;\n } else {\n return {\n Success: false,\n ErrorMessage: 'Failed to delete query'\n };\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::DeleteQuery - Error deleting query - ${e}`);\n return {\n Success: false,\n ErrorMessage: e.toString()\n };\n }\n }\n\n /**\n * Run an AI prompt with system user privileges.\n * This method allows system-level execution of AI prompts without user authentication.\n * \n * @param params The parameters for running the AI prompt\n * @returns A Promise that resolves to a RunAIPromptResult object\n * \n * @example\n * ```typescript\n * const result = await systemClient.RunAIPrompt({\n * promptId: \"prompt-id\",\n * data: { systemData: \"value\" },\n * skipValidation: true\n * });\n * ```\n */\n public async RunAIPrompt(params: RunAIPromptParams): Promise<RunAIPromptResult> {\n try {\n // Build the query for system user\n const query = gql`\n query RunAIPromptSystemUser(\n $promptId: String!,\n $data: String,\n $overrideModelId: String,\n $overrideVendorId: String,\n $configurationId: String,\n $skipValidation: Boolean,\n $templateData: String,\n $responseFormat: String,\n $temperature: Float,\n $topP: Float,\n $topK: Int,\n $minP: Float,\n $frequencyPenalty: Float,\n $presencePenalty: Float,\n $seed: Int,\n $stopSequences: [String!],\n $includeLogProbs: Boolean,\n $topLogProbs: Int,\n $messages: String,\n $rerunFromPromptRunID: String,\n $systemPromptOverride: String\n ) {\n RunAIPromptSystemUser(\n promptId: $promptId,\n data: $data,\n overrideModelId: $overrideModelId,\n overrideVendorId: $overrideVendorId,\n configurationId: $configurationId,\n skipValidation: $skipValidation,\n templateData: $templateData,\n responseFormat: $responseFormat,\n temperature: $temperature,\n topP: $topP,\n topK: $topK,\n minP: $minP,\n frequencyPenalty: $frequencyPenalty,\n presencePenalty: $presencePenalty,\n seed: $seed,\n stopSequences: $stopSequences,\n includeLogProbs: $includeLogProbs,\n topLogProbs: $topLogProbs,\n messages: $messages,\n rerunFromPromptRunID: $rerunFromPromptRunID,\n systemPromptOverride: $systemPromptOverride\n ) {\n success\n output\n parsedResult\n error\n executionTimeMs\n tokensUsed\n promptRunId\n rawResult\n validationResult\n chatResult\n }\n }\n `;\n\n // Prepare variables\n const variables = this.preparePromptVariables(params);\n\n // Execute the query\n const result = await this.Client.request(query, variables) as { RunAIPromptSystemUser: any };\n\n // Process and return the result\n if (result && result.RunAIPromptSystemUser) {\n return this.processPromptResult(result.RunAIPromptSystemUser);\n } else {\n return {\n success: false,\n error: 'Failed to execute AI prompt as system user'\n };\n }\n } catch (e) {\n LogError(`GraphQLSystemUserClient::RunAIPrompt - Error running AI prompt - ${e}`);\n return {\n success: false,\n error: e.toString()\n };\n }\n }\n\n /**\n * Run an AI agent with system user privileges.\n * This method allows system-level execution of AI agents without user authentication.\n * \n * @param params The parameters for running the AI agent\n * @returns A Promise that resolves to a RunAIAgentResult object\n * \n * @example\n * ```typescript\n * const result = await systemClient.RunAIAgent({\n * agentId: \"agent-id\",\n * messages: [{ role: \"system\", content: \"Process data\" }],\n * sessionId: \"system-session\"\n * });\n * ```\n */\n public async RunAIAgent(params: ExecuteAgentParams): Promise<ExecuteAgentResult> {\n try {\n // Build the query for system user\n const query = gql`\n query RunAIAgentSystemUser(\n $agentId: String!,\n $messages: String!,\n $sessionId: String!,\n $data: String,\n $templateData: String,\n $lastRunId: String,\n $autoPopulateLastRunPayload: Boolean,\n $configurationId: String\n ) {\n RunAIAgentSystemUser(\n agentId: $agentId,\n messages: $messages,\n sessionId: $sessionId,\n data: $data,\n templateData: $templateData,\n lastRunId: $lastRunId,\n autoPopulateLastRunPayload: $autoPopulateLastRunPayload,\n configurationId: $configurationId\n ) {\n success\n errorMessage\n executionTimeMs\n result\n }\n }\n `;\n\n // Prepare variables\n const variables = this.prepareAgentVariables(params);\n\n // Execute the query\n const result = await this.Client.request(query, variables) as { RunAIAgentSystemUser: any };\n\n // Process and return the result\n if (result && result.RunAIAgentSystemUser) {\n return this.processAgentResult(result.RunAIAgentSystemUser.result);\n } else {\n return {\n success: false, \n agentRun: undefined\n };\n }\n } catch (e) {\n LogError(`GraphQLSystemUserClient::RunAIAgent - Error running AI agent - ${e}`);\n return {\n success: false, \n agentRun: undefined\n };\n }\n }\n\n /**\n * Helper method to prepare prompt variables for GraphQL\n * @private\n */\n private preparePromptVariables(params: RunAIPromptParams): Record<string, any> {\n const variables: Record<string, any> = {\n promptId: params.promptId\n };\n\n // Serialize complex objects to JSON strings\n if (params.data !== undefined) {\n variables.data = typeof params.data === 'object' ? JSON.stringify(params.data) : params.data;\n }\n if (params.templateData !== undefined) {\n variables.templateData = typeof params.templateData === 'object' ? JSON.stringify(params.templateData) : params.templateData;\n }\n if (params.messages !== undefined) {\n variables.messages = JSON.stringify(params.messages);\n }\n\n // Add optional scalar parameters\n if (params.overrideModelId !== undefined) variables.overrideModelId = params.overrideModelId;\n if (params.overrideVendorId !== undefined) variables.overrideVendorId = params.overrideVendorId;\n if (params.configurationId !== undefined) variables.configurationId = params.configurationId;\n if (params.skipValidation !== undefined) variables.skipValidation = params.skipValidation;\n if (params.responseFormat !== undefined) variables.responseFormat = params.responseFormat;\n if (params.temperature !== undefined) variables.temperature = params.temperature;\n if (params.topP !== undefined) variables.topP = params.topP;\n if (params.topK !== undefined) variables.topK = params.topK;\n if (params.minP !== undefined) variables.minP = params.minP;\n if (params.frequencyPenalty !== undefined) variables.frequencyPenalty = params.frequencyPenalty;\n if (params.presencePenalty !== undefined) variables.presencePenalty = params.presencePenalty;\n if (params.seed !== undefined) variables.seed = params.seed;\n if (params.stopSequences !== undefined) variables.stopSequences = params.stopSequences;\n if (params.includeLogProbs !== undefined) variables.includeLogProbs = params.includeLogProbs;\n if (params.topLogProbs !== undefined) variables.topLogProbs = params.topLogProbs;\n if (params.rerunFromPromptRunID !== undefined) variables.rerunFromPromptRunID = params.rerunFromPromptRunID;\n if (params.systemPromptOverride !== undefined) variables.systemPromptOverride = params.systemPromptOverride;\n\n return variables;\n }\n\n /**\n * Helper method to prepare agent variables for GraphQL\n * @private\n */\n private prepareAgentVariables(params: ExecuteAgentParams): Record<string, any> {\n const variables: Record<string, any> = {\n agentId: params.agent.ID,\n messages: JSON.stringify(params.conversationMessages),\n sessionId: this._sessionId\n };\n\n // Serialize optional complex objects to JSON strings\n if (params.data !== undefined) {\n variables.data = typeof params.data === 'object' ? JSON.stringify(params.data) : params.data;\n }\n\n // Add optional scalar parameters\n if (params.lastRunId !== undefined) variables.lastRunId = params.lastRunId;\n if (params.autoPopulateLastRunPayload !== undefined) variables.autoPopulateLastRunPayload = params.autoPopulateLastRunPayload;\n if (params.configurationId !== undefined) variables.configurationId = params.configurationId;\n\n return variables;\n }\n\n /**\n * Helper method to process prompt results\n * @private\n */\n private processPromptResult(promptResult: any): RunAIPromptResult {\n // Parse JSON results if they exist\n let parsedResult: any;\n let validationResult: any;\n let chatResult: any;\n\n try {\n if (promptResult.parsedResult) {\n parsedResult = JSON.parse(promptResult.parsedResult);\n }\n } catch (e) {\n parsedResult = promptResult.parsedResult;\n }\n\n try {\n if (promptResult.validationResult) {\n validationResult = JSON.parse(promptResult.validationResult);\n }\n } catch (e) {\n validationResult = promptResult.validationResult;\n }\n\n try {\n if (promptResult.chatResult) {\n chatResult = JSON.parse(promptResult.chatResult);\n }\n } catch (e) {\n chatResult = promptResult.chatResult;\n }\n\n return {\n success: promptResult.success,\n output: promptResult.output,\n parsedResult,\n error: promptResult.error,\n executionTimeMs: promptResult.executionTimeMs,\n tokensUsed: promptResult.tokensUsed,\n promptRunId: promptResult.promptRunId,\n rawResult: promptResult.rawResult,\n validationResult,\n chatResult\n };\n }\n\n /**\n * Helper method to process agent results\n * @private\n */\n private processAgentResult(agentResult: any): ExecuteAgentResult {\n return SafeJSONParse(agentResult) as ExecuteAgentResult;\n }\n\n /**\n * Execute a simple prompt without requiring a stored AI Prompt entity.\n * This method allows system-level execution of simple prompts.\n * \n * @param params The parameters for the simple prompt execution\n * @returns A Promise that resolves to a SimplePromptResult object\n * \n * @example\n * ```typescript\n * const result = await systemClient.ExecuteSimplePrompt({\n * systemPrompt: \"You are a data analyst\",\n * modelPower: \"medium\"\n * });\n * ```\n */\n public async ExecuteSimplePrompt(params: ExecuteSimplePromptParams): Promise<SimplePromptResult> {\n try {\n const query = gql`\n query ExecuteSimplePromptSystemUser(\n $systemPrompt: String!,\n $messages: String,\n $preferredModels: [String!],\n $modelPower: String,\n $responseFormat: String\n ) {\n ExecuteSimplePromptSystemUser(\n systemPrompt: $systemPrompt,\n messages: $messages,\n preferredModels: $preferredModels,\n modelPower: $modelPower,\n responseFormat: $responseFormat\n ) {\n success\n result\n resultObject\n modelName\n error\n executionTimeMs\n }\n }\n `;\n\n // Prepare variables\n const variables: Record<string, any> = {\n systemPrompt: params.systemPrompt\n };\n\n // Convert messages array to JSON string if provided\n if (params.messages && params.messages.length > 0) {\n variables.messages = JSON.stringify(params.messages);\n }\n\n if (params.preferredModels) {\n variables.preferredModels = params.preferredModels;\n }\n\n if (params.modelPower) {\n variables.modelPower = params.modelPower;\n }\n\n if (params.responseFormat) {\n variables.responseFormat = params.responseFormat;\n }\n\n // Execute the query\n const result = await this.Client.request(query, variables) as { ExecuteSimplePromptSystemUser: any };\n\n if (!result?.ExecuteSimplePromptSystemUser) {\n return {\n success: false,\n modelName: 'Unknown',\n error: 'Failed to execute simple prompt as system user'\n };\n }\n\n const promptResult = result.ExecuteSimplePromptSystemUser;\n\n // Parse resultObject if it exists\n let resultObject: any;\n if (promptResult.resultObject) {\n try {\n resultObject = JSON.parse(promptResult.resultObject);\n } catch (e) {\n resultObject = promptResult.resultObject;\n }\n }\n\n return {\n success: promptResult.success,\n result: promptResult.result,\n resultObject,\n modelName: promptResult.modelName,\n error: promptResult.error,\n executionTimeMs: promptResult.executionTimeMs\n };\n\n } catch (e) {\n LogError(`GraphQLSystemUserClient::ExecuteSimplePrompt - Error executing simple prompt - ${e}`);\n return {\n success: false,\n modelName: 'Unknown',\n error: e.toString()\n };\n }\n }\n\n /**\n * Generate embeddings using local embedding models.\n * This method allows system-level generation of text embeddings.\n * \n * @param params The parameters for embedding generation\n * @returns A Promise that resolves to an EmbedTextResult object\n * \n * @example\n * ```typescript\n * const result = await systemClient.EmbedText({\n * textToEmbed: [\"System data\", \"Configuration\"],\n * modelSize: \"small\"\n * });\n * ```\n */\n public async EmbedText(params: EmbedTextParams): Promise<EmbedTextResult> {\n try {\n const query = gql`\n query EmbedTextSystemUser(\n $textToEmbed: [String!]!,\n $modelSize: String!\n ) {\n EmbedTextSystemUser(\n textToEmbed: $textToEmbed,\n modelSize: $modelSize\n ) {\n embeddings\n modelName\n vectorDimensions\n error\n }\n }\n `;\n\n // Prepare variables - handle both single string and array\n const textArray = Array.isArray(params.textToEmbed) \n ? params.textToEmbed \n : [params.textToEmbed];\n\n const variables = {\n textToEmbed: textArray,\n modelSize: params.modelSize\n };\n\n // Execute the query\n const result = await this.Client.request(query, variables) as { EmbedTextSystemUser: any };\n\n if (!result?.EmbedTextSystemUser) {\n return {\n embeddings: Array.isArray(params.textToEmbed) ? [] : [],\n modelName: 'Unknown',\n vectorDimensions: 0,\n error: 'Failed to generate embeddings as system user'\n };\n }\n\n const embedResult = result.EmbedTextSystemUser;\n\n // Return single embedding or array based on input\n const returnEmbeddings = Array.isArray(params.textToEmbed)\n ? embedResult.embeddings\n : embedResult.embeddings[0];\n\n return {\n embeddings: returnEmbeddings,\n modelName: embedResult.modelName,\n vectorDimensions: embedResult.vectorDimensions,\n error: embedResult.error\n };\n\n } catch (e) {\n LogError(`GraphQLSystemUserClient::EmbedText - Error generating embeddings - ${e}`);\n return {\n embeddings: Array.isArray(params.textToEmbed) ? [] : [],\n modelName: 'Unknown',\n vectorDimensions: 0,\n error: e.toString()\n };\n }\n }\n\n}\n\n/**\n * Output type for GetData calls - contains results from executing multiple SQL queries\n */\nexport class GetDataOutput {\n /**\n * Indicates if the operation was successful overall. If any individual query failed, this will be false. However, any successful queries will still be returned in the Results array.\n */\n Success: boolean;\n /**\n * The original input of Queries that were run - same order as provided in the request\n */\n Queries: string[];\n /**\n * An ordered array of error messages for each query that was run. This array will always have the same # of entries as Queries. If a query was successful, the corresponding entry will be null.\n */\n ErrorMessages: (string | null)[];\n /**\n * An ordered array of results for each query that was run. This array will always have the same # of entries as Queries. If a query failed, the corresponding entry will be null. Successful results are JSON strings containing the query data.\n */\n Results: (string | null)[];\n}\n\n/**\n * Return type for calls to the GetAllRemoteEntities query - provides lightweight entity metadata\n */\nexport class SimpleRemoteEntityOutput {\n /**\n * Indicates whether the remote entity retrieval was successful\n */\n Success: boolean;\n /**\n * Error message if the operation failed, undefined if successful\n */\n ErrorMessage?: string;\n /**\n * An array of simple entity types that are returned from the remote server - contains basic metadata for each entity\n */\n Results: SimpleRemoteEntity[];\n}\n\n/**\n * Represents a simple entity type that is used for lightweight retrieval of partial remote entity metadata \n */\nexport class SimpleRemoteEntity {\n /**\n * Unique identifier of the entity on the remote server\n */\n ID: string;\n /**\n * Display name of the entity (e.g., \"Users\", \"Companies\")\n */\n Name: string;\n /**\n * Optional description explaining the entity's purpose\n */\n Description?: string;\n /**\n * Database schema name where the entity resides (e.g., \"dbo\", \"custom\")\n */\n SchemaName: string;\n /**\n * Name of the database view used for reading this entity\n */\n BaseView: string;\n /**\n * Name of the database table used for storing this entity\n */\n BaseTable: string;\n /**\n * Optional code-friendly name for the entity (typically PascalCase)\n */\n CodeName?: string;\n /**\n * Optional TypeScript/JavaScript class name for the entity\n */\n ClassName?: string;\n /**\n * Array of field definitions for this entity\n */\n Fields: SimpleRemoteEntityField[];\n}\n\n/**\n * Represents a field within a remote entity - contains basic field metadata\n */\nexport class SimpleRemoteEntityField {\n /**\n * Unique identifier of the entity field on the remote server\n */\n ID: string;\n /**\n * Field name (e.g., \"FirstName\", \"Email\", \"CreatedAt\")\n */\n Name: string;\n /**\n * Optional description explaining the field's purpose\n */\n Description?: string;\n /**\n * Data type of the field (e.g., \"nvarchar\", \"int\", \"datetime\", \"bit\")\n */\n Type: string;\n /**\n * Whether the field can contain null values\n */\n AllowsNull: boolean;\n /**\n * Maximum length for string fields, -1 for unlimited, 0 for non-string types\n */\n MaxLength: number;\n}\n\n/**\n * Input type for RunViewByNameSystemUser method calls - executes a saved view by name\n */\nexport interface RunViewByNameSystemUserInput {\n /**\n * Name of the saved view to execute\n */\n ViewName: string;\n /**\n * Additional WHERE clause conditions to apply (optional)\n */\n ExtraFilter?: string;\n /**\n * ORDER BY clause for sorting results (optional)\n */\n OrderBy?: string;\n /**\n * Specific fields to return, if not specified returns all fields (optional)\n */\n Fields?: string[];\n /**\n * Search string to filter results across searchable fields (optional)\n */\n UserSearchString?: string;\n /**\n * ID of a previous view run to exclude results from (optional)\n */\n ExcludeUserViewRunID?: string;\n /**\n * Override the exclude filter with custom logic (optional)\n */\n OverrideExcludeFilter?: string;\n /**\n * Whether to save the view execution results for future reference (optional)\n */\n SaveViewResults?: boolean;\n /**\n * Whether to exclude data from all prior view runs (optional)\n */\n ExcludeDataFromAllPriorViewRuns?: boolean;\n /**\n * Whether to ignore the view's MaxRows setting and return all results (optional)\n */\n IgnoreMaxRows?: boolean;\n /**\n * Maximum number of rows to return, overrides view setting if specified (optional)\n */\n MaxRows?: number;\n /**\n * Whether to force audit logging for this view execution (optional)\n */\n ForceAuditLog?: boolean;\n /**\n * Description for the audit log entry if ForceAuditLog is true (optional)\n */\n AuditLogDescription?: string;\n /**\n * Type of result format: \"simple\", \"entity_object\", etc. (optional)\n */\n ResultType?: string;\n /**\n * Starting row number for pagination (optional, 0-based)\n */\n StartRow?: number;\n}\n\n/**\n * Input type for RunViewByIDSystemUser method calls - executes a saved view by its unique ID\n */\nexport interface RunViewByIDSystemUserInput {\n /**\n * Unique identifier of the saved view to execute\n */\n ViewID: string;\n /**\n * Additional WHERE clause conditions to apply (optional)\n */\n ExtraFilter?: string;\n /**\n * ORDER BY clause for sorting results (optional)\n */\n OrderBy?: string;\n /**\n * Specific fields to return, if not specified returns all fields (optional)\n */\n Fields?: string[];\n /**\n * Search string to filter results across searchable fields (optional)\n */\n UserSearchString?: string;\n /**\n * ID of a previous view run to exclude results from (optional)\n */\n ExcludeUserViewRunID?: string;\n /**\n * Override the exclude filter with custom logic (optional)\n */\n OverrideExcludeFilter?: string;\n /**\n * Whether to save the view execution results for future reference (optional)\n */\n SaveViewResults?: boolean;\n /**\n * Whether to exclude data from all prior view runs (optional)\n */\n ExcludeDataFromAllPriorViewRuns?: boolean;\n /**\n * Whether to ignore the view's MaxRows setting and return all results (optional)\n */\n IgnoreMaxRows?: boolean;\n /**\n * Maximum number of rows to return, overrides view setting if specified (optional)\n */\n MaxRows?: number;\n /**\n * Whether to force audit logging for this view execution (optional)\n */\n ForceAuditLog?: boolean;\n /**\n * Description for the audit log entry if ForceAuditLog is true (optional)\n */\n AuditLogDescription?: string;\n /**\n * Type of result format: \"simple\", \"entity_object\", etc. (optional)\n */\n ResultType?: string;\n /**\n * Starting row number for pagination (optional, 0-based)\n */\n StartRow?: number;\n}\n\n/**\n * Input type for RunDynamicViewSystemUser method calls - creates and executes a view dynamically based on entity\n */\nexport interface RunDynamicViewSystemUserInput {\n /**\n * Name of the entity to query (e.g., \"Users\", \"Companies\")\n */\n EntityName: string;\n /**\n * Additional WHERE clause conditions to apply (optional)\n */\n ExtraFilter?: string;\n /**\n * ORDER BY clause for sorting results (optional)\n */\n OrderBy?: string;\n /**\n * Specific fields to return, if not specified returns all fields (optional)\n */\n Fields?: string[];\n /**\n * Search string to filter results across searchable fields (optional)\n */\n UserSearchString?: string;\n /**\n * ID of a previous view run to exclude results from (optional)\n */\n ExcludeUserViewRunID?: string;\n /**\n * Override the exclude filter with custom logic (optional)\n */\n OverrideExcludeFilter?: string;\n /**\n * Whether to ignore MaxRows limits and return all results (optional)\n */\n IgnoreMaxRows?: boolean;\n /**\n * Maximum number of rows to return (optional)\n */\n MaxRows?: number;\n /**\n * Whether to force audit logging for this view execution (optional)\n */\n ForceAuditLog?: boolean;\n /**\n * Description for the audit log entry if ForceAuditLog is true (optional)\n */\n AuditLogDescription?: string;\n /**\n * Type of result format: \"simple\", \"entity_object\", etc. (optional)\n */\n ResultType?: string;\n /**\n * Starting row number for pagination (optional, 0-based)\n */\n StartRow?: number;\n}\n\n/**\n * Input type for RunViewsSystemUser method calls - executes multiple views in parallel\n */\nexport interface RunViewSystemUserInput {\n /**\n * Name of the entity to query (e.g., \"Users\", \"Companies\")\n */\n EntityName: string;\n /**\n * Additional WHERE clause conditions to apply (optional)\n */\n ExtraFilter?: string;\n /**\n * ORDER BY clause for sorting results (optional)\n */\n OrderBy?: string;\n /**\n * Specific fields to return, if not specified returns all fields (optional)\n */\n Fields?: string[];\n /**\n * Search string to filter results across searchable fields (optional)\n */\n UserSearchString?: string;\n /**\n * ID of a previous view run to exclude results from (optional)\n */\n ExcludeUserViewRunID?: string;\n /**\n * Override the exclude filter with custom logic (optional)\n */\n OverrideExcludeFilter?: string;\n /**\n * Whether to ignore MaxRows limits and return all results (optional)\n */\n IgnoreMaxRows?: boolean;\n /**\n * Maximum number of rows to return (optional)\n */\n MaxRows?: number;\n /**\n * Whether to force audit logging for this view execution (optional)\n */\n ForceAuditLog?: boolean;\n /**\n * Description for the audit log entry if ForceAuditLog is true (optional)\n */\n AuditLogDescription?: string;\n /**\n * Type of result format: \"simple\", \"entity_object\", etc. (optional)\n */\n ResultType?: string;\n /**\n * Starting row number for pagination (optional, 0-based)\n */\n StartRow?: number;\n}\n\n\n/**\n * Result row type for view execution results - represents a single data row\n */\nexport interface RunViewSystemUserResultRow {\n /**\n * Primary key fields and values for the record\n */\n PrimaryKey: KeyValuePair[];\n /**\n * ID of the entity type this record belongs to\n */\n EntityID: string;\n /**\n * JSON string containing the actual record data\n */\n Data: string;\n}\n\n/**\n * Result type for RunViewsSystemUser method calls - contains execution results and metadata\n */\nexport interface RunViewSystemUserResult {\n /**\n * Array of result rows containing the actual data\n */\n Results: RunViewSystemUserResultRow[];\n /**\n * Unique identifier for this view execution run (optional)\n */\n UserViewRunID?: string;\n /**\n * Number of rows returned in this result set (optional)\n */\n RowCount?: number;\n /**\n * Total number of rows available (before pagination) (optional)\n */\n TotalRowCount?: number;\n /**\n * Time taken to execute the view in milliseconds (optional)\n */\n ExecutionTime?: number;\n /**\n * Error message if the execution failed (optional)\n */\n ErrorMessage?: string;\n /**\n * Whether the view execution was successful\n */\n Success: boolean;\n}\n\n/**\n * Result type for query execution methods - contains query results and execution metadata\n */\nexport interface RunQuerySystemUserResult {\n /**\n * Unique identifier of the executed query\n */\n QueryID: string;\n /**\n * Display name of the executed query\n */\n QueryName: string;\n /**\n * Whether the query execution was successful\n */\n Success: boolean;\n /**\n * Query results data (parsed from JSON)\n */\n Results: any;\n /**\n * Number of rows returned by the query\n */\n RowCount: number;\n /**\n * Total number of rows available (before pagination)\n */\n TotalRowCount: number;\n /**\n * Time taken to execute the query in milliseconds\n */\n ExecutionTime: number;\n /**\n * Error message if the query execution failed\n */\n ErrorMessage: string;\n /**\n * JSON string containing the applied parameters (optional)\n */\n AppliedParameters?: string;\n}\n\n/**\n * Input type for GetQueryDataSystemUser method calls - executes a stored query by ID\n */\nexport interface GetQueryDataSystemUserInput {\n /**\n * The ID of the query to execute\n */\n QueryID: string;\n /**\n * Optional category ID filter\n */\n CategoryID?: string;\n /**\n * Optional category path filter (hierarchical path like \"/MJ/AI/Agents/\" or simple name)\n */\n CategoryPath?: string;\n /**\n * Optional parameters for templated queries\n */\n Parameters?: Record<string, any>;\n /**\n * Optional maximum number of rows to return\n */\n MaxRows?: number;\n /**\n * Optional starting row number for pagination\n */\n StartRow?: number;\n}\n\n/**\n * Input type for GetQueryDataByNameSystemUser method calls - executes a stored query by name\n */\nexport interface GetQueryDataByNameSystemUserInput {\n /**\n * The name of the query to execute\n */\n QueryName: string;\n /**\n * Optional category ID filter\n */\n CategoryID?: string;\n /**\n * Optional category path filter (hierarchical path like \"/MJ/AI/Agents/\" or simple name)\n */\n CategoryPath?: string;\n /**\n * Optional parameters for templated queries\n */\n Parameters?: Record<string, any>;\n /**\n * Optional maximum number of rows to return\n */\n MaxRows?: number;\n /**\n * Optional starting row number for pagination\n */\n StartRow?: number;\n}\n\n/**\n * Input type for query permissions to be created with a new query\n */\nexport interface QueryPermissionInput {\n /**\n * Role ID to grant access to\n */\n RoleID: string;\n}\n\n/**\n * Input type for CreateQuery mutation calls - creates a new query with optional hierarchical category path\n */\nexport interface CreateQueryInput {\n /**\n * Required name for the query (must be unique within category)\n */\n Name: string;\n /**\n * Optional existing category ID to assign the query to\n */\n CategoryID?: string;\n /**\n * Optional category path for automatic hierarchy creation (e.g., \"Reports/Sales/Monthly\") - takes precedence over CategoryID\n */\n CategoryPath?: string;\n /**\n * Optional natural language question this query answers\n */\n UserQuestion?: string;\n /**\n * Optional general description of what the query does\n */\n Description?: string;\n /**\n * Optional SQL query text to execute (can contain Nunjucks template syntax)\n */\n SQL?: string;\n /**\n * Optional technical documentation for developers\n */\n TechnicalDescription?: string;\n /**\n * Optional original SQL before optimization or modification\n */\n OriginalSQL?: string;\n /**\n * Optional user feedback about the query\n */\n Feedback?: string;\n /**\n * Optional query approval status (defaults to 'Pending')\n */\n Status?: 'Pending' | 'Approved' | 'Rejected' | 'Expired';\n /**\n * Optional quality indicator (higher = better quality, defaults to 0)\n */\n QualityRank?: number;\n /**\n * Optional execution cost indicator (higher = more expensive to run)\n */\n ExecutionCostRank?: number;\n /**\n * Optional flag indicating if the query uses Nunjucks template syntax (auto-detected if not specified)\n */\n UsesTemplate?: boolean;\n /**\n * Optional array of permissions to create for the query\n */\n Permissions?: QueryPermissionInput[];\n}\n\n/**\n * Type for query field information\n */\nexport interface QueryField {\n ID: string;\n QueryID: string;\n Name: string;\n Description?: string;\n Sequence: number;\n SQLBaseType?: string;\n SQLFullType?: string;\n SourceEntityID?: string;\n SourceEntity?: string;\n SourceFieldName?: string;\n IsComputed: boolean;\n ComputationDescription?: string;\n IsSummary?: boolean;\n SummaryDescription?: string;\n}\n\n/**\n * Type for query parameter information\n */\nexport interface QueryParameter {\n ID: string;\n QueryID: string;\n Name: string;\n Description?: string;\n Type: string;\n IsRequired: boolean;\n DefaultValue?: string;\n SampleValue?: string;\n ValidationFilters?: string;\n}\n\n/**\n * Type for query entity information\n */\nexport interface QueryEntity {\n ID: string;\n QueryID: string;\n EntityID: string;\n Entity?: string;\n}\n\n/**\n * Type for query permission information\n */\nexport interface QueryPermission {\n ID: string;\n QueryID: string;\n RoleID: string;\n Role?: string;\n}\n\n/**\n * Result type for CreateQuery mutation calls - contains creation success status and query data\n */\nexport interface CreateQueryResult {\n /**\n * Whether the query creation was successful\n */\n Success: boolean;\n /**\n * Error message if the creation failed (optional)\n */\n ErrorMessage?: string;\n /**\n * Unique identifier of the created query (optional)\n */\n ID?: string;\n /**\n * Display name of the created query (optional)\n */\n Name?: string;\n /**\n * Description of the created query (optional)\n */\n Description?: string;\n /**\n * Category ID the query belongs to (optional)\n */\n CategoryID?: string;\n /**\n * Category name the query belongs to (optional)\n */\n Category?: string;\n /**\n * SQL query text (optional)\n */\n SQL?: string;\n /**\n * Query status: Pending, Approved, Rejected, or Expired (optional)\n */\n Status?: string;\n /**\n * Quality rank indicator (optional)\n */\n QualityRank?: number;\n /**\n * Embedding vector for semantic search (optional)\n */\n EmbeddingVector?: string;\n /**\n * ID of the embedding model used (optional)\n */\n EmbeddingModelID?: string;\n /**\n * Name of the embedding model used (optional)\n */\n EmbeddingModelName?: string;\n /**\n * Array of fields discovered in the query (optional)\n */\n Fields?: QueryField[];\n /**\n * Array of parameters found in the query template (optional)\n */\n Parameters?: QueryParameter[];\n /**\n * Array of entities referenced by the query (optional)\n */\n Entities?: QueryEntity[];\n /**\n * Array of permissions created for the query (optional)\n */\n Permissions?: QueryPermission[];\n}\n\n/**\n * Input type for UpdateQuery mutation calls - updates an existing query\n */\nexport interface UpdateQueryInput {\n /**\n * Required ID of the query to update\n */\n ID: string;\n /**\n * Optional name for the query (must be unique within category)\n */\n Name?: string;\n /**\n * Optional category ID to move the query to\n */\n CategoryID?: string;\n /**\n * Optional category path for automatic hierarchy creation (e.g., \"Reports/Sales/Monthly\") - takes precedence over CategoryID\n */\n CategoryPath?: string;\n /**\n * Optional natural language question this query answers\n */\n UserQuestion?: string;\n /**\n * Optional general description of what the query does\n */\n Description?: string;\n /**\n * Optional SQL query text to execute (can contain Nunjucks template syntax)\n */\n SQL?: string;\n /**\n * Optional technical documentation for developers\n */\n TechnicalDescription?: string;\n /**\n * Optional original SQL before optimization or modification\n */\n OriginalSQL?: string;\n /**\n * Optional user feedback about the query\n */\n Feedback?: string;\n /**\n * Optional query approval status\n */\n Status?: 'Pending' | 'Approved' | 'Rejected' | 'Expired';\n /**\n * Optional quality indicator (higher = better quality)\n */\n QualityRank?: number;\n /**\n * Optional execution cost indicator (higher = more expensive to run)\n */\n ExecutionCostRank?: number;\n /**\n * Optional flag indicating if the query uses Nunjucks template syntax\n */\n UsesTemplate?: boolean;\n /**\n * Optional array of permissions to update for the query (replaces existing permissions)\n */\n Permissions?: QueryPermissionInput[];\n}\n\n/**\n * Result type for UpdateQuery mutation calls - contains update success status and query data\n */\nexport interface UpdateQueryResult {\n /**\n * Whether the query update was successful\n */\n Success: boolean;\n /**\n * Error message if the update failed (optional)\n */\n ErrorMessage?: string;\n /**\n * Unique identifier of the updated query (optional)\n */\n ID?: string;\n /**\n * Display name of the updated query (optional)\n */\n Name?: string;\n /**\n * Description of the updated query (optional)\n */\n Description?: string;\n /**\n * Category ID the query belongs to (optional)\n */\n CategoryID?: string;\n /**\n * Category name the query belongs to (optional)\n */\n Category?: string;\n /**\n * SQL query text (optional)\n */\n SQL?: string;\n /**\n * Query status: Pending, Approved, Rejected, or Expired (optional)\n */\n Status?: string;\n /**\n * Quality rank indicator (optional)\n */\n QualityRank?: number;\n /**\n * Embedding vector for semantic search (optional)\n */\n EmbeddingVector?: string;\n /**\n * ID of the embedding model used (optional)\n */\n EmbeddingModelID?: string;\n /**\n * Name of the embedding model used (optional)\n */\n EmbeddingModelName?: string;\n /**\n * Array of fields discovered in the query (optional)\n */\n Fields?: QueryField[];\n /**\n * Array of parameters found in the query template (optional)\n */\n Parameters?: QueryParameter[];\n /**\n * Array of entities referenced by the query (optional)\n */\n Entities?: QueryEntity[];\n /**\n * Array of permissions for the query (optional)\n */\n Permissions?: QueryPermission[];\n}\n\n/**\n * Delete options input type for controlling delete behavior\n */\nexport interface DeleteQueryOptionsInput {\n /**\n * Whether to skip AI actions during deletion\n */\n SkipEntityAIActions: boolean;\n /**\n * Whether to skip regular entity actions during deletion\n */\n SkipEntityActions: boolean;\n}\n\n/**\n * Result type for DeleteQuery mutation calls - contains deletion success status and deleted query data\n */\nexport interface DeleteQueryResult {\n /**\n * Whether the query deletion was successful\n */\n Success: boolean;\n /**\n * Error message if the deletion failed (optional)\n */\n ErrorMessage?: string;\n /**\n * Unique identifier of the deleted query (optional)\n */\n ID?: string;\n /**\n * Display name of the deleted query (optional)\n */\n Name?: string;\n}\n\n ","import { ActionParam, ActionResult, EntityActionInvocationParams, EntityActionResult } from \"@memberjunction/actions-base\";\nimport { CompositeKey, LogError } from \"@memberjunction/core\";\nimport { GraphQLDataProvider } from \"./graphQLDataProvider\";\nimport { gql } from \"graphql-request\";\n\n/**\n * Client for executing actions and entity actions through GraphQL.\n * This class provides an easy way to execute actions from a client application,\n * similar to how the ActionEngine and EntityActionEngine work on the server.\n * \n * The GraphQLActionClient follows the same naming convention as other GraphQL clients\n * in the MemberJunction ecosystem, such as GraphQLSystemUserClient.\n * \n * @example\n * ```typescript\n * // Create the client\n * const actionClient = new GraphQLActionClient(graphQLProvider);\n * \n * // Run a regular action\n * const result = await actionClient.RunAction(\"action-id\", [\n * { Name: \"parameter1\", Value: \"value1\", Type: \"Input\" }\n * ]);\n * \n * // Run an entity action\n * const entityActionResult = await actionClient.RunEntityAction({\n * EntityAction: action,\n * InvocationType: { Name: \"SingleRecord\" },\n * EntityObject: entityObject,\n * ContextUser: user\n * });\n * ```\n */\nexport class GraphQLActionClient {\n /**\n * The GraphQLDataProvider instance used to execute GraphQL requests\n * @private\n */\n private _dataProvider: GraphQLDataProvider;\n\n /**\n * Creates a new GraphQLActionClient instance.\n * @param dataProvider The GraphQL data provider to use for queries\n */\n constructor(dataProvider: GraphQLDataProvider) {\n this._dataProvider = dataProvider;\n }\n\n /**\n * Run an action by its ID with the specified parameters.\n * \n * This method invokes an action on the server through GraphQL and returns the result.\n * Action parameters are automatically serialized as needed, and results are deserialized\n * for complex data types.\n * \n * @param actionID The ID of the action to run\n * @param params Optional parameters to pass to the action\n * @param skipActionLog Whether to skip logging the action execution (defaults to false)\n * @returns A Promise that resolves to an ActionResult object containing the result of running the action\n * \n * @example\n * ```typescript\n * const result = await actionClient.RunAction(\"action-id\", [\n * { Name: \"param1\", Value: \"value1\", Type: \"Input\" }\n * ]);\n * \n * if (result.Success) {\n * // Action was successful\n * console.log(result.Message);\n * }\n * ```\n */\n public async RunAction(\n actionID: string, \n params?: ActionParam[], \n skipActionLog: boolean = false\n ): Promise<ActionResult> {\n try {\n // Prepare the input variables\n const serializedParams = this.serializeActionParameters(params);\n const variables = this.createActionVariables(actionID, serializedParams, skipActionLog);\n \n // Execute the mutation\n const result = await this.executeActionMutation(variables);\n \n // Process the result\n return this.processActionResult(result, params);\n } catch (e) {\n return this.handleActionError(e, params);\n }\n }\n\n /**\n * Serializes action parameters to ensure complex objects are properly JSON-encoded\n * @param params The action parameters to serialize\n * @returns The serialized parameters\n * @private\n */\n private serializeActionParameters(params?: ActionParam[]): any[] | undefined {\n if (!params) {\n return undefined;\n }\n\n return params.map(p => {\n let value = p.Value;\n if (value !== null && value !== undefined && typeof value === 'object') {\n value = JSON.stringify(value);\n }\n return {\n ...p,\n Value: value\n };\n });\n }\n\n /**\n * Creates the variables for the action mutation\n * @param actionID The ID of the action to run\n * @param params The serialized action parameters\n * @param skipActionLog Whether to skip action logging\n * @returns The action variables\n * @private\n */\n private createActionVariables(\n actionID: string, \n params?: any[], \n skipActionLog: boolean = false\n ): any {\n return {\n input: {\n ActionID: actionID,\n Params: params,\n SkipActionLog: skipActionLog\n }\n };\n }\n\n /**\n * Executes the action mutation\n * @param variables The variables for the mutation\n * @returns The result of the mutation\n * @private\n */\n private async executeActionMutation(variables: any): Promise<any> {\n const mutation = gql`\n mutation RunAction($input: RunActionInput!) {\n RunAction(input: $input) {\n Success\n Message\n ResultCode\n ResultData\n }\n }\n `;\n\n return await this._dataProvider.ExecuteGQL(mutation, variables);\n }\n\n /**\n * Processes the result of an action\n * @param result The result from the GraphQL query\n * @param originalParams The original parameters passed to the action\n * @returns The processed action result\n * @private\n */\n private processActionResult(result: any, originalParams?: ActionParam[]): ActionResult {\n if (!result?.RunAction) {\n throw new Error(\"Invalid response from server\");\n }\n\n // Parse the ResultData if it exists\n let resultData = undefined;\n try {\n if (result.RunAction.ResultData) {\n resultData = JSON.parse(result.RunAction.ResultData);\n }\n } catch (e) {\n LogError(`Failed to parse action result data: ${e}`);\n }\n\n // Return a properly formatted ActionResult\n return {\n Success: result.RunAction.Success,\n Message: result.RunAction.Message,\n Result: resultData,\n LogEntry: null, // We don't return the log entry to clients\n Params: originalParams || [],\n RunParams: null // We don't return the run params to clients\n };\n }\n\n /**\n * Handles errors in the action execution\n * @param e The error\n * @param originalParams The original parameters passed to the action\n * @returns An error result\n * @private\n */\n private handleActionError(e: unknown, originalParams?: ActionParam[]): ActionResult {\n const error = e as Error;\n LogError(`Error running action: ${error}`);\n return {\n Success: false,\n Message: `Error: ${error.message}`,\n Result: null,\n LogEntry: null,\n Params: originalParams || [],\n RunParams: null\n };\n }\n\n /**\n * Run an entity action with the specified parameters.\n * \n * This method invokes an entity action on the server through GraphQL and returns the result.\n * Entity actions are operations that can be performed on entity records, such as validation,\n * business logic, or custom processing. They can operate on a single record, a view, or a list.\n * \n * @param params The parameters for the entity action, including the action to run, \n * invocation type, entity object or view/list IDs, and optional parameters\n * @returns A Promise that resolves to an EntityActionResult object containing the result\n * \n * @example\n * ```typescript\n * // Run an entity action on a single record\n * const result = await actionClient.RunEntityAction({\n * EntityAction: action,\n * InvocationType: { Name: \"SingleRecord\" },\n * EntityObject: entityObject,\n * ContextUser: user\n * });\n * \n * // Run an entity action on a view\n * const viewResult = await actionClient.RunEntityAction({\n * EntityAction: action,\n * InvocationType: { Name: \"View\" },\n * ViewID: \"view-id\",\n * ContextUser: user\n * });\n * ```\n */\n public async RunEntityAction(params: EntityActionInvocationParams): Promise<EntityActionResult> {\n try {\n // Create the GraphQL input\n const input = this.createEntityActionInput(params);\n\n // Execute the GraphQL mutation\n const result = await this.executeEntityActionMutation(input);\n\n // Process the result\n return this.processEntityActionResult(result);\n } catch (e) {\n return this.handleEntityActionError(e);\n }\n }\n\n /**\n * Creates the GraphQL input for an entity action\n * @param params The entity action parameters\n * @returns The GraphQL input\n * @private\n */\n private createEntityActionInput(params: EntityActionInvocationParams): any {\n const input: any = {\n EntityActionID: params.EntityAction.ID,\n InvocationType: params.InvocationType.Name,\n ListID: params.ListID,\n ViewID: params.ViewID,\n };\n \n // Add parameters if available\n if ((params as any).Params) {\n input.Params = this.convertActionParams((params as any).Params);\n }\n \n // Add entity information if available\n if (params.EntityObject) {\n this.addEntityInformation(input, params.EntityObject);\n }\n\n return input;\n }\n\n /**\n * Converts action parameters to the format expected by the GraphQL API\n * @param params The action parameters\n * @returns The converted parameters\n * @private\n */\n private convertActionParams(params: any[]): any[] {\n return params.map(p => {\n let value = p.Value;\n if (value !== null && value !== undefined && typeof value === 'object') {\n value = JSON.stringify(value);\n }\n return {\n Name: p.Name,\n Value: value,\n Type: p.Type\n };\n });\n }\n\n /**\n * Adds entity information to the input object\n * @param input The input object to add to\n * @param entityObject The entity object\n * @private\n */\n private addEntityInformation(input: any, entityObject: any): void {\n // Prefer using entity name instead of ID for better code readability\n input.EntityName = entityObject.EntityInfo?.Name;\n \n // Convert the entity's primary key to the expected format\n if (entityObject.PrimaryKey) {\n input.PrimaryKey = this.convertPrimaryKey(entityObject.PrimaryKey);\n }\n }\n\n /**\n * Converts a primary key object to the format expected by the GraphQL API\n * @param primaryKey The primary key object\n * @returns The converted primary key\n * @private\n */\n private convertPrimaryKey(primaryKey: any): any {\n return {\n KeyValuePairs: primaryKey.KeyValuePairs.map(kvp => this.convertKeyValuePair(kvp))\n };\n }\n\n /**\n * Converts a key-value pair to a string format\n * @param kvp The key-value pair\n * @returns The converted key-value pair\n * @private\n */\n private convertKeyValuePair(kvp: any): any {\n return {\n FieldName: kvp.FieldName,\n Value: kvp.Value !== null && kvp.Value !== undefined ? \n (typeof kvp.Value === 'object' ? JSON.stringify(kvp.Value) : kvp.Value.toString()) \n : null\n };\n }\n\n /**\n * Executes the GraphQL mutation for an entity action\n * @param input The GraphQL input\n * @returns The GraphQL result\n * @private\n */\n private async executeEntityActionMutation(input: any): Promise<any> {\n const mutation = gql`\n mutation RunEntityAction($input: EntityActionInput!) {\n RunEntityAction(input: $input) {\n Success\n Message\n ResultData\n }\n }\n `;\n\n return await this._dataProvider.ExecuteGQL(mutation, { input });\n }\n\n /**\n * Processes the result of an entity action\n * @param result The GraphQL result\n * @returns The processed entity action result\n * @private\n */\n private processEntityActionResult(result: any): EntityActionResult {\n if (!result?.RunEntityAction) {\n throw new Error(\"Invalid response from server\");\n }\n\n // Parse the ResultData\n let resultData = {};\n try {\n if (result.RunEntityAction.ResultData) {\n resultData = JSON.parse(result.RunEntityAction.ResultData);\n }\n } catch (e) {\n LogError(`Failed to parse entity action result data: ${e}`);\n }\n\n // Return a properly formatted EntityActionResult\n return {\n Success: result.RunEntityAction.Success,\n Message: result.RunEntityAction.Message,\n RunParams: null, // We don't return run params to clients\n LogEntry: null, // We don't return the log entry to clients\n ...resultData\n };\n }\n\n /**\n * Handles errors in the entity action\n * @param e The error\n * @returns An error result\n * @private\n */\n private handleEntityActionError(e: unknown): EntityActionResult {\n const error = e as Error;\n LogError(`Error running entity action: ${error}`);\n return {\n Success: false,\n Message: `Error: ${error.message}`,\n RunParams: null,\n LogEntry: null\n };\n }\n}","import { LogError } from \"@memberjunction/core\";\nimport { GraphQLDataProvider } from \"./graphQLDataProvider\";\nimport { gql } from \"graphql-request\";\nimport { SafeJSONParse } from \"@memberjunction/global\";\n\n/**\n * Parameters for running a test\n */\nexport interface RunTestParams {\n testId: string;\n verbose?: boolean;\n environment?: string;\n onProgress?: (progress: TestExecutionProgress) => void;\n}\n\n/**\n * Result from running a test\n */\nexport interface RunTestResult {\n success: boolean;\n errorMessage?: string;\n executionTimeMs?: number;\n result: any; // Parsed TestRunResult from engine\n}\n\n/**\n * Parameters for running a test suite\n */\nexport interface RunTestSuiteParams {\n suiteId: string;\n verbose?: boolean;\n environment?: string;\n parallel?: boolean;\n onProgress?: (progress: TestExecutionProgress) => void;\n}\n\n/**\n * Result from running a test suite\n */\nexport interface RunTestSuiteResult {\n success: boolean;\n errorMessage?: string;\n executionTimeMs?: number;\n result: any; // Parsed TestSuiteRunResult from engine\n}\n\n/**\n * Test execution progress update\n */\nexport interface TestExecutionProgress {\n currentStep: string;\n percentage: number;\n message: string;\n testName?: string;\n driverType?: string;\n oracleEvaluation?: string;\n}\n\n/**\n * Client for executing tests through GraphQL.\n * This class provides an easy way to run tests and test suites from a client application.\n *\n * @example\n * ```typescript\n * // Create the client\n * const testingClient = new GraphQLTestingClient(graphQLProvider);\n *\n * // Run a test\n * const result = await testingClient.RunTest({\n * testId: \"test-uuid\",\n * verbose: true,\n * environment: \"dev\"\n * });\n *\n * // Run a test suite\n * const suiteResult = await testingClient.RunTestSuite({\n * suiteId: \"suite-uuid\",\n * parallel: true\n * });\n * ```\n */\nexport class GraphQLTestingClient {\n private _dataProvider: GraphQLDataProvider;\n\n /**\n * Creates a new GraphQLTestingClient instance.\n * @param dataProvider The GraphQL data provider to use for queries\n */\n constructor(dataProvider: GraphQLDataProvider) {\n this._dataProvider = dataProvider;\n }\n\n /**\n * Run a single test with the specified parameters.\n *\n * This method invokes a test on the server through GraphQL and returns the result.\n * If a progress callback is provided in params.onProgress, this method will subscribe\n * to real-time progress updates from the GraphQL server and forward them to the callback.\n *\n * @param params The parameters for running the test\n * @returns A Promise that resolves to a RunTestResult object\n *\n * @example\n * ```typescript\n * const result = await testingClient.RunTest({\n * testId: \"test-uuid\",\n * verbose: true,\n * environment: \"staging\",\n * onProgress: (progress) => {\n * console.log(`${progress.currentStep}: ${progress.message} (${progress.percentage}%)`);\n * }\n * });\n *\n * if (result.success) {\n * console.log('Test passed!', result.result);\n * } else {\n * console.error('Test failed:', result.errorMessage);\n * }\n * ```\n */\n public async RunTest(params: RunTestParams): Promise<RunTestResult> {\n let subscription: any;\n\n try {\n // Subscribe to progress updates if callback provided\n if (params.onProgress) {\n subscription = this._dataProvider.PushStatusUpdates(this._dataProvider.sessionId)\n .subscribe((message: string) => {\n try {\n const parsed = JSON.parse(message);\n\n // Filter for TestExecutionProgress messages from RunTestResolver\n if (parsed.resolver === 'RunTestResolver' &&\n parsed.type === 'TestExecutionProgress' &&\n parsed.status === 'ok' &&\n parsed.data?.progress) {\n\n // Forward progress to callback\n params.onProgress!(parsed.data.progress);\n }\n } catch (e) {\n console.error('[GraphQLTestingClient] Failed to parse progress message:', e);\n }\n });\n }\n\n const mutation = gql`\n mutation RunTest(\n $testId: String!,\n $verbose: Boolean,\n $environment: String\n ) {\n RunTest(\n testId: $testId,\n verbose: $verbose,\n environment: $environment\n ) {\n success\n errorMessage\n executionTimeMs\n result\n }\n }\n `;\n\n const variables = {\n testId: params.testId,\n verbose: params.verbose,\n environment: params.environment\n };\n\n const result = await this._dataProvider.ExecuteGQL(mutation, variables);\n return this.processTestResult(result.RunTest);\n\n } catch (e) {\n return this.handleError(e, 'RunTest');\n } finally {\n // Always clean up subscription\n if (subscription) {\n subscription.unsubscribe();\n }\n }\n }\n\n /**\n * Run a test suite with the specified parameters.\n *\n * If a progress callback is provided in params.onProgress, this method will subscribe\n * to real-time progress updates from the GraphQL server and forward them to the callback.\n *\n * @param params The parameters for running the test suite\n * @returns A Promise that resolves to a RunTestSuiteResult object\n *\n * @example\n * ```typescript\n * const result = await testingClient.RunTestSuite({\n * suiteId: \"suite-uuid\",\n * parallel: true,\n * verbose: false,\n * onProgress: (progress) => {\n * console.log(`Progress: ${progress.message} (${progress.percentage}%)`);\n * }\n * });\n *\n * console.log(`Suite: ${result.result.totalTests} tests run`);\n * console.log(`Passed: ${result.result.passedTests}`);\n * ```\n */\n public async RunTestSuite(params: RunTestSuiteParams): Promise<RunTestSuiteResult> {\n let subscription: any;\n\n try {\n // Subscribe to progress updates if callback provided\n if (params.onProgress) {\n subscription = this._dataProvider.PushStatusUpdates(this._dataProvider.sessionId)\n .subscribe((message: string) => {\n try {\n const parsed = JSON.parse(message);\n\n // Filter for TestExecutionProgress messages from RunTestResolver\n if (parsed.resolver === 'RunTestResolver' &&\n parsed.type === 'TestExecutionProgress' &&\n parsed.status === 'ok' &&\n parsed.data?.progress) {\n\n // Forward progress to callback\n params.onProgress!(parsed.data.progress);\n }\n } catch (e) {\n console.error('[GraphQLTestingClient] Failed to parse progress message:', e);\n }\n });\n }\n\n const mutation = gql`\n mutation RunTestSuite(\n $suiteId: String!,\n $verbose: Boolean,\n $environment: String,\n $parallel: Boolean\n ) {\n RunTestSuite(\n suiteId: $suiteId,\n verbose: $verbose,\n environment: $environment,\n parallel: $parallel\n ) {\n success\n errorMessage\n executionTimeMs\n result\n }\n }\n `;\n\n const variables = {\n suiteId: params.suiteId,\n verbose: params.verbose,\n environment: params.environment,\n parallel: params.parallel\n };\n\n const result = await this._dataProvider.ExecuteGQL(mutation, variables);\n return this.processSuiteResult(result.RunTestSuite);\n\n } catch (e) {\n return this.handleError(e, 'RunTestSuite');\n } finally {\n // Always clean up subscription\n if (subscription) {\n subscription.unsubscribe();\n }\n }\n }\n\n /**\n * Check if a test is currently running\n *\n * @param testId The test ID to check\n * @returns True if the test is running, false otherwise\n */\n public async IsTestRunning(testId: string): Promise<boolean> {\n try {\n const query = gql`\n query IsTestRunning($testId: String!) {\n IsTestRunning(testId: $testId)\n }\n `;\n\n const result = await this._dataProvider.ExecuteGQL(query, { testId });\n return result.IsTestRunning;\n\n } catch (e) {\n LogError(`Error checking test running status: ${(e as Error).message}`);\n return false;\n }\n }\n\n // ===== Helper Methods =====\n\n private processTestResult(result: any): RunTestResult {\n if (!result) {\n throw new Error(\"Invalid response from server\");\n }\n\n let parsedResult: any;\n try {\n parsedResult = SafeJSONParse(result.result);\n } catch (e) {\n parsedResult = result.result;\n }\n\n return {\n success: result.success,\n errorMessage: result.errorMessage,\n executionTimeMs: result.executionTimeMs,\n result: parsedResult\n };\n }\n\n private processSuiteResult(result: any): RunTestSuiteResult {\n if (!result) {\n throw new Error(\"Invalid response from server\");\n }\n\n let parsedResult: any;\n try {\n parsedResult = SafeJSONParse(result.result);\n } catch (e) {\n parsedResult = result.result;\n }\n\n return {\n success: result.success,\n errorMessage: result.errorMessage,\n executionTimeMs: result.executionTimeMs,\n result: parsedResult\n };\n }\n\n private handleError(error: any, operation: string): any {\n const errorMsg = (error as Error).message;\n LogError(`${operation} failed: ${errorMsg}`);\n\n return {\n success: false,\n errorMessage: errorMsg,\n result: null\n };\n }\n}\n","import { LogError } from \"@memberjunction/core\";\nimport { GraphQLDataProvider } from \"./graphQLDataProvider\";\nimport { gql } from \"graphql-request\";\nimport { ComponentSpec } from \"@memberjunction/interactive-component-types\";\n\n/**\n * Parameters for getting a component from registry\n */\nexport interface GetRegistryComponentParams {\n /**\n * Registry name (globally unique)\n */\n registryName: string;\n \n /**\n * Component namespace\n */\n namespace: string;\n \n /**\n * Component name\n */\n name: string;\n \n /**\n * Component version (optional, defaults to 'latest')\n */\n version?: string;\n \n /**\n * Optional hash for caching - if provided and matches, returns null\n */\n hash?: string;\n}\n\n/**\n * Response from GetRegistryComponent with hash and caching metadata\n */\nexport interface ComponentSpecWithHash {\n /**\n * The component specification (undefined if not modified)\n */\n specification?: ComponentSpec | string; // Can be either parsed object or JSON string\n \n /**\n * SHA-256 hash of the specification\n */\n hash: string;\n \n /**\n * Indicates if the component was not modified (304 response)\n */\n notModified: boolean;\n \n /**\n * Optional message from server\n */\n message?: string;\n}\n\n/**\n * Parameters for searching registry components\n */\nexport interface SearchRegistryComponentsParams {\n /**\n * Optional registry name filter\n */\n registryName?: string;\n \n /**\n * Optional namespace filter\n */\n namespace?: string;\n \n /**\n * Search query string\n */\n query?: string;\n \n /**\n * Component type filter\n */\n type?: string;\n \n /**\n * Tags to filter by\n */\n tags?: string[];\n \n /**\n * Maximum number of results\n */\n limit?: number;\n \n /**\n * Offset for pagination\n */\n offset?: number;\n}\n\n/**\n * Search result for registry components\n */\nexport interface RegistryComponentSearchResult {\n /**\n * Array of matching components\n */\n components: ComponentSpec[];\n \n /**\n * Total number of matches\n */\n total: number;\n \n /**\n * Current offset\n */\n offset: number;\n \n /**\n * Current limit\n */\n limit: number;\n}\n\n/**\n * Dependency tree for a component\n */\nexport interface ComponentDependencyTree {\n /**\n * Component ID\n */\n componentId: string;\n\n /**\n * Component name\n */\n name?: string;\n\n /**\n * Component namespace\n */\n namespace?: string;\n\n /**\n * Component version\n */\n version?: string;\n\n /**\n * Direct dependencies\n */\n dependencies?: ComponentDependencyTree[];\n\n /**\n * Whether this is a circular dependency\n */\n circular?: boolean;\n\n /**\n * Total count of all dependencies\n */\n totalCount?: number;\n}\n\n/**\n * Input parameters for sending component feedback\n */\nexport interface ComponentFeedbackParams {\n /**\n * Component name\n */\n componentName: string;\n\n /**\n * Component namespace\n */\n componentNamespace: string;\n\n /**\n * Component version (optional)\n */\n componentVersion?: string;\n\n /**\n * Registry name (optional - for registry-specific feedback)\n */\n registryName?: string;\n\n /**\n * Rating (typically 0-5 scale)\n */\n rating: number;\n\n /**\n * Type of feedback (optional)\n */\n feedbackType?: string;\n\n /**\n * User comments (optional)\n */\n comments?: string;\n\n /**\n * Associated conversation ID (optional)\n */\n conversationID?: string;\n\n /**\n * Associated conversation detail ID (optional)\n */\n conversationDetailID?: string;\n\n /**\n * Associated report ID (optional)\n */\n reportID?: string;\n\n /**\n * Associated dashboard ID (optional)\n */\n dashboardID?: string;\n}\n\n/**\n * Response from sending component feedback\n */\nexport interface ComponentFeedbackResponse {\n /**\n * Whether the feedback was successfully submitted\n */\n success: boolean;\n\n /**\n * ID of the created feedback record (if available)\n */\n feedbackID?: string;\n\n /**\n * Error message if submission failed\n */\n error?: string;\n}\n\n/**\n * Client for executing Component Registry operations through GraphQL.\n * This class provides an easy way to fetch components from external registries\n * through the MJ API server, which handles authentication and caching.\n * \n * The GraphQLComponentRegistryClient follows the same naming convention as other GraphQL clients\n * in the MemberJunction ecosystem, such as GraphQLAIClient and GraphQLActionClient.\n * \n * @example\n * ```typescript\n * // Create the client\n * const registryClient = new GraphQLComponentRegistryClient(graphQLProvider);\n * \n * // Get a component from a registry\n * const component = await registryClient.GetRegistryComponent({\n * registryName: \"MJ\",\n * namespace: \"core/ui\",\n * name: \"DataGrid\",\n * version: \"1.0.0\"\n * });\n * \n * // Search for components\n * const searchResult = await registryClient.SearchRegistryComponents({\n * query: \"dashboard\",\n * type: \"dashboard\",\n * limit: 10\n * });\n * ```\n */\nexport class GraphQLComponentRegistryClient {\n /**\n * The GraphQLDataProvider instance used to execute GraphQL requests\n * @private\n */\n private _dataProvider: GraphQLDataProvider;\n\n /**\n * Creates a new GraphQLComponentRegistryClient instance.\n * @param dataProvider The GraphQL data provider to use for queries\n */\n constructor(dataProvider: GraphQLDataProvider) {\n this._dataProvider = dataProvider;\n }\n\n /**\n * Get a specific component from a registry.\n * \n * This method fetches a component specification from an external registry\n * through the MJ API server. The server handles authentication with the\n * registry and may cache the result for performance.\n * \n * @param params The parameters for getting the component\n * @returns A Promise that resolves to a ComponentSpec\n * \n * @example\n * ```typescript\n * const component = await registryClient.GetRegistryComponent({\n * registryName: \"MJ\",\n * namespace: \"core/ui\",\n * name: \"DataGrid\",\n * version: \"2.0.0\"\n * });\n * \n * console.log('Component:', component.name);\n * console.log('Description:', component.description);\n * console.log('Code:', component.code);\n * ```\n */\n public async GetRegistryComponent(params: GetRegistryComponentParams): Promise<ComponentSpec | null> {\n try {\n // Build the query - specification is now a JSON string\n const query = gql`\n query GetRegistryComponent(\n $registryName: String!,\n $namespace: String!,\n $name: String!,\n $version: String,\n $hash: String\n ) {\n GetRegistryComponent(\n registryName: $registryName,\n namespace: $namespace,\n name: $name,\n version: $version,\n hash: $hash\n ) {\n hash\n notModified\n message\n specification\n }\n }\n `;\n\n // Prepare variables\n const variables: Record<string, any> = {\n registryName: params.registryName,\n namespace: params.namespace,\n name: params.name\n };\n\n if (params.version !== undefined) {\n variables.version = params.version;\n }\n \n if (params.hash !== undefined) {\n variables.hash = params.hash;\n }\n\n // Execute the query\n const result = await this._dataProvider.ExecuteGQL(query, variables);\n\n // Handle new response structure with hash\n if (result && result.GetRegistryComponent) {\n const response = result.GetRegistryComponent as ComponentSpecWithHash;\n \n // If not modified and no specification, return null (client should use cache)\n if (response.notModified && !response.specification) {\n return null;\n }\n \n // Parse the JSON string specification if available\n if (response.specification) {\n // If it's already an object, return it\n if (typeof response.specification === 'object') {\n return response.specification as ComponentSpec;\n }\n // Otherwise parse the JSON string\n try {\n return JSON.parse(response.specification) as ComponentSpec;\n } catch (e) {\n LogError(`Failed to parse component specification: ${e}`);\n return null;\n }\n }\n \n return null;\n }\n\n return null;\n } catch (e) {\n LogError(e);\n throw new Error(`Failed to get registry component: ${e instanceof Error ? e.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Get a component from registry with hash and caching metadata.\n * Returns the full response including hash and notModified flag.\n * \n * @param params - Parameters for fetching the component\n * @returns Full response with specification, hash, and caching metadata\n * \n * @example\n * ```typescript\n * const response = await client.GetRegistryComponentWithHash({\n * registryName: 'MJ',\n * namespace: 'core/ui',\n * name: 'DataGrid',\n * version: '1.0.0',\n * hash: 'abc123...'\n * });\n * \n * if (response.notModified) {\n * // Use cached version\n * } else {\n * // Use response.specification\n * }\n * ```\n */\n public async GetRegistryComponentWithHash(params: GetRegistryComponentParams): Promise<ComponentSpecWithHash> {\n try {\n // Build the query - same as GetRegistryComponent\n const query = gql`\n query GetRegistryComponent(\n $registryName: String!,\n $namespace: String!,\n $name: String!,\n $version: String,\n $hash: String\n ) {\n GetRegistryComponent(\n registryName: $registryName,\n namespace: $namespace,\n name: $name,\n version: $version,\n hash: $hash\n ) {\n hash\n notModified\n message\n specification\n }\n }\n `;\n\n // Prepare variables\n const variables: Record<string, any> = {\n registryName: params.registryName,\n namespace: params.namespace,\n name: params.name\n };\n\n if (params.version !== undefined) {\n variables.version = params.version;\n }\n \n if (params.hash !== undefined) {\n variables.hash = params.hash;\n }\n\n // Execute the query\n const result = await this._dataProvider.ExecuteGQL(query, variables);\n\n // Return the full response with parsed specification\n if (result && result.GetRegistryComponent) {\n const response = result.GetRegistryComponent;\n let spec: ComponentSpec | undefined;\n if (response.specification) {\n try {\n spec = JSON.parse(response.specification) as ComponentSpec;\n } catch (e) {\n LogError(`Failed to parse component specification in GetRegistryComponentWithHash: ${e}`);\n spec = undefined;\n }\n }\n return {\n specification: spec,\n hash: response.hash,\n notModified: response.notModified,\n message: response.message\n } as ComponentSpecWithHash;\n }\n\n // Return empty response if nothing found\n return {\n specification: undefined,\n hash: '',\n notModified: false,\n message: 'Component not found'\n };\n } catch (e) {\n LogError(e);\n throw new Error(`Failed to get registry component with hash: ${e instanceof Error ? e.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Search for components in registries.\n * \n * This method searches for components across one or more registries\n * based on the provided criteria. Results are paginated for performance.\n * \n * @param params The search parameters\n * @returns A Promise that resolves to a RegistryComponentSearchResult\n * \n * @example\n * ```typescript\n * const searchResult = await registryClient.SearchRegistryComponents({\n * query: \"dashboard\",\n * type: \"dashboard\",\n * tags: [\"analytics\", \"reporting\"],\n * limit: 20,\n * offset: 0\n * });\n * \n * console.log(`Found ${searchResult.total} components`);\n * searchResult.components.forEach(component => {\n * console.log(`- ${component.name}: ${component.description}`);\n * });\n * ```\n */\n public async SearchRegistryComponents(params: SearchRegistryComponentsParams): Promise<RegistryComponentSearchResult> {\n try {\n // Build the query\n const query = gql`\n query SearchRegistryComponents($params: SearchRegistryComponentsInput!) {\n SearchRegistryComponents(params: $params) {\n components\n total\n offset\n limit\n }\n }\n `;\n\n // Execute the query\n const result = await this._dataProvider.ExecuteGQL(query, { params });\n\n // Return the search result with parsed components\n if (result && result.SearchRegistryComponents) {\n const searchResult = result.SearchRegistryComponents;\n return {\n components: searchResult.components.map((json: string) => JSON.parse(json) as ComponentSpec),\n total: searchResult.total,\n offset: searchResult.offset,\n limit: searchResult.limit\n } as RegistryComponentSearchResult;\n }\n\n return {\n components: [],\n total: 0,\n offset: 0,\n limit: params.limit || 10\n };\n } catch (e) {\n LogError(e);\n throw new Error(`Failed to search registry components: ${e instanceof Error ? e.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Resolve the dependency tree for a component.\n * \n * This method fetches the complete dependency tree for a component,\n * including all transitive dependencies. The server handles circular\n * dependency detection and marks them appropriately.\n * \n * @param registryId The registry ID\n * @param componentId The component ID\n * @returns A Promise that resolves to a ComponentDependencyTree\n * \n * @example\n * ```typescript\n * const dependencyTree = await registryClient.ResolveComponentDependencies(\n * \"mj-central\",\n * \"component-123\"\n * );\n * \n * console.log(`Component has ${dependencyTree.totalCount} total dependencies`);\n * if (dependencyTree.circular) {\n * console.warn('Circular dependency detected!');\n * }\n * ```\n */\n public async ResolveComponentDependencies(\n registryId: string,\n componentId: string\n ): Promise<ComponentDependencyTree | null> {\n try {\n // Build the query\n const query = gql`\n query ResolveComponentDependencies(\n $registryId: String!,\n $componentId: String!\n ) {\n ResolveComponentDependencies(\n registryId: $registryId,\n componentId: $componentId\n ) {\n componentId\n name\n namespace\n version\n circular\n totalCount\n dependencies {\n componentId\n name\n namespace\n version\n circular\n totalCount\n }\n }\n }\n `;\n\n // Execute the query\n const result = await this._dataProvider.ExecuteGQL(query, {\n registryId,\n componentId\n });\n\n // Return the dependency tree\n if (result && result.ResolveComponentDependencies) {\n return result.ResolveComponentDependencies as ComponentDependencyTree;\n }\n\n return null;\n } catch (e) {\n LogError(e);\n throw new Error(`Failed to resolve component dependencies: ${e instanceof Error ? e.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Check if a specific version of a component exists in a registry.\n * \n * @param params The parameters for checking component existence\n * @returns A Promise that resolves to true if the component exists, false otherwise\n * \n * @example\n * ```typescript\n * const exists = await registryClient.ComponentExists({\n * registryId: \"mj-central\",\n * namespace: \"core/ui\",\n * name: \"DataGrid\",\n * version: \"2.0.0\"\n * });\n * \n * if (exists) {\n * console.log('Component is available');\n * }\n * ```\n */\n public async ComponentExists(params: GetRegistryComponentParams): Promise<boolean> {\n try {\n const component = await this.GetRegistryComponent(params);\n return component !== null;\n } catch (e) {\n // If we get an error, assume the component doesn't exist\n return false;\n }\n }\n\n /**\n * Get the latest version of a component.\n * \n * @param registryId The registry ID\n * @param namespace The component namespace\n * @param name The component name\n * @returns A Promise that resolves to the latest version string or null\n * \n * @example\n * ```typescript\n * const latestVersion = await registryClient.GetLatestVersion(\n * \"mj-central\",\n * \"core/ui\",\n * \"DataGrid\"\n * );\n * \n * console.log(`Latest version: ${latestVersion}`);\n * ```\n */\n public async GetLatestVersion(\n registryName: string,\n namespace: string,\n name: string\n ): Promise<string | null> {\n try {\n const component = await this.GetRegistryComponent({\n registryName,\n namespace,\n name,\n version: 'latest'\n });\n\n return component?.version || null;\n } catch (e) {\n LogError(e);\n return null;\n }\n }\n\n /**\n * Send feedback for a component.\n *\n * This is a registry-agnostic method that allows submitting feedback\n * for any component from any registry. The feedback can include ratings,\n * comments, and associations with conversations, reports, or dashboards.\n *\n * @param params The feedback parameters\n * @returns A Promise that resolves to a ComponentFeedbackResponse\n *\n * @example\n * ```typescript\n * const response = await registryClient.SendComponentFeedback({\n * componentName: 'DataGrid',\n * componentNamespace: 'core/ui',\n * componentVersion: '1.0.0',\n * registryName: 'MJ',\n * rating: 5,\n * feedbackType: 'feature-request',\n * comments: 'Would love to see export to Excel functionality',\n * conversationID: 'conv-123'\n * });\n *\n * if (response.success) {\n * console.log('Feedback submitted successfully!');\n * if (response.feedbackID) {\n * console.log(`Feedback ID: ${response.feedbackID}`);\n * }\n * } else {\n * console.error('Feedback submission failed:', response.error);\n * }\n * ```\n */\n public async SendComponentFeedback(params: ComponentFeedbackParams): Promise<ComponentFeedbackResponse> {\n try {\n // Build the mutation\n const mutation = gql`\n mutation SendComponentFeedback($feedback: ComponentFeedbackInput!) {\n SendComponentFeedback(feedback: $feedback) {\n success\n feedbackID\n error\n }\n }\n `;\n\n // Execute the mutation\n const result = await this._dataProvider.ExecuteGQL(mutation, { feedback: params });\n\n // Return the response\n if (result && result.SendComponentFeedback) {\n return result.SendComponentFeedback as ComponentFeedbackResponse;\n }\n\n return {\n success: false,\n error: 'No response from server'\n };\n } catch (e) {\n LogError(e);\n return {\n success: false,\n error: e instanceof Error ? e.message : 'Unknown error'\n };\n }\n }\n}"],"names":["TransactionGroupBase","gql","SafeJSONParse","TransactionResult","LogError","LogStatusEx","ProviderConfigDataBase","ProviderBase","uuidv4","UserInfo","ViewInfo","ProviderType","BaseEntityResult","EntityFieldTSType","TransactionItem","GraphQLClient","UserRoleInfo","createClient","Observable","Subject","Subscription","openDB","SetProvider","MJGlobal","MJEventType","IsVerboseLoggingEnabled"],"mappings":"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CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,CAAC,CAAC;AACf,MAAM,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;AACjE,MAAM,IAAI,MAAM,IAAI,MAAM,CAAC,qBAAqB,EAAE;AAClD,QAAQ,OAAO,MAAM,CAAC,qBAAqB,CAAC;AAC5C,OAAO,MAAM;AACb,QAAQ,OAAO;AACf,UAAU,OAAO,EAAE,KAAK;AACxB,UAAU,YAAY,EAAE,wBAAwB;AAChD,SAAS,CAAC;AACV,OAAO;AACP,KAAK,CAAC,OAAO,CAAC,EAAE;AAChB,MAAMA,aAAQ,CAAC,CAAC,8DAA8D,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACrF,MAAM,OAAO;AACb,QAAQ,OAAO,EAAE,KAAK;AACtB,QAAQ,YAAY,EAAE,CAAC,CAAC,QAAQ,EAAE;AAClC,OAAO,CAAC;AACR,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,EAAE,MAAM,WAAW,CAAC,KAAK,EAAE;AAC3B,IAAI,IAAI;AACR,MAAM,MAAM,KAAK,GAAG,CAAC;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,CAAC,CAAC;AACf,MAAM,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EA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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/FieldMapper.ts","../src/graphQLTransactionGroup.ts","../src/graphQLAIClient.ts","../src/graphQLDataProvider.ts","../src/config.ts","../src/rolesAndUsersType.ts","../src/graphQLSystemUserClient.ts","../src/graphQLActionClient.ts","../src/graphQLTestingClient.ts","../src/GraphQLComponentRegistryClient.ts"],"sourcesContent":["import { RegisterClass } from '@memberjunction/global';\n\n/**\n * FieldMapper is used to map fields from one name to another. This is useful when we need to map\n * fields from one system to another, or when we need to map fields from one version of a system\n * to another. Uses an internal field mapping but may be overridden or extended as needed.\n */\nexport class FieldMapper {\n private _fieldMap: Record<string, string> = {\n __mj_CreatedAt: '_mj__CreatedAt',\n __mj_UpdatedAt: '_mj__UpdatedAt',\n __mj_DeletedAt: '_mj__DeletedAt',\n };\n\n /**\n * Creates a new FieldMapper instance.\n * @param fieldMap An optional field map to use for mapping fields. If not provided, the default field map will be used.\n */\n constructor() {}\n\n /**\n * Maps fields from one name to another mutating the object in place.\n * @param obj The object to mutate\n */\n public MapFields(obj?: Record<string, unknown>) {\n if (obj) {\n for (const k in obj) {\n if (k in this._fieldMap) {\n obj[this._fieldMap[k]] = obj[k];\n delete obj[k];\n }\n }\n }\n return obj;\n }\n\n /**\n * Maps a field name from one name to another.\n * @param fieldName The field name to map.\n * @returns The mapped field name, or the original field name if no mapping is found.\n */\n public MapFieldName(fieldName: string): string {\n return this._fieldMap[fieldName] ?? fieldName;\n }\n\n /**\n * Maps a field name from one name to another using the reverse mapping.\n * @param fieldName The field name to map.\n * @returns The mapped field name, or the original field name if no mapping is found.\n */\n public ReverseMapFieldName(fieldName: string): string {\n return Object.entries(this._fieldMap).find(([k, v]) => v === fieldName)?.[0] ?? fieldName;\n }\n\n /**\n * Maps fields from one name to another mutating the object in place using the reverse mapping.\n * @param obj The object to mutate\n */\n public ReverseMapFields(obj: Record<string, unknown>) {\n const reversed = Object.fromEntries(Object.entries(this._fieldMap).map(([k, v]) => [v, k]));\n for (const k in obj) {\n if (k in reversed) {\n obj[reversed[k]] = obj[k];\n delete obj[k];\n }\n }\n return obj;\n }\n}\n","import { TransactionGroupBase, TransactionResult } from \"@memberjunction/core\";\nimport { GraphQLDataProvider } from \"./graphQLDataProvider\";\nimport { gql } from \"graphql-request\";\nimport { SafeJSONParse } from \"@memberjunction/global\";\n\nexport class GraphQLTransactionGroup extends TransactionGroupBase {\n private _provider: GraphQLDataProvider;\n constructor(provider: GraphQLDataProvider) {\n super();\n this._provider = provider;\n }\n\n // protected async HandleSubmit(): Promise<TransactionResult[]> {\n // // iterate through each instruction and build up the combined query string\n // // and the combined variables object\n // let combinedQuery = '';\n // let mutationParams = '';\n // const combinedVars: any = {};\n\n // for (let i = 0; i < this.PendingTransactions.length; i++) {\n // const item = this.PendingTransactions[i];\n // let itemMutation = item.Instruction;\n // if (item.Vars) {\n // const keys = Object.keys(item.Vars);\n // // rename the variables to avoid collisions and aggregate the varisables\n // // from the item into our combined variables\n // for (let j = 0; j < keys.length; j++) {\n // const key = keys[j];\n // const newKey = `${key}_${i}`;\n // combinedVars[newKey] = item.Vars[key];\n\n // const keyRegEx = new RegExp('\\\\$' + key, 'g'); // Create the RegExp dynamically with the global flag.\n // itemMutation = itemMutation.replace(keyRegEx, '$' + newKey);\n // const mutationInputType = item.ExtraData.mutationInputTypes.find((t: any) => t.varName === key)?.inputType;\n // //{varName: pk.CodeName, inputType: pk.EntityFieldInfo.GraphQLType + '!'}\n // mutationParams += `$${newKey}: ${mutationInputType} \\n`;\n // }\n // }\n // // add in the specific mutation and give it an alias so we can easily figure out the results\n // // from each of them and pass back properly\n // combinedQuery += `mutation_${i}: ` + itemMutation + '\\n';\n // }\n\n // combinedQuery = `mutation TransactionGroup(${mutationParams}){ \\n` + combinedQuery+ '\\n}'; // wrap it up in a mutation so we can execute it\n // const execResults = await this._provider.ExecuteGQL(combinedQuery, combinedVars)\n // const returnResults: TransactionResult[] = [];\n // for (let i = 0; i < this.PendingTransactions.length; i++) {\n // /// NEED TO TEST TO SEE WHAT ORDER WE GET RESULTS BACK AS\n // const result = execResults[`mutation_${i}`];\n // const item = this.PendingTransactions[i];\n // returnResults.push(new TransactionResult(item, result, result !== null));\n // }\n // return returnResults;\n // }\n\n // new implementation\n protected async HandleSubmit(): Promise<TransactionResult[]> {\n // Define the mutation\n const mutation = gql`\n mutation ExecuteTransactionGroup($group: TransactionInputType!) {\n ExecuteTransactionGroup(group: $group) {\n Success\n ErrorMessages\n ResultsJSON\n }\n }\n `;\n\n // Example variables for the mutation\n const items = [];\n for (const pt of this.PendingTransactions) {\n items.push({\n EntityName: pt.BaseEntity.EntityInfo.Name,\n EntityObjectJSON: await pt.BaseEntity.GetDataObjectJSON(),\n OperationType: pt.OperationType\n });\n }\n const vars = {\n group: {\n Items: items,\n Variables: this.Variables.map(v => {\n return {\n Name: v.Name,\n ItemIndex: this.MapVariableEntityObjectToPosition(v),\n FieldName: v.FieldName,\n Type: v.Type\n }\n }) \n }\n }; \n\n const results = await this._provider.ExecuteGQL(mutation, vars)\n if (results && results.ExecuteTransactionGroup) {\n const data = results.ExecuteTransactionGroup;\n const returnResults: TransactionResult[] = [];\n for (let i = 0; i < this.PendingTransactions.length; i++) {\n const resultJSON = data.ResultsJSON[i];\n const resultObject = SafeJSONParse(resultJSON);\n const item = this.PendingTransactions[i];\n returnResults.push(new TransactionResult(item, resultObject, resultObject !== null));\n }\n return returnResults;\n }\n else {\n throw new Error('Failed to execute transaction group');\n }\n }\n}","import { LogError, LogStatusEx } from \"@memberjunction/core\";\nimport { GraphQLDataProvider } from \"./graphQLDataProvider\";\nimport { gql } from \"graphql-request\";\nimport { ExecuteAgentParams, ExecuteAgentResult } from \"@memberjunction/ai-core-plus\";\nimport { SafeJSONParse } from \"@memberjunction/global\";\n\n/**\n * Client for executing AI operations through GraphQL.\n * This class provides an easy way to execute AI prompts and agents from a client application.\n * \n * The GraphQLAIClient follows the same naming convention as other GraphQL clients\n * in the MemberJunction ecosystem, such as GraphQLActionClient and GraphQLSystemUserClient.\n * \n * @example\n * ```typescript\n * // Create the client\n * const aiClient = new GraphQLAIClient(graphQLProvider);\n * \n * // Run an AI prompt\n * const promptResult = await aiClient.RunAIPrompt({\n * promptId: \"prompt-id\",\n * data: { context: \"user data\" },\n * temperature: 0.7\n * });\n * \n * // Run an AI agent\n * const agentResult = await aiClient.RunAIAgent({\n * agentId: \"agent-id\",\n * messages: [{ role: \"user\", content: \"Hello\" }],\n * sessionId: \"session-123\"\n * });\n * ```\n */\nexport class GraphQLAIClient {\n /**\n * The GraphQLDataProvider instance used to execute GraphQL requests\n * @private\n */\n private _dataProvider: GraphQLDataProvider;\n\n /**\n * Creates a new GraphQLAIClient instance.\n * @param dataProvider The GraphQL data provider to use for queries\n */\n constructor(dataProvider: GraphQLDataProvider) {\n this._dataProvider = dataProvider;\n }\n\n /**\n * Run an AI prompt with the specified parameters.\n * \n * This method invokes an AI prompt on the server through GraphQL and returns the result.\n * Parameters are automatically serialized as needed, and results are parsed for consumption.\n * \n * @param params The parameters for running the AI prompt\n * @returns A Promise that resolves to a RunAIPromptResult object\n * \n * @example\n * ```typescript\n * const result = await aiClient.RunAIPrompt({\n * promptId: \"prompt-id\",\n * data: { key: \"value\" },\n * temperature: 0.7,\n * topP: 0.9\n * });\n * \n * if (result.success) {\n * console.log('Output:', result.output);\n * console.log('Parsed Result:', result.parsedResult);\n * } else {\n * console.error('Error:', result.error);\n * }\n * ```\n */\n public async RunAIPrompt(params: RunAIPromptParams): Promise<RunAIPromptResult> {\n try {\n // Build the mutation with all possible parameters\n const mutation = gql`\n mutation RunAIPrompt(\n $promptId: String!,\n $data: String,\n $overrideModelId: String,\n $overrideVendorId: String,\n $configurationId: String,\n $skipValidation: Boolean,\n $templateData: String,\n $responseFormat: String,\n $temperature: Float,\n $topP: Float,\n $topK: Int,\n $minP: Float,\n $frequencyPenalty: Float,\n $presencePenalty: Float,\n $seed: Int,\n $stopSequences: [String!],\n $includeLogProbs: Boolean,\n $topLogProbs: Int,\n $messages: String,\n $rerunFromPromptRunID: String,\n $systemPromptOverride: String\n ) {\n RunAIPrompt(\n promptId: $promptId,\n data: $data,\n overrideModelId: $overrideModelId,\n overrideVendorId: $overrideVendorId,\n configurationId: $configurationId,\n skipValidation: $skipValidation,\n templateData: $templateData,\n responseFormat: $responseFormat,\n temperature: $temperature,\n topP: $topP,\n topK: $topK,\n minP: $minP,\n frequencyPenalty: $frequencyPenalty,\n presencePenalty: $presencePenalty,\n seed: $seed,\n stopSequences: $stopSequences,\n includeLogProbs: $includeLogProbs,\n topLogProbs: $topLogProbs,\n messages: $messages,\n rerunFromPromptRunID: $rerunFromPromptRunID,\n systemPromptOverride: $systemPromptOverride\n ) {\n success\n output\n parsedResult\n error\n executionTimeMs\n tokensUsed\n promptRunId\n rawResult\n validationResult\n chatResult\n }\n }\n `;\n\n // Prepare variables, serializing complex objects to JSON strings\n const variables = this.preparePromptVariables(params);\n\n // Execute the mutation\n const result = await this._dataProvider.ExecuteGQL(mutation, variables);\n\n // Process and return the result\n return this.processPromptResult(result);\n } catch (e) {\n return this.handlePromptError(e);\n }\n }\n\n /**\n * Prepares variables for the AI prompt mutation\n * @param params The prompt parameters\n * @returns The prepared variables for GraphQL\n * @private\n */\n private preparePromptVariables(params: RunAIPromptParams): Record<string, any> {\n const variables: Record<string, any> = {\n promptId: params.promptId\n };\n\n // Serialize complex objects to JSON strings\n if (params.data !== undefined) {\n variables.data = typeof params.data === 'object' ? JSON.stringify(params.data) : params.data;\n }\n if (params.templateData !== undefined) {\n variables.templateData = typeof params.templateData === 'object' ? JSON.stringify(params.templateData) : params.templateData;\n }\n if (params.messages !== undefined) {\n variables.messages = JSON.stringify(params.messages);\n }\n\n // Add optional scalar parameters\n if (params.overrideModelId !== undefined) variables.overrideModelId = params.overrideModelId;\n if (params.overrideVendorId !== undefined) variables.overrideVendorId = params.overrideVendorId;\n if (params.configurationId !== undefined) variables.configurationId = params.configurationId;\n if (params.skipValidation !== undefined) variables.skipValidation = params.skipValidation;\n if (params.responseFormat !== undefined) variables.responseFormat = params.responseFormat;\n if (params.temperature !== undefined) variables.temperature = params.temperature;\n if (params.topP !== undefined) variables.topP = params.topP;\n if (params.topK !== undefined) variables.topK = params.topK;\n if (params.minP !== undefined) variables.minP = params.minP;\n if (params.frequencyPenalty !== undefined) variables.frequencyPenalty = params.frequencyPenalty;\n if (params.presencePenalty !== undefined) variables.presencePenalty = params.presencePenalty;\n if (params.seed !== undefined) variables.seed = params.seed;\n if (params.stopSequences !== undefined) variables.stopSequences = params.stopSequences;\n if (params.includeLogProbs !== undefined) variables.includeLogProbs = params.includeLogProbs;\n if (params.topLogProbs !== undefined) variables.topLogProbs = params.topLogProbs;\n if (params.rerunFromPromptRunID !== undefined) variables.rerunFromPromptRunID = params.rerunFromPromptRunID;\n if (params.systemPromptOverride !== undefined) variables.systemPromptOverride = params.systemPromptOverride;\n\n return variables;\n }\n\n /**\n * Processes the result from the AI prompt mutation\n * @param result The raw GraphQL result\n * @returns The processed RunAIPromptResult\n * @private\n */\n private processPromptResult(result: any): RunAIPromptResult {\n if (!result?.RunAIPrompt) {\n throw new Error(\"Invalid response from server\");\n }\n\n const promptResult = result.RunAIPrompt;\n\n // Parse JSON results if they exist\n let parsedResult: any;\n let validationResult: any;\n let chatResult: any;\n\n try {\n if (promptResult.parsedResult) {\n parsedResult = JSON.parse(promptResult.parsedResult);\n }\n } catch (e) {\n // Keep as string if parsing fails\n parsedResult = promptResult.parsedResult;\n }\n\n try {\n if (promptResult.validationResult) {\n validationResult = JSON.parse(promptResult.validationResult);\n }\n } catch (e) {\n validationResult = promptResult.validationResult;\n }\n\n try {\n if (promptResult.chatResult) {\n chatResult = JSON.parse(promptResult.chatResult);\n }\n } catch (e) {\n chatResult = promptResult.chatResult;\n }\n\n return {\n success: promptResult.success,\n output: promptResult.output,\n parsedResult,\n error: promptResult.error,\n executionTimeMs: promptResult.executionTimeMs,\n tokensUsed: promptResult.tokensUsed,\n promptRunId: promptResult.promptRunId,\n rawResult: promptResult.rawResult,\n validationResult,\n chatResult\n };\n }\n\n /**\n * Handles errors in the AI prompt execution\n * @param e The error\n * @returns An error result\n * @private\n */\n private handlePromptError(e: unknown): RunAIPromptResult {\n const error = e as Error;\n LogError(`Error running AI prompt: ${error}`);\n return {\n success: false,\n error: error.message || 'Unknown error occurred'\n };\n }\n\n /**\n * Run an AI agent with the specified parameters.\n *\n * This method invokes an AI agent on the server through GraphQL and returns the result.\n * The agent can maintain conversation context across multiple interactions.\n *\n * If a progress callback is provided in params.onProgress, this method will subscribe\n * to real-time progress updates from the GraphQL server and forward them to the callback.\n *\n * @param params The parameters for running the AI agent\n * @returns A Promise that resolves to a RunAIAgentResult object\n *\n * @example\n * ```typescript\n * const result = await aiClient.RunAIAgent({\n * agentId: \"agent-id\",\n * messages: [\n * { role: \"user\", content: \"What's the weather like?\" }\n * ],\n * sessionId: \"session-123\",\n * data: { location: \"New York\" },\n * onProgress: (progress) => {\n * console.log(`Progress: ${progress.message} (${progress.percentage}%)`);\n * }\n * });\n *\n * if (result.success) {\n * console.log('Response:', result.payload);\n * console.log('Execution time:', result.executionTimeMs, 'ms');\n * } else {\n * console.error('Error:', result.errorMessage);\n * }\n * ```\n */\n public async RunAIAgent(\n params: ExecuteAgentParams,\n sourceArtifactId?: string,\n sourceArtifactVersionId?: string\n ): Promise<ExecuteAgentResult> {\n let subscription: any;\n\n try {\n // Subscribe to progress updates if callback provided\n if (params.onProgress) {\n subscription = this._dataProvider.PushStatusUpdates(this._dataProvider.sessionId)\n .subscribe((message: string) => {\n try {\n LogStatusEx({message: '[GraphQLAIClient] Received statusUpdate message', verboseOnly: true, additionalArgs: [message]});\n const parsed = JSON.parse(message);\n LogStatusEx({message: '[GraphQLAIClient] Parsed message', verboseOnly: true, additionalArgs: [parsed]});\n\n // Filter for ExecutionProgress messages from RunAIAgentResolver\n if (parsed.resolver === 'RunAIAgentResolver' &&\n parsed.type === 'ExecutionProgress' &&\n parsed.status === 'ok' &&\n parsed.data?.progress) {\n\n LogStatusEx({message: '[GraphQLAIClient] Forwarding progress to callback', verboseOnly: true, additionalArgs: [parsed.data.progress]});\n // Forward progress to callback with agentRunId in metadata\n const progressWithRunId = {\n ...parsed.data.progress,\n metadata: {\n ...(parsed.data.progress.metadata || {}),\n agentRunId: parsed.data.agentRunId\n }\n };\n params.onProgress!(progressWithRunId);\n } else {\n LogStatusEx({message: '[GraphQLAIClient] Message does not match filter criteria', verboseOnly: true, additionalArgs: [{\n resolver: parsed.resolver,\n type: parsed.type,\n status: parsed.status,\n hasProgress: !!parsed.data?.progress\n }]});\n }\n } catch (e) {\n // Log parsing errors for debugging\n console.error('[GraphQLAIClient] Failed to parse progress message:', e, 'Raw message:', message);\n }\n });\n }\n\n // Build the mutation\n const mutation = gql`\n mutation RunAIAgent(\n $agentId: String!,\n $messages: String!,\n $sessionId: String!,\n $data: String,\n $payload: String,\n $templateData: String,\n $lastRunId: String,\n $autoPopulateLastRunPayload: Boolean,\n $configurationId: String,\n $conversationDetailId: String,\n $createArtifacts: Boolean,\n $createNotification: Boolean,\n $sourceArtifactId: String,\n $sourceArtifactVersionId: String\n ) {\n RunAIAgent(\n agentId: $agentId,\n messages: $messages,\n sessionId: $sessionId,\n data: $data,\n payload: $payload,\n templateData: $templateData,\n lastRunId: $lastRunId,\n autoPopulateLastRunPayload: $autoPopulateLastRunPayload,\n configurationId: $configurationId,\n conversationDetailId: $conversationDetailId,\n createArtifacts: $createArtifacts,\n createNotification: $createNotification,\n sourceArtifactId: $sourceArtifactId,\n sourceArtifactVersionId: $sourceArtifactVersionId\n ) {\n success\n errorMessage\n executionTimeMs\n result\n }\n }\n `;\n\n // Prepare variables\n const variables = this.prepareAgentVariables(params, sourceArtifactId, sourceArtifactVersionId);\n\n // Execute the mutation\n const result = await this._dataProvider.ExecuteGQL(mutation, variables);\n\n // Process and return the result\n return this.processAgentResult(result.RunAIAgent?.result);\n } catch (e) {\n return this.handleAgentError(e);\n } finally {\n // Always clean up subscription\n if (subscription) {\n subscription.unsubscribe();\n }\n }\n }\n\n /**\n * Prepares variables for the AI agent mutation\n * @param params The agent parameters\n * @param sourceArtifactId Optional source artifact ID for versioning\n * @param sourceArtifactVersionId Optional source artifact version ID for versioning\n * @returns The prepared variables for GraphQL\n * @private\n */\n private prepareAgentVariables(\n params: ExecuteAgentParams,\n sourceArtifactId?: string,\n sourceArtifactVersionId?: string\n ): Record<string, any> {\n const variables: Record<string, any> = {\n agentId: params.agent.ID,\n messages: JSON.stringify(params.conversationMessages),\n sessionId: this._dataProvider.sessionId\n };\n\n // Serialize optional complex objects to JSON strings\n if (params.data !== undefined) {\n variables.data = typeof params.data === 'object' ? JSON.stringify(params.data) : params.data;\n } \n if (params.payload !== undefined) {\n variables.payload = typeof params.payload === 'object' ? JSON.stringify(params.payload) : params.payload;\n }\n\n // Add optional scalar parameters\n if (params.lastRunId !== undefined) variables.lastRunId = params.lastRunId;\n if (params.autoPopulateLastRunPayload !== undefined) variables.autoPopulateLastRunPayload = params.autoPopulateLastRunPayload;\n if (params.configurationId !== undefined) variables.configurationId = params.configurationId;\n if (params.conversationDetailId !== undefined) {\n variables.conversationDetailId = params.conversationDetailId;\n // When conversationDetailId is provided, enable server-side artifact and notification creation\n // This is a GraphQL resolver-level concern, not agent execution concern\n variables.createArtifacts = true;\n variables.createNotification = true;\n }\n // Add source artifact tracking for versioning (GraphQL resolver-level concern)\n if (sourceArtifactId !== undefined) variables.sourceArtifactId = sourceArtifactId;\n if (sourceArtifactVersionId !== undefined) variables.sourceArtifactVersionId = sourceArtifactVersionId;\n\n return variables;\n }\n\n /**\n * Processes the result from the AI agent mutation\n * @param result The raw GraphQL result\n * @returns The processed RunAIAgentResult\n * @private\n */\n private processAgentResult(result: string): ExecuteAgentResult {\n return SafeJSONParse(result) as ExecuteAgentResult; \n }\n\n /**\n * Handles errors in the AI agent execution\n * @param e The error\n * @returns An error result\n * @private\n */\n private handleAgentError(e: unknown): ExecuteAgentResult {\n const error = e as Error;\n LogError(`Error running AI agent: ${error}`);\n return {\n success: false,\n agentRun: undefined\n };\n }\n\n /**\n * Execute a simple prompt without requiring a stored AI Prompt entity.\n * This method is designed for interactive components that need quick AI responses.\n * \n * @param params The parameters for the simple prompt execution\n * @returns A Promise that resolves to a SimplePromptResult object\n * \n * @example\n * ```typescript\n * const result = await aiClient.ExecuteSimplePrompt({\n * systemPrompt: \"You are a helpful assistant\",\n * messages: [\n * { message: \"What's the weather?\", role: \"user\" }\n * ],\n * modelPower: \"medium\"\n * });\n * \n * if (result.success) {\n * console.log('Response:', result.result);\n * if (result.resultObject) {\n * console.log('Parsed JSON:', JSON.parse(result.resultObject));\n * }\n * }\n * ```\n */\n public async ExecuteSimplePrompt(params: ExecuteSimplePromptParams): Promise<SimplePromptResult> {\n try {\n const mutation = gql`\n mutation ExecuteSimplePrompt(\n $systemPrompt: String!,\n $messages: String,\n $preferredModels: [String!],\n $modelPower: String,\n $responseFormat: String\n ) {\n ExecuteSimplePrompt(\n systemPrompt: $systemPrompt,\n messages: $messages,\n preferredModels: $preferredModels,\n modelPower: $modelPower,\n responseFormat: $responseFormat\n ) {\n success\n result\n resultObject\n modelName\n error\n executionTimeMs\n }\n }\n `;\n\n // Prepare variables\n const variables: Record<string, any> = {\n systemPrompt: params.systemPrompt\n };\n\n // Convert messages array to JSON string if provided\n if (params.messages && params.messages.length > 0) {\n variables.messages = JSON.stringify(params.messages);\n }\n\n if (params.preferredModels) {\n variables.preferredModels = params.preferredModels;\n }\n\n if (params.modelPower) {\n variables.modelPower = params.modelPower;\n }\n\n if (params.responseFormat) {\n variables.responseFormat = params.responseFormat;\n }\n\n // Execute the mutation\n const result = await this._dataProvider.ExecuteGQL(mutation, variables);\n\n if (!result?.ExecuteSimplePrompt) {\n throw new Error(\"Invalid response from server\");\n }\n\n const promptResult = result.ExecuteSimplePrompt;\n\n // Parse resultObject if it exists\n let resultObject: any;\n if (promptResult.resultObject) {\n try {\n resultObject = JSON.parse(promptResult.resultObject);\n } catch (e) {\n resultObject = promptResult.resultObject;\n }\n }\n\n return {\n success: promptResult.success,\n result: promptResult.result,\n resultObject,\n modelName: promptResult.modelName,\n error: promptResult.error,\n executionTimeMs: promptResult.executionTimeMs\n };\n\n } catch (e) {\n const error = e as Error;\n LogError(`Error executing simple prompt: ${error}`);\n return {\n success: false,\n modelName: 'Unknown',\n error: error.message || 'Unknown error occurred'\n };\n }\n }\n\n /**\n * Generate embeddings for text using local embedding models.\n * This method is designed for interactive components that need fast similarity calculations.\n * \n * @param params The parameters for embedding generation\n * @returns A Promise that resolves to an EmbedTextResult object\n * \n * @example\n * ```typescript\n * const result = await aiClient.EmbedText({\n * textToEmbed: [\"Hello world\", \"How are you?\"],\n * modelSize: \"small\"\n * });\n * \n * console.log('Embeddings:', result.embeddings);\n * console.log('Model used:', result.modelName);\n * console.log('Dimensions:', result.vectorDimensions);\n * ```\n */\n public async EmbedText(params: EmbedTextParams): Promise<EmbedTextResult> {\n try {\n const mutation = gql`\n mutation EmbedText(\n $textToEmbed: [String!]!,\n $modelSize: String!\n ) {\n EmbedText(\n textToEmbed: $textToEmbed,\n modelSize: $modelSize\n ) {\n embeddings\n modelName\n vectorDimensions\n error\n }\n }\n `;\n\n // Prepare variables - handle both single string and array\n const textArray = Array.isArray(params.textToEmbed) \n ? params.textToEmbed \n : [params.textToEmbed];\n\n const variables = {\n textToEmbed: textArray,\n modelSize: params.modelSize\n };\n\n // Execute the mutation\n const result = await this._dataProvider.ExecuteGQL(mutation, variables);\n\n if (!result?.EmbedText) {\n throw new Error(\"Invalid response from server\");\n }\n\n const embedResult = result.EmbedText;\n\n // Return single embedding or array based on input\n const returnEmbeddings = Array.isArray(params.textToEmbed)\n ? embedResult.embeddings\n : embedResult.embeddings[0];\n\n return {\n embeddings: returnEmbeddings,\n modelName: embedResult.modelName,\n vectorDimensions: embedResult.vectorDimensions,\n error: embedResult.error\n };\n\n } catch (e) {\n const error = e as Error;\n LogError(`Error generating embeddings: ${error}`);\n return {\n embeddings: Array.isArray(params.textToEmbed) ? [] : [],\n modelName: 'Unknown',\n vectorDimensions: 0,\n error: error.message || 'Unknown error occurred'\n };\n }\n }\n}\n\n/**\n * Parameters for executing a simple prompt\n */\nexport interface ExecuteSimplePromptParams {\n /**\n * The system prompt to set context for the model\n */\n systemPrompt: string;\n \n /**\n * Optional message history\n */\n messages?: Array<{message: string, role: 'user' | 'assistant'}>;\n \n /**\n * Preferred model names to use\n */\n preferredModels?: string[];\n \n /**\n * Power level for model selection\n */\n modelPower?: 'lowest' | 'medium' | 'highest';\n \n /**\n * Response format (e.g., \"json\")\n */\n responseFormat?: string;\n}\n\n/**\n * Result from executing a simple prompt\n */\nexport interface SimplePromptResult {\n /**\n * Whether the execution was successful\n */\n success: boolean;\n \n /**\n * The text response from the model\n */\n result?: string;\n \n /**\n * Parsed JSON object if the response contained JSON\n */\n resultObject?: any;\n \n /**\n * Name of the model used\n */\n modelName: string;\n \n /**\n * Error message if execution failed\n */\n error?: string;\n \n /**\n * Execution time in milliseconds\n */\n executionTimeMs?: number;\n}\n\n/**\n * Parameters for generating text embeddings\n */\nexport interface EmbedTextParams {\n /**\n * Text or array of texts to embed\n */\n textToEmbed: string | string[];\n \n /**\n * Size of the embedding model to use\n */\n modelSize: 'small' | 'medium';\n}\n\n/**\n * Result from generating text embeddings\n */\nexport interface EmbedTextResult {\n /**\n * Single embedding vector or array of vectors\n */\n embeddings: number[] | number[][];\n \n /**\n * Name of the model used\n */\n modelName: string;\n \n /**\n * Number of dimensions in each vector\n */\n vectorDimensions: number;\n \n /**\n * Error message if generation failed\n */\n error?: string;\n}\n\n/**\n * Parameters for running an AI prompt\n */\nexport interface RunAIPromptParams {\n /**\n * The ID of the AI prompt to run\n */\n promptId: string;\n \n /**\n * Data context to pass to the prompt (will be JSON serialized)\n */\n data?: Record<string, any>;\n \n /**\n * Override the default model ID\n */\n overrideModelId?: string;\n \n /**\n * Override the default vendor ID\n */\n overrideVendorId?: string;\n \n /**\n * Configuration ID to use\n */\n configurationId?: string;\n \n /**\n * Skip validation of the prompt\n */\n skipValidation?: boolean;\n \n /**\n * Template data for prompt templating (will be JSON serialized)\n */\n templateData?: Record<string, any>;\n \n /**\n * Response format (e.g., \"json\", \"text\")\n */\n responseFormat?: string;\n \n /**\n * Temperature parameter for the model (0.0 to 1.0)\n */\n temperature?: number;\n \n /**\n * Top-p sampling parameter\n */\n topP?: number;\n \n /**\n * Top-k sampling parameter\n */\n topK?: number;\n \n /**\n * Min-p sampling parameter\n */\n minP?: number;\n \n /**\n * Frequency penalty parameter\n */\n frequencyPenalty?: number;\n \n /**\n * Presence penalty parameter\n */\n presencePenalty?: number;\n \n /**\n * Random seed for reproducible outputs\n */\n seed?: number;\n \n /**\n * Stop sequences for the model\n */\n stopSequences?: string[];\n \n /**\n * Include log probabilities in the response\n */\n includeLogProbs?: boolean;\n \n /**\n * Number of top log probabilities to include\n */\n topLogProbs?: number;\n \n /**\n * Conversation messages (will be JSON serialized)\n */\n messages?: Array<{ role: string; content: string }>;\n \n /**\n * ID of a previous prompt run to rerun from\n */\n rerunFromPromptRunID?: string;\n \n /**\n * Override the system prompt\n */\n systemPromptOverride?: string;\n}\n\n/**\n * Result from running an AI prompt\n */\nexport interface RunAIPromptResult {\n /**\n * Whether the prompt execution was successful\n */\n success: boolean;\n \n /**\n * The output from the prompt\n */\n output?: string;\n \n /**\n * Parsed result data (if applicable)\n */\n parsedResult?: any;\n \n /**\n * Error message if the execution failed\n */\n error?: string;\n \n /**\n * Execution time in milliseconds\n */\n executionTimeMs?: number;\n \n /**\n * Number of tokens used\n */\n tokensUsed?: number;\n \n /**\n * ID of the prompt run record\n */\n promptRunId?: string;\n \n /**\n * Raw result from the model\n */\n rawResult?: string;\n \n /**\n * Validation result data\n */\n validationResult?: any;\n \n /**\n * Chat completion result data\n */\n chatResult?: any;\n}\n ","/**************************************************************************************************************\n * The graphQLDataProvider provides a data provider for the entities framework that uses GraphQL to communicate\n * with the server.\n * In practice - this FILE will NOT exist in the entities library, we need to move to its own separate project\n * so it is only included by the consumer of the entities library if they want to use it.\n**************************************************************************************************************/\n\nimport { BaseEntity, IEntityDataProvider, IMetadataProvider, IRunViewProvider, ProviderConfigDataBase, RunViewResult,\n EntityInfo, EntityFieldInfo, EntityFieldTSType,\n RunViewParams, ProviderBase, ProviderType, UserInfo, UserRoleInfo, RecordChange,\n ILocalStorageProvider, EntitySaveOptions, EntityMergeOptions, LogError,\n TransactionGroupBase, TransactionItem, TransactionResult, DatasetItemFilterType, DatasetResultType, DatasetStatusResultType, EntityRecordNameInput,\n EntityRecordNameResult, IRunReportProvider, RunReportResult, RunReportParams, RecordDependency, RecordMergeRequest, RecordMergeResult,\n IRunQueryProvider, RunQueryResult, PotentialDuplicateRequest, PotentialDuplicateResponse, CompositeKey, EntityDeleteOptions,\n RunQueryParams, BaseEntityResult,\n KeyValuePair } from \"@memberjunction/core\";\nimport { UserViewEntityExtended, ViewInfo } from '@memberjunction/core-entities'\n\nimport { gql, GraphQLClient } from 'graphql-request'\nimport { openDB, DBSchema, IDBPDatabase } from '@tempfix/idb';\nimport { Observable, Subject, Subscription } from 'rxjs';\nimport { Client, createClient } from 'graphql-ws';\nimport { FieldMapper } from './FieldMapper';\nimport { v4 as uuidv4 } from 'uuid';\nimport { GraphQLTransactionGroup } from \"./graphQLTransactionGroup\";\nimport { GraphQLAIClient } from \"./graphQLAIClient\";\n\n// define the shape for a RefreshToken function that can be called by the GraphQLDataProvider whenever it receives an exception that the JWT it has already is expired\nexport type RefreshTokenFunction = () => Promise<string>;\n\n/**\n * The GraphQLProviderConfigData class is used to configure the GraphQLDataProvider. It is passed to the Config method of the GraphQLDataProvider\n */\nexport class GraphQLProviderConfigData extends ProviderConfigDataBase {\n /**\n * Token is the JWT token that is used to authenticate the user with the server\n */\n get Token(): string { return this.Data.Token }\n\n set Token(token: string) { this.Data.Token = token}\n\n /**\n * This optional parameter is used when using a shared secret key that is static and provided by the publisher of the MJAPI server. Providing this value will result in \n * a special header x-mj-api-key being set with this value in the HTTP request to the server. This is useful when the server is configured to require this key for certain requests.\n * \n * WARNING: This should NEVER BE USED IN A CLIENT APP like a browser. The only suitable use for this is if you are using GraphQLDataProvider on the server side from another MJAPI, or \n * some other secure computing environment where the key can be kept secure.\n */\n get MJAPIKey(): string { return this.Data.MJAPIKey }\n set MJAPIKey(key: string) { this.Data.MJAPIKey = key }\n\n /**\n * URL is the URL to the GraphQL endpoint\n */\n get URL(): string { return this.Data.URL }\n /**\n * WSURL is the URL to the GraphQL websocket endpoint. This is used for subscriptions, if you are not using subscriptions, you can pass in a blank string for this\n */\n get WSURL(): string { return this.Data.WSURL }\n\n /**\n * RefreshTokenFunction is a function that can be called by the GraphQLDataProvider whenever it receives an exception that the JWT it has already is expired\n */\n get RefreshTokenFunction(): RefreshTokenFunction { return this.Data.RefreshFunction }\n\n\n /**\n *\n * @param token Token is the JWT token that is used to authenticate the user with the server\n * @param url the URL to the GraphQL endpoint\n * @param wsurl the URL to the GraphQL websocket endpoint. This is used for subscriptions, if you are not using subscriptions, you can pass in a blank string for this\n * @param refreshTokenFunction is a function that can be called by the GraphQLDataProvider whenever it receives an exception that the JWT it has already is expired\n * @param MJCoreSchemaName the name of the MJ Core schema, if it is not the default name of __mj\n * @param includeSchemas optional, an array of schema names to include in the metadata. If not passed, all schemas are included\n * @param excludeSchemas optional, an array of schema names to exclude from the metadata. If not passed, no schemas are excluded\n * @param mjAPIKey optional, a shared secret key that is static and provided by the publisher of the MJAPI server. \n */\n constructor(token: string,\n url: string,\n wsurl: string,\n refreshTokenFunction: RefreshTokenFunction,\n MJCoreSchemaName?: string,\n includeSchemas?: string[],\n excludeSchemas?: string[],\n mjAPIKey?: string) {\n super(\n {\n Token: token,\n URL: url,\n WSURL: wsurl,\n MJAPIKey: mjAPIKey,\n RefreshTokenFunction: refreshTokenFunction,\n },\n MJCoreSchemaName,\n includeSchemas,\n excludeSchemas\n );\n }\n}\n\n\n\n// The GraphQLDataProvider implements both the IEntityDataProvider and IMetadataProvider interfaces.\n/**\n * The GraphQLDataProvider class is a data provider for MemberJunction that implements the IEntityDataProvider, IMetadataProvider, IRunViewProvider, IRunReportProvider, IRunQueryProvider interfaces and connects to the\n * MJAPI server using GraphQL. This class is used to interact with the server to get and save data, as well as to get metadata about the entities and fields in the system.\n */\nexport class GraphQLDataProvider extends ProviderBase implements IEntityDataProvider, IMetadataProvider, IRunViewProvider, IRunReportProvider, IRunQueryProvider {\n private static _instance: GraphQLDataProvider;\n public static get Instance(): GraphQLDataProvider {\n return GraphQLDataProvider._instance;\n }\n\n constructor() {\n super();\n if (!GraphQLDataProvider._instance)\n GraphQLDataProvider._instance = this;\n }\n\n private _client: GraphQLClient;\n private _configData: GraphQLProviderConfigData;\n private _sessionId: string;\n private _aiClient: GraphQLAIClient;\n private _refreshPromise: Promise<void> | null = null;\n\n public get ConfigData(): GraphQLProviderConfigData {\n return this._configData;\n }\n\n /**\n * The core schema name constant. This should match the mjCoreSchema config value.\n * TODO: Move this to @memberjunction/core once npm registration issues are resolved\n * @see https://github.com/MemberJunction/MJ/issues/1452\n */\n protected static readonly MJ_CORE_SCHEMA = '__mj';\n\n /**\n * Sanitizes a string to be a valid GraphQL name component, preserving original capitalization.\n * GraphQL names must match the pattern [_A-Za-z][_0-9A-Za-z]* and cannot start with double underscore\n *\n * TODO: Move this to @memberjunction/core once npm registration issues are resolved\n * @see https://github.com/MemberJunction/MJ/issues/1452\n *\n * Copied from @memberjunction/codegen-lib GraphQLServerGeneratorBase.sanitizeGraphQLName()\n */\n protected sanitizeGraphQLName(input: string): string {\n if (!input || input.length === 0) {\n return '';\n }\n\n // Replace any non-alphanumeric characters (except underscore) with nothing to preserve capitalization\n let sanitized = input.replace(/[^A-Za-z0-9_]/g, '');\n\n // If the name starts with two underscores, remove them\n // (double underscore is reserved for GraphQL introspection)\n if (sanitized.startsWith('__')) {\n sanitized = sanitized.substring(2);\n }\n\n // Remove any remaining underscores\n sanitized = sanitized.replace(/_/g, '');\n\n // If the result starts with a digit or is empty, prepend an underscore\n if (sanitized.length === 0 || /^[0-9]/.test(sanitized)) {\n return '_' + sanitized;\n }\n\n return sanitized;\n }\n\n /**\n * Generates the base GraphQL type name for an entity using SchemaBaseTable pattern.\n * Preserves original capitalization. Special case: MJ core schema uses \"MJ\" prefix.\n * This ensures unique type names across different schemas.\n *\n * TODO: Move this to @memberjunction/core once npm registration issues are resolved\n * @see https://github.com/MemberJunction/MJ/issues/1452\n *\n * Copied from @memberjunction/codegen-lib GraphQLServerGeneratorBase.getServerGraphQLTypeNameBase()\n *\n * @param entity - The entity to generate the type name for\n * @returns The base GraphQL type name (without suffix like ViewByID, DynamicView, etc.)\n */\n protected getGraphQLTypeNameBase(entity: EntityInfo): string {\n // Special case for MJ core schema - use \"MJ\" instead of the schema name\n const schemaPrefix = entity.SchemaName.trim().toLowerCase() === GraphQLDataProvider.MJ_CORE_SCHEMA.trim().toLowerCase()\n ? 'MJ'\n : this.sanitizeGraphQLName(entity.SchemaName);\n\n const sanitizedBaseTable = this.sanitizeGraphQLName(entity.BaseTable);\n return `${schemaPrefix}${sanitizedBaseTable}`;\n }\n\n /**\n * Gets the AI client for executing AI operations through GraphQL.\n * The client is lazily initialized on first access.\n * @returns The GraphQLAIClient instance\n */\n public get AI(): GraphQLAIClient {\n if (!this._aiClient) {\n this._aiClient = new GraphQLAIClient(this);\n }\n return this._aiClient;\n }\n\n /**\n * This getter is not implemented for the GraphQLDataProvider class.\n */\n public get DatabaseConnection(): any {\n throw new Error(\"DatabaseConnection not implemented for the GraphQLDataProvider\");\n }\n\n /**\n * The connection string for each GraphQLProvider instance is simply the URL for the GraphQL endpoint. This is because each GraphQLDataProvider instance can be configured with a different URL and each URL\n * is a unique combination of host/port/etc.\n */\n public get InstanceConnectionString(): string {\n return this._configData.URL\n }\n\n public GenerateUUID() {\n return uuidv4();\n }\n\n /**\n * The GraphQLDataProvider uses a prefix for local storage that is equal to the URL of the GraphQL endpoint. This is because the GraphQLDataProvider can be configured multiple times with different URLs and each\n * configuration will have its own local storage. This is useful when you want to have multiple connections to different servers and you don't want the local storage to be shared between them. The URL is \n * normalized to remove special characters and replace anything other than alphanumeric characters with an underscore.\n */\n protected override get LocalStoragePrefix(): string {\n if (this._configData === undefined || this._configData.URL === undefined) {\n throw new Error(\"GraphQLDataProvider: ConfigData is not set. Please call Config() first.\");\n }\n\n const replacementString = this._configData.URL.replace(/[^a-zA-Z0-9]/g, '_');\n return replacementString + \".\"; // add a period at the end to separate the prefix from the key\n }\n\n /**\n * Retrieves the stored session ID from the LocalStorageProvider if available.\n * If no session ID is found, returns null.\n * The session ID is stored using the same storage mechanism as other persistent data\n * with a key specific to the current URL to ensure uniqueness across different \n * server connections.\n * \n * @returns The stored session ID or null if not found\n */\n public async GetStoredSessionID(): Promise<string> {\n try {\n const ls = this.LocalStorageProvider;\n if (ls) {\n const key = this.LocalStoragePrefix + \"sessionId\";\n const storedSession = await ls.GetItem(key);\n return storedSession;\n }\n return null;\n } catch (e) {\n // If any error occurs, return null\n console.error(\"Error retrieving session ID from local storage:\", e);\n return null;\n }\n }\n\n /**\n * Stores the session ID using the configured LocalStorageProvider for persistence.\n * Uses the same URL-specific key pattern as other storage methods to ensure\n * proper isolation between different server connections.\n * \n * @param sessionId The session ID to store\n */\n private async SaveStoredSessionID(sessionId: string): Promise<void> {\n try {\n const ls = this.LocalStorageProvider;\n if (ls) {\n const key = this.LocalStoragePrefix + \"sessionId\";\n await ls.SetItem(key, sessionId);\n }\n } catch (e) {\n // Silently fail if storage is not available\n }\n }\n\n public async GetPreferredUUID(forceRefreshSessionId?: boolean): Promise<string> {\n // Try to get the stored session ID\n const oldUUID = await this.GetStoredSessionID();\n const UUID = forceRefreshSessionId || !oldUUID ? this.GenerateUUID() : oldUUID;\n return UUID;\n }\n\n\n /**\n * This method configures the class instance. If separateConnection is false or not provided, the global/static variables are set that means that the Config() call\n * will affect all callers to the GraphQLDataProvider including via wrappers like the Metadata class. If separateConnection is true, then the instance variables are set\n * and only this instance of the GraphQLDataProvider will be affected by the Config() call.\n * @important If separateConnection is true, metadata for the provider will be loaded but will NOT affect the Metadata class/singleton. \n * This is because the Metadata class is a singleton that binds to the first Config() call in the process where separateConnection is falsy. \n * @param configData \n * @param separateConnection \n * @returns \n */\n public async Config(configData: GraphQLProviderConfigData, providerToUse?: IMetadataProvider, separateConnection?: boolean, forceRefreshSessionId?: boolean): Promise<boolean> {\n try {\n // Enhanced logging to diagnose token issues\n const tokenPreview = configData.Token ? `${configData.Token.substring(0, 20)}...${configData.Token.substring(configData.Token.length - 10)}` : 'NO TOKEN';\n console.log('[GraphQL] Config called with token:', {\n tokenPreview,\n tokenLength: configData.Token?.length,\n separateConnection,\n hasRefreshFunction: !!configData.Data?.RefreshTokenFunction\n });\n\n // CRITICAL: Always set this instance's _configData first\n // This ensures BuildDatasetFilterFromConfig() can access ConfigData.IncludeSchemas\n this._configData = configData;\n\n if (separateConnection) {\n // Get UUID after setting the configData, so that it can be used to get any stored session ID\n this._sessionId = await this.GetPreferredUUID(forceRefreshSessionId);;\n\n this._client = this.CreateNewGraphQLClient(configData.URL, configData.Token, this._sessionId, configData.MJAPIKey);\n // Store the session ID for this connection\n await this.SaveStoredSessionID(this._sessionId);\n }\n else {\n // Update the singleton instance\n GraphQLDataProvider.Instance._configData = configData;\n\n if (GraphQLDataProvider.Instance._sessionId === undefined) {\n GraphQLDataProvider.Instance._sessionId = await this.GetPreferredUUID(forceRefreshSessionId);;\n }\n\n // now create the new client, if it isn't already created\n if (!GraphQLDataProvider.Instance._client)\n GraphQLDataProvider.Instance._client = this.CreateNewGraphQLClient(configData.URL, configData.Token, GraphQLDataProvider.Instance._sessionId, configData.MJAPIKey);\n\n // Store the session ID for the global instance\n await GraphQLDataProvider.Instance.SaveStoredSessionID(GraphQLDataProvider.Instance._sessionId);\n\n // CRITICAL: Sync this instance with the singleton\n // This ensures ExecuteGQL() can use this._client.request()\n this._sessionId = GraphQLDataProvider.Instance._sessionId;\n this._client = GraphQLDataProvider.Instance._client;\n }\n return super.Config(configData); // now parent class can do it's config\n }\n catch (e) {\n LogError(e);\n throw (e)\n }\n }\n\n public get sessionId(): string {\n return this._sessionId;\n }\n\n protected get AllowRefresh(): boolean {\n return true; // this provider doesn't have any issues with allowing refreshes at any time\n }\n\n protected async GetCurrentUser(): Promise<UserInfo> {\n const d = await this.ExecuteGQL(this._currentUserQuery, null);\n if (d) {\n // convert the user and the user roles _mj__*** fields back to __mj_***\n const u = this.ConvertBackToMJFields(d.CurrentUser);\n const roles = u.UserRoles_UserIDArray.map(r => this.ConvertBackToMJFields(r));\n u.UserRoles_UserIDArray = roles;\n return new UserInfo(this, {...u, UserRoles: roles}) // need to pass in the UserRoles as a separate property that is what is expected here\n }\n }\n\n\n /**************************************************************************/\n // START ---- IRunReportProvider\n /**************************************************************************/\n public async RunReport(params: RunReportParams, contextUser?: UserInfo): Promise<RunReportResult> {\n const query = gql`\n query GetReportDataQuery ($ReportID: String!) {\n GetReportData(ReportID: $ReportID) {\n Success\n Results\n RowCount\n ExecutionTime\n ErrorMessage\n }\n }`\n\n const result = await this.ExecuteGQL(query, {ReportID: params.ReportID} );\n if (result && result.GetReportData)\n return {\n ReportID: params.ReportID,\n Success: result.GetReportData.Success,\n Results: JSON.parse(result.GetReportData.Results),\n RowCount: result.GetReportData.RowCount,\n ExecutionTime: result.GetReportData.ExecutionTime,\n ErrorMessage: result.GetReportData.ErrorMessage,\n };\n }\n /**************************************************************************/\n // END ---- IRunReportProvider\n /**************************************************************************/\n\n /**************************************************************************/\n // START ---- IRunQueryProvider\n /**************************************************************************/\n public async RunQuery(params: RunQueryParams, contextUser?: UserInfo): Promise<RunQueryResult> {\n if (params.QueryID) {\n return this.RunQueryByID(params.QueryID, params.CategoryID, params.CategoryPath, contextUser, params.Parameters, params.MaxRows, params.StartRow);\n }\n else if (params.QueryName) {\n return this.RunQueryByName(params.QueryName, params.CategoryID, params.CategoryPath, contextUser, params.Parameters, params.MaxRows, params.StartRow);\n }\n else {\n throw new Error(\"No QueryID or QueryName provided to RunQuery\");\n }\n }\n\n public async RunQueryByID(QueryID: string, CategoryID?: string, CategoryPath?: string, contextUser?: UserInfo, Parameters?: Record<string, any>, MaxRows?: number, StartRow?: number): Promise<RunQueryResult> {\n const query = gql`\n query GetQueryDataQuery($QueryID: String!, $CategoryID: String, $CategoryPath: String, $Parameters: JSONObject, $MaxRows: Int, $StartRow: Int) {\n GetQueryData(QueryID: $QueryID, CategoryID: $CategoryID, CategoryPath: $CategoryPath, Parameters: $Parameters, MaxRows: $MaxRows, StartRow: $StartRow) {\n ${this.QueryReturnFieldList}\n }\n }\n `;\n \n // Build the variables object, adding optional parameters if defined.\n const variables: { QueryID: string; CategoryID?: string; CategoryPath?: string; Parameters?: Record<string, any>; MaxRows?: number; StartRow?: number } = { QueryID };\n if (CategoryID !== undefined) {\n variables.CategoryID = CategoryID;\n }\n if (CategoryPath !== undefined) {\n variables.CategoryPath = CategoryPath;\n }\n if (Parameters !== undefined) {\n variables.Parameters = Parameters;\n }\n if (MaxRows !== undefined) {\n variables.MaxRows = MaxRows;\n }\n if (StartRow !== undefined) {\n variables.StartRow = StartRow;\n }\n \n const result = await this.ExecuteGQL(query, variables);\n if (result && result.GetQueryData) {\n return this.TransformQueryPayload(result.GetQueryData);\n }\n }\n \n public async RunQueryByName(QueryName: string, CategoryID?: string, CategoryPath?: string, contextUser?: UserInfo, Parameters?: Record<string, any>, MaxRows?: number, StartRow?: number): Promise<RunQueryResult> {\n const query = gql`\n query GetQueryDataByNameQuery($QueryName: String!, $CategoryID: String, $CategoryPath: String, $Parameters: JSONObject, $MaxRows: Int, $StartRow: Int) {\n GetQueryDataByName(QueryName: $QueryName, CategoryID: $CategoryID, CategoryPath: $CategoryPath, Parameters: $Parameters, MaxRows: $MaxRows, StartRow: $StartRow) {\n ${this.QueryReturnFieldList}\n }\n }\n `;\n \n // Build the variables object, adding optional parameters if defined.\n const variables: { QueryName: string; CategoryID?: string; CategoryPath?: string; Parameters?: Record<string, any>; MaxRows?: number; StartRow?: number } = { QueryName };\n if (CategoryID !== undefined) {\n variables.CategoryID = CategoryID;\n }\n if (CategoryPath !== undefined) {\n variables.CategoryPath = CategoryPath;\n }\n if (Parameters !== undefined) {\n variables.Parameters = Parameters;\n }\n if (MaxRows !== undefined) {\n variables.MaxRows = MaxRows;\n }\n if (StartRow !== undefined) {\n variables.StartRow = StartRow;\n }\n \n const result = await this.ExecuteGQL(query, variables);\n if (result && result.GetQueryDataByName) {\n return this.TransformQueryPayload(result.GetQueryDataByName);\n }\n }\n\n protected get QueryReturnFieldList(): string {\n return `\n Success\n QueryID\n QueryName\n Results\n RowCount\n TotalRowCount\n ExecutionTime\n ErrorMessage\n AppliedParameters`\n }\n protected TransformQueryPayload(data: any): RunQueryResult {\n try {\n return {\n QueryID: data.QueryID,\n QueryName: data.QueryName,\n Success: data.Success,\n Results: JSON.parse(data.Results),\n RowCount: data.RowCount,\n TotalRowCount: data.TotalRowCount,\n ExecutionTime: data.ExecutionTime,\n ErrorMessage: data.ErrorMessage,\n AppliedParameters: data.AppliedParameters ? JSON.parse(data.AppliedParameters) : undefined\n }; \n }\n catch (e) {\n LogError(`Error transforming query payload: ${e}`);\n return null;\n }\n }\n\n /**************************************************************************/\n // END ---- IRunReportProvider\n /**************************************************************************/\n\n\n\n /**************************************************************************/\n // START ---- IRunViewProvider\n /**************************************************************************/\n public async RunView<T = any>(params: RunViewParams, contextUser?: UserInfo): Promise<RunViewResult<T>> {\n // pre-process via the base-class \n await this.PreProcessRunView(params, contextUser);\n\n try {\n let qName: string = ''\n let paramType: string = ''\n if (params) {\n const innerParams: any = {}\n let entity: string, viewEntity: any;\n if (params.ViewEntity) {\n viewEntity = params.ViewEntity\n entity = viewEntity.Entity\n }\n else {\n const {entityName, v} = await this.getEntityNameAndUserView(params, contextUser)\n viewEntity = v;\n entity = entityName;\n }\n\n // get entity metadata\n const e = this.Entities.find(e => e.Name === entity);\n if (!e)\n throw new Error(`Entity ${entity} not found in metadata`);\n\n let dynamicView = false;\n const graphQLTypeName = this.getGraphQLTypeNameBase(e);\n\n if (params.ViewID) {\n qName = `Run${graphQLTypeName}ViewByID`;\n paramType = 'RunViewByIDInput';\n innerParams.ViewID = params.ViewID;\n }\n else if (params.ViewName) {\n qName = `Run${graphQLTypeName}ViewByName`;\n paramType = 'RunViewByNameInput';\n innerParams.ViewName = params.ViewName;\n }\n else {\n dynamicView = true;\n qName = `Run${graphQLTypeName}DynamicView`;\n paramType = 'RunDynamicViewInput';\n innerParams.EntityName = params.EntityName;\n }\n innerParams.ExtraFilter = params.ExtraFilter ? params.ExtraFilter : '';\n innerParams.OrderBy = params.OrderBy ? params.OrderBy : '';\n innerParams.UserSearchString = params.UserSearchString ? params.UserSearchString : '';\n innerParams.Fields = params.Fields; // pass it straight through, either null or array of strings\n innerParams.IgnoreMaxRows = params.IgnoreMaxRows ? params.IgnoreMaxRows : false;\n if (params.MaxRows !== undefined)\n innerParams.MaxRows = params.MaxRows;\n if (params.StartRow !== undefined)\n innerParams.StartRow = params.StartRow; // Add StartRow parameter\n innerParams.ForceAuditLog = params.ForceAuditLog ? params.ForceAuditLog : false;\n innerParams.ResultType = params.ResultType ? params.ResultType : 'simple';\n if (params.AuditLogDescription && params.AuditLogDescription.length > 0)\n innerParams.AuditLogDescription = params.AuditLogDescription;\n\n if (!dynamicView) {\n innerParams.ExcludeUserViewRunID = params.ExcludeUserViewRunID ? params.ExcludeUserViewRunID : \"\";\n innerParams.ExcludeDataFromAllPriorViewRuns = params.ExcludeDataFromAllPriorViewRuns ? params.ExcludeDataFromAllPriorViewRuns : false;\n innerParams.OverrideExcludeFilter = params.OverrideExcludeFilter ? params.OverrideExcludeFilter : '';\n innerParams.SaveViewResults = params.SaveViewResults ? params.SaveViewResults : false;\n }\n\n const fieldList = this.getViewRunTimeFieldList(e, viewEntity, params, dynamicView);\n const query = gql`\n query RunViewQuery ($input: ${paramType}!) {\n ${qName}(input: $input) {\n Results {\n ${fieldList.join(\"\\n \")}\n }\n UserViewRunID\n RowCount\n TotalRowCount\n ExecutionTime\n Success\n ErrorMessage\n }\n }`\n\n const viewData = await this.ExecuteGQL(query, {input: innerParams} );\n if (viewData && viewData[qName]) {\n // now, if we have any results in viewData that are for the CodeName, we need to convert them to the Name\n // so that the caller gets back what they expect\n const results = viewData[qName].Results;\n if (results && results.length > 0) {\n const codeNameDiffFields = e.Fields.filter(f => f.CodeName !== f.Name && f.CodeName !== undefined);\n results.forEach(r => {\n // for _mj__ results, we need to convert them back to the Name\n this.ConvertBackToMJFields(r);\n codeNameDiffFields.forEach(f => {\n r[f.Name] = r[f.CodeName];\n // delete r[f.CodeName]; // Leave the CodeName in the results, it is useful to have both\n })\n })\n }\n const result = viewData[qName];\n\n // post-process via the base class\n await this.PostProcessRunView(result, params, contextUser);\n\n return result;\n }\n }\n else\n throw (\"No parameters passed to RunView\");\n\n return null;\n }\n catch (e) {\n LogError(e);\n throw (e)\n }\n }\n\n public async RunViews<T = any>(params: RunViewParams[], contextUser?: UserInfo): Promise<RunViewResult<T>[]> {\n // pre-process via the base class\n await this.PreProcessRunViews(params, contextUser);\n\n try {\n let innerParams: any[] = [];\n let entityInfos: EntityInfo[] = [];\n let fieldList: string[] = [];\n\n for(const param of params){\n let qName: string = ''\n let paramType: string = ''\n const innerParam: any = {}\n let entity: string | null = null;\n let viewEntity: UserViewEntityExtended | null = null;\n if (param.ViewEntity) {\n viewEntity = param.ViewEntity as UserViewEntityExtended;\n entity = viewEntity.Get(\"Entity\");\n }\n else {\n const {entityName, v} = await this.getEntityNameAndUserView(param, contextUser)\n viewEntity = v;\n entity = entityName;\n }\n\n // get entity metadata\n const e = this.Entities.find(e => e.Name === entity);\n if (!e){\n throw new Error(`Entity ${entity} not found in metadata`);\n }\n\n entityInfos.push(e);\n let dynamicView: boolean = false;\n const graphQLTypeName = this.getGraphQLTypeNameBase(e);\n\n if (param.ViewID) {\n qName = `Run${graphQLTypeName}ViewByID`;\n paramType = 'RunViewByIDInput';\n innerParam.ViewID = param.ViewID;\n }\n else if (param.ViewName) {\n qName = `Run${graphQLTypeName}ViewByName`;\n paramType = 'RunViewByNameInput';\n innerParam.ViewName = param.ViewName;\n }\n else {\n dynamicView = true;\n qName = `Run${graphQLTypeName}DynamicView`;\n paramType = 'RunDynamicViewInput';\n innerParam.EntityName = param.EntityName;\n }\n\n innerParam.ExtraFilter = param.ExtraFilter || '';\n innerParam.OrderBy = param.OrderBy || '';\n innerParam.UserSearchString = param.UserSearchString || '';\n // pass it straight through, either null or array of strings\n innerParam.Fields = param.Fields;\n innerParam.IgnoreMaxRows = param.IgnoreMaxRows || false;\n if (param.MaxRows !== undefined)\n innerParam.MaxRows = param.MaxRows;\n if (param.StartRow !== undefined)\n innerParam.StartRow = param.StartRow; // Add StartRow parameter\n innerParam.ForceAuditLog = param.ForceAuditLog || false;\n innerParam.ResultType = param.ResultType || 'simple';\n if (param.AuditLogDescription && param.AuditLogDescription.length > 0){\n innerParam.AuditLogDescription = param.AuditLogDescription;\n }\n\n if (!dynamicView) {\n innerParam.ExcludeUserViewRunID = param.ExcludeUserViewRunID || \"\";\n innerParam.ExcludeDataFromAllPriorViewRuns = param.ExcludeDataFromAllPriorViewRuns || false;\n innerParam.OverrideExcludeFilter = param.OverrideExcludeFilter || '';\n innerParam.SaveViewResults = param.SaveViewResults || false;\n }\n\n innerParams.push(innerParam);\n fieldList.push(...this.getViewRunTimeFieldList(e, viewEntity, param, dynamicView));\n }\n\n const query = gql`\n query RunViewsQuery ($input: [RunViewGenericInput!]!) {\n RunViews(input: $input) {\n Results {\n PrimaryKey {\n FieldName\n Value\n }\n EntityID\n Data\n }\n UserViewRunID\n RowCount\n TotalRowCount\n ExecutionTime\n Success\n ErrorMessage\n }\n }`;\n\n const viewData: unknown = await this.ExecuteGQL(query, {input: innerParams} );\n if (viewData && viewData[\"RunViews\"]) {\n // now, if we have any results in viewData that are for the CodeName, we need to convert them to the Name\n // so that the caller gets back what they expect\n const results: RunViewResult[] = viewData[\"RunViews\"];\n for(const [index, result] of results.entries()){\n //const codeNameDiffFields = entityInfos[index].Fields.filter(f => f.CodeName !== f.Name && f.CodeName !== undefined);\n result.Results = result.Results.map((data: unknown) => {\n let deserializeData: Record<string, unknown> = JSON.parse(data[\"Data\"]);\n // for _mj__ results, we need to convert them back to the Name\n this.ConvertBackToMJFields(deserializeData);\n /*\n codeNameDiffFields.forEach(f => {\n deserializeData[f.Name] = deserializeData[f.CodeName];\n // delete r[f.CodeName]; // Leave the CodeName in the results, it is useful to have both\n });\n */\n return deserializeData;\n });\n }\n\n // post-process via the base class\n await this.PostProcessRunViews(results, params, contextUser);\n \n return results;\n }\n\n return null;\n\n }\n catch (e) {\n LogError(e);\n throw (e);\n }\n }\n\n protected async getEntityNameAndUserView(params: RunViewParams, contextUser?: UserInfo): Promise<{entityName: string, v: UserViewEntityExtended}> {\n let entityName: string;\n let v: UserViewEntityExtended;\n\n if (!params.EntityName) {\n if (params.ViewID) {\n v = await ViewInfo.GetViewEntity(params.ViewID, contextUser)\n entityName = v.Entity\n }\n else if (params.ViewName) {\n v = await ViewInfo.GetViewEntityByName(params.ViewName, contextUser);\n entityName = v.Entity\n }\n else\n throw new Error(`No EntityName, ViewID or ViewName passed to RunView`)\n }\n else\n entityName = params.EntityName\n\n return {entityName, v}\n }\n\n protected getViewRunTimeFieldList(e: EntityInfo, v: UserViewEntityExtended, params: RunViewParams, dynamicView: boolean): string[] {\n const fieldList = [];\n const mapper = new FieldMapper();\n if (params.Fields) {\n for (const kv of e.PrimaryKeys) {\n if (params.Fields.find(f => f.trim().toLowerCase() === kv.Name.toLowerCase()) === undefined)\n fieldList.push(kv.Name); // always include the primary key fields in view run time field list\n }\n\n // now add any other fields that were passed in\n params.Fields.forEach(f => {\n fieldList.push(mapper.MapFieldName(f))\n });\n }\n else {\n // no fields were passed in. So, let's check to see if we are running an dynamic view.\n // If so, we need to include all fields since the caller didn't specify the fields they want\n // otherwise, we include the fields that are part of the view definition.\n if (dynamicView) {\n // include all fields since no fields were passed in\n e.Fields.forEach(f => {\n if (!f.IsBinaryFieldType) {\n fieldList.push(mapper.MapFieldName(f.CodeName));\n }\n });\n }\n else {\n // NOTE: in the below, c.EntityField SHOULD always exist, however there is a possibility that at some point a VIEW was created that used fields\n // and those fields are NO LONGER part of an entity, in that situation we should just remove them, rather than letting the whole view blow up which\n // would happen if we dno't check for c.EntityField? in the below\n\n // first make sure we have the primary key field in the view column list, always should, but make sure\n for (const kv of e.PrimaryKeys) {\n if (fieldList.find(f => f.trim().toLowerCase() === kv.Name.toLowerCase()) === undefined)\n fieldList.push(kv.Name); // always include the primary key fields in view run time field list\n }\n\n // Now: include the fields that are part of the view definition\n v.Columns.forEach(c => {\n if (c.hidden === false && !fieldList.find(item => item.trim().toLowerCase() === c.EntityField?.Name.trim().toLowerCase())) { // don't include hidden fields and don't include the pkey field again\n if (!c.EntityField) {\n // this can happen if a field was previously included in a view, but is no longer part of the entity\n // simply don't include it in the field list\n }\n else\n fieldList.push(mapper.MapFieldName(c.EntityField.CodeName));\n }\n });\n }\n }\n return fieldList;\n }\n /**************************************************************************/\n // END ---- IRunViewProvider\n /**************************************************************************/\n\n\n /**************************************************************************/\n // START ---- IEntityDataProvider\n /**************************************************************************/\n public get ProviderType(): ProviderType {\n return ProviderType.Network;\n }\n\n public async GetRecordChanges(entityName: string, primaryKey: CompositeKey): Promise<RecordChange[]> {\n try {\n const p: RunViewParams = {\n EntityName: 'Record Changes',\n ExtraFilter: `RecordID = '${primaryKey.Values()}' AND Entity = '${entityName}'`,\n //OrderBy: 'ChangedAt DESC',\n }\n const result = await this.RunView(p);\n if (result) {\n // sort the results client side because, for now, the RunViewParams doesn't support OrderBy dynamically like we tried. Later change this to do via the SQL query\n return result.Results.sort((a: RecordChange, b: RecordChange) => {\n return (a.ChangedAt > b.ChangedAt) ? -1 : 1 // sort descending on the date.... GraphQL passes back the date as time since base date\n });\n }\n else\n return null;\n }\n catch (e) {\n LogError(e);\n throw (e)\n }\n }\n\n\n /**\n * Returns a list of dependencies - records that are linked to the specified Entity/KeyValuePairs combination. A dependency is as defined by the relationships in the database. The MemberJunction metadata that is used\n * for this simply reflects the foreign key relationships that exist in the database. The CodeGen tool is what detects all of the relationships and generates the metadata that is used by MemberJunction. The metadata in question\n * is within the EntityField table and specifically the RelatedEntity and RelatedEntityField columns. In turn, this method uses that metadata and queries the database to determine the dependencies. To get the list of entity dependencies\n * you can use the utility method GetEntityDependencies(), which doesn't check for dependencies on a specific record, but rather gets the metadata in one shot that can be used for dependency checking.\n * @param entityName the name of the entity to check\n * @param KeyValuePairs the KeyValuePairs of the record to check\n */\n public async GetRecordDependencies(entityName: string, primaryKey: CompositeKey): Promise<RecordDependency[]> {\n try {\n // execute the gql query to get the dependencies\n const query = gql`query GetRecordDependenciesQuery ($entityName: String!, $CompositeKey: CompositeKeyInputType!) {\n GetRecordDependencies(entityName: $entityName, CompositeKey: $CompositeKey) {\n EntityName\n RelatedEntityName\n FieldName\n CompositeKey {\n KeyValuePairs {\n FieldName\n Value\n }\n }\n }\n }`\n\n // now we have our query built, execute it\n const vars = {\n entityName: entityName,\n CompositeKey: {KeyValuePairs: this.ensureKeyValuePairValueIsString(primaryKey.KeyValuePairs)}\n };\n const data = await this.ExecuteGQL(query, vars);\n\n return data?.GetRecordDependencies; // shape of the result should exactly match the RecordDependency type\n }\n catch (e) {\n LogError(e);\n throw (e)\n }\n }\n\n protected ensureKeyValuePairValueIsString(kvps: KeyValuePair[]): {FieldName: string, Value: string}[] {\n return kvps.map(kv => {\n return {FieldName: kv.FieldName, Value: kv.Value.toString()}\n })\n }\n\n public async GetRecordDuplicates(params: PotentialDuplicateRequest, contextUser?: UserInfo): Promise<PotentialDuplicateResponse>\n {\n if(!params){\n return null;\n }\n\n const query: string = gql`query GetRecordDuplicatesQuery ($params: PotentialDuplicateRequestType!) {\n GetRecordDuplicates(params: $params) {\n Status\n ErrorMessage\n PotentialDuplicateResult {\n EntityID\n DuplicateRunDetailMatchRecordIDs\n RecordPrimaryKeys {\n KeyValuePairs {\n FieldName\n Value\n }\n }\n Duplicates {\n ProbabilityScore\n KeyValuePairs {\n FieldName\n Value\n }\n }\n }\n }\n }`\n\n let request = {\n EntityID: params.EntityID,\n EntityDocumentID: params.EntityDocumentID,\n ListID: params.ListID,\n ProbabilityScore: params.ProbabilityScore,\n Options: params.Options,\n RecordIDs: params.RecordIDs.map(recordID => {\n return recordID.Copy();\n })\n }\n const data = await this.ExecuteGQL(query, {params: request});\n\n if(data && data.GetRecordDuplicates){\n return data.GetRecordDuplicates;\n }\n }\n\n public async MergeRecords(request: RecordMergeRequest, contextUser?: UserInfo, options?: EntityMergeOptions): Promise<RecordMergeResult> {\n const e = this.Entities.find(e=>e.Name.trim().toLowerCase() === request.EntityName.trim().toLowerCase());\n if (!e || !e.AllowRecordMerge)\n throw new Error(`Entity ${request.EntityName} does not allow record merging, check the AllowRecordMerge property in the entity metadata`);\n\n try {\n // execute the gql query to get the dependencies\n const mutation = gql`mutation MergeRecordsMutation ($request: RecordMergeRequest!) {\n MergeRecords(request: $request) {\n Success\n OverallStatus\n RecordMergeLogID\n RecordStatus {\n CompositeKey {\n KeyValuePairs {\n FieldName\n Value\n }\n }\n Success\n RecordMergeDeletionLogID\n Message\n }\n }\n }`\n\n // create a new request that is compatible with the server's expectations where field maps and also the primary key values are all strings\n const newRequest = {\n EntityName: request.EntityName,\n SurvivingRecordCompositeKey: {KeyValuePairs: this.ensureKeyValuePairValueIsString(request.SurvivingRecordCompositeKey.KeyValuePairs)},\n FieldMap: request.FieldMap?.map(fm => {\n return {\n FieldName: fm.FieldName,\n Value: fm.Value.toString() // turn the value into a string, since that is what the server expects\n }\n }),\n RecordsToMerge: request.RecordsToMerge.map(r => {\n return r.Copy();\n })\n }\n\n // now we have our query built, execute it\n const data = await this.ExecuteGQL(mutation, {request: newRequest});\n\n return data?.MergeRecords; // shape of the result should exactly match the RecordDependency type\n }\n catch (e) {\n LogError(e);\n return {\n Success: false,\n OverallStatus: e && e.message ? e.message : e,\n RecordStatus: [],\n RecordMergeLogID: \"\",\n Request: request,\n }\n throw (e)\n }\n }\n\n public async Save(entity: BaseEntity, user: UserInfo, options: EntitySaveOptions) : Promise<{}> {\n const result = new BaseEntityResult();\n try {\n entity.RegisterTransactionPreprocessing(); // as of the time of writing, this isn't technically needed because we are not doing any async preprocessing, but it is good to have it here for future use in case something is added with async between here and the TransactionItem being added.\n\n const vars = { input: {} };\n const type: string = entity.IsSaved ? \"Update\" : \"Create\";\n\n result.StartedAt = new Date();\n result.Type = entity.IsSaved ? 'update' : 'create';\n result.OriginalValues = entity.Fields.map(f => { return {FieldName: f.CodeName, Value: f.Value} });\n entity.ResultHistory.push(result); // push the new result as we have started a process\n\n // Create the query for the mutation first, we will provide the specific\n // input values later in the loop below. Here we are just setting up the mutation\n // and the fields that will be returned since the mutation returns back the latest\n // values for the entity and we need to have those values to update the entity after the\n // save\n\n const graphQLTypeName = this.getGraphQLTypeNameBase(entity.EntityInfo);\n const mutationName = `${type}${graphQLTypeName}`\n\n // only pass along writable fields, AND the PKEY value if this is an update\n const filteredFields = entity.Fields.filter(f => !f.ReadOnly || (f.IsPrimaryKey && entity.IsSaved));\n const mapper = new FieldMapper();\n const inner = ` ${mutationName}(input: $input) {\n ${entity.Fields.map(f => mapper.MapFieldName(f.CodeName)).join(\"\\n \")}\n }`\n const outer = gql`mutation ${type}${graphQLTypeName} ($input: ${mutationName}Input!) {\n ${inner}\n }\n `\n for (let i = 0; i < filteredFields.length; i++) {\n const f = filteredFields[i];\n let val = f.Value;\n if (val) {\n // type conversions as needed for GraphQL\n switch(f.EntityFieldInfo.TSType) {\n case EntityFieldTSType.Date:\n val = val.getTime();\n break;\n case EntityFieldTSType.Boolean:\n if (typeof val !== 'boolean') {\n val = parseInt(val) === 0 ? false : true; // convert to boolean\n }\n break;\n case EntityFieldTSType.Number:\n if (typeof val !== 'number') {\n const numValue = Number(val);\n if (!isNaN(numValue)) {\n val = numValue;\n } \n }\n break;\n }\n }\n\n if (val === null && f.EntityFieldInfo.AllowsNull === false) {\n // no value, field doesn't allow nulls, so set to default value, if available and then fall back to either 0 or empty string depending on type\n if (f.EntityFieldInfo.DefaultValue !== null) {\n // no value, but there is a default value, so use that, since field does NOT allow NULL\n val = f.EntityFieldInfo.DefaultValue;\n }\n else {\n // no default value, null value and field doesn't allow nulls, so set to either 0 or empty string\n if (f.FieldType === EntityFieldTSType.Number || f.FieldType === EntityFieldTSType.Boolean)\n val = 0;\n else\n val = '';\n }\n }\n vars.input[f.CodeName] = val;\n }\n\n // now add an OldValues prop to the vars IF the type === 'update' and the options.SkipOldValuesCheck === false\n if (type.trim().toLowerCase() === 'update' &&\n options.SkipOldValuesCheck === false) {\n const ov = [];\n entity.Fields.forEach(f => {\n let val = null;\n if (f.OldValue !== null && f.OldValue !== undefined) {\n if (f.EntityFieldInfo.TSType === EntityFieldTSType.Date) \n val = f.OldValue.getTime().toString();\n else if (f.EntityFieldInfo.TSType === EntityFieldTSType.Boolean)\n val = f.OldValue === true ? \"1\" : \"0\";\n else if (typeof f.OldValue !== \"string\")\n val = f.OldValue.toString();\n else\n val = f.OldValue;\n }\n ov.push({Key: f.CodeName, Value: val }); // pass ALL old values to server, slightly inefficient but we want full record\n });\n vars.input['OldValues___'] = ov; // add the OldValues prop to the input property that is part of the vars already\n }\n\n if (entity.TransactionGroup) {\n const mutationInputTypes = [\n {\n varName: 'input',\n inputType: mutationName + 'Input!'\n }\n ];\n\n entity.RaiseReadyForTransaction(); // let the entity know we're ready to be part of the transaction\n\n // we are part of a transaction group, so just add our query to the list\n // and when the transaction is committed, we will send all the queries at once\n entity.TransactionGroup.AddTransaction(new TransactionItem( entity, \n result.Type === 'create' ? 'Create' : 'Update', \n inner, vars, \n {\n mutationName,\n mutationInputTypes: mutationInputTypes\n },\n (results: any, success: boolean) => {\n // we get here whenever the transaction group does gets around to committing\n // our query. We need to update our entity with the values that were returned\n // from the mutation if it was successful.\n result.EndedAt = new Date();\n if (success && results) {\n // got our data, send it back to the caller, which is the entity object\n // and that object needs to update itself from this data.\n result.Success = true;\n result.NewValues = this.ConvertBackToMJFields(results);\n }\n else {\n // the transaction failed, nothing to update, but we need to call Reject so the\n // promise resolves with a rejection so our outer caller knows\n result.Success = false;\n result.Message = 'Transaction failed';\n }\n }));\n\n return true; // part of a TG always return true after we setup the transaction group item above\n }\n else {\n // not part of a transaction group, so just go for it and send across our GQL\n const d = await this.ExecuteGQL(outer, vars)\n if (d && d[mutationName]) {\n result.Success = true;\n result.EndedAt = new Date();\n result.NewValues = this.ConvertBackToMJFields(d[mutationName]);\n return result.NewValues;\n }\n else\n throw new Error(`Save failed for ${entity.EntityInfo.ClassName}`);\n }\n }\n catch (e) {\n result.Success = false;\n result.EndedAt = new Date();\n result.Message = e.response?.errors?.length > 0 ? e.response.errors[0].message : e.message;\n LogError(e);\n return null;\n }\n }\n public async Load(entity: BaseEntity, primaryKey: CompositeKey, EntityRelationshipsToLoad: string[] = null, user: UserInfo) : Promise<{}> {\n try {\n const vars = {};\n let pkeyInnerParamString: string = '';\n let pkeyOuterParamString: string = '';\n\n for (let i = 0; i < primaryKey.KeyValuePairs.length; i++) {\n const field: EntityFieldInfo = entity.Fields.find(f => f.Name.trim().toLowerCase() === primaryKey.KeyValuePairs[i].FieldName.trim().toLowerCase()).EntityFieldInfo;\n const val = primaryKey.GetValueByIndex(i);\n const pkeyGraphQLType: string = field.GraphQLType;\n\n // build up the param string for the outer query definition\n if (pkeyOuterParamString.length > 0)\n pkeyOuterParamString += ', ';\n pkeyOuterParamString += `$${field.CodeName}: ${pkeyGraphQLType}!`;\n\n // build up the param string for the inner query call\n if (pkeyInnerParamString.length > 0)\n pkeyInnerParamString += ', ';\n pkeyInnerParamString += `${field.CodeName}: $${field.CodeName}`;\n\n // build up the variables we are passing along to the query\n if (field.TSType === EntityFieldTSType.Number) {\n if (isNaN(primaryKey.GetValueByIndex(i)))\n throw new Error(`Primary Key value ${val} (${field.Name}) is not a valid number`);\n vars[field.CodeName] = parseInt(val); // converting to number here for graphql type to work properly\n }\n else\n vars[field.CodeName] = val;\n }\n\n const rel = EntityRelationshipsToLoad && EntityRelationshipsToLoad.length > 0 ? this.getRelatedEntityString(entity.EntityInfo, EntityRelationshipsToLoad) : '';\n\n const graphQLTypeName = this.getGraphQLTypeNameBase(entity.EntityInfo);\n const mapper = new FieldMapper();\n const query = gql`query Single${graphQLTypeName}${rel.length > 0 ? 'Full' : ''} (${pkeyOuterParamString}) {\n ${graphQLTypeName}(${pkeyInnerParamString}) {\n ${entity.Fields.filter((f) => !f.EntityFieldInfo.IsBinaryFieldType)\n .map((f) => {\n if (f.EntityFieldInfo.Name.trim().toLowerCase().startsWith('__mj_')) {\n // fields that start with __mj_ need to be converted to _mj__ for the GraphQL query\n return f.CodeName.replace('__mj_', '_mj__');\n } else {\n return f.CodeName;\n }\n })\n .join('\\n ')}\n ${rel}\n }\n }\n `;\n\n const d = await this.ExecuteGQL(query, vars)\n if (d && d[graphQLTypeName]) {\n // the resulting object has all the values in it, but we need to convert any elements that start with _mj__ back to __mj_\n return this.ConvertBackToMJFields(d[graphQLTypeName]);\n }\n else\n return null;\n }\n catch (e) {\n LogError(e);\n return null;\n }\n }\n\n /**\n * This method will convert back any fields that start with _mj__ back to __mj_ so that the entity object can properly update itself with the data that was returned from the server\n * @param ret\n * @returns\n */\n protected ConvertBackToMJFields(ret: any): any {\n const mapper = new FieldMapper();\n mapper.ReverseMapFields(ret);\n return ret; // clean object to pass back here\n }\n\n protected getRelatedEntityString(entityInfo: EntityInfo, EntityRelationshipsToLoad: string[]): string {\n let rel = '';\n for (let i = 0; i < entityInfo.RelatedEntities.length; i++) {\n if (EntityRelationshipsToLoad.indexOf(entityInfo.RelatedEntities[i].RelatedEntity) >= 0) {\n const r = entityInfo.RelatedEntities[i];\n const re = this.Entities.find(e => e.ID === r.RelatedEntityID);\n let uniqueCodeName: string = '';\n if (r.Type.toLowerCase().trim() === 'many to many') {\n uniqueCodeName = `${r.RelatedEntityCodeName}_${r.JoinEntityJoinField.replace(/\\s/g, '')}`;\n }\n else {\n uniqueCodeName = `${r.RelatedEntityCodeName}_${r.RelatedEntityJoinField.replace(/\\s/g, '')}`;\n }\n rel += `\n ${uniqueCodeName} {\n ${re.Fields.map(f => f.CodeName).join(\"\\n \")}\n }\n `;\n }\n }\n return rel;\n }\n\n public async Delete(entity: BaseEntity, options: EntityDeleteOptions, user: UserInfo) : Promise<boolean> {\n const result = new BaseEntityResult();\n try {\n entity.RegisterTransactionPreprocessing();\n\n result.StartedAt = new Date();\n result.Type = 'delete';\n result.OriginalValues = entity.Fields.map(f => { return {FieldName: f.CodeName, Value: f.Value} });\n entity.ResultHistory.push(result); // push the new result as we have started a process\n\n const vars = {};\n const mutationInputTypes = [];\n let pkeyInnerParamString: string = '';\n let pkeyOuterParamString: string = '';\n let returnValues: string = '';\n for (let kv of entity.PrimaryKey.KeyValuePairs) {\n const pk = entity.Fields.find(f => f.Name.trim().toLowerCase() === kv.FieldName.trim().toLowerCase()); // get the field for the primary key field\n vars[pk.CodeName] = pk.Value;\n mutationInputTypes.push({varName: pk.CodeName, inputType: pk.EntityFieldInfo.GraphQLType + '!'}); // only used when doing a transaction group, but it is easier to do in this main loop\n if (pkeyInnerParamString.length > 0)\n pkeyInnerParamString += ', ';\n pkeyInnerParamString += `${pk.CodeName}: $${pk.CodeName}`;\n\n if (pkeyOuterParamString.length > 0)\n pkeyOuterParamString += ', ';\n pkeyOuterParamString += `$${pk.CodeName}: ${pk.EntityFieldInfo.GraphQLType}!`;\n\n if (returnValues.length > 0)\n returnValues += '\\n ';\n returnValues += `${pk.CodeName}`;\n }\n\n mutationInputTypes.push({varName: \"options___\", inputType: 'DeleteOptionsInput!'}); // only used when doing a transaction group, but it is easier to do in this main loop\n vars[\"options___\"] = options ? options : {SkipEntityAIActions: false, SkipEntityActions: false};\n\n const graphQLTypeName = this.getGraphQLTypeNameBase(entity.EntityInfo);\n const queryName: string = 'Delete' + graphQLTypeName;\n const inner = gql`${queryName}(${pkeyInnerParamString}, options___: $options___) {\n ${returnValues}\n }\n `\n const query = gql`mutation ${queryName} (${pkeyOuterParamString}, $options___: DeleteOptionsInput!) {\n ${inner}\n }\n `\n\n if (entity.TransactionGroup) {\n // we have a transaction group, need to play nice and be part of it\n entity.RaiseReadyForTransaction();\n // we are part of a transaction group, so just add our query to the list\n // and when the transaction is committed, we will send all the queries at once\n entity.TransactionGroup.AddTransaction(new TransactionItem(entity, 'Delete', inner, vars, {mutationName: queryName,\n mutationInputTypes: mutationInputTypes},\n (results: any, success: boolean) => {\n // we get here whenever the transaction group does gets around to committing\n // our query.\n result.EndedAt = new Date(); // done processing\n if (success && results) {\n // success indicated by the entity.PrimaryKey.Value matching the return value of the mutation\n let success: boolean = true;\n for (const pk of entity.PrimaryKey.KeyValuePairs) {\n // check each primary key value to see if it matches the return value of the mutation\n if (pk.Value !== results[pk.FieldName]) {\n success = false;\n }\n }\n if (success) {\n result.Success = true;\n }\n else {\n // the transaction failed, nothing to update, but we need to call Reject so the\n // promise resolves with a rejection so our outer caller knows\n result.Success = false;\n result.Message = 'Transaction failed to commit'\n }\n }\n else {\n // the transaction failed, nothing to update, but we need to call Reject so the\n // promise resolves with a rejection so our outer caller knows\n result.Success = false;\n result.Message = 'Transaction failed to commit'\n }\n }));\n return true;\n }\n else {\n // no transaction just go for it\n const d = await this.ExecuteGQL(query, vars)\n if (d && d[queryName]) {\n const data = d[queryName];\n for (let key of entity.PrimaryKey.KeyValuePairs) {\n // we want to now compare key.Value against data[key.FieldName]\n let returnedVal = data[key.FieldName];\n let originalVal = key.Value;\n // we want to ignore types so we should convert numbers to strings for the comparison\n if (typeof originalVal === 'number')\n originalVal = originalVal.toString();\n if (typeof returnedVal === 'number')\n returnedVal = returnedVal.toString();\n // now compare the two values\n if (originalVal !== returnedVal) {\n throw new Error (`Primary key value mismatch in server Delete response. Field: ${key.FieldName}, Original: ${originalVal}, Returned: ${returnedVal}`);\n }\n }\n result.Success = true;\n result.EndedAt = new Date(); // done processing\n return true; // all of the return values match the primary key values, so we are good and delete worked\n }\n else\n throw new Error(`Delete failed for ${entity.EntityInfo.Name}: ${entity.PrimaryKey.ToString()} `);\n }\n }\n catch (e) {\n result.EndedAt = new Date(); // done processing\n result.Success = false;\n result.Message = e.response?.errors?.length > 0 ? e.response.errors[0].message : e.message;\n LogError(e);\n\n return false;\n }\n }\n /**************************************************************************/\n // END ---- IEntityDataProvider\n /**************************************************************************/\n\n\n /**************************************************************************/\n // START ---- IMetadataProvider\n /**************************************************************************/\n /**\n * Returns a dataset by name\n * @param datasetName \n * @param itemFilters \n * @returns \n */\n public async GetDatasetByName(datasetName: string, itemFilters?: DatasetItemFilterType[]): Promise<DatasetResultType> {\n const query = gql`query GetDatasetByName($DatasetName: String!, $ItemFilters: [DatasetItemFilterTypeGQL!]) {\n GetDatasetByName(DatasetName: $DatasetName, ItemFilters: $ItemFilters) {\n DatasetID\n DatasetName\n Success\n Status\n LatestUpdateDate\n Results\n }\n }`\n const data = await this.ExecuteGQL(query, {DatasetName: datasetName, ItemFilters: itemFilters });\n if (data && data.GetDatasetByName && data.GetDatasetByName.Success) {\n return {\n DatasetID: data.GetDatasetByName.DatasetID,\n DatasetName: data.GetDatasetByName.DatasetName,\n Success: data.GetDatasetByName.Success,\n Status: data.GetDatasetByName.Status,\n LatestUpdateDate: new Date(data.GetDatasetByName.LatestUpdateDate),\n Results: JSON.parse(data.GetDatasetByName.Results)\n }\n }\n else {\n return {\n DatasetID: \"\",\n DatasetName: datasetName,\n Success: false,\n Status: 'Unknown',\n LatestUpdateDate: null,\n Results: null\n };\n }\n }\n\n public async GetDatasetStatusByName(datasetName: string, itemFilters?: DatasetItemFilterType[]): Promise<DatasetStatusResultType> {\n const query = gql`query GetDatasetStatusByName($DatasetName: String!, $ItemFilters: [DatasetItemFilterTypeGQL!]) {\n GetDatasetStatusByName(DatasetName: $DatasetName, ItemFilters: $ItemFilters) {\n DatasetID\n DatasetName\n Success\n Status\n LatestUpdateDate\n EntityUpdateDates\n }\n }`\n const data = await this.ExecuteGQL(query, {DatasetName: datasetName, ItemFilters: itemFilters});\n if (data && data.GetDatasetStatusByName && data.GetDatasetStatusByName.Success) {\n return {\n DatasetID: data.GetDatasetStatusByName.DatasetID,\n DatasetName: data.GetDatasetStatusByName.DatasetName,\n Success: data.GetDatasetStatusByName.Success,\n Status: data.GetDatasetStatusByName.Status,\n LatestUpdateDate: new Date(data.GetDatasetStatusByName.LatestUpdateDate),\n EntityUpdateDates: JSON.parse(data.GetDatasetStatusByName.EntityUpdateDates)\n }\n }\n else {\n return {\n DatasetID: \"\",\n DatasetName: datasetName,\n Success: false,\n Status: 'Unknown',\n LatestUpdateDate: null,\n EntityUpdateDates: null\n };\n }\n }\n\n public async CreateTransactionGroup(): Promise<TransactionGroupBase> {\n return new GraphQLTransactionGroup(this);\n }\n\n public async GetRecordFavoriteStatus(userId: string, entityName: string, primaryKey: CompositeKey): Promise<boolean> {\n const valResult = primaryKey.Validate();\n if (!valResult.IsValid)\n return false;\n\n const e = this.Entities.find(e => e.Name === entityName)\n if (!e)\n throw new Error(`Entity ${entityName} not found in metadata`);\n\n const query = gql`query GetRecordFavoriteStatus($params: UserFavoriteSearchParams!) {\n GetRecordFavoriteStatus(params: $params) {\n Success\n IsFavorite\n }\n }`\n\n const data = await this.ExecuteGQL(query, {params: {\n UserID: userId,\n EntityID: e.ID,\n CompositeKey: {KeyValuePairs: this.ensureKeyValuePairValueIsString(primaryKey.KeyValuePairs)}\n }\n }\n );\n if (data && data.GetRecordFavoriteStatus && data.GetRecordFavoriteStatus.Success)\n return data.GetRecordFavoriteStatus.IsFavorite;\n }\n\n public async SetRecordFavoriteStatus(userId: string, entityName: string, primaryKey: CompositeKey, isFavorite: boolean, contextUser: UserInfo): Promise<void> {\n const e = this.Entities.find(e => e.Name === entityName)\n if (!e){\n throw new Error(`Entity ${entityName} not found in metadata`);\n }\n\n const query = gql`mutation SetRecordFavoriteStatus($params: UserFavoriteSetParams!) {\n SetRecordFavoriteStatus(params: $params){\n Success\n }\n }`\n\n const data = await this.ExecuteGQL(query, { params: {\n UserID: userId,\n EntityID: e.ID,\n CompositeKey: {KeyValuePairs: this.ensureKeyValuePairValueIsString(primaryKey.KeyValuePairs)},\n IsFavorite: isFavorite}\n }\n );\n if (data && data.SetRecordFavoriteStatus !== null)\n return data.SetRecordFavoriteStatus.Success;\n }\n\n public async GetEntityRecordName(entityName: string, primaryKey: CompositeKey): Promise<string> {\n if (!entityName || !primaryKey || primaryKey.KeyValuePairs?.length === 0){\n return null;\n }\n\n const query = gql`query GetEntityRecordNameQuery ($EntityName: String!, $CompositeKey: CompositeKeyInputType!) {\n GetEntityRecordName(EntityName: $EntityName, CompositeKey: $CompositeKey) {\n Success\n Status\n RecordName\n }\n }`\n\n const data = await this.ExecuteGQL(query, {\n EntityName: entityName,\n CompositeKey: {KeyValuePairs: this.ensureKeyValuePairValueIsString(primaryKey.KeyValuePairs)}\n });\n if (data && data.GetEntityRecordName && data.GetEntityRecordName.Success)\n return data.GetEntityRecordName.RecordName;\n }\n\n public async GetEntityRecordNames(info: EntityRecordNameInput[]): Promise<EntityRecordNameResult[]> {\n if (!info)\n return null;\n\n const query = gql`query GetEntityRecordNamesQuery ($info: [EntityRecordNameInput!]!) {\n GetEntityRecordNames(info: $info) {\n Success\n Status\n CompositeKey {\n KeyValuePairs {\n FieldName\n Value\n }\n }\n EntityName\n RecordName\n }\n }`\n\n const data = await this.ExecuteGQL(query, {info: info.map(i => {\n return {\n EntityName: i.EntityName,\n CompositeKey: {KeyValuePairs: this.ensureKeyValuePairValueIsString(i.CompositeKey.KeyValuePairs)}\n }\n })});\n if (data && data.GetEntityRecordNames)\n return data.GetEntityRecordNames;\n }\n\n /**\n * Retrieves all of the data context data for the specified data context ID.\n * @param dataContextID \n * @returns \n */\n public async GetDataContextData(dataContextID: string) {\n try {\n const query = gql`query GetDataContextData ($DataContextID: String!) {\n GetDataContextData(DataContextID: $DataContextID) {\n Success\n ErrorMessages\n Results\n }\n }`\n \n const data = await this.ExecuteGQL(query, {DataContextID: dataContextID});\n if (data && data.GetDataContextData) {\n if (data.GetDataContextData.Success) {\n return data.GetDataContextData.Results.map((item: any) => {\n return JSON.parse(item);\n });\n }\n else {\n throw new Error(data.GetDataContextData.ErrorMessages.join(', '));\n }\n }\n else {\n throw new Error('GraphQL query failed');\n } \n }\n catch (e) {\n LogError(e);\n throw e;\n }\n }\n\n /**\n * Retrieves the data context item data for the specified data context item ID.\n * @param dataContextItemID \n * @returns \n */\n public async GetDataContextItemData(dataContextItemID: string) {\n try {\n const query = gql`query GetDataContextItemData ($DataContextItemID: String!) {\n GetDataContextItemData(DataContextItemID: $DataContextItemID) {\n Success\n ErrorMessage\n Result\n }\n }`\n \n const data = await this.ExecuteGQL(query, {DataContextItemID: dataContextItemID});\n if (data && data.GetDataContextItemData) {\n if (data.GetDataContextItemData.Success) {\n return JSON.parse(data.GetDataContextItemData.Result);\n }\n else {\n throw new Error(data.GetDataContextItemData.ErrorMessage);\n }\n }\n else {\n throw new Error('GraphQL query failed');\n } \n }\n catch (e) {\n LogError(e);\n throw e;\n }\n }\n\n /**\n * Static version of the ExecuteGQL method that will use the global instance of the GraphQLDataProvider and execute the specified query with the provided variables. \n * If the token is expired, it will attempt to refresh the token and then re-execute the query. If the token is expired and the refresh fails, it will throw an error.\n * @param query \n * @param variables \n * @param refreshTokenIfNeeded \n * @returns \n */\n public static async ExecuteGQL(query: string, variables: any, refreshTokenIfNeeded: boolean = true): Promise<any> {\n return GraphQLDataProvider.Instance.ExecuteGQL(query, variables, refreshTokenIfNeeded);\n }\n\n /**\n * Executes the GQL query with the provided variables. If the token is expired, it will attempt to refresh the token and then re-execute the query. If the token is expired and the refresh fails, it will throw an error.\n * @param query \n * @param variables \n * @param refreshTokenIfNeeded \n * @returns \n */\n public async ExecuteGQL(query: string, variables: any, refreshTokenIfNeeded: boolean = true): Promise<any> {\n try {\n const data = await this._client.request(query, variables);\n return data;\n }\n catch (e) {\n // Enhanced error logging to diagnose 500 errors\n console.log('[GraphQL] ExecuteGQL error caught:', {\n hasResponse: !!e?.response,\n hasErrors: !!e?.response?.errors,\n errorCount: e?.response?.errors?.length,\n firstError: e?.response?.errors?.[0],\n errorCode: e?.response?.errors?.[0]?.extensions?.code,\n errorMessage: e?.response?.errors?.[0]?.message,\n fullError: e\n });\n\n if (e && e.response && e.response.errors?.length > 0) {//e.code === 'JWT_EXPIRED') {\n const error = e.response.errors[0];\n const code = error?.extensions?.code?.toUpperCase().trim()\n console.log('[GraphQL] Error code detected:', code);\n if (code === 'JWT_EXPIRED') {\n if (refreshTokenIfNeeded) {\n // token expired, so we need to refresh it and try again\n await this.RefreshToken();\n return await this.ExecuteGQL(query, variables, false/*don't attempt to refresh again*/);\n }\n else {\n // token expired but the caller doesn't want a refresh, so just return the error\n LogError(`JWT_EXPIRED and refreshTokenIfNeeded is false`);\n throw e;\n }\n }\n else\n throw e;\n }\n else {\n LogError(e);\n throw e; // force the caller to handle the error\n }\n }\n }\n\n public async RefreshToken(): Promise<void> {\n // Check if we're in singleton mode\n const isInstanceSingleton = GraphQLDataProvider.Instance &&\n GraphQLDataProvider.Instance._configData === this._configData;\n\n // If singleton has a refresh in progress, wait for it\n if (isInstanceSingleton && GraphQLDataProvider.Instance._refreshPromise) {\n console.log('[GraphQL] Token refresh already in progress (singleton), waiting...');\n return GraphQLDataProvider.Instance._refreshPromise;\n }\n\n // If this instance has a refresh in progress, wait for it\n if (this._refreshPromise) {\n console.log('[GraphQL] Token refresh already in progress (instance), waiting...');\n return this._refreshPromise;\n }\n\n // Start a new refresh\n console.log('[GraphQL] Starting token refresh...');\n this._refreshPromise = this.performTokenRefresh();\n\n // Also store on singleton if in singleton mode\n if (isInstanceSingleton) {\n GraphQLDataProvider.Instance._refreshPromise = this._refreshPromise;\n }\n\n try {\n await this._refreshPromise;\n console.log('[GraphQL] Token refresh completed successfully');\n } finally {\n // Clear the promise when done\n this._refreshPromise = null;\n if (isInstanceSingleton && GraphQLDataProvider.Instance) {\n GraphQLDataProvider.Instance._refreshPromise = null;\n }\n }\n }\n\n private async performTokenRefresh(): Promise<void> {\n if (this._configData.Data.RefreshTokenFunction) {\n const newToken = await this._configData.Data.RefreshTokenFunction();\n if (newToken) {\n this._configData.Token = newToken; // update the token\n const newClient = this.CreateNewGraphQLClient(this._configData.URL,\n this._configData.Token,\n this._sessionId,\n this._configData.MJAPIKey);\n\n // Update this instance's client\n this._client = newClient;\n\n // CRITICAL: Also update the singleton's client if we're in singleton mode\n // Check if this._configData is the same reference as Instance._configData\n if (GraphQLDataProvider.Instance &&\n GraphQLDataProvider.Instance._configData === this._configData) {\n GraphQLDataProvider.Instance._client = newClient;\n }\n }\n else {\n throw new Error('Refresh token function returned null or undefined token');\n }\n }\n else {\n throw new Error('No refresh token function provided');\n }\n }\n\n public static async RefreshToken(): Promise<void> {\n return GraphQLDataProvider.Instance.RefreshToken();\n }\n\n protected CreateNewGraphQLClient(url: string, token: string, sessionId: string, mjAPIKey: string): GraphQLClient {\n // Enhanced logging to diagnose token issues\n const tokenPreview = token ? `${token.substring(0, 20)}...${token.substring(token.length - 10)}` : 'NO TOKEN';\n console.log('[GraphQL] Creating new client:', {\n url,\n tokenPreview,\n tokenLength: token?.length,\n sessionId,\n hasMJAPIKey: !!mjAPIKey\n });\n\n const headers: Record<string, string> = {\n 'x-session-id': sessionId,\n };\n if (token)\n headers.authorization = 'Bearer ' + token;\n if (mjAPIKey)\n headers['x-mj-api-key'] = mjAPIKey;\n\n return new GraphQLClient(url, {\n headers\n });\n }\n\n private _innerCurrentUserQueryString = `CurrentUser {\n ${this.userInfoString()}\n UserRoles_UserIDArray {\n ${this.userRoleInfoString()}\n }\n }\n `\n\n\n private _currentUserQuery = gql`query CurrentUserAndRoles {\n ${this._innerCurrentUserQueryString}\n }`\n\n\n\n private userInfoString(): string {\n return this.infoString(new UserInfo(null, null))\n }\n private userRoleInfoString(): string {\n return this.infoString(new UserRoleInfo(null))\n }\n private infoString(object: any): string {\n let sOutput: string = '';\n const keys = Object.keys(object)\n for (const k of keys) {\n if (k.startsWith('__mj_')) {\n sOutput += k.replace('__mj_', '_mj__') + '\\n '\n }\n else if (!k.startsWith('_')) {\n sOutput += k + '\\n '\n }\n }\n return sOutput\n }\n\n\n private _localStorageProvider: ILocalStorageProvider;\n get LocalStorageProvider(): ILocalStorageProvider {\n if (!this._localStorageProvider)\n this._localStorageProvider = new BrowserIndexedDBStorageProvider();\n\n return this._localStorageProvider;\n }\n\n\n /**************************************************************************/\n // END ---- IMetadataProvider\n /**************************************************************************/\n protected get Metadata(): IMetadataProvider {\n return this;\n }\n\n private _wsClient: Client = null;\n private _wsClientCreatedAt: number = null;\n private _pushStatusSubjects: Map<string, {\n subject: Subject<string>,\n subscription: Subscription,\n createdAt: number,\n lastRequestedAt: number,\n lastEmissionAt: number,\n activeSubscribers: number\n }> = new Map();\n // Tracks total WebSocket subscriptions (not component subscribers)\n // Used to prevent disposing client when subscriptions are active\n private _activeSubscriptionCount = 0;\n private readonly WS_CLIENT_MAX_AGE_MS = 30 * 60 * 1000; // 30 minutes\n private readonly SUBSCRIPTION_CLEANUP_INTERVAL_MS = 5 * 60 * 1000; // 5 minutes\n private readonly SUBSCRIPTION_IDLE_TIMEOUT_MS = 10 * 60 * 1000; // 10 minutes\n private _subscriptionCleanupTimer: NodeJS.Timeout = null;\n private _isCleaningUp = false; // Prevent concurrent cleanup\n\n /**\n * Gets or creates a WebSocket client with health checking and automatic cleanup\n * @returns Active WebSocket client\n */\n private getOrCreateWSClient(): Client {\n const now = Date.now();\n\n // Check if existing client is too old and should be recreated\n if (this._wsClient && this._wsClientCreatedAt) {\n const age = now - this._wsClientCreatedAt;\n if (age > this.WS_CLIENT_MAX_AGE_MS && this._activeSubscriptionCount === 0) {\n // Client is old and no active subscriptions, recreate it\n this.disposeWSClient();\n }\n }\n\n // Create new client if needed\n if (!this._wsClient) {\n this._wsClient = createClient({\n url: this.ConfigData.WSURL,\n connectionParams: {\n Authorization: 'Bearer ' + this.ConfigData.Token,\n },\n keepAlive: 30000, // Send keepalive ping every 30 seconds\n retryAttempts: 3,\n shouldRetry: () => true,\n });\n this._wsClientCreatedAt = now;\n\n // Start cleanup timer if not already running\n if (!this._subscriptionCleanupTimer) {\n this._subscriptionCleanupTimer = setInterval(() => {\n this.cleanupStaleSubscriptions();\n }, this.SUBSCRIPTION_CLEANUP_INTERVAL_MS);\n }\n }\n\n return this._wsClient;\n }\n\n /**\n * Disposes of the WebSocket client\n * Does NOT complete subjects - caller should handle that separately to avoid double-cleanup\n */\n private disposeWSClient(): void {\n if (this._wsClient) {\n try {\n this._wsClient.dispose();\n } catch (e) {\n console.error('[GraphQLDataProvider] Error disposing WebSocket client:', e);\n }\n this._wsClient = null;\n this._wsClientCreatedAt = null;\n }\n }\n\n /**\n * Completes all subjects and clears the cache\n * Separate from disposeWSClient to avoid double-cleanup\n */\n private completeAllSubjects(): void {\n this._pushStatusSubjects.forEach((entry, sessionId) => {\n try {\n entry.subject.complete();\n entry.subscription.unsubscribe();\n } catch (e) {\n console.error(`[GraphQLDataProvider] Error cleaning up subject for ${sessionId}:`, e);\n }\n });\n this._pushStatusSubjects.clear();\n }\n\n /**\n * Cleans up stale subscription subjects that haven't been used recently\n * Uses cleanup flag to prevent concurrent execution\n * Uses Map snapshot to avoid concurrent modification issues\n */\n private cleanupStaleSubscriptions(): void {\n // Prevent concurrent cleanup\n if (this._isCleaningUp) {\n return;\n }\n this._isCleaningUp = true;\n\n try {\n const now = Date.now();\n const initialCount = this._pushStatusSubjects.size;\n\n // Create snapshot to avoid concurrent modification during iteration\n const entries = Array.from(this._pushStatusSubjects.entries());\n const toRemove: string[] = [];\n\n // Identify stale subscriptions (must have no active subscribers AND be idle)\n entries.forEach(([sessionId, value]) => {\n const timeSinceRequested = now - value.lastRequestedAt;\n const timeSinceEmission = now - value.lastEmissionAt;\n\n // Clean up if ALL conditions are true:\n // 1. No active subscribers (no component is listening)\n // 2. Not requested recently (no component has requested it)\n // 3. Not receiving data (no active server communication)\n const shouldCleanup = value.activeSubscribers === 0 &&\n timeSinceRequested >= this.SUBSCRIPTION_IDLE_TIMEOUT_MS &&\n timeSinceEmission >= this.SUBSCRIPTION_IDLE_TIMEOUT_MS;\n\n if (shouldCleanup) {\n console.log(`[GraphQLDataProvider] Marking session ${sessionId} for cleanup: ` +\n `activeSubscribers=${value.activeSubscribers}, ` +\n `timeSinceRequested=${Math.round(timeSinceRequested/1000)}s, ` +\n `timeSinceEmission=${Math.round(timeSinceEmission/1000)}s`);\n toRemove.push(sessionId);\n }\n });\n\n // Complete subjects and unsubscribe from WebSocket\n toRemove.forEach(sessionId => {\n const entry = this._pushStatusSubjects.get(sessionId);\n if (entry) {\n try {\n entry.subject.complete(); // Completes for ALL subscribers\n entry.subscription.unsubscribe(); // Closes WebSocket subscription\n this._pushStatusSubjects.delete(sessionId);\n console.log(`[GraphQLDataProvider] Cleaned up stale subscription for session: ${sessionId}`);\n } catch (e) {\n console.error(`[GraphQLDataProvider] Error cleaning up subscription for ${sessionId}:`, e);\n }\n }\n });\n\n if (toRemove.length > 0) {\n console.log(`[GraphQLDataProvider] Cleaned up ${toRemove.length} stale subscription(s)`);\n }\n\n // If no subscriptions remain and client is old, dispose of it\n if (this._pushStatusSubjects.size === 0 && this._wsClient && this._wsClientCreatedAt) {\n const clientAge = now - this._wsClientCreatedAt;\n if (clientAge > this.WS_CLIENT_MAX_AGE_MS) {\n console.log('[GraphQLDataProvider] Disposing of idle WebSocket client');\n this.disposeWSClient();\n }\n }\n } finally {\n this._isCleaningUp = false;\n }\n }\n\n /**\n * Generic subscription method for GraphQL subscriptions\n * @param subscription The GraphQL subscription query\n * @param variables Variables to pass to the subscription\n * @returns Observable that emits subscription data\n */\n public subscribe(subscription: string, variables?: any): Observable<any> {\n return new Observable((observer) => {\n const client = this.getOrCreateWSClient();\n this._activeSubscriptionCount++;\n\n const unsubscribe = client.subscribe(\n { query: subscription, variables },\n {\n next: (data) => {\n observer.next(data.data);\n },\n error: async (error: unknown) => {\n // Check if error is JWT_EXPIRED\n const errorObj = error as { extensions?: { code?: string }, message?: string };\n const isTokenExpired =\n errorObj?.extensions?.code === 'JWT_EXPIRED' ||\n errorObj?.message?.includes('token has expired') ||\n errorObj?.message?.includes('JWT_EXPIRED');\n\n if (isTokenExpired) {\n console.log('[GraphQLDataProvider] WebSocket JWT token expired, refreshing and reconnecting...');\n try {\n // Refresh the token\n await this.RefreshToken();\n\n // Dispose old WebSocket client\n this.disposeWSClient();\n\n // Observer will be completed, and caller should re-subscribe\n // which will create a new WebSocket connection with the new token\n observer.complete();\n } catch (refreshError) {\n console.error('[GraphQLDataProvider] Failed to refresh token for WebSocket:', refreshError);\n observer.error(refreshError);\n }\n } else {\n observer.error(error);\n }\n },\n complete: () => {\n observer.complete();\n },\n }\n );\n\n // Return cleanup function - this is ALWAYS called when subscription ends\n // whether by error, completion, or manual unsubscribe\n return () => {\n this._activeSubscriptionCount--;\n unsubscribe();\n };\n });\n }\n\n public PushStatusUpdates(sessionId: string = null): Observable<string> {\n if (!sessionId)\n sessionId = this.sessionId;\n\n const now = Date.now();\n\n // Check for existing subject\n const existing = this._pushStatusSubjects.get(sessionId);\n if (existing) {\n // Update last requested time\n existing.lastRequestedAt = now;\n // Wrap with defer to increment on subscribe and finalize to decrement on unsubscribe\n return new Observable<string>((observer) => {\n // Increment subscriber count when Observable is subscribed to\n existing.activeSubscribers++;\n\n // Subscribe to the underlying Subject\n const subscription = existing.subject.subscribe(observer);\n\n // Return teardown function that decrements count\n return () => {\n const entry = this._pushStatusSubjects.get(sessionId);\n if (entry && entry.activeSubscribers > 0) {\n entry.activeSubscribers--;\n }\n subscription.unsubscribe();\n };\n });\n }\n\n const SUBSCRIBE_TO_STATUS = gql`subscription StatusUpdates($sessionId: String!) {\n statusUpdates(sessionId: $sessionId) {\n date\n message\n sessionId\n }\n }\n `;\n\n // Create new Subject for status updates (no buffering - status updates are ephemeral)\n const subject = new Subject<string>();\n const client = this.getOrCreateWSClient();\n\n // Subscribe to WebSocket and pipe data to Subject\n const subscription = new Subscription();\n subscription.add(\n new Observable((observer) => {\n const unsubscribe = client.subscribe(\n { query: SUBSCRIBE_TO_STATUS, variables: { sessionId } },\n {\n next: (data: any) => {\n // Update last emission time\n const entry = this._pushStatusSubjects.get(sessionId);\n if (entry) {\n entry.lastEmissionAt = Date.now();\n }\n // Extract the message and emit to subject\n observer.next(data.data.statusUpdates.message);\n },\n error: async (error: unknown) => {\n // Check if error is JWT_EXPIRED\n const errorObj = error as { extensions?: { code?: string }, message?: string };\n const isTokenExpired =\n errorObj?.extensions?.code === 'JWT_EXPIRED' ||\n errorObj?.message?.includes('token has expired') ||\n errorObj?.message?.includes('JWT_EXPIRED');\n\n if (isTokenExpired) {\n console.log('[GraphQLDataProvider] PushStatusUpdates JWT token expired, refreshing and reconnecting...');\n try {\n // Refresh the token\n await this.RefreshToken();\n\n // Dispose old WebSocket client\n this.disposeWSClient();\n\n // Complete the subscription - components will auto-reconnect via RxJS retry logic\n observer.complete();\n } catch (refreshError) {\n console.error('[GraphQLDataProvider] Failed to refresh token for PushStatusUpdates:', refreshError);\n observer.error(refreshError);\n }\n } else {\n observer.error(error);\n }\n },\n complete: () => {\n observer.complete();\n },\n }\n );\n\n // Increment AFTER successful subscription setup\n this._activeSubscriptionCount++;\n\n return () => {\n this._activeSubscriptionCount--;\n unsubscribe();\n };\n }).subscribe({\n next: (message: string) => subject.next(message),\n error: (error) => {\n // On error, complete subject and remove from cache\n subject.error(error);\n this._pushStatusSubjects.delete(sessionId);\n },\n complete: () => {\n // On completion, complete subject and remove from cache\n subject.complete();\n this._pushStatusSubjects.delete(sessionId);\n }\n })\n );\n\n // Store subject with tracking data\n this._pushStatusSubjects.set(sessionId, {\n subject,\n subscription,\n createdAt: now,\n lastRequestedAt: now,\n lastEmissionAt: now,\n activeSubscribers: 0 // Will be incremented when first component subscribes\n });\n\n // Wrap return Observable to track subscribers\n return new Observable<string>((observer) => {\n // Increment subscriber count when Observable is subscribed to\n const entry = this._pushStatusSubjects.get(sessionId);\n if (entry) {\n entry.activeSubscribers++;\n }\n\n // Subscribe to the underlying Subject\n const sub = subject.subscribe(observer);\n\n // Return teardown function that decrements count\n return () => {\n const entry = this._pushStatusSubjects.get(sessionId);\n if (entry && entry.activeSubscribers > 0) {\n entry.activeSubscribers--;\n }\n sub.unsubscribe();\n };\n });\n }\n\n /**\n * Public method to dispose of WebSocket resources\n * Call this when shutting down the provider or on logout\n */\n public disposeWebSocketResources(): void {\n // Stop cleanup timer\n if (this._subscriptionCleanupTimer) {\n clearInterval(this._subscriptionCleanupTimer);\n this._subscriptionCleanupTimer = null;\n }\n\n // Complete all subjects and clear cache\n this.completeAllSubjects();\n\n // Reset counters\n this._activeSubscriptionCount = 0;\n\n // Dispose WebSocket client\n this.disposeWSClient();\n }\n}\n\n\n// this class implements a simple in-memory only storage as a fallback if the browser doesn't support local storage\nclass BrowserStorageProviderBase implements ILocalStorageProvider {\n private _localStorage: { [key: string]: string } = {};\n\n public async GetItem(key: string): Promise<string | null> {\n return new Promise((resolve) => {\n if (this._localStorage.hasOwnProperty(key))\n resolve(this._localStorage[key]);\n else\n resolve(null);\n });\n }\n\n public async SetItem(key: string, value: string): Promise<void> {\n return new Promise((resolve) => {\n this._localStorage[key] = value;\n resolve();\n });\n }\n\n public async Remove(key: string): Promise<void> {\n return new Promise((resolve) => {\n if (this._localStorage.hasOwnProperty(key)) {\n delete this._localStorage[key];\n }\n resolve();\n });\n }\n}\n\n\n// This implementation just wraps the browser local storage and if for some reason the browser doesn't\n// have a localStorage object, we just use a simple object to store the data in memory.\nclass BrowserLocalStorageProvider extends BrowserStorageProviderBase {\n public async getItem(key: string): Promise<string | null> {\n if (localStorage)\n return localStorage.getItem(key);\n else\n return await super.GetItem(key)\n }\n\n public async setItem(key: string, value: string): Promise<void> {\n if (localStorage)\n localStorage.setItem(key, value);\n else\n await super.SetItem(key, value)\n }\n\n public async remove(key: string): Promise<void> {\n if (localStorage)\n localStorage.removeItem(key);\n else\n await super.Remove(key)\n }\n}\n\n\n\nconst IDB_DB_NAME = 'MJ_Metadata';\nconst IDB_DB_ObjectStoreName = 'Metadata_KVPairs';\n\ninterface MJ_MetadataDB extends DBSchema {\n 'Metadata_KVPairs': {\n key: string;\n value: any;\n };\n}\n\nclass BrowserIndexedDBStorageProvider extends BrowserStorageProviderBase {\n private dbPromise: Promise<IDBPDatabase<MJ_MetadataDB>>;\n\n constructor() {\n super();\n\n this.dbPromise = openDB<MJ_MetadataDB>(IDB_DB_NAME, 1, {\n upgrade(db) {\n if (!db.objectStoreNames.contains(IDB_DB_ObjectStoreName)) {\n db.createObjectStore(IDB_DB_ObjectStoreName);\n }\n },\n });\n }\n\n async setItem(key: string, value: any): Promise<void> {\n const db = await this.dbPromise;\n const tx = db.transaction(IDB_DB_ObjectStoreName, 'readwrite');\n await tx.objectStore(IDB_DB_ObjectStoreName).put(value, key);\n await tx.done;\n }\n\n async getItem(key: string): Promise<any> {\n const db = await this.dbPromise;\n const value = await db.transaction(IDB_DB_ObjectStoreName).objectStore(IDB_DB_ObjectStoreName).get(key);\n return value;\n }\n\n async remove(key: string): Promise<void> {\n const db = await this.dbPromise;\n const tx = db.transaction(IDB_DB_ObjectStoreName, 'readwrite');\n await tx.objectStore(IDB_DB_ObjectStoreName).delete(key);\n await tx.done;\n }\n}\n","import { RunReport, BaseEntity, Metadata, RunView, RunQuery, SetProvider } from \"@memberjunction/core\";\nimport { GraphQLDataProvider, GraphQLProviderConfigData } from \"./graphQLDataProvider\";\nimport { MJGlobal, MJEventType } from \"@memberjunction/global\";\n\n/**\n * Setup the GraphQL client for the project using the provided configuration data.\n */\nexport async function setupGraphQLClient(config: GraphQLProviderConfigData): Promise<GraphQLDataProvider> {\n // Set the provider for all entities to be GraphQL in this project, can use a different provider in other situations....\n const provider = new GraphQLDataProvider()\n\n // BaseEntity + Metadata share the same GraphQLDataProvider instance\n SetProvider(provider);\n\n await provider.Config(config);\n\n // fire off the logged in event if we get here\n MJGlobal.Instance.RaiseEvent({ event: MJEventType.LoggedIn, eventCode: null, component: this, args: null });\n\n return provider;\n}","import { CompositeKey } from \"@memberjunction/core\";\n\n\n\nexport class SyncRolesAndUsersResult {\n Success: boolean;\n}\n \nexport class RoleInput {\n ID: string;\n\n Name: string;\n \n Description: string;\n}\n\n\nexport class UserInput {\n ID!: string;\n\n Name!: string;\n\n Email!: string;\n\n Type!: 'Owner' | 'User';\n\n FirstName: string;\n\n LastName: string;\n \n Title: string;\n\n Roles?: RoleInput[];\n}\n\nexport class RolesAndUsersInput {\n public Users: UserInput[];\n \n public Roles: RoleInput[];\n}\n\n\n\n/**\n * This type defines the possible list of actions that can be taken in syncing data: Create, Update, CreateOrUpdate, Delete, or DeleteWithFilter\n * DeleteWithFilter is where you specify a valid SQL expression that can be used in a where clause to get a list of records in a given entity to delete\n * this can be used to ensure cleaning out data from a subset of a given table.\n */\nexport enum SyncDataAction {\n Create = \"Create\",\n Update = \"Update\",\n CreateOrUpdate = \"CreateOrUpdate\",\n Delete = \"Delete\",\n DeleteWithFilter = \"DeleteWithFilter\"\n}\n \nexport class ActionItemInput {\n /**\n * The name of the entity where action is to be taken\n */\n EntityName!: string;\n /**\n * For Update, CreateOrUpdate and Delete operations either a PrimaryKey or an AlternateKey must be provided. For Create and DeleteWithFilter operations, neither is used. \n */\n PrimaryKey?: CompositeKey;\n /**\n * For Update, CreateOrUpdate and Delete operations either a PrimaryKey or an AlternateKey must be provided. For Create and DeleteWithFilter operations, neither is used. \n */\n AlternateKey?: CompositeKey;\n /**\n * The type of action requested. The possible values are Create, Update, CreateOrUpdate, Delete, DeleteWithFilter\n */\n Type!: SyncDataAction;\n /**\n * This field is a JSON representation of the field values of the entity to be created or updated. It is used for all ActionTypes except for \n */\n RecordJSON?: string;\n\n /**\n * This field is only provided when the Action Type is DeleteWithFilter. It is a valid SQL expression that can be used in a where clause to get a list of records in a given entity to delete\n */\n DeleteFilter?: string;\n}\n \n\nexport class SyncDataResult {\n Success: boolean;\n \n Results: ActionItemOutput[] = [];\n}\n\nexport class ActionItemOutput {\n Success: boolean;\n ErrorMessage: string;\n EntityName!: string;\n PrimaryKey?: CompositeKey;\n AlternateKey?: CompositeKey;\n Type!: SyncDataAction;\n\n /**\n * This field is a JSON representation of the field values of the entity to be created or updated. It is used for all ActionTypes except for \n */\n RecordJSON?: string;\n\n /**\n * This field is only provided when the Action Type is DeleteWithFilter. It is a valid SQL expression that can be used in a where clause to get a list of records in a given entity to delete\n */\n DeleteFilter?: string;\n}","import { CompositeKey, LogError, KeyValuePair, IsVerboseLoggingEnabled } from '@memberjunction/core';\nimport { SafeJSONParse } from '@memberjunction/global';\nimport { gql, GraphQLClient } from 'graphql-request'\nimport { ActionItemInput, RolesAndUsersInput, SyncDataResult, SyncRolesAndUsersResult } from './rolesAndUsersType';\nimport { \n RunAIPromptParams, \n RunAIPromptResult, \n ExecuteSimplePromptParams,\n SimplePromptResult,\n EmbedTextParams,\n EmbedTextResult\n} from './graphQLAIClient';\nimport { ExecuteAgentParams, ExecuteAgentResult } from '@memberjunction/ai-core-plus';\n\n/**\n * Specialized client that is designed to be used exclusively on the server side\n * by the System User using the MJ API KEY. This is designed to allow server side\n * code such as within the context of an MJAPI server to talk to another MAJPI server\n * but as the client.\n * \n * It is possible for a server to use the regular @GraphQLDataProvider client to talk\n * to another MJAPI server, but that would require the server to have a user account\n * and the server would have to be able to log in as that user via a JWT token. This\n * is not always possible or convenient in the flow. \n * \n * Also the standard client configuration process has a certain amount over overhead\n * in always loading up certain metadata that is not necessary for many system user\n * operations.\n * \n * Finaly, this client can be used in parallel with the regular client to allow a server\n * to mix and match the two as needed.\n */\nexport class GraphQLSystemUserClient {\n private _client: GraphQLClient;\n private _sessionId: string;\n /**\n * Returns the underlying GraphQL client which is an instance of the GraphQLClient object\n * from the graphql-request package. This is useful if you want to perform any operation\n * that is not directly supported by this class via specialized methods.\n */\n public get Client(): GraphQLClient {\n return this._client;\n }\n\n /**\n * @param url MJAPI server URL\n * @param token Optional, JWT token that is used for a normal user authentication flow. This is required if mjAPIKey is not provided.\n * @param sessionId Optional, UUID that is used to track a session. This can be any string.\n * @param mjAPIKey Shared Secret key that is provided for system user authentication. This is required if token is not provided.\n * @returns \n */\n constructor (url: string, token: string, sessionId: string, mjAPIKey: string) {\n const headers: Record<string, string> = { \n 'x-session-id': sessionId,\n };\n this._sessionId = sessionId;\n if (token)\n headers.authorization = 'Bearer ' + token;\n if (mjAPIKey)\n headers['x-mj-api-key'] = mjAPIKey;\n\n this._client = new GraphQLClient(url, {\n headers\n });\n }\n\n /**\n * Calls the GetData() query on the server to execute any number of provided SQL queries in parallel and returns the results.\n * The queries MUST BE read only and not perform any DML operations. The remote server will execute the queries using a special\n * lower-privilege user that is not allowed to perform any form of write operations.\n * @param queries an array of SQL queries to execute on the remote server\n * @param accessToken the short-lived access token that is required to perform this operation. This is different from the MJAPI key and is used for a second factor and is a short-lived token. You will receive this token \n * when an MJAPI calls your server to request something along with the URL to call back.\n * @returns \n */\n public async GetData(queries: string[], accessToken: string): Promise<GetDataOutput> {\n try {\n const query = `query GetData($input: GetDataInputType!) {\n GetData(input: $input) {\n Success\n ErrorMessages\n Queries\n Results\n }\n }`\n const result = await this.Client.request(query, {input: {Queries: queries, Token: accessToken}}) as {GetData: GetDataOutput};\n if (result && result.GetData) {\n // for each succesful item, we will parse and return the array of objects instead of the string\n return {\n Success: result.GetData.Success,\n Results: result.GetData.Results.map(r => r ? SafeJSONParse(r) : null),\n ErrorMessages: result.GetData.ErrorMessages,\n Queries: result.GetData.Queries \n }\n }\n else {\n return {\n Success: false,\n Results: [],\n ErrorMessages: result.GetData?.ErrorMessages ?? ['Unknown error'],\n Queries: result.GetData?.Queries ?? queries\n }\n }\n }\n catch (e) {\n // Extract clean error message - the GraphQL error response contains the actual SQL error\n let cleanError = e instanceof Error ? e.message : String(e);\n\n // Try to extract just the SQL error from GraphQL response\n // Look for the actual error message before the JSON payload\n const match = cleanError.match(/Error: ([^:]+)\\./);\n if (match) {\n cleanError = match[1] + '.';\n }\n\n // Only log verbose details if in verbose mode\n if (IsVerboseLoggingEnabled()) {\n const verboseError = `GraphQLSystemUserClient::GetData - Error getting data - ${e}`;\n LogError(verboseError);\n }\n\n return {\n Success: false,\n Results: [],\n ErrorMessages: [cleanError],\n Queries: queries\n }\n }\n }\n\n /**\n * This method will return a list of all entities that are available on the remote server. This is a lightweight call that only returns the basic metadata for each entity and does not include all of the attributes at \n * either the entity or the field level. This is useful for getting a list of entities that are available on the remote server and knowing their IDs and Entity Field IDs on the remote server. For core MemberJunction \n * entities and entity fields, the ID values are globally unique and set by the MemberJunction distribution, however, for other entities that are generated on each target system they can vary so it is best to use\n * lookups name or a combination of SchemaName and BaseTable to uniquely identify an entity.\n * @param client \n * @returns \n */\n public async GetAllRemoteEntities(): Promise<SimpleRemoteEntityOutput> {\n try {\n const query = `query GetAllEntities {\n GetAllEntities {\n Success\n ErrorMessage\n Results {\n ID\n Name\n Description\n SchemaName\n BaseView\n BaseTable\n CodeName\n ClassName\n Fields {\n ID\n Name\n Description\n Type\n AllowsNull\n MaxLength\n }\n }\n }\n }`\n\n const result = (await this.Client.request(query)) as {GetAllEntities: SimpleRemoteEntityOutput};\n if (result && result.GetAllEntities) {\n return result.GetAllEntities;\n }\n else {\n return {\n Success: false,\n Results: [],\n ErrorMessage: result.GetAllEntities?.ErrorMessage ?? 'Unknown error'\n }\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::GetAllRemoteEntities - Error getting remote entities - ${e}`);\n return {\n Success: false,\n Results: [],\n ErrorMessage: e\n }\n }\n }\n\n /**\n * This method is used to invoke the data synchronization mutation on the remote server. This method is used to create, update, or delete records in the remote server. The method takes an array of ActionItemInput objects\n * Each of the ActionItemInput objects represents a single action to take on a single entity. The action can be Create, Update, CreateOrUpdate, Delete, or DeleteWithFilter. The RecordJSON field is used for Create, CreateOrUpdate and Update whereas\n * the DeleteFilter field is used for DeleteWithFilter. The PrimaryKey and AlternateKey fields are used to identify the record to be acted upon. \n * \n * Use of the AlternateKey is important for situations where you might have divergent primary keys across systems. For example for user entities that are individually generated on each system by CodeGen, the primary key will\n * be different per system, so you would use the combination of the SchemaName and BaseTable to identify the entity and then use the AlternateKey to provide the combination of these fields to uniquely identify the record for updates.\n * @param items \n * @returns \n */\n public async SyncData(items: ActionItemInput[]): Promise<SyncDataResult> {\n try {\n // call the resolver to sync the roles and users\n const query = `mutation SyncData($items: [ActionItemInputType!]!) {\n SyncData(items: $items) {\n Success\n Results {\n Success\n ErrorMessage\n EntityName\n Type\n PrimaryKey {\n KeyValuePairs {\n FieldName\n Value \n }\n }\n AlternateKey {\n KeyValuePairs {\n FieldName\n Value \n }\n }\n DeleteFilter\n RecordJSON\n }\n }\n }`\n const d = <{SyncData: SyncDataResult}>await this.Client.request(query, {items});\n if (d && d.SyncData) {\n return d.SyncData;\n }\n else {\n return {\n Success: false,\n Results: []\n }\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::SyncData - Error syncing data - ${e}`);\n return {\n Success: false,\n Results: []\n }\n }\n }\n\n /**\n * This method will sync the roles and users on the remote server. This method is used to create, update, or delete roles and users on the remote server. \n * The method takes a RolesAndUsersInput object that contains an array of RoleInput objects. Note that this will not result in the removal of roles on the \n * remote server that are deemed to be built-in MemberJunction roles such as Developer, Integration and UI.\n * @param data \n * @returns \n */\n public async SyncRolesAndUsers(data: RolesAndUsersInput): Promise<SyncRolesAndUsersResult> {\n try {\n // call the resolver to sync the roles and users\n const query = `mutation SyncRolesAndUsers($data: RolesAndUsersInputType!) {\n SyncRolesAndUsers(data: $data) {\n Success\n }\n }`\n const d = await this.Client.request(query, {data}) as {SyncRolesAndUsers: SyncRolesAndUsersResult};\n if (d && d.SyncRolesAndUsers) {\n return d.SyncRolesAndUsers;\n }\n else {\n return {\n Success: false\n }\n }\n } \n catch (e) {\n LogError(`GraphQLSystemUserClient::SyncRolesAndUsers - Error syncing roles and users - ${e}`);\n return {\n Success: false\n }\n } \n }\n\n /**\n * Runs a view by name using the RunViewByNameSystemUser resolver.\n * @param input - View input parameters for running by name\n * @returns Promise containing the view execution results\n */\n public async RunViewByName(input: RunViewByNameSystemUserInput): Promise<RunViewSystemUserResult> {\n try {\n const query = `query RunViewByNameSystemUser($input: RunViewByNameInput!) {\n RunViewByNameSystemUser(input: $input) {\n Results {\n PrimaryKey {\n FieldName\n Value\n }\n EntityID\n Data\n }\n UserViewRunID\n RowCount\n TotalRowCount\n ExecutionTime\n ErrorMessage\n Success\n }\n }`\n\n const result = await this.Client.request(query, { input }) as { RunViewByNameSystemUser: RunViewSystemUserResult };\n if (result && result.RunViewByNameSystemUser) {\n return result.RunViewByNameSystemUser;\n } else {\n return {\n Results: [],\n Success: false,\n ErrorMessage: 'Failed to execute view by name'\n };\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::RunViewByNameSystemUser - Error running view by name - ${e}`);\n return {\n Results: [],\n Success: false,\n ErrorMessage: e.toString()\n };\n }\n }\n\n /**\n * Runs a view by ID using the RunViewByIDSystemUser resolver.\n * @param input - View input parameters for running by ID\n * @returns Promise containing the view execution results\n */\n public async RunViewByID(input: RunViewByIDSystemUserInput): Promise<RunViewSystemUserResult> {\n try {\n const query = `query RunViewByIDSystemUser($input: RunViewByIDInput!) {\n RunViewByIDSystemUser(input: $input) {\n Results {\n PrimaryKey {\n FieldName\n Value\n }\n EntityID\n Data\n }\n UserViewRunID\n RowCount\n TotalRowCount\n ExecutionTime\n ErrorMessage\n Success\n }\n }`\n\n const result = await this.Client.request(query, { input }) as { RunViewByIDSystemUser: RunViewSystemUserResult };\n if (result && result.RunViewByIDSystemUser) {\n return result.RunViewByIDSystemUser;\n } else {\n return {\n Results: [],\n Success: false,\n ErrorMessage: 'Failed to execute view by ID'\n };\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::RunViewByIDSystemUser - Error running view by ID - ${e}`);\n return {\n Results: [],\n Success: false,\n ErrorMessage: e.toString()\n };\n }\n }\n\n /**\n * Runs a dynamic view using the RunDynamicViewSystemUser resolver.\n * @param input - View input parameters for dynamic view execution\n * @returns Promise containing the view execution results\n */\n public async RunDynamicView(input: RunDynamicViewSystemUserInput): Promise<RunViewSystemUserResult> {\n try {\n const query = `query RunDynamicViewSystemUser($input: RunDynamicViewInput!) {\n RunDynamicViewSystemUser(input: $input) {\n Results {\n PrimaryKey {\n FieldName\n Value\n }\n EntityID\n Data\n }\n UserViewRunID\n RowCount\n TotalRowCount\n ExecutionTime\n ErrorMessage\n Success\n }\n }`\n\n const result = await this.Client.request(query, { input }) as { RunDynamicViewSystemUser: RunViewSystemUserResult };\n if (result && result.RunDynamicViewSystemUser) {\n return result.RunDynamicViewSystemUser;\n } else {\n return {\n Results: [],\n Success: false,\n ErrorMessage: 'Failed to execute dynamic view'\n };\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::RunDynamicViewSystemUser - Error running dynamic view - ${e}`);\n return {\n Results: [],\n Success: false,\n ErrorMessage: e.toString()\n };\n }\n }\n\n /**\n * Runs multiple views using the RunViewsSystemUser resolver. This method allows system users\n * to execute view queries with the same functionality as regular users but with system-level privileges.\n * @param input - Array of view input parameters\n * @returns Promise containing the results from all view executions\n */\n public async RunViews(input: RunViewSystemUserInput[]): Promise<RunViewSystemUserResult[]> {\n try {\n const query = `query RunViewsSystemUser($input: [RunViewGenericInput!]!) {\n RunViewsSystemUser(input: $input) {\n Results {\n PrimaryKey {\n FieldName\n Value\n }\n EntityID\n Data\n }\n UserViewRunID\n RowCount\n TotalRowCount\n ExecutionTime\n ErrorMessage\n Success\n }\n }`\n\n const result = await this.Client.request(query, { input }) as { RunViewsSystemUser: RunViewSystemUserResult[] };\n if (result && result.RunViewsSystemUser) {\n return result.RunViewsSystemUser;\n } else {\n return [];\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::RunViewsSystemUser - Error running views - ${e}`);\n return [];\n }\n }\n\n /**\n * Executes a stored query by ID using the GetQueryDataSystemUser resolver.\n * @param input - Query input parameters for execution by ID\n * @returns Promise containing the query execution results\n */\n public async GetQueryData(input: GetQueryDataSystemUserInput): Promise<RunQuerySystemUserResult> {\n try {\n // Validate that Parameters is a JSON object, not an array\n if (input.Parameters !== undefined && Array.isArray(input.Parameters)) {\n throw new Error('Parameters must be a JSON object, not an array. Use {} for empty parameters instead of [].');\n }\n\n const query = `query GetQueryDataSystemUser($QueryID: String!, $CategoryID: String, $CategoryPath: String, $Parameters: JSONObject, $MaxRows: Int, $StartRow: Int) {\n GetQueryDataSystemUser(QueryID: $QueryID, CategoryID: $CategoryID, CategoryPath: $CategoryPath, Parameters: $Parameters, MaxRows: $MaxRows, StartRow: $StartRow) {\n QueryID\n QueryName\n Success\n Results\n RowCount\n TotalRowCount\n ExecutionTime\n ErrorMessage\n AppliedParameters\n }\n }`\n\n const variables: any = { QueryID: input.QueryID };\n if (input.CategoryID !== undefined) variables.CategoryID = input.CategoryID;\n if (input.CategoryPath !== undefined) variables.CategoryPath = input.CategoryPath;\n if (input.Parameters !== undefined) variables.Parameters = input.Parameters;\n if (input.MaxRows !== undefined) variables.MaxRows = input.MaxRows;\n if (input.StartRow !== undefined) variables.StartRow = input.StartRow;\n\n const result = await this.Client.request(query, variables) as { GetQueryDataSystemUser: RunQuerySystemUserResult };\n \n if (result && result.GetQueryDataSystemUser) {\n // Parse the JSON results for easier consumption\n return {\n ...result.GetQueryDataSystemUser,\n Results: result.GetQueryDataSystemUser.Results ? SafeJSONParse(result.GetQueryDataSystemUser.Results) : null\n };\n } else {\n return {\n QueryID: input.QueryID,\n QueryName: '',\n Success: false,\n Results: null,\n RowCount: 0,\n TotalRowCount: 0,\n ExecutionTime: 0,\n ErrorMessage: 'Query execution failed'\n };\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::GetQueryDataSystemUser - Error executing query - ${e}`);\n return {\n QueryID: input.QueryID,\n QueryName: '',\n Success: false,\n Results: null,\n RowCount: 0,\n TotalRowCount: 0,\n ExecutionTime: 0,\n ErrorMessage: e.toString()\n };\n }\n }\n\n /**\n * Executes a stored query by name using the GetQueryDataByNameSystemUser resolver.\n * @param input - Query input parameters for execution by name\n * @returns Promise containing the query execution results\n */\n public async GetQueryDataByName(input: GetQueryDataByNameSystemUserInput): Promise<RunQuerySystemUserResult> {\n try {\n // Validate that Parameters is a JSON object, not an array\n if (input.Parameters !== undefined && Array.isArray(input.Parameters)) {\n throw new Error('Parameters must be a JSON object, not an array. Use {} for empty parameters instead of [].');\n }\n\n const query = `query GetQueryDataByNameSystemUser($QueryName: String!, $CategoryID: String, $CategoryPath: String, $Parameters: JSONObject, $MaxRows: Int, $StartRow: Int) {\n GetQueryDataByNameSystemUser(QueryName: $QueryName, CategoryID: $CategoryID, CategoryPath: $CategoryPath, Parameters: $Parameters, MaxRows: $MaxRows, StartRow: $StartRow) {\n QueryID\n QueryName\n Success\n Results\n RowCount\n TotalRowCount\n ExecutionTime\n ErrorMessage\n AppliedParameters\n }\n }`\n\n const variables: any = { QueryName: input.QueryName };\n if (input.CategoryID !== undefined) variables.CategoryID = input.CategoryID;\n if (input.CategoryPath !== undefined) variables.CategoryPath = input.CategoryPath;\n if (input.Parameters !== undefined) variables.Parameters = input.Parameters;\n if (input.MaxRows !== undefined) variables.MaxRows = input.MaxRows;\n if (input.StartRow !== undefined) variables.StartRow = input.StartRow;\n\n const result = await this.Client.request(query, variables) as { GetQueryDataByNameSystemUser: RunQuerySystemUserResult };\n \n if (result && result.GetQueryDataByNameSystemUser) {\n // Parse the JSON results for easier consumption\n return {\n ...result.GetQueryDataByNameSystemUser,\n Results: result.GetQueryDataByNameSystemUser.Results ? SafeJSONParse(result.GetQueryDataByNameSystemUser.Results) : null\n };\n } else {\n return {\n QueryID: '',\n QueryName: input.QueryName,\n Success: false,\n Results: null,\n RowCount: 0,\n TotalRowCount: 0,\n ExecutionTime: 0,\n ErrorMessage: 'Query execution failed'\n };\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::GetQueryDataByNameSystemUser - Error executing query - ${e}`);\n return {\n QueryID: '',\n QueryName: input.QueryName,\n Success: false,\n Results: null,\n RowCount: 0,\n TotalRowCount: 0,\n ExecutionTime: 0,\n ErrorMessage: e.toString()\n };\n }\n }\n\n /**\n * Creates a new query using the CreateQuerySystemUser mutation. This method is restricted to system users only.\n * @param input - CreateQuerySystemUserInput containing all the query attributes including optional CategoryPath\n * @returns Promise containing the result of the query creation\n */\n public async CreateQuery(input: CreateQueryInput): Promise<CreateQueryResult> {\n try {\n const query = `mutation CreateQuerySystemUser($input: CreateQuerySystemUserInput!) {\n CreateQuerySystemUser(input: $input) {\n Success\n ErrorMessage\n ID\n Name\n Description\n CategoryID\n Category\n SQL\n Status\n QualityRank\n EmbeddingVector\n EmbeddingModelID\n EmbeddingModelName\n Fields {\n ID\n QueryID\n Name\n Description\n Sequence\n SQLBaseType\n SQLFullType\n SourceEntityID\n SourceEntity\n SourceFieldName\n IsComputed\n ComputationDescription\n IsSummary\n SummaryDescription\n }\n Parameters {\n ID\n QueryID\n Name\n Description\n Type\n IsRequired\n DefaultValue\n SampleValue\n ValidationFilters\n }\n Entities {\n ID\n QueryID\n EntityID\n Entity\n }\n Permissions {\n ID\n QueryID\n RoleID\n Role\n }\n }\n }`\n\n const result = await this.Client.request(query, { input }) as { CreateQuerySystemUser: CreateQueryResult };\n if (result && result.CreateQuerySystemUser) {\n return result.CreateQuerySystemUser;\n } else {\n return {\n Success: false,\n ErrorMessage: 'Failed to create query'\n };\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::CreateQuery - Error creating query - ${e}`);\n return {\n Success: false,\n ErrorMessage: e.toString()\n };\n }\n }\n\n /**\n * Updates an existing query with the provided attributes. This method is restricted to system users only.\n * @param input - UpdateQueryInput containing the query ID and fields to update\n * @returns Promise containing the result of the query update including updated fields, parameters, entities, and permissions\n */\n public async UpdateQuery(input: UpdateQueryInput): Promise<UpdateQueryResult> {\n try {\n const query = `mutation UpdateQuerySystemUser($input: UpdateQuerySystemUserInput!) {\n UpdateQuerySystemUser(input: $input) {\n Success\n ErrorMessage\n ID\n Name\n Description\n CategoryID\n Category\n SQL\n Status\n QualityRank\n EmbeddingVector\n EmbeddingModelID\n EmbeddingModelName\n Fields {\n ID\n QueryID\n Name\n Description\n Sequence\n SQLBaseType\n SQLFullType\n SourceEntityID\n SourceEntity\n SourceFieldName\n IsComputed\n ComputationDescription\n IsSummary\n SummaryDescription\n }\n Parameters {\n ID\n QueryID\n Name\n Description\n Type\n IsRequired\n DefaultValue\n SampleValue\n ValidationFilters\n }\n Entities {\n ID\n QueryID\n EntityID\n Entity\n }\n Permissions {\n ID\n QueryID\n RoleID\n Role\n }\n }\n }`\n\n const result = await this.Client.request(query, { input }) as { UpdateQuerySystemUser: UpdateQueryResult };\n if (result && result.UpdateQuerySystemUser) {\n return result.UpdateQuerySystemUser;\n } else {\n return {\n Success: false,\n ErrorMessage: 'Failed to update query'\n };\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::UpdateQuery - Error updating query - ${e}`);\n return {\n Success: false,\n ErrorMessage: e.toString()\n };\n }\n }\n\n /**\n * Deletes a query by ID using the DeleteQuerySystemResolver mutation. This method is restricted to system users only.\n * @param ID - The ID of the query to delete\n * @param options - Optional delete options controlling action execution\n * @returns Promise containing the result of the query deletion\n */\n public async DeleteQuery(ID: string, options?: DeleteQueryOptionsInput): Promise<DeleteQueryResult> {\n try {\n // Validate ID is not null/undefined/empty\n if (!ID || ID.trim() === '') {\n LogError('GraphQLSystemUserClient::DeleteQuery - Invalid query ID: ID cannot be null or empty');\n return {\n Success: false,\n ErrorMessage: 'Invalid query ID: ID cannot be null or empty'\n };\n }\n\n const query = `mutation DeleteQuerySystemResolver($ID: String!, $options: DeleteOptionsInput) {\n DeleteQuerySystemResolver(ID: $ID, options: $options) {\n Success\n ErrorMessage\n ID\n Name\n }\n }`\n\n const variables: any = { ID: ID };\n if (options !== undefined) {\n variables.options = options;\n }\n\n const result = await this.Client.request(query, variables) as { DeleteQuerySystemResolver: DeleteQueryResult };\n \n if (result && result.DeleteQuerySystemResolver) {\n return result.DeleteQuerySystemResolver;\n } else {\n return {\n Success: false,\n ErrorMessage: 'Failed to delete query'\n };\n }\n }\n catch (e) {\n LogError(`GraphQLSystemUserClient::DeleteQuery - Error deleting query - ${e}`);\n return {\n Success: false,\n ErrorMessage: e.toString()\n };\n }\n }\n\n /**\n * Run an AI prompt with system user privileges.\n * This method allows system-level execution of AI prompts without user authentication.\n * \n * @param params The parameters for running the AI prompt\n * @returns A Promise that resolves to a RunAIPromptResult object\n * \n * @example\n * ```typescript\n * const result = await systemClient.RunAIPrompt({\n * promptId: \"prompt-id\",\n * data: { systemData: \"value\" },\n * skipValidation: true\n * });\n * ```\n */\n public async RunAIPrompt(params: RunAIPromptParams): Promise<RunAIPromptResult> {\n try {\n // Build the query for system user\n const query = gql`\n query RunAIPromptSystemUser(\n $promptId: String!,\n $data: String,\n $overrideModelId: String,\n $overrideVendorId: String,\n $configurationId: String,\n $skipValidation: Boolean,\n $templateData: String,\n $responseFormat: String,\n $temperature: Float,\n $topP: Float,\n $topK: Int,\n $minP: Float,\n $frequencyPenalty: Float,\n $presencePenalty: Float,\n $seed: Int,\n $stopSequences: [String!],\n $includeLogProbs: Boolean,\n $topLogProbs: Int,\n $messages: String,\n $rerunFromPromptRunID: String,\n $systemPromptOverride: String\n ) {\n RunAIPromptSystemUser(\n promptId: $promptId,\n data: $data,\n overrideModelId: $overrideModelId,\n overrideVendorId: $overrideVendorId,\n configurationId: $configurationId,\n skipValidation: $skipValidation,\n templateData: $templateData,\n responseFormat: $responseFormat,\n temperature: $temperature,\n topP: $topP,\n topK: $topK,\n minP: $minP,\n frequencyPenalty: $frequencyPenalty,\n presencePenalty: $presencePenalty,\n seed: $seed,\n stopSequences: $stopSequences,\n includeLogProbs: $includeLogProbs,\n topLogProbs: $topLogProbs,\n messages: $messages,\n rerunFromPromptRunID: $rerunFromPromptRunID,\n systemPromptOverride: $systemPromptOverride\n ) {\n success\n output\n parsedResult\n error\n executionTimeMs\n tokensUsed\n promptRunId\n rawResult\n validationResult\n chatResult\n }\n }\n `;\n\n // Prepare variables\n const variables = this.preparePromptVariables(params);\n\n // Execute the query\n const result = await this.Client.request(query, variables) as { RunAIPromptSystemUser: any };\n\n // Process and return the result\n if (result && result.RunAIPromptSystemUser) {\n return this.processPromptResult(result.RunAIPromptSystemUser);\n } else {\n return {\n success: false,\n error: 'Failed to execute AI prompt as system user'\n };\n }\n } catch (e) {\n LogError(`GraphQLSystemUserClient::RunAIPrompt - Error running AI prompt - ${e}`);\n return {\n success: false,\n error: e.toString()\n };\n }\n }\n\n /**\n * Run an AI agent with system user privileges.\n * This method allows system-level execution of AI agents without user authentication.\n * \n * @param params The parameters for running the AI agent\n * @returns A Promise that resolves to a RunAIAgentResult object\n * \n * @example\n * ```typescript\n * const result = await systemClient.RunAIAgent({\n * agentId: \"agent-id\",\n * messages: [{ role: \"system\", content: \"Process data\" }],\n * sessionId: \"system-session\"\n * });\n * ```\n */\n public async RunAIAgent(params: ExecuteAgentParams): Promise<ExecuteAgentResult> {\n try {\n // Build the query for system user\n const query = gql`\n query RunAIAgentSystemUser(\n $agentId: String!,\n $messages: String!,\n $sessionId: String!,\n $data: String,\n $templateData: String,\n $lastRunId: String,\n $autoPopulateLastRunPayload: Boolean,\n $configurationId: String\n ) {\n RunAIAgentSystemUser(\n agentId: $agentId,\n messages: $messages,\n sessionId: $sessionId,\n data: $data,\n templateData: $templateData,\n lastRunId: $lastRunId,\n autoPopulateLastRunPayload: $autoPopulateLastRunPayload,\n configurationId: $configurationId\n ) {\n success\n errorMessage\n executionTimeMs\n result\n }\n }\n `;\n\n // Prepare variables\n const variables = this.prepareAgentVariables(params);\n\n // Execute the query\n const result = await this.Client.request(query, variables) as { RunAIAgentSystemUser: any };\n\n // Process and return the result\n if (result && result.RunAIAgentSystemUser) {\n return this.processAgentResult(result.RunAIAgentSystemUser.result);\n } else {\n return {\n success: false, \n agentRun: undefined\n };\n }\n } catch (e) {\n LogError(`GraphQLSystemUserClient::RunAIAgent - Error running AI agent - ${e}`);\n return {\n success: false, \n agentRun: undefined\n };\n }\n }\n\n /**\n * Helper method to prepare prompt variables for GraphQL\n * @private\n */\n private preparePromptVariables(params: RunAIPromptParams): Record<string, any> {\n const variables: Record<string, any> = {\n promptId: params.promptId\n };\n\n // Serialize complex objects to JSON strings\n if (params.data !== undefined) {\n variables.data = typeof params.data === 'object' ? JSON.stringify(params.data) : params.data;\n }\n if (params.templateData !== undefined) {\n variables.templateData = typeof params.templateData === 'object' ? JSON.stringify(params.templateData) : params.templateData;\n }\n if (params.messages !== undefined) {\n variables.messages = JSON.stringify(params.messages);\n }\n\n // Add optional scalar parameters\n if (params.overrideModelId !== undefined) variables.overrideModelId = params.overrideModelId;\n if (params.overrideVendorId !== undefined) variables.overrideVendorId = params.overrideVendorId;\n if (params.configurationId !== undefined) variables.configurationId = params.configurationId;\n if (params.skipValidation !== undefined) variables.skipValidation = params.skipValidation;\n if (params.responseFormat !== undefined) variables.responseFormat = params.responseFormat;\n if (params.temperature !== undefined) variables.temperature = params.temperature;\n if (params.topP !== undefined) variables.topP = params.topP;\n if (params.topK !== undefined) variables.topK = params.topK;\n if (params.minP !== undefined) variables.minP = params.minP;\n if (params.frequencyPenalty !== undefined) variables.frequencyPenalty = params.frequencyPenalty;\n if (params.presencePenalty !== undefined) variables.presencePenalty = params.presencePenalty;\n if (params.seed !== undefined) variables.seed = params.seed;\n if (params.stopSequences !== undefined) variables.stopSequences = params.stopSequences;\n if (params.includeLogProbs !== undefined) variables.includeLogProbs = params.includeLogProbs;\n if (params.topLogProbs !== undefined) variables.topLogProbs = params.topLogProbs;\n if (params.rerunFromPromptRunID !== undefined) variables.rerunFromPromptRunID = params.rerunFromPromptRunID;\n if (params.systemPromptOverride !== undefined) variables.systemPromptOverride = params.systemPromptOverride;\n\n return variables;\n }\n\n /**\n * Helper method to prepare agent variables for GraphQL\n * @private\n */\n private prepareAgentVariables(params: ExecuteAgentParams): Record<string, any> {\n const variables: Record<string, any> = {\n agentId: params.agent.ID,\n messages: JSON.stringify(params.conversationMessages),\n sessionId: this._sessionId\n };\n\n // Serialize optional complex objects to JSON strings\n if (params.data !== undefined) {\n variables.data = typeof params.data === 'object' ? JSON.stringify(params.data) : params.data;\n }\n\n // Add optional scalar parameters\n if (params.lastRunId !== undefined) variables.lastRunId = params.lastRunId;\n if (params.autoPopulateLastRunPayload !== undefined) variables.autoPopulateLastRunPayload = params.autoPopulateLastRunPayload;\n if (params.configurationId !== undefined) variables.configurationId = params.configurationId;\n\n return variables;\n }\n\n /**\n * Helper method to process prompt results\n * @private\n */\n private processPromptResult(promptResult: any): RunAIPromptResult {\n // Parse JSON results if they exist\n let parsedResult: any;\n let validationResult: any;\n let chatResult: any;\n\n try {\n if (promptResult.parsedResult) {\n parsedResult = JSON.parse(promptResult.parsedResult);\n }\n } catch (e) {\n parsedResult = promptResult.parsedResult;\n }\n\n try {\n if (promptResult.validationResult) {\n validationResult = JSON.parse(promptResult.validationResult);\n }\n } catch (e) {\n validationResult = promptResult.validationResult;\n }\n\n try {\n if (promptResult.chatResult) {\n chatResult = JSON.parse(promptResult.chatResult);\n }\n } catch (e) {\n chatResult = promptResult.chatResult;\n }\n\n return {\n success: promptResult.success,\n output: promptResult.output,\n parsedResult,\n error: promptResult.error,\n executionTimeMs: promptResult.executionTimeMs,\n tokensUsed: promptResult.tokensUsed,\n promptRunId: promptResult.promptRunId,\n rawResult: promptResult.rawResult,\n validationResult,\n chatResult\n };\n }\n\n /**\n * Helper method to process agent results\n * @private\n */\n private processAgentResult(agentResult: any): ExecuteAgentResult {\n return SafeJSONParse(agentResult) as ExecuteAgentResult;\n }\n\n /**\n * Execute a simple prompt without requiring a stored AI Prompt entity.\n * This method allows system-level execution of simple prompts.\n * \n * @param params The parameters for the simple prompt execution\n * @returns A Promise that resolves to a SimplePromptResult object\n * \n * @example\n * ```typescript\n * const result = await systemClient.ExecuteSimplePrompt({\n * systemPrompt: \"You are a data analyst\",\n * modelPower: \"medium\"\n * });\n * ```\n */\n public async ExecuteSimplePrompt(params: ExecuteSimplePromptParams): Promise<SimplePromptResult> {\n try {\n const query = gql`\n query ExecuteSimplePromptSystemUser(\n $systemPrompt: String!,\n $messages: String,\n $preferredModels: [String!],\n $modelPower: String,\n $responseFormat: String\n ) {\n ExecuteSimplePromptSystemUser(\n systemPrompt: $systemPrompt,\n messages: $messages,\n preferredModels: $preferredModels,\n modelPower: $modelPower,\n responseFormat: $responseFormat\n ) {\n success\n result\n resultObject\n modelName\n error\n executionTimeMs\n }\n }\n `;\n\n // Prepare variables\n const variables: Record<string, any> = {\n systemPrompt: params.systemPrompt\n };\n\n // Convert messages array to JSON string if provided\n if (params.messages && params.messages.length > 0) {\n variables.messages = JSON.stringify(params.messages);\n }\n\n if (params.preferredModels) {\n variables.preferredModels = params.preferredModels;\n }\n\n if (params.modelPower) {\n variables.modelPower = params.modelPower;\n }\n\n if (params.responseFormat) {\n variables.responseFormat = params.responseFormat;\n }\n\n // Execute the query\n const result = await this.Client.request(query, variables) as { ExecuteSimplePromptSystemUser: any };\n\n if (!result?.ExecuteSimplePromptSystemUser) {\n return {\n success: false,\n modelName: 'Unknown',\n error: 'Failed to execute simple prompt as system user'\n };\n }\n\n const promptResult = result.ExecuteSimplePromptSystemUser;\n\n // Parse resultObject if it exists\n let resultObject: any;\n if (promptResult.resultObject) {\n try {\n resultObject = JSON.parse(promptResult.resultObject);\n } catch (e) {\n resultObject = promptResult.resultObject;\n }\n }\n\n return {\n success: promptResult.success,\n result: promptResult.result,\n resultObject,\n modelName: promptResult.modelName,\n error: promptResult.error,\n executionTimeMs: promptResult.executionTimeMs\n };\n\n } catch (e) {\n LogError(`GraphQLSystemUserClient::ExecuteSimplePrompt - Error executing simple prompt - ${e}`);\n return {\n success: false,\n modelName: 'Unknown',\n error: e.toString()\n };\n }\n }\n\n /**\n * Generate embeddings using local embedding models.\n * This method allows system-level generation of text embeddings.\n * \n * @param params The parameters for embedding generation\n * @returns A Promise that resolves to an EmbedTextResult object\n * \n * @example\n * ```typescript\n * const result = await systemClient.EmbedText({\n * textToEmbed: [\"System data\", \"Configuration\"],\n * modelSize: \"small\"\n * });\n * ```\n */\n public async EmbedText(params: EmbedTextParams): Promise<EmbedTextResult> {\n try {\n const query = gql`\n query EmbedTextSystemUser(\n $textToEmbed: [String!]!,\n $modelSize: String!\n ) {\n EmbedTextSystemUser(\n textToEmbed: $textToEmbed,\n modelSize: $modelSize\n ) {\n embeddings\n modelName\n vectorDimensions\n error\n }\n }\n `;\n\n // Prepare variables - handle both single string and array\n const textArray = Array.isArray(params.textToEmbed) \n ? params.textToEmbed \n : [params.textToEmbed];\n\n const variables = {\n textToEmbed: textArray,\n modelSize: params.modelSize\n };\n\n // Execute the query\n const result = await this.Client.request(query, variables) as { EmbedTextSystemUser: any };\n\n if (!result?.EmbedTextSystemUser) {\n return {\n embeddings: Array.isArray(params.textToEmbed) ? [] : [],\n modelName: 'Unknown',\n vectorDimensions: 0,\n error: 'Failed to generate embeddings as system user'\n };\n }\n\n const embedResult = result.EmbedTextSystemUser;\n\n // Return single embedding or array based on input\n const returnEmbeddings = Array.isArray(params.textToEmbed)\n ? embedResult.embeddings\n : embedResult.embeddings[0];\n\n return {\n embeddings: returnEmbeddings,\n modelName: embedResult.modelName,\n vectorDimensions: embedResult.vectorDimensions,\n error: embedResult.error\n };\n\n } catch (e) {\n LogError(`GraphQLSystemUserClient::EmbedText - Error generating embeddings - ${e}`);\n return {\n embeddings: Array.isArray(params.textToEmbed) ? [] : [],\n modelName: 'Unknown',\n vectorDimensions: 0,\n error: e.toString()\n };\n }\n }\n\n}\n\n/**\n * Output type for GetData calls - contains results from executing multiple SQL queries\n */\nexport class GetDataOutput {\n /**\n * Indicates if the operation was successful overall. If any individual query failed, this will be false. However, any successful queries will still be returned in the Results array.\n */\n Success: boolean;\n /**\n * The original input of Queries that were run - same order as provided in the request\n */\n Queries: string[];\n /**\n * An ordered array of error messages for each query that was run. This array will always have the same # of entries as Queries. If a query was successful, the corresponding entry will be null.\n */\n ErrorMessages: (string | null)[];\n /**\n * An ordered array of results for each query that was run. This array will always have the same # of entries as Queries. If a query failed, the corresponding entry will be null. Successful results are JSON strings containing the query data.\n */\n Results: (string | null)[];\n}\n\n/**\n * Return type for calls to the GetAllRemoteEntities query - provides lightweight entity metadata\n */\nexport class SimpleRemoteEntityOutput {\n /**\n * Indicates whether the remote entity retrieval was successful\n */\n Success: boolean;\n /**\n * Error message if the operation failed, undefined if successful\n */\n ErrorMessage?: string;\n /**\n * An array of simple entity types that are returned from the remote server - contains basic metadata for each entity\n */\n Results: SimpleRemoteEntity[];\n}\n\n/**\n * Represents a simple entity type that is used for lightweight retrieval of partial remote entity metadata \n */\nexport class SimpleRemoteEntity {\n /**\n * Unique identifier of the entity on the remote server\n */\n ID: string;\n /**\n * Display name of the entity (e.g., \"Users\", \"Companies\")\n */\n Name: string;\n /**\n * Optional description explaining the entity's purpose\n */\n Description?: string;\n /**\n * Database schema name where the entity resides (e.g., \"dbo\", \"custom\")\n */\n SchemaName: string;\n /**\n * Name of the database view used for reading this entity\n */\n BaseView: string;\n /**\n * Name of the database table used for storing this entity\n */\n BaseTable: string;\n /**\n * Optional code-friendly name for the entity (typically PascalCase)\n */\n CodeName?: string;\n /**\n * Optional TypeScript/JavaScript class name for the entity\n */\n ClassName?: string;\n /**\n * Array of field definitions for this entity\n */\n Fields: SimpleRemoteEntityField[];\n}\n\n/**\n * Represents a field within a remote entity - contains basic field metadata\n */\nexport class SimpleRemoteEntityField {\n /**\n * Unique identifier of the entity field on the remote server\n */\n ID: string;\n /**\n * Field name (e.g., \"FirstName\", \"Email\", \"CreatedAt\")\n */\n Name: string;\n /**\n * Optional description explaining the field's purpose\n */\n Description?: string;\n /**\n * Data type of the field (e.g., \"nvarchar\", \"int\", \"datetime\", \"bit\")\n */\n Type: string;\n /**\n * Whether the field can contain null values\n */\n AllowsNull: boolean;\n /**\n * Maximum length for string fields, -1 for unlimited, 0 for non-string types\n */\n MaxLength: number;\n}\n\n/**\n * Input type for RunViewByNameSystemUser method calls - executes a saved view by name\n */\nexport interface RunViewByNameSystemUserInput {\n /**\n * Name of the saved view to execute\n */\n ViewName: string;\n /**\n * Additional WHERE clause conditions to apply (optional)\n */\n ExtraFilter?: string;\n /**\n * ORDER BY clause for sorting results (optional)\n */\n OrderBy?: string;\n /**\n * Specific fields to return, if not specified returns all fields (optional)\n */\n Fields?: string[];\n /**\n * Search string to filter results across searchable fields (optional)\n */\n UserSearchString?: string;\n /**\n * ID of a previous view run to exclude results from (optional)\n */\n ExcludeUserViewRunID?: string;\n /**\n * Override the exclude filter with custom logic (optional)\n */\n OverrideExcludeFilter?: string;\n /**\n * Whether to save the view execution results for future reference (optional)\n */\n SaveViewResults?: boolean;\n /**\n * Whether to exclude data from all prior view runs (optional)\n */\n ExcludeDataFromAllPriorViewRuns?: boolean;\n /**\n * Whether to ignore the view's MaxRows setting and return all results (optional)\n */\n IgnoreMaxRows?: boolean;\n /**\n * Maximum number of rows to return, overrides view setting if specified (optional)\n */\n MaxRows?: number;\n /**\n * Whether to force audit logging for this view execution (optional)\n */\n ForceAuditLog?: boolean;\n /**\n * Description for the audit log entry if ForceAuditLog is true (optional)\n */\n AuditLogDescription?: string;\n /**\n * Type of result format: \"simple\", \"entity_object\", etc. (optional)\n */\n ResultType?: string;\n /**\n * Starting row number for pagination (optional, 0-based)\n */\n StartRow?: number;\n}\n\n/**\n * Input type for RunViewByIDSystemUser method calls - executes a saved view by its unique ID\n */\nexport interface RunViewByIDSystemUserInput {\n /**\n * Unique identifier of the saved view to execute\n */\n ViewID: string;\n /**\n * Additional WHERE clause conditions to apply (optional)\n */\n ExtraFilter?: string;\n /**\n * ORDER BY clause for sorting results (optional)\n */\n OrderBy?: string;\n /**\n * Specific fields to return, if not specified returns all fields (optional)\n */\n Fields?: string[];\n /**\n * Search string to filter results across searchable fields (optional)\n */\n UserSearchString?: string;\n /**\n * ID of a previous view run to exclude results from (optional)\n */\n ExcludeUserViewRunID?: string;\n /**\n * Override the exclude filter with custom logic (optional)\n */\n OverrideExcludeFilter?: string;\n /**\n * Whether to save the view execution results for future reference (optional)\n */\n SaveViewResults?: boolean;\n /**\n * Whether to exclude data from all prior view runs (optional)\n */\n ExcludeDataFromAllPriorViewRuns?: boolean;\n /**\n * Whether to ignore the view's MaxRows setting and return all results (optional)\n */\n IgnoreMaxRows?: boolean;\n /**\n * Maximum number of rows to return, overrides view setting if specified (optional)\n */\n MaxRows?: number;\n /**\n * Whether to force audit logging for this view execution (optional)\n */\n ForceAuditLog?: boolean;\n /**\n * Description for the audit log entry if ForceAuditLog is true (optional)\n */\n AuditLogDescription?: string;\n /**\n * Type of result format: \"simple\", \"entity_object\", etc. (optional)\n */\n ResultType?: string;\n /**\n * Starting row number for pagination (optional, 0-based)\n */\n StartRow?: number;\n}\n\n/**\n * Input type for RunDynamicViewSystemUser method calls - creates and executes a view dynamically based on entity\n */\nexport interface RunDynamicViewSystemUserInput {\n /**\n * Name of the entity to query (e.g., \"Users\", \"Companies\")\n */\n EntityName: string;\n /**\n * Additional WHERE clause conditions to apply (optional)\n */\n ExtraFilter?: string;\n /**\n * ORDER BY clause for sorting results (optional)\n */\n OrderBy?: string;\n /**\n * Specific fields to return, if not specified returns all fields (optional)\n */\n Fields?: string[];\n /**\n * Search string to filter results across searchable fields (optional)\n */\n UserSearchString?: string;\n /**\n * ID of a previous view run to exclude results from (optional)\n */\n ExcludeUserViewRunID?: string;\n /**\n * Override the exclude filter with custom logic (optional)\n */\n OverrideExcludeFilter?: string;\n /**\n * Whether to ignore MaxRows limits and return all results (optional)\n */\n IgnoreMaxRows?: boolean;\n /**\n * Maximum number of rows to return (optional)\n */\n MaxRows?: number;\n /**\n * Whether to force audit logging for this view execution (optional)\n */\n ForceAuditLog?: boolean;\n /**\n * Description for the audit log entry if ForceAuditLog is true (optional)\n */\n AuditLogDescription?: string;\n /**\n * Type of result format: \"simple\", \"entity_object\", etc. (optional)\n */\n ResultType?: string;\n /**\n * Starting row number for pagination (optional, 0-based)\n */\n StartRow?: number;\n}\n\n/**\n * Input type for RunViewsSystemUser method calls - executes multiple views in parallel\n */\nexport interface RunViewSystemUserInput {\n /**\n * Name of the entity to query (e.g., \"Users\", \"Companies\")\n */\n EntityName: string;\n /**\n * Additional WHERE clause conditions to apply (optional)\n */\n ExtraFilter?: string;\n /**\n * ORDER BY clause for sorting results (optional)\n */\n OrderBy?: string;\n /**\n * Specific fields to return, if not specified returns all fields (optional)\n */\n Fields?: string[];\n /**\n * Search string to filter results across searchable fields (optional)\n */\n UserSearchString?: string;\n /**\n * ID of a previous view run to exclude results from (optional)\n */\n ExcludeUserViewRunID?: string;\n /**\n * Override the exclude filter with custom logic (optional)\n */\n OverrideExcludeFilter?: string;\n /**\n * Whether to ignore MaxRows limits and return all results (optional)\n */\n IgnoreMaxRows?: boolean;\n /**\n * Maximum number of rows to return (optional)\n */\n MaxRows?: number;\n /**\n * Whether to force audit logging for this view execution (optional)\n */\n ForceAuditLog?: boolean;\n /**\n * Description for the audit log entry if ForceAuditLog is true (optional)\n */\n AuditLogDescription?: string;\n /**\n * Type of result format: \"simple\", \"entity_object\", etc. (optional)\n */\n ResultType?: string;\n /**\n * Starting row number for pagination (optional, 0-based)\n */\n StartRow?: number;\n}\n\n\n/**\n * Result row type for view execution results - represents a single data row\n */\nexport interface RunViewSystemUserResultRow {\n /**\n * Primary key fields and values for the record\n */\n PrimaryKey: KeyValuePair[];\n /**\n * ID of the entity type this record belongs to\n */\n EntityID: string;\n /**\n * JSON string containing the actual record data\n */\n Data: string;\n}\n\n/**\n * Result type for RunViewsSystemUser method calls - contains execution results and metadata\n */\nexport interface RunViewSystemUserResult {\n /**\n * Array of result rows containing the actual data\n */\n Results: RunViewSystemUserResultRow[];\n /**\n * Unique identifier for this view execution run (optional)\n */\n UserViewRunID?: string;\n /**\n * Number of rows returned in this result set (optional)\n */\n RowCount?: number;\n /**\n * Total number of rows available (before pagination) (optional)\n */\n TotalRowCount?: number;\n /**\n * Time taken to execute the view in milliseconds (optional)\n */\n ExecutionTime?: number;\n /**\n * Error message if the execution failed (optional)\n */\n ErrorMessage?: string;\n /**\n * Whether the view execution was successful\n */\n Success: boolean;\n}\n\n/**\n * Result type for query execution methods - contains query results and execution metadata\n */\nexport interface RunQuerySystemUserResult {\n /**\n * Unique identifier of the executed query\n */\n QueryID: string;\n /**\n * Display name of the executed query\n */\n QueryName: string;\n /**\n * Whether the query execution was successful\n */\n Success: boolean;\n /**\n * Query results data (parsed from JSON)\n */\n Results: any;\n /**\n * Number of rows returned by the query\n */\n RowCount: number;\n /**\n * Total number of rows available (before pagination)\n */\n TotalRowCount: number;\n /**\n * Time taken to execute the query in milliseconds\n */\n ExecutionTime: number;\n /**\n * Error message if the query execution failed\n */\n ErrorMessage: string;\n /**\n * JSON string containing the applied parameters (optional)\n */\n AppliedParameters?: string;\n}\n\n/**\n * Input type for GetQueryDataSystemUser method calls - executes a stored query by ID\n */\nexport interface GetQueryDataSystemUserInput {\n /**\n * The ID of the query to execute\n */\n QueryID: string;\n /**\n * Optional category ID filter\n */\n CategoryID?: string;\n /**\n * Optional category path filter (hierarchical path like \"/MJ/AI/Agents/\" or simple name)\n */\n CategoryPath?: string;\n /**\n * Optional parameters for templated queries\n */\n Parameters?: Record<string, any>;\n /**\n * Optional maximum number of rows to return\n */\n MaxRows?: number;\n /**\n * Optional starting row number for pagination\n */\n StartRow?: number;\n}\n\n/**\n * Input type for GetQueryDataByNameSystemUser method calls - executes a stored query by name\n */\nexport interface GetQueryDataByNameSystemUserInput {\n /**\n * The name of the query to execute\n */\n QueryName: string;\n /**\n * Optional category ID filter\n */\n CategoryID?: string;\n /**\n * Optional category path filter (hierarchical path like \"/MJ/AI/Agents/\" or simple name)\n */\n CategoryPath?: string;\n /**\n * Optional parameters for templated queries\n */\n Parameters?: Record<string, any>;\n /**\n * Optional maximum number of rows to return\n */\n MaxRows?: number;\n /**\n * Optional starting row number for pagination\n */\n StartRow?: number;\n}\n\n/**\n * Input type for query permissions to be created with a new query\n */\nexport interface QueryPermissionInput {\n /**\n * Role ID to grant access to\n */\n RoleID: string;\n}\n\n/**\n * Input type for CreateQuery mutation calls - creates a new query with optional hierarchical category path\n */\nexport interface CreateQueryInput {\n /**\n * Required name for the query (must be unique within category)\n */\n Name: string;\n /**\n * Optional existing category ID to assign the query to\n */\n CategoryID?: string;\n /**\n * Optional category path for automatic hierarchy creation (e.g., \"Reports/Sales/Monthly\") - takes precedence over CategoryID\n */\n CategoryPath?: string;\n /**\n * Optional natural language question this query answers\n */\n UserQuestion?: string;\n /**\n * Optional general description of what the query does\n */\n Description?: string;\n /**\n * Optional SQL query text to execute (can contain Nunjucks template syntax)\n */\n SQL?: string;\n /**\n * Optional technical documentation for developers\n */\n TechnicalDescription?: string;\n /**\n * Optional original SQL before optimization or modification\n */\n OriginalSQL?: string;\n /**\n * Optional user feedback about the query\n */\n Feedback?: string;\n /**\n * Optional query approval status (defaults to 'Pending')\n */\n Status?: 'Pending' | 'Approved' | 'Rejected' | 'Expired';\n /**\n * Optional quality indicator (higher = better quality, defaults to 0)\n */\n QualityRank?: number;\n /**\n * Optional execution cost indicator (higher = more expensive to run)\n */\n ExecutionCostRank?: number;\n /**\n * Optional flag indicating if the query uses Nunjucks template syntax (auto-detected if not specified)\n */\n UsesTemplate?: boolean;\n /**\n * Optional array of permissions to create for the query\n */\n Permissions?: QueryPermissionInput[];\n}\n\n/**\n * Type for query field information\n */\nexport interface QueryField {\n ID: string;\n QueryID: string;\n Name: string;\n Description?: string;\n Sequence: number;\n SQLBaseType?: string;\n SQLFullType?: string;\n SourceEntityID?: string;\n SourceEntity?: string;\n SourceFieldName?: string;\n IsComputed: boolean;\n ComputationDescription?: string;\n IsSummary?: boolean;\n SummaryDescription?: string;\n}\n\n/**\n * Type for query parameter information\n */\nexport interface QueryParameter {\n ID: string;\n QueryID: string;\n Name: string;\n Description?: string;\n Type: string;\n IsRequired: boolean;\n DefaultValue?: string;\n SampleValue?: string;\n ValidationFilters?: string;\n}\n\n/**\n * Type for query entity information\n */\nexport interface QueryEntity {\n ID: string;\n QueryID: string;\n EntityID: string;\n Entity?: string;\n}\n\n/**\n * Type for query permission information\n */\nexport interface QueryPermission {\n ID: string;\n QueryID: string;\n RoleID: string;\n Role?: string;\n}\n\n/**\n * Result type for CreateQuery mutation calls - contains creation success status and query data\n */\nexport interface CreateQueryResult {\n /**\n * Whether the query creation was successful\n */\n Success: boolean;\n /**\n * Error message if the creation failed (optional)\n */\n ErrorMessage?: string;\n /**\n * Unique identifier of the created query (optional)\n */\n ID?: string;\n /**\n * Display name of the created query (optional)\n */\n Name?: string;\n /**\n * Description of the created query (optional)\n */\n Description?: string;\n /**\n * Category ID the query belongs to (optional)\n */\n CategoryID?: string;\n /**\n * Category name the query belongs to (optional)\n */\n Category?: string;\n /**\n * SQL query text (optional)\n */\n SQL?: string;\n /**\n * Query status: Pending, Approved, Rejected, or Expired (optional)\n */\n Status?: string;\n /**\n * Quality rank indicator (optional)\n */\n QualityRank?: number;\n /**\n * Embedding vector for semantic search (optional)\n */\n EmbeddingVector?: string;\n /**\n * ID of the embedding model used (optional)\n */\n EmbeddingModelID?: string;\n /**\n * Name of the embedding model used (optional)\n */\n EmbeddingModelName?: string;\n /**\n * Array of fields discovered in the query (optional)\n */\n Fields?: QueryField[];\n /**\n * Array of parameters found in the query template (optional)\n */\n Parameters?: QueryParameter[];\n /**\n * Array of entities referenced by the query (optional)\n */\n Entities?: QueryEntity[];\n /**\n * Array of permissions created for the query (optional)\n */\n Permissions?: QueryPermission[];\n}\n\n/**\n * Input type for UpdateQuery mutation calls - updates an existing query\n */\nexport interface UpdateQueryInput {\n /**\n * Required ID of the query to update\n */\n ID: string;\n /**\n * Optional name for the query (must be unique within category)\n */\n Name?: string;\n /**\n * Optional category ID to move the query to\n */\n CategoryID?: string;\n /**\n * Optional category path for automatic hierarchy creation (e.g., \"Reports/Sales/Monthly\") - takes precedence over CategoryID\n */\n CategoryPath?: string;\n /**\n * Optional natural language question this query answers\n */\n UserQuestion?: string;\n /**\n * Optional general description of what the query does\n */\n Description?: string;\n /**\n * Optional SQL query text to execute (can contain Nunjucks template syntax)\n */\n SQL?: string;\n /**\n * Optional technical documentation for developers\n */\n TechnicalDescription?: string;\n /**\n * Optional original SQL before optimization or modification\n */\n OriginalSQL?: string;\n /**\n * Optional user feedback about the query\n */\n Feedback?: string;\n /**\n * Optional query approval status\n */\n Status?: 'Pending' | 'Approved' | 'Rejected' | 'Expired';\n /**\n * Optional quality indicator (higher = better quality)\n */\n QualityRank?: number;\n /**\n * Optional execution cost indicator (higher = more expensive to run)\n */\n ExecutionCostRank?: number;\n /**\n * Optional flag indicating if the query uses Nunjucks template syntax\n */\n UsesTemplate?: boolean;\n /**\n * Optional array of permissions to update for the query (replaces existing permissions)\n */\n Permissions?: QueryPermissionInput[];\n}\n\n/**\n * Result type for UpdateQuery mutation calls - contains update success status and query data\n */\nexport interface UpdateQueryResult {\n /**\n * Whether the query update was successful\n */\n Success: boolean;\n /**\n * Error message if the update failed (optional)\n */\n ErrorMessage?: string;\n /**\n * Unique identifier of the updated query (optional)\n */\n ID?: string;\n /**\n * Display name of the updated query (optional)\n */\n Name?: string;\n /**\n * Description of the updated query (optional)\n */\n Description?: string;\n /**\n * Category ID the query belongs to (optional)\n */\n CategoryID?: string;\n /**\n * Category name the query belongs to (optional)\n */\n Category?: string;\n /**\n * SQL query text (optional)\n */\n SQL?: string;\n /**\n * Query status: Pending, Approved, Rejected, or Expired (optional)\n */\n Status?: string;\n /**\n * Quality rank indicator (optional)\n */\n QualityRank?: number;\n /**\n * Embedding vector for semantic search (optional)\n */\n EmbeddingVector?: string;\n /**\n * ID of the embedding model used (optional)\n */\n EmbeddingModelID?: string;\n /**\n * Name of the embedding model used (optional)\n */\n EmbeddingModelName?: string;\n /**\n * Array of fields discovered in the query (optional)\n */\n Fields?: QueryField[];\n /**\n * Array of parameters found in the query template (optional)\n */\n Parameters?: QueryParameter[];\n /**\n * Array of entities referenced by the query (optional)\n */\n Entities?: QueryEntity[];\n /**\n * Array of permissions for the query (optional)\n */\n Permissions?: QueryPermission[];\n}\n\n/**\n * Delete options input type for controlling delete behavior\n */\nexport interface DeleteQueryOptionsInput {\n /**\n * Whether to skip AI actions during deletion\n */\n SkipEntityAIActions: boolean;\n /**\n * Whether to skip regular entity actions during deletion\n */\n SkipEntityActions: boolean;\n}\n\n/**\n * Result type for DeleteQuery mutation calls - contains deletion success status and deleted query data\n */\nexport interface DeleteQueryResult {\n /**\n * Whether the query deletion was successful\n */\n Success: boolean;\n /**\n * Error message if the deletion failed (optional)\n */\n ErrorMessage?: string;\n /**\n * Unique identifier of the deleted query (optional)\n */\n ID?: string;\n /**\n * Display name of the deleted query (optional)\n */\n Name?: string;\n}\n\n ","import { ActionParam, ActionResult, EntityActionInvocationParams, EntityActionResult } from \"@memberjunction/actions-base\";\nimport { CompositeKey, LogError } from \"@memberjunction/core\";\nimport { GraphQLDataProvider } from \"./graphQLDataProvider\";\nimport { gql } from \"graphql-request\";\n\n/**\n * Client for executing actions and entity actions through GraphQL.\n * This class provides an easy way to execute actions from a client application,\n * similar to how the ActionEngine and EntityActionEngine work on the server.\n * \n * The GraphQLActionClient follows the same naming convention as other GraphQL clients\n * in the MemberJunction ecosystem, such as GraphQLSystemUserClient.\n * \n * @example\n * ```typescript\n * // Create the client\n * const actionClient = new GraphQLActionClient(graphQLProvider);\n * \n * // Run a regular action\n * const result = await actionClient.RunAction(\"action-id\", [\n * { Name: \"parameter1\", Value: \"value1\", Type: \"Input\" }\n * ]);\n * \n * // Run an entity action\n * const entityActionResult = await actionClient.RunEntityAction({\n * EntityAction: action,\n * InvocationType: { Name: \"SingleRecord\" },\n * EntityObject: entityObject,\n * ContextUser: user\n * });\n * ```\n */\nexport class GraphQLActionClient {\n /**\n * The GraphQLDataProvider instance used to execute GraphQL requests\n * @private\n */\n private _dataProvider: GraphQLDataProvider;\n\n /**\n * Creates a new GraphQLActionClient instance.\n * @param dataProvider The GraphQL data provider to use for queries\n */\n constructor(dataProvider: GraphQLDataProvider) {\n this._dataProvider = dataProvider;\n }\n\n /**\n * Run an action by its ID with the specified parameters.\n * \n * This method invokes an action on the server through GraphQL and returns the result.\n * Action parameters are automatically serialized as needed, and results are deserialized\n * for complex data types.\n * \n * @param actionID The ID of the action to run\n * @param params Optional parameters to pass to the action\n * @param skipActionLog Whether to skip logging the action execution (defaults to false)\n * @returns A Promise that resolves to an ActionResult object containing the result of running the action\n * \n * @example\n * ```typescript\n * const result = await actionClient.RunAction(\"action-id\", [\n * { Name: \"param1\", Value: \"value1\", Type: \"Input\" }\n * ]);\n * \n * if (result.Success) {\n * // Action was successful\n * console.log(result.Message);\n * }\n * ```\n */\n public async RunAction(\n actionID: string, \n params?: ActionParam[], \n skipActionLog: boolean = false\n ): Promise<ActionResult> {\n try {\n // Prepare the input variables\n const serializedParams = this.serializeActionParameters(params);\n const variables = this.createActionVariables(actionID, serializedParams, skipActionLog);\n \n // Execute the mutation\n const result = await this.executeActionMutation(variables);\n \n // Process the result\n return this.processActionResult(result, params);\n } catch (e) {\n return this.handleActionError(e, params);\n }\n }\n\n /**\n * Serializes action parameters to ensure complex objects are properly JSON-encoded\n * @param params The action parameters to serialize\n * @returns The serialized parameters\n * @private\n */\n private serializeActionParameters(params?: ActionParam[]): any[] | undefined {\n if (!params) {\n return undefined;\n }\n\n return params.map(p => {\n let value = p.Value;\n if (value !== null && value !== undefined && typeof value === 'object') {\n value = JSON.stringify(value);\n }\n return {\n ...p,\n Value: value\n };\n });\n }\n\n /**\n * Creates the variables for the action mutation\n * @param actionID The ID of the action to run\n * @param params The serialized action parameters\n * @param skipActionLog Whether to skip action logging\n * @returns The action variables\n * @private\n */\n private createActionVariables(\n actionID: string, \n params?: any[], \n skipActionLog: boolean = false\n ): any {\n return {\n input: {\n ActionID: actionID,\n Params: params,\n SkipActionLog: skipActionLog\n }\n };\n }\n\n /**\n * Executes the action mutation\n * @param variables The variables for the mutation\n * @returns The result of the mutation\n * @private\n */\n private async executeActionMutation(variables: any): Promise<any> {\n const mutation = gql`\n mutation RunAction($input: RunActionInput!) {\n RunAction(input: $input) {\n Success\n Message\n ResultCode\n ResultData\n }\n }\n `;\n\n return await this._dataProvider.ExecuteGQL(mutation, variables);\n }\n\n /**\n * Processes the result of an action\n * @param result The result from the GraphQL query\n * @param originalParams The original parameters passed to the action\n * @returns The processed action result\n * @private\n */\n private processActionResult(result: any, originalParams?: ActionParam[]): ActionResult {\n if (!result?.RunAction) {\n throw new Error(\"Invalid response from server\");\n }\n\n // Parse the ResultData if it exists\n let resultData = undefined;\n try {\n if (result.RunAction.ResultData) {\n resultData = JSON.parse(result.RunAction.ResultData);\n }\n } catch (e) {\n LogError(`Failed to parse action result data: ${e}`);\n }\n\n // Return a properly formatted ActionResult\n return {\n Success: result.RunAction.Success,\n Message: result.RunAction.Message,\n Result: resultData,\n LogEntry: null, // We don't return the log entry to clients\n Params: originalParams || [],\n RunParams: null // We don't return the run params to clients\n };\n }\n\n /**\n * Handles errors in the action execution\n * @param e The error\n * @param originalParams The original parameters passed to the action\n * @returns An error result\n * @private\n */\n private handleActionError(e: unknown, originalParams?: ActionParam[]): ActionResult {\n const error = e as Error;\n LogError(`Error running action: ${error}`);\n return {\n Success: false,\n Message: `Error: ${error.message}`,\n Result: null,\n LogEntry: null,\n Params: originalParams || [],\n RunParams: null\n };\n }\n\n /**\n * Run an entity action with the specified parameters.\n * \n * This method invokes an entity action on the server through GraphQL and returns the result.\n * Entity actions are operations that can be performed on entity records, such as validation,\n * business logic, or custom processing. They can operate on a single record, a view, or a list.\n * \n * @param params The parameters for the entity action, including the action to run, \n * invocation type, entity object or view/list IDs, and optional parameters\n * @returns A Promise that resolves to an EntityActionResult object containing the result\n * \n * @example\n * ```typescript\n * // Run an entity action on a single record\n * const result = await actionClient.RunEntityAction({\n * EntityAction: action,\n * InvocationType: { Name: \"SingleRecord\" },\n * EntityObject: entityObject,\n * ContextUser: user\n * });\n * \n * // Run an entity action on a view\n * const viewResult = await actionClient.RunEntityAction({\n * EntityAction: action,\n * InvocationType: { Name: \"View\" },\n * ViewID: \"view-id\",\n * ContextUser: user\n * });\n * ```\n */\n public async RunEntityAction(params: EntityActionInvocationParams): Promise<EntityActionResult> {\n try {\n // Create the GraphQL input\n const input = this.createEntityActionInput(params);\n\n // Execute the GraphQL mutation\n const result = await this.executeEntityActionMutation(input);\n\n // Process the result\n return this.processEntityActionResult(result);\n } catch (e) {\n return this.handleEntityActionError(e);\n }\n }\n\n /**\n * Creates the GraphQL input for an entity action\n * @param params The entity action parameters\n * @returns The GraphQL input\n * @private\n */\n private createEntityActionInput(params: EntityActionInvocationParams): any {\n const input: any = {\n EntityActionID: params.EntityAction.ID,\n InvocationType: params.InvocationType.Name,\n ListID: params.ListID,\n ViewID: params.ViewID,\n };\n \n // Add parameters if available\n if ((params as any).Params) {\n input.Params = this.convertActionParams((params as any).Params);\n }\n \n // Add entity information if available\n if (params.EntityObject) {\n this.addEntityInformation(input, params.EntityObject);\n }\n\n return input;\n }\n\n /**\n * Converts action parameters to the format expected by the GraphQL API\n * @param params The action parameters\n * @returns The converted parameters\n * @private\n */\n private convertActionParams(params: any[]): any[] {\n return params.map(p => {\n let value = p.Value;\n if (value !== null && value !== undefined && typeof value === 'object') {\n value = JSON.stringify(value);\n }\n return {\n Name: p.Name,\n Value: value,\n Type: p.Type\n };\n });\n }\n\n /**\n * Adds entity information to the input object\n * @param input The input object to add to\n * @param entityObject The entity object\n * @private\n */\n private addEntityInformation(input: any, entityObject: any): void {\n // Prefer using entity name instead of ID for better code readability\n input.EntityName = entityObject.EntityInfo?.Name;\n \n // Convert the entity's primary key to the expected format\n if (entityObject.PrimaryKey) {\n input.PrimaryKey = this.convertPrimaryKey(entityObject.PrimaryKey);\n }\n }\n\n /**\n * Converts a primary key object to the format expected by the GraphQL API\n * @param primaryKey The primary key object\n * @returns The converted primary key\n * @private\n */\n private convertPrimaryKey(primaryKey: any): any {\n return {\n KeyValuePairs: primaryKey.KeyValuePairs.map(kvp => this.convertKeyValuePair(kvp))\n };\n }\n\n /**\n * Converts a key-value pair to a string format\n * @param kvp The key-value pair\n * @returns The converted key-value pair\n * @private\n */\n private convertKeyValuePair(kvp: any): any {\n return {\n FieldName: kvp.FieldName,\n Value: kvp.Value !== null && kvp.Value !== undefined ? \n (typeof kvp.Value === 'object' ? JSON.stringify(kvp.Value) : kvp.Value.toString()) \n : null\n };\n }\n\n /**\n * Executes the GraphQL mutation for an entity action\n * @param input The GraphQL input\n * @returns The GraphQL result\n * @private\n */\n private async executeEntityActionMutation(input: any): Promise<any> {\n const mutation = gql`\n mutation RunEntityAction($input: EntityActionInput!) {\n RunEntityAction(input: $input) {\n Success\n Message\n ResultData\n }\n }\n `;\n\n return await this._dataProvider.ExecuteGQL(mutation, { input });\n }\n\n /**\n * Processes the result of an entity action\n * @param result The GraphQL result\n * @returns The processed entity action result\n * @private\n */\n private processEntityActionResult(result: any): EntityActionResult {\n if (!result?.RunEntityAction) {\n throw new Error(\"Invalid response from server\");\n }\n\n // Parse the ResultData\n let resultData = {};\n try {\n if (result.RunEntityAction.ResultData) {\n resultData = JSON.parse(result.RunEntityAction.ResultData);\n }\n } catch (e) {\n LogError(`Failed to parse entity action result data: ${e}`);\n }\n\n // Return a properly formatted EntityActionResult\n return {\n Success: result.RunEntityAction.Success,\n Message: result.RunEntityAction.Message,\n RunParams: null, // We don't return run params to clients\n LogEntry: null, // We don't return the log entry to clients\n ...resultData\n };\n }\n\n /**\n * Handles errors in the entity action\n * @param e The error\n * @returns An error result\n * @private\n */\n private handleEntityActionError(e: unknown): EntityActionResult {\n const error = e as Error;\n LogError(`Error running entity action: ${error}`);\n return {\n Success: false,\n Message: `Error: ${error.message}`,\n RunParams: null,\n LogEntry: null\n };\n }\n}","import { LogError } from \"@memberjunction/core\";\nimport { GraphQLDataProvider } from \"./graphQLDataProvider\";\nimport { gql } from \"graphql-request\";\nimport { SafeJSONParse } from \"@memberjunction/global\";\n\n/**\n * Parameters for running a test\n */\nexport interface RunTestParams {\n testId: string;\n verbose?: boolean;\n environment?: string;\n onProgress?: (progress: TestExecutionProgress) => void;\n}\n\n/**\n * Result from running a test\n */\nexport interface RunTestResult {\n success: boolean;\n errorMessage?: string;\n executionTimeMs?: number;\n result: any; // Parsed TestRunResult from engine\n}\n\n/**\n * Parameters for running a test suite\n */\nexport interface RunTestSuiteParams {\n suiteId: string;\n verbose?: boolean;\n environment?: string;\n parallel?: boolean;\n onProgress?: (progress: TestExecutionProgress) => void;\n}\n\n/**\n * Result from running a test suite\n */\nexport interface RunTestSuiteResult {\n success: boolean;\n errorMessage?: string;\n executionTimeMs?: number;\n result: any; // Parsed TestSuiteRunResult from engine\n}\n\n/**\n * Test execution progress update\n */\nexport interface TestExecutionProgress {\n currentStep: string;\n percentage: number;\n message: string;\n testName?: string;\n driverType?: string;\n oracleEvaluation?: string;\n}\n\n/**\n * Client for executing tests through GraphQL.\n * This class provides an easy way to run tests and test suites from a client application.\n *\n * @example\n * ```typescript\n * // Create the client\n * const testingClient = new GraphQLTestingClient(graphQLProvider);\n *\n * // Run a test\n * const result = await testingClient.RunTest({\n * testId: \"test-uuid\",\n * verbose: true,\n * environment: \"dev\"\n * });\n *\n * // Run a test suite\n * const suiteResult = await testingClient.RunTestSuite({\n * suiteId: \"suite-uuid\",\n * parallel: true\n * });\n * ```\n */\nexport class GraphQLTestingClient {\n private _dataProvider: GraphQLDataProvider;\n\n /**\n * Creates a new GraphQLTestingClient instance.\n * @param dataProvider The GraphQL data provider to use for queries\n */\n constructor(dataProvider: GraphQLDataProvider) {\n this._dataProvider = dataProvider;\n }\n\n /**\n * Run a single test with the specified parameters.\n *\n * This method invokes a test on the server through GraphQL and returns the result.\n * If a progress callback is provided in params.onProgress, this method will subscribe\n * to real-time progress updates from the GraphQL server and forward them to the callback.\n *\n * @param params The parameters for running the test\n * @returns A Promise that resolves to a RunTestResult object\n *\n * @example\n * ```typescript\n * const result = await testingClient.RunTest({\n * testId: \"test-uuid\",\n * verbose: true,\n * environment: \"staging\",\n * onProgress: (progress) => {\n * console.log(`${progress.currentStep}: ${progress.message} (${progress.percentage}%)`);\n * }\n * });\n *\n * if (result.success) {\n * console.log('Test passed!', result.result);\n * } else {\n * console.error('Test failed:', result.errorMessage);\n * }\n * ```\n */\n public async RunTest(params: RunTestParams): Promise<RunTestResult> {\n let subscription: any;\n\n try {\n // Subscribe to progress updates if callback provided\n if (params.onProgress) {\n subscription = this._dataProvider.PushStatusUpdates(this._dataProvider.sessionId)\n .subscribe((message: string) => {\n try {\n const parsed = JSON.parse(message);\n\n // Filter for TestExecutionProgress messages from RunTestResolver\n if (parsed.resolver === 'RunTestResolver' &&\n parsed.type === 'TestExecutionProgress' &&\n parsed.status === 'ok' &&\n parsed.data?.progress) {\n\n // Forward progress to callback\n params.onProgress!(parsed.data.progress);\n }\n } catch (e) {\n console.error('[GraphQLTestingClient] Failed to parse progress message:', e);\n }\n });\n }\n\n const mutation = gql`\n mutation RunTest(\n $testId: String!,\n $verbose: Boolean,\n $environment: String\n ) {\n RunTest(\n testId: $testId,\n verbose: $verbose,\n environment: $environment\n ) {\n success\n errorMessage\n executionTimeMs\n result\n }\n }\n `;\n\n const variables = {\n testId: params.testId,\n verbose: params.verbose,\n environment: params.environment\n };\n\n const result = await this._dataProvider.ExecuteGQL(mutation, variables);\n return this.processTestResult(result.RunTest);\n\n } catch (e) {\n return this.handleError(e, 'RunTest');\n } finally {\n // Always clean up subscription\n if (subscription) {\n subscription.unsubscribe();\n }\n }\n }\n\n /**\n * Run a test suite with the specified parameters.\n *\n * If a progress callback is provided in params.onProgress, this method will subscribe\n * to real-time progress updates from the GraphQL server and forward them to the callback.\n *\n * @param params The parameters for running the test suite\n * @returns A Promise that resolves to a RunTestSuiteResult object\n *\n * @example\n * ```typescript\n * const result = await testingClient.RunTestSuite({\n * suiteId: \"suite-uuid\",\n * parallel: true,\n * verbose: false,\n * onProgress: (progress) => {\n * console.log(`Progress: ${progress.message} (${progress.percentage}%)`);\n * }\n * });\n *\n * console.log(`Suite: ${result.result.totalTests} tests run`);\n * console.log(`Passed: ${result.result.passedTests}`);\n * ```\n */\n public async RunTestSuite(params: RunTestSuiteParams): Promise<RunTestSuiteResult> {\n let subscription: any;\n\n try {\n // Subscribe to progress updates if callback provided\n if (params.onProgress) {\n subscription = this._dataProvider.PushStatusUpdates(this._dataProvider.sessionId)\n .subscribe((message: string) => {\n try {\n const parsed = JSON.parse(message);\n\n // Filter for TestExecutionProgress messages from RunTestResolver\n if (parsed.resolver === 'RunTestResolver' &&\n parsed.type === 'TestExecutionProgress' &&\n parsed.status === 'ok' &&\n parsed.data?.progress) {\n\n // Forward progress to callback\n params.onProgress!(parsed.data.progress);\n }\n } catch (e) {\n console.error('[GraphQLTestingClient] Failed to parse progress message:', e);\n }\n });\n }\n\n const mutation = gql`\n mutation RunTestSuite(\n $suiteId: String!,\n $verbose: Boolean,\n $environment: String,\n $parallel: Boolean\n ) {\n RunTestSuite(\n suiteId: $suiteId,\n verbose: $verbose,\n environment: $environment,\n parallel: $parallel\n ) {\n success\n errorMessage\n executionTimeMs\n result\n }\n }\n `;\n\n const variables = {\n suiteId: params.suiteId,\n verbose: params.verbose,\n environment: params.environment,\n parallel: params.parallel\n };\n\n const result = await this._dataProvider.ExecuteGQL(mutation, variables);\n return this.processSuiteResult(result.RunTestSuite);\n\n } catch (e) {\n return this.handleError(e, 'RunTestSuite');\n } finally {\n // Always clean up subscription\n if (subscription) {\n subscription.unsubscribe();\n }\n }\n }\n\n /**\n * Check if a test is currently running\n *\n * @param testId The test ID to check\n * @returns True if the test is running, false otherwise\n */\n public async IsTestRunning(testId: string): Promise<boolean> {\n try {\n const query = gql`\n query IsTestRunning($testId: String!) {\n IsTestRunning(testId: $testId)\n }\n `;\n\n const result = await this._dataProvider.ExecuteGQL(query, { testId });\n return result.IsTestRunning;\n\n } catch (e) {\n LogError(`Error checking test running status: ${(e as Error).message}`);\n return false;\n }\n }\n\n // ===== Helper Methods =====\n\n private processTestResult(result: any): RunTestResult {\n if (!result) {\n throw new Error(\"Invalid response from server\");\n }\n\n let parsedResult: any;\n try {\n parsedResult = SafeJSONParse(result.result);\n } catch (e) {\n parsedResult = result.result;\n }\n\n return {\n success: result.success,\n errorMessage: result.errorMessage,\n executionTimeMs: result.executionTimeMs,\n result: parsedResult\n };\n }\n\n private processSuiteResult(result: any): RunTestSuiteResult {\n if (!result) {\n throw new Error(\"Invalid response from server\");\n }\n\n let parsedResult: any;\n try {\n parsedResult = SafeJSONParse(result.result);\n } catch (e) {\n parsedResult = result.result;\n }\n\n return {\n success: result.success,\n errorMessage: result.errorMessage,\n executionTimeMs: result.executionTimeMs,\n result: parsedResult\n };\n }\n\n private handleError(error: any, operation: string): any {\n const errorMsg = (error as Error).message;\n LogError(`${operation} failed: ${errorMsg}`);\n\n return {\n success: false,\n errorMessage: errorMsg,\n result: null\n };\n }\n}\n","import { LogError } from \"@memberjunction/core\";\nimport { GraphQLDataProvider } from \"./graphQLDataProvider\";\nimport { gql } from \"graphql-request\";\nimport { ComponentSpec } from \"@memberjunction/interactive-component-types\";\n\n/**\n * Parameters for getting a component from registry\n */\nexport interface GetRegistryComponentParams {\n /**\n * Registry name (globally unique)\n */\n registryName: string;\n \n /**\n * Component namespace\n */\n namespace: string;\n \n /**\n * Component name\n */\n name: string;\n \n /**\n * Component version (optional, defaults to 'latest')\n */\n version?: string;\n \n /**\n * Optional hash for caching - if provided and matches, returns null\n */\n hash?: string;\n}\n\n/**\n * Response from GetRegistryComponent with hash and caching metadata\n */\nexport interface ComponentSpecWithHash {\n /**\n * The component specification (undefined if not modified)\n */\n specification?: ComponentSpec | string; // Can be either parsed object or JSON string\n \n /**\n * SHA-256 hash of the specification\n */\n hash: string;\n \n /**\n * Indicates if the component was not modified (304 response)\n */\n notModified: boolean;\n \n /**\n * Optional message from server\n */\n message?: string;\n}\n\n/**\n * Parameters for searching registry components\n */\nexport interface SearchRegistryComponentsParams {\n /**\n * Optional registry name filter\n */\n registryName?: string;\n \n /**\n * Optional namespace filter\n */\n namespace?: string;\n \n /**\n * Search query string\n */\n query?: string;\n \n /**\n * Component type filter\n */\n type?: string;\n \n /**\n * Tags to filter by\n */\n tags?: string[];\n \n /**\n * Maximum number of results\n */\n limit?: number;\n \n /**\n * Offset for pagination\n */\n offset?: number;\n}\n\n/**\n * Search result for registry components\n */\nexport interface RegistryComponentSearchResult {\n /**\n * Array of matching components\n */\n components: ComponentSpec[];\n \n /**\n * Total number of matches\n */\n total: number;\n \n /**\n * Current offset\n */\n offset: number;\n \n /**\n * Current limit\n */\n limit: number;\n}\n\n/**\n * Dependency tree for a component\n */\nexport interface ComponentDependencyTree {\n /**\n * Component ID\n */\n componentId: string;\n\n /**\n * Component name\n */\n name?: string;\n\n /**\n * Component namespace\n */\n namespace?: string;\n\n /**\n * Component version\n */\n version?: string;\n\n /**\n * Direct dependencies\n */\n dependencies?: ComponentDependencyTree[];\n\n /**\n * Whether this is a circular dependency\n */\n circular?: boolean;\n\n /**\n * Total count of all dependencies\n */\n totalCount?: number;\n}\n\n/**\n * Input parameters for sending component feedback\n */\nexport interface ComponentFeedbackParams {\n /**\n * Component name\n */\n componentName: string;\n\n /**\n * Component namespace\n */\n componentNamespace: string;\n\n /**\n * Component version (optional)\n */\n componentVersion?: string;\n\n /**\n * Registry name (optional - for registry-specific feedback)\n */\n registryName?: string;\n\n /**\n * Rating (typically 0-5 scale)\n */\n rating: number;\n\n /**\n * Type of feedback (optional)\n */\n feedbackType?: string;\n\n /**\n * User comments (optional)\n */\n comments?: string;\n\n /**\n * Associated conversation ID (optional)\n */\n conversationID?: string;\n\n /**\n * Associated conversation detail ID (optional)\n */\n conversationDetailID?: string;\n\n /**\n * Associated report ID (optional)\n */\n reportID?: string;\n\n /**\n * Associated dashboard ID (optional)\n */\n dashboardID?: string;\n}\n\n/**\n * Response from sending component feedback\n */\nexport interface ComponentFeedbackResponse {\n /**\n * Whether the feedback was successfully submitted\n */\n success: boolean;\n\n /**\n * ID of the created feedback record (if available)\n */\n feedbackID?: string;\n\n /**\n * Error message if submission failed\n */\n error?: string;\n}\n\n/**\n * Client for executing Component Registry operations through GraphQL.\n * This class provides an easy way to fetch components from external registries\n * through the MJ API server, which handles authentication and caching.\n * \n * The GraphQLComponentRegistryClient follows the same naming convention as other GraphQL clients\n * in the MemberJunction ecosystem, such as GraphQLAIClient and GraphQLActionClient.\n * \n * @example\n * ```typescript\n * // Create the client\n * const registryClient = new GraphQLComponentRegistryClient(graphQLProvider);\n * \n * // Get a component from a registry\n * const component = await registryClient.GetRegistryComponent({\n * registryName: \"MJ\",\n * namespace: \"core/ui\",\n * name: \"DataGrid\",\n * version: \"1.0.0\"\n * });\n * \n * // Search for components\n * const searchResult = await registryClient.SearchRegistryComponents({\n * query: \"dashboard\",\n * type: \"dashboard\",\n * limit: 10\n * });\n * ```\n */\nexport class GraphQLComponentRegistryClient {\n /**\n * The GraphQLDataProvider instance used to execute GraphQL requests\n * @private\n */\n private _dataProvider: GraphQLDataProvider;\n\n /**\n * Creates a new GraphQLComponentRegistryClient instance.\n * @param dataProvider The GraphQL data provider to use for queries\n */\n constructor(dataProvider: GraphQLDataProvider) {\n this._dataProvider = dataProvider;\n }\n\n /**\n * Get a specific component from a registry.\n * \n * This method fetches a component specification from an external registry\n * through the MJ API server. The server handles authentication with the\n * registry and may cache the result for performance.\n * \n * @param params The parameters for getting the component\n * @returns A Promise that resolves to a ComponentSpec\n * \n * @example\n * ```typescript\n * const component = await registryClient.GetRegistryComponent({\n * registryName: \"MJ\",\n * namespace: \"core/ui\",\n * name: \"DataGrid\",\n * version: \"2.0.0\"\n * });\n * \n * console.log('Component:', component.name);\n * console.log('Description:', component.description);\n * console.log('Code:', component.code);\n * ```\n */\n public async GetRegistryComponent(params: GetRegistryComponentParams): Promise<ComponentSpec | null> {\n try {\n // Build the query - specification is now a JSON string\n const query = gql`\n query GetRegistryComponent(\n $registryName: String!,\n $namespace: String!,\n $name: String!,\n $version: String,\n $hash: String\n ) {\n GetRegistryComponent(\n registryName: $registryName,\n namespace: $namespace,\n name: $name,\n version: $version,\n hash: $hash\n ) {\n hash\n notModified\n message\n specification\n }\n }\n `;\n\n // Prepare variables\n const variables: Record<string, any> = {\n registryName: params.registryName,\n namespace: params.namespace,\n name: params.name\n };\n\n if (params.version !== undefined) {\n variables.version = params.version;\n }\n \n if (params.hash !== undefined) {\n variables.hash = params.hash;\n }\n\n // Execute the query\n const result = await this._dataProvider.ExecuteGQL(query, variables);\n\n // Handle new response structure with hash\n if (result && result.GetRegistryComponent) {\n const response = result.GetRegistryComponent as ComponentSpecWithHash;\n \n // If not modified and no specification, return null (client should use cache)\n if (response.notModified && !response.specification) {\n return null;\n }\n \n // Parse the JSON string specification if available\n if (response.specification) {\n // If it's already an object, return it\n if (typeof response.specification === 'object') {\n return response.specification as ComponentSpec;\n }\n // Otherwise parse the JSON string\n try {\n return JSON.parse(response.specification) as ComponentSpec;\n } catch (e) {\n LogError(`Failed to parse component specification: ${e}`);\n return null;\n }\n }\n \n return null;\n }\n\n return null;\n } catch (e) {\n LogError(e);\n throw new Error(`Failed to get registry component: ${e instanceof Error ? e.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Get a component from registry with hash and caching metadata.\n * Returns the full response including hash and notModified flag.\n * \n * @param params - Parameters for fetching the component\n * @returns Full response with specification, hash, and caching metadata\n * \n * @example\n * ```typescript\n * const response = await client.GetRegistryComponentWithHash({\n * registryName: 'MJ',\n * namespace: 'core/ui',\n * name: 'DataGrid',\n * version: '1.0.0',\n * hash: 'abc123...'\n * });\n * \n * if (response.notModified) {\n * // Use cached version\n * } else {\n * // Use response.specification\n * }\n * ```\n */\n public async GetRegistryComponentWithHash(params: GetRegistryComponentParams): Promise<ComponentSpecWithHash> {\n try {\n // Build the query - same as GetRegistryComponent\n const query = gql`\n query GetRegistryComponent(\n $registryName: String!,\n $namespace: String!,\n $name: String!,\n $version: String,\n $hash: String\n ) {\n GetRegistryComponent(\n registryName: $registryName,\n namespace: $namespace,\n name: $name,\n version: $version,\n hash: $hash\n ) {\n hash\n notModified\n message\n specification\n }\n }\n `;\n\n // Prepare variables\n const variables: Record<string, any> = {\n registryName: params.registryName,\n namespace: params.namespace,\n name: params.name\n };\n\n if (params.version !== undefined) {\n variables.version = params.version;\n }\n \n if (params.hash !== undefined) {\n variables.hash = params.hash;\n }\n\n // Execute the query\n const result = await this._dataProvider.ExecuteGQL(query, variables);\n\n // Return the full response with parsed specification\n if (result && result.GetRegistryComponent) {\n const response = result.GetRegistryComponent;\n let spec: ComponentSpec | undefined;\n if (response.specification) {\n try {\n spec = JSON.parse(response.specification) as ComponentSpec;\n } catch (e) {\n LogError(`Failed to parse component specification in GetRegistryComponentWithHash: ${e}`);\n spec = undefined;\n }\n }\n return {\n specification: spec,\n hash: response.hash,\n notModified: response.notModified,\n message: response.message\n } as ComponentSpecWithHash;\n }\n\n // Return empty response if nothing found\n return {\n specification: undefined,\n hash: '',\n notModified: false,\n message: 'Component not found'\n };\n } catch (e) {\n LogError(e);\n throw new Error(`Failed to get registry component with hash: ${e instanceof Error ? e.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Search for components in registries.\n * \n * This method searches for components across one or more registries\n * based on the provided criteria. Results are paginated for performance.\n * \n * @param params The search parameters\n * @returns A Promise that resolves to a RegistryComponentSearchResult\n * \n * @example\n * ```typescript\n * const searchResult = await registryClient.SearchRegistryComponents({\n * query: \"dashboard\",\n * type: \"dashboard\",\n * tags: [\"analytics\", \"reporting\"],\n * limit: 20,\n * offset: 0\n * });\n * \n * console.log(`Found ${searchResult.total} components`);\n * searchResult.components.forEach(component => {\n * console.log(`- ${component.name}: ${component.description}`);\n * });\n * ```\n */\n public async SearchRegistryComponents(params: SearchRegistryComponentsParams): Promise<RegistryComponentSearchResult> {\n try {\n // Build the query\n const query = gql`\n query SearchRegistryComponents($params: SearchRegistryComponentsInput!) {\n SearchRegistryComponents(params: $params) {\n components\n total\n offset\n limit\n }\n }\n `;\n\n // Execute the query\n const result = await this._dataProvider.ExecuteGQL(query, { params });\n\n // Return the search result with parsed components\n if (result && result.SearchRegistryComponents) {\n const searchResult = result.SearchRegistryComponents;\n return {\n components: searchResult.components.map((json: string) => JSON.parse(json) as ComponentSpec),\n total: searchResult.total,\n offset: searchResult.offset,\n limit: searchResult.limit\n } as RegistryComponentSearchResult;\n }\n\n return {\n components: [],\n total: 0,\n offset: 0,\n limit: params.limit || 10\n };\n } catch (e) {\n LogError(e);\n throw new Error(`Failed to search registry components: ${e instanceof Error ? e.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Resolve the dependency tree for a component.\n * \n * This method fetches the complete dependency tree for a component,\n * including all transitive dependencies. The server handles circular\n * dependency detection and marks them appropriately.\n * \n * @param registryId The registry ID\n * @param componentId The component ID\n * @returns A Promise that resolves to a ComponentDependencyTree\n * \n * @example\n * ```typescript\n * const dependencyTree = await registryClient.ResolveComponentDependencies(\n * \"mj-central\",\n * \"component-123\"\n * );\n * \n * console.log(`Component has ${dependencyTree.totalCount} total dependencies`);\n * if (dependencyTree.circular) {\n * console.warn('Circular dependency detected!');\n * }\n * ```\n */\n public async ResolveComponentDependencies(\n registryId: string,\n componentId: string\n ): Promise<ComponentDependencyTree | null> {\n try {\n // Build the query\n const query = gql`\n query ResolveComponentDependencies(\n $registryId: String!,\n $componentId: String!\n ) {\n ResolveComponentDependencies(\n registryId: $registryId,\n componentId: $componentId\n ) {\n componentId\n name\n namespace\n version\n circular\n totalCount\n dependencies {\n componentId\n name\n namespace\n version\n circular\n totalCount\n }\n }\n }\n `;\n\n // Execute the query\n const result = await this._dataProvider.ExecuteGQL(query, {\n registryId,\n componentId\n });\n\n // Return the dependency tree\n if (result && result.ResolveComponentDependencies) {\n return result.ResolveComponentDependencies as ComponentDependencyTree;\n }\n\n return null;\n } catch (e) {\n LogError(e);\n throw new Error(`Failed to resolve component dependencies: ${e instanceof Error ? e.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Check if a specific version of a component exists in a registry.\n * \n * @param params The parameters for checking component existence\n * @returns A Promise that resolves to true if the component exists, false otherwise\n * \n * @example\n * ```typescript\n * const exists = await registryClient.ComponentExists({\n * registryId: \"mj-central\",\n * namespace: \"core/ui\",\n * name: \"DataGrid\",\n * version: \"2.0.0\"\n * });\n * \n * if (exists) {\n * console.log('Component is available');\n * }\n * ```\n */\n public async ComponentExists(params: GetRegistryComponentParams): Promise<boolean> {\n try {\n const component = await this.GetRegistryComponent(params);\n return component !== null;\n } catch (e) {\n // If we get an error, assume the component doesn't exist\n return false;\n }\n }\n\n /**\n * Get the latest version of a component.\n * \n * @param registryId The registry ID\n * @param namespace The component namespace\n * @param name The component name\n * @returns A Promise that resolves to the latest version string or null\n * \n * @example\n * ```typescript\n * const latestVersion = await registryClient.GetLatestVersion(\n * \"mj-central\",\n * \"core/ui\",\n * \"DataGrid\"\n * );\n * \n * console.log(`Latest version: ${latestVersion}`);\n * ```\n */\n public async GetLatestVersion(\n registryName: string,\n namespace: string,\n name: string\n ): Promise<string | null> {\n try {\n const component = await this.GetRegistryComponent({\n registryName,\n namespace,\n name,\n version: 'latest'\n });\n\n return component?.version || null;\n } catch (e) {\n LogError(e);\n return null;\n }\n }\n\n /**\n * Send feedback for a component.\n *\n * This is a registry-agnostic method that allows submitting feedback\n * for any component from any registry. The feedback can include ratings,\n * comments, and associations with conversations, reports, or dashboards.\n *\n * @param params The feedback parameters\n * @returns A Promise that resolves to a ComponentFeedbackResponse\n *\n * @example\n * ```typescript\n * const response = await registryClient.SendComponentFeedback({\n * componentName: 'DataGrid',\n * componentNamespace: 'core/ui',\n * componentVersion: '1.0.0',\n * registryName: 'MJ',\n * rating: 5,\n * feedbackType: 'feature-request',\n * comments: 'Would love to see export to Excel functionality',\n * conversationID: 'conv-123'\n * });\n *\n * if (response.success) {\n * console.log('Feedback submitted successfully!');\n * if (response.feedbackID) {\n * console.log(`Feedback ID: ${response.feedbackID}`);\n * }\n * } else {\n * console.error('Feedback submission failed:', response.error);\n * }\n * ```\n */\n public async SendComponentFeedback(params: ComponentFeedbackParams): Promise<ComponentFeedbackResponse> {\n try {\n // Build the mutation\n const mutation = gql`\n mutation SendComponentFeedback($feedback: ComponentFeedbackInput!) {\n SendComponentFeedback(feedback: $feedback) {\n success\n feedbackID\n error\n }\n }\n `;\n\n // Execute the mutation\n const result = await this._dataProvider.ExecuteGQL(mutation, { feedback: params });\n\n // Return the response\n if (result && result.SendComponentFeedback) {\n return result.SendComponentFeedback as ComponentFeedbackResponse;\n }\n\n return {\n success: false,\n error: 'No response from server'\n };\n } catch (e) {\n LogError(e);\n return {\n success: false,\n error: e instanceof Error ? e.message : 'Unknown error'\n };\n }\n }\n}"],"names":["TransactionGroupBase","gql","SafeJSONParse","TransactionResult","LogError","LogStatusEx","ProviderConfigDataBase","ProviderBase","uuidv4","UserInfo","ViewInfo","ProviderType","BaseEntityResult","EntityFieldTSType","TransactionItem","GraphQLClient","UserRoleInfo","createClient","Observable","Subject","Subscription","openDB","SetProvider","MJGlobal","MJEventType","IsVerboseLoggingEnabled"],"mappings":"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G;AACH;AACA;AACA;AACA;AACA;AACA,EAAE,MAAM,WAAW,CAAC,KAAK,EAAE;AAC3B,IAAI,IAAI;AACR,MAAM,MAAM,KAAK,GAAG,CAAC;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,CAAC,CAAC;AACf,MAAM,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;AACjE,MAAM,IAAI,MAAM,IAAI,MAAM,CAAC,qBAAqB,EAAE;AAClD,QAAQ,OAAO,MAAM,CAAC,qBAAqB,CAAC;AAC5C,OAAO,MAAM;AACb,QAAQ,OAAO;AACf,UAAU,OAAO,EAAE,KAAK;AACxB,UAAU,YAAY,EAAE,wBAAwB;AAChD,SAAS,CAAC;AACV,OAAO;AACP,KAAK,CAAC,OAAO,CAAC,EAAE;AAChB,MAAMA,aAAQ,CAAC,CAAC,8DAA8D,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACrF,MAAM,OAAO;AACb,QAAQ,OAAO,EAAE,KAAK;AACtB,QAAQ,YAAY,EAAE,CAAC,CAAC,QAAQ,EAAE;AAClC,OAAO,CAAC;AACR,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,EAAE,MAAM,WAAW,CAAC,KAAK,EAAE;AAC3B,IAAI,IAAI;AACR,MAAM,MAAM,KAAK,GAAG,CAAC;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A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"}