@memberjunction/ng-core-entity-forms 5.30.1 → 5.31.0
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.
- package/dist/lib/__tests__/content-source-form.test.d.ts +2 -0
- package/dist/lib/__tests__/content-source-form.test.d.ts.map +1 -0
- package/dist/lib/__tests__/content-source-form.test.js +183 -0
- package/dist/lib/__tests__/content-source-form.test.js.map +1 -0
- package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts +2 -1
- package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/add-action-dialog.component.js +6 -4
- package/dist/lib/custom/AIAgents/add-action-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/agent-advanced-settings-dialog.component.js +2 -2
- package/dist/lib/custom/AIAgents/agent-advanced-settings-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts +2 -1
- package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js +6 -4
- package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js +15 -15
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts +2 -1
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js +9 -7
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts +2 -1
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js +11 -9
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts +2 -1
- package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/new-agent-dialog.component.js +6 -5
- package/dist/lib/custom/AIAgents/new-agent-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts +2 -1
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js +6 -4
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts +2 -1
- package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js +6 -4
- package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts +2 -1
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js +6 -4
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +3 -3
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts +1 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +6 -6
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
- package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts +2 -1
- package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js +7 -5
- package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js.map +1 -1
- package/dist/lib/custom/Actions/action-execution-log-form.component.js +3 -3
- package/dist/lib/custom/Actions/action-execution-log-form.component.js.map +1 -1
- package/dist/lib/custom/Actions/action-form.component.js +12 -12
- package/dist/lib/custom/Actions/action-form.component.js.map +1 -1
- package/dist/lib/custom/ContentSources/content-source-form.component.d.ts +59 -5
- package/dist/lib/custom/ContentSources/content-source-form.component.d.ts.map +1 -1
- package/dist/lib/custom/ContentSources/content-source-form.component.js +379 -34
- package/dist/lib/custom/ContentSources/content-source-form.component.js.map +1 -1
- package/dist/lib/custom/Entities/entity-form.component.d.ts +1 -1
- package/dist/lib/custom/Entities/entity-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Entities/entity-form.component.js +5 -5
- package/dist/lib/custom/Entities/entity-form.component.js.map +1 -1
- package/dist/lib/custom/Lists/list-form.component.d.ts +1 -1
- package/dist/lib/custom/Lists/list-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Lists/list-form.component.js +10 -10
- package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-category-dialog.component.d.ts +2 -1
- package/dist/lib/custom/Queries/query-category-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/Queries/query-category-dialog.component.js +9 -7
- package/dist/lib/custom/Queries/query-category-dialog.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-form.component.js +17 -17
- package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-run-dialog.component.d.ts +2 -1
- package/dist/lib/custom/Queries/query-run-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/Queries/query-run-dialog.component.js +7 -6
- package/dist/lib/custom/Queries/query-run-dialog.component.js.map +1 -1
- package/dist/lib/custom/Templates/template-param-dialog.component.d.ts +2 -1
- package/dist/lib/custom/Templates/template-param-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/Templates/template-param-dialog.component.js +10 -8
- package/dist/lib/custom/Templates/template-param-dialog.component.js.map +1 -1
- package/dist/lib/custom/Templates/template-params-grid.component.d.ts +2 -1
- package/dist/lib/custom/Templates/template-params-grid.component.d.ts.map +1 -1
- package/dist/lib/custom/Templates/template-params-grid.component.js +9 -7
- package/dist/lib/custom/Templates/template-params-grid.component.js.map +1 -1
- package/dist/lib/custom/Templates/templates-form.component.js +8 -8
- package/dist/lib/custom/Templates/templates-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/entity-link-pill.component.d.ts +3 -2
- package/dist/lib/custom/Tests/entity-link-pill.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/entity-link-pill.component.js +8 -6
- package/dist/lib/custom/Tests/entity-link-pill.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-form.component.d.ts +1 -1
- package/dist/lib/custom/Tests/test-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-form.component.js +7 -7
- package/dist/lib/custom/Tests/test-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-run-form.component.js +5 -5
- package/dist/lib/custom/Tests/test-run-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-suite-form.component.d.ts +1 -1
- package/dist/lib/custom/Tests/test-suite-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-suite-form.component.js +8 -8
- package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts +1 -1
- package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-suite-run-form.component.js +6 -6
- package/dist/lib/custom/Tests/test-suite-run-form.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts +2 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +8 -6
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts +9 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js +15 -3
- package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts +3 -2
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +10 -5
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +2 -2
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
- package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts +2 -1
- package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts.map +1 -1
- package/dist/lib/custom/shared/entity-selector-dialog.component.js +6 -4
- package/dist/lib/custom/shared/entity-selector-dialog.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js +46 -28
- package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJCompanyIntegrationEntityMap/mjcompanyintegrationentitymap.form.component.js +10 -10
- package/dist/lib/generated/Entities/MJCompanyIntegrationEntityMap/mjcompanyintegrationentitymap.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.js +25 -7
- package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.js +25 -7
- package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js +106 -88
- package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJTag/mjtag.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJTag/mjtag.form.component.js +181 -61
- package/dist/lib/generated/Entities/MJTag/mjtag.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJTagScope/mjtagscope.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJTagScope/mjtagscope.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJTagScope/mjtagscope.form.component.js +63 -0
- package/dist/lib/generated/Entities/MJTagScope/mjtagscope.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJTagSuggestion/mjtagsuggestion.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJTagSuggestion/mjtagsuggestion.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJTagSuggestion/mjtagsuggestion.form.component.js +95 -0
- package/dist/lib/generated/Entities/MJTagSuggestion/mjtagsuggestion.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJTagSynonym/mjtagsynonym.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJTagSynonym/mjtagsynonym.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJTagSynonym/mjtagsynonym.form.component.js +63 -0
- package/dist/lib/generated/Entities/MJTagSynonym/mjtagsynonym.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +199 -181
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
- package/dist/lib/generated/generated-forms.module.d.ts +51 -48
- package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
- package/dist/lib/generated/generated-forms.module.js +27 -18
- package/dist/lib/generated/generated-forms.module.js.map +1 -1
- package/dist/lib/shared/components/template-editor.component.d.ts +3 -2
- package/dist/lib/shared/components/template-editor.component.d.ts.map +1 -1
- package/dist/lib/shared/components/template-editor.component.js +8 -6
- package/dist/lib/shared/components/template-editor.component.js.map +1 -1
- package/package.json +37 -35
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-prompt-form.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/AIPrompts/ai-prompt-form.component.ts","../../../../src/lib/custom/AIPrompts/ai-prompt-form.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, ViewChild, ChangeDetectorRef, ViewContainerRef, inject } from '@angular/core';\nimport { MJTemplateEntity, MJTemplateContentEntity, MJTemplateParamEntity, MJAIPromptModelEntity, MJAIVendorEntity, MJAIModelVendorEntity, MJAIPromptTypeEntity, MJAIConfigurationEntity } from '@memberjunction/core-entities';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseFormComponent, CUSTOM_LAYOUT_TOOLBAR_CONFIG } from '@memberjunction/ng-base-forms';\nimport { SharedService } from '@memberjunction/ng-shared';\nimport { Metadata, RunView, CompositeKey } from '@memberjunction/core';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { TemplateEditorConfig, TemplateEditorComponent } from '../../shared/components/template-editor.component';\nimport { MJAIPromptFormComponent } from '../../generated/Entities/MJAIPrompt/mjaiprompt.form.component';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { AITestHarnessDialogService } from '@memberjunction/ng-ai-test-harness';\nimport { AIPromptManagementService } from './ai-prompt-management.service';\nimport { MJAIModelEntityExtended, MJAIPromptCategoryEntityExtended, MJAIPromptEntityExtended, MJAIPromptRunEntityExtended } from '@memberjunction/ai-core-plus';\n\n@RegisterClass(BaseFormComponent, 'MJ: AI Prompts')\n@Component({\n standalone: false,\n selector: 'mj-ai-prompt-form',\n templateUrl: './ai-prompt-form.component.html',\n styleUrls: ['./ai-prompt-form.component.css']\n})\nexport class MJAIPromptFormComponentExtended extends MJAIPromptFormComponent implements OnInit {\n private testHarnessService = inject(AITestHarnessDialogService);\n private viewContainerRef = inject(ViewContainerRef);\n private promptManagementService = inject(AIPromptManagementService);\n\n public record!: MJAIPromptEntityExtended;\n public readonly toolbarConfig = CUSTOM_LAYOUT_TOOLBAR_CONFIG;\n\n /** Custom-layout AI Prompt form looks best full-width on first open. */\n public override getDefaultFormWidthMode(): 'centered' | 'full-width' { return 'full-width'; }\n public template: MJTemplateEntity | null = null;\n public templateContent: MJTemplateContentEntity | null = null;\n public templateParams: MJTemplateParamEntity[] = [];\n public isLoadingTemplate = true; // Default to loading state\n public isLoadingTemplateParams = false;\n public templateNotFoundInDatabase = false;\n public showTestHarness = false;\n \n // Model management\n public promptModels: MJAIPromptModelEntity[] = [];\n public availableModels: MJAIModelEntityExtended[] = [];\n public availableVendors: MJAIVendorEntity[] = [];\n public isLoadingModels = false;\n \n // Vendor management per model\n public modelVendorsMap = new Map<string, { vendors: MJAIVendorEntity[], modelVendors: MJAIModelVendorEntity[] }>();\n \n // AI Prompt Types\n public availablePromptTypes: MJAIPromptTypeEntity[] = [];\n public isLoadingPromptTypes = false;\n \n // AI Configurations\n public availableConfigurations: MJAIConfigurationEntity[] = [];\n public isLoadingConfigurations = false;\n \n // Result Selector Tree Data\n public resultSelectorTreeData: any[] = [];\n public isLoadingResultSelectorData = false;\n \n // Drag and drop state\n public draggedIndex: number = -1;\n \n // Execution History\n public executionHistory: MJAIPromptRunEntityExtended[] = [];\n public isLoadingHistory = false;\n public historySortField: 'runAt' | 'executionTime' | 'cost' | 'tokens' = 'runAt';\n public historySortDirection: 'asc' | 'desc' = 'desc';\n \n // Removed custom transaction tracking - we'll use base form's _pendingRecords instead\n public hasUnsavedChanges = false;\n \n // Store original state for cancel/revert functionality\n private originalTemplateID: string | null = null;\n \n // === Permission Checks for Related Entities ===\n /** Cache for permission checks to avoid repeated calculations */\n private _permissionCache = new Map<string, boolean>();\n\n // Main AI Prompt permissions inherited from BaseFormComponent:\n // - UserCanEdit (Update permission)\n // - UserCanRead (Read permission) \n // - UserCanCreate (Create permission)\n // - UserCanDelete (Delete permission)\n\n /** Check if user can create Templates */\n public get UserCanCreateTemplates(): boolean {\n return this.checkEntityPermission('Templates', 'Create');\n }\n\n /** Check if user can update Templates */\n public get UserCanUpdateTemplates(): boolean {\n return this.checkEntityPermission('Templates', 'Update');\n }\n\n /** Check if user can delete Templates */\n public get UserCanDeleteTemplates(): boolean {\n return this.checkEntityPermission('Templates', 'Delete');\n }\n\n /** Check if user can read Templates */\n public get UserCanReadTemplates(): boolean {\n return this.checkEntityPermission('Templates', 'Read');\n }\n\n /** Check if user can create Template Contents */\n public get UserCanCreateTemplateContents(): boolean {\n return this.checkEntityPermission('MJ: Template Contents', 'Create');\n }\n\n /** Check if user can update Template Contents */\n public get UserCanUpdateTemplateContents(): boolean {\n return this.checkEntityPermission('MJ: Template Contents', 'Update');\n }\n\n /** Check if user can create AI Prompt Models */\n public get UserCanCreatePromptModels(): boolean {\n return this.checkEntityPermission('MJ: AI Prompt Models', 'Create');\n }\n\n /** Check if user can update AI Prompt Models */\n public get UserCanUpdatePromptModels(): boolean {\n return this.checkEntityPermission('MJ: AI Prompt Models', 'Update');\n }\n\n /** Check if user can delete AI Prompt Models */\n public get UserCanDeletePromptModels(): boolean {\n return this.checkEntityPermission('MJ: AI Prompt Models', 'Delete');\n }\n\n /**\n * Helper method to check entity permissions with caching\n * @param entityName - The name of the entity to check permissions for\n * @param permissionType - The type of permission to check (Create, Read, Update, Delete)\n * @returns boolean indicating if user has the permission\n */\n private checkEntityPermission(entityName: string, permissionType: 'Create' | 'Read' | 'Update' | 'Delete'): boolean {\n const cacheKey = `${entityName}_${permissionType}`;\n \n if (this._permissionCache.has(cacheKey)) {\n return this._permissionCache.get(cacheKey)!;\n }\n\n try {\n const entityInfo = this._metadata.Entities.find(e => e.Name === entityName);\n \n if (!entityInfo) {\n console.warn(`Entity '${entityName}' not found for permission check`);\n this._permissionCache.set(cacheKey, false);\n return false;\n }\n\n const userPermissions = entityInfo.GetUserPermisions(this._metadata.CurrentUser);\n let hasPermission = false;\n\n switch (permissionType) {\n case 'Create':\n hasPermission = userPermissions.CanCreate;\n break;\n case 'Read':\n hasPermission = userPermissions.CanRead;\n break;\n case 'Update':\n hasPermission = userPermissions.CanUpdate;\n break;\n case 'Delete':\n hasPermission = userPermissions.CanDelete;\n break;\n }\n\n this._permissionCache.set(cacheKey, hasPermission);\n return hasPermission;\n } catch (error) {\n console.error(`Error checking ${permissionType} permission for ${entityName}:`, error);\n this._permissionCache.set(cacheKey, false);\n return false;\n }\n }\n\n /**\n * Clears the permission cache. Call this when user context changes or permissions are updated.\n */\n public clearPermissionCache(): void {\n this._permissionCache.clear();\n }\n \n // Template editor configuration\n public get templateEditorConfig(): TemplateEditorConfig {\n return {\n allowEdit: this.EditMode && this.UserCanUpdateTemplateContents,\n showRunButton: false,\n compactMode: false\n };\n }\n\n private _metadata = new Metadata();\n private __InferenceProvider_VendorTypeDefinitionID: string = '';\n\n @ViewChild('templateEditor') templateEditor: TemplateEditorComponent | undefined;\n\n async ngOnInit() {\n await super.ngOnInit();\n\n // make sure AI Engine Base is configured, this will load stuff only if not already\n // loaded in the current process space\n await AIEngineBase.Instance.Config(false, this._metadata.CurrentUser);\n this.__InferenceProvider_VendorTypeDefinitionID = AIEngineBase.Instance.VendorTypeDefinitions.find(\n vtd => vtd.Name.trim().toLowerCase() === 'inference provider')?.ID || '';\n if (!this.__InferenceProvider_VendorTypeDefinitionID) {\n console.error('Inference Provider Vendor Type Definition ID not found');\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Inference Provider Vendor Type Definition not found',\n 'error',\n 5000\n );\n return;\n }\n \n // Load template when record changes\n if (this.record?.TemplateID) {\n // isLoadingTemplate is already true by default\n this.loadTemplate(); // Don't await so other loads can happen in parallel\n } else {\n // No template ID, so we're not loading\n this.isLoadingTemplate = false;\n }\n \n // Load available models, vendors, prompt types, configurations, prompt models, and result selector data\n await Promise.all([\n this.loadAvailableModels(),\n this.loadAvailableVendors(),\n this.loadAvailablePromptTypes(),\n this.loadAvailableConfigurations(),\n this.loadPromptModels(),\n this.loadResultSelectorTreeData()\n ]);\n \n // Load execution history if record is saved\n if (this.record?.IsSaved) {\n await this.loadExecutionHistory();\n }\n \n // Set defaults for new records\n if (!this.record.IsSaved) {\n // Default to first prompt type if not set\n if (!this.record.TypeID && this.availablePromptTypes.length > 0) {\n this.record.TypeID = this.availablePromptTypes[0].ID;\n }\n \n // Default status to Pending if not set\n if (!this.record.Status) {\n this.record.Status = 'Pending';\n }\n }\n }\n\n /**\n * Loads the template associated with this AI prompt\n */\n public async loadTemplate() {\n if (!this.record?.TemplateID) {\n this.template = null;\n this.templateNotFoundInDatabase = false;\n return;\n }\n\n // First check if we already have this template in pending records (newly created)\n const pendingTemplate = this.PendingRecords.find(p => \n p.entityObject.EntityInfo.Name === 'MJ: Templates' && \n p.entityObject.Get('ID') === this.record.TemplateID\n );\n \n if (pendingTemplate) {\n // Use the pending template\n this.template = pendingTemplate.entityObject as MJTemplateEntity;\n this.templateNotFoundInDatabase = false;\n this.isLoadingTemplate = false;\n\n // Clear template content and params since this is a new template\n this.templateContent = null;\n this.templateParams = [];\n this.cdr.detectChanges();\n return;\n }\n\n this.isLoadingTemplate = true;\n this.templateNotFoundInDatabase = false; // Reset the flag\n try {\n this.template = await this._metadata.GetEntityObject<MJTemplateEntity>('MJ: Templates');\n await this.template.Load(this.record.TemplateID);\n \n if (!this.template.IsSaved) {\n this.template = null;\n this.templateNotFoundInDatabase = true; // Set flag when template not found\n console.warn(`Template with ID ${this.record.TemplateID} not found`);\n } else {\n // Load template content and parameters\n await Promise.all([\n this.loadTemplateContent(),\n this.loadTemplateParams()\n ]);\n }\n\n } catch (error) {\n console.error('Error loading template:', error);\n this.template = null;\n this.templateNotFoundInDatabase = true; // Set flag on error\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Error loading associated template',\n 'error',\n 5000\n );\n } finally {\n this.isLoadingTemplate = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Handles template ID changes in the form\n */\n public async onTemplateIdChange() {\n if (this.record?.TemplateID) {\n await this.loadTemplate();\n } else {\n this.template = null;\n this.templateParams = [];\n }\n this.hasUnsavedChanges = true;\n }\n \n\n /**\n * Opens a dialog to link an existing template\n */\n public async linkExistingTemplate() {\n try {\n this.promptManagementService.openTemplateSelectorDialog({\n title: 'Link Existing Template',\n multiSelect: false,\n showCreateNew: true,\n showActiveOnly: true,\n selectedTemplateIds: this.record.TemplateID ? [this.record.TemplateID] : [],\n viewContainerRef: this.viewContainerRef\n }).subscribe({\n next: async (result) => {\n if (result && result.selectedTemplates.length > 0) {\n const selectedTemplate = result.selectedTemplates[0];\n \n // First, clean up any pending changes related to the old template\n this.cleanupOldTemplateRecords();\n \n // Update the AI prompt to reference the selected template\n this.record.TemplateID = selectedTemplate.ID;\n this.hasUnsavedChanges = true;\n \n // Load the selected template\n await this.loadTemplate();\n \n // Trigger change detection to update UI\n this.cdr.detectChanges();\n \n MJNotificationService.Instance.CreateSimpleNotification(\n `Template \"${selectedTemplate.Name}\" linked successfully`,\n 'success',\n 3000\n );\n } else if (result && result.createNew) {\n // User wants to create a new template\n await this.createNewTemplate();\n }\n },\n error: (error) => {\n console.error('Error opening template selector:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Error opening template selector. Please try again.',\n 'error',\n 3000\n );\n }\n });\n } catch (error) {\n console.error('Error in linkExistingTemplate:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Error linking template. Please try again.',\n 'error',\n 3000\n );\n }\n }\n\n /**\n * Opens the current template in a new window\n */\n public openTemplateInNewWindow() {\n if (!this.template?.ID) return;\n \n // TODO: Get the proper URL for template editing\n const templateUrl = `/templates/${this.template.ID}`;\n window.open(templateUrl, '_blank');\n }\n\n /**\n * Creates a new template for this AI prompt (deferred until save)\n */\n public async createNewTemplate() {\n try {\n // First, clean up any pending changes related to the old template\n this.cleanupOldTemplateRecords();\n \n const newTemplate = await this._metadata.GetEntityObject<MJTemplateEntity>('MJ: Templates');\n console.log(\"Record Name:\", this.record.Name);\n newTemplate.NewRecord();\n newTemplate.Name = `${this.record.Name || 'AI Prompt'} Template`;\n newTemplate.Description = `Template for AI Prompt: ${this.record.Name}`;\n newTemplate.UserID = this._metadata.CurrentUser.ID;\n \n // Add to pending records instead of saving immediately\n this.PendingRecords.push({\n entityObject: newTemplate,\n action: 'save'\n });\n \n // Update the AI prompt to reference the new template\n this.record.TemplateID = newTemplate.ID;\n this.hasUnsavedChanges = true;\n \n // Set the template for UI purposes\n this.template = newTemplate;\n \n // Clear existing template content and params since we have a new template\n this.templateContent = null;\n this.templateParams = [];\n this.isLoadingTemplate = false;\n this.templateNotFoundInDatabase = false;\n \n // Force UI update in next microtask to ensure template editor refreshes\n Promise.resolve().then(() => {\n this.cdr.detectChanges();\n });\n\n MJNotificationService.Instance.CreateSimpleNotification(\n 'New template created and will be saved when you save the AI prompt',\n 'info',\n 4000\n );\n\n } catch (error) {\n console.error('Error creating new template:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n MJNotificationService.Instance.CreateSimpleNotification(\n `Error creating new template: ${errorMessage}`,\n 'error',\n 6000\n );\n }\n }\n\n /**\n * Cleans up any pending records related to the old template when changing templates\n */\n private cleanupOldTemplateRecords() {\n // Get current pending records and filter out template content/params from old template\n const currentPendingRecords = this.PendingRecords;\n \n // Remove template content and template param records\n for (let i = currentPendingRecords.length - 1; i >= 0; i--) {\n const record = currentPendingRecords[i];\n const entityName = record.entityObject.EntityInfo.Name;\n if (entityName === 'MJ: Template Contents' || entityName === 'MJ: Template Params') {\n currentPendingRecords.splice(i, 1);\n }\n }\n }\n\n /**\n * Loads template content for the current template\n */\n private async loadTemplateContent() {\n if (!this.template?.ID) {\n this.templateContent = null;\n return;\n }\n\n try {\n const rv = new RunView();\n const results = await rv.RunView<MJTemplateContentEntity>({\n EntityName: 'MJ: Template Contents',\n ExtraFilter: `TemplateID = '${this.template.ID}'`,\n OrderBy: 'Priority ASC',\n ResultType: 'entity_object'\n });\n \n // Get the first content (highest priority)\n this.templateContent = results.Results?.[0] || null;\n } catch (error) {\n console.error('Error loading template content:', error);\n this.templateContent = null;\n }\n }\n\n /**\n * Loads template parameters for the current template\n */\n private async loadTemplateParams() {\n if (!this.template?.ID) {\n this.templateParams = [];\n return;\n }\n\n this.isLoadingTemplateParams = true;\n try {\n const rv = new RunView();\n const results = await rv.RunView<MJTemplateParamEntity>({\n EntityName: 'MJ: Template Params',\n ExtraFilter: `TemplateID = '${this.template.ID}'`,\n OrderBy: 'Name ASC' \n });\n \n this.templateParams = results.Results || [];\n } catch (error) {\n console.error('Error loading template params:', error);\n this.templateParams = [];\n } finally {\n this.isLoadingTemplateParams = false;\n }\n }\n\n /**\n * Opens the AI prompt execution dialog\n */\n public executeAIPrompt() {\n if (!this.record?.ID) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Please save the AI prompt before executing',\n 'warning',\n 4000\n );\n return;\n }\n\n if (this.record.Status !== 'Active') {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'AI prompt must be Active to execute',\n 'warning',\n 4000\n );\n return;\n }\n\n // Use test harness instead\n this.openTestHarness();\n }\n\n /**\n * Opens the test harness\n */\n public openTestHarness() {\n if (!this.record?.ID) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Please save the AI prompt before testing',\n 'warning',\n 4000\n );\n return;\n }\n\n // Use the dialog service instead of inline\n // Don't pass viewContainerRef so window is top-level\n this.testHarnessService.openForPrompt(this.record.ID).subscribe({\n next: (result) => {\n if (result.success) {\n // Reload execution history\n this.loadExecutionHistory();\n }\n },\n error: (error) => {\n console.error('Test harness error:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Test failed: ' + error.message,\n 'error',\n 5000\n );\n }\n });\n }\n\n /**\n * Handles when test harness is closed\n */\n public onTestHarnessVisibilityChanged(isVisible: boolean) {\n this.showTestHarness = isVisible;\n }\n\n /**\n * Handles template content changes from the editor\n */\n public onTemplateContentChange(content: MJTemplateContentEntity[]) {\n // Handle template content changes if needed\n console.log('Template content changed:', content);\n \n // Mark as having unsaved changes\n this.hasUnsavedChanges = true;\n \n // If we have content changes, we need to ensure they're added to pending records\n // This is typically handled by the template editor component itself\n }\n \n /**\n * Handles template content record deletion\n * This method should be called by the template editor to properly manage deletions\n */\n public handleTemplateContentDelete(templateContent: MJTemplateContentEntity) {\n if (templateContent.IsSaved) {\n // If it's saved, add to pending deletions\n this.PendingRecords.push({\n entityObject: templateContent,\n action: 'delete'\n });\n } else {\n // If it's not saved, remove it from pending records if it exists there\n const currentPendingRecords = this.PendingRecords;\n for (let i = currentPendingRecords.length - 1; i >= 0; i--) {\n const record = currentPendingRecords[i];\n if (record.entityObject === templateContent || \n (record.entityObject.EntityInfo.Name === 'MJ: Template Contents' && \n record.entityObject.Get('ID') === templateContent.Get('ID'))) {\n currentPendingRecords.splice(i, 1);\n break;\n }\n }\n }\n this.hasUnsavedChanges = true;\n }\n \n /**\n * Handles template content record creation/modification\n * This method should be called by the template editor to properly manage saves\n */\n public handleTemplateContentSave(templateContent: MJTemplateContentEntity) {\n if (templateContent.Dirty || !templateContent.IsSaved) {\n // Add to pending saves\n this.PendingRecords.push({\n entityObject: templateContent,\n action: 'save'\n });\n }\n this.hasUnsavedChanges = true;\n }\n \n /**\n * Adds template content changes to pending records\n */\n private addTemplateContentsToPendingRecords() {\n // This method would typically get pending changes from the template editor\n // The template editor should expose its pending changes through events or direct calls\n // For now, we'll rely on the template editor to manage its own pending records\n // and communicate them through the MJ event system\n \n // If the template editor has a method to get pending changes, we would call it here\n if (this.templateEditor && typeof (this.templateEditor as any).getPendingChanges === 'function') {\n try {\n const pendingChanges = (this.templateEditor as any).getPendingChanges();\n if (pendingChanges && pendingChanges.length > 0) {\n this.PendingRecords.push(...pendingChanges);\n }\n } catch (error) {\n console.warn('Template editor does not support getPendingChanges method:', error);\n }\n }\n }\n\n /**\n * Handles template run requests from the editor\n */\n public onTemplateRun(template: MJTemplateEntity) {\n console.log('Template run requested:', template);\n // Could open the template parameter dialog here if needed\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Template run functionality coming soon',\n 'info',\n 3000\n );\n }\n\n /**\n * Gets the display text for parallelization mode\n */\n public getParallelizationModeDisplay(): string {\n switch (this.record?.ParallelizationMode) {\n case 'None': return 'None';\n case 'StaticCount': return `Static count (${this.record.ParallelCount || 1})`;\n case 'ConfigParam': return `Config parameter (${this.record.ParallelConfigParam || 'not set'})`;\n case 'ModelSpecific': return 'Model-specific configuration';\n default: return 'Unknown';\n }\n }\n\n /**\n * Gets the display text for output type\n */\n public getOutputTypeDisplay(): string {\n const type = this.record?.OutputType || 'string';\n const validationBehavior = this.record?.ValidationBehavior || 'Warn';\n \n if (validationBehavior === 'None') {\n return type;\n } else {\n return `${type} (${validationBehavior})`;\n }\n }\n \n /**\n * Gets the color for validation behavior display\n */\n public getValidationColor(): string {\n switch (this.record?.ValidationBehavior) {\n case 'Strict': return '#dc3545'; // red\n case 'Warn': return '#ffc107'; // yellow\n default: return '#6c757d'; // default gray\n }\n }\n\n /**\n * Checks if ParallelCount field should be visible\n */\n public get showParallelCount(): boolean {\n return this.record?.ParallelizationMode === 'StaticCount';\n }\n\n /**\n * Checks if ParallelConfigParam field should be visible\n */\n public get showParallelConfigParam(): boolean {\n return this.record?.ParallelizationMode === 'ConfigParam';\n }\n\n /**\n * Checks if OutputExample field should be visible\n */\n public get showOutputExample(): boolean {\n return this.record?.OutputType === 'object';\n }\n\n /**\n * Checks if the AI prompt can be executed\n */\n public get canExecute(): boolean {\n return !!(this.record?.ID && \n this.record.Status === 'Active' && \n this.record.TemplateID && \n this.template);\n }\n\n /**\n * Gets status badge color\n */\n public getStatusBadgeColor(): string {\n switch (this.record?.Status) {\n case 'Active': return '#28a745';\n case 'Pending': return '#ffc107';\n case 'Disabled': return '#6c757d';\n default: return '#6c757d';\n }\n }\n\n /**\n * Loads available AI models for selection\n */\n public async loadAvailableModels() {\n try {\n const engine = AIEngineBase.Instance;\n await engine.Config(false);\n const models = engine.Models;\n models.sort((a, b) => a.Name.localeCompare(b.Name));\n this.availableModels = models;\n } catch (error) {\n console.error('Error loading available models:', error);\n }\n }\n\n /**\n * Loads available AI vendors for selection\n */\n public async loadAvailableVendors() {\n try {\n const engine = AIEngineBase.Instance;\n await engine.Config(false);\n const vendors = engine.Vendors;\n vendors.sort((a, b) => a.Name.localeCompare(b.Name));\n this.availableVendors = vendors;\n } catch (error) {\n console.error('Error loading available vendors:', error);\n }\n }\n\n /**\n * Loads available AI prompt types for selection\n */\n public async loadAvailablePromptTypes() {\n this.isLoadingPromptTypes = true;\n try {\n const engine = AIEngineBase.Instance;\n await engine.Config(false);\n const promptTypes = engine.PromptTypes;\n promptTypes.sort((a, b) => a.Name.localeCompare(b.Name));\n this.availablePromptTypes = promptTypes;\n } catch (error) {\n console.error('Error loading available prompt types:', error);\n } finally {\n this.isLoadingPromptTypes = false;\n }\n }\n\n /**\n * Loads available AI configurations for selection\n */\n public async loadAvailableConfigurations() {\n this.isLoadingConfigurations = true;\n try {\n const engine = AIEngineBase.Instance;\n await engine.Config(false);\n const configurations = engine.Configurations;\n configurations.sort((a, b) => a.Name.localeCompare(b.Name));\n this.availableConfigurations = configurations;\n } catch (error) {\n console.error('Error loading available configurations:', error);\n } finally {\n this.isLoadingConfigurations = false;\n }\n }\n\n /**\n * Loads vendors available for a specific model\n */\n public async loadVendorsForModel(modelId: string): Promise<{ vendors: MJAIVendorEntity[], modelVendors: MJAIModelVendorEntity[] }> {\n if (!modelId) {\n return { vendors: [], modelVendors: [] };\n }\n\n // Check cache first\n if (this.modelVendorsMap.has(modelId)) {\n return this.modelVendorsMap.get(modelId)!;\n }\n\n try {\n // Load model vendors for this model, filtering by TypeID for inference providers only\n const engine = AIEngineBase.Instance;\n await engine.Config(false);\n const modelVendors = engine.ModelVendors.filter(mv => UUIDsEqual(mv.ModelID, modelId) && UUIDsEqual(mv.TypeID, this.__InferenceProvider_VendorTypeDefinitionID));\n \n // filter vendors to just the vendors in the modelVendors array in VendorID\n const vendors = engine.Vendors.filter(v => modelVendors.some(mv => UUIDsEqual(mv.VendorID, v.ID)));\n\n const result = { vendors, modelVendors };\n this.modelVendorsMap.set(modelId, result);\n return result;\n\n } catch (error) {\n console.error('Error loading vendors for model:', error);\n return { vendors: [], modelVendors: [] };\n }\n }\n\n /**\n * Gets vendors for a specific model from cache or loads them\n */\n public async getVendorsForModel(modelId: string): Promise<MJAIVendorEntity[]> {\n const result = await this.loadVendorsForModel(modelId);\n return result.vendors;\n }\n\n /**\n * Gets the status for a model-vendor combination\n */\n public getModelVendorStatus(modelId: string, vendorId: string): string {\n const modelVendorData = this.modelVendorsMap.get(modelId);\n if (!modelVendorData) return 'Unknown';\n \n const modelVendor = modelVendorData.modelVendors.find(mv => UUIDsEqual(mv.VendorID, vendorId));\n return modelVendor?.Status || 'Unknown';\n }\n\n /**\n * Gets the color for vendor status display\n */\n public getVendorStatusColor(modelId: string, vendorId: string): string {\n const status = this.getModelVendorStatus(modelId, vendorId);\n switch (status) {\n case 'Active': return '#28a745'; // green\n case 'Inactive': return '#dc3545'; // red \n case 'Pending': return '#ffc107'; // yellow\n default: return '#6c757d'; // gray\n }\n }\n\n /**\n * Handles model selection change and loads vendors for that model\n */\n public async onModelChange(modelId: string, promptModelIndex: number) {\n const promptModel = this.promptModels[promptModelIndex];\n if (!promptModel) return;\n\n // Clear the vendor selection when model changes\n promptModel.VendorID = null;\n this.hasUnsavedChanges = true;\n\n // Load vendors for the new model\n if (modelId) {\n const vendorData = await this.loadVendorsForModel(modelId);\n \n // Auto-select first vendor if available\n if (vendorData.vendors.length > 0) {\n promptModel.VendorID = vendorData.vendors[0].ID;\n }\n }\n \n // Trigger change detection\n this.cdr.detectChanges();\n }\n\n /**\n * Handles configuration change for a prompt model\n */\n public onConfigurationChange(configurationId: string | null, promptModelIndex: number) {\n const promptModel = this.promptModels[promptModelIndex];\n if (!promptModel) return;\n\n promptModel.ConfigurationID = configurationId;\n this.hasUnsavedChanges = true;\n \n // Trigger change detection\n this.cdr.detectChanges();\n }\n\n /**\n * Gets vendors for a specific model\n */\n public getVendorsForModelSync(modelId: string): MJAIVendorEntity[] {\n const modelVendorData = this.modelVendorsMap.get(modelId);\n return modelVendorData?.vendors || [];\n }\n\n /**\n * Checks if vendor dropdown should be shown (more than one vendor)\n */\n public shouldShowVendorDropdown(modelId: string): boolean {\n if (!modelId) return false;\n const vendors = this.getVendorsForModelSync(modelId);\n return vendors.length > 1;\n }\n\n /**\n * Loads prompt models for this AI prompt\n */\n public async loadPromptModels() {\n if (!this.record?.ID) {\n this.promptModels = [];\n return;\n }\n\n this.isLoadingModels = true;\n try {\n const engine = AIEngineBase.Instance;\n await engine.Config(false);\n this.promptModels = engine.PromptModels.filter(pm => UUIDsEqual(pm.PromptID, this.record.ID));\n this.promptModels.sort((a, b) => {\n // first sort on priority (descending), then by created date (ascending)\n return b.Priority - a.Priority || new Date(a.__mj_CreatedAt).getTime() - new Date(b.__mj_CreatedAt).getTime();\n });\n\n // Load vendors for existing models\n const modelIds = this.promptModels\n .map(pm => pm.ModelID)\n .filter(id => id); // Filter out null/undefined\n \n await Promise.all(modelIds.map(modelId => this.loadVendorsForModel(modelId)));\n\n } catch (error) {\n console.error('Error loading prompt models:', error);\n } finally {\n this.isLoadingModels = false;\n }\n }\n\n /**\n * Adds a new model to the prompt (deferred until save)\n */\n public async addNewModel() {\n if (!this.record?.ID) return;\n \n try {\n const newModel = await this._metadata.GetEntityObject<MJAIPromptModelEntity>('MJ: AI Prompt Models');\n newModel.PromptID = this.record.ID;\n \n // Set priority to 1 (lowest) for new models added at the end\n newModel.Priority = 1;\n \n // Generate a temporary ID for tracking if the model doesn't have one\n if (!newModel.ID) {\n (newModel as any)._tempId = `temp_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;\n }\n \n // ModelID will be set by user\n \n this.promptModels.push(newModel);\n this.hasUnsavedChanges = true;\n \n // Update priorities after adding\n this.updateModelPriorities();\n \n // Trigger change detection\n this.cdr.detectChanges();\n \n MJNotificationService.Instance.CreateSimpleNotification(\n 'New model added. Select a model and save to persist changes.',\n 'info',\n 3000\n );\n } catch (error) {\n console.error('Error creating new model:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Error creating new model',\n 'error',\n 5000\n );\n }\n }\n\n /**\n * Removes a model from the prompt (deferred until save)\n */\n public async removePromptModel(index: number) {\n if (index < 0 || index >= this.promptModels.length) return;\n \n const model = this.promptModels[index];\n \n try {\n // If it's a saved model, add it to pending deletions\n if (model.IsSaved) {\n this.PendingRecords.push({\n entityObject: model,\n action: 'delete'\n });\n }\n\n // Remove from local array\n this.promptModels.splice(index, 1);\n this.hasUnsavedChanges = true;\n\n // Update priorities after removal\n this.updateModelPriorities();\n\n // Trigger change detection\n this.cdr.detectChanges();\n\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Model will be removed when you save the prompt',\n 'info',\n 3000\n );\n\n } catch (error) {\n console.error('Error removing model:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Error removing model',\n 'error',\n 5000\n );\n }\n }\n\n /**\n * Gets the display name for a model ID\n */\n public getModelDisplayName(modelId: string): string {\n if (!modelId) return '';\n const model = this.availableModels.find(m => UUIDsEqual(m.ID, modelId));\n return model ? model.Name : modelId;\n }\n\n /**\n * Gets the display name for a vendor ID\n */\n public getVendorDisplayName(vendorId: string): string {\n if (!vendorId) return '';\n const vendor = this.availableVendors.find(v => UUIDsEqual(v.ID, vendorId));\n return vendor ? vendor.Name : vendorId;\n }\n\n /**\n * Gets the display name for a prompt type ID\n */\n public getPromptTypeDisplayName(typeId: string): string {\n if (!typeId) return '';\n const type = this.availablePromptTypes.find(t => UUIDsEqual(t.ID, typeId));\n return type ? type.Name : typeId;\n }\n\n /**\n * Gets the display name for a configuration ID\n */\n public getConfigurationDisplayName(configurationId: string | null): string {\n if (!configurationId) return 'Default';\n const config = this.availableConfigurations.find(c => UUIDsEqual(c.ID, configurationId));\n return config ? config.Name : configurationId;\n }\n\n /**\n * Override PopulatePendingRecords to add AI prompt model changes\n */\n protected PopulatePendingRecords() {\n // IMPORTANT: The parent method clears the pending records array, so we need to preserve\n // any records we've added (like templates) before calling the parent method\n const currentPendingRecords = [...this.PendingRecords]; // Make a copy\n \n // Call parent first to get child component pending records (this clears the array)\n super.PopulatePendingRecords();\n \n // Re-add our preserved records\n for (const record of currentPendingRecords) {\n this.PendingRecords.push(record);\n }\n \n // Add prompt model changes to pending records\n this.addPromptModelsToPendingRecords();\n \n // Handle template content changes through the template editor\n this.addTemplateContentsToPendingRecords();\n }\n\n /**\n * Override StartEditMode to capture original state for cancel functionality\n */\n public StartEditMode(): void {\n // Store original template ID for cancel functionality\n this.originalTemplateID = this.record.TemplateID;\n \n // Call parent implementation\n super.StartEditMode();\n }\n\n /**\n * Override CancelEdit to restore original state\n */\n public CancelEdit() {\n // Call parent implementation first\n super.CancelEdit();\n \n // Restore original template state\n if (!UUIDsEqual(this.originalTemplateID, this.record.TemplateID)) {\n this.record.TemplateID = this.originalTemplateID || '';\n \n // Reload the template to reflect the reverted state\n this.loadTemplate().then(() => {\n this.cdr.detectChanges();\n });\n } else if (this.templateEditor) {\n // Even if template didn't change, refresh the template editor to discard any unsaved content changes\n this.templateEditor.refreshAndDiscardChanges();\n }\n \n // Clear the stored original state\n this.originalTemplateID = null;\n this.hasUnsavedChanges = false;\n }\n\n /**\n * Adds prompt model changes to the pending records\n */\n private addPromptModelsToPendingRecords() {\n // Add all prompt models that have been modified or are new\n for (const model of this.promptModels) {\n if (model.ModelID && (model.Dirty || !model.IsSaved)) {\n // Set the PromptID if it's not already set\n if (!model.PromptID) {\n model.PromptID = this.record.ID;\n }\n \n this.PendingRecords.push({\n entityObject: model,\n action: 'save'\n });\n }\n }\n }\n\n /**\n * Override InternalSaveRecord to handle template dependencies and related entity changes\n * Templates must be saved before AI Prompts to avoid foreign key constraint errors\n */\n protected async InternalSaveRecord(): Promise<boolean> {\n if (!this.record) {\n return false;\n }\n\n try {\n const md = new Metadata();\n const transactionGroup = await md.CreateTransactionGroup();\n\n // First, save any templates that need to be saved (they must be saved before AI Prompts)\n const templateRecords = this.PendingRecords.filter(p => \n p.entityObject.EntityInfo.Name === 'MJ: Templates'\n );\n \n for (const templateRecord of templateRecords) {\n templateRecord.entityObject.TransactionGroup = transactionGroup;\n if (templateRecord.action === 'save') {\n const saveResult = await templateRecord.entityObject.Save();\n if (!saveResult) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Failed to save template. Please check the template data.',\n 'error',\n 4000\n );\n return false;\n }\n } else {\n await templateRecord.entityObject.Delete();\n }\n }\n\n // Now save the main AI Prompt record\n this.record.TransactionGroup = transactionGroup;\n const agentSaveResult = await this.record.Save();\n if (!agentSaveResult) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Failed to save AI prompt details. Please check the form data.',\n 'error',\n 4000\n );\n return false;\n }\n\n // Then save all other pending records (excluding templates which we already saved)\n const otherRecords = this.PendingRecords.filter(p => \n p.entityObject.EntityInfo.Name !== 'MJ: Templates'\n );\n \n for (const record of otherRecords) {\n record.entityObject.TransactionGroup = transactionGroup;\n if (record.action === 'save') {\n await record.entityObject.Save();\n } else {\n await record.entityObject.Delete();\n }\n }\n\n // Execute all operations atomically\n const success = await transactionGroup.Submit();\n if (success) {\n // Clear our local state since save was successful\n this.hasUnsavedChanges = false;\n \n // Reload prompt models to reflect database state\n await this.loadPromptModels();\n \n // Reload template to reflect any changes\n if (this.record.TemplateID) {\n await this.loadTemplate();\n }\n\n MJNotificationService.Instance.CreateSimpleNotification(\n 'AI Prompt saved successfully',\n 'success',\n 3000\n );\n \n return true;\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Save failed. Please try again.',\n 'error',\n 4000\n );\n return false;\n }\n } catch (error) {\n console.error('Error in AI prompt save:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n `Save failed: ${error instanceof Error ? error.message : 'Unknown error'}. Please try again.`,\n 'error',\n 5000\n );\n return false;\n }\n }\n\n /**\n * Loads the result selector tree data (categories and prompts)\n */\n public async loadResultSelectorTreeData() {\n this.isLoadingResultSelectorData = true;\n try {\n // Load categories and prompts\n const engine = AIEngineBase.Instance;\n await engine.Config(false);\n\n const categories = engine.PromptCategories;\n const prompts = engine.Prompts.filter(p => p.Status === 'Active');\n\n categories.sort((a, b) => a.Name.localeCompare(b.Name));\n prompts.sort((a, b) => a.Name.localeCompare(b.Name));\n \n // Build tree structure\n this.resultSelectorTreeData = this.buildResultSelectorTree(categories, prompts);\n\n } catch (error) {\n console.error('Error loading result selector tree data:', error);\n this.resultSelectorTreeData = [];\n } finally {\n this.isLoadingResultSelectorData = false;\n }\n }\n\n /**\n * Builds the tree structure for result selector\n */\n private buildResultSelectorTree(categories: MJAIPromptCategoryEntityExtended[], prompts: MJAIPromptEntityExtended[]): any[] {\n const tree: any[] = [];\n\n // Add \"Clear Selection\" option at the top\n tree.push({\n text: '(Clear Selection)',\n value: null,\n hasChildren: false,\n isCategory: false,\n isClearOption: true\n });\n\n // Create category nodes\n const categoryMap = new Map<string, any>();\n categories.forEach(category => {\n const node = {\n text: category.Name,\n value: null, // Categories don't have values\n expanded: true,\n hasChildren: true,\n items: [],\n isCategory: true,\n categoryId: category.ID\n };\n categoryMap.set(category.ID, node);\n \n // Handle parent-child relationships\n if (category.ParentID) {\n const parentNode = categoryMap.get(category.ParentID);\n if (parentNode) {\n parentNode.items.push(node);\n } else {\n tree.push(node); // Parent not found, add to root\n }\n } else {\n tree.push(node); // Root category\n }\n });\n\n // Collect uncategorized prompts\n const uncategorizedPrompts: any[] = [];\n\n // Add prompts to their categories\n prompts.forEach(prompt => {\n const promptNode = {\n text: prompt.Name,\n value: prompt.ID,\n hasChildren: false,\n isCategory: false,\n promptId: prompt.ID\n };\n\n if (prompt.CategoryID) {\n const categoryNode = categoryMap.get(prompt.CategoryID);\n if (categoryNode) {\n categoryNode.items.push(promptNode);\n } else {\n // Category not found, add to uncategorized\n uncategorizedPrompts.push(promptNode);\n }\n } else {\n // No category, add to uncategorized\n uncategorizedPrompts.push(promptNode);\n }\n });\n\n // If there are uncategorized prompts, add them to a special section\n if (uncategorizedPrompts.length > 0) {\n tree.push({\n text: 'Uncategorized',\n value: null,\n expanded: true,\n hasChildren: true,\n items: uncategorizedPrompts,\n isCategory: true,\n categoryId: 'uncategorized'\n });\n }\n\n return tree;\n }\n\n /**\n * Handles result selector selection\n */\n public onResultSelectorChange(value: string) {\n this.record.ResultSelectorPromptID = value || null;\n }\n\n /**\n * Gets the display name for a prompt ID from the tree data\n */\n public getPromptDisplayName(promptId: string): string {\n if (!promptId) return '';\n \n const findPromptInTree = (nodes: any[]): string => {\n for (const node of nodes) {\n if (!node.isCategory && node.value === promptId) {\n return node.text;\n }\n if (node.items && node.items.length > 0) {\n const found = findPromptInTree(node.items);\n if (found) return found;\n }\n }\n return '';\n };\n\n return findPromptInTree(this.resultSelectorTreeData);\n }\n\n /**\n * Moves a model up in the list by swapping with the previous item\n */\n public moveModelUp(index: number) {\n if (index > 0 && index < this.promptModels.length) {\n // Create new array to ensure Angular detects the change\n const newModels = [...this.promptModels];\n \n // Swap with previous item\n [newModels[index - 1], newModels[index]] = \n [newModels[index], newModels[index - 1]];\n \n // Replace the array and force full re-render\n this.promptModels = [...newModels];\n this.hasUnsavedChanges = true;\n \n this.updateModelPriorities();\n \n // Force Angular to re-evaluate all bindings\n this.cdr.detectChanges();\n \n // Additional force update for Kendo dropdowns\n setTimeout(() => {\n this.cdr.detectChanges();\n }, 0);\n }\n }\n\n /**\n * Moves a model down in the list by swapping with the next item\n */\n public moveModelDown(index: number) {\n if (index >= 0 && index < this.promptModels.length - 1) {\n // Create new array to ensure Angular detects the change\n const newModels = [...this.promptModels];\n \n // Swap with next item\n [newModels[index], newModels[index + 1]] = \n [newModels[index + 1], newModels[index]];\n \n // Replace the array and force full re-render\n this.promptModels = [...newModels];\n this.hasUnsavedChanges = true;\n \n this.updateModelPriorities();\n \n // Force Angular to re-evaluate all bindings\n this.cdr.detectChanges();\n \n // Additional force update for Kendo dropdowns\n setTimeout(() => {\n this.cdr.detectChanges();\n }, 0);\n }\n }\n\n /**\n * Updates priority values based on array order\n */\n private updateModelPriorities() {\n // Update priorities based on position (higher priority for items at top)\n const maxPriority = this.promptModels.length;\n this.promptModels.forEach((model, index) => {\n model.Priority = maxPriority - index;\n });\n }\n \n /**\n * Gets a stable identifier for a model (for form tracking)\n */\n public getModelTrackId(model: MJAIPromptModelEntity): string {\n return model.ID || (model as any)._tempId || '';\n }\n\n /**\n * Handles drag start event\n */\n public onDragStart(event: DragEvent, index: number) {\n this.draggedIndex = index;\n event.dataTransfer!.effectAllowed = 'move';\n event.dataTransfer!.setData('text/html', ''); // Required for Firefox\n }\n\n /**\n * Handles drag over event\n */\n public onDragOver(event: DragEvent) {\n event.preventDefault();\n event.dataTransfer!.dropEffect = 'move';\n }\n\n /**\n * Handles drop event\n */\n public onDrop(event: DragEvent, dropIndex: number) {\n event.preventDefault();\n \n if (this.draggedIndex !== -1 && this.draggedIndex !== dropIndex) {\n // Create new array to ensure Angular detects the change\n const newModels = [...this.promptModels];\n \n // Remove dragged item\n const draggedItem = newModels.splice(this.draggedIndex, 1)[0];\n \n // Insert at new position\n newModels.splice(dropIndex, 0, draggedItem);\n \n // Replace the array and force full re-render\n this.promptModels = [...newModels];\n this.hasUnsavedChanges = true;\n \n // Update priorities\n this.updateModelPriorities();\n \n // Force Angular to re-evaluate all bindings\n this.cdr.detectChanges();\n \n // Additional force update for Kendo dropdowns\n setTimeout(() => {\n this.cdr.detectChanges();\n }, 0);\n }\n \n this.draggedIndex = -1;\n }\n\n /**\n * Handles drag end event\n */\n public onDragEnd(_event: DragEvent) {\n this.draggedIndex = -1;\n }\n \n /**\n * Load execution history for this prompt\n */\n public async loadExecutionHistory() {\n if (!this.record?.ID) return;\n \n this.isLoadingHistory = true;\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJAIPromptRunEntityExtended>({\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: `PromptID='${this.record.ID}'`,\n OrderBy: 'RunAt DESC' \n });\n \n this.executionHistory = result.Results;\n this.sortExecutionHistory();\n } catch (error) {\n console.error('Error loading execution history:', error);\n this.executionHistory = [];\n } finally {\n this.isLoadingHistory = false;\n }\n }\n \n /**\n * Sort execution history based on current sort field and direction\n */\n public sortExecutionHistory() {\n if (!this.executionHistory || this.executionHistory.length === 0) return;\n \n this.executionHistory.sort((a, b) => {\n let aVal: any, bVal: any;\n \n switch (this.historySortField) {\n case 'runAt':\n aVal = a.RunAt ? new Date(a.RunAt).getTime() : 0;\n bVal = b.RunAt ? new Date(b.RunAt).getTime() : 0;\n break;\n case 'executionTime':\n aVal = a.ExecutionTimeMS || 0;\n bVal = b.ExecutionTimeMS || 0;\n break;\n case 'cost':\n aVal = a.TotalCost || a.Cost || 0;\n bVal = b.TotalCost || b.Cost || 0;\n break;\n case 'tokens':\n aVal = a.TokensUsed || 0;\n bVal = b.TokensUsed || 0;\n break;\n }\n \n if (this.historySortDirection === 'asc') {\n return aVal > bVal ? 1 : aVal < bVal ? -1 : 0;\n } else {\n return aVal < bVal ? 1 : aVal > bVal ? -1 : 0;\n }\n });\n }\n \n /**\n * Change sort field and direction for execution history\n */\n public changeHistorySort(field: 'runAt' | 'executionTime' | 'cost' | 'tokens') {\n if (this.historySortField === field) {\n // Toggle direction if same field\n this.historySortDirection = this.historySortDirection === 'asc' ? 'desc' : 'asc';\n } else {\n // New field, default to desc\n this.historySortField = field;\n this.historySortDirection = 'desc';\n }\n this.sortExecutionHistory();\n }\n \n /**\n * Navigate to a prompt run record\n */\n public navigateToPromptRun(runId: string) {\n SharedService.Instance.OpenEntityRecord('MJ: AI Prompt Runs', CompositeKey.FromID(runId));\n }\n \n /**\n * Format duration for display\n */\n public formatDuration(ms: number | null): string {\n if (!ms) return '-';\n \n if (ms < 1000) {\n return `${ms}ms`;\n } else if (ms < 60000) {\n return `${(ms / 1000).toFixed(1)}s`;\n } else {\n const minutes = Math.floor(ms / 60000);\n const seconds = ((ms % 60000) / 1000).toFixed(0);\n return `${minutes}m ${seconds}s`;\n }\n }\n \n /**\n * Format cost for display\n */\n public formatCost(cost: number | null): string {\n if (!cost) return '-';\n return `$${cost.toFixed(4)}`;\n }\n \n /**\n * Format tokens for display\n */\n public formatTokens(tokens: number | null): string {\n if (!tokens) return '-';\n return tokens.toLocaleString();\n }\n \n /**\n * Get status color for execution\n */\n public getExecutionStatusColor(success: boolean | null): string {\n if (success === true) return '#28a745';\n if (success === false) return '#dc3545';\n return '#ffc107';\n }\n \n /**\n * Get status icon for execution\n */\n public getExecutionStatusIcon(success: boolean | null): string {\n if (success === true) return 'fa-check-circle';\n if (success === false) return 'fa-times-circle';\n return 'fa-spinner fa-spin';\n }\n\n /**\n * Gets the icon for a template parameter type\n */\n public getParamTypeIcon(type: string): string {\n switch (type) {\n case 'Scalar': return 'fa-font';\n case 'Array': return 'fa-list';\n case 'Object': return 'fa-cube';\n case 'Record': return 'fa-file-alt';\n case 'Entity': return 'fa-table';\n default: return 'fa-question';\n }\n }\n\n /**\n * Gets the color for a template parameter type\n */\n public getParamTypeColor(type: string): string {\n switch (type) {\n case 'Scalar': return '#17a2b8';\n case 'Array': return '#28a745';\n case 'Object': return '#6f42c1';\n case 'Record': return '#fd7e14';\n case 'Entity': return '#dc3545';\n default: return '#6c757d';\n }\n }\n\n /**\n * Gets a friendly description of the parameter type\n */\n public getParamTypeDescription(param: MJTemplateParamEntity): string {\n switch (param.Type) {\n case 'Scalar': \n return 'Single value (text, number, date, etc.)';\n case 'Array': \n return 'List of values';\n case 'Object': \n return 'JSON object with multiple properties';\n case 'Record': \n if (param.EntityID) {\n return `Single record from entity`;\n }\n return 'Single database record';\n case 'Entity': \n if (param.EntityID) {\n return `Multiple records from entity`;\n }\n return 'Entity data collection';\n default: \n return 'Unknown type';\n }\n }\n}\n","<!-- Dialog container -->\n<div></div>\n@if (record) {\n<mj-record-form-container [Record]=\"record\" [FormComponent]=\"this\"\n [ToolbarConfig]=\"toolbarConfig\"\n [WidthMode]=\"'full-width'\"\n (Navigate)=\"OnFormNavigate($event)\"\n (DeleteRequested)=\"OnDeleteRequested()\"\n (FavoriteToggled)=\"OnFavoriteToggled()\"\n (HistoryRequested)=\"OnHistoryRequested()\"\n (ListManagementRequested)=\"OnListManagementRequested()\">\n <form class=\"record-form\" #form=\"ngForm\" style=\"display: flex; flex-direction: column; height: 100%; overflow: hidden;\">\n <!-- Main Content Area - Template Editor and Configuration -->\n <div class=\"prompt-main-area\" style=\"display: flex; flex-direction: column; flex: 1; min-height: 0; overflow-y: auto;\">\n <!-- Header Section -->\n <div class=\"prompt-header\" style=\"flex-shrink: 0; padding: 20px; background: var(--mj-bg-surface-sunken); border-bottom: 2px solid var(--mj-border-default);\">\n <div style=\"display: flex; justify-content: space-between; align-items: flex-start; gap: 20px;\">\n <!-- Left: Prompt Info -->\n <div style=\"flex: 1; min-width: 0;\">\n <div style=\"display: flex; align-items: center; gap: 12px; margin-bottom: 8px;\">\n <i class=\"fa-solid fa-robot\" style=\"color: var(--mj-brand-primary); font-size: 1.4em;\"></i>\n @if (EditMode) {\n <input type=\"text\" class=\"mj-input\" [(ngModel)]=\"record.Name\"\n name=\"promptName\"\n placeholder=\"Enter prompt name...\"\n style=\"font-size: 1.2em; font-weight: 600; min-width: 300px; flex: 1;\" />\n } @else {\n <h4 style=\"margin: 0; color: var(--mj-text-secondary); font-weight: 600; flex: 1;\">{{ record.Name || 'Untitled AI Prompt' }}</h4>\n <span class=\"status-badge\" [style.background-color]=\"getStatusBadgeColor()\"\n style=\"color: white; padding: 4px 10px; border-radius: 12px; font-size: 0.75em; font-weight: 500;\">\n {{ record.Status }}\n </span>\n }\n </div>\n <!-- Status and Type Editors when in edit mode -->\n @if (EditMode) {\n <div style=\"display: flex; gap: 16px; margin-bottom: 12px; flex-wrap: wrap;\">\n <div>\n <label style=\"display: block; margin-bottom: 4px; font-weight: 600; color: var(--mj-text-secondary); font-size: 0.9em;\">Status</label>\n <mj-dropdown [(ngModel)]=\"record.Status\"\n name=\"promptStatus\"\n [Data]=\"[{text: 'Active', value: 'Active'}, {text: 'Pending', value: 'Pending'}, {text: 'Disabled', value: 'Disabled'}]\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n style=\"width: 150px;\">\n </mj-dropdown>\n </div>\n <div>\n <label style=\"display: block; margin-bottom: 4px; font-weight: 600; color: var(--mj-text-secondary); font-size: 0.9em;\">\n Type <span style=\"color: #dc3545;\">*</span>\n </label>\n @if (isLoadingPromptTypes) {\n <div style=\"padding: 8px; color: var(--mj-text-muted); font-style: italic; width: 200px;\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading types...\n </div>\n } @else {\n <mj-dropdown [(ngModel)]=\"record.TypeID\"\n name=\"promptTypeID\"\n [Data]=\"availablePromptTypes\"\n TextField=\"Name\"\n ValueField=\"ID\"\n [ValuePrimitive]=\"true\"\n [Filterable]=\"true\"\n Placeholder=\"Select prompt type...\"\n style=\"width: 200px;\">\n </mj-dropdown>\n }\n </div>\n </div>\n }\n @if (EditMode) {\n <textarea class=\"mj-textarea\" [(ngModel)]=\"record.Description\"\n name=\"promptDescription\"\n [rows]=\"2\"\n placeholder=\"Enter prompt description...\"\n style=\"width: 100%; max-width: 600px; margin-bottom: 12px;\"></textarea>\n } @else if (record.Description) {\n <p style=\"margin: 0 0 12px 0; color: var(--mj-text-muted); font-size: 0.9em; line-height: 1.4;\">{{ record.Description }}</p>\n }\n <!-- Quick Config Row -->\n <div class=\"quick-config\" style=\"display: flex; align-items: center; gap: 16px; flex-wrap: wrap;\">\n @if (record.TypeID) {\n <div class=\"config-item\" style=\"display: flex; align-items: center; gap: 6px; font-size: 0.85em;\">\n <i class=\"fa-solid fa-tag\" style=\"color: var(--mj-text-muted);\"></i>\n <span style=\"color: var(--mj-text-muted);\">Type:</span>\n <span style=\"color: var(--mj-text-secondary); font-weight: 500;\">{{ getPromptTypeDisplayName(record.TypeID) }}</span>\n </div>\n }\n <div class=\"config-item\" style=\"display: flex; align-items: center; gap: 6px; font-size: 0.85em;\">\n <i class=\"fa-solid fa-layer-group\" style=\"color: var(--mj-text-muted);\"></i>\n <span style=\"color: var(--mj-text-muted);\">Parallelization:</span>\n <span style=\"color: var(--mj-text-secondary); font-weight: 500;\">{{ getParallelizationModeDisplay() }}</span>\n </div>\n <div class=\"config-item\" style=\"display: flex; align-items: center; gap: 6px; font-size: 0.85em;\">\n <i class=\"fa-solid fa-code\" style=\"color: var(--mj-text-muted);\"></i>\n <span style=\"color: var(--mj-text-muted);\">Output:</span>\n <span [style.color]=\"getValidationColor()\" style=\"font-weight: 500;\">{{ getOutputTypeDisplay() }}</span>\n </div>\n @if (record.EnableCaching) {\n <div class=\"config-item\" style=\"display: flex; align-items: center; gap: 6px; font-size: 0.85em;\">\n <i class=\"fa-solid fa-database\" style=\"color: #28a745;\"></i>\n <span style=\"color: #28a745; font-weight: 500;\">Caching Enabled</span>\n </div>\n }\n @if (record.EffortLevel) {\n <div class=\"config-item\" style=\"display: flex; align-items: center; gap: 6px; font-size: 0.85em;\">\n <i class=\"fa-solid fa-tachometer-alt\" style=\"color: var(--mj-text-muted);\"></i>\n <span style=\"color: var(--mj-text-muted);\">Effort Level:</span>\n <span style=\"color: var(--mj-text-secondary); font-weight: 500;\">{{ record.EffortLevel }}</span>\n </div>\n }\n </div>\n </div>\n <!-- Right: Action Buttons -->\n <div class=\"action-buttons\" style=\"display: flex; flex-direction: column; gap: 8px; align-items: flex-end;\">\n <div style=\"display: flex; gap: 8px;\">\n @if (record.ID) {\n <button mjButton variant=\"primary\" size=\"lg\"\n (click)=\"openTestHarness()\"\n title=\"Run AI Prompt Test Harness\">\n <i class=\"fa-solid fa-play\"></i> Run\n </button>\n }\n </div>\n @if (!canExecute && record.ID) {\n <div style=\"font-size: 0.75em; color: #dc3545; text-align: right; max-width: 200px;\">\n @if (record.Status !== 'Active') {\n • Prompt must be Active<br>\n }\n @if (!record.TemplateID) {\n • Template is required<br>\n }\n @if (!template && record.TemplateID) {\n • Template not found<br>\n }\n </div>\n }\n </div>\n </div>\n </div>\n <!-- Configuration Sections with Expansion Panels -->\n <div class=\"configuration-sections\" style=\"flex: 1; background: var(--mj-bg-surface-card); border-top: 2px solid var(--mj-border-default); padding: 16px; min-height: 0;\">\n <!-- Template Editor Section -->\n <mj-accordion-panel\n [Expanded]=\"true\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-code\" style=\"color: var(--mj-text-muted);\"></i>\n Template Editor\n @if (template) {\n <span style=\"color: var(--mj-text-muted); font-size: 0.9em; font-weight: normal;\">• {{ template.Name }}</span>\n }\n </span>\n </ng-template>\n <!-- Direct Content Projection -->\n <div class=\"template-section\" style=\"display: flex; flex-direction: column; min-height: 400px; padding: 8px;\">\n @if (isLoadingTemplate) {\n <div class=\"loading-state\" style=\"flex: 1; display: flex; align-items: center; justify-content: center; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-spinner fa-spin\" style=\"font-size: 24px; margin-right: 12px;\"></i>\n Loading template...\n </div>\n } @else if (!record.TemplateID) {\n <div class=\"no-template-state\" style=\"flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 40px; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-code\" style=\"font-size: 64px; margin-bottom: 20px; opacity: 0.3;\"></i>\n <h5 style=\"margin-bottom: 12px; color: var(--mj-text-secondary);\">No Template Associated</h5>\n <p style=\"margin-bottom: 24px; text-align: center; max-width: 400px;\">\n This AI prompt needs a template to define its structure and parameters.\n Create a new template or link to an existing one.\n </p>\n <div style=\"display: flex; gap: 12px;\">\n @if (UserCanCreateTemplates) {\n <button mjButton variant=\"primary\" (click)=\"createNewTemplate()\">\n <i class=\"fa-solid fa-plus\"></i> Create New Template\n </button>\n }\n @if (UserCanReadTemplates) {\n <button mjButton variant=\"outline\" (click)=\"linkExistingTemplate()\">\n <i class=\"fa-solid fa-link\"></i> Link Existing Template\n </button>\n }\n </div>\n </div>\n } @else if (templateNotFoundInDatabase) {\n <div class=\"invalid-template-state\" style=\"flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 40px; color: #dc3545;\">\n <i class=\"fa-solid fa-exclamation-triangle\" style=\"font-size: 64px; margin-bottom: 20px; opacity: 0.7;\"></i>\n <h5 style=\"margin-bottom: 12px;\">Template Not Found</h5>\n <p style=\"margin-bottom: 24px; text-align: center; max-width: 400px;\">\n The referenced template could not be loaded. It may have been deleted or moved.\n </p>\n <div style=\"display: flex; gap: 12px;\">\n <button mjButton variant=\"outline\" (click)=\"loadTemplate()\">\n <i class=\"fa-solid fa-refresh\"></i> Retry Loading\n </button>\n @if (UserCanCreateTemplates) {\n <button mjButton variant=\"primary\" (click)=\"createNewTemplate()\">\n <i class=\"fa-solid fa-plus\"></i> Create New Template\n </button>\n }\n </div>\n </div>\n } @else {\n <!-- Active Template Editor -->\n <div class=\"template-editor-container\" style=\"flex: 1; display: flex; flex-direction: column; min-height: 350px;\">\n <!-- Template Actions Bar -->\n @if (template && EditMode) {\n <div class=\"template-actions\" style=\"display: flex; gap: 8px; padding: 8px; border-bottom: 1px solid var(--mj-border-default); background: var(--mj-bg-surface-sunken);\">\n @if (UserCanUpdateTemplates) {\n <button mjButton\n variant=\"outline\"\n size=\"sm\"\n (click)=\"linkExistingTemplate()\"\n title=\"Change to a different template\">\n <i class=\"fa-solid fa-exchange-alt\"></i> Change Template\n </button>\n }\n @if (UserCanReadTemplates) {\n <button mjButton\n variant=\"outline\"\n size=\"sm\"\n (click)=\"openTemplateInNewWindow()\"\n title=\"Open template in new window\">\n <i class=\"fa-solid fa-external-link-alt\"></i> Open in New Window\n </button>\n }\n </div>\n }\n <!-- Template Editor -->\n <div style=\"flex: 1; background: var(--mj-bg-surface-card); border-radius: 6px; border: 1px solid var(--mj-border-default);\">\n <mj-template-editor\n #templateEditor\n [template]=\"template\"\n [config]=\"templateEditorConfig\"\n (contentChange)=\"onTemplateContentChange($event)\"\n (runTemplate)=\"onTemplateRun($event)\"\n style=\"display: block; min-height: 300px;\">\n </mj-template-editor>\n </div>\n </div>\n }\n </div>\n </mj-accordion-panel>\n <!-- Model Configuration Expansion Panel -->\n @if (record.IsSaved) {\n <mj-accordion-panel\n [Expanded]=\"true\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-microchip\" style=\"color: var(--mj-text-muted);\"></i>\n Models\n @if (promptModels.length > 0) {\n <span class=\"badge\" style=\"background: #17a2b8; color: white; padding: 2px 6px; border-radius: 10px; font-size: 0.7em;\">\n {{ promptModels.length }}\n </span>\n }\n <span style=\"color: var(--mj-text-muted); font-size: 0.8em; font-weight: normal; margin-left: 8px;\">\n <i class=\"fa-solid fa-info-circle\" title=\"Models are tried in order from top to bottom. The first available model will be used.\"></i>\n Priority order (first available model will be used)\n </span>\n </span>\n </ng-template>\n <!-- Direct Content Projection -->\n <div style=\"padding: 16px 0;\">\n <!-- Model Management Interface -->\n <div class=\"model-management\" style=\"border: 1px solid var(--mj-border-default); border-radius: 6px; background: var(--mj-bg-surface-sunken);\">\n @if (isLoadingModels) {\n <div class=\"loading-state\" style=\"padding: 20px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading models...\n </div>\n } @else {\n @if (promptModels.length === 0) {\n <div class=\"empty-state\" style=\"padding: 20px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-info-circle\"></i> No models configured\n @if (EditMode && UserCanCreatePromptModels) {\n <div style=\"margin-top: 10px;\">\n <button mjButton variant=\"outline\" size=\"sm\"\n (click)=\"addNewModel()\">\n <i class=\"fa-solid fa-plus\"></i> Add Model\n </button>\n </div>\n }\n </div>\n } @else {\n <!-- Priority explanation for multiple models -->\n @if (promptModels.length > 1) {\n <div style=\"padding: 12px 16px; background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface)); border-bottom: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-border-default)); color: var(--mj-brand-primary); font-size: 0.85em;\">\n <i class=\"fa-solid fa-info-circle\" style=\"margin-right: 6px;\"></i>\n Models are tried in priority order (highest priority first). The first available model that meets requirements will be used for execution.\n </div>\n }\n <!-- Column Headers -->\n <div class=\"model-header\" style=\"display: grid; grid-template-columns: 40px 2fr 1fr 1fr 1fr 60px; gap: 12px; padding: 12px 16px; background: var(--mj-bg-surface-sunken); font-weight: 600; font-size: 0.85em; color: var(--mj-text-secondary); border-bottom: 1px solid var(--mj-border-default);\">\n <div title=\"Priority order - models are tried from top to bottom\">\n <i class=\"fa-solid fa-sort\" style=\"color: var(--mj-text-muted);\"></i>\n </div>\n <div>AI Model <span style=\"color: #dc3545;\">*</span></div>\n <div>Vendor</div>\n <div>Configuration</div>\n <div>Created</div>\n <div>Actions</div>\n </div>\n @for (model of promptModels; track getModelTrackId(model) || $index; let i = $index) {\n <div class=\"model-row\"\n [draggable]=\"EditMode\"\n (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event)\"\n (drop)=\"onDrop($event, i)\"\n (dragend)=\"onDragEnd($event)\"\n [style.background]=\"!model.ModelID ? '#fff3cd' : (draggedIndex === i ? 'color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface))' : 'var(--mj-bg-surface-card)')\"\n [style.border-left]=\"!model.ModelID ? '3px solid #ffc107' : 'none'\"\n [style.opacity]=\"draggedIndex === i ? '0.5' : '1'\"\n style=\"display: grid; grid-template-columns: 40px 2fr 1fr 1fr 1fr 60px; gap: 12px; padding: 12px 16px; border-bottom: 1px solid var(--mj-border-default); align-items: start; transition: background 0.2s, opacity 0.2s;\">\n <!-- Drag Handle / Priority -->\n <div class=\"drag-handle\" style=\"display: flex; flex-direction: column; align-items: center; justify-content: center; color: var(--mj-text-muted);\">\n @if (EditMode) {\n <i class=\"fa-solid fa-grip-vertical\" title=\"Drag to reorder priority\" style=\"cursor: move;\"></i>\n <span style=\"font-size: 0.7em; margin-top: 2px;\">#{{ i + 1 }}</span>\n } @else {\n <span style=\"font-size: 0.9em; font-weight: 600;\" title=\"Priority {{ model.Priority }} - Higher priority numbers are tried first\">#{{ i + 1 }}</span>\n }\n </div>\n <!-- Model Selection -->\n <div class=\"model-select\">\n @if (EditMode) {\n <mj-dropdown [(ngModel)]=\"model.ModelID\"\n [name]=\"'modelId_' + getModelTrackId(model)\"\n [Data]=\"availableModels\"\n TextField=\"Name\"\n ValueField=\"ID\"\n [ValuePrimitive]=\"true\"\n [Filterable]=\"true\"\n Placeholder=\"Select a model...\"\n (ValueChange)=\"onModelChange($any($event), i)\"\n style=\"width: 100%;\">\n </mj-dropdown>\n } @else {\n <span style=\"font-weight: 500;\">{{ getModelDisplayName(model.ModelID) }}</span>\n }\n </div>\n <!-- Vendor -->\n <div class=\"model-vendor\">\n @if (EditMode) {\n @if (model.ModelID) {\n @if (shouldShowVendorDropdown(model.ModelID)) {\n <mj-dropdown [(ngModel)]=\"model.VendorID\"\n [name]=\"'vendorId_' + getModelTrackId(model)\"\n [Data]=\"getVendorsForModelSync(model.ModelID)\"\n TextField=\"Name\"\n ValueField=\"ID\"\n [ValuePrimitive]=\"true\"\n [Filterable]=\"true\"\n Placeholder=\"Select vendor...\"\n style=\"width: 100%;\">\n </mj-dropdown>\n } @else {\n <!-- Single vendor - just show the name -->\n @if (getVendorsForModelSync(model.ModelID).length === 1) {\n <span [style.color]=\"getVendorStatusColor(model.ModelID, getVendorsForModelSync(model.ModelID)[0].ID)\" style=\"font-size: 0.9em; font-weight: 500;\">\n {{ getVendorsForModelSync(model.ModelID)[0].Name }}\n @if (getModelVendorStatus(model.ModelID, getVendorsForModelSync(model.ModelID)[0].ID) !== 'Active') {\n <span style=\"font-size: 0.8em; margin-left: 4px;\">({{ getModelVendorStatus(model.ModelID, getVendorsForModelSync(model.ModelID)[0].ID) }})</span>\n }\n </span>\n } @else {\n <span style=\"color: var(--mj-text-muted); font-style: italic; font-size: 0.9em;\">No vendors available</span>\n }\n }\n } @else {\n <span style=\"color: var(--mj-text-muted); font-style: italic; font-size: 0.9em;\">Select model first</span>\n }\n } @else {\n @if (model.VendorID && model.ModelID) {\n <span [style.color]=\"getVendorStatusColor(model.ModelID, model.VendorID)\" style=\"font-size: 0.9em;\">\n {{ getVendorDisplayName(model.VendorID) }}\n @if (getModelVendorStatus(model.ModelID, model.VendorID) !== 'Active') {\n <span style=\"font-size: 0.8em; margin-left: 4px;\">({{ getModelVendorStatus(model.ModelID, model.VendorID) }})</span>\n }\n </span>\n } @else {\n <span style=\"color: var(--mj-text-muted); font-size: 0.9em;\">-</span>\n }\n }\n </div>\n <!-- Configuration -->\n <div class=\"model-configuration\">\n @if (EditMode) {\n @if (isLoadingConfigurations) {\n <div style=\"padding: 4px; color: var(--mj-text-muted); font-style: italic; font-size: 0.85em;\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading...\n </div>\n } @else {\n <mj-dropdown [(ngModel)]=\"model.ConfigurationID\"\n [name]=\"'configurationId_' + getModelTrackId(model)\"\n [Data]=\"availableConfigurations\"\n TextField=\"Name\"\n ValueField=\"ID\"\n [ValuePrimitive]=\"true\"\n [Filterable]=\"true\"\n Placeholder=\"Default\"\n (ValueChange)=\"onConfigurationChange($any($event), i)\"\n style=\"width: 100%;\">\n </mj-dropdown>\n }\n } @else {\n <span style=\"font-size: 0.9em;\">{{ getConfigurationDisplayName(model.ConfigurationID) }}</span>\n }\n </div>\n <!-- Created Date -->\n <div class=\"model-created\">\n @if (model.ID) {\n <span style=\"color: var(--mj-text-muted); font-size: 0.8em;\">{{ model.__mj_CreatedAt | date:'short' }}</span>\n } @else {\n <span style=\"color: #28a745; font-size: 0.8em; font-style: italic;\">New</span>\n }\n </div>\n <!-- Actions -->\n <div class=\"model-actions\" style=\"display: flex; gap: 2px; flex-direction: column;\">\n @if (EditMode) {\n <div style=\"display: flex; gap: 2px; margin-bottom: 4px;\">\n @if (UserCanUpdatePromptModels) {\n <button mjButton variant=\"flat\" size=\"sm\"\n (click)=\"moveModelUp(i)\"\n [disabled]=\"i === 0\"\n title=\"Move up\">\n <i class=\"fa-solid fa-chevron-up\"></i>\n </button>\n <button mjButton variant=\"flat\" size=\"sm\"\n (click)=\"moveModelDown(i)\"\n [disabled]=\"i === promptModels.length - 1\"\n title=\"Move down\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\n }\n </div>\n @if (UserCanDeletePromptModels) {\n <button mjButton variant=\"flat\" size=\"sm\"\n (click)=\"removePromptModel(i)\"\n title=\"Remove model\"\n style=\"color: var(--mj-status-error);\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n }\n </div>\n </div>\n <!-- Second row with additional details -->\n <div style=\"display: grid; grid-template-columns: 40px 1fr; gap: 12px; padding: 8px 16px; border-bottom: 1px solid var(--mj-border-default); background: var(--mj-bg-surface-sunken); font-size: 0.85em; color: var(--mj-text-muted);\">\n <div></div>\n <div>\n <!-- Basic model details -->\n <div style=\"display: flex; gap: 16px; flex-wrap: wrap; align-items: center; margin-bottom: 8px;\">\n @if (model.Status) {\n <span><strong>Status:</strong> {{ model.Status }}</span>\n }\n </div>\n <!-- Parallel execution fields when prompt is ModelSpecific -->\n @if (record.ParallelizationMode === 'ModelSpecific') {\n <div style=\"padding: 8px; background: var(--mj-bg-surface-card); border: 1px solid var(--mj-border-default); border-radius: 4px; margin-top: 8px;\">\n <div style=\"margin-bottom: 6px; font-weight: 600; color: var(--mj-text-secondary); font-size: 0.9em;\">\n <i class=\"fa-solid fa-layer-group\"></i> Model-Specific Parallel Execution\n </div>\n @if (EditMode) {\n <div style=\"display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 12px; align-items: center;\">\n <!-- Parallel Mode -->\n <div>\n <label style=\"display: block; margin-bottom: 2px; font-size: 0.8em; font-weight: 600; color: var(--mj-text-secondary);\">Parallel Mode</label>\n <mj-dropdown [(ngModel)]=\"model.ParallelizationMode\"\n [name]=\"'parallelMode_' + i\"\n [Data]=\"[{text: 'None', value: 'None'}, {text: 'Static Count', value: 'StaticCount'}, {text: 'Config Param', value: 'ConfigParam'}]\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n Placeholder=\"Select mode...\"\n style=\"width: 100%; font-size: 0.85em;\">\n </mj-dropdown>\n </div>\n <!-- Parallel Count (when StaticCount) -->\n @if (model.ParallelizationMode === 'StaticCount') {\n <div>\n <label style=\"display: block; margin-bottom: 2px; font-size: 0.8em; font-weight: 600; color: var(--mj-text-secondary);\">Parallel Count</label>\n <mj-numeric-input [(ngModel)]=\"model.ParallelCount\"\n [name]=\"'parallelCount_' + i\"\n [Min]=\"1\"\n [Step]=\"1\"\n [Format]=\"'n0'\"\n Placeholder=\"Count...\"\n style=\"width: 100%; font-size: 0.85em;\">\n </mj-numeric-input>\n </div>\n }\n <!-- Config Param (when ConfigParam) -->\n @if (model.ParallelizationMode === 'ConfigParam') {\n <div>\n <label style=\"display: block; margin-bottom: 2px; font-size: 0.8em; font-weight: 600; color: var(--mj-text-secondary);\">Config Parameter</label>\n <input type=\"text\" class=\"mj-input\" [(ngModel)]=\"model.ParallelConfigParam\"\n [name]=\"'parallelConfigParam_' + i\"\n placeholder=\"Parameter name...\"\n style=\"width: 100%; font-size: 0.85em;\" />\n </div>\n }\n </div>\n } @else {\n <!-- Read-only display -->\n <div style=\"display: flex; gap: 16px; flex-wrap: wrap; align-items: center;\">\n @if (model.ParallelizationMode) {\n <span><strong>Parallel Mode:</strong> {{ model.ParallelizationMode }}</span>\n }\n @if (model.ParallelCount) {\n <span><strong>Parallel Count:</strong> {{ model.ParallelCount }}</span>\n }\n @if (model.ParallelConfigParam) {\n <span><strong>Config Param:</strong> {{ model.ParallelConfigParam }}</span>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n @if (EditMode && UserCanCreatePromptModels) {\n <div class=\"add-model-row\" style=\"padding: 12px 16px; text-align: center; background: var(--mj-bg-surface-sunken); border-top: 1px solid var(--mj-border-default);\">\n <button mjButton variant=\"outline\" size=\"sm\"\n (click)=\"addNewModel()\"\n style=\"color: var(--mj-status-success); border-color: var(--mj-status-success);\">\n <i class=\"fa-solid fa-plus\"></i> Add Model\n </button>\n </div>\n }\n }\n }\n </div>\n </div>\n </mj-accordion-panel>\n }\n <!-- Advanced Configuration Expansion Panel -->\n <mj-accordion-panel\n [Expanded]=\"false\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-cogs\" style=\"color: var(--mj-text-muted);\"></i>\n Advanced Configuration\n </span>\n </ng-template>\n <!-- Direct Content Projection -->\n <div style=\"padding: 16px 0;\">\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 20px;\">\n <!-- Left Column -->\n <div>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ParallelizationMode\"\n Type=\"dropdownlist\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n @if (showParallelCount) {\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ParallelCount\"\n Type=\"numerictextbox\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n }\n @if (showParallelConfigParam) {\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ParallelConfigParam\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n }\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"OutputType\"\n Type=\"dropdownlist\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"EffortLevel\"\n Type=\"numerictextbox\"\n Caption=\"Effort Level (1-100)\"\n Description=\"Higher values request more thorough reasoning\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n </div>\n <!-- Right Column -->\n <div>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ValidationBehavior\"\n Type=\"dropdownlist\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"EnableCaching\"\n Type=\"checkbox\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n <!-- Result Selector Prompt with Tree Selector -->\n <div style=\"margin-bottom: 16px;\">\n <label style=\"display: block; margin-bottom: 4px; font-weight: 600; color: var(--mj-text-secondary); font-size: 0.9em;\">\n Result Selector Prompt\n </label>\n @if (EditMode) {\n @if (isLoadingResultSelectorData) {\n <div style=\"padding: 8px; color: var(--mj-text-muted); font-style: italic;\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading prompts...\n </div>\n } @else {\n <mj-dropdown\n [(ngModel)]=\"record.ResultSelectorPromptID\"\n name=\"resultSelectorPromptID\"\n [Data]=\"resultSelectorTreeData\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n [Filterable]=\"true\"\n Placeholder=\"Select a result selector prompt...\"\n style=\"width: 100%;\"\n (ValueChange)=\"onResultSelectorChange($any($event))\">\n </mj-dropdown>\n }\n } @else {\n <span style=\"color: var(--mj-text-secondary);\">{{ getPromptDisplayName(record.ResultSelectorPromptID || '') || 'None selected' }}</span>\n }\n </div>\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Prefill & Output Control Expansion Panel -->\n <mj-accordion-panel\n [Expanded]=\"false\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-wand-magic-sparkles\" style=\"color: var(--mj-text-muted);\"></i>\n Prefill & Output Control\n </span>\n </ng-template>\n <div style=\"padding: 16px 0;\">\n <p style=\"margin: 0 0 12px 0; font-size: 0.85em; color: var(--mj-text-muted);\">\n Assistant prefill seeds the model's response with an initial string, guiding output format and content. Stop sequences terminate generation when encountered.\n </p>\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 20px;\">\n <!-- Left Column -->\n <div>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"AssistantPrefill\"\n Type=\"textarea\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"StopSequences\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n </div>\n <!-- Right Column -->\n <div>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"PrefillFallbackMode\"\n Type=\"dropdownlist\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Template Parameters Expansion Panel -->\n @if (template && templateParams.length > 0) {\n <mj-accordion-panel\n [Expanded]=\"false\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-sliders\" style=\"color: var(--mj-text-muted);\"></i>\n Template Parameters\n <span class=\"badge\" style=\"background: var(--mj-brand-primary); color: white; padding: 2px 6px; border-radius: 10px; font-size: 0.7em;\">\n {{ templateParams.length }}\n </span>\n <span style=\"color: var(--mj-text-muted); font-size: 0.8em; font-weight: normal; margin-left: 8px;\">\n <i class=\"fa-solid fa-info-circle\" title=\"These parameters are defined in the template and will be available when executing this prompt\"></i>\n Parameters defined in the template\n </span>\n </span>\n </ng-template>\n <!-- Template Parameters Display -->\n <div style=\"padding: 16px 0;\">\n @if (isLoadingTemplateParams) {\n <div class=\"loading-state\" style=\"padding: 20px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading template parameters...\n </div>\n } @else if (templateParams.length === 0) {\n <div class=\"empty-state\" style=\"padding: 20px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-info-circle\"></i> This template has no parameters defined\n </div>\n } @else {\n <!-- Parameters Grid -->\n <div style=\"display: grid; gap: 12px;\">\n @for (param of templateParams; track param.ID) {\n <div class=\"parameter-card\"\n style=\"border: 1px solid var(--mj-border-default); border-radius: 8px; padding: 16px; background: var(--mj-bg-surface-sunken); transition: all 0.2s;\"\n [style.border-left]=\"'4px solid ' + getParamTypeColor(param.Type)\">\n <!-- Parameter Header -->\n <div style=\"display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 8px;\">\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <i [class]=\"'fa-solid ' + getParamTypeIcon(param.Type)\"\n [style.color]=\"getParamTypeColor(param.Type)\"\n style=\"font-size: 1.2em;\"></i>\n <h6 style=\"margin: 0; color: var(--mj-text-secondary); font-weight: 600;\">\n {{ param.Name }}\n @if (param.IsRequired) {\n <span style=\"color: #dc3545; font-size: 0.9em; margin-left: 4px;\">*</span>\n }\n </h6>\n </div>\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <span class=\"type-badge\"\n [style.background-color]=\"getParamTypeColor(param.Type)\"\n style=\"color: white; padding: 4px 8px; border-radius: 12px; font-size: 0.75em; font-weight: 500;\">\n {{ param.Type }}\n </span>\n @if (param.IsRequired) {\n <span style=\"color: #dc3545; font-size: 0.85em; font-weight: 500;\">Required</span>\n } @else {\n <span style=\"color: var(--mj-text-muted); font-size: 0.85em;\">Optional</span>\n }\n </div>\n </div>\n <!-- Parameter Description -->\n @if (param.Description) {\n <p style=\"margin: 0 0 8px 0; color: var(--mj-text-muted); font-size: 0.9em; line-height: 1.4;\">\n {{ param.Description }}\n </p>\n }\n <!-- Type-specific Information -->\n <div style=\"font-size: 0.85em; color: var(--mj-text-secondary);\">\n <span style=\"display: flex; align-items: center; gap: 4px; margin-bottom: 4px;\">\n <i class=\"fa-solid fa-info-circle\" style=\"color: var(--mj-text-muted);\"></i>\n {{ getParamTypeDescription(param) }}\n </span>\n </div>\n <!-- Additional Parameter Details -->\n <div style=\"display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 12px; margin-top: 12px;\">\n @if (param.DefaultValue) {\n <div style=\"background: var(--mj-bg-surface-card); padding: 8px 12px; border-radius: 4px; border: 1px solid var(--mj-border-default);\">\n <label style=\"display: block; font-size: 0.8em; color: var(--mj-text-muted); margin-bottom: 2px;\">Default Value</label>\n <code style=\"font-size: 0.85em; color: var(--mj-text-secondary); word-break: break-all;\">{{ param.DefaultValue }}</code>\n </div>\n }\n @if (param.EntityID) {\n <div style=\"background: var(--mj-bg-surface-card); padding: 8px 12px; border-radius: 4px; border: 1px solid var(--mj-border-default);\">\n <label style=\"display: block; font-size: 0.8em; color: var(--mj-text-muted); margin-bottom: 2px;\">Entity</label>\n <span style=\"font-size: 0.85em; color: var(--mj-text-secondary);\">{{ param.Entity || 'Entity ID: ' + param.EntityID }}</span>\n </div>\n }\n @if (param.LinkedParameterName) {\n <div style=\"background: var(--mj-bg-surface-card); padding: 8px 12px; border-radius: 4px; border: 1px solid var(--mj-border-default);\">\n <label style=\"display: block; font-size: 0.8em; color: var(--mj-text-muted); margin-bottom: 2px;\">Linked To</label>\n <span style=\"font-size: 0.85em; color: var(--mj-text-secondary);\">\n {{ param.LinkedParameterName }}\n @if (param.LinkedParameterField) {\n ({{ param.LinkedParameterField }})\n }\n </span>\n </div>\n }\n @if (param.ExtraFilter) {\n <div style=\"background: var(--mj-bg-surface-card); padding: 8px 12px; border-radius: 4px; border: 1px solid var(--mj-border-default);\">\n <label style=\"display: block; font-size: 0.8em; color: var(--mj-text-muted); margin-bottom: 2px;\">Filter</label>\n <code style=\"font-size: 0.8em; color: var(--mj-text-secondary); word-break: break-all;\">{{ param.ExtraFilter }}</code>\n </div>\n }\n @if (param.RecordID) {\n <div style=\"background: var(--mj-bg-surface-card); padding: 8px 12px; border-radius: 4px; border: 1px solid var(--mj-border-default);\">\n <label style=\"display: block; font-size: 0.8em; color: var(--mj-text-muted); margin-bottom: 2px;\">Record ID</label>\n <code style=\"font-size: 0.85em; color: var(--mj-text-secondary);\">{{ param.RecordID }}</code>\n </div>\n }\n </div>\n </div>\n }\n </div>\n <!-- Help Text -->\n <div style=\"margin-top: 16px; padding: 12px; background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface)); border-radius: 6px; border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-border-default));\">\n <div style=\"display: flex; align-items: flex-start; gap: 8px;\">\n <i class=\"fa-solid fa-lightbulb\" style=\"color: var(--mj-brand-primary); margin-top: 2px;\"></i>\n <div style=\"flex: 1; font-size: 0.85em; color: var(--mj-brand-primary); line-height: 1.5;\">\n <strong>Using Template Parameters:</strong> When executing this prompt, you'll be prompted to provide values for all required parameters.\n Parameters can be simple values (text, numbers) or complex data structures (JSON objects, database records, or entire entity collections).\n The template will use these parameters to generate dynamic content based on the values provided at execution time.\n </div>\n </div>\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n <!-- Output Example Expansion Panel (when OutputType = object) -->\n @if (showOutputExample) {\n <mj-accordion-panel\n [Expanded]=\"true\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-code\" style=\"color: var(--mj-text-muted);\"></i>\n Output Example (JSON)\n <span style=\"color: #dc3545; font-size: 0.8em; font-weight: normal;\">• Required for object output type</span>\n </span>\n </ng-template>\n <!-- Direct Content Projection -->\n <div style=\"padding: 16px;\">\n @if (EditMode) {\n <mj-code-editor\n [(ngModel)]=\"record.OutputExample\"\n name=\"outputExample\"\n language=\"json\"\n placeholder=\"Enter JSON example structure...\"\n style=\"width: 100%; height: 200px; border: 1px solid var(--mj-border-default); border-radius: 4px;\">\n </mj-code-editor>\n <div style=\"margin-top: 8px; color: var(--mj-text-muted); font-size: 0.85em;\">\n <i class=\"fa-solid fa-info-circle\"></i> Provide a JSON example that defines the expected structure for object output validation.\n </div>\n } @else if (record.OutputExample) {\n <div style=\"background: var(--mj-bg-surface-sunken); border: 1px solid var(--mj-border-default); border-radius: 4px; padding: 12px; font-family: 'Courier New', monospace; font-size: 0.9em; white-space: pre-wrap; overflow: auto; max-height: 250px;\">{{ record.OutputExample }}</div>\n } @else {\n <div style=\"background: #fff3cd; border: 1px solid #ffeaa7; border-radius: 4px; padding: 12px; color: #856404; text-align: center;\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i> Output example is required when output type is 'object'\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n <!-- Execution History Expansion Panel -->\n @if (record.IsSaved) {\n <mj-accordion-panel\n [Expanded]=\"false\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-history\" style=\"color: var(--mj-text-muted);\"></i>\n Execution History\n @if (executionHistory.length > 0) {\n <span style=\"color: var(--mj-text-muted); font-weight: normal;\">({{ executionHistory.length }})</span>\n }\n </span>\n </ng-template>\n <!-- Custom Execution History Viewer -->\n <div style=\"padding: 16px;\">\n @if (isLoadingHistory) {\n <div style=\"text-align: center; padding: 40px; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-spinner fa-spin\" style=\"font-size: 2em; margin-bottom: 12px;\"></i>\n <p>Loading execution history...</p>\n </div>\n } @else if (executionHistory.length === 0) {\n <div style=\"text-align: center; padding: 40px; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-history\" style=\"font-size: 3em; margin-bottom: 12px; opacity: 0.3;\"></i>\n <p>No execution history yet</p>\n <p style=\"font-size: 0.9em;\">Run this prompt to see execution history here</p>\n </div>\n } @else {\n <!-- Sort Controls -->\n <div style=\"display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px;\">\n <div style=\"color: var(--mj-text-muted); font-size: 0.9em;\">\n Showing {{ executionHistory.length }} executions\n </div>\n <div style=\"display: flex; gap: 8px; align-items: center;\">\n <span style=\"color: var(--mj-text-muted); font-size: 0.85em;\">Sort by:</span>\n <div class=\"mj-button-group\">\n <button mjButton\n [class.active]=\"historySortField === 'runAt'\"\n (click)=\"changeHistorySort('runAt')\"\n size=\"sm\">\n Date\n @if (historySortField === 'runAt') {\n <i [class]=\"'fa-solid fa-sort-' + (historySortDirection === 'asc' ? 'up' : 'down')\"\n style=\"margin-left: 4px; font-size: 0.8em;\"></i>\n }\n </button>\n <button mjButton\n [class.active]=\"historySortField === 'executionTime'\"\n (click)=\"changeHistorySort('executionTime')\"\n size=\"sm\">\n Duration\n @if (historySortField === 'executionTime') {\n <i [class]=\"'fa-solid fa-sort-' + (historySortDirection === 'asc' ? 'up' : 'down')\"\n style=\"margin-left: 4px; font-size: 0.8em;\"></i>\n }\n </button>\n <button mjButton\n [class.active]=\"historySortField === 'tokens'\"\n (click)=\"changeHistorySort('tokens')\"\n size=\"sm\">\n Tokens\n @if (historySortField === 'tokens') {\n <i [class]=\"'fa-solid fa-sort-' + (historySortDirection === 'asc' ? 'up' : 'down')\"\n style=\"margin-left: 4px; font-size: 0.8em;\"></i>\n }\n </button>\n <button mjButton\n [class.active]=\"historySortField === 'cost'\"\n (click)=\"changeHistorySort('cost')\"\n size=\"sm\">\n Cost\n @if (historySortField === 'cost') {\n <i [class]=\"'fa-solid fa-sort-' + (historySortDirection === 'asc' ? 'up' : 'down')\"\n style=\"margin-left: 4px; font-size: 0.8em;\"></i>\n }\n </button>\n </div>\n </div>\n </div>\n <!-- Execution History Table -->\n <div style=\"border: 1px solid var(--mj-border-default); border-radius: 8px; overflow: hidden;\">\n <table style=\"width: 100%; border-collapse: collapse;\">\n <thead>\n <tr style=\"background: var(--mj-bg-surface-sunken); border-bottom: 2px solid var(--mj-border-default);\">\n <th style=\"padding: 12px; text-align: left; font-weight: 600; color: var(--mj-text-secondary);\">Status</th>\n <th style=\"padding: 12px; text-align: left; font-weight: 600; color: var(--mj-text-secondary);\">Date & Time</th>\n <th style=\"padding: 12px; text-align: left; font-weight: 600; color: var(--mj-text-secondary);\">Model</th>\n <th style=\"padding: 12px; text-align: left; font-weight: 600; color: var(--mj-text-secondary);\">Duration</th>\n <th style=\"padding: 12px; text-align: right; font-weight: 600; color: var(--mj-text-secondary);\">Tokens</th>\n <th style=\"padding: 12px; text-align: right; font-weight: 600; color: var(--mj-text-secondary);\">Cost</th>\n <th style=\"padding: 12px; text-align: center; font-weight: 600; color: var(--mj-text-secondary);\">Type</th>\n <th style=\"padding: 12px; text-align: center; font-weight: 600; color: var(--mj-text-secondary);\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (run of executionHistory; track run.ID; let i = $index) {\n <tr class=\"history-row\"\n [class.even-row]=\"i % 2 === 0\"\n style=\"border-bottom: 1px solid var(--mj-border-default);\">\n <td style=\"padding: 12px;\">\n <span style=\"display: flex; align-items: center; gap: 6px;\">\n <i [class]=\"'fa-solid ' + getExecutionStatusIcon(run.Success)\"\n [style.color]=\"getExecutionStatusColor(run.Success)\"></i>\n <span [style.color]=\"getExecutionStatusColor(run.Success)\" style=\"font-weight: 500;\">\n {{ run.Success === true ? 'Success' : run.Success === false ? 'Failed' : 'Running' }}\n </span>\n </span>\n </td>\n <td style=\"padding: 12px; color: var(--mj-text-secondary);\">\n {{ run.RunAt | date:'short' }}\n </td>\n <td style=\"padding: 12px; color: var(--mj-text-secondary);\">\n <span style=\"display: flex; align-items: center; gap: 6px;\">\n <i class=\"fa-solid fa-microchip\" style=\"color: var(--mj-text-muted);\"></i>\n {{ run.Model || 'Unknown' }}\n </span>\n </td>\n <td style=\"padding: 12px; color: var(--mj-text-secondary);\">\n {{ formatDuration(run.ExecutionTimeMS) }}\n </td>\n <td style=\"padding: 12px; text-align: right; color: var(--mj-text-secondary);\">\n {{ formatTokens(run.TokensUsed) }}\n </td>\n <td style=\"padding: 12px; text-align: right; color: var(--mj-text-secondary);\">\n {{ formatCost(run.TotalCost || run.Cost) }}\n </td>\n <td style=\"padding: 12px; text-align: center;\">\n @if (run.RunType) {\n <span style=\"padding: 4px 8px; border-radius: 12px; background: var(--mj-bg-surface-sunken); \n color: var(--mj-text-secondary); font-size: 0.85em; font-weight: 500;\">\n {{ run.RunType }}\n </span>\n }\n </td>\n <td style=\"padding: 12px; text-align: center;\">\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"navigateToPromptRun(run.ID)\"\n title=\"View details\">\n <i class=\"fa-solid fa-external-link\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n <!-- Cache Expansion Panel -->\n @if (record.IsSaved && record.EnableCaching) {\n <mj-accordion-panel\n [Expanded]=\"false\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-database\" style=\"color: var(--mj-text-muted);\"></i>\n Result Cache\n </span>\n </ng-template>\n <!-- Direct Content Projection -->\n <div style=\"padding: 16px 0;\">\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: AI Result Cache','AIPromptID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: AI Result Cache')\"\n [AllowLoad]=\"true\"\n [ShowToolbar]=\"false\">\n </mj-explorer-entity-data-grid>\n </div>\n </mj-accordion-panel>\n }\n <!-- Related Items Expansion Panel -->\n @if (record.IsSaved) {\n <mj-accordion-panel\n [Expanded]=\"false\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-link\" style=\"color: var(--mj-text-muted);\"></i>\n Related Items\n </span>\n </ng-template>\n <!-- Direct Content Projection -->\n <div style=\"padding: 16px 0;\">\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 20px;\">\n <!-- AI Agents -->\n <div>\n <h6 style=\"margin: 0 0 12px 0; color: var(--mj-text-secondary);\">AI Agents Using This Prompt</h6>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: AI Agent Prompts','PromptID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: AI Agent Prompts')\"\n [AllowLoad]=\"true\"\n [ShowToolbar]=\"false\">\n </mj-explorer-entity-data-grid>\n </div>\n <!-- Result Selector References -->\n <div>\n <h6 style=\"margin: 0 0 12px 0; color: var(--mj-text-secondary);\">Prompts Using This as Result Selector</h6>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: AI Prompts','ResultSelectorPromptID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: AI Prompts')\"\n [AllowLoad]=\"true\"\n [ShowToolbar]=\"false\">\n </mj-explorer-entity-data-grid>\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n }\n </div>\n </div>\n </form>\n</mj-record-form-container>\n}\n\n\n<!-- AI Prompt Test Harness -->\n@if (showTestHarness) {\n <mj-window\n [Width]=\"1200\"\n [Height]=\"800\"\n [MinWidth]=\"800\"\n [MinHeight]=\"600\"\n [Draggable]=\"true\"\n [Resizable]=\"true\"\n [Visible]=\"true\"\n (Close)=\"onTestHarnessVisibilityChanged(false)\"\n [Title]=\"'Run AI Prompt - ' + (record.Name || 'Untitled')\">\n <mj-ai-test-harness\n [entity]=\"record\"\n [mode]=\"'prompt'\"\n [isVisible]=\"showTestHarness\"\n (visibilityChange)=\"onTestHarnessVisibilityChanged($event)\">\n </mj-ai-test-harness>\n </mj-window>\n}"]}
|
|
1
|
+
{"version":3,"file":"ai-prompt-form.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/AIPrompts/ai-prompt-form.component.ts","../../../../src/lib/custom/AIPrompts/ai-prompt-form.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, ViewChild, ChangeDetectorRef, ViewContainerRef, inject } from '@angular/core';\nimport { MJTemplateEntity, MJTemplateContentEntity, MJTemplateParamEntity, MJAIPromptModelEntity, MJAIVendorEntity, MJAIModelVendorEntity, MJAIPromptTypeEntity, MJAIConfigurationEntity } from '@memberjunction/core-entities';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseFormComponent, CUSTOM_LAYOUT_TOOLBAR_CONFIG } from '@memberjunction/ng-base-forms';\nimport { SharedService } from '@memberjunction/ng-shared';\nimport { Metadata, RunView, CompositeKey } from '@memberjunction/core';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { TemplateEditorConfig, TemplateEditorComponent } from '../../shared/components/template-editor.component';\nimport { MJAIPromptFormComponent } from '../../generated/Entities/MJAIPrompt/mjaiprompt.form.component';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { AITestHarnessDialogService } from '@memberjunction/ng-ai-test-harness';\nimport { AIPromptManagementService } from './ai-prompt-management.service';\nimport { MJAIModelEntityExtended, MJAIPromptCategoryEntityExtended, MJAIPromptEntityExtended, MJAIPromptRunEntityExtended } from '@memberjunction/ai-core-plus';\n\n@RegisterClass(BaseFormComponent, 'MJ: AI Prompts')\n@Component({\n standalone: false,\n selector: 'mj-ai-prompt-form',\n templateUrl: './ai-prompt-form.component.html',\n styleUrls: ['./ai-prompt-form.component.css']\n})\nexport class MJAIPromptFormComponentExtended extends MJAIPromptFormComponent implements OnInit {\n private testHarnessService = inject(AITestHarnessDialogService);\n private viewContainerRef = inject(ViewContainerRef);\n private promptManagementService = inject(AIPromptManagementService);\n\n public record!: MJAIPromptEntityExtended;\n public readonly toolbarConfig = CUSTOM_LAYOUT_TOOLBAR_CONFIG;\n\n /** Custom-layout AI Prompt form looks best full-width on first open. */\n public override getDefaultFormWidthMode(): 'centered' | 'full-width' { return 'full-width'; }\n public template: MJTemplateEntity | null = null;\n public templateContent: MJTemplateContentEntity | null = null;\n public templateParams: MJTemplateParamEntity[] = [];\n public isLoadingTemplate = true; // Default to loading state\n public isLoadingTemplateParams = false;\n public templateNotFoundInDatabase = false;\n public showTestHarness = false;\n \n // Model management\n public promptModels: MJAIPromptModelEntity[] = [];\n public availableModels: MJAIModelEntityExtended[] = [];\n public availableVendors: MJAIVendorEntity[] = [];\n public isLoadingModels = false;\n \n // Vendor management per model\n public modelVendorsMap = new Map<string, { vendors: MJAIVendorEntity[], modelVendors: MJAIModelVendorEntity[] }>();\n \n // AI Prompt Types\n public availablePromptTypes: MJAIPromptTypeEntity[] = [];\n public isLoadingPromptTypes = false;\n \n // AI Configurations\n public availableConfigurations: MJAIConfigurationEntity[] = [];\n public isLoadingConfigurations = false;\n \n // Result Selector Tree Data\n public resultSelectorTreeData: any[] = [];\n public isLoadingResultSelectorData = false;\n \n // Drag and drop state\n public draggedIndex: number = -1;\n \n // Execution History\n public executionHistory: MJAIPromptRunEntityExtended[] = [];\n public isLoadingHistory = false;\n public historySortField: 'runAt' | 'executionTime' | 'cost' | 'tokens' = 'runAt';\n public historySortDirection: 'asc' | 'desc' = 'desc';\n \n // Removed custom transaction tracking - we'll use base form's _pendingRecords instead\n public hasUnsavedChanges = false;\n \n // Store original state for cancel/revert functionality\n private originalTemplateID: string | null = null;\n \n // === Permission Checks for Related Entities ===\n /** Cache for permission checks to avoid repeated calculations */\n private _permissionCache = new Map<string, boolean>();\n\n // Main AI Prompt permissions inherited from BaseFormComponent:\n // - UserCanEdit (Update permission)\n // - UserCanRead (Read permission) \n // - UserCanCreate (Create permission)\n // - UserCanDelete (Delete permission)\n\n /** Check if user can create Templates */\n public get UserCanCreateTemplates(): boolean {\n return this.checkEntityPermission('Templates', 'Create');\n }\n\n /** Check if user can update Templates */\n public get UserCanUpdateTemplates(): boolean {\n return this.checkEntityPermission('Templates', 'Update');\n }\n\n /** Check if user can delete Templates */\n public get UserCanDeleteTemplates(): boolean {\n return this.checkEntityPermission('Templates', 'Delete');\n }\n\n /** Check if user can read Templates */\n public get UserCanReadTemplates(): boolean {\n return this.checkEntityPermission('Templates', 'Read');\n }\n\n /** Check if user can create Template Contents */\n public get UserCanCreateTemplateContents(): boolean {\n return this.checkEntityPermission('MJ: Template Contents', 'Create');\n }\n\n /** Check if user can update Template Contents */\n public get UserCanUpdateTemplateContents(): boolean {\n return this.checkEntityPermission('MJ: Template Contents', 'Update');\n }\n\n /** Check if user can create AI Prompt Models */\n public get UserCanCreatePromptModels(): boolean {\n return this.checkEntityPermission('MJ: AI Prompt Models', 'Create');\n }\n\n /** Check if user can update AI Prompt Models */\n public get UserCanUpdatePromptModels(): boolean {\n return this.checkEntityPermission('MJ: AI Prompt Models', 'Update');\n }\n\n /** Check if user can delete AI Prompt Models */\n public get UserCanDeletePromptModels(): boolean {\n return this.checkEntityPermission('MJ: AI Prompt Models', 'Delete');\n }\n\n /**\n * Helper method to check entity permissions with caching\n * @param entityName - The name of the entity to check permissions for\n * @param permissionType - The type of permission to check (Create, Read, Update, Delete)\n * @returns boolean indicating if user has the permission\n */\n private checkEntityPermission(entityName: string, permissionType: 'Create' | 'Read' | 'Update' | 'Delete'): boolean {\n const cacheKey = `${entityName}_${permissionType}`;\n \n if (this._permissionCache.has(cacheKey)) {\n return this._permissionCache.get(cacheKey)!;\n }\n\n try {\n const entityInfo = this._metadata.Entities.find(e => e.Name === entityName);\n \n if (!entityInfo) {\n console.warn(`Entity '${entityName}' not found for permission check`);\n this._permissionCache.set(cacheKey, false);\n return false;\n }\n\n const userPermissions = entityInfo.GetUserPermisions(this._metadata.CurrentUser);\n let hasPermission = false;\n\n switch (permissionType) {\n case 'Create':\n hasPermission = userPermissions.CanCreate;\n break;\n case 'Read':\n hasPermission = userPermissions.CanRead;\n break;\n case 'Update':\n hasPermission = userPermissions.CanUpdate;\n break;\n case 'Delete':\n hasPermission = userPermissions.CanDelete;\n break;\n }\n\n this._permissionCache.set(cacheKey, hasPermission);\n return hasPermission;\n } catch (error) {\n console.error(`Error checking ${permissionType} permission for ${entityName}:`, error);\n this._permissionCache.set(cacheKey, false);\n return false;\n }\n }\n\n /**\n * Clears the permission cache. Call this when user context changes or permissions are updated.\n */\n public clearPermissionCache(): void {\n this._permissionCache.clear();\n }\n \n // Template editor configuration\n public get templateEditorConfig(): TemplateEditorConfig {\n return {\n allowEdit: this.EditMode && this.UserCanUpdateTemplateContents,\n showRunButton: false,\n compactMode: false\n };\n }\n\n private get _metadata() { return this.ProviderToUse; }\n private __InferenceProvider_VendorTypeDefinitionID: string = '';\n\n @ViewChild('templateEditor') templateEditor: TemplateEditorComponent | undefined;\n\n async ngOnInit() {\n await super.ngOnInit();\n\n // make sure AI Engine Base is configured, this will load stuff only if not already\n // loaded in the current process space\n await AIEngineBase.Instance.Config(false, this._metadata.CurrentUser);\n this.__InferenceProvider_VendorTypeDefinitionID = AIEngineBase.Instance.VendorTypeDefinitions.find(\n vtd => vtd.Name.trim().toLowerCase() === 'inference provider')?.ID || '';\n if (!this.__InferenceProvider_VendorTypeDefinitionID) {\n console.error('Inference Provider Vendor Type Definition ID not found');\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Inference Provider Vendor Type Definition not found',\n 'error',\n 5000\n );\n return;\n }\n \n // Load template when record changes\n if (this.record?.TemplateID) {\n // isLoadingTemplate is already true by default\n this.loadTemplate(); // Don't await so other loads can happen in parallel\n } else {\n // No template ID, so we're not loading\n this.isLoadingTemplate = false;\n }\n \n // Load available models, vendors, prompt types, configurations, prompt models, and result selector data\n await Promise.all([\n this.loadAvailableModels(),\n this.loadAvailableVendors(),\n this.loadAvailablePromptTypes(),\n this.loadAvailableConfigurations(),\n this.loadPromptModels(),\n this.loadResultSelectorTreeData()\n ]);\n \n // Load execution history if record is saved\n if (this.record?.IsSaved) {\n await this.loadExecutionHistory();\n }\n \n // Set defaults for new records\n if (!this.record.IsSaved) {\n // Default to first prompt type if not set\n if (!this.record.TypeID && this.availablePromptTypes.length > 0) {\n this.record.TypeID = this.availablePromptTypes[0].ID;\n }\n \n // Default status to Pending if not set\n if (!this.record.Status) {\n this.record.Status = 'Pending';\n }\n }\n }\n\n /**\n * Loads the template associated with this AI prompt\n */\n public async loadTemplate() {\n if (!this.record?.TemplateID) {\n this.template = null;\n this.templateNotFoundInDatabase = false;\n return;\n }\n\n // First check if we already have this template in pending records (newly created)\n const pendingTemplate = this.PendingRecords.find(p => \n p.entityObject.EntityInfo.Name === 'MJ: Templates' && \n p.entityObject.Get('ID') === this.record.TemplateID\n );\n \n if (pendingTemplate) {\n // Use the pending template\n this.template = pendingTemplate.entityObject as MJTemplateEntity;\n this.templateNotFoundInDatabase = false;\n this.isLoadingTemplate = false;\n\n // Clear template content and params since this is a new template\n this.templateContent = null;\n this.templateParams = [];\n this.cdr.detectChanges();\n return;\n }\n\n this.isLoadingTemplate = true;\n this.templateNotFoundInDatabase = false; // Reset the flag\n try {\n this.template = await this._metadata.GetEntityObject<MJTemplateEntity>('MJ: Templates');\n await this.template.Load(this.record.TemplateID);\n \n if (!this.template.IsSaved) {\n this.template = null;\n this.templateNotFoundInDatabase = true; // Set flag when template not found\n console.warn(`Template with ID ${this.record.TemplateID} not found`);\n } else {\n // Load template content and parameters\n await Promise.all([\n this.loadTemplateContent(),\n this.loadTemplateParams()\n ]);\n }\n\n } catch (error) {\n console.error('Error loading template:', error);\n this.template = null;\n this.templateNotFoundInDatabase = true; // Set flag on error\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Error loading associated template',\n 'error',\n 5000\n );\n } finally {\n this.isLoadingTemplate = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Handles template ID changes in the form\n */\n public async onTemplateIdChange() {\n if (this.record?.TemplateID) {\n await this.loadTemplate();\n } else {\n this.template = null;\n this.templateParams = [];\n }\n this.hasUnsavedChanges = true;\n }\n \n\n /**\n * Opens a dialog to link an existing template\n */\n public async linkExistingTemplate() {\n try {\n this.promptManagementService.openTemplateSelectorDialog({\n title: 'Link Existing Template',\n multiSelect: false,\n showCreateNew: true,\n showActiveOnly: true,\n selectedTemplateIds: this.record.TemplateID ? [this.record.TemplateID] : [],\n viewContainerRef: this.viewContainerRef\n }).subscribe({\n next: async (result) => {\n if (result && result.selectedTemplates.length > 0) {\n const selectedTemplate = result.selectedTemplates[0];\n \n // First, clean up any pending changes related to the old template\n this.cleanupOldTemplateRecords();\n \n // Update the AI prompt to reference the selected template\n this.record.TemplateID = selectedTemplate.ID;\n this.hasUnsavedChanges = true;\n \n // Load the selected template\n await this.loadTemplate();\n \n // Trigger change detection to update UI\n this.cdr.detectChanges();\n \n MJNotificationService.Instance.CreateSimpleNotification(\n `Template \"${selectedTemplate.Name}\" linked successfully`,\n 'success',\n 3000\n );\n } else if (result && result.createNew) {\n // User wants to create a new template\n await this.createNewTemplate();\n }\n },\n error: (error) => {\n console.error('Error opening template selector:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Error opening template selector. Please try again.',\n 'error',\n 3000\n );\n }\n });\n } catch (error) {\n console.error('Error in linkExistingTemplate:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Error linking template. Please try again.',\n 'error',\n 3000\n );\n }\n }\n\n /**\n * Opens the current template in a new window\n */\n public openTemplateInNewWindow() {\n if (!this.template?.ID) return;\n \n // TODO: Get the proper URL for template editing\n const templateUrl = `/templates/${this.template.ID}`;\n window.open(templateUrl, '_blank');\n }\n\n /**\n * Creates a new template for this AI prompt (deferred until save)\n */\n public async createNewTemplate() {\n try {\n // First, clean up any pending changes related to the old template\n this.cleanupOldTemplateRecords();\n \n const newTemplate = await this._metadata.GetEntityObject<MJTemplateEntity>('MJ: Templates');\n console.log(\"Record Name:\", this.record.Name);\n newTemplate.NewRecord();\n newTemplate.Name = `${this.record.Name || 'AI Prompt'} Template`;\n newTemplate.Description = `Template for AI Prompt: ${this.record.Name}`;\n newTemplate.UserID = this._metadata.CurrentUser.ID;\n \n // Add to pending records instead of saving immediately\n this.PendingRecords.push({\n entityObject: newTemplate,\n action: 'save'\n });\n \n // Update the AI prompt to reference the new template\n this.record.TemplateID = newTemplate.ID;\n this.hasUnsavedChanges = true;\n \n // Set the template for UI purposes\n this.template = newTemplate;\n \n // Clear existing template content and params since we have a new template\n this.templateContent = null;\n this.templateParams = [];\n this.isLoadingTemplate = false;\n this.templateNotFoundInDatabase = false;\n \n // Force UI update in next microtask to ensure template editor refreshes\n Promise.resolve().then(() => {\n this.cdr.detectChanges();\n });\n\n MJNotificationService.Instance.CreateSimpleNotification(\n 'New template created and will be saved when you save the AI prompt',\n 'info',\n 4000\n );\n\n } catch (error) {\n console.error('Error creating new template:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n MJNotificationService.Instance.CreateSimpleNotification(\n `Error creating new template: ${errorMessage}`,\n 'error',\n 6000\n );\n }\n }\n\n /**\n * Cleans up any pending records related to the old template when changing templates\n */\n private cleanupOldTemplateRecords() {\n // Get current pending records and filter out template content/params from old template\n const currentPendingRecords = this.PendingRecords;\n \n // Remove template content and template param records\n for (let i = currentPendingRecords.length - 1; i >= 0; i--) {\n const record = currentPendingRecords[i];\n const entityName = record.entityObject.EntityInfo.Name;\n if (entityName === 'MJ: Template Contents' || entityName === 'MJ: Template Params') {\n currentPendingRecords.splice(i, 1);\n }\n }\n }\n\n /**\n * Loads template content for the current template\n */\n private async loadTemplateContent() {\n if (!this.template?.ID) {\n this.templateContent = null;\n return;\n }\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const results = await rv.RunView<MJTemplateContentEntity>({\n EntityName: 'MJ: Template Contents',\n ExtraFilter: `TemplateID = '${this.template.ID}'`,\n OrderBy: 'Priority ASC',\n ResultType: 'entity_object'\n });\n \n // Get the first content (highest priority)\n this.templateContent = results.Results?.[0] || null;\n } catch (error) {\n console.error('Error loading template content:', error);\n this.templateContent = null;\n }\n }\n\n /**\n * Loads template parameters for the current template\n */\n private async loadTemplateParams() {\n if (!this.template?.ID) {\n this.templateParams = [];\n return;\n }\n\n this.isLoadingTemplateParams = true;\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const results = await rv.RunView<MJTemplateParamEntity>({\n EntityName: 'MJ: Template Params',\n ExtraFilter: `TemplateID = '${this.template.ID}'`,\n OrderBy: 'Name ASC' \n });\n \n this.templateParams = results.Results || [];\n } catch (error) {\n console.error('Error loading template params:', error);\n this.templateParams = [];\n } finally {\n this.isLoadingTemplateParams = false;\n }\n }\n\n /**\n * Opens the AI prompt execution dialog\n */\n public executeAIPrompt() {\n if (!this.record?.ID) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Please save the AI prompt before executing',\n 'warning',\n 4000\n );\n return;\n }\n\n if (this.record.Status !== 'Active') {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'AI prompt must be Active to execute',\n 'warning',\n 4000\n );\n return;\n }\n\n // Use test harness instead\n this.openTestHarness();\n }\n\n /**\n * Opens the test harness\n */\n public openTestHarness() {\n if (!this.record?.ID) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Please save the AI prompt before testing',\n 'warning',\n 4000\n );\n return;\n }\n\n // Use the dialog service instead of inline\n // Don't pass viewContainerRef so window is top-level\n this.testHarnessService.openForPrompt(this.record.ID).subscribe({\n next: (result) => {\n if (result.success) {\n // Reload execution history\n this.loadExecutionHistory();\n }\n },\n error: (error) => {\n console.error('Test harness error:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Test failed: ' + error.message,\n 'error',\n 5000\n );\n }\n });\n }\n\n /**\n * Handles when test harness is closed\n */\n public onTestHarnessVisibilityChanged(isVisible: boolean) {\n this.showTestHarness = isVisible;\n }\n\n /**\n * Handles template content changes from the editor\n */\n public onTemplateContentChange(content: MJTemplateContentEntity[]) {\n // Handle template content changes if needed\n console.log('Template content changed:', content);\n \n // Mark as having unsaved changes\n this.hasUnsavedChanges = true;\n \n // If we have content changes, we need to ensure they're added to pending records\n // This is typically handled by the template editor component itself\n }\n \n /**\n * Handles template content record deletion\n * This method should be called by the template editor to properly manage deletions\n */\n public handleTemplateContentDelete(templateContent: MJTemplateContentEntity) {\n if (templateContent.IsSaved) {\n // If it's saved, add to pending deletions\n this.PendingRecords.push({\n entityObject: templateContent,\n action: 'delete'\n });\n } else {\n // If it's not saved, remove it from pending records if it exists there\n const currentPendingRecords = this.PendingRecords;\n for (let i = currentPendingRecords.length - 1; i >= 0; i--) {\n const record = currentPendingRecords[i];\n if (record.entityObject === templateContent || \n (record.entityObject.EntityInfo.Name === 'MJ: Template Contents' && \n record.entityObject.Get('ID') === templateContent.Get('ID'))) {\n currentPendingRecords.splice(i, 1);\n break;\n }\n }\n }\n this.hasUnsavedChanges = true;\n }\n \n /**\n * Handles template content record creation/modification\n * This method should be called by the template editor to properly manage saves\n */\n public handleTemplateContentSave(templateContent: MJTemplateContentEntity) {\n if (templateContent.Dirty || !templateContent.IsSaved) {\n // Add to pending saves\n this.PendingRecords.push({\n entityObject: templateContent,\n action: 'save'\n });\n }\n this.hasUnsavedChanges = true;\n }\n \n /**\n * Adds template content changes to pending records\n */\n private addTemplateContentsToPendingRecords() {\n // This method would typically get pending changes from the template editor\n // The template editor should expose its pending changes through events or direct calls\n // For now, we'll rely on the template editor to manage its own pending records\n // and communicate them through the MJ event system\n \n // If the template editor has a method to get pending changes, we would call it here\n if (this.templateEditor && typeof (this.templateEditor as any).getPendingChanges === 'function') {\n try {\n const pendingChanges = (this.templateEditor as any).getPendingChanges();\n if (pendingChanges && pendingChanges.length > 0) {\n this.PendingRecords.push(...pendingChanges);\n }\n } catch (error) {\n console.warn('Template editor does not support getPendingChanges method:', error);\n }\n }\n }\n\n /**\n * Handles template run requests from the editor\n */\n public onTemplateRun(template: MJTemplateEntity) {\n console.log('Template run requested:', template);\n // Could open the template parameter dialog here if needed\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Template run functionality coming soon',\n 'info',\n 3000\n );\n }\n\n /**\n * Gets the display text for parallelization mode\n */\n public getParallelizationModeDisplay(): string {\n switch (this.record?.ParallelizationMode) {\n case 'None': return 'None';\n case 'StaticCount': return `Static count (${this.record.ParallelCount || 1})`;\n case 'ConfigParam': return `Config parameter (${this.record.ParallelConfigParam || 'not set'})`;\n case 'ModelSpecific': return 'Model-specific configuration';\n default: return 'Unknown';\n }\n }\n\n /**\n * Gets the display text for output type\n */\n public getOutputTypeDisplay(): string {\n const type = this.record?.OutputType || 'string';\n const validationBehavior = this.record?.ValidationBehavior || 'Warn';\n \n if (validationBehavior === 'None') {\n return type;\n } else {\n return `${type} (${validationBehavior})`;\n }\n }\n \n /**\n * Gets the color for validation behavior display\n */\n public getValidationColor(): string {\n switch (this.record?.ValidationBehavior) {\n case 'Strict': return '#dc3545'; // red\n case 'Warn': return '#ffc107'; // yellow\n default: return '#6c757d'; // default gray\n }\n }\n\n /**\n * Checks if ParallelCount field should be visible\n */\n public get showParallelCount(): boolean {\n return this.record?.ParallelizationMode === 'StaticCount';\n }\n\n /**\n * Checks if ParallelConfigParam field should be visible\n */\n public get showParallelConfigParam(): boolean {\n return this.record?.ParallelizationMode === 'ConfigParam';\n }\n\n /**\n * Checks if OutputExample field should be visible\n */\n public get showOutputExample(): boolean {\n return this.record?.OutputType === 'object';\n }\n\n /**\n * Checks if the AI prompt can be executed\n */\n public get canExecute(): boolean {\n return !!(this.record?.ID && \n this.record.Status === 'Active' && \n this.record.TemplateID && \n this.template);\n }\n\n /**\n * Gets status badge color\n */\n public getStatusBadgeColor(): string {\n switch (this.record?.Status) {\n case 'Active': return '#28a745';\n case 'Pending': return '#ffc107';\n case 'Disabled': return '#6c757d';\n default: return '#6c757d';\n }\n }\n\n /**\n * Loads available AI models for selection\n */\n public async loadAvailableModels() {\n try {\n const engine = AIEngineBase.Instance;\n await engine.Config(false);\n const models = engine.Models;\n models.sort((a, b) => a.Name.localeCompare(b.Name));\n this.availableModels = models;\n } catch (error) {\n console.error('Error loading available models:', error);\n }\n }\n\n /**\n * Loads available AI vendors for selection\n */\n public async loadAvailableVendors() {\n try {\n const engine = AIEngineBase.Instance;\n await engine.Config(false);\n const vendors = engine.Vendors;\n vendors.sort((a, b) => a.Name.localeCompare(b.Name));\n this.availableVendors = vendors;\n } catch (error) {\n console.error('Error loading available vendors:', error);\n }\n }\n\n /**\n * Loads available AI prompt types for selection\n */\n public async loadAvailablePromptTypes() {\n this.isLoadingPromptTypes = true;\n try {\n const engine = AIEngineBase.Instance;\n await engine.Config(false);\n const promptTypes = engine.PromptTypes;\n promptTypes.sort((a, b) => a.Name.localeCompare(b.Name));\n this.availablePromptTypes = promptTypes;\n } catch (error) {\n console.error('Error loading available prompt types:', error);\n } finally {\n this.isLoadingPromptTypes = false;\n }\n }\n\n /**\n * Loads available AI configurations for selection\n */\n public async loadAvailableConfigurations() {\n this.isLoadingConfigurations = true;\n try {\n const engine = AIEngineBase.Instance;\n await engine.Config(false);\n const configurations = engine.Configurations;\n configurations.sort((a, b) => a.Name.localeCompare(b.Name));\n this.availableConfigurations = configurations;\n } catch (error) {\n console.error('Error loading available configurations:', error);\n } finally {\n this.isLoadingConfigurations = false;\n }\n }\n\n /**\n * Loads vendors available for a specific model\n */\n public async loadVendorsForModel(modelId: string): Promise<{ vendors: MJAIVendorEntity[], modelVendors: MJAIModelVendorEntity[] }> {\n if (!modelId) {\n return { vendors: [], modelVendors: [] };\n }\n\n // Check cache first\n if (this.modelVendorsMap.has(modelId)) {\n return this.modelVendorsMap.get(modelId)!;\n }\n\n try {\n // Load model vendors for this model, filtering by TypeID for inference providers only\n const engine = AIEngineBase.Instance;\n await engine.Config(false);\n const modelVendors = engine.ModelVendors.filter(mv => UUIDsEqual(mv.ModelID, modelId) && UUIDsEqual(mv.TypeID, this.__InferenceProvider_VendorTypeDefinitionID));\n \n // filter vendors to just the vendors in the modelVendors array in VendorID\n const vendors = engine.Vendors.filter(v => modelVendors.some(mv => UUIDsEqual(mv.VendorID, v.ID)));\n\n const result = { vendors, modelVendors };\n this.modelVendorsMap.set(modelId, result);\n return result;\n\n } catch (error) {\n console.error('Error loading vendors for model:', error);\n return { vendors: [], modelVendors: [] };\n }\n }\n\n /**\n * Gets vendors for a specific model from cache or loads them\n */\n public async getVendorsForModel(modelId: string): Promise<MJAIVendorEntity[]> {\n const result = await this.loadVendorsForModel(modelId);\n return result.vendors;\n }\n\n /**\n * Gets the status for a model-vendor combination\n */\n public getModelVendorStatus(modelId: string, vendorId: string): string {\n const modelVendorData = this.modelVendorsMap.get(modelId);\n if (!modelVendorData) return 'Unknown';\n \n const modelVendor = modelVendorData.modelVendors.find(mv => UUIDsEqual(mv.VendorID, vendorId));\n return modelVendor?.Status || 'Unknown';\n }\n\n /**\n * Gets the color for vendor status display\n */\n public getVendorStatusColor(modelId: string, vendorId: string): string {\n const status = this.getModelVendorStatus(modelId, vendorId);\n switch (status) {\n case 'Active': return '#28a745'; // green\n case 'Inactive': return '#dc3545'; // red \n case 'Pending': return '#ffc107'; // yellow\n default: return '#6c757d'; // gray\n }\n }\n\n /**\n * Handles model selection change and loads vendors for that model\n */\n public async onModelChange(modelId: string, promptModelIndex: number) {\n const promptModel = this.promptModels[promptModelIndex];\n if (!promptModel) return;\n\n // Clear the vendor selection when model changes\n promptModel.VendorID = null;\n this.hasUnsavedChanges = true;\n\n // Load vendors for the new model\n if (modelId) {\n const vendorData = await this.loadVendorsForModel(modelId);\n \n // Auto-select first vendor if available\n if (vendorData.vendors.length > 0) {\n promptModel.VendorID = vendorData.vendors[0].ID;\n }\n }\n \n // Trigger change detection\n this.cdr.detectChanges();\n }\n\n /**\n * Handles configuration change for a prompt model\n */\n public onConfigurationChange(configurationId: string | null, promptModelIndex: number) {\n const promptModel = this.promptModels[promptModelIndex];\n if (!promptModel) return;\n\n promptModel.ConfigurationID = configurationId;\n this.hasUnsavedChanges = true;\n \n // Trigger change detection\n this.cdr.detectChanges();\n }\n\n /**\n * Gets vendors for a specific model\n */\n public getVendorsForModelSync(modelId: string): MJAIVendorEntity[] {\n const modelVendorData = this.modelVendorsMap.get(modelId);\n return modelVendorData?.vendors || [];\n }\n\n /**\n * Checks if vendor dropdown should be shown (more than one vendor)\n */\n public shouldShowVendorDropdown(modelId: string): boolean {\n if (!modelId) return false;\n const vendors = this.getVendorsForModelSync(modelId);\n return vendors.length > 1;\n }\n\n /**\n * Loads prompt models for this AI prompt\n */\n public async loadPromptModels() {\n if (!this.record?.ID) {\n this.promptModels = [];\n return;\n }\n\n this.isLoadingModels = true;\n try {\n const engine = AIEngineBase.Instance;\n await engine.Config(false);\n this.promptModels = engine.PromptModels.filter(pm => UUIDsEqual(pm.PromptID, this.record.ID));\n this.promptModels.sort((a, b) => {\n // first sort on priority (descending), then by created date (ascending)\n return b.Priority - a.Priority || new Date(a.__mj_CreatedAt).getTime() - new Date(b.__mj_CreatedAt).getTime();\n });\n\n // Load vendors for existing models\n const modelIds = this.promptModels\n .map(pm => pm.ModelID)\n .filter(id => id); // Filter out null/undefined\n \n await Promise.all(modelIds.map(modelId => this.loadVendorsForModel(modelId)));\n\n } catch (error) {\n console.error('Error loading prompt models:', error);\n } finally {\n this.isLoadingModels = false;\n }\n }\n\n /**\n * Adds a new model to the prompt (deferred until save)\n */\n public async addNewModel() {\n if (!this.record?.ID) return;\n \n try {\n const newModel = await this._metadata.GetEntityObject<MJAIPromptModelEntity>('MJ: AI Prompt Models');\n newModel.PromptID = this.record.ID;\n \n // Set priority to 1 (lowest) for new models added at the end\n newModel.Priority = 1;\n \n // Generate a temporary ID for tracking if the model doesn't have one\n if (!newModel.ID) {\n (newModel as any)._tempId = `temp_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;\n }\n \n // ModelID will be set by user\n \n this.promptModels.push(newModel);\n this.hasUnsavedChanges = true;\n \n // Update priorities after adding\n this.updateModelPriorities();\n \n // Trigger change detection\n this.cdr.detectChanges();\n \n MJNotificationService.Instance.CreateSimpleNotification(\n 'New model added. Select a model and save to persist changes.',\n 'info',\n 3000\n );\n } catch (error) {\n console.error('Error creating new model:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Error creating new model',\n 'error',\n 5000\n );\n }\n }\n\n /**\n * Removes a model from the prompt (deferred until save)\n */\n public async removePromptModel(index: number) {\n if (index < 0 || index >= this.promptModels.length) return;\n \n const model = this.promptModels[index];\n \n try {\n // If it's a saved model, add it to pending deletions\n if (model.IsSaved) {\n this.PendingRecords.push({\n entityObject: model,\n action: 'delete'\n });\n }\n\n // Remove from local array\n this.promptModels.splice(index, 1);\n this.hasUnsavedChanges = true;\n\n // Update priorities after removal\n this.updateModelPriorities();\n\n // Trigger change detection\n this.cdr.detectChanges();\n\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Model will be removed when you save the prompt',\n 'info',\n 3000\n );\n\n } catch (error) {\n console.error('Error removing model:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Error removing model',\n 'error',\n 5000\n );\n }\n }\n\n /**\n * Gets the display name for a model ID\n */\n public getModelDisplayName(modelId: string): string {\n if (!modelId) return '';\n const model = this.availableModels.find(m => UUIDsEqual(m.ID, modelId));\n return model ? model.Name : modelId;\n }\n\n /**\n * Gets the display name for a vendor ID\n */\n public getVendorDisplayName(vendorId: string): string {\n if (!vendorId) return '';\n const vendor = this.availableVendors.find(v => UUIDsEqual(v.ID, vendorId));\n return vendor ? vendor.Name : vendorId;\n }\n\n /**\n * Gets the display name for a prompt type ID\n */\n public getPromptTypeDisplayName(typeId: string): string {\n if (!typeId) return '';\n const type = this.availablePromptTypes.find(t => UUIDsEqual(t.ID, typeId));\n return type ? type.Name : typeId;\n }\n\n /**\n * Gets the display name for a configuration ID\n */\n public getConfigurationDisplayName(configurationId: string | null): string {\n if (!configurationId) return 'Default';\n const config = this.availableConfigurations.find(c => UUIDsEqual(c.ID, configurationId));\n return config ? config.Name : configurationId;\n }\n\n /**\n * Override PopulatePendingRecords to add AI prompt model changes\n */\n protected PopulatePendingRecords() {\n // IMPORTANT: The parent method clears the pending records array, so we need to preserve\n // any records we've added (like templates) before calling the parent method\n const currentPendingRecords = [...this.PendingRecords]; // Make a copy\n \n // Call parent first to get child component pending records (this clears the array)\n super.PopulatePendingRecords();\n \n // Re-add our preserved records\n for (const record of currentPendingRecords) {\n this.PendingRecords.push(record);\n }\n \n // Add prompt model changes to pending records\n this.addPromptModelsToPendingRecords();\n \n // Handle template content changes through the template editor\n this.addTemplateContentsToPendingRecords();\n }\n\n /**\n * Override StartEditMode to capture original state for cancel functionality\n */\n public StartEditMode(): void {\n // Store original template ID for cancel functionality\n this.originalTemplateID = this.record.TemplateID;\n \n // Call parent implementation\n super.StartEditMode();\n }\n\n /**\n * Override CancelEdit to restore original state\n */\n public CancelEdit() {\n // Call parent implementation first\n super.CancelEdit();\n \n // Restore original template state\n if (!UUIDsEqual(this.originalTemplateID, this.record.TemplateID)) {\n this.record.TemplateID = this.originalTemplateID || '';\n \n // Reload the template to reflect the reverted state\n this.loadTemplate().then(() => {\n this.cdr.detectChanges();\n });\n } else if (this.templateEditor) {\n // Even if template didn't change, refresh the template editor to discard any unsaved content changes\n this.templateEditor.refreshAndDiscardChanges();\n }\n \n // Clear the stored original state\n this.originalTemplateID = null;\n this.hasUnsavedChanges = false;\n }\n\n /**\n * Adds prompt model changes to the pending records\n */\n private addPromptModelsToPendingRecords() {\n // Add all prompt models that have been modified or are new\n for (const model of this.promptModels) {\n if (model.ModelID && (model.Dirty || !model.IsSaved)) {\n // Set the PromptID if it's not already set\n if (!model.PromptID) {\n model.PromptID = this.record.ID;\n }\n \n this.PendingRecords.push({\n entityObject: model,\n action: 'save'\n });\n }\n }\n }\n\n /**\n * Override InternalSaveRecord to handle template dependencies and related entity changes\n * Templates must be saved before AI Prompts to avoid foreign key constraint errors\n */\n protected async InternalSaveRecord(): Promise<boolean> {\n if (!this.record) {\n return false;\n }\n\n try {\n const md = this.ProviderToUse;\n const transactionGroup = await md.CreateTransactionGroup();\n\n // First, save any templates that need to be saved (they must be saved before AI Prompts)\n const templateRecords = this.PendingRecords.filter(p => \n p.entityObject.EntityInfo.Name === 'MJ: Templates'\n );\n \n for (const templateRecord of templateRecords) {\n templateRecord.entityObject.TransactionGroup = transactionGroup;\n if (templateRecord.action === 'save') {\n const saveResult = await templateRecord.entityObject.Save();\n if (!saveResult) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Failed to save template. Please check the template data.',\n 'error',\n 4000\n );\n return false;\n }\n } else {\n await templateRecord.entityObject.Delete();\n }\n }\n\n // Now save the main AI Prompt record\n this.record.TransactionGroup = transactionGroup;\n const agentSaveResult = await this.record.Save();\n if (!agentSaveResult) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Failed to save AI prompt details. Please check the form data.',\n 'error',\n 4000\n );\n return false;\n }\n\n // Then save all other pending records (excluding templates which we already saved)\n const otherRecords = this.PendingRecords.filter(p => \n p.entityObject.EntityInfo.Name !== 'MJ: Templates'\n );\n \n for (const record of otherRecords) {\n record.entityObject.TransactionGroup = transactionGroup;\n if (record.action === 'save') {\n await record.entityObject.Save();\n } else {\n await record.entityObject.Delete();\n }\n }\n\n // Execute all operations atomically\n const success = await transactionGroup.Submit();\n if (success) {\n // Clear our local state since save was successful\n this.hasUnsavedChanges = false;\n \n // Reload prompt models to reflect database state\n await this.loadPromptModels();\n \n // Reload template to reflect any changes\n if (this.record.TemplateID) {\n await this.loadTemplate();\n }\n\n MJNotificationService.Instance.CreateSimpleNotification(\n 'AI Prompt saved successfully',\n 'success',\n 3000\n );\n \n return true;\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Save failed. Please try again.',\n 'error',\n 4000\n );\n return false;\n }\n } catch (error) {\n console.error('Error in AI prompt save:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n `Save failed: ${error instanceof Error ? error.message : 'Unknown error'}. Please try again.`,\n 'error',\n 5000\n );\n return false;\n }\n }\n\n /**\n * Loads the result selector tree data (categories and prompts)\n */\n public async loadResultSelectorTreeData() {\n this.isLoadingResultSelectorData = true;\n try {\n // Load categories and prompts\n const engine = AIEngineBase.Instance;\n await engine.Config(false);\n\n const categories = engine.PromptCategories;\n const prompts = engine.Prompts.filter(p => p.Status === 'Active');\n\n categories.sort((a, b) => a.Name.localeCompare(b.Name));\n prompts.sort((a, b) => a.Name.localeCompare(b.Name));\n \n // Build tree structure\n this.resultSelectorTreeData = this.buildResultSelectorTree(categories, prompts);\n\n } catch (error) {\n console.error('Error loading result selector tree data:', error);\n this.resultSelectorTreeData = [];\n } finally {\n this.isLoadingResultSelectorData = false;\n }\n }\n\n /**\n * Builds the tree structure for result selector\n */\n private buildResultSelectorTree(categories: MJAIPromptCategoryEntityExtended[], prompts: MJAIPromptEntityExtended[]): any[] {\n const tree: any[] = [];\n\n // Add \"Clear Selection\" option at the top\n tree.push({\n text: '(Clear Selection)',\n value: null,\n hasChildren: false,\n isCategory: false,\n isClearOption: true\n });\n\n // Create category nodes\n const categoryMap = new Map<string, any>();\n categories.forEach(category => {\n const node = {\n text: category.Name,\n value: null, // Categories don't have values\n expanded: true,\n hasChildren: true,\n items: [],\n isCategory: true,\n categoryId: category.ID\n };\n categoryMap.set(category.ID, node);\n \n // Handle parent-child relationships\n if (category.ParentID) {\n const parentNode = categoryMap.get(category.ParentID);\n if (parentNode) {\n parentNode.items.push(node);\n } else {\n tree.push(node); // Parent not found, add to root\n }\n } else {\n tree.push(node); // Root category\n }\n });\n\n // Collect uncategorized prompts\n const uncategorizedPrompts: any[] = [];\n\n // Add prompts to their categories\n prompts.forEach(prompt => {\n const promptNode = {\n text: prompt.Name,\n value: prompt.ID,\n hasChildren: false,\n isCategory: false,\n promptId: prompt.ID\n };\n\n if (prompt.CategoryID) {\n const categoryNode = categoryMap.get(prompt.CategoryID);\n if (categoryNode) {\n categoryNode.items.push(promptNode);\n } else {\n // Category not found, add to uncategorized\n uncategorizedPrompts.push(promptNode);\n }\n } else {\n // No category, add to uncategorized\n uncategorizedPrompts.push(promptNode);\n }\n });\n\n // If there are uncategorized prompts, add them to a special section\n if (uncategorizedPrompts.length > 0) {\n tree.push({\n text: 'Uncategorized',\n value: null,\n expanded: true,\n hasChildren: true,\n items: uncategorizedPrompts,\n isCategory: true,\n categoryId: 'uncategorized'\n });\n }\n\n return tree;\n }\n\n /**\n * Handles result selector selection\n */\n public onResultSelectorChange(value: string) {\n this.record.ResultSelectorPromptID = value || null;\n }\n\n /**\n * Gets the display name for a prompt ID from the tree data\n */\n public getPromptDisplayName(promptId: string): string {\n if (!promptId) return '';\n \n const findPromptInTree = (nodes: any[]): string => {\n for (const node of nodes) {\n if (!node.isCategory && node.value === promptId) {\n return node.text;\n }\n if (node.items && node.items.length > 0) {\n const found = findPromptInTree(node.items);\n if (found) return found;\n }\n }\n return '';\n };\n\n return findPromptInTree(this.resultSelectorTreeData);\n }\n\n /**\n * Moves a model up in the list by swapping with the previous item\n */\n public moveModelUp(index: number) {\n if (index > 0 && index < this.promptModels.length) {\n // Create new array to ensure Angular detects the change\n const newModels = [...this.promptModels];\n \n // Swap with previous item\n [newModels[index - 1], newModels[index]] = \n [newModels[index], newModels[index - 1]];\n \n // Replace the array and force full re-render\n this.promptModels = [...newModels];\n this.hasUnsavedChanges = true;\n \n this.updateModelPriorities();\n \n // Force Angular to re-evaluate all bindings\n this.cdr.detectChanges();\n \n // Additional force update for Kendo dropdowns\n setTimeout(() => {\n this.cdr.detectChanges();\n }, 0);\n }\n }\n\n /**\n * Moves a model down in the list by swapping with the next item\n */\n public moveModelDown(index: number) {\n if (index >= 0 && index < this.promptModels.length - 1) {\n // Create new array to ensure Angular detects the change\n const newModels = [...this.promptModels];\n \n // Swap with next item\n [newModels[index], newModels[index + 1]] = \n [newModels[index + 1], newModels[index]];\n \n // Replace the array and force full re-render\n this.promptModels = [...newModels];\n this.hasUnsavedChanges = true;\n \n this.updateModelPriorities();\n \n // Force Angular to re-evaluate all bindings\n this.cdr.detectChanges();\n \n // Additional force update for Kendo dropdowns\n setTimeout(() => {\n this.cdr.detectChanges();\n }, 0);\n }\n }\n\n /**\n * Updates priority values based on array order\n */\n private updateModelPriorities() {\n // Update priorities based on position (higher priority for items at top)\n const maxPriority = this.promptModels.length;\n this.promptModels.forEach((model, index) => {\n model.Priority = maxPriority - index;\n });\n }\n \n /**\n * Gets a stable identifier for a model (for form tracking)\n */\n public getModelTrackId(model: MJAIPromptModelEntity): string {\n return model.ID || (model as any)._tempId || '';\n }\n\n /**\n * Handles drag start event\n */\n public onDragStart(event: DragEvent, index: number) {\n this.draggedIndex = index;\n event.dataTransfer!.effectAllowed = 'move';\n event.dataTransfer!.setData('text/html', ''); // Required for Firefox\n }\n\n /**\n * Handles drag over event\n */\n public onDragOver(event: DragEvent) {\n event.preventDefault();\n event.dataTransfer!.dropEffect = 'move';\n }\n\n /**\n * Handles drop event\n */\n public onDrop(event: DragEvent, dropIndex: number) {\n event.preventDefault();\n \n if (this.draggedIndex !== -1 && this.draggedIndex !== dropIndex) {\n // Create new array to ensure Angular detects the change\n const newModels = [...this.promptModels];\n \n // Remove dragged item\n const draggedItem = newModels.splice(this.draggedIndex, 1)[0];\n \n // Insert at new position\n newModels.splice(dropIndex, 0, draggedItem);\n \n // Replace the array and force full re-render\n this.promptModels = [...newModels];\n this.hasUnsavedChanges = true;\n \n // Update priorities\n this.updateModelPriorities();\n \n // Force Angular to re-evaluate all bindings\n this.cdr.detectChanges();\n \n // Additional force update for Kendo dropdowns\n setTimeout(() => {\n this.cdr.detectChanges();\n }, 0);\n }\n \n this.draggedIndex = -1;\n }\n\n /**\n * Handles drag end event\n */\n public onDragEnd(_event: DragEvent) {\n this.draggedIndex = -1;\n }\n \n /**\n * Load execution history for this prompt\n */\n public async loadExecutionHistory() {\n if (!this.record?.ID) return;\n \n this.isLoadingHistory = true;\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJAIPromptRunEntityExtended>({\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: `PromptID='${this.record.ID}'`,\n OrderBy: 'RunAt DESC' \n });\n \n this.executionHistory = result.Results;\n this.sortExecutionHistory();\n } catch (error) {\n console.error('Error loading execution history:', error);\n this.executionHistory = [];\n } finally {\n this.isLoadingHistory = false;\n }\n }\n \n /**\n * Sort execution history based on current sort field and direction\n */\n public sortExecutionHistory() {\n if (!this.executionHistory || this.executionHistory.length === 0) return;\n \n this.executionHistory.sort((a, b) => {\n let aVal: any, bVal: any;\n \n switch (this.historySortField) {\n case 'runAt':\n aVal = a.RunAt ? new Date(a.RunAt).getTime() : 0;\n bVal = b.RunAt ? new Date(b.RunAt).getTime() : 0;\n break;\n case 'executionTime':\n aVal = a.ExecutionTimeMS || 0;\n bVal = b.ExecutionTimeMS || 0;\n break;\n case 'cost':\n aVal = a.TotalCost || a.Cost || 0;\n bVal = b.TotalCost || b.Cost || 0;\n break;\n case 'tokens':\n aVal = a.TokensUsed || 0;\n bVal = b.TokensUsed || 0;\n break;\n }\n \n if (this.historySortDirection === 'asc') {\n return aVal > bVal ? 1 : aVal < bVal ? -1 : 0;\n } else {\n return aVal < bVal ? 1 : aVal > bVal ? -1 : 0;\n }\n });\n }\n \n /**\n * Change sort field and direction for execution history\n */\n public changeHistorySort(field: 'runAt' | 'executionTime' | 'cost' | 'tokens') {\n if (this.historySortField === field) {\n // Toggle direction if same field\n this.historySortDirection = this.historySortDirection === 'asc' ? 'desc' : 'asc';\n } else {\n // New field, default to desc\n this.historySortField = field;\n this.historySortDirection = 'desc';\n }\n this.sortExecutionHistory();\n }\n \n /**\n * Navigate to a prompt run record\n */\n public navigateToPromptRun(runId: string) {\n SharedService.Instance.OpenEntityRecord('MJ: AI Prompt Runs', CompositeKey.FromID(runId));\n }\n \n /**\n * Format duration for display\n */\n public formatDuration(ms: number | null): string {\n if (!ms) return '-';\n \n if (ms < 1000) {\n return `${ms}ms`;\n } else if (ms < 60000) {\n return `${(ms / 1000).toFixed(1)}s`;\n } else {\n const minutes = Math.floor(ms / 60000);\n const seconds = ((ms % 60000) / 1000).toFixed(0);\n return `${minutes}m ${seconds}s`;\n }\n }\n \n /**\n * Format cost for display\n */\n public formatCost(cost: number | null): string {\n if (!cost) return '-';\n return `$${cost.toFixed(4)}`;\n }\n \n /**\n * Format tokens for display\n */\n public formatTokens(tokens: number | null): string {\n if (!tokens) return '-';\n return tokens.toLocaleString();\n }\n \n /**\n * Get status color for execution\n */\n public getExecutionStatusColor(success: boolean | null): string {\n if (success === true) return '#28a745';\n if (success === false) return '#dc3545';\n return '#ffc107';\n }\n \n /**\n * Get status icon for execution\n */\n public getExecutionStatusIcon(success: boolean | null): string {\n if (success === true) return 'fa-check-circle';\n if (success === false) return 'fa-times-circle';\n return 'fa-spinner fa-spin';\n }\n\n /**\n * Gets the icon for a template parameter type\n */\n public getParamTypeIcon(type: string): string {\n switch (type) {\n case 'Scalar': return 'fa-font';\n case 'Array': return 'fa-list';\n case 'Object': return 'fa-cube';\n case 'Record': return 'fa-file-alt';\n case 'Entity': return 'fa-table';\n default: return 'fa-question';\n }\n }\n\n /**\n * Gets the color for a template parameter type\n */\n public getParamTypeColor(type: string): string {\n switch (type) {\n case 'Scalar': return '#17a2b8';\n case 'Array': return '#28a745';\n case 'Object': return '#6f42c1';\n case 'Record': return '#fd7e14';\n case 'Entity': return '#dc3545';\n default: return '#6c757d';\n }\n }\n\n /**\n * Gets a friendly description of the parameter type\n */\n public getParamTypeDescription(param: MJTemplateParamEntity): string {\n switch (param.Type) {\n case 'Scalar': \n return 'Single value (text, number, date, etc.)';\n case 'Array': \n return 'List of values';\n case 'Object': \n return 'JSON object with multiple properties';\n case 'Record': \n if (param.EntityID) {\n return `Single record from entity`;\n }\n return 'Single database record';\n case 'Entity': \n if (param.EntityID) {\n return `Multiple records from entity`;\n }\n return 'Entity data collection';\n default: \n return 'Unknown type';\n }\n }\n}\n","<!-- Dialog container -->\n<div></div>\n@if (record) {\n<mj-record-form-container [Record]=\"record\" [FormComponent]=\"this\"\n [ToolbarConfig]=\"toolbarConfig\"\n [WidthMode]=\"'full-width'\"\n (Navigate)=\"OnFormNavigate($event)\"\n (DeleteRequested)=\"OnDeleteRequested()\"\n (FavoriteToggled)=\"OnFavoriteToggled()\"\n (HistoryRequested)=\"OnHistoryRequested()\"\n (ListManagementRequested)=\"OnListManagementRequested()\">\n <form class=\"record-form\" #form=\"ngForm\" style=\"display: flex; flex-direction: column; height: 100%; overflow: hidden;\">\n <!-- Main Content Area - Template Editor and Configuration -->\n <div class=\"prompt-main-area\" style=\"display: flex; flex-direction: column; flex: 1; min-height: 0; overflow-y: auto;\">\n <!-- Header Section -->\n <div class=\"prompt-header\" style=\"flex-shrink: 0; padding: 20px; background: var(--mj-bg-surface-sunken); border-bottom: 2px solid var(--mj-border-default);\">\n <div style=\"display: flex; justify-content: space-between; align-items: flex-start; gap: 20px;\">\n <!-- Left: Prompt Info -->\n <div style=\"flex: 1; min-width: 0;\">\n <div style=\"display: flex; align-items: center; gap: 12px; margin-bottom: 8px;\">\n <i class=\"fa-solid fa-robot\" style=\"color: var(--mj-brand-primary); font-size: 1.4em;\"></i>\n @if (EditMode) {\n <input type=\"text\" class=\"mj-input\" [(ngModel)]=\"record.Name\"\n name=\"promptName\"\n placeholder=\"Enter prompt name...\"\n style=\"font-size: 1.2em; font-weight: 600; min-width: 300px; flex: 1;\" />\n } @else {\n <h4 style=\"margin: 0; color: var(--mj-text-secondary); font-weight: 600; flex: 1;\">{{ record.Name || 'Untitled AI Prompt' }}</h4>\n <span class=\"status-badge\" [style.background-color]=\"getStatusBadgeColor()\"\n style=\"color: white; padding: 4px 10px; border-radius: 12px; font-size: 0.75em; font-weight: 500;\">\n {{ record.Status }}\n </span>\n }\n </div>\n <!-- Status and Type Editors when in edit mode -->\n @if (EditMode) {\n <div style=\"display: flex; gap: 16px; margin-bottom: 12px; flex-wrap: wrap;\">\n <div>\n <label style=\"display: block; margin-bottom: 4px; font-weight: 600; color: var(--mj-text-secondary); font-size: 0.9em;\">Status</label>\n <mj-dropdown [(ngModel)]=\"record.Status\"\n name=\"promptStatus\"\n [Data]=\"[{text: 'Active', value: 'Active'}, {text: 'Pending', value: 'Pending'}, {text: 'Disabled', value: 'Disabled'}]\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n style=\"width: 150px;\">\n </mj-dropdown>\n </div>\n <div>\n <label style=\"display: block; margin-bottom: 4px; font-weight: 600; color: var(--mj-text-secondary); font-size: 0.9em;\">\n Type <span style=\"color: #dc3545;\">*</span>\n </label>\n @if (isLoadingPromptTypes) {\n <div style=\"padding: 8px; color: var(--mj-text-muted); font-style: italic; width: 200px;\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading types...\n </div>\n } @else {\n <mj-dropdown [(ngModel)]=\"record.TypeID\"\n name=\"promptTypeID\"\n [Data]=\"availablePromptTypes\"\n TextField=\"Name\"\n ValueField=\"ID\"\n [ValuePrimitive]=\"true\"\n [Filterable]=\"true\"\n Placeholder=\"Select prompt type...\"\n style=\"width: 200px;\">\n </mj-dropdown>\n }\n </div>\n </div>\n }\n @if (EditMode) {\n <textarea class=\"mj-textarea\" [(ngModel)]=\"record.Description\"\n name=\"promptDescription\"\n [rows]=\"2\"\n placeholder=\"Enter prompt description...\"\n style=\"width: 100%; max-width: 600px; margin-bottom: 12px;\"></textarea>\n } @else if (record.Description) {\n <p style=\"margin: 0 0 12px 0; color: var(--mj-text-muted); font-size: 0.9em; line-height: 1.4;\">{{ record.Description }}</p>\n }\n <!-- Quick Config Row -->\n <div class=\"quick-config\" style=\"display: flex; align-items: center; gap: 16px; flex-wrap: wrap;\">\n @if (record.TypeID) {\n <div class=\"config-item\" style=\"display: flex; align-items: center; gap: 6px; font-size: 0.85em;\">\n <i class=\"fa-solid fa-tag\" style=\"color: var(--mj-text-muted);\"></i>\n <span style=\"color: var(--mj-text-muted);\">Type:</span>\n <span style=\"color: var(--mj-text-secondary); font-weight: 500;\">{{ getPromptTypeDisplayName(record.TypeID) }}</span>\n </div>\n }\n <div class=\"config-item\" style=\"display: flex; align-items: center; gap: 6px; font-size: 0.85em;\">\n <i class=\"fa-solid fa-layer-group\" style=\"color: var(--mj-text-muted);\"></i>\n <span style=\"color: var(--mj-text-muted);\">Parallelization:</span>\n <span style=\"color: var(--mj-text-secondary); font-weight: 500;\">{{ getParallelizationModeDisplay() }}</span>\n </div>\n <div class=\"config-item\" style=\"display: flex; align-items: center; gap: 6px; font-size: 0.85em;\">\n <i class=\"fa-solid fa-code\" style=\"color: var(--mj-text-muted);\"></i>\n <span style=\"color: var(--mj-text-muted);\">Output:</span>\n <span [style.color]=\"getValidationColor()\" style=\"font-weight: 500;\">{{ getOutputTypeDisplay() }}</span>\n </div>\n @if (record.EnableCaching) {\n <div class=\"config-item\" style=\"display: flex; align-items: center; gap: 6px; font-size: 0.85em;\">\n <i class=\"fa-solid fa-database\" style=\"color: #28a745;\"></i>\n <span style=\"color: #28a745; font-weight: 500;\">Caching Enabled</span>\n </div>\n }\n @if (record.EffortLevel) {\n <div class=\"config-item\" style=\"display: flex; align-items: center; gap: 6px; font-size: 0.85em;\">\n <i class=\"fa-solid fa-tachometer-alt\" style=\"color: var(--mj-text-muted);\"></i>\n <span style=\"color: var(--mj-text-muted);\">Effort Level:</span>\n <span style=\"color: var(--mj-text-secondary); font-weight: 500;\">{{ record.EffortLevel }}</span>\n </div>\n }\n </div>\n </div>\n <!-- Right: Action Buttons -->\n <div class=\"action-buttons\" style=\"display: flex; flex-direction: column; gap: 8px; align-items: flex-end;\">\n <div style=\"display: flex; gap: 8px;\">\n @if (record.ID) {\n <button mjButton variant=\"primary\" size=\"lg\"\n (click)=\"openTestHarness()\"\n title=\"Run AI Prompt Test Harness\">\n <i class=\"fa-solid fa-play\"></i> Run\n </button>\n }\n </div>\n @if (!canExecute && record.ID) {\n <div style=\"font-size: 0.75em; color: #dc3545; text-align: right; max-width: 200px;\">\n @if (record.Status !== 'Active') {\n • Prompt must be Active<br>\n }\n @if (!record.TemplateID) {\n • Template is required<br>\n }\n @if (!template && record.TemplateID) {\n • Template not found<br>\n }\n </div>\n }\n </div>\n </div>\n </div>\n <!-- Configuration Sections with Expansion Panels -->\n <div class=\"configuration-sections\" style=\"flex: 1; background: var(--mj-bg-surface-card); border-top: 2px solid var(--mj-border-default); padding: 16px; min-height: 0;\">\n <!-- Template Editor Section -->\n <mj-accordion-panel\n [Expanded]=\"true\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-code\" style=\"color: var(--mj-text-muted);\"></i>\n Template Editor\n @if (template) {\n <span style=\"color: var(--mj-text-muted); font-size: 0.9em; font-weight: normal;\">• {{ template.Name }}</span>\n }\n </span>\n </ng-template>\n <!-- Direct Content Projection -->\n <div class=\"template-section\" style=\"display: flex; flex-direction: column; min-height: 400px; padding: 8px;\">\n @if (isLoadingTemplate) {\n <div class=\"loading-state\" style=\"flex: 1; display: flex; align-items: center; justify-content: center; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-spinner fa-spin\" style=\"font-size: 24px; margin-right: 12px;\"></i>\n Loading template...\n </div>\n } @else if (!record.TemplateID) {\n <div class=\"no-template-state\" style=\"flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 40px; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-code\" style=\"font-size: 64px; margin-bottom: 20px; opacity: 0.3;\"></i>\n <h5 style=\"margin-bottom: 12px; color: var(--mj-text-secondary);\">No Template Associated</h5>\n <p style=\"margin-bottom: 24px; text-align: center; max-width: 400px;\">\n This AI prompt needs a template to define its structure and parameters.\n Create a new template or link to an existing one.\n </p>\n <div style=\"display: flex; gap: 12px;\">\n @if (UserCanCreateTemplates) {\n <button mjButton variant=\"primary\" (click)=\"createNewTemplate()\">\n <i class=\"fa-solid fa-plus\"></i> Create New Template\n </button>\n }\n @if (UserCanReadTemplates) {\n <button mjButton variant=\"outline\" (click)=\"linkExistingTemplate()\">\n <i class=\"fa-solid fa-link\"></i> Link Existing Template\n </button>\n }\n </div>\n </div>\n } @else if (templateNotFoundInDatabase) {\n <div class=\"invalid-template-state\" style=\"flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 40px; color: #dc3545;\">\n <i class=\"fa-solid fa-exclamation-triangle\" style=\"font-size: 64px; margin-bottom: 20px; opacity: 0.7;\"></i>\n <h5 style=\"margin-bottom: 12px;\">Template Not Found</h5>\n <p style=\"margin-bottom: 24px; text-align: center; max-width: 400px;\">\n The referenced template could not be loaded. It may have been deleted or moved.\n </p>\n <div style=\"display: flex; gap: 12px;\">\n <button mjButton variant=\"outline\" (click)=\"loadTemplate()\">\n <i class=\"fa-solid fa-refresh\"></i> Retry Loading\n </button>\n @if (UserCanCreateTemplates) {\n <button mjButton variant=\"primary\" (click)=\"createNewTemplate()\">\n <i class=\"fa-solid fa-plus\"></i> Create New Template\n </button>\n }\n </div>\n </div>\n } @else {\n <!-- Active Template Editor -->\n <div class=\"template-editor-container\" style=\"flex: 1; display: flex; flex-direction: column; min-height: 350px;\">\n <!-- Template Actions Bar -->\n @if (template && EditMode) {\n <div class=\"template-actions\" style=\"display: flex; gap: 8px; padding: 8px; border-bottom: 1px solid var(--mj-border-default); background: var(--mj-bg-surface-sunken);\">\n @if (UserCanUpdateTemplates) {\n <button mjButton\n variant=\"outline\"\n size=\"sm\"\n (click)=\"linkExistingTemplate()\"\n title=\"Change to a different template\">\n <i class=\"fa-solid fa-exchange-alt\"></i> Change Template\n </button>\n }\n @if (UserCanReadTemplates) {\n <button mjButton\n variant=\"outline\"\n size=\"sm\"\n (click)=\"openTemplateInNewWindow()\"\n title=\"Open template in new window\">\n <i class=\"fa-solid fa-external-link-alt\"></i> Open in New Window\n </button>\n }\n </div>\n }\n <!-- Template Editor -->\n <div style=\"flex: 1; background: var(--mj-bg-surface-card); border-radius: 6px; border: 1px solid var(--mj-border-default);\">\n <mj-template-editor\n #templateEditor\n [template]=\"template\"\n [config]=\"templateEditorConfig\"\n (contentChange)=\"onTemplateContentChange($event)\"\n (runTemplate)=\"onTemplateRun($event)\"\n style=\"display: block; min-height: 300px;\">\n </mj-template-editor>\n </div>\n </div>\n }\n </div>\n </mj-accordion-panel>\n <!-- Model Configuration Expansion Panel -->\n @if (record.IsSaved) {\n <mj-accordion-panel\n [Expanded]=\"true\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-microchip\" style=\"color: var(--mj-text-muted);\"></i>\n Models\n @if (promptModels.length > 0) {\n <span class=\"badge\" style=\"background: #17a2b8; color: white; padding: 2px 6px; border-radius: 10px; font-size: 0.7em;\">\n {{ promptModels.length }}\n </span>\n }\n <span style=\"color: var(--mj-text-muted); font-size: 0.8em; font-weight: normal; margin-left: 8px;\">\n <i class=\"fa-solid fa-info-circle\" title=\"Models are tried in order from top to bottom. The first available model will be used.\"></i>\n Priority order (first available model will be used)\n </span>\n </span>\n </ng-template>\n <!-- Direct Content Projection -->\n <div style=\"padding: 16px 0;\">\n <!-- Model Management Interface -->\n <div class=\"model-management\" style=\"border: 1px solid var(--mj-border-default); border-radius: 6px; background: var(--mj-bg-surface-sunken);\">\n @if (isLoadingModels) {\n <div class=\"loading-state\" style=\"padding: 20px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading models...\n </div>\n } @else {\n @if (promptModels.length === 0) {\n <div class=\"empty-state\" style=\"padding: 20px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-info-circle\"></i> No models configured\n @if (EditMode && UserCanCreatePromptModels) {\n <div style=\"margin-top: 10px;\">\n <button mjButton variant=\"outline\" size=\"sm\"\n (click)=\"addNewModel()\">\n <i class=\"fa-solid fa-plus\"></i> Add Model\n </button>\n </div>\n }\n </div>\n } @else {\n <!-- Priority explanation for multiple models -->\n @if (promptModels.length > 1) {\n <div style=\"padding: 12px 16px; background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface)); border-bottom: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-border-default)); color: var(--mj-brand-primary); font-size: 0.85em;\">\n <i class=\"fa-solid fa-info-circle\" style=\"margin-right: 6px;\"></i>\n Models are tried in priority order (highest priority first). The first available model that meets requirements will be used for execution.\n </div>\n }\n <!-- Column Headers -->\n <div class=\"model-header\" style=\"display: grid; grid-template-columns: 40px 2fr 1fr 1fr 1fr 60px; gap: 12px; padding: 12px 16px; background: var(--mj-bg-surface-sunken); font-weight: 600; font-size: 0.85em; color: var(--mj-text-secondary); border-bottom: 1px solid var(--mj-border-default);\">\n <div title=\"Priority order - models are tried from top to bottom\">\n <i class=\"fa-solid fa-sort\" style=\"color: var(--mj-text-muted);\"></i>\n </div>\n <div>AI Model <span style=\"color: #dc3545;\">*</span></div>\n <div>Vendor</div>\n <div>Configuration</div>\n <div>Created</div>\n <div>Actions</div>\n </div>\n @for (model of promptModels; track getModelTrackId(model) || $index; let i = $index) {\n <div class=\"model-row\"\n [draggable]=\"EditMode\"\n (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event)\"\n (drop)=\"onDrop($event, i)\"\n (dragend)=\"onDragEnd($event)\"\n [style.background]=\"!model.ModelID ? '#fff3cd' : (draggedIndex === i ? 'color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface))' : 'var(--mj-bg-surface-card)')\"\n [style.border-left]=\"!model.ModelID ? '3px solid #ffc107' : 'none'\"\n [style.opacity]=\"draggedIndex === i ? '0.5' : '1'\"\n style=\"display: grid; grid-template-columns: 40px 2fr 1fr 1fr 1fr 60px; gap: 12px; padding: 12px 16px; border-bottom: 1px solid var(--mj-border-default); align-items: start; transition: background 0.2s, opacity 0.2s;\">\n <!-- Drag Handle / Priority -->\n <div class=\"drag-handle\" style=\"display: flex; flex-direction: column; align-items: center; justify-content: center; color: var(--mj-text-muted);\">\n @if (EditMode) {\n <i class=\"fa-solid fa-grip-vertical\" title=\"Drag to reorder priority\" style=\"cursor: move;\"></i>\n <span style=\"font-size: 0.7em; margin-top: 2px;\">#{{ i + 1 }}</span>\n } @else {\n <span style=\"font-size: 0.9em; font-weight: 600;\" title=\"Priority {{ model.Priority }} - Higher priority numbers are tried first\">#{{ i + 1 }}</span>\n }\n </div>\n <!-- Model Selection -->\n <div class=\"model-select\">\n @if (EditMode) {\n <mj-dropdown [(ngModel)]=\"model.ModelID\"\n [name]=\"'modelId_' + getModelTrackId(model)\"\n [Data]=\"availableModels\"\n TextField=\"Name\"\n ValueField=\"ID\"\n [ValuePrimitive]=\"true\"\n [Filterable]=\"true\"\n Placeholder=\"Select a model...\"\n (ValueChange)=\"onModelChange($any($event), i)\"\n style=\"width: 100%;\">\n </mj-dropdown>\n } @else {\n <span style=\"font-weight: 500;\">{{ getModelDisplayName(model.ModelID) }}</span>\n }\n </div>\n <!-- Vendor -->\n <div class=\"model-vendor\">\n @if (EditMode) {\n @if (model.ModelID) {\n @if (shouldShowVendorDropdown(model.ModelID)) {\n <mj-dropdown [(ngModel)]=\"model.VendorID\"\n [name]=\"'vendorId_' + getModelTrackId(model)\"\n [Data]=\"getVendorsForModelSync(model.ModelID)\"\n TextField=\"Name\"\n ValueField=\"ID\"\n [ValuePrimitive]=\"true\"\n [Filterable]=\"true\"\n Placeholder=\"Select vendor...\"\n style=\"width: 100%;\">\n </mj-dropdown>\n } @else {\n <!-- Single vendor - just show the name -->\n @if (getVendorsForModelSync(model.ModelID).length === 1) {\n <span [style.color]=\"getVendorStatusColor(model.ModelID, getVendorsForModelSync(model.ModelID)[0].ID)\" style=\"font-size: 0.9em; font-weight: 500;\">\n {{ getVendorsForModelSync(model.ModelID)[0].Name }}\n @if (getModelVendorStatus(model.ModelID, getVendorsForModelSync(model.ModelID)[0].ID) !== 'Active') {\n <span style=\"font-size: 0.8em; margin-left: 4px;\">({{ getModelVendorStatus(model.ModelID, getVendorsForModelSync(model.ModelID)[0].ID) }})</span>\n }\n </span>\n } @else {\n <span style=\"color: var(--mj-text-muted); font-style: italic; font-size: 0.9em;\">No vendors available</span>\n }\n }\n } @else {\n <span style=\"color: var(--mj-text-muted); font-style: italic; font-size: 0.9em;\">Select model first</span>\n }\n } @else {\n @if (model.VendorID && model.ModelID) {\n <span [style.color]=\"getVendorStatusColor(model.ModelID, model.VendorID)\" style=\"font-size: 0.9em;\">\n {{ getVendorDisplayName(model.VendorID) }}\n @if (getModelVendorStatus(model.ModelID, model.VendorID) !== 'Active') {\n <span style=\"font-size: 0.8em; margin-left: 4px;\">({{ getModelVendorStatus(model.ModelID, model.VendorID) }})</span>\n }\n </span>\n } @else {\n <span style=\"color: var(--mj-text-muted); font-size: 0.9em;\">-</span>\n }\n }\n </div>\n <!-- Configuration -->\n <div class=\"model-configuration\">\n @if (EditMode) {\n @if (isLoadingConfigurations) {\n <div style=\"padding: 4px; color: var(--mj-text-muted); font-style: italic; font-size: 0.85em;\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading...\n </div>\n } @else {\n <mj-dropdown [(ngModel)]=\"model.ConfigurationID\"\n [name]=\"'configurationId_' + getModelTrackId(model)\"\n [Data]=\"availableConfigurations\"\n TextField=\"Name\"\n ValueField=\"ID\"\n [ValuePrimitive]=\"true\"\n [Filterable]=\"true\"\n Placeholder=\"Default\"\n (ValueChange)=\"onConfigurationChange($any($event), i)\"\n style=\"width: 100%;\">\n </mj-dropdown>\n }\n } @else {\n <span style=\"font-size: 0.9em;\">{{ getConfigurationDisplayName(model.ConfigurationID) }}</span>\n }\n </div>\n <!-- Created Date -->\n <div class=\"model-created\">\n @if (model.ID) {\n <span style=\"color: var(--mj-text-muted); font-size: 0.8em;\">{{ model.__mj_CreatedAt | date:'short' }}</span>\n } @else {\n <span style=\"color: #28a745; font-size: 0.8em; font-style: italic;\">New</span>\n }\n </div>\n <!-- Actions -->\n <div class=\"model-actions\" style=\"display: flex; gap: 2px; flex-direction: column;\">\n @if (EditMode) {\n <div style=\"display: flex; gap: 2px; margin-bottom: 4px;\">\n @if (UserCanUpdatePromptModels) {\n <button mjButton variant=\"flat\" size=\"sm\"\n (click)=\"moveModelUp(i)\"\n [disabled]=\"i === 0\"\n title=\"Move up\">\n <i class=\"fa-solid fa-chevron-up\"></i>\n </button>\n <button mjButton variant=\"flat\" size=\"sm\"\n (click)=\"moveModelDown(i)\"\n [disabled]=\"i === promptModels.length - 1\"\n title=\"Move down\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\n }\n </div>\n @if (UserCanDeletePromptModels) {\n <button mjButton variant=\"flat\" size=\"sm\"\n (click)=\"removePromptModel(i)\"\n title=\"Remove model\"\n style=\"color: var(--mj-status-error);\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n }\n </div>\n </div>\n <!-- Second row with additional details -->\n <div style=\"display: grid; grid-template-columns: 40px 1fr; gap: 12px; padding: 8px 16px; border-bottom: 1px solid var(--mj-border-default); background: var(--mj-bg-surface-sunken); font-size: 0.85em; color: var(--mj-text-muted);\">\n <div></div>\n <div>\n <!-- Basic model details -->\n <div style=\"display: flex; gap: 16px; flex-wrap: wrap; align-items: center; margin-bottom: 8px;\">\n @if (model.Status) {\n <span><strong>Status:</strong> {{ model.Status }}</span>\n }\n </div>\n <!-- Parallel execution fields when prompt is ModelSpecific -->\n @if (record.ParallelizationMode === 'ModelSpecific') {\n <div style=\"padding: 8px; background: var(--mj-bg-surface-card); border: 1px solid var(--mj-border-default); border-radius: 4px; margin-top: 8px;\">\n <div style=\"margin-bottom: 6px; font-weight: 600; color: var(--mj-text-secondary); font-size: 0.9em;\">\n <i class=\"fa-solid fa-layer-group\"></i> Model-Specific Parallel Execution\n </div>\n @if (EditMode) {\n <div style=\"display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 12px; align-items: center;\">\n <!-- Parallel Mode -->\n <div>\n <label style=\"display: block; margin-bottom: 2px; font-size: 0.8em; font-weight: 600; color: var(--mj-text-secondary);\">Parallel Mode</label>\n <mj-dropdown [(ngModel)]=\"model.ParallelizationMode\"\n [name]=\"'parallelMode_' + i\"\n [Data]=\"[{text: 'None', value: 'None'}, {text: 'Static Count', value: 'StaticCount'}, {text: 'Config Param', value: 'ConfigParam'}]\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n Placeholder=\"Select mode...\"\n style=\"width: 100%; font-size: 0.85em;\">\n </mj-dropdown>\n </div>\n <!-- Parallel Count (when StaticCount) -->\n @if (model.ParallelizationMode === 'StaticCount') {\n <div>\n <label style=\"display: block; margin-bottom: 2px; font-size: 0.8em; font-weight: 600; color: var(--mj-text-secondary);\">Parallel Count</label>\n <mj-numeric-input [(ngModel)]=\"model.ParallelCount\"\n [name]=\"'parallelCount_' + i\"\n [Min]=\"1\"\n [Step]=\"1\"\n [Format]=\"'n0'\"\n Placeholder=\"Count...\"\n style=\"width: 100%; font-size: 0.85em;\">\n </mj-numeric-input>\n </div>\n }\n <!-- Config Param (when ConfigParam) -->\n @if (model.ParallelizationMode === 'ConfigParam') {\n <div>\n <label style=\"display: block; margin-bottom: 2px; font-size: 0.8em; font-weight: 600; color: var(--mj-text-secondary);\">Config Parameter</label>\n <input type=\"text\" class=\"mj-input\" [(ngModel)]=\"model.ParallelConfigParam\"\n [name]=\"'parallelConfigParam_' + i\"\n placeholder=\"Parameter name...\"\n style=\"width: 100%; font-size: 0.85em;\" />\n </div>\n }\n </div>\n } @else {\n <!-- Read-only display -->\n <div style=\"display: flex; gap: 16px; flex-wrap: wrap; align-items: center;\">\n @if (model.ParallelizationMode) {\n <span><strong>Parallel Mode:</strong> {{ model.ParallelizationMode }}</span>\n }\n @if (model.ParallelCount) {\n <span><strong>Parallel Count:</strong> {{ model.ParallelCount }}</span>\n }\n @if (model.ParallelConfigParam) {\n <span><strong>Config Param:</strong> {{ model.ParallelConfigParam }}</span>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n @if (EditMode && UserCanCreatePromptModels) {\n <div class=\"add-model-row\" style=\"padding: 12px 16px; text-align: center; background: var(--mj-bg-surface-sunken); border-top: 1px solid var(--mj-border-default);\">\n <button mjButton variant=\"outline\" size=\"sm\"\n (click)=\"addNewModel()\"\n style=\"color: var(--mj-status-success); border-color: var(--mj-status-success);\">\n <i class=\"fa-solid fa-plus\"></i> Add Model\n </button>\n </div>\n }\n }\n }\n </div>\n </div>\n </mj-accordion-panel>\n }\n <!-- Advanced Configuration Expansion Panel -->\n <mj-accordion-panel\n [Expanded]=\"false\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-cogs\" style=\"color: var(--mj-text-muted);\"></i>\n Advanced Configuration\n </span>\n </ng-template>\n <!-- Direct Content Projection -->\n <div style=\"padding: 16px 0;\">\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 20px;\">\n <!-- Left Column -->\n <div>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ParallelizationMode\"\n Type=\"dropdownlist\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n @if (showParallelCount) {\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ParallelCount\"\n Type=\"numerictextbox\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n }\n @if (showParallelConfigParam) {\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ParallelConfigParam\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n }\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"OutputType\"\n Type=\"dropdownlist\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"EffortLevel\"\n Type=\"numerictextbox\"\n Caption=\"Effort Level (1-100)\"\n Description=\"Higher values request more thorough reasoning\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n </div>\n <!-- Right Column -->\n <div>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ValidationBehavior\"\n Type=\"dropdownlist\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"EnableCaching\"\n Type=\"checkbox\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n <!-- Result Selector Prompt with Tree Selector -->\n <div style=\"margin-bottom: 16px;\">\n <label style=\"display: block; margin-bottom: 4px; font-weight: 600; color: var(--mj-text-secondary); font-size: 0.9em;\">\n Result Selector Prompt\n </label>\n @if (EditMode) {\n @if (isLoadingResultSelectorData) {\n <div style=\"padding: 8px; color: var(--mj-text-muted); font-style: italic;\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading prompts...\n </div>\n } @else {\n <mj-dropdown\n [(ngModel)]=\"record.ResultSelectorPromptID\"\n name=\"resultSelectorPromptID\"\n [Data]=\"resultSelectorTreeData\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n [Filterable]=\"true\"\n Placeholder=\"Select a result selector prompt...\"\n style=\"width: 100%;\"\n (ValueChange)=\"onResultSelectorChange($any($event))\">\n </mj-dropdown>\n }\n } @else {\n <span style=\"color: var(--mj-text-secondary);\">{{ getPromptDisplayName(record.ResultSelectorPromptID || '') || 'None selected' }}</span>\n }\n </div>\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Prefill & Output Control Expansion Panel -->\n <mj-accordion-panel\n [Expanded]=\"false\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-wand-magic-sparkles\" style=\"color: var(--mj-text-muted);\"></i>\n Prefill & Output Control\n </span>\n </ng-template>\n <div style=\"padding: 16px 0;\">\n <p style=\"margin: 0 0 12px 0; font-size: 0.85em; color: var(--mj-text-muted);\">\n Assistant prefill seeds the model's response with an initial string, guiding output format and content. Stop sequences terminate generation when encountered.\n </p>\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 20px;\">\n <!-- Left Column -->\n <div>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"AssistantPrefill\"\n Type=\"textarea\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"StopSequences\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n </div>\n <!-- Right Column -->\n <div>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"PrefillFallbackMode\"\n Type=\"dropdownlist\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Template Parameters Expansion Panel -->\n @if (template && templateParams.length > 0) {\n <mj-accordion-panel\n [Expanded]=\"false\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-sliders\" style=\"color: var(--mj-text-muted);\"></i>\n Template Parameters\n <span class=\"badge\" style=\"background: var(--mj-brand-primary); color: white; padding: 2px 6px; border-radius: 10px; font-size: 0.7em;\">\n {{ templateParams.length }}\n </span>\n <span style=\"color: var(--mj-text-muted); font-size: 0.8em; font-weight: normal; margin-left: 8px;\">\n <i class=\"fa-solid fa-info-circle\" title=\"These parameters are defined in the template and will be available when executing this prompt\"></i>\n Parameters defined in the template\n </span>\n </span>\n </ng-template>\n <!-- Template Parameters Display -->\n <div style=\"padding: 16px 0;\">\n @if (isLoadingTemplateParams) {\n <div class=\"loading-state\" style=\"padding: 20px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading template parameters...\n </div>\n } @else if (templateParams.length === 0) {\n <div class=\"empty-state\" style=\"padding: 20px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-info-circle\"></i> This template has no parameters defined\n </div>\n } @else {\n <!-- Parameters Grid -->\n <div style=\"display: grid; gap: 12px;\">\n @for (param of templateParams; track param.ID) {\n <div class=\"parameter-card\"\n style=\"border: 1px solid var(--mj-border-default); border-radius: 8px; padding: 16px; background: var(--mj-bg-surface-sunken); transition: all 0.2s;\"\n [style.border-left]=\"'4px solid ' + getParamTypeColor(param.Type)\">\n <!-- Parameter Header -->\n <div style=\"display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 8px;\">\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <i [class]=\"'fa-solid ' + getParamTypeIcon(param.Type)\"\n [style.color]=\"getParamTypeColor(param.Type)\"\n style=\"font-size: 1.2em;\"></i>\n <h6 style=\"margin: 0; color: var(--mj-text-secondary); font-weight: 600;\">\n {{ param.Name }}\n @if (param.IsRequired) {\n <span style=\"color: #dc3545; font-size: 0.9em; margin-left: 4px;\">*</span>\n }\n </h6>\n </div>\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <span class=\"type-badge\"\n [style.background-color]=\"getParamTypeColor(param.Type)\"\n style=\"color: white; padding: 4px 8px; border-radius: 12px; font-size: 0.75em; font-weight: 500;\">\n {{ param.Type }}\n </span>\n @if (param.IsRequired) {\n <span style=\"color: #dc3545; font-size: 0.85em; font-weight: 500;\">Required</span>\n } @else {\n <span style=\"color: var(--mj-text-muted); font-size: 0.85em;\">Optional</span>\n }\n </div>\n </div>\n <!-- Parameter Description -->\n @if (param.Description) {\n <p style=\"margin: 0 0 8px 0; color: var(--mj-text-muted); font-size: 0.9em; line-height: 1.4;\">\n {{ param.Description }}\n </p>\n }\n <!-- Type-specific Information -->\n <div style=\"font-size: 0.85em; color: var(--mj-text-secondary);\">\n <span style=\"display: flex; align-items: center; gap: 4px; margin-bottom: 4px;\">\n <i class=\"fa-solid fa-info-circle\" style=\"color: var(--mj-text-muted);\"></i>\n {{ getParamTypeDescription(param) }}\n </span>\n </div>\n <!-- Additional Parameter Details -->\n <div style=\"display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 12px; margin-top: 12px;\">\n @if (param.DefaultValue) {\n <div style=\"background: var(--mj-bg-surface-card); padding: 8px 12px; border-radius: 4px; border: 1px solid var(--mj-border-default);\">\n <label style=\"display: block; font-size: 0.8em; color: var(--mj-text-muted); margin-bottom: 2px;\">Default Value</label>\n <code style=\"font-size: 0.85em; color: var(--mj-text-secondary); word-break: break-all;\">{{ param.DefaultValue }}</code>\n </div>\n }\n @if (param.EntityID) {\n <div style=\"background: var(--mj-bg-surface-card); padding: 8px 12px; border-radius: 4px; border: 1px solid var(--mj-border-default);\">\n <label style=\"display: block; font-size: 0.8em; color: var(--mj-text-muted); margin-bottom: 2px;\">Entity</label>\n <span style=\"font-size: 0.85em; color: var(--mj-text-secondary);\">{{ param.Entity || 'Entity ID: ' + param.EntityID }}</span>\n </div>\n }\n @if (param.LinkedParameterName) {\n <div style=\"background: var(--mj-bg-surface-card); padding: 8px 12px; border-radius: 4px; border: 1px solid var(--mj-border-default);\">\n <label style=\"display: block; font-size: 0.8em; color: var(--mj-text-muted); margin-bottom: 2px;\">Linked To</label>\n <span style=\"font-size: 0.85em; color: var(--mj-text-secondary);\">\n {{ param.LinkedParameterName }}\n @if (param.LinkedParameterField) {\n ({{ param.LinkedParameterField }})\n }\n </span>\n </div>\n }\n @if (param.ExtraFilter) {\n <div style=\"background: var(--mj-bg-surface-card); padding: 8px 12px; border-radius: 4px; border: 1px solid var(--mj-border-default);\">\n <label style=\"display: block; font-size: 0.8em; color: var(--mj-text-muted); margin-bottom: 2px;\">Filter</label>\n <code style=\"font-size: 0.8em; color: var(--mj-text-secondary); word-break: break-all;\">{{ param.ExtraFilter }}</code>\n </div>\n }\n @if (param.RecordID) {\n <div style=\"background: var(--mj-bg-surface-card); padding: 8px 12px; border-radius: 4px; border: 1px solid var(--mj-border-default);\">\n <label style=\"display: block; font-size: 0.8em; color: var(--mj-text-muted); margin-bottom: 2px;\">Record ID</label>\n <code style=\"font-size: 0.85em; color: var(--mj-text-secondary);\">{{ param.RecordID }}</code>\n </div>\n }\n </div>\n </div>\n }\n </div>\n <!-- Help Text -->\n <div style=\"margin-top: 16px; padding: 12px; background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface)); border-radius: 6px; border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-border-default));\">\n <div style=\"display: flex; align-items: flex-start; gap: 8px;\">\n <i class=\"fa-solid fa-lightbulb\" style=\"color: var(--mj-brand-primary); margin-top: 2px;\"></i>\n <div style=\"flex: 1; font-size: 0.85em; color: var(--mj-brand-primary); line-height: 1.5;\">\n <strong>Using Template Parameters:</strong> When executing this prompt, you'll be prompted to provide values for all required parameters.\n Parameters can be simple values (text, numbers) or complex data structures (JSON objects, database records, or entire entity collections).\n The template will use these parameters to generate dynamic content based on the values provided at execution time.\n </div>\n </div>\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n <!-- Output Example Expansion Panel (when OutputType = object) -->\n @if (showOutputExample) {\n <mj-accordion-panel\n [Expanded]=\"true\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-code\" style=\"color: var(--mj-text-muted);\"></i>\n Output Example (JSON)\n <span style=\"color: #dc3545; font-size: 0.8em; font-weight: normal;\">• Required for object output type</span>\n </span>\n </ng-template>\n <!-- Direct Content Projection -->\n <div style=\"padding: 16px;\">\n @if (EditMode) {\n <mj-code-editor\n [(ngModel)]=\"record.OutputExample\"\n name=\"outputExample\"\n language=\"json\"\n placeholder=\"Enter JSON example structure...\"\n style=\"width: 100%; height: 200px; border: 1px solid var(--mj-border-default); border-radius: 4px;\">\n </mj-code-editor>\n <div style=\"margin-top: 8px; color: var(--mj-text-muted); font-size: 0.85em;\">\n <i class=\"fa-solid fa-info-circle\"></i> Provide a JSON example that defines the expected structure for object output validation.\n </div>\n } @else if (record.OutputExample) {\n <div style=\"background: var(--mj-bg-surface-sunken); border: 1px solid var(--mj-border-default); border-radius: 4px; padding: 12px; font-family: 'Courier New', monospace; font-size: 0.9em; white-space: pre-wrap; overflow: auto; max-height: 250px;\">{{ record.OutputExample }}</div>\n } @else {\n <div style=\"background: #fff3cd; border: 1px solid #ffeaa7; border-radius: 4px; padding: 12px; color: #856404; text-align: center;\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i> Output example is required when output type is 'object'\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n <!-- Execution History Expansion Panel -->\n @if (record.IsSaved) {\n <mj-accordion-panel\n [Expanded]=\"false\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-history\" style=\"color: var(--mj-text-muted);\"></i>\n Execution History\n @if (executionHistory.length > 0) {\n <span style=\"color: var(--mj-text-muted); font-weight: normal;\">({{ executionHistory.length }})</span>\n }\n </span>\n </ng-template>\n <!-- Custom Execution History Viewer -->\n <div style=\"padding: 16px;\">\n @if (isLoadingHistory) {\n <div style=\"text-align: center; padding: 40px; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-spinner fa-spin\" style=\"font-size: 2em; margin-bottom: 12px;\"></i>\n <p>Loading execution history...</p>\n </div>\n } @else if (executionHistory.length === 0) {\n <div style=\"text-align: center; padding: 40px; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-history\" style=\"font-size: 3em; margin-bottom: 12px; opacity: 0.3;\"></i>\n <p>No execution history yet</p>\n <p style=\"font-size: 0.9em;\">Run this prompt to see execution history here</p>\n </div>\n } @else {\n <!-- Sort Controls -->\n <div style=\"display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px;\">\n <div style=\"color: var(--mj-text-muted); font-size: 0.9em;\">\n Showing {{ executionHistory.length }} executions\n </div>\n <div style=\"display: flex; gap: 8px; align-items: center;\">\n <span style=\"color: var(--mj-text-muted); font-size: 0.85em;\">Sort by:</span>\n <div class=\"mj-button-group\">\n <button mjButton\n [class.active]=\"historySortField === 'runAt'\"\n (click)=\"changeHistorySort('runAt')\"\n size=\"sm\">\n Date\n @if (historySortField === 'runAt') {\n <i [class]=\"'fa-solid fa-sort-' + (historySortDirection === 'asc' ? 'up' : 'down')\"\n style=\"margin-left: 4px; font-size: 0.8em;\"></i>\n }\n </button>\n <button mjButton\n [class.active]=\"historySortField === 'executionTime'\"\n (click)=\"changeHistorySort('executionTime')\"\n size=\"sm\">\n Duration\n @if (historySortField === 'executionTime') {\n <i [class]=\"'fa-solid fa-sort-' + (historySortDirection === 'asc' ? 'up' : 'down')\"\n style=\"margin-left: 4px; font-size: 0.8em;\"></i>\n }\n </button>\n <button mjButton\n [class.active]=\"historySortField === 'tokens'\"\n (click)=\"changeHistorySort('tokens')\"\n size=\"sm\">\n Tokens\n @if (historySortField === 'tokens') {\n <i [class]=\"'fa-solid fa-sort-' + (historySortDirection === 'asc' ? 'up' : 'down')\"\n style=\"margin-left: 4px; font-size: 0.8em;\"></i>\n }\n </button>\n <button mjButton\n [class.active]=\"historySortField === 'cost'\"\n (click)=\"changeHistorySort('cost')\"\n size=\"sm\">\n Cost\n @if (historySortField === 'cost') {\n <i [class]=\"'fa-solid fa-sort-' + (historySortDirection === 'asc' ? 'up' : 'down')\"\n style=\"margin-left: 4px; font-size: 0.8em;\"></i>\n }\n </button>\n </div>\n </div>\n </div>\n <!-- Execution History Table -->\n <div style=\"border: 1px solid var(--mj-border-default); border-radius: 8px; overflow: hidden;\">\n <table style=\"width: 100%; border-collapse: collapse;\">\n <thead>\n <tr style=\"background: var(--mj-bg-surface-sunken); border-bottom: 2px solid var(--mj-border-default);\">\n <th style=\"padding: 12px; text-align: left; font-weight: 600; color: var(--mj-text-secondary);\">Status</th>\n <th style=\"padding: 12px; text-align: left; font-weight: 600; color: var(--mj-text-secondary);\">Date & Time</th>\n <th style=\"padding: 12px; text-align: left; font-weight: 600; color: var(--mj-text-secondary);\">Model</th>\n <th style=\"padding: 12px; text-align: left; font-weight: 600; color: var(--mj-text-secondary);\">Duration</th>\n <th style=\"padding: 12px; text-align: right; font-weight: 600; color: var(--mj-text-secondary);\">Tokens</th>\n <th style=\"padding: 12px; text-align: right; font-weight: 600; color: var(--mj-text-secondary);\">Cost</th>\n <th style=\"padding: 12px; text-align: center; font-weight: 600; color: var(--mj-text-secondary);\">Type</th>\n <th style=\"padding: 12px; text-align: center; font-weight: 600; color: var(--mj-text-secondary);\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (run of executionHistory; track run.ID; let i = $index) {\n <tr class=\"history-row\"\n [class.even-row]=\"i % 2 === 0\"\n style=\"border-bottom: 1px solid var(--mj-border-default);\">\n <td style=\"padding: 12px;\">\n <span style=\"display: flex; align-items: center; gap: 6px;\">\n <i [class]=\"'fa-solid ' + getExecutionStatusIcon(run.Success)\"\n [style.color]=\"getExecutionStatusColor(run.Success)\"></i>\n <span [style.color]=\"getExecutionStatusColor(run.Success)\" style=\"font-weight: 500;\">\n {{ run.Success === true ? 'Success' : run.Success === false ? 'Failed' : 'Running' }}\n </span>\n </span>\n </td>\n <td style=\"padding: 12px; color: var(--mj-text-secondary);\">\n {{ run.RunAt | date:'short' }}\n </td>\n <td style=\"padding: 12px; color: var(--mj-text-secondary);\">\n <span style=\"display: flex; align-items: center; gap: 6px;\">\n <i class=\"fa-solid fa-microchip\" style=\"color: var(--mj-text-muted);\"></i>\n {{ run.Model || 'Unknown' }}\n </span>\n </td>\n <td style=\"padding: 12px; color: var(--mj-text-secondary);\">\n {{ formatDuration(run.ExecutionTimeMS) }}\n </td>\n <td style=\"padding: 12px; text-align: right; color: var(--mj-text-secondary);\">\n {{ formatTokens(run.TokensUsed) }}\n </td>\n <td style=\"padding: 12px; text-align: right; color: var(--mj-text-secondary);\">\n {{ formatCost(run.TotalCost || run.Cost) }}\n </td>\n <td style=\"padding: 12px; text-align: center;\">\n @if (run.RunType) {\n <span style=\"padding: 4px 8px; border-radius: 12px; background: var(--mj-bg-surface-sunken); \n color: var(--mj-text-secondary); font-size: 0.85em; font-weight: 500;\">\n {{ run.RunType }}\n </span>\n }\n </td>\n <td style=\"padding: 12px; text-align: center;\">\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"navigateToPromptRun(run.ID)\"\n title=\"View details\">\n <i class=\"fa-solid fa-external-link\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n <!-- Cache Expansion Panel -->\n @if (record.IsSaved && record.EnableCaching) {\n <mj-accordion-panel\n [Expanded]=\"false\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-database\" style=\"color: var(--mj-text-muted);\"></i>\n Result Cache\n </span>\n </ng-template>\n <!-- Direct Content Projection -->\n <div style=\"padding: 16px 0;\">\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: AI Result Cache','AIPromptID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: AI Result Cache')\"\n [AllowLoad]=\"true\"\n [ShowToolbar]=\"false\">\n </mj-explorer-entity-data-grid>\n </div>\n </mj-accordion-panel>\n }\n <!-- Related Items Expansion Panel -->\n @if (record.IsSaved) {\n <mj-accordion-panel\n [Expanded]=\"false\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-link\" style=\"color: var(--mj-text-muted);\"></i>\n Related Items\n </span>\n </ng-template>\n <!-- Direct Content Projection -->\n <div style=\"padding: 16px 0;\">\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 20px;\">\n <!-- AI Agents -->\n <div>\n <h6 style=\"margin: 0 0 12px 0; color: var(--mj-text-secondary);\">AI Agents Using This Prompt</h6>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: AI Agent Prompts','PromptID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: AI Agent Prompts')\"\n [AllowLoad]=\"true\"\n [ShowToolbar]=\"false\">\n </mj-explorer-entity-data-grid>\n </div>\n <!-- Result Selector References -->\n <div>\n <h6 style=\"margin: 0 0 12px 0; color: var(--mj-text-secondary);\">Prompts Using This as Result Selector</h6>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: AI Prompts','ResultSelectorPromptID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: AI Prompts')\"\n [AllowLoad]=\"true\"\n [ShowToolbar]=\"false\">\n </mj-explorer-entity-data-grid>\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n }\n </div>\n </div>\n </form>\n</mj-record-form-container>\n}\n\n\n<!-- AI Prompt Test Harness -->\n@if (showTestHarness) {\n <mj-window\n [Width]=\"1200\"\n [Height]=\"800\"\n [MinWidth]=\"800\"\n [MinHeight]=\"600\"\n [Draggable]=\"true\"\n [Resizable]=\"true\"\n [Visible]=\"true\"\n (Close)=\"onTestHarnessVisibilityChanged(false)\"\n [Title]=\"'Run AI Prompt - ' + (record.Name || 'Untitled')\">\n <mj-ai-test-harness\n [entity]=\"record\"\n [mode]=\"'prompt'\"\n [isVisible]=\"showTestHarness\"\n (visibilityChange)=\"onTestHarnessVisibilityChanged($event)\">\n </mj-ai-test-harness>\n </mj-window>\n}"]}
|