@memberjunction/ng-conversations 5.40.1 → 5.41.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 +423 -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/conversation/conversation-chat-area.component.d.ts +205 -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 +911 -342
- package/dist/lib/components/conversation/conversation-chat-area.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/realtime/channels/base-realtime-channel-client.d.ts +282 -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 +158 -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 +168 -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 +556 -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 +168 -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 +524 -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 +346 -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 +851 -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 +86 -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 +210 -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 +11 -0
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.js +28 -4
- 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.map +1 -1
- package/dist/lib/services/artifact-state.service.js +23 -6
- 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 +120 -0
- package/dist/lib/services/realtime-pairing.d.ts.map +1 -0
- package/dist/lib/services/realtime-pairing.js +150 -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,256 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output, ViewChild, inject } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { FormsModule } from '@angular/forms';
|
|
4
|
+
import { RealtimeSessionService } from '../../services/realtime-session.service';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/common";
|
|
7
|
+
import * as i2 from "@angular/forms";
|
|
8
|
+
const _c0 = ["dockInput"];
|
|
9
|
+
function RealtimeComposerComponent_Conditional_0_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
10
|
+
const _r3 = i0.ɵɵgetCurrentView();
|
|
11
|
+
i0.ɵɵelementStart(0, "div", 3)(1, "button", 4);
|
|
12
|
+
i0.ɵɵlistener("click", function RealtimeComposerComponent_Conditional_0_Conditional_11_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.DetailsToggled.emit()); });
|
|
13
|
+
i0.ɵɵelement(2, "i", 14);
|
|
14
|
+
i0.ɵɵelementEnd();
|
|
15
|
+
i0.ɵɵelementStart(3, "span", 6);
|
|
16
|
+
i0.ɵɵtext(4, "Details");
|
|
17
|
+
i0.ɵɵelementEnd()();
|
|
18
|
+
} if (rf & 2) {
|
|
19
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
20
|
+
i0.ɵɵadvance();
|
|
21
|
+
i0.ɵɵclassProp("ctrl--on", ctx_r1.DetailsOn);
|
|
22
|
+
i0.ɵɵproperty("title", ctx_r1.DetailsOn ? "Hide the session panels" : "Peek at the session panels");
|
|
23
|
+
i0.ɵɵattribute("aria-pressed", ctx_r1.DetailsOn);
|
|
24
|
+
} }
|
|
25
|
+
function RealtimeComposerComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
26
|
+
const _r1 = i0.ɵɵgetCurrentView();
|
|
27
|
+
i0.ɵɵelementStart(0, "div", 1)(1, "div", 3)(2, "button", 4);
|
|
28
|
+
i0.ɵɵlistener("click", function RealtimeComposerComponent_Conditional_0_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ToggleMute()); });
|
|
29
|
+
i0.ɵɵelement(3, "i", 5);
|
|
30
|
+
i0.ɵɵelementEnd();
|
|
31
|
+
i0.ɵɵelementStart(4, "span", 6);
|
|
32
|
+
i0.ɵɵtext(5);
|
|
33
|
+
i0.ɵɵelementEnd()();
|
|
34
|
+
i0.ɵɵelementStart(6, "div", 3)(7, "button", 4);
|
|
35
|
+
i0.ɵɵlistener("click", function RealtimeComposerComponent_Conditional_0_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ToggleCaptions()); });
|
|
36
|
+
i0.ɵɵelement(8, "i", 7);
|
|
37
|
+
i0.ɵɵelementEnd();
|
|
38
|
+
i0.ɵɵelementStart(9, "span", 6);
|
|
39
|
+
i0.ɵɵtext(10, "Captions");
|
|
40
|
+
i0.ɵɵelementEnd()();
|
|
41
|
+
i0.ɵɵconditionalCreate(11, RealtimeComposerComponent_Conditional_0_Conditional_11_Template, 5, 4, "div", 3);
|
|
42
|
+
i0.ɵɵelementStart(12, "div", 3)(13, "button", 8);
|
|
43
|
+
i0.ɵɵlistener("click", function RealtimeComposerComponent_Conditional_0_Template_button_click_13_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OpenChanged.emit(true)); });
|
|
44
|
+
i0.ɵɵelement(14, "i", 9);
|
|
45
|
+
i0.ɵɵelementEnd();
|
|
46
|
+
i0.ɵɵelementStart(15, "span", 6);
|
|
47
|
+
i0.ɵɵtext(16, "Type");
|
|
48
|
+
i0.ɵɵelementEnd()();
|
|
49
|
+
i0.ɵɵelementStart(17, "div", 3)(18, "button", 10);
|
|
50
|
+
i0.ɵɵlistener("click", function RealtimeComposerComponent_Conditional_0_Template_button_click_18_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.EndRequested.emit()); });
|
|
51
|
+
i0.ɵɵelement(19, "i", 11);
|
|
52
|
+
i0.ɵɵelementEnd();
|
|
53
|
+
i0.ɵɵelementStart(20, "span", 12);
|
|
54
|
+
i0.ɵɵtext(21, "End call");
|
|
55
|
+
i0.ɵɵelementEnd()();
|
|
56
|
+
i0.ɵɵelementStart(22, "span", 13);
|
|
57
|
+
i0.ɵɵelement(23, "i", 9);
|
|
58
|
+
i0.ɵɵtext(24, " press ");
|
|
59
|
+
i0.ɵɵelementStart(25, "kbd");
|
|
60
|
+
i0.ɵɵtext(26, "T");
|
|
61
|
+
i0.ɵɵelementEnd();
|
|
62
|
+
i0.ɵɵtext(27, " to type");
|
|
63
|
+
i0.ɵɵelementEnd()();
|
|
64
|
+
} if (rf & 2) {
|
|
65
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
66
|
+
i0.ɵɵadvance(2);
|
|
67
|
+
i0.ɵɵclassProp("ctrl--muted", ctx_r1.IsMuted);
|
|
68
|
+
i0.ɵɵproperty("title", ctx_r1.IsMuted ? "Unmute microphone" : "Mute microphone");
|
|
69
|
+
i0.ɵɵattribute("aria-pressed", ctx_r1.IsMuted);
|
|
70
|
+
i0.ɵɵadvance();
|
|
71
|
+
i0.ɵɵproperty("ngClass", ctx_r1.IsMuted ? "fa-microphone-slash" : "fa-microphone");
|
|
72
|
+
i0.ɵɵadvance(2);
|
|
73
|
+
i0.ɵɵtextInterpolate(ctx_r1.IsMuted ? "Unmute" : "Mute");
|
|
74
|
+
i0.ɵɵadvance(2);
|
|
75
|
+
i0.ɵɵclassProp("ctrl--on", ctx_r1.CaptionsOn);
|
|
76
|
+
i0.ɵɵproperty("title", ctx_r1.CaptionsOn ? "Voice-first \u2014 back to the orb" : "Show the conversation as text");
|
|
77
|
+
i0.ɵɵattribute("aria-pressed", ctx_r1.CaptionsOn);
|
|
78
|
+
i0.ɵɵadvance(4);
|
|
79
|
+
i0.ɵɵconditional(ctx_r1.ShowDetails ? 11 : -1);
|
|
80
|
+
} }
|
|
81
|
+
function RealtimeComposerComponent_Conditional_1_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
82
|
+
const _r5 = i0.ɵɵgetCurrentView();
|
|
83
|
+
i0.ɵɵelementStart(0, "button", 16);
|
|
84
|
+
i0.ɵɵlistener("click", function RealtimeComposerComponent_Conditional_1_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.DetailsToggled.emit()); });
|
|
85
|
+
i0.ɵɵelement(1, "i", 14);
|
|
86
|
+
i0.ɵɵelementEnd();
|
|
87
|
+
} if (rf & 2) {
|
|
88
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
89
|
+
i0.ɵɵclassProp("mini--on", ctx_r1.DetailsOn);
|
|
90
|
+
i0.ɵɵproperty("title", ctx_r1.DetailsOn ? "Hide the session panels" : "Show the session panels");
|
|
91
|
+
i0.ɵɵattribute("aria-pressed", ctx_r1.DetailsOn);
|
|
92
|
+
} }
|
|
93
|
+
function RealtimeComposerComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
94
|
+
const _r4 = i0.ɵɵgetCurrentView();
|
|
95
|
+
i0.ɵɵelementStart(0, "div", 2)(1, "div", 15)(2, "button", 16);
|
|
96
|
+
i0.ɵɵlistener("click", function RealtimeComposerComponent_Conditional_1_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ToggleMute()); });
|
|
97
|
+
i0.ɵɵelement(3, "i", 5);
|
|
98
|
+
i0.ɵɵelementEnd();
|
|
99
|
+
i0.ɵɵelementStart(4, "button", 16);
|
|
100
|
+
i0.ɵɵlistener("click", function RealtimeComposerComponent_Conditional_1_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ToggleCaptions()); });
|
|
101
|
+
i0.ɵɵelement(5, "i", 7);
|
|
102
|
+
i0.ɵɵelementEnd();
|
|
103
|
+
i0.ɵɵconditionalCreate(6, RealtimeComposerComponent_Conditional_1_Conditional_6_Template, 2, 4, "button", 17);
|
|
104
|
+
i0.ɵɵelementEnd();
|
|
105
|
+
i0.ɵɵelementStart(7, "div", 18)(8, "input", 19, 0);
|
|
106
|
+
i0.ɵɵtwoWayListener("ngModelChange", function RealtimeComposerComponent_Conditional_1_Template_input_ngModelChange_8_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.Draft, $event) || (ctx_r1.Draft = $event); return i0.ɵɵresetView($event); });
|
|
107
|
+
i0.ɵɵlistener("keydown", function RealtimeComposerComponent_Conditional_1_Template_input_keydown_8_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnKeydown($event)); });
|
|
108
|
+
i0.ɵɵelementEnd();
|
|
109
|
+
i0.ɵɵelementStart(10, "span", 20);
|
|
110
|
+
i0.ɵɵtext(11, "\u21B5 send");
|
|
111
|
+
i0.ɵɵelementEnd();
|
|
112
|
+
i0.ɵɵelementStart(12, "button", 21);
|
|
113
|
+
i0.ɵɵlistener("click", function RealtimeComposerComponent_Conditional_1_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.Send()); });
|
|
114
|
+
i0.ɵɵelement(13, "i", 22);
|
|
115
|
+
i0.ɵɵelementEnd()();
|
|
116
|
+
i0.ɵɵelementStart(14, "button", 23);
|
|
117
|
+
i0.ɵɵlistener("click", function RealtimeComposerComponent_Conditional_1_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OpenChanged.emit(false)); });
|
|
118
|
+
i0.ɵɵelement(15, "i", 24);
|
|
119
|
+
i0.ɵɵelementEnd()();
|
|
120
|
+
} if (rf & 2) {
|
|
121
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
122
|
+
i0.ɵɵadvance(2);
|
|
123
|
+
i0.ɵɵclassProp("mini--muted", ctx_r1.IsMuted);
|
|
124
|
+
i0.ɵɵproperty("title", ctx_r1.IsMuted ? "Unmute microphone" : "Mute microphone");
|
|
125
|
+
i0.ɵɵattribute("aria-pressed", ctx_r1.IsMuted);
|
|
126
|
+
i0.ɵɵadvance();
|
|
127
|
+
i0.ɵɵproperty("ngClass", ctx_r1.IsMuted ? "fa-microphone-slash" : "fa-microphone");
|
|
128
|
+
i0.ɵɵadvance();
|
|
129
|
+
i0.ɵɵclassProp("mini--on", ctx_r1.CaptionsOn);
|
|
130
|
+
i0.ɵɵproperty("title", ctx_r1.CaptionsOn ? "Voice-first \u2014 back to the orb" : "Show the conversation as text");
|
|
131
|
+
i0.ɵɵattribute("aria-pressed", ctx_r1.CaptionsOn);
|
|
132
|
+
i0.ɵɵadvance(2);
|
|
133
|
+
i0.ɵɵconditional(ctx_r1.ShowDetails ? 6 : -1);
|
|
134
|
+
i0.ɵɵadvance(2);
|
|
135
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.Draft);
|
|
136
|
+
i0.ɵɵadvance(4);
|
|
137
|
+
i0.ɵɵproperty("disabled", !ctx_r1.CanSend);
|
|
138
|
+
} }
|
|
139
|
+
/**
|
|
140
|
+
* The call overlay's BOTTOM DOCK — the progressive-disclosure composer
|
|
141
|
+
* (`plans/realtime/mockups/redesign-a-progressive.html`). One component, two shapes,
|
|
142
|
+
* keyed off the overlay's disclosure {@link Level}:
|
|
143
|
+
*
|
|
144
|
+
* - **Levels 0–1 (phone-call strip)** — big round call controls, centered: Mute, the
|
|
145
|
+
* Captions toggle (level 1+, arriving WITH the text it controls), the Details peek
|
|
146
|
+
* (level 0 paths where the surface panel isn't earned yet — lets the user look at the
|
|
147
|
+
* Activity/Whiteboard panels on demand), and End call. Level 1 adds the whispered
|
|
148
|
+
* "press T to type" hint — typing exists, but there's no visible composer yet.
|
|
149
|
+
* - **Level 2+ (the dock)** — mute/captions shrink to compact minis and the in-call text
|
|
150
|
+
* input docks beside them (one bottom bar, per Redesign A's fused composer+controls).
|
|
151
|
+
* Submit calls {@link RealtimeSessionService.SendText}, which injects the text as a user
|
|
152
|
+
* turn into the SAME live voice call.
|
|
153
|
+
*
|
|
154
|
+
* Mute talks to the session service directly (pure local toggle); captions / Details /
|
|
155
|
+
* End are emitted up so the overlay shell owns that state and lifecycle.
|
|
156
|
+
*/
|
|
157
|
+
export class RealtimeComposerComponent {
|
|
158
|
+
/**
|
|
159
|
+
* Whether the typed-input dock is OPEN. A two-way door owned by the user: the strip's
|
|
160
|
+
* Type control (or the T hotkey) opens it; the dock's hide control closes it — typing
|
|
161
|
+
* never becomes permanent chrome. Default closed (voice-first), reset per session.
|
|
162
|
+
*/
|
|
163
|
+
Open = false;
|
|
164
|
+
/** Emitted when the user opens (Type control / typing) or closes (hide control) the dock. */
|
|
165
|
+
OpenChanged = new EventEmitter();
|
|
166
|
+
/** Whether captions are currently shown (drives the captions control's active state). */
|
|
167
|
+
CaptionsOn = true;
|
|
168
|
+
/** Whether the Details peek control renders (true until the surface panel is earned). */
|
|
169
|
+
ShowDetails = false;
|
|
170
|
+
/** Whether the Details peek is currently open (active state on the control). */
|
|
171
|
+
DetailsOn = false;
|
|
172
|
+
/** Emitted when the user toggles captions; the overlay flips its caption state. */
|
|
173
|
+
CaptionsToggled = new EventEmitter();
|
|
174
|
+
/** Emitted when the user toggles the Details peek (the on-demand surface panel). */
|
|
175
|
+
DetailsToggled = new EventEmitter();
|
|
176
|
+
/** Emitted when the user ends the call from the strip's End control. */
|
|
177
|
+
EndRequested = new EventEmitter();
|
|
178
|
+
/** Current draft text in the dock's composer input. */
|
|
179
|
+
Draft = '';
|
|
180
|
+
/** Local mic mute state, reflected from the service. */
|
|
181
|
+
IsMuted = false;
|
|
182
|
+
dockInput;
|
|
183
|
+
voice = inject(RealtimeSessionService);
|
|
184
|
+
/** True when there's non-whitespace text to send. */
|
|
185
|
+
get CanSend() {
|
|
186
|
+
return this.Draft.trim().length > 0;
|
|
187
|
+
}
|
|
188
|
+
/** True while the big-controls phone-call strip renders (instead of the dock). */
|
|
189
|
+
get StripMode() {
|
|
190
|
+
return !this.Open;
|
|
191
|
+
}
|
|
192
|
+
/** Toggle the local microphone mute. */
|
|
193
|
+
ToggleMute() {
|
|
194
|
+
this.IsMuted = this.voice.ToggleMute();
|
|
195
|
+
}
|
|
196
|
+
/** Toggle captions visibility and notify the overlay. */
|
|
197
|
+
ToggleCaptions() {
|
|
198
|
+
this.CaptionsOn = !this.CaptionsOn;
|
|
199
|
+
this.CaptionsToggled.emit(this.CaptionsOn);
|
|
200
|
+
}
|
|
201
|
+
/** Focuses the dock's text input (the overlay's T-to-type hotkey lands here). */
|
|
202
|
+
FocusInput() {
|
|
203
|
+
this.dockInput?.nativeElement.focus();
|
|
204
|
+
}
|
|
205
|
+
/** Send the typed text into the live session, then clear the input. */
|
|
206
|
+
Send() {
|
|
207
|
+
if (!this.CanSend) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
this.voice.SendText(this.Draft);
|
|
211
|
+
this.Draft = '';
|
|
212
|
+
}
|
|
213
|
+
/** Enter sends (Shift+Enter is free for future multiline if the input becomes a textarea). */
|
|
214
|
+
OnKeydown(event) {
|
|
215
|
+
if (event.key === 'Enter' && !event.shiftKey) {
|
|
216
|
+
event.preventDefault();
|
|
217
|
+
this.Send();
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
static ɵfac = function RealtimeComposerComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || RealtimeComposerComponent)(); };
|
|
221
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: RealtimeComposerComponent, selectors: [["mj-realtime-composer"]], viewQuery: function RealtimeComposerComponent_Query(rf, ctx) { if (rf & 1) {
|
|
222
|
+
i0.ɵɵviewQuery(_c0, 5);
|
|
223
|
+
} if (rf & 2) {
|
|
224
|
+
let _t;
|
|
225
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.dockInput = _t.first);
|
|
226
|
+
} }, inputs: { Open: "Open", CaptionsOn: "CaptionsOn", ShowDetails: "ShowDetails", DetailsOn: "DetailsOn" }, outputs: { OpenChanged: "OpenChanged", CaptionsToggled: "CaptionsToggled", DetailsToggled: "DetailsToggled", EndRequested: "EndRequested" }, decls: 2, vars: 1, consts: [["dockInput", ""], ["role", "group", "aria-label", "Call controls", 1, "strip"], [1, "dock"], [1, "ctrl-group"], ["type", "button", 1, "ctrl", 3, "click", "title"], ["aria-hidden", "true", 1, "fa-solid", 3, "ngClass"], [1, "ctrl-label"], ["aria-hidden", "true", 1, "fa-solid", "fa-closed-captioning"], ["type", "button", "title", "Type into the live session", "aria-label", "Open the typed-input composer", 1, "ctrl", 3, "click"], ["aria-hidden", "true", 1, "fa-regular", "fa-keyboard"], ["type", "button", "title", "End call", "aria-label", "End call", 1, "ctrl", "ctrl--end", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-phone-slash"], [1, "ctrl-label", "ctrl-label--end"], [1, "thint"], ["aria-hidden", "true", 1, "fa-solid", "fa-table-columns"], [1, "dock__minis"], ["type", "button", 1, "mini", 3, "click", "title"], ["type", "button", 1, "mini", 3, "mini--on", "title"], [1, "dock__box"], ["type", "text", "placeholder", "Type into the live session \u2014 joins this same voice call\u2026", "aria-label", "Type a message into the live voice session", 1, "dock__input", 3, "ngModelChange", "keydown", "ngModel"], ["aria-hidden", "true", 1, "dock__hint"], ["type", "button", "title", "Send into live session", "aria-label", "Send", 1, "dock__send", 3, "click", "disabled"], ["aria-hidden", "true", 1, "fa-solid", "fa-paper-plane"], ["type", "button", "title", "Hide typing \u2014 back to the voice controls", "aria-label", "Close the typed-input composer", 1, "mini", "dock__hide", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-chevron-down"]], template: function RealtimeComposerComponent_Template(rf, ctx) { if (rf & 1) {
|
|
227
|
+
i0.ɵɵconditionalCreate(0, RealtimeComposerComponent_Conditional_0_Template, 28, 11, "div", 1)(1, RealtimeComposerComponent_Conditional_1_Template, 16, 12, "div", 2);
|
|
228
|
+
} if (rf & 2) {
|
|
229
|
+
i0.ɵɵconditional(ctx.StripMode ? 0 : 1);
|
|
230
|
+
} }, dependencies: [CommonModule, i1.NgClass, FormsModule, i2.DefaultValueAccessor, i2.NgControlStatus, i2.NgModel], styles: ["[_nghost-%COMP%] {\n display: block;\n}\n\n\n\n.strip[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n align-items: flex-start;\n justify-content: center;\n gap: 22px;\n padding: 16px 22px 20px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.ctrl-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n.ctrl[_ngcontent-%COMP%] {\n width: 52px;\n height: 52px;\n border-radius: 50%;\n display: grid;\n place-items: center;\n border: 1px solid var(--mj-border-strong);\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-primary);\n cursor: pointer;\n font-size: 18px;\n transition: all 150ms ease;\n}\n.ctrl[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n.ctrl--on[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse, #fff);\n}\n.ctrl--muted[_ngcontent-%COMP%] {\n background: var(--mj-status-warning-bg);\n border-color: var(--mj-status-warning);\n color: var(--mj-status-warning);\n}\n.ctrl--end[_ngcontent-%COMP%] {\n width: 60px;\n height: 60px;\n background: var(--mj-status-error);\n border-color: var(--mj-status-error);\n color: var(--mj-text-inverse, #fff);\n font-size: 20px;\n box-shadow: 0 6px 20px color-mix(in srgb, var(--mj-status-error) 40%, transparent);\n}\n.ctrl--end[_ngcontent-%COMP%]:hover {\n background: var(--mj-status-error);\n filter: brightness(0.92);\n}\n\n.ctrl-label[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n text-align: center;\n margin-top: 6px;\n font-weight: 500;\n}\n.ctrl-label--end[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n\n.thint[_ngcontent-%COMP%] {\n position: absolute;\n right: 22px;\n bottom: 20px;\n display: inline-flex;\n align-items: center;\n gap: 7px;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-disabled);\n}\n.thint[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\nkbd[_ngcontent-%COMP%] {\n font-family: var(--mj-font-mono, ui-monospace, monospace);\n font-size: 10px;\n font-weight: 700;\n color: var(--mj-text-muted);\n border: 1px solid var(--mj-border-strong);\n border-bottom-width: 2px;\n border-radius: 4px;\n padding: 0 5px;\n background: var(--mj-bg-surface-sunken);\n}\n\n\n\n.dock[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 18px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n animation: _ngcontent-%COMP%_dock-in 320ms cubic-bezier(0.2, 0.8, 0.3, 1);\n}\n@keyframes _ngcontent-%COMP%_dock-in {\n from { opacity: 0; transform: translateY(10px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n.dock__minis[_ngcontent-%COMP%] {\n display: flex;\n gap: 7px;\n flex-shrink: 0;\n}\n.mini[_ngcontent-%COMP%] {\n width: 38px;\n height: 38px;\n border-radius: 50%;\n display: grid;\n place-items: center;\n cursor: pointer;\n font-size: 13.5px;\n border: 1px solid var(--mj-border-strong);\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-primary);\n transition: all 140ms ease;\n}\n.mini[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n.mini--on[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 16%, transparent);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-accent, var(--mj-brand-primary));\n}\n.mini--muted[_ngcontent-%COMP%] {\n background: var(--mj-status-warning-bg);\n border-color: var(--mj-status-warning);\n color: var(--mj-status-warning);\n}\n\n.dock__box[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 9px;\n padding: 5px 6px 5px 14px;\n border: 1px solid var(--mj-border-strong);\n border-radius: var(--mj-radius-full, 9999px);\n background: var(--mj-bg-surface-card);\n transition: border-color 140ms ease, box-shadow 140ms ease;\n}\n.dock__box[_ngcontent-%COMP%]:focus-within {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n.dock__input[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n background: transparent;\n border: 0;\n outline: none;\n color: var(--mj-text-primary);\n font-family: inherit;\n font-size: 13.5px;\n}\n.dock__input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-muted);\n}\n\n.dock__hint[_ngcontent-%COMP%] {\n font-size: 10.5px;\n font-weight: 600;\n color: var(--mj-text-disabled);\n white-space: nowrap;\n}\n\n.dock__send[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse, #fff);\n border: 0;\n display: grid;\n place-items: center;\n cursor: pointer;\n font-size: 12px;\n flex-shrink: 0;\n transition: background 150ms ease;\n}\n.dock__send[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover, var(--mj-brand-primary));\n}\n.dock__send[_ngcontent-%COMP%]:disabled {\n opacity: 0.45;\n cursor: not-allowed;\n}\n\n\n\n.dock__hide[_ngcontent-%COMP%] {\n border-style: dashed;\n color: var(--mj-text-muted);\n flex-shrink: 0;\n}\n.dock__hide[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}"] });
|
|
231
|
+
}
|
|
232
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(RealtimeComposerComponent, [{
|
|
233
|
+
type: Component,
|
|
234
|
+
args: [{ standalone: true, selector: 'mj-realtime-composer', imports: [CommonModule, FormsModule], template: "@if (StripMode) {\n <!-- Levels 0\u20131: phone-call strip \u2014 big round controls, nothing to configure.\n Captions arrives at level 1 WITH the text it controls; Details peeks at the\n surface panels on demand; End stays the deliberate rightmost action. -->\n <div class=\"strip\" role=\"group\" aria-label=\"Call controls\">\n <div class=\"ctrl-group\">\n <button type=\"button\" class=\"ctrl\" [class.ctrl--muted]=\"IsMuted\"\n (click)=\"ToggleMute()\"\n [title]=\"IsMuted ? 'Unmute microphone' : 'Mute microphone'\"\n [attr.aria-pressed]=\"IsMuted\">\n <i class=\"fa-solid\" [ngClass]=\"IsMuted ? 'fa-microphone-slash' : 'fa-microphone'\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"ctrl-label\">{{ IsMuted ? 'Unmute' : 'Mute' }}</span>\n </div>\n\n <div class=\"ctrl-group\">\n <button type=\"button\" class=\"ctrl\" [class.ctrl--on]=\"CaptionsOn\"\n (click)=\"ToggleCaptions()\"\n [title]=\"CaptionsOn ? 'Voice-first \u2014 back to the orb' : 'Show the conversation as text'\"\n [attr.aria-pressed]=\"CaptionsOn\">\n <i class=\"fa-solid fa-closed-captioning\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"ctrl-label\">Captions</span>\n </div>\n\n @if (ShowDetails) {\n <div class=\"ctrl-group\">\n <button type=\"button\" class=\"ctrl\" [class.ctrl--on]=\"DetailsOn\"\n (click)=\"DetailsToggled.emit()\"\n [title]=\"DetailsOn ? 'Hide the session panels' : 'Peek at the session panels'\"\n [attr.aria-pressed]=\"DetailsOn\">\n <i class=\"fa-solid fa-table-columns\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"ctrl-label\">Details</span>\n </div>\n }\n\n <div class=\"ctrl-group\">\n <button type=\"button\" class=\"ctrl\" (click)=\"OpenChanged.emit(true)\"\n title=\"Type into the live session\" aria-label=\"Open the typed-input composer\">\n <i class=\"fa-regular fa-keyboard\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"ctrl-label\">Type</span>\n </div>\n\n <div class=\"ctrl-group\">\n <button type=\"button\" class=\"ctrl ctrl--end\" (click)=\"EndRequested.emit()\"\n title=\"End call\" aria-label=\"End call\">\n <i class=\"fa-solid fa-phone-slash\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"ctrl-label ctrl-label--end\">End call</span>\n </div>\n\n <span class=\"thint\"><i class=\"fa-regular fa-keyboard\" aria-hidden=\"true\"></i> press <kbd>T</kbd> to type</span>\n </div>\n} @else {\n <!-- Level 2+: the fused dock \u2014 compact minis + the in-call composer in ONE bottom bar. -->\n <div class=\"dock\">\n <div class=\"dock__minis\">\n <button type=\"button\" class=\"mini\" [class.mini--muted]=\"IsMuted\"\n (click)=\"ToggleMute()\"\n [title]=\"IsMuted ? 'Unmute microphone' : 'Mute microphone'\"\n [attr.aria-pressed]=\"IsMuted\">\n <i class=\"fa-solid\" [ngClass]=\"IsMuted ? 'fa-microphone-slash' : 'fa-microphone'\" aria-hidden=\"true\"></i>\n </button>\n <button type=\"button\" class=\"mini\" [class.mini--on]=\"CaptionsOn\"\n (click)=\"ToggleCaptions()\"\n [title]=\"CaptionsOn ? 'Voice-first \u2014 back to the orb' : 'Show the conversation as text'\"\n [attr.aria-pressed]=\"CaptionsOn\">\n <i class=\"fa-solid fa-closed-captioning\" aria-hidden=\"true\"></i>\n </button>\n @if (ShowDetails) {\n <button type=\"button\" class=\"mini\" [class.mini--on]=\"DetailsOn\"\n (click)=\"DetailsToggled.emit()\"\n [title]=\"DetailsOn ? 'Hide the session panels' : 'Show the session panels'\"\n [attr.aria-pressed]=\"DetailsOn\">\n <i class=\"fa-solid fa-table-columns\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n <div class=\"dock__box\">\n <input\n #dockInput\n type=\"text\"\n class=\"dock__input\"\n placeholder=\"Type into the live session \u2014 joins this same voice call\u2026\"\n [(ngModel)]=\"Draft\"\n (keydown)=\"OnKeydown($event)\"\n aria-label=\"Type a message into the live voice session\" />\n <span class=\"dock__hint\" aria-hidden=\"true\">\u21B5 send</span>\n <button\n class=\"dock__send\"\n type=\"button\"\n [disabled]=\"!CanSend\"\n (click)=\"Send()\"\n title=\"Send into live session\"\n aria-label=\"Send\">\n <i class=\"fa-solid fa-paper-plane\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <button type=\"button\" class=\"mini dock__hide\" (click)=\"OpenChanged.emit(false)\"\n title=\"Hide typing \u2014 back to the voice controls\"\n aria-label=\"Close the typed-input composer\">\n <i class=\"fa-solid fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n}\n", styles: [":host {\n display: block;\n}\n\n/* ---------- Levels 0\u20131: phone-call strip (big round controls, centered) ---------- */\n.strip {\n position: relative;\n display: flex;\n align-items: flex-start;\n justify-content: center;\n gap: 22px;\n padding: 16px 22px 20px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.ctrl-group {\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n.ctrl {\n width: 52px;\n height: 52px;\n border-radius: 50%;\n display: grid;\n place-items: center;\n border: 1px solid var(--mj-border-strong);\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-primary);\n cursor: pointer;\n font-size: 18px;\n transition: all 150ms ease;\n}\n.ctrl:hover {\n background: var(--mj-bg-surface-hover);\n}\n.ctrl--on {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse, #fff);\n}\n.ctrl--muted {\n background: var(--mj-status-warning-bg);\n border-color: var(--mj-status-warning);\n color: var(--mj-status-warning);\n}\n.ctrl--end {\n width: 60px;\n height: 60px;\n background: var(--mj-status-error);\n border-color: var(--mj-status-error);\n color: var(--mj-text-inverse, #fff);\n font-size: 20px;\n box-shadow: 0 6px 20px color-mix(in srgb, var(--mj-status-error) 40%, transparent);\n}\n.ctrl--end:hover {\n background: var(--mj-status-error);\n filter: brightness(0.92);\n}\n\n.ctrl-label {\n font-size: 11px;\n color: var(--mj-text-muted);\n text-align: center;\n margin-top: 6px;\n font-weight: 500;\n}\n.ctrl-label--end {\n color: var(--mj-status-error);\n}\n\n/* The whispered type-to-text hint (level 1: typing exists, no visible composer yet). */\n.thint {\n position: absolute;\n right: 22px;\n bottom: 20px;\n display: inline-flex;\n align-items: center;\n gap: 7px;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-disabled);\n}\n.thint i {\n font-size: 12px;\n}\nkbd {\n font-family: var(--mj-font-mono, ui-monospace, monospace);\n font-size: 10px;\n font-weight: 700;\n color: var(--mj-text-muted);\n border: 1px solid var(--mj-border-strong);\n border-bottom-width: 2px;\n border-radius: 4px;\n padding: 0 5px;\n background: var(--mj-bg-surface-sunken);\n}\n\n/* ---------- Level 2+: the fused dock (minis + composer in one bar) ---------- */\n.dock {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 18px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n animation: dock-in 320ms cubic-bezier(0.2, 0.8, 0.3, 1);\n}\n@keyframes dock-in {\n from { opacity: 0; transform: translateY(10px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n.dock__minis {\n display: flex;\n gap: 7px;\n flex-shrink: 0;\n}\n.mini {\n width: 38px;\n height: 38px;\n border-radius: 50%;\n display: grid;\n place-items: center;\n cursor: pointer;\n font-size: 13.5px;\n border: 1px solid var(--mj-border-strong);\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-primary);\n transition: all 140ms ease;\n}\n.mini:hover {\n background: var(--mj-bg-surface-hover);\n}\n.mini--on {\n background: color-mix(in srgb, var(--mj-brand-primary) 16%, transparent);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-accent, var(--mj-brand-primary));\n}\n.mini--muted {\n background: var(--mj-status-warning-bg);\n border-color: var(--mj-status-warning);\n color: var(--mj-status-warning);\n}\n\n.dock__box {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 9px;\n padding: 5px 6px 5px 14px;\n border: 1px solid var(--mj-border-strong);\n border-radius: var(--mj-radius-full, 9999px);\n background: var(--mj-bg-surface-card);\n transition: border-color 140ms ease, box-shadow 140ms ease;\n}\n.dock__box:focus-within {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n.dock__input {\n flex: 1;\n min-width: 0;\n background: transparent;\n border: 0;\n outline: none;\n color: var(--mj-text-primary);\n font-family: inherit;\n font-size: 13.5px;\n}\n.dock__input::placeholder {\n color: var(--mj-text-muted);\n}\n\n.dock__hint {\n font-size: 10.5px;\n font-weight: 600;\n color: var(--mj-text-disabled);\n white-space: nowrap;\n}\n\n.dock__send {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse, #fff);\n border: 0;\n display: grid;\n place-items: center;\n cursor: pointer;\n font-size: 12px;\n flex-shrink: 0;\n transition: background 150ms ease;\n}\n.dock__send:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover, var(--mj-brand-primary));\n}\n.dock__send:disabled {\n opacity: 0.45;\n cursor: not-allowed;\n}\n\n/* The dock's hide control \u2014 typing is a two-way door, never permanent chrome. */\n.dock__hide {\n border-style: dashed;\n color: var(--mj-text-muted);\n flex-shrink: 0;\n}\n.dock__hide:hover {\n color: var(--mj-text-primary);\n}\n"] }]
|
|
235
|
+
}], null, { Open: [{
|
|
236
|
+
type: Input
|
|
237
|
+
}], OpenChanged: [{
|
|
238
|
+
type: Output
|
|
239
|
+
}], CaptionsOn: [{
|
|
240
|
+
type: Input
|
|
241
|
+
}], ShowDetails: [{
|
|
242
|
+
type: Input
|
|
243
|
+
}], DetailsOn: [{
|
|
244
|
+
type: Input
|
|
245
|
+
}], CaptionsToggled: [{
|
|
246
|
+
type: Output
|
|
247
|
+
}], DetailsToggled: [{
|
|
248
|
+
type: Output
|
|
249
|
+
}], EndRequested: [{
|
|
250
|
+
type: Output
|
|
251
|
+
}], dockInput: [{
|
|
252
|
+
type: ViewChild,
|
|
253
|
+
args: ['dockInput']
|
|
254
|
+
}] }); })();
|
|
255
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(RealtimeComposerComponent, { className: "RealtimeComposerComponent", filePath: "src/lib/components/realtime/realtime-composer.component.ts", lineNumber: 31 }); })();
|
|
256
|
+
//# sourceMappingURL=realtime-composer.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"realtime-composer.component.js","sourceRoot":"","sources":["../../../../src/lib/components/realtime/realtime-composer.component.ts","../../../../src/lib/components/realtime/realtime-composer.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, ElementRef, EventEmitter, Input, Output, ViewChild, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { RealtimeSessionService } from '../../services/realtime-session.service';\n\n/**\n * The call overlay's BOTTOM DOCK — the progressive-disclosure composer\n * (`plans/realtime/mockups/redesign-a-progressive.html`). One component, two shapes,\n * keyed off the overlay's disclosure {@link Level}:\n *\n * - **Levels 0–1 (phone-call strip)** — big round call controls, centered: Mute, the\n * Captions toggle (level 1+, arriving WITH the text it controls), the Details peek\n * (level 0 paths where the surface panel isn't earned yet — lets the user look at the\n * Activity/Whiteboard panels on demand), and End call. Level 1 adds the whispered\n * \"press T to type\" hint — typing exists, but there's no visible composer yet.\n * - **Level 2+ (the dock)** — mute/captions shrink to compact minis and the in-call text\n * input docks beside them (one bottom bar, per Redesign A's fused composer+controls).\n * Submit calls {@link RealtimeSessionService.SendText}, which injects the text as a user\n * turn into the SAME live voice call.\n *\n * Mute talks to the session service directly (pure local toggle); captions / Details /\n * End are emitted up so the overlay shell owns that state and lifecycle.\n */\n@Component({\n standalone: true,\n selector: 'mj-realtime-composer',\n imports: [CommonModule, FormsModule],\n templateUrl: './realtime-composer.component.html',\n styleUrl: './realtime-composer.component.css'\n})\nexport class RealtimeComposerComponent {\n /**\n * Whether the typed-input dock is OPEN. A two-way door owned by the user: the strip's\n * Type control (or the T hotkey) opens it; the dock's hide control closes it — typing\n * never becomes permanent chrome. Default closed (voice-first), reset per session.\n */\n @Input() Open = false;\n\n /** Emitted when the user opens (Type control / typing) or closes (hide control) the dock. */\n @Output() OpenChanged = new EventEmitter<boolean>();\n\n /** Whether captions are currently shown (drives the captions control's active state). */\n @Input() CaptionsOn = true;\n\n /** Whether the Details peek control renders (true until the surface panel is earned). */\n @Input() ShowDetails = false;\n\n /** Whether the Details peek is currently open (active state on the control). */\n @Input() DetailsOn = false;\n\n /** Emitted when the user toggles captions; the overlay flips its caption state. */\n @Output() CaptionsToggled = new EventEmitter<boolean>();\n\n /** Emitted when the user toggles the Details peek (the on-demand surface panel). */\n @Output() DetailsToggled = new EventEmitter<void>();\n\n /** Emitted when the user ends the call from the strip's End control. */\n @Output() EndRequested = new EventEmitter<void>();\n\n /** Current draft text in the dock's composer input. */\n public Draft = '';\n\n /** Local mic mute state, reflected from the service. */\n public IsMuted = false;\n\n @ViewChild('dockInput') private dockInput?: ElementRef<HTMLInputElement>;\n\n private voice = inject(RealtimeSessionService);\n\n /** True when there's non-whitespace text to send. */\n public get CanSend(): boolean {\n return this.Draft.trim().length > 0;\n }\n\n /** True while the big-controls phone-call strip renders (instead of the dock). */\n public get StripMode(): boolean {\n return !this.Open;\n }\n\n /** Toggle the local microphone mute. */\n public ToggleMute(): void {\n this.IsMuted = this.voice.ToggleMute();\n }\n\n /** Toggle captions visibility and notify the overlay. */\n public ToggleCaptions(): void {\n this.CaptionsOn = !this.CaptionsOn;\n this.CaptionsToggled.emit(this.CaptionsOn);\n }\n\n /** Focuses the dock's text input (the overlay's T-to-type hotkey lands here). */\n public FocusInput(): void {\n this.dockInput?.nativeElement.focus();\n }\n\n /** Send the typed text into the live session, then clear the input. */\n public Send(): void {\n if (!this.CanSend) {\n return;\n }\n this.voice.SendText(this.Draft);\n this.Draft = '';\n }\n\n /** Enter sends (Shift+Enter is free for future multiline if the input becomes a textarea). */\n public OnKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n this.Send();\n }\n }\n}\n","@if (StripMode) {\n <!-- Levels 0–1: phone-call strip — big round controls, nothing to configure.\n Captions arrives at level 1 WITH the text it controls; Details peeks at the\n surface panels on demand; End stays the deliberate rightmost action. -->\n <div class=\"strip\" role=\"group\" aria-label=\"Call controls\">\n <div class=\"ctrl-group\">\n <button type=\"button\" class=\"ctrl\" [class.ctrl--muted]=\"IsMuted\"\n (click)=\"ToggleMute()\"\n [title]=\"IsMuted ? 'Unmute microphone' : 'Mute microphone'\"\n [attr.aria-pressed]=\"IsMuted\">\n <i class=\"fa-solid\" [ngClass]=\"IsMuted ? 'fa-microphone-slash' : 'fa-microphone'\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"ctrl-label\">{{ IsMuted ? 'Unmute' : 'Mute' }}</span>\n </div>\n\n <div class=\"ctrl-group\">\n <button type=\"button\" class=\"ctrl\" [class.ctrl--on]=\"CaptionsOn\"\n (click)=\"ToggleCaptions()\"\n [title]=\"CaptionsOn ? 'Voice-first — back to the orb' : 'Show the conversation as text'\"\n [attr.aria-pressed]=\"CaptionsOn\">\n <i class=\"fa-solid fa-closed-captioning\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"ctrl-label\">Captions</span>\n </div>\n\n @if (ShowDetails) {\n <div class=\"ctrl-group\">\n <button type=\"button\" class=\"ctrl\" [class.ctrl--on]=\"DetailsOn\"\n (click)=\"DetailsToggled.emit()\"\n [title]=\"DetailsOn ? 'Hide the session panels' : 'Peek at the session panels'\"\n [attr.aria-pressed]=\"DetailsOn\">\n <i class=\"fa-solid fa-table-columns\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"ctrl-label\">Details</span>\n </div>\n }\n\n <div class=\"ctrl-group\">\n <button type=\"button\" class=\"ctrl\" (click)=\"OpenChanged.emit(true)\"\n title=\"Type into the live session\" aria-label=\"Open the typed-input composer\">\n <i class=\"fa-regular fa-keyboard\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"ctrl-label\">Type</span>\n </div>\n\n <div class=\"ctrl-group\">\n <button type=\"button\" class=\"ctrl ctrl--end\" (click)=\"EndRequested.emit()\"\n title=\"End call\" aria-label=\"End call\">\n <i class=\"fa-solid fa-phone-slash\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"ctrl-label ctrl-label--end\">End call</span>\n </div>\n\n <span class=\"thint\"><i class=\"fa-regular fa-keyboard\" aria-hidden=\"true\"></i> press <kbd>T</kbd> to type</span>\n </div>\n} @else {\n <!-- Level 2+: the fused dock — compact minis + the in-call composer in ONE bottom bar. -->\n <div class=\"dock\">\n <div class=\"dock__minis\">\n <button type=\"button\" class=\"mini\" [class.mini--muted]=\"IsMuted\"\n (click)=\"ToggleMute()\"\n [title]=\"IsMuted ? 'Unmute microphone' : 'Mute microphone'\"\n [attr.aria-pressed]=\"IsMuted\">\n <i class=\"fa-solid\" [ngClass]=\"IsMuted ? 'fa-microphone-slash' : 'fa-microphone'\" aria-hidden=\"true\"></i>\n </button>\n <button type=\"button\" class=\"mini\" [class.mini--on]=\"CaptionsOn\"\n (click)=\"ToggleCaptions()\"\n [title]=\"CaptionsOn ? 'Voice-first — back to the orb' : 'Show the conversation as text'\"\n [attr.aria-pressed]=\"CaptionsOn\">\n <i class=\"fa-solid fa-closed-captioning\" aria-hidden=\"true\"></i>\n </button>\n @if (ShowDetails) {\n <button type=\"button\" class=\"mini\" [class.mini--on]=\"DetailsOn\"\n (click)=\"DetailsToggled.emit()\"\n [title]=\"DetailsOn ? 'Hide the session panels' : 'Show the session panels'\"\n [attr.aria-pressed]=\"DetailsOn\">\n <i class=\"fa-solid fa-table-columns\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n <div class=\"dock__box\">\n <input\n #dockInput\n type=\"text\"\n class=\"dock__input\"\n placeholder=\"Type into the live session — joins this same voice call…\"\n [(ngModel)]=\"Draft\"\n (keydown)=\"OnKeydown($event)\"\n aria-label=\"Type a message into the live voice session\" />\n <span class=\"dock__hint\" aria-hidden=\"true\">↵ send</span>\n <button\n class=\"dock__send\"\n type=\"button\"\n [disabled]=\"!CanSend\"\n (click)=\"Send()\"\n title=\"Send into live session\"\n aria-label=\"Send\">\n <i class=\"fa-solid fa-paper-plane\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <button type=\"button\" class=\"mini dock__hide\" (click)=\"OpenChanged.emit(false)\"\n title=\"Hide typing — back to the voice controls\"\n aria-label=\"Close the typed-input composer\">\n <i class=\"fa-solid fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n}\n"]}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { EventEmitter } from '@angular/core';
|
|
2
|
+
import { RealtimeDelegationCardVM } from './realtime-session-state';
|
|
3
|
+
import { ParsedDelegationArtifact } from '../../services/delegation-result-parser';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/**
|
|
6
|
+
* Renders a single delegation in the live session thread:
|
|
7
|
+
* - **Working**: a compact card — agent avatar, "<agent> is working…", the CURRENT
|
|
8
|
+
* friendly step label, the latest raw message indented + muted beneath it, and a
|
|
9
|
+
* thin progress bar (determinate when the server supplies a percentage,
|
|
10
|
+
* indeterminate shimmer otherwise).
|
|
11
|
+
* - **Done**: COLLAPSED to a single-line chip — `✓ <agent> · <one-line result preview>
|
|
12
|
+
* · via <agent>` — expandable inline (click / chevron) to the full result text.
|
|
13
|
+
* Failures render the `✗` variant.
|
|
14
|
+
*
|
|
15
|
+
* Provenance is a small `via <agent>` badge + a shield icon whose `title` tooltip
|
|
16
|
+
* carries the full provenance sentence (no repeated sentence under every card).
|
|
17
|
+
*
|
|
18
|
+
* DEVELOPER MODE (gear-gated by the overlay shell): when {@link DevMode} is on and the
|
|
19
|
+
* card knows its delegated run id, an "Open run" link is revealed that emits
|
|
20
|
+
* {@link OpenRunRequested} so the shell can navigate to the `MJ: AI Agent Runs` record.
|
|
21
|
+
*/
|
|
22
|
+
export declare class RealtimeDelegationCardComponent {
|
|
23
|
+
/** Maximum characters of the result shown in the collapsed done chip. */
|
|
24
|
+
private static readonly PreviewMaxChars;
|
|
25
|
+
/** The delegation card view-model to render (immutable — replaced on every update). */
|
|
26
|
+
Card: RealtimeDelegationCardVM;
|
|
27
|
+
/** Whether developer affordances (the "Open run" link) are revealed. */
|
|
28
|
+
DevMode: boolean;
|
|
29
|
+
/** Emitted with the delegated run's ID when the dev "Open run" link is clicked. */
|
|
30
|
+
OpenRunRequested: EventEmitter<string>;
|
|
31
|
+
/** Emitted when a "View" artifact chip is clicked (the overlay focuses the artifact's tab). */
|
|
32
|
+
OpenArtifactRequested: EventEmitter<ParsedDelegationArtifact>;
|
|
33
|
+
/**
|
|
34
|
+
* Emitted with the call's ID when the WORKING card's ✕ cancel affordance is clicked —
|
|
35
|
+
* EXPLICIT user intent to kill the in-flight delegated run (by deliberate host policy,
|
|
36
|
+
* barge-in alone never cancels delegations; only this button does). The overlay routes
|
|
37
|
+
* it to `RealtimeSessionService.CancelDelegation`, which flips this card to a failed
|
|
38
|
+
* "Cancelled by user" result.
|
|
39
|
+
*/
|
|
40
|
+
CancelRequested: EventEmitter<string>;
|
|
41
|
+
/** Whether the done chip is expanded inline to show the full result text. */
|
|
42
|
+
Expanded: boolean;
|
|
43
|
+
/** The artifacts this (done) delegation produced (empty array while running / when none). */
|
|
44
|
+
get Artifacts(): ParsedDelegationArtifact[];
|
|
45
|
+
/** Emits the open-artifact request for one of this card's produced artifacts. */
|
|
46
|
+
OpenArtifact(event: MouseEvent, artifact: ParsedDelegationArtifact): void;
|
|
47
|
+
/** True when the dev "Open run" link should render (gear on + run id known). */
|
|
48
|
+
get ShowOpenRun(): boolean;
|
|
49
|
+
/** Emits the open-run request for this card's delegated run. */
|
|
50
|
+
OpenRun(event: MouseEvent): void;
|
|
51
|
+
/** Emits the cancel request for this (still-working) delegation. */
|
|
52
|
+
CancelWork(event: MouseEvent): void;
|
|
53
|
+
/** Friendly label for the current delegation step (raw message as fallback). */
|
|
54
|
+
get StepLabel(): string;
|
|
55
|
+
/**
|
|
56
|
+
* Whether to render the latest raw message as the indented detail line. Hidden when
|
|
57
|
+
* it would just repeat the step label (the unknown-step fallback maps label = message).
|
|
58
|
+
*/
|
|
59
|
+
get ShowDetailLine(): boolean;
|
|
60
|
+
/** Full result text (falls back to the last progress message / a generic line). */
|
|
61
|
+
get ResultText(): string;
|
|
62
|
+
/** One-line, ~120-char preview of the result for the collapsed chip. */
|
|
63
|
+
get ResultPreview(): string;
|
|
64
|
+
/** Tooltip text for the provenance shield icon. */
|
|
65
|
+
get ProvenanceTitle(): string;
|
|
66
|
+
/** Toggles the done chip's inline expansion. */
|
|
67
|
+
ToggleExpanded(): void;
|
|
68
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<RealtimeDelegationCardComponent, never>;
|
|
69
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<RealtimeDelegationCardComponent, "mj-realtime-delegation-card", never, { "Card": { "alias": "Card"; "required": true; }; "DevMode": { "alias": "DevMode"; "required": false; }; }, { "OpenRunRequested": "OpenRunRequested"; "OpenArtifactRequested": "OpenArtifactRequested"; "CancelRequested": "CancelRequested"; }, never, never, true, never>;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=realtime-delegation-card.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"realtime-delegation-card.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/realtime/realtime-delegation-card.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,YAAY,EAAiB,MAAM,eAAe,CAAC;AAEvE,OAAO,EAAE,wBAAwB,EAAqB,MAAM,0BAA0B,CAAC;AACvF,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;;AAEnF;;;;;;;;;;;;;;;;GAgBG;AACH,qBAOa,+BAA+B;IAC1C,yEAAyE;IACzE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAO;IAE9C,uFAAuF;IAC5D,IAAI,EAAG,wBAAwB,CAAC;IAE3D,wEAAwE;IAC/D,OAAO,UAAS;IAEzB,mFAAmF;IACzE,gBAAgB,uBAA8B;IAExD,+FAA+F;IACrF,qBAAqB,yCAAgD;IAE/E;;;;;;OAMG;IACO,eAAe,uBAA8B;IAEvD,6EAA6E;IACtE,QAAQ,UAAS;IAExB,6FAA6F;IAC7F,IAAW,SAAS,IAAI,wBAAwB,EAAE,CAEjD;IAED,iFAAiF;IAC1E,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,wBAAwB,GAAG,IAAI;IAKhF,gFAAgF;IAChF,IAAW,WAAW,IAAI,OAAO,CAEhC;IAED,gEAAgE;IACzD,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAOvC,oEAAoE;IAC7D,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAO1C,gFAAgF;IAChF,IAAW,SAAS,IAAI,MAAM,CAE7B;IAED;;;OAGG;IACH,IAAW,cAAc,IAAI,OAAO,CAEnC;IAED,mFAAmF;IACnF,IAAW,UAAU,IAAI,MAAM,CAI9B;IAED,wEAAwE;IACxE,IAAW,aAAa,IAAI,MAAM,CAIjC;IAED,mDAAmD;IACnD,IAAW,eAAe,IAAI,MAAM,CAGnC;IAED,gDAAgD;IACzC,cAAc,IAAI,IAAI;yCA9FlB,+BAA+B;2CAA/B,+BAA+B;CAiG3C"}
|