@memberjunction/ng-conversations 5.30.0 → 5.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts +2 -1
- package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts.map +1 -1
- package/dist/lib/components/collection/artifact-collection-picker-modal.component.js +9 -6
- package/dist/lib/components/collection/artifact-collection-picker-modal.component.js.map +1 -1
- package/dist/lib/components/collection/artifact-create-modal.component.d.ts +2 -1
- package/dist/lib/components/collection/artifact-create-modal.component.d.ts.map +1 -1
- package/dist/lib/components/collection/artifact-create-modal.component.js +9 -6
- package/dist/lib/components/collection/artifact-create-modal.component.js.map +1 -1
- package/dist/lib/components/collection/collection-form-modal.component.d.ts +2 -1
- package/dist/lib/components/collection/collection-form-modal.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-form-modal.component.js +8 -5
- package/dist/lib/components/collection/collection-form-modal.component.js.map +1 -1
- package/dist/lib/components/collection/collection-tree.component.d.ts +2 -1
- package/dist/lib/components/collection/collection-tree.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-tree.component.js +9 -6
- package/dist/lib/components/collection/collection-tree.component.js.map +1 -1
- package/dist/lib/components/collection/collection-view.component.d.ts +2 -1
- package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-view.component.js +12 -10
- package/dist/lib/components/collection/collection-view.component.js.map +1 -1
- package/dist/lib/components/collection/collections-full-view.component.d.ts +2 -1
- package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collections-full-view.component.js +18 -12
- package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +2 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.js +22 -11
- package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
- package/dist/lib/components/library/library-full-view.component.d.ts +2 -1
- package/dist/lib/components/library/library-full-view.component.d.ts.map +1 -1
- package/dist/lib/components/library/library-full-view.component.js +8 -5
- package/dist/lib/components/library/library-full-view.component.js.map +1 -1
- package/dist/lib/components/message/conversation-message-rating.component.d.ts +2 -1
- package/dist/lib/components/message/conversation-message-rating.component.d.ts.map +1 -1
- package/dist/lib/components/message/conversation-message-rating.component.js +9 -7
- package/dist/lib/components/message/conversation-message-rating.component.js.map +1 -1
- package/dist/lib/components/message/message-input.component.d.ts +2 -1
- package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-input.component.js +12 -5
- package/dist/lib/components/message/message-input.component.js.map +1 -1
- package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-item.component.js +6 -1
- package/dist/lib/components/message/message-item.component.js.map +1 -1
- package/dist/lib/components/overlay/chat-overlay.component.d.ts +2 -1
- package/dist/lib/components/overlay/chat-overlay.component.d.ts.map +1 -1
- package/dist/lib/components/overlay/chat-overlay.component.js +6 -6
- package/dist/lib/components/overlay/chat-overlay.component.js.map +1 -1
- package/dist/lib/components/project/project-form-modal.component.d.ts +2 -1
- package/dist/lib/components/project/project-form-modal.component.d.ts.map +1 -1
- package/dist/lib/components/project/project-form-modal.component.js +6 -5
- package/dist/lib/components/project/project-form-modal.component.js.map +1 -1
- package/dist/lib/components/project/project-selector.component.d.ts +2 -1
- package/dist/lib/components/project/project-selector.component.d.ts.map +1 -1
- package/dist/lib/components/project/project-selector.component.js +8 -6
- package/dist/lib/components/project/project-selector.component.js.map +1 -1
- package/dist/lib/components/share/share-modal.component.d.ts +2 -1
- package/dist/lib/components/share/share-modal.component.d.ts.map +1 -1
- package/dist/lib/components/share/share-modal.component.js +11 -9
- package/dist/lib/components/share/share-modal.component.js.map +1 -1
- package/dist/lib/components/shared/user-picker.component.d.ts +2 -1
- package/dist/lib/components/shared/user-picker.component.d.ts.map +1 -1
- package/dist/lib/components/shared/user-picker.component.js +6 -4
- package/dist/lib/components/shared/user-picker.component.js.map +1 -1
- package/dist/lib/components/task/tasks-full-view.component.d.ts +2 -1
- package/dist/lib/components/task/tasks-full-view.component.d.ts.map +1 -1
- package/dist/lib/components/task/tasks-full-view.component.js +9 -8
- package/dist/lib/components/task/tasks-full-view.component.js.map +1 -1
- package/dist/lib/components/tasks/tasks-dropdown.component.d.ts.map +1 -1
- package/dist/lib/components/tasks/tasks-dropdown.component.js +5 -0
- package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -1
- package/dist/lib/components/thread/thread-panel.component.d.ts +2 -1
- package/dist/lib/components/thread/thread-panel.component.d.ts.map +1 -1
- package/dist/lib/components/thread/thread-panel.component.js +7 -4
- package/dist/lib/components/thread/thread-panel.component.js.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.js +8 -4
- package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
- package/dist/lib/models/lazy-artifact-info.js +1 -1
- package/dist/lib/models/lazy-artifact-info.js.map +1 -1
- package/dist/lib/services/active-tasks.service.d.ts +7 -1
- package/dist/lib/services/active-tasks.service.d.ts.map +1 -1
- package/dist/lib/services/active-tasks.service.js +12 -2
- package/dist/lib/services/active-tasks.service.js.map +1 -1
- package/dist/lib/services/agent-state.service.d.ts +7 -1
- package/dist/lib/services/agent-state.service.d.ts.map +1 -1
- package/dist/lib/services/agent-state.service.js +12 -2
- package/dist/lib/services/agent-state.service.js.map +1 -1
- package/dist/lib/services/artifact-permission.service.d.ts +8 -1
- package/dist/lib/services/artifact-permission.service.d.ts.map +1 -1
- package/dist/lib/services/artifact-permission.service.js +21 -7
- package/dist/lib/services/artifact-permission.service.js.map +1 -1
- package/dist/lib/services/artifact-state.service.d.ts +8 -1
- package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
- package/dist/lib/services/artifact-state.service.js +25 -11
- package/dist/lib/services/artifact-state.service.js.map +1 -1
- package/dist/lib/services/artifact-use-tracking.service.d.ts +7 -1
- package/dist/lib/services/artifact-use-tracking.service.d.ts.map +1 -1
- package/dist/lib/services/artifact-use-tracking.service.js +12 -2
- package/dist/lib/services/artifact-use-tracking.service.js.map +1 -1
- package/dist/lib/services/collection-permission.service.d.ts +7 -1
- package/dist/lib/services/collection-permission.service.d.ts.map +1 -1
- package/dist/lib/services/collection-permission.service.js +19 -9
- package/dist/lib/services/collection-permission.service.js.map +1 -1
- package/dist/lib/services/conversation-agent.service.d.ts +8 -0
- package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-agent.service.js +15 -3
- package/dist/lib/services/conversation-agent.service.js.map +1 -1
- package/dist/lib/services/conversation-attachment.service.d.ts +7 -1
- package/dist/lib/services/conversation-attachment.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-attachment.service.js +12 -2
- package/dist/lib/services/conversation-attachment.service.js.map +1 -1
- package/dist/lib/services/data-cache.service.d.ts +7 -1
- package/dist/lib/services/data-cache.service.d.ts.map +1 -1
- package/dist/lib/services/data-cache.service.js +16 -7
- package/dist/lib/services/data-cache.service.js.map +1 -1
- package/dist/lib/services/export.service.d.ts +7 -1
- package/dist/lib/services/export.service.d.ts.map +1 -1
- package/dist/lib/services/export.service.js +12 -2
- package/dist/lib/services/export.service.js.map +1 -1
- package/dist/lib/services/search.service.d.ts +7 -1
- package/dist/lib/services/search.service.d.ts.map +1 -1
- package/dist/lib/services/search.service.js +16 -6
- package/dist/lib/services/search.service.js.map +1 -1
- package/package.json +22 -22
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-workspace.component.js","sourceRoot":"","sources":["../../../../src/lib/components/workspace/conversation-workspace.component.ts","../../../../src/lib/components/workspace/conversation-workspace.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * ============================================================================\n * DEPRECATED - DO NOT USE\n * ============================================================================\n *\n * This workspace component was used when conversations, collections, and tasks\n * were all combined into a single tabbed interface.\n *\n * The new architecture uses SEPARATE resource components for each feature:\n * - ChatConversationsResource for conversations\n * - CollectionsResource for collections\n * - TasksResource for tasks\n *\n * These resource components are located in @memberjunction/ng-explorer-core\n * and integrate with MJExplorer's tab/navigation system.\n *\n * This file is kept for backwards compatibility only. Any new features or\n * bug fixes should be made to the individual resource components instead.\n * ============================================================================\n */\n\nimport {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnDestroy,\n DoCheck,\n ChangeDetectorRef,\n HostListener\n} from '@angular/core';\nimport { MJConversationEntity, MJArtifactEntity, MJTaskEntity, ArtifactMetadataEngine, MJUserSettingEntity, UserInfoEngine, ConversationEngine } from '@memberjunction/core-entities';\nimport { UserInfo, CompositeKey, KeyValuePair, Metadata } from '@memberjunction/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { ArtifactStateService } from '../../services/artifact-state.service';\nimport { CollectionStateService } from '../../services/collection-state.service';\nimport { ArtifactPermissionService } from '../../services/artifact-permission.service';\nimport { MentionAutocompleteService } from '../../services/mention-autocomplete.service';\nimport { ConversationStreamingService } from '../../services/conversation-streaming.service';\nimport { UICommandHandlerService } from '../../services/ui-command-handler.service';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { NavigationTab, WorkspaceLayout } from '../../models/conversation-state.model';\nimport { SearchResult } from '../../services/search.service';\nimport { Subject, takeUntil } from 'rxjs';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { ActionableCommand, AutomaticCommand } from '@memberjunction/ai-core-plus';\nimport { NavigationRequest } from '@memberjunction/ng-artifacts';\nimport { PendingAttachment } from '../mention/mention-editor.component';\n\n/**\n * Top-level workspace component for conversations\n * Provides 3-column Slack-style layout: Navigation | Sidebar | Chat Area | Artifact Panel\n * Supports context-based navigation (library or task views)\n *\n * @deprecated Use ChatConversationsResource from @memberjunction/ng-explorer-core instead.\n * This component is maintained for backwards compatibility but the resource-wrapper pattern\n * is the preferred approach for MJExplorer integration.\n */\n@Component({\n standalone: false,\n selector: 'mj-conversation-workspace',\n templateUrl: './conversation-workspace.component.html',\n styleUrls: ['./conversation-workspace.component.css']\n})\nexport class ConversationWorkspaceComponent extends BaseAngularComponent implements OnInit, OnDestroy, DoCheck {\n @Input() environmentId!: string;\n @Input() initialConversationId?: string;\n @Input() layout: WorkspaceLayout = 'full';\n @Input() currentUser!: UserInfo;\n @Input() activeContext?: 'library' | 'task';\n @Input() contextItemId?: string;\n\n // Navigation properties for external control (deep linking from URL)\n @Input() set activeTabInput(value: 'conversations' | 'collections' | 'tasks' | undefined) {\n if (value && value !== this.activeTab) {\n this.activeTab = value;\n }\n }\n\n @Input() set activeConversationInput(value: string | undefined) {\n if (value && value !== this.selectedConversationId) {\n console.log('🔗 Deep link to conversation:', value);\n this.activeTab = 'conversations';\n this.setActiveConversation(value);\n }\n }\n\n @Input() set activeCollectionInput(value: string | undefined) {\n if (value && value !== this.collectionState.activeCollectionId) {\n console.log('🔗 Deep link to collection:', value);\n this.activeTab = 'collections';\n this.collectionState.setActiveCollection(value);\n }\n }\n\n @Input() set activeVersionIdInput(value: string | undefined) {\n if (value && value !== this.activeVersionId) {\n console.log('🔗 Deep link to version:', value);\n this.activeTab = 'collections';\n // Store the version ID immediately to prevent ngDoCheck from clearing it\n this.activeVersionId = value;\n // Open artifact by version ID\n this.artifactState.openArtifactByVersionId(value);\n }\n }\n\n @Input() set activeTaskInput(value: string | undefined) {\n if (value && value !== this._activeTaskId) {\n this._activeTaskId = value;\n }\n }\n\n private _activeTaskId?: string;\n get activeTaskId(): string | undefined {\n return this._activeTaskId;\n }\n\n @Output() conversationChanged = new EventEmitter<MJConversationEntity>();\n @Output() artifactOpened = new EventEmitter<MJArtifactEntity>();\n @Output() navigationChanged = new EventEmitter<{\n tab: 'conversations' | 'collections' | 'tasks';\n conversationId?: string;\n collectionId?: string;\n versionId?: string;\n taskId?: string;\n }>();\n @Output() newConversationStarted = new EventEmitter<void>();\n @Output() actionableCommandExecuted = new EventEmitter<ActionableCommand>();\n @Output() automaticCommandExecuted = new EventEmitter<AutomaticCommand>();\n @Output() navigationRequested = new EventEmitter<NavigationRequest>();\n\n public activeTab: NavigationTab = 'conversations';\n public isSidebarVisible: boolean = true;\n public isArtifactPanelOpen: boolean = false;\n public isSearchPanelOpen: boolean = false;\n public isWorkspaceReady: boolean = false;\n public renamedConversationId: string | null = null;\n public activeArtifactId: string | null = null;\n public activeVersionNumber: number | null = null;\n public activeVersionId: string | null = null;\n public isMobileView: boolean = false;\n public isSidebarPinned: boolean = false; // Default unpinned until settings load (prevents flicker)\n\n // Artifact permissions\n public canShareActiveArtifact: boolean = false;\n public canEditActiveArtifact: boolean = false;\n\n // Share modal state\n public isArtifactShareModalOpen: boolean = false;\n public artifactToShare: MJArtifactEntity | null = null;\n\n // Resize state - Sidebar\n public sidebarWidth: number = 260; // Default width\n public isSidebarCollapsed: boolean = true; // Default collapsed until settings load (prevents flicker)\n public sidebarTransitionsEnabled: boolean = false; // Disabled during initial load to prevent jarring animation\n public isSidebarSettingsLoaded: boolean = false; // Tracks whether settings have been loaded (prevents render before state is known)\n private isSidebarResizing: boolean = false;\n private sidebarResizeStartX: number = 0;\n private sidebarResizeStartWidth: number = 0;\n\n // Resize state - Artifact Panel\n public artifactPanelWidth: number = 40; // Default 40% width\n public isArtifactPanelMaximized: boolean = false;\n private artifactPanelWidthBeforeMaximize: number = 40; // Store width before maximizing\n private isArtifactPanelResizing: boolean = false;\n private artifactPanelResizeStartX: number = 0;\n private artifactPanelResizeStartWidth: number = 0;\n\n private previousConversationId: string | null = null;\n private previousTaskId: string | undefined = undefined;\n private previousVersionId: string | null = null; // Used to track version changes in ngDoCheck\n private previousIsNewConversation: boolean = false; // Track new conversation state changes\n private destroy$ = new Subject<void>();\n\n // User Settings key for server-side persistence\n private readonly USER_SETTING_SIDEBAR_KEY = 'Conversations.SidebarState';\n private saveSettingsTimeout: ReturnType<typeof setTimeout> | null = null;\n private isLoadingSettings: boolean = false;\n\n // Task filter for conversation-specific filtering\n public tasksFilter: string = '1=1';\n\n // LOCAL CONVERSATION STATE - enables multiple workspace instances\n // Each workspace manages its own selection state independently\n public selectedConversationId: string | null = null;\n public selectedConversation: MJConversationEntity | null = null;\n public selectedThreadId: string | null = null;\n public isNewUnsavedConversation: boolean = false;\n public pendingMessageToSend: string | null = null;\n public pendingAttachmentsToSend: PendingAttachment[] | null = null;\n public pendingArtifactId: string | null = null;\n public pendingArtifactVersionNumber: number | null = null;\n\n private engine = ConversationEngine.Instance;\n\n constructor(\n public artifactState: ArtifactStateService,\n public collectionState: CollectionStateService,\n private artifactPermissionService: ArtifactPermissionService,\n private mentionAutocompleteService: MentionAutocompleteService,\n private notificationService: MJNotificationService,\n private streamingService: ConversationStreamingService,\n private uiCommandHandler: UICommandHandlerService,\n private cdr: ChangeDetectorRef\n ) {\n super();\n }\n\n // =========================================================================\n // LOCAL CONVERSATION STATE MANAGEMENT\n // These methods manage the workspace's local selection state\n // =========================================================================\n\n /**\n * Sets the active conversation for this workspace instance\n * @param id The conversation ID to activate (or null to clear)\n */\n setActiveConversation(id: string | null): void {\n console.log('🎯 Setting active conversation:', id);\n this.selectedConversationId = id;\n this.selectedConversation = id ? (this.engine.GetConversation(id) ?? null) : null;\n // Clear unsaved state when switching to an existing conversation\n if (id) {\n this.isNewUnsavedConversation = false;\n }\n }\n\n /**\n * Initiates a new unsaved conversation (doesn't create DB record yet)\n * This shows the welcome screen and delays DB creation until first message\n */\n startNewConversation(): void {\n console.log('✨ Starting new unsaved conversation');\n this.selectedConversationId = null;\n this.selectedConversation = null;\n this.isNewUnsavedConversation = true;\n this.pendingMessageToSend = null;\n this.pendingAttachmentsToSend = null;\n\n // Auto-collapse if mobile OR if sidebar is not pinned\n if (this.isMobileView || !this.isSidebarPinned) {\n this.collapseSidebar();\n }\n }\n\n /**\n * Clears the new unsaved conversation state\n * Called when the conversation is actually created or cancelled\n */\n clearNewConversationState(): void {\n this.isNewUnsavedConversation = false;\n }\n\n /**\n * Opens a thread panel for a specific message\n * @param messageId The parent message ID\n */\n openThread(messageId: string): void {\n this.selectedThreadId = messageId;\n }\n\n /**\n * Closes the currently open thread panel\n */\n closeThread(): void {\n this.selectedThreadId = null;\n }\n\n /**\n * Handler for conversation selection from sidebar/list\n */\n onConversationSelected(conversationId: string): void {\n this.setActiveConversation(conversationId);\n\n // Auto-collapse if mobile OR if sidebar is not pinned\n if (this.isMobileView || !this.isSidebarPinned) {\n this.collapseSidebar();\n }\n }\n\n /**\n * Handler for new conversation creation from chat area\n * Now includes pending message and attachments to ensure atomic state update\n */\n onConversationCreated(event: {\n conversation: MJConversationEntity;\n pendingMessage?: string;\n pendingAttachments?: PendingAttachment[];\n }): void {\n try {\n // Set ALL state atomically before Angular change detection runs\n // This ensures the new message-input component receives the pending data\n this.pendingMessageToSend = event.pendingMessage || null;\n this.pendingAttachmentsToSend = event.pendingAttachments || null;\n this.selectedConversationId = event.conversation.ID;\n this.selectedConversation = event.conversation;\n this.isNewUnsavedConversation = false;\n // The conversation is already added to ConversationEngine by the chat area\n } catch (error) {\n console.error('onConversationCreated ERROR:', error);\n }\n }\n\n /**\n * Handler for pending message requested from chat area (empty state)\n * @deprecated Use onConversationCreated with pendingMessage instead\n */\n onPendingMessageRequested(event: {text: string; attachments: PendingAttachment[]}): void {\n this.pendingMessageToSend = event.text;\n this.pendingAttachmentsToSend = event.attachments;\n }\n\n /**\n * Handler for thread opened from chat area\n */\n onThreadOpened(threadId: string): void {\n this.selectedThreadId = threadId;\n }\n\n /**\n * Handler for thread closed from chat area\n */\n onThreadClosed(): void {\n this.selectedThreadId = null;\n }\n\n async ngOnInit() {\n // Initialize global streaming service FIRST\n // This establishes the single PubSub connection for all conversations\n this.streamingService.initialize();\n console.log('✅ Global streaming service initialized');\n\n // Subscribe to command events from UI Command Handler service\n // These will be bubbled up to the host application\n this.uiCommandHandler.actionableCommandRequested\n .pipe(takeUntil(this.destroy$))\n .subscribe(command => {\n this.onActionableCommand(command);\n });\n\n this.uiCommandHandler.automaticCommandRequested\n .pipe(takeUntil(this.destroy$))\n .subscribe(command => {\n this.onAutomaticCommand(command);\n });\n\n // Check initial mobile state FIRST\n this.checkMobileView();\n\n // Load sidebar state - but on mobile, always default to collapsed\n if (this.isMobileView) {\n this.isSidebarCollapsed = true;\n this.isSidebarVisible = false;\n this.isSidebarSettingsLoaded = true; // Mobile doesn't need to load settings\n // Enable transitions after a brief delay to ensure initial state is applied\n setTimeout(() => {\n this.sidebarTransitionsEnabled = true;\n }, 50);\n } else {\n // Load from User Settings (async) - await before continuing to prevent flicker\n await this.loadSidebarState();\n this.cdr.detectChanges();\n // Enable transitions after state is loaded and applied\n setTimeout(() => {\n this.sidebarTransitionsEnabled = true;\n }, 50);\n }\n\n // Setup resize listeners\n window.addEventListener('mousemove', this.onResizeMove.bind(this));\n window.addEventListener('mouseup', this.onResizeEnd.bind(this));\n\n // Setup touch listeners for mobile\n window.addEventListener('touchmove', this.onResizeTouchMove.bind(this));\n window.addEventListener('touchend', this.onResizeTouchEnd.bind(this));\n\n // CRITICAL: Initialize engines FIRST before rendering any UI\n // The isWorkspaceReady flag blocks all child components from rendering\n // until engines are fully loaded and ready\n try {\n // Load both engines in parallel - ArtifactMetadataEngine is lightweight (just artifact types)\n // Using Promise.all ensures optimal performance with no additional delay\n await Promise.all([\n AIEngineBase.Instance.Config(false),\n ArtifactMetadataEngine.Instance.Config(false)\n ]);\n\n console.log('✅ AI Engine initialized with', AIEngineBase.Instance.Agents?.length || 0, 'agents');\n console.log('✅ Artifact Metadata Engine initialized with',\n ArtifactMetadataEngine.Instance.ArtifactTypes?.length || 0, 'artifact types');\n\n // Initialize mention autocomplete service immediately after AI engine\n // This ensures the cache is built from the fully-loaded agent list\n await this.mentionAutocompleteService.initialize(this.currentUser);\n console.log('✅ Mention autocomplete initialized');\n\n // Mark workspace as ready - this allows UI to render\n this.isWorkspaceReady = true;\n this.cdr.detectChanges();\n } catch (error) {\n console.error('❌ Failed to initialize engines:', error);\n // Still mark as ready so UI isn't blocked forever\n this.isWorkspaceReady = true;\n this.cdr.detectChanges();\n }\n\n // Subscribe to artifact panel state\n this.artifactState.isPanelOpen$\n .pipe(takeUntil(this.destroy$))\n .subscribe(isOpen => {\n this.isArtifactPanelOpen = isOpen;\n });\n\n // Subscribe to active artifact ID\n this.artifactState.activeArtifactId$\n .pipe(takeUntil(this.destroy$))\n .subscribe(async id => {\n this.activeArtifactId = id;\n // Load permissions when artifact changes\n if (id) {\n await this.loadArtifactPermissions(id);\n } else {\n this.canShareActiveArtifact = false;\n this.canEditActiveArtifact = false;\n }\n });\n\n // Subscribe to active version number\n this.artifactState.activeVersionNumber$\n .pipe(takeUntil(this.destroy$))\n .subscribe(versionNumber => {\n this.activeVersionNumber = versionNumber;\n });\n\n // Set initial conversation if provided\n if (this.initialConversationId) {\n this.setActiveConversation(this.initialConversationId);\n }\n\n // Handle context-based navigation\n if (this.activeContext === 'library') {\n this.activeTab = 'collections';\n }\n // Task context will be handled by chat header dropdown, not navigation tabs\n\n // Build task filter for conversations domain\n this.buildTasksFilter();\n }\n\n /**\n * Builds the SQL filter for tasks in conversations the user has access to\n */\n private buildTasksFilter(): void {\n // Filter tasks by conversations the user owns or is a participant in, or tasks owned\n // by the user\n const md = new Metadata();\n const cd = md.EntityByName('MJ: Conversation Details');\n const c = md.EntityByName('MJ: Conversations');\n if (!cd || !c) {\n console.warn('⚠️ Missing metadata for Conversations or Conversation Details');\n this.tasksFilter = `ParentID IS NULL AND UserID = '${this.currentUser.ID}'`; // Fallback to user-owned tasks only\n return;\n }\n\n this.tasksFilter = `ParentID IS NULL AND (UserID = '${this.currentUser.ID}' OR ConversationDetailID IN (\n SELECT ID FROM [${cd.SchemaName}].[${cd.BaseView}] \n WHERE \n UserID ='${this.currentUser.ID}' OR \n ConversationID IN (\n SELECT ID FROM [${c.SchemaName}].[${c.BaseView}] WHERE UserID='${this.currentUser.ID}'\n )\n ))`;\n console.log('📝 Conversations domain tasks filter built:', this.tasksFilter);\n }\n\n ngDoCheck() {\n // Detect new unsaved conversation state changes\n const currentIsNewConversation = this.isNewUnsavedConversation;\n if (currentIsNewConversation !== this.previousIsNewConversation) {\n this.previousIsNewConversation = currentIsNewConversation;\n if (currentIsNewConversation) {\n // Emit event to clear URL conversation parameter\n Promise.resolve().then(() => {\n this.newConversationStarted.emit();\n });\n }\n }\n\n // Detect conversation changes and emit event\n const currentId = this.selectedConversationId;\n if (currentId !== this.previousConversationId) {\n this.previousConversationId = currentId;\n const conversation = this.selectedConversation;\n if (conversation) {\n this.conversationChanged.emit(conversation);\n\n // Also emit navigationChanged for URL updates (only if on conversations tab)\n if (this.activeTab === 'conversations' && currentId) {\n // Defer emission until after change detection completes\n Promise.resolve().then(() => {\n this.navigationChanged.emit({\n tab: 'conversations',\n conversationId: currentId\n });\n });\n }\n }\n }\n\n // Detect task selection changes (when on tasks tab)\n if (this.activeTab === 'tasks') {\n const currentTaskId = this.activeTaskId;\n if (currentTaskId !== this.previousTaskId) {\n this.previousTaskId = currentTaskId;\n if (currentTaskId) {\n // Defer emission until after change detection completes\n Promise.resolve().then(() => {\n this.navigationChanged.emit({\n tab: 'tasks',\n taskId: currentTaskId\n });\n });\n }\n }\n }\n\n // Version changes are handled by onCollectionNavigated and deep link inputs\n // We don't need ngDoCheck to track them as it causes double navigation events\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n\n // Clear any pending save timeout\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n }\n\n // Remove resize listeners\n window.removeEventListener('mousemove', this.onResizeMove.bind(this));\n window.removeEventListener('mouseup', this.onResizeEnd.bind(this));\n window.removeEventListener('touchmove', this.onResizeTouchMove.bind(this));\n window.removeEventListener('touchend', this.onResizeTouchEnd.bind(this));\n }\n\n @HostListener('window:resize')\n onWindowResize(): void {\n this.checkMobileView();\n }\n\n /**\n * Handle clicks outside the sidebar to auto-collapse when unpinned\n */\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n // Only handle when sidebar is expanded but unpinned\n if (this.isSidebarCollapsed || this.isSidebarPinned) {\n return;\n }\n\n // Check if click is outside the sidebar\n const target = event.target as HTMLElement;\n const sidebarElement = target.closest('.workspace-sidebar');\n const expandHandle = target.closest('.sidebar-expand-handle');\n\n // If click is outside sidebar and expand handle, collapse it\n if (!sidebarElement && !expandHandle) {\n this.collapseSidebar();\n }\n }\n\n private checkMobileView(): void {\n const wasMobile = this.isMobileView;\n this.isMobileView = window.innerWidth < 768;\n\n if (this.isMobileView && !wasMobile) {\n // Switched to mobile - hide sidebar and default to collapsed\n this.isSidebarVisible = false;\n this.isSidebarCollapsed = true;\n } else if (!this.isMobileView && wasMobile) {\n // Switched to desktop - show sidebar, restore state from User Settings\n this.isSidebarVisible = true;\n this.loadSidebarState().then(() => {\n this.cdr.detectChanges();\n });\n }\n }\n\n /**\n * Collapse sidebar\n */\n collapseSidebar(): void {\n this.isSidebarCollapsed = true;\n if (this.isMobileView) {\n this.isSidebarVisible = false;\n }\n }\n\n /**\n * Expand sidebar (unpinned - will auto-collapse on selection)\n */\n expandSidebar(): void {\n this.isSidebarCollapsed = false;\n this.isSidebarPinned = false;\n }\n\n /**\n * Pin sidebar - keep it open after selection\n */\n pinSidebar(): void {\n this.isSidebarPinned = true;\n this.saveSidebarState();\n }\n\n /**\n * Unpin sidebar - will auto-collapse on next selection\n */\n unpinSidebar(): void {\n this.isSidebarPinned = false;\n this.collapseSidebar();\n this.saveSidebarState();\n }\n\n /**\n * Save sidebar state to User Settings (server)\n * Uses debouncing to avoid excessive database writes\n */\n private saveSidebarState(): void {\n // Debounce the server save to avoid excessive writes\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n }\n this.saveSettingsTimeout = setTimeout(() => {\n this.saveSidebarStateToServer();\n }, 1000); // 1 second debounce\n }\n\n /**\n * Save sidebar state to User Settings entity on server using UserInfoEngine for cached lookup\n * Includes collapsed, pinned, sidebarWidth, and artifactPanelWidth\n */\n private async saveSidebarStateToServer(): Promise<void> {\n try {\n const userId = this.currentUser?.ID;\n if (!userId) {\n return;\n }\n\n const stateToSave = {\n collapsed: this.isSidebarCollapsed,\n pinned: this.isSidebarPinned,\n sidebarWidth: this.sidebarWidth,\n artifactPanelWidth: this.artifactPanelWidth\n };\n\n const engine = UserInfoEngine.Instance;\n const md = new Metadata();\n\n // Find existing setting from cached user settings\n let setting = engine.UserSettings.find(s => s.Setting === this.USER_SETTING_SIDEBAR_KEY);\n\n if (!setting) {\n // Create new setting\n setting = await md.GetEntityObject<MJUserSettingEntity>('MJ: User Settings');\n setting.UserID = userId;\n setting.Setting = this.USER_SETTING_SIDEBAR_KEY;\n }\n\n setting.Value = JSON.stringify(stateToSave);\n await setting.Save();\n } catch (error) {\n console.warn('Failed to save sidebar state to User Settings:', error);\n }\n }\n\n /**\n * Load sidebar state from User Settings (server) using UserInfoEngine\n * Includes collapsed, pinned, sidebarWidth, and artifactPanelWidth\n * For new users with no saved state, defaults to collapsed with new conversation\n */\n private async loadSidebarState(): Promise<void> {\n this.isLoadingSettings = true;\n\n try {\n const userId = this.currentUser?.ID;\n if (userId) {\n // Try loading from cached User Settings\n const engine = UserInfoEngine.Instance;\n const setting = engine.UserSettings.find(s => s.Setting === this.USER_SETTING_SIDEBAR_KEY);\n\n if (setting?.Value) {\n const state = JSON.parse(setting.Value);\n this.isSidebarCollapsed = state.collapsed ?? true;\n this.isSidebarPinned = state.pinned ?? false;\n\n // Load width values if present (with validation)\n if (typeof state.sidebarWidth === 'number' && state.sidebarWidth >= 200 && state.sidebarWidth <= 500) {\n this.sidebarWidth = state.sidebarWidth;\n }\n if (typeof state.artifactPanelWidth === 'number' && state.artifactPanelWidth >= 20 && state.artifactPanelWidth <= 70) {\n this.artifactPanelWidth = state.artifactPanelWidth;\n }\n\n this.isLoadingSettings = false;\n return;\n }\n }\n\n // No saved state found - NEW USER DEFAULT:\n // Start with sidebar collapsed and show new conversation screen\n this.isSidebarCollapsed = true;\n this.isSidebarPinned = false;\n this.isNewUnsavedConversation = true;\n } catch (error) {\n console.warn('Failed to load sidebar state:', error);\n // Default to collapsed for new users on error\n this.isSidebarCollapsed = true;\n this.isSidebarPinned = false;\n } finally {\n this.isLoadingSettings = false;\n this.isSidebarSettingsLoaded = true;\n }\n }\n\n onTabChanged(tab: NavigationTab): void {\n const wasOnDifferentTab = this.activeTab !== tab;\n this.activeTab = tab;\n\n // Emit navigation change event with current state\n const navEvent: any = {\n tab: tab as 'conversations' | 'collections' | 'tasks'\n };\n\n if (tab === 'conversations') {\n navEvent.conversationId = this.selectedConversationId || undefined;\n } else if (tab === 'collections') {\n // If switching TO collections tab from another tab, clear to root level\n if (wasOnDifferentTab) {\n this.collectionState.setActiveCollection(null);\n this.activeVersionId = null;\n // Don't include collectionId or versionId - go to root\n } else {\n // Already on collections tab, preserve current state\n if (this.collectionState.activeCollectionId) {\n navEvent.collectionId = this.collectionState.activeCollectionId;\n }\n if (this.activeVersionId && this.collectionState.activeCollectionId) {\n navEvent.versionId = this.activeVersionId;\n }\n }\n } else if (tab === 'tasks') {\n navEvent.taskId = this.activeTaskId || undefined;\n }\n\n this.navigationChanged.emit(navEvent);\n\n // Auto-close artifact panel when switching away from collections\n if (tab === 'conversations' || tab === 'tasks') {\n this.artifactState.closeArtifact();\n }\n }\n\n toggleSidebar(): void {\n this.isSidebarVisible = !this.isSidebarVisible;\n }\n\n closeSidebar(): void {\n if (this.isMobileView && this.isSidebarVisible) {\n this.isSidebarVisible = false;\n }\n }\n\n closeArtifactPanel(): void {\n this.artifactState.closeArtifact();\n }\n\n openSearch(): void {\n this.isSearchPanelOpen = true;\n }\n\n closeSearch(): void {\n this.isSearchPanelOpen = false;\n }\n\n async onRefreshAgentCache(): Promise<void> {\n try {\n await AIEngineBase.Instance.Config(true);\n\n // Refresh the mention autocomplete service to pick up new agents\n await this.mentionAutocompleteService.refresh(this.currentUser);\n\n const agentCount = AIEngineBase.Instance.Agents?.length || 0;\n this.notificationService.CreateSimpleNotification(`Agent cache refreshed (${agentCount} agents)`, 'success', 3000);\n this.cdr.detectChanges();\n } catch (error) {\n this.notificationService.CreateSimpleNotification('Failed to refresh agent cache', 'error', 3000);\n console.error('Failed to refresh AI Engine:', error);\n }\n }\n\n handleSearchResult(result: SearchResult): void {\n console.log('🔍 Navigating to search result:', result);\n\n switch (result.type) {\n case 'conversation':\n // Switch to conversations tab and select conversation\n this.activeTab = 'conversations';\n this.setActiveConversation(result.id);\n this.navigationChanged.emit({\n tab: 'conversations',\n conversationId: result.id\n });\n break;\n\n case 'message':\n // Switch to conversations tab, open conversation, and scroll to message (future enhancement)\n this.activeTab = 'conversations';\n if (result.conversationId) {\n this.setActiveConversation(result.conversationId);\n this.navigationChanged.emit({\n tab: 'conversations',\n conversationId: result.conversationId\n // TODO: Add messageId for scroll-to support in future\n });\n }\n break;\n\n case 'artifact':\n // Switch to collections tab and open artifact\n this.activeTab = 'collections';\n this.artifactState.openArtifact(result.id);\n\n // If artifact is in a collection, navigate to that collection\n const collectionId = result.collectionId || undefined;\n\n // Search results don't have version ID, so just navigate to collection\n // The artifact will open with latest version\n this.navigationChanged.emit({\n tab: 'collections',\n collectionId\n });\n break;\n\n case 'collection':\n // Switch to collections tab and navigate to collection\n this.activeTab = 'collections';\n this.collectionState.setActiveCollection(result.id);\n\n this.navigationChanged.emit({\n tab: 'collections',\n collectionId: result.id\n });\n break;\n\n case 'task':\n // Switch to tasks tab and select task\n this.activeTab = 'tasks';\n this._activeTaskId = result.id;\n this.navigationChanged.emit({\n tab: 'tasks',\n taskId: result.id\n });\n break;\n }\n\n // Close search panel after navigation\n this.closeSearch();\n }\n\n /**\n * Sidebar resize methods\n */\n onSidebarResizeStart(event: MouseEvent): void {\n this.isSidebarResizing = true;\n this.sidebarResizeStartX = event.clientX;\n this.sidebarResizeStartWidth = this.sidebarWidth;\n event.preventDefault();\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n }\n\n /**\n * Artifact panel resize methods\n */\n onArtifactPanelResizeStart(event: MouseEvent): void {\n this.isArtifactPanelResizing = true;\n this.artifactPanelResizeStartX = event.clientX;\n this.artifactPanelResizeStartWidth = this.artifactPanelWidth;\n event.preventDefault();\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n }\n\n private onResizeMove(event: MouseEvent): void {\n if (this.isSidebarResizing) {\n const deltaX = event.clientX - this.sidebarResizeStartX;\n let newWidth = this.sidebarResizeStartWidth + deltaX;\n\n // Constrain between 200px and 500px\n newWidth = Math.max(200, Math.min(500, newWidth));\n this.sidebarWidth = newWidth;\n } else if (this.isArtifactPanelResizing) {\n const container = document.querySelector('.workspace-content') as HTMLElement;\n if (!container) return;\n\n const containerWidth = container.offsetWidth;\n const deltaX = event.clientX - this.artifactPanelResizeStartX;\n const deltaPercent = (deltaX / containerWidth) * -100; // Negative because we're pulling from the right\n let newWidth = this.artifactPanelResizeStartWidth + deltaPercent;\n\n // Constrain between 20% and 70%\n newWidth = Math.max(20, Math.min(70, newWidth));\n this.artifactPanelWidth = newWidth;\n }\n }\n\n private onResizeEnd(event: MouseEvent): void {\n if (this.isSidebarResizing) {\n this.isSidebarResizing = false;\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n this.saveSidebarState(); // Save width to User Settings\n } else if (this.isArtifactPanelResizing) {\n this.isArtifactPanelResizing = false;\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n this.saveSidebarState(); // Save width to User Settings\n }\n }\n\n /**\n * Touch event handlers for mobile resize support\n */\n onSidebarResizeTouchStart(event: TouchEvent): void {\n this.isSidebarResizing = true;\n const touch = event.touches[0];\n this.sidebarResizeStartX = touch.clientX;\n this.sidebarResizeStartWidth = this.sidebarWidth;\n event.preventDefault();\n }\n\n onArtifactPanelResizeTouchStart(event: TouchEvent): void {\n this.isArtifactPanelResizing = true;\n const touch = event.touches[0];\n this.artifactPanelResizeStartX = touch.clientX;\n this.artifactPanelResizeStartWidth = this.artifactPanelWidth;\n event.preventDefault();\n }\n\n private onResizeTouchMove(event: TouchEvent): void {\n if (this.isSidebarResizing) {\n const touch = event.touches[0];\n const deltaX = touch.clientX - this.sidebarResizeStartX;\n let newWidth = this.sidebarResizeStartWidth + deltaX;\n\n newWidth = Math.max(200, Math.min(500, newWidth));\n this.sidebarWidth = newWidth;\n } else if (this.isArtifactPanelResizing) {\n const container = document.querySelector('.workspace-content') as HTMLElement;\n if (!container) return;\n\n const touch = event.touches[0];\n const containerWidth = container.offsetWidth;\n const deltaX = touch.clientX - this.artifactPanelResizeStartX;\n const deltaPercent = (deltaX / containerWidth) * -100;\n let newWidth = this.artifactPanelResizeStartWidth + deltaPercent;\n\n newWidth = Math.max(20, Math.min(70, newWidth));\n this.artifactPanelWidth = newWidth;\n }\n }\n\n private onResizeTouchEnd(event: TouchEvent): void {\n if (this.isSidebarResizing) {\n this.isSidebarResizing = false;\n this.saveSidebarState(); // Save width to User Settings\n } else if (this.isArtifactPanelResizing) {\n this.isArtifactPanelResizing = false;\n this.saveSidebarState(); // Save width to User Settings\n }\n }\n\n /**\n * Toggle maximize/restore state for artifact panel\n */\n toggleMaximizeArtifactPanel(): void {\n if (this.isArtifactPanelMaximized) {\n // Restore to previous width\n this.artifactPanelWidth = this.artifactPanelWidthBeforeMaximize;\n this.isArtifactPanelMaximized = false;\n } else {\n // Maximize - store current width and set to 100%\n this.artifactPanelWidthBeforeMaximize = this.artifactPanelWidth;\n this.artifactPanelWidth = 100;\n this.isArtifactPanelMaximized = true;\n }\n }\n\n onConversationRenamed(event: {conversationId: string; name: string; description: string}): void {\n console.log('✨ Workspace received rename event:', event);\n // Trigger animation in sidebar by setting the ID\n this.renamedConversationId = event.conversationId;\n\n // Clear after animation completes (1500ms)\n setTimeout(() => {\n this.renamedConversationId = null;\n }, 1500);\n }\n\n onOpenEntityRecord(event: {entityName: string; compositeKey: CompositeKey}): void {\n // Convert to actionable command and emit\n const firstKeyValue = event.compositeKey.KeyValuePairs[0]?.Value || '';\n const command: ActionableCommand = {\n type: 'open:resource',\n label: `Open ${event.entityName}`,\n resourceType: 'Record',\n entityName: event.entityName,\n resourceId: firstKeyValue,\n mode: 'view'\n };\n this.actionableCommandExecuted.emit(command);\n }\n\n onNavigationRequest(event: NavigationRequest): void {\n this.navigationRequested.emit(event);\n }\n\n onOpenEntityRecordFromTasks(event: {entityName: string; recordId: string}): void {\n // Convert to actionable command and emit\n const command: ActionableCommand = {\n type: 'open:resource',\n label: `Open ${event.entityName}`,\n resourceType: 'Record',\n entityName: event.entityName,\n resourceId: event.recordId,\n mode: 'view'\n };\n this.actionableCommandExecuted.emit(command);\n }\n\n onTaskClicked(task: MJTaskEntity): void {\n // Switch to Tasks tab and set active task ID\n this.activeTab = 'tasks';\n this._activeTaskId = task.ID;\n\n // Emit navigation change\n this.navigationChanged.emit({\n tab: 'tasks',\n taskId: task.ID\n });\n }\n\n /**\n * Handle collection navigation events\n */\n onCollectionNavigated(event: { collectionId: string | null; versionId?: string | null }): void {\n console.log('📁 Collection navigated:', event);\n\n // Store the version ID for URL sync\n // CRITICAL: Only update activeVersionId if versionId was explicitly provided in the event\n // If versionId is undefined (not provided), keep the current activeVersionId\n if (event.versionId !== undefined) {\n this.activeVersionId = event.versionId;\n }\n // Otherwise: versionId not provided in event, preserve current activeVersionId\n\n // IMPORTANT: Don't emit navigationChanged here when doing programmatic navigation (deep linking)\n // The artifact state is managed separately\n // Only emit if the event explicitly includes a versionId, or if we're intentionally closing the artifact\n if (event.versionId !== undefined) {\n // Event explicitly specifies artifact state (user clicked artifact or intentionally closed it)\n this.navigationChanged.emit({\n tab: 'collections',\n collectionId: event.collectionId || undefined,\n versionId: event.versionId || undefined\n });\n } else if (!this.activeVersionId) {\n // No artifact currently open, safe to emit collection-only navigation\n this.navigationChanged.emit({\n tab: 'collections',\n collectionId: event.collectionId || undefined\n });\n }\n // Otherwise: artifact is open but event doesn't specify versionId\n // Don't emit - preserve current URL state with artifact\n }\n\n /**\n * Handle navigation from artifact links\n */\n onArtifactLinkNavigation(event: {type: 'conversation' | 'collection'; id: string; artifactId?: string; versionNumber?: number; versionId?: string}): void {\n console.log('🔗 Navigating from artifact link:', event);\n\n if (event.type === 'conversation') {\n this.activeTab = 'conversations';\n\n // Close collection artifact viewer if it's open\n this.artifactState.closeArtifact();\n\n // Store pending artifact info so chat area can show it and scroll to message\n if (event.artifactId) {\n this.pendingArtifactId = event.artifactId;\n this.pendingArtifactVersionNumber = event.versionNumber || null;\n console.log('📦 Pending artifact set:', event.artifactId, 'v' + event.versionNumber);\n }\n\n this.setActiveConversation(event.id);\n\n this.navigationChanged.emit({\n tab: 'conversations',\n conversationId: event.id\n });\n } else if (event.type === 'collection') {\n this.activeTab = 'collections';\n this.collectionState.setActiveCollection(event.id);\n\n // Open the artifact automatically when navigating to the collection\n if (event.artifactId) {\n this.artifactState.openArtifact(event.artifactId, event.versionNumber);\n }\n\n // Store version ID for URL sync (same as viewArtifact does)\n if (event.versionId) {\n this.activeVersionId = event.versionId;\n }\n\n // Emit navigation with version ID so URL includes it\n this.navigationChanged.emit({\n tab: 'collections',\n collectionId: event.id,\n versionId: event.versionId\n });\n }\n }\n\n /**\n * Load permissions for the given artifact\n */\n private async loadArtifactPermissions(artifactId: string): Promise<void> {\n // Guard against null/undefined\n if (!artifactId) {\n this.canShareActiveArtifact = false;\n this.canEditActiveArtifact = false;\n return;\n }\n\n try {\n const permissions = await this.artifactPermissionService.getUserPermissions(artifactId, this.currentUser);\n this.canShareActiveArtifact = permissions.canShare;\n this.canEditActiveArtifact = permissions.canEdit;\n } catch (error) {\n console.error('Failed to load artifact permissions:', error);\n this.canShareActiveArtifact = false;\n this.canEditActiveArtifact = false;\n }\n }\n\n /**\n * Handle share request from artifact viewer\n */\n async onArtifactShareRequested(artifactId: string): Promise<void> {\n // Load the artifact entity to pass to the modal\n const md = new Metadata();\n const artifact = await md.GetEntityObject<MJArtifactEntity>('MJ: Artifacts');\n await artifact.Load(artifactId);\n\n if (artifact) {\n this.artifactToShare = artifact;\n this.isArtifactShareModalOpen = true;\n }\n }\n\n /**\n * Handle close of artifact share modal\n */\n onArtifactShareModalClose(): void {\n this.isArtifactShareModalOpen = false;\n this.artifactToShare = null;\n }\n\n /**\n * Handle successful share - refresh permissions\n */\n async onArtifactShared(): Promise<void> {\n this.isArtifactShareModalOpen = false;\n this.artifactToShare = null;\n\n // Refresh permissions for the active artifact\n if (this.activeArtifactId) {\n await this.loadArtifactPermissions(this.activeArtifactId);\n }\n }\n\n /**\n * Handle actionable command execution from child components\n * Bubbles up to host application for handling\n */\n onActionableCommand(command: ActionableCommand): void {\n console.log('📤 Bubbling up actionable command:', command);\n this.actionableCommandExecuted.emit(command);\n }\n\n /**\n * Handle automatic command execution from child components\n * Bubbles up to host application for handling\n */\n onAutomaticCommand(command: AutomaticCommand): void {\n console.log('📤 Bubbling up automatic command:', command);\n this.automaticCommandExecuted.emit(command);\n }\n}","<div class=\"conversation-workspace\" [attr.data-layout]=\"layout\" mjSearchShortcut (searchTriggered)=\"openSearch()\">\n <!-- Top Navigation Bar -->\n <div class=\"workspace-navigation\">\n <mj-conversation-navigation\n [activeTab]=\"activeTab\"\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [conversationId]=\"selectedConversationId\"\n (tabChanged)=\"onTabChanged($event)\"\n (sidebarToggled)=\"toggleSidebar()\"\n (searchTriggered)=\"openSearch()\"\n (refreshTriggered)=\"onRefreshAgentCache()\">\n </mj-conversation-navigation>\n </div>\n\n <!-- Loading spinner while initializing agents -->\n @if (!isWorkspaceReady) {\n <div class=\"workspace-loading\">\n <mj-loading text=\"Loading agents...\" size=\"large\"></mj-loading>\n </div>\n }\n\n <!-- Main workspace content - only renders when agents are ready -->\n @if (isWorkspaceReady) {\n <div class=\"workspace-content\">\n <!-- Mobile sidebar backdrop -->\n @if (isMobileView && isSidebarVisible && activeTab !== 'collections' && activeTab !== 'tasks') {\n <div class=\"mobile-sidebar-backdrop visible\" (click)=\"closeSidebar()\"></div>\n }\n\n <!-- Left Sidebar (hidden when Collections or Tasks view is active) -->\n @if (activeTab !== 'collections' && activeTab !== 'tasks' && isSidebarSettingsLoaded) {\n <div class=\"workspace-sidebar\"\n [class.open]=\"isSidebarVisible\"\n [class.collapsed]=\"isSidebarCollapsed\"\n [class.no-transition]=\"!sidebarTransitionsEnabled\"\n [style.width.px]=\"isSidebarCollapsed ? 0 : sidebarWidth\">\n <mj-conversation-sidebar\n [activeTab]=\"activeTab\"\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [selectedConversationId]=\"selectedConversationId\"\n [renamedConversationId]=\"renamedConversationId\"\n [isSidebarPinned]=\"isSidebarPinned\"\n [isMobileView]=\"isMobileView\"\n (conversationSelected)=\"onConversationSelected($event)\"\n (newConversationRequested)=\"startNewConversation()\"\n (pinSidebarRequested)=\"pinSidebar()\"\n (unpinSidebarRequested)=\"unpinSidebar()\">\n </mj-conversation-sidebar>\n </div>\n }\n\n <!-- Floating toggle button (only visible when sidebar is collapsed and settings loaded) -->\n @if (activeTab !== 'collections' && activeTab !== 'tasks' && isSidebarCollapsed && isSidebarSettingsLoaded) {\n <button class=\"sidebar-floating-toggle\"\n (click)=\"expandSidebar()\"\n title=\"Show conversations\">\n <i class=\"fas fa-table-columns\"></i>\n </button>\n }\n\n <!-- Resize handle for sidebar (only when expanded and settings loaded) -->\n @if (isSidebarVisible && !isSidebarCollapsed && activeTab !== 'collections' && activeTab !== 'tasks' && isSidebarSettingsLoaded) {\n <div class=\"sidebar-resize-handle\"\n (mousedown)=\"onSidebarResizeStart($event)\"></div>\n }\n\n <!-- Collections Full-Panel View -->\n @if (activeTab === 'collections') {\n <div class=\"workspace-main\">\n <mj-collections-full-view\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n (collectionNavigated)=\"onCollectionNavigated($event)\">\n </mj-collections-full-view>\n </div>\n }\n\n <!-- Tasks Full-Panel View -->\n @if (activeTab === 'tasks') {\n <div class=\"workspace-main\">\n <mj-tasks-full-view\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [baseFilter]=\"tasksFilter\"\n [activeTaskId]=\"activeTaskId\"\n (openEntityRecord)=\"onOpenEntityRecordFromTasks($event)\">\n </mj-tasks-full-view>\n </div>\n }\n\n <!-- Main Chat Area (only shown when not in Collections or Tasks view) -->\n @if (activeTab !== 'collections' && activeTab !== 'tasks') {\n <div class=\"workspace-main\">\n <mj-conversation-chat-area\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [conversationId]=\"selectedConversationId\"\n [conversation]=\"selectedConversation\"\n [threadId]=\"selectedThreadId\"\n [isNewConversation]=\"isNewUnsavedConversation\"\n [pendingMessage]=\"pendingMessageToSend\"\n [pendingAttachments]=\"pendingAttachmentsToSend\"\n [pendingArtifactId]=\"pendingArtifactId\"\n [pendingArtifactVersionNumber]=\"pendingArtifactVersionNumber\"\n (conversationRenamed)=\"onConversationRenamed($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n (navigationRequest)=\"onNavigationRequest($event)\"\n (taskClicked)=\"onTaskClicked($event)\"\n (artifactLinkClicked)=\"onArtifactLinkNavigation($event)\"\n (conversationCreated)=\"onConversationCreated($event)\"\n (threadOpened)=\"onThreadOpened($event)\"\n (threadClosed)=\"onThreadClosed()\"\n (pendingArtifactConsumed)=\"pendingArtifactId = null; pendingArtifactVersionNumber = null\"\n (pendingMessageConsumed)=\"pendingMessageToSend = null; pendingAttachmentsToSend = null\"\n (pendingMessageRequested)=\"onPendingMessageRequested($event)\">\n </mj-conversation-chat-area>\n </div>\n }\n\n <!-- Right Artifact Panel -->\n @if (isArtifactPanelOpen && activeArtifactId) {\n @if (!isArtifactPanelMaximized) {\n <div class=\"artifact-panel-resize-handle\" (mousedown)=\"onArtifactPanelResizeStart($event)\"></div>\n }\n <div class=\"workspace-artifact-panel\"\n [style.width.%]=\"artifactPanelWidth\"\n [class.maximized]=\"isArtifactPanelMaximized\">\n <mj-artifact-viewer-panel\n [artifactId]=\"activeArtifactId\"\n [currentUser]=\"currentUser\"\n [environmentId]=\"environmentId\"\n [versionNumber]=\"activeVersionNumber ?? undefined\"\n [showSaveToCollection]=\"activeTab !== 'collections'\"\n [viewContext]=\"activeTab === 'collections' ? 'collection' : 'conversation'\"\n [contextCollectionId]=\"collectionState.activeCollectionId ?? undefined\"\n [canShare]=\"canShareActiveArtifact\"\n [canEdit]=\"canEditActiveArtifact\"\n [isMaximized]=\"isArtifactPanelMaximized\"\n (closed)=\"closeArtifactPanel()\"\n (navigateToLink)=\"onArtifactLinkNavigation($event)\"\n (shareRequested)=\"onArtifactShareRequested($event)\"\n (maximizeToggled)=\"toggleMaximizeArtifactPanel()\">\n </mj-artifact-viewer-panel>\n </div>\n }\n </div>\n }\n\n <!-- Global Search Panel -->\n <mj-search-panel\n [isOpen]=\"isSearchPanelOpen\"\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n (close)=\"closeSearch()\"\n (resultSelected)=\"handleSearchResult($event)\">\n </mj-search-panel>\n\n <!-- Toast Notifications -->\n <mj-toast></mj-toast>\n\n <!-- Artifact Share Modal -->\n <mj-artifact-share-modal\n [isOpen]=\"isArtifactShareModalOpen\"\n [artifact]=\"artifactToShare\"\n [currentUser]=\"currentUser\"\n (saved)=\"onArtifactShared()\"\n (cancelled)=\"onArtifactShareModalClose()\">\n </mj-artifact-share-modal>\n</div>"]}
|
|
1
|
+
{"version":3,"file":"conversation-workspace.component.js","sourceRoot":"","sources":["../../../../src/lib/components/workspace/conversation-workspace.component.ts","../../../../src/lib/components/workspace/conversation-workspace.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * ============================================================================\n * DEPRECATED - DO NOT USE\n * ============================================================================\n *\n * This workspace component was used when conversations, collections, and tasks\n * were all combined into a single tabbed interface.\n *\n * The new architecture uses SEPARATE resource components for each feature:\n * - ChatConversationsResource for conversations\n * - CollectionsResource for collections\n * - TasksResource for tasks\n *\n * These resource components are located in @memberjunction/ng-explorer-core\n * and integrate with MJExplorer's tab/navigation system.\n *\n * This file is kept for backwards compatibility only. Any new features or\n * bug fixes should be made to the individual resource components instead.\n * ============================================================================\n */\n\nimport {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnDestroy,\n DoCheck,\n ChangeDetectorRef,\n HostListener\n} from '@angular/core';\nimport { MJConversationEntity, MJArtifactEntity, MJTaskEntity, ArtifactMetadataEngine, MJUserSettingEntity, UserInfoEngine, ConversationEngine } from '@memberjunction/core-entities';\nimport { UserInfo, CompositeKey, KeyValuePair, Metadata } from '@memberjunction/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { ArtifactStateService } from '../../services/artifact-state.service';\nimport { CollectionStateService } from '../../services/collection-state.service';\nimport { ArtifactPermissionService } from '../../services/artifact-permission.service';\nimport { MentionAutocompleteService } from '../../services/mention-autocomplete.service';\nimport { ConversationStreamingService } from '../../services/conversation-streaming.service';\nimport { UICommandHandlerService } from '../../services/ui-command-handler.service';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { NavigationTab, WorkspaceLayout } from '../../models/conversation-state.model';\nimport { SearchResult } from '../../services/search.service';\nimport { Subject, takeUntil } from 'rxjs';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { ActionableCommand, AutomaticCommand } from '@memberjunction/ai-core-plus';\nimport { NavigationRequest } from '@memberjunction/ng-artifacts';\nimport { PendingAttachment } from '../mention/mention-editor.component';\n\n/**\n * Top-level workspace component for conversations\n * Provides 3-column Slack-style layout: Navigation | Sidebar | Chat Area | Artifact Panel\n * Supports context-based navigation (library or task views)\n *\n * @deprecated Use ChatConversationsResource from @memberjunction/ng-explorer-core instead.\n * This component is maintained for backwards compatibility but the resource-wrapper pattern\n * is the preferred approach for MJExplorer integration.\n */\n@Component({\n standalone: false,\n selector: 'mj-conversation-workspace',\n templateUrl: './conversation-workspace.component.html',\n styleUrls: ['./conversation-workspace.component.css']\n})\nexport class ConversationWorkspaceComponent extends BaseAngularComponent implements OnInit, OnDestroy, DoCheck {\n @Input() environmentId!: string;\n @Input() initialConversationId?: string;\n @Input() layout: WorkspaceLayout = 'full';\n @Input() currentUser!: UserInfo;\n @Input() activeContext?: 'library' | 'task';\n @Input() contextItemId?: string;\n\n // Navigation properties for external control (deep linking from URL)\n @Input() set activeTabInput(value: 'conversations' | 'collections' | 'tasks' | undefined) {\n if (value && value !== this.activeTab) {\n this.activeTab = value;\n }\n }\n\n @Input() set activeConversationInput(value: string | undefined) {\n if (value && value !== this.selectedConversationId) {\n console.log('🔗 Deep link to conversation:', value);\n this.activeTab = 'conversations';\n this.setActiveConversation(value);\n }\n }\n\n @Input() set activeCollectionInput(value: string | undefined) {\n if (value && value !== this.collectionState.activeCollectionId) {\n console.log('🔗 Deep link to collection:', value);\n this.activeTab = 'collections';\n this.collectionState.setActiveCollection(value);\n }\n }\n\n @Input() set activeVersionIdInput(value: string | undefined) {\n if (value && value !== this.activeVersionId) {\n console.log('🔗 Deep link to version:', value);\n this.activeTab = 'collections';\n // Store the version ID immediately to prevent ngDoCheck from clearing it\n this.activeVersionId = value;\n // Open artifact by version ID\n this.artifactState.openArtifactByVersionId(value);\n }\n }\n\n @Input() set activeTaskInput(value: string | undefined) {\n if (value && value !== this._activeTaskId) {\n this._activeTaskId = value;\n }\n }\n\n private _activeTaskId?: string;\n get activeTaskId(): string | undefined {\n return this._activeTaskId;\n }\n\n @Output() conversationChanged = new EventEmitter<MJConversationEntity>();\n @Output() artifactOpened = new EventEmitter<MJArtifactEntity>();\n @Output() navigationChanged = new EventEmitter<{\n tab: 'conversations' | 'collections' | 'tasks';\n conversationId?: string;\n collectionId?: string;\n versionId?: string;\n taskId?: string;\n }>();\n @Output() newConversationStarted = new EventEmitter<void>();\n @Output() actionableCommandExecuted = new EventEmitter<ActionableCommand>();\n @Output() automaticCommandExecuted = new EventEmitter<AutomaticCommand>();\n @Output() navigationRequested = new EventEmitter<NavigationRequest>();\n\n public activeTab: NavigationTab = 'conversations';\n public isSidebarVisible: boolean = true;\n public isArtifactPanelOpen: boolean = false;\n public isSearchPanelOpen: boolean = false;\n public isWorkspaceReady: boolean = false;\n public renamedConversationId: string | null = null;\n public activeArtifactId: string | null = null;\n public activeVersionNumber: number | null = null;\n public activeVersionId: string | null = null;\n public isMobileView: boolean = false;\n public isSidebarPinned: boolean = false; // Default unpinned until settings load (prevents flicker)\n\n // Artifact permissions\n public canShareActiveArtifact: boolean = false;\n public canEditActiveArtifact: boolean = false;\n\n // Share modal state\n public isArtifactShareModalOpen: boolean = false;\n public artifactToShare: MJArtifactEntity | null = null;\n\n // Resize state - Sidebar\n public sidebarWidth: number = 260; // Default width\n public isSidebarCollapsed: boolean = true; // Default collapsed until settings load (prevents flicker)\n public sidebarTransitionsEnabled: boolean = false; // Disabled during initial load to prevent jarring animation\n public isSidebarSettingsLoaded: boolean = false; // Tracks whether settings have been loaded (prevents render before state is known)\n private isSidebarResizing: boolean = false;\n private sidebarResizeStartX: number = 0;\n private sidebarResizeStartWidth: number = 0;\n\n // Resize state - Artifact Panel\n public artifactPanelWidth: number = 40; // Default 40% width\n public isArtifactPanelMaximized: boolean = false;\n private artifactPanelWidthBeforeMaximize: number = 40; // Store width before maximizing\n private isArtifactPanelResizing: boolean = false;\n private artifactPanelResizeStartX: number = 0;\n private artifactPanelResizeStartWidth: number = 0;\n\n private previousConversationId: string | null = null;\n private previousTaskId: string | undefined = undefined;\n private previousVersionId: string | null = null; // Used to track version changes in ngDoCheck\n private previousIsNewConversation: boolean = false; // Track new conversation state changes\n private destroy$ = new Subject<void>();\n\n // User Settings key for server-side persistence\n private readonly USER_SETTING_SIDEBAR_KEY = 'Conversations.SidebarState';\n private saveSettingsTimeout: ReturnType<typeof setTimeout> | null = null;\n private isLoadingSettings: boolean = false;\n\n // Task filter for conversation-specific filtering\n public tasksFilter: string = '1=1';\n\n // LOCAL CONVERSATION STATE - enables multiple workspace instances\n // Each workspace manages its own selection state independently\n public selectedConversationId: string | null = null;\n public selectedConversation: MJConversationEntity | null = null;\n public selectedThreadId: string | null = null;\n public isNewUnsavedConversation: boolean = false;\n public pendingMessageToSend: string | null = null;\n public pendingAttachmentsToSend: PendingAttachment[] | null = null;\n public pendingArtifactId: string | null = null;\n public pendingArtifactVersionNumber: number | null = null;\n\n private engine = ConversationEngine.Instance;\n\n constructor(\n public artifactState: ArtifactStateService,\n public collectionState: CollectionStateService,\n private artifactPermissionService: ArtifactPermissionService,\n private mentionAutocompleteService: MentionAutocompleteService,\n private notificationService: MJNotificationService,\n private streamingService: ConversationStreamingService,\n private uiCommandHandler: UICommandHandlerService,\n private cdr: ChangeDetectorRef\n ) {\n super();\n }\n\n // =========================================================================\n // LOCAL CONVERSATION STATE MANAGEMENT\n // These methods manage the workspace's local selection state\n // =========================================================================\n\n /**\n * Sets the active conversation for this workspace instance\n * @param id The conversation ID to activate (or null to clear)\n */\n setActiveConversation(id: string | null): void {\n console.log('🎯 Setting active conversation:', id);\n this.selectedConversationId = id;\n this.selectedConversation = id ? (this.engine.GetConversation(id) ?? null) : null;\n // Clear unsaved state when switching to an existing conversation\n if (id) {\n this.isNewUnsavedConversation = false;\n }\n }\n\n /**\n * Initiates a new unsaved conversation (doesn't create DB record yet)\n * This shows the welcome screen and delays DB creation until first message\n */\n startNewConversation(): void {\n console.log('✨ Starting new unsaved conversation');\n this.selectedConversationId = null;\n this.selectedConversation = null;\n this.isNewUnsavedConversation = true;\n this.pendingMessageToSend = null;\n this.pendingAttachmentsToSend = null;\n\n // Auto-collapse if mobile OR if sidebar is not pinned\n if (this.isMobileView || !this.isSidebarPinned) {\n this.collapseSidebar();\n }\n }\n\n /**\n * Clears the new unsaved conversation state\n * Called when the conversation is actually created or cancelled\n */\n clearNewConversationState(): void {\n this.isNewUnsavedConversation = false;\n }\n\n /**\n * Opens a thread panel for a specific message\n * @param messageId The parent message ID\n */\n openThread(messageId: string): void {\n this.selectedThreadId = messageId;\n }\n\n /**\n * Closes the currently open thread panel\n */\n closeThread(): void {\n this.selectedThreadId = null;\n }\n\n /**\n * Handler for conversation selection from sidebar/list\n */\n onConversationSelected(conversationId: string): void {\n this.setActiveConversation(conversationId);\n\n // Auto-collapse if mobile OR if sidebar is not pinned\n if (this.isMobileView || !this.isSidebarPinned) {\n this.collapseSidebar();\n }\n }\n\n /**\n * Handler for new conversation creation from chat area\n * Now includes pending message and attachments to ensure atomic state update\n */\n onConversationCreated(event: {\n conversation: MJConversationEntity;\n pendingMessage?: string;\n pendingAttachments?: PendingAttachment[];\n }): void {\n try {\n // Set ALL state atomically before Angular change detection runs\n // This ensures the new message-input component receives the pending data\n this.pendingMessageToSend = event.pendingMessage || null;\n this.pendingAttachmentsToSend = event.pendingAttachments || null;\n this.selectedConversationId = event.conversation.ID;\n this.selectedConversation = event.conversation;\n this.isNewUnsavedConversation = false;\n // The conversation is already added to ConversationEngine by the chat area\n } catch (error) {\n console.error('onConversationCreated ERROR:', error);\n }\n }\n\n /**\n * Handler for pending message requested from chat area (empty state)\n * @deprecated Use onConversationCreated with pendingMessage instead\n */\n onPendingMessageRequested(event: {text: string; attachments: PendingAttachment[]}): void {\n this.pendingMessageToSend = event.text;\n this.pendingAttachmentsToSend = event.attachments;\n }\n\n /**\n * Handler for thread opened from chat area\n */\n onThreadOpened(threadId: string): void {\n this.selectedThreadId = threadId;\n }\n\n /**\n * Handler for thread closed from chat area\n */\n onThreadClosed(): void {\n this.selectedThreadId = null;\n }\n\n async ngOnInit() {\n // Bind provider-aware services to this component's provider so multi-server\n // browser apps don't silently fall back to the global Metadata.Provider.\n // ArtifactStateService cascades to ArtifactPermissionService and CollectionPermissionService.\n this.artifactState.Provider = this.ProviderToUse;\n this.artifactPermissionService.Provider = this.ProviderToUse;\n\n // Initialize global streaming service FIRST\n // This establishes the single PubSub connection for all conversations\n this.streamingService.initialize();\n console.log('✅ Global streaming service initialized');\n\n // Subscribe to command events from UI Command Handler service\n // These will be bubbled up to the host application\n this.uiCommandHandler.actionableCommandRequested\n .pipe(takeUntil(this.destroy$))\n .subscribe(command => {\n this.onActionableCommand(command);\n });\n\n this.uiCommandHandler.automaticCommandRequested\n .pipe(takeUntil(this.destroy$))\n .subscribe(command => {\n this.onAutomaticCommand(command);\n });\n\n // Check initial mobile state FIRST\n this.checkMobileView();\n\n // Load sidebar state - but on mobile, always default to collapsed\n if (this.isMobileView) {\n this.isSidebarCollapsed = true;\n this.isSidebarVisible = false;\n this.isSidebarSettingsLoaded = true; // Mobile doesn't need to load settings\n // Enable transitions after a brief delay to ensure initial state is applied\n setTimeout(() => {\n this.sidebarTransitionsEnabled = true;\n }, 50);\n } else {\n // Load from User Settings (async) - await before continuing to prevent flicker\n await this.loadSidebarState();\n this.cdr.detectChanges();\n // Enable transitions after state is loaded and applied\n setTimeout(() => {\n this.sidebarTransitionsEnabled = true;\n }, 50);\n }\n\n // Setup resize listeners\n window.addEventListener('mousemove', this.onResizeMove.bind(this));\n window.addEventListener('mouseup', this.onResizeEnd.bind(this));\n\n // Setup touch listeners for mobile\n window.addEventListener('touchmove', this.onResizeTouchMove.bind(this));\n window.addEventListener('touchend', this.onResizeTouchEnd.bind(this));\n\n // CRITICAL: Initialize engines FIRST before rendering any UI\n // The isWorkspaceReady flag blocks all child components from rendering\n // until engines are fully loaded and ready\n try {\n // Load both engines in parallel - ArtifactMetadataEngine is lightweight (just artifact types)\n // Using Promise.all ensures optimal performance with no additional delay\n await Promise.all([\n AIEngineBase.Instance.Config(false),\n ArtifactMetadataEngine.Instance.Config(false)\n ]);\n\n console.log('✅ AI Engine initialized with', AIEngineBase.Instance.Agents?.length || 0, 'agents');\n console.log('✅ Artifact Metadata Engine initialized with',\n ArtifactMetadataEngine.Instance.ArtifactTypes?.length || 0, 'artifact types');\n\n // Initialize mention autocomplete service immediately after AI engine\n // This ensures the cache is built from the fully-loaded agent list\n await this.mentionAutocompleteService.initialize(this.currentUser);\n console.log('✅ Mention autocomplete initialized');\n\n // Mark workspace as ready - this allows UI to render\n this.isWorkspaceReady = true;\n this.cdr.detectChanges();\n } catch (error) {\n console.error('❌ Failed to initialize engines:', error);\n // Still mark as ready so UI isn't blocked forever\n this.isWorkspaceReady = true;\n this.cdr.detectChanges();\n }\n\n // Subscribe to artifact panel state\n this.artifactState.isPanelOpen$\n .pipe(takeUntil(this.destroy$))\n .subscribe(isOpen => {\n this.isArtifactPanelOpen = isOpen;\n });\n\n // Subscribe to active artifact ID\n this.artifactState.activeArtifactId$\n .pipe(takeUntil(this.destroy$))\n .subscribe(async id => {\n this.activeArtifactId = id;\n // Load permissions when artifact changes\n if (id) {\n await this.loadArtifactPermissions(id);\n } else {\n this.canShareActiveArtifact = false;\n this.canEditActiveArtifact = false;\n }\n });\n\n // Subscribe to active version number\n this.artifactState.activeVersionNumber$\n .pipe(takeUntil(this.destroy$))\n .subscribe(versionNumber => {\n this.activeVersionNumber = versionNumber;\n });\n\n // Set initial conversation if provided\n if (this.initialConversationId) {\n this.setActiveConversation(this.initialConversationId);\n }\n\n // Handle context-based navigation\n if (this.activeContext === 'library') {\n this.activeTab = 'collections';\n }\n // Task context will be handled by chat header dropdown, not navigation tabs\n\n // Build task filter for conversations domain\n this.buildTasksFilter();\n }\n\n /**\n * Builds the SQL filter for tasks in conversations the user has access to\n */\n private buildTasksFilter(): void {\n // Filter tasks by conversations the user owns or is a participant in, or tasks owned\n // by the user\n const md = this.ProviderToUse;\n const cd = md.EntityByName('MJ: Conversation Details');\n const c = md.EntityByName('MJ: Conversations');\n if (!cd || !c) {\n console.warn('⚠️ Missing metadata for Conversations or Conversation Details');\n this.tasksFilter = `ParentID IS NULL AND UserID = '${this.currentUser.ID}'`; // Fallback to user-owned tasks only\n return;\n }\n\n this.tasksFilter = `ParentID IS NULL AND (UserID = '${this.currentUser.ID}' OR ConversationDetailID IN (\n SELECT ID FROM [${cd.SchemaName}].[${cd.BaseView}] \n WHERE \n UserID ='${this.currentUser.ID}' OR \n ConversationID IN (\n SELECT ID FROM [${c.SchemaName}].[${c.BaseView}] WHERE UserID='${this.currentUser.ID}'\n )\n ))`;\n console.log('📝 Conversations domain tasks filter built:', this.tasksFilter);\n }\n\n ngDoCheck() {\n // Detect new unsaved conversation state changes\n const currentIsNewConversation = this.isNewUnsavedConversation;\n if (currentIsNewConversation !== this.previousIsNewConversation) {\n this.previousIsNewConversation = currentIsNewConversation;\n if (currentIsNewConversation) {\n // Emit event to clear URL conversation parameter\n Promise.resolve().then(() => {\n this.newConversationStarted.emit();\n });\n }\n }\n\n // Detect conversation changes and emit event\n const currentId = this.selectedConversationId;\n if (currentId !== this.previousConversationId) {\n this.previousConversationId = currentId;\n const conversation = this.selectedConversation;\n if (conversation) {\n this.conversationChanged.emit(conversation);\n\n // Also emit navigationChanged for URL updates (only if on conversations tab)\n if (this.activeTab === 'conversations' && currentId) {\n // Defer emission until after change detection completes\n Promise.resolve().then(() => {\n this.navigationChanged.emit({\n tab: 'conversations',\n conversationId: currentId\n });\n });\n }\n }\n }\n\n // Detect task selection changes (when on tasks tab)\n if (this.activeTab === 'tasks') {\n const currentTaskId = this.activeTaskId;\n if (currentTaskId !== this.previousTaskId) {\n this.previousTaskId = currentTaskId;\n if (currentTaskId) {\n // Defer emission until after change detection completes\n Promise.resolve().then(() => {\n this.navigationChanged.emit({\n tab: 'tasks',\n taskId: currentTaskId\n });\n });\n }\n }\n }\n\n // Version changes are handled by onCollectionNavigated and deep link inputs\n // We don't need ngDoCheck to track them as it causes double navigation events\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n\n // Clear any pending save timeout\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n }\n\n // Remove resize listeners\n window.removeEventListener('mousemove', this.onResizeMove.bind(this));\n window.removeEventListener('mouseup', this.onResizeEnd.bind(this));\n window.removeEventListener('touchmove', this.onResizeTouchMove.bind(this));\n window.removeEventListener('touchend', this.onResizeTouchEnd.bind(this));\n }\n\n @HostListener('window:resize')\n onWindowResize(): void {\n this.checkMobileView();\n }\n\n /**\n * Handle clicks outside the sidebar to auto-collapse when unpinned\n */\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n // Only handle when sidebar is expanded but unpinned\n if (this.isSidebarCollapsed || this.isSidebarPinned) {\n return;\n }\n\n // Check if click is outside the sidebar\n const target = event.target as HTMLElement;\n const sidebarElement = target.closest('.workspace-sidebar');\n const expandHandle = target.closest('.sidebar-expand-handle');\n\n // If click is outside sidebar and expand handle, collapse it\n if (!sidebarElement && !expandHandle) {\n this.collapseSidebar();\n }\n }\n\n private checkMobileView(): void {\n const wasMobile = this.isMobileView;\n this.isMobileView = window.innerWidth < 768;\n\n if (this.isMobileView && !wasMobile) {\n // Switched to mobile - hide sidebar and default to collapsed\n this.isSidebarVisible = false;\n this.isSidebarCollapsed = true;\n } else if (!this.isMobileView && wasMobile) {\n // Switched to desktop - show sidebar, restore state from User Settings\n this.isSidebarVisible = true;\n this.loadSidebarState().then(() => {\n this.cdr.detectChanges();\n });\n }\n }\n\n /**\n * Collapse sidebar\n */\n collapseSidebar(): void {\n this.isSidebarCollapsed = true;\n if (this.isMobileView) {\n this.isSidebarVisible = false;\n }\n }\n\n /**\n * Expand sidebar (unpinned - will auto-collapse on selection)\n */\n expandSidebar(): void {\n this.isSidebarCollapsed = false;\n this.isSidebarPinned = false;\n }\n\n /**\n * Pin sidebar - keep it open after selection\n */\n pinSidebar(): void {\n this.isSidebarPinned = true;\n this.saveSidebarState();\n }\n\n /**\n * Unpin sidebar - will auto-collapse on next selection\n */\n unpinSidebar(): void {\n this.isSidebarPinned = false;\n this.collapseSidebar();\n this.saveSidebarState();\n }\n\n /**\n * Save sidebar state to User Settings (server)\n * Uses debouncing to avoid excessive database writes\n */\n private saveSidebarState(): void {\n // Debounce the server save to avoid excessive writes\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n }\n this.saveSettingsTimeout = setTimeout(() => {\n this.saveSidebarStateToServer();\n }, 1000); // 1 second debounce\n }\n\n /**\n * Save sidebar state to User Settings entity on server using UserInfoEngine for cached lookup\n * Includes collapsed, pinned, sidebarWidth, and artifactPanelWidth\n */\n private async saveSidebarStateToServer(): Promise<void> {\n try {\n const userId = this.currentUser?.ID;\n if (!userId) {\n return;\n }\n\n const stateToSave = {\n collapsed: this.isSidebarCollapsed,\n pinned: this.isSidebarPinned,\n sidebarWidth: this.sidebarWidth,\n artifactPanelWidth: this.artifactPanelWidth\n };\n\n const engine = UserInfoEngine.Instance;\n const md = this.ProviderToUse;\n\n // Find existing setting from cached user settings\n let setting = engine.UserSettings.find(s => s.Setting === this.USER_SETTING_SIDEBAR_KEY);\n\n if (!setting) {\n // Create new setting\n setting = await md.GetEntityObject<MJUserSettingEntity>('MJ: User Settings');\n setting.UserID = userId;\n setting.Setting = this.USER_SETTING_SIDEBAR_KEY;\n }\n\n setting.Value = JSON.stringify(stateToSave);\n await setting.Save();\n } catch (error) {\n console.warn('Failed to save sidebar state to User Settings:', error);\n }\n }\n\n /**\n * Load sidebar state from User Settings (server) using UserInfoEngine\n * Includes collapsed, pinned, sidebarWidth, and artifactPanelWidth\n * For new users with no saved state, defaults to collapsed with new conversation\n */\n private async loadSidebarState(): Promise<void> {\n this.isLoadingSettings = true;\n\n try {\n const userId = this.currentUser?.ID;\n if (userId) {\n // Try loading from cached User Settings\n const engine = UserInfoEngine.Instance;\n const setting = engine.UserSettings.find(s => s.Setting === this.USER_SETTING_SIDEBAR_KEY);\n\n if (setting?.Value) {\n const state = JSON.parse(setting.Value);\n this.isSidebarCollapsed = state.collapsed ?? true;\n this.isSidebarPinned = state.pinned ?? false;\n\n // Load width values if present (with validation)\n if (typeof state.sidebarWidth === 'number' && state.sidebarWidth >= 200 && state.sidebarWidth <= 500) {\n this.sidebarWidth = state.sidebarWidth;\n }\n if (typeof state.artifactPanelWidth === 'number' && state.artifactPanelWidth >= 20 && state.artifactPanelWidth <= 70) {\n this.artifactPanelWidth = state.artifactPanelWidth;\n }\n\n this.isLoadingSettings = false;\n return;\n }\n }\n\n // No saved state found - NEW USER DEFAULT:\n // Start with sidebar collapsed and show new conversation screen\n this.isSidebarCollapsed = true;\n this.isSidebarPinned = false;\n this.isNewUnsavedConversation = true;\n } catch (error) {\n console.warn('Failed to load sidebar state:', error);\n // Default to collapsed for new users on error\n this.isSidebarCollapsed = true;\n this.isSidebarPinned = false;\n } finally {\n this.isLoadingSettings = false;\n this.isSidebarSettingsLoaded = true;\n }\n }\n\n onTabChanged(tab: NavigationTab): void {\n const wasOnDifferentTab = this.activeTab !== tab;\n this.activeTab = tab;\n\n // Emit navigation change event with current state\n const navEvent: any = {\n tab: tab as 'conversations' | 'collections' | 'tasks'\n };\n\n if (tab === 'conversations') {\n navEvent.conversationId = this.selectedConversationId || undefined;\n } else if (tab === 'collections') {\n // If switching TO collections tab from another tab, clear to root level\n if (wasOnDifferentTab) {\n this.collectionState.setActiveCollection(null);\n this.activeVersionId = null;\n // Don't include collectionId or versionId - go to root\n } else {\n // Already on collections tab, preserve current state\n if (this.collectionState.activeCollectionId) {\n navEvent.collectionId = this.collectionState.activeCollectionId;\n }\n if (this.activeVersionId && this.collectionState.activeCollectionId) {\n navEvent.versionId = this.activeVersionId;\n }\n }\n } else if (tab === 'tasks') {\n navEvent.taskId = this.activeTaskId || undefined;\n }\n\n this.navigationChanged.emit(navEvent);\n\n // Auto-close artifact panel when switching away from collections\n if (tab === 'conversations' || tab === 'tasks') {\n this.artifactState.closeArtifact();\n }\n }\n\n toggleSidebar(): void {\n this.isSidebarVisible = !this.isSidebarVisible;\n }\n\n closeSidebar(): void {\n if (this.isMobileView && this.isSidebarVisible) {\n this.isSidebarVisible = false;\n }\n }\n\n closeArtifactPanel(): void {\n this.artifactState.closeArtifact();\n }\n\n openSearch(): void {\n this.isSearchPanelOpen = true;\n }\n\n closeSearch(): void {\n this.isSearchPanelOpen = false;\n }\n\n async onRefreshAgentCache(): Promise<void> {\n try {\n await AIEngineBase.Instance.Config(true);\n\n // Refresh the mention autocomplete service to pick up new agents\n await this.mentionAutocompleteService.refresh(this.currentUser);\n\n const agentCount = AIEngineBase.Instance.Agents?.length || 0;\n this.notificationService.CreateSimpleNotification(`Agent cache refreshed (${agentCount} agents)`, 'success', 3000);\n this.cdr.detectChanges();\n } catch (error) {\n this.notificationService.CreateSimpleNotification('Failed to refresh agent cache', 'error', 3000);\n console.error('Failed to refresh AI Engine:', error);\n }\n }\n\n handleSearchResult(result: SearchResult): void {\n console.log('🔍 Navigating to search result:', result);\n\n switch (result.type) {\n case 'conversation':\n // Switch to conversations tab and select conversation\n this.activeTab = 'conversations';\n this.setActiveConversation(result.id);\n this.navigationChanged.emit({\n tab: 'conversations',\n conversationId: result.id\n });\n break;\n\n case 'message':\n // Switch to conversations tab, open conversation, and scroll to message (future enhancement)\n this.activeTab = 'conversations';\n if (result.conversationId) {\n this.setActiveConversation(result.conversationId);\n this.navigationChanged.emit({\n tab: 'conversations',\n conversationId: result.conversationId\n // TODO: Add messageId for scroll-to support in future\n });\n }\n break;\n\n case 'artifact':\n // Switch to collections tab and open artifact\n this.activeTab = 'collections';\n this.artifactState.openArtifact(result.id);\n\n // If artifact is in a collection, navigate to that collection\n const collectionId = result.collectionId || undefined;\n\n // Search results don't have version ID, so just navigate to collection\n // The artifact will open with latest version\n this.navigationChanged.emit({\n tab: 'collections',\n collectionId\n });\n break;\n\n case 'collection':\n // Switch to collections tab and navigate to collection\n this.activeTab = 'collections';\n this.collectionState.setActiveCollection(result.id);\n\n this.navigationChanged.emit({\n tab: 'collections',\n collectionId: result.id\n });\n break;\n\n case 'task':\n // Switch to tasks tab and select task\n this.activeTab = 'tasks';\n this._activeTaskId = result.id;\n this.navigationChanged.emit({\n tab: 'tasks',\n taskId: result.id\n });\n break;\n }\n\n // Close search panel after navigation\n this.closeSearch();\n }\n\n /**\n * Sidebar resize methods\n */\n onSidebarResizeStart(event: MouseEvent): void {\n this.isSidebarResizing = true;\n this.sidebarResizeStartX = event.clientX;\n this.sidebarResizeStartWidth = this.sidebarWidth;\n event.preventDefault();\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n }\n\n /**\n * Artifact panel resize methods\n */\n onArtifactPanelResizeStart(event: MouseEvent): void {\n this.isArtifactPanelResizing = true;\n this.artifactPanelResizeStartX = event.clientX;\n this.artifactPanelResizeStartWidth = this.artifactPanelWidth;\n event.preventDefault();\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n }\n\n private onResizeMove(event: MouseEvent): void {\n if (this.isSidebarResizing) {\n const deltaX = event.clientX - this.sidebarResizeStartX;\n let newWidth = this.sidebarResizeStartWidth + deltaX;\n\n // Constrain between 200px and 500px\n newWidth = Math.max(200, Math.min(500, newWidth));\n this.sidebarWidth = newWidth;\n } else if (this.isArtifactPanelResizing) {\n const container = document.querySelector('.workspace-content') as HTMLElement;\n if (!container) return;\n\n const containerWidth = container.offsetWidth;\n const deltaX = event.clientX - this.artifactPanelResizeStartX;\n const deltaPercent = (deltaX / containerWidth) * -100; // Negative because we're pulling from the right\n let newWidth = this.artifactPanelResizeStartWidth + deltaPercent;\n\n // Constrain between 20% and 70%\n newWidth = Math.max(20, Math.min(70, newWidth));\n this.artifactPanelWidth = newWidth;\n }\n }\n\n private onResizeEnd(event: MouseEvent): void {\n if (this.isSidebarResizing) {\n this.isSidebarResizing = false;\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n this.saveSidebarState(); // Save width to User Settings\n } else if (this.isArtifactPanelResizing) {\n this.isArtifactPanelResizing = false;\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n this.saveSidebarState(); // Save width to User Settings\n }\n }\n\n /**\n * Touch event handlers for mobile resize support\n */\n onSidebarResizeTouchStart(event: TouchEvent): void {\n this.isSidebarResizing = true;\n const touch = event.touches[0];\n this.sidebarResizeStartX = touch.clientX;\n this.sidebarResizeStartWidth = this.sidebarWidth;\n event.preventDefault();\n }\n\n onArtifactPanelResizeTouchStart(event: TouchEvent): void {\n this.isArtifactPanelResizing = true;\n const touch = event.touches[0];\n this.artifactPanelResizeStartX = touch.clientX;\n this.artifactPanelResizeStartWidth = this.artifactPanelWidth;\n event.preventDefault();\n }\n\n private onResizeTouchMove(event: TouchEvent): void {\n if (this.isSidebarResizing) {\n const touch = event.touches[0];\n const deltaX = touch.clientX - this.sidebarResizeStartX;\n let newWidth = this.sidebarResizeStartWidth + deltaX;\n\n newWidth = Math.max(200, Math.min(500, newWidth));\n this.sidebarWidth = newWidth;\n } else if (this.isArtifactPanelResizing) {\n const container = document.querySelector('.workspace-content') as HTMLElement;\n if (!container) return;\n\n const touch = event.touches[0];\n const containerWidth = container.offsetWidth;\n const deltaX = touch.clientX - this.artifactPanelResizeStartX;\n const deltaPercent = (deltaX / containerWidth) * -100;\n let newWidth = this.artifactPanelResizeStartWidth + deltaPercent;\n\n newWidth = Math.max(20, Math.min(70, newWidth));\n this.artifactPanelWidth = newWidth;\n }\n }\n\n private onResizeTouchEnd(event: TouchEvent): void {\n if (this.isSidebarResizing) {\n this.isSidebarResizing = false;\n this.saveSidebarState(); // Save width to User Settings\n } else if (this.isArtifactPanelResizing) {\n this.isArtifactPanelResizing = false;\n this.saveSidebarState(); // Save width to User Settings\n }\n }\n\n /**\n * Toggle maximize/restore state for artifact panel\n */\n toggleMaximizeArtifactPanel(): void {\n if (this.isArtifactPanelMaximized) {\n // Restore to previous width\n this.artifactPanelWidth = this.artifactPanelWidthBeforeMaximize;\n this.isArtifactPanelMaximized = false;\n } else {\n // Maximize - store current width and set to 100%\n this.artifactPanelWidthBeforeMaximize = this.artifactPanelWidth;\n this.artifactPanelWidth = 100;\n this.isArtifactPanelMaximized = true;\n }\n }\n\n onConversationRenamed(event: {conversationId: string; name: string; description: string}): void {\n console.log('✨ Workspace received rename event:', event);\n // Trigger animation in sidebar by setting the ID\n this.renamedConversationId = event.conversationId;\n\n // Clear after animation completes (1500ms)\n setTimeout(() => {\n this.renamedConversationId = null;\n }, 1500);\n }\n\n onOpenEntityRecord(event: {entityName: string; compositeKey: CompositeKey}): void {\n // Convert to actionable command and emit\n const firstKeyValue = event.compositeKey.KeyValuePairs[0]?.Value || '';\n const command: ActionableCommand = {\n type: 'open:resource',\n label: `Open ${event.entityName}`,\n resourceType: 'Record',\n entityName: event.entityName,\n resourceId: firstKeyValue,\n mode: 'view'\n };\n this.actionableCommandExecuted.emit(command);\n }\n\n onNavigationRequest(event: NavigationRequest): void {\n this.navigationRequested.emit(event);\n }\n\n onOpenEntityRecordFromTasks(event: {entityName: string; recordId: string}): void {\n // Convert to actionable command and emit\n const command: ActionableCommand = {\n type: 'open:resource',\n label: `Open ${event.entityName}`,\n resourceType: 'Record',\n entityName: event.entityName,\n resourceId: event.recordId,\n mode: 'view'\n };\n this.actionableCommandExecuted.emit(command);\n }\n\n onTaskClicked(task: MJTaskEntity): void {\n // Switch to Tasks tab and set active task ID\n this.activeTab = 'tasks';\n this._activeTaskId = task.ID;\n\n // Emit navigation change\n this.navigationChanged.emit({\n tab: 'tasks',\n taskId: task.ID\n });\n }\n\n /**\n * Handle collection navigation events\n */\n onCollectionNavigated(event: { collectionId: string | null; versionId?: string | null }): void {\n console.log('📁 Collection navigated:', event);\n\n // Store the version ID for URL sync\n // CRITICAL: Only update activeVersionId if versionId was explicitly provided in the event\n // If versionId is undefined (not provided), keep the current activeVersionId\n if (event.versionId !== undefined) {\n this.activeVersionId = event.versionId;\n }\n // Otherwise: versionId not provided in event, preserve current activeVersionId\n\n // IMPORTANT: Don't emit navigationChanged here when doing programmatic navigation (deep linking)\n // The artifact state is managed separately\n // Only emit if the event explicitly includes a versionId, or if we're intentionally closing the artifact\n if (event.versionId !== undefined) {\n // Event explicitly specifies artifact state (user clicked artifact or intentionally closed it)\n this.navigationChanged.emit({\n tab: 'collections',\n collectionId: event.collectionId || undefined,\n versionId: event.versionId || undefined\n });\n } else if (!this.activeVersionId) {\n // No artifact currently open, safe to emit collection-only navigation\n this.navigationChanged.emit({\n tab: 'collections',\n collectionId: event.collectionId || undefined\n });\n }\n // Otherwise: artifact is open but event doesn't specify versionId\n // Don't emit - preserve current URL state with artifact\n }\n\n /**\n * Handle navigation from artifact links\n */\n onArtifactLinkNavigation(event: {type: 'conversation' | 'collection'; id: string; artifactId?: string; versionNumber?: number; versionId?: string}): void {\n console.log('🔗 Navigating from artifact link:', event);\n\n if (event.type === 'conversation') {\n this.activeTab = 'conversations';\n\n // Close collection artifact viewer if it's open\n this.artifactState.closeArtifact();\n\n // Store pending artifact info so chat area can show it and scroll to message\n if (event.artifactId) {\n this.pendingArtifactId = event.artifactId;\n this.pendingArtifactVersionNumber = event.versionNumber || null;\n console.log('📦 Pending artifact set:', event.artifactId, 'v' + event.versionNumber);\n }\n\n this.setActiveConversation(event.id);\n\n this.navigationChanged.emit({\n tab: 'conversations',\n conversationId: event.id\n });\n } else if (event.type === 'collection') {\n this.activeTab = 'collections';\n this.collectionState.setActiveCollection(event.id);\n\n // Open the artifact automatically when navigating to the collection\n if (event.artifactId) {\n this.artifactState.openArtifact(event.artifactId, event.versionNumber);\n }\n\n // Store version ID for URL sync (same as viewArtifact does)\n if (event.versionId) {\n this.activeVersionId = event.versionId;\n }\n\n // Emit navigation with version ID so URL includes it\n this.navigationChanged.emit({\n tab: 'collections',\n collectionId: event.id,\n versionId: event.versionId\n });\n }\n }\n\n /**\n * Load permissions for the given artifact\n */\n private async loadArtifactPermissions(artifactId: string): Promise<void> {\n // Guard against null/undefined\n if (!artifactId) {\n this.canShareActiveArtifact = false;\n this.canEditActiveArtifact = false;\n return;\n }\n\n try {\n const permissions = await this.artifactPermissionService.getUserPermissions(artifactId, this.currentUser);\n this.canShareActiveArtifact = permissions.canShare;\n this.canEditActiveArtifact = permissions.canEdit;\n } catch (error) {\n console.error('Failed to load artifact permissions:', error);\n this.canShareActiveArtifact = false;\n this.canEditActiveArtifact = false;\n }\n }\n\n /**\n * Handle share request from artifact viewer\n */\n async onArtifactShareRequested(artifactId: string): Promise<void> {\n // Load the artifact entity to pass to the modal\n const md = this.ProviderToUse;\n const artifact = await md.GetEntityObject<MJArtifactEntity>('MJ: Artifacts');\n await artifact.Load(artifactId);\n\n if (artifact) {\n this.artifactToShare = artifact;\n this.isArtifactShareModalOpen = true;\n }\n }\n\n /**\n * Handle close of artifact share modal\n */\n onArtifactShareModalClose(): void {\n this.isArtifactShareModalOpen = false;\n this.artifactToShare = null;\n }\n\n /**\n * Handle successful share - refresh permissions\n */\n async onArtifactShared(): Promise<void> {\n this.isArtifactShareModalOpen = false;\n this.artifactToShare = null;\n\n // Refresh permissions for the active artifact\n if (this.activeArtifactId) {\n await this.loadArtifactPermissions(this.activeArtifactId);\n }\n }\n\n /**\n * Handle actionable command execution from child components\n * Bubbles up to host application for handling\n */\n onActionableCommand(command: ActionableCommand): void {\n console.log('📤 Bubbling up actionable command:', command);\n this.actionableCommandExecuted.emit(command);\n }\n\n /**\n * Handle automatic command execution from child components\n * Bubbles up to host application for handling\n */\n onAutomaticCommand(command: AutomaticCommand): void {\n console.log('📤 Bubbling up automatic command:', command);\n this.automaticCommandExecuted.emit(command);\n }\n}","<div class=\"conversation-workspace\" [attr.data-layout]=\"layout\" mjSearchShortcut (searchTriggered)=\"openSearch()\">\n <!-- Top Navigation Bar -->\n <div class=\"workspace-navigation\">\n <mj-conversation-navigation\n [activeTab]=\"activeTab\"\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [conversationId]=\"selectedConversationId\"\n (tabChanged)=\"onTabChanged($event)\"\n (sidebarToggled)=\"toggleSidebar()\"\n (searchTriggered)=\"openSearch()\"\n (refreshTriggered)=\"onRefreshAgentCache()\">\n </mj-conversation-navigation>\n </div>\n\n <!-- Loading spinner while initializing agents -->\n @if (!isWorkspaceReady) {\n <div class=\"workspace-loading\">\n <mj-loading text=\"Loading agents...\" size=\"large\"></mj-loading>\n </div>\n }\n\n <!-- Main workspace content - only renders when agents are ready -->\n @if (isWorkspaceReady) {\n <div class=\"workspace-content\">\n <!-- Mobile sidebar backdrop -->\n @if (isMobileView && isSidebarVisible && activeTab !== 'collections' && activeTab !== 'tasks') {\n <div class=\"mobile-sidebar-backdrop visible\" (click)=\"closeSidebar()\"></div>\n }\n\n <!-- Left Sidebar (hidden when Collections or Tasks view is active) -->\n @if (activeTab !== 'collections' && activeTab !== 'tasks' && isSidebarSettingsLoaded) {\n <div class=\"workspace-sidebar\"\n [class.open]=\"isSidebarVisible\"\n [class.collapsed]=\"isSidebarCollapsed\"\n [class.no-transition]=\"!sidebarTransitionsEnabled\"\n [style.width.px]=\"isSidebarCollapsed ? 0 : sidebarWidth\">\n <mj-conversation-sidebar\n [activeTab]=\"activeTab\"\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [selectedConversationId]=\"selectedConversationId\"\n [renamedConversationId]=\"renamedConversationId\"\n [isSidebarPinned]=\"isSidebarPinned\"\n [isMobileView]=\"isMobileView\"\n (conversationSelected)=\"onConversationSelected($event)\"\n (newConversationRequested)=\"startNewConversation()\"\n (pinSidebarRequested)=\"pinSidebar()\"\n (unpinSidebarRequested)=\"unpinSidebar()\">\n </mj-conversation-sidebar>\n </div>\n }\n\n <!-- Floating toggle button (only visible when sidebar is collapsed and settings loaded) -->\n @if (activeTab !== 'collections' && activeTab !== 'tasks' && isSidebarCollapsed && isSidebarSettingsLoaded) {\n <button class=\"sidebar-floating-toggle\"\n (click)=\"expandSidebar()\"\n title=\"Show conversations\">\n <i class=\"fas fa-table-columns\"></i>\n </button>\n }\n\n <!-- Resize handle for sidebar (only when expanded and settings loaded) -->\n @if (isSidebarVisible && !isSidebarCollapsed && activeTab !== 'collections' && activeTab !== 'tasks' && isSidebarSettingsLoaded) {\n <div class=\"sidebar-resize-handle\"\n (mousedown)=\"onSidebarResizeStart($event)\"></div>\n }\n\n <!-- Collections Full-Panel View -->\n @if (activeTab === 'collections') {\n <div class=\"workspace-main\">\n <mj-collections-full-view\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n (collectionNavigated)=\"onCollectionNavigated($event)\">\n </mj-collections-full-view>\n </div>\n }\n\n <!-- Tasks Full-Panel View -->\n @if (activeTab === 'tasks') {\n <div class=\"workspace-main\">\n <mj-tasks-full-view\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [baseFilter]=\"tasksFilter\"\n [activeTaskId]=\"activeTaskId\"\n (openEntityRecord)=\"onOpenEntityRecordFromTasks($event)\">\n </mj-tasks-full-view>\n </div>\n }\n\n <!-- Main Chat Area (only shown when not in Collections or Tasks view) -->\n @if (activeTab !== 'collections' && activeTab !== 'tasks') {\n <div class=\"workspace-main\">\n <mj-conversation-chat-area\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [conversationId]=\"selectedConversationId\"\n [conversation]=\"selectedConversation\"\n [threadId]=\"selectedThreadId\"\n [isNewConversation]=\"isNewUnsavedConversation\"\n [pendingMessage]=\"pendingMessageToSend\"\n [pendingAttachments]=\"pendingAttachmentsToSend\"\n [pendingArtifactId]=\"pendingArtifactId\"\n [pendingArtifactVersionNumber]=\"pendingArtifactVersionNumber\"\n (conversationRenamed)=\"onConversationRenamed($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n (navigationRequest)=\"onNavigationRequest($event)\"\n (taskClicked)=\"onTaskClicked($event)\"\n (artifactLinkClicked)=\"onArtifactLinkNavigation($event)\"\n (conversationCreated)=\"onConversationCreated($event)\"\n (threadOpened)=\"onThreadOpened($event)\"\n (threadClosed)=\"onThreadClosed()\"\n (pendingArtifactConsumed)=\"pendingArtifactId = null; pendingArtifactVersionNumber = null\"\n (pendingMessageConsumed)=\"pendingMessageToSend = null; pendingAttachmentsToSend = null\"\n (pendingMessageRequested)=\"onPendingMessageRequested($event)\">\n </mj-conversation-chat-area>\n </div>\n }\n\n <!-- Right Artifact Panel -->\n @if (isArtifactPanelOpen && activeArtifactId) {\n @if (!isArtifactPanelMaximized) {\n <div class=\"artifact-panel-resize-handle\" (mousedown)=\"onArtifactPanelResizeStart($event)\"></div>\n }\n <div class=\"workspace-artifact-panel\"\n [style.width.%]=\"artifactPanelWidth\"\n [class.maximized]=\"isArtifactPanelMaximized\">\n <mj-artifact-viewer-panel\n [artifactId]=\"activeArtifactId\"\n [currentUser]=\"currentUser\"\n [environmentId]=\"environmentId\"\n [versionNumber]=\"activeVersionNumber ?? undefined\"\n [showSaveToCollection]=\"activeTab !== 'collections'\"\n [viewContext]=\"activeTab === 'collections' ? 'collection' : 'conversation'\"\n [contextCollectionId]=\"collectionState.activeCollectionId ?? undefined\"\n [canShare]=\"canShareActiveArtifact\"\n [canEdit]=\"canEditActiveArtifact\"\n [isMaximized]=\"isArtifactPanelMaximized\"\n (closed)=\"closeArtifactPanel()\"\n (navigateToLink)=\"onArtifactLinkNavigation($event)\"\n (shareRequested)=\"onArtifactShareRequested($event)\"\n (maximizeToggled)=\"toggleMaximizeArtifactPanel()\">\n </mj-artifact-viewer-panel>\n </div>\n }\n </div>\n }\n\n <!-- Global Search Panel -->\n <mj-search-panel\n [isOpen]=\"isSearchPanelOpen\"\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n (close)=\"closeSearch()\"\n (resultSelected)=\"handleSearchResult($event)\">\n </mj-search-panel>\n\n <!-- Toast Notifications -->\n <mj-toast></mj-toast>\n\n <!-- Artifact Share Modal -->\n <mj-artifact-share-modal\n [isOpen]=\"isArtifactShareModalOpen\"\n [artifact]=\"artifactToShare\"\n [currentUser]=\"currentUser\"\n (saved)=\"onArtifactShared()\"\n (cancelled)=\"onArtifactShareModalClose()\">\n </mj-artifact-share-modal>\n</div>"]}
|
|
@@ -154,7 +154,7 @@ export class LazyArtifactInfo {
|
|
|
154
154
|
}
|
|
155
155
|
async doFallbackLoad() {
|
|
156
156
|
try {
|
|
157
|
-
const md = new Metadata();
|
|
157
|
+
const md = new Metadata(); // global-provider-ok: utility — single-provider context
|
|
158
158
|
const [artifact, version] = await Promise.all([
|
|
159
159
|
this._fallbackArtifact ? Promise.resolve(this._fallbackArtifact) : this.loadSingleArtifact(md),
|
|
160
160
|
this._fallbackVersion ? Promise.resolve(this._fallbackVersion) : this.loadSingleVersion(md)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lazy-artifact-info.js","sourceRoot":"","sources":["../../../src/lib/models/lazy-artifact-info.ts"],"names":[],"mappings":"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","sourcesContent":["import { MJArtifactEntity, MJArtifactVersionEntity, ArtifactMetadataEngine } from '@memberjunction/core-entities';\nimport { Metadata, UserInfo } from '@memberjunction/core';\n\n/**\n * Represents artifact information with lazy-loading capabilities.\n * Stores minimal display data initially (from query) and loads full entities on-demand.\n *\n * For full entity access, delegates to {@link ArtifactMetadataEngine} which is kept\n * in sync automatically via BaseEngine's MJGlobal event listener. When any\n * BaseEntity save/delete fires in the same process, the engine's in-memory\n * arrays are updated immediately — so callers always get the freshest data\n * without tight coupling between the conversation layer and artifact editors.\n *\n * A one-time direct load fallback is used when the engine hasn't loaded yet\n * or the entity is brand-new and hasn't propagated to the engine's cache.\n */\nexport class LazyArtifactInfo {\n // Display data (always available from initial query - no lazy loading needed)\n public readonly conversationDetailId: string;\n public readonly direction: string;\n public readonly artifactVersionId: string;\n public readonly versionNumber: number;\n public readonly versionName: string | null;\n public readonly versionDescription: string | null;\n public readonly versionCreatedAt: Date;\n public readonly artifactId: string;\n public readonly artifactName: string;\n public readonly artifactType: string;\n public readonly artifactDescription: string;\n public readonly visibility: string;\n\n // Fallback entities loaded directly when engine doesn't have them yet\n private _fallbackArtifact: MJArtifactEntity | null = null;\n private _fallbackVersion: MJArtifactVersionEntity | null = null;\n private _fallbackLoadPromise: Promise<void> | null = null;\n\n constructor(\n queryResult: Record<string, unknown>,\n private currentUser: UserInfo,\n preloadedArtifact?: MJArtifactEntity,\n preloadedVersion?: MJArtifactVersionEntity\n ) {\n // Populate display data from query result\n // These fields come from GetConversationComplete query\n this.conversationDetailId = queryResult.ConversationDetailID as string;\n this.direction = queryResult.Direction as string;\n this.artifactVersionId = queryResult.ArtifactVersionID as string;\n this.versionNumber = queryResult.VersionNumber as number;\n this.versionName = (queryResult.VersionName as string) || null;\n this.versionDescription = (queryResult.VersionDescription as string) || null;\n this.versionCreatedAt = queryResult.VersionCreatedAt ? new Date(queryResult.VersionCreatedAt as string) : new Date();\n this.artifactId = queryResult.ArtifactID as string;\n this.artifactName = queryResult.ArtifactName as string;\n this.artifactType = queryResult.ArtifactType as string;\n this.artifactDescription = (queryResult.ArtifactDescription as string) || '';\n this.visibility = (queryResult.Visibility as string) || 'User';\n\n // If entities were pre-loaded via batch query, store as fallbacks\n if (preloadedArtifact) {\n this._fallbackArtifact = preloadedArtifact;\n }\n if (preloadedVersion) {\n this._fallbackVersion = preloadedVersion;\n }\n }\n\n /**\n * Gets the full Artifact entity.\n * Checks ArtifactMetadataEngine first (always fresh), falls back to direct load.\n */\n async getArtifact(): Promise<MJArtifactEntity> {\n // Try the engine first — it stays in sync via BaseEntity events\n const engine = ArtifactMetadataEngine.Instance;\n if (engine.Loaded) {\n const fromEngine = engine.FindArtifactByID(this.artifactId);\n if (fromEngine) {\n return fromEngine;\n }\n }\n\n // Engine doesn't have it yet — use fallback\n return this.loadArtifactFallback();\n }\n\n /**\n * Gets the full ArtifactVersion entity including Content field.\n * Checks ArtifactMetadataEngine first (always fresh), falls back to direct load.\n */\n async getVersion(): Promise<MJArtifactVersionEntity> {\n // Try the engine first — it stays in sync via BaseEntity events\n const engine = ArtifactMetadataEngine.Instance;\n if (engine.Loaded) {\n const fromEngine = engine.FindArtifactVersionByID(this.artifactVersionId);\n if (fromEngine) {\n return fromEngine;\n }\n }\n\n // Engine doesn't have it yet — use fallback\n return this.loadVersionFallback();\n }\n\n /**\n * Checks if the artifact entities can be accessed without triggering a load.\n * True if the engine has them or fallbacks are populated.\n */\n get isLoaded(): boolean {\n const engine = ArtifactMetadataEngine.Instance;\n if (engine.Loaded) {\n const hasArtifact = !!engine.FindArtifactByID(this.artifactId);\n const hasVersion = !!engine.FindArtifactVersionByID(this.artifactVersionId);\n if (hasArtifact && hasVersion) {\n return true;\n }\n }\n return this._fallbackArtifact !== null && this._fallbackVersion !== null;\n }\n\n /**\n * Checks if a fallback load is currently in progress.\n */\n get isLoading(): boolean {\n return this._fallbackLoadPromise !== null;\n }\n\n /**\n * Loads the artifact directly from the database as a fallback.\n * Uses a shared promise to coalesce concurrent calls.\n */\n private async loadArtifactFallback(): Promise<MJArtifactEntity> {\n if (this._fallbackArtifact) {\n return this._fallbackArtifact;\n }\n\n await this.ensureFallbacksLoaded();\n return this._fallbackArtifact!;\n }\n\n /**\n * Loads the artifact version directly from the database as a fallback.\n * Uses a shared promise to coalesce concurrent calls.\n */\n private async loadVersionFallback(): Promise<MJArtifactVersionEntity> {\n if (this._fallbackVersion) {\n return this._fallbackVersion;\n }\n\n await this.ensureFallbacksLoaded();\n return this._fallbackVersion!;\n }\n\n /**\n * Loads both artifact and version from database in parallel.\n * Called only when ArtifactMetadataEngine doesn't have the entities.\n * Shares a single promise across concurrent requests.\n */\n private async ensureFallbacksLoaded(): Promise<void> {\n if (this._fallbackArtifact && this._fallbackVersion) {\n return;\n }\n\n if (this._fallbackLoadPromise) {\n await this._fallbackLoadPromise;\n return;\n }\n\n this._fallbackLoadPromise = this.doFallbackLoad();\n try {\n await this._fallbackLoadPromise;\n } finally {\n this._fallbackLoadPromise = null;\n }\n }\n\n private async doFallbackLoad(): Promise<void> {\n try {\n const md = new Metadata();\n const [artifact, version] = await Promise.all([\n this._fallbackArtifact ? Promise.resolve(this._fallbackArtifact) : this.loadSingleArtifact(md),\n this._fallbackVersion ? Promise.resolve(this._fallbackVersion) : this.loadSingleVersion(md)\n ]);\n this._fallbackArtifact = artifact;\n this._fallbackVersion = version;\n } catch (error) {\n console.error('LazyArtifactInfo: Error loading fallback entities:', error);\n throw error;\n }\n }\n\n private async loadSingleArtifact(md: Metadata): Promise<MJArtifactEntity> {\n const artifact = await md.GetEntityObject<MJArtifactEntity>('MJ: Artifacts', this.currentUser);\n await artifact.Load(this.artifactId);\n return artifact;\n }\n\n private async loadSingleVersion(md: Metadata): Promise<MJArtifactVersionEntity> {\n const version = await md.GetEntityObject<MJArtifactVersionEntity>('MJ: Artifact Versions', this.currentUser);\n await version.Load(this.artifactVersionId);\n return version;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"lazy-artifact-info.js","sourceRoot":"","sources":["../../../src/lib/models/lazy-artifact-info.ts"],"names":[],"mappings":"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","sourcesContent":["import { MJArtifactEntity, MJArtifactVersionEntity, ArtifactMetadataEngine } from '@memberjunction/core-entities';\nimport { Metadata, UserInfo } from '@memberjunction/core';\n\n/**\n * Represents artifact information with lazy-loading capabilities.\n * Stores minimal display data initially (from query) and loads full entities on-demand.\n *\n * For full entity access, delegates to {@link ArtifactMetadataEngine} which is kept\n * in sync automatically via BaseEngine's MJGlobal event listener. When any\n * BaseEntity save/delete fires in the same process, the engine's in-memory\n * arrays are updated immediately — so callers always get the freshest data\n * without tight coupling between the conversation layer and artifact editors.\n *\n * A one-time direct load fallback is used when the engine hasn't loaded yet\n * or the entity is brand-new and hasn't propagated to the engine's cache.\n */\nexport class LazyArtifactInfo {\n // Display data (always available from initial query - no lazy loading needed)\n public readonly conversationDetailId: string;\n public readonly direction: string;\n public readonly artifactVersionId: string;\n public readonly versionNumber: number;\n public readonly versionName: string | null;\n public readonly versionDescription: string | null;\n public readonly versionCreatedAt: Date;\n public readonly artifactId: string;\n public readonly artifactName: string;\n public readonly artifactType: string;\n public readonly artifactDescription: string;\n public readonly visibility: string;\n\n // Fallback entities loaded directly when engine doesn't have them yet\n private _fallbackArtifact: MJArtifactEntity | null = null;\n private _fallbackVersion: MJArtifactVersionEntity | null = null;\n private _fallbackLoadPromise: Promise<void> | null = null;\n\n constructor(\n queryResult: Record<string, unknown>,\n private currentUser: UserInfo,\n preloadedArtifact?: MJArtifactEntity,\n preloadedVersion?: MJArtifactVersionEntity\n ) {\n // Populate display data from query result\n // These fields come from GetConversationComplete query\n this.conversationDetailId = queryResult.ConversationDetailID as string;\n this.direction = queryResult.Direction as string;\n this.artifactVersionId = queryResult.ArtifactVersionID as string;\n this.versionNumber = queryResult.VersionNumber as number;\n this.versionName = (queryResult.VersionName as string) || null;\n this.versionDescription = (queryResult.VersionDescription as string) || null;\n this.versionCreatedAt = queryResult.VersionCreatedAt ? new Date(queryResult.VersionCreatedAt as string) : new Date();\n this.artifactId = queryResult.ArtifactID as string;\n this.artifactName = queryResult.ArtifactName as string;\n this.artifactType = queryResult.ArtifactType as string;\n this.artifactDescription = (queryResult.ArtifactDescription as string) || '';\n this.visibility = (queryResult.Visibility as string) || 'User';\n\n // If entities were pre-loaded via batch query, store as fallbacks\n if (preloadedArtifact) {\n this._fallbackArtifact = preloadedArtifact;\n }\n if (preloadedVersion) {\n this._fallbackVersion = preloadedVersion;\n }\n }\n\n /**\n * Gets the full Artifact entity.\n * Checks ArtifactMetadataEngine first (always fresh), falls back to direct load.\n */\n async getArtifact(): Promise<MJArtifactEntity> {\n // Try the engine first — it stays in sync via BaseEntity events\n const engine = ArtifactMetadataEngine.Instance;\n if (engine.Loaded) {\n const fromEngine = engine.FindArtifactByID(this.artifactId);\n if (fromEngine) {\n return fromEngine;\n }\n }\n\n // Engine doesn't have it yet — use fallback\n return this.loadArtifactFallback();\n }\n\n /**\n * Gets the full ArtifactVersion entity including Content field.\n * Checks ArtifactMetadataEngine first (always fresh), falls back to direct load.\n */\n async getVersion(): Promise<MJArtifactVersionEntity> {\n // Try the engine first — it stays in sync via BaseEntity events\n const engine = ArtifactMetadataEngine.Instance;\n if (engine.Loaded) {\n const fromEngine = engine.FindArtifactVersionByID(this.artifactVersionId);\n if (fromEngine) {\n return fromEngine;\n }\n }\n\n // Engine doesn't have it yet — use fallback\n return this.loadVersionFallback();\n }\n\n /**\n * Checks if the artifact entities can be accessed without triggering a load.\n * True if the engine has them or fallbacks are populated.\n */\n get isLoaded(): boolean {\n const engine = ArtifactMetadataEngine.Instance;\n if (engine.Loaded) {\n const hasArtifact = !!engine.FindArtifactByID(this.artifactId);\n const hasVersion = !!engine.FindArtifactVersionByID(this.artifactVersionId);\n if (hasArtifact && hasVersion) {\n return true;\n }\n }\n return this._fallbackArtifact !== null && this._fallbackVersion !== null;\n }\n\n /**\n * Checks if a fallback load is currently in progress.\n */\n get isLoading(): boolean {\n return this._fallbackLoadPromise !== null;\n }\n\n /**\n * Loads the artifact directly from the database as a fallback.\n * Uses a shared promise to coalesce concurrent calls.\n */\n private async loadArtifactFallback(): Promise<MJArtifactEntity> {\n if (this._fallbackArtifact) {\n return this._fallbackArtifact;\n }\n\n await this.ensureFallbacksLoaded();\n return this._fallbackArtifact!;\n }\n\n /**\n * Loads the artifact version directly from the database as a fallback.\n * Uses a shared promise to coalesce concurrent calls.\n */\n private async loadVersionFallback(): Promise<MJArtifactVersionEntity> {\n if (this._fallbackVersion) {\n return this._fallbackVersion;\n }\n\n await this.ensureFallbacksLoaded();\n return this._fallbackVersion!;\n }\n\n /**\n * Loads both artifact and version from database in parallel.\n * Called only when ArtifactMetadataEngine doesn't have the entities.\n * Shares a single promise across concurrent requests.\n */\n private async ensureFallbacksLoaded(): Promise<void> {\n if (this._fallbackArtifact && this._fallbackVersion) {\n return;\n }\n\n if (this._fallbackLoadPromise) {\n await this._fallbackLoadPromise;\n return;\n }\n\n this._fallbackLoadPromise = this.doFallbackLoad();\n try {\n await this._fallbackLoadPromise;\n } finally {\n this._fallbackLoadPromise = null;\n }\n }\n\n private async doFallbackLoad(): Promise<void> {\n try {\n const md = new Metadata(); // global-provider-ok: utility — single-provider context\n const [artifact, version] = await Promise.all([\n this._fallbackArtifact ? Promise.resolve(this._fallbackArtifact) : this.loadSingleArtifact(md),\n this._fallbackVersion ? Promise.resolve(this._fallbackVersion) : this.loadSingleVersion(md)\n ]);\n this._fallbackArtifact = artifact;\n this._fallbackVersion = version;\n } catch (error) {\n console.error('LazyArtifactInfo: Error loading fallback entities:', error);\n throw error;\n }\n }\n\n private async loadSingleArtifact(md: Metadata): Promise<MJArtifactEntity> {\n const artifact = await md.GetEntityObject<MJArtifactEntity>('MJ: Artifacts', this.currentUser);\n await artifact.Load(this.artifactId);\n return artifact;\n }\n\n private async loadSingleVersion(md: Metadata): Promise<MJArtifactVersionEntity> {\n const version = await md.GetEntityObject<MJArtifactVersionEntity>('MJ: Artifact Versions', this.currentUser);\n await version.Load(this.artifactVersionId);\n return version;\n }\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Observable } from 'rxjs';
|
|
2
|
-
import { UserInfo } from '@memberjunction/core';
|
|
2
|
+
import { UserInfo, IMetadataProvider } from '@memberjunction/core';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
/**
|
|
5
5
|
* Represents an active agent task that is currently running
|
|
@@ -24,6 +24,12 @@ export declare class ActiveTasksService {
|
|
|
24
24
|
private _tasks$;
|
|
25
25
|
private _conversationIdsWithTasks$;
|
|
26
26
|
private engine;
|
|
27
|
+
private _provider;
|
|
28
|
+
/**
|
|
29
|
+
* Set the metadata provider this service should use. When unset, falls back to Metadata.Provider.
|
|
30
|
+
*/
|
|
31
|
+
set Provider(value: IMetadataProvider | null);
|
|
32
|
+
get Provider(): IMetadataProvider;
|
|
27
33
|
/**
|
|
28
34
|
* Observable of all active tasks as an array
|
|
29
35
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"active-tasks.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/active-tasks.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,UAAU,EAAE,MAAM,MAAM,CAAC;AAEnD,OAAO,EAAW,QAAQ,EAAE,MAAM,sBAAsB,CAAC;;
|
|
1
|
+
{"version":3,"file":"active-tasks.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/active-tasks.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,UAAU,EAAE,MAAM,MAAM,CAAC;AAEnD,OAAO,EAAW,QAAQ,EAAY,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;;AAItF;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,qBAGa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAA2D;IAC1E,OAAO,CAAC,0BAA0B,CAA+C;IACjF,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,SAAS,CAAkC;IAEnD;;OAEG;IACH,IAAW,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,EAElD;IAED,IAAW,QAAQ,IAAI,iBAAiB,CAEvC;IAED;;OAEG;IACH,SAAgB,MAAM,EAAE,UAAU,CAAC,UAAU,EAAE,CAAC,CAE9C;IAEF;;OAEG;IACH,SAAgB,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,CAE5C;IAEF;;;OAGG;IACH,SAAgB,yBAAyB,EAAE,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAkD;IAEpH;;;OAGG;IACH,SAAgB,sBAAsB,EAAE,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAY3E;IAEF;;;;OAIG;IACH,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG,MAAM;IAuBvD;;;OAGG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAgBxB;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAUhC;;;;OAIG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAS9C;;;;OAIG;IACH,yBAAyB,CAAC,oBAAoB,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAK/E;;;;;OAKG;IACH,kCAAkC,CAAC,oBAAoB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IASzF;;;;OAIG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAK3D;;;;OAIG;IACH,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAS/C;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;;;OAIG;IACG,mBAAmB,CAAC,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;yCAhMpD,kBAAkB;6CAAlB,kBAAkB;CA6P9B"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Injectable } from '@angular/core';
|
|
2
2
|
import { BehaviorSubject } from 'rxjs';
|
|
3
3
|
import { map } from 'rxjs/operators';
|
|
4
|
-
import { RunView } from '@memberjunction/core';
|
|
4
|
+
import { RunView, Metadata } from '@memberjunction/core';
|
|
5
5
|
import { ConversationEngine } from '@memberjunction/core-entities';
|
|
6
6
|
import * as i0 from "@angular/core";
|
|
7
7
|
/**
|
|
@@ -12,6 +12,16 @@ export class ActiveTasksService {
|
|
|
12
12
|
_tasks$ = new BehaviorSubject(new Map());
|
|
13
13
|
_conversationIdsWithTasks$ = new BehaviorSubject(new Set());
|
|
14
14
|
engine = ConversationEngine.Instance;
|
|
15
|
+
_provider = null;
|
|
16
|
+
/**
|
|
17
|
+
* Set the metadata provider this service should use. When unset, falls back to Metadata.Provider.
|
|
18
|
+
*/
|
|
19
|
+
set Provider(value) {
|
|
20
|
+
this._provider = value;
|
|
21
|
+
}
|
|
22
|
+
get Provider() {
|
|
23
|
+
return this._provider ?? Metadata.Provider;
|
|
24
|
+
}
|
|
15
25
|
/**
|
|
16
26
|
* Observable of all active tasks as an array
|
|
17
27
|
*/
|
|
@@ -165,7 +175,7 @@ export class ActiveTasksService {
|
|
|
165
175
|
*/
|
|
166
176
|
async restoreFromDatabase(currentUser) {
|
|
167
177
|
try {
|
|
168
|
-
const rv =
|
|
178
|
+
const rv = RunView.FromMetadataProvider(this.Provider);
|
|
169
179
|
// Query for running agent runs owned by this user
|
|
170
180
|
// Only restore parent agents (those with ConversationDetailID) - child agents don't have one
|
|
171
181
|
// This matches normal behavior where we only track parent agents, not child agents
|