@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 @@
|
|
|
1
|
+
{"version":3,"file":"realtime-session-overlay.component.js","sourceRoot":"","sources":["../../../../src/lib/components/realtime/realtime-session-overlay.component.ts","../../../../src/lib/components/realtime/realtime-session-overlay.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, ElementRef, EventEmitter, HostListener, Input, Output, OnDestroy, AfterViewInit, ChangeDetectorRef, NgZone, TemplateRef, ViewChild, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Subscription } from 'rxjs';\nimport { UserInfo } from '@memberjunction/core';\nimport { UserInfoEngine } from '@memberjunction/core-entities';\nimport { SharedGenericModule } from '@memberjunction/ng-shared-generic';\nimport { VoiceConnectionState, RealtimeSessionService } from '../../services/realtime-session.service';\nimport { ParsedDelegationArtifact } from '../../services/delegation-result-parser';\nimport { BuildReviewThreadItems, RealtimeSessionReview } from '../../services/realtime-session-review.service';\nimport { RealtimeSessionState } from './realtime-session-state';\nimport { RealtimeAgentBannerComponent } from './realtime-agent-banner.component';\nimport { RealtimeSessionThreadComponent } from './realtime-session-thread.component';\nimport { RealtimeChannelStripComponent } from './realtime-channel-strip.component';\nimport { RealtimeComposerComponent } from './realtime-composer.component';\nimport { RealtimeSurfaceTabsComponent } from './realtime-surface-tabs.component';\nimport {\n ClampSurfacePanelWidth, DefaultSurfacePanelWidth, IsSurfacePanelDrag, ParseSurfacePanelPref,\n SerializeSurfacePanelPref, SurfacePanelDragWidth,\n SURFACE_PANEL_COLLAPSED_WIDTH, SURFACE_PANEL_DEFAULT_WIDTH, SURFACE_PANEL_PREF_KEY\n} from './realtime-surface-panel-prefs';\nimport { RealtimeDisclosureModel, RealtimeUxDensity, SerializeUxMilestones, REALTIME_UX_PREF_KEY } from './realtime-disclosure';\nimport { RealtimeAudioVisualFrame, RealtimeAudioVisualSmoother, RealtimeVoiceDirection } from './realtime-audio-visuals';\nimport { RealtimeChannelTabRegistration, ShouldRemoveReviewWhiteboardTab } from './realtime-surface-tabs.model';\nimport { BaseRealtimeChannelClient } from './channels/base-realtime-channel-client';\nimport { RealtimeWhiteboardBoardComponent, WhiteboardState } from '@memberjunction/ng-whiteboard';\n\n/**\n * A request to open an entity record, emitted by the call overlay's gear-gated developer\n * links (\"Open run\" / \"Open session\"). The Generic host (chat area) converts it onto its\n * existing `openEntityRecord` output chain — the package never navigates itself (no Router).\n */\nexport interface RealtimeNavigateRequest {\n /** Entity to open (e.g. `MJ: AI Agent Runs`, `MJ: AI Agent Sessions`). */\n EntityName: string;\n /** ID of the record to open. */\n RecordID: string;\n}\n\n/**\n * A request to RESUME a reviewed session as a NEW live call, emitted by review mode's\n * \"Start live session\" button. The host (chat area) clears its review state and starts a\n * voice session through the same path the composer's mic uses, passing\n * {@link LastSessionId} so the server chains the new session to the reviewed one\n * (restoring saved channel states such as the whiteboard via `PriorChannelStatesJson`).\n */\nexport interface RealtimeStartLiveRequest {\n /** Agent the resumed session should front (review Config `targetAgentID`, else the session's `AgentID`). */\n TargetAgentId: string;\n /** Conversation the reviewed session was bound to, when any. */\n ConversationId: string | null;\n /** The reviewed session's id — chained as the new session's `lastSessionId`. */\n LastSessionId: string;\n}\n\n/**\n * The \"call mode\" overlay for a live real-time voice session. Hosted by the\n * conversation chat area (`<mj-conversation-chat-area>`) behind `Active$`, it fills the\n * conversation panel IN PLACE (`position:absolute; inset:0` over the panel — not a\n * fixed app-wide dialog), replacing the conversation view including the composer.\n *\n * Two-column layout:\n * - MAIN column — {@link RealtimeAgentBannerComponent} (the unified APP-BAR: identity +\n * turn-state + the disclosure-gated action cluster), the unified\n * {@link RealtimeSessionThreadComponent} (or the level-0 pure-audio hero), the channel\n * strip, and {@link RealtimeComposerComponent} (the bottom dock: phone-call strip ⇄\n * fused minis+composer).\n * - RIGHT PANEL — {@link RealtimeSurfaceTabsComponent}: the TABBED surface panel.\n * Tab 1 \"Activity\" hosts the session activity rail; one tab opens per ARTIFACT a\n * delegated run produces (auto-focused + flashed on arrival, viewed read-only via the\n * standard artifact viewer); ONE TAB PER INTERACTIVE CHANNEL the session resolved from\n * the `MJ: AI Agent Channels` registry. Collapsible to a slim strip at the panel level.\n *\n * INTERACTIVE CHANNELS ARE PLUGINS — this shell is channel-agnostic. It subscribes\n * {@link RealtimeSessionService.ActiveChannels$} and registers one surface tab per\n * {@link BaseRealtimeChannelClient} (key/title/icon from the plugin); the tab pane creates\n * the plugin's surface component dynamically and the PLUGIN wires its own inputs/outputs.\n * The only channel-generic affordance the shell owns is the FOCUS layout: any channel may\n * request it (via its context's `SetFocusMode` → {@link RealtimeSessionService.ChannelFocus$}),\n * which collapses the main call column (`.board-focus`) and shows the floating call pill.\n *\n * Owns the shared {@link RealtimeSessionState} — the SINGLE merge of the service's\n * caption/delegation/narration streams — and passes it to both thread and rail via\n * inputs, so neither duplicates subscription logic.\n *\n * DEVELOPER MODE: the controls row's gear toggles {@link DevMode} (per-session, off by\n * default, never persisted), revealing \"Open run\" links on delegation cards / rail items\n * and an \"Open session\" link in the banner. Clicking one emits {@link NavigateRequest}\n * and MINIMIZES the call (via {@link RealtimeSessionService.SetMinimized}) — the session\n * stays live while the host navigates to the record.\n *\n * SESSION REVIEW MODE: when the host supplies {@link ReviewData} (a loaded\n * `RealtimeSessionReview`) and NO live session is active, the overlay renders what went\n * down in that PAST session instead of a live call: the banner shows a \"Session review\"\n * badge + lifecycle range + close-reason chip; the SAME thread/rail components render the\n * historical caption turns and delegated-run cards (via\n * {@link RealtimeSessionState.LoadHistoricalItems}); a read-only Whiteboard tab is\n * registered ONLY when the session saved a parseable Whiteboard channel state. Everything\n * live is DEAD in review — no mic, no captions stream, no composer, no channel strip; the\n * controls collapse to a single \"Start live session\" button ({@link StartLiveRequested},\n * which resumes by chaining `lastSessionId`) and a Close button ({@link ReviewClosed}).\n */\n@Component({\n standalone: true,\n selector: 'mj-realtime-session-overlay',\n imports: [\n CommonModule,\n SharedGenericModule,\n RealtimeAgentBannerComponent,\n RealtimeSessionThreadComponent,\n RealtimeChannelStripComponent,\n RealtimeComposerComponent,\n RealtimeSurfaceTabsComponent,\n RealtimeWhiteboardBoardComponent\n ],\n templateUrl: './realtime-session-overlay.component.html',\n styleUrl: './realtime-session-overlay.component.css'\n})\nexport class RealtimeSessionOverlayComponent implements AfterViewInit, OnDestroy {\n private _agentName = 'Sage';\n\n /**\n * True while the call is MINIMIZED: the overlay hides itself (CSS, not destruction) so\n * the host can show its floating \"on call\" pill WITHOUT losing this shell's merged\n * session state (delegation cards ride non-replaying streams) or view state (dev mode,\n * expanded chips, scroll position). The host binds this from `Minimized$`.\n */\n @Input() Hidden = false;\n\n /** Display name of the agent the voice session fronts (e.g. \"Sage\"). */\n @Input()\n set AgentName(value: string) {\n this._agentName = value || 'Sage';\n this.State.AgentName = this._agentName;\n }\n get AgentName(): string {\n return this._agentName;\n }\n\n /** The signed-in user, threaded to the surface panel's artifact viewer. */\n @Input() CurrentUser: UserInfo | null = null;\n\n /** The active environment id, threaded to the surface panel's artifact viewer. */\n @Input() EnvironmentID = '';\n\n /**\n * SESSION REVIEW data: when set (and no live session is active) the overlay renders\n * the reviewed past session instead of a live call. Setting it populates the shared\n * {@link State} with the historical thread and prepares the read-only whiteboard tab;\n * clearing it returns the state to its live-merge baseline.\n */\n @Input()\n set ReviewData(value: RealtimeSessionReview | null) {\n if (value === this._reviewData) {\n return;\n }\n this._reviewData = value;\n if (value && !this.voice.IsActive) {\n this.enterReview(value);\n } else if (!value) {\n this.exitReview();\n }\n }\n get ReviewData(): RealtimeSessionReview | null {\n return this._reviewData;\n }\n\n /** Emitted after the call ends so the host can react (visibility is driven by Active$). */\n @Output() Ended = new EventEmitter<void>();\n\n /**\n * Emitted when a gear-gated developer link asks to open an entity record. The host is\n * expected to bubble this through its standard record-open path (the chat area re-emits\n * it on `openEntityRecord`, which Explorer routes via `NavigationService`). The overlay\n * minimizes itself first so the live call survives the navigation.\n */\n @Output() NavigateRequest = new EventEmitter<RealtimeNavigateRequest>();\n\n /**\n * Review mode's \"Start live session\": the host clears its review state and resumes the\n * reviewed session as a new live call (chaining `LastSessionId` to restore channel states).\n */\n @Output() StartLiveRequested = new EventEmitter<RealtimeStartLiveRequest>();\n\n /** Review mode's Close: the host clears its review state, returning to the conversation. */\n @Output() ReviewClosed = new EventEmitter<void>();\n\n private voice = inject(RealtimeSessionService);\n private cdr = inject(ChangeDetectorRef);\n\n private _reviewData: RealtimeSessionReview | null = null;\n\n /**\n * Set by {@link OnStartLive} just before emitting {@link StartLiveRequested}, so the\n * ReviewData→null transition that follows is recognized as a REVIEW→LIVE CONTINUATION\n * (keep the historical thread + append the \"Resumed live session\" divider) rather than\n * a plain review close (clear everything).\n */\n private pendingLiveContinuation = false;\n\n /** The reviewed chain's history artifacts, registered as unfocused surface tabs. */\n private reviewArtifacts: ParsedDelegationArtifact[] = [];\n\n /**\n * True while the surface panel carries the REVIEW-registered (template-based, read-only)\n * Whiteboard tab. Drives the review→live continuation edge: when the resumed live\n * session's channel set resolves WITHOUT a Whiteboard channel, the stale review tab is\n * removed (see {@link cleanupStaleReviewBoardTab}); when it resolves WITH one, the live\n * plugin re-registers the same key and the tab upgrades in place.\n */\n private reviewWhiteboardTabRegistered = false;\n\n /** True while the overlay renders a PAST session (review data set, no live call). */\n public get IsReviewing(): boolean {\n return this._reviewData !== null && !this.voice.IsActive;\n }\n\n /**\n * The reviewed session's rehydrated whiteboard, when it saved a parseable Whiteboard\n * channel state — rendered read-only by the review whiteboard tab. Null = no tab.\n */\n public ReviewWhiteboard: WhiteboardState | null = null;\n\n /** Shared session state — single source for the thread AND the activity rail. */\n public readonly State = new RealtimeSessionState();\n\n /**\n * PROGRESSIVE DISCLOSURE: the levels/milestones model behind the pure-audio-first UX\n * (see {@link RealtimeDisclosureModel}). Loaded from UserInfoEngine at construction;\n * content events ({@link onSessionStateChanged}, {@link onChannelActivity}) raise the\n * volatile session level; milestones ratchet + persist when the call ends. REVIEW mode\n * bypasses disclosure entirely — a past session always renders the full console.\n */\n public readonly Disclosure = new RealtimeDisclosureModel();\n\n /**\n * The strip's Details peek: shows the surface panel ON DEMAND while it isn't earned yet\n * (disclosure level < 2) — Activity and channel surfaces exist before their content\n * does. Cleared automatically once content earns the panel for real.\n */\n public DetailsPeek = false;\n\n /**\n * Whether the typed-input dock is open — a TWO-WAY user door (the strip's Type\n * control / the T hotkey open it; the dock's hide control closes it), volatile and\n * reset per session. Typing never becomes permanent chrome.\n */\n public ComposerOpen = false;\n\n /** Live turn-state from the session service — drives the banner + connecting screen. */\n public readonly ConnectionState$ = this.voice.ConnectionState$;\n\n /** Server-reported realtime model name for the active session — shown subtly in the banner. */\n public readonly ModelName$ = this.voice.ModelName$;\n\n /**\n * Whether the conversation renders as TEXT (the thread) or stays voice-first (the\n * orb hero). A PERSISTED per-user preference (`mj.realtimeVoice.captions.v1`) —\n * default OFF: voice-first, the orb owns the screen until the user opts into text.\n */\n public ShowCaptions = false;\n\n /** UserInfoEngine key for the persisted captions (text-vs-orb) preference. */\n private static readonly CaptionsPrefKey = 'mj.realtimeVoice.captions.v1';\n\n /**\n * Whether developer affordances (open-record links) are revealed. Per-session view\n * state on this shell — off by default, reset with the overlay, never persisted.\n */\n public DevMode = false;\n\n /** ID of the live server-side agent session record, for the banner's dev link. */\n public get SessionID(): string | null {\n return this.voice.CurrentAgentSessionId;\n }\n\n /**\n * The tabbed surface panel (right panel) — channel registrations are forwarded to it.\n * A SETTER because the panel is disclosure-gated (`@if`): it can be created LATE (the\n * first delegation / channel activity reveals it mid-call), at which point any queued\n * channel registrations and a pending auto-reveal must flush to the fresh instance.\n */\n private surfaceTabs?: RealtimeSurfaceTabsComponent;\n @ViewChild(RealtimeSurfaceTabsComponent)\n private set surfaceTabsRef(ref: RealtimeSurfaceTabsComponent | undefined) {\n this.surfaceTabs = ref;\n if (ref) {\n // A (re)created panel starts with a FRESH tab model: artifact tabs self-recover\n // (the panel re-scans the session state) but CHANNEL tabs only registered when\n // ActiveChannels$ emitted at session start — re-register the live set here so\n // hiding the panel (pure-audio return, Details off) never loses the Whiteboard.\n this.registerChannelTabs([...this.voice.ActiveChannels]);\n this.flushPendingChannelTabs();\n const reveal = this.pendingRevealKey;\n this.pendingRevealKey = null;\n // Deferred: focus/expand feed the parent's width bindings (wide tier) — never\n // mutate those inside the change-detection pass that created the panel.\n setTimeout(() => {\n if (reveal) {\n // The agent's first channel activity caused this creation — land ON the board.\n ref.RevealChannel(reveal);\n } else {\n // Default for a fresh panel (live AND review): the marquee surface — channels\n // lead the strip — NOT the Activity rail; agent-run plumbing is opt-in only.\n // (Review channel tabs register a beat later and take focus themselves.)\n ref.FocusFirstTab();\n }\n });\n }\n }\n\n /** The bottom dock — the T-to-type hotkey focuses its input. */\n @ViewChild(RealtimeComposerComponent) private composer?: RealtimeComposerComponent;\n\n /** Channel keys already auto-revealed this session (first activity only). */\n private revealedChannelKeys = new Set<string>();\n\n /** Auto-reveal that arrived before the (disclosure-gated) panel rendered. */\n private pendingRevealKey: string | null = null;\n\n /** Previous Active$ value — edges drive disclosure session begin/ratchet. */\n private prevActive = false;\n\n /** Template hosting the read-only review whiteboard (root-level, so always resolvable). */\n @ViewChild('reviewBoardTpl') private reviewBoardTpl?: TemplateRef<unknown>;\n\n /** Channel registrations received before the surface panel rendered (flushed in ngAfterViewInit). */\n private pendingChannelTabs: RealtimeChannelTabRegistration[] = [];\n\n /** True once the view (and the review-board template ref) exists. */\n private viewReady = false;\n\n // ── Channel FOCUS layout (channel-generic — any plugin may request it) ─────\n\n /**\n * True while a channel surface is in FOCUS mode: the main call column collapses\n * (`.board-focus` on the overlay) and a compact floating call pill (orb + state +\n * mute / show-thread / end) rides over the surface.\n */\n public ChannelFocusMode = false;\n\n /** Mic-muted state reflected on the focus pill's mute button. */\n public FocusPillMuted = false;\n\n /** The channel currently holding the focus layout (the pill's exit routes back to it). */\n private focusChannel: BaseRealtimeChannelClient | null = null;\n\n private subs: Subscription[] = [];\n\n constructor() {\n this.loadPanelWidthPref();\n this.loadDisclosurePref();\n this.loadCaptionsPref();\n this.State.Attach(this.voice);\n this.subs.push(\n // Re-render on merged-state changes; content arrival raises the disclosure level.\n this.State.Changed$.subscribe(() => this.onSessionStateChanged()),\n this.Disclosure.Changed$.subscribe(() => this.cdr.markForCheck()),\n // One surface tab per registry-resolved channel plugin (replays the current set).\n this.voice.ActiveChannels$.subscribe(channels => this.registerChannelTabs(channels)),\n // Any channel may request the focus layout through its host context.\n this.voice.ChannelFocus$.subscribe(event => this.onChannelFocus(event.Channel, event.Focused)),\n // The agent ACTED on a channel — auto-reveal its surface tab on first activity.\n this.voice.ChannelActivity$.subscribe(plugin => this.onChannelActivity(plugin)),\n // Live/idle flips: reset/ratchet disclosure + re-evaluate the review-vs-live branch.\n this.voice.Active$.subscribe(active => this.onActiveChanged(active))\n );\n }\n\n ngAfterViewInit(): void {\n this.viewReady = true;\n this.flushPendingChannelTabs();\n this.registerReviewBoardTab();\n this.registerReviewArtifactTabs();\n }\n\n // ── Surface-panel sizing (flex layout + pointer-drag handle; width persisted per-user) ──\n //\n // The panel width is a PLAIN FIELD rendered via [style.width.px] — there is no split\n // library with its own internal size state to fight. The resize handle uses the same\n // mechanics as ui-components' slide-panel (`MjSlidePanelComponent`): mousedown →\n // document mousemove/mouseup registered OUTSIDE Angular, live clamp while dragging,\n // adopt + persist on release. A bare CLICK cannot move the panel by construction\n // (width follows the pointer delta) and the click-vs-drag guard keeps it from being\n // adopted or persisted.\n\n /** Whether the surface panel is collapsed to its slim strip (reported by the panel). */\n public PanelCollapsed = false;\n /** Wide tier active (a content tab is focused) — drives the DEFAULT width only. */\n public PanelWide = false;\n /** The user's explicit dragged width (persisted); null = follow the default tiers. */\n private userPanelWidth: number | null = null;\n /** Current expanded panel width in px (rendered as the panel's inline width). */\n public PanelWidthPx = SURFACE_PANEL_DEFAULT_WIDTH;\n /** True while the resize handle is mid-drag (brand-tints the handle). */\n public IsPanelResizing = false;\n private panelResizeStartX = 0;\n private panelResizeStartWidth = 0;\n private boundPanelResizeMove = this.onPanelResizeMove.bind(this);\n private boundPanelResizeEnd = this.onPanelResizeEnd.bind(this);\n private hostRef = inject(ElementRef);\n private ngZone = inject(NgZone);\n\n /** The panel's rendered width: slim strip when collapsed, otherwise the current width. */\n public get PanelAreaSize(): number {\n return this.PanelCollapsed ? SURFACE_PANEL_COLLAPSED_WIDTH : this.PanelWidthPx;\n }\n\n /** Resizing is meaningless while collapsed or when the surface fills (focus mode). */\n public get PanelResizeDisabled(): boolean {\n return this.PanelCollapsed || this.ChannelFocusMode;\n }\n\n public OnPanelCollapsedChange(collapsed: boolean): void {\n this.PanelCollapsed = collapsed;\n this.cdr.markForCheck();\n }\n\n /** Wide-tier flips only move the DEFAULT width — an explicit user width always wins. */\n public OnPanelWideChanged(wide: boolean): void {\n this.PanelWide = wide;\n if (this.userPanelWidth === null) {\n this.PanelWidthPx = DefaultSurfacePanelWidth(wide, this.hostWidth());\n }\n this.cdr.markForCheck();\n }\n\n /** Mousedown on the resize handle: capture the start state and track the pointer document-wide. */\n public OnPanelResizeStart(event: MouseEvent): void {\n if (this.PanelResizeDisabled) {\n return;\n }\n event.preventDefault();\n this.IsPanelResizing = true;\n this.panelResizeStartX = event.clientX;\n this.panelResizeStartWidth = this.PanelWidthPx;\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n this.ngZone.runOutsideAngular(() => {\n document.addEventListener('mousemove', this.boundPanelResizeMove);\n document.addEventListener('mouseup', this.boundPanelResizeEnd);\n });\n this.cdr.markForCheck();\n }\n\n /** Live drag: panel width follows the pointer delta, clamped to [min, 70% of the overlay]. */\n private onPanelResizeMove(event: MouseEvent): void {\n if (!this.IsPanelResizing) {\n return;\n }\n this.PanelWidthPx = SurfacePanelDragWidth(\n this.panelResizeStartWidth, this.panelResizeStartX, event.clientX, this.hostWidth()\n );\n this.ngZone.run(() => this.cdr.markForCheck());\n }\n\n /**\n * Release: a genuine DRAG adopts the width as the user's explicit preference and\n * persists it (debounced); a bare CLICK (movement under the tolerance) restores the\n * start width and persists nothing — the handle never snaps on a click.\n */\n private onPanelResizeEnd(event: MouseEvent): void {\n if (!this.IsPanelResizing) {\n return;\n }\n this.teardownPanelResize();\n if (IsSurfacePanelDrag(this.panelResizeStartX, event.clientX)) {\n this.userPanelWidth = this.PanelWidthPx;\n this.persistPanelWidth(this.PanelWidthPx);\n } else {\n this.PanelWidthPx = this.panelResizeStartWidth;\n }\n this.ngZone.run(() => {\n this.IsPanelResizing = false;\n this.cdr.markForCheck();\n });\n }\n\n /** Double-click the handle: back to the default tier width; persist the reset. */\n public OnPanelResizeReset(): void {\n this.userPanelWidth = null;\n this.PanelWidthPx = DefaultSurfacePanelWidth(this.PanelWide, this.hostWidth());\n this.persistPanelWidth(null);\n this.cdr.markForCheck();\n }\n\n /** Removes the document-wide drag listeners and restores the body cursor/selection. */\n private teardownPanelResize(): void {\n document.removeEventListener('mousemove', this.boundPanelResizeMove);\n document.removeEventListener('mouseup', this.boundPanelResizeEnd);\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n }\n\n /**\n * The overlay's measurable width for clamping. The component host is\n * `display: contents` (zero rect) — measure the rendered `.call-overlay` div instead.\n */\n private hostWidth(): number {\n const host = this.hostRef.nativeElement as HTMLElement;\n const el = (host.firstElementChild as HTMLElement | null) ?? host;\n return el.getBoundingClientRect ? el.getBoundingClientRect().width : 0;\n }\n\n /** Reads the persisted width once per overlay instance (no-op when the engine isn't configured). */\n private loadPanelWidthPref(): void {\n try {\n const pref = ParseSurfacePanelPref(UserInfoEngine.Instance.GetSetting(SURFACE_PANEL_PREF_KEY));\n if (pref) {\n this.userPanelWidth = pref.Width;\n // hostWidth() is 0 before first layout — the clamp then enforces only the\n // minimum, and the 70% cap re-applies on the next real drag.\n this.PanelWidthPx = ClampSurfacePanelWidth(pref.Width, this.hostWidth());\n this.cdr.markForCheck();\n }\n } catch {\n // UserInfoEngine not configured (plain-node tests / early bootstrap) — default tiers apply.\n }\n }\n\n /** Persists the width preference server-side (debounced); reset serializes {\"width\":null}. */\n private persistPanelWidth(width: number | null): void {\n try {\n UserInfoEngine.Instance.SetSettingDebounced(SURFACE_PANEL_PREF_KEY, SerializeSurfacePanelPref(width));\n } catch {\n // engine unavailable — width still applies for this session\n }\n }\n\n // ── Progressive disclosure (the console that grows with you) ────────────────\n\n /**\n * True while the PURE-AUDIO hero (the orb) owns the main column. The captions\n * preference IS the text-vs-orb switch: captions off (the voice-first default) shows\n * the breathing orb at ANY disclosure level; captions on shows the thread. Review\n * always shows the thread.\n */\n public get ShowHero(): boolean {\n return !this.IsReviewing && !this.ShowCaptions;\n }\n\n /**\n * Whether the surface-panel area renders. The tabs have their OWN control (the\n * Details toggle, plus the board auto-reveal and artifact-view requests) — they are\n * deliberately DECOUPLED from typing/disclosure levels: revealing the composer must\n * never surprise the user with the whole tab panel.\n */\n public get ShowPanelArea(): boolean {\n return this.IsReviewing || this.DetailsPeek;\n }\n\n /** The Details (tabs) toggle is always offered while live — it's the panel's one door. */\n public get ShowDetailsControl(): boolean {\n return !this.IsReviewing;\n }\n\n /** Reads the persisted disclosure milestones (tolerant; defaults to day one). */\n private loadDisclosurePref(): void {\n try {\n this.Disclosure.Load(UserInfoEngine.Instance.GetSetting(REALTIME_UX_PREF_KEY));\n } catch {\n // UserInfoEngine not configured (plain-node tests / early bootstrap) — day-one defaults.\n this.Disclosure.Load(null);\n }\n }\n\n /** Reads the persisted text-vs-orb preference (tolerant; default = voice-first OFF). */\n private loadCaptionsPref(): void {\n try {\n this.ShowCaptions = UserInfoEngine.Instance.GetSetting(RealtimeSessionOverlayComponent.CaptionsPrefKey) === 'true';\n } catch {\n // UserInfoEngine not configured — voice-first default applies.\n }\n }\n\n /** Persists the text-vs-orb preference (debounced, best-effort). */\n private persistCaptionsPref(): void {\n try {\n UserInfoEngine.Instance.SetSettingDebounced(RealtimeSessionOverlayComponent.CaptionsPrefKey, String(this.ShowCaptions));\n } catch {\n // engine unavailable — the preference still applies for this session\n }\n }\n\n /** Persists the disclosure milestones server-side (debounced, best-effort). */\n private persistDisclosure(serialized: string): void {\n try {\n UserInfoEngine.Instance.SetSettingDebounced(REALTIME_UX_PREF_KEY, serialized);\n } catch {\n // engine unavailable — the ratchet still applies for this browser session\n }\n }\n\n /**\n * Merged-state change: re-render only. DELIBERATELY no disclosure raise — per product\n * direction, content never flips the console open: a running delegation is narrated\n * aloud, a finished artifact lands as a GLOWING (unfocused) tab, and the ONLY thing\n * that auto-reveals is a channel's first agent activity (the whiteboard demands eyes).\n * A pure-audio user stays in pure audio until THEY ask for more.\n */\n private onSessionStateChanged(): void {\n this.cdr.markForCheck();\n }\n\n /**\n * The agent ACTED on a channel (a tool call routed to its local executor — e.g. the\n * first whiteboard write). THE ONE AUTO-REVEAL: the surface panel opens (as a peek —\n * the left column stays exactly as it was, pure audio included) with the channel's tab\n * focused and flashed, exactly once per channel — so the user discovers the board the\n * moment it comes alive. Disclosure levels are NOT raised: no text, no composer, no\n * extra chrome — just the board.\n */\n private onChannelActivity(plugin: BaseRealtimeChannelClient): void {\n if (this.IsReviewing || this.revealedChannelKeys.has(plugin.ChannelName)) {\n return;\n }\n this.revealedChannelKeys.add(plugin.ChannelName);\n this.DetailsPeek = true; // the panel shows via the same on-demand mechanism Details uses\n if (this.surfaceTabs) {\n // Stream handler (a tool call), not a change-detection pass — reveal synchronously\n // so the board is the visible tab the instant the agent's first stroke lands.\n this.surfaceTabs.RevealChannel(plugin.ChannelName);\n } else {\n // Panel not rendered yet (the peek just created it) — reveal once it exists.\n this.pendingRevealKey = plugin.ChannelName;\n }\n this.cdr.markForCheck();\n }\n\n /** Active$ edges: session start resets the volatile level; session end ratchets + persists. */\n private onActiveChanged(active: boolean): void {\n if (active && !this.prevActive) {\n this.Disclosure.BeginSession();\n this.DetailsPeek = false;\n this.ComposerOpen = false; // typing is opt-in per session (voice-first)\n this.revealedChannelKeys.clear();\n this.pendingRevealKey = null;\n this.startAudioVisualLoop();\n } else if (!active && this.prevActive) {\n this.persistDisclosure(this.Disclosure.RatchetOnSessionEnd());\n this.stopAudioVisualLoop();\n }\n this.prevActive = active;\n this.cdr.markForCheck();\n }\n\n // ── Audio-reactive visuals (the orb that vibrates like a speaker cone) ──────\n //\n // A requestAnimationFrame loop OUTSIDE Angular samples the client's audio meters\n // (RealtimeSessionService.GetAudioActivity → driver AnalyserNodes), runs the frame through\n // the smoothing state machine, and writes CSS custom properties + data attributes\n // straight onto the rendered overlay element — zero change detection per frame. CSS\n // gates on [data-audio-live]: with real metering the orb/EQ follow the waveform; when\n // the driver attached no meters the attribute stays 'false' and the turn-state-driven\n // keyframe animations keep working unchanged.\n\n /** Per-frame smoothing state (attack/decay envelopes + direction hysteresis). */\n private readonly audioSmoother = new RealtimeAudioVisualSmoother();\n private audioRafHandle: number | null = null;\n /** Last attribute values written (attributes are only touched on change). */\n private lastAudioLive: boolean | null = null;\n private lastVoiceDirection: RealtimeVoiceDirection | null = null;\n\n /** Starts the sampling loop (idempotent). Runs outside Angular — no CD per frame. */\n private startAudioVisualLoop(): void {\n if (this.audioRafHandle !== null || typeof requestAnimationFrame !== 'function') {\n return;\n }\n this.audioSmoother.Reset();\n this.ngZone.runOutsideAngular(() => {\n const tick = (): void => {\n this.audioRafHandle = requestAnimationFrame(tick);\n if (this.Hidden) {\n return; // minimized — skip the work, keep the loop armed\n }\n const frame = this.audioSmoother.Next(this.voice.GetAudioActivity(), performance.now());\n this.applyAudioVisualFrame(frame);\n };\n this.audioRafHandle = requestAnimationFrame(tick);\n });\n }\n\n /** Stops the loop and returns the overlay to turn-state-driven animation. */\n private stopAudioVisualLoop(): void {\n if (this.audioRafHandle !== null) {\n cancelAnimationFrame(this.audioRafHandle);\n this.audioRafHandle = null;\n }\n this.audioSmoother.Reset();\n this.lastAudioLive = null;\n this.lastVoiceDirection = null;\n this.overlayElement()?.setAttribute('data-audio-live', 'false');\n }\n\n /** The rendered `.call-overlay` element (the :host is display:contents). */\n private overlayElement(): HTMLElement | null {\n const host = this.hostRef.nativeElement as HTMLElement;\n return (host.firstElementChild as HTMLElement | null) ?? null;\n }\n\n /** Writes one smoothed frame as CSS vars/attributes (attributes only on change). */\n private applyAudioVisualFrame(frame: RealtimeAudioVisualFrame | null): void {\n const el = this.overlayElement();\n if (!el) {\n return;\n }\n const live = frame !== null;\n if (live !== this.lastAudioLive) {\n this.lastAudioLive = live;\n el.setAttribute('data-audio-live', String(live));\n }\n if (!frame) {\n return;\n }\n el.style.setProperty('--voice-out', frame.OutputLevel.toFixed(3));\n el.style.setProperty('--voice-in', frame.InputLevel.toFixed(3));\n for (let i = 0; i < frame.Bins.length; i++) {\n el.style.setProperty(`--eq-${i + 1}`, frame.Bins[i].toFixed(3));\n }\n if (frame.Direction !== this.lastVoiceDirection) {\n this.lastVoiceDirection = frame.Direction;\n el.setAttribute('data-voice-dir', frame.Direction);\n }\n }\n\n /** The strip's Details control: peek at (or hide) the surface panel on demand. */\n public OnDetailsToggled(): void {\n this.DetailsPeek = !this.DetailsPeek;\n if (this.DetailsPeek) {\n // Land on the marquee surface (channels lead the strip; Activity is pinned last).\n setTimeout(() => this.surfaceTabs?.FocusFirstTab());\n }\n this.cdr.markForCheck();\n }\n\n /** The gear popover picked an interface density — apply + persist immediately. */\n public OnDensityChanged(density: RealtimeUxDensity): void {\n this.Disclosure.SetDensity(density);\n this.persistDisclosure(SerializeUxMilestones(this.Disclosure.Milestones));\n }\n\n /** The hero's \"Show the conversation\" affordance — turns the text preference on. */\n public OnTextReveal(): void {\n this.OnCaptionsToggled(true);\n }\n\n /**\n * The app-bar's \"Pure audio\": returns to the orb-only surface AND makes it stick —\n * it sets the persisted interface density to `simple` (the same setting the gear\n * writes), so a refresh / next call still opens pure audio. In-session reveals\n * (\"Show the conversation\", T-to-type, Details) remain available and stay ephemeral;\n * the gear's density control switches back to Standard/Pro/Auto whenever wanted.\n */\n public OnPureAudio(): void {\n this.Disclosure.SetDensity('simple');\n this.persistDisclosure(SerializeUxMilestones(this.Disclosure.Milestones));\n this.DetailsPeek = false;\n this.cdr.markForCheck();\n }\n\n /** App-bar Minimize: hide the call view (CSS) — the call stays fully live. */\n public OnMinimize(): void {\n this.voice.SetMinimized(true);\n }\n\n /** App-bar / strip End: tear the session down, then notify the host. */\n public async OnEndCall(): Promise<void> {\n await this.voice.EndVoiceSession();\n this.Ended.emit();\n }\n\n /** Maps the realtime state onto the hero orb's `data-state` (active turn-states only). */\n public HeroOrbState(state: VoiceConnectionState): 'speaking' | 'listening' | 'thinking' {\n switch (state) {\n case 'speaking': return 'speaking';\n case 'thinking': return 'thinking';\n default: return 'listening';\n }\n }\n\n /** Short first-person status line for the pure-audio hero. */\n public HeroStateLabel(state: VoiceConnectionState): string {\n switch (state) {\n case 'speaking': return `${this.AgentName} is speaking…`;\n case 'thinking': return `${this.AgentName} is working…`;\n case 'listening': return 'Listening';\n case 'connecting': return 'Connecting…';\n case 'error': return 'Connection error';\n default: return 'On call';\n }\n }\n\n /**\n * T-TO-TYPE: pressing T during a live call reveals the composer (raising disclosure to\n * the engaged level when needed) and focuses its input — typing always exists, it just\n * whispers until used. Ignored while review/minimized, with modifiers, or when an\n * editable element already has focus.\n */\n @HostListener('document:keydown', ['$event'])\n public OnDocumentKeydown(event: KeyboardEvent): void {\n if (this.Hidden || this.IsReviewing || !this.voice.IsActive) {\n return;\n }\n if ((event.key !== 't' && event.key !== 'T') || event.metaKey || event.ctrlKey || event.altKey) {\n return;\n }\n if (this.isEditableTarget(event.target) || this.isKeyboardCapturingSurfaceFocused()) {\n return;\n }\n event.preventDefault();\n this.OnComposerOpenChanged(true);\n // The dock may have just been created — focus after this CD pass.\n setTimeout(() => this.composer?.FocusInput());\n }\n\n /**\n * True when the event target is a native text-editing element (an input, textarea, or contentEditable),\n * where a bare letter should type — not trigger the T-to-type shortcut.\n *\n * @param eventTarget The keydown event's target.\n * @returns Whether the target is an editable element.\n */\n private isEditableTarget(eventTarget: EventTarget | null): boolean {\n const target = eventTarget as HTMLElement | null;\n return !!target && (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable);\n }\n\n /**\n * True when a surface that opts into capturing keyboard input currently holds focus — notably the Remote\n * Browser live canvas, which marks itself with `data-mj-capture-keys` while the user is driving it. When it\n * has focus, the overlay's global shortcuts (T-to-type) must stand down so the user's keystrokes land in the\n * remote browser, not the local composer. Decoupled by an attribute contract so the overlay needs no direct\n * reference to the surface component.\n *\n * @returns Whether a keyboard-capturing surface is focused.\n */\n private isKeyboardCapturingSurfaceFocused(): boolean {\n const active = (typeof document !== 'undefined' ? document.activeElement : null) as HTMLElement | null;\n return !!active && active.hasAttribute('data-mj-capture-keys');\n }\n\n /**\n * The composer dock opened (strip Type control / T hotkey) or closed (the dock's hide\n * control). Opening raises the 'engaged' milestone for the cross-session ratchet —\n * but the dock itself stays a per-session, user-owned toggle either way.\n */\n public OnComposerOpenChanged(open: boolean): void {\n this.ComposerOpen = open;\n if (open) {\n this.Disclosure.Raise('engaged');\n setTimeout(() => this.composer?.FocusInput());\n }\n this.cdr.markForCheck();\n }\n\n ngOnDestroy(): void {\n this.stopAudioVisualLoop();\n if (this.IsPanelResizing) {\n this.teardownPanelResize();\n this.IsPanelResizing = false;\n }\n for (const sub of this.subs) {\n sub.unsubscribe();\n }\n this.subs = [];\n this.State.Detach();\n }\n\n /**\n * Registers (or updates) an INTERACTIVE-CHANNEL tab on the surface panel. The overlay\n * calls it for every registry-resolved plugin; hosts may also call it for bespoke\n * template-based panes. Until a registration supplies a plugin / template, the tab\n * renders the \"coming online…\" placeholder (re-register the same `Key` to upgrade).\n * Safe to call before the panel has rendered — registrations are queued and flushed.\n */\n public RegisterChannelTab(registration: RealtimeChannelTabRegistration): void {\n if (this.surfaceTabs) {\n this.surfaceTabs.RegisterChannelTab(registration);\n } else {\n this.pendingChannelTabs.push(registration);\n }\n }\n\n /**\n * A done delegation card / rail entry asked to view a produced artifact's tab — an\n * EXPLICIT user request, so it may open the (otherwise Details-controlled) panel.\n */\n public OnOpenArtifactRequested(artifact: ParsedDelegationArtifact): void {\n if (this.surfaceTabs) {\n this.surfaceTabs.FocusArtifact(artifact);\n return;\n }\n // Panel hidden — open it (Details mechanism) and focus once it exists.\n this.DetailsPeek = true;\n this.cdr.markForCheck();\n setTimeout(() => this.surfaceTabs?.FocusArtifact(artifact));\n }\n\n /**\n * Registers one surface tab per active channel plugin THAT HAS A SURFACE (key/title/icon from the\n * plugin). Server-only channels ({@link BaseRealtimeChannelClient.HasSurface} === `false`) render no\n * tab — their tools + perception are already wired by the session service; there is simply nothing\n * to show in the surface panel.\n */\n private registerChannelTabs(channels: BaseRealtimeChannelClient[]): void {\n this.cleanupStaleReviewBoardTab(channels);\n for (const plugin of channels) {\n if (!plugin.HasSurface()) {\n continue; // server-only channel — no surface to tab.\n }\n this.RegisterChannelTab({\n Key: plugin.ChannelName,\n Title: plugin.TabTitle,\n Icon: plugin.TabIcon,\n Plugin: plugin\n });\n }\n this.cdr.markForCheck();\n }\n\n /**\n * REVIEW→LIVE continuation edge: when the resumed live session resolves its channel set\n * WITHOUT a Whiteboard channel, the review-registered read-only board tab is now a dead\n * surface — remove it (Activity regains focus if it was active). When the set HAS a\n * Whiteboard channel, the plugin registration above upgrades the same tab key in place,\n * so the review flag is simply released. Review ARTIFACT tabs are deliberately kept —\n * they are wanted carryover into the live session.\n */\n private cleanupStaleReviewBoardTab(channels: BaseRealtimeChannelClient[]): void {\n if (!this.reviewWhiteboardTabRegistered) {\n return;\n }\n if (ShouldRemoveReviewWhiteboardTab(this.voice.IsActive, this.reviewWhiteboardTabRegistered, channels)) {\n this.surfaceTabs?.RemoveTab('Whiteboard');\n // Also drop a still-queued review registration (panel not rendered yet — rare but possible).\n this.pendingChannelTabs = this.pendingChannelTabs.filter(r => !(r.Key === 'Whiteboard' && r.Content));\n this.reviewWhiteboardTabRegistered = false;\n } else if (channels.some(c => c.ChannelName === 'Whiteboard')) {\n this.reviewWhiteboardTabRegistered = false; // live plugin owns the tab now (upgraded in place)\n }\n }\n\n /** Forwards channel registrations that arrived before the panel existed. */\n private flushPendingChannelTabs(): void {\n if (this.surfaceTabs && this.pendingChannelTabs.length > 0) {\n for (const reg of this.pendingChannelTabs) {\n this.surfaceTabs.RegisterChannelTab(reg);\n }\n this.pendingChannelTabs = [];\n }\n }\n\n /**\n * The captions toggle = the persisted text-vs-orb switch: on → the thread renders\n * (raising the text disclosure milestone); off → the orb hero owns the screen again,\n * at any level. Persisted per-user so the choice survives refresh and devices.\n */\n public OnCaptionsToggled(on: boolean): void {\n this.ShowCaptions = on;\n if (on) {\n this.Disclosure.Raise('text');\n }\n this.persistCaptionsPref();\n this.cdr.markForCheck();\n }\n\n /** Reflect the gear toggle from the controls into the dev affordances. */\n public OnDevModeToggled(on: boolean): void {\n this.DevMode = on;\n }\n\n /** A dev link asked to open a delegated agent run record. */\n public OnOpenRunRequested(runId: string): void {\n this.requestNavigate('MJ: AI Agent Runs', runId);\n }\n\n /** The banner's dev link asked to open the live agent session record. */\n public OnOpenSessionRequested(sessionId: string): void {\n this.requestNavigate('MJ: AI Agent Sessions', sessionId);\n }\n\n // ── Session review mode ────────────────────────────────────────────────────\n\n /** Review banner convenience accessors (null-safe against the review data). */\n public get ReviewStartedAt(): Date | null {\n return this._reviewData?.StartedAt ?? null;\n }\n public get ReviewClosedAt(): Date | null {\n return this._reviewData?.ClosedAt ?? null;\n }\n public get ReviewCloseReason(): string | null {\n return this._reviewData?.CloseReason ?? null;\n }\n\n /** The reviewed session record's id — feeds the banner's dev \"Open session\" link. */\n public get ReviewSessionID(): string | null {\n return this._reviewData?.SessionID ?? null;\n }\n\n /**\n * Review controls: resume the reviewed session as a NEW live call (host handles the\n * start). Flags the upcoming ReviewData→null transition as a CONTINUATION so the\n * historical thread is kept (divider appended) instead of cleared.\n */\n public OnStartLive(): void {\n const review = this._reviewData;\n if (!review) {\n return;\n }\n this.pendingLiveContinuation = true;\n this.StartLiveRequested.emit({\n TargetAgentId: review.TargetAgentID,\n ConversationId: review.ConversationID,\n LastSessionId: review.SessionID\n });\n }\n\n /** Review controls: close the review (host clears its review state). */\n public OnReviewClose(): void {\n this.ReviewClosed.emit();\n }\n\n /**\n * Enters review: replaces the shared state's thread with the historical items (all\n * chain legs, dividers between legs), names the cards after the reviewed agent,\n * rehydrates the saved whiteboard (when any), and registers the chain's history\n * ARTIFACTS as unfocused surface tabs.\n */\n private enterReview(review: RealtimeSessionReview): void {\n this.State.AgentName = review.AgentName;\n this.State.LoadHistoricalItems(BuildReviewThreadItems(review));\n this.ReviewWhiteboard = this.parseReviewWhiteboard(review);\n this.reviewArtifacts = review.Artifacts ?? [];\n if (this.viewReady) {\n // Let this CD pass create/refresh the surface panel before registering the tabs.\n // ngZone.run is REQUIRED: review often opens through the deep-link/query-param\n // path (a plain RxJS stream outside Angular's zone) — without re-entering the\n // zone, the registration's markForCheck never gets a change-detection pass and\n // the Whiteboard tab stays invisible until the user's next click.\n setTimeout(() => this.ngZone.run(() => {\n this.registerReviewBoardTab();\n this.registerReviewArtifactTabs();\n }), 0);\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Leaves review. Two distinct exits:\n * - REVIEW→LIVE CONTINUATION ({@link OnStartLive} was clicked): KEEP the historical\n * thread and append the \"Resumed live session\" divider so the new live items read\n * as a new section of the same conversation. Artifact tabs are left in place — the\n * chain's artifacts carry into the live session.\n * - plain CLOSE: clear everything so the conversation view returns clean.\n */\n private exitReview(): void {\n this.ReviewWhiteboard = null;\n if (this.pendingLiveContinuation) {\n this.pendingLiveContinuation = false;\n this.State.StartLiveContinuation();\n } else {\n this.reviewArtifacts = [];\n this.State.Clear();\n }\n this.cdr.markForCheck();\n }\n\n /** Registers the reviewed chain's history artifacts as UNFOCUSED artifact tabs (idempotent). */\n private registerReviewArtifactTabs(): void {\n if (!this.surfaceTabs || this.reviewArtifacts.length === 0) {\n return;\n }\n for (const artifact of this.reviewArtifacts) {\n this.surfaceTabs.RegisterArtifactTab(artifact, false);\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Rehydrates the reviewed session's saved Whiteboard channel state. TOLERANT: a missing\n * or malformed state returns null — review simply shows no whiteboard tab.\n */\n private parseReviewWhiteboard(review: RealtimeSessionReview): WhiteboardState | null {\n const channel = review.ChannelStates.find(c => c.ChannelName.toLowerCase() === 'whiteboard');\n if (!channel?.StateJson) {\n return null;\n }\n try {\n return WhiteboardState.FromJSON(channel.StateJson);\n } catch {\n console.warn('[RealtimeSessionReview] Saved whiteboard state was malformed — skipping the board tab.');\n return null;\n }\n }\n\n /**\n * Registers the read-only review whiteboard tab (no-op without a board / template) —\n * FOCUSED: the session's channel surface is what the reviewer came to see; the\n * Activity rail stays available but is never the default focus.\n */\n private registerReviewBoardTab(): void {\n if (!this.ReviewWhiteboard || !this.reviewBoardTpl) {\n return;\n }\n this.RegisterChannelTab({\n Key: 'Whiteboard',\n Title: 'Whiteboard',\n Icon: 'fa-solid fa-chalkboard',\n Content: this.reviewBoardTpl,\n Focus: true\n });\n this.reviewWhiteboardTabRegistered = true;\n this.cdr.markForCheck();\n }\n\n /**\n * A working delegation card's ✕ asked to cancel that delegated run — EXPLICIT user\n * intent (barge-in never cancels work, by deliberate policy). The service calls the\n * server cancel channel and flips the card to a failed \"Cancelled by user\" result.\n */\n public OnCancelDelegation(callId: string): void {\n void this.voice.CancelDelegation(callId);\n }\n\n /** Minimizes the live call (it stays running) and asks the host to open the record. */\n private requestNavigate(entityName: string, recordId: string): void {\n this.voice.SetMinimized(true);\n this.NavigateRequest.emit({ EntityName: entityName, RecordID: recordId });\n }\n\n // ── Focus layout + pill ────────────────────────────────────────────────────\n\n /** A channel requested (or released) the focus layout via its host context. */\n private onChannelFocus(channel: BaseRealtimeChannelClient, focused: boolean): void {\n this.ChannelFocusMode = focused;\n this.focusChannel = focused ? channel : null;\n this.cdr.markForCheck();\n }\n\n /** Focus pill: toggle the mic mute. */\n public OnFocusPillMute(): void {\n this.FocusPillMuted = this.voice.ToggleMute();\n }\n\n /** Focus pill: leave focus mode (show the thread column again). */\n public OnFocusPillExit(): void {\n // Route through the focus-holding channel so ITS surface toggle stays in sync — it\n // re-emits SetFocusMode(false) → onChannelFocus. Defensively clear the layout flag\n // too (idempotent), covering channels whose surface isn't instantiated.\n this.focusChannel?.RequestFocusExit();\n this.ChannelFocusMode = false;\n this.focusChannel = null;\n }\n\n /** Focus pill: end the call (mirrors the controls row's End button). */\n public async OnFocusPillEnd(): Promise<void> {\n await this.voice.EndVoiceSession();\n this.Ended.emit();\n }\n\n /** Short status line for the focus pill (first person — the co-agent owns the work). */\n public FocusStateLabel(state: VoiceConnectionState): string {\n switch (state) {\n case 'speaking': return `${this.AgentName} is speaking…`;\n case 'thinking': return `${this.AgentName} is working…`;\n case 'listening': return 'Listening';\n case 'connecting': return 'Connecting…';\n default: return '';\n }\n }\n}\n","@if (ConnectionState$ | async; as state) {\n <div class=\"call-overlay\"\n [class.call-overlay--hidden]=\"Hidden\"\n [class.call-overlay--review]=\"IsReviewing\"\n [class.board-focus]=\"ChannelFocusMode\"\n role=\"region\" [attr.aria-label]=\"IsReviewing ? 'Past session review' : 'Live voice session'\">\n\n <!-- PROGRESSIVE DISCLOSURE (the console that grows with you — Redesign A Progressive):\n level 0 is PURE AUDIO (the hero orb owns the main column; no thread, no composer;\n the strip's Details control peeks at the panels on demand); level 1 reveals the\n caption thread + captions control + type-to-type hint; level 2+ docks the composer\n and keeps the surface panel. CONTENT NEVER FLIPS THE CONSOLE OPEN: finished\n artifacts land as glowing unfocused tabs; the ONE auto-reveal is a channel's\n first agent activity (e.g. the first whiteboard write), which opens the panel as\n a peek with that tab focused — the left column stays exactly as it was.\n REVIEW always renders the full console. -->\n <div class=\"call-main\">\n <!-- The UNIFIED APP-BAR: identity + state + every session action (Redesign A). -->\n <mj-realtime-agent-banner\n [State]=\"state\"\n [AgentName]=\"AgentName\"\n [ModelName]=\"IsReviewing ? null : (ModelName$ | async)\"\n [DevMode]=\"DevMode\"\n [SessionID]=\"IsReviewing ? ReviewSessionID : SessionID\"\n [ReviewMode]=\"IsReviewing\"\n [ReviewStartedAt]=\"ReviewStartedAt\"\n [ReviewClosedAt]=\"ReviewClosedAt\"\n [ReviewCloseReason]=\"ReviewCloseReason\"\n [CaptionsOn]=\"ShowCaptions\"\n [ShowCaptionsControl]=\"!IsReviewing\"\n [ShowGear]=\"!IsReviewing && Disclosure.ShowGear\"\n [ShowEnd]=\"!IsReviewing && Disclosure.ShowComposer\"\n [ShowMinimize]=\"!IsReviewing\"\n [ShowPureAudio]=\"!IsReviewing && Disclosure.SessionLevel > 0\"\n [Density]=\"Disclosure.Milestones.Density\"\n (OpenSessionRequested)=\"OnOpenSessionRequested($event)\"\n (CaptionsToggled)=\"OnCaptionsToggled($event)\"\n (DevModeToggled)=\"OnDevModeToggled($event)\"\n (DensityChanged)=\"OnDensityChanged($event)\"\n (MinimizeRequested)=\"OnMinimize()\"\n (PureAudioRequested)=\"OnPureAudio()\"\n (EndRequested)=\"OnEndCall()\"\n (StartLiveRequested)=\"OnStartLive()\"\n (CloseRequested)=\"OnReviewClose()\">\n </mj-realtime-agent-banner>\n\n <!-- Ephemeral narration with no active working card to anchor to → under the banner -->\n @if (!IsReviewing && State.Narration && !State.ActiveCallId && Disclosure.ShowThread) {\n <div class=\"banner-live-note\" role=\"status\" aria-live=\"polite\">\n <i class=\"fa-solid fa-comment-dots\" aria-hidden=\"true\"></i>\n {{ State.Narration }}\n </div>\n }\n\n <div class=\"call-body\" [class.call-body--hero]=\"ShowHero && state !== 'connecting'\">\n @if (!IsReviewing && state === 'connecting') {\n <div class=\"call-connecting\">\n <mj-loading text=\"Connecting to the live session…\" size=\"medium\"></mj-loading>\n </div>\n } @else if (ShowHero) {\n <!-- PURE-AUDIO HERO (level 0): the orb IS the interface — it breathes with the\n audio inside expanding sound-wave rings; nothing to read, nothing to configure. -->\n <div class=\"hero\" [attr.data-state]=\"state\" role=\"status\" aria-live=\"polite\">\n <div class=\"hero__stage\">\n <span class=\"hero__ring\" aria-hidden=\"true\"></span>\n <span class=\"hero__ring hero__ring--2\" aria-hidden=\"true\"></span>\n <span class=\"hero__ring hero__ring--3\" aria-hidden=\"true\"></span>\n <div class=\"hero__orb\" [attr.data-state]=\"HeroOrbState(state)\" aria-hidden=\"true\"></div>\n </div>\n <div class=\"hero__eq\" aria-hidden=\"true\">\n <span></span><span></span><span></span><span></span><span></span>\n <span></span><span></span><span></span><span></span>\n </div>\n <div class=\"hero__name\">{{ AgentName }}</div>\n <div class=\"hero__sub\">{{ HeroStateLabel(state) }}</div>\n <button type=\"button\" class=\"hero__reveal\" (click)=\"OnTextReveal()\"\n title=\"Show the conversation as text\">\n <i class=\"fa-solid fa-closed-captioning\" aria-hidden=\"true\"></i>\n Show the conversation\n </button>\n </div>\n } @else {\n <mj-realtime-session-thread\n [State]=\"State\"\n [AgentName]=\"AgentName\"\n [UserName]=\"CurrentUser?.Name || 'You'\"\n [ShowCaptions]=\"IsReviewing ? true : ShowCaptions\"\n [DevMode]=\"DevMode\"\n (OpenRunRequested)=\"OnOpenRunRequested($event)\"\n (OpenArtifactRequested)=\"OnOpenArtifactRequested($event)\"\n (CancelRequested)=\"OnCancelDelegation($event)\">\n </mj-realtime-session-thread>\n }\n </div>\n\n @if (!IsReviewing) {\n <!-- Active channels (earned with the console at level 2+) -->\n @if (Disclosure.ShowComposer) {\n <mj-realtime-channel-strip></mj-realtime-channel-strip>\n }\n\n <!-- The BOTTOM DOCK: phone-call strip ⇄ fused minis+composer — the user's own\n two-way toggle (Type opens, hide closes), never level-forced. -->\n <mj-realtime-composer\n [Open]=\"ComposerOpen\"\n (OpenChanged)=\"OnComposerOpenChanged($event)\"\n [CaptionsOn]=\"ShowCaptions\"\n [ShowDetails]=\"ShowDetailsControl\"\n [DetailsOn]=\"DetailsPeek\"\n (CaptionsToggled)=\"OnCaptionsToggled($event)\"\n (DetailsToggled)=\"OnDetailsToggled()\"\n (EndRequested)=\"OnEndCall()\">\n </mj-realtime-composer>\n }\n </div>\n\n <!-- RIGHT: TABBED SURFACE PANEL — disclosure-gated: it EXISTS once earned (level 2+,\n which the first delegation forces), peeked on demand via the strip's Details\n control, or always in review. Slides in from the right when it arrives — the\n panel's arrival IS the progress cue. -->\n @if (ShowPanelArea) {\n <!-- Resize handle (hidden while the panel is collapsed or a channel holds focus). -->\n @if (!PanelResizeDisabled) {\n <div class=\"call-resizer\"\n [class.call-resizer--active]=\"IsPanelResizing\"\n role=\"separator\" aria-orientation=\"vertical\"\n aria-label=\"Resize the surface panel (double-click to reset)\"\n title=\"Drag to resize • double-click to reset\"\n (mousedown)=\"OnPanelResizeStart($event)\"\n (dblclick)=\"OnPanelResizeReset()\"></div>\n }\n\n <div class=\"call-panel\" [style.width.px]=\"ChannelFocusMode ? null : PanelAreaSize\">\n <mj-realtime-surface-tabs\n [State]=\"State\"\n [DevMode]=\"DevMode\"\n [CurrentUser]=\"CurrentUser\"\n [EnvironmentID]=\"EnvironmentID\"\n [Fill]=\"ChannelFocusMode\"\n (OpenRunRequested)=\"OnOpenRunRequested($event)\"\n (CollapsedChange)=\"OnPanelCollapsedChange($event)\"\n (WideChanged)=\"OnPanelWideChanged($event)\">\n </mj-realtime-surface-tabs>\n </div>\n }\n\n <!-- FOCUS floating call pill: the main column is hidden, so the live call's\n identity + state + mute / show-thread / end controls ride over the surface. -->\n @if (!IsReviewing && ChannelFocusMode) {\n <div class=\"board-focus-pill\" role=\"status\" aria-label=\"Live call (board focus)\">\n <span class=\"board-focus-pill__orb\" [attr.data-state]=\"state\" aria-hidden=\"true\"></span>\n <span class=\"board-focus-pill__text\">\n <span class=\"board-focus-pill__name\">Voice for {{ AgentName }}</span>\n @if (FocusStateLabel(state); as label) {\n <span class=\"board-focus-pill__state\">{{ label }}</span>\n }\n </span>\n <button type=\"button\" class=\"board-focus-pill__btn\"\n [class.board-focus-pill__btn--active]=\"FocusPillMuted\"\n (click)=\"OnFocusPillMute()\"\n [title]=\"FocusPillMuted ? 'Unmute' : 'Mute'\"\n [attr.aria-label]=\"FocusPillMuted ? 'Unmute microphone' : 'Mute microphone'\">\n <i class=\"fa-solid\" [class.fa-microphone]=\"!FocusPillMuted\" [class.fa-microphone-slash]=\"FocusPillMuted\" aria-hidden=\"true\"></i>\n </button>\n <button type=\"button\" class=\"board-focus-pill__btn\"\n (click)=\"OnFocusPillExit()\"\n title=\"Show thread\" aria-label=\"Show the conversation thread\">\n <i class=\"fa-solid fa-table-columns\" aria-hidden=\"true\"></i>\n </button>\n <button type=\"button\" class=\"board-focus-pill__btn board-focus-pill__btn--end\"\n (click)=\"OnFocusPillEnd()\"\n title=\"End call\" aria-label=\"End the call\">\n <i class=\"fa-solid fa-phone-slash\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n\n </div>\n}\n\n<!-- SESSION REVIEW whiteboard pane body: the reviewed session's saved board, rehydrated\n locally (WhiteboardState.FromJSON) and rendered READ-ONLY (pan/zoom only). Registered\n as a template-based channel tab ONLY when a parseable Whiteboard state exists. -->\n<ng-template #reviewBoardTpl>\n @if (ReviewWhiteboard; as board) {\n <!-- The board host positions itself absolutely — give it a filling, positioned frame. -->\n <div class=\"review-board-host\">\n <mj-realtime-whiteboard\n [State]=\"board\"\n [AgentName]=\"AgentName\"\n [ReadOnly]=\"true\">\n </mj-realtime-whiteboard>\n </div>\n }\n</ng-template>\n"]}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { Observable, Subject } from 'rxjs';
|
|
2
|
+
import { VoiceCaption, VoiceDelegationProgress, VoiceDelegationResult, VoiceDelegationNarration } from '../../services/realtime-session.service';
|
|
3
|
+
import { ParsedDelegationArtifact } from '../../services/delegation-result-parser';
|
|
4
|
+
/**
|
|
5
|
+
* The four reactive session streams {@link RealtimeSessionState} merges — structurally
|
|
6
|
+
* satisfied by `RealtimeSessionService`. Narrowed to an interface so the state (and its unit
|
|
7
|
+
* tests) depend only on the streams, not on the full service / GraphQL import chain.
|
|
8
|
+
*/
|
|
9
|
+
export interface RealtimeSessionStreams {
|
|
10
|
+
/** Growing user/assistant caption list. */
|
|
11
|
+
Captions$: Observable<VoiceCaption[]>;
|
|
12
|
+
/** Progress updates from delegated agent runs. */
|
|
13
|
+
DelegationProgress$: Observable<VoiceDelegationProgress>;
|
|
14
|
+
/** Terminal delegation results. */
|
|
15
|
+
DelegationResult$: Observable<VoiceDelegationResult>;
|
|
16
|
+
/** Ephemeral spoken progress narrations. */
|
|
17
|
+
DelegationNarration$: Observable<VoiceDelegationNarration>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The view-model for one delegated tool/agent call in the live session. Built by
|
|
21
|
+
* {@link RealtimeSessionState} from the `DelegationProgress$` / `DelegationResult$`
|
|
22
|
+
* streams (correlated by `CallID`) and rendered both inline in the session thread
|
|
23
|
+
* and as a compact card in the activity rail.
|
|
24
|
+
*
|
|
25
|
+
* Card objects are treated as IMMUTABLE — every progress/result event REPLACES the
|
|
26
|
+
* card object (and the arrays containing it) so Angular bindings always see fresh
|
|
27
|
+
* references and in-place updates reliably re-render.
|
|
28
|
+
*/
|
|
29
|
+
export interface RealtimeDelegationCardVM {
|
|
30
|
+
/** The `invoke-target-agent` call this card represents. */
|
|
31
|
+
CallID: string;
|
|
32
|
+
/** Display name of the delegated agent (e.g. "Sage"). */
|
|
33
|
+
AgentName: string;
|
|
34
|
+
/** Latest human-readable progress message from the stream. */
|
|
35
|
+
LatestMessage: string;
|
|
36
|
+
/** The delegation phase (`prompt_execution` | `action_execution` | …). */
|
|
37
|
+
LatestStep: string;
|
|
38
|
+
/** Optional completion percentage (0–100) when the server supplies it. */
|
|
39
|
+
Percentage?: number;
|
|
40
|
+
/** `true` once the delegation reached a terminal result. */
|
|
41
|
+
Done: boolean;
|
|
42
|
+
/** Whether the delegated work succeeded (meaningful once {@link Done} is true). */
|
|
43
|
+
Success: boolean;
|
|
44
|
+
/** Short run identifier (e.g. "#a3f1") if known; shown in expanded provenance detail. */
|
|
45
|
+
RunRef?: string;
|
|
46
|
+
/**
|
|
47
|
+
* ID of the delegated agent run (`MJ: AI Agent Runs`) once the result reports it.
|
|
48
|
+
* Powers the gear-gated "Open run" developer link on the card / rail entry.
|
|
49
|
+
*/
|
|
50
|
+
RunID?: string;
|
|
51
|
+
/** The real result text once the delegation completes. */
|
|
52
|
+
Result?: string | null;
|
|
53
|
+
/**
|
|
54
|
+
* Artifacts the delegated run produced (set with the terminal result). Powers the
|
|
55
|
+
* "View" affordance on done cards / rail entries and the surface panel's artifact tabs.
|
|
56
|
+
*/
|
|
57
|
+
Artifacts?: ParsedDelegationArtifact[];
|
|
58
|
+
/** Epoch ms when the first progress event for this call arrived. */
|
|
59
|
+
StartedAt: number;
|
|
60
|
+
/** Epoch ms when the terminal result arrived. */
|
|
61
|
+
FinishedAt?: number;
|
|
62
|
+
}
|
|
63
|
+
/** A caption turn (user or assistant) in the unified thread. */
|
|
64
|
+
export interface RealtimeThreadCaptionItem {
|
|
65
|
+
Kind: 'caption';
|
|
66
|
+
Role: 'User' | 'Assistant';
|
|
67
|
+
Text: string;
|
|
68
|
+
}
|
|
69
|
+
/** A delegation card in the unified thread (working → done chip). */
|
|
70
|
+
export interface RealtimeThreadDelegationItem {
|
|
71
|
+
Kind: 'delegation';
|
|
72
|
+
Card: RealtimeDelegationCardVM;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* A SESSION-BOUNDARY divider in the unified thread — a subtle, token-styled rule marking
|
|
76
|
+
* where one session leg ends and another begins. Two producers:
|
|
77
|
+
* - review→live continuation ({@link RealtimeSessionState.StartLiveContinuation}):
|
|
78
|
+
* "Resumed live session · <time>" before the new live items;
|
|
79
|
+
* - multi-leg session review (`BuildReviewThreadItems` over a `lastSessionId` chain):
|
|
80
|
+
* "Session leg · started <time>" between legs, carrying the PREVIOUS leg's CloseReason
|
|
81
|
+
* as a small chip so the reader sees why that leg ended.
|
|
82
|
+
*/
|
|
83
|
+
export interface RealtimeThreadDividerItem {
|
|
84
|
+
Kind: 'divider';
|
|
85
|
+
/** The divider's label (e.g. "Resumed live session", "Session leg"). */
|
|
86
|
+
Label: string;
|
|
87
|
+
/** Timestamp rendered after the label ("· <time>"), or null when unknown. */
|
|
88
|
+
At: Date | null;
|
|
89
|
+
/** Font Awesome icon class rendered before the label (e.g. `fa-solid fa-phone`). */
|
|
90
|
+
Icon: string;
|
|
91
|
+
/** Why the PRECEDING leg closed (review chains only) — rendered as a small chip. */
|
|
92
|
+
CloseReason?: string | null;
|
|
93
|
+
}
|
|
94
|
+
/** One entry in the chronological thread: a caption bubble, a delegation card, or a leg divider. */
|
|
95
|
+
export type RealtimeThreadItem = RealtimeThreadCaptionItem | RealtimeThreadDelegationItem | RealtimeThreadDividerItem;
|
|
96
|
+
/**
|
|
97
|
+
* Maps a raw delegation step id to a human-friendly phrase. Unknown steps fall back to
|
|
98
|
+
* the raw progress message (per product direction) so the UI never shows snake_case ids.
|
|
99
|
+
*/
|
|
100
|
+
export declare function FriendlyStepLabel(step: string, message: string): string;
|
|
101
|
+
/** Formats an elapsed duration in ms as a compact human string ("8s", "1m 04s"). */
|
|
102
|
+
export declare function FormatElapsed(ms: number): string;
|
|
103
|
+
/**
|
|
104
|
+
* SINGLE SOURCE of merged live-session state, owned by the overlay shell
|
|
105
|
+
* (`RealtimeSessionOverlayComponent`) and passed via `@Input()` to BOTH the session
|
|
106
|
+
* thread and the activity rail — so the per-CallID card bookkeeping and subscription
|
|
107
|
+
* logic exists exactly once.
|
|
108
|
+
*
|
|
109
|
+
* Merges FOUR reactive streams from {@link RealtimeSessionService}:
|
|
110
|
+
* - `Captions$` — growing user/assistant caption list → appended to {@link Items}.
|
|
111
|
+
* - `DelegationProgress$` — first event per `CallID` inserts a working card at the thread
|
|
112
|
+
* tail; later events REPLACE the card immutably (new object +
|
|
113
|
+
* new arrays) so change detection always fires.
|
|
114
|
+
* - `DelegationResult$` — flips the card to Done/Failed with the real result text.
|
|
115
|
+
* - `DelegationNarration$` — the EPHEMERAL spoken progress note (latest only, never
|
|
116
|
+
* accumulated), cleared when no delegation is running anymore.
|
|
117
|
+
*
|
|
118
|
+
* Consumers subscribe to {@link Changed$} and `markForCheck()`; all exposed collections
|
|
119
|
+
* are replaced (never mutated) on change.
|
|
120
|
+
*/
|
|
121
|
+
export declare class RealtimeSessionState {
|
|
122
|
+
/** Display name used for new delegation cards (set by the overlay's AgentName input). */
|
|
123
|
+
AgentName: string;
|
|
124
|
+
/** The merged, chronological thread (captions + delegation cards), oldest first. */
|
|
125
|
+
Items: RealtimeThreadItem[];
|
|
126
|
+
/** All delegation cards of the session, NEWEST first — the activity rail's list. */
|
|
127
|
+
Cards: RealtimeDelegationCardVM[];
|
|
128
|
+
/** Latest ephemeral narration text, or null when none should be shown. */
|
|
129
|
+
Narration: string | null;
|
|
130
|
+
/** CallID of the most recently started, still-running delegation (anchors the live note). */
|
|
131
|
+
ActiveCallId: string | null;
|
|
132
|
+
/** Emits after every state change so views can mark themselves for check. */
|
|
133
|
+
readonly Changed$: Subject<void>;
|
|
134
|
+
/** Number of captions already merged into {@link Items} (append-only bookkeeping). */
|
|
135
|
+
private placedCaptionCount;
|
|
136
|
+
/** Live card lookup by CallID (insertion order = start order). */
|
|
137
|
+
private cardsByCallId;
|
|
138
|
+
private subs;
|
|
139
|
+
/** True while at least one delegation is still running. */
|
|
140
|
+
get HasRunningDelegation(): boolean;
|
|
141
|
+
/** Subscribes to the session streams. Call once from the owning overlay shell. */
|
|
142
|
+
Attach(voice: RealtimeSessionStreams): void;
|
|
143
|
+
/** Unsubscribes from all session streams. Call from the owning shell's ngOnDestroy. */
|
|
144
|
+
Detach(): void;
|
|
145
|
+
/**
|
|
146
|
+
* SESSION REVIEW population path: replaces ALL merged state with a pre-built
|
|
147
|
+
* HISTORICAL thread (caption turns + done delegation cards, oldest first — see
|
|
148
|
+
* `BuildReviewThreadItems`). Resets the live-stream bookkeeping first, so a later
|
|
149
|
+
* live session starts from a clean merge baseline; delegation cards are indexed by
|
|
150
|
+
* CallID so the rail's {@link Cards} list and {@link ActiveCallId} derive normally.
|
|
151
|
+
*/
|
|
152
|
+
LoadHistoricalItems(items: RealtimeThreadItem[]): void;
|
|
153
|
+
/** Clears all merged state and notifies subscribers (e.g. leaving session review). */
|
|
154
|
+
Clear(): void;
|
|
155
|
+
/**
|
|
156
|
+
* REVIEW→LIVE continuation path: KEEPS the historical thread (and its delegation cards
|
|
157
|
+
* in the rail) and appends a "Resumed live session" {@link RealtimeThreadDividerItem},
|
|
158
|
+
* then resets only the LIVE-merge bookkeeping so the new session's captions and cards
|
|
159
|
+
* append cleanly AFTER the divider:
|
|
160
|
+
* - `placedCaptionCount` → 0 (the fresh session's caption stream starts empty, so the
|
|
161
|
+
* start-of-session `[]` emission is a no-op rather than a reset);
|
|
162
|
+
* - the ephemeral narration is dropped (nothing is running yet);
|
|
163
|
+
* - historical cards stay indexed by CallID — new live CallIDs are unique, so live
|
|
164
|
+
* cards insert alongside them and `ActiveCallId` recomputes normally.
|
|
165
|
+
*/
|
|
166
|
+
StartLiveContinuation(at?: Date): void;
|
|
167
|
+
/** Appends any newly-arrived captions, keeping order relative to delegation cards. */
|
|
168
|
+
private onCaptions;
|
|
169
|
+
/** Inserts a new working card, or immutably replaces the existing one for this CallID. */
|
|
170
|
+
private onProgress;
|
|
171
|
+
/** Creates a working card for a first-seen CallID and appends it to the thread tail. */
|
|
172
|
+
private insertCard;
|
|
173
|
+
/** Flips the card for a finished delegation to Done/Failed with its real result. */
|
|
174
|
+
private onResult;
|
|
175
|
+
/** Latest narration REPLACES the previous one (never accumulated). */
|
|
176
|
+
private onNarration;
|
|
177
|
+
/**
|
|
178
|
+
* Immutable replacement of a card: new card object, new thread-item wrapper, new
|
|
179
|
+
* Items array, rebuilt Cards array — so every binding sees a fresh reference.
|
|
180
|
+
*/
|
|
181
|
+
private replaceCard;
|
|
182
|
+
/** Rebuilds the rail's newest-first card list from the (start-ordered) map. */
|
|
183
|
+
private rebuildCards;
|
|
184
|
+
/** Recomputes which still-running delegation anchors the live narration note. */
|
|
185
|
+
private recomputeActive;
|
|
186
|
+
/** Derives a short, stable run reference (e.g. "#a3f1") from the call id. */
|
|
187
|
+
private shortRunRef;
|
|
188
|
+
/** Clears all merged state (fresh session). */
|
|
189
|
+
private reset;
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=realtime-session-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"realtime-session-state.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/realtime/realtime-session-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAgB,MAAM,MAAM,CAAC;AACzD,OAAO,EACL,YAAY,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,wBAAwB,EACvF,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;AAEnF;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC,2CAA2C;IAC3C,SAAS,EAAE,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;IACtC,kDAAkD;IAClD,mBAAmB,EAAE,UAAU,CAAC,uBAAuB,CAAC,CAAC;IACzD,mCAAmC;IACnC,iBAAiB,EAAE,UAAU,CAAC,qBAAqB,CAAC,CAAC;IACrD,4CAA4C;IAC5C,oBAAoB,EAAE,UAAU,CAAC,wBAAwB,CAAC,CAAC;CAC5D;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,wBAAwB;IACvC,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,SAAS,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,aAAa,EAAE,MAAM,CAAC;IACtB,0EAA0E;IAC1E,UAAU,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,IAAI,EAAE,OAAO,CAAC;IACd,mFAAmF;IACnF,OAAO,EAAE,OAAO,CAAC;IACjB,yFAAyF;IACzF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB;;;OAGG;IACH,SAAS,CAAC,EAAE,wBAAwB,EAAE,CAAC;IACvC,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,gEAAgE;AAChE,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qEAAqE;AACrE,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE,wBAAwB,CAAC;CAChC;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,SAAS,CAAC;IAChB,wEAAwE;IACxE,KAAK,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,EAAE,EAAE,IAAI,GAAG,IAAI,CAAC;IAChB,oFAAoF;IACpF,IAAI,EAAE,MAAM,CAAC;IACb,oFAAoF;IACpF,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,oGAAoG;AACpG,MAAM,MAAM,kBAAkB,GAAG,yBAAyB,GAAG,4BAA4B,GAAG,yBAAyB,CAAC;AAEtH;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAQvE;AAED,oFAAoF;AACpF,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAQhD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,oBAAoB;IAC/B,yFAAyF;IAClF,SAAS,SAAU;IAE1B,oFAAoF;IAC7E,KAAK,EAAE,kBAAkB,EAAE,CAAM;IAExC,oFAAoF;IAC7E,KAAK,EAAE,wBAAwB,EAAE,CAAM;IAE9C,0EAA0E;IACnE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEvC,6FAA6F;IACtF,YAAY,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE1C,6EAA6E;IAC7E,SAAgB,QAAQ,gBAAuB;IAE/C,sFAAsF;IACtF,OAAO,CAAC,kBAAkB,CAAK;IAC/B,kEAAkE;IAClE,OAAO,CAAC,aAAa,CAA+C;IACpE,OAAO,CAAC,IAAI,CAAsB;IAElC,2DAA2D;IAC3D,IAAW,oBAAoB,IAAI,OAAO,CAEzC;IAED,kFAAkF;IAC3E,MAAM,CAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI;IAYlD,uFAAuF;IAChF,MAAM,IAAI,IAAI;IAOrB;;;;;;OAMG;IACI,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,EAAE,GAAG,IAAI;IAa7D,sFAAsF;IAC/E,KAAK,IAAI,IAAI;IAKpB;;;;;;;;;;OAUG;IACI,qBAAqB,CAAC,EAAE,GAAE,IAAiB,GAAG,IAAI;IAczD,sFAAsF;IACtF,OAAO,CAAC,UAAU;IAkBlB,0FAA0F;IAC1F,OAAO,CAAC,UAAU;IAelB,wFAAwF;IACxF,OAAO,CAAC,UAAU;IAkBlB,oFAAoF;IACpF,OAAO,CAAC,QAAQ;IAqBhB,sEAAsE;IACtE,OAAO,CAAC,WAAW;IAKnB;;;OAGG;IACH,OAAO,CAAC,WAAW;IAYnB,+EAA+E;IAC/E,OAAO,CAAC,YAAY;IAIpB,iFAAiF;IACjF,OAAO,CAAC,eAAe;IAKvB,6EAA6E;IAC7E,OAAO,CAAC,WAAW;IAKnB,+CAA+C;IAC/C,OAAO,CAAC,KAAK;CAQd"}
|