@memberjunction/ng-conversations 6.2.0-edge.3 → 6.2.0-edge.4
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 +4 -7
- package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-view.component.js +1 -0
- package/dist/lib/components/collection/collection-view.component.js.map +1 -1
- package/dist/lib/components/composer/ai-composer.component.d.ts +14 -2
- package/dist/lib/components/composer/ai-composer.component.d.ts.map +1 -1
- package/dist/lib/components/composer/ai-composer.component.js +35 -4
- package/dist/lib/components/composer/ai-composer.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +588 -51
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.js +2654 -665
- package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
- package/dist/lib/components/conversation/forks-popover.component.d.ts +37 -0
- package/dist/lib/components/conversation/forks-popover.component.d.ts.map +1 -0
- package/dist/lib/components/conversation/forks-popover.component.js +164 -0
- package/dist/lib/components/conversation/forks-popover.component.js.map +1 -0
- package/dist/lib/components/export/export-modal.component.d.ts +7 -2
- package/dist/lib/components/export/export-modal.component.d.ts.map +1 -1
- package/dist/lib/components/export/export-modal.component.js +16 -3
- package/dist/lib/components/export/export-modal.component.js.map +1 -1
- package/dist/lib/components/message/conversation-message-rating.component.d.ts.map +1 -1
- package/dist/lib/components/message/conversation-message-rating.component.js +11 -9
- package/dist/lib/components/message/conversation-message-rating.component.js.map +1 -1
- package/dist/lib/components/message/message-input.component.d.ts +96 -11
- package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-input.component.js +244 -103
- package/dist/lib/components/message/message-input.component.js.map +1 -1
- package/dist/lib/components/message/message-item.component.d.ts +171 -4
- package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-item.component.js +899 -298
- package/dist/lib/components/message/message-item.component.js.map +1 -1
- package/dist/lib/components/message/message-list.component.d.ts +82 -21
- package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-list.component.js +299 -52
- package/dist/lib/components/message/message-list.component.js.map +1 -1
- package/dist/lib/components/realtime/avatar/realtime-avatar-channel.d.ts +34 -0
- package/dist/lib/components/realtime/avatar/realtime-avatar-channel.d.ts.map +1 -0
- package/dist/lib/components/realtime/avatar/realtime-avatar-channel.js +75 -0
- package/dist/lib/components/realtime/avatar/realtime-avatar-channel.js.map +1 -0
- package/dist/lib/components/realtime/avatar/realtime-avatar-surface.component.d.ts +80 -0
- package/dist/lib/components/realtime/avatar/realtime-avatar-surface.component.d.ts.map +1 -0
- package/dist/lib/components/realtime/avatar/realtime-avatar-surface.component.js +202 -0
- package/dist/lib/components/realtime/avatar/realtime-avatar-surface.component.js.map +1 -0
- package/dist/lib/components/realtime/capture/realtime-camera-check-card.component.d.ts +45 -0
- package/dist/lib/components/realtime/capture/realtime-camera-check-card.component.d.ts.map +1 -0
- package/dist/lib/components/realtime/capture/realtime-camera-check-card.component.js +123 -0
- package/dist/lib/components/realtime/capture/realtime-camera-check-card.component.js.map +1 -0
- package/dist/lib/components/realtime/capture/realtime-capture-channel.d.ts +90 -0
- package/dist/lib/components/realtime/capture/realtime-capture-channel.d.ts.map +1 -0
- package/dist/lib/components/realtime/capture/realtime-capture-channel.js +223 -0
- package/dist/lib/components/realtime/capture/realtime-capture-channel.js.map +1 -0
- package/dist/lib/components/realtime/capture/realtime-capture-model.d.ts +98 -0
- package/dist/lib/components/realtime/capture/realtime-capture-model.d.ts.map +1 -0
- package/dist/lib/components/realtime/capture/realtime-capture-model.js +161 -0
- package/dist/lib/components/realtime/capture/realtime-capture-model.js.map +1 -0
- package/dist/lib/components/realtime/capture/realtime-capture-surface.component.d.ts +48 -0
- package/dist/lib/components/realtime/capture/realtime-capture-surface.component.d.ts.map +1 -0
- package/dist/lib/components/realtime/capture/realtime-capture-surface.component.js +205 -0
- package/dist/lib/components/realtime/capture/realtime-capture-surface.component.js.map +1 -0
- package/dist/lib/components/realtime/channels/client-context-channel.d.ts +19 -2
- package/dist/lib/components/realtime/channels/client-context-channel.d.ts.map +1 -1
- package/dist/lib/components/realtime/channels/client-context-channel.js +83 -9
- package/dist/lib/components/realtime/channels/client-context-channel.js.map +1 -1
- package/dist/lib/components/realtime/channels/realtime-channel-pane.component.d.ts +30 -9
- package/dist/lib/components/realtime/channels/realtime-channel-pane.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/channels/realtime-channel-pane.component.js +78 -14
- package/dist/lib/components/realtime/channels/realtime-channel-pane.component.js.map +1 -1
- package/dist/lib/components/realtime/identity-verification/identity-verification-channel.d.ts +71 -0
- package/dist/lib/components/realtime/identity-verification/identity-verification-channel.d.ts.map +1 -0
- package/dist/lib/components/realtime/identity-verification/identity-verification-channel.js +259 -0
- package/dist/lib/components/realtime/identity-verification/identity-verification-channel.js.map +1 -0
- package/dist/lib/components/realtime/identity-verification/identity-verification-model.d.ts +129 -0
- package/dist/lib/components/realtime/identity-verification/identity-verification-model.d.ts.map +1 -0
- package/dist/lib/components/realtime/identity-verification/identity-verification-model.js +373 -0
- package/dist/lib/components/realtime/identity-verification/identity-verification-model.js.map +1 -0
- package/dist/lib/components/realtime/identity-verification/identity-verification-surface.component.d.ts +77 -0
- package/dist/lib/components/realtime/identity-verification/identity-verification-surface.component.d.ts.map +1 -0
- package/dist/lib/components/realtime/identity-verification/identity-verification-surface.component.js +420 -0
- package/dist/lib/components/realtime/identity-verification/identity-verification-surface.component.js.map +1 -0
- package/dist/lib/components/realtime/interactive-component/component-contract.d.ts +83 -0
- package/dist/lib/components/realtime/interactive-component/component-contract.d.ts.map +1 -0
- package/dist/lib/components/realtime/interactive-component/component-contract.js +292 -0
- package/dist/lib/components/realtime/interactive-component/component-contract.js.map +1 -0
- package/dist/lib/components/realtime/interactive-component/component-data-state.d.ts +39 -0
- package/dist/lib/components/realtime/interactive-component/component-data-state.d.ts.map +1 -0
- package/dist/lib/components/realtime/interactive-component/component-data-state.js +152 -0
- package/dist/lib/components/realtime/interactive-component/component-data-state.js.map +1 -0
- package/dist/lib/components/realtime/interactive-component/component-instance-engine.d.ts +109 -0
- package/dist/lib/components/realtime/interactive-component/component-instance-engine.d.ts.map +1 -0
- package/dist/lib/components/realtime/interactive-component/component-instance-engine.js +146 -0
- package/dist/lib/components/realtime/interactive-component/component-instance-engine.js.map +1 -0
- package/dist/lib/components/realtime/interactive-component/component-spec-content.d.ts +19 -0
- package/dist/lib/components/realtime/interactive-component/component-spec-content.d.ts.map +1 -0
- package/dist/lib/components/realtime/interactive-component/component-spec-content.js +39 -0
- package/dist/lib/components/realtime/interactive-component/component-spec-content.js.map +1 -0
- package/dist/lib/components/realtime/interactive-component/interactive-component-channel.d.ts +183 -0
- package/dist/lib/components/realtime/interactive-component/interactive-component-channel.d.ts.map +1 -0
- package/dist/lib/components/realtime/interactive-component/interactive-component-channel.js +761 -0
- package/dist/lib/components/realtime/interactive-component/interactive-component-channel.js.map +1 -0
- package/dist/lib/components/realtime/interactive-component/interactive-component-config.d.ts +25 -0
- package/dist/lib/components/realtime/interactive-component/interactive-component-config.d.ts.map +1 -0
- package/dist/lib/components/realtime/interactive-component/interactive-component-config.js +57 -0
- package/dist/lib/components/realtime/interactive-component/interactive-component-config.js.map +1 -0
- package/dist/lib/components/realtime/interactive-component/interactive-component-host.component.d.ts +40 -0
- package/dist/lib/components/realtime/interactive-component/interactive-component-host.component.d.ts.map +1 -0
- package/dist/lib/components/realtime/interactive-component/interactive-component-host.component.js +97 -0
- package/dist/lib/components/realtime/interactive-component/interactive-component-host.component.js.map +1 -0
- package/dist/lib/components/realtime/interactive-component/interactive-component-types.d.ts +144 -0
- package/dist/lib/components/realtime/interactive-component/interactive-component-types.d.ts.map +1 -0
- package/dist/lib/components/realtime/interactive-component/interactive-component-types.js +57 -0
- package/dist/lib/components/realtime/interactive-component/interactive-component-types.js.map +1 -0
- package/dist/lib/components/realtime/interactive-component/react-component-handle.d.ts +36 -0
- package/dist/lib/components/realtime/interactive-component/react-component-handle.d.ts.map +1 -0
- package/dist/lib/components/realtime/interactive-component/react-component-handle.js +55 -0
- package/dist/lib/components/realtime/interactive-component/react-component-handle.js.map +1 -0
- package/dist/lib/components/realtime/interactive-component/realtime-interactive-component-surface.component.d.ts +55 -0
- package/dist/lib/components/realtime/interactive-component/realtime-interactive-component-surface.component.d.ts.map +1 -0
- package/dist/lib/components/realtime/interactive-component/realtime-interactive-component-surface.component.js +210 -0
- package/dist/lib/components/realtime/interactive-component/realtime-interactive-component-surface.component.js.map +1 -0
- package/dist/lib/components/realtime/interactive-component/run-view-component-artifact-source.d.ts +32 -0
- package/dist/lib/components/realtime/interactive-component/run-view-component-artifact-source.d.ts.map +1 -0
- package/dist/lib/components/realtime/interactive-component/run-view-component-artifact-source.js +90 -0
- package/dist/lib/components/realtime/interactive-component/run-view-component-artifact-source.js.map +1 -0
- package/dist/lib/components/realtime/media/media-channel.d.ts +7 -0
- package/dist/lib/components/realtime/media/media-channel.d.ts.map +1 -1
- package/dist/lib/components/realtime/media/media-channel.js +28 -1
- package/dist/lib/components/realtime/media/media-channel.js.map +1 -1
- package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts +8 -1
- package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-agent-banner.component.js +89 -71
- package/dist/lib/components/realtime/realtime-agent-banner.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-agent-orb.component.d.ts +21 -0
- package/dist/lib/components/realtime/realtime-agent-orb.component.d.ts.map +1 -0
- package/dist/lib/components/realtime/realtime-agent-orb.component.js +49 -0
- package/dist/lib/components/realtime/realtime-agent-orb.component.js.map +1 -0
- package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts +44 -11
- package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-agent-picker.component.js +162 -50
- package/dist/lib/components/realtime/realtime-agent-picker.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-audio-visuals.d.ts +8 -2
- package/dist/lib/components/realtime/realtime-audio-visuals.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-audio-visuals.js +14 -18
- package/dist/lib/components/realtime/realtime-audio-visuals.js.map +1 -1
- package/dist/lib/components/realtime/realtime-composer.component.d.ts +42 -2
- package/dist/lib/components/realtime/realtime-composer.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-composer.component.js +137 -102
- package/dist/lib/components/realtime/realtime-composer.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-perception-chip.component.d.ts +71 -0
- package/dist/lib/components/realtime/realtime-perception-chip.component.d.ts.map +1 -0
- package/dist/lib/components/realtime/realtime-perception-chip.component.js +221 -0
- package/dist/lib/components/realtime/realtime-perception-chip.component.js.map +1 -0
- package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts +264 -22
- package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-session-overlay.component.js +851 -135
- package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-surface-placement-prefs.d.ts +14 -0
- package/dist/lib/components/realtime/realtime-surface-placement-prefs.d.ts.map +1 -0
- package/dist/lib/components/realtime/realtime-surface-placement-prefs.js +14 -0
- package/dist/lib/components/realtime/realtime-surface-placement-prefs.js.map +1 -0
- package/dist/lib/components/realtime/realtime-surface-stage.model.d.ts +74 -0
- package/dist/lib/components/realtime/realtime-surface-stage.model.d.ts.map +1 -0
- package/dist/lib/components/realtime/realtime-surface-stage.model.js +171 -0
- package/dist/lib/components/realtime/realtime-surface-stage.model.js.map +1 -0
- package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts +71 -13
- package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-surface-tabs.component.js +232 -73
- package/dist/lib/components/realtime/realtime-surface-tabs.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts +5 -0
- package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-surface-tabs.model.js +8 -0
- package/dist/lib/components/realtime/realtime-surface-tabs.model.js.map +1 -1
- package/dist/lib/components/realtime/realtime-ui-config.d.ts +12 -2
- package/dist/lib/components/realtime/realtime-ui-config.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-ui-config.js +5 -1
- package/dist/lib/components/realtime/realtime-ui-config.js.map +1 -1
- package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts +10 -1
- package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts.map +1 -1
- package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js +42 -2
- package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js.map +1 -1
- package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.d.ts +20 -3
- package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.js +44 -10
- package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.js.map +1 -1
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts +28 -44
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts.map +1 -1
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js +76 -162
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js.map +1 -1
- 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 +25 -12
- package/dist/lib/components/search/search-panel.component.js.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts +22 -31
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.js +50 -63
- package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
- package/dist/lib/conversations.module.d.ts +30 -29
- package/dist/lib/conversations.module.d.ts.map +1 -1
- package/dist/lib/conversations.module.js +27 -5
- package/dist/lib/conversations.module.js.map +1 -1
- package/dist/lib/events/chat-events.d.ts +25 -0
- package/dist/lib/events/chat-events.d.ts.map +1 -1
- package/dist/lib/events/chat-events.js +36 -0
- package/dist/lib/events/chat-events.js.map +1 -1
- package/dist/lib/models/agent-turn.model.d.ts +5 -0
- package/dist/lib/models/agent-turn.model.d.ts.map +1 -1
- package/dist/lib/models/agent-turn.model.js.map +1 -1
- package/dist/lib/services/agent-state.service.d.ts +34 -8
- package/dist/lib/services/agent-state.service.d.ts.map +1 -1
- package/dist/lib/services/agent-state.service.js +82 -29
- package/dist/lib/services/agent-state.service.js.map +1 -1
- package/dist/lib/services/artifact-state.service.d.ts +0 -9
- package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
- package/dist/lib/services/artifact-state.service.js +1 -32
- package/dist/lib/services/artifact-state.service.js.map +1 -1
- package/dist/lib/services/browser-realtime-media-host.d.ts +12 -0
- package/dist/lib/services/browser-realtime-media-host.d.ts.map +1 -1
- package/dist/lib/services/browser-realtime-media-host.js +19 -0
- package/dist/lib/services/browser-realtime-media-host.js.map +1 -1
- package/dist/lib/services/browser-recording-unload-guard.d.ts +30 -0
- package/dist/lib/services/browser-recording-unload-guard.d.ts.map +1 -0
- package/dist/lib/services/browser-recording-unload-guard.js +43 -0
- package/dist/lib/services/browser-recording-unload-guard.js.map +1 -0
- package/dist/lib/services/conversation-agent.service.d.ts +35 -11
- package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-agent.service.js +65 -20
- package/dist/lib/services/conversation-agent.service.js.map +1 -1
- package/dist/lib/services/conversation-detail-window.store.d.ts +22 -4
- package/dist/lib/services/conversation-detail-window.store.d.ts.map +1 -1
- package/dist/lib/services/conversation-detail-window.store.js +50 -9
- package/dist/lib/services/conversation-detail-window.store.js.map +1 -1
- package/dist/lib/services/conversation-naming.d.ts +72 -22
- package/dist/lib/services/conversation-naming.d.ts.map +1 -1
- package/dist/lib/services/conversation-naming.js +84 -10
- package/dist/lib/services/conversation-naming.js.map +1 -1
- package/dist/lib/services/data-cache.service.d.ts +13 -5
- package/dist/lib/services/data-cache.service.d.ts.map +1 -1
- package/dist/lib/services/data-cache.service.js +39 -19
- package/dist/lib/services/data-cache.service.js.map +1 -1
- package/dist/lib/services/export.service.d.ts +26 -9
- package/dist/lib/services/export.service.d.ts.map +1 -1
- package/dist/lib/services/export.service.js +61 -18
- package/dist/lib/services/export.service.js.map +1 -1
- package/dist/lib/services/realtime-audio-recorder.d.ts +33 -5
- package/dist/lib/services/realtime-audio-recorder.d.ts.map +1 -1
- package/dist/lib/services/realtime-audio-recorder.js +71 -11
- package/dist/lib/services/realtime-audio-recorder.js.map +1 -1
- package/dist/lib/services/realtime-pairing.d.ts +10 -5
- package/dist/lib/services/realtime-pairing.d.ts.map +1 -1
- package/dist/lib/services/realtime-pairing.js +15 -6
- package/dist/lib/services/realtime-pairing.js.map +1 -1
- package/dist/lib/services/realtime-session.service.d.ts +3 -2
- package/dist/lib/services/realtime-session.service.d.ts.map +1 -1
- package/dist/lib/services/realtime-session.service.js +7 -2
- package/dist/lib/services/realtime-session.service.js.map +1 -1
- package/dist/lib/services/search.service.d.ts +7 -2
- package/dist/lib/services/search.service.d.ts.map +1 -1
- package/dist/lib/services/search.service.js +13 -4
- package/dist/lib/services/search.service.js.map +1 -1
- package/dist/lib/utils/conversation-branching.d.ts +4 -0
- package/dist/lib/utils/conversation-branching.d.ts.map +1 -0
- package/dist/lib/utils/conversation-branching.js +5 -0
- package/dist/lib/utils/conversation-branching.js.map +1 -0
- package/dist/lib/utils/conversation-forks.d.ts +315 -0
- package/dist/lib/utils/conversation-forks.d.ts.map +1 -0
- package/dist/lib/utils/conversation-forks.js +456 -0
- package/dist/lib/utils/conversation-forks.js.map +1 -0
- package/dist/public-api.d.ts +23 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +30 -1
- package/dist/public-api.js.map +1 -1
- package/package.json +37 -33
- package/dist/lib/components/thread/thread-panel.component.d.ts +0 -126
- package/dist/lib/components/thread/thread-panel.component.d.ts.map +0 -1
- package/dist/lib/components/thread/thread-panel.component.js +0 -440
- package/dist/lib/components/thread/thread-panel.component.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.service.js","sourceRoot":"","sources":["../../../src/lib/services/search.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable, Subject, of } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, switchMap, map } from 'rxjs/operators';\nimport {\n MJConversationEntity,\n MJConversationDetailEntity,\n MJConversationArtifactEntity,\n MJCollectionEntity,\n MJCollectionArtifactEntity,\n MJTaskEntity,\n MJArtifactEntity,\n ConversationEngine\n} from '@memberjunction/core-entities';\nimport { RunView, UserInfo, Metadata, IMetadataProvider } from '@memberjunction/core';\nimport { EscapeSQLString } from '@memberjunction/global';\nimport { ArtifactPermissionService } from './artifact-permission.service';\n\n/**\n * Types of searchable content\n */\nexport type SearchResultType = 'conversation' | 'message' | 'artifact' | 'collection' | 'task';\n\n/**\n * Filter options for search\n */\nexport type SearchFilter = 'all' | 'conversations' | 'messages' | 'artifacts' | 'collections' | 'tasks';\n\n/**\n * Unified search result\n */\nexport interface SearchResult {\n id: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n type: SearchResultType; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n title: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n preview: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n matchedText?: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n conversationId?: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n conversationName?: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n artifactType?: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n collectionId?: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n collectionName?: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n createdAt: Date; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n relevanceScore: number; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n}\n\n/**\n * Search results grouped by type\n */\nexport interface GroupedSearchResults {\n conversations: SearchResult[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n messages: SearchResult[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n artifacts: SearchResult[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n collections: SearchResult[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n tasks: SearchResult[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n total: number; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n}\n\n/**\n * Date range filter\n */\nexport interface DateRange {\n start: Date | null; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n end: Date | null; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n}\n\n/**\n * Service for searching across conversations, messages, and artifacts\n * Provides debounced search with result ranking and filtering\n */\n/**\n * NOTE ON `LIKE` ESCAPING\n *\n * The predicates below interpolate the user's query into `LIKE '%…%'` via `EscapeSQLString`, which\n * neutralises quotes but NOT LIKE metacharacters — `%`, `_` and `[` in a search term are still\n * treated as wildcards rather than literal text. That is this service's long-standing search\n * behaviour, so it is left as-is deliberately; changing it would change what users' searches match.\n * If literal matching is wanted, escape the metacharacters and append `ESCAPE '\\\\'` (see\n * `escapeLikeValue()` in `@memberjunction/core`, `generic/runQuerySQLFilterImplementations.ts`).\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class SearchService {\n private _searchQuery$ = new Subject<string>();\n private _searchFilter$ = new BehaviorSubject<SearchFilter>('all');\n private _dateRange$ = new BehaviorSubject<DateRange>({ start: null, end: null });\n private _isSearching$ = new BehaviorSubject<boolean>(false);\n private _searchResults$ = new BehaviorSubject<GroupedSearchResults>({\n conversations: [],\n messages: [],\n artifacts: [],\n collections: [],\n tasks: [],\n total: 0\n });\n\n // Recent searches stored in memory (could be persisted to localStorage)\n private recentSearches: string[] = [];\n private readonly MAX_RECENT_SEARCHES = 10;\n\n // Public observables\n public readonly SearchQuery$ = this._searchQuery$.asObservable();\n\n /** @deprecated Use {@link SearchQuery$}. */\n public get searchQuery$() {\n return this.SearchQuery$;\n }\n public readonly SearchFilter$ = this._searchFilter$.asObservable();\n\n /** @deprecated Use {@link SearchFilter$}. */\n public get searchFilter$() {\n return this.SearchFilter$;\n }\n public readonly DateRange$ = this._dateRange$.asObservable();\n\n /** @deprecated Use {@link DateRange$}. */\n public get dateRange$() {\n return this.DateRange$;\n }\n public readonly IsSearching$ = this._isSearching$.asObservable();\n\n /** @deprecated Use {@link IsSearching$}. */\n public get isSearching$() {\n return this.IsSearching$;\n }\n public readonly SearchResults$ = this._searchResults$.asObservable();\n\n /** @deprecated Use {@link SearchResults$}. */\n public get searchResults$() {\n return this.SearchResults$;\n }\n\n private _provider: IMetadataProvider | null = null;\n\n constructor(private artifactPermissions: ArtifactPermissionService) {\n this.initializeSearch();\n this.loadRecentSearches();\n }\n\n /**\n * Set the metadata provider this service should use. When unset, falls back to Metadata.Provider.\n * Setting it also propagates to the artifact-permission service this depends on.\n */\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n if (value !== null) {\n this.artifactPermissions.Provider = value;\n }\n }\n\n public get Provider(): IMetadataProvider {\n return this._provider ?? Metadata.Provider;\n }\n\n /**\n * Initialize debounced search\n */\n private initializeSearch(): void {\n this._searchQuery$.pipe(\n debounceTime(300),\n distinctUntilChanged()\n ).subscribe(query => {\n if (query && query.trim().length > 0) {\n this.addToRecentSearches(query);\n }\n });\n }\n\n /**\n * Search across all content types\n */\n public async Search(\n query: string,\n environmentId: string,\n currentUser: UserInfo\n ): Promise<GroupedSearchResults> {\n if (!query || query.trim().length === 0) {\n const emptyResults: GroupedSearchResults = {\n conversations: [],\n messages: [],\n artifacts: [],\n collections: [],\n tasks: [],\n total: 0\n };\n this._searchResults$.next(emptyResults);\n return emptyResults;\n }\n\n this._isSearching$.next(true);\n this._searchQuery$.next(query);\n\n try {\n const filter = this._searchFilter$.value;\n const dateRange = this._dateRange$.value;\n\n // Search based on active filter\n const [conversations, messages, artifacts, collections, tasks] = await Promise.all([\n filter === 'all' || filter === 'conversations'\n ? this.searchConversations(query, environmentId, currentUser, dateRange)\n : Promise.resolve([]),\n filter === 'all' || filter === 'messages'\n ? this.searchMessages(query, environmentId, currentUser, dateRange)\n : Promise.resolve([]),\n filter === 'all' || filter === 'artifacts'\n ? this.searchArtifacts(query, environmentId, currentUser, dateRange)\n : Promise.resolve([]),\n filter === 'all' || filter === 'collections'\n ? this.searchCollections(query, environmentId, currentUser, dateRange)\n : Promise.resolve([]),\n filter === 'all' || filter === 'tasks'\n ? this.searchTasks(query, environmentId, currentUser, dateRange)\n : Promise.resolve([])\n ]);\n\n const results: GroupedSearchResults = {\n conversations,\n messages,\n artifacts,\n collections,\n tasks,\n total: conversations.length + messages.length + artifacts.length + collections.length + tasks.length\n };\n\n this._searchResults$.next(results);\n return results;\n } finally {\n this._isSearching$.next(false);\n }\n }\n\n /** @deprecated Use {@link Search}. */\n public async search(\n query: string,\n environmentId: string,\n currentUser: UserInfo\n ): Promise<GroupedSearchResults> {\n return this.Search(query, environmentId, currentUser);\n }\n\n /**\n * Search conversations by name and description, limited to the conversations the\n * conversation list shows the user\n */\n private async searchConversations(\n query: string,\n environmentId: string,\n currentUser: UserInfo,\n dateRange: DateRange\n ): Promise<SearchResult[]> {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const lowerQuery = query.toLowerCase();\n\n let filter = await ConversationEngine.Instance.GetVisibleConversationsFilter(environmentId, currentUser);\n filter += ` AND (LOWER(Name) LIKE '%${EscapeSQLString(lowerQuery)}%' OR LOWER(Description) LIKE '%${EscapeSQLString(lowerQuery)}%')`;\n\n if (dateRange.start) {\n filter += ` AND __mj_CreatedAt >= '${dateRange.start.toISOString()}'`;\n }\n if (dateRange.end) {\n filter += ` AND __mj_CreatedAt <= '${dateRange.end.toISOString()}'`;\n }\n\n const result = await rv.RunView<MJConversationEntity>(\n {\n EntityName: 'MJ: Conversations',\n ExtraFilter: filter,\n OrderBy: '__mj_UpdatedAt DESC',\n MaxRows: 100,\n ResultType: 'entity_object'\n },\n currentUser\n );\n\n if (!result.Success || !result.Results) {\n console.error('Failed to search conversations:', result.ErrorMessage);\n return [];\n }\n\n return result.Results.map(conv => this.mapConversationToSearchResult(conv, query));\n }\n\n /**\n * Search message content inside the conversations the conversation list shows the user\n */\n private async searchMessages(\n query: string,\n environmentId: string,\n currentUser: UserInfo,\n dateRange: DateRange\n ): Promise<SearchResult[]> {\n const conversationIds = await this.getVisibleConversationIds(environmentId, currentUser);\n if (conversationIds.length === 0) {\n return [];\n }\n\n const rv = RunView.FromMetadataProvider(this.Provider);\n const lowerQuery = query.toLowerCase();\n\n // The IDs come from a separate query so this filter names only Conversation Details\n // columns, which every provider can quote.\n let filter = `ConversationID IN (${conversationIds.map(id => `'${id}'`).join(',')})`;\n filter += ` AND LOWER(Message) LIKE '%${EscapeSQLString(lowerQuery)}%'`;\n filter += ` AND (HiddenToUser IS NULL OR HiddenToUser=0)`;\n\n if (dateRange.start) {\n filter += ` AND __mj_CreatedAt >= '${dateRange.start.toISOString()}'`;\n }\n if (dateRange.end) {\n filter += ` AND __mj_CreatedAt <= '${dateRange.end.toISOString()}'`;\n }\n\n const result = await rv.RunView<MJConversationDetailEntity>(\n {\n EntityName: 'MJ: Conversation Details',\n ExtraFilter: filter,\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 100,\n ResultType: 'entity_object'\n },\n currentUser\n );\n\n if (!result.Success || !result.Results) {\n console.error('Failed to search messages:', result.ErrorMessage);\n return [];\n }\n\n return result.Results.map(msg => this.mapMessageToSearchResult(msg, query));\n }\n\n /**\n * IDs of every conversation the conversation list shows the user. Not capped, so older\n * conversations stay searchable.\n */\n private async getVisibleConversationIds(environmentId: string, currentUser: UserInfo): Promise<string[]> {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const result = await rv.RunView<Pick<MJConversationEntity, 'ID'>>(\n {\n EntityName: 'MJ: Conversations',\n ExtraFilter: await ConversationEngine.Instance.GetVisibleConversationsFilter(environmentId, currentUser),\n Fields: ['ID'],\n ResultType: 'simple'\n },\n currentUser\n );\n\n if (!result.Success || !result.Results) {\n console.error('Failed to load conversations to search messages in:', result.ErrorMessage);\n return [];\n }\n return result.Results.map(c => c.ID);\n }\n\n /**\n * Search artifacts by name and description, limited to the artifacts the user can read\n * Includes artifacts from both conversations and collections\n */\n private async searchArtifacts(\n query: string,\n environmentId: string,\n currentUser: UserInfo,\n dateRange: DateRange\n ): Promise<SearchResult[]> {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const lowerQuery = query.toLowerCase();\n\n const readableFilter = await this.artifactPermissions.GetReadableArtifactsFilter(currentUser.ID, currentUser);\n let filter = `EnvironmentID='${environmentId}' AND ${readableFilter}`;\n filter += ` AND (LOWER(Name) LIKE '%${EscapeSQLString(lowerQuery)}%' OR LOWER(Description) LIKE '%${EscapeSQLString(lowerQuery)}%')`;\n\n if (dateRange.start) {\n filter += ` AND __mj_CreatedAt >= '${dateRange.start.toISOString()}'`;\n }\n if (dateRange.end) {\n filter += ` AND __mj_CreatedAt <= '${dateRange.end.toISOString()}'`;\n }\n\n const result = await rv.RunView<MJArtifactEntity>(\n {\n EntityName: 'MJ: Artifacts',\n ExtraFilter: `${filter} AND (Visibility IS NULL OR Visibility='Always')`,\n OrderBy: '__mj_UpdatedAt DESC',\n MaxRows: 100,\n ResultType: 'entity_object'\n },\n currentUser\n );\n\n if (!result.Success || !result.Results) {\n console.error('Failed to search artifacts:', result.ErrorMessage);\n return [];\n }\n\n const searchResults: SearchResult[] = [];\n\n // For each artifact, check if it's in a collection for context\n for (const artifact of result.Results) {\n // Check for collection associations\n const collResult = await rv.RunView<MJCollectionArtifactEntity>(\n {\n EntityName: 'MJ: Collection Artifacts',\n ExtraFilter: `ArtifactVersionID IN (\n SELECT ID FROM [__mj].[vwArtifactVersions] WHERE ArtifactID='${artifact.ID}'\n )`,\n MaxRows: 1,\n ResultType: 'entity_object'\n },\n currentUser\n );\n\n if (collResult.Success && collResult.Results && collResult.Results.length > 0) {\n const collArtifact = collResult.Results[0];\n searchResults.push(\n this.mapArtifactToSearchResult(\n artifact,\n query,\n collArtifact.CollectionID,\n collArtifact.Collection\n )\n );\n } else {\n // No collection association\n searchResults.push(this.mapArtifactToSearchResult(artifact, query));\n }\n }\n\n return searchResults;\n }\n\n /**\n * Search collections by name and description\n * Includes both owned collections and shared collections user has access to\n */\n private async searchCollections(\n query: string,\n environmentId: string,\n currentUser: UserInfo,\n dateRange: DateRange\n ): Promise<SearchResult[]> {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const lowerQuery = query.toLowerCase();\n\n const ownerFilter = `OwnerID='${currentUser.ID}'`;\n const permissionSubquery = `ID IN (\n SELECT CollectionID\n FROM [__mj].[vwCollectionPermissions]\n WHERE UserID='${currentUser.ID}'\n )`;\n\n let filter = `EnvironmentID='${environmentId}'`;\n filter += ` AND (OwnerID IS NULL OR ${ownerFilter} OR ${permissionSubquery})`;\n filter += ` AND (LOWER(Name) LIKE '%${EscapeSQLString(lowerQuery)}%' OR LOWER(Description) LIKE '%${EscapeSQLString(lowerQuery)}%')`;\n\n if (dateRange.start) {\n filter += ` AND __mj_CreatedAt >= '${dateRange.start.toISOString()}'`;\n }\n if (dateRange.end) {\n filter += ` AND __mj_CreatedAt <= '${dateRange.end.toISOString()}'`;\n }\n\n const result = await rv.RunView<MJCollectionEntity>(\n {\n EntityName: 'MJ: Collections',\n ExtraFilter: filter,\n OrderBy: '__mj_UpdatedAt DESC',\n MaxRows: 100,\n ResultType: 'entity_object'\n },\n currentUser\n );\n\n if (!result.Success || !result.Results) {\n console.error('Failed to search collections:', result.ErrorMessage);\n return [];\n }\n\n return result.Results.map(coll => this.mapCollectionToSearchResult(coll, query));\n }\n\n /**\n * Search tasks by name, description, and notes\n * Only includes tasks in conversations user has access to\n */\n private async searchTasks(\n query: string,\n environmentId: string,\n currentUser: UserInfo,\n dateRange: DateRange\n ): Promise<SearchResult[]> {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const lowerQuery = query.toLowerCase();\n\n // Build filter using same logic as TasksFullViewComponent\n const md = this.Provider;\n const cd = md.EntityByName('MJ: Conversation Details');\n const c = md.EntityByName('MJ: Conversations');\n\n if (!cd || !c) {\n console.warn('⚠️ Missing metadata for Conversations or Conversation Details');\n return [];\n }\n\n let filter = `ParentID IS NULL AND (UserID = '${currentUser.ID}' OR ConversationDetailID IN (\n SELECT ID FROM [${cd.SchemaName}].[${cd.BaseView}]\n WHERE\n UserID ='${currentUser.ID}' OR\n ConversationID IN (\n SELECT ID FROM [${c.SchemaName}].[${c.BaseView}] WHERE UserID='${currentUser.ID}'\n )\n ))`;\n\n filter += ` AND (LOWER(Name) LIKE '%${EscapeSQLString(lowerQuery)}%' OR LOWER(Description) LIKE '%${EscapeSQLString(lowerQuery)}%')`;\n\n if (dateRange.start) {\n filter += ` AND __mj_CreatedAt >= '${dateRange.start.toISOString()}'`;\n }\n if (dateRange.end) {\n filter += ` AND __mj_CreatedAt <= '${dateRange.end.toISOString()}'`;\n }\n\n const result = await rv.RunView<MJTaskEntity>(\n {\n EntityName: 'MJ: Tasks',\n ExtraFilter: filter,\n OrderBy: '__mj_UpdatedAt DESC',\n MaxRows: 100,\n ResultType: 'entity_object'\n },\n currentUser\n );\n\n if (!result.Success || !result.Results) {\n console.error('Failed to search tasks:', result.ErrorMessage);\n return [];\n }\n\n return result.Results.map(task => this.mapTaskToSearchResult(task, query));\n }\n\n /**\n * Map conversation entity to search result\n */\n private mapConversationToSearchResult(conversation: MJConversationEntity, query: string): SearchResult {\n const lowerQuery = query.toLowerCase();\n const name = conversation.Name || 'Untitled Conversation';\n const description = conversation.Description || '';\n\n // Calculate relevance score\n let score = 0;\n if (name.toLowerCase().includes(lowerQuery)) score += 10;\n if (description.toLowerCase().includes(lowerQuery)) score += 5;\n\n // Find matched text\n const matchedText = this.extractMatchContext(\n name.toLowerCase().includes(lowerQuery) ? name : description,\n query\n );\n\n return {\n id: conversation.ID,\n type: 'conversation',\n title: name,\n preview: description || 'No description',\n matchedText,\n conversationId: conversation.ID,\n conversationName: name,\n createdAt: conversation.__mj_CreatedAt,\n relevanceScore: score\n };\n }\n\n /**\n * Map message entity to search result\n */\n private mapMessageToSearchResult(message: MJConversationDetailEntity, query: string): SearchResult {\n const messageText = message.Message || '';\n const matchedText = this.extractMatchContext(messageText, query);\n\n return {\n id: message.ID,\n type: 'message',\n title: `Message in ${message.Conversation || 'Unknown Conversation'}`,\n preview: this.truncateText(messageText, 150),\n matchedText,\n conversationId: message.ConversationID,\n conversationName: message.Conversation || undefined,\n createdAt: message.__mj_CreatedAt,\n relevanceScore: 5\n };\n }\n\n /**\n * Map artifact entity to search result\n */\n private mapArtifactToSearchResult(\n artifact: MJArtifactEntity,\n query: string,\n collectionId?: string,\n collectionName?: string\n ): SearchResult {\n const name = artifact.Name || 'Untitled Artifact';\n const description = artifact.Description || '';\n const lowerQuery = query.toLowerCase();\n\n let score = 0;\n if (name.toLowerCase().includes(lowerQuery)) score += 10;\n if (description.toLowerCase().includes(lowerQuery)) score += 5;\n\n const matchedText = this.extractMatchContext(\n name.toLowerCase().includes(lowerQuery) ? name : description,\n query\n );\n\n return {\n id: artifact.ID,\n type: 'artifact',\n title: name,\n preview: description || 'No description',\n matchedText,\n collectionId,\n collectionName,\n artifactType: artifact.Type || undefined,\n createdAt: artifact.__mj_CreatedAt,\n relevanceScore: score\n };\n }\n\n /**\n * Map collection entity to search result\n */\n private mapCollectionToSearchResult(collection: MJCollectionEntity, query: string): SearchResult {\n const lowerQuery = query.toLowerCase();\n const name = collection.Name || 'Untitled Collection';\n const description = collection.Description || '';\n\n let score = 0;\n if (name.toLowerCase().includes(lowerQuery)) score += 10;\n if (description.toLowerCase().includes(lowerQuery)) score += 5;\n\n const matchedText = this.extractMatchContext(\n name.toLowerCase().includes(lowerQuery) ? name : description,\n query\n );\n\n return {\n id: collection.ID,\n type: 'collection',\n title: name,\n preview: description || 'No description',\n matchedText,\n collectionId: collection.ID,\n collectionName: name,\n createdAt: collection.__mj_CreatedAt,\n relevanceScore: score\n };\n }\n\n /**\n * Map task entity to search result\n */\n private mapTaskToSearchResult(task: MJTaskEntity, query: string): SearchResult {\n const lowerQuery = query.toLowerCase();\n const name = task.Name || 'Untitled Task';\n const description = task.Description || '';\n\n let score = 0;\n if (name.toLowerCase().includes(lowerQuery)) score += 10;\n if (description.toLowerCase().includes(lowerQuery)) score += 5;\n\n const matchedText = this.extractMatchContext(\n name.toLowerCase().includes(lowerQuery) ? name : description,\n query\n );\n\n return {\n id: task.ID,\n type: 'task',\n title: name,\n preview: description || 'No description',\n matchedText,\n createdAt: task.__mj_CreatedAt,\n relevanceScore: score\n };\n }\n\n /**\n * Extract context around matched text\n */\n private extractMatchContext(text: string, query: string, contextLength: number = 100): string {\n const lowerText = text.toLowerCase();\n const lowerQuery = query.toLowerCase();\n const index = lowerText.indexOf(lowerQuery);\n\n if (index === -1) return this.truncateText(text, contextLength);\n\n const start = Math.max(0, index - contextLength / 2);\n const end = Math.min(text.length, index + query.length + contextLength / 2);\n\n let context = text.substring(start, end);\n if (start > 0) context = '...' + context;\n if (end < text.length) context = context + '...';\n\n return context;\n }\n\n /**\n * Truncate text to specified length\n */\n private truncateText(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n return text.substring(0, maxLength) + '...';\n }\n\n /**\n * Set search filter\n */\n public SetSearchFilter(filter: SearchFilter): void {\n this._searchFilter$.next(filter);\n }\n\n /** @deprecated Use {@link SetSearchFilter}. */\n public setSearchFilter(filter: SearchFilter): void {\n return this.SetSearchFilter(filter);\n }\n\n /**\n * Set date range filter\n */\n public SetDateRange(range: DateRange): void {\n this._dateRange$.next(range);\n }\n\n /** @deprecated Use {@link SetDateRange}. */\n public setDateRange(range: DateRange): void {\n return this.SetDateRange(range);\n }\n\n /**\n * Clear all filters\n */\n public ClearFilters(): void {\n this._searchFilter$.next('all');\n this._dateRange$.next({ start: null, end: null });\n }\n\n /** @deprecated Use {@link ClearFilters}. */\n public clearFilters(): void {\n return this.ClearFilters();\n }\n\n /**\n * Clear search results\n */\n public ClearResults(): void {\n this._searchResults$.next({\n conversations: [],\n messages: [],\n artifacts: [],\n collections: [],\n tasks: [],\n total: 0\n });\n }\n\n /** @deprecated Use {@link ClearResults}. */\n public clearResults(): void {\n return this.ClearResults();\n }\n\n /**\n * Get recent searches\n */\n public GetRecentSearches(): string[] {\n return [...this.recentSearches];\n }\n\n /** @deprecated Use {@link GetRecentSearches}. */\n public getRecentSearches(): string[] {\n return this.GetRecentSearches();\n }\n\n /**\n * Add to recent searches\n */\n private addToRecentSearches(query: string): void {\n const trimmed = query.trim();\n if (!trimmed) return;\n\n // Remove if already exists\n this.recentSearches = this.recentSearches.filter(q => q !== trimmed);\n\n // Add to front\n this.recentSearches.unshift(trimmed);\n\n // Keep only MAX_RECENT_SEARCHES\n if (this.recentSearches.length > this.MAX_RECENT_SEARCHES) {\n this.recentSearches = this.recentSearches.slice(0, this.MAX_RECENT_SEARCHES);\n }\n\n this.saveRecentSearches();\n }\n\n /**\n * Clear recent searches\n */\n public ClearRecentSearches(): void {\n this.recentSearches = [];\n this.saveRecentSearches();\n }\n\n /** @deprecated Use {@link ClearRecentSearches}. */\n public clearRecentSearches(): void {\n return this.ClearRecentSearches();\n }\n\n /**\n * Load recent searches from localStorage\n */\n private loadRecentSearches(): void {\n try {\n const stored = localStorage.getItem('mj-recent-searches');\n if (stored) {\n this.recentSearches = JSON.parse(stored);\n }\n } catch (error) {\n console.error('Failed to load recent searches:', error);\n this.recentSearches = [];\n }\n }\n\n /**\n * Save recent searches to localStorage\n */\n private saveRecentSearches(): void {\n try {\n localStorage.setItem('mj-recent-searches', JSON.stringify(this.recentSearches));\n } catch (error) {\n console.error('Failed to save recent searches:', error);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"search.service.js","sourceRoot":"","sources":["../../../src/lib/services/search.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable, Subject, of } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, switchMap, map } from 'rxjs/operators';\nimport {\n MJConversationEntity,\n MJConversationDetailEntity,\n MJConversationArtifactEntity,\n MJCollectionEntity,\n MJCollectionArtifactEntity,\n MJTaskEntity,\n MJArtifactEntity,\n ConversationEngine\n} from '@memberjunction/core-entities';\nimport { RunView, UserInfo, Metadata, IMetadataProvider } from '@memberjunction/core';\nimport { EscapeSQLString } from '@memberjunction/global';\nimport { ArtifactPermissionService } from './artifact-permission.service';\n\n/**\n * Types of searchable content\n */\nexport type SearchResultType = 'conversation' | 'message' | 'artifact' | 'collection' | 'task';\n\n/**\n * Filter options for search\n */\nexport type SearchFilter = 'all' | 'conversations' | 'messages' | 'artifacts' | 'collections' | 'tasks';\n\n/**\n * Unified search result\n */\nexport interface SearchResult {\n id: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n type: SearchResultType; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n title: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n preview: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n matchedText?: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n conversationId?: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n conversationName?: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n artifactType?: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n collectionId?: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n collectionName?: string; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n createdAt: Date; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n relevanceScore: number; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n /** A message hit's branch; null is the trunk. */\n branchId?: string | null; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n /** A message hit's position in its conversation. */\n sequence?: number; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n}\n\n/** The message columns a message hit reads. */\ntype MessageSearchRow = Pick<\n MJConversationDetailEntity,\n 'ID' | 'ConversationID' | 'Conversation' | 'Message' | 'BranchID' | 'Sequence' | '__mj_CreatedAt'\n>;\n\n/** Columns of {@link MessageSearchRow}, as the message query's `Fields`. */\nconst MESSAGE_SEARCH_FIELDS: ReadonlyArray<keyof MessageSearchRow> = [\n 'ID', 'ConversationID', 'Conversation', 'Message', 'BranchID', 'Sequence', '__mj_CreatedAt'\n];\n\n/**\n * Search results grouped by type\n */\nexport interface GroupedSearchResults {\n conversations: SearchResult[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n messages: SearchResult[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n artifacts: SearchResult[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n collections: SearchResult[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n tasks: SearchResult[]; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n total: number; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n}\n\n/**\n * Date range filter\n */\nexport interface DateRange {\n start: Date | null; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n end: Date | null; // case-violation-ok-legacy-back-compat: the type is named in an exported signature, so consumers build object literals against it; an interface has no runtime carrier for a stub\n}\n\n/**\n * Service for searching across conversations, messages, and artifacts\n * Provides debounced search with result ranking and filtering\n */\n/**\n * NOTE ON `LIKE` ESCAPING\n *\n * The predicates below interpolate the user's query into `LIKE '%…%'` via `EscapeSQLString`, which\n * neutralises quotes but NOT LIKE metacharacters — `%`, `_` and `[` in a search term are still\n * treated as wildcards rather than literal text. That is this service's long-standing search\n * behaviour, so it is left as-is deliberately; changing it would change what users' searches match.\n * If literal matching is wanted, escape the metacharacters and append `ESCAPE '\\\\'` (see\n * `escapeLikeValue()` in `@memberjunction/core`, `generic/runQuerySQLFilterImplementations.ts`).\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class SearchService {\n private _searchQuery$ = new Subject<string>();\n private _searchFilter$ = new BehaviorSubject<SearchFilter>('all');\n private _dateRange$ = new BehaviorSubject<DateRange>({ start: null, end: null });\n private _isSearching$ = new BehaviorSubject<boolean>(false);\n private _searchResults$ = new BehaviorSubject<GroupedSearchResults>({\n conversations: [],\n messages: [],\n artifacts: [],\n collections: [],\n tasks: [],\n total: 0\n });\n\n // Recent searches stored in memory (could be persisted to localStorage)\n private recentSearches: string[] = [];\n private readonly MAX_RECENT_SEARCHES = 10;\n\n // Public observables\n public readonly SearchQuery$ = this._searchQuery$.asObservable();\n\n /** @deprecated Use {@link SearchQuery$}. */\n public get searchQuery$() {\n return this.SearchQuery$;\n }\n public readonly SearchFilter$ = this._searchFilter$.asObservable();\n\n /** @deprecated Use {@link SearchFilter$}. */\n public get searchFilter$() {\n return this.SearchFilter$;\n }\n public readonly DateRange$ = this._dateRange$.asObservable();\n\n /** @deprecated Use {@link DateRange$}. */\n public get dateRange$() {\n return this.DateRange$;\n }\n public readonly IsSearching$ = this._isSearching$.asObservable();\n\n /** @deprecated Use {@link IsSearching$}. */\n public get isSearching$() {\n return this.IsSearching$;\n }\n public readonly SearchResults$ = this._searchResults$.asObservable();\n\n /** @deprecated Use {@link SearchResults$}. */\n public get searchResults$() {\n return this.SearchResults$;\n }\n\n private _provider: IMetadataProvider | null = null;\n\n constructor(private artifactPermissions: ArtifactPermissionService) {\n this.initializeSearch();\n this.loadRecentSearches();\n }\n\n /**\n * Set the metadata provider this service should use. When unset, falls back to Metadata.Provider.\n * Setting it also propagates to the artifact-permission service this depends on.\n */\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n if (value !== null) {\n this.artifactPermissions.Provider = value;\n }\n }\n\n public get Provider(): IMetadataProvider {\n return this._provider ?? Metadata.Provider;\n }\n\n /**\n * Initialize debounced search\n */\n private initializeSearch(): void {\n this._searchQuery$.pipe(\n debounceTime(300),\n distinctUntilChanged()\n ).subscribe(query => {\n if (query && query.trim().length > 0) {\n this.addToRecentSearches(query);\n }\n });\n }\n\n /**\n * Search across all content types\n */\n public async Search(\n query: string,\n environmentId: string,\n currentUser: UserInfo\n ): Promise<GroupedSearchResults> {\n if (!query || query.trim().length === 0) {\n const emptyResults: GroupedSearchResults = {\n conversations: [],\n messages: [],\n artifacts: [],\n collections: [],\n tasks: [],\n total: 0\n };\n this._searchResults$.next(emptyResults);\n return emptyResults;\n }\n\n this._isSearching$.next(true);\n this._searchQuery$.next(query);\n\n try {\n const filter = this._searchFilter$.value;\n const dateRange = this._dateRange$.value;\n\n // Search based on active filter\n const [conversations, messages, artifacts, collections, tasks] = await Promise.all([\n filter === 'all' || filter === 'conversations'\n ? this.searchConversations(query, environmentId, currentUser, dateRange)\n : Promise.resolve([]),\n filter === 'all' || filter === 'messages'\n ? this.searchMessages(query, environmentId, currentUser, dateRange)\n : Promise.resolve([]),\n filter === 'all' || filter === 'artifacts'\n ? this.searchArtifacts(query, environmentId, currentUser, dateRange)\n : Promise.resolve([]),\n filter === 'all' || filter === 'collections'\n ? this.searchCollections(query, environmentId, currentUser, dateRange)\n : Promise.resolve([]),\n filter === 'all' || filter === 'tasks'\n ? this.searchTasks(query, environmentId, currentUser, dateRange)\n : Promise.resolve([])\n ]);\n\n const results: GroupedSearchResults = {\n conversations,\n messages,\n artifacts,\n collections,\n tasks,\n total: conversations.length + messages.length + artifacts.length + collections.length + tasks.length\n };\n\n this._searchResults$.next(results);\n return results;\n } finally {\n this._isSearching$.next(false);\n }\n }\n\n /** @deprecated Use {@link Search}. */\n public async search(\n query: string,\n environmentId: string,\n currentUser: UserInfo\n ): Promise<GroupedSearchResults> {\n return this.Search(query, environmentId, currentUser);\n }\n\n /**\n * Search conversations by name and description, limited to the conversations the\n * conversation list shows the user\n */\n private async searchConversations(\n query: string,\n environmentId: string,\n currentUser: UserInfo,\n dateRange: DateRange\n ): Promise<SearchResult[]> {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const lowerQuery = query.toLowerCase();\n\n let filter = await ConversationEngine.Instance.GetVisibleConversationsFilter(environmentId, currentUser);\n filter += ` AND (LOWER(Name) LIKE '%${EscapeSQLString(lowerQuery)}%' OR LOWER(Description) LIKE '%${EscapeSQLString(lowerQuery)}%')`;\n\n if (dateRange.start) {\n filter += ` AND __mj_CreatedAt >= '${dateRange.start.toISOString()}'`;\n }\n if (dateRange.end) {\n filter += ` AND __mj_CreatedAt <= '${dateRange.end.toISOString()}'`;\n }\n\n const result = await rv.RunView<MJConversationEntity>(\n {\n EntityName: 'MJ: Conversations',\n ExtraFilter: filter,\n OrderBy: '__mj_UpdatedAt DESC',\n MaxRows: 100,\n ResultType: 'entity_object'\n },\n currentUser\n );\n\n if (!result.Success || !result.Results) {\n console.error('Failed to search conversations:', result.ErrorMessage);\n return [];\n }\n\n return result.Results.map(conv => this.mapConversationToSearchResult(conv, query));\n }\n\n /**\n * Search message content inside the conversations the conversation list shows the user,\n * on every branch of each conversation\n */\n private async searchMessages(\n query: string,\n environmentId: string,\n currentUser: UserInfo,\n dateRange: DateRange\n ): Promise<SearchResult[]> {\n const conversationIds = await this.getVisibleConversationIds(environmentId, currentUser);\n if (conversationIds.length === 0) {\n return [];\n }\n\n const rv = RunView.FromMetadataProvider(this.Provider);\n const lowerQuery = query.toLowerCase();\n\n // The IDs come from a separate query so this filter names only Conversation Details\n // columns, which every provider can quote.\n let filter = `ConversationID IN (${conversationIds.map(id => `'${id}'`).join(',')})`;\n filter += ` AND LOWER(Message) LIKE '%${EscapeSQLString(lowerQuery)}%'`;\n filter += ` AND (HiddenToUser IS NULL OR HiddenToUser=0)`;\n\n if (dateRange.start) {\n filter += ` AND __mj_CreatedAt >= '${dateRange.start.toISOString()}'`;\n }\n if (dateRange.end) {\n filter += ` AND __mj_CreatedAt <= '${dateRange.end.toISOString()}'`;\n }\n\n // conversation-scope: search spans every path on purpose; opening a hit switches to its branch\n const result = await rv.RunView<MessageSearchRow>(\n {\n EntityName: 'MJ: Conversation Details',\n ExtraFilter: filter,\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 100,\n Fields: [...MESSAGE_SEARCH_FIELDS],\n ResultType: 'simple'\n },\n currentUser\n );\n\n if (!result.Success || !result.Results) {\n console.error('Failed to search messages:', result.ErrorMessage);\n return [];\n }\n\n return result.Results.map(msg => this.mapMessageToSearchResult(msg, query));\n }\n\n /**\n * IDs of every conversation the conversation list shows the user. Not capped, so older\n * conversations stay searchable.\n */\n private async getVisibleConversationIds(environmentId: string, currentUser: UserInfo): Promise<string[]> {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const result = await rv.RunView<Pick<MJConversationEntity, 'ID'>>(\n {\n EntityName: 'MJ: Conversations',\n ExtraFilter: await ConversationEngine.Instance.GetVisibleConversationsFilter(environmentId, currentUser),\n Fields: ['ID'],\n ResultType: 'simple'\n },\n currentUser\n );\n\n if (!result.Success || !result.Results) {\n console.error('Failed to load conversations to search messages in:', result.ErrorMessage);\n return [];\n }\n return result.Results.map(c => c.ID);\n }\n\n /**\n * Search artifacts by name and description, limited to the artifacts the user can read\n * Includes artifacts from both conversations and collections\n */\n private async searchArtifacts(\n query: string,\n environmentId: string,\n currentUser: UserInfo,\n dateRange: DateRange\n ): Promise<SearchResult[]> {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const lowerQuery = query.toLowerCase();\n\n const readableFilter = await this.artifactPermissions.GetReadableArtifactsFilter(currentUser.ID, currentUser);\n let filter = `EnvironmentID='${environmentId}' AND ${readableFilter}`;\n filter += ` AND (LOWER(Name) LIKE '%${EscapeSQLString(lowerQuery)}%' OR LOWER(Description) LIKE '%${EscapeSQLString(lowerQuery)}%')`;\n\n if (dateRange.start) {\n filter += ` AND __mj_CreatedAt >= '${dateRange.start.toISOString()}'`;\n }\n if (dateRange.end) {\n filter += ` AND __mj_CreatedAt <= '${dateRange.end.toISOString()}'`;\n }\n\n const result = await rv.RunView<MJArtifactEntity>(\n {\n EntityName: 'MJ: Artifacts',\n ExtraFilter: `${filter} AND (Visibility IS NULL OR Visibility='Always')`,\n OrderBy: '__mj_UpdatedAt DESC',\n MaxRows: 100,\n ResultType: 'entity_object'\n },\n currentUser\n );\n\n if (!result.Success || !result.Results) {\n console.error('Failed to search artifacts:', result.ErrorMessage);\n return [];\n }\n\n const searchResults: SearchResult[] = [];\n\n // For each artifact, check if it's in a collection for context\n for (const artifact of result.Results) {\n // Check for collection associations\n const collResult = await rv.RunView<MJCollectionArtifactEntity>(\n {\n EntityName: 'MJ: Collection Artifacts',\n ExtraFilter: `ArtifactVersionID IN (\n SELECT ID FROM [__mj].[vwArtifactVersions] WHERE ArtifactID='${artifact.ID}'\n )`,\n MaxRows: 1,\n ResultType: 'entity_object'\n },\n currentUser\n );\n\n if (collResult.Success && collResult.Results && collResult.Results.length > 0) {\n const collArtifact = collResult.Results[0];\n searchResults.push(\n this.mapArtifactToSearchResult(\n artifact,\n query,\n collArtifact.CollectionID,\n collArtifact.Collection\n )\n );\n } else {\n // No collection association\n searchResults.push(this.mapArtifactToSearchResult(artifact, query));\n }\n }\n\n return searchResults;\n }\n\n /**\n * Search collections by name and description\n * Includes both owned collections and shared collections user has access to\n */\n private async searchCollections(\n query: string,\n environmentId: string,\n currentUser: UserInfo,\n dateRange: DateRange\n ): Promise<SearchResult[]> {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const lowerQuery = query.toLowerCase();\n\n const ownerFilter = `OwnerID='${currentUser.ID}'`;\n const permissionSubquery = `ID IN (\n SELECT CollectionID\n FROM [__mj].[vwCollectionPermissions]\n WHERE UserID='${currentUser.ID}'\n )`;\n\n let filter = `EnvironmentID='${environmentId}'`;\n filter += ` AND (OwnerID IS NULL OR ${ownerFilter} OR ${permissionSubquery})`;\n filter += ` AND (LOWER(Name) LIKE '%${EscapeSQLString(lowerQuery)}%' OR LOWER(Description) LIKE '%${EscapeSQLString(lowerQuery)}%')`;\n\n if (dateRange.start) {\n filter += ` AND __mj_CreatedAt >= '${dateRange.start.toISOString()}'`;\n }\n if (dateRange.end) {\n filter += ` AND __mj_CreatedAt <= '${dateRange.end.toISOString()}'`;\n }\n\n const result = await rv.RunView<MJCollectionEntity>(\n {\n EntityName: 'MJ: Collections',\n ExtraFilter: filter,\n OrderBy: '__mj_UpdatedAt DESC',\n MaxRows: 100,\n ResultType: 'entity_object'\n },\n currentUser\n );\n\n if (!result.Success || !result.Results) {\n console.error('Failed to search collections:', result.ErrorMessage);\n return [];\n }\n\n return result.Results.map(coll => this.mapCollectionToSearchResult(coll, query));\n }\n\n /**\n * Search tasks by name, description, and notes\n * Only includes tasks in conversations user has access to\n */\n private async searchTasks(\n query: string,\n environmentId: string,\n currentUser: UserInfo,\n dateRange: DateRange\n ): Promise<SearchResult[]> {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const lowerQuery = query.toLowerCase();\n\n // Build filter using same logic as TasksFullViewComponent\n const md = this.Provider;\n const cd = md.EntityByName('MJ: Conversation Details');\n const c = md.EntityByName('MJ: Conversations');\n\n if (!cd || !c) {\n console.warn('⚠️ Missing metadata for Conversations or Conversation Details');\n return [];\n }\n\n let filter = `ParentID IS NULL AND (UserID = '${currentUser.ID}' OR ConversationDetailID IN (\n SELECT ID FROM [${cd.SchemaName}].[${cd.BaseView}]\n WHERE\n UserID ='${currentUser.ID}' OR\n ConversationID IN (\n SELECT ID FROM [${c.SchemaName}].[${c.BaseView}] WHERE UserID='${currentUser.ID}'\n )\n ))`;\n\n filter += ` AND (LOWER(Name) LIKE '%${EscapeSQLString(lowerQuery)}%' OR LOWER(Description) LIKE '%${EscapeSQLString(lowerQuery)}%')`;\n\n if (dateRange.start) {\n filter += ` AND __mj_CreatedAt >= '${dateRange.start.toISOString()}'`;\n }\n if (dateRange.end) {\n filter += ` AND __mj_CreatedAt <= '${dateRange.end.toISOString()}'`;\n }\n\n const result = await rv.RunView<MJTaskEntity>(\n {\n EntityName: 'MJ: Tasks',\n ExtraFilter: filter,\n OrderBy: '__mj_UpdatedAt DESC',\n MaxRows: 100,\n ResultType: 'entity_object'\n },\n currentUser\n );\n\n if (!result.Success || !result.Results) {\n console.error('Failed to search tasks:', result.ErrorMessage);\n return [];\n }\n\n return result.Results.map(task => this.mapTaskToSearchResult(task, query));\n }\n\n /**\n * Map conversation entity to search result\n */\n private mapConversationToSearchResult(conversation: MJConversationEntity, query: string): SearchResult {\n const lowerQuery = query.toLowerCase();\n const name = conversation.Name || 'Untitled Conversation';\n const description = conversation.Description || '';\n\n // Calculate relevance score\n let score = 0;\n if (name.toLowerCase().includes(lowerQuery)) score += 10;\n if (description.toLowerCase().includes(lowerQuery)) score += 5;\n\n // Find matched text\n const matchedText = this.extractMatchContext(\n name.toLowerCase().includes(lowerQuery) ? name : description,\n query\n );\n\n return {\n id: conversation.ID,\n type: 'conversation',\n title: name,\n preview: description || 'No description',\n matchedText,\n conversationId: conversation.ID,\n conversationName: name,\n createdAt: conversation.__mj_CreatedAt,\n relevanceScore: score\n };\n }\n\n /**\n * Map a message row to a search result, with the branch and sequence that locate it\n */\n private mapMessageToSearchResult(message: MessageSearchRow, query: string): SearchResult {\n const messageText = message.Message || '';\n const matchedText = this.extractMatchContext(messageText, query);\n\n return {\n id: message.ID,\n type: 'message',\n title: `Message in ${message.Conversation || 'Unknown Conversation'}`,\n preview: this.truncateText(messageText, 150),\n matchedText,\n conversationId: message.ConversationID,\n conversationName: message.Conversation || undefined,\n createdAt: message.__mj_CreatedAt,\n relevanceScore: 5,\n branchId: message.BranchID ?? null,\n sequence: message.Sequence\n };\n }\n\n /**\n * Map artifact entity to search result\n */\n private mapArtifactToSearchResult(\n artifact: MJArtifactEntity,\n query: string,\n collectionId?: string,\n collectionName?: string\n ): SearchResult {\n const name = artifact.Name || 'Untitled Artifact';\n const description = artifact.Description || '';\n const lowerQuery = query.toLowerCase();\n\n let score = 0;\n if (name.toLowerCase().includes(lowerQuery)) score += 10;\n if (description.toLowerCase().includes(lowerQuery)) score += 5;\n\n const matchedText = this.extractMatchContext(\n name.toLowerCase().includes(lowerQuery) ? name : description,\n query\n );\n\n return {\n id: artifact.ID,\n type: 'artifact',\n title: name,\n preview: description || 'No description',\n matchedText,\n collectionId,\n collectionName,\n artifactType: artifact.Type || undefined,\n createdAt: artifact.__mj_CreatedAt,\n relevanceScore: score\n };\n }\n\n /**\n * Map collection entity to search result\n */\n private mapCollectionToSearchResult(collection: MJCollectionEntity, query: string): SearchResult {\n const lowerQuery = query.toLowerCase();\n const name = collection.Name || 'Untitled Collection';\n const description = collection.Description || '';\n\n let score = 0;\n if (name.toLowerCase().includes(lowerQuery)) score += 10;\n if (description.toLowerCase().includes(lowerQuery)) score += 5;\n\n const matchedText = this.extractMatchContext(\n name.toLowerCase().includes(lowerQuery) ? name : description,\n query\n );\n\n return {\n id: collection.ID,\n type: 'collection',\n title: name,\n preview: description || 'No description',\n matchedText,\n collectionId: collection.ID,\n collectionName: name,\n createdAt: collection.__mj_CreatedAt,\n relevanceScore: score\n };\n }\n\n /**\n * Map task entity to search result\n */\n private mapTaskToSearchResult(task: MJTaskEntity, query: string): SearchResult {\n const lowerQuery = query.toLowerCase();\n const name = task.Name || 'Untitled Task';\n const description = task.Description || '';\n\n let score = 0;\n if (name.toLowerCase().includes(lowerQuery)) score += 10;\n if (description.toLowerCase().includes(lowerQuery)) score += 5;\n\n const matchedText = this.extractMatchContext(\n name.toLowerCase().includes(lowerQuery) ? name : description,\n query\n );\n\n return {\n id: task.ID,\n type: 'task',\n title: name,\n preview: description || 'No description',\n matchedText,\n createdAt: task.__mj_CreatedAt,\n relevanceScore: score\n };\n }\n\n /**\n * Extract context around matched text\n */\n private extractMatchContext(text: string, query: string, contextLength: number = 100): string {\n const lowerText = text.toLowerCase();\n const lowerQuery = query.toLowerCase();\n const index = lowerText.indexOf(lowerQuery);\n\n if (index === -1) return this.truncateText(text, contextLength);\n\n const start = Math.max(0, index - contextLength / 2);\n const end = Math.min(text.length, index + query.length + contextLength / 2);\n\n let context = text.substring(start, end);\n if (start > 0) context = '...' + context;\n if (end < text.length) context = context + '...';\n\n return context;\n }\n\n /**\n * Truncate text to specified length\n */\n private truncateText(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n return text.substring(0, maxLength) + '...';\n }\n\n /**\n * Set search filter\n */\n public SetSearchFilter(filter: SearchFilter): void {\n this._searchFilter$.next(filter);\n }\n\n /** @deprecated Use {@link SetSearchFilter}. */\n public setSearchFilter(filter: SearchFilter): void {\n return this.SetSearchFilter(filter);\n }\n\n /**\n * Set date range filter\n */\n public SetDateRange(range: DateRange): void {\n this._dateRange$.next(range);\n }\n\n /** @deprecated Use {@link SetDateRange}. */\n public setDateRange(range: DateRange): void {\n return this.SetDateRange(range);\n }\n\n /**\n * Clear all filters\n */\n public ClearFilters(): void {\n this._searchFilter$.next('all');\n this._dateRange$.next({ start: null, end: null });\n }\n\n /** @deprecated Use {@link ClearFilters}. */\n public clearFilters(): void {\n return this.ClearFilters();\n }\n\n /**\n * Clear search results\n */\n public ClearResults(): void {\n this._searchResults$.next({\n conversations: [],\n messages: [],\n artifacts: [],\n collections: [],\n tasks: [],\n total: 0\n });\n }\n\n /** @deprecated Use {@link ClearResults}. */\n public clearResults(): void {\n return this.ClearResults();\n }\n\n /**\n * Get recent searches\n */\n public GetRecentSearches(): string[] {\n return [...this.recentSearches];\n }\n\n /** @deprecated Use {@link GetRecentSearches}. */\n public getRecentSearches(): string[] {\n return this.GetRecentSearches();\n }\n\n /**\n * Add to recent searches\n */\n private addToRecentSearches(query: string): void {\n const trimmed = query.trim();\n if (!trimmed) return;\n\n // Remove if already exists\n this.recentSearches = this.recentSearches.filter(q => q !== trimmed);\n\n // Add to front\n this.recentSearches.unshift(trimmed);\n\n // Keep only MAX_RECENT_SEARCHES\n if (this.recentSearches.length > this.MAX_RECENT_SEARCHES) {\n this.recentSearches = this.recentSearches.slice(0, this.MAX_RECENT_SEARCHES);\n }\n\n this.saveRecentSearches();\n }\n\n /**\n * Clear recent searches\n */\n public ClearRecentSearches(): void {\n this.recentSearches = [];\n this.saveRecentSearches();\n }\n\n /** @deprecated Use {@link ClearRecentSearches}. */\n public clearRecentSearches(): void {\n return this.ClearRecentSearches();\n }\n\n /**\n * Load recent searches from localStorage\n */\n private loadRecentSearches(): void {\n try {\n const stored = localStorage.getItem('mj-recent-searches');\n if (stored) {\n this.recentSearches = JSON.parse(stored);\n }\n } catch (error) {\n console.error('Failed to load recent searches:', error);\n this.recentSearches = [];\n }\n }\n\n /**\n * Save recent searches to localStorage\n */\n private saveRecentSearches(): void {\n try {\n localStorage.setItem('mj-recent-searches', JSON.stringify(this.recentSearches));\n } catch (error) {\n console.error('Failed to save recent searches:', error);\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type ConversationBranchRow } from '@memberjunction/core-entities';
|
|
2
|
+
/** True when deleting the row would remove a message some branch still shares. */
|
|
3
|
+
export declare function IsForkPointOrEarlier(sequence: number, branches: ReadonlyArray<ConversationBranchRow>): boolean;
|
|
4
|
+
//# sourceMappingURL=conversation-branching.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-branching.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/conversation-branching.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAE3E,kFAAkF;AAClF,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,qBAAqB,CAAC,GAAG,OAAO,CAE9G"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** True when deleting the row would remove a message some branch still shares. */
|
|
2
|
+
export function IsForkPointOrEarlier(sequence, branches) {
|
|
3
|
+
return branches.some(b => b.ForkFromSequence != null && b.ForkFromSequence >= sequence);
|
|
4
|
+
}
|
|
5
|
+
//# sourceMappingURL=conversation-branching.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-branching.js","sourceRoot":"","sources":["../../../src/lib/utils/conversation-branching.ts"],"names":[],"mappings":"AAEA,kFAAkF;AAClF,MAAM,UAAU,oBAAoB,CAAC,QAAgB,EAAE,QAA8C;IACjG,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,IAAI,IAAI,IAAI,CAAC,CAAC,gBAAgB,IAAI,QAAQ,CAAC,CAAC;AAC5F,CAAC","sourcesContent":["import { type ConversationBranchRow } from '@memberjunction/core-entities';\n\n/** True when deleting the row would remove a message some branch still shares. */\nexport function IsForkPointOrEarlier(sequence: number, branches: ReadonlyArray<ConversationBranchRow>): boolean {\n return branches.some(b => b.ForkFromSequence != null && b.ForkFromSequence >= sequence);\n}\n"]}
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
import { type ConversationBranchRow, type ForkKind, type ForkParticipant, type ForkSummary } from '@memberjunction/core-entities';
|
|
2
|
+
/** Main: the conversation's trunk, shared by everyone. */
|
|
3
|
+
export interface MainOpenView {
|
|
4
|
+
readonly Kind: 'Main';
|
|
5
|
+
}
|
|
6
|
+
/** One fork, shown in the full view. */
|
|
7
|
+
export interface ForkOpenView {
|
|
8
|
+
readonly Kind: 'Fork';
|
|
9
|
+
readonly BranchID: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* A new fork that replaces a message (Fork from here): shown like a fork, created on the first send.
|
|
13
|
+
* It starts at the row before the replaced message on its path (the anchor).
|
|
14
|
+
*/
|
|
15
|
+
export interface DraftForkOpenView {
|
|
16
|
+
readonly Kind: 'DraftFork';
|
|
17
|
+
/** The branch of the anchor; null is Main. */
|
|
18
|
+
readonly ParentBranchID: string | null;
|
|
19
|
+
/** The Sequence of the anchor; null when the replaced message is the first one (nothing is inherited). */
|
|
20
|
+
readonly ForkFromSequence: number | null;
|
|
21
|
+
/** The anchor; null when there is none. */
|
|
22
|
+
readonly AnchorDetailID: string | null;
|
|
23
|
+
/** The replaced message; the new fork's SourceDetailID, so its chip shows under that message. */
|
|
24
|
+
readonly SourceDetailID: string;
|
|
25
|
+
/** The author of the replaced message, read as the draft opens: the draft's window ends before that message. */
|
|
26
|
+
readonly SourceAuthorName?: string | null;
|
|
27
|
+
}
|
|
28
|
+
/** What one person is looking at in a conversation. In memory only; opening a conversation shows Main. */
|
|
29
|
+
export type ConversationOpenView = MainOpenView | ForkOpenView | DraftForkOpenView;
|
|
30
|
+
/** The Main view. */
|
|
31
|
+
export declare const MAIN_OPEN_VIEW: MainOpenView;
|
|
32
|
+
/**
|
|
33
|
+
* True when two views show the same thing. Fork ids, and the replaced messages of two drafts, are
|
|
34
|
+
* compared without regard to case.
|
|
35
|
+
*/
|
|
36
|
+
export declare function SameOpenView(a: ConversationOpenView, b: ConversationOpenView): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* The branch whose path the view reads: null for Main, the fork for a fork. A draft reads its
|
|
39
|
+
* parent's path.
|
|
40
|
+
*/
|
|
41
|
+
export declare function ReadBranchIdOf(view: ConversationOpenView): string | null;
|
|
42
|
+
/**
|
|
43
|
+
* True when a new row belongs on screen in the view: a Main row in Main, a row of the fork in that
|
|
44
|
+
* fork. A draft has no rows of its own, so no new row belongs in it.
|
|
45
|
+
*/
|
|
46
|
+
export declare function IsRowInOpenView(view: ConversationOpenView, row: {
|
|
47
|
+
BranchID?: string | null;
|
|
48
|
+
}): boolean;
|
|
49
|
+
/** The fields of a fork row the breadcrumb and the back button read. */
|
|
50
|
+
export type ForkChainRow = Pick<ConversationBranchRow, 'ID' | 'ParentBranchID'>;
|
|
51
|
+
/**
|
|
52
|
+
* The fork one level up from a view; null is Main. A fork goes up to its ParentBranchID (Main when its
|
|
53
|
+
* row is not in `rows`); a draft goes back to the fork it started from, its ParentBranchID.
|
|
54
|
+
*/
|
|
55
|
+
export declare function ParentForkIdOf(view: ConversationOpenView, rows: ReadonlyArray<ForkChainRow>): string | null;
|
|
56
|
+
/**
|
|
57
|
+
* The fork ids of a fork's chain, from the fork under Main down to `branchId`, following ParentBranchID.
|
|
58
|
+
* The chain stops at a fork whose row is not in `rows`, at a fork seen before, and at
|
|
59
|
+
* {@link MAX_BRANCH_DEPTH} forks. Empty for null (Main).
|
|
60
|
+
*/
|
|
61
|
+
export declare function ForkChainOf(branchId: string | null, rows: ReadonlyArray<ForkChainRow>): string[];
|
|
62
|
+
/** One crumb of the fork view's breadcrumb. */
|
|
63
|
+
export interface ForkBreadcrumb {
|
|
64
|
+
/** The fork the crumb opens; null opens Main. Null on the crumb of a draft. */
|
|
65
|
+
readonly BranchID: string | null;
|
|
66
|
+
readonly Label: string;
|
|
67
|
+
/** True for the last crumb: the view on screen, which opens nothing. */
|
|
68
|
+
readonly IsCurrent: boolean;
|
|
69
|
+
}
|
|
70
|
+
/** The label of the last crumb of a draft fork. */
|
|
71
|
+
export declare const DRAFT_FORK_TITLE = "New fork";
|
|
72
|
+
/** The end of a draft's fork marker. */
|
|
73
|
+
export declare const DRAFT_MARKER_SUFFIX = " \u00B7 nothing is saved until you send";
|
|
74
|
+
/**
|
|
75
|
+
* The breadcrumb of a fork or draft view: the conversation (opens Main), each ancestor fork from the
|
|
76
|
+
* one under Main down, then the open fork (a draft: "New fork"). Empty for Main.
|
|
77
|
+
*/
|
|
78
|
+
export declare function BuildForkBreadcrumbs(view: ConversationOpenView, conversationName: string, rows: ReadonlyArray<ForkChainRow>, forkLabel: (branchId: string) => string): ForkBreadcrumb[];
|
|
79
|
+
/** A crumb before the current one in the header path. */
|
|
80
|
+
export interface ForkPathParent {
|
|
81
|
+
readonly Crumb: ForkBreadcrumb;
|
|
82
|
+
/** A crumb between the first and the current one; narrow screens hide every one of them behind the ellipsis. */
|
|
83
|
+
readonly IsMiddle: boolean;
|
|
84
|
+
/** Hidden behind the ellipsis at every width: a middle crumb other than the parent, in a path of more than three entries. */
|
|
85
|
+
readonly CollapsedWide: boolean;
|
|
86
|
+
}
|
|
87
|
+
/** The header path of a fork view, built from its breadcrumb. */
|
|
88
|
+
export interface ForkHeaderPath {
|
|
89
|
+
/** The crumbs before the current one, in order. */
|
|
90
|
+
readonly Parents: readonly ForkPathParent[];
|
|
91
|
+
/** True when the path has more than three entries, so the ellipsis shows at every width. */
|
|
92
|
+
readonly CollapsesWide: boolean;
|
|
93
|
+
/** True when there is a crumb between the first and the current one, so narrow screens show the ellipsis. */
|
|
94
|
+
readonly HasMiddle: boolean;
|
|
95
|
+
}
|
|
96
|
+
/** Paths longer than this show the first crumb, an ellipsis, and the last two entries. */
|
|
97
|
+
export declare const MAX_FULL_PATH_ENTRIES = 3;
|
|
98
|
+
/**
|
|
99
|
+
* The header path of a breadcrumb: the first crumb (the conversation) always shows; past three entries the
|
|
100
|
+
* crumbs between it and the parent of the current entry collapse into an ellipsis.
|
|
101
|
+
*/
|
|
102
|
+
export declare function BuildForkHeaderPath(crumbs: readonly ForkBreadcrumb[]): ForkHeaderPath;
|
|
103
|
+
/** The label of the fork view's back button: "Back to <parent fork>", or "Back to Main" with no parent. */
|
|
104
|
+
export declare function BackLabelOf(parentLabel: string | null): string;
|
|
105
|
+
/** One avatar on a fork chip. */
|
|
106
|
+
export interface ForkChipAvatar {
|
|
107
|
+
readonly Kind: 'User' | 'Agent';
|
|
108
|
+
readonly ID: string;
|
|
109
|
+
/** The participant's name, for the tooltip. */
|
|
110
|
+
readonly Label: string;
|
|
111
|
+
/** Up to two initials, shown when there is no image and no icon. */
|
|
112
|
+
readonly Initials: string;
|
|
113
|
+
readonly ImageURL: string | null;
|
|
114
|
+
readonly IconClass: string | null;
|
|
115
|
+
}
|
|
116
|
+
/** What a chip under a message shows for one fork placed there. */
|
|
117
|
+
export interface ForkChip {
|
|
118
|
+
readonly BranchID: string;
|
|
119
|
+
readonly Kind: ForkKind;
|
|
120
|
+
readonly DisplayName: string;
|
|
121
|
+
readonly MessageLabel: string;
|
|
122
|
+
readonly ActivityLabel: string;
|
|
123
|
+
readonly Avatars: ReadonlyArray<ForkChipAvatar>;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* The chip, on a fork's first own message, that opens the view holding the message the fork replaced,
|
|
127
|
+
* positioned at that message.
|
|
128
|
+
*/
|
|
129
|
+
export interface OriginalForkChip {
|
|
130
|
+
readonly Kind: 'Original';
|
|
131
|
+
/** The fork that holds the replaced message; null is Main. */
|
|
132
|
+
readonly BranchID: string | null;
|
|
133
|
+
/** The replaced message's Sequence; null when it is not known (the view opens at its latest rows). */
|
|
134
|
+
readonly Sequence: number | null;
|
|
135
|
+
/** "Main", or the display name of the fork that holds the replaced message. */
|
|
136
|
+
readonly DisplayName: string;
|
|
137
|
+
}
|
|
138
|
+
/** A chip under a message: a fork placed there, or the original of the message a fork replaced. */
|
|
139
|
+
export type MessageForkChip = ForkChip | OriginalForkChip;
|
|
140
|
+
/** What a clicked chip asks the host to open. */
|
|
141
|
+
export interface ForkChipOpenRequest {
|
|
142
|
+
/** The fork to open; null opens Main. */
|
|
143
|
+
readonly BranchID: string | null;
|
|
144
|
+
/** When set, the view opens positioned at the row with this Sequence on that branch. */
|
|
145
|
+
readonly Sequence?: number | null;
|
|
146
|
+
}
|
|
147
|
+
/** The chips of a message with no fork placed under it. */
|
|
148
|
+
export declare const EMPTY_FORK_CHIPS: readonly ForkChip[];
|
|
149
|
+
/** The name of Main on an original chip. */
|
|
150
|
+
export declare const MAIN_VIEW_LABEL = "Main";
|
|
151
|
+
/** The Font Awesome icon of a fork kind. */
|
|
152
|
+
export declare function ForkKindIcon(kind: ForkKind): string;
|
|
153
|
+
/** The icon of a chip: the kind icon of a fork chip; on an original chip, a house for Main and the fork icon for a fork. */
|
|
154
|
+
export declare function ForkChipIcon(chip: MessageForkChip): string;
|
|
155
|
+
/** The aria-label of a chip: "Open fork <name>, <N messages>", or "Open the original in <name>". */
|
|
156
|
+
export declare function ForkChipAriaLabel(chip: MessageForkChip): string;
|
|
157
|
+
/** The request a clicked chip sends: its fork, or for an original chip, its view and the replaced message. */
|
|
158
|
+
export declare function ForkChipOpenRequestOf(chip: MessageForkChip): ForkChipOpenRequest;
|
|
159
|
+
/** "1 message", or "N messages". */
|
|
160
|
+
export declare function ForkMessageLabel(count: number): string;
|
|
161
|
+
/** The initials of a name (first and last word), upper case; "?" for no name. */
|
|
162
|
+
export declare function ForkInitials(name: string | null | undefined): string;
|
|
163
|
+
/**
|
|
164
|
+
* The last activity of a fork relative to `now`: "just now" under a minute, "N min ago" under an
|
|
165
|
+
* hour, "N h ago" under a day, "yesterday", "N days ago" under a week, else the short date.
|
|
166
|
+
*/
|
|
167
|
+
export declare function FormatForkActivity(at: Date, now: Date): string;
|
|
168
|
+
/**
|
|
169
|
+
* The chips of each placement message: one chip per fork whose PlacementDetailID is that message,
|
|
170
|
+
* in the order of `summaries`. Keys are normalized detail ids; a fork with no placement has no chip.
|
|
171
|
+
*/
|
|
172
|
+
export declare function BuildForkChipMap(summaries: ReadonlyArray<ForkSummary>, avatarFor: (participant: ForkParticipant) => ForkChipAvatar, now: Date): ReadonlyMap<string, readonly ForkChip[]>;
|
|
173
|
+
/**
|
|
174
|
+
* The alternatives a fork shows on its first own message: an original chip for the view that holds the
|
|
175
|
+
* message the fork replaced (its SourceDetailID), then a chip for every other fork placed under that
|
|
176
|
+
* message with the same parent branch, in the order of `summaries`. Empty when the fork is not in
|
|
177
|
+
* `summaries` or replaced no message (its chips are then under its anchor, which its view shows).
|
|
178
|
+
* @param forkLabel The display name of a fork, for an original chip of a fork.
|
|
179
|
+
*/
|
|
180
|
+
export declare function BuildForkAlternativeChips(forkId: string, summaries: ReadonlyArray<ForkSummary>, avatarFor: (participant: ForkParticipant) => ForkChipAvatar, now: Date, forkLabel: (branchId: string) => string): MessageForkChip[];
|
|
181
|
+
/**
|
|
182
|
+
* The chips of a view's messages: {@link BuildForkChipMap} over every fork but the one a fork view shows
|
|
183
|
+
* (its chip would open the view already open). In a fork view, the fork's alternatives
|
|
184
|
+
* ({@link BuildForkAlternativeChips}) come first on its first own message `firstOwnDetailId`.
|
|
185
|
+
*/
|
|
186
|
+
export declare function BuildViewForkChipMap(summaries: ReadonlyArray<ForkSummary>, view: ConversationOpenView, firstOwnDetailId: string | null, avatarFor: (participant: ForkParticipant) => ForkChipAvatar, now: Date, forkLabel: (branchId: string) => string): ReadonlyMap<string, readonly MessageForkChip[]>;
|
|
187
|
+
/** The composer placeholder in Main. */
|
|
188
|
+
export declare const MAIN_COMPOSER_PLACEHOLDER = "Type a message... (Ctrl+Enter to send)";
|
|
189
|
+
/** The composer placeholder in a fork or draft view. */
|
|
190
|
+
export declare const FORK_COMPOSER_PLACEHOLDER = "Message this fork";
|
|
191
|
+
/** The loaded rows of a view, split by rail. */
|
|
192
|
+
export interface ForkRows<T> {
|
|
193
|
+
/** Rows the view inherits: every loaded row that is not the fork's own; in a draft, the rows up to the anchor. */
|
|
194
|
+
readonly Inherited: T[];
|
|
195
|
+
/** The fork's own rows; in Main, every row. */
|
|
196
|
+
readonly Own: T[];
|
|
197
|
+
}
|
|
198
|
+
/** Splits loaded rows for a view (see {@link ForkRows}). Keeps their order. */
|
|
199
|
+
export declare function SplitForkRows<T extends {
|
|
200
|
+
BranchID?: string | null;
|
|
201
|
+
Sequence: number;
|
|
202
|
+
}>(rows: readonly T[], view: ConversationOpenView): ForkRows<T>;
|
|
203
|
+
/**
|
|
204
|
+
* The id of a fork view's first own row (lowest Sequence) when the loaded rows reach it: an inherited
|
|
205
|
+
* row is loaded, or no older rows remain (`hasMoreAbove` false). Null with no own row loaded.
|
|
206
|
+
*/
|
|
207
|
+
export declare function FirstOwnRowID<T extends {
|
|
208
|
+
ID: string;
|
|
209
|
+
Sequence: number;
|
|
210
|
+
}>(rows: ForkRows<T>, hasMoreAbove: boolean): string | null;
|
|
211
|
+
/** How the message list draws a fork or draft view. */
|
|
212
|
+
export interface ForkViewLayout {
|
|
213
|
+
/** Normalized ids of the inherited rows on screen; every other row is an own row. */
|
|
214
|
+
readonly InheritedIDs: ReadonlySet<string>;
|
|
215
|
+
/** The row the fork marker shows under: the last inherited row on screen; null when none is. */
|
|
216
|
+
readonly MarkerDetailID: string | null;
|
|
217
|
+
/** The marker text; null when no inherited row is on screen, except in a draft, whose marker then stands alone. */
|
|
218
|
+
readonly MarkerText: string | null;
|
|
219
|
+
}
|
|
220
|
+
/** The layout of `displayRows` in a fork or draft view; null in Main. */
|
|
221
|
+
export declare function BuildForkViewLayout<T extends {
|
|
222
|
+
ID: string;
|
|
223
|
+
BranchID?: string | null;
|
|
224
|
+
Sequence: number;
|
|
225
|
+
}>(displayRows: readonly T[], view: ConversationOpenView, markerText: string | null): ForkViewLayout | null;
|
|
226
|
+
/**
|
|
227
|
+
* The fork marker: "<person> forked from <author>'s message · <time>" ("Someone" with no person; the
|
|
228
|
+
* "from" part only with an author; the time only when known). A draft: "New fork from <author>'s
|
|
229
|
+
* message · nothing is saved until you send". `AnchorAuthorName` is the author the "from" part names: the
|
|
230
|
+
* source message's author for a fork with a source, else the anchor's.
|
|
231
|
+
*/
|
|
232
|
+
export declare function BuildForkMarkerText(input: {
|
|
233
|
+
IsDraft: boolean;
|
|
234
|
+
StarterName: string | null;
|
|
235
|
+
AnchorAuthorName: string | null;
|
|
236
|
+
StartedAt: Date | null;
|
|
237
|
+
}, formatTime: (d: Date) => string): string;
|
|
238
|
+
/** The composer hint of a fork or draft view. */
|
|
239
|
+
export declare function BuildForkComposerHint(anchorAt: Date | null, formatTime: (d: Date) => string): string;
|
|
240
|
+
/** The filters of the forks list: every fork, or the forks the person started or wrote in. */
|
|
241
|
+
export type ForkListFilter = 'All' | 'Mine';
|
|
242
|
+
/** One row of the forks list. */
|
|
243
|
+
export interface ForkListRow {
|
|
244
|
+
readonly Summary: ForkSummary;
|
|
245
|
+
/** Nesting depth under the row's parent in the list; 0 for a root. */
|
|
246
|
+
readonly Depth: number;
|
|
247
|
+
readonly Icon: string;
|
|
248
|
+
/** "<author>: <last message>", or the last message alone; null with no message. */
|
|
249
|
+
readonly PreviewText: string | null;
|
|
250
|
+
/** "<origin> · N messages · <time>". */
|
|
251
|
+
readonly MetaText: string;
|
|
252
|
+
}
|
|
253
|
+
/** How the fork started, in words: "Forked by Priya", "Edit of Maya's message", "Regenerated by Jordan". */
|
|
254
|
+
export declare function ForkOriginText(summary: ForkSummary): string;
|
|
255
|
+
/**
|
|
256
|
+
* The rows of the forks list: roots (no parent, or a parent the filter left out) newest activity
|
|
257
|
+
* first, each followed by its nested forks (one level deeper), also newest first. 'Mine' keeps the
|
|
258
|
+
* forks the person started or wrote in.
|
|
259
|
+
*/
|
|
260
|
+
export declare function BuildForkListRows(summaries: ReadonlyArray<ForkSummary>, filter: ForkListFilter, userId: string, now: Date): ForkListRow[];
|
|
261
|
+
/** The inputs of {@link CanForkFrom}. */
|
|
262
|
+
export interface CanForkInput {
|
|
263
|
+
/** The person holds the `Conversations: Fork` authorization. */
|
|
264
|
+
readonly HoldsAuthorization: boolean;
|
|
265
|
+
/** The stored value of the person's forking setting; undefined when there is none. */
|
|
266
|
+
readonly SettingValue: string | null | undefined;
|
|
267
|
+
/** The person may write to the conversation. */
|
|
268
|
+
readonly MayWrite: boolean;
|
|
269
|
+
}
|
|
270
|
+
/** True when the person may start forks: the authorization, a forking setting that is not off, and write access. */
|
|
271
|
+
export declare function CanForkFrom(input: CanForkInput): boolean;
|
|
272
|
+
/** The latest turn of a view, which in-place Edit and Regenerate may change when the person's forking is off. */
|
|
273
|
+
export interface LatestTurn {
|
|
274
|
+
/** The view's last own User row. */
|
|
275
|
+
readonly UserDetailID: string;
|
|
276
|
+
/** The last row after it when that row is an AI row (the answer); null when the turn has no answer. */
|
|
277
|
+
readonly AnswerDetailID: string | null;
|
|
278
|
+
}
|
|
279
|
+
/** The fields {@link FindLatestTurn} reads from a row. */
|
|
280
|
+
export interface TurnRow {
|
|
281
|
+
readonly ID: string;
|
|
282
|
+
readonly Role: string | null;
|
|
283
|
+
readonly Sequence: number;
|
|
284
|
+
readonly BranchID?: string | null;
|
|
285
|
+
readonly AgentSessionID?: string | null;
|
|
286
|
+
readonly ReplacedAt?: Date | string | null;
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* The latest turn of a view: its last User row and, when the last row after it is an AI row, that row.
|
|
290
|
+
* Replaced rows are skipped. Null in a draft, with no User row, when the last User row is inherited (not
|
|
291
|
+
* one of the view's own rows), and when it belongs to a voice session.
|
|
292
|
+
*/
|
|
293
|
+
export declare function FindLatestTurn<T extends TurnRow>(rows: readonly T[], view: ConversationOpenView): LatestTurn | null;
|
|
294
|
+
/**
|
|
295
|
+
* The rows after `userMessage` on its branch, in Sequence order, without replaced rows: for the latest
|
|
296
|
+
* User row, the rows of its answer (the reply and any delegated or status rows).
|
|
297
|
+
*/
|
|
298
|
+
export declare function TurnRowsAfter<T extends {
|
|
299
|
+
Sequence: number;
|
|
300
|
+
BranchID?: string | null;
|
|
301
|
+
ReplacedAt?: Date | string | null;
|
|
302
|
+
}>(rows: readonly T[], userMessage: {
|
|
303
|
+
Sequence: number;
|
|
304
|
+
BranchID?: string | null;
|
|
305
|
+
}): T[];
|
|
306
|
+
/**
|
|
307
|
+
* True when hiding `rows` (rows of branch `branchId`; null is Main) would change a fork: a fork of that
|
|
308
|
+
* branch whose fork point is at or after the first of them (it inherits them), or a fork placed under one
|
|
309
|
+
* of them (its SourceDetailID). False for no rows.
|
|
310
|
+
*/
|
|
311
|
+
export declare function ForkDependsOnRows(branchId: string | null, rows: ReadonlyArray<{
|
|
312
|
+
ID: string;
|
|
313
|
+
Sequence: number;
|
|
314
|
+
}>, branches: ReadonlyArray<Pick<ConversationBranchRow, 'ParentBranchID' | 'ForkFromSequence' | 'SourceDetailID'>>): boolean;
|
|
315
|
+
//# sourceMappingURL=conversation-forks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-forks.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/conversation-forks.ts"],"names":[],"mappings":"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"}
|