@memberjunction/ng-core-entity-forms 6.2.0-edge.4 → 6.2.0-edge.5
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/custom/AIAgents/ai-agent-form.component.d.ts +7 -0
- package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js +31 -17
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts +7 -1
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +191 -178
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
- package/dist/lib/custom/AIPromptRuns/prompt-run-data-capture-note.component.d.ts +48 -0
- package/dist/lib/custom/AIPromptRuns/prompt-run-data-capture-note.component.d.ts.map +1 -0
- package/dist/lib/custom/AIPromptRuns/prompt-run-data-capture-note.component.js +195 -0
- package/dist/lib/custom/AIPromptRuns/prompt-run-data-capture-note.component.js.map +1 -0
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +324 -322
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
- package/dist/lib/custom/RecordProcesses/record-process-form.component.d.ts.map +1 -1
- package/dist/lib/custom/RecordProcesses/record-process-form.component.js +6 -3
- package/dist/lib/custom/RecordProcesses/record-process-form.component.js.map +1 -1
- package/dist/lib/custom/SearchScopes/searchscope-form.component.d.ts +3 -3
- package/dist/lib/custom/SearchScopes/searchscope-form.component.d.ts.map +1 -1
- package/dist/lib/custom/SearchScopes/searchscope-form.component.js +5 -7
- package/dist/lib/custom/SearchScopes/searchscope-form.component.js.map +1 -1
- 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 +8 -8
- 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-step-detail.component.d.ts +37 -5
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js +155 -79
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts +8 -0
- 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 +59 -8
- 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.d.ts +34 -9
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +164 -43
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/run-tree-timeline-projection.js +3 -1
- package/dist/lib/custom/ai-agent-run/run-tree-timeline-projection.js.map +1 -1
- package/dist/lib/custom/custom-forms.module.d.ts +82 -80
- package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
- package/dist/lib/custom/custom-forms.module.js +10 -0
- package/dist/lib/custom/custom-forms.module.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js +65 -47
- package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js +115 -117
- package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.js +64 -24
- package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.js +74 -52
- package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentSessionRecordingShard/mjaiagentsessionrecordingshard.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJAIAgentSessionRecordingShard/mjaiagentsessionrecordingshard.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJAIAgentSessionRecordingShard/mjaiagentsessionrecordingshard.form.component.js +86 -0
- package/dist/lib/generated/Entities/MJAIAgentSessionRecordingShard/mjaiagentsessionrecordingshard.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJAIAgentUserPolicy/mjaiagentuserpolicy.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJAIAgentUserPolicy/mjaiagentuserpolicy.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJAIAgentUserPolicy/mjaiagentuserpolicy.form.component.js +132 -0
- package/dist/lib/generated/Entities/MJAIAgentUserPolicy/mjaiagentuserpolicy.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJAIBridgeAgentIdentity/mjaibridgeagentidentity.form.component.js +12 -10
- package/dist/lib/generated/Entities/MJAIBridgeAgentIdentity/mjaibridgeagentidentity.form.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 +86 -32
- package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIPersona/mjaipersona.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIPersona/mjaipersona.form.component.js +25 -7
- package/dist/lib/generated/Entities/MJAIPersona/mjaipersona.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.js +180 -160
- package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJActionParam/mjactionparam.form.component.js +16 -14
- package/dist/lib/generated/Entities/MJActionParam/mjactionparam.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJArchiveConfiguration/mjarchiveconfiguration.form.component.js +23 -21
- package/dist/lib/generated/Entities/MJArchiveConfiguration/mjarchiveconfiguration.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJArchiveRun/mjarchiverun.form.component.js +21 -19
- package/dist/lib/generated/Entities/MJArchiveRun/mjarchiverun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJCommunicationProvider/mjcommunicationprovider.form.component.js +30 -20
- package/dist/lib/generated/Entities/MJCommunicationProvider/mjcommunicationprovider.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.js +69 -75
- package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.js +35 -17
- package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJFeaturePipelineVersion/mjfeaturepipelineversion.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJFeaturePipelineVersion/mjfeaturepipelineversion.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJFeaturePipelineVersion/mjfeaturepipelineversion.form.component.js +130 -0
- package/dist/lib/generated/Entities/MJFeaturePipelineVersion/mjfeaturepipelineversion.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJFeatureValue/mjfeaturevalue.form.component.js +26 -14
- package/dist/lib/generated/Entities/MJFeatureValue/mjfeaturevalue.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJFeatureValueCache/mjfeaturevaluecache.form.component.js +23 -19
- package/dist/lib/generated/Entities/MJFeatureValueCache/mjfeaturevaluecache.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.js +29 -27
- package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJProcessRunDetail/mjprocessrundetail.form.component.js +17 -15
- package/dist/lib/generated/Entities/MJProcessRunDetail/mjprocessrundetail.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.js +27 -9
- package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJTest/mjtest.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJTest/mjtest.form.component.js +24 -6
- package/dist/lib/generated/Entities/MJTest/mjtest.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJTestRun/mjtestrun.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJTestRun/mjtestrun.form.component.js +29 -11
- package/dist/lib/generated/Entities/MJTestRun/mjtestrun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJTheme/mjtheme.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJTheme/mjtheme.form.component.js +13 -3
- package/dist/lib/generated/Entities/MJTheme/mjtheme.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +176 -122
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJUserRoutine/mjuserroutine.form.component.js +31 -25
- package/dist/lib/generated/Entities/MJUserRoutine/mjuserroutine.form.component.js.map +1 -1
- package/dist/lib/generated/generated-forms.module.d.ts +129 -126
- package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
- package/dist/lib/generated/generated-forms.module.js +9 -0
- package/dist/lib/generated/generated-forms.module.js.map +1 -1
- package/dist/lib/panels/feature-values/feature-values.logic.d.ts +55 -0
- package/dist/lib/panels/feature-values/feature-values.logic.d.ts.map +1 -0
- package/dist/lib/panels/feature-values/feature-values.logic.js +88 -0
- package/dist/lib/panels/feature-values/feature-values.logic.js.map +1 -0
- package/dist/lib/panels/feature-values/feature-values.panel.d.ts +39 -0
- package/dist/lib/panels/feature-values/feature-values.panel.d.ts.map +1 -0
- package/dist/lib/panels/feature-values/feature-values.panel.js +303 -0
- package/dist/lib/panels/feature-values/feature-values.panel.js.map +1 -0
- package/dist/lib/shared/components/template-editor.component.js +2 -2
- package/dist/lib/shared/components/template-editor.component.js.map +1 -1
- package/dist/public-api.d.ts +1 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +1 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +48 -48
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"searchscope-form.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/SearchScopes/searchscope-form.component.ts","../../../../src/lib/custom/SearchScopes/searchscope-form.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * Custom SearchScope form (P2D.7 Angular half).\n *\n * Adds a \"Reranker\" custom section that:\n * - Renders a dropdown of registered rerankers — currently a hardcoded list\n * mirroring `BaseReRanker.GetAvailableRerankers()` server-side, with each\n * option's HasCost flag surfaced inline so authors can see at a glance\n * which options will incur API spend.\n * - Reads / writes the current selection from `record.ScopeConfig` JSON's\n * `reRanker.driverClass` key — same path the SearchEngine reads at runtime.\n *\n * **Discovery follow-up:** the canonical source of available rerankers is\n * `BaseReRanker.GetAvailableRerankers()` in `@memberjunction/search-engine`,\n * but that's a Node-only package and can't be imported in the browser.\n * A small GraphQL query (e.g. `AvailableRerankers`) on MJServer that calls\n * the helper server-side would let this dropdown auto-discover any\n * third-party reranker registered with ClassFactory. Tracked as a follow-up\n * — for now the hardcoded list covers the 5 rerankers shipped in Phase 2D.\n *\n * The CodeGen-generated `RerankerBudgetCents` numeric input is already on\n * the form (in the \"Details\" section); we don't need to recreate it.\n * The dropdown above + budget input below give scope authors the full\n * Phase 2D configuration surface.\n */\nimport { Component, OnDestroy } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { LogError, RunView } from '@memberjunction/core';\nimport { MJSearchScopeEntity, MJSearchExecutionLogEntityType } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseFormComponent } from '@memberjunction/ng-base-forms';\nimport { SearchService, SearchResultItem, StreamingProviderStatus } from '@memberjunction/ng-search';\nimport { MJSearchScopeFormComponent } from '../../generated/Entities/MJSearchScope/mjsearchscope.form.component';\n\ninterface FusionWeightRow {\n /** Source-type key the SearchEngine matches against (e.g. 'vector', 'fulltext'). */\n Key: string;\n /** Friendly label for the slider — same value as Key today, kept separate for future i18n. */\n Label: string;\n /** Working value of the slider (1-decimal precision) — bound via two-way. */\n Weight: number;\n}\n\n/**\n * Built-in source types the SearchEngine ships. New 3rd-party provider\n * SourceTypes (e.g. external clusters) won't appear here unless the scope\n * author adds them via the JSON Scope Config block — by design, since the\n * fusion-weights UI is for the four canonical built-ins.\n */\nconst BUILT_IN_SOURCE_TYPES: string[] = ['vector', 'fulltext', 'entity', 'storage'];\n\ninterface RerankerOption {\n DriverClass: string;\n Name: string;\n HasCost: boolean;\n}\n\n/**\n * Hardcoded list mirroring the rerankers `@memberjunction/search-engine`\n * registers with ClassFactory. Update when adding a new built-in reranker\n * or when the GraphQL discovery query lands.\n */\nconst BUILT_IN_RERANKERS: RerankerOption[] = [\n { DriverClass: 'NoopReRanker', Name: 'NoopReRanker (pass-through)', HasCost: false },\n { DriverClass: 'CohereReRanker', Name: 'Cohere (rerank-v3.5)', HasCost: true },\n { DriverClass: 'VoyageReRanker', Name: 'Voyage (rerank-2)', HasCost: true },\n { DriverClass: 'OpenAIReRanker', Name: 'OpenAI (gpt-4o-mini judge)', HasCost: true },\n { DriverClass: 'BGEReRanker', Name: 'BGE (local, free)', HasCost: false },\n];\n\n@RegisterClass(BaseFormComponent, 'MJ: Search Scopes')\n@Component({\n standalone: false,\n selector: 'mj-searchscope-form-extended',\n templateUrl: './searchscope-form.component.html',\n styleUrls: ['./searchscope-form.component.css'],\n})\nexport class MJSearchScopeFormComponentExtended extends MJSearchScopeFormComponent implements OnDestroy {\n public override record!: MJSearchScopeEntity;\n\n public readonly AvailableRerankers: RerankerOption[] = BUILT_IN_RERANKERS;\n\n /** Live-preview state (P4.1). */\n public PreviewQuery = '';\n public PreviewIsRunning = false;\n public PreviewResults: SearchResultItem[] = [];\n public PreviewProviders: StreamingProviderStatus[] = [];\n public PreviewElapsedMs: number | null = null;\n public PreviewError: string | null = null;\n private previewSubscription: Subscription | null = null;\n private searchService = new SearchService();\n\n /**\n * P4.3 — A/B comparison via Kendall-tau between consecutive preview runs.\n * After RunPreview completes, the previous run's RecordIDs are diffed\n * against the current run and the rank-correlation similarity is shown\n * inline (\"82% similar to last run\"). Authors use this to immediately\n * see how much a reranker swap or fusion-weight tweak shifted the ranking.\n */\n private previousRunRecordIDs: string[] = [];\n public LastRunSimilarityPercent: number | null = null;\n\n public override ngOnDestroy(): void {\n super.ngOnDestroy();\n this.previewSubscription?.unsubscribe();\n this.previewSubscription = null;\n }\n\n /**\n * P4.1 — run a streaming preview against this scope. Uses the same\n * SearchService.StreamSearch path the production search UI uses, scoped\n * to just this scope's ID. Renders progressively as each provider\n * reports back so authors can see chip-by-chip what each tuning change\n * actually affects.\n */\n public RunPreview(): void {\n if (!this.record?.ID || this.PreviewIsRunning) return;\n const query = this.PreviewQuery.trim();\n if (!query) return;\n\n // Tear down any previous run before starting a new one.\n this.previewSubscription?.unsubscribe();\n this.PreviewIsRunning = true;\n this.PreviewResults = [];\n this.PreviewProviders = [];\n this.PreviewElapsedMs = null;\n this.PreviewError = null;\n\n this.previewSubscription = this.searchService.StreamSearch({\n Query: query,\n MaxResults: 25,\n ActiveFilters: {},\n IncludeSources: ['vector', 'fulltext', 'entity', 'storage'],\n ScopeIDs: [this.record.ID],\n }).subscribe({\n next: (event) => {\n if (event.Phase === 'provider' && event.ProviderName) {\n this.PreviewProviders = [\n ...this.PreviewProviders,\n {\n Name: event.ProviderName,\n Count: event.Results?.length ?? 0,\n ElapsedMs: event.ElapsedMs ?? 0,\n State: 'Completed',\n },\n ];\n if (event.Results) {\n this.PreviewResults = [...this.PreviewResults, ...event.Results].sort((a, b) => b.Score - a.Score);\n }\n } else if (event.Phase === 'final' && event.Results) {\n this.PreviewResults = [...event.Results].sort((a, b) => b.Score - a.Score);\n this.PreviewElapsedMs = event.ElapsedMs ?? null;\n }\n },\n error: (err: Error) => {\n this.PreviewError = err.message ?? String(err);\n this.PreviewIsRunning = false;\n },\n complete: () => {\n this.PreviewIsRunning = false;\n // Compute Kendall-tau against the prior run, then capture this\n // run's order as the next baseline.\n const currentIDs = this.PreviewResults.map(r => r.RecordID);\n if (this.previousRunRecordIDs.length > 0 && currentIDs.length > 0) {\n const tau = MJSearchScopeFormComponentExtended.kendallTauOnSharedItems(\n this.previousRunRecordIDs,\n currentIDs,\n );\n if (tau !== null) {\n // Map [-1, 1] tau onto a [0, 100] \"% similar\" gauge so non-stats\n // authors can read it. -1 (reverse) = 0%, 0 (uncorrelated) = 50%,\n // +1 (identical) = 100%.\n this.LastRunSimilarityPercent = Math.round((tau + 1) * 50);\n }\n }\n this.previousRunRecordIDs = currentIDs;\n },\n });\n }\n\n public CancelPreview(): void {\n this.previewSubscription?.unsubscribe();\n this.previewSubscription = null;\n this.PreviewIsRunning = false;\n }\n\n /**\n * Compute Kendall-tau rank correlation on the items present in both lists.\n * Items only in one list are ignored (partial-overlap handling). Returns\n * null when the shared overlap is too small (< 2 items) to be meaningful.\n *\n * Tau formula: (concordant - discordant) / (N * (N-1) / 2)\n * where concordant = pairs ranked in the same order in both lists,\n * discordant = pairs ranked in opposite order, N = shared item count.\n */\n private static kendallTauOnSharedItems(listA: string[], listB: string[]): number | null {\n const rankA = new Map(listA.map((id, i) => [id, i]));\n const rankB = new Map(listB.map((id, i) => [id, i]));\n const shared = listA.filter(id => rankB.has(id));\n const n = shared.length;\n if (n < 2) return null;\n let concordant = 0;\n let discordant = 0;\n for (let i = 0; i < n; i++) {\n for (let j = i + 1; j < n; j++) {\n const a = (rankA.get(shared[i])! - rankA.get(shared[j])!);\n const b = (rankB.get(shared[i])! - rankB.get(shared[j])!);\n const product = a * b;\n if (product > 0) concordant++;\n else if (product < 0) discordant++;\n // Ties (product === 0) ignored — items at same rank\n }\n }\n const totalPairs = (n * (n - 1)) / 2;\n if (totalPairs === 0) return null;\n return (concordant - discordant) / totalPairs;\n }\n\n /**\n * Override the section list to include the new \"Reranker\" section before\n * \"Details\". The generated `initSections()` doesn't know about our custom\n * section so we replace the list. Order matches the template's render order.\n */\n public override async ngOnInit(): Promise<void> {\n await super.ngOnInit();\n this.initSections([\n { sectionKey: 'scopeDefinition', sectionName: 'Scope Definition', isExpanded: true },\n { sectionKey: 'scopeConfiguration', sectionName: 'Scope Configuration', isExpanded: true },\n { sectionKey: 'accessControl', sectionName: 'Access Control', isExpanded: false },\n { sectionKey: 'lifecycleManagement', sectionName: 'Lifecycle Management', isExpanded: false },\n { sectionKey: 'technicalConfiguration', sectionName: 'Technical Configuration', isExpanded: false },\n { sectionKey: 'fusionWeights', sectionName: 'Fusion Weights', isExpanded: false },\n { sectionKey: 'reranker', sectionName: 'Reranker', isExpanded: false },\n { sectionKey: 'livePreview', sectionName: 'Live Preview', isExpanded: false },\n { sectionKey: 'details', sectionName: 'Details', isExpanded: false },\n { sectionKey: 'systemMetadata', sectionName: 'System Metadata', isExpanded: false },\n { sectionKey: 'mJSearchScopeTestQueries', sectionName: 'Search Scope Test Queries', isExpanded: false },\n { sectionKey: 'mJSearchScopeStorageAccounts', sectionName: 'Search Scope Storage Accounts', isExpanded: false },\n { sectionKey: 'mJSearchScopeEntities', sectionName: 'Search Scope Entities', isExpanded: false },\n { sectionKey: 'mJSearchScopeExternalIndexes', sectionName: 'Search Scope External Indexes', isExpanded: false },\n { sectionKey: 'mJSearchScopeProviders', sectionName: 'Search Scope Providers', isExpanded: false },\n { sectionKey: 'mJAIAgentSearchScopes', sectionName: 'AI Agent Search Scopes', isExpanded: false },\n { sectionKey: 'mJSearchScopePermissions', sectionName: 'Search Scope Permissions', isExpanded: false },\n ]);\n }\n\n /**\n * Currently-selected reranker driver class, parsed from `record.ScopeConfig`.\n * Empty string means \"no reranker explicitly chosen\" — runtime defaults\n * to NoopReRanker. Stored as `ScopeConfig.reRanker.driverClass`.\n */\n public get SelectedRerankerDriverClass(): string {\n const cfg = this.parseScopeConfig();\n return (cfg?.['reRanker'] as { driverClass?: string } | undefined)?.driverClass ?? '';\n }\n\n public set SelectedRerankerDriverClass(value: string) {\n const cfg = this.parseScopeConfig() ?? {};\n const reRanker = (cfg['reRanker'] as Record<string, unknown> | undefined) ?? {};\n if (value && value.trim().length > 0) {\n reRanker['driverClass'] = value;\n } else {\n delete reRanker['driverClass'];\n }\n cfg['reRanker'] = reRanker;\n this.record.ScopeConfig = JSON.stringify(cfg, null, 2);\n }\n\n /**\n * Whether the currently-selected reranker incurs API cost — used to render\n * an inline cost-warning indicator next to the dropdown.\n */\n public get SelectedRerankerHasCost(): boolean {\n const driver = this.SelectedRerankerDriverClass;\n return BUILT_IN_RERANKERS.find(r => r.DriverClass === driver)?.HasCost ?? false;\n }\n\n /**\n * Whether the CSV export is currently running. Drives the button's disabled\n * state + spinner.\n */\n public IsExportingTuningCsv = false;\n\n /**\n * P4.2 — fusion weight sliders for each canonical SearchEngine source type.\n * Backed by `SearchScope.ScopeConfig.fusionWeights` JSON (the runtime path\n * — see plans/search-scopes-rag-plus/RAG_plan.md §8 Multi-Scope RRF Fusion). Plan task originally\n * proposed `SearchScopeProvider.Weight` but that column doesn't exist in\n * Phase 1; the JSON path is the actual contract the SearchEngine reads.\n */\n private _fusionWeights: FusionWeightRow[] | null = null;\n\n public get FusionWeights(): FusionWeightRow[] {\n if (!this._fusionWeights) {\n const cfg = this.parseScopeConfig();\n const stored = (cfg?.['fusionWeights'] as Record<string, unknown> | undefined) ?? {};\n this._fusionWeights = BUILT_IN_SOURCE_TYPES.map(key => {\n const value = stored[key];\n const weight = typeof value === 'number' && Number.isFinite(value) ? value : 1;\n return { Key: key, Label: key, Weight: weight };\n });\n }\n return this._fusionWeights;\n }\n\n /**\n * Persist a fusion weight change back to `ScopeConfig.fusionWeights`. The\n * caller is the slider's `(change)` event so writes happen only on\n * slide-end, not on every drag tick.\n */\n public OnFusionWeightChanged(row: FusionWeightRow, raw: number | string): void {\n const value = typeof raw === 'number' ? raw : Number(raw);\n if (!Number.isFinite(value)) return;\n row.Weight = value;\n\n const cfg = this.parseScopeConfig() ?? {};\n const weights = (cfg['fusionWeights'] as Record<string, unknown> | undefined) ?? {};\n if (Math.abs(value - 1) < 0.001) {\n // Default value — drop the explicit override so future engine-default\n // changes flow through naturally.\n delete weights[row.Key];\n } else {\n weights[row.Key] = +value.toFixed(2);\n }\n if (Object.keys(weights).length > 0) {\n cfg['fusionWeights'] = weights;\n } else {\n delete cfg['fusionWeights'];\n }\n this.record.ScopeConfig = JSON.stringify(cfg, null, 2);\n }\n\n /**\n * P3.4 — export the last 500 SearchExecutionLog rows for this scope as CSV.\n * Used by scope authors for offline tuning analysis (open in a spreadsheet,\n * pivot by reranker / status / latency, etc.). Filtered to this scope's ID\n * so multi-tenant deployments don't leak other scopes' query history.\n */\n public async ExportTuningCsv(): Promise<void> {\n if (!this.record?.ID || this.IsExportingTuningCsv) return;\n this.IsExportingTuningCsv = true;\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJSearchExecutionLogEntityType>({\n EntityName: 'MJ: Search Execution Logs',\n // Constrain to the columns the CSV writer actually emits — avoids\n // pulling the wider entity (per Section 6.8).\n Fields: [\n '__mj_CreatedAt', 'Status', 'Query', 'ResultCount', 'TotalDurationMs',\n 'RerankerName', 'RerankerCostCents', 'FailureReason', 'UserID', 'AIAgentID',\n ],\n ExtraFilter: `SearchScopeID='${this.record.ID.replace(/'/g, \"''\")}'`,\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 500,\n ResultType: 'simple',\n });\n if (!result.Success) {\n LogError(`SearchScope CSV export failed: ${result.ErrorMessage ?? 'unknown error'}`);\n return;\n }\n const rows = (result.Results ?? []) as MJSearchExecutionLogEntityType[];\n this.downloadCsv(rows);\n } finally {\n this.IsExportingTuningCsv = false;\n }\n }\n\n private downloadCsv(rows: MJSearchExecutionLogEntityType[]): void {\n const headers = [\n 'CreatedAt', 'Status', 'Query', 'ResultCount', 'TotalDurationMs',\n 'RerankerName', 'RerankerCostCents', 'FailureReason', 'UserID', 'AIAgentID',\n ];\n const lines = [headers.join(',')];\n for (const r of rows) {\n const cells = [\n this.escapeCsv(String(r.__mj_CreatedAt ?? '')),\n this.escapeCsv(String(r.Status ?? '')),\n this.escapeCsv(String(r.Query ?? '')),\n String(r.ResultCount ?? 0),\n String(r.TotalDurationMs ?? 0),\n this.escapeCsv(String(r.RerankerName ?? '')),\n String(r.RerankerCostCents ?? ''),\n this.escapeCsv(String(r.FailureReason ?? '')),\n String(r.UserID ?? ''),\n String(r.AIAgentID ?? ''),\n ];\n lines.push(cells.join(','));\n }\n const blob = new Blob([lines.join('\\n')], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.setAttribute('href', url);\n const name = (this.record?.Name ?? 'scope').replace(/[^\\w\\-]+/g, '_');\n link.setAttribute('download', `searchscope-tuning-${name}-${new Date().toISOString().split('T')[0]}.csv`);\n link.style.visibility = 'hidden';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n }\n\n private escapeCsv(value: string): string {\n if (value == null) return '';\n // Quote when the value contains a comma, quote, newline, or starts with\n // formula-injection characters. Inside a quoted value, escape inner\n // quotes by doubling.\n if (/[\",\\n\\r]/.test(value) || /^[=+\\-@]/.test(value)) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n }\n\n private parseScopeConfig(): Record<string, unknown> | null {\n if (!this.record?.ScopeConfig) return null;\n try {\n const parsed = JSON.parse(this.record.ScopeConfig);\n return (parsed && typeof parsed === 'object') ? parsed as Record<string, unknown> : null;\n } catch {\n return null;\n }\n }\n}\n\nexport function LoadMJSearchScopeFormComponentExtended(): void {\n // Tree-shake prevention; called from custom-forms.module's LoadCoreCustomForms()\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const _ref = MJSearchScopeFormComponentExtended;\n}\n","<mj-record-form-container [Record]=\"record\" [FormComponent]=\"this\"\n (Navigate)=\"OnFormNavigate($event)\"\n (DeleteRequested)=\"OnDeleteRequested()\"\n (FavoriteToggled)=\"OnFavoriteToggled()\"\n (HistoryRequested)=\"OnHistoryRequested()\"\n (ListManagementRequested)=\"OnListManagementRequested()\">\n\n <!-- ========================================\n FIELD PANELS\n ======================================== -->\n <!-- Scope Definition Section -->\n <mj-collapsible-panel\n SectionKey=\"scopeDefinition\"\n SectionName=\"Scope Definition\"\n Icon=\"fa fa-info-circle\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Name\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Description\"\n Type=\"textarea\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Icon\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n\n </mj-collapsible-panel>\n\n <!-- Scope Configuration Section -->\n <mj-collapsible-panel\n SectionKey=\"scopeConfiguration\"\n SectionName=\"Scope Configuration\"\n Icon=\"fa fa-sliders-h\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"IsGlobal\"\n Type=\"checkbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"IsDefault\"\n Type=\"checkbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n\n </mj-collapsible-panel>\n\n <!-- Access Control Section -->\n <mj-collapsible-panel\n SectionKey=\"accessControl\"\n SectionName=\"Access Control\"\n Icon=\"fa fa-lock\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"false\"\n FieldName=\"OwnerUserID\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n LinkType=\"Record\"\n ></mj-form-field>\n\n </mj-collapsible-panel>\n\n <!-- Lifecycle Management Section -->\n <mj-collapsible-panel\n SectionKey=\"lifecycleManagement\"\n SectionName=\"Lifecycle Management\"\n Icon=\"fa fa-clock\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Status\"\n Type=\"select\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"StartAt\"\n Type=\"datepicker\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"EndAt\"\n Type=\"datepicker\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n\n </mj-collapsible-panel>\n\n <!-- Technical Configuration Section -->\n <mj-collapsible-panel\n SectionKey=\"technicalConfiguration\"\n SectionName=\"Technical Configuration\"\n Icon=\"fa fa-code\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ScopeConfig\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"SearchContextConfig\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n\n </mj-collapsible-panel>\n\n <!-- Fusion Weights Section (custom — P4.2).\n Sliders for each canonical SearchEngine source type, backed by\n SearchScope.ScopeConfig.fusionWeights JSON. Weights >1 amplify a\n provider's contribution; weights <1 dampen it. Default 1 = engine\n default (no override). Plan-doc estimated SearchScopeProvider.Weight\n but that column doesn't exist; the JSON path is the actual contract\n the SearchEngine reads. -->\n <mj-collapsible-panel\n SectionKey=\"fusionWeights\"\n SectionName=\"Fusion Weights\"\n Icon=\"fa fa-sliders-h\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <div class=\"fusion-weights\">\n @for (row of FusionWeights; track row.Key) {\n <div class=\"fusion-weight-row\">\n <span class=\"fusion-weight-label\">{{ row.Label }}</span>\n <input\n class=\"fusion-weight-slider\"\n type=\"range\"\n min=\"0\"\n max=\"5\"\n step=\"0.1\"\n [disabled]=\"!EditMode\"\n [value]=\"row.Weight\"\n (change)=\"OnFusionWeightChanged(row, $any($event.target).valueAsNumber)\" />\n <span class=\"fusion-weight-value\">{{ row.Weight | number:'1.1-1' }}</span>\n </div>\n }\n <p class=\"fusion-weights-help\">\n Drag a slider to update <code>ScopeConfig.fusionWeights</code>. Default 1.0 means \"use engine default\";\n values are persisted on form save.\n </p>\n </div>\n </mj-collapsible-panel>\n\n <!-- Reranker Section (custom — P2D.7 Angular half).\n Dropdown writes the choice into ScopeConfig JSON's reRanker.driverClass —\n the same path SearchEngine reads at runtime via pickReRankerConfig().\n RerankerBudgetCents is rendered here too so the cost-cap input lives\n right next to the cost-incurring choice. -->\n <mj-collapsible-panel\n SectionKey=\"reranker\"\n SectionName=\"Reranker\"\n Icon=\"fa fa-sort-amount-down\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <div class=\"reranker-config\">\n <label class=\"reranker-config-label\">Reranker driver class</label>\n <select\n class=\"mj-input reranker-driver-select\"\n [disabled]=\"!EditMode\"\n [ngModel]=\"SelectedRerankerDriverClass\"\n (ngModelChange)=\"SelectedRerankerDriverClass = $event\">\n <option value=\"\">— None (use NoopReRanker) —</option>\n @for (option of AvailableRerankers; track option.DriverClass) {\n <option [value]=\"option.DriverClass\">\n {{ option.Name }}{{ option.HasCost ? ' — paid' : ' — free' }}\n </option>\n }\n </select>\n @if (SelectedRerankerHasCost) {\n <p class=\"reranker-cost-hint\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n This reranker incurs API cost per search. Set\n <strong>RerankerBudgetCents</strong> below to cap spend per invocation.\n </p>\n }\n <p class=\"reranker-help-hint\">\n Stored on <code>ScopeConfig.reRanker.driverClass</code> — the SearchEngine reads this at runtime.\n Leave blank to use the pass-through default.\n </p>\n\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"RerankerBudgetCents\"\n Type=\"number\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n\n <!-- P3.4 — per-scope tuning CSV export.\n Pulls the last 500 rows from MJ: Search Execution Logs filtered\n to this scope's ID and downloads as CSV for offline analysis. -->\n <div class=\"reranker-export-row\">\n <button class=\"reranker-export-btn\"\n type=\"button\"\n [disabled]=\"!record?.ID || IsExportingTuningCsv\"\n (click)=\"ExportTuningCsv()\">\n @if (IsExportingTuningCsv) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Exporting…</span>\n } @else {\n <i class=\"fa-solid fa-download\"></i>\n <span>Export tuning data (CSV)</span>\n }\n </button>\n <span class=\"reranker-export-hint\">Last 500 search invocations against this scope.</span>\n </div>\n </div>\n </mj-collapsible-panel>\n\n <!-- Live Preview Section (custom — P4.1).\n Streaming search against this scope, rendered with chip-strip + result\n list so authors can see how each tuning change (reranker, fusion\n weights, scope template) affects the actual ranked output. -->\n <mj-collapsible-panel\n SectionKey=\"livePreview\"\n SectionName=\"Live Preview\"\n Icon=\"fa fa-flask\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <div class=\"live-preview\">\n <div class=\"live-preview-input-row\">\n <input\n class=\"mj-input live-preview-input\"\n type=\"text\"\n placeholder=\"Type a sample query and press Run…\"\n [disabled]=\"!record?.ID || PreviewIsRunning\"\n [value]=\"PreviewQuery\"\n (input)=\"PreviewQuery = $any($event.target).value\"\n (keydown.enter)=\"RunPreview()\" />\n @if (!PreviewIsRunning) {\n <button class=\"live-preview-btn\"\n type=\"button\"\n [disabled]=\"!record?.ID || !PreviewQuery.trim()\"\n (click)=\"RunPreview()\">\n <i class=\"fa-solid fa-play\"></i> Run\n </button>\n } @else {\n <button class=\"live-preview-btn live-preview-btn-cancel\"\n type=\"button\"\n (click)=\"CancelPreview()\">\n <i class=\"fa-solid fa-stop\"></i> Cancel\n </button>\n }\n </div>\n\n @if (PreviewError) {\n <p class=\"live-preview-error\">\n <i class=\"fa-solid fa-circle-exclamation\"></i> {{ PreviewError }}\n </p>\n }\n\n @if (PreviewIsRunning || PreviewProviders.length > 0) {\n <div class=\"live-preview-chips\">\n @if (PreviewIsRunning && PreviewProviders.length === 0) {\n <span class=\"live-preview-chip live-preview-chip-pending\">\n <i class=\"fa-solid fa-circle-notch fa-spin\"></i> Streaming…\n </span>\n }\n @for (p of PreviewProviders; track p.Name) {\n <span class=\"live-preview-chip live-preview-chip-completed\">\n <i class=\"fa-solid fa-check\"></i>\n <strong>{{ p.Name }}</strong>\n <span class=\"live-preview-chip-count\">{{ p.Count }}</span>\n <span class=\"live-preview-chip-time\">{{ p.ElapsedMs }}ms</span>\n </span>\n }\n </div>\n }\n\n @if (PreviewResults.length > 0) {\n <div class=\"live-preview-results\">\n <div class=\"live-preview-results-header\">\n {{ PreviewResults.length }} result(s)\n @if (PreviewElapsedMs !== null) { in {{ PreviewElapsedMs }}ms }\n @if (LastRunSimilarityPercent !== null) {\n <span class=\"live-preview-similarity\"\n [class.live-preview-similarity-low]=\"LastRunSimilarityPercent < 70\"\n title=\"Kendall-tau rank correlation against the previous run, mapped to [0%, 100%].\">\n · {{ LastRunSimilarityPercent }}% similar to last run\n </span>\n }\n </div>\n @for (r of PreviewResults; track r.ID; let i = $index) {\n @if (i < 10) {\n <div class=\"live-preview-result\">\n <span class=\"live-preview-result-score\">{{ (r.Score * 100) | number:'1.0-0' }}%</span>\n <span class=\"live-preview-result-title\">{{ r.Title }}</span>\n <span class=\"live-preview-result-entity\">{{ r.EntityName }}</span>\n </div>\n }\n }\n @if (PreviewResults.length > 10) {\n <p class=\"live-preview-truncated\">…and {{ PreviewResults.length - 10 }} more (preview shows top 10).</p>\n }\n </div>\n }\n </div>\n </mj-collapsible-panel>\n\n <!-- Details Section (kept empty — RerankerBudgetCents now lives in the\n Reranker section above where it semantically belongs) -->\n <mj-collapsible-panel\n SectionKey=\"details\"\n SectionName=\"Details\"\n Icon=\"fa fa-align-left\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n </mj-collapsible-panel>\n\n <!-- System Metadata Section -->\n <mj-collapsible-panel\n SectionKey=\"systemMetadata\"\n SectionName=\"System Metadata\"\n Icon=\"fa fa-cog\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"__mj_CreatedAt\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"__mj_UpdatedAt\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n\n </mj-collapsible-panel>\n\n <!-- ========================================\n RELATED ENTITY PANELS\n ======================================== -->\n\n <!-- Search Scope Test Queries Section (P4.4) — canonical test queries for\n offline tuning. Authors save representative queries here, re-run them\n after a config change, and compare results. -->\n <mj-collapsible-panel\n SectionKey=\"mJSearchScopeTestQueries\"\n SectionName=\"Search Scope Test Queries\"\n Icon=\"fa fa-table\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJSearchScopeTestQueries')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: Search Scope Test Queries','SearchScopeID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: Search Scope Test Queries')\"\n [AllowLoad]=\"IsSectionExpanded('mJSearchScopeTestQueries')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJSearchScopeTestQueries', $event.totalRowCount)\"\n >\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <!-- Search Scope Storage Accounts Section -->\n <mj-collapsible-panel\n SectionKey=\"mJSearchScopeStorageAccounts\"\n SectionName=\"Search Scope Storage Accounts\"\n Icon=\"fa fa-folder-open\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJSearchScopeStorageAccounts')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: Search Scope Storage Accounts','SearchScopeID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: Search Scope Storage Accounts')\"\n [AllowLoad]=\"IsSectionExpanded('mJSearchScopeStorageAccounts')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJSearchScopeStorageAccounts', $event.totalRowCount)\"\n >\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <!-- Search Scope Entities Section -->\n <mj-collapsible-panel\n SectionKey=\"mJSearchScopeEntities\"\n SectionName=\"Search Scope Entities\"\n Icon=\"fa fa-search\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJSearchScopeEntities')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: Search Scope Entities','SearchScopeID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: Search Scope Entities')\"\n [AllowLoad]=\"IsSectionExpanded('mJSearchScopeEntities')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJSearchScopeEntities', $event.totalRowCount)\"\n >\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <!-- Search Scope External Indexes Section -->\n <mj-collapsible-panel\n SectionKey=\"mJSearchScopeExternalIndexes\"\n SectionName=\"Search Scope External Indexes\"\n Icon=\"fa fa-search-plus\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJSearchScopeExternalIndexes')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: Search Scope External Indexes','SearchScopeID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: Search Scope External Indexes')\"\n [AllowLoad]=\"IsSectionExpanded('mJSearchScopeExternalIndexes')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJSearchScopeExternalIndexes', $event.totalRowCount)\"\n >\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <!-- Search Scope Providers Section -->\n <mj-collapsible-panel\n SectionKey=\"mJSearchScopeProviders\"\n SectionName=\"Search Scope Providers\"\n Icon=\"fa fa-search-plus\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJSearchScopeProviders')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: Search Scope Providers','SearchScopeID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: Search Scope Providers')\"\n [AllowLoad]=\"IsSectionExpanded('mJSearchScopeProviders')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJSearchScopeProviders', $event.totalRowCount)\"\n >\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <!-- AI Agent Search Scopes Section -->\n <mj-collapsible-panel\n SectionKey=\"mJAIAgentSearchScopes\"\n SectionName=\"AI Agent Search Scopes\"\n Icon=\"fa fa-search-plus\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJAIAgentSearchScopes')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: AI Agent Search Scopes','SearchScopeID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: AI Agent Search Scopes')\"\n [AllowLoad]=\"IsSectionExpanded('mJAIAgentSearchScopes')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJAIAgentSearchScopes', $event.totalRowCount)\"\n >\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <!-- Search Scope Permissions Section -->\n <mj-collapsible-panel\n SectionKey=\"mJSearchScopePermissions\"\n SectionName=\"Search Scope Permissions\"\n Icon=\"fa fa-table\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJSearchScopePermissions')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: Search Scope Permissions','SearchScopeID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: Search Scope Permissions')\"\n [AllowLoad]=\"IsSectionExpanded('mJSearchScopePermissions')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJSearchScopePermissions', $event.totalRowCount)\"\n >\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <!-- Search Execution Logs Section -->\n <mj-collapsible-panel\n SectionKey=\"mJSearchExecutionLogs\"\n SectionName=\"Search Execution Logs\"\n Icon=\"fa fa-table\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJSearchExecutionLogs')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: Search Execution Logs','SearchScopeID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: Search Execution Logs')\"\n [AllowLoad]=\"IsSectionExpanded('mJSearchExecutionLogs')\"\n [ShowToolbar]=\"false\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJSearchExecutionLogs', $event.totalRowCount)\"\n >\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n</mj-record-form-container>\n "]}
|
|
1
|
+
{"version":3,"file":"searchscope-form.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/SearchScopes/searchscope-form.component.ts","../../../../src/lib/custom/SearchScopes/searchscope-form.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * Custom SearchScope form (P2D.7 Angular half).\n *\n * Adds a \"Reranker\" custom section that:\n * - Renders a dropdown of registered rerankers — currently a hardcoded list\n * mirroring `BaseReRanker.GetAvailableRerankers()` server-side, with each\n * option's HasCost flag surfaced inline so authors can see at a glance\n * which options will incur API spend.\n * - Reads / writes the current selection from `record.ScopeConfig` JSON's\n * `reRanker.driverClass` key — same path the SearchEngine reads at runtime.\n *\n * **Discovery follow-up:** the canonical source of available rerankers is\n * `BaseReRanker.GetAvailableRerankers()` in `@memberjunction/search-engine`,\n * but that's a Node-only package and can't be imported in the browser.\n * A small GraphQL query (e.g. `AvailableRerankers`) on MJServer that calls\n * the helper server-side would let this dropdown auto-discover any\n * third-party reranker registered with ClassFactory. Tracked as a follow-up\n * — for now the hardcoded list covers the 5 rerankers shipped in Phase 2D.\n *\n * The CodeGen-generated `RerankerBudgetCents` numeric input is already on\n * the form (in the \"Details\" section); we don't need to recreate it.\n * The dropdown above + budget input below give scope authors the full\n * Phase 2D configuration surface.\n */\nimport { Component, OnDestroy } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { LogError, RunView } from '@memberjunction/core';\nimport { MJSearchScopeEntity, MJSearchExecutionLogEntityType } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseFormComponent } from '@memberjunction/ng-base-forms';\nimport { SearchService, SearchResultItem, StreamingProviderStatus } from '@memberjunction/ng-search';\nimport { MJSearchScopeFormComponent } from '../../generated/Entities/MJSearchScope/mjsearchscope.form.component';\n\ninterface FusionWeightRow {\n /** Source-type key the SearchEngine matches against (e.g. 'vector', 'fulltext'). */\n Key: string;\n /** Friendly label for the slider — same value as Key today, kept separate for future i18n. */\n Label: string;\n /** Working value of the slider (1-decimal precision) — bound via two-way. */\n Weight: number;\n}\n\n/**\n * Built-in source types the SearchEngine ships. New 3rd-party provider\n * SourceTypes (e.g. external clusters) won't appear here unless the scope\n * author adds them via the JSON Scope Config block — by design, since the\n * fusion-weights UI is for the four canonical built-ins.\n */\nconst BUILT_IN_SOURCE_TYPES: string[] = ['vector', 'fulltext', 'entity', 'storage'];\n\ninterface RerankerOption {\n DriverClass: string;\n Name: string;\n HasCost: boolean;\n}\n\n/**\n * Hardcoded list mirroring the rerankers `@memberjunction/search-engine`\n * registers with ClassFactory. Update when adding a new built-in reranker\n * or when the GraphQL discovery query lands.\n */\nconst BUILT_IN_RERANKERS: RerankerOption[] = [\n { DriverClass: 'NoopReRanker', Name: 'NoopReRanker (pass-through)', HasCost: false },\n { DriverClass: 'CohereReRanker', Name: 'Cohere (rerank-v3.5)', HasCost: true },\n { DriverClass: 'VoyageReRanker', Name: 'Voyage (rerank-2)', HasCost: true },\n { DriverClass: 'OpenAIReRanker', Name: 'OpenAI (gpt-4o-mini judge)', HasCost: true },\n { DriverClass: 'BGEReRanker', Name: 'BGE (local, free)', HasCost: false },\n];\n\n@RegisterClass(BaseFormComponent, 'MJ: Search Scopes')\n@Component({\n standalone: false,\n selector: 'mj-searchscope-form-extended',\n templateUrl: './searchscope-form.component.html',\n styleUrls: ['./searchscope-form.component.css'],\n})\nexport class MJSearchScopeFormComponentExtended extends MJSearchScopeFormComponent implements OnDestroy {\n public override record!: MJSearchScopeEntity;\n\n public readonly AvailableRerankers: RerankerOption[] = BUILT_IN_RERANKERS;\n\n /** Live-preview state (P4.1). */\n public PreviewQuery = '';\n public PreviewIsRunning = false;\n public PreviewResults: SearchResultItem[] = [];\n public PreviewProviders: StreamingProviderStatus[] = [];\n public PreviewElapsedMs: number | null = null;\n public PreviewError: string | null = null;\n private previewSubscription: Subscription | null = null;\n private searchService = new SearchService();\n\n /**\n * P4.3 — A/B comparison via Kendall-tau between consecutive preview runs.\n * After RunPreview completes, the previous run's RecordIDs are diffed\n * against the current run and the rank-correlation similarity is shown\n * inline (\"82% similar to last run\"). Authors use this to immediately\n * see how much a reranker swap or fusion-weight tweak shifted the ranking.\n */\n private previousRunRecordIDs: string[] = [];\n public LastRunSimilarityPercent: number | null = null;\n\n public override ngOnDestroy(): void {\n super.ngOnDestroy();\n this.previewSubscription?.unsubscribe();\n this.previewSubscription = null;\n }\n\n /**\n * P4.1 — run a streaming preview against this scope. Uses the same\n * SearchService.StreamSearch path the production search UI uses, scoped\n * to just this scope's ID. Each provider's chip shows its count as it\n * reports back, so authors can see chip-by-chip what each tuning change\n * actually affects; the result rows arrive with the 'final' event.\n */\n public RunPreview(): void {\n if (!this.record?.ID || this.PreviewIsRunning) return;\n const query = this.PreviewQuery.trim();\n if (!query) return;\n\n // Tear down any previous run before starting a new one.\n this.previewSubscription?.unsubscribe();\n this.PreviewIsRunning = true;\n this.PreviewResults = [];\n this.PreviewProviders = [];\n this.PreviewElapsedMs = null;\n this.PreviewError = null;\n\n this.previewSubscription = this.searchService.StreamSearch({\n Query: query,\n MaxResults: 25,\n ActiveFilters: {},\n IncludeSources: ['vector', 'fulltext', 'entity', 'storage'],\n ScopeIDs: [this.record.ID],\n }).subscribe({\n next: (event) => {\n if (event.Phase === 'provider' && event.ProviderName) {\n // Progress only: the count, never the rows (they precede the permission pass).\n this.PreviewProviders = [\n ...this.PreviewProviders,\n {\n Name: event.ProviderName,\n Count: event.ResultCount ?? 0,\n ElapsedMs: event.ElapsedMs ?? 0,\n State: 'Completed',\n },\n ];\n } else if (event.Phase === 'final' && event.Results) {\n this.PreviewResults = [...event.Results].sort((a, b) => b.Score - a.Score);\n this.PreviewElapsedMs = event.ElapsedMs ?? null;\n }\n },\n error: (err: Error) => {\n this.PreviewError = err.message ?? String(err);\n this.PreviewIsRunning = false;\n },\n complete: () => {\n this.PreviewIsRunning = false;\n // Compute Kendall-tau against the prior run, then capture this\n // run's order as the next baseline.\n const currentIDs = this.PreviewResults.map(r => r.RecordID);\n if (this.previousRunRecordIDs.length > 0 && currentIDs.length > 0) {\n const tau = MJSearchScopeFormComponentExtended.kendallTauOnSharedItems(\n this.previousRunRecordIDs,\n currentIDs,\n );\n if (tau !== null) {\n // Map [-1, 1] tau onto a [0, 100] \"% similar\" gauge so non-stats\n // authors can read it. -1 (reverse) = 0%, 0 (uncorrelated) = 50%,\n // +1 (identical) = 100%.\n this.LastRunSimilarityPercent = Math.round((tau + 1) * 50);\n }\n }\n this.previousRunRecordIDs = currentIDs;\n },\n });\n }\n\n public CancelPreview(): void {\n this.previewSubscription?.unsubscribe();\n this.previewSubscription = null;\n this.PreviewIsRunning = false;\n }\n\n /**\n * Compute Kendall-tau rank correlation on the items present in both lists.\n * Items only in one list are ignored (partial-overlap handling). Returns\n * null when the shared overlap is too small (< 2 items) to be meaningful.\n *\n * Tau formula: (concordant - discordant) / (N * (N-1) / 2)\n * where concordant = pairs ranked in the same order in both lists,\n * discordant = pairs ranked in opposite order, N = shared item count.\n */\n private static kendallTauOnSharedItems(listA: string[], listB: string[]): number | null {\n const rankA = new Map(listA.map((id, i) => [id, i]));\n const rankB = new Map(listB.map((id, i) => [id, i]));\n const shared = listA.filter(id => rankB.has(id));\n const n = shared.length;\n if (n < 2) return null;\n let concordant = 0;\n let discordant = 0;\n for (let i = 0; i < n; i++) {\n for (let j = i + 1; j < n; j++) {\n const a = (rankA.get(shared[i])! - rankA.get(shared[j])!);\n const b = (rankB.get(shared[i])! - rankB.get(shared[j])!);\n const product = a * b;\n if (product > 0) concordant++;\n else if (product < 0) discordant++;\n // Ties (product === 0) ignored — items at same rank\n }\n }\n const totalPairs = (n * (n - 1)) / 2;\n if (totalPairs === 0) return null;\n return (concordant - discordant) / totalPairs;\n }\n\n /**\n * Override the section list to include the new \"Reranker\" section before\n * \"Details\". The generated `initSections()` doesn't know about our custom\n * section so we replace the list. Order matches the template's render order.\n */\n public override async ngOnInit(): Promise<void> {\n await super.ngOnInit();\n this.initSections([\n { sectionKey: 'scopeDefinition', sectionName: 'Scope Definition', isExpanded: true },\n { sectionKey: 'scopeConfiguration', sectionName: 'Scope Configuration', isExpanded: true },\n { sectionKey: 'accessControl', sectionName: 'Access Control', isExpanded: false },\n { sectionKey: 'lifecycleManagement', sectionName: 'Lifecycle Management', isExpanded: false },\n { sectionKey: 'technicalConfiguration', sectionName: 'Technical Configuration', isExpanded: false },\n { sectionKey: 'fusionWeights', sectionName: 'Fusion Weights', isExpanded: false },\n { sectionKey: 'reranker', sectionName: 'Reranker', isExpanded: false },\n { sectionKey: 'livePreview', sectionName: 'Live Preview', isExpanded: false },\n { sectionKey: 'details', sectionName: 'Details', isExpanded: false },\n { sectionKey: 'systemMetadata', sectionName: 'System Metadata', isExpanded: false },\n { sectionKey: 'mJSearchScopeTestQueries', sectionName: 'Search Scope Test Queries', isExpanded: false },\n { sectionKey: 'mJSearchScopeStorageAccounts', sectionName: 'Search Scope Storage Accounts', isExpanded: false },\n { sectionKey: 'mJSearchScopeEntities', sectionName: 'Search Scope Entities', isExpanded: false },\n { sectionKey: 'mJSearchScopeExternalIndexes', sectionName: 'Search Scope External Indexes', isExpanded: false },\n { sectionKey: 'mJSearchScopeProviders', sectionName: 'Search Scope Providers', isExpanded: false },\n { sectionKey: 'mJAIAgentSearchScopes', sectionName: 'AI Agent Search Scopes', isExpanded: false },\n { sectionKey: 'mJSearchScopePermissions', sectionName: 'Search Scope Permissions', isExpanded: false },\n ]);\n }\n\n /**\n * Currently-selected reranker driver class, parsed from `record.ScopeConfig`.\n * Empty string means \"no reranker explicitly chosen\" — runtime defaults\n * to NoopReRanker. Stored as `ScopeConfig.reRanker.driverClass`.\n */\n public get SelectedRerankerDriverClass(): string {\n const cfg = this.parseScopeConfig();\n return (cfg?.['reRanker'] as { driverClass?: string } | undefined)?.driverClass ?? '';\n }\n\n public set SelectedRerankerDriverClass(value: string) {\n const cfg = this.parseScopeConfig() ?? {};\n const reRanker = (cfg['reRanker'] as Record<string, unknown> | undefined) ?? {};\n if (value && value.trim().length > 0) {\n reRanker['driverClass'] = value;\n } else {\n delete reRanker['driverClass'];\n }\n cfg['reRanker'] = reRanker;\n this.record.ScopeConfig = JSON.stringify(cfg, null, 2);\n }\n\n /**\n * Whether the currently-selected reranker incurs API cost — used to render\n * an inline cost-warning indicator next to the dropdown.\n */\n public get SelectedRerankerHasCost(): boolean {\n const driver = this.SelectedRerankerDriverClass;\n return BUILT_IN_RERANKERS.find(r => r.DriverClass === driver)?.HasCost ?? false;\n }\n\n /**\n * Whether the CSV export is currently running. Drives the button's disabled\n * state + spinner.\n */\n public IsExportingTuningCsv = false;\n\n /**\n * P4.2 — fusion weight sliders for each canonical SearchEngine source type.\n * Backed by `SearchScope.ScopeConfig.fusionWeights` JSON (the runtime path\n * — see plans/search-scopes-rag-plus/RAG_plan.md §8 Multi-Scope RRF Fusion). Plan task originally\n * proposed `SearchScopeProvider.Weight` but that column doesn't exist in\n * Phase 1; the JSON path is the actual contract the SearchEngine reads.\n */\n private _fusionWeights: FusionWeightRow[] | null = null;\n\n public get FusionWeights(): FusionWeightRow[] {\n if (!this._fusionWeights) {\n const cfg = this.parseScopeConfig();\n const stored = (cfg?.['fusionWeights'] as Record<string, unknown> | undefined) ?? {};\n this._fusionWeights = BUILT_IN_SOURCE_TYPES.map(key => {\n const value = stored[key];\n const weight = typeof value === 'number' && Number.isFinite(value) ? value : 1;\n return { Key: key, Label: key, Weight: weight };\n });\n }\n return this._fusionWeights;\n }\n\n /**\n * Persist a fusion weight change back to `ScopeConfig.fusionWeights`. The\n * caller is the slider's `(change)` event so writes happen only on\n * slide-end, not on every drag tick.\n */\n public OnFusionWeightChanged(row: FusionWeightRow, raw: number | string): void {\n const value = typeof raw === 'number' ? raw : Number(raw);\n if (!Number.isFinite(value)) return;\n row.Weight = value;\n\n const cfg = this.parseScopeConfig() ?? {};\n const weights = (cfg['fusionWeights'] as Record<string, unknown> | undefined) ?? {};\n if (Math.abs(value - 1) < 0.001) {\n // Default value — drop the explicit override so future engine-default\n // changes flow through naturally.\n delete weights[row.Key];\n } else {\n weights[row.Key] = +value.toFixed(2);\n }\n if (Object.keys(weights).length > 0) {\n cfg['fusionWeights'] = weights;\n } else {\n delete cfg['fusionWeights'];\n }\n this.record.ScopeConfig = JSON.stringify(cfg, null, 2);\n }\n\n /**\n * P3.4 — export the last 500 SearchExecutionLog rows for this scope as CSV.\n * Used by scope authors for offline tuning analysis (open in a spreadsheet,\n * pivot by reranker / status / latency, etc.). Filtered to this scope's ID\n * so multi-tenant deployments don't leak other scopes' query history.\n */\n public async ExportTuningCsv(): Promise<void> {\n if (!this.record?.ID || this.IsExportingTuningCsv) return;\n this.IsExportingTuningCsv = true;\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJSearchExecutionLogEntityType>({\n EntityName: 'MJ: Search Execution Logs',\n // Constrain to the columns the CSV writer actually emits — avoids\n // pulling the wider entity (per Section 6.8).\n Fields: [\n '__mj_CreatedAt', 'Status', 'Query', 'ResultCount', 'TotalDurationMs',\n 'RerankerName', 'RerankerCostCents', 'FailureReason', 'UserID', 'AIAgentID',\n ],\n ExtraFilter: `SearchScopeID='${this.record.ID.replace(/'/g, \"''\")}'`,\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 500,\n ResultType: 'simple',\n });\n if (!result.Success) {\n LogError(`SearchScope CSV export failed: ${result.ErrorMessage ?? 'unknown error'}`);\n return;\n }\n const rows = (result.Results ?? []) as MJSearchExecutionLogEntityType[];\n this.downloadCsv(rows);\n } finally {\n this.IsExportingTuningCsv = false;\n }\n }\n\n private downloadCsv(rows: MJSearchExecutionLogEntityType[]): void {\n const headers = [\n 'CreatedAt', 'Status', 'Query', 'ResultCount', 'TotalDurationMs',\n 'RerankerName', 'RerankerCostCents', 'FailureReason', 'UserID', 'AIAgentID',\n ];\n const lines = [headers.join(',')];\n for (const r of rows) {\n const cells = [\n this.escapeCsv(String(r.__mj_CreatedAt ?? '')),\n this.escapeCsv(String(r.Status ?? '')),\n this.escapeCsv(String(r.Query ?? '')),\n String(r.ResultCount ?? 0),\n String(r.TotalDurationMs ?? 0),\n this.escapeCsv(String(r.RerankerName ?? '')),\n String(r.RerankerCostCents ?? ''),\n this.escapeCsv(String(r.FailureReason ?? '')),\n String(r.UserID ?? ''),\n String(r.AIAgentID ?? ''),\n ];\n lines.push(cells.join(','));\n }\n const blob = new Blob([lines.join('\\n')], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.setAttribute('href', url);\n const name = (this.record?.Name ?? 'scope').replace(/[^\\w\\-]+/g, '_');\n link.setAttribute('download', `searchscope-tuning-${name}-${new Date().toISOString().split('T')[0]}.csv`);\n link.style.visibility = 'hidden';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n }\n\n private escapeCsv(value: string): string {\n if (value == null) return '';\n // Quote when the value contains a comma, quote, newline, or starts with\n // formula-injection characters. Inside a quoted value, escape inner\n // quotes by doubling.\n if (/[\",\\n\\r]/.test(value) || /^[=+\\-@]/.test(value)) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n }\n\n private parseScopeConfig(): Record<string, unknown> | null {\n if (!this.record?.ScopeConfig) return null;\n try {\n const parsed = JSON.parse(this.record.ScopeConfig);\n return (parsed && typeof parsed === 'object') ? parsed as Record<string, unknown> : null;\n } catch {\n return null;\n }\n }\n}\n\nexport function LoadMJSearchScopeFormComponentExtended(): void {\n // Tree-shake prevention; called from custom-forms.module's LoadCoreCustomForms()\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const _ref = MJSearchScopeFormComponentExtended;\n}\n","<mj-record-form-container [Record]=\"record\" [FormComponent]=\"this\"\n (Navigate)=\"OnFormNavigate($event)\"\n (DeleteRequested)=\"OnDeleteRequested()\"\n (FavoriteToggled)=\"OnFavoriteToggled()\"\n (HistoryRequested)=\"OnHistoryRequested()\"\n (ListManagementRequested)=\"OnListManagementRequested()\">\n\n <!-- ========================================\n FIELD PANELS\n ======================================== -->\n <!-- Scope Definition Section -->\n <mj-collapsible-panel\n SectionKey=\"scopeDefinition\"\n SectionName=\"Scope Definition\"\n Icon=\"fa fa-info-circle\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Name\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Description\"\n Type=\"textarea\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Icon\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n\n </mj-collapsible-panel>\n\n <!-- Scope Configuration Section -->\n <mj-collapsible-panel\n SectionKey=\"scopeConfiguration\"\n SectionName=\"Scope Configuration\"\n Icon=\"fa fa-sliders-h\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"IsGlobal\"\n Type=\"checkbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"IsDefault\"\n Type=\"checkbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n\n </mj-collapsible-panel>\n\n <!-- Access Control Section -->\n <mj-collapsible-panel\n SectionKey=\"accessControl\"\n SectionName=\"Access Control\"\n Icon=\"fa fa-lock\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"false\"\n FieldName=\"OwnerUserID\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n LinkType=\"Record\"\n ></mj-form-field>\n\n </mj-collapsible-panel>\n\n <!-- Lifecycle Management Section -->\n <mj-collapsible-panel\n SectionKey=\"lifecycleManagement\"\n SectionName=\"Lifecycle Management\"\n Icon=\"fa fa-clock\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Status\"\n Type=\"select\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"StartAt\"\n Type=\"datepicker\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"EndAt\"\n Type=\"datepicker\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n\n </mj-collapsible-panel>\n\n <!-- Technical Configuration Section -->\n <mj-collapsible-panel\n SectionKey=\"technicalConfiguration\"\n SectionName=\"Technical Configuration\"\n Icon=\"fa fa-code\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ScopeConfig\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"SearchContextConfig\"\n Type=\"code\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n\n </mj-collapsible-panel>\n\n <!-- Fusion Weights Section (custom — P4.2).\n Sliders for each canonical SearchEngine source type, backed by\n SearchScope.ScopeConfig.fusionWeights JSON. Weights >1 amplify a\n provider's contribution; weights <1 dampen it. Default 1 = engine\n default (no override). Plan-doc estimated SearchScopeProvider.Weight\n but that column doesn't exist; the JSON path is the actual contract\n the SearchEngine reads. -->\n <mj-collapsible-panel\n SectionKey=\"fusionWeights\"\n SectionName=\"Fusion Weights\"\n Icon=\"fa fa-sliders-h\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <div class=\"fusion-weights\">\n @for (row of FusionWeights; track row.Key) {\n <div class=\"fusion-weight-row\">\n <span class=\"fusion-weight-label\">{{ row.Label }}</span>\n <input\n class=\"fusion-weight-slider\"\n type=\"range\"\n min=\"0\"\n max=\"5\"\n step=\"0.1\"\n [disabled]=\"!EditMode\"\n [value]=\"row.Weight\"\n (change)=\"OnFusionWeightChanged(row, $any($event.target).valueAsNumber)\" />\n <span class=\"fusion-weight-value\">{{ row.Weight | number:'1.1-1' }}</span>\n </div>\n }\n <p class=\"fusion-weights-help\">\n Drag a slider to update <code>ScopeConfig.fusionWeights</code>. Default 1.0 means \"use engine default\";\n values are persisted on form save.\n </p>\n </div>\n </mj-collapsible-panel>\n\n <!-- Reranker Section (custom — P2D.7 Angular half).\n Dropdown writes the choice into ScopeConfig JSON's reRanker.driverClass —\n the same path SearchEngine reads at runtime via pickReRankerConfig().\n RerankerBudgetCents is rendered here too so the cost-cap input lives\n right next to the cost-incurring choice. -->\n <mj-collapsible-panel\n SectionKey=\"reranker\"\n SectionName=\"Reranker\"\n Icon=\"fa fa-sort-amount-down\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <div class=\"reranker-config\">\n <label class=\"reranker-config-label\">Reranker driver class</label>\n <select\n class=\"mj-input reranker-driver-select\"\n [disabled]=\"!EditMode\"\n [ngModel]=\"SelectedRerankerDriverClass\"\n (ngModelChange)=\"SelectedRerankerDriverClass = $event\">\n <option value=\"\">— None (use NoopReRanker) —</option>\n @for (option of AvailableRerankers; track option.DriverClass) {\n <option [value]=\"option.DriverClass\">\n {{ option.Name }}{{ option.HasCost ? ' — paid' : ' — free' }}\n </option>\n }\n </select>\n @if (SelectedRerankerHasCost) {\n <p class=\"reranker-cost-hint\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n This reranker incurs API cost per search. Set\n <strong>RerankerBudgetCents</strong> below to cap spend per invocation.\n </p>\n }\n <p class=\"reranker-help-hint\">\n Stored on <code>ScopeConfig.reRanker.driverClass</code> — the SearchEngine reads this at runtime.\n Leave blank to use the pass-through default.\n </p>\n\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"RerankerBudgetCents\"\n Type=\"number\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n\n <!-- P3.4 — per-scope tuning CSV export.\n Pulls the last 500 rows from MJ: Search Execution Logs filtered\n to this scope's ID and downloads as CSV for offline analysis. -->\n <div class=\"reranker-export-row\">\n <button class=\"reranker-export-btn\"\n type=\"button\"\n [disabled]=\"!record?.ID || IsExportingTuningCsv\"\n (click)=\"ExportTuningCsv()\">\n @if (IsExportingTuningCsv) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Exporting…</span>\n } @else {\n <i class=\"fa-solid fa-download\"></i>\n <span>Export tuning data (CSV)</span>\n }\n </button>\n <span class=\"reranker-export-hint\">Last 500 search invocations against this scope.</span>\n </div>\n </div>\n </mj-collapsible-panel>\n\n <!-- Live Preview Section (custom — P4.1).\n Streaming search against this scope, rendered with chip-strip + result\n list so authors can see how each tuning change (reranker, fusion\n weights, scope template) affects the actual ranked output. -->\n <mj-collapsible-panel\n SectionKey=\"livePreview\"\n SectionName=\"Live Preview\"\n Icon=\"fa fa-flask\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <div class=\"live-preview\">\n <div class=\"live-preview-input-row\">\n <input\n class=\"mj-input live-preview-input\"\n type=\"text\"\n placeholder=\"Type a sample query and press Run…\"\n [disabled]=\"!record?.ID || PreviewIsRunning\"\n [value]=\"PreviewQuery\"\n (input)=\"PreviewQuery = $any($event.target).value\"\n (keydown.enter)=\"RunPreview()\" />\n @if (!PreviewIsRunning) {\n <button class=\"live-preview-btn\"\n type=\"button\"\n [disabled]=\"!record?.ID || !PreviewQuery.trim()\"\n (click)=\"RunPreview()\">\n <i class=\"fa-solid fa-play\"></i> Run\n </button>\n } @else {\n <button class=\"live-preview-btn live-preview-btn-cancel\"\n type=\"button\"\n (click)=\"CancelPreview()\">\n <i class=\"fa-solid fa-stop\"></i> Cancel\n </button>\n }\n </div>\n\n @if (PreviewError) {\n <p class=\"live-preview-error\">\n <i class=\"fa-solid fa-circle-exclamation\"></i> {{ PreviewError }}\n </p>\n }\n\n @if (PreviewIsRunning || PreviewProviders.length > 0) {\n <div class=\"live-preview-chips\">\n @if (PreviewIsRunning && PreviewProviders.length === 0) {\n <span class=\"live-preview-chip live-preview-chip-pending\">\n <i class=\"fa-solid fa-circle-notch fa-spin\"></i> Streaming…\n </span>\n }\n @for (p of PreviewProviders; track p.Name) {\n <span class=\"live-preview-chip live-preview-chip-completed\">\n <i class=\"fa-solid fa-check\"></i>\n <strong>{{ p.Name }}</strong>\n <span class=\"live-preview-chip-count\">{{ p.Count }}</span>\n <span class=\"live-preview-chip-time\">{{ p.ElapsedMs }}ms</span>\n </span>\n }\n </div>\n }\n\n @if (PreviewResults.length > 0) {\n <div class=\"live-preview-results\">\n <div class=\"live-preview-results-header\">\n {{ PreviewResults.length }} result(s)\n @if (PreviewElapsedMs !== null) { in {{ PreviewElapsedMs }}ms }\n @if (LastRunSimilarityPercent !== null) {\n <span class=\"live-preview-similarity\"\n [class.live-preview-similarity-low]=\"LastRunSimilarityPercent < 70\"\n title=\"Kendall-tau rank correlation against the previous run, mapped to [0%, 100%].\">\n · {{ LastRunSimilarityPercent }}% similar to last run\n </span>\n }\n </div>\n @for (r of PreviewResults; track r.ID; let i = $index) {\n @if (i < 10) {\n <div class=\"live-preview-result\">\n <span class=\"live-preview-result-score\">{{ (r.Score * 100) | number:'1.0-0' }}%</span>\n <span class=\"live-preview-result-title\">{{ r.Title }}</span>\n <span class=\"live-preview-result-entity\">{{ r.EntityName }}</span>\n </div>\n }\n }\n @if (PreviewResults.length > 10) {\n <p class=\"live-preview-truncated\">…and {{ PreviewResults.length - 10 }} more (preview shows top 10).</p>\n }\n </div>\n }\n </div>\n </mj-collapsible-panel>\n\n <!-- Details Section (kept empty — RerankerBudgetCents now lives in the\n Reranker section above where it semantically belongs) -->\n <mj-collapsible-panel\n SectionKey=\"details\"\n SectionName=\"Details\"\n Icon=\"fa fa-align-left\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n </mj-collapsible-panel>\n\n <!-- System Metadata Section -->\n <mj-collapsible-panel\n SectionKey=\"systemMetadata\"\n SectionName=\"System Metadata\"\n Icon=\"fa fa-cog\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"__mj_CreatedAt\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n <mj-form-field \n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"__mj_UpdatedAt\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n [FormContext]=\"formContext\"\n ></mj-form-field>\n\n </mj-collapsible-panel>\n\n <!-- ========================================\n RELATED ENTITY PANELS\n ======================================== -->\n\n <!-- Search Scope Test Queries Section (P4.4) — canonical test queries for\n offline tuning. Authors save representative queries here, re-run them\n after a config change, and compare results. -->\n <mj-collapsible-panel\n SectionKey=\"mJSearchScopeTestQueries\"\n SectionName=\"Search Scope Test Queries\"\n Icon=\"fa fa-table\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJSearchScopeTestQueries')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: Search Scope Test Queries','SearchScopeID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: Search Scope Test Queries')\"\n [AllowLoad]=\"IsSectionExpanded('mJSearchScopeTestQueries')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJSearchScopeTestQueries', $event.totalRowCount)\"\n >\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <!-- Search Scope Storage Accounts Section -->\n <mj-collapsible-panel\n SectionKey=\"mJSearchScopeStorageAccounts\"\n SectionName=\"Search Scope Storage Accounts\"\n Icon=\"fa fa-folder-open\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJSearchScopeStorageAccounts')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: Search Scope Storage Accounts','SearchScopeID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: Search Scope Storage Accounts')\"\n [AllowLoad]=\"IsSectionExpanded('mJSearchScopeStorageAccounts')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJSearchScopeStorageAccounts', $event.totalRowCount)\"\n >\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <!-- Search Scope Entities Section -->\n <mj-collapsible-panel\n SectionKey=\"mJSearchScopeEntities\"\n SectionName=\"Search Scope Entities\"\n Icon=\"fa fa-search\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJSearchScopeEntities')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: Search Scope Entities','SearchScopeID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: Search Scope Entities')\"\n [AllowLoad]=\"IsSectionExpanded('mJSearchScopeEntities')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJSearchScopeEntities', $event.totalRowCount)\"\n >\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <!-- Search Scope External Indexes Section -->\n <mj-collapsible-panel\n SectionKey=\"mJSearchScopeExternalIndexes\"\n SectionName=\"Search Scope External Indexes\"\n Icon=\"fa fa-search-plus\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJSearchScopeExternalIndexes')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: Search Scope External Indexes','SearchScopeID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: Search Scope External Indexes')\"\n [AllowLoad]=\"IsSectionExpanded('mJSearchScopeExternalIndexes')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJSearchScopeExternalIndexes', $event.totalRowCount)\"\n >\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <!-- Search Scope Providers Section -->\n <mj-collapsible-panel\n SectionKey=\"mJSearchScopeProviders\"\n SectionName=\"Search Scope Providers\"\n Icon=\"fa fa-search-plus\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJSearchScopeProviders')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: Search Scope Providers','SearchScopeID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: Search Scope Providers')\"\n [AllowLoad]=\"IsSectionExpanded('mJSearchScopeProviders')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJSearchScopeProviders', $event.totalRowCount)\"\n >\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <!-- AI Agent Search Scopes Section -->\n <mj-collapsible-panel\n SectionKey=\"mJAIAgentSearchScopes\"\n SectionName=\"AI Agent Search Scopes\"\n Icon=\"fa fa-search-plus\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJAIAgentSearchScopes')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: AI Agent Search Scopes','SearchScopeID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: AI Agent Search Scopes')\"\n [AllowLoad]=\"IsSectionExpanded('mJAIAgentSearchScopes')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJAIAgentSearchScopes', $event.totalRowCount)\"\n >\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <!-- Search Scope Permissions Section -->\n <mj-collapsible-panel\n SectionKey=\"mJSearchScopePermissions\"\n SectionName=\"Search Scope Permissions\"\n Icon=\"fa fa-table\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJSearchScopePermissions')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: Search Scope Permissions','SearchScopeID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: Search Scope Permissions')\"\n [AllowLoad]=\"IsSectionExpanded('mJSearchScopePermissions')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJSearchScopePermissions', $event.totalRowCount)\"\n >\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <!-- Search Execution Logs Section -->\n <mj-collapsible-panel\n SectionKey=\"mJSearchExecutionLogs\"\n SectionName=\"Search Execution Logs\"\n Icon=\"fa fa-table\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJSearchExecutionLogs')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: Search Execution Logs','SearchScopeID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: Search Execution Logs')\"\n [AllowLoad]=\"IsSectionExpanded('mJSearchExecutionLogs')\"\n [ShowToolbar]=\"false\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJSearchExecutionLogs', $event.totalRowCount)\"\n >\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n</mj-record-form-container>\n "]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-agent-run-data.service.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/ai-agent-run/ai-agent-run-data.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,UAAU,EAAE,MAAM,MAAM,CAAC;AACnD,OAAO,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"ai-agent-run-data.service.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/ai-agent-run/ai-agent-run-data.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { BehaviorSubject } from 'rxjs';
|
|
2
2
|
import { Metadata, RunView } from '@memberjunction/core';
|
|
3
|
+
import { ApplyResolvedPayloadAtStart, ApplyResolvedPayloadAtEnd } from '@memberjunction/ai-core-plus';
|
|
3
4
|
import { SortAgentRunStepsByExecutionOrder } from './agent-run-step-order';
|
|
4
5
|
/**
|
|
5
6
|
* Helper class for managing AI Agent Run data per component instance
|
|
@@ -137,6 +138,9 @@ export class AIAgentRunDataHelper {
|
|
|
137
138
|
throw new Error('Failed to load agent run steps');
|
|
138
139
|
}
|
|
139
140
|
const steps = SortAgentRunStepsByExecutionOrder(stepsResult.Results || []);
|
|
141
|
+
// Fill PayloadAtEnd and PayloadAtStart on steps that point at an earlier step's PayloadAtEnd.
|
|
142
|
+
ApplyResolvedPayloadAtEnd(steps);
|
|
143
|
+
ApplyResolvedPayloadAtStart(steps);
|
|
140
144
|
// Build filters for batch loading
|
|
141
145
|
const actionLogIds = steps
|
|
142
146
|
.filter(s => s.StepType === 'Actions' && s.TargetLogID)
|
|
@@ -153,11 +157,6 @@ export class AIAgentRunDataHelper {
|
|
|
153
157
|
EntityName: 'MJ: AI Agent Runs',
|
|
154
158
|
ExtraFilter: `ParentRunID='${agentRunId}'`,
|
|
155
159
|
OrderBy: 'StartedAt'
|
|
156
|
-
},
|
|
157
|
-
// Current run query
|
|
158
|
-
{
|
|
159
|
-
EntityName: 'MJ: AI Agent Runs',
|
|
160
|
-
ExtraFilter: `ID='${agentRunId}'`
|
|
161
160
|
}
|
|
162
161
|
];
|
|
163
162
|
// Add action logs query if needed
|
|
@@ -181,12 +180,10 @@ export class AIAgentRunDataHelper {
|
|
|
181
180
|
// Process results
|
|
182
181
|
let resultIndex = 0;
|
|
183
182
|
// Sub-runs
|
|
184
|
-
const subRuns = batchResults[resultIndex]
|
|
183
|
+
const subRuns = batchResults[resultIndex]?.Success
|
|
185
184
|
? (batchResults[resultIndex].Results || [])
|
|
186
185
|
: [];
|
|
187
186
|
resultIndex++;
|
|
188
|
-
// Skip current run result
|
|
189
|
-
resultIndex++;
|
|
190
187
|
// Action logs
|
|
191
188
|
const actionLogs = actionLogIds.length > 0 && batchResults[resultIndex]?.Success
|
|
192
189
|
? (batchResults[resultIndex].Results || [])
|
|
@@ -233,6 +230,9 @@ export class AIAgentRunDataHelper {
|
|
|
233
230
|
return { steps: [], promptRuns: [] };
|
|
234
231
|
}
|
|
235
232
|
const steps = SortAgentRunStepsByExecutionOrder(stepsResult.Results);
|
|
233
|
+
// Fill PayloadAtEnd and PayloadAtStart on steps that point at an earlier step's PayloadAtEnd.
|
|
234
|
+
ApplyResolvedPayloadAtEnd(steps);
|
|
235
|
+
ApplyResolvedPayloadAtStart(steps);
|
|
236
236
|
// Get prompt run IDs
|
|
237
237
|
const promptRunIds = steps
|
|
238
238
|
.filter(s => s.StepType === 'Prompt' && s.TargetLogID)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-agent-run-data.service.js","sourceRoot":"","sources":["../../../../src/lib/custom/ai-agent-run/ai-agent-run-data.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BehaviorSubject, Observable } from 'rxjs';\nimport { IMetadataProvider, Metadata, RunView } from '@memberjunction/core';\nimport { MJAIAgentRunEntity, MJAIAgentRunStepEntity, MJActionExecutionLogEntity, MJAIPromptRunEntity } from '@memberjunction/core-entities';\nimport { SortAgentRunStepsByExecutionOrder } from './agent-run-step-order';\n\nexport interface AgentRunData {\n steps: MJAIAgentRunStepEntity[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n subRuns: MJAIAgentRunEntity[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n actionLogs: MJActionExecutionLogEntity[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n promptRuns: MJAIPromptRunEntity[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n}\n\n/**\n * Helper class for managing AI Agent Run data per component instance\n * No longer a singleton Angular service - instantiated per component\n */\nexport class AIAgentRunDataHelper {\n // Data subjects\n private stepsSubject$ = new BehaviorSubject<MJAIAgentRunStepEntity[]>([]);\n private subRunsSubject$ = new BehaviorSubject<MJAIAgentRunEntity[]>([]);\n private actionLogsSubject$ = new BehaviorSubject<MJActionExecutionLogEntity[]>([]);\n private promptRunsSubject$ = new BehaviorSubject<MJAIPromptRunEntity[]>([]);\n private loadingSubject$ = new BehaviorSubject<boolean>(true);\n private errorSubject$ = new BehaviorSubject<string | null>(null);\n \n // Public observables\n Steps$ = this.stepsSubject$.asObservable();\n\n /** @deprecated Use {@link Steps$}. */\n get steps$() {\n return this.Steps$;\n }\n /** @deprecated Use {@link Steps$}. */\n set steps$(value) {\n this.Steps$ = value;\n }\n SubRuns$ = this.subRunsSubject$.asObservable();\n\n /** @deprecated Use {@link SubRuns$}. */\n get subRuns$() {\n return this.SubRuns$;\n }\n /** @deprecated Use {@link SubRuns$}. */\n set subRuns$(value) {\n this.SubRuns$ = value;\n }\n ActionLogs$ = this.actionLogsSubject$.asObservable();\n\n /** @deprecated Use {@link ActionLogs$}. */\n get actionLogs$() {\n return this.ActionLogs$;\n }\n /** @deprecated Use {@link ActionLogs$}. */\n set actionLogs$(value) {\n this.ActionLogs$ = value;\n }\n PromptRuns$ = this.promptRunsSubject$.asObservable();\n\n /** @deprecated Use {@link PromptRuns$}. */\n get promptRuns$() {\n return this.PromptRuns$;\n }\n /** @deprecated Use {@link PromptRuns$}. */\n set promptRuns$(value) {\n this.PromptRuns$ = value;\n }\n Loading$ = this.loadingSubject$.asObservable();\n\n /** @deprecated Use {@link Loading$}. */\n get loading$() {\n return this.Loading$;\n }\n /** @deprecated Use {@link Loading$}. */\n set loading$(value) {\n this.Loading$ = value;\n }\n Error$ = this.errorSubject$.asObservable();\n\n /** @deprecated Use {@link Error$}. */\n get error$() {\n return this.Error$;\n }\n /** @deprecated Use {@link Error$}. */\n set error$(value) {\n this.Error$ = value;\n }\n \n // Cache for sub-agent data with size limit\n private readonly MAX_CACHE_SIZE = 100; // Maximum 100 sub-agent entries\n private readonly CACHE_TTL_MS = 15 * 60 * 1000; // 15 minute TTL\n \n private subAgentDataCache = new Map<string, {\n steps: MJAIAgentRunStepEntity[];\n promptRuns: MJAIPromptRunEntity[];\n timestamp: number;\n }>();\n \n // Track cache access order for LRU eviction\n private cacheAccessOrder: string[] = [];\n \n private currentAgentRunId: string | null = null;\n\n /**\n * Optional explicit metadata provider. Set via `setProvider()` by the\n * owning component (which has provider context via BaseAngularComponent).\n * Falls back to `Metadata.Provider` when not set.\n */\n private _provider: IMetadataProvider | null = null;\n\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n }\n\n public get Provider(): IMetadataProvider {\n return this._provider ?? Metadata.Provider;\n }\n\n constructor() {}\n \n /**\n * Load all data for an agent run\n */\n async LoadAgentRunData(agentRunId: string, forceReload = false): Promise<void> {\n if (!agentRunId) {\n this.errorSubject$.next('No agent run ID provided');\n return;\n }\n \n // Skip cache check when force reloading\n if (!forceReload && this.currentAgentRunId === agentRunId && this.stepsSubject$.value.length > 0) {\n return;\n }\n \n this.currentAgentRunId = agentRunId;\n this.loadingSubject$.next(true);\n this.errorSubject$.next(null);\n \n // Clear cache when loading new run\n this.subAgentDataCache.clear();\n \n try {\n await this.loadStepsAndSubRuns(agentRunId);\n } catch (error) {\n this.errorSubject$.next('Failed to load agent run data');\n console.error('Error loading agent run data:', error);\n } finally {\n this.loadingSubject$.next(false);\n }\n }\n\n /** @deprecated Use {@link LoadAgentRunData}. */\n async loadAgentRunData(agentRunId: string, forceReload = false): Promise<void> {\n return this.LoadAgentRunData(agentRunId, forceReload);\n }\n \n private async loadStepsAndSubRuns(agentRunId: string) {\n const rv = RunView.FromMetadataProvider(this.Provider);\n \n // First, get all steps to determine what additional data we need\n // StartedAt is execution time (what the timeline paints). __mj_CreatedAt is persist time\n // and inverts for fast sibling steps whose fire-and-forget INSERTs race. StepNumber is\n // the same-millisecond tie-break. Client-sort after the query as well — T-SQL NULLs\n // sort first, and SQL datetime rounding can still disagree with JS Date.getTime().\n const stepsResult = await rv.RunView<MJAIAgentRunStepEntity>({\n EntityName: 'MJ: AI Agent Run Steps',\n ExtraFilter: `AgentRunID='${agentRunId}'`,\n OrderBy: 'StartedAt, StepNumber'\n });\n \n if (!stepsResult.Success) {\n throw new Error('Failed to load agent run steps');\n }\n \n const steps = SortAgentRunStepsByExecutionOrder(stepsResult.Results as MJAIAgentRunStepEntity[] || []);\n \n // Build filters for batch loading\n const actionLogIds = steps\n .filter(s => s.StepType === 'Actions' && s.TargetLogID)\n .map(s => s.TargetLogID)\n .filter(id => id != null);\n \n const promptRunIds = steps\n .filter(s => s.StepType === 'Prompt' && s.TargetLogID)\n .map(s => s.TargetLogID)\n .filter(id => id != null);\n \n // Build batch queries array\n const batchQueries: any[] = [\n // Sub-runs query\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `ParentRunID='${agentRunId}'`,\n OrderBy: 'StartedAt'\n },\n // Current run query\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `ID='${agentRunId}'`\n }\n ];\n \n // Add action logs query if needed\n if (actionLogIds.length > 0) {\n batchQueries.push({\n EntityName: 'MJ: Action Execution Logs',\n ExtraFilter: `ID IN ('${actionLogIds.join(\"','\")}')`,\n OrderBy: 'StartedAt'\n });\n }\n \n // Add prompt runs query if needed\n if (promptRunIds.length > 0) {\n batchQueries.push({\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: `ID IN ('${promptRunIds.join(\"','\")}')`,\n OrderBy: '__mj_CreatedAt'\n });\n }\n \n // Execute all queries in one batch\n const batchResults = await rv.RunViews(batchQueries);\n \n // Process results\n let resultIndex = 0;\n \n // Sub-runs\n const subRuns = batchResults[resultIndex].Success \n ? (batchResults[resultIndex].Results as MJAIAgentRunEntity[] || [])\n : [];\n resultIndex++;\n \n // Skip current run result\n resultIndex++;\n \n // Action logs\n const actionLogs = actionLogIds.length > 0 && batchResults[resultIndex]?.Success\n ? (batchResults[resultIndex].Results as MJActionExecutionLogEntity[] || [])\n : [];\n if (actionLogIds.length > 0) resultIndex++;\n \n // Prompt runs\n const promptRuns = promptRunIds.length > 0 && batchResults[resultIndex]?.Success\n ? (batchResults[resultIndex].Results as MJAIPromptRunEntity[] || [])\n : [];\n \n // Update all subjects\n this.stepsSubject$.next(steps);\n this.subRunsSubject$.next(subRuns);\n this.actionLogsSubject$.next(actionLogs);\n this.promptRunsSubject$.next(promptRuns);\n }\n \n /**\n * Load sub-agent data (for expanding sub-agent nodes)\n */\n async LoadSubAgentData(subAgentRunId: string): Promise<{ steps: MJAIAgentRunStepEntity[], promptRuns: MJAIPromptRunEntity[] }> {\n // Check cache first\n const cachedData = this.subAgentDataCache.get(subAgentRunId);\n if (cachedData) {\n // Check if cache is still valid\n const now = Date.now();\n if (now - cachedData.timestamp < this.CACHE_TTL_MS) {\n // Update access order for LRU\n this.updateCacheAccessOrder(subAgentRunId);\n return { steps: cachedData.steps, promptRuns: cachedData.promptRuns };\n } else {\n // Cache expired, remove it\n this.removeCacheEntry(subAgentRunId);\n }\n }\n \n const rv = RunView.FromMetadataProvider(this.Provider);\n\n // Load steps first to determine what else we need\n const stepsResult = await rv.RunView<MJAIAgentRunStepEntity>({\n EntityName: 'MJ: AI Agent Run Steps',\n ExtraFilter: `AgentRunID = '${subAgentRunId}'`,\n OrderBy: 'StartedAt, StepNumber'\n });\n \n if (!stepsResult.Success || !stepsResult.Results) {\n return { steps: [], promptRuns: [] };\n }\n \n const steps = SortAgentRunStepsByExecutionOrder(stepsResult.Results);\n \n // Get prompt run IDs\n const promptRunIds = steps\n .filter(s => s.StepType === 'Prompt' && s.TargetLogID)\n .map(s => s.TargetLogID)\n .filter(id => id != null);\n \n let promptRuns: MJAIPromptRunEntity[] = [];\n \n // Load prompt runs if needed\n if (promptRunIds.length > 0) {\n const promptResult = await rv.RunView<MJAIPromptRunEntity>({\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: `ID IN ('${promptRunIds.join(\"','\")}')`,\n OrderBy: '__mj_CreatedAt'\n });\n \n if (promptResult.Success) {\n promptRuns = promptResult.Results || [];\n }\n }\n \n // Cache the data with timestamp\n const data = { steps, promptRuns, timestamp: Date.now() };\n \n // Enforce cache size limit\n if (this.subAgentDataCache.size >= this.MAX_CACHE_SIZE) {\n // Remove least recently used entry\n const lruKey = this.cacheAccessOrder[0];\n if (lruKey && lruKey !== subAgentRunId) {\n this.removeCacheEntry(lruKey);\n }\n }\n \n this.subAgentDataCache.set(subAgentRunId, data);\n this.updateCacheAccessOrder(subAgentRunId);\n \n return data;\n }\n\n /** @deprecated Use {@link LoadSubAgentData}. */\n async loadSubAgentData(subAgentRunId: string): Promise<{ steps: MJAIAgentRunStepEntity[], promptRuns: MJAIPromptRunEntity[] }> {\n return this.LoadSubAgentData(subAgentRunId);\n }\n \n /**\n * Clear all data\n */\n ClearData() {\n this.stepsSubject$.next([]);\n this.subRunsSubject$.next([]);\n this.actionLogsSubject$.next([]);\n this.promptRunsSubject$.next([]);\n this.clearCache();\n this.currentAgentRunId = null;\n }\n\n /** @deprecated Use {@link ClearData}. */\n clearData() {\n return this.ClearData();\n }\n \n /**\n * Clear just the cache for the current agent run\n */\n ClearCurrentRunCache() {\n // Clear all cache entries related to current run\n if (this.currentAgentRunId) {\n const keysToRemove: string[] = [];\n for (const [key, value] of this.subAgentDataCache.entries()) {\n // You might want to add logic here to identify related entries\n keysToRemove.push(key);\n }\n keysToRemove.forEach(key => this.removeCacheEntry(key));\n }\n }\n\n /** @deprecated Use {@link ClearCurrentRunCache}. */\n clearCurrentRunCache() {\n return this.ClearCurrentRunCache();\n }\n \n /**\n * Clear entire cache\n */\n private clearCache() {\n this.subAgentDataCache.clear();\n this.cacheAccessOrder = [];\n }\n \n /**\n * Update cache access order for LRU eviction\n */\n private updateCacheAccessOrder(key: string) {\n const index = this.cacheAccessOrder.indexOf(key);\n if (index > -1) {\n this.cacheAccessOrder.splice(index, 1);\n }\n this.cacheAccessOrder.push(key);\n }\n \n /**\n * Remove a cache entry\n */\n private removeCacheEntry(key: string) {\n this.subAgentDataCache.delete(key);\n const index = this.cacheAccessOrder.indexOf(key);\n if (index > -1) {\n this.cacheAccessOrder.splice(index, 1);\n }\n }\n \n /**\n * Get cache statistics for monitoring\n */\n GetCacheStats() {\n return {\n size: this.subAgentDataCache.size,\n maxSize: this.MAX_CACHE_SIZE,\n ttlMs: this.CACHE_TTL_MS,\n accessOrder: [...this.cacheAccessOrder]\n };\n }\n\n /** @deprecated Use {@link GetCacheStats}. */\n getCacheStats() {\n return this.GetCacheStats();\n }\n \n /**\n * Get current data snapshot\n */\n GetCurrentData(): AgentRunData {\n return {\n steps: this.stepsSubject$.value,\n subRuns: this.subRunsSubject$.value,\n actionLogs: this.actionLogsSubject$.value,\n promptRuns: this.promptRunsSubject$.value\n };\n }\n\n /** @deprecated Use {@link GetCurrentData}. */\n getCurrentData(): AgentRunData {\n return this.GetCurrentData();\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"ai-agent-run-data.service.js","sourceRoot":"","sources":["../../../../src/lib/custom/ai-agent-run/ai-agent-run-data.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BehaviorSubject, Observable } from 'rxjs';\nimport { IMetadataProvider, Metadata, RunView, RunViewParams } from '@memberjunction/core';\nimport { MJAIAgentRunEntity, MJAIAgentRunStepEntity, MJActionExecutionLogEntity, MJAIPromptRunEntity } from '@memberjunction/core-entities';\nimport { ApplyResolvedPayloadAtStart, ApplyResolvedPayloadAtEnd } from '@memberjunction/ai-core-plus';\nimport { SortAgentRunStepsByExecutionOrder } from './agent-run-step-order';\n\nexport interface AgentRunData {\n steps: MJAIAgentRunStepEntity[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n subRuns: MJAIAgentRunEntity[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n actionLogs: MJActionExecutionLogEntity[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n promptRuns: MJAIPromptRunEntity[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n}\n\n/**\n * Helper class for managing AI Agent Run data per component instance\n * No longer a singleton Angular service - instantiated per component\n */\nexport class AIAgentRunDataHelper {\n // Data subjects\n private stepsSubject$ = new BehaviorSubject<MJAIAgentRunStepEntity[]>([]);\n private subRunsSubject$ = new BehaviorSubject<MJAIAgentRunEntity[]>([]);\n private actionLogsSubject$ = new BehaviorSubject<MJActionExecutionLogEntity[]>([]);\n private promptRunsSubject$ = new BehaviorSubject<MJAIPromptRunEntity[]>([]);\n private loadingSubject$ = new BehaviorSubject<boolean>(true);\n private errorSubject$ = new BehaviorSubject<string | null>(null);\n \n // Public observables\n Steps$ = this.stepsSubject$.asObservable();\n\n /** @deprecated Use {@link Steps$}. */\n get steps$() {\n return this.Steps$;\n }\n /** @deprecated Use {@link Steps$}. */\n set steps$(value) {\n this.Steps$ = value;\n }\n SubRuns$ = this.subRunsSubject$.asObservable();\n\n /** @deprecated Use {@link SubRuns$}. */\n get subRuns$() {\n return this.SubRuns$;\n }\n /** @deprecated Use {@link SubRuns$}. */\n set subRuns$(value) {\n this.SubRuns$ = value;\n }\n ActionLogs$ = this.actionLogsSubject$.asObservable();\n\n /** @deprecated Use {@link ActionLogs$}. */\n get actionLogs$() {\n return this.ActionLogs$;\n }\n /** @deprecated Use {@link ActionLogs$}. */\n set actionLogs$(value) {\n this.ActionLogs$ = value;\n }\n PromptRuns$ = this.promptRunsSubject$.asObservable();\n\n /** @deprecated Use {@link PromptRuns$}. */\n get promptRuns$() {\n return this.PromptRuns$;\n }\n /** @deprecated Use {@link PromptRuns$}. */\n set promptRuns$(value) {\n this.PromptRuns$ = value;\n }\n Loading$ = this.loadingSubject$.asObservable();\n\n /** @deprecated Use {@link Loading$}. */\n get loading$() {\n return this.Loading$;\n }\n /** @deprecated Use {@link Loading$}. */\n set loading$(value) {\n this.Loading$ = value;\n }\n Error$ = this.errorSubject$.asObservable();\n\n /** @deprecated Use {@link Error$}. */\n get error$() {\n return this.Error$;\n }\n /** @deprecated Use {@link Error$}. */\n set error$(value) {\n this.Error$ = value;\n }\n \n // Cache for sub-agent data with size limit\n private readonly MAX_CACHE_SIZE = 100; // Maximum 100 sub-agent entries\n private readonly CACHE_TTL_MS = 15 * 60 * 1000; // 15 minute TTL\n \n private subAgentDataCache = new Map<string, {\n steps: MJAIAgentRunStepEntity[];\n promptRuns: MJAIPromptRunEntity[];\n timestamp: number;\n }>();\n \n // Track cache access order for LRU eviction\n private cacheAccessOrder: string[] = [];\n \n private currentAgentRunId: string | null = null;\n\n /**\n * Optional explicit metadata provider. Set via `setProvider()` by the\n * owning component (which has provider context via BaseAngularComponent).\n * Falls back to `Metadata.Provider` when not set.\n */\n private _provider: IMetadataProvider | null = null;\n\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n }\n\n public get Provider(): IMetadataProvider {\n return this._provider ?? Metadata.Provider;\n }\n\n constructor() {}\n \n /**\n * Load all data for an agent run\n */\n async LoadAgentRunData(agentRunId: string, forceReload = false): Promise<void> {\n if (!agentRunId) {\n this.errorSubject$.next('No agent run ID provided');\n return;\n }\n \n // Skip cache check when force reloading\n if (!forceReload && this.currentAgentRunId === agentRunId && this.stepsSubject$.value.length > 0) {\n return;\n }\n \n this.currentAgentRunId = agentRunId;\n this.loadingSubject$.next(true);\n this.errorSubject$.next(null);\n \n // Clear cache when loading new run\n this.subAgentDataCache.clear();\n \n try {\n await this.loadStepsAndSubRuns(agentRunId);\n } catch (error) {\n this.errorSubject$.next('Failed to load agent run data');\n console.error('Error loading agent run data:', error);\n } finally {\n this.loadingSubject$.next(false);\n }\n }\n\n /** @deprecated Use {@link LoadAgentRunData}. */\n async loadAgentRunData(agentRunId: string, forceReload = false): Promise<void> {\n return this.LoadAgentRunData(agentRunId, forceReload);\n }\n \n private async loadStepsAndSubRuns(agentRunId: string) {\n const rv = RunView.FromMetadataProvider(this.Provider);\n \n // First, get all steps to determine what additional data we need\n // StartedAt is execution time (what the timeline paints). __mj_CreatedAt is persist time\n // and inverts for fast sibling steps whose fire-and-forget INSERTs race. StepNumber is\n // the same-millisecond tie-break. Client-sort after the query as well — T-SQL NULLs\n // sort first, and SQL datetime rounding can still disagree with JS Date.getTime().\n const stepsResult = await rv.RunView<MJAIAgentRunStepEntity>({\n EntityName: 'MJ: AI Agent Run Steps',\n ExtraFilter: `AgentRunID='${agentRunId}'`,\n OrderBy: 'StartedAt, StepNumber'\n });\n \n if (!stepsResult.Success) {\n throw new Error('Failed to load agent run steps');\n }\n \n const steps = SortAgentRunStepsByExecutionOrder(stepsResult.Results as MJAIAgentRunStepEntity[] || []);\n // Fill PayloadAtEnd and PayloadAtStart on steps that point at an earlier step's PayloadAtEnd.\n ApplyResolvedPayloadAtEnd(steps);\n ApplyResolvedPayloadAtStart(steps);\n \n // Build filters for batch loading\n const actionLogIds = steps\n .filter(s => s.StepType === 'Actions' && s.TargetLogID)\n .map(s => s.TargetLogID)\n .filter(id => id != null);\n \n const promptRunIds = steps\n .filter(s => s.StepType === 'Prompt' && s.TargetLogID)\n .map(s => s.TargetLogID)\n .filter(id => id != null);\n \n // Build batch queries array\n const batchQueries: RunViewParams[] = [\n // Sub-runs query\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `ParentRunID='${agentRunId}'`,\n OrderBy: 'StartedAt'\n }\n ];\n \n // Add action logs query if needed\n if (actionLogIds.length > 0) {\n batchQueries.push({\n EntityName: 'MJ: Action Execution Logs',\n ExtraFilter: `ID IN ('${actionLogIds.join(\"','\")}')`,\n OrderBy: 'StartedAt'\n });\n }\n \n // Add prompt runs query if needed\n if (promptRunIds.length > 0) {\n batchQueries.push({\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: `ID IN ('${promptRunIds.join(\"','\")}')`,\n OrderBy: '__mj_CreatedAt'\n });\n }\n \n // Execute all queries in one batch\n const batchResults = await rv.RunViews(batchQueries);\n \n // Process results\n let resultIndex = 0;\n \n // Sub-runs\n const subRuns = batchResults[resultIndex]?.Success \n ? (batchResults[resultIndex].Results as MJAIAgentRunEntity[] || [])\n : [];\n resultIndex++;\n \n // Action logs\n const actionLogs = actionLogIds.length > 0 && batchResults[resultIndex]?.Success\n ? (batchResults[resultIndex].Results as MJActionExecutionLogEntity[] || [])\n : [];\n if (actionLogIds.length > 0) resultIndex++;\n \n // Prompt runs\n const promptRuns = promptRunIds.length > 0 && batchResults[resultIndex]?.Success\n ? (batchResults[resultIndex].Results as MJAIPromptRunEntity[] || [])\n : [];\n \n // Update all subjects\n this.stepsSubject$.next(steps);\n this.subRunsSubject$.next(subRuns);\n this.actionLogsSubject$.next(actionLogs);\n this.promptRunsSubject$.next(promptRuns);\n }\n \n /**\n * Load sub-agent data (for expanding sub-agent nodes)\n */\n async LoadSubAgentData(subAgentRunId: string): Promise<{ steps: MJAIAgentRunStepEntity[], promptRuns: MJAIPromptRunEntity[] }> {\n // Check cache first\n const cachedData = this.subAgentDataCache.get(subAgentRunId);\n if (cachedData) {\n // Check if cache is still valid\n const now = Date.now();\n if (now - cachedData.timestamp < this.CACHE_TTL_MS) {\n // Update access order for LRU\n this.updateCacheAccessOrder(subAgentRunId);\n return { steps: cachedData.steps, promptRuns: cachedData.promptRuns };\n } else {\n // Cache expired, remove it\n this.removeCacheEntry(subAgentRunId);\n }\n }\n \n const rv = RunView.FromMetadataProvider(this.Provider);\n\n // Load steps first to determine what else we need\n const stepsResult = await rv.RunView<MJAIAgentRunStepEntity>({\n EntityName: 'MJ: AI Agent Run Steps',\n ExtraFilter: `AgentRunID = '${subAgentRunId}'`,\n OrderBy: 'StartedAt, StepNumber'\n });\n \n if (!stepsResult.Success || !stepsResult.Results) {\n return { steps: [], promptRuns: [] };\n }\n \n const steps = SortAgentRunStepsByExecutionOrder(stepsResult.Results);\n // Fill PayloadAtEnd and PayloadAtStart on steps that point at an earlier step's PayloadAtEnd.\n ApplyResolvedPayloadAtEnd(steps);\n ApplyResolvedPayloadAtStart(steps);\n \n // Get prompt run IDs\n const promptRunIds = steps\n .filter(s => s.StepType === 'Prompt' && s.TargetLogID)\n .map(s => s.TargetLogID)\n .filter(id => id != null);\n \n let promptRuns: MJAIPromptRunEntity[] = [];\n \n // Load prompt runs if needed\n if (promptRunIds.length > 0) {\n const promptResult = await rv.RunView<MJAIPromptRunEntity>({\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: `ID IN ('${promptRunIds.join(\"','\")}')`,\n OrderBy: '__mj_CreatedAt'\n });\n \n if (promptResult.Success) {\n promptRuns = promptResult.Results || [];\n }\n }\n \n // Cache the data with timestamp\n const data = { steps, promptRuns, timestamp: Date.now() };\n \n // Enforce cache size limit\n if (this.subAgentDataCache.size >= this.MAX_CACHE_SIZE) {\n // Remove least recently used entry\n const lruKey = this.cacheAccessOrder[0];\n if (lruKey && lruKey !== subAgentRunId) {\n this.removeCacheEntry(lruKey);\n }\n }\n \n this.subAgentDataCache.set(subAgentRunId, data);\n this.updateCacheAccessOrder(subAgentRunId);\n \n return data;\n }\n\n /** @deprecated Use {@link LoadSubAgentData}. */\n async loadSubAgentData(subAgentRunId: string): Promise<{ steps: MJAIAgentRunStepEntity[], promptRuns: MJAIPromptRunEntity[] }> {\n return this.LoadSubAgentData(subAgentRunId);\n }\n \n /**\n * Clear all data\n */\n ClearData() {\n this.stepsSubject$.next([]);\n this.subRunsSubject$.next([]);\n this.actionLogsSubject$.next([]);\n this.promptRunsSubject$.next([]);\n this.clearCache();\n this.currentAgentRunId = null;\n }\n\n /** @deprecated Use {@link ClearData}. */\n clearData() {\n return this.ClearData();\n }\n \n /**\n * Clear just the cache for the current agent run\n */\n ClearCurrentRunCache() {\n // Clear all cache entries related to current run\n if (this.currentAgentRunId) {\n const keysToRemove: string[] = [];\n for (const [key, value] of this.subAgentDataCache.entries()) {\n // You might want to add logic here to identify related entries\n keysToRemove.push(key);\n }\n keysToRemove.forEach(key => this.removeCacheEntry(key));\n }\n }\n\n /** @deprecated Use {@link ClearCurrentRunCache}. */\n clearCurrentRunCache() {\n return this.ClearCurrentRunCache();\n }\n \n /**\n * Clear entire cache\n */\n private clearCache() {\n this.subAgentDataCache.clear();\n this.cacheAccessOrder = [];\n }\n \n /**\n * Update cache access order for LRU eviction\n */\n private updateCacheAccessOrder(key: string) {\n const index = this.cacheAccessOrder.indexOf(key);\n if (index > -1) {\n this.cacheAccessOrder.splice(index, 1);\n }\n this.cacheAccessOrder.push(key);\n }\n \n /**\n * Remove a cache entry\n */\n private removeCacheEntry(key: string) {\n this.subAgentDataCache.delete(key);\n const index = this.cacheAccessOrder.indexOf(key);\n if (index > -1) {\n this.cacheAccessOrder.splice(index, 1);\n }\n }\n \n /**\n * Get cache statistics for monitoring\n */\n GetCacheStats() {\n return {\n size: this.subAgentDataCache.size,\n maxSize: this.MAX_CACHE_SIZE,\n ttlMs: this.CACHE_TTL_MS,\n accessOrder: [...this.cacheAccessOrder]\n };\n }\n\n /** @deprecated Use {@link GetCacheStats}. */\n getCacheStats() {\n return this.GetCacheStats();\n }\n \n /**\n * Get current data snapshot\n */\n GetCurrentData(): AgentRunData {\n return {\n steps: this.stepsSubject$.value,\n subRuns: this.subRunsSubject$.value,\n actionLogs: this.actionLogsSubject$.value,\n promptRuns: this.promptRunsSubject$.value\n };\n }\n\n /** @deprecated Use {@link GetCurrentData}. */\n getCurrentData(): AgentRunData {\n return this.GetCurrentData();\n }\n}"]}
|