@memberjunction/ng-conversations 5.40.2 → 5.42.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +57 -0
- package/dist/__tests__/channel-optional-surface.test.d.ts +2 -0
- package/dist/__tests__/channel-optional-surface.test.d.ts.map +1 -0
- package/dist/__tests__/channel-optional-surface.test.js +53 -0
- package/dist/__tests__/channel-optional-surface.test.js.map +1 -0
- package/dist/__tests__/chat-events.test.d.ts +14 -0
- package/dist/__tests__/chat-events.test.d.ts.map +1 -0
- package/dist/__tests__/chat-events.test.js +109 -0
- package/dist/__tests__/chat-events.test.js.map +1 -0
- package/dist/__tests__/conversation-naming.test.d.ts +2 -0
- package/dist/__tests__/conversation-naming.test.d.ts.map +1 -0
- package/dist/__tests__/conversation-naming.test.js +110 -0
- package/dist/__tests__/conversation-naming.test.js.map +1 -0
- package/dist/__tests__/delegation-result-parser.test.d.ts +2 -0
- package/dist/__tests__/delegation-result-parser.test.d.ts.map +1 -0
- package/dist/__tests__/delegation-result-parser.test.js +107 -0
- package/dist/__tests__/delegation-result-parser.test.js.map +1 -0
- package/dist/__tests__/event-wiring.test.d.ts +15 -0
- package/dist/__tests__/event-wiring.test.d.ts.map +1 -0
- package/dist/__tests__/event-wiring.test.js +100 -0
- package/dist/__tests__/event-wiring.test.js.map +1 -0
- package/dist/__tests__/narration-template.test.d.ts +2 -0
- package/dist/__tests__/narration-template.test.d.ts.map +1 -0
- package/dist/__tests__/narration-template.test.js +76 -0
- package/dist/__tests__/narration-template.test.js.map +1 -0
- package/dist/__tests__/realtime-agent-picker-models.test.d.ts +2 -0
- package/dist/__tests__/realtime-agent-picker-models.test.d.ts.map +1 -0
- package/dist/__tests__/realtime-agent-picker-models.test.js +49 -0
- package/dist/__tests__/realtime-agent-picker-models.test.js.map +1 -0
- package/dist/__tests__/realtime-audio-visuals.test.d.ts +2 -0
- package/dist/__tests__/realtime-audio-visuals.test.d.ts.map +1 -0
- package/dist/__tests__/realtime-audio-visuals.test.js +123 -0
- package/dist/__tests__/realtime-audio-visuals.test.js.map +1 -0
- package/dist/__tests__/realtime-delegation-card-cancel.test.d.ts +2 -0
- package/dist/__tests__/realtime-delegation-card-cancel.test.d.ts.map +1 -0
- package/dist/__tests__/realtime-delegation-card-cancel.test.js +48 -0
- package/dist/__tests__/realtime-delegation-card-cancel.test.js.map +1 -0
- package/dist/__tests__/realtime-disclosure.test.d.ts +2 -0
- package/dist/__tests__/realtime-disclosure.test.d.ts.map +1 -0
- package/dist/__tests__/realtime-disclosure.test.js +164 -0
- package/dist/__tests__/realtime-disclosure.test.js.map +1 -0
- package/dist/__tests__/realtime-pairing.test.d.ts +2 -0
- package/dist/__tests__/realtime-pairing.test.d.ts.map +1 -0
- package/dist/__tests__/realtime-pairing.test.js +207 -0
- package/dist/__tests__/realtime-pairing.test.js.map +1 -0
- package/dist/__tests__/realtime-review-lifecycle.test.d.ts +2 -0
- package/dist/__tests__/realtime-review-lifecycle.test.d.ts.map +1 -0
- package/dist/__tests__/realtime-review-lifecycle.test.js +154 -0
- package/dist/__tests__/realtime-review-lifecycle.test.js.map +1 -0
- package/dist/__tests__/realtime-session-cancel-usage.test.d.ts +2 -0
- package/dist/__tests__/realtime-session-cancel-usage.test.d.ts.map +1 -0
- package/dist/__tests__/realtime-session-cancel-usage.test.js +230 -0
- package/dist/__tests__/realtime-session-cancel-usage.test.js.map +1 -0
- package/dist/__tests__/realtime-session-channels.test.d.ts +2 -0
- package/dist/__tests__/realtime-session-channels.test.d.ts.map +1 -0
- package/dist/__tests__/realtime-session-channels.test.js +252 -0
- package/dist/__tests__/realtime-session-channels.test.js.map +1 -0
- package/dist/__tests__/realtime-session-client-tools.test.d.ts +2 -0
- package/dist/__tests__/realtime-session-client-tools.test.d.ts.map +1 -0
- package/dist/__tests__/realtime-session-client-tools.test.js +103 -0
- package/dist/__tests__/realtime-session-client-tools.test.js.map +1 -0
- package/dist/__tests__/realtime-session-minimized.test.d.ts +2 -0
- package/dist/__tests__/realtime-session-minimized.test.d.ts.map +1 -0
- package/dist/__tests__/realtime-session-minimized.test.js +32 -0
- package/dist/__tests__/realtime-session-minimized.test.js.map +1 -0
- package/dist/__tests__/realtime-session-mint.test.d.ts +2 -0
- package/dist/__tests__/realtime-session-mint.test.d.ts.map +1 -0
- package/dist/__tests__/realtime-session-mint.test.js +69 -0
- package/dist/__tests__/realtime-session-mint.test.js.map +1 -0
- package/dist/__tests__/realtime-session-policy.test.d.ts +2 -0
- package/dist/__tests__/realtime-session-policy.test.d.ts.map +1 -0
- package/dist/__tests__/realtime-session-policy.test.js +303 -0
- package/dist/__tests__/realtime-session-policy.test.js.map +1 -0
- package/dist/__tests__/realtime-session-review.service.test.d.ts +2 -0
- package/dist/__tests__/realtime-session-review.service.test.d.ts.map +1 -0
- package/dist/__tests__/realtime-session-review.service.test.js +743 -0
- package/dist/__tests__/realtime-session-review.service.test.js.map +1 -0
- package/dist/__tests__/realtime-session-state.test.d.ts +2 -0
- package/dist/__tests__/realtime-session-state.test.d.ts.map +1 -0
- package/dist/__tests__/realtime-session-state.test.js +83 -0
- package/dist/__tests__/realtime-session-state.test.js.map +1 -0
- package/dist/__tests__/realtime-session-timeline-card.test.d.ts +2 -0
- package/dist/__tests__/realtime-session-timeline-card.test.d.ts.map +1 -0
- package/dist/__tests__/realtime-session-timeline-card.test.js +106 -0
- package/dist/__tests__/realtime-session-timeline-card.test.js.map +1 -0
- package/dist/__tests__/realtime-session-timeline.test.d.ts +2 -0
- package/dist/__tests__/realtime-session-timeline.test.d.ts.map +1 -0
- package/dist/__tests__/realtime-session-timeline.test.js +142 -0
- package/dist/__tests__/realtime-session-timeline.test.js.map +1 -0
- package/dist/__tests__/realtime-sessions-adapter.test.d.ts +19 -0
- package/dist/__tests__/realtime-sessions-adapter.test.d.ts.map +1 -0
- package/dist/__tests__/realtime-sessions-adapter.test.js +188 -0
- package/dist/__tests__/realtime-sessions-adapter.test.js.map +1 -0
- package/dist/__tests__/realtime-surface-panel-prefs.test.d.ts +2 -0
- package/dist/__tests__/realtime-surface-panel-prefs.test.d.ts.map +1 -0
- package/dist/__tests__/realtime-surface-panel-prefs.test.js +100 -0
- package/dist/__tests__/realtime-surface-panel-prefs.test.js.map +1 -0
- package/dist/__tests__/realtime-surface-tabs-model.test.d.ts +2 -0
- package/dist/__tests__/realtime-surface-tabs-model.test.d.ts.map +1 -0
- package/dist/__tests__/realtime-surface-tabs-model.test.js +193 -0
- package/dist/__tests__/realtime-surface-tabs-model.test.js.map +1 -0
- package/dist/__tests__/remote-browser-audio-player.test.d.ts +2 -0
- package/dist/__tests__/remote-browser-audio-player.test.d.ts.map +1 -0
- package/dist/__tests__/remote-browser-audio-player.test.js +137 -0
- package/dist/__tests__/remote-browser-audio-player.test.js.map +1 -0
- package/dist/__tests__/remote-browser-channel.test.d.ts +2 -0
- package/dist/__tests__/remote-browser-channel.test.d.ts.map +1 -0
- package/dist/__tests__/remote-browser-channel.test.js +585 -0
- package/dist/__tests__/remote-browser-channel.test.js.map +1 -0
- package/dist/__tests__/slot-defaults.test.d.ts +24 -0
- package/dist/__tests__/slot-defaults.test.d.ts.map +1 -0
- package/dist/__tests__/slot-defaults.test.js +63 -0
- package/dist/__tests__/slot-defaults.test.js.map +1 -0
- package/dist/__tests__/user-authorization.test.d.ts +2 -0
- package/dist/__tests__/user-authorization.test.d.ts.map +1 -0
- package/dist/__tests__/user-authorization.test.js +97 -0
- package/dist/__tests__/user-authorization.test.js.map +1 -0
- package/dist/__tests__/voice-session-narration.test.d.ts +2 -0
- package/dist/__tests__/voice-session-narration.test.d.ts.map +1 -0
- package/dist/__tests__/voice-session-narration.test.js +609 -0
- package/dist/__tests__/voice-session-narration.test.js.map +1 -0
- package/dist/__tests__/whiteboard-artifact-viewer.test.d.ts +2 -0
- package/dist/__tests__/whiteboard-artifact-viewer.test.d.ts.map +1 -0
- package/dist/__tests__/whiteboard-artifact-viewer.test.js +101 -0
- package/dist/__tests__/whiteboard-artifact-viewer.test.js.map +1 -0
- package/dist/__tests__/whiteboard-channel.test.d.ts +2 -0
- package/dist/__tests__/whiteboard-channel.test.d.ts.map +1 -0
- package/dist/__tests__/whiteboard-channel.test.js +260 -0
- package/dist/__tests__/whiteboard-channel.test.js.map +1 -0
- package/dist/__tests__/whiteboard-restore-state.test.d.ts +2 -0
- package/dist/__tests__/whiteboard-restore-state.test.d.ts.map +1 -0
- package/dist/__tests__/whiteboard-restore-state.test.js +108 -0
- package/dist/__tests__/whiteboard-restore-state.test.js.map +1 -0
- package/dist/lib/components/collection/collections-full-view.component.d.ts +105 -2
- package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collections-full-view.component.js +1378 -489
- package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +209 -3
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.js +924 -350
- package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-list.component.d.ts +98 -5
- package/dist/lib/components/conversation/conversation-list.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-list.component.js +1102 -401
- package/dist/lib/components/conversation/conversation-list.component.js.map +1 -1
- package/dist/lib/components/mention/mention-dropdown.component.js +35 -17
- package/dist/lib/components/mention/mention-dropdown.component.js.map +1 -1
- package/dist/lib/components/mention/mention-editor.component.d.ts +4 -0
- package/dist/lib/components/mention/mention-editor.component.d.ts.map +1 -1
- package/dist/lib/components/mention/mention-editor.component.js +43 -19
- package/dist/lib/components/mention/mention-editor.component.js.map +1 -1
- package/dist/lib/components/message/message-input-box.component.d.ts +17 -1
- package/dist/lib/components/message/message-input-box.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-input-box.component.js +73 -15
- package/dist/lib/components/message/message-input-box.component.js.map +1 -1
- package/dist/lib/components/message/message-input.component.d.ts +142 -6
- package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-input.component.js +328 -82
- package/dist/lib/components/message/message-input.component.js.map +1 -1
- package/dist/lib/components/message/message-item.component.d.ts +28 -3
- package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-item.component.js +180 -108
- package/dist/lib/components/message/message-item.component.js.map +1 -1
- package/dist/lib/components/message/message-list.component.d.ts +81 -2
- package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-list.component.js +252 -87
- package/dist/lib/components/message/message-list.component.js.map +1 -1
- package/dist/lib/components/project/project-form-modal.component.d.ts +5 -1
- package/dist/lib/components/project/project-form-modal.component.d.ts.map +1 -1
- package/dist/lib/components/project/project-form-modal.component.js +104 -85
- package/dist/lib/components/project/project-form-modal.component.js.map +1 -1
- package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts +304 -0
- package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts.map +1 -0
- package/dist/lib/components/realtime/channels/base-realtime-channel-client.js +198 -0
- package/dist/lib/components/realtime/channels/base-realtime-channel-client.js.map +1 -0
- package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.d.ts +25 -0
- package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.d.ts.map +1 -0
- package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.js +140 -0
- package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.js.map +1 -0
- package/dist/lib/components/realtime/channels/realtime-channel-pane.component.d.ts +35 -0
- package/dist/lib/components/realtime/channels/realtime-channel-pane.component.d.ts.map +1 -0
- package/dist/lib/components/realtime/channels/realtime-channel-pane.component.js +58 -0
- package/dist/lib/components/realtime/channels/realtime-channel-pane.component.js.map +1 -0
- package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts +63 -0
- package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts.map +1 -0
- package/dist/lib/components/realtime/realtime-activity-rail.component.js +260 -0
- package/dist/lib/components/realtime/realtime-activity-rail.component.js.map +1 -0
- package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts +117 -0
- package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts.map +1 -0
- package/dist/lib/components/realtime/realtime-agent-banner.component.js +504 -0
- package/dist/lib/components/realtime/realtime-agent-banner.component.js.map +1 -0
- package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts +179 -0
- package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts.map +1 -0
- package/dist/lib/components/realtime/realtime-agent-picker.component.js +634 -0
- package/dist/lib/components/realtime/realtime-agent-picker.component.js.map +1 -0
- package/dist/lib/components/realtime/realtime-audio-visuals.d.ts +97 -0
- package/dist/lib/components/realtime/realtime-audio-visuals.d.ts.map +1 -0
- package/dist/lib/components/realtime/realtime-audio-visuals.js +139 -0
- package/dist/lib/components/realtime/realtime-audio-visuals.js.map +1 -0
- package/dist/lib/components/realtime/realtime-channel-strip.component.d.ts +29 -0
- package/dist/lib/components/realtime/realtime-channel-strip.component.d.ts.map +1 -0
- package/dist/lib/components/realtime/realtime-channel-strip.component.js +69 -0
- package/dist/lib/components/realtime/realtime-channel-strip.component.js.map +1 -0
- package/dist/lib/components/realtime/realtime-composer.component.d.ts +65 -0
- package/dist/lib/components/realtime/realtime-composer.component.d.ts.map +1 -0
- package/dist/lib/components/realtime/realtime-composer.component.js +256 -0
- package/dist/lib/components/realtime/realtime-composer.component.js.map +1 -0
- package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts +71 -0
- package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts.map +1 -0
- package/dist/lib/components/realtime/realtime-delegation-card.component.js +324 -0
- package/dist/lib/components/realtime/realtime-delegation-card.component.js.map +1 -0
- package/dist/lib/components/realtime/realtime-disclosure.d.ts +135 -0
- package/dist/lib/components/realtime/realtime-disclosure.d.ts.map +1 -0
- package/dist/lib/components/realtime/realtime-disclosure.js +188 -0
- package/dist/lib/components/realtime/realtime-disclosure.js.map +1 -0
- package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts +491 -0
- package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts.map +1 -0
- package/dist/lib/components/realtime/realtime-session-overlay.component.js +1274 -0
- package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -0
- package/dist/lib/components/realtime/realtime-session-state.d.ts +191 -0
- package/dist/lib/components/realtime/realtime-session-state.d.ts.map +1 -0
- package/dist/lib/components/realtime/realtime-session-state.js +244 -0
- package/dist/lib/components/realtime/realtime-session-state.js.map +1 -0
- package/dist/lib/components/realtime/realtime-session-thread.component.d.ts +56 -0
- package/dist/lib/components/realtime/realtime-session-thread.component.d.ts.map +1 -0
- package/dist/lib/components/realtime/realtime-session-thread.component.js +246 -0
- package/dist/lib/components/realtime/realtime-session-thread.component.js.map +1 -0
- package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts +51 -0
- package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts.map +1 -0
- package/dist/lib/components/realtime/realtime-session-timeline-card.component.js +193 -0
- package/dist/lib/components/realtime/realtime-session-timeline-card.component.js.map +1 -0
- package/dist/lib/components/realtime/realtime-surface-panel-prefs.d.ts +77 -0
- package/dist/lib/components/realtime/realtime-surface-panel-prefs.d.ts.map +1 -0
- package/dist/lib/components/realtime/realtime-surface-panel-prefs.js +114 -0
- package/dist/lib/components/realtime/realtime-surface-panel-prefs.js.map +1 -0
- package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts +173 -0
- package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts.map +1 -0
- package/dist/lib/components/realtime/realtime-surface-tabs.component.js +496 -0
- package/dist/lib/components/realtime/realtime-surface-tabs.component.js.map +1 -0
- package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts +181 -0
- package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts.map +1 -0
- package/dist/lib/components/realtime/realtime-surface-tabs.model.js +223 -0
- package/dist/lib/components/realtime/realtime-surface-tabs.model.js.map +1 -0
- package/dist/lib/components/realtime/remote-browser/remote-browser-audio-player.d.ts +163 -0
- package/dist/lib/components/realtime/remote-browser/remote-browser-audio-player.d.ts.map +1 -0
- package/dist/lib/components/realtime/remote-browser/remote-browser-audio-player.js +309 -0
- package/dist/lib/components/realtime/remote-browser/remote-browser-audio-player.js.map +1 -0
- package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts +201 -0
- package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts.map +1 -0
- package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js +681 -0
- package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js.map +1 -0
- package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.d.ts +379 -0
- package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.d.ts.map +1 -0
- package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.js +914 -0
- package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.js.map +1 -0
- package/dist/lib/components/realtime/remote-browser/remote-browser-tools.d.ts +87 -0
- package/dist/lib/components/realtime/remote-browser/remote-browser-tools.d.ts.map +1 -0
- package/dist/lib/components/realtime/remote-browser/remote-browser-tools.js +223 -0
- package/dist/lib/components/realtime/remote-browser/remote-browser-tools.js.map +1 -0
- package/dist/lib/components/realtime/whiteboard/whiteboard-artifact-viewer.component.d.ts +48 -0
- package/dist/lib/components/realtime/whiteboard/whiteboard-artifact-viewer.component.d.ts.map +1 -0
- package/dist/lib/components/realtime/whiteboard/whiteboard-artifact-viewer.component.js +180 -0
- package/dist/lib/components/realtime/whiteboard/whiteboard-artifact-viewer.component.js.map +1 -0
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts +119 -0
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts.map +1 -0
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js +274 -0
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js.map +1 -0
- package/dist/lib/components/slots/mj-chat-agent-presence-default.component.d.ts +11 -0
- package/dist/lib/components/slots/mj-chat-agent-presence-default.component.d.ts.map +1 -0
- package/dist/lib/components/slots/mj-chat-agent-presence-default.component.js +98 -0
- package/dist/lib/components/slots/mj-chat-agent-presence-default.component.js.map +1 -0
- package/dist/lib/components/slots/mj-chat-demonstration-surface-default.component.d.ts +9 -0
- package/dist/lib/components/slots/mj-chat-demonstration-surface-default.component.d.ts.map +1 -0
- package/dist/lib/components/slots/mj-chat-demonstration-surface-default.component.js +35 -0
- package/dist/lib/components/slots/mj-chat-demonstration-surface-default.component.js.map +1 -0
- package/dist/lib/components/slots/mj-chat-empty-state-default.component.d.ts +28 -0
- package/dist/lib/components/slots/mj-chat-empty-state-default.component.d.ts.map +1 -0
- package/dist/lib/components/slots/mj-chat-empty-state-default.component.js +104 -0
- package/dist/lib/components/slots/mj-chat-empty-state-default.component.js.map +1 -0
- package/dist/lib/components/slots/mj-chat-header-default.component.d.ts +11 -0
- package/dist/lib/components/slots/mj-chat-header-default.component.d.ts.map +1 -0
- package/dist/lib/components/slots/mj-chat-header-default.component.js +103 -0
- package/dist/lib/components/slots/mj-chat-header-default.component.js.map +1 -0
- package/dist/lib/components/slots/mj-chat-message-bubble-default.component.d.ts +15 -0
- package/dist/lib/components/slots/mj-chat-message-bubble-default.component.d.ts.map +1 -0
- package/dist/lib/components/slots/mj-chat-message-bubble-default.component.js +73 -0
- package/dist/lib/components/slots/mj-chat-message-bubble-default.component.js.map +1 -0
- package/dist/lib/components/slots/mj-chat-message-extra-default.component.d.ts +9 -0
- package/dist/lib/components/slots/mj-chat-message-extra-default.component.d.ts.map +1 -0
- package/dist/lib/components/slots/mj-chat-message-extra-default.component.js +34 -0
- package/dist/lib/components/slots/mj-chat-message-extra-default.component.js.map +1 -0
- package/dist/lib/components/slots/slot-interfaces.d.ts +95 -0
- package/dist/lib/components/slots/slot-interfaces.d.ts.map +1 -0
- package/dist/lib/components/slots/slot-interfaces.js +18 -0
- package/dist/lib/components/slots/slot-interfaces.js.map +1 -0
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts +15 -0
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.js +41 -12
- package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
- package/dist/lib/conversations.module.d.ts +12 -1
- package/dist/lib/conversations.module.d.ts.map +1 -1
- package/dist/lib/conversations.module.js +93 -5
- package/dist/lib/conversations.module.js.map +1 -1
- package/dist/lib/directives/chat-slot.directive.d.ts +44 -0
- package/dist/lib/directives/chat-slot.directive.d.ts.map +1 -0
- package/dist/lib/directives/chat-slot.directive.js +54 -0
- package/dist/lib/directives/chat-slot.directive.js.map +1 -0
- package/dist/lib/events/chat-events.d.ts +137 -0
- package/dist/lib/events/chat-events.d.ts.map +1 -0
- package/dist/lib/events/chat-events.js +189 -0
- package/dist/lib/events/chat-events.js.map +1 -0
- package/dist/lib/models/conversation-state.model.d.ts +2 -1
- 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/services/artifact-state.service.d.ts +1 -1
- package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
- package/dist/lib/services/artifact-state.service.js +29 -7
- package/dist/lib/services/artifact-state.service.js.map +1 -1
- package/dist/lib/services/conversation-agent.service.d.ts +60 -74
- package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-agent.service.js +100 -313
- package/dist/lib/services/conversation-agent.service.js.map +1 -1
- package/dist/lib/services/conversation-bridge.service.d.ts +11 -70
- package/dist/lib/services/conversation-bridge.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-bridge.service.js +51 -85
- package/dist/lib/services/conversation-bridge.service.js.map +1 -1
- package/dist/lib/services/conversation-naming.d.ts +63 -0
- package/dist/lib/services/conversation-naming.d.ts.map +1 -0
- package/dist/lib/services/conversation-naming.js +58 -0
- package/dist/lib/services/conversation-naming.js.map +1 -0
- package/dist/lib/services/conversation-streaming.service.d.ts +24 -154
- package/dist/lib/services/conversation-streaming.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-streaming.service.js +39 -361
- package/dist/lib/services/conversation-streaming.service.js.map +1 -1
- package/dist/lib/services/conversations-runtime-bootstrap.service.d.ts +10 -0
- package/dist/lib/services/conversations-runtime-bootstrap.service.d.ts.map +1 -0
- package/dist/lib/services/conversations-runtime-bootstrap.service.js +104 -0
- package/dist/lib/services/conversations-runtime-bootstrap.service.js.map +1 -0
- package/dist/lib/services/delegation-result-parser.d.ts +45 -0
- package/dist/lib/services/delegation-result-parser.d.ts.map +1 -0
- package/dist/lib/services/delegation-result-parser.js +48 -0
- package/dist/lib/services/delegation-result-parser.js.map +1 -0
- package/dist/lib/services/mention-autocomplete.service.d.ts +19 -4
- package/dist/lib/services/mention-autocomplete.service.d.ts.map +1 -1
- package/dist/lib/services/mention-autocomplete.service.js +65 -4
- package/dist/lib/services/mention-autocomplete.service.js.map +1 -1
- package/dist/lib/services/mention-parser.service.d.ts +8 -53
- package/dist/lib/services/mention-parser.service.d.ts.map +1 -1
- package/dist/lib/services/mention-parser.service.js +32 -243
- package/dist/lib/services/mention-parser.service.js.map +1 -1
- package/dist/lib/services/narration-template.d.ts +42 -0
- package/dist/lib/services/narration-template.d.ts.map +1 -0
- package/dist/lib/services/narration-template.js +73 -0
- package/dist/lib/services/narration-template.js.map +1 -0
- package/dist/lib/services/realtime-pairing.d.ts +121 -0
- package/dist/lib/services/realtime-pairing.d.ts.map +1 -0
- package/dist/lib/services/realtime-pairing.js +160 -0
- package/dist/lib/services/realtime-pairing.js.map +1 -0
- package/dist/lib/services/realtime-session-review.service.d.ts +233 -0
- package/dist/lib/services/realtime-session-review.service.d.ts.map +1 -0
- package/dist/lib/services/realtime-session-review.service.js +417 -0
- package/dist/lib/services/realtime-session-review.service.js.map +1 -0
- package/dist/lib/services/realtime-session.service.d.ts +739 -0
- package/dist/lib/services/realtime-session.service.d.ts.map +1 -0
- package/dist/lib/services/realtime-session.service.js +1647 -0
- package/dist/lib/services/realtime-session.service.js.map +1 -0
- package/dist/lib/services/realtime-sessions-adapter.d.ts +54 -0
- package/dist/lib/services/realtime-sessions-adapter.d.ts.map +1 -0
- package/dist/lib/services/realtime-sessions-adapter.js +154 -0
- package/dist/lib/services/realtime-sessions-adapter.js.map +1 -0
- package/dist/lib/services/user-authorization.d.ts +67 -0
- package/dist/lib/services/user-authorization.d.ts.map +1 -0
- package/dist/lib/services/user-authorization.js +66 -0
- package/dist/lib/services/user-authorization.js.map +1 -0
- package/dist/lib/utils/realtime-session-timeline.d.ts +84 -0
- package/dist/lib/utils/realtime-session-timeline.d.ts.map +1 -0
- package/dist/lib/utils/realtime-session-timeline.js +94 -0
- package/dist/lib/utils/realtime-session-timeline.js.map +1 -0
- package/dist/public-api.d.ts +41 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +50 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +27 -24
- package/dist/__tests__/conversation-bridge.service.test.d.ts +0 -2
- package/dist/__tests__/conversation-bridge.service.test.d.ts.map +0 -1
- package/dist/__tests__/conversation-bridge.service.test.js +0 -98
- package/dist/__tests__/conversation-bridge.service.test.js.map +0 -1
- package/dist/__tests__/mention-parser.test.d.ts +0 -2
- package/dist/__tests__/mention-parser.test.d.ts.map +0 -1
- package/dist/__tests__/mention-parser.test.js +0 -154
- package/dist/__tests__/mention-parser.test.js.map +0 -1
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Bubble-style default for the `messageRenderer` slot.
|
|
3
|
+
*
|
|
4
|
+
* Renders a single message as a side-aligned colored bubble — user on the right,
|
|
5
|
+
* agent on the left. Identity comes from side + shape (not avatar + name +
|
|
6
|
+
* timestamp), matching the iMessage / WhatsApp paradigm that downstream
|
|
7
|
+
* tutor-shaped surfaces (Sid, Betty v2, etc.) want.
|
|
8
|
+
*
|
|
9
|
+
* Colors come from the `--mj-chat-bubble-{user,agent}-{bg,text}` tokens (loaded
|
|
10
|
+
* at document level by `ConversationsRuntimeBootstrap`) with semantic-token
|
|
11
|
+
* fallbacks. Consumer themes override the chat tokens to reskin without
|
|
12
|
+
* touching this component.
|
|
13
|
+
*
|
|
14
|
+
* Intentionally minimal — text content only. Consumers wanting richer rendering
|
|
15
|
+
* (markdown, embedded artifacts, attachments, per-message decorations) subclass
|
|
16
|
+
* this component, override the template fragment they want, and project the
|
|
17
|
+
* subclass into the `messageRenderer` slot.
|
|
18
|
+
*
|
|
19
|
+
* NOTE: this component is exported but does not auto-replace the existing
|
|
20
|
+
* feed-style rendering. It only renders when a consumer explicitly projects
|
|
21
|
+
* it via `<ng-template mjChatSlot="messageRenderer" let-message>...</ng-template>`
|
|
22
|
+
* once the slot template visual integration follow-up wires `messageRenderer`
|
|
23
|
+
* into the chat-area's message list.
|
|
24
|
+
*
|
|
25
|
+
* @module @memberjunction/ng-conversations
|
|
26
|
+
*/
|
|
27
|
+
import { Component, Input } from '@angular/core';
|
|
28
|
+
import { CommonModule } from '@angular/common';
|
|
29
|
+
import * as i0 from "@angular/core";
|
|
30
|
+
export class MJChatMessageBubbleDefaultComponent {
|
|
31
|
+
Message = null;
|
|
32
|
+
/**
|
|
33
|
+
* `true` for messages authored by the conversation participant ("User" role).
|
|
34
|
+
* Drives side-alignment and which color token applies. Falls back to `false`
|
|
35
|
+
* (agent / left-aligned) for any non-User role, including null and unknown.
|
|
36
|
+
*/
|
|
37
|
+
get IsUser() {
|
|
38
|
+
return this.Message?.Role === 'User';
|
|
39
|
+
}
|
|
40
|
+
static ɵfac = function MJChatMessageBubbleDefaultComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MJChatMessageBubbleDefaultComponent)(); };
|
|
41
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJChatMessageBubbleDefaultComponent, selectors: [["mj-chat-message-bubble-default"]], inputs: { Message: "Message" }, decls: 3, vars: 7, consts: [[1, "mj-chat-bubble-row"], [1, "mj-chat-bubble"]], template: function MJChatMessageBubbleDefaultComponent_Template(rf, ctx) { if (rf & 1) {
|
|
42
|
+
i0.ɵɵdomElementStart(0, "div", 0)(1, "div", 1);
|
|
43
|
+
i0.ɵɵtext(2);
|
|
44
|
+
i0.ɵɵdomElementEnd()();
|
|
45
|
+
} if (rf & 2) {
|
|
46
|
+
i0.ɵɵclassProp("mj-chat-bubble-row--user", ctx.IsUser);
|
|
47
|
+
i0.ɵɵadvance();
|
|
48
|
+
i0.ɵɵclassProp("mj-chat-bubble--user", ctx.IsUser)("mj-chat-bubble--agent", !ctx.IsUser);
|
|
49
|
+
i0.ɵɵadvance();
|
|
50
|
+
i0.ɵɵtextInterpolate1(" ", ctx.Message == null ? null : ctx.Message.Message, " ");
|
|
51
|
+
} }, dependencies: [CommonModule], styles: [".mj-chat-bubble-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-start;\n padding: 0.25rem 0.75rem;\n }\n .mj-chat-bubble-row--user[_ngcontent-%COMP%] {\n justify-content: flex-end;\n }\n .mj-chat-bubble[_ngcontent-%COMP%] {\n max-width: 70%;\n padding: 0.625rem 0.875rem;\n border-radius: 1rem;\n word-wrap: break-word;\n white-space: pre-wrap;\n font-size: 0.9375rem;\n line-height: 1.4;\n }\n .mj-chat-bubble--agent[_ngcontent-%COMP%] {\n background: var(--mj-chat-bubble-agent-bg, var(--mj-bg-surface-card));\n color: var(--mj-chat-bubble-agent-text, var(--mj-text-primary));\n border-bottom-left-radius: 0.25rem;\n }\n .mj-chat-bubble--user[_ngcontent-%COMP%] {\n background: var(--mj-chat-bubble-user-bg, var(--mj-brand-primary));\n color: var(--mj-chat-bubble-user-text, var(--mj-text-inverse));\n border-bottom-right-radius: 0.25rem;\n }"] });
|
|
52
|
+
}
|
|
53
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJChatMessageBubbleDefaultComponent, [{
|
|
54
|
+
type: Component,
|
|
55
|
+
args: [{ selector: 'mj-chat-message-bubble-default', standalone: true, imports: [CommonModule], template: `
|
|
56
|
+
<div
|
|
57
|
+
class="mj-chat-bubble-row"
|
|
58
|
+
[class.mj-chat-bubble-row--user]="IsUser"
|
|
59
|
+
>
|
|
60
|
+
<div
|
|
61
|
+
class="mj-chat-bubble"
|
|
62
|
+
[class.mj-chat-bubble--user]="IsUser"
|
|
63
|
+
[class.mj-chat-bubble--agent]="!IsUser"
|
|
64
|
+
>
|
|
65
|
+
{{ Message?.Message }}
|
|
66
|
+
</div>
|
|
67
|
+
</div>
|
|
68
|
+
`, styles: ["\n .mj-chat-bubble-row {\n display: flex;\n justify-content: flex-start;\n padding: 0.25rem 0.75rem;\n }\n .mj-chat-bubble-row--user {\n justify-content: flex-end;\n }\n .mj-chat-bubble {\n max-width: 70%;\n padding: 0.625rem 0.875rem;\n border-radius: 1rem;\n word-wrap: break-word;\n white-space: pre-wrap;\n font-size: 0.9375rem;\n line-height: 1.4;\n }\n .mj-chat-bubble--agent {\n background: var(--mj-chat-bubble-agent-bg, var(--mj-bg-surface-card));\n color: var(--mj-chat-bubble-agent-text, var(--mj-text-primary));\n border-bottom-left-radius: 0.25rem;\n }\n .mj-chat-bubble--user {\n background: var(--mj-chat-bubble-user-bg, var(--mj-brand-primary));\n color: var(--mj-chat-bubble-user-text, var(--mj-text-inverse));\n border-bottom-right-radius: 0.25rem;\n }\n "] }]
|
|
69
|
+
}], null, { Message: [{
|
|
70
|
+
type: Input
|
|
71
|
+
}] }); })();
|
|
72
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJChatMessageBubbleDefaultComponent, { className: "MJChatMessageBubbleDefaultComponent", filePath: "src/lib/components/slots/mj-chat-message-bubble-default.component.ts", lineNumber: 84 }); })();
|
|
73
|
+
//# sourceMappingURL=mj-chat-message-bubble-default.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mj-chat-message-bubble-default.component.js","sourceRoot":"","sources":["../../../../src/lib/components/slots/mj-chat-message-bubble-default.component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;;AAuD/C,MAAM,OAAO,mCAAmC;IAC5B,OAAO,GAAsC,IAAI,CAAC;IAElE;;;;OAIG;IACH,IAAW,MAAM;QACb,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK,MAAM,CAAC;IACzC,CAAC;6HAVQ,mCAAmC;6DAAnC,mCAAmC;YAzCpC,AAJJ,iCAGC,aAKI;YACG,YACJ;YACJ,AADI,oBAAM,EACJ;;YATF,sDAAyC;YAIrC,cAAqC;YACrC,AADA,kDAAqC,sCACE;YAEvC,cACJ;YADI,iFACJ;4BAZE,YAAY;;iFA+Cb,mCAAmC;cAlD/C,SAAS;2BACI,gCAAgC,cAC9B,IAAI,WACP,CAAC,YAAY,CAAC,YACb;;;;;;;;;;;;;KAaT;;kBAkCA,KAAK;;kFADG,mCAAmC","sourcesContent":["/**\n * @fileoverview Bubble-style default for the `messageRenderer` slot.\n *\n * Renders a single message as a side-aligned colored bubble — user on the right,\n * agent on the left. Identity comes from side + shape (not avatar + name +\n * timestamp), matching the iMessage / WhatsApp paradigm that downstream\n * tutor-shaped surfaces (Sid, Betty v2, etc.) want.\n *\n * Colors come from the `--mj-chat-bubble-{user,agent}-{bg,text}` tokens (loaded\n * at document level by `ConversationsRuntimeBootstrap`) with semantic-token\n * fallbacks. Consumer themes override the chat tokens to reskin without\n * touching this component.\n *\n * Intentionally minimal — text content only. Consumers wanting richer rendering\n * (markdown, embedded artifacts, attachments, per-message decorations) subclass\n * this component, override the template fragment they want, and project the\n * subclass into the `messageRenderer` slot.\n *\n * NOTE: this component is exported but does not auto-replace the existing\n * feed-style rendering. It only renders when a consumer explicitly projects\n * it via `<ng-template mjChatSlot=\"messageRenderer\" let-message>...</ng-template>`\n * once the slot template visual integration follow-up wires `messageRenderer`\n * into the chat-area's message list.\n *\n * @module @memberjunction/ng-conversations\n */\n\nimport { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport type { MJConversationDetailEntity } from '@memberjunction/core-entities';\n\nimport type { IMJChatMessageRendererComponent } from './slot-interfaces';\n\n@Component({\n selector: 'mj-chat-message-bubble-default',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div\n class=\"mj-chat-bubble-row\"\n [class.mj-chat-bubble-row--user]=\"IsUser\"\n >\n <div\n class=\"mj-chat-bubble\"\n [class.mj-chat-bubble--user]=\"IsUser\"\n [class.mj-chat-bubble--agent]=\"!IsUser\"\n >\n {{ Message?.Message }}\n </div>\n </div>\n `,\n styles: [\n `\n .mj-chat-bubble-row {\n display: flex;\n justify-content: flex-start;\n padding: 0.25rem 0.75rem;\n }\n .mj-chat-bubble-row--user {\n justify-content: flex-end;\n }\n .mj-chat-bubble {\n max-width: 70%;\n padding: 0.625rem 0.875rem;\n border-radius: 1rem;\n word-wrap: break-word;\n white-space: pre-wrap;\n font-size: 0.9375rem;\n line-height: 1.4;\n }\n .mj-chat-bubble--agent {\n background: var(--mj-chat-bubble-agent-bg, var(--mj-bg-surface-card));\n color: var(--mj-chat-bubble-agent-text, var(--mj-text-primary));\n border-bottom-left-radius: 0.25rem;\n }\n .mj-chat-bubble--user {\n background: var(--mj-chat-bubble-user-bg, var(--mj-brand-primary));\n color: var(--mj-chat-bubble-user-text, var(--mj-text-inverse));\n border-bottom-right-radius: 0.25rem;\n }\n `,\n ],\n})\nexport class MJChatMessageBubbleDefaultComponent implements IMJChatMessageRendererComponent {\n @Input() public Message: MJConversationDetailEntity | null = null;\n\n /**\n * `true` for messages authored by the conversation participant (\"User\" role).\n * Drives side-alignment and which color token applies. Falls back to `false`\n * (agent / left-aligned) for any non-User role, including null and unknown.\n */\n public get IsUser(): boolean {\n return this.Message?.Role === 'User';\n }\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { MJConversationDetailEntity } from '@memberjunction/core-entities';
|
|
2
|
+
import type { IMJChatMessageExtraComponent } from './slot-interfaces';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare class MJChatMessageExtraDefaultComponent implements IMJChatMessageExtraComponent {
|
|
5
|
+
Message: MJConversationDetailEntity;
|
|
6
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<MJChatMessageExtraDefaultComponent, never>;
|
|
7
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<MJChatMessageExtraDefaultComponent, "mj-chat-message-extra-default", never, { "Message": { "alias": "Message"; "required": false; }; }, {}, never, never, true, never>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=mj-chat-message-extra-default.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mj-chat-message-extra-default.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/slots/mj-chat-message-extra-default.component.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAEhF,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;;AAEtE,qBAMa,kCAAmC,YAAW,4BAA4B;IACnE,OAAO,EAAG,0BAA0B,CAAC;yCAD5C,kCAAkC;2CAAlC,kCAAkC;CAE9C"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Default `messageExtra` slot component — no-op by default.
|
|
3
|
+
*
|
|
4
|
+
* The per-message inline-decoration slot is OFF by default in the chat-area
|
|
5
|
+
* (rendering nothing extra after each message bubble). Consumers project their
|
|
6
|
+
* own template (e.g., a tutor "walked through" badge) or subclass this default
|
|
7
|
+
* to add per-message UI.
|
|
8
|
+
*
|
|
9
|
+
* The default exists primarily so subclasses have a base to extend; in normal
|
|
10
|
+
* operation it renders nothing.
|
|
11
|
+
*
|
|
12
|
+
* @module @memberjunction/ng-conversations
|
|
13
|
+
*/
|
|
14
|
+
import { Component, Input } from '@angular/core';
|
|
15
|
+
import { CommonModule } from '@angular/common';
|
|
16
|
+
import * as i0 from "@angular/core";
|
|
17
|
+
export class MJChatMessageExtraDefaultComponent {
|
|
18
|
+
Message;
|
|
19
|
+
static ɵfac = function MJChatMessageExtraDefaultComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MJChatMessageExtraDefaultComponent)(); };
|
|
20
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJChatMessageExtraDefaultComponent, selectors: [["mj-chat-message-extra-default"]], inputs: { Message: "Message" }, decls: 0, vars: 0, template: function MJChatMessageExtraDefaultComponent_Template(rf, ctx) { }, dependencies: [CommonModule], encapsulation: 2 });
|
|
21
|
+
}
|
|
22
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJChatMessageExtraDefaultComponent, [{
|
|
23
|
+
type: Component,
|
|
24
|
+
args: [{
|
|
25
|
+
selector: 'mj-chat-message-extra-default',
|
|
26
|
+
standalone: true,
|
|
27
|
+
imports: [CommonModule],
|
|
28
|
+
template: ``,
|
|
29
|
+
}]
|
|
30
|
+
}], null, { Message: [{
|
|
31
|
+
type: Input
|
|
32
|
+
}] }); })();
|
|
33
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJChatMessageExtraDefaultComponent, { className: "MJChatMessageExtraDefaultComponent", filePath: "src/lib/components/slots/mj-chat-message-extra-default.component.ts", lineNumber: 27 }); })();
|
|
34
|
+
//# sourceMappingURL=mj-chat-message-extra-default.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mj-chat-message-extra-default.component.js","sourceRoot":"","sources":["../../../../src/lib/components/slots/mj-chat-message-extra-default.component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;;AAW/C,MAAM,OAAO,kCAAkC;IAC3B,OAAO,CAA8B;4HAD5C,kCAAkC;6DAAlC,kCAAkC,iMAHjC,YAAY;;iFAGb,kCAAkC;cAN9C,SAAS;eAAC;gBACP,QAAQ,EAAE,+BAA+B;gBACzC,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,CAAC,YAAY,CAAC;gBACvB,QAAQ,EAAE,EAAE;aACf;;kBAEI,KAAK;;kFADG,kCAAkC","sourcesContent":["/**\n * @fileoverview Default `messageExtra` slot component — no-op by default.\n *\n * The per-message inline-decoration slot is OFF by default in the chat-area\n * (rendering nothing extra after each message bubble). Consumers project their\n * own template (e.g., a tutor \"walked through\" badge) or subclass this default\n * to add per-message UI.\n *\n * The default exists primarily so subclasses have a base to extend; in normal\n * operation it renders nothing.\n *\n * @module @memberjunction/ng-conversations\n */\n\nimport { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport type { MJConversationDetailEntity } from '@memberjunction/core-entities';\n\nimport type { IMJChatMessageExtraComponent } from './slot-interfaces';\n\n@Component({\n selector: 'mj-chat-message-extra-default',\n standalone: true,\n imports: [CommonModule],\n template: ``,\n})\nexport class MJChatMessageExtraDefaultComponent implements IMJChatMessageExtraComponent {\n @Input() public Message!: MJConversationDetailEntity;\n}\n"]}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Interface contracts for the chat-area's slot system.
|
|
3
|
+
*
|
|
4
|
+
* Each slot has a typed interface so the widget can speak with confidence to
|
|
5
|
+
* whatever component (default or consumer-supplied) is rendered into it. Each
|
|
6
|
+
* interface is paired with an exported standalone default component (in
|
|
7
|
+
* `*-default.component.ts` siblings) that consumers can:
|
|
8
|
+
*
|
|
9
|
+
* 1. **Project an ad-hoc template into**, via the `mjChatSlot` directive.
|
|
10
|
+
* 2. **Wrap with a containment pattern** — render the default inside their own
|
|
11
|
+
* component to add framing without losing the default behavior.
|
|
12
|
+
* 3. **Subclass** — extend the default standalone component, override only what
|
|
13
|
+
* they need, declare the subclass as the slot's component.
|
|
14
|
+
*
|
|
15
|
+
* @module @memberjunction/ng-conversations
|
|
16
|
+
*/
|
|
17
|
+
import type { EventEmitter } from '@angular/core';
|
|
18
|
+
import type { MJConversationDetailEntity } from '@memberjunction/core-entities';
|
|
19
|
+
/** State surfaced to the agent-presence slot for visualization. */
|
|
20
|
+
export type MJChatAgentPresenceState = 'idle' | 'listening' | 'thinking' | 'speaking';
|
|
21
|
+
/** Contract for the `emptyState` slot — what renders before any messages exist. */
|
|
22
|
+
export interface IMJChatEmptyStateComponent {
|
|
23
|
+
/** Top-line welcome text. */
|
|
24
|
+
Greeting: string;
|
|
25
|
+
/** Optional secondary line beneath the greeting. */
|
|
26
|
+
Subtext?: string;
|
|
27
|
+
/** Optional suggested prompts to render as clickable chips. */
|
|
28
|
+
SuggestedPrompts?: string[];
|
|
29
|
+
/** Emitted when the user selects one of the suggested prompts. */
|
|
30
|
+
PromptSelected: EventEmitter<string>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Contract for the `agentPresence` slot — character / avatar / voice-state
|
|
34
|
+
* visualization, rendered alongside the chat composer.
|
|
35
|
+
*/
|
|
36
|
+
export interface IMJChatAgentPresenceComponent {
|
|
37
|
+
State: MJChatAgentPresenceState;
|
|
38
|
+
/** Display name of the agent, e.g., "Sage" or "Sid". */
|
|
39
|
+
AgentName?: string;
|
|
40
|
+
/** Optional avatar image URL. */
|
|
41
|
+
AvatarUrl?: string;
|
|
42
|
+
/** Visual intensity — subtle for production chat, prominent for tutor surfaces. */
|
|
43
|
+
Mode?: 'subtle' | 'prominent';
|
|
44
|
+
}
|
|
45
|
+
/** Contract for the `header` slot — top bar above the message list. */
|
|
46
|
+
export interface IMJChatHeaderComponent {
|
|
47
|
+
ConversationTitle?: string | null;
|
|
48
|
+
SharedBy?: string | null;
|
|
49
|
+
/** Number of artifacts on the conversation (for an inline badge). */
|
|
50
|
+
ArtifactCount?: number;
|
|
51
|
+
/** Pass-through whether the artifact-count chip should render at all. */
|
|
52
|
+
ShowArtifactIndicator?: boolean;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Contract for the `messageExtra` slot — per-message inline decoration rendered
|
|
56
|
+
* within the message bubble, after the content.
|
|
57
|
+
*/
|
|
58
|
+
export interface IMJChatMessageExtraComponent {
|
|
59
|
+
Message: MJConversationDetailEntity;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Contract for the `demonstrationSurface` slot — full-width adjacent surface
|
|
63
|
+
* for content the agent is "walking through" (e.g., annotated lesson material,
|
|
64
|
+
* step-by-step screenshots). Off unless a slot is supplied.
|
|
65
|
+
*/
|
|
66
|
+
export interface IMJChatDemonstrationSurfaceComponent {
|
|
67
|
+
/** Optional content payload — shape is consumer-defined. */
|
|
68
|
+
Content?: unknown;
|
|
69
|
+
/** Whether the surface should be visible. */
|
|
70
|
+
Visible?: boolean;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Contract for the `messageRenderer` slot — per-item template applied to every
|
|
74
|
+
* message in the list. Unlike the other slots (which replace a fixed positional
|
|
75
|
+
* zone), `messageRenderer` is invoked once per message via `*ngTemplateOutlet`
|
|
76
|
+
* with the message as the implicit context (`let-message`).
|
|
77
|
+
*
|
|
78
|
+
* Lets consumers swap the entire feed-vs-bubble-vs-anything-else rendering
|
|
79
|
+
* decision without forking. Two default components ship:
|
|
80
|
+
*
|
|
81
|
+
* • `MJChatMessageFeedDefaultComponent` — the existing avatar+name+timestamp
|
|
82
|
+
* feed layout (current behavior; default when no slot is supplied).
|
|
83
|
+
* • `MJChatMessageBubbleDefaultComponent` — bubble layout where identity
|
|
84
|
+
* comes from side + shape (user on right, agent on left), using the
|
|
85
|
+
* `--mj-chat-bubble-*` tokens for color.
|
|
86
|
+
*
|
|
87
|
+
* Implementing components keep the contract minimal — just receive the message
|
|
88
|
+
* entity and render however they want. Subclasses extend a default to inherit
|
|
89
|
+
* its shell and override specific behavior.
|
|
90
|
+
*/
|
|
91
|
+
export interface IMJChatMessageRendererComponent {
|
|
92
|
+
/** The conversation detail row to render. */
|
|
93
|
+
Message: import('@memberjunction/core-entities').MJConversationDetailEntity | null;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=slot-interfaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slot-interfaces.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/slots/slot-interfaces.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAEhF,mEAAmE;AACnE,MAAM,MAAM,wBAAwB,GAAG,MAAM,GAAG,WAAW,GAAG,UAAU,GAAG,UAAU,CAAC;AAEtF,mFAAmF;AACnF,MAAM,WAAW,0BAA0B;IACvC,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,kEAAkE;IAClE,cAAc,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;CACxC;AAED;;;GAGG;AACH,MAAM,WAAW,6BAA6B;IAC1C,KAAK,EAAE,wBAAwB,CAAC;IAChC,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mFAAmF;IACnF,IAAI,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC;CACjC;AAED,uEAAuE;AACvE,MAAM,WAAW,sBAAsB;IACnC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,qEAAqE;IACrE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,yEAAyE;IACzE,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED;;;GAGG;AACH,MAAM,WAAW,4BAA4B;IACzC,OAAO,EAAE,0BAA0B,CAAC;CACvC;AAED;;;;GAIG;AACH,MAAM,WAAW,oCAAoC;IACjD,4DAA4D;IAC5D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,+BAA+B;IAC5C,6CAA6C;IAC7C,OAAO,EAAE,OAAO,+BAA+B,EAAE,0BAA0B,GAAG,IAAI,CAAC;CACtF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Interface contracts for the chat-area's slot system.
|
|
3
|
+
*
|
|
4
|
+
* Each slot has a typed interface so the widget can speak with confidence to
|
|
5
|
+
* whatever component (default or consumer-supplied) is rendered into it. Each
|
|
6
|
+
* interface is paired with an exported standalone default component (in
|
|
7
|
+
* `*-default.component.ts` siblings) that consumers can:
|
|
8
|
+
*
|
|
9
|
+
* 1. **Project an ad-hoc template into**, via the `mjChatSlot` directive.
|
|
10
|
+
* 2. **Wrap with a containment pattern** — render the default inside their own
|
|
11
|
+
* component to add framing without losing the default behavior.
|
|
12
|
+
* 3. **Subclass** — extend the default standalone component, override only what
|
|
13
|
+
* they need, declare the subclass as the slot's component.
|
|
14
|
+
*
|
|
15
|
+
* @module @memberjunction/ng-conversations
|
|
16
|
+
*/
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=slot-interfaces.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slot-interfaces.js","sourceRoot":"","sources":["../../../../src/lib/components/slots/slot-interfaces.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG","sourcesContent":["/**\n * @fileoverview Interface contracts for the chat-area's slot system.\n *\n * Each slot has a typed interface so the widget can speak with confidence to\n * whatever component (default or consumer-supplied) is rendered into it. Each\n * interface is paired with an exported standalone default component (in\n * `*-default.component.ts` siblings) that consumers can:\n *\n * 1. **Project an ad-hoc template into**, via the `mjChatSlot` directive.\n * 2. **Wrap with a containment pattern** — render the default inside their own\n * component to add framing without losing the default behavior.\n * 3. **Subclass** — extend the default standalone component, override only what\n * they need, declare the subclass as the slot's component.\n *\n * @module @memberjunction/ng-conversations\n */\n\nimport type { EventEmitter } from '@angular/core';\nimport type { MJConversationDetailEntity } from '@memberjunction/core-entities';\n\n/** State surfaced to the agent-presence slot for visualization. */\nexport type MJChatAgentPresenceState = 'idle' | 'listening' | 'thinking' | 'speaking';\n\n/** Contract for the `emptyState` slot — what renders before any messages exist. */\nexport interface IMJChatEmptyStateComponent {\n /** Top-line welcome text. */\n Greeting: string;\n /** Optional secondary line beneath the greeting. */\n Subtext?: string;\n /** Optional suggested prompts to render as clickable chips. */\n SuggestedPrompts?: string[];\n /** Emitted when the user selects one of the suggested prompts. */\n PromptSelected: EventEmitter<string>;\n}\n\n/**\n * Contract for the `agentPresence` slot — character / avatar / voice-state\n * visualization, rendered alongside the chat composer.\n */\nexport interface IMJChatAgentPresenceComponent {\n State: MJChatAgentPresenceState;\n /** Display name of the agent, e.g., \"Sage\" or \"Sid\". */\n AgentName?: string;\n /** Optional avatar image URL. */\n AvatarUrl?: string;\n /** Visual intensity — subtle for production chat, prominent for tutor surfaces. */\n Mode?: 'subtle' | 'prominent';\n}\n\n/** Contract for the `header` slot — top bar above the message list. */\nexport interface IMJChatHeaderComponent {\n ConversationTitle?: string | null;\n SharedBy?: string | null;\n /** Number of artifacts on the conversation (for an inline badge). */\n ArtifactCount?: number;\n /** Pass-through whether the artifact-count chip should render at all. */\n ShowArtifactIndicator?: boolean;\n}\n\n/**\n * Contract for the `messageExtra` slot — per-message inline decoration rendered\n * within the message bubble, after the content.\n */\nexport interface IMJChatMessageExtraComponent {\n Message: MJConversationDetailEntity;\n}\n\n/**\n * Contract for the `demonstrationSurface` slot — full-width adjacent surface\n * for content the agent is \"walking through\" (e.g., annotated lesson material,\n * step-by-step screenshots). Off unless a slot is supplied.\n */\nexport interface IMJChatDemonstrationSurfaceComponent {\n /** Optional content payload — shape is consumer-defined. */\n Content?: unknown;\n /** Whether the surface should be visible. */\n Visible?: boolean;\n}\n\n/**\n * Contract for the `messageRenderer` slot — per-item template applied to every\n * message in the list. Unlike the other slots (which replace a fixed positional\n * zone), `messageRenderer` is invoked once per message via `*ngTemplateOutlet`\n * with the message as the implicit context (`let-message`).\n *\n * Lets consumers swap the entire feed-vs-bubble-vs-anything-else rendering\n * decision without forking. Two default components ship:\n *\n * • `MJChatMessageFeedDefaultComponent` — the existing avatar+name+timestamp\n * feed layout (current behavior; default when no slot is supplied).\n * • `MJChatMessageBubbleDefaultComponent` — bubble layout where identity\n * comes from side + shape (user on right, agent on left), using the\n * `--mj-chat-bubble-*` tokens for color.\n *\n * Implementing components keep the contract minimal — just receive the message\n * entity and render however they want. Subclasses extend a default to inherit\n * its shell and override specific behavior.\n */\nexport interface IMJChatMessageRendererComponent {\n /** The conversation detail row to render. */\n Message: import('@memberjunction/core-entities').MJConversationDetailEntity | null;\n}\n"]}
|
|
@@ -112,6 +112,10 @@ export declare class ConversationWorkspaceComponent extends BaseAngularComponent
|
|
|
112
112
|
private previousVersionId;
|
|
113
113
|
private previousIsNewConversation;
|
|
114
114
|
private destroy$;
|
|
115
|
+
private readonly boundOnResizeMove;
|
|
116
|
+
private readonly boundOnResizeEnd;
|
|
117
|
+
private readonly boundOnResizeTouchMove;
|
|
118
|
+
private readonly boundOnResizeTouchEnd;
|
|
115
119
|
private readonly USER_SETTING_SIDEBAR_KEY;
|
|
116
120
|
private saveSettingsTimeout;
|
|
117
121
|
private isLoadingSettings;
|
|
@@ -158,6 +162,17 @@ export declare class ConversationWorkspaceComponent extends BaseAngularComponent
|
|
|
158
162
|
* Handler for new conversation creation from chat area
|
|
159
163
|
* Now includes pending message and attachments to ensure atomic state update
|
|
160
164
|
*/
|
|
165
|
+
/**
|
|
166
|
+
* A realtime session created (and just finished with) a brand-new conversation. The
|
|
167
|
+
* row was created SERVER-side, so it isn't in the engine cache yet — reload the list
|
|
168
|
+
* to fold it in, then select it ONLY when the conversation list is visible (owner
|
|
169
|
+
* spec: the user may have the sidebar hidden; don't yank their context if so —
|
|
170
|
+
* the refreshed cache makes it appear whenever the list is reopened).
|
|
171
|
+
*/
|
|
172
|
+
onRealtimeConversationReady(event: {
|
|
173
|
+
conversationId: string;
|
|
174
|
+
select: boolean;
|
|
175
|
+
}): Promise<void>;
|
|
161
176
|
onConversationCreated(event: {
|
|
162
177
|
conversation: MJConversationEntity;
|
|
163
178
|
pendingMessage?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-workspace.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/workspace/conversation-workspace.component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAIL,YAAY,EACZ,MAAM,EACN,SAAS,EACT,OAAO,EACP,iBAAiB,EAElB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"conversation-workspace.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/workspace/conversation-workspace.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
* ============================================================================
|
|
20
20
|
*/
|
|
21
21
|
import { Component, Input, Output, EventEmitter, HostListener } from '@angular/core';
|
|
22
|
+
import { UUIDsEqual } from '@memberjunction/global';
|
|
22
23
|
import { ArtifactMetadataEngine, UserInfoEngine, ConversationEngine } from '@memberjunction/core-entities';
|
|
23
24
|
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
24
25
|
import { Subject, takeUntil } from 'rxjs';
|
|
@@ -101,7 +102,7 @@ function ConversationWorkspaceComponent_Conditional_4_Conditional_6_Template(rf,
|
|
|
101
102
|
function ConversationWorkspaceComponent_Conditional_4_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
102
103
|
const _r8 = i0.ɵɵgetCurrentView();
|
|
103
104
|
i0.ɵɵelementStart(0, "div", 12)(1, "mj-conversation-chat-area", 21);
|
|
104
|
-
i0.ɵɵlistener("conversationRenamed", function ConversationWorkspaceComponent_Conditional_4_Conditional_7_Template_mj_conversation_chat_area_conversationRenamed_1_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onConversationRenamed($event)); })("openEntityRecord", function ConversationWorkspaceComponent_Conditional_4_Conditional_7_Template_mj_conversation_chat_area_openEntityRecord_1_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onOpenEntityRecord($event)); })("navigationRequest", function ConversationWorkspaceComponent_Conditional_4_Conditional_7_Template_mj_conversation_chat_area_navigationRequest_1_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onNavigationRequest($event)); })("taskClicked", function ConversationWorkspaceComponent_Conditional_4_Conditional_7_Template_mj_conversation_chat_area_taskClicked_1_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onTaskClicked($event)); })("artifactLinkClicked", function ConversationWorkspaceComponent_Conditional_4_Conditional_7_Template_mj_conversation_chat_area_artifactLinkClicked_1_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onArtifactLinkNavigation($event)); })("conversationCreated", function ConversationWorkspaceComponent_Conditional_4_Conditional_7_Template_mj_conversation_chat_area_conversationCreated_1_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onConversationCreated($event)); })("threadOpened", function ConversationWorkspaceComponent_Conditional_4_Conditional_7_Template_mj_conversation_chat_area_threadOpened_1_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onThreadOpened($event)); })("threadClosed", function ConversationWorkspaceComponent_Conditional_4_Conditional_7_Template_mj_conversation_chat_area_threadClosed_1_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onThreadClosed()); })("pendingArtifactConsumed", function ConversationWorkspaceComponent_Conditional_4_Conditional_7_Template_mj_conversation_chat_area_pendingArtifactConsumed_1_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); ctx_r1.pendingArtifactId = null; return i0.ɵɵresetView(ctx_r1.pendingArtifactVersionNumber = null); })("pendingMessageConsumed", function ConversationWorkspaceComponent_Conditional_4_Conditional_7_Template_mj_conversation_chat_area_pendingMessageConsumed_1_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); ctx_r1.pendingMessageToSend = null; return i0.ɵɵresetView(ctx_r1.pendingAttachmentsToSend = null); })("pendingMessageRequested", function ConversationWorkspaceComponent_Conditional_4_Conditional_7_Template_mj_conversation_chat_area_pendingMessageRequested_1_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onPendingMessageRequested($event)); });
|
|
105
|
+
i0.ɵɵlistener("conversationRenamed", function ConversationWorkspaceComponent_Conditional_4_Conditional_7_Template_mj_conversation_chat_area_conversationRenamed_1_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onConversationRenamed($event)); })("openEntityRecord", function ConversationWorkspaceComponent_Conditional_4_Conditional_7_Template_mj_conversation_chat_area_openEntityRecord_1_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onOpenEntityRecord($event)); })("navigationRequest", function ConversationWorkspaceComponent_Conditional_4_Conditional_7_Template_mj_conversation_chat_area_navigationRequest_1_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onNavigationRequest($event)); })("taskClicked", function ConversationWorkspaceComponent_Conditional_4_Conditional_7_Template_mj_conversation_chat_area_taskClicked_1_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onTaskClicked($event)); })("artifactLinkClicked", function ConversationWorkspaceComponent_Conditional_4_Conditional_7_Template_mj_conversation_chat_area_artifactLinkClicked_1_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onArtifactLinkNavigation($event)); })("conversationCreated", function ConversationWorkspaceComponent_Conditional_4_Conditional_7_Template_mj_conversation_chat_area_conversationCreated_1_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onConversationCreated($event)); })("realtimeConversationReady", function ConversationWorkspaceComponent_Conditional_4_Conditional_7_Template_mj_conversation_chat_area_realtimeConversationReady_1_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onRealtimeConversationReady($event)); })("threadOpened", function ConversationWorkspaceComponent_Conditional_4_Conditional_7_Template_mj_conversation_chat_area_threadOpened_1_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onThreadOpened($event)); })("threadClosed", function ConversationWorkspaceComponent_Conditional_4_Conditional_7_Template_mj_conversation_chat_area_threadClosed_1_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onThreadClosed()); })("pendingArtifactConsumed", function ConversationWorkspaceComponent_Conditional_4_Conditional_7_Template_mj_conversation_chat_area_pendingArtifactConsumed_1_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); ctx_r1.pendingArtifactId = null; return i0.ɵɵresetView(ctx_r1.pendingArtifactVersionNumber = null); })("pendingMessageConsumed", function ConversationWorkspaceComponent_Conditional_4_Conditional_7_Template_mj_conversation_chat_area_pendingMessageConsumed_1_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); ctx_r1.pendingMessageToSend = null; return i0.ɵɵresetView(ctx_r1.pendingAttachmentsToSend = null); })("pendingMessageRequested", function ConversationWorkspaceComponent_Conditional_4_Conditional_7_Template_mj_conversation_chat_area_pendingMessageRequested_1_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onPendingMessageRequested($event)); });
|
|
105
106
|
i0.ɵɵelementEnd()();
|
|
106
107
|
} if (rf & 2) {
|
|
107
108
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -266,6 +267,11 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
266
267
|
previousVersionId = null; // Used to track version changes in ngDoCheck
|
|
267
268
|
previousIsNewConversation = false; // Track new conversation state changes
|
|
268
269
|
destroy$ = new Subject();
|
|
270
|
+
// Stored bound references so addEventListener and removeEventListener get the same function object.
|
|
271
|
+
boundOnResizeMove = this.onResizeMove.bind(this);
|
|
272
|
+
boundOnResizeEnd = this.onResizeEnd.bind(this);
|
|
273
|
+
boundOnResizeTouchMove = this.onResizeTouchMove.bind(this);
|
|
274
|
+
boundOnResizeTouchEnd = this.onResizeTouchEnd.bind(this);
|
|
269
275
|
// User Settings key for server-side persistence
|
|
270
276
|
USER_SETTING_SIDEBAR_KEY = 'Conversations.SidebarState';
|
|
271
277
|
saveSettingsTimeout = null;
|
|
@@ -361,6 +367,29 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
361
367
|
* Handler for new conversation creation from chat area
|
|
362
368
|
* Now includes pending message and attachments to ensure atomic state update
|
|
363
369
|
*/
|
|
370
|
+
/**
|
|
371
|
+
* A realtime session created (and just finished with) a brand-new conversation. The
|
|
372
|
+
* row was created SERVER-side, so it isn't in the engine cache yet — reload the list
|
|
373
|
+
* to fold it in, then select it ONLY when the conversation list is visible (owner
|
|
374
|
+
* spec: the user may have the sidebar hidden; don't yank their context if so —
|
|
375
|
+
* the refreshed cache makes it appear whenever the list is reopened).
|
|
376
|
+
*/
|
|
377
|
+
async onRealtimeConversationReady(event) {
|
|
378
|
+
try {
|
|
379
|
+
await ConversationEngine.Instance.LoadConversations(this.environmentId, this.currentUser, true);
|
|
380
|
+
if (event.select && this.isSidebarVisible) {
|
|
381
|
+
const conversation = ConversationEngine.Instance.Conversations.find(c => UUIDsEqual(c.ID, event.conversationId));
|
|
382
|
+
if (conversation) {
|
|
383
|
+
this.selectedConversationId = conversation.ID;
|
|
384
|
+
this.selectedConversation = conversation;
|
|
385
|
+
this.isNewUnsavedConversation = false;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
catch (error) {
|
|
390
|
+
console.error('onRealtimeConversationReady ERROR:', error);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
364
393
|
onConversationCreated(event) {
|
|
365
394
|
try {
|
|
366
395
|
// Set ALL state atomically before Angular change detection runs
|
|
@@ -440,11 +469,11 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
440
469
|
}, 50);
|
|
441
470
|
}
|
|
442
471
|
// Setup resize listeners
|
|
443
|
-
window.addEventListener('mousemove', this.
|
|
444
|
-
window.addEventListener('mouseup', this.
|
|
472
|
+
window.addEventListener('mousemove', this.boundOnResizeMove);
|
|
473
|
+
window.addEventListener('mouseup', this.boundOnResizeEnd);
|
|
445
474
|
// Setup touch listeners for mobile
|
|
446
|
-
window.addEventListener('touchmove', this.
|
|
447
|
-
window.addEventListener('touchend', this.
|
|
475
|
+
window.addEventListener('touchmove', this.boundOnResizeTouchMove);
|
|
476
|
+
window.addEventListener('touchend', this.boundOnResizeTouchEnd);
|
|
448
477
|
// CRITICAL: Initialize engines FIRST before rendering any UI
|
|
449
478
|
// The isWorkspaceReady flag blocks all child components from rendering
|
|
450
479
|
// until engines are fully loaded and ready
|
|
@@ -591,10 +620,10 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
591
620
|
clearTimeout(this.saveSettingsTimeout);
|
|
592
621
|
}
|
|
593
622
|
// Remove resize listeners
|
|
594
|
-
window.removeEventListener('mousemove', this.
|
|
595
|
-
window.removeEventListener('mouseup', this.
|
|
596
|
-
window.removeEventListener('touchmove', this.
|
|
597
|
-
window.removeEventListener('touchend', this.
|
|
623
|
+
window.removeEventListener('mousemove', this.boundOnResizeMove);
|
|
624
|
+
window.removeEventListener('mouseup', this.boundOnResizeEnd);
|
|
625
|
+
window.removeEventListener('touchmove', this.boundOnResizeTouchMove);
|
|
626
|
+
window.removeEventListener('touchend', this.boundOnResizeTouchEnd);
|
|
598
627
|
}
|
|
599
628
|
onWindowResize() {
|
|
600
629
|
this.checkMobileView();
|
|
@@ -1202,7 +1231,7 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
1202
1231
|
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.MentionAutocompleteService), i0.ɵɵdirectiveInject(i5.MJNotificationService), i0.ɵɵdirectiveInject(i6.ConversationStreamingService), i0.ɵɵdirectiveInject(i7.UICommandHandlerService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
1203
1232
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ConversationWorkspaceComponent, selectors: [["mj-conversation-workspace"]], hostBindings: function ConversationWorkspaceComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
1204
1233
|
i0.ɵɵlistener("resize", function ConversationWorkspaceComponent_resize_HostBindingHandler() { return ctx.onWindowResize(); }, i0.ɵɵresolveWindow)("click", function ConversationWorkspaceComponent_click_HostBindingHandler($event) { return ctx.onDocumentClick($event); }, i0.ɵɵresolveDocument);
|
|
1205
|
-
} }, inputs: { environmentId: "environmentId", initialConversationId: "initialConversationId", layout: "layout", currentUser: "currentUser", activeContext: "activeContext", contextItemId: "contextItemId", 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", "pinSidebarRequested", "unpinSidebarRequested", "activeTab", "environmentId", "currentUser", "selectedConversationId", "renamedConversationId", "isSidebarPinned", "isMobileView"], ["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", "threadOpened", "threadClosed", "pendingArtifactConsumed", "pendingMessageConsumed", "pendingMessageRequested", "environmentId", "currentUser", "conversationId", "conversation", "threadId", "isNewConversation", "pendingMessage", "pendingAttachments", "pendingArtifactId", "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) {
|
|
1234
|
+
} }, inputs: { environmentId: "environmentId", initialConversationId: "initialConversationId", layout: "layout", currentUser: "currentUser", activeContext: "activeContext", contextItemId: "contextItemId", 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", "pinSidebarRequested", "unpinSidebarRequested", "activeTab", "environmentId", "currentUser", "selectedConversationId", "renamedConversationId", "isSidebarPinned", "isMobileView"], ["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", "pendingArtifactId", "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) {
|
|
1206
1235
|
i0.ɵɵelementStart(0, "div", 0);
|
|
1207
1236
|
i0.ɵɵlistener("searchTriggered", function ConversationWorkspaceComponent_Template_div_searchTriggered_0_listener() { return ctx.openSearch(); });
|
|
1208
1237
|
i0.ɵɵelementStart(1, "div", 1)(2, "mj-conversation-navigation", 2);
|
|
@@ -1233,7 +1262,7 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
1233
1262
|
}
|
|
1234
1263
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ConversationWorkspaceComponent, [{
|
|
1235
1264
|
type: Component,
|
|
1236
|
-
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 (conversationSelected)=\"onConversationSelected($event)\"\n (newConversationRequested)=\"startNewConversation()\"\n (pinSidebarRequested)=\"pinSidebar()\"\n (unpinSidebarRequested)=\"unpinSidebar()\">\n </mj-conversation-sidebar>\n </div>\n }\n\n <!-- Floating toggle button (only visible when sidebar is collapsed and settings loaded) -->\n @if (activeTab !== 'collections' && activeTab !== 'tasks' && isSidebarCollapsed && isSidebarSettingsLoaded) {\n <button class=\"sidebar-floating-toggle\"\n (click)=\"expandSidebar()\"\n title=\"Show conversations\">\n <i class=\"fas fa-table-columns\"></i>\n </button>\n }\n\n <!-- Resize handle for sidebar (only when expanded and settings loaded) -->\n @if (isSidebarVisible && !isSidebarCollapsed && activeTab !== 'collections' && activeTab !== 'tasks' && isSidebarSettingsLoaded) {\n <div class=\"sidebar-resize-handle\"\n (mousedown)=\"onSidebarResizeStart($event)\"></div>\n }\n\n <!-- Collections Full-Panel View -->\n @if (activeTab === 'collections') {\n <div class=\"workspace-main\">\n <mj-collections-full-view\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n (collectionNavigated)=\"onCollectionNavigated($event)\">\n </mj-collections-full-view>\n </div>\n }\n\n <!-- Tasks Full-Panel View -->\n @if (activeTab === 'tasks') {\n <div class=\"workspace-main\">\n <mj-tasks-full-view\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [baseFilter]=\"tasksFilter\"\n [activeTaskId]=\"activeTaskId\"\n (openEntityRecord)=\"onOpenEntityRecordFromTasks($event)\">\n </mj-tasks-full-view>\n </div>\n }\n\n <!-- Main Chat Area (only shown when not in Collections or Tasks view) -->\n @if (activeTab !== 'collections' && activeTab !== 'tasks') {\n <div class=\"workspace-main\">\n <mj-conversation-chat-area\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [conversationId]=\"selectedConversationId\"\n [conversation]=\"selectedConversation\"\n [threadId]=\"selectedThreadId\"\n [isNewConversation]=\"isNewUnsavedConversation\"\n [pendingMessage]=\"pendingMessageToSend\"\n [pendingAttachments]=\"pendingAttachmentsToSend\"\n [pendingArtifactId]=\"pendingArtifactId\"\n [pendingArtifactVersionNumber]=\"pendingArtifactVersionNumber\"\n (conversationRenamed)=\"onConversationRenamed($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n (navigationRequest)=\"onNavigationRequest($event)\"\n (taskClicked)=\"onTaskClicked($event)\"\n (artifactLinkClicked)=\"onArtifactLinkNavigation($event)\"\n (conversationCreated)=\"onConversationCreated($event)\"\n (threadOpened)=\"onThreadOpened($event)\"\n (threadClosed)=\"onThreadClosed()\"\n (pendingArtifactConsumed)=\"pendingArtifactId = null; pendingArtifactVersionNumber = null\"\n (pendingMessageConsumed)=\"pendingMessageToSend = null; pendingAttachmentsToSend = null\"\n (pendingMessageRequested)=\"onPendingMessageRequested($event)\">\n </mj-conversation-chat-area>\n </div>\n }\n\n <!-- Right Artifact Panel -->\n @if (isArtifactPanelOpen && activeArtifactId) {\n @if (!isArtifactPanelMaximized) {\n <div class=\"artifact-panel-resize-handle\" (mousedown)=\"onArtifactPanelResizeStart($event)\"></div>\n }\n <div class=\"workspace-artifact-panel\"\n [style.width.%]=\"artifactPanelWidth\"\n [class.maximized]=\"isArtifactPanelMaximized\">\n <mj-artifact-viewer-panel\n [artifactId]=\"activeArtifactId\"\n [currentUser]=\"currentUser\"\n [environmentId]=\"environmentId\"\n [versionNumber]=\"activeVersionNumber ?? undefined\"\n [showSaveToCollection]=\"activeTab !== 'collections'\"\n [viewContext]=\"activeTab === 'collections' ? 'collection' : 'conversation'\"\n [contextCollectionId]=\"collectionState.activeCollectionId ?? undefined\"\n [canShare]=\"canShareActiveArtifact\"\n [canEdit]=\"canEditActiveArtifact\"\n [isMaximized]=\"isArtifactPanelMaximized\"\n (closed)=\"closeArtifactPanel()\"\n (navigateToLink)=\"onArtifactLinkNavigation($event)\"\n (shareRequested)=\"onArtifactShareRequested($event)\"\n (maximizeToggled)=\"toggleMaximizeArtifactPanel()\"\n (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}"] }]
|
|
1265
|
+
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 (conversationSelected)=\"onConversationSelected($event)\"\n (newConversationRequested)=\"startNewConversation()\"\n (pinSidebarRequested)=\"pinSidebar()\"\n (unpinSidebarRequested)=\"unpinSidebar()\">\n </mj-conversation-sidebar>\n </div>\n }\n\n <!-- Floating toggle button (only visible when sidebar is collapsed and settings loaded) -->\n @if (activeTab !== 'collections' && activeTab !== 'tasks' && isSidebarCollapsed && isSidebarSettingsLoaded) {\n <button class=\"sidebar-floating-toggle\"\n (click)=\"expandSidebar()\"\n title=\"Show conversations\">\n <i class=\"fas fa-table-columns\"></i>\n </button>\n }\n\n <!-- Resize handle for sidebar (only when expanded and settings loaded) -->\n @if (isSidebarVisible && !isSidebarCollapsed && activeTab !== 'collections' && activeTab !== 'tasks' && isSidebarSettingsLoaded) {\n <div class=\"sidebar-resize-handle\"\n (mousedown)=\"onSidebarResizeStart($event)\"></div>\n }\n\n <!-- Collections Full-Panel View -->\n @if (activeTab === 'collections') {\n <div class=\"workspace-main\">\n <mj-collections-full-view\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n (collectionNavigated)=\"onCollectionNavigated($event)\">\n </mj-collections-full-view>\n </div>\n }\n\n <!-- Tasks Full-Panel View -->\n @if (activeTab === 'tasks') {\n <div class=\"workspace-main\">\n <mj-tasks-full-view\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [baseFilter]=\"tasksFilter\"\n [activeTaskId]=\"activeTaskId\"\n (openEntityRecord)=\"onOpenEntityRecordFromTasks($event)\">\n </mj-tasks-full-view>\n </div>\n }\n\n <!-- Main Chat Area (only shown when not in Collections or Tasks view) -->\n @if (activeTab !== 'collections' && activeTab !== 'tasks') {\n <div class=\"workspace-main\">\n <mj-conversation-chat-area\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [conversationId]=\"selectedConversationId\"\n [conversation]=\"selectedConversation\"\n [threadId]=\"selectedThreadId\"\n [isNewConversation]=\"isNewUnsavedConversation\"\n [pendingMessage]=\"pendingMessageToSend\"\n [pendingAttachments]=\"pendingAttachmentsToSend\"\n [pendingArtifactId]=\"pendingArtifactId\"\n [pendingArtifactVersionNumber]=\"pendingArtifactVersionNumber\"\n (conversationRenamed)=\"onConversationRenamed($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n (navigationRequest)=\"onNavigationRequest($event)\"\n (taskClicked)=\"onTaskClicked($event)\"\n (artifactLinkClicked)=\"onArtifactLinkNavigation($event)\"\n (conversationCreated)=\"onConversationCreated($event)\"\n (realtimeConversationReady)=\"onRealtimeConversationReady($event)\"\n (threadOpened)=\"onThreadOpened($event)\"\n (threadClosed)=\"onThreadClosed()\"\n (pendingArtifactConsumed)=\"pendingArtifactId = null; pendingArtifactVersionNumber = null\"\n (pendingMessageConsumed)=\"pendingMessageToSend = null; pendingAttachmentsToSend = null\"\n (pendingMessageRequested)=\"onPendingMessageRequested($event)\">\n </mj-conversation-chat-area>\n </div>\n }\n\n <!-- Right Artifact Panel -->\n @if (isArtifactPanelOpen && activeArtifactId) {\n @if (!isArtifactPanelMaximized) {\n <div class=\"artifact-panel-resize-handle\" (mousedown)=\"onArtifactPanelResizeStart($event)\"></div>\n }\n <div class=\"workspace-artifact-panel\"\n [style.width.%]=\"artifactPanelWidth\"\n [class.maximized]=\"isArtifactPanelMaximized\">\n <mj-artifact-viewer-panel\n [artifactId]=\"activeArtifactId\"\n [currentUser]=\"currentUser\"\n [environmentId]=\"environmentId\"\n [versionNumber]=\"activeVersionNumber ?? undefined\"\n [showSaveToCollection]=\"activeTab !== 'collections'\"\n [viewContext]=\"activeTab === 'collections' ? 'collection' : 'conversation'\"\n [contextCollectionId]=\"collectionState.activeCollectionId ?? undefined\"\n [canShare]=\"canShareActiveArtifact\"\n [canEdit]=\"canEditActiveArtifact\"\n [isMaximized]=\"isArtifactPanelMaximized\"\n (closed)=\"closeArtifactPanel()\"\n (navigateToLink)=\"onArtifactLinkNavigation($event)\"\n (shareRequested)=\"onArtifactShareRequested($event)\"\n (maximizeToggled)=\"toggleMaximizeArtifactPanel()\"\n (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}"] }]
|
|
1237
1266
|
}], () => [{ type: i1.ArtifactStateService }, { type: i2.CollectionStateService }, { type: i3.ArtifactPermissionService }, { type: i4.MentionAutocompleteService }, { type: i5.MJNotificationService }, { type: i6.ConversationStreamingService }, { type: i7.UICommandHandlerService }, { type: i0.ChangeDetectorRef }], { environmentId: [{
|
|
1238
1267
|
type: Input
|
|
1239
1268
|
}], initialConversationId: [{
|
|
@@ -1277,5 +1306,5 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
1277
1306
|
type: HostListener,
|
|
1278
1307
|
args: ['document:click', ['$event']]
|
|
1279
1308
|
}] }); })();
|
|
1280
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ConversationWorkspaceComponent, { className: "ConversationWorkspaceComponent", filePath: "src/lib/components/workspace/conversation-workspace.component.ts", lineNumber:
|
|
1309
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ConversationWorkspaceComponent, { className: "ConversationWorkspaceComponent", filePath: "src/lib/components/workspace/conversation-workspace.component.ts", lineNumber: 67 }); })();
|
|
1281
1310
|
//# sourceMappingURL=conversation-workspace.component.js.map
|