@memberjunction/ng-conversations 6.2.0-edge.0 → 6.2.0-edge.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -2
- package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts +19 -3
- package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts.map +1 -1
- package/dist/lib/components/active-tasks/active-tasks-panel.component.js +39 -7
- package/dist/lib/components/active-tasks/active-tasks-panel.component.js.map +1 -1
- package/dist/lib/components/agent/active-agent-indicator.component.d.ts +74 -6
- package/dist/lib/components/agent/active-agent-indicator.component.d.ts.map +1 -1
- package/dist/lib/components/agent/active-agent-indicator.component.js +111 -21
- package/dist/lib/components/agent/active-agent-indicator.component.js.map +1 -1
- package/dist/lib/components/agent/agent-process-panel.component.d.ts +31 -5
- package/dist/lib/components/agent/agent-process-panel.component.d.ts.map +1 -1
- package/dist/lib/components/agent/agent-process-panel.component.js +71 -15
- package/dist/lib/components/agent/agent-process-panel.component.js.map +1 -1
- package/dist/lib/components/artifact/artifact-share-modal.component.d.ts +65 -9
- package/dist/lib/components/artifact/artifact-share-modal.component.d.ts.map +1 -1
- package/dist/lib/components/artifact/artifact-share-modal.component.js +169 -57
- package/dist/lib/components/artifact/artifact-share-modal.component.js.map +1 -1
- package/dist/lib/components/attachment/image-viewer.component.d.ts +77 -11
- package/dist/lib/components/attachment/image-viewer.component.d.ts.map +1 -1
- package/dist/lib/components/attachment/image-viewer.component.js +181 -47
- package/dist/lib/components/attachment/image-viewer.component.js.map +1 -1
- package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts +129 -19
- package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts.map +1 -1
- package/dist/lib/components/collection/artifact-collection-picker-modal.component.js +350 -116
- package/dist/lib/components/collection/artifact-collection-picker-modal.component.js.map +1 -1
- package/dist/lib/components/collection/artifact-create-modal.component.d.ts +60 -8
- package/dist/lib/components/collection/artifact-create-modal.component.d.ts.map +1 -1
- package/dist/lib/components/collection/artifact-create-modal.component.js +130 -46
- package/dist/lib/components/collection/artifact-create-modal.component.js.map +1 -1
- package/dist/lib/components/collection/collection-artifact-card.component.d.ts +63 -3
- package/dist/lib/components/collection/collection-artifact-card.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-artifact-card.component.js +113 -19
- package/dist/lib/components/collection/collection-artifact-card.component.js.map +1 -1
- package/dist/lib/components/collection/collection-form-modal.component.d.ts +54 -8
- package/dist/lib/components/collection/collection-form-modal.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-form-modal.component.js +130 -46
- package/dist/lib/components/collection/collection-form-modal.component.js.map +1 -1
- package/dist/lib/components/collection/collection-share-modal.component.d.ts +70 -10
- package/dist/lib/components/collection/collection-share-modal.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-share-modal.component.js +175 -53
- package/dist/lib/components/collection/collection-share-modal.component.js.map +1 -1
- package/dist/lib/components/collection/collection-tree.component.d.ts +89 -9
- package/dist/lib/components/collection/collection-tree.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-tree.component.js +220 -70
- package/dist/lib/components/collection/collection-tree.component.js.map +1 -1
- package/dist/lib/components/collection/collection-view.component.d.ts +89 -11
- package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-view.component.js +154 -40
- package/dist/lib/components/collection/collection-view.component.js.map +1 -1
- package/dist/lib/components/collection/collections-full-view.component.d.ts +390 -38
- package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collections-full-view.component.js +951 -367
- package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
- package/dist/lib/components/composer/ai-composer.component.d.ts +213 -18
- package/dist/lib/components/composer/ai-composer.component.d.ts.map +1 -1
- package/dist/lib/components/composer/ai-composer.component.js +388 -44
- package/dist/lib/components/composer/ai-composer.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-agent-picker.component.d.ts +12 -1
- package/dist/lib/components/conversation/conversation-agent-picker.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-agent-picker.component.js +26 -4
- package/dist/lib/components/conversation/conversation-agent-picker.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +1090 -123
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.js +2399 -706
- package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-empty-state.component.d.ts +139 -19
- package/dist/lib/components/conversation/conversation-empty-state.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-empty-state.component.js +296 -59
- package/dist/lib/components/conversation/conversation-empty-state.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-list.component.d.ts +579 -78
- package/dist/lib/components/conversation/conversation-list.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-list.component.js +2322 -823
- package/dist/lib/components/conversation/conversation-list.component.js.map +1 -1
- package/dist/lib/components/conversation/pinned-messages-panel.component.d.ts +40 -4
- package/dist/lib/components/conversation/pinned-messages-panel.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/pinned-messages-panel.component.js +72 -14
- package/dist/lib/components/conversation/pinned-messages-panel.component.js.map +1 -1
- package/dist/lib/components/dialogs/input-dialog.component.d.ts +57 -11
- package/dist/lib/components/dialogs/input-dialog.component.d.ts.map +1 -1
- package/dist/lib/components/dialogs/input-dialog.component.js +128 -16
- package/dist/lib/components/dialogs/input-dialog.component.js.map +1 -1
- package/dist/lib/components/dialogs/rating-dialog.component.d.ts +68 -10
- package/dist/lib/components/dialogs/rating-dialog.component.d.ts.map +1 -1
- package/dist/lib/components/dialogs/rating-dialog.component.js +151 -27
- package/dist/lib/components/dialogs/rating-dialog.component.js.map +1 -1
- package/dist/lib/components/export/export-modal.component.d.ts +84 -10
- package/dist/lib/components/export/export-modal.component.d.ts.map +1 -1
- package/dist/lib/components/export/export-modal.component.js +173 -49
- package/dist/lib/components/export/export-modal.component.js.map +1 -1
- package/dist/lib/components/global-tasks/global-tasks-panel.component.d.ts +29 -3
- package/dist/lib/components/global-tasks/global-tasks-panel.component.d.ts.map +1 -1
- package/dist/lib/components/global-tasks/global-tasks-panel.component.js +58 -12
- package/dist/lib/components/global-tasks/global-tasks-panel.component.js.map +1 -1
- package/dist/lib/components/library/library-full-view.component.d.ts +57 -8
- package/dist/lib/components/library/library-full-view.component.d.ts.map +1 -1
- package/dist/lib/components/library/library-full-view.component.js +119 -35
- package/dist/lib/components/library/library-full-view.component.js.map +1 -1
- package/dist/lib/components/members/members-modal.component.d.ts +76 -10
- package/dist/lib/components/members/members-modal.component.d.ts.map +1 -1
- package/dist/lib/components/members/members-modal.component.js +164 -50
- package/dist/lib/components/members/members-modal.component.js.map +1 -1
- package/dist/lib/components/message/actionable-commands.component.d.ts +37 -5
- package/dist/lib/components/message/actionable-commands.component.d.ts.map +1 -1
- package/dist/lib/components/message/actionable-commands.component.js +82 -16
- package/dist/lib/components/message/actionable-commands.component.js.map +1 -1
- package/dist/lib/components/message/conversation-message-rating.component.d.ts +46 -10
- package/dist/lib/components/message/conversation-message-rating.component.d.ts.map +1 -1
- package/dist/lib/components/message/conversation-message-rating.component.js +120 -36
- package/dist/lib/components/message/conversation-message-rating.component.js.map +1 -1
- package/dist/lib/components/message/message-input.component.d.ts +549 -74
- package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-input.component.js +1250 -421
- package/dist/lib/components/message/message-input.component.js.map +1 -1
- package/dist/lib/components/message/message-item.component.d.ts +411 -29
- package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-item.component.js +896 -222
- package/dist/lib/components/message/message-item.component.js.map +1 -1
- package/dist/lib/components/message/message-list.component.d.ts +288 -29
- package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-list.component.js +561 -123
- package/dist/lib/components/message/message-list.component.js.map +1 -1
- package/dist/lib/components/navigation/conversation-navigation.component.d.ts +64 -5
- package/dist/lib/components/navigation/conversation-navigation.component.d.ts.map +1 -1
- package/dist/lib/components/navigation/conversation-navigation.component.js +101 -11
- package/dist/lib/components/navigation/conversation-navigation.component.js.map +1 -1
- package/dist/lib/components/notification/activity-indicator.component.d.ts +6 -2
- package/dist/lib/components/notification/activity-indicator.component.d.ts.map +1 -1
- package/dist/lib/components/notification/activity-indicator.component.js +13 -3
- package/dist/lib/components/notification/activity-indicator.component.js.map +1 -1
- package/dist/lib/components/notification/notification-badge.component.d.ts +15 -3
- package/dist/lib/components/notification/notification-badge.component.d.ts.map +1 -1
- package/dist/lib/components/notification/notification-badge.component.js +36 -8
- package/dist/lib/components/notification/notification-badge.component.js.map +1 -1
- package/dist/lib/components/overlay/chat-overlay.component.d.ts +1 -1
- package/dist/lib/components/overlay/chat-overlay.component.js +4 -4
- package/dist/lib/components/overlay/chat-overlay.component.js.map +1 -1
- package/dist/lib/components/project/project-form-modal.component.d.ts +93 -11
- package/dist/lib/components/project/project-form-modal.component.d.ts.map +1 -1
- package/dist/lib/components/project/project-form-modal.component.js +348 -87
- package/dist/lib/components/project/project-form-modal.component.js.map +1 -1
- package/dist/lib/components/project/project-selector.component.d.ts +78 -8
- package/dist/lib/components/project/project-selector.component.d.ts.map +1 -1
- package/dist/lib/components/project/project-selector.component.js +177 -46
- package/dist/lib/components/project/project-selector.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts +1 -1
- package/dist/lib/components/realtime/realtime-activity-rail.component.js +2 -2
- package/dist/lib/components/realtime/realtime-activity-rail.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts +1 -1
- package/dist/lib/components/realtime/realtime-delegation-card.component.js +2 -2
- package/dist/lib/components/realtime/realtime-delegation-card.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts +2 -2
- package/dist/lib/components/realtime/realtime-session-overlay.component.js +18 -18
- package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts +47 -23
- package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-session-timeline-card.component.js +136 -92
- package/dist/lib/components/realtime/realtime-session-timeline-card.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts +2 -2
- package/dist/lib/components/realtime/realtime-surface-tabs.component.js +4 -4
- package/dist/lib/components/realtime/realtime-surface-tabs.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts +1 -1
- package/dist/lib/components/realtime/realtime-surface-tabs.model.js +3 -3
- package/dist/lib/components/realtime/realtime-surface-tabs.model.js.map +1 -1
- package/dist/lib/components/realtime/realtime-ui-config.d.ts +13 -11
- package/dist/lib/components/realtime/realtime-ui-config.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-ui-config.js +29 -25
- package/dist/lib/components/realtime/realtime-ui-config.js.map +1 -1
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts +3 -1
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts.map +1 -1
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js +6 -2
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js.map +1 -1
- package/dist/lib/components/search/search-panel.component.d.ts +133 -22
- package/dist/lib/components/search/search-panel.component.d.ts.map +1 -1
- package/dist/lib/components/search/search-panel.component.js +312 -83
- package/dist/lib/components/search/search-panel.component.js.map +1 -1
- package/dist/lib/components/share/share-modal.component.d.ts +69 -9
- package/dist/lib/components/share/share-modal.component.d.ts.map +1 -1
- package/dist/lib/components/share/share-modal.component.js +139 -31
- package/dist/lib/components/share/share-modal.component.js.map +1 -1
- package/dist/lib/components/shared/user-picker.component.d.ts +48 -8
- package/dist/lib/components/shared/user-picker.component.d.ts.map +1 -1
- package/dist/lib/components/shared/user-picker.component.js +110 -30
- package/dist/lib/components/shared/user-picker.component.js.map +1 -1
- package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts +114 -11
- package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts.map +1 -1
- package/dist/lib/components/sidebar/conversation-sidebar.component.js +199 -21
- package/dist/lib/components/sidebar/conversation-sidebar.component.js.map +1 -1
- package/dist/lib/components/sidebar/routines-section.component.d.ts +20 -1
- package/dist/lib/components/sidebar/routines-section.component.d.ts.map +1 -1
- package/dist/lib/components/sidebar/routines-section.component.js +25 -5
- package/dist/lib/components/sidebar/routines-section.component.js.map +1 -1
- package/dist/lib/components/slots/slot-interfaces.d.ts +19 -0
- package/dist/lib/components/slots/slot-interfaces.d.ts.map +1 -1
- package/dist/lib/components/slots/slot-interfaces.js.map +1 -1
- package/dist/lib/components/task/tasks-full-view.component.d.ts +95 -13
- package/dist/lib/components/task/tasks-full-view.component.d.ts.map +1 -1
- package/dist/lib/components/task/tasks-full-view.component.js +223 -75
- package/dist/lib/components/task/tasks-full-view.component.js.map +1 -1
- package/dist/lib/components/tasks/task-widget.component.d.ts +46 -6
- package/dist/lib/components/tasks/task-widget.component.d.ts.map +1 -1
- package/dist/lib/components/tasks/task-widget.component.js +100 -16
- package/dist/lib/components/tasks/task-widget.component.js.map +1 -1
- package/dist/lib/components/tasks/tasks-dropdown.component.d.ts +64 -7
- package/dist/lib/components/tasks/tasks-dropdown.component.d.ts.map +1 -1
- package/dist/lib/components/tasks/tasks-dropdown.component.js +127 -27
- package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -1
- package/dist/lib/components/thread/thread-panel.component.d.ts +66 -8
- package/dist/lib/components/thread/thread-panel.component.d.ts.map +1 -1
- package/dist/lib/components/thread/thread-panel.component.js +146 -36
- package/dist/lib/components/thread/thread-panel.component.js.map +1 -1
- package/dist/lib/components/toast/toast.component.d.ts +11 -1
- package/dist/lib/components/toast/toast.component.d.ts.map +1 -1
- package/dist/lib/components/toast/toast.component.js +25 -5
- package/dist/lib/components/toast/toast.component.js.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts +385 -42
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.js +887 -291
- package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
- package/dist/lib/composer-plugins/base-conversation-mention.provider.d.ts +8 -0
- package/dist/lib/composer-plugins/base-conversation-mention.provider.d.ts.map +1 -1
- package/dist/lib/composer-plugins/base-conversation-mention.provider.js +8 -1
- package/dist/lib/composer-plugins/base-conversation-mention.provider.js.map +1 -1
- package/dist/lib/directives/chat-slot.directive.d.ts +5 -1
- package/dist/lib/directives/chat-slot.directive.d.ts.map +1 -1
- package/dist/lib/directives/chat-slot.directive.js.map +1 -1
- package/dist/lib/directives/search-shortcut.directive.d.ts +9 -1
- package/dist/lib/directives/search-shortcut.directive.d.ts.map +1 -1
- package/dist/lib/directives/search-shortcut.directive.js +14 -4
- package/dist/lib/directives/search-shortcut.directive.js.map +1 -1
- package/dist/lib/events/chat-events.d.ts +34 -7
- package/dist/lib/events/chat-events.d.ts.map +1 -1
- package/dist/lib/events/chat-events.js +37 -7
- package/dist/lib/events/chat-events.js.map +1 -1
- package/dist/lib/models/agent-turn.model.d.ts +103 -0
- package/dist/lib/models/agent-turn.model.d.ts.map +1 -0
- package/dist/lib/models/agent-turn.model.js +12 -0
- package/dist/lib/models/agent-turn.model.js.map +1 -0
- package/dist/lib/models/collection-view.model.js.map +1 -1
- package/dist/lib/models/conversation-state.model.d.ts +8 -0
- package/dist/lib/models/conversation-state.model.d.ts.map +1 -1
- package/dist/lib/models/conversation-state.model.js.map +1 -1
- package/dist/lib/models/lazy-artifact-info.d.ts +44 -12
- package/dist/lib/models/lazy-artifact-info.d.ts.map +1 -1
- package/dist/lib/models/lazy-artifact-info.js +98 -34
- package/dist/lib/models/lazy-artifact-info.js.map +1 -1
- package/dist/lib/services/active-tasks.service.d.ts +30 -4
- package/dist/lib/services/active-tasks.service.d.ts.map +1 -1
- package/dist/lib/services/active-tasks.service.js +71 -19
- package/dist/lib/services/active-tasks.service.js.map +1 -1
- package/dist/lib/services/agent-state.service.d.ts +17 -1
- package/dist/lib/services/agent-state.service.d.ts.map +1 -1
- package/dist/lib/services/agent-state.service.js +48 -16
- package/dist/lib/services/agent-state.service.js.map +1 -1
- package/dist/lib/services/artifact-permission.service.d.ts +39 -0
- package/dist/lib/services/artifact-permission.service.d.ts.map +1 -1
- package/dist/lib/services/artifact-permission.service.js +152 -17
- package/dist/lib/services/artifact-permission.service.js.map +1 -1
- package/dist/lib/services/artifact-state.service.d.ts +58 -5
- package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
- package/dist/lib/services/artifact-state.service.js +135 -35
- package/dist/lib/services/artifact-state.service.js.map +1 -1
- package/dist/lib/services/collection-permission.service.d.ts +28 -0
- package/dist/lib/services/collection-permission.service.d.ts.map +1 -1
- package/dist/lib/services/collection-permission.service.js +88 -32
- package/dist/lib/services/collection-permission.service.js.map +1 -1
- package/dist/lib/services/collection-state.service.d.ts +11 -1
- package/dist/lib/services/collection-state.service.d.ts.map +1 -1
- package/dist/lib/services/collection-state.service.js +25 -5
- package/dist/lib/services/collection-state.service.js.map +1 -1
- package/dist/lib/services/conversation-agent.service.d.ts +26 -4
- package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-agent.service.js +57 -18
- package/dist/lib/services/conversation-agent.service.js.map +1 -1
- package/dist/lib/services/conversation-attachment.service.d.ts +17 -0
- package/dist/lib/services/conversation-attachment.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-attachment.service.js +38 -10
- package/dist/lib/services/conversation-attachment.service.js.map +1 -1
- package/dist/lib/services/conversation-streaming.service.d.ts +22 -0
- package/dist/lib/services/conversation-streaming.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-streaming.service.js +50 -10
- package/dist/lib/services/conversation-streaming.service.js.map +1 -1
- package/dist/lib/services/data-cache.service.d.ts +31 -0
- package/dist/lib/services/data-cache.service.d.ts.map +1 -1
- package/dist/lib/services/data-cache.service.js +71 -15
- package/dist/lib/services/data-cache.service.js.map +1 -1
- package/dist/lib/services/dialog.service.d.ts +13 -0
- package/dist/lib/services/dialog.service.d.ts.map +1 -1
- package/dist/lib/services/dialog.service.js +25 -5
- package/dist/lib/services/dialog.service.js.map +1 -1
- package/dist/lib/services/export.service.d.ts +2 -0
- package/dist/lib/services/export.service.d.ts.map +1 -1
- package/dist/lib/services/export.service.js +5 -1
- package/dist/lib/services/export.service.js.map +1 -1
- package/dist/lib/services/mention-parser.service.d.ts +10 -0
- package/dist/lib/services/mention-parser.service.d.ts.map +1 -1
- package/dist/lib/services/mention-parser.service.js +25 -5
- package/dist/lib/services/mention-parser.service.js.map +1 -1
- package/dist/lib/services/notification.service.d.ts +54 -6
- package/dist/lib/services/notification.service.d.ts.map +1 -1
- package/dist/lib/services/notification.service.js +123 -27
- package/dist/lib/services/notification.service.js.map +1 -1
- package/dist/lib/services/realtime-audio-recorder.d.ts +4 -4
- package/dist/lib/services/realtime-audio-recorder.js +12 -12
- package/dist/lib/services/realtime-audio-recorder.js.map +1 -1
- package/dist/lib/services/realtime-pcm-wav.d.ts +4 -0
- package/dist/lib/services/realtime-pcm-wav.d.ts.map +1 -1
- package/dist/lib/services/realtime-pcm-wav.js +10 -2
- package/dist/lib/services/realtime-pcm-wav.js.map +1 -1
- package/dist/lib/services/search.service.d.ts +42 -9
- package/dist/lib/services/search.service.d.ts.map +1 -1
- package/dist/lib/services/search.service.js +103 -23
- package/dist/lib/services/search.service.js.map +1 -1
- package/dist/lib/services/toast.service.d.ts +19 -1
- package/dist/lib/services/toast.service.d.ts.map +1 -1
- package/dist/lib/services/toast.service.js +45 -9
- package/dist/lib/services/toast.service.js.map +1 -1
- package/dist/lib/services/ui-command-handler.service.d.ts +16 -2
- package/dist/lib/services/ui-command-handler.service.d.ts.map +1 -1
- package/dist/lib/services/ui-command-handler.service.js +36 -8
- package/dist/lib/services/ui-command-handler.service.js.map +1 -1
- package/dist/lib/utils/agent-artifact-summary.d.ts +2 -2
- package/dist/lib/utils/agent-artifact-summary.js +3 -3
- package/dist/lib/utils/agent-artifact-summary.js.map +1 -1
- package/dist/lib/utils/agent-turn-routing.d.ts +69 -0
- package/dist/lib/utils/agent-turn-routing.d.ts.map +1 -0
- package/dist/lib/utils/agent-turn-routing.js +96 -0
- package/dist/lib/utils/agent-turn-routing.js.map +1 -0
- package/dist/lib/utils/artifact-panel-action.d.ts +15 -4
- package/dist/lib/utils/artifact-panel-action.d.ts.map +1 -1
- package/dist/lib/utils/artifact-panel-action.js +10 -2
- package/dist/lib/utils/artifact-panel-action.js.map +1 -1
- package/dist/lib/utils/distinct-artifacts.d.ts +2 -0
- package/dist/lib/utils/distinct-artifacts.d.ts.map +1 -1
- package/dist/lib/utils/distinct-artifacts.js +5 -1
- package/dist/lib/utils/distinct-artifacts.js.map +1 -1
- package/dist/lib/utils/plan-mode-preference.d.ts +2 -2
- package/dist/lib/utils/plan-mode-preference.js +6 -6
- package/dist/lib/utils/plan-mode-preference.js.map +1 -1
- package/dist/public-api.d.ts +3 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +3 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +32 -32
|
@@ -170,19 +170,67 @@ function ConversationWorkspaceComponent_Conditional_4_Template(rf, ctx) { if (rf
|
|
|
170
170
|
* is the preferred approach for MJExplorer integration.
|
|
171
171
|
*/
|
|
172
172
|
export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
173
|
-
|
|
174
|
-
|
|
173
|
+
ArtifactState;
|
|
174
|
+
CollectionState;
|
|
175
175
|
artifactPermissionService;
|
|
176
176
|
notificationService;
|
|
177
177
|
streamingService;
|
|
178
178
|
uiCommandHandler;
|
|
179
179
|
cdr;
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
180
|
+
EnvironmentId;
|
|
181
|
+
/** @deprecated Use {@link EnvironmentId}. */
|
|
182
|
+
set environmentId(value) {
|
|
183
|
+
this.EnvironmentId = value;
|
|
184
|
+
}
|
|
185
|
+
/** @deprecated Use {@link EnvironmentId}. */
|
|
186
|
+
get environmentId() {
|
|
187
|
+
return this.EnvironmentId;
|
|
188
|
+
}
|
|
189
|
+
InitialConversationId;
|
|
190
|
+
/** @deprecated Use {@link InitialConversationId}. */
|
|
191
|
+
set initialConversationId(value) {
|
|
192
|
+
this.InitialConversationId = value;
|
|
193
|
+
}
|
|
194
|
+
/** @deprecated Use {@link InitialConversationId}. */
|
|
195
|
+
get initialConversationId() {
|
|
196
|
+
return this.InitialConversationId;
|
|
197
|
+
}
|
|
198
|
+
Layout = 'full';
|
|
199
|
+
/** @deprecated Use {@link Layout}. */
|
|
200
|
+
set layout(value) {
|
|
201
|
+
this.Layout = value;
|
|
202
|
+
}
|
|
203
|
+
/** @deprecated Use {@link Layout}. */
|
|
204
|
+
get layout() {
|
|
205
|
+
return this.Layout;
|
|
206
|
+
}
|
|
207
|
+
CurrentUser;
|
|
208
|
+
/** @deprecated Use {@link CurrentUser}. */
|
|
209
|
+
set currentUser(value) {
|
|
210
|
+
this.CurrentUser = value;
|
|
211
|
+
}
|
|
212
|
+
/** @deprecated Use {@link CurrentUser}. */
|
|
213
|
+
get currentUser() {
|
|
214
|
+
return this.CurrentUser;
|
|
215
|
+
}
|
|
216
|
+
ActiveContext;
|
|
217
|
+
/** @deprecated Use {@link ActiveContext}. */
|
|
218
|
+
set activeContext(value) {
|
|
219
|
+
this.ActiveContext = value;
|
|
220
|
+
}
|
|
221
|
+
/** @deprecated Use {@link ActiveContext}. */
|
|
222
|
+
get activeContext() {
|
|
223
|
+
return this.ActiveContext;
|
|
224
|
+
}
|
|
225
|
+
ContextItemId;
|
|
226
|
+
/** @deprecated Use {@link ContextItemId}. */
|
|
227
|
+
set contextItemId(value) {
|
|
228
|
+
this.ContextItemId = value;
|
|
229
|
+
}
|
|
230
|
+
/** @deprecated Use {@link ContextItemId}. */
|
|
231
|
+
get contextItemId() {
|
|
232
|
+
return this.ContextItemId;
|
|
233
|
+
}
|
|
186
234
|
/**
|
|
187
235
|
* Show the Routines section at the very bottom of the left sidebar. Default true;
|
|
188
236
|
* hosts that don't want routines (or embed a reduced chat surface) set false.
|
|
@@ -191,79 +239,327 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
191
239
|
*/
|
|
192
240
|
ShowRoutines = true;
|
|
193
241
|
// Navigation properties for external control (deep linking from URL)
|
|
194
|
-
set
|
|
195
|
-
if (value && value !== this.
|
|
196
|
-
this.
|
|
242
|
+
set ActiveTabInput(value) {
|
|
243
|
+
if (value && value !== this.ActiveTab) {
|
|
244
|
+
this.ActiveTab = value;
|
|
197
245
|
}
|
|
198
246
|
}
|
|
199
|
-
|
|
200
|
-
|
|
247
|
+
/** @deprecated Use {@link ActiveTabInput}. */
|
|
248
|
+
set activeTabInput(value) {
|
|
249
|
+
this.ActiveTabInput = value;
|
|
250
|
+
}
|
|
251
|
+
set ActiveConversationInput(value) {
|
|
252
|
+
if (value && value !== this.SelectedConversationId) {
|
|
201
253
|
console.log('🔗 Deep link to conversation:', value);
|
|
202
|
-
this.
|
|
203
|
-
this.
|
|
254
|
+
this.ActiveTab = 'conversations';
|
|
255
|
+
this.SetActiveConversation(value);
|
|
204
256
|
}
|
|
205
257
|
}
|
|
206
|
-
|
|
207
|
-
|
|
258
|
+
/** @deprecated Use {@link ActiveConversationInput}. */
|
|
259
|
+
set activeConversationInput(value) {
|
|
260
|
+
this.ActiveConversationInput = value;
|
|
261
|
+
}
|
|
262
|
+
set ActiveCollectionInput(value) {
|
|
263
|
+
if (value && value !== this.CollectionState.activeCollectionId) {
|
|
208
264
|
console.log('🔗 Deep link to collection:', value);
|
|
209
|
-
this.
|
|
210
|
-
this.
|
|
265
|
+
this.ActiveTab = 'collections';
|
|
266
|
+
this.CollectionState.setActiveCollection(value);
|
|
211
267
|
}
|
|
212
268
|
}
|
|
213
|
-
|
|
214
|
-
|
|
269
|
+
/** @deprecated Use {@link ActiveCollectionInput}. */
|
|
270
|
+
set activeCollectionInput(value) {
|
|
271
|
+
this.ActiveCollectionInput = value;
|
|
272
|
+
}
|
|
273
|
+
set ActiveVersionIdInput(value) {
|
|
274
|
+
if (value && value !== this.ActiveVersionId) {
|
|
215
275
|
console.log('🔗 Deep link to version:', value);
|
|
216
|
-
this.
|
|
276
|
+
this.ActiveTab = 'collections';
|
|
217
277
|
// Store the version ID immediately to prevent ngDoCheck from clearing it
|
|
218
|
-
this.
|
|
278
|
+
this.ActiveVersionId = value;
|
|
219
279
|
// Open artifact by version ID
|
|
220
|
-
this.
|
|
280
|
+
this.ArtifactState.openArtifactByVersionId(value);
|
|
221
281
|
}
|
|
222
282
|
}
|
|
223
|
-
|
|
283
|
+
/** @deprecated Use {@link ActiveVersionIdInput}. */
|
|
284
|
+
set activeVersionIdInput(value) {
|
|
285
|
+
this.ActiveVersionIdInput = value;
|
|
286
|
+
}
|
|
287
|
+
set ActiveTaskInput(value) {
|
|
224
288
|
if (value && value !== this._activeTaskId) {
|
|
225
289
|
this._activeTaskId = value;
|
|
226
290
|
}
|
|
227
291
|
}
|
|
292
|
+
/** @deprecated Use {@link ActiveTaskInput}. */
|
|
293
|
+
set activeTaskInput(value) {
|
|
294
|
+
this.ActiveTaskInput = value;
|
|
295
|
+
}
|
|
228
296
|
_activeTaskId;
|
|
229
|
-
get
|
|
297
|
+
get ActiveTaskId() {
|
|
230
298
|
return this._activeTaskId;
|
|
231
299
|
}
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
300
|
+
/** @deprecated Use {@link ActiveTaskId}. */
|
|
301
|
+
get activeTaskId() {
|
|
302
|
+
return this.ActiveTaskId;
|
|
303
|
+
}
|
|
304
|
+
ConversationChanged = new EventEmitter();
|
|
305
|
+
/**
|
|
306
|
+
* @deprecated Use {@link ConversationChanged}.
|
|
307
|
+
*
|
|
308
|
+
* The same emitter under the old binding name, so a template still binding
|
|
309
|
+
* (conversationChanged) keeps working. Must stay AFTER ConversationChanged: class fields
|
|
310
|
+
* initialise in order, and the other way round this captures undefined.
|
|
311
|
+
*/
|
|
312
|
+
conversationChanged = this.ConversationChanged;
|
|
313
|
+
ArtifactOpened = new EventEmitter();
|
|
314
|
+
/**
|
|
315
|
+
* @deprecated Use {@link ArtifactOpened}.
|
|
316
|
+
*
|
|
317
|
+
* The same emitter under the old binding name, so a template still binding
|
|
318
|
+
* (artifactOpened) keeps working. Must stay AFTER ArtifactOpened: class fields
|
|
319
|
+
* initialise in order, and the other way round this captures undefined.
|
|
320
|
+
*/
|
|
321
|
+
artifactOpened = this.ArtifactOpened;
|
|
322
|
+
NavigationChanged = new EventEmitter();
|
|
323
|
+
/**
|
|
324
|
+
* @deprecated Use {@link NavigationChanged}.
|
|
325
|
+
*
|
|
326
|
+
* The same emitter under the old binding name, so a template still binding
|
|
327
|
+
* (navigationChanged) keeps working. Must stay AFTER NavigationChanged: class fields
|
|
328
|
+
* initialise in order, and the other way round this captures undefined.
|
|
329
|
+
*/
|
|
330
|
+
navigationChanged = this.NavigationChanged;
|
|
331
|
+
NewConversationStarted = new EventEmitter();
|
|
332
|
+
/**
|
|
333
|
+
* @deprecated Use {@link NewConversationStarted}.
|
|
334
|
+
*
|
|
335
|
+
* The same emitter under the old binding name, so a template still binding
|
|
336
|
+
* (newConversationStarted) keeps working. Must stay AFTER NewConversationStarted: class fields
|
|
337
|
+
* initialise in order, and the other way round this captures undefined.
|
|
338
|
+
*/
|
|
339
|
+
newConversationStarted = this.NewConversationStarted;
|
|
340
|
+
ActionableCommandExecuted = new EventEmitter();
|
|
341
|
+
/**
|
|
342
|
+
* @deprecated Use {@link ActionableCommandExecuted}.
|
|
343
|
+
*
|
|
344
|
+
* The same emitter under the old binding name, so a template still binding
|
|
345
|
+
* (actionableCommandExecuted) keeps working. Must stay AFTER ActionableCommandExecuted: class fields
|
|
346
|
+
* initialise in order, and the other way round this captures undefined.
|
|
347
|
+
*/
|
|
348
|
+
actionableCommandExecuted = this.ActionableCommandExecuted;
|
|
349
|
+
AutomaticCommandExecuted = new EventEmitter();
|
|
350
|
+
/**
|
|
351
|
+
* @deprecated Use {@link AutomaticCommandExecuted}.
|
|
352
|
+
*
|
|
353
|
+
* The same emitter under the old binding name, so a template still binding
|
|
354
|
+
* (automaticCommandExecuted) keeps working. Must stay AFTER AutomaticCommandExecuted: class fields
|
|
355
|
+
* initialise in order, and the other way round this captures undefined.
|
|
356
|
+
*/
|
|
357
|
+
automaticCommandExecuted = this.AutomaticCommandExecuted;
|
|
358
|
+
NavigationRequested = new EventEmitter();
|
|
359
|
+
/**
|
|
360
|
+
* @deprecated Use {@link NavigationRequested}.
|
|
361
|
+
*
|
|
362
|
+
* The same emitter under the old binding name, so a template still binding
|
|
363
|
+
* (navigationRequested) keeps working. Must stay AFTER NavigationRequested: class fields
|
|
364
|
+
* initialise in order, and the other way round this captures undefined.
|
|
365
|
+
*/
|
|
366
|
+
navigationRequested = this.NavigationRequested;
|
|
367
|
+
ActiveTab = 'conversations';
|
|
368
|
+
/** @deprecated Use {@link ActiveTab}. */
|
|
369
|
+
get activeTab() {
|
|
370
|
+
return this.ActiveTab;
|
|
371
|
+
}
|
|
372
|
+
/** @deprecated Use {@link ActiveTab}. */
|
|
373
|
+
set activeTab(value) {
|
|
374
|
+
this.ActiveTab = value;
|
|
375
|
+
}
|
|
376
|
+
IsSidebarVisible = true;
|
|
377
|
+
/** @deprecated Use {@link IsSidebarVisible}. */
|
|
378
|
+
get isSidebarVisible() {
|
|
379
|
+
return this.IsSidebarVisible;
|
|
380
|
+
}
|
|
381
|
+
/** @deprecated Use {@link IsSidebarVisible}. */
|
|
382
|
+
set isSidebarVisible(value) {
|
|
383
|
+
this.IsSidebarVisible = value;
|
|
384
|
+
}
|
|
385
|
+
IsArtifactPanelOpen = false;
|
|
386
|
+
/** @deprecated Use {@link IsArtifactPanelOpen}. */
|
|
387
|
+
get isArtifactPanelOpen() {
|
|
388
|
+
return this.IsArtifactPanelOpen;
|
|
389
|
+
}
|
|
390
|
+
/** @deprecated Use {@link IsArtifactPanelOpen}. */
|
|
391
|
+
set isArtifactPanelOpen(value) {
|
|
392
|
+
this.IsArtifactPanelOpen = value;
|
|
393
|
+
}
|
|
394
|
+
IsSearchPanelOpen = false;
|
|
395
|
+
/** @deprecated Use {@link IsSearchPanelOpen}. */
|
|
396
|
+
get isSearchPanelOpen() {
|
|
397
|
+
return this.IsSearchPanelOpen;
|
|
398
|
+
}
|
|
399
|
+
/** @deprecated Use {@link IsSearchPanelOpen}. */
|
|
400
|
+
set isSearchPanelOpen(value) {
|
|
401
|
+
this.IsSearchPanelOpen = value;
|
|
402
|
+
}
|
|
403
|
+
IsWorkspaceReady = false;
|
|
404
|
+
/** @deprecated Use {@link IsWorkspaceReady}. */
|
|
405
|
+
get isWorkspaceReady() {
|
|
406
|
+
return this.IsWorkspaceReady;
|
|
407
|
+
}
|
|
408
|
+
/** @deprecated Use {@link IsWorkspaceReady}. */
|
|
409
|
+
set isWorkspaceReady(value) {
|
|
410
|
+
this.IsWorkspaceReady = value;
|
|
411
|
+
}
|
|
412
|
+
RenamedConversationId = null;
|
|
413
|
+
/** @deprecated Use {@link RenamedConversationId}. */
|
|
414
|
+
get renamedConversationId() {
|
|
415
|
+
return this.RenamedConversationId;
|
|
416
|
+
}
|
|
417
|
+
/** @deprecated Use {@link RenamedConversationId}. */
|
|
418
|
+
set renamedConversationId(value) {
|
|
419
|
+
this.RenamedConversationId = value;
|
|
420
|
+
}
|
|
421
|
+
ActiveArtifactId = null;
|
|
422
|
+
/** @deprecated Use {@link ActiveArtifactId}. */
|
|
423
|
+
get activeArtifactId() {
|
|
424
|
+
return this.ActiveArtifactId;
|
|
425
|
+
}
|
|
426
|
+
/** @deprecated Use {@link ActiveArtifactId}. */
|
|
427
|
+
set activeArtifactId(value) {
|
|
428
|
+
this.ActiveArtifactId = value;
|
|
429
|
+
}
|
|
430
|
+
ActiveVersionNumber = null;
|
|
431
|
+
/** @deprecated Use {@link ActiveVersionNumber}. */
|
|
432
|
+
get activeVersionNumber() {
|
|
433
|
+
return this.ActiveVersionNumber;
|
|
434
|
+
}
|
|
435
|
+
/** @deprecated Use {@link ActiveVersionNumber}. */
|
|
436
|
+
set activeVersionNumber(value) {
|
|
437
|
+
this.ActiveVersionNumber = value;
|
|
438
|
+
}
|
|
439
|
+
ActiveVersionId = null;
|
|
440
|
+
/** @deprecated Use {@link ActiveVersionId}. */
|
|
441
|
+
get activeVersionId() {
|
|
442
|
+
return this.ActiveVersionId;
|
|
443
|
+
}
|
|
444
|
+
/** @deprecated Use {@link ActiveVersionId}. */
|
|
445
|
+
set activeVersionId(value) {
|
|
446
|
+
this.ActiveVersionId = value;
|
|
447
|
+
}
|
|
448
|
+
IsMobileView = false;
|
|
449
|
+
/** @deprecated Use {@link IsMobileView}. */
|
|
450
|
+
get isMobileView() {
|
|
451
|
+
return this.IsMobileView;
|
|
452
|
+
}
|
|
453
|
+
/** @deprecated Use {@link IsMobileView}. */
|
|
454
|
+
set isMobileView(value) {
|
|
455
|
+
this.IsMobileView = value;
|
|
456
|
+
}
|
|
457
|
+
IsSidebarPinned = false;
|
|
458
|
+
/** @deprecated Use {@link IsSidebarPinned}. */
|
|
459
|
+
get isSidebarPinned() {
|
|
460
|
+
return this.IsSidebarPinned;
|
|
461
|
+
}
|
|
462
|
+
/** @deprecated Use {@link IsSidebarPinned}. */
|
|
463
|
+
set isSidebarPinned(value) {
|
|
464
|
+
this.IsSidebarPinned = value;
|
|
465
|
+
} // Default unpinned until settings load (prevents flicker)
|
|
250
466
|
// Artifact permissions
|
|
251
|
-
|
|
252
|
-
|
|
467
|
+
CanShareActiveArtifact = false;
|
|
468
|
+
/** @deprecated Use {@link CanShareActiveArtifact}. */
|
|
469
|
+
get canShareActiveArtifact() {
|
|
470
|
+
return this.CanShareActiveArtifact;
|
|
471
|
+
}
|
|
472
|
+
/** @deprecated Use {@link CanShareActiveArtifact}. */
|
|
473
|
+
set canShareActiveArtifact(value) {
|
|
474
|
+
this.CanShareActiveArtifact = value;
|
|
475
|
+
}
|
|
476
|
+
CanEditActiveArtifact = false;
|
|
477
|
+
/** @deprecated Use {@link CanEditActiveArtifact}. */
|
|
478
|
+
get canEditActiveArtifact() {
|
|
479
|
+
return this.CanEditActiveArtifact;
|
|
480
|
+
}
|
|
481
|
+
/** @deprecated Use {@link CanEditActiveArtifact}. */
|
|
482
|
+
set canEditActiveArtifact(value) {
|
|
483
|
+
this.CanEditActiveArtifact = value;
|
|
484
|
+
}
|
|
253
485
|
// Share modal state
|
|
254
|
-
|
|
255
|
-
|
|
486
|
+
IsArtifactShareModalOpen = false;
|
|
487
|
+
/** @deprecated Use {@link IsArtifactShareModalOpen}. */
|
|
488
|
+
get isArtifactShareModalOpen() {
|
|
489
|
+
return this.IsArtifactShareModalOpen;
|
|
490
|
+
}
|
|
491
|
+
/** @deprecated Use {@link IsArtifactShareModalOpen}. */
|
|
492
|
+
set isArtifactShareModalOpen(value) {
|
|
493
|
+
this.IsArtifactShareModalOpen = value;
|
|
494
|
+
}
|
|
495
|
+
ArtifactToShare = null;
|
|
496
|
+
/** @deprecated Use {@link ArtifactToShare}. */
|
|
497
|
+
get artifactToShare() {
|
|
498
|
+
return this.ArtifactToShare;
|
|
499
|
+
}
|
|
500
|
+
/** @deprecated Use {@link ArtifactToShare}. */
|
|
501
|
+
set artifactToShare(value) {
|
|
502
|
+
this.ArtifactToShare = value;
|
|
503
|
+
}
|
|
256
504
|
// Resize state - Sidebar
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
505
|
+
SidebarWidth = 260;
|
|
506
|
+
/** @deprecated Use {@link SidebarWidth}. */
|
|
507
|
+
get sidebarWidth() {
|
|
508
|
+
return this.SidebarWidth;
|
|
509
|
+
}
|
|
510
|
+
/** @deprecated Use {@link SidebarWidth}. */
|
|
511
|
+
set sidebarWidth(value) {
|
|
512
|
+
this.SidebarWidth = value;
|
|
513
|
+
} // Default width
|
|
514
|
+
IsSidebarCollapsed = true;
|
|
515
|
+
/** @deprecated Use {@link IsSidebarCollapsed}. */
|
|
516
|
+
get isSidebarCollapsed() {
|
|
517
|
+
return this.IsSidebarCollapsed;
|
|
518
|
+
}
|
|
519
|
+
/** @deprecated Use {@link IsSidebarCollapsed}. */
|
|
520
|
+
set isSidebarCollapsed(value) {
|
|
521
|
+
this.IsSidebarCollapsed = value;
|
|
522
|
+
} // Default collapsed until settings load (prevents flicker)
|
|
523
|
+
SidebarTransitionsEnabled = false;
|
|
524
|
+
/** @deprecated Use {@link SidebarTransitionsEnabled}. */
|
|
525
|
+
get sidebarTransitionsEnabled() {
|
|
526
|
+
return this.SidebarTransitionsEnabled;
|
|
527
|
+
}
|
|
528
|
+
/** @deprecated Use {@link SidebarTransitionsEnabled}. */
|
|
529
|
+
set sidebarTransitionsEnabled(value) {
|
|
530
|
+
this.SidebarTransitionsEnabled = value;
|
|
531
|
+
} // Disabled during initial load to prevent jarring animation
|
|
532
|
+
IsSidebarSettingsLoaded = false;
|
|
533
|
+
/** @deprecated Use {@link IsSidebarSettingsLoaded}. */
|
|
534
|
+
get isSidebarSettingsLoaded() {
|
|
535
|
+
return this.IsSidebarSettingsLoaded;
|
|
536
|
+
}
|
|
537
|
+
/** @deprecated Use {@link IsSidebarSettingsLoaded}. */
|
|
538
|
+
set isSidebarSettingsLoaded(value) {
|
|
539
|
+
this.IsSidebarSettingsLoaded = value;
|
|
540
|
+
} // Tracks whether settings have been loaded (prevents render before state is known)
|
|
261
541
|
isSidebarResizing = false;
|
|
262
542
|
sidebarResizeStartX = 0;
|
|
263
543
|
sidebarResizeStartWidth = 0;
|
|
264
544
|
// Resize state - Artifact Panel
|
|
265
|
-
|
|
266
|
-
|
|
545
|
+
ArtifactPanelWidth = 40;
|
|
546
|
+
/** @deprecated Use {@link ArtifactPanelWidth}. */
|
|
547
|
+
get artifactPanelWidth() {
|
|
548
|
+
return this.ArtifactPanelWidth;
|
|
549
|
+
}
|
|
550
|
+
/** @deprecated Use {@link ArtifactPanelWidth}. */
|
|
551
|
+
set artifactPanelWidth(value) {
|
|
552
|
+
this.ArtifactPanelWidth = value;
|
|
553
|
+
} // Default 40% width
|
|
554
|
+
IsArtifactPanelMaximized = false;
|
|
555
|
+
/** @deprecated Use {@link IsArtifactPanelMaximized}. */
|
|
556
|
+
get isArtifactPanelMaximized() {
|
|
557
|
+
return this.IsArtifactPanelMaximized;
|
|
558
|
+
}
|
|
559
|
+
/** @deprecated Use {@link IsArtifactPanelMaximized}. */
|
|
560
|
+
set isArtifactPanelMaximized(value) {
|
|
561
|
+
this.IsArtifactPanelMaximized = value;
|
|
562
|
+
}
|
|
267
563
|
artifactPanelWidthBeforeMaximize = 40; // Store width before maximizing
|
|
268
564
|
isArtifactPanelResizing = false;
|
|
269
565
|
artifactPanelResizeStartX = 0;
|
|
@@ -283,35 +579,139 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
283
579
|
saveSettingsTimeout = null;
|
|
284
580
|
isLoadingSettings = false;
|
|
285
581
|
// Task filter for conversation-specific filtering
|
|
286
|
-
|
|
582
|
+
TasksFilter = '1=1';
|
|
583
|
+
/** @deprecated Use {@link TasksFilter}. */
|
|
584
|
+
get tasksFilter() {
|
|
585
|
+
return this.TasksFilter;
|
|
586
|
+
}
|
|
587
|
+
/** @deprecated Use {@link TasksFilter}. */
|
|
588
|
+
set tasksFilter(value) {
|
|
589
|
+
this.TasksFilter = value;
|
|
590
|
+
}
|
|
287
591
|
// LOCAL CONVERSATION STATE - enables multiple workspace instances
|
|
288
592
|
// Each workspace manages its own selection state independently
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
593
|
+
SelectedConversationId = null;
|
|
594
|
+
/** @deprecated Use {@link SelectedConversationId}. */
|
|
595
|
+
get selectedConversationId() {
|
|
596
|
+
return this.SelectedConversationId;
|
|
597
|
+
}
|
|
598
|
+
/** @deprecated Use {@link SelectedConversationId}. */
|
|
599
|
+
set selectedConversationId(value) {
|
|
600
|
+
this.SelectedConversationId = value;
|
|
601
|
+
}
|
|
602
|
+
SelectedConversation = null;
|
|
603
|
+
/** @deprecated Use {@link SelectedConversation}. */
|
|
604
|
+
get selectedConversation() {
|
|
605
|
+
return this.SelectedConversation;
|
|
606
|
+
}
|
|
607
|
+
/** @deprecated Use {@link SelectedConversation}. */
|
|
608
|
+
set selectedConversation(value) {
|
|
609
|
+
this.SelectedConversation = value;
|
|
610
|
+
}
|
|
611
|
+
SelectedThreadId = null;
|
|
612
|
+
/** @deprecated Use {@link SelectedThreadId}. */
|
|
613
|
+
get selectedThreadId() {
|
|
614
|
+
return this.SelectedThreadId;
|
|
615
|
+
}
|
|
616
|
+
/** @deprecated Use {@link SelectedThreadId}. */
|
|
617
|
+
set selectedThreadId(value) {
|
|
618
|
+
this.SelectedThreadId = value;
|
|
619
|
+
}
|
|
620
|
+
IsNewUnsavedConversation = false;
|
|
621
|
+
/** @deprecated Use {@link IsNewUnsavedConversation}. */
|
|
622
|
+
get isNewUnsavedConversation() {
|
|
623
|
+
return this.IsNewUnsavedConversation;
|
|
624
|
+
}
|
|
625
|
+
/** @deprecated Use {@link IsNewUnsavedConversation}. */
|
|
626
|
+
set isNewUnsavedConversation(value) {
|
|
627
|
+
this.IsNewUnsavedConversation = value;
|
|
628
|
+
}
|
|
629
|
+
PendingMessageToSend = null;
|
|
630
|
+
/** @deprecated Use {@link PendingMessageToSend}. */
|
|
631
|
+
get pendingMessageToSend() {
|
|
632
|
+
return this.PendingMessageToSend;
|
|
633
|
+
}
|
|
634
|
+
/** @deprecated Use {@link PendingMessageToSend}. */
|
|
635
|
+
set pendingMessageToSend(value) {
|
|
636
|
+
this.PendingMessageToSend = value;
|
|
637
|
+
}
|
|
638
|
+
PendingAttachmentsToSend = null;
|
|
639
|
+
/** @deprecated Use {@link PendingAttachmentsToSend}. */
|
|
640
|
+
get pendingAttachmentsToSend() {
|
|
641
|
+
return this.PendingAttachmentsToSend;
|
|
642
|
+
}
|
|
643
|
+
/** @deprecated Use {@link PendingAttachmentsToSend}. */
|
|
644
|
+
set pendingAttachmentsToSend(value) {
|
|
645
|
+
this.PendingAttachmentsToSend = value;
|
|
646
|
+
}
|
|
295
647
|
/** The conversation pendingMessageToSend is destined for — bound to the chat-area so the
|
|
296
648
|
* auto-send reaches only that conversation's input, even if the user swaps conversations
|
|
297
649
|
* during the async send window (prevents the message bleeding into the swapped-to conversation). */
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
650
|
+
PendingMessageConversationId = null;
|
|
651
|
+
/** @deprecated Use {@link PendingMessageConversationId}. */
|
|
652
|
+
get pendingMessageConversationId() {
|
|
653
|
+
return this.PendingMessageConversationId;
|
|
654
|
+
}
|
|
655
|
+
/** @deprecated Use {@link PendingMessageConversationId}. */
|
|
656
|
+
set pendingMessageConversationId(value) {
|
|
657
|
+
this.PendingMessageConversationId = value;
|
|
658
|
+
}
|
|
659
|
+
PendingArtifactId = null;
|
|
660
|
+
/** @deprecated Use {@link PendingArtifactId}. */
|
|
661
|
+
get pendingArtifactId() {
|
|
662
|
+
return this.PendingArtifactId;
|
|
663
|
+
}
|
|
664
|
+
/** @deprecated Use {@link PendingArtifactId}. */
|
|
665
|
+
set pendingArtifactId(value) {
|
|
666
|
+
this.PendingArtifactId = value;
|
|
667
|
+
}
|
|
668
|
+
PendingArtifactConversationId = null;
|
|
669
|
+
/** @deprecated Use {@link PendingArtifactConversationId}. */
|
|
670
|
+
get pendingArtifactConversationId() {
|
|
671
|
+
return this.PendingArtifactConversationId;
|
|
672
|
+
}
|
|
673
|
+
/** @deprecated Use {@link PendingArtifactConversationId}. */
|
|
674
|
+
set pendingArtifactConversationId(value) {
|
|
675
|
+
this.PendingArtifactConversationId = value;
|
|
676
|
+
}
|
|
677
|
+
PendingArtifactVersionNumber = null;
|
|
678
|
+
/** @deprecated Use {@link PendingArtifactVersionNumber}. */
|
|
679
|
+
get pendingArtifactVersionNumber() {
|
|
680
|
+
return this.PendingArtifactVersionNumber;
|
|
681
|
+
}
|
|
682
|
+
/** @deprecated Use {@link PendingArtifactVersionNumber}. */
|
|
683
|
+
set pendingArtifactVersionNumber(value) {
|
|
684
|
+
this.PendingArtifactVersionNumber = value;
|
|
685
|
+
}
|
|
302
686
|
engine = ConversationEngine.Instance;
|
|
303
687
|
// Shared AI mention/suggestion engine (BaseSingleton — same instance the composer plugins use)
|
|
304
688
|
mentionAutocompleteService = MentionAutocompleteService.Instance;
|
|
305
|
-
constructor(
|
|
689
|
+
constructor(ArtifactState, CollectionState, artifactPermissionService, notificationService, streamingService, uiCommandHandler, cdr) {
|
|
306
690
|
super();
|
|
307
|
-
this.
|
|
308
|
-
this.
|
|
691
|
+
this.ArtifactState = ArtifactState;
|
|
692
|
+
this.CollectionState = CollectionState;
|
|
309
693
|
this.artifactPermissionService = artifactPermissionService;
|
|
310
694
|
this.notificationService = notificationService;
|
|
311
695
|
this.streamingService = streamingService;
|
|
312
696
|
this.uiCommandHandler = uiCommandHandler;
|
|
313
697
|
this.cdr = cdr;
|
|
314
698
|
}
|
|
699
|
+
/** @deprecated Use {@link ArtifactState}. */
|
|
700
|
+
get artifactState() {
|
|
701
|
+
return this.ArtifactState;
|
|
702
|
+
}
|
|
703
|
+
/** @deprecated Use {@link ArtifactState}. */
|
|
704
|
+
set artifactState(value) {
|
|
705
|
+
this.ArtifactState = value;
|
|
706
|
+
}
|
|
707
|
+
/** @deprecated Use {@link CollectionState}. */
|
|
708
|
+
get collectionState() {
|
|
709
|
+
return this.CollectionState;
|
|
710
|
+
}
|
|
711
|
+
/** @deprecated Use {@link CollectionState}. */
|
|
712
|
+
set collectionState(value) {
|
|
713
|
+
this.CollectionState = value;
|
|
714
|
+
}
|
|
315
715
|
// =========================================================================
|
|
316
716
|
// LOCAL CONVERSATION STATE MANAGEMENT
|
|
317
717
|
// These methods manage the workspace's local selection state
|
|
@@ -320,62 +720,86 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
320
720
|
* Sets the active conversation for this workspace instance
|
|
321
721
|
* @param id The conversation ID to activate (or null to clear)
|
|
322
722
|
*/
|
|
323
|
-
|
|
723
|
+
SetActiveConversation(id) {
|
|
324
724
|
console.log('🎯 Setting active conversation:', id);
|
|
325
|
-
this.
|
|
326
|
-
this.
|
|
725
|
+
this.SelectedConversationId = id;
|
|
726
|
+
this.SelectedConversation = id ? (this.engine.GetConversation(id) ?? null) : null;
|
|
327
727
|
// Clear unsaved state when switching to an existing conversation
|
|
328
728
|
if (id) {
|
|
329
|
-
this.
|
|
729
|
+
this.IsNewUnsavedConversation = false;
|
|
330
730
|
}
|
|
331
731
|
}
|
|
732
|
+
/** @deprecated Use {@link SetActiveConversation}. */
|
|
733
|
+
setActiveConversation(id) {
|
|
734
|
+
return this.SetActiveConversation(id);
|
|
735
|
+
}
|
|
332
736
|
/**
|
|
333
737
|
* Initiates a new unsaved conversation (doesn't create DB record yet)
|
|
334
738
|
* This shows the welcome screen and delays DB creation until first message
|
|
335
739
|
*/
|
|
336
|
-
|
|
740
|
+
StartNewConversation() {
|
|
337
741
|
console.log('✨ Starting new unsaved conversation');
|
|
338
|
-
this.
|
|
339
|
-
this.
|
|
340
|
-
this.
|
|
341
|
-
this.
|
|
342
|
-
this.
|
|
343
|
-
this.
|
|
742
|
+
this.SelectedConversationId = null;
|
|
743
|
+
this.SelectedConversation = null;
|
|
744
|
+
this.IsNewUnsavedConversation = true;
|
|
745
|
+
this.PendingMessageToSend = null;
|
|
746
|
+
this.PendingAttachmentsToSend = null;
|
|
747
|
+
this.PendingMessageConversationId = null;
|
|
344
748
|
// Auto-collapse if mobile OR if sidebar is not pinned
|
|
345
|
-
if (this.
|
|
346
|
-
this.
|
|
749
|
+
if (this.IsMobileView || !this.IsSidebarPinned) {
|
|
750
|
+
this.CollapseSidebar();
|
|
347
751
|
}
|
|
348
752
|
}
|
|
753
|
+
/** @deprecated Use {@link StartNewConversation}. */
|
|
754
|
+
startNewConversation() {
|
|
755
|
+
return this.StartNewConversation();
|
|
756
|
+
}
|
|
349
757
|
/**
|
|
350
758
|
* Clears the new unsaved conversation state
|
|
351
759
|
* Called when the conversation is actually created or cancelled
|
|
352
760
|
*/
|
|
761
|
+
ClearNewConversationState() {
|
|
762
|
+
this.IsNewUnsavedConversation = false;
|
|
763
|
+
}
|
|
764
|
+
/** @deprecated Use {@link ClearNewConversationState}. */
|
|
353
765
|
clearNewConversationState() {
|
|
354
|
-
this.
|
|
766
|
+
return this.ClearNewConversationState();
|
|
355
767
|
}
|
|
356
768
|
/**
|
|
357
769
|
* Opens a thread panel for a specific message
|
|
358
770
|
* @param messageId The parent message ID
|
|
359
771
|
*/
|
|
772
|
+
OpenThread(messageId) {
|
|
773
|
+
this.SelectedThreadId = messageId;
|
|
774
|
+
}
|
|
775
|
+
/** @deprecated Use {@link OpenThread}. */
|
|
360
776
|
openThread(messageId) {
|
|
361
|
-
this.
|
|
777
|
+
return this.OpenThread(messageId);
|
|
362
778
|
}
|
|
363
779
|
/**
|
|
364
780
|
* Closes the currently open thread panel
|
|
365
781
|
*/
|
|
782
|
+
CloseThread() {
|
|
783
|
+
this.SelectedThreadId = null;
|
|
784
|
+
}
|
|
785
|
+
/** @deprecated Use {@link CloseThread}. */
|
|
366
786
|
closeThread() {
|
|
367
|
-
this.
|
|
787
|
+
return this.CloseThread();
|
|
368
788
|
}
|
|
369
789
|
/**
|
|
370
790
|
* Handler for conversation selection from sidebar/list
|
|
371
791
|
*/
|
|
372
|
-
|
|
373
|
-
this.
|
|
792
|
+
OnConversationSelected(conversationId) {
|
|
793
|
+
this.SetActiveConversation(conversationId);
|
|
374
794
|
// Auto-collapse if mobile OR if sidebar is not pinned
|
|
375
|
-
if (this.
|
|
376
|
-
this.
|
|
795
|
+
if (this.IsMobileView || !this.IsSidebarPinned) {
|
|
796
|
+
this.CollapseSidebar();
|
|
377
797
|
}
|
|
378
798
|
}
|
|
799
|
+
/** @deprecated Use {@link OnConversationSelected}. */
|
|
800
|
+
onConversationSelected(conversationId) {
|
|
801
|
+
return this.OnConversationSelected(conversationId);
|
|
802
|
+
}
|
|
379
803
|
/**
|
|
380
804
|
* Handler for new conversation creation from chat area
|
|
381
805
|
* Now includes pending message and attachments to ensure atomic state update
|
|
@@ -387,15 +811,15 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
387
811
|
* spec: the user may have the sidebar hidden; don't yank their context if so —
|
|
388
812
|
* the refreshed cache makes it appear whenever the list is reopened).
|
|
389
813
|
*/
|
|
390
|
-
async
|
|
814
|
+
async OnRealtimeConversationReady(event) {
|
|
391
815
|
try {
|
|
392
|
-
await ConversationEngine.Instance.LoadConversations(this.
|
|
393
|
-
if (event.select && this.
|
|
816
|
+
await ConversationEngine.Instance.LoadConversations(this.EnvironmentId, this.CurrentUser, true);
|
|
817
|
+
if (event.select && this.IsSidebarVisible) {
|
|
394
818
|
const conversation = ConversationEngine.Instance.Conversations.find(c => UUIDsEqual(c.ID, event.conversationId));
|
|
395
819
|
if (conversation) {
|
|
396
|
-
this.
|
|
397
|
-
this.
|
|
398
|
-
this.
|
|
820
|
+
this.SelectedConversationId = conversation.ID;
|
|
821
|
+
this.SelectedConversation = conversation;
|
|
822
|
+
this.IsNewUnsavedConversation = false;
|
|
399
823
|
}
|
|
400
824
|
}
|
|
401
825
|
}
|
|
@@ -403,50 +827,66 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
403
827
|
console.error('onRealtimeConversationReady ERROR:', error);
|
|
404
828
|
}
|
|
405
829
|
}
|
|
406
|
-
|
|
830
|
+
/** @deprecated Use {@link OnRealtimeConversationReady}. */
|
|
831
|
+
async onRealtimeConversationReady(event) {
|
|
832
|
+
return this.OnRealtimeConversationReady(event);
|
|
833
|
+
}
|
|
834
|
+
OnConversationCreated(event) {
|
|
407
835
|
try {
|
|
408
836
|
// Set ALL state atomically before Angular change detection runs
|
|
409
837
|
// This ensures the new message-input component receives the pending data
|
|
410
|
-
this.
|
|
411
|
-
this.
|
|
838
|
+
this.PendingMessageToSend = event.pendingMessage || null;
|
|
839
|
+
this.PendingAttachmentsToSend = event.pendingAttachments || null;
|
|
412
840
|
// Pin the pending message to THIS conversation so a fast conversation-swap can't
|
|
413
841
|
// redirect its auto-send into a different conversation.
|
|
414
|
-
this.
|
|
415
|
-
this.
|
|
416
|
-
this.
|
|
417
|
-
this.
|
|
842
|
+
this.PendingMessageConversationId = event.conversation.ID;
|
|
843
|
+
this.SelectedConversationId = event.conversation.ID;
|
|
844
|
+
this.SelectedConversation = event.conversation;
|
|
845
|
+
this.IsNewUnsavedConversation = false;
|
|
418
846
|
// The conversation is already added to ConversationEngine by the chat area
|
|
419
847
|
}
|
|
420
848
|
catch (error) {
|
|
421
849
|
console.error('onConversationCreated ERROR:', error);
|
|
422
850
|
}
|
|
423
851
|
}
|
|
852
|
+
/** @deprecated Use {@link OnConversationCreated}. */
|
|
853
|
+
onConversationCreated(event) {
|
|
854
|
+
return this.OnConversationCreated(event);
|
|
855
|
+
}
|
|
424
856
|
/**
|
|
425
857
|
* Handler for pending message requested from chat area (empty state)
|
|
426
858
|
* @deprecated Use onConversationCreated with pendingMessage instead
|
|
427
859
|
*/
|
|
428
860
|
onPendingMessageRequested(event) {
|
|
429
|
-
this.
|
|
430
|
-
this.
|
|
431
|
-
this.
|
|
861
|
+
this.PendingMessageToSend = event.text;
|
|
862
|
+
this.PendingAttachmentsToSend = event.attachments;
|
|
863
|
+
this.PendingMessageConversationId = this.SelectedConversationId;
|
|
432
864
|
}
|
|
433
865
|
/**
|
|
434
866
|
* Handler for thread opened from chat area
|
|
435
867
|
*/
|
|
868
|
+
OnThreadOpened(threadId) {
|
|
869
|
+
this.SelectedThreadId = threadId;
|
|
870
|
+
}
|
|
871
|
+
/** @deprecated Use {@link OnThreadOpened}. */
|
|
436
872
|
onThreadOpened(threadId) {
|
|
437
|
-
this.
|
|
873
|
+
return this.OnThreadOpened(threadId);
|
|
438
874
|
}
|
|
439
875
|
/**
|
|
440
876
|
* Handler for thread closed from chat area
|
|
441
877
|
*/
|
|
878
|
+
OnThreadClosed() {
|
|
879
|
+
this.SelectedThreadId = null;
|
|
880
|
+
}
|
|
881
|
+
/** @deprecated Use {@link OnThreadClosed}. */
|
|
442
882
|
onThreadClosed() {
|
|
443
|
-
this.
|
|
883
|
+
return this.OnThreadClosed();
|
|
444
884
|
}
|
|
445
885
|
async ngOnInit() {
|
|
446
886
|
// Bind provider-aware services to this component's provider so multi-server
|
|
447
887
|
// browser apps don't silently fall back to the global Metadata.Provider.
|
|
448
888
|
// ArtifactStateService cascades to ArtifactPermissionService and CollectionPermissionService.
|
|
449
|
-
this.
|
|
889
|
+
this.ArtifactState.Provider = this.ProviderToUse;
|
|
450
890
|
this.artifactPermissionService.Provider = this.ProviderToUse;
|
|
451
891
|
// Initialize global streaming service FIRST
|
|
452
892
|
// This establishes the single PubSub connection for all conversations
|
|
@@ -457,23 +897,23 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
457
897
|
this.uiCommandHandler.actionableCommandRequested
|
|
458
898
|
.pipe(takeUntil(this.destroy$))
|
|
459
899
|
.subscribe(request => {
|
|
460
|
-
this.
|
|
900
|
+
this.OnActionableCommand(request.command);
|
|
461
901
|
});
|
|
462
902
|
this.uiCommandHandler.automaticCommandRequested
|
|
463
903
|
.pipe(takeUntil(this.destroy$))
|
|
464
904
|
.subscribe(command => {
|
|
465
|
-
this.
|
|
905
|
+
this.OnAutomaticCommand(command);
|
|
466
906
|
});
|
|
467
907
|
// Check initial mobile state FIRST
|
|
468
908
|
this.checkMobileView();
|
|
469
909
|
// Load sidebar state - but on mobile, always default to collapsed
|
|
470
|
-
if (this.
|
|
471
|
-
this.
|
|
472
|
-
this.
|
|
473
|
-
this.
|
|
910
|
+
if (this.IsMobileView) {
|
|
911
|
+
this.IsSidebarCollapsed = true;
|
|
912
|
+
this.IsSidebarVisible = false;
|
|
913
|
+
this.IsSidebarSettingsLoaded = true; // Mobile doesn't need to load settings
|
|
474
914
|
// Enable transitions after a brief delay to ensure initial state is applied
|
|
475
915
|
setTimeout(() => {
|
|
476
|
-
this.
|
|
916
|
+
this.SidebarTransitionsEnabled = true;
|
|
477
917
|
}, 50);
|
|
478
918
|
}
|
|
479
919
|
else {
|
|
@@ -482,7 +922,7 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
482
922
|
this.cdr.detectChanges();
|
|
483
923
|
// Enable transitions after state is loaded and applied
|
|
484
924
|
setTimeout(() => {
|
|
485
|
-
this.
|
|
925
|
+
this.SidebarTransitionsEnabled = true;
|
|
486
926
|
}, 50);
|
|
487
927
|
}
|
|
488
928
|
// Setup resize listeners
|
|
@@ -505,51 +945,51 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
505
945
|
console.log('✅ Artifact Metadata Engine initialized with', ArtifactMetadataEngine.Instance.ArtifactTypes?.length || 0, 'artifact types');
|
|
506
946
|
// Initialize mention autocomplete service immediately after AI engine
|
|
507
947
|
// This ensures the cache is built from the fully-loaded agent list
|
|
508
|
-
await this.mentionAutocompleteService.initialize(this.
|
|
948
|
+
await this.mentionAutocompleteService.initialize(this.CurrentUser);
|
|
509
949
|
console.log('✅ Mention autocomplete initialized');
|
|
510
950
|
// Mark workspace as ready - this allows UI to render
|
|
511
|
-
this.
|
|
951
|
+
this.IsWorkspaceReady = true;
|
|
512
952
|
this.cdr.detectChanges();
|
|
513
953
|
}
|
|
514
954
|
catch (error) {
|
|
515
955
|
console.error('❌ Failed to initialize engines:', error);
|
|
516
956
|
// Still mark as ready so UI isn't blocked forever
|
|
517
|
-
this.
|
|
957
|
+
this.IsWorkspaceReady = true;
|
|
518
958
|
this.cdr.detectChanges();
|
|
519
959
|
}
|
|
520
960
|
// Subscribe to artifact panel state
|
|
521
|
-
this.
|
|
961
|
+
this.ArtifactState.isPanelOpen$
|
|
522
962
|
.pipe(takeUntil(this.destroy$))
|
|
523
963
|
.subscribe(isOpen => {
|
|
524
|
-
this.
|
|
964
|
+
this.IsArtifactPanelOpen = isOpen;
|
|
525
965
|
});
|
|
526
966
|
// Subscribe to active artifact ID
|
|
527
|
-
this.
|
|
967
|
+
this.ArtifactState.activeArtifactId$
|
|
528
968
|
.pipe(takeUntil(this.destroy$))
|
|
529
969
|
.subscribe(async (id) => {
|
|
530
|
-
this.
|
|
970
|
+
this.ActiveArtifactId = id;
|
|
531
971
|
// Load permissions when artifact changes
|
|
532
972
|
if (id) {
|
|
533
973
|
await this.loadArtifactPermissions(id);
|
|
534
974
|
}
|
|
535
975
|
else {
|
|
536
|
-
this.
|
|
537
|
-
this.
|
|
976
|
+
this.CanShareActiveArtifact = false;
|
|
977
|
+
this.CanEditActiveArtifact = false;
|
|
538
978
|
}
|
|
539
979
|
});
|
|
540
980
|
// Subscribe to active version number
|
|
541
|
-
this.
|
|
981
|
+
this.ArtifactState.activeVersionNumber$
|
|
542
982
|
.pipe(takeUntil(this.destroy$))
|
|
543
983
|
.subscribe(versionNumber => {
|
|
544
|
-
this.
|
|
984
|
+
this.ActiveVersionNumber = versionNumber;
|
|
545
985
|
});
|
|
546
986
|
// Set initial conversation if provided
|
|
547
|
-
if (this.
|
|
548
|
-
this.
|
|
987
|
+
if (this.InitialConversationId) {
|
|
988
|
+
this.SetActiveConversation(this.InitialConversationId);
|
|
549
989
|
}
|
|
550
990
|
// Handle context-based navigation
|
|
551
|
-
if (this.
|
|
552
|
-
this.
|
|
991
|
+
if (this.ActiveContext === 'library') {
|
|
992
|
+
this.ActiveTab = 'collections';
|
|
553
993
|
}
|
|
554
994
|
// Task context will be handled by chat header dropdown, not navigation tabs
|
|
555
995
|
// Build task filter for conversations domain
|
|
@@ -566,43 +1006,43 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
566
1006
|
const c = md.EntityByName('MJ: Conversations');
|
|
567
1007
|
if (!cd || !c) {
|
|
568
1008
|
console.warn('⚠️ Missing metadata for Conversations or Conversation Details');
|
|
569
|
-
this.
|
|
1009
|
+
this.TasksFilter = `ParentID IS NULL AND UserID = '${this.CurrentUser.ID}'`; // Fallback to user-owned tasks only
|
|
570
1010
|
return;
|
|
571
1011
|
}
|
|
572
|
-
this.
|
|
1012
|
+
this.TasksFilter = `ParentID IS NULL AND (UserID = '${this.CurrentUser.ID}' OR ConversationDetailID IN (
|
|
573
1013
|
SELECT ID FROM [${cd.SchemaName}].[${cd.BaseView}]
|
|
574
1014
|
WHERE
|
|
575
|
-
UserID ='${this.
|
|
1015
|
+
UserID ='${this.CurrentUser.ID}' OR
|
|
576
1016
|
ConversationID IN (
|
|
577
|
-
SELECT ID FROM [${c.SchemaName}].[${c.BaseView}] WHERE UserID='${this.
|
|
1017
|
+
SELECT ID FROM [${c.SchemaName}].[${c.BaseView}] WHERE UserID='${this.CurrentUser.ID}'
|
|
578
1018
|
)
|
|
579
1019
|
))`;
|
|
580
|
-
console.log('📝 Conversations domain tasks filter built:', this.
|
|
1020
|
+
console.log('📝 Conversations domain tasks filter built:', this.TasksFilter);
|
|
581
1021
|
}
|
|
582
1022
|
ngDoCheck() {
|
|
583
1023
|
// Detect new unsaved conversation state changes
|
|
584
|
-
const currentIsNewConversation = this.
|
|
1024
|
+
const currentIsNewConversation = this.IsNewUnsavedConversation;
|
|
585
1025
|
if (currentIsNewConversation !== this.previousIsNewConversation) {
|
|
586
1026
|
this.previousIsNewConversation = currentIsNewConversation;
|
|
587
1027
|
if (currentIsNewConversation) {
|
|
588
1028
|
// Emit event to clear URL conversation parameter
|
|
589
1029
|
Promise.resolve().then(() => {
|
|
590
|
-
this.
|
|
1030
|
+
this.NewConversationStarted.emit();
|
|
591
1031
|
});
|
|
592
1032
|
}
|
|
593
1033
|
}
|
|
594
1034
|
// Detect conversation changes and emit event
|
|
595
|
-
const currentId = this.
|
|
1035
|
+
const currentId = this.SelectedConversationId;
|
|
596
1036
|
if (currentId !== this.previousConversationId) {
|
|
597
1037
|
this.previousConversationId = currentId;
|
|
598
|
-
const conversation = this.
|
|
1038
|
+
const conversation = this.SelectedConversation;
|
|
599
1039
|
if (conversation) {
|
|
600
|
-
this.
|
|
1040
|
+
this.ConversationChanged.emit(conversation);
|
|
601
1041
|
// Also emit navigationChanged for URL updates (only if on conversations tab)
|
|
602
|
-
if (this.
|
|
1042
|
+
if (this.ActiveTab === 'conversations' && currentId) {
|
|
603
1043
|
// Defer emission until after change detection completes
|
|
604
1044
|
Promise.resolve().then(() => {
|
|
605
|
-
this.
|
|
1045
|
+
this.NavigationChanged.emit({
|
|
606
1046
|
tab: 'conversations',
|
|
607
1047
|
conversationId: currentId
|
|
608
1048
|
});
|
|
@@ -611,14 +1051,14 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
611
1051
|
}
|
|
612
1052
|
}
|
|
613
1053
|
// Detect task selection changes (when on tasks tab)
|
|
614
|
-
if (this.
|
|
615
|
-
const currentTaskId = this.
|
|
1054
|
+
if (this.ActiveTab === 'tasks') {
|
|
1055
|
+
const currentTaskId = this.ActiveTaskId;
|
|
616
1056
|
if (currentTaskId !== this.previousTaskId) {
|
|
617
1057
|
this.previousTaskId = currentTaskId;
|
|
618
1058
|
if (currentTaskId) {
|
|
619
1059
|
// Defer emission until after change detection completes
|
|
620
1060
|
Promise.resolve().then(() => {
|
|
621
|
-
this.
|
|
1061
|
+
this.NavigationChanged.emit({
|
|
622
1062
|
tab: 'tasks',
|
|
623
1063
|
taskId: currentTaskId
|
|
624
1064
|
});
|
|
@@ -650,7 +1090,7 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
650
1090
|
*/
|
|
651
1091
|
onDocumentClick(event) {
|
|
652
1092
|
// Only handle when sidebar is expanded but unpinned
|
|
653
|
-
if (this.
|
|
1093
|
+
if (this.IsSidebarCollapsed || this.IsSidebarPinned) {
|
|
654
1094
|
return;
|
|
655
1095
|
}
|
|
656
1096
|
// Check if click is outside the sidebar
|
|
@@ -659,20 +1099,20 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
659
1099
|
const expandHandle = target.closest('.sidebar-expand-handle');
|
|
660
1100
|
// If click is outside sidebar and expand handle, collapse it
|
|
661
1101
|
if (!sidebarElement && !expandHandle) {
|
|
662
|
-
this.
|
|
1102
|
+
this.CollapseSidebar();
|
|
663
1103
|
}
|
|
664
1104
|
}
|
|
665
1105
|
checkMobileView() {
|
|
666
|
-
const wasMobile = this.
|
|
667
|
-
this.
|
|
668
|
-
if (this.
|
|
1106
|
+
const wasMobile = this.IsMobileView;
|
|
1107
|
+
this.IsMobileView = window.innerWidth < 768;
|
|
1108
|
+
if (this.IsMobileView && !wasMobile) {
|
|
669
1109
|
// Switched to mobile - hide sidebar and default to collapsed
|
|
670
|
-
this.
|
|
671
|
-
this.
|
|
1110
|
+
this.IsSidebarVisible = false;
|
|
1111
|
+
this.IsSidebarCollapsed = true;
|
|
672
1112
|
}
|
|
673
|
-
else if (!this.
|
|
1113
|
+
else if (!this.IsMobileView && wasMobile) {
|
|
674
1114
|
// Switched to desktop - show sidebar, restore state from User Settings
|
|
675
|
-
this.
|
|
1115
|
+
this.IsSidebarVisible = true;
|
|
676
1116
|
this.loadSidebarState().then(() => {
|
|
677
1117
|
this.cdr.detectChanges();
|
|
678
1118
|
});
|
|
@@ -681,34 +1121,50 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
681
1121
|
/**
|
|
682
1122
|
* Collapse sidebar
|
|
683
1123
|
*/
|
|
684
|
-
|
|
685
|
-
this.
|
|
686
|
-
if (this.
|
|
687
|
-
this.
|
|
1124
|
+
CollapseSidebar() {
|
|
1125
|
+
this.IsSidebarCollapsed = true;
|
|
1126
|
+
if (this.IsMobileView) {
|
|
1127
|
+
this.IsSidebarVisible = false;
|
|
688
1128
|
}
|
|
689
1129
|
}
|
|
1130
|
+
/** @deprecated Use {@link CollapseSidebar}. */
|
|
1131
|
+
collapseSidebar() {
|
|
1132
|
+
return this.CollapseSidebar();
|
|
1133
|
+
}
|
|
690
1134
|
/**
|
|
691
1135
|
* Expand sidebar (unpinned - will auto-collapse on selection)
|
|
692
1136
|
*/
|
|
1137
|
+
ExpandSidebar() {
|
|
1138
|
+
this.IsSidebarCollapsed = false;
|
|
1139
|
+
this.IsSidebarPinned = false;
|
|
1140
|
+
}
|
|
1141
|
+
/** @deprecated Use {@link ExpandSidebar}. */
|
|
693
1142
|
expandSidebar() {
|
|
694
|
-
this.
|
|
695
|
-
this.isSidebarPinned = false;
|
|
1143
|
+
return this.ExpandSidebar();
|
|
696
1144
|
}
|
|
697
1145
|
/**
|
|
698
1146
|
* Pin sidebar - keep it open after selection
|
|
699
1147
|
*/
|
|
700
|
-
|
|
701
|
-
this.
|
|
1148
|
+
PinSidebar() {
|
|
1149
|
+
this.IsSidebarPinned = true;
|
|
702
1150
|
this.saveSidebarState();
|
|
703
1151
|
}
|
|
1152
|
+
/** @deprecated Use {@link PinSidebar}. */
|
|
1153
|
+
pinSidebar() {
|
|
1154
|
+
return this.PinSidebar();
|
|
1155
|
+
}
|
|
704
1156
|
/**
|
|
705
1157
|
* Unpin sidebar - will auto-collapse on next selection
|
|
706
1158
|
*/
|
|
707
|
-
|
|
708
|
-
this.
|
|
709
|
-
this.
|
|
1159
|
+
UnpinSidebar() {
|
|
1160
|
+
this.IsSidebarPinned = false;
|
|
1161
|
+
this.CollapseSidebar();
|
|
710
1162
|
this.saveSidebarState();
|
|
711
1163
|
}
|
|
1164
|
+
/** @deprecated Use {@link UnpinSidebar}. */
|
|
1165
|
+
unpinSidebar() {
|
|
1166
|
+
return this.UnpinSidebar();
|
|
1167
|
+
}
|
|
712
1168
|
/**
|
|
713
1169
|
* Save sidebar state to User Settings (server)
|
|
714
1170
|
* Uses debouncing to avoid excessive database writes
|
|
@@ -728,15 +1184,15 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
728
1184
|
*/
|
|
729
1185
|
async saveSidebarStateToServer() {
|
|
730
1186
|
try {
|
|
731
|
-
const userId = this.
|
|
1187
|
+
const userId = this.CurrentUser?.ID;
|
|
732
1188
|
if (!userId) {
|
|
733
1189
|
return;
|
|
734
1190
|
}
|
|
735
1191
|
const stateToSave = {
|
|
736
|
-
collapsed: this.
|
|
737
|
-
pinned: this.
|
|
738
|
-
sidebarWidth: this.
|
|
739
|
-
artifactPanelWidth: this.
|
|
1192
|
+
collapsed: this.IsSidebarCollapsed,
|
|
1193
|
+
pinned: this.IsSidebarPinned,
|
|
1194
|
+
sidebarWidth: this.SidebarWidth,
|
|
1195
|
+
artifactPanelWidth: this.ArtifactPanelWidth
|
|
740
1196
|
};
|
|
741
1197
|
const engine = UserInfoEngine.Instance;
|
|
742
1198
|
const md = this.ProviderToUse;
|
|
@@ -763,21 +1219,21 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
763
1219
|
async loadSidebarState() {
|
|
764
1220
|
this.isLoadingSettings = true;
|
|
765
1221
|
try {
|
|
766
|
-
const userId = this.
|
|
1222
|
+
const userId = this.CurrentUser?.ID;
|
|
767
1223
|
if (userId) {
|
|
768
1224
|
// Try loading from cached User Settings
|
|
769
1225
|
const engine = UserInfoEngine.Instance;
|
|
770
1226
|
const setting = engine.UserSettings.find(s => s.Setting === this.USER_SETTING_SIDEBAR_KEY);
|
|
771
1227
|
if (setting?.Value) {
|
|
772
1228
|
const state = JSON.parse(setting.Value);
|
|
773
|
-
this.
|
|
774
|
-
this.
|
|
1229
|
+
this.IsSidebarCollapsed = state.collapsed ?? true;
|
|
1230
|
+
this.IsSidebarPinned = state.pinned ?? false;
|
|
775
1231
|
// Load width values if present (with validation)
|
|
776
1232
|
if (typeof state.sidebarWidth === 'number' && state.sidebarWidth >= 200 && state.sidebarWidth <= 500) {
|
|
777
|
-
this.
|
|
1233
|
+
this.SidebarWidth = state.sidebarWidth;
|
|
778
1234
|
}
|
|
779
1235
|
if (typeof state.artifactPanelWidth === 'number' && state.artifactPanelWidth >= 20 && state.artifactPanelWidth <= 70) {
|
|
780
|
-
this.
|
|
1236
|
+
this.ArtifactPanelWidth = state.artifactPanelWidth;
|
|
781
1237
|
}
|
|
782
1238
|
this.isLoadingSettings = false;
|
|
783
1239
|
return;
|
|
@@ -785,79 +1241,103 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
785
1241
|
}
|
|
786
1242
|
// No saved state found - NEW USER DEFAULT:
|
|
787
1243
|
// Start with sidebar collapsed and show new conversation screen
|
|
788
|
-
this.
|
|
789
|
-
this.
|
|
790
|
-
this.
|
|
1244
|
+
this.IsSidebarCollapsed = true;
|
|
1245
|
+
this.IsSidebarPinned = false;
|
|
1246
|
+
this.IsNewUnsavedConversation = true;
|
|
791
1247
|
}
|
|
792
1248
|
catch (error) {
|
|
793
1249
|
console.warn('Failed to load sidebar state:', error);
|
|
794
1250
|
// Default to collapsed for new users on error
|
|
795
|
-
this.
|
|
796
|
-
this.
|
|
1251
|
+
this.IsSidebarCollapsed = true;
|
|
1252
|
+
this.IsSidebarPinned = false;
|
|
797
1253
|
}
|
|
798
1254
|
finally {
|
|
799
1255
|
this.isLoadingSettings = false;
|
|
800
|
-
this.
|
|
1256
|
+
this.IsSidebarSettingsLoaded = true;
|
|
801
1257
|
}
|
|
802
1258
|
}
|
|
803
|
-
|
|
804
|
-
const wasOnDifferentTab = this.
|
|
805
|
-
this.
|
|
1259
|
+
OnTabChanged(tab) {
|
|
1260
|
+
const wasOnDifferentTab = this.ActiveTab !== tab;
|
|
1261
|
+
this.ActiveTab = tab;
|
|
806
1262
|
// Emit navigation change event with current state
|
|
807
1263
|
const navEvent = {
|
|
808
1264
|
tab: tab
|
|
809
1265
|
};
|
|
810
1266
|
if (tab === 'conversations') {
|
|
811
|
-
navEvent.conversationId = this.
|
|
1267
|
+
navEvent.conversationId = this.SelectedConversationId || undefined;
|
|
812
1268
|
}
|
|
813
1269
|
else if (tab === 'collections') {
|
|
814
1270
|
// If switching TO collections tab from another tab, clear to root level
|
|
815
1271
|
if (wasOnDifferentTab) {
|
|
816
|
-
this.
|
|
817
|
-
this.
|
|
1272
|
+
this.CollectionState.setActiveCollection(null);
|
|
1273
|
+
this.ActiveVersionId = null;
|
|
818
1274
|
// Don't include collectionId or versionId - go to root
|
|
819
1275
|
}
|
|
820
1276
|
else {
|
|
821
1277
|
// Already on collections tab, preserve current state
|
|
822
|
-
if (this.
|
|
823
|
-
navEvent.collectionId = this.
|
|
1278
|
+
if (this.CollectionState.activeCollectionId) {
|
|
1279
|
+
navEvent.collectionId = this.CollectionState.activeCollectionId;
|
|
824
1280
|
}
|
|
825
|
-
if (this.
|
|
826
|
-
navEvent.versionId = this.
|
|
1281
|
+
if (this.ActiveVersionId && this.CollectionState.activeCollectionId) {
|
|
1282
|
+
navEvent.versionId = this.ActiveVersionId;
|
|
827
1283
|
}
|
|
828
1284
|
}
|
|
829
1285
|
}
|
|
830
1286
|
else if (tab === 'tasks') {
|
|
831
|
-
navEvent.taskId = this.
|
|
1287
|
+
navEvent.taskId = this.ActiveTaskId || undefined;
|
|
832
1288
|
}
|
|
833
|
-
this.
|
|
1289
|
+
this.NavigationChanged.emit(navEvent);
|
|
834
1290
|
// Auto-close artifact panel when switching away from collections
|
|
835
1291
|
if (tab === 'conversations' || tab === 'tasks') {
|
|
836
|
-
this.
|
|
1292
|
+
this.ArtifactState.closeArtifact();
|
|
837
1293
|
}
|
|
838
1294
|
}
|
|
1295
|
+
/** @deprecated Use {@link OnTabChanged}. */
|
|
1296
|
+
onTabChanged(tab) {
|
|
1297
|
+
return this.OnTabChanged(tab);
|
|
1298
|
+
}
|
|
1299
|
+
ToggleSidebar() {
|
|
1300
|
+
this.IsSidebarVisible = !this.IsSidebarVisible;
|
|
1301
|
+
}
|
|
1302
|
+
/** @deprecated Use {@link ToggleSidebar}. */
|
|
839
1303
|
toggleSidebar() {
|
|
840
|
-
|
|
1304
|
+
return this.ToggleSidebar();
|
|
841
1305
|
}
|
|
842
|
-
|
|
843
|
-
if (this.
|
|
844
|
-
this.
|
|
1306
|
+
CloseSidebar() {
|
|
1307
|
+
if (this.IsMobileView && this.IsSidebarVisible) {
|
|
1308
|
+
this.IsSidebarVisible = false;
|
|
845
1309
|
}
|
|
846
1310
|
}
|
|
1311
|
+
/** @deprecated Use {@link CloseSidebar}. */
|
|
1312
|
+
closeSidebar() {
|
|
1313
|
+
return this.CloseSidebar();
|
|
1314
|
+
}
|
|
1315
|
+
CloseArtifactPanel() {
|
|
1316
|
+
this.ArtifactState.closeArtifact();
|
|
1317
|
+
}
|
|
1318
|
+
/** @deprecated Use {@link CloseArtifactPanel}. */
|
|
847
1319
|
closeArtifactPanel() {
|
|
848
|
-
this.
|
|
1320
|
+
return this.CloseArtifactPanel();
|
|
1321
|
+
}
|
|
1322
|
+
OpenSearch() {
|
|
1323
|
+
this.IsSearchPanelOpen = true;
|
|
849
1324
|
}
|
|
1325
|
+
/** @deprecated Use {@link OpenSearch}. */
|
|
850
1326
|
openSearch() {
|
|
851
|
-
this.
|
|
1327
|
+
return this.OpenSearch();
|
|
852
1328
|
}
|
|
1329
|
+
CloseSearch() {
|
|
1330
|
+
this.IsSearchPanelOpen = false;
|
|
1331
|
+
}
|
|
1332
|
+
/** @deprecated Use {@link CloseSearch}. */
|
|
853
1333
|
closeSearch() {
|
|
854
|
-
this.
|
|
1334
|
+
return this.CloseSearch();
|
|
855
1335
|
}
|
|
856
|
-
async
|
|
1336
|
+
async OnRefreshAgentCache() {
|
|
857
1337
|
try {
|
|
858
1338
|
await AIEngineBase.Instance.Config(true);
|
|
859
1339
|
// Refresh the mention autocomplete service to pick up new agents
|
|
860
|
-
await this.mentionAutocompleteService.refresh(this.
|
|
1340
|
+
await this.mentionAutocompleteService.refresh(this.CurrentUser);
|
|
861
1341
|
const agentCount = AIEngineBase.Instance.Agents?.length || 0;
|
|
862
1342
|
this.notificationService.CreateSimpleNotification(`Agent cache refreshed (${agentCount} agents)`, 'success', 3000);
|
|
863
1343
|
this.cdr.detectChanges();
|
|
@@ -867,24 +1347,28 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
867
1347
|
console.error('Failed to refresh AI Engine:', error);
|
|
868
1348
|
}
|
|
869
1349
|
}
|
|
870
|
-
|
|
1350
|
+
/** @deprecated Use {@link OnRefreshAgentCache}. */
|
|
1351
|
+
async onRefreshAgentCache() {
|
|
1352
|
+
return this.OnRefreshAgentCache();
|
|
1353
|
+
}
|
|
1354
|
+
HandleSearchResult(result) {
|
|
871
1355
|
console.log('🔍 Navigating to search result:', result);
|
|
872
1356
|
switch (result.type) {
|
|
873
1357
|
case 'conversation':
|
|
874
1358
|
// Switch to conversations tab and select conversation
|
|
875
|
-
this.
|
|
876
|
-
this.
|
|
877
|
-
this.
|
|
1359
|
+
this.ActiveTab = 'conversations';
|
|
1360
|
+
this.SetActiveConversation(result.id);
|
|
1361
|
+
this.NavigationChanged.emit({
|
|
878
1362
|
tab: 'conversations',
|
|
879
1363
|
conversationId: result.id
|
|
880
1364
|
});
|
|
881
1365
|
break;
|
|
882
1366
|
case 'message':
|
|
883
1367
|
// Switch to conversations tab, open conversation, and scroll to message (future enhancement)
|
|
884
|
-
this.
|
|
1368
|
+
this.ActiveTab = 'conversations';
|
|
885
1369
|
if (result.conversationId) {
|
|
886
|
-
this.
|
|
887
|
-
this.
|
|
1370
|
+
this.SetActiveConversation(result.conversationId);
|
|
1371
|
+
this.NavigationChanged.emit({
|
|
888
1372
|
tab: 'conversations',
|
|
889
1373
|
conversationId: result.conversationId
|
|
890
1374
|
// TODO: Add messageId for scroll-to support in future
|
|
@@ -893,68 +1377,80 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
893
1377
|
break;
|
|
894
1378
|
case 'artifact':
|
|
895
1379
|
// Switch to collections tab and open artifact
|
|
896
|
-
this.
|
|
897
|
-
this.
|
|
1380
|
+
this.ActiveTab = 'collections';
|
|
1381
|
+
this.ArtifactState.openArtifact(result.id);
|
|
898
1382
|
// If artifact is in a collection, navigate to that collection
|
|
899
1383
|
const collectionId = result.collectionId || undefined;
|
|
900
1384
|
// Search results don't have version ID, so just navigate to collection
|
|
901
1385
|
// The artifact will open with latest version
|
|
902
|
-
this.
|
|
1386
|
+
this.NavigationChanged.emit({
|
|
903
1387
|
tab: 'collections',
|
|
904
1388
|
collectionId
|
|
905
1389
|
});
|
|
906
1390
|
break;
|
|
907
1391
|
case 'collection':
|
|
908
1392
|
// Switch to collections tab and navigate to collection
|
|
909
|
-
this.
|
|
910
|
-
this.
|
|
911
|
-
this.
|
|
1393
|
+
this.ActiveTab = 'collections';
|
|
1394
|
+
this.CollectionState.setActiveCollection(result.id);
|
|
1395
|
+
this.NavigationChanged.emit({
|
|
912
1396
|
tab: 'collections',
|
|
913
1397
|
collectionId: result.id
|
|
914
1398
|
});
|
|
915
1399
|
break;
|
|
916
1400
|
case 'task':
|
|
917
1401
|
// Switch to tasks tab and select task
|
|
918
|
-
this.
|
|
1402
|
+
this.ActiveTab = 'tasks';
|
|
919
1403
|
this._activeTaskId = result.id;
|
|
920
|
-
this.
|
|
1404
|
+
this.NavigationChanged.emit({
|
|
921
1405
|
tab: 'tasks',
|
|
922
1406
|
taskId: result.id
|
|
923
1407
|
});
|
|
924
1408
|
break;
|
|
925
1409
|
}
|
|
926
1410
|
// Close search panel after navigation
|
|
927
|
-
this.
|
|
1411
|
+
this.CloseSearch();
|
|
1412
|
+
}
|
|
1413
|
+
/** @deprecated Use {@link HandleSearchResult}. */
|
|
1414
|
+
handleSearchResult(result) {
|
|
1415
|
+
return this.HandleSearchResult(result);
|
|
928
1416
|
}
|
|
929
1417
|
/**
|
|
930
1418
|
* Sidebar resize methods
|
|
931
1419
|
*/
|
|
932
|
-
|
|
1420
|
+
OnSidebarResizeStart(event) {
|
|
933
1421
|
this.isSidebarResizing = true;
|
|
934
1422
|
this.sidebarResizeStartX = event.clientX;
|
|
935
|
-
this.sidebarResizeStartWidth = this.
|
|
1423
|
+
this.sidebarResizeStartWidth = this.SidebarWidth;
|
|
936
1424
|
event.preventDefault();
|
|
937
1425
|
document.body.style.cursor = 'col-resize';
|
|
938
1426
|
document.body.style.userSelect = 'none';
|
|
939
1427
|
}
|
|
1428
|
+
/** @deprecated Use {@link OnSidebarResizeStart}. */
|
|
1429
|
+
onSidebarResizeStart(event) {
|
|
1430
|
+
return this.OnSidebarResizeStart(event);
|
|
1431
|
+
}
|
|
940
1432
|
/**
|
|
941
1433
|
* Artifact panel resize methods
|
|
942
1434
|
*/
|
|
943
|
-
|
|
1435
|
+
OnArtifactPanelResizeStart(event) {
|
|
944
1436
|
this.isArtifactPanelResizing = true;
|
|
945
1437
|
this.artifactPanelResizeStartX = event.clientX;
|
|
946
|
-
this.artifactPanelResizeStartWidth = this.
|
|
1438
|
+
this.artifactPanelResizeStartWidth = this.ArtifactPanelWidth;
|
|
947
1439
|
event.preventDefault();
|
|
948
1440
|
document.body.style.cursor = 'col-resize';
|
|
949
1441
|
document.body.style.userSelect = 'none';
|
|
950
1442
|
}
|
|
1443
|
+
/** @deprecated Use {@link OnArtifactPanelResizeStart}. */
|
|
1444
|
+
onArtifactPanelResizeStart(event) {
|
|
1445
|
+
return this.OnArtifactPanelResizeStart(event);
|
|
1446
|
+
}
|
|
951
1447
|
onResizeMove(event) {
|
|
952
1448
|
if (this.isSidebarResizing) {
|
|
953
1449
|
const deltaX = event.clientX - this.sidebarResizeStartX;
|
|
954
1450
|
let newWidth = this.sidebarResizeStartWidth + deltaX;
|
|
955
1451
|
// Constrain between 200px and 500px
|
|
956
1452
|
newWidth = Math.max(200, Math.min(500, newWidth));
|
|
957
|
-
this.
|
|
1453
|
+
this.SidebarWidth = newWidth;
|
|
958
1454
|
}
|
|
959
1455
|
else if (this.isArtifactPanelResizing) {
|
|
960
1456
|
const container = document.querySelector('.workspace-content');
|
|
@@ -966,7 +1462,7 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
966
1462
|
let newWidth = this.artifactPanelResizeStartWidth + deltaPercent;
|
|
967
1463
|
// Constrain between 20% and 70%
|
|
968
1464
|
newWidth = Math.max(20, Math.min(70, newWidth));
|
|
969
|
-
this.
|
|
1465
|
+
this.ArtifactPanelWidth = newWidth;
|
|
970
1466
|
}
|
|
971
1467
|
}
|
|
972
1468
|
onResizeEnd(event) {
|
|
@@ -986,27 +1482,35 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
986
1482
|
/**
|
|
987
1483
|
* Touch event handlers for mobile resize support
|
|
988
1484
|
*/
|
|
989
|
-
|
|
1485
|
+
OnSidebarResizeTouchStart(event) {
|
|
990
1486
|
this.isSidebarResizing = true;
|
|
991
1487
|
const touch = event.touches[0];
|
|
992
1488
|
this.sidebarResizeStartX = touch.clientX;
|
|
993
|
-
this.sidebarResizeStartWidth = this.
|
|
1489
|
+
this.sidebarResizeStartWidth = this.SidebarWidth;
|
|
994
1490
|
event.preventDefault();
|
|
995
1491
|
}
|
|
996
|
-
|
|
1492
|
+
/** @deprecated Use {@link OnSidebarResizeTouchStart}. */
|
|
1493
|
+
onSidebarResizeTouchStart(event) {
|
|
1494
|
+
return this.OnSidebarResizeTouchStart(event);
|
|
1495
|
+
}
|
|
1496
|
+
OnArtifactPanelResizeTouchStart(event) {
|
|
997
1497
|
this.isArtifactPanelResizing = true;
|
|
998
1498
|
const touch = event.touches[0];
|
|
999
1499
|
this.artifactPanelResizeStartX = touch.clientX;
|
|
1000
|
-
this.artifactPanelResizeStartWidth = this.
|
|
1500
|
+
this.artifactPanelResizeStartWidth = this.ArtifactPanelWidth;
|
|
1001
1501
|
event.preventDefault();
|
|
1002
1502
|
}
|
|
1503
|
+
/** @deprecated Use {@link OnArtifactPanelResizeTouchStart}. */
|
|
1504
|
+
onArtifactPanelResizeTouchStart(event) {
|
|
1505
|
+
return this.OnArtifactPanelResizeTouchStart(event);
|
|
1506
|
+
}
|
|
1003
1507
|
onResizeTouchMove(event) {
|
|
1004
1508
|
if (this.isSidebarResizing) {
|
|
1005
1509
|
const touch = event.touches[0];
|
|
1006
1510
|
const deltaX = touch.clientX - this.sidebarResizeStartX;
|
|
1007
1511
|
let newWidth = this.sidebarResizeStartWidth + deltaX;
|
|
1008
1512
|
newWidth = Math.max(200, Math.min(500, newWidth));
|
|
1009
|
-
this.
|
|
1513
|
+
this.SidebarWidth = newWidth;
|
|
1010
1514
|
}
|
|
1011
1515
|
else if (this.isArtifactPanelResizing) {
|
|
1012
1516
|
const container = document.querySelector('.workspace-content');
|
|
@@ -1018,7 +1522,7 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
1018
1522
|
const deltaPercent = (deltaX / containerWidth) * -100;
|
|
1019
1523
|
let newWidth = this.artifactPanelResizeStartWidth + deltaPercent;
|
|
1020
1524
|
newWidth = Math.max(20, Math.min(70, newWidth));
|
|
1021
|
-
this.
|
|
1525
|
+
this.ArtifactPanelWidth = newWidth;
|
|
1022
1526
|
}
|
|
1023
1527
|
}
|
|
1024
1528
|
onResizeTouchEnd(event) {
|
|
@@ -1041,32 +1545,44 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
1041
1545
|
* binding compiles. New consumers should use the resource components in
|
|
1042
1546
|
* @memberjunction/ng-explorer-core instead of this workspace.
|
|
1043
1547
|
*/
|
|
1044
|
-
|
|
1548
|
+
OnApplyFormRequested(_event) {
|
|
1045
1549
|
console.warn('Workspace.onApplyFormRequested: workspace is deprecated; use the per-feature resource components instead.');
|
|
1046
1550
|
}
|
|
1047
|
-
|
|
1048
|
-
|
|
1551
|
+
/** @deprecated Use {@link OnApplyFormRequested}. */
|
|
1552
|
+
onApplyFormRequested(_event) {
|
|
1553
|
+
return this.OnApplyFormRequested(_event);
|
|
1554
|
+
}
|
|
1555
|
+
ToggleMaximizeArtifactPanel() {
|
|
1556
|
+
if (this.IsArtifactPanelMaximized) {
|
|
1049
1557
|
// Restore to previous width
|
|
1050
|
-
this.
|
|
1051
|
-
this.
|
|
1558
|
+
this.ArtifactPanelWidth = this.artifactPanelWidthBeforeMaximize;
|
|
1559
|
+
this.IsArtifactPanelMaximized = false;
|
|
1052
1560
|
}
|
|
1053
1561
|
else {
|
|
1054
1562
|
// Maximize - store current width and set to 100%
|
|
1055
|
-
this.artifactPanelWidthBeforeMaximize = this.
|
|
1056
|
-
this.
|
|
1057
|
-
this.
|
|
1563
|
+
this.artifactPanelWidthBeforeMaximize = this.ArtifactPanelWidth;
|
|
1564
|
+
this.ArtifactPanelWidth = 100;
|
|
1565
|
+
this.IsArtifactPanelMaximized = true;
|
|
1058
1566
|
}
|
|
1059
1567
|
}
|
|
1060
|
-
|
|
1568
|
+
/** @deprecated Use {@link ToggleMaximizeArtifactPanel}. */
|
|
1569
|
+
toggleMaximizeArtifactPanel() {
|
|
1570
|
+
return this.ToggleMaximizeArtifactPanel();
|
|
1571
|
+
}
|
|
1572
|
+
OnConversationRenamed(event) {
|
|
1061
1573
|
console.log('✨ Workspace received rename event:', event);
|
|
1062
1574
|
// Trigger animation in sidebar by setting the ID
|
|
1063
|
-
this.
|
|
1575
|
+
this.RenamedConversationId = event.conversationId;
|
|
1064
1576
|
// Clear after animation completes (1500ms)
|
|
1065
1577
|
setTimeout(() => {
|
|
1066
|
-
this.
|
|
1578
|
+
this.RenamedConversationId = null;
|
|
1067
1579
|
}, 1500);
|
|
1068
1580
|
}
|
|
1069
|
-
|
|
1581
|
+
/** @deprecated Use {@link OnConversationRenamed}. */
|
|
1582
|
+
onConversationRenamed(event) {
|
|
1583
|
+
return this.OnConversationRenamed(event);
|
|
1584
|
+
}
|
|
1585
|
+
OnOpenEntityRecord(event) {
|
|
1070
1586
|
const pairs = event.compositeKey.KeyValuePairs || [];
|
|
1071
1587
|
const keys = {};
|
|
1072
1588
|
for (const p of pairs) {
|
|
@@ -1082,12 +1598,20 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
1082
1598
|
keys,
|
|
1083
1599
|
mode: 'view'
|
|
1084
1600
|
};
|
|
1085
|
-
this.
|
|
1601
|
+
this.ActionableCommandExecuted.emit(command);
|
|
1602
|
+
}
|
|
1603
|
+
/** @deprecated Use {@link OnOpenEntityRecord}. */
|
|
1604
|
+
onOpenEntityRecord(event) {
|
|
1605
|
+
return this.OnOpenEntityRecord(event);
|
|
1086
1606
|
}
|
|
1607
|
+
OnNavigationRequest(event) {
|
|
1608
|
+
this.NavigationRequested.emit(event);
|
|
1609
|
+
}
|
|
1610
|
+
/** @deprecated Use {@link OnNavigationRequest}. */
|
|
1087
1611
|
onNavigationRequest(event) {
|
|
1088
|
-
this.
|
|
1612
|
+
return this.OnNavigationRequest(event);
|
|
1089
1613
|
}
|
|
1090
|
-
|
|
1614
|
+
OnOpenEntityRecordFromTasks(event) {
|
|
1091
1615
|
// Convert to actionable command and emit
|
|
1092
1616
|
const command = {
|
|
1093
1617
|
type: 'open:resource',
|
|
@@ -1097,28 +1621,36 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
1097
1621
|
resourceId: event.recordId,
|
|
1098
1622
|
mode: 'view'
|
|
1099
1623
|
};
|
|
1100
|
-
this.
|
|
1624
|
+
this.ActionableCommandExecuted.emit(command);
|
|
1101
1625
|
}
|
|
1102
|
-
|
|
1626
|
+
/** @deprecated Use {@link OnOpenEntityRecordFromTasks}. */
|
|
1627
|
+
onOpenEntityRecordFromTasks(event) {
|
|
1628
|
+
return this.OnOpenEntityRecordFromTasks(event);
|
|
1629
|
+
}
|
|
1630
|
+
OnTaskClicked(task) {
|
|
1103
1631
|
// Switch to Tasks tab and set active task ID
|
|
1104
|
-
this.
|
|
1632
|
+
this.ActiveTab = 'tasks';
|
|
1105
1633
|
this._activeTaskId = task.ID;
|
|
1106
1634
|
// Emit navigation change
|
|
1107
|
-
this.
|
|
1635
|
+
this.NavigationChanged.emit({
|
|
1108
1636
|
tab: 'tasks',
|
|
1109
1637
|
taskId: task.ID
|
|
1110
1638
|
});
|
|
1111
1639
|
}
|
|
1640
|
+
/** @deprecated Use {@link OnTaskClicked}. */
|
|
1641
|
+
onTaskClicked(task) {
|
|
1642
|
+
return this.OnTaskClicked(task);
|
|
1643
|
+
}
|
|
1112
1644
|
/**
|
|
1113
1645
|
* Handle collection navigation events
|
|
1114
1646
|
*/
|
|
1115
|
-
|
|
1647
|
+
OnCollectionNavigated(event) {
|
|
1116
1648
|
console.log('📁 Collection navigated:', event);
|
|
1117
1649
|
// Store the version ID for URL sync
|
|
1118
1650
|
// CRITICAL: Only update activeVersionId if versionId was explicitly provided in the event
|
|
1119
1651
|
// If versionId is undefined (not provided), keep the current activeVersionId
|
|
1120
1652
|
if (event.versionId !== undefined) {
|
|
1121
|
-
this.
|
|
1653
|
+
this.ActiveVersionId = event.versionId;
|
|
1122
1654
|
}
|
|
1123
1655
|
// Otherwise: versionId not provided in event, preserve current activeVersionId
|
|
1124
1656
|
// IMPORTANT: Don't emit navigationChanged here when doing programmatic navigation (deep linking)
|
|
@@ -1126,15 +1658,15 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
1126
1658
|
// Only emit if the event explicitly includes a versionId, or if we're intentionally closing the artifact
|
|
1127
1659
|
if (event.versionId !== undefined) {
|
|
1128
1660
|
// Event explicitly specifies artifact state (user clicked artifact or intentionally closed it)
|
|
1129
|
-
this.
|
|
1661
|
+
this.NavigationChanged.emit({
|
|
1130
1662
|
tab: 'collections',
|
|
1131
1663
|
collectionId: event.collectionId || undefined,
|
|
1132
1664
|
versionId: event.versionId || undefined
|
|
1133
1665
|
});
|
|
1134
1666
|
}
|
|
1135
|
-
else if (!this.
|
|
1667
|
+
else if (!this.ActiveVersionId) {
|
|
1136
1668
|
// No artifact currently open, safe to emit collection-only navigation
|
|
1137
|
-
this.
|
|
1669
|
+
this.NavigationChanged.emit({
|
|
1138
1670
|
tab: 'collections',
|
|
1139
1671
|
collectionId: event.collectionId || undefined
|
|
1140
1672
|
});
|
|
@@ -1142,124 +1674,152 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
1142
1674
|
// Otherwise: artifact is open but event doesn't specify versionId
|
|
1143
1675
|
// Don't emit - preserve current URL state with artifact
|
|
1144
1676
|
}
|
|
1677
|
+
/** @deprecated Use {@link OnCollectionNavigated}. */
|
|
1678
|
+
onCollectionNavigated(event) {
|
|
1679
|
+
return this.OnCollectionNavigated(event);
|
|
1680
|
+
}
|
|
1145
1681
|
/**
|
|
1146
1682
|
* Handle navigation from artifact links
|
|
1147
1683
|
*/
|
|
1148
|
-
|
|
1684
|
+
OnArtifactLinkNavigation(event) {
|
|
1149
1685
|
console.log('🔗 Navigating from artifact link:', event);
|
|
1150
1686
|
if (event.type === 'conversation') {
|
|
1151
|
-
this.
|
|
1687
|
+
this.ActiveTab = 'conversations';
|
|
1152
1688
|
// Close collection artifact viewer if it's open
|
|
1153
|
-
this.
|
|
1689
|
+
this.ArtifactState.closeArtifact();
|
|
1154
1690
|
// Store pending artifact info so chat area can show it and scroll to message
|
|
1155
1691
|
if (event.artifactId) {
|
|
1156
|
-
this.
|
|
1157
|
-
this.
|
|
1158
|
-
this.
|
|
1692
|
+
this.PendingArtifactId = event.artifactId;
|
|
1693
|
+
this.PendingArtifactConversationId = event.id;
|
|
1694
|
+
this.PendingArtifactVersionNumber = event.versionNumber || null;
|
|
1159
1695
|
console.log('📦 Pending artifact set:', event.artifactId, 'v' + event.versionNumber);
|
|
1160
1696
|
}
|
|
1161
|
-
this.
|
|
1162
|
-
this.
|
|
1697
|
+
this.SetActiveConversation(event.id);
|
|
1698
|
+
this.NavigationChanged.emit({
|
|
1163
1699
|
tab: 'conversations',
|
|
1164
1700
|
conversationId: event.id
|
|
1165
1701
|
});
|
|
1166
1702
|
}
|
|
1167
1703
|
else if (event.type === 'collection') {
|
|
1168
|
-
this.
|
|
1169
|
-
this.
|
|
1704
|
+
this.ActiveTab = 'collections';
|
|
1705
|
+
this.CollectionState.setActiveCollection(event.id);
|
|
1170
1706
|
// Open the artifact automatically when navigating to the collection
|
|
1171
1707
|
if (event.artifactId) {
|
|
1172
|
-
this.
|
|
1708
|
+
this.ArtifactState.openArtifact(event.artifactId, event.versionNumber);
|
|
1173
1709
|
}
|
|
1174
1710
|
// Store version ID for URL sync (same as viewArtifact does)
|
|
1175
1711
|
if (event.versionId) {
|
|
1176
|
-
this.
|
|
1712
|
+
this.ActiveVersionId = event.versionId;
|
|
1177
1713
|
}
|
|
1178
1714
|
// Emit navigation with version ID so URL includes it
|
|
1179
|
-
this.
|
|
1715
|
+
this.NavigationChanged.emit({
|
|
1180
1716
|
tab: 'collections',
|
|
1181
1717
|
collectionId: event.id,
|
|
1182
1718
|
versionId: event.versionId
|
|
1183
1719
|
});
|
|
1184
1720
|
}
|
|
1185
1721
|
}
|
|
1722
|
+
/** @deprecated Use {@link OnArtifactLinkNavigation}. */
|
|
1723
|
+
onArtifactLinkNavigation(event) {
|
|
1724
|
+
return this.OnArtifactLinkNavigation(event);
|
|
1725
|
+
}
|
|
1186
1726
|
/**
|
|
1187
1727
|
* Load permissions for the given artifact
|
|
1188
1728
|
*/
|
|
1189
1729
|
async loadArtifactPermissions(artifactId) {
|
|
1190
1730
|
// Guard against null/undefined
|
|
1191
1731
|
if (!artifactId) {
|
|
1192
|
-
this.
|
|
1193
|
-
this.
|
|
1732
|
+
this.CanShareActiveArtifact = false;
|
|
1733
|
+
this.CanEditActiveArtifact = false;
|
|
1194
1734
|
return;
|
|
1195
1735
|
}
|
|
1196
1736
|
try {
|
|
1197
|
-
const permissions = await this.artifactPermissionService.getUserPermissions(artifactId, this.
|
|
1198
|
-
this.
|
|
1199
|
-
this.
|
|
1737
|
+
const permissions = await this.artifactPermissionService.getUserPermissions(artifactId, this.CurrentUser);
|
|
1738
|
+
this.CanShareActiveArtifact = permissions.canShare;
|
|
1739
|
+
this.CanEditActiveArtifact = permissions.canEdit;
|
|
1200
1740
|
}
|
|
1201
1741
|
catch (error) {
|
|
1202
1742
|
console.error('Failed to load artifact permissions:', error);
|
|
1203
|
-
this.
|
|
1204
|
-
this.
|
|
1743
|
+
this.CanShareActiveArtifact = false;
|
|
1744
|
+
this.CanEditActiveArtifact = false;
|
|
1205
1745
|
}
|
|
1206
1746
|
}
|
|
1207
1747
|
/**
|
|
1208
1748
|
* Handle share request from artifact viewer
|
|
1209
1749
|
*/
|
|
1210
|
-
async
|
|
1750
|
+
async OnArtifactShareRequested(artifactId) {
|
|
1211
1751
|
// Load the artifact entity to pass to the modal
|
|
1212
1752
|
const md = this.ProviderToUse;
|
|
1213
1753
|
const artifact = await md.GetEntityObject('MJ: Artifacts');
|
|
1214
1754
|
await artifact.Load(artifactId);
|
|
1215
1755
|
if (artifact) {
|
|
1216
|
-
this.
|
|
1217
|
-
this.
|
|
1756
|
+
this.ArtifactToShare = artifact;
|
|
1757
|
+
this.IsArtifactShareModalOpen = true;
|
|
1218
1758
|
}
|
|
1219
1759
|
}
|
|
1760
|
+
/** @deprecated Use {@link OnArtifactShareRequested}. */
|
|
1761
|
+
async onArtifactShareRequested(artifactId) {
|
|
1762
|
+
return this.OnArtifactShareRequested(artifactId);
|
|
1763
|
+
}
|
|
1220
1764
|
/**
|
|
1221
1765
|
* Handle close of artifact share modal
|
|
1222
1766
|
*/
|
|
1767
|
+
OnArtifactShareModalClose() {
|
|
1768
|
+
this.IsArtifactShareModalOpen = false;
|
|
1769
|
+
this.ArtifactToShare = null;
|
|
1770
|
+
}
|
|
1771
|
+
/** @deprecated Use {@link OnArtifactShareModalClose}. */
|
|
1223
1772
|
onArtifactShareModalClose() {
|
|
1224
|
-
this.
|
|
1225
|
-
this.artifactToShare = null;
|
|
1773
|
+
return this.OnArtifactShareModalClose();
|
|
1226
1774
|
}
|
|
1227
1775
|
/**
|
|
1228
1776
|
* Handle successful share - refresh permissions
|
|
1229
1777
|
*/
|
|
1230
|
-
async
|
|
1231
|
-
this.
|
|
1232
|
-
this.
|
|
1778
|
+
async OnArtifactShared() {
|
|
1779
|
+
this.IsArtifactShareModalOpen = false;
|
|
1780
|
+
this.ArtifactToShare = null;
|
|
1233
1781
|
// Refresh permissions for the active artifact
|
|
1234
|
-
if (this.
|
|
1235
|
-
await this.loadArtifactPermissions(this.
|
|
1782
|
+
if (this.ActiveArtifactId) {
|
|
1783
|
+
await this.loadArtifactPermissions(this.ActiveArtifactId);
|
|
1236
1784
|
}
|
|
1237
1785
|
}
|
|
1786
|
+
/** @deprecated Use {@link OnArtifactShared}. */
|
|
1787
|
+
async onArtifactShared() {
|
|
1788
|
+
return this.OnArtifactShared();
|
|
1789
|
+
}
|
|
1238
1790
|
/**
|
|
1239
1791
|
* Handle actionable command execution from child components
|
|
1240
1792
|
* Bubbles up to host application for handling
|
|
1241
1793
|
*/
|
|
1242
|
-
|
|
1794
|
+
OnActionableCommand(command) {
|
|
1243
1795
|
if (command.type === 'open:resource' && command.resourceType === 'Record') {
|
|
1244
1796
|
// chat-area converts Record commands to openEntityRecord; onOpenEntityRecord
|
|
1245
1797
|
// re-emits them as actionableCommandExecuted. Skip the raw command to avoid a double open.
|
|
1246
1798
|
return;
|
|
1247
1799
|
}
|
|
1248
1800
|
console.log('📤 Bubbling up actionable command:', command);
|
|
1249
|
-
this.
|
|
1801
|
+
this.ActionableCommandExecuted.emit(command);
|
|
1802
|
+
}
|
|
1803
|
+
/** @deprecated Use {@link OnActionableCommand}. */
|
|
1804
|
+
onActionableCommand(command) {
|
|
1805
|
+
return this.OnActionableCommand(command);
|
|
1250
1806
|
}
|
|
1251
1807
|
/**
|
|
1252
1808
|
* Handle automatic command execution from child components
|
|
1253
1809
|
* Bubbles up to host application for handling
|
|
1254
1810
|
*/
|
|
1255
|
-
|
|
1811
|
+
OnAutomaticCommand(command) {
|
|
1256
1812
|
console.log('📤 Bubbling up automatic command:', command);
|
|
1257
|
-
this.
|
|
1813
|
+
this.AutomaticCommandExecuted.emit(command);
|
|
1814
|
+
}
|
|
1815
|
+
/** @deprecated Use {@link OnAutomaticCommand}. */
|
|
1816
|
+
onAutomaticCommand(command) {
|
|
1817
|
+
return this.OnAutomaticCommand(command);
|
|
1258
1818
|
}
|
|
1259
1819
|
static ɵfac = function ConversationWorkspaceComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ConversationWorkspaceComponent)(i0.ɵɵdirectiveInject(i1.ArtifactStateService), i0.ɵɵdirectiveInject(i2.CollectionStateService), i0.ɵɵdirectiveInject(i3.ArtifactPermissionService), i0.ɵɵdirectiveInject(i4.MJNotificationService), i0.ɵɵdirectiveInject(i5.ConversationStreamingService), i0.ɵɵdirectiveInject(i6.UICommandHandlerService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
1260
1820
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ConversationWorkspaceComponent, selectors: [["mj-conversation-workspace"]], hostBindings: function ConversationWorkspaceComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
1261
1821
|
i0.ɵɵlistener("resize", function ConversationWorkspaceComponent_resize_HostBindingHandler() { return ctx.onWindowResize(); }, i0.ɵɵresolveWindow)("click", function ConversationWorkspaceComponent_click_HostBindingHandler($event) { return ctx.onDocumentClick($event); }, i0.ɵɵresolveDocument);
|
|
1262
|
-
} }, inputs: { environmentId: "environmentId", initialConversationId: "initialConversationId", layout: "layout", currentUser: "currentUser", activeContext: "activeContext", contextItemId: "contextItemId", ShowRoutines: "ShowRoutines", activeTabInput: "activeTabInput", activeConversationInput: "activeConversationInput", activeCollectionInput: "activeCollectionInput", activeVersionIdInput: "activeVersionIdInput", activeTaskInput: "activeTaskInput" }, outputs: { conversationChanged: "conversationChanged", artifactOpened: "artifactOpened", navigationChanged: "navigationChanged", newConversationStarted: "newConversationStarted", actionableCommandExecuted: "actionableCommandExecuted", automaticCommandExecuted: "automaticCommandExecuted", navigationRequested: "navigationRequested" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 8, vars: 13, consts: [["mjSearchShortcut", "", 1, "conversation-workspace", 3, "searchTriggered"], [1, "workspace-navigation"], [3, "tabChanged", "sidebarToggled", "searchTriggered", "refreshTriggered", "activeTab", "environmentId", "currentUser", "conversationId"], [1, "workspace-loading"], [1, "workspace-content"], [3, "close", "resultSelected", "isOpen", "environmentId", "currentUser"], [3, "saved", "cancelled", "isOpen", "artifact", "currentUser"], ["text", "Loading agents...", "size", "large"], [1, "mobile-sidebar-backdrop", "visible"], [1, "workspace-sidebar", 3, "open", "collapsed", "no-transition", "width"], ["title", "Show conversations", 1, "sidebar-floating-toggle"], [1, "sidebar-resize-handle"], [1, "workspace-main"], [1, "mobile-sidebar-backdrop", "visible", 3, "click"], [1, "workspace-sidebar"], [3, "conversationSelected", "newConversationRequested", "openEntityRecord", "pinSidebarRequested", "unpinSidebarRequested", "activeTab", "environmentId", "currentUser", "selectedConversationId", "renamedConversationId", "isSidebarPinned", "isMobileView", "ShowRoutines", "Provider"], ["title", "Show conversations", 1, "sidebar-floating-toggle", 3, "click"], [1, "fas", "fa-table-columns"], [1, "sidebar-resize-handle", 3, "mousedown"], [3, "collectionNavigated", "environmentId", "currentUser"], [3, "openEntityRecord", "environmentId", "currentUser", "baseFilter", "activeTaskId"], [3, "conversationRenamed", "openEntityRecord", "navigationRequest", "taskClicked", "artifactLinkClicked", "conversationCreated", "realtimeConversationReady", "threadOpened", "threadClosed", "pendingArtifactConsumed", "pendingMessageConsumed", "pendingMessageRequested", "environmentId", "currentUser", "conversationId", "conversation", "threadId", "isNewConversation", "pendingMessage", "pendingAttachments", "pendingMessageConversationId", "pendingArtifactId", "pendingArtifactConversationId", "pendingArtifactVersionNumber"], [1, "artifact-panel-resize-handle"], [1, "workspace-artifact-panel"], [3, "closed", "navigateToLink", "shareRequested", "maximizeToggled", "applyFormRequested", "artifactId", "currentUser", "environmentId", "versionNumber", "showSaveToCollection", "viewContext", "contextCollectionId", "canShare", "canEdit", "isMaximized"], [1, "artifact-panel-resize-handle", 3, "mousedown"]], template: function ConversationWorkspaceComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1822
|
+
} }, inputs: { EnvironmentId: "EnvironmentId", environmentId: "environmentId", InitialConversationId: "InitialConversationId", initialConversationId: "initialConversationId", Layout: "Layout", layout: "layout", CurrentUser: "CurrentUser", currentUser: "currentUser", ActiveContext: "ActiveContext", activeContext: "activeContext", ContextItemId: "ContextItemId", contextItemId: "contextItemId", ShowRoutines: "ShowRoutines", ActiveTabInput: "ActiveTabInput", activeTabInput: "activeTabInput", ActiveConversationInput: "ActiveConversationInput", activeConversationInput: "activeConversationInput", ActiveCollectionInput: "ActiveCollectionInput", activeCollectionInput: "activeCollectionInput", ActiveVersionIdInput: "ActiveVersionIdInput", activeVersionIdInput: "activeVersionIdInput", ActiveTaskInput: "ActiveTaskInput", activeTaskInput: "activeTaskInput" }, outputs: { ConversationChanged: "ConversationChanged", conversationChanged: "conversationChanged", ArtifactOpened: "ArtifactOpened", artifactOpened: "artifactOpened", NavigationChanged: "NavigationChanged", navigationChanged: "navigationChanged", NewConversationStarted: "NewConversationStarted", newConversationStarted: "newConversationStarted", ActionableCommandExecuted: "ActionableCommandExecuted", actionableCommandExecuted: "actionableCommandExecuted", AutomaticCommandExecuted: "AutomaticCommandExecuted", automaticCommandExecuted: "automaticCommandExecuted", NavigationRequested: "NavigationRequested", navigationRequested: "navigationRequested" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 8, vars: 13, consts: [["mjSearchShortcut", "", 1, "conversation-workspace", 3, "searchTriggered"], [1, "workspace-navigation"], [3, "tabChanged", "sidebarToggled", "searchTriggered", "refreshTriggered", "activeTab", "environmentId", "currentUser", "conversationId"], [1, "workspace-loading"], [1, "workspace-content"], [3, "close", "resultSelected", "isOpen", "environmentId", "currentUser"], [3, "saved", "cancelled", "isOpen", "artifact", "currentUser"], ["text", "Loading agents...", "size", "large"], [1, "mobile-sidebar-backdrop", "visible"], [1, "workspace-sidebar", 3, "open", "collapsed", "no-transition", "width"], ["title", "Show conversations", 1, "sidebar-floating-toggle"], [1, "sidebar-resize-handle"], [1, "workspace-main"], [1, "mobile-sidebar-backdrop", "visible", 3, "click"], [1, "workspace-sidebar"], [3, "conversationSelected", "newConversationRequested", "openEntityRecord", "pinSidebarRequested", "unpinSidebarRequested", "activeTab", "environmentId", "currentUser", "selectedConversationId", "renamedConversationId", "isSidebarPinned", "isMobileView", "ShowRoutines", "Provider"], ["title", "Show conversations", 1, "sidebar-floating-toggle", 3, "click"], [1, "fas", "fa-table-columns"], [1, "sidebar-resize-handle", 3, "mousedown"], [3, "collectionNavigated", "environmentId", "currentUser"], [3, "openEntityRecord", "environmentId", "currentUser", "baseFilter", "activeTaskId"], [3, "conversationRenamed", "openEntityRecord", "navigationRequest", "taskClicked", "artifactLinkClicked", "conversationCreated", "realtimeConversationReady", "threadOpened", "threadClosed", "pendingArtifactConsumed", "pendingMessageConsumed", "pendingMessageRequested", "environmentId", "currentUser", "conversationId", "conversation", "threadId", "isNewConversation", "pendingMessage", "pendingAttachments", "pendingMessageConversationId", "pendingArtifactId", "pendingArtifactConversationId", "pendingArtifactVersionNumber"], [1, "artifact-panel-resize-handle"], [1, "workspace-artifact-panel"], [3, "closed", "navigateToLink", "shareRequested", "maximizeToggled", "applyFormRequested", "artifactId", "currentUser", "environmentId", "versionNumber", "showSaveToCollection", "viewContext", "contextCollectionId", "canShare", "canEdit", "isMaximized"], [1, "artifact-panel-resize-handle", 3, "mousedown"]], template: function ConversationWorkspaceComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1263
1823
|
i0.ɵɵelementStart(0, "div", 0);
|
|
1264
1824
|
i0.ɵɵlistener("searchTriggered", function ConversationWorkspaceComponent_Template_div_searchTriggered_0_listener() { return ctx.openSearch(); });
|
|
1265
1825
|
i0.ɵɵelementStart(1, "div", 1)(2, "mj-conversation-navigation", 2);
|
|
@@ -1291,42 +1851,78 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
1291
1851
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ConversationWorkspaceComponent, [{
|
|
1292
1852
|
type: Component,
|
|
1293
1853
|
args: [{ standalone: false, selector: 'mj-conversation-workspace', template: "<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>", styles: [".conversation-workspace {\n display: flex;\n flex-direction: column;\n height: 100%; /* Fill parent container - works in any context (tabs, embedded, etc.) */\n min-height: 0; /* Allow flex shrinking in nested flex containers */\n background-color: var(--mj-bg-surface-sunken);\n position: relative;\n}\n\n.workspace-navigation {\n flex-shrink: 0;\n height: 48px;\n background-color: var(--mj-text-primary);\n border-bottom: 1px solid color-mix(in srgb, var(--mj-text-inverse) 10%, transparent);\n}\n\n.workspace-content {\n flex: 1;\n display: flex;\n overflow: hidden;\n min-height: 0;\n position: relative;\n}\n\n.workspace-sidebar {\n flex-shrink: 0;\n background-color: var(--mj-text-primary);\n border-right: 1px solid var(--mj-border-default);\n overflow-y: auto;\n transition: width 0.3s ease;\n}\n\n/* Disable transitions during initial load to prevent jarring animation */\n.workspace-sidebar.no-transition {\n transition: none !important;\n}\n\n.workspace-sidebar.collapsed {\n width: 0 !important;\n min-width: 0;\n border-right: none;\n overflow: hidden;\n}\n\n/* Floating toggle button (only visible when sidebar is collapsed) */\n.sidebar-floating-toggle {\n position: absolute;\n top: 12px;\n left: 12px;\n z-index: 100;\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-text-primary);\n border: 1px solid color-mix(in srgb, var(--mj-text-inverse) 20%, transparent);\n border-radius: 8px;\n cursor: pointer;\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-text-primary) 15%, transparent);\n transition: all 0.2s ease;\n}\n\n.sidebar-floating-toggle:hover {\n background: var(--mj-text-primary);\n border-color: color-mix(in srgb, var(--mj-text-inverse) 30%, transparent);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-text-primary) 20%, transparent);\n transform: scale(1.05);\n}\n\n.sidebar-floating-toggle:active {\n transform: scale(0.98);\n}\n\n.sidebar-floating-toggle i {\n color: color-mix(in srgb, var(--mj-text-inverse) 85%, transparent);\n font-size: 16px;\n transition: color 0.15s ease;\n}\n\n.sidebar-floating-toggle:hover i {\n color: var(--mj-text-inverse);\n}\n\n.sidebar-resize-handle {\n width: 4px;\n background: transparent;\n cursor: ew-resize;\n flex-shrink: 0;\n position: relative;\n transition: background-color 0.2s;\n}\n\n.sidebar-resize-handle:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n.sidebar-resize-handle:active {\n background: var(--mj-brand-primary-hover);\n}\n\n.sidebar-resize-handle::before {\n content: '';\n position: absolute;\n left: -4px;\n right: -4px;\n top: 0;\n bottom: 0;\n cursor: ew-resize;\n}\n\n.workspace-main {\n flex: 1;\n display: flex;\n flex-direction: column;\n background-color: var(--mj-bg-surface-card);\n overflow: hidden;\n min-height: 0;\n}\n\n.workspace-main > mj-conversation-chat-area {\n display: flex;\n flex: 1;\n min-height: 0;\n}\n\n.workspace-artifact-panel {\n flex-shrink: 0;\n background-color: var(--mj-bg-surface-card);\n overflow: hidden;\n min-width: 300px;\n max-width: 70%;\n}\n\n.artifact-panel-resize-handle {\n width: 4px;\n background-color: transparent;\n cursor: ew-resize;\n flex-shrink: 0;\n transition: background-color 0.2s;\n position: relative;\n z-index: 10;\n}\n\n/* Wider hit area for easier grabbing */\n.artifact-panel-resize-handle::before {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n left: -4px;\n right: -4px;\n cursor: ew-resize;\n}\n\n.artifact-panel-resize-handle:hover {\n background-color: var(--mj-brand-primary-hover);\n}\n\n.artifact-panel-resize-handle:active {\n background-color: var(--mj-brand-primary-hover);\n}\n\n/* Maximized artifact panel */\n.workspace-artifact-panel.maximized {\n width: 100% !important;\n max-width: 100%;\n}\n\n/* Compact layout */\n.conversation-workspace[data-layout=\"compact\"] .workspace-sidebar {\n width: 240px;\n}\n\n.conversation-workspace[data-layout=\"compact\"] .workspace-artifact-panel {\n width: 400px;\n}\n\n/* Embedded layout */\n.conversation-workspace[data-layout=\"embedded\"] {\n height: 100%;\n}\n\n.conversation-workspace[data-layout=\"embedded\"] .workspace-navigation {\n height: 48px;\n}\n\n/* Responsive */\n@media (max-width: 1024px) {\n .workspace-sidebar {\n position: absolute;\n left: 0;\n top: 60px;\n bottom: 0;\n z-index: 100;\n box-shadow: 2px 0 8px color-mix(in srgb, var(--mj-text-primary) 10%, transparent);\n }\n\n .workspace-artifact-panel {\n position: fixed;\n right: 0;\n top: 60px;\n bottom: 0;\n z-index: 100;\n box-shadow: -2px 0 8px color-mix(in srgb, var(--mj-text-primary) 10%, transparent);\n }\n}\n\n/* Desktop sidebar toggle animation */\n@media (min-width: 769px) {\n .workspace-sidebar {\n transition: width 0.3s ease, min-width 0.3s ease;\n overflow: hidden;\n }\n\n .workspace-sidebar:not(.open) {\n width: 0 !important;\n min-width: 0;\n border-right: none;\n }\n\n .sidebar-resize-handle {\n transition: opacity 0.3s ease, width 0.3s ease;\n }\n\n .workspace-sidebar:not(.open) ~ .sidebar-resize-handle {\n opacity: 0;\n width: 0;\n pointer-events: none;\n }\n}\n\n/* Mobile adjustments: 481px - 768px */\n@media (max-width: 768px) {\n .workspace-sidebar {\n position: fixed;\n left: 0;\n top: 80px;\n z-index: 1000;\n width: 260px !important;\n height: calc(100vh - 80px);\n transform: translateX(-100%);\n transition: transform 0.3s ease;\n }\n\n .workspace-sidebar.open {\n transform: translateX(0);\n }\n\n .workspace-artifact-panel {\n position: fixed;\n width: 100%;\n left: 0;\n right: 0;\n top: 56px; /* 48px nav + 8px dark strip above blue border */\n bottom: 0;\n z-index: 1000;\n max-width: 100%;\n height: auto;\n }\n\n .sidebar-resize-handle,\n .artifact-panel-resize-handle,\n .sidebar-floating-toggle {\n display: none;\n }\n\n /* Mobile sidebar backdrop */\n .mobile-sidebar-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.3s ease;\n z-index: 999;\n }\n\n .mobile-sidebar-backdrop.visible {\n opacity: 1;\n pointer-events: auto;\n }\n}\n\n/* Small Phone adjustments: <= 480px */\n@media (max-width: 480px) {\n .workspace-navigation {\n height: 48px;\n }\n\n .workspace-sidebar {\n width: 100%;\n }\n}\n\n/* Loading spinner (shown while initializing agents) */\n.workspace-loading {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n width: 100%;\n background: var(--mj-bg-surface-card);\n gap: 1rem;\n}\n\n.loading-spinner {\n font-size: 3rem;\n color: var(--mj-brand-primary);\n}\n\n.workspace-loading p {\n font-size: 1rem;\n color: var(--mj-text-secondary);\n margin: 0;\n}"] }]
|
|
1294
|
-
}], () => [{ type: i1.ArtifactStateService }, { type: i2.CollectionStateService }, { type: i3.ArtifactPermissionService }, { type: i4.MJNotificationService }, { type: i5.ConversationStreamingService }, { type: i6.UICommandHandlerService }, { type: i0.ChangeDetectorRef }], {
|
|
1854
|
+
}], () => [{ type: i1.ArtifactStateService }, { type: i2.CollectionStateService }, { type: i3.ArtifactPermissionService }, { type: i4.MJNotificationService }, { type: i5.ConversationStreamingService }, { type: i6.UICommandHandlerService }, { type: i0.ChangeDetectorRef }], { EnvironmentId: [{
|
|
1855
|
+
type: Input
|
|
1856
|
+
}], environmentId: [{
|
|
1857
|
+
type: Input
|
|
1858
|
+
}], InitialConversationId: [{
|
|
1295
1859
|
type: Input
|
|
1296
1860
|
}], initialConversationId: [{
|
|
1297
1861
|
type: Input
|
|
1862
|
+
}], Layout: [{
|
|
1863
|
+
type: Input
|
|
1298
1864
|
}], layout: [{
|
|
1299
1865
|
type: Input
|
|
1866
|
+
}], CurrentUser: [{
|
|
1867
|
+
type: Input
|
|
1300
1868
|
}], currentUser: [{
|
|
1301
1869
|
type: Input
|
|
1870
|
+
}], ActiveContext: [{
|
|
1871
|
+
type: Input
|
|
1302
1872
|
}], activeContext: [{
|
|
1303
1873
|
type: Input
|
|
1874
|
+
}], ContextItemId: [{
|
|
1875
|
+
type: Input
|
|
1304
1876
|
}], contextItemId: [{
|
|
1305
1877
|
type: Input
|
|
1306
1878
|
}], ShowRoutines: [{
|
|
1307
1879
|
type: Input
|
|
1880
|
+
}], ActiveTabInput: [{
|
|
1881
|
+
type: Input
|
|
1308
1882
|
}], activeTabInput: [{
|
|
1309
1883
|
type: Input
|
|
1884
|
+
}], ActiveConversationInput: [{
|
|
1885
|
+
type: Input
|
|
1310
1886
|
}], activeConversationInput: [{
|
|
1311
1887
|
type: Input
|
|
1888
|
+
}], ActiveCollectionInput: [{
|
|
1889
|
+
type: Input
|
|
1312
1890
|
}], activeCollectionInput: [{
|
|
1313
1891
|
type: Input
|
|
1892
|
+
}], ActiveVersionIdInput: [{
|
|
1893
|
+
type: Input
|
|
1314
1894
|
}], activeVersionIdInput: [{
|
|
1315
1895
|
type: Input
|
|
1896
|
+
}], ActiveTaskInput: [{
|
|
1897
|
+
type: Input
|
|
1316
1898
|
}], activeTaskInput: [{
|
|
1317
1899
|
type: Input
|
|
1900
|
+
}], ConversationChanged: [{
|
|
1901
|
+
type: Output
|
|
1318
1902
|
}], conversationChanged: [{
|
|
1319
1903
|
type: Output
|
|
1904
|
+
}], ArtifactOpened: [{
|
|
1905
|
+
type: Output
|
|
1320
1906
|
}], artifactOpened: [{
|
|
1321
1907
|
type: Output
|
|
1908
|
+
}], NavigationChanged: [{
|
|
1909
|
+
type: Output
|
|
1322
1910
|
}], navigationChanged: [{
|
|
1323
1911
|
type: Output
|
|
1912
|
+
}], NewConversationStarted: [{
|
|
1913
|
+
type: Output
|
|
1324
1914
|
}], newConversationStarted: [{
|
|
1325
1915
|
type: Output
|
|
1916
|
+
}], ActionableCommandExecuted: [{
|
|
1917
|
+
type: Output
|
|
1326
1918
|
}], actionableCommandExecuted: [{
|
|
1327
1919
|
type: Output
|
|
1920
|
+
}], AutomaticCommandExecuted: [{
|
|
1921
|
+
type: Output
|
|
1328
1922
|
}], automaticCommandExecuted: [{
|
|
1329
1923
|
type: Output
|
|
1924
|
+
}], NavigationRequested: [{
|
|
1925
|
+
type: Output
|
|
1330
1926
|
}], navigationRequested: [{
|
|
1331
1927
|
type: Output
|
|
1332
1928
|
}], onWindowResize: [{
|