@memberjunction/ng-conversations 5.51.3 → 5.51.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"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 { UUIDsEqual } from '@memberjunction/global';\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 { PendingAttachment } from '@memberjunction/ng-composer';\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';\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 * Show the Routines section at the very bottom of the left sidebar. Default true;\n * hosts that don't want routines (or embed a reduced chat surface) set false.\n * The section additionally hides itself when the current user lacks Read\n * permission on 'MJ: User Routines'.\n */\n @Input() ShowRoutines: boolean = true;\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 // Stored bound references so addEventListener and removeEventListener get the same function object.\n private readonly boundOnResizeMove = this.onResizeMove.bind(this);\n private readonly boundOnResizeEnd = this.onResizeEnd.bind(this);\n private readonly boundOnResizeTouchMove = this.onResizeTouchMove.bind(this);\n private readonly boundOnResizeTouchEnd = this.onResizeTouchEnd.bind(this);\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 /** The conversation pendingMessageToSend is destined for — bound to the chat-area so the\n * auto-send reaches only that conversation's input, even if the user swaps conversations\n * during the async send window (prevents the message bleeding into the swapped-to conversation). */\n public pendingMessageConversationId: string | null = null;\n public pendingArtifactId: string | null = null;\n public pendingArtifactConversationId: string | null = null;\n public pendingArtifactVersionNumber: number | null = null;\n\n private engine = ConversationEngine.Instance;\n // Shared AI mention/suggestion engine (BaseSingleton — same instance the composer plugins use)\n private mentionAutocompleteService = MentionAutocompleteService.Instance;\n\n constructor(\n public artifactState: ArtifactStateService,\n public collectionState: CollectionStateService,\n private artifactPermissionService: ArtifactPermissionService,\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 this.pendingMessageConversationId = 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 /**\n * A realtime session created (and just finished with) a brand-new conversation. The\n * row was created SERVER-side, so it isn't in the engine cache yet — reload the list\n * to fold it in, then select it ONLY when the conversation list is visible (owner\n * spec: the user may have the sidebar hidden; don't yank their context if so —\n * the refreshed cache makes it appear whenever the list is reopened).\n */\n async onRealtimeConversationReady(event: { conversationId: string; select: boolean }): Promise<void> {\n try {\n await ConversationEngine.Instance.LoadConversations(this.environmentId, this.currentUser, true);\n if (event.select && this.isSidebarVisible) {\n const conversation = ConversationEngine.Instance.Conversations.find(\n c => UUIDsEqual(c.ID, event.conversationId)\n );\n if (conversation) {\n this.selectedConversationId = conversation.ID;\n this.selectedConversation = conversation;\n this.isNewUnsavedConversation = false;\n }\n }\n } catch (error) {\n console.error('onRealtimeConversationReady ERROR:', error);\n }\n }\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 // Pin the pending message to THIS conversation so a fast conversation-swap can't\n // redirect its auto-send into a different conversation.\n this.pendingMessageConversationId = event.conversation.ID;\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 this.pendingMessageConversationId = this.selectedConversationId;\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(request => {\n this.onActionableCommand(request.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.boundOnResizeMove);\n window.addEventListener('mouseup', this.boundOnResizeEnd);\n\n // Setup touch listeners for mobile\n window.addEventListener('touchmove', this.boundOnResizeTouchMove);\n window.addEventListener('touchend', this.boundOnResizeTouchEnd);\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.boundOnResizeMove);\n window.removeEventListener('mouseup', this.boundOnResizeEnd);\n window.removeEventListener('touchmove', this.boundOnResizeTouchMove);\n window.removeEventListener('touchend', this.boundOnResizeTouchEnd);\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 /**\n * Apply-to-my-form handler. This deprecated workspace component is no\n * longer the live chat surface — the real handler lives on\n * ConversationChatAreaComponent. This stub exists only so the template\n * binding compiles. New consumers should use the resource components in\n * @memberjunction/ng-explorer-core instead of this workspace.\n */\n onApplyFormRequested(_event: { spec: unknown; entityName: string }): void {\n console.warn('Workspace.onApplyFormRequested: workspace is deprecated; use the per-feature resource components instead.');\n }\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.pendingArtifactConversationId = event.id;\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 [ShowRoutines]=\"ShowRoutines\"\n [Provider]=\"Provider\"\n (conversationSelected)=\"onConversationSelected($event)\"\n (newConversationRequested)=\"startNewConversation()\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\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 [pendingMessageConversationId]=\"pendingMessageConversationId\"\n [pendingArtifactId]=\"pendingArtifactId\"\n [pendingArtifactConversationId]=\"pendingArtifactConversationId\"\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 (realtimeConversationReady)=\"onRealtimeConversationReady($event)\"\n (threadOpened)=\"onThreadOpened($event)\"\n (threadClosed)=\"onThreadClosed()\"\n (pendingArtifactConsumed)=\"pendingArtifactId = null; pendingArtifactConversationId = null; pendingArtifactVersionNumber = null\"\n (pendingMessageConsumed)=\"pendingMessageToSend = null; pendingAttachmentsToSend = null; pendingMessageConversationId = 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 (applyFormRequested)=\"onApplyFormRequested($event)\">\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 { UUIDsEqual } from '@memberjunction/global';\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 { PendingAttachment } from '@memberjunction/ng-composer';\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 { BuildConversationTasksFilter, OwnTasksFilter } from '../../services/conversation-tasks-filter';\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';\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 * Show the Routines section at the very bottom of the left sidebar. Default true;\n * hosts that don't want routines (or embed a reduced chat surface) set false.\n * The section additionally hides itself when the current user lacks Read\n * permission on 'MJ: User Routines'.\n */\n @Input() ShowRoutines: boolean = true;\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 // Stored bound references so addEventListener and removeEventListener get the same function object.\n private readonly boundOnResizeMove = this.onResizeMove.bind(this);\n private readonly boundOnResizeEnd = this.onResizeEnd.bind(this);\n private readonly boundOnResizeTouchMove = this.onResizeTouchMove.bind(this);\n private readonly boundOnResizeTouchEnd = this.onResizeTouchEnd.bind(this);\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 /** The user's own top-level tasks; the Tasks tab's fallback filter (see {@link TasksFilterResolver}). */\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 /** The conversation pendingMessageToSend is destined for — bound to the chat-area so the\n * auto-send reaches only that conversation's input, even if the user swaps conversations\n * during the async send window (prevents the message bleeding into the swapped-to conversation). */\n public pendingMessageConversationId: string | null = null;\n public pendingArtifactId: string | null = null;\n public pendingArtifactConversationId: string | null = null;\n public pendingArtifactVersionNumber: number | null = null;\n\n private engine = ConversationEngine.Instance;\n // Shared AI mention/suggestion engine (BaseSingleton — same instance the composer plugins use)\n private mentionAutocompleteService = MentionAutocompleteService.Instance;\n\n constructor(\n public artifactState: ArtifactStateService,\n public collectionState: CollectionStateService,\n private artifactPermissionService: ArtifactPermissionService,\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 this.pendingMessageConversationId = 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 /**\n * A realtime session created (and just finished with) a brand-new conversation. The\n * row was created SERVER-side, so it isn't in the engine cache yet — reload the list\n * to fold it in, then select it ONLY when the conversation list is visible (owner\n * spec: the user may have the sidebar hidden; don't yank their context if so —\n * the refreshed cache makes it appear whenever the list is reopened).\n */\n async onRealtimeConversationReady(event: { conversationId: string; select: boolean }): Promise<void> {\n try {\n await ConversationEngine.Instance.LoadConversations(this.environmentId, this.currentUser, true);\n if (event.select && this.isSidebarVisible) {\n const conversation = ConversationEngine.Instance.Conversations.find(\n c => UUIDsEqual(c.ID, event.conversationId)\n );\n if (conversation) {\n this.selectedConversationId = conversation.ID;\n this.selectedConversation = conversation;\n this.isNewUnsavedConversation = false;\n }\n }\n } catch (error) {\n console.error('onRealtimeConversationReady ERROR:', error);\n }\n }\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 // Pin the pending message to THIS conversation so a fast conversation-swap can't\n // redirect its auto-send into a different conversation.\n this.pendingMessageConversationId = event.conversation.ID;\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 this.pendingMessageConversationId = this.selectedConversationId;\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(request => {\n this.onActionableCommand(request.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.boundOnResizeMove);\n window.addEventListener('mouseup', this.boundOnResizeEnd);\n\n // Setup touch listeners for mobile\n window.addEventListener('touchmove', this.boundOnResizeTouchMove);\n window.addEventListener('touchend', this.boundOnResizeTouchEnd);\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 * Sets {@link tasksFilter} to the user's own tasks. The Tasks tab builds its full filter with\n * {@link TasksFilterResolver} each time it loads.\n */\n private buildTasksFilter(): void {\n this.tasksFilter = OwnTasksFilter(this.currentUser);\n }\n\n /**\n * Builds the Tasks tab filter (see {@link BuildConversationTasksFilter}). The tasks view calls it\n * on every load and refresh, so a task linked to a message created after the workspace opened\n * appears on the next refresh. The same function is returned every time, so the input binding\n * does not change.\n */\n public get TasksFilterResolver(): () => Promise<string> {\n this.tasksFilterResolver ??= () => BuildConversationTasksFilter(this.ProviderToUse, this.currentUser);\n return this.tasksFilterResolver;\n }\n private tasksFilterResolver: (() => Promise<string>) | null = null;\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.boundOnResizeMove);\n window.removeEventListener('mouseup', this.boundOnResizeEnd);\n window.removeEventListener('touchmove', this.boundOnResizeTouchMove);\n window.removeEventListener('touchend', this.boundOnResizeTouchEnd);\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 /**\n * Apply-to-my-form handler. This deprecated workspace component is no\n * longer the live chat surface — the real handler lives on\n * ConversationChatAreaComponent. This stub exists only so the template\n * binding compiles. New consumers should use the resource components in\n * @memberjunction/ng-explorer-core instead of this workspace.\n */\n onApplyFormRequested(_event: { spec: unknown; entityName: string }): void {\n console.warn('Workspace.onApplyFormRequested: workspace is deprecated; use the per-feature resource components instead.');\n }\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.pendingArtifactConversationId = event.id;\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 [ShowRoutines]=\"ShowRoutines\"\n [Provider]=\"Provider\"\n (conversationSelected)=\"onConversationSelected($event)\"\n (newConversationRequested)=\"startNewConversation()\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\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 [BaseFilterResolver]=\"TasksFilterResolver\"\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 [pendingMessageConversationId]=\"pendingMessageConversationId\"\n [pendingArtifactId]=\"pendingArtifactId\"\n [pendingArtifactConversationId]=\"pendingArtifactConversationId\"\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 (realtimeConversationReady)=\"onRealtimeConversationReady($event)\"\n (threadOpened)=\"onThreadOpened($event)\"\n (threadClosed)=\"onThreadClosed()\"\n (pendingArtifactConsumed)=\"pendingArtifactId = null; pendingArtifactConversationId = null; pendingArtifactVersionNumber = null\"\n (pendingMessageConsumed)=\"pendingMessageToSend = null; pendingAttachmentsToSend = null; pendingMessageConversationId = 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 (applyFormRequested)=\"onApplyFormRequested($event)\">\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>"]}
@@ -0,0 +1,15 @@
1
+ import { type IMetadataProvider, type UserInfo } from '@memberjunction/core';
2
+ /** The ExtraFilter for the top-level tasks a user owns. */
3
+ export declare function OwnTasksFilter(user: UserInfo): string;
4
+ /**
5
+ * The ExtraFilter for the top-level tasks the conversations UI shows a user: the tasks the user
6
+ * owns, and the tasks linked to a message the user wrote or that is in a conversation the user
7
+ * owns.
8
+ *
9
+ * The conversation and message IDs are read with their own RunView, so the row-level security on
10
+ * those entities applies. A subquery over their views would skip it, and the server refuses one
11
+ * for a user whose read of them is row-filtered. When a read fails, the result is the user's own
12
+ * tasks.
13
+ */
14
+ export declare function BuildConversationTasksFilter(provider: IMetadataProvider, user: UserInfo): Promise<string>;
15
+ //# sourceMappingURL=conversation-tasks-filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-tasks-filter.d.ts","sourceRoot":"","sources":["../../../src/lib/services/conversation-tasks-filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,iBAAiB,EAAsB,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAG3H,2DAA2D;AAC3D,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAErD;AAED;;;;;;;;;GASG;AACH,wBAAsB,4BAA4B,CAAC,QAAQ,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAwB/G"}
@@ -0,0 +1,69 @@
1
+ import { RunView } from '@memberjunction/core';
2
+ import { EscapeSQLString } from '@memberjunction/global';
3
+ /** The ExtraFilter for the top-level tasks a user owns. */
4
+ export function OwnTasksFilter(user) {
5
+ return `ParentID IS NULL AND UserID = '${EscapeSQLString(user.ID)}'`;
6
+ }
7
+ /**
8
+ * The ExtraFilter for the top-level tasks the conversations UI shows a user: the tasks the user
9
+ * owns, and the tasks linked to a message the user wrote or that is in a conversation the user
10
+ * owns.
11
+ *
12
+ * The conversation and message IDs are read with their own RunView, so the row-level security on
13
+ * those entities applies. A subquery over their views would skip it, and the server refuses one
14
+ * for a user whose read of them is row-filtered. When a read fails, the result is the user's own
15
+ * tasks.
16
+ */
17
+ export async function BuildConversationTasksFilter(provider, user) {
18
+ const ownTasks = OwnTasksFilter(user);
19
+ const tasks = provider.EntityByName('MJ: Tasks');
20
+ if (!tasks) {
21
+ return ownTasks;
22
+ }
23
+ const rv = RunView.FromMetadataProvider(provider);
24
+ const conversationIds = await readIds(rv, user, {
25
+ EntityName: 'MJ: Conversations',
26
+ ExtraFilter: `UserID = '${EscapeSQLString(user.ID)}'`,
27
+ Fields: ['ID'],
28
+ });
29
+ if (conversationIds == null) {
30
+ return ownTasks;
31
+ }
32
+ const messageIds = await readIds(rv, user, {
33
+ EntityName: 'MJ: Conversation Details',
34
+ ExtraFilter: taskMessagesFilter(user, conversationIds, tasks),
35
+ Fields: ['ID'],
36
+ });
37
+ if (messageIds == null || messageIds.length === 0) {
38
+ return ownTasks;
39
+ }
40
+ return `ParentID IS NULL AND (UserID = '${EscapeSQLString(user.ID)}' OR ConversationDetailID IN (${sqlInList(messageIds)}))`;
41
+ }
42
+ /**
43
+ * The messages that have a top-level task and that the user wrote or that are in one of the
44
+ * user's conversations. The task subquery reads Tasks, which has no row filter in a default
45
+ * install. Its identifiers are bracketed so the PostgreSQL provider quotes them.
46
+ */
47
+ function taskMessagesFilter(user, conversationIds, tasks) {
48
+ const inConversations = conversationIds.length > 0 ? ` OR ConversationID IN (${sqlInList(conversationIds)})` : '';
49
+ const taskView = `[${tasks.SchemaName}].[${tasks.BaseView}]`;
50
+ return (`(UserID = '${EscapeSQLString(user.ID)}'${inConversations}) AND ID IN ` +
51
+ `(SELECT [ConversationDetailID] FROM ${taskView} WHERE [ParentID] IS NULL AND [ConversationDetailID] IS NOT NULL)`);
52
+ }
53
+ /**
54
+ * The IDs of the rows `read` selects, with no row cap; null when the read fails. Each caller names
55
+ * an MJ core entity in `read`, so its key column is `ID`.
56
+ */
57
+ async function readIds(rv, user, read) {
58
+ const result = await rv.RunView({ ...read, ResultType: 'simple', IgnoreMaxRows: true }, user);
59
+ if (!result.Success) {
60
+ console.error(`Failed to read ${read.EntityName} for the tasks filter:`, result.ErrorMessage);
61
+ return null;
62
+ }
63
+ return (result.Results ?? []).map(row => row.ID);
64
+ }
65
+ /** A quoted, comma-separated list of IDs for an IN clause. */
66
+ function sqlInList(ids) {
67
+ return ids.map(id => `'${EscapeSQLString(id)}'`).join(',');
68
+ }
69
+ //# sourceMappingURL=conversation-tasks-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-tasks-filter.js","sourceRoot":"","sources":["../../../src/lib/services/conversation-tasks-filter.ts"],"names":[],"mappings":"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","sourcesContent":["import { RunView, type EntityInfo, type IMetadataProvider, type RunViewParams, type UserInfo } from '@memberjunction/core';\nimport { EscapeSQLString } from '@memberjunction/global';\n\n/** The ExtraFilter for the top-level tasks a user owns. */\nexport function OwnTasksFilter(user: UserInfo): string {\n return `ParentID IS NULL AND UserID = '${EscapeSQLString(user.ID)}'`;\n}\n\n/**\n * The ExtraFilter for the top-level tasks the conversations UI shows a user: the tasks the user\n * owns, and the tasks linked to a message the user wrote or that is in a conversation the user\n * owns.\n *\n * The conversation and message IDs are read with their own RunView, so the row-level security on\n * those entities applies. A subquery over their views would skip it, and the server refuses one\n * for a user whose read of them is row-filtered. When a read fails, the result is the user's own\n * tasks.\n */\nexport async function BuildConversationTasksFilter(provider: IMetadataProvider, user: UserInfo): Promise<string> {\n const ownTasks = OwnTasksFilter(user);\n const tasks = provider.EntityByName('MJ: Tasks');\n if (!tasks) {\n return ownTasks;\n }\n const rv = RunView.FromMetadataProvider(provider);\n const conversationIds = await readIds(rv, user, {\n EntityName: 'MJ: Conversations',\n ExtraFilter: `UserID = '${EscapeSQLString(user.ID)}'`,\n Fields: ['ID'],\n });\n if (conversationIds == null) {\n return ownTasks;\n }\n const messageIds = await readIds(rv, user, {\n EntityName: 'MJ: Conversation Details',\n ExtraFilter: taskMessagesFilter(user, conversationIds, tasks),\n Fields: ['ID'],\n });\n if (messageIds == null || messageIds.length === 0) {\n return ownTasks;\n }\n return `ParentID IS NULL AND (UserID = '${EscapeSQLString(user.ID)}' OR ConversationDetailID IN (${sqlInList(messageIds)}))`;\n}\n\n/**\n * The messages that have a top-level task and that the user wrote or that are in one of the\n * user's conversations. The task subquery reads Tasks, which has no row filter in a default\n * install. Its identifiers are bracketed so the PostgreSQL provider quotes them.\n */\nfunction taskMessagesFilter(user: UserInfo, conversationIds: readonly string[], tasks: EntityInfo): string {\n const inConversations = conversationIds.length > 0 ? ` OR ConversationID IN (${sqlInList(conversationIds)})` : '';\n const taskView = `[${tasks.SchemaName}].[${tasks.BaseView}]`;\n return (\n `(UserID = '${EscapeSQLString(user.ID)}'${inConversations}) AND ID IN ` +\n `(SELECT [ConversationDetailID] FROM ${taskView} WHERE [ParentID] IS NULL AND [ConversationDetailID] IS NOT NULL)`\n );\n}\n\n/**\n * The IDs of the rows `read` selects, with no row cap; null when the read fails. Each caller names\n * an MJ core entity in `read`, so its key column is `ID`.\n */\nasync function readIds(rv: RunView, user: UserInfo, read: Pick<RunViewParams, 'EntityName' | 'ExtraFilter' | 'Fields'>): Promise<string[] | null> {\n const result = await rv.RunView<{ ID: string }>({ ...read, ResultType: 'simple', IgnoreMaxRows: true }, user);\n if (!result.Success) {\n console.error(`Failed to read ${read.EntityName} for the tasks filter:`, result.ErrorMessage);\n return null;\n }\n return (result.Results ?? []).map(row => row.ID);\n}\n\n/** A quoted, comma-separated list of IDs for an IN clause. */\nfunction sqlInList(ids: readonly string[]): string {\n return ids.map(id => `'${EscapeSQLString(id)}'`).join(',');\n}\n"]}
@@ -1,9 +1,10 @@
1
1
  /**
2
2
  * Browser-side audio recorder for a CLIENT-DIRECT realtime voice session.
3
3
  *
4
- * Mixes the user's microphone stream with the agent's remote-audio stream (when the driver
5
- * exposes one — `OpenAIRealtimeClient.GetRemoteMediaStream()`) into a single mono **WAV** (16-bit
6
- * PCM) blob via the Web Audio API. Rather than a `MediaRecorder` (which only emits webm/opus —
4
+ * Mixes the user's microphone stream with the agent's remote-audio stream (every driver exposes
5
+ * one via `GetRemoteMediaStream()`: WebRTC drivers publish their remote track, PCM drivers —
6
+ * Gemini, ElevenLabs, AssemblyAI, xAI, HuggingFace — publish their playout engine's output) into a
7
+ * single mono **WAV** (16-bit PCM) blob via the Web Audio API. Rather than a `MediaRecorder` (which only emits webm/opus —
7
8
  * header-less, no duration/cues, so HTTP-range seeking is unreliable), the mix is routed into an
8
9
  * {@link AudioWorkletNode} (preferred) or a {@link ScriptProcessorNode} (fallback) that captures
9
10
  * Float32 PCM frames. PCM is accumulated in memory and encoded as a seekable RIFF/WAVE file at
@@ -15,7 +16,10 @@
15
16
  * - No `AudioContext` (server-side render / unsupported env) → the recorder disables itself
16
17
  * ({@link IsRecording} stays `false`, {@link Stop} resolves `null`); the voice call proceeds.
17
18
  * - No `AudioWorkletNode` AND no `ScriptProcessorNode` → disables itself rather than throwing.
18
- * - No remote stream (non-WebRTC drivers, or the track hasn't landed yet) → records mic only.
19
+ * - No remote stream yet (e.g. the WebRTC track hasn't landed) → records mic only until it does.
20
+ * - A remote stream that can't be connected (e.g. a browser that rejects cross-sample-rate
21
+ * `createMediaStreamSource` — the PCM playout context runs at 24 kHz, this one at the device
22
+ * rate) → warns and records mic only; the mic recording is never lost to the agent stream.
19
23
  * - Any construction/start error is logged and disables the recorder rather than throwing into
20
24
  * the session-start path.
21
25
  *
@@ -55,6 +59,12 @@ export declare class RealtimeAudioRecorder {
55
59
  private startedAtMs;
56
60
  /** Sample rate of the capturing {@link AudioContext}; 0 before {@link Start}. Needed to wrap shards. */
57
61
  private sampleRate;
62
+ /**
63
+ * Bumped by {@link cleanup}. The async setup snapshots it and, after each await, gives up if it moved:
64
+ * a {@link Stop} that lands mid-setup can only release what setup has already published, so setup
65
+ * must release the rest itself rather than build a live graph on a stopped recorder.
66
+ */
67
+ private setupGeneration;
58
68
  /** True while a recorder is actively capturing. */
59
69
  get IsRecording(): boolean;
60
70
  /** Wall-clock ms when recording started (0 before {@link Start}). */
@@ -111,6 +121,13 @@ export declare class RealtimeAudioRecorder {
111
121
  Stop(): Promise<Blob | null>;
112
122
  /** Wires up the Web Audio mix graph + PCM capture node (worklet preferred) and starts capture. */
113
123
  private startMixedRecording;
124
+ /**
125
+ * Connects the agent stream, degrading to mic-only on failure. Unlike the mic (whose failure
126
+ * rightly disables the recorder), the agent stream is best-effort: a browser may reject it
127
+ * (cross-sample-rate `NotSupportedError`) and that must not discard the user's recording.
128
+ * Returns whether it was connected, so the caller only marks it attached on success.
129
+ */
130
+ private connectRemoteStream;
114
131
  /**
115
132
  * Creates the PCM capture node and inserts it into the graph: sources → captureNode → destination.
116
133
  * Prefers an {@link AudioWorkletNode} (off-main-thread, no deprecation); falls back to a