@memberjunction/ng-conversations 5.43.0 → 5.45.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/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts +0 -1
- package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts.map +1 -1
- package/dist/lib/components/active-tasks/active-tasks-panel.component.js +56 -52
- package/dist/lib/components/active-tasks/active-tasks-panel.component.js.map +1 -1
- package/dist/lib/components/artifact/artifact-share-modal.component.d.ts +3 -1
- package/dist/lib/components/artifact/artifact-share-modal.component.d.ts.map +1 -1
- package/dist/lib/components/artifact/artifact-share-modal.component.js +52 -52
- package/dist/lib/components/artifact/artifact-share-modal.component.js.map +1 -1
- package/dist/lib/components/collection/collection-form-modal.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-form-modal.component.js +10 -14
- package/dist/lib/components/collection/collection-form-modal.component.js.map +1 -1
- package/dist/lib/components/collection/collection-share-modal.component.d.ts +3 -1
- package/dist/lib/components/collection/collection-share-modal.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-share-modal.component.js +56 -56
- package/dist/lib/components/collection/collection-share-modal.component.js.map +1 -1
- package/dist/lib/components/collection/collection-tree.component.d.ts +3 -1
- package/dist/lib/components/collection/collection-tree.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-tree.component.js +10 -7
- package/dist/lib/components/collection/collection-tree.component.js.map +1 -1
- package/dist/lib/components/collection/collection-view.component.d.ts +3 -1
- package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-view.component.js +29 -41
- package/dist/lib/components/collection/collection-view.component.js.map +1 -1
- package/dist/lib/components/collection/collections-full-view.component.d.ts +4 -0
- package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collections-full-view.component.js +134 -166
- package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
- package/dist/lib/components/composer/ai-composer.component.d.ts +103 -0
- package/dist/lib/components/composer/ai-composer.component.d.ts.map +1 -0
- package/dist/lib/components/composer/ai-composer.component.js +263 -0
- package/dist/lib/components/composer/ai-composer.component.js.map +1 -0
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +76 -12
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.js +522 -158
- package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-empty-state.component.d.ts +1 -1
- package/dist/lib/components/conversation/conversation-empty-state.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-empty-state.component.js.map +1 -1
- package/dist/lib/components/conversation/pinned-messages-panel.component.js +6 -9
- package/dist/lib/components/conversation/pinned-messages-panel.component.js.map +1 -1
- package/dist/lib/components/library/library-full-view.component.d.ts.map +1 -1
- package/dist/lib/components/library/library-full-view.component.js +20 -24
- package/dist/lib/components/library/library-full-view.component.js.map +1 -1
- package/dist/lib/components/members/members-modal.component.d.ts.map +1 -1
- package/dist/lib/components/members/members-modal.component.js +10 -11
- package/dist/lib/components/members/members-modal.component.js.map +1 -1
- package/dist/lib/components/message/message-input.component.d.ts +87 -23
- package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-input.component.js +245 -158
- package/dist/lib/components/message/message-input.component.js.map +1 -1
- package/dist/lib/components/message/message-item.component.d.ts +11 -3
- package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-item.component.js +73 -21
- package/dist/lib/components/message/message-item.component.js.map +1 -1
- package/dist/lib/components/message/message-list.component.js +6 -9
- package/dist/lib/components/message/message-list.component.js.map +1 -1
- package/dist/lib/components/overlay/chat-overlay.component.d.ts +4 -1
- package/dist/lib/components/overlay/chat-overlay.component.d.ts.map +1 -1
- package/dist/lib/components/overlay/chat-overlay.component.js +9 -4
- package/dist/lib/components/overlay/chat-overlay.component.js.map +1 -1
- package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts +45 -0
- package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts.map +1 -1
- package/dist/lib/components/realtime/channels/base-realtime-channel-client.js +10 -0
- package/dist/lib/components/realtime/channels/base-realtime-channel-client.js.map +1 -1
- package/dist/lib/components/realtime/channels/client-context-channel.d.ts +46 -0
- package/dist/lib/components/realtime/channels/client-context-channel.d.ts.map +1 -0
- package/dist/lib/components/realtime/channels/client-context-channel.js +174 -0
- package/dist/lib/components/realtime/channels/client-context-channel.js.map +1 -0
- package/dist/lib/components/realtime/evidence-playback/realtime-evidence-playback.component.d.ts +123 -0
- package/dist/lib/components/realtime/evidence-playback/realtime-evidence-playback.component.d.ts.map +1 -0
- package/dist/lib/components/realtime/evidence-playback/realtime-evidence-playback.component.js +397 -0
- package/dist/lib/components/realtime/evidence-playback/realtime-evidence-playback.component.js.map +1 -0
- package/dist/lib/components/realtime/media/media-channel-state.d.ts +103 -0
- package/dist/lib/components/realtime/media/media-channel-state.d.ts.map +1 -0
- package/dist/lib/components/realtime/media/media-channel-state.js +143 -0
- package/dist/lib/components/realtime/media/media-channel-state.js.map +1 -0
- package/dist/lib/components/realtime/media/media-channel-tools.d.ts +24 -0
- package/dist/lib/components/realtime/media/media-channel-tools.d.ts.map +1 -0
- package/dist/lib/components/realtime/media/media-channel-tools.js +107 -0
- package/dist/lib/components/realtime/media/media-channel-tools.js.map +1 -0
- package/dist/lib/components/realtime/media/media-channel.d.ts +89 -0
- package/dist/lib/components/realtime/media/media-channel.d.ts.map +1 -0
- package/dist/lib/components/realtime/media/media-channel.js +253 -0
- package/dist/lib/components/realtime/media/media-channel.js.map +1 -0
- package/dist/lib/components/realtime/media/realtime-media-surface.component.d.ts +141 -0
- package/dist/lib/components/realtime/media/realtime-media-surface.component.d.ts.map +1 -0
- package/dist/lib/components/realtime/media/realtime-media-surface.component.js +574 -0
- package/dist/lib/components/realtime/media/realtime-media-surface.component.js.map +1 -0
- package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts +59 -14
- package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-activity-rail.component.js +277 -74
- package/dist/lib/components/realtime/realtime-activity-rail.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts +28 -27
- package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-agent-banner.component.js +144 -143
- package/dist/lib/components/realtime/realtime-agent-banner.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts +12 -0
- package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-agent-picker.component.js +105 -43
- package/dist/lib/components/realtime/realtime-agent-picker.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-audio-visuals.d.ts +2 -2
- package/dist/lib/components/realtime/realtime-audio-visuals.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-audio-visuals.js.map +1 -1
- package/dist/lib/components/realtime/realtime-composer.component.d.ts +41 -7
- package/dist/lib/components/realtime/realtime-composer.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-composer.component.js +216 -102
- package/dist/lib/components/realtime/realtime-composer.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts +0 -2
- package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-delegation-card.component.js +67 -71
- package/dist/lib/components/realtime/realtime-delegation-card.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts +364 -44
- package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-session-overlay.component.js +839 -153
- package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-session-state.d.ts +5 -5
- package/dist/lib/components/realtime/realtime-session-state.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-session-state.js.map +1 -1
- package/dist/lib/components/realtime/realtime-surface-tab-style.d.ts +70 -0
- package/dist/lib/components/realtime/realtime-surface-tab-style.d.ts.map +1 -0
- package/dist/lib/components/realtime/realtime-surface-tab-style.js +115 -0
- package/dist/lib/components/realtime/realtime-surface-tab-style.js.map +1 -0
- package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts +55 -57
- package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-surface-tabs.component.js +165 -143
- package/dist/lib/components/realtime/realtime-surface-tabs.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts +80 -71
- package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-surface-tabs.model.js +83 -113
- package/dist/lib/components/realtime/realtime-surface-tabs.model.js.map +1 -1
- package/dist/lib/components/realtime/realtime-ui-config.d.ts +270 -0
- package/dist/lib/components/realtime/realtime-ui-config.d.ts.map +1 -0
- package/dist/lib/components/realtime/realtime-ui-config.js +212 -0
- package/dist/lib/components/realtime/realtime-ui-config.js.map +1 -0
- package/dist/lib/components/search/search-panel.component.d.ts +2 -0
- package/dist/lib/components/search/search-panel.component.d.ts.map +1 -1
- package/dist/lib/components/search/search-panel.component.js +92 -101
- package/dist/lib/components/search/search-panel.component.js.map +1 -1
- package/dist/lib/components/share/share-modal.component.d.ts.map +1 -1
- package/dist/lib/components/share/share-modal.component.js +10 -11
- package/dist/lib/components/share/share-modal.component.js.map +1 -1
- package/dist/lib/components/shared/user-picker.component.d.ts.map +1 -1
- package/dist/lib/components/shared/user-picker.component.js +12 -15
- package/dist/lib/components/shared/user-picker.component.js.map +1 -1
- package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts +11 -3
- package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts.map +1 -1
- package/dist/lib/components/sidebar/conversation-sidebar.component.js +34 -10
- package/dist/lib/components/sidebar/conversation-sidebar.component.js.map +1 -1
- package/dist/lib/components/sidebar/routines-section.component.d.ts +73 -0
- package/dist/lib/components/sidebar/routines-section.component.d.ts.map +1 -0
- package/dist/lib/components/sidebar/routines-section.component.js +211 -0
- package/dist/lib/components/sidebar/routines-section.component.js.map +1 -0
- package/dist/lib/components/tasks/tasks-dropdown.component.d.ts +12 -0
- package/dist/lib/components/tasks/tasks-dropdown.component.d.ts.map +1 -1
- package/dist/lib/components/tasks/tasks-dropdown.component.js +37 -1
- package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts +16 -5
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.js +51 -31
- package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
- package/dist/lib/composer-plugins/agent-mention.provider.d.ts +16 -0
- package/dist/lib/composer-plugins/agent-mention.provider.d.ts.map +1 -0
- package/dist/lib/composer-plugins/agent-mention.provider.js +28 -0
- package/dist/lib/composer-plugins/agent-mention.provider.js.map +1 -0
- package/dist/lib/composer-plugins/base-conversation-mention.provider.d.ts +20 -0
- package/dist/lib/composer-plugins/base-conversation-mention.provider.d.ts.map +1 -0
- package/dist/lib/composer-plugins/base-conversation-mention.provider.js +32 -0
- package/dist/lib/composer-plugins/base-conversation-mention.provider.js.map +1 -0
- package/dist/lib/composer-plugins/load-composer-plugins.d.ts +9 -0
- package/dist/lib/composer-plugins/load-composer-plugins.d.ts.map +1 -0
- package/dist/lib/composer-plugins/load-composer-plugins.js +17 -0
- package/dist/lib/composer-plugins/load-composer-plugins.js.map +1 -0
- package/dist/lib/composer-plugins/record-mention.provider.d.ts +14 -0
- package/dist/lib/composer-plugins/record-mention.provider.d.ts.map +1 -0
- package/dist/lib/composer-plugins/record-mention.provider.js +26 -0
- package/dist/lib/composer-plugins/record-mention.provider.js.map +1 -0
- package/dist/lib/composer-plugins/skill-command.provider.d.ts +15 -0
- package/dist/lib/composer-plugins/skill-command.provider.d.ts.map +1 -0
- package/dist/lib/composer-plugins/skill-command.provider.js +27 -0
- package/dist/lib/composer-plugins/skill-command.provider.js.map +1 -0
- package/dist/lib/conversations.module.d.ts +68 -64
- package/dist/lib/conversations.module.d.ts.map +1 -1
- package/dist/lib/conversations.module.js +69 -18
- package/dist/lib/conversations.module.js.map +1 -1
- package/dist/lib/models/conversation-state.model.d.ts +6 -3
- 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/conversation-agent.service.d.ts +9 -2
- package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-agent.service.js +26 -2
- package/dist/lib/services/conversation-agent.service.js.map +1 -1
- package/dist/lib/services/conversation-attachment.service.d.ts +1 -1
- package/dist/lib/services/conversation-attachment.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-attachment.service.js.map +1 -1
- package/dist/lib/services/mention-autocomplete.service.d.ts +42 -19
- package/dist/lib/services/mention-autocomplete.service.d.ts.map +1 -1
- package/dist/lib/services/mention-autocomplete.service.js +113 -18
- package/dist/lib/services/mention-autocomplete.service.js.map +1 -1
- package/dist/lib/services/realtime-audio-recorder.d.ts +143 -0
- package/dist/lib/services/realtime-audio-recorder.d.ts.map +1 -0
- package/dist/lib/services/realtime-audio-recorder.js +379 -0
- package/dist/lib/services/realtime-audio-recorder.js.map +1 -0
- package/dist/lib/services/realtime-pcm-wav.d.ts +75 -0
- package/dist/lib/services/realtime-pcm-wav.d.ts.map +1 -0
- package/dist/lib/services/realtime-pcm-wav.js +205 -0
- package/dist/lib/services/realtime-pcm-wav.js.map +1 -0
- package/dist/lib/services/realtime-session-review.service.d.ts +28 -1
- package/dist/lib/services/realtime-session-review.service.d.ts.map +1 -1
- package/dist/lib/services/realtime-session-review.service.js +12 -3
- package/dist/lib/services/realtime-session-review.service.js.map +1 -1
- package/dist/lib/services/realtime-session.service.d.ts +210 -20
- package/dist/lib/services/realtime-session.service.d.ts.map +1 -1
- package/dist/lib/services/realtime-session.service.js +452 -21
- package/dist/lib/services/realtime-session.service.js.map +1 -1
- package/dist/lib/services/realtime-sessions-adapter.js +1 -1
- package/dist/lib/services/realtime-sessions-adapter.js.map +1 -1
- package/dist/lib/services/ui-command-handler.service.d.ts +7 -2
- package/dist/lib/services/ui-command-handler.service.d.ts.map +1 -1
- package/dist/lib/services/ui-command-handler.service.js +6 -2
- package/dist/lib/services/ui-command-handler.service.js.map +1 -1
- package/dist/lib/utils/plan-mode-preference.d.ts +62 -0
- package/dist/lib/utils/plan-mode-preference.d.ts.map +1 -0
- package/dist/lib/utils/plan-mode-preference.js +130 -0
- package/dist/lib/utils/plan-mode-preference.js.map +1 -0
- package/dist/public-api.d.ts +29 -3
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +46 -3
- package/dist/public-api.js.map +1 -1
- package/package.json +30 -26
- package/dist/__tests__/attachment-badge.test.d.ts +0 -2
- package/dist/__tests__/attachment-badge.test.d.ts.map +0 -1
- package/dist/__tests__/attachment-badge.test.js +0 -66
- package/dist/__tests__/attachment-badge.test.js.map +0 -1
- package/dist/__tests__/channel-optional-surface.test.d.ts +0 -2
- package/dist/__tests__/channel-optional-surface.test.d.ts.map +0 -1
- package/dist/__tests__/channel-optional-surface.test.js +0 -53
- package/dist/__tests__/channel-optional-surface.test.js.map +0 -1
- package/dist/__tests__/chat-events.test.d.ts +0 -14
- package/dist/__tests__/chat-events.test.d.ts.map +0 -1
- package/dist/__tests__/chat-events.test.js +0 -109
- package/dist/__tests__/chat-events.test.js.map +0 -1
- package/dist/__tests__/collections-full-view.test.d.ts +0 -2
- package/dist/__tests__/collections-full-view.test.d.ts.map +0 -1
- package/dist/__tests__/collections-full-view.test.js +0 -225
- package/dist/__tests__/collections-full-view.test.js.map +0 -1
- package/dist/__tests__/conversation-cache.test.d.ts +0 -2
- package/dist/__tests__/conversation-cache.test.d.ts.map +0 -1
- package/dist/__tests__/conversation-cache.test.js +0 -233
- package/dist/__tests__/conversation-cache.test.js.map +0 -1
- package/dist/__tests__/conversation-naming.test.d.ts +0 -2
- package/dist/__tests__/conversation-naming.test.d.ts.map +0 -1
- package/dist/__tests__/conversation-naming.test.js +0 -110
- package/dist/__tests__/conversation-naming.test.js.map +0 -1
- package/dist/__tests__/delegation-result-parser.test.d.ts +0 -2
- package/dist/__tests__/delegation-result-parser.test.d.ts.map +0 -1
- package/dist/__tests__/delegation-result-parser.test.js +0 -107
- package/dist/__tests__/delegation-result-parser.test.js.map +0 -1
- package/dist/__tests__/distinct-artifacts.test.d.ts +0 -2
- package/dist/__tests__/distinct-artifacts.test.d.ts.map +0 -1
- package/dist/__tests__/distinct-artifacts.test.js +0 -56
- package/dist/__tests__/distinct-artifacts.test.js.map +0 -1
- package/dist/__tests__/event-wiring.test.d.ts +0 -15
- package/dist/__tests__/event-wiring.test.d.ts.map +0 -1
- package/dist/__tests__/event-wiring.test.js +0 -100
- package/dist/__tests__/event-wiring.test.js.map +0 -1
- package/dist/__tests__/index.test.d.ts +0 -2
- package/dist/__tests__/index.test.d.ts.map +0 -1
- package/dist/__tests__/index.test.js +0 -7
- package/dist/__tests__/index.test.js.map +0 -1
- package/dist/__tests__/narration-template.test.d.ts +0 -2
- package/dist/__tests__/narration-template.test.d.ts.map +0 -1
- package/dist/__tests__/narration-template.test.js +0 -76
- package/dist/__tests__/narration-template.test.js.map +0 -1
- package/dist/__tests__/notification-model.test.d.ts +0 -2
- package/dist/__tests__/notification-model.test.d.ts.map +0 -1
- package/dist/__tests__/notification-model.test.js +0 -68
- package/dist/__tests__/notification-model.test.js.map +0 -1
- package/dist/__tests__/realtime-agent-picker-models.test.d.ts +0 -2
- package/dist/__tests__/realtime-agent-picker-models.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-agent-picker-models.test.js +0 -49
- package/dist/__tests__/realtime-agent-picker-models.test.js.map +0 -1
- package/dist/__tests__/realtime-audio-visuals.test.d.ts +0 -2
- package/dist/__tests__/realtime-audio-visuals.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-audio-visuals.test.js +0 -123
- package/dist/__tests__/realtime-audio-visuals.test.js.map +0 -1
- package/dist/__tests__/realtime-delegation-card-cancel.test.d.ts +0 -2
- package/dist/__tests__/realtime-delegation-card-cancel.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-delegation-card-cancel.test.js +0 -48
- package/dist/__tests__/realtime-delegation-card-cancel.test.js.map +0 -1
- package/dist/__tests__/realtime-disclosure.test.d.ts +0 -2
- package/dist/__tests__/realtime-disclosure.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-disclosure.test.js +0 -164
- package/dist/__tests__/realtime-disclosure.test.js.map +0 -1
- package/dist/__tests__/realtime-pairing.test.d.ts +0 -2
- package/dist/__tests__/realtime-pairing.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-pairing.test.js +0 -207
- package/dist/__tests__/realtime-pairing.test.js.map +0 -1
- package/dist/__tests__/realtime-review-lifecycle.test.d.ts +0 -2
- package/dist/__tests__/realtime-review-lifecycle.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-review-lifecycle.test.js +0 -154
- package/dist/__tests__/realtime-review-lifecycle.test.js.map +0 -1
- package/dist/__tests__/realtime-session-cancel-usage.test.d.ts +0 -2
- package/dist/__tests__/realtime-session-cancel-usage.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-session-cancel-usage.test.js +0 -230
- package/dist/__tests__/realtime-session-cancel-usage.test.js.map +0 -1
- package/dist/__tests__/realtime-session-channels.test.d.ts +0 -2
- package/dist/__tests__/realtime-session-channels.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-session-channels.test.js +0 -252
- package/dist/__tests__/realtime-session-channels.test.js.map +0 -1
- package/dist/__tests__/realtime-session-client-tools.test.d.ts +0 -2
- package/dist/__tests__/realtime-session-client-tools.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-session-client-tools.test.js +0 -103
- package/dist/__tests__/realtime-session-client-tools.test.js.map +0 -1
- package/dist/__tests__/realtime-session-minimized.test.d.ts +0 -2
- package/dist/__tests__/realtime-session-minimized.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-session-minimized.test.js +0 -32
- package/dist/__tests__/realtime-session-minimized.test.js.map +0 -1
- package/dist/__tests__/realtime-session-mint.test.d.ts +0 -2
- package/dist/__tests__/realtime-session-mint.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-session-mint.test.js +0 -69
- package/dist/__tests__/realtime-session-mint.test.js.map +0 -1
- package/dist/__tests__/realtime-session-policy.test.d.ts +0 -2
- package/dist/__tests__/realtime-session-policy.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-session-policy.test.js +0 -303
- package/dist/__tests__/realtime-session-policy.test.js.map +0 -1
- package/dist/__tests__/realtime-session-review.service.test.d.ts +0 -2
- package/dist/__tests__/realtime-session-review.service.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-session-review.service.test.js +0 -743
- package/dist/__tests__/realtime-session-review.service.test.js.map +0 -1
- package/dist/__tests__/realtime-session-state.test.d.ts +0 -2
- package/dist/__tests__/realtime-session-state.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-session-state.test.js +0 -83
- package/dist/__tests__/realtime-session-state.test.js.map +0 -1
- package/dist/__tests__/realtime-session-timeline-card.test.d.ts +0 -2
- package/dist/__tests__/realtime-session-timeline-card.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-session-timeline-card.test.js +0 -106
- package/dist/__tests__/realtime-session-timeline-card.test.js.map +0 -1
- package/dist/__tests__/realtime-session-timeline.test.d.ts +0 -2
- package/dist/__tests__/realtime-session-timeline.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-session-timeline.test.js +0 -142
- package/dist/__tests__/realtime-session-timeline.test.js.map +0 -1
- package/dist/__tests__/realtime-sessions-adapter.test.d.ts +0 -19
- package/dist/__tests__/realtime-sessions-adapter.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-sessions-adapter.test.js +0 -188
- package/dist/__tests__/realtime-sessions-adapter.test.js.map +0 -1
- package/dist/__tests__/realtime-surface-panel-prefs.test.d.ts +0 -2
- package/dist/__tests__/realtime-surface-panel-prefs.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-surface-panel-prefs.test.js +0 -100
- package/dist/__tests__/realtime-surface-panel-prefs.test.js.map +0 -1
- package/dist/__tests__/realtime-surface-tabs-model.test.d.ts +0 -2
- package/dist/__tests__/realtime-surface-tabs-model.test.d.ts.map +0 -1
- package/dist/__tests__/realtime-surface-tabs-model.test.js +0 -193
- package/dist/__tests__/realtime-surface-tabs-model.test.js.map +0 -1
- package/dist/__tests__/remote-browser-audio-player.test.d.ts +0 -2
- package/dist/__tests__/remote-browser-audio-player.test.d.ts.map +0 -1
- package/dist/__tests__/remote-browser-audio-player.test.js +0 -137
- package/dist/__tests__/remote-browser-audio-player.test.js.map +0 -1
- package/dist/__tests__/remote-browser-channel.test.d.ts +0 -2
- package/dist/__tests__/remote-browser-channel.test.d.ts.map +0 -1
- package/dist/__tests__/remote-browser-channel.test.js +0 -585
- package/dist/__tests__/remote-browser-channel.test.js.map +0 -1
- package/dist/__tests__/search-service.test.d.ts +0 -2
- package/dist/__tests__/search-service.test.d.ts.map +0 -1
- package/dist/__tests__/search-service.test.js +0 -114
- package/dist/__tests__/search-service.test.js.map +0 -1
- package/dist/__tests__/slot-defaults.test.d.ts +0 -24
- package/dist/__tests__/slot-defaults.test.d.ts.map +0 -1
- package/dist/__tests__/slot-defaults.test.js +0 -63
- package/dist/__tests__/slot-defaults.test.js.map +0 -1
- package/dist/__tests__/toast-service.test.d.ts +0 -2
- package/dist/__tests__/toast-service.test.d.ts.map +0 -1
- package/dist/__tests__/toast-service.test.js +0 -143
- package/dist/__tests__/toast-service.test.js.map +0 -1
- package/dist/__tests__/user-authorization.test.d.ts +0 -2
- package/dist/__tests__/user-authorization.test.d.ts.map +0 -1
- package/dist/__tests__/user-authorization.test.js +0 -97
- package/dist/__tests__/user-authorization.test.js.map +0 -1
- package/dist/__tests__/voice-session-narration.test.d.ts +0 -2
- package/dist/__tests__/voice-session-narration.test.d.ts.map +0 -1
- package/dist/__tests__/voice-session-narration.test.js +0 -609
- package/dist/__tests__/voice-session-narration.test.js.map +0 -1
- package/dist/__tests__/whiteboard-artifact-viewer.test.d.ts +0 -2
- package/dist/__tests__/whiteboard-artifact-viewer.test.d.ts.map +0 -1
- package/dist/__tests__/whiteboard-artifact-viewer.test.js +0 -101
- package/dist/__tests__/whiteboard-artifact-viewer.test.js.map +0 -1
- package/dist/__tests__/whiteboard-channel.test.d.ts +0 -2
- package/dist/__tests__/whiteboard-channel.test.d.ts.map +0 -1
- package/dist/__tests__/whiteboard-channel.test.js +0 -260
- package/dist/__tests__/whiteboard-channel.test.js.map +0 -1
- package/dist/__tests__/whiteboard-restore-state.test.d.ts +0 -2
- package/dist/__tests__/whiteboard-restore-state.test.d.ts.map +0 -1
- package/dist/__tests__/whiteboard-restore-state.test.js +0 -108
- package/dist/__tests__/whiteboard-restore-state.test.js.map +0 -1
- package/dist/lib/components/mention/mention-dropdown.component.d.ts +0 -53
- package/dist/lib/components/mention/mention-dropdown.component.d.ts.map +0 -1
- package/dist/lib/components/mention/mention-dropdown.component.js +0 -276
- package/dist/lib/components/mention/mention-dropdown.component.js.map +0 -1
- package/dist/lib/components/mention/mention-editor.component.d.ts +0 -256
- package/dist/lib/components/mention/mention-editor.component.d.ts.map +0 -1
- package/dist/lib/components/mention/mention-editor.component.js +0 -1233
- package/dist/lib/components/mention/mention-editor.component.js.map +0 -1
- package/dist/lib/components/message/message-input-box.component.d.ts +0 -137
- package/dist/lib/components/message/message-input-box.component.d.ts.map +0 -1
- package/dist/lib/components/message/message-input-box.component.js +0 -321
- package/dist/lib/components/message/message-input-box.component.js.map +0 -1
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* @fileoverview The headless **Client Context** channel — the browser half of the live wire that
|
|
9
|
+
* keeps the realtime co-agent continuously aware of the user's app context and lets it act in the
|
|
10
|
+
* app through a single stable proxy tool.
|
|
11
|
+
*
|
|
12
|
+
* Paired with `ClientContextChannelServer` (`@memberjunction/ai-agents`) via the seeded
|
|
13
|
+
* `MJ: AI Agent Channels` row (`Name: 'ClientContextChannel'`, `IsHeadless: 1`,
|
|
14
|
+
* `ClientPluginClass: 'ClientContextChannel'`).
|
|
15
|
+
*
|
|
16
|
+
* Two responsibilities, both client-side (no server round-trip in the client-direct topology):
|
|
17
|
+
*
|
|
18
|
+
* 1. **Perception (streaming).** It subscribes to the host's live app-context stream
|
|
19
|
+
* ({@link RealtimeChannelContext.AppContext$}, fed by Explorer from `NavigationService`) and, on
|
|
20
|
+
* every change, pushes a compact `SendContextNote` so the model always knows where the user is,
|
|
21
|
+
* what they see, and which tools/agents are available — the *continuous* half of client-context
|
|
22
|
+
* delivery (the session-start half is injected into the companion prompt server-side at mint).
|
|
23
|
+
*
|
|
24
|
+
* 2. **Action (the `ContextTool` proxy).** It declares ONE stable tool, `ContextTool`, so the
|
|
25
|
+
* provider tool surface never changes mid-session (which connect-bound providers reject). The
|
|
26
|
+
* model invokes any currently-available surface client tool via `ContextTool({ action, params })`;
|
|
27
|
+
* the channel routes that to the host's {@link RealtimeChannelContext.ExecuteClientTool} (which runs
|
|
28
|
+
* the surface handler the host registered from `SetAgentClientTools`) and returns a structured
|
|
29
|
+
* result the model narrates.
|
|
30
|
+
*
|
|
31
|
+
* **Headless:** no surface component — it never mounts a tab (`GetSurfaceComponent` stays `null`;
|
|
32
|
+
* `BindSurface` is a no-op). It is a wire, not a panel.
|
|
33
|
+
*
|
|
34
|
+
* @module @memberjunction/ng-conversations
|
|
35
|
+
*/
|
|
36
|
+
import { RegisterClass } from '@memberjunction/global';
|
|
37
|
+
import { FormatAppContextNote } from '@memberjunction/ai-core-plus';
|
|
38
|
+
import { distinctUntilChanged } from 'rxjs/operators';
|
|
39
|
+
import { BaseRealtimeChannelClient } from './base-realtime-channel-client';
|
|
40
|
+
/** The stable name of the single proxy tool this channel registers with the realtime provider. */
|
|
41
|
+
export const CONTEXT_TOOL_NAME = 'ContextTool';
|
|
42
|
+
/** The single stable proxy tool — declared once; the live catalog of valid `action`s rides context. */
|
|
43
|
+
const CONTEXT_TOOL_DEFINITION = {
|
|
44
|
+
Name: CONTEXT_TOOL_NAME,
|
|
45
|
+
Description: "Perform an action in the application the user is currently in. The set of valid actions (the " +
|
|
46
|
+
"client tools and the things you can do on the current surface) is provided to you continuously " +
|
|
47
|
+
"as context — only call actions listed as currently available. Pass the action name and its " +
|
|
48
|
+
"parameters.",
|
|
49
|
+
ParametersSchema: {
|
|
50
|
+
type: 'object',
|
|
51
|
+
properties: {
|
|
52
|
+
action: {
|
|
53
|
+
type: 'string',
|
|
54
|
+
description: 'The name of a currently-available action/tool to run (from the context you were given).'
|
|
55
|
+
},
|
|
56
|
+
params: {
|
|
57
|
+
type: 'object',
|
|
58
|
+
description: "The action's parameters, matching its advertised input schema."
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
required: ['action']
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* The headless Client Context channel client. One instance per realtime session (created by the
|
|
66
|
+
* session service from the `MJ: AI Agent Channels` registry — never construct directly).
|
|
67
|
+
*/
|
|
68
|
+
let ClientContextChannel = class ClientContextChannel extends BaseRealtimeChannelClient {
|
|
69
|
+
/** Subscription to the host app-context stream (perception); cleared on {@link Dispose}. */
|
|
70
|
+
appContextSub = null;
|
|
71
|
+
/** Matches the seeded `MJ: AI Agent Channels` row's `Name`. */
|
|
72
|
+
get ChannelName() {
|
|
73
|
+
return 'ClientContextChannel';
|
|
74
|
+
}
|
|
75
|
+
/** Routing prefix — the single `ContextTool` matches `ContextTool`.startsWith(prefix). */
|
|
76
|
+
get ToolNamePrefix() {
|
|
77
|
+
return CONTEXT_TOOL_NAME;
|
|
78
|
+
}
|
|
79
|
+
/** Headless — never rendered, but the abstract contract requires a label/icon. */
|
|
80
|
+
get TabTitle() {
|
|
81
|
+
return 'App Context';
|
|
82
|
+
}
|
|
83
|
+
get TabIcon() {
|
|
84
|
+
return 'fa-solid fa-satellite-dish';
|
|
85
|
+
}
|
|
86
|
+
/** Declares the single stable proxy tool. */
|
|
87
|
+
GetToolDefinitions() {
|
|
88
|
+
return [CONTEXT_TOOL_DEFINITION];
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Routes a `ContextTool({ action, params })` call to the host's registered surface client tool.
|
|
92
|
+
* Tolerant: malformed args, a missing host executor, or an unknown/throwing tool all serialize to
|
|
93
|
+
* a structured `{ success: false, output }` the model narrates (never throws).
|
|
94
|
+
*/
|
|
95
|
+
async ApplyAgentTool(toolName, argsJson) {
|
|
96
|
+
if (toolName !== CONTEXT_TOOL_NAME) {
|
|
97
|
+
return JSON.stringify({ success: false, output: `Unknown context tool "${toolName}".` });
|
|
98
|
+
}
|
|
99
|
+
const parsed = this.parseArgs(argsJson);
|
|
100
|
+
if (!parsed.action) {
|
|
101
|
+
return JSON.stringify({ success: false, output: 'ContextTool requires an "action" naming the tool to run.' });
|
|
102
|
+
}
|
|
103
|
+
const executor = this.Context?.ExecuteClientTool;
|
|
104
|
+
if (!executor) {
|
|
105
|
+
return JSON.stringify({
|
|
106
|
+
success: false,
|
|
107
|
+
output: 'No app surface is available to perform that action right now.'
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
const result = await executor(parsed.action, parsed.params);
|
|
111
|
+
return result.Success
|
|
112
|
+
? JSON.stringify({ success: true, output: result.Result ?? 'Done.' })
|
|
113
|
+
: JSON.stringify({ success: false, output: result.ErrorMessage ?? 'The action could not be performed.' });
|
|
114
|
+
}
|
|
115
|
+
/** Headless — no surface to bind. */
|
|
116
|
+
BindSurface() {
|
|
117
|
+
/* no-op: this channel renders no surface */
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Subscribes to the host's live app-context stream and streams each change to the model as a
|
|
121
|
+
* compact context note (the perception half). Null-safe — hosts that supply no `AppContext$`
|
|
122
|
+
* (custom apps) simply get no streaming, and the session-start prompt injection still applies.
|
|
123
|
+
*/
|
|
124
|
+
OnInitialize() {
|
|
125
|
+
const stream = this.Context?.AppContext$;
|
|
126
|
+
if (!stream) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
this.appContextSub = stream
|
|
130
|
+
.pipe(distinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b)))
|
|
131
|
+
.subscribe((snapshot) => {
|
|
132
|
+
if (!snapshot) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
const note = FormatAppContextNote(snapshot);
|
|
136
|
+
if (note) {
|
|
137
|
+
this.Context?.SendContextNote(note);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
/** Tolerantly parses the `{ action, params }` arguments. */
|
|
142
|
+
parseArgs(argsJson) {
|
|
143
|
+
try {
|
|
144
|
+
const parsed = JSON.parse(argsJson);
|
|
145
|
+
const action = typeof parsed.action === 'string' && parsed.action.trim().length > 0 ? parsed.action.trim() : null;
|
|
146
|
+
const params = parsed.params && typeof parsed.params === 'object' && !Array.isArray(parsed.params)
|
|
147
|
+
? parsed.params
|
|
148
|
+
: {};
|
|
149
|
+
return { action, params };
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
return { action: null, params: {} };
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/** Unsubscribes the app-context stream and tears down. */
|
|
156
|
+
Dispose() {
|
|
157
|
+
this.appContextSub?.unsubscribe();
|
|
158
|
+
this.appContextSub = null;
|
|
159
|
+
super.Dispose();
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
ClientContextChannel = __decorate([
|
|
163
|
+
RegisterClass(BaseRealtimeChannelClient, 'ClientContextChannel')
|
|
164
|
+
], ClientContextChannel);
|
|
165
|
+
export { ClientContextChannel };
|
|
166
|
+
/**
|
|
167
|
+
* Tree-shaking prevention for {@link ClientContextChannel}'s `@RegisterClass` registration. Called
|
|
168
|
+
* from a static code path in `conversations.module.ts` so the registration always executes —
|
|
169
|
+
* mirroring every other realtime channel client.
|
|
170
|
+
*/
|
|
171
|
+
export function LoadClientContextChannel() {
|
|
172
|
+
// no-op — the import + call create a static reference bundlers cannot eliminate
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=client-context-channel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-context-channel.js","sourceRoot":"","sources":["../../../../../src/lib/components/realtime/channels/client-context-channel.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview The headless **Client Context** channel — the browser half of the live wire that\n * keeps the realtime co-agent continuously aware of the user's app context and lets it act in the\n * app through a single stable proxy tool.\n *\n * Paired with `ClientContextChannelServer` (`@memberjunction/ai-agents`) via the seeded\n * `MJ: AI Agent Channels` row (`Name: 'ClientContextChannel'`, `IsHeadless: 1`,\n * `ClientPluginClass: 'ClientContextChannel'`).\n *\n * Two responsibilities, both client-side (no server round-trip in the client-direct topology):\n *\n * 1. **Perception (streaming).** It subscribes to the host's live app-context stream\n * ({@link RealtimeChannelContext.AppContext$}, fed by Explorer from `NavigationService`) and, on\n * every change, pushes a compact `SendContextNote` so the model always knows where the user is,\n * what they see, and which tools/agents are available — the *continuous* half of client-context\n * delivery (the session-start half is injected into the companion prompt server-side at mint).\n *\n * 2. **Action (the `ContextTool` proxy).** It declares ONE stable tool, `ContextTool`, so the\n * provider tool surface never changes mid-session (which connect-bound providers reject). The\n * model invokes any currently-available surface client tool via `ContextTool({ action, params })`;\n * the channel routes that to the host's {@link RealtimeChannelContext.ExecuteClientTool} (which runs\n * the surface handler the host registered from `SetAgentClientTools`) and returns a structured\n * result the model narrates.\n *\n * **Headless:** no surface component — it never mounts a tab (`GetSurfaceComponent` stays `null`;\n * `BindSurface` is a no-op). It is a wire, not a panel.\n *\n * @module @memberjunction/ng-conversations\n */\nimport { RegisterClass } from '@memberjunction/global';\nimport { RealtimeToolDefinition } from '@memberjunction/ai';\nimport { FormatAppContextNote } from '@memberjunction/ai-core-plus';\nimport { Subscription } from 'rxjs';\nimport { distinctUntilChanged } from 'rxjs/operators';\nimport { BaseRealtimeChannelClient } from './base-realtime-channel-client';\n\n/** The stable name of the single proxy tool this channel registers with the realtime provider. */\nexport const CONTEXT_TOOL_NAME = 'ContextTool';\n\n/** The single stable proxy tool — declared once; the live catalog of valid `action`s rides context. */\nconst CONTEXT_TOOL_DEFINITION: RealtimeToolDefinition = {\n Name: CONTEXT_TOOL_NAME,\n Description:\n \"Perform an action in the application the user is currently in. The set of valid actions (the \" +\n \"client tools and the things you can do on the current surface) is provided to you continuously \" +\n \"as context — only call actions listed as currently available. Pass the action name and its \" +\n \"parameters.\",\n ParametersSchema: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n description: 'The name of a currently-available action/tool to run (from the context you were given).'\n },\n params: {\n type: 'object',\n description: \"The action's parameters, matching its advertised input schema.\"\n }\n },\n required: ['action']\n }\n};\n\n/**\n * The headless Client Context channel client. One instance per realtime session (created by the\n * session service from the `MJ: AI Agent Channels` registry — never construct directly).\n */\n@RegisterClass(BaseRealtimeChannelClient, 'ClientContextChannel')\nexport class ClientContextChannel extends BaseRealtimeChannelClient<object> {\n /** Subscription to the host app-context stream (perception); cleared on {@link Dispose}. */\n private appContextSub: Subscription | null = null;\n\n /** Matches the seeded `MJ: AI Agent Channels` row's `Name`. */\n public get ChannelName(): string {\n return 'ClientContextChannel';\n }\n\n /** Routing prefix — the single `ContextTool` matches `ContextTool`.startsWith(prefix). */\n public get ToolNamePrefix(): string {\n return CONTEXT_TOOL_NAME;\n }\n\n /** Headless — never rendered, but the abstract contract requires a label/icon. */\n public get TabTitle(): string {\n return 'App Context';\n }\n public get TabIcon(): string {\n return 'fa-solid fa-satellite-dish';\n }\n\n /** Declares the single stable proxy tool. */\n public GetToolDefinitions(): RealtimeToolDefinition[] {\n return [CONTEXT_TOOL_DEFINITION];\n }\n\n /**\n * Routes a `ContextTool({ action, params })` call to the host's registered surface client tool.\n * Tolerant: malformed args, a missing host executor, or an unknown/throwing tool all serialize to\n * a structured `{ success: false, output }` the model narrates (never throws).\n */\n public async ApplyAgentTool(toolName: string, argsJson: string): Promise<string> {\n if (toolName !== CONTEXT_TOOL_NAME) {\n return JSON.stringify({ success: false, output: `Unknown context tool \"${toolName}\".` });\n }\n const parsed = this.parseArgs(argsJson);\n if (!parsed.action) {\n return JSON.stringify({ success: false, output: 'ContextTool requires an \"action\" naming the tool to run.' });\n }\n const executor = this.Context?.ExecuteClientTool;\n if (!executor) {\n return JSON.stringify({\n success: false,\n output: 'No app surface is available to perform that action right now.'\n });\n }\n const result = await executor(parsed.action, parsed.params);\n return result.Success\n ? JSON.stringify({ success: true, output: result.Result ?? 'Done.' })\n : JSON.stringify({ success: false, output: result.ErrorMessage ?? 'The action could not be performed.' });\n }\n\n /** Headless — no surface to bind. */\n public BindSurface(): void {\n /* no-op: this channel renders no surface */\n }\n\n /**\n * Subscribes to the host's live app-context stream and streams each change to the model as a\n * compact context note (the perception half). Null-safe — hosts that supply no `AppContext$`\n * (custom apps) simply get no streaming, and the session-start prompt injection still applies.\n */\n protected override OnInitialize(): void {\n const stream = this.Context?.AppContext$;\n if (!stream) {\n return;\n }\n this.appContextSub = stream\n .pipe(distinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b)))\n .subscribe((snapshot) => {\n if (!snapshot) {\n return;\n }\n const note = FormatAppContextNote(snapshot);\n if (note) {\n this.Context?.SendContextNote(note);\n }\n });\n }\n\n /** Tolerantly parses the `{ action, params }` arguments. */\n private parseArgs(argsJson: string): { action: string | null; params: Record<string, unknown> } {\n try {\n const parsed = JSON.parse(argsJson) as { action?: unknown; params?: unknown };\n const action = typeof parsed.action === 'string' && parsed.action.trim().length > 0 ? parsed.action.trim() : null;\n const params =\n parsed.params && typeof parsed.params === 'object' && !Array.isArray(parsed.params)\n ? (parsed.params as Record<string, unknown>)\n : {};\n return { action, params };\n } catch {\n return { action: null, params: {} };\n }\n }\n\n /** Unsubscribes the app-context stream and tears down. */\n public override Dispose(): void {\n this.appContextSub?.unsubscribe();\n this.appContextSub = null;\n super.Dispose();\n }\n}\n\n/**\n * Tree-shaking prevention for {@link ClientContextChannel}'s `@RegisterClass` registration. Called\n * from a static code path in `conversations.module.ts` so the registration always executes —\n * mirroring every other realtime channel client.\n */\nexport function LoadClientContextChannel(): void {\n // no-op — the import + call create a static reference bundlers cannot eliminate\n}\n"]}
|
package/dist/lib/components/realtime/evidence-playback/realtime-evidence-playback.component.d.ts
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { EventEmitter, OnDestroy } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* The MINIMAL structural shape of a transcript turn this player needs — exactly the fields it reads
|
|
5
|
+
* for the click-to-seek transcript and the playhead-sync highlight. Deliberately NOT the full
|
|
6
|
+
* `MJConversationDetailEntity`: that keeps the player reusable by ANY caller that can supply these
|
|
7
|
+
* fields (the in-conversation session-review overlay passes its lighter `RealtimeSessionReviewTurn`;
|
|
8
|
+
* the Realtime Recordings dashboard passes full `MJConversationDetailEntity` rows — both satisfy this
|
|
9
|
+
* widened shape structurally).
|
|
10
|
+
*
|
|
11
|
+
* Field unions/nullability are intentionally WIDER than the generated entity so an
|
|
12
|
+
* `MJConversationDetailEntity[]` remains assignable here.
|
|
13
|
+
*/
|
|
14
|
+
export interface EvidencePlaybackTurn {
|
|
15
|
+
/** Stable identity for the `@for` track. */
|
|
16
|
+
ID: string;
|
|
17
|
+
/** Speaker. The player only distinguishes `'User'` (human) from everything else (the agent). */
|
|
18
|
+
Role: 'User' | 'AI' | 'Assistant' | 'Error' | string;
|
|
19
|
+
/** The transcript text shown on the turn. */
|
|
20
|
+
Message: string | null;
|
|
21
|
+
/** Persisted turn time — fallback offset origin when the turn has no `UtteranceStartMs`. */
|
|
22
|
+
__mj_CreatedAt: Date | null;
|
|
23
|
+
/**
|
|
24
|
+
* Precise media-relative start (ms from recording t0). `null`/absent when the driver supplied no
|
|
25
|
+
* timing — the player falls back to (`__mj_CreatedAt` − `RecordingStartedAt`).
|
|
26
|
+
*/
|
|
27
|
+
UtteranceStartMs?: number | null;
|
|
28
|
+
/** Precise media-relative end (ms from recording t0). `null`/absent → derived from the next turn / duration. */
|
|
29
|
+
UtteranceEndMs?: number | null;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* TIME-ALIGNED EVIDENCE PLAYBACK (`mj-realtime-evidence-playback`) — replays a realtime session's
|
|
33
|
+
* recorded audio next to its transcript, with the two kept in sync. The audio gets a custom transport
|
|
34
|
+
* (play/pause, a synthetic waveform scrubber, time/duration readout); the transcript is a scrollable
|
|
35
|
+
* list of clickable turns. Clicking a turn seeks the audio to that turn's start and plays; as the audio
|
|
36
|
+
* plays, the turn whose `[UtteranceStartMs, UtteranceEndMs]` window contains the playhead is highlighted.
|
|
37
|
+
*
|
|
38
|
+
* Timestamps come from {@link EvidencePlaybackTurn.UtteranceStartMs}; when a turn has none, the
|
|
39
|
+
* component falls back to (`__mj_CreatedAt` − {@link RecordingStartedAt}). Generic + Router-free: all
|
|
40
|
+
* state arrives via inputs, the only output is {@link TurnSeek}.
|
|
41
|
+
*/
|
|
42
|
+
export declare class RealtimeEvidencePlaybackComponent implements OnDestroy {
|
|
43
|
+
/** The session's transcript turns, in chronological order. */
|
|
44
|
+
set Turns(value: EvidencePlaybackTurn[] | null);
|
|
45
|
+
get Turns(): EvidencePlaybackTurn[];
|
|
46
|
+
private _turns;
|
|
47
|
+
/** The recorded session audio URL, or `null` when no recording is available. */
|
|
48
|
+
set AudioUrl(value: string | null);
|
|
49
|
+
get AudioUrl(): string | null;
|
|
50
|
+
private _audioUrl;
|
|
51
|
+
/** When the recording started, used to derive a turn's offset when it has no `UtteranceStartMs`. */
|
|
52
|
+
RecordingStartedAt: Date | null;
|
|
53
|
+
/** Display name of the agent — labels and colors AI turns. */
|
|
54
|
+
AgentName: string;
|
|
55
|
+
/** Emitted when the user clicks a transcript turn (to seek the audio to it). */
|
|
56
|
+
TurnSeek: EventEmitter<EvidencePlaybackTurn>;
|
|
57
|
+
/** Current playhead position in ms (driven by the audio element's `timeupdate`). */
|
|
58
|
+
CurrentMs: number;
|
|
59
|
+
/** Total audio duration in ms (set on `loadedmetadata`). */
|
|
60
|
+
DurationMs: number;
|
|
61
|
+
/** Whether the audio is currently playing. */
|
|
62
|
+
IsPlaying: boolean;
|
|
63
|
+
/** The synthetic waveform bar heights (stable per AudioUrl). */
|
|
64
|
+
readonly WaveformBars: number[];
|
|
65
|
+
private audioRef?;
|
|
66
|
+
private readonly cdr;
|
|
67
|
+
ngOnDestroy(): void;
|
|
68
|
+
/** The `<audio>` element, or `null` before the view initializes / when there's no audio. */
|
|
69
|
+
private get audioEl();
|
|
70
|
+
/** Playhead progress as a fraction (0..1), for the scrubber fill + waveform reveal. */
|
|
71
|
+
get Progress(): number;
|
|
72
|
+
/** Toggles audio play / pause. */
|
|
73
|
+
TogglePlay(): void;
|
|
74
|
+
/** Seeks to a fraction of the duration (scrubber click / keyboard). */
|
|
75
|
+
SeekToFraction(fraction: number): void;
|
|
76
|
+
/** Scrubber pointer handler — maps the click X within the track to a seek fraction. */
|
|
77
|
+
OnScrubberClick(event: MouseEvent, track: HTMLElement): void;
|
|
78
|
+
/** Scrubber keyboard handler — arrows nudge ±5s, Home/End jump to ends, Space toggles play. */
|
|
79
|
+
OnScrubberKeydown(event: KeyboardEvent): void;
|
|
80
|
+
/** Clicking a transcript turn → seek the audio to it, play, and emit {@link TurnSeek}. */
|
|
81
|
+
SeekToTurn(turn: EvidencePlaybackTurn): void;
|
|
82
|
+
/** True when the playhead falls within this turn's utterance window (drives the active highlight). */
|
|
83
|
+
IsTurnActive(turn: EvidencePlaybackTurn): boolean;
|
|
84
|
+
/** Whether a turn is from the human user (vs. the agent) — drives the speaker color + label. */
|
|
85
|
+
IsUserTurn(turn: EvidencePlaybackTurn): boolean;
|
|
86
|
+
/** The speaker label for a turn. */
|
|
87
|
+
SpeakerLabel(turn: EvidencePlaybackTurn): string;
|
|
88
|
+
/** The mm:ss timestamp shown on a turn (its start offset within the recording). */
|
|
89
|
+
TurnTimestamp(turn: EvidencePlaybackTurn): string;
|
|
90
|
+
/** mm:ss of the current playhead. */
|
|
91
|
+
get CurrentLabel(): string;
|
|
92
|
+
/** mm:ss of the total duration. */
|
|
93
|
+
get DurationLabel(): string;
|
|
94
|
+
/** Stable `@for` track for the transcript. */
|
|
95
|
+
TrackByTurn(_index: number, turn: EvidencePlaybackTurn): string;
|
|
96
|
+
/** `loadedmetadata` → capture the duration. */
|
|
97
|
+
OnLoadedMetadata(): void;
|
|
98
|
+
/** `timeupdate` → advance the playhead + re-evaluate the active turn. */
|
|
99
|
+
OnTimeUpdate(): void;
|
|
100
|
+
/** `play` / `pause` / `ended` → reflect the transport state. */
|
|
101
|
+
OnPlay(): void;
|
|
102
|
+
OnPause(): void;
|
|
103
|
+
OnEnded(): void;
|
|
104
|
+
/** Nudges the playhead by `deltaMs`, clamped to the duration. */
|
|
105
|
+
private seekByMs;
|
|
106
|
+
/**
|
|
107
|
+
* A turn's start offset (ms) within the recording: prefer {@link EvidencePlaybackTurn.UtteranceStartMs};
|
|
108
|
+
* fall back to (`__mj_CreatedAt` − {@link RecordingStartedAt}); 0 when neither is available.
|
|
109
|
+
*/
|
|
110
|
+
private turnStartMs;
|
|
111
|
+
/**
|
|
112
|
+
* A turn's end offset (ms): prefer {@link EvidencePlaybackTurn.UtteranceEndMs}; otherwise the
|
|
113
|
+
* next turn's start; otherwise the recording duration (or start + a small window when duration is unknown).
|
|
114
|
+
*/
|
|
115
|
+
private turnEndMs;
|
|
116
|
+
/** Formats a ms offset as mm:ss (clamped at 0). */
|
|
117
|
+
private formatMs;
|
|
118
|
+
/** Builds a stable pseudo-random waveform (deterministic, no per-render churn). */
|
|
119
|
+
private buildWaveform;
|
|
120
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<RealtimeEvidencePlaybackComponent, never>;
|
|
121
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<RealtimeEvidencePlaybackComponent, "mj-realtime-evidence-playback", never, { "Turns": { "alias": "Turns"; "required": false; }; "AudioUrl": { "alias": "AudioUrl"; "required": false; }; "RecordingStartedAt": { "alias": "RecordingStartedAt"; "required": false; }; "AgentName": { "alias": "AgentName"; "required": false; }; }, { "TurnSeek": "TurnSeek"; }, never, never, true, never>;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=realtime-evidence-playback.component.d.ts.map
|
package/dist/lib/components/realtime/evidence-playback/realtime-evidence-playback.component.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"realtime-evidence-playback.component.d.ts","sourceRoot":"","sources":["../../../../../src/lib/components/realtime/evidence-playback/realtime-evidence-playback.component.ts"],"names":[],"mappings":"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"}
|