@memberjunction/ng-conversations 6.2.0-edge.4 → 6.2.0-edge.6

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.
Files changed (144) hide show
  1. package/README.md +29 -0
  2. package/dist/lib/components/attachment/image-viewer.component.d.ts +3 -1
  3. package/dist/lib/components/attachment/image-viewer.component.d.ts.map +1 -1
  4. package/dist/lib/components/attachment/image-viewer.component.js +5 -1
  5. package/dist/lib/components/attachment/image-viewer.component.js.map +1 -1
  6. package/dist/lib/components/conversation/conversation-agent-picker.component.d.ts +1 -1
  7. package/dist/lib/components/conversation/conversation-agent-picker.component.js +3 -3
  8. package/dist/lib/components/conversation/conversation-agent-picker.component.js.map +1 -1
  9. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +88 -20
  10. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  11. package/dist/lib/components/conversation/conversation-chat-area.component.js +785 -387
  12. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  13. package/dist/lib/components/message/message-input.component.d.ts +60 -20
  14. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  15. package/dist/lib/components/message/message-input.component.js +290 -389
  16. package/dist/lib/components/message/message-input.component.js.map +1 -1
  17. package/dist/lib/components/message/message-item.component.d.ts +153 -17
  18. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  19. package/dist/lib/components/message/message-item.component.js +1400 -299
  20. package/dist/lib/components/message/message-item.component.js.map +1 -1
  21. package/dist/lib/components/message/message-list.component.d.ts +25 -2
  22. package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
  23. package/dist/lib/components/message/message-list.component.js +79 -40
  24. package/dist/lib/components/message/message-list.component.js.map +1 -1
  25. package/dist/lib/components/overlay/chat-overlay.component.d.ts +19 -0
  26. package/dist/lib/components/overlay/chat-overlay.component.d.ts.map +1 -1
  27. package/dist/lib/components/overlay/chat-overlay.component.js +125 -13
  28. package/dist/lib/components/overlay/chat-overlay.component.js.map +1 -1
  29. package/dist/lib/components/project/project-form-modal.component.js +2 -2
  30. package/dist/lib/components/project/project-form-modal.component.js.map +1 -1
  31. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts +6 -1
  32. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts.map +1 -1
  33. package/dist/lib/components/realtime/realtime-agent-banner.component.js +110 -82
  34. package/dist/lib/components/realtime/realtime-agent-banner.component.js.map +1 -1
  35. package/dist/lib/components/realtime/realtime-call-failure-notice.d.ts +13 -0
  36. package/dist/lib/components/realtime/realtime-call-failure-notice.d.ts.map +1 -0
  37. package/dist/lib/components/realtime/realtime-call-failure-notice.js +21 -0
  38. package/dist/lib/components/realtime/realtime-call-failure-notice.js.map +1 -0
  39. package/dist/lib/components/realtime/realtime-composer.component.js +114 -102
  40. package/dist/lib/components/realtime/realtime-composer.component.js.map +1 -1
  41. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts +21 -2
  42. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts.map +1 -1
  43. package/dist/lib/components/realtime/realtime-session-overlay.component.js +113 -76
  44. package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -1
  45. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts.map +1 -1
  46. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js +7 -1
  47. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js.map +1 -1
  48. package/dist/lib/components/sidebar/routines-section.component.js +1 -1
  49. package/dist/lib/components/sidebar/routines-section.component.js.map +1 -1
  50. package/dist/lib/components/task/tasks-full-view.component.d.ts +152 -31
  51. package/dist/lib/components/task/tasks-full-view.component.d.ts.map +1 -1
  52. package/dist/lib/components/task/tasks-full-view.component.js +2227 -214
  53. package/dist/lib/components/task/tasks-full-view.component.js.map +1 -1
  54. package/dist/lib/components/tasks/tasks-dropdown.component.js +4 -4
  55. package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -1
  56. package/dist/lib/components/workspace/conversation-workspace.component.d.ts +11 -1
  57. package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
  58. package/dist/lib/components/workspace/conversation-workspace.component.js +25 -28
  59. package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
  60. package/dist/lib/services/agent-state.service.d.ts.map +1 -1
  61. package/dist/lib/services/agent-state.service.js +8 -8
  62. package/dist/lib/services/agent-state.service.js.map +1 -1
  63. package/dist/lib/services/browser-realtime-media-host.d.ts +7 -7
  64. package/dist/lib/services/browser-realtime-media-host.js +8 -78
  65. package/dist/lib/services/browser-realtime-media-host.js.map +1 -1
  66. package/dist/lib/services/conversation-agent.service.d.ts +53 -20
  67. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  68. package/dist/lib/services/conversation-agent.service.js +108 -54
  69. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  70. package/dist/lib/services/conversation-detail-window.store.d.ts +5 -0
  71. package/dist/lib/services/conversation-detail-window.store.d.ts.map +1 -1
  72. package/dist/lib/services/conversation-detail-window.store.js +52 -5
  73. package/dist/lib/services/conversation-detail-window.store.js.map +1 -1
  74. package/dist/lib/services/conversation-naming.d.ts.map +1 -1
  75. package/dist/lib/services/conversation-naming.js +9 -2
  76. package/dist/lib/services/conversation-naming.js.map +1 -1
  77. package/dist/lib/services/conversation-tasks-filter.d.ts +15 -0
  78. package/dist/lib/services/conversation-tasks-filter.d.ts.map +1 -0
  79. package/dist/lib/services/conversation-tasks-filter.js +69 -0
  80. package/dist/lib/services/conversation-tasks-filter.js.map +1 -0
  81. package/dist/lib/services/realtime-audio-recorder.d.ts +94 -86
  82. package/dist/lib/services/realtime-audio-recorder.d.ts.map +1 -1
  83. package/dist/lib/services/realtime-audio-recorder.js +222 -195
  84. package/dist/lib/services/realtime-audio-recorder.js.map +1 -1
  85. package/dist/lib/services/realtime-session.service.d.ts +30 -2
  86. package/dist/lib/services/realtime-session.service.d.ts.map +1 -1
  87. package/dist/lib/services/realtime-session.service.js +35 -7
  88. package/dist/lib/services/realtime-session.service.js.map +1 -1
  89. package/dist/lib/services/recording/libopus-wasm-binary.d.ts +3 -0
  90. package/dist/lib/services/recording/libopus-wasm-binary.d.ts.map +1 -0
  91. package/dist/lib/services/recording/libopus-wasm-binary.js +489 -0
  92. package/dist/lib/services/recording/libopus-wasm-binary.js.map +1 -0
  93. package/dist/lib/services/recording/libopus-worker-source.d.ts +48 -0
  94. package/dist/lib/services/recording/libopus-worker-source.d.ts.map +1 -0
  95. package/dist/lib/services/recording/libopus-worker-source.js +170 -0
  96. package/dist/lib/services/recording/libopus-worker-source.js.map +1 -0
  97. package/dist/lib/services/recording/linear-resampler.d.ts +45 -0
  98. package/dist/lib/services/recording/linear-resampler.d.ts.map +1 -0
  99. package/dist/lib/services/recording/linear-resampler.js +85 -0
  100. package/dist/lib/services/recording/linear-resampler.js.map +1 -0
  101. package/dist/lib/services/recording/opus-packet-encoder.d.ts +50 -0
  102. package/dist/lib/services/recording/opus-packet-encoder.d.ts.map +1 -0
  103. package/dist/lib/services/recording/opus-packet-encoder.js +41 -0
  104. package/dist/lib/services/recording/opus-packet-encoder.js.map +1 -0
  105. package/dist/lib/services/recording/wasm-opus-encoder.d.ts +86 -0
  106. package/dist/lib/services/recording/wasm-opus-encoder.d.ts.map +1 -0
  107. package/dist/lib/services/recording/wasm-opus-encoder.js +232 -0
  108. package/dist/lib/services/recording/wasm-opus-encoder.js.map +1 -0
  109. package/dist/lib/services/recording/webcodecs-opus-encoder.d.ts +39 -0
  110. package/dist/lib/services/recording/webcodecs-opus-encoder.d.ts.map +1 -0
  111. package/dist/lib/services/recording/webcodecs-opus-encoder.js +101 -0
  112. package/dist/lib/services/recording/webcodecs-opus-encoder.js.map +1 -0
  113. package/dist/lib/services/search.service.d.ts.map +1 -1
  114. package/dist/lib/services/search.service.js +3 -16
  115. package/dist/lib/services/search.service.js.map +1 -1
  116. package/dist/lib/utils/agent-failure-display.d.ts +14 -0
  117. package/dist/lib/utils/agent-failure-display.d.ts.map +1 -0
  118. package/dist/lib/utils/agent-failure-display.js +26 -0
  119. package/dist/lib/utils/agent-failure-display.js.map +1 -0
  120. package/dist/lib/utils/distinct-artifacts.d.ts +9 -3
  121. package/dist/lib/utils/distinct-artifacts.d.ts.map +1 -1
  122. package/dist/lib/utils/distinct-artifacts.js +24 -5
  123. package/dist/lib/utils/distinct-artifacts.js.map +1 -1
  124. package/dist/lib/utils/message-list-order.d.ts +13 -0
  125. package/dist/lib/utils/message-list-order.d.ts.map +1 -0
  126. package/dist/lib/utils/message-list-order.js +31 -0
  127. package/dist/lib/utils/message-list-order.js.map +1 -0
  128. package/dist/lib/utils/pin-state.d.ts +11 -0
  129. package/dist/lib/utils/pin-state.d.ts.map +1 -0
  130. package/dist/lib/utils/pin-state.js +9 -0
  131. package/dist/lib/utils/pin-state.js.map +1 -0
  132. package/dist/public-api.d.ts +1 -0
  133. package/dist/public-api.d.ts.map +1 -1
  134. package/dist/public-api.js +1 -0
  135. package/dist/public-api.js.map +1 -1
  136. package/package.json +36 -36
  137. package/dist/lib/services/browser-recording-unload-guard.d.ts +0 -30
  138. package/dist/lib/services/browser-recording-unload-guard.d.ts.map +0 -1
  139. package/dist/lib/services/browser-recording-unload-guard.js +0 -43
  140. package/dist/lib/services/browser-recording-unload-guard.js.map +0 -1
  141. package/dist/lib/services/realtime-pcm-wav.d.ts +0 -79
  142. package/dist/lib/services/realtime-pcm-wav.d.ts.map +0 -1
  143. package/dist/lib/services/realtime-pcm-wav.js +0 -213
  144. package/dist/lib/services/realtime-pcm-wav.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 /** 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"]}
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';\nimport { BuildConversationTasksFilter } from './conversation-tasks-filter';\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 // The same tasks the conversation workspace's tasks view shows.\n let filter = await BuildConversationTasksFilter(this.Provider, currentUser);\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,14 @@
1
+ /**
2
+ * How the chat shows a failed agent reply.
3
+ *
4
+ * The server writes a failed reply's row (only the server writes agent replies) with the run's own error text. Before
5
+ * that, the chat saved its own formatted text over it — `❌ **{agent}** failed`, a blank line, then the error — so it
6
+ * now applies that format when it renders a failed reply, and what people see does not change. Text already in that
7
+ * shape, or any other text that already leads with ❌ (rows the chat wrote before, the workflow status line, a failure
8
+ * it shows locally), is shown as it is.
9
+ *
10
+ * @param text The reply's stored text.
11
+ * @param agentName The name the chat shows for the reply's agent.
12
+ */
13
+ export declare function FormatAgentFailureForDisplay(text: string, agentName: string): string;
14
+ //# sourceMappingURL=agent-failure-display.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-failure-display.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/agent-failure-display.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAYpF"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * How the chat shows a failed agent reply.
3
+ *
4
+ * The server writes a failed reply's row (only the server writes agent replies) with the run's own error text. Before
5
+ * that, the chat saved its own formatted text over it — `❌ **{agent}** failed`, a blank line, then the error — so it
6
+ * now applies that format when it renders a failed reply, and what people see does not change. Text already in that
7
+ * shape, or any other text that already leads with ❌ (rows the chat wrote before, the workflow status line, a failure
8
+ * it shows locally), is shown as it is.
9
+ *
10
+ * @param text The reply's stored text.
11
+ * @param agentName The name the chat shows for the reply's agent.
12
+ */
13
+ export function FormatAgentFailureForDisplay(text, agentName) {
14
+ // '❌ Failed' is the runner's text when the run reported no error of its own: it adds nothing to the header.
15
+ if (text.trim() === '❌ Failed') {
16
+ return `❌ **${agentName}** failed`;
17
+ }
18
+ // Any other text that already leads with ❌ says it failed itself: the workflow status line, the chat's own
19
+ // failure texts, and rows the chat wrote before.
20
+ if (text.trimStart().startsWith('❌')) {
21
+ return text;
22
+ }
23
+ const detail = text.trim();
24
+ return detail ? `❌ **${agentName}** failed\n\n${detail}` : `❌ **${agentName}** failed`;
25
+ }
26
+ //# sourceMappingURL=agent-failure-display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-failure-display.js","sourceRoot":"","sources":["../../../src/lib/utils/agent-failure-display.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,4BAA4B,CAAC,IAAY,EAAE,SAAiB;IAC1E,4GAA4G;IAC5G,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,UAAU,EAAE,CAAC;QAC/B,OAAO,OAAO,SAAS,WAAW,CAAC;IACrC,CAAC;IACD,2GAA2G;IAC3G,iDAAiD;IACjD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC3B,OAAO,MAAM,CAAC,CAAC,CAAC,OAAO,SAAS,gBAAgB,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,SAAS,WAAW,CAAC;AACzF,CAAC","sourcesContent":["/**\n * How the chat shows a failed agent reply.\n *\n * The server writes a failed reply's row (only the server writes agent replies) with the run's own error text. Before\n * that, the chat saved its own formatted text over it — `❌ **{agent}** failed`, a blank line, then the error — so it\n * now applies that format when it renders a failed reply, and what people see does not change. Text already in that\n * shape, or any other text that already leads with ❌ (rows the chat wrote before, the workflow status line, a failure\n * it shows locally), is shown as it is.\n *\n * @param text The reply's stored text.\n * @param agentName The name the chat shows for the reply's agent.\n */\nexport function FormatAgentFailureForDisplay(text: string, agentName: string): string {\n // '❌ Failed' is the runner's text when the run reported no error of its own: it adds nothing to the header.\n if (text.trim() === '❌ Failed') {\n return `❌ **${agentName}** failed`;\n }\n // Any other text that already leads with ❌ says it failed itself: the workflow status line, the chat's own\n // failure texts, and rows the chat wrote before.\n if (text.trimStart().startsWith('❌')) {\n return text;\n }\n const detail = text.trim();\n return detail ? `❌ **${agentName}** failed\\n\\n${detail}` : `❌ **${agentName}** failed`;\n}\n"]}
@@ -6,17 +6,23 @@
6
6
  * surface all of them. At the same time, a single artifact can have multiple
7
7
  * versions, and only the latest should render. This helper reconciles both.
8
8
  */
9
- /** Minimal shape needed to dedupe artifacts — satisfied by `LazyArtifactInfo`. */
9
+ /** Minimal shape needed to dedupe and chronologically order artifacts — satisfied by `LazyArtifactInfo`. */
10
10
  export interface DistinctArtifactKey {
11
11
  artifactId: string;
12
12
  versionNumber: number;
13
+ versionCreatedAt?: Date | string | null;
13
14
  }
14
15
  /**
15
16
  * Collapses a message's artifact list to one entry per distinct `artifactId`,
16
17
  * keeping the highest `versionNumber` for each. Distinct artifacts are all
17
18
  * retained (so a report and an image both surface); multiple versions of the
18
- * SAME artifact collapse to the latest. Input order of distinct artifacts is
19
- * preserved (first-seen wins for ordering).
19
+ * SAME artifact collapse to the latest.
20
+ *
21
+ * When `versionCreatedAt` timestamps are present on the latest versions, the
22
+ * resulting distinct artifacts are ordered chronologically (`versionCreatedAt`
23
+ * ascending) so multi-step workflow outputs render in creation order with the
24
+ * final deliverable last. When timestamps are absent or equal, first-seen input
25
+ * order is preserved.
20
26
  *
21
27
  * Ids are grouped as UUIDs, not as raw strings: SQL Server returns them upper-case and PostgreSQL
22
28
  * lower-case, so a list assembled from differently-cased sources would otherwise render the same
@@ -1 +1 @@
1
- {"version":3,"file":"distinct-artifacts.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/distinct-artifacts.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,kFAAkF;AAClF,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,6BAA6B,CAAC,CAAC,SAAS,mBAAmB,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAUpG;AAED,6DAA6D;AAC7D,wBAAgB,6BAA6B,CAAC,CAAC,SAAS,mBAAmB,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAEpG"}
1
+ {"version":3,"file":"distinct-artifacts.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/distinct-artifacts.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,4GAA4G;AAC5G,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;CACzC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,6BAA6B,CAAC,CAAC,SAAS,mBAAmB,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAuBpG;AAED,6DAA6D;AAC7D,wBAAgB,6BAA6B,CAAC,CAAC,SAAS,mBAAmB,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAEpG"}
@@ -11,8 +11,13 @@ import { NormalizeUUID } from '@memberjunction/global';
11
11
  * Collapses a message's artifact list to one entry per distinct `artifactId`,
12
12
  * keeping the highest `versionNumber` for each. Distinct artifacts are all
13
13
  * retained (so a report and an image both surface); multiple versions of the
14
- * SAME artifact collapse to the latest. Input order of distinct artifacts is
15
- * preserved (first-seen wins for ordering).
14
+ * SAME artifact collapse to the latest.
15
+ *
16
+ * When `versionCreatedAt` timestamps are present on the latest versions, the
17
+ * resulting distinct artifacts are ordered chronologically (`versionCreatedAt`
18
+ * ascending) so multi-step workflow outputs render in creation order with the
19
+ * final deliverable last. When timestamps are absent or equal, first-seen input
20
+ * order is preserved.
16
21
  *
17
22
  * Ids are grouped as UUIDs, not as raw strings: SQL Server returns them upper-case and PostgreSQL
18
23
  * lower-case, so a list assembled from differently-cased sources would otherwise render the same
@@ -24,14 +29,28 @@ import { NormalizeUUID } from '@memberjunction/global';
24
29
  */
25
30
  export function SelectDistinctLatestArtifacts(list) {
26
31
  const latestByArtifact = new Map();
32
+ let index = 0;
27
33
  for (const info of list) {
28
34
  const key = NormalizeUUID(info.artifactId);
29
35
  const existing = latestByArtifact.get(key);
30
- if (!existing || info.versionNumber > existing.versionNumber) {
31
- latestByArtifact.set(key, info);
36
+ if (!existing) {
37
+ latestByArtifact.set(key, { item: info, firstSeenIndex: index });
38
+ }
39
+ else if (info.versionNumber > existing.item.versionNumber) {
40
+ latestByArtifact.set(key, { item: info, firstSeenIndex: existing.firstSeenIndex });
32
41
  }
42
+ index++;
33
43
  }
34
- return Array.from(latestByArtifact.values());
44
+ const entries = Array.from(latestByArtifact.values());
45
+ entries.sort((a, b) => {
46
+ const aTime = a.item.versionCreatedAt ? new Date(a.item.versionCreatedAt).getTime() : NaN;
47
+ const bTime = b.item.versionCreatedAt ? new Date(b.item.versionCreatedAt).getTime() : NaN;
48
+ if (!Number.isNaN(aTime) && !Number.isNaN(bTime) && aTime !== bTime) {
49
+ return aTime - bTime;
50
+ }
51
+ return a.firstSeenIndex - b.firstSeenIndex;
52
+ });
53
+ return entries.map((e) => e.item);
35
54
  }
36
55
  /** @deprecated Use {@link SelectDistinctLatestArtifacts}. */
37
56
  export function selectDistinctLatestArtifacts(list) {
@@ -1 +1 @@
1
- {"version":3,"file":"distinct-artifacts.js","sourceRoot":"","sources":["../../../src/lib/utils/distinct-artifacts.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAQvD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,6BAA6B,CAAgC,IAAkB;IAC7F,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAa,CAAC;IAC9C,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;YAC7D,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,6BAA6B,CAAgC,IAAkB;IAC7F,OAAO,6BAA6B,CAAC,IAAI,CAAC,CAAC;AAC7C,CAAC","sourcesContent":["/**\n * Artifact-grouping utilities for rendering a message's attached artifacts.\n *\n * A single conversation message can carry more than one DISTINCT artifact — for\n * example a research report PLUS a standalone generated infographic. The UI must\n * surface all of them. At the same time, a single artifact can have multiple\n * versions, and only the latest should render. This helper reconciles both.\n */\n\nimport { NormalizeUUID } from '@memberjunction/global';\n\n/** Minimal shape needed to dedupe artifacts — satisfied by `LazyArtifactInfo`. */\nexport interface DistinctArtifactKey {\n artifactId: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n versionNumber: number; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n}\n\n/**\n * Collapses a message's artifact list to one entry per distinct `artifactId`,\n * keeping the highest `versionNumber` for each. Distinct artifacts are all\n * retained (so a report and an image both surface); multiple versions of the\n * SAME artifact collapse to the latest. Input order of distinct artifacts is\n * preserved (first-seen wins for ordering).\n *\n * Ids are grouped as UUIDs, not as raw strings: SQL Server returns them upper-case and PostgreSQL\n * lower-case, so a list assembled from differently-cased sources would otherwise render the same\n * artifact as two cards.\n *\n * Related but NOT interchangeable: `snapshotArtifactVersions` in `artifact-panel-action.ts` reduces\n * the whole conversation to id → max version for a before/after diff. This one is per-message and\n * returns the objects themselves.\n */\nexport function SelectDistinctLatestArtifacts<T extends DistinctArtifactKey>(list: readonly T[]): T[] {\n const latestByArtifact = new Map<string, T>();\n for (const info of list) {\n const key = NormalizeUUID(info.artifactId);\n const existing = latestByArtifact.get(key);\n if (!existing || info.versionNumber > existing.versionNumber) {\n latestByArtifact.set(key, info);\n }\n }\n return Array.from(latestByArtifact.values());\n}\n\n/** @deprecated Use {@link SelectDistinctLatestArtifacts}. */\nexport function selectDistinctLatestArtifacts<T extends DistinctArtifactKey>(list: readonly T[]): T[] {\n return SelectDistinctLatestArtifacts(list);\n}\n"]}
1
+ {"version":3,"file":"distinct-artifacts.js","sourceRoot":"","sources":["../../../src/lib/utils/distinct-artifacts.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AASvD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,6BAA6B,CAAgC,IAAkB;IAC7F,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAA+C,CAAC;IAChF,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;QACnE,CAAC;aAAM,IAAI,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YAC5D,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC;QACrF,CAAC;QACD,KAAK,EAAE,CAAC;IACV,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACpB,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;QAC1F,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;QAC1F,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;YACpE,OAAO,KAAK,GAAG,KAAK,CAAC;QACvB,CAAC;QACD,OAAO,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,cAAc,CAAC;IAC7C,CAAC,CAAC,CAAC;IACH,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,6BAA6B,CAAgC,IAAkB;IAC7F,OAAO,6BAA6B,CAAC,IAAI,CAAC,CAAC;AAC7C,CAAC","sourcesContent":["/**\n * Artifact-grouping utilities for rendering a message's attached artifacts.\n *\n * A single conversation message can carry more than one DISTINCT artifact — for\n * example a research report PLUS a standalone generated infographic. The UI must\n * surface all of them. At the same time, a single artifact can have multiple\n * versions, and only the latest should render. This helper reconciles both.\n */\n\nimport { NormalizeUUID } from '@memberjunction/global';\n\n/** Minimal shape needed to dedupe and chronologically order artifacts — satisfied by `LazyArtifactInfo`. */\nexport interface DistinctArtifactKey {\n artifactId: string; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n versionNumber: number; // case-violation-ok-legacy-back-compat: the old name is also read off a value typed `any`, where a rename would compile and silently return undefined\n versionCreatedAt?: Date | string | null;\n}\n\n/**\n * Collapses a message's artifact list to one entry per distinct `artifactId`,\n * keeping the highest `versionNumber` for each. Distinct artifacts are all\n * retained (so a report and an image both surface); multiple versions of the\n * SAME artifact collapse to the latest.\n *\n * When `versionCreatedAt` timestamps are present on the latest versions, the\n * resulting distinct artifacts are ordered chronologically (`versionCreatedAt`\n * ascending) so multi-step workflow outputs render in creation order with the\n * final deliverable last. When timestamps are absent or equal, first-seen input\n * order is preserved.\n *\n * Ids are grouped as UUIDs, not as raw strings: SQL Server returns them upper-case and PostgreSQL\n * lower-case, so a list assembled from differently-cased sources would otherwise render the same\n * artifact as two cards.\n *\n * Related but NOT interchangeable: `snapshotArtifactVersions` in `artifact-panel-action.ts` reduces\n * the whole conversation to id → max version for a before/after diff. This one is per-message and\n * returns the objects themselves.\n */\nexport function SelectDistinctLatestArtifacts<T extends DistinctArtifactKey>(list: readonly T[]): T[] {\n const latestByArtifact = new Map<string, { item: T; firstSeenIndex: number }>();\n let index = 0;\n for (const info of list) {\n const key = NormalizeUUID(info.artifactId);\n const existing = latestByArtifact.get(key);\n if (!existing) {\n latestByArtifact.set(key, { item: info, firstSeenIndex: index });\n } else if (info.versionNumber > existing.item.versionNumber) {\n latestByArtifact.set(key, { item: info, firstSeenIndex: existing.firstSeenIndex });\n }\n index++;\n }\n const entries = Array.from(latestByArtifact.values());\n entries.sort((a, b) => {\n const aTime = a.item.versionCreatedAt ? new Date(a.item.versionCreatedAt).getTime() : NaN;\n const bTime = b.item.versionCreatedAt ? new Date(b.item.versionCreatedAt).getTime() : NaN;\n if (!Number.isNaN(aTime) && !Number.isNaN(bTime) && aTime !== bTime) {\n return aTime - bTime;\n }\n return a.firstSeenIndex - b.firstSeenIndex;\n });\n return entries.map((e) => e.item);\n}\n\n/** @deprecated Use {@link SelectDistinctLatestArtifacts}. */\nexport function selectDistinctLatestArtifacts<T extends DistinctArtifactKey>(list: readonly T[]): T[] {\n return SelectDistinctLatestArtifacts(list);\n}\n"]}
@@ -0,0 +1,13 @@
1
+ import type { MJConversationDetailEntity } from '@memberjunction/core-entities';
2
+ /** Oldest first. A message with no creation time yet (an unsaved placeholder) is the newest, not the oldest. */
3
+ export declare function CompareMessagesByCreatedAt(a: MJConversationDetailEntity, b: MJConversationDetailEntity): number;
4
+ /**
5
+ * The list with `message` in place of the first message that has its ID, and every other copy of that ID dropped (a
6
+ * placeholder that just took the ID of a server row the list already holds), or with `message` appended when none has
7
+ * it. Returns whether it was already there.
8
+ */
9
+ export declare function UpsertMessageById(messages: MJConversationDetailEntity[], message: MJConversationDetailEntity): {
10
+ Messages: MJConversationDetailEntity[];
11
+ Existed: boolean;
12
+ };
13
+ //# sourceMappingURL=message-list-order.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-list-order.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/message-list-order.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAEhF,gHAAgH;AAChH,wBAAgB,0BAA0B,CAAC,CAAC,EAAE,0BAA0B,EAAE,CAAC,EAAE,0BAA0B,GAAG,MAAM,CAE/G;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,0BAA0B,EAAE,EACtC,OAAO,EAAE,0BAA0B,GAClC;IAAE,QAAQ,EAAE,0BAA0B,EAAE,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAS9D"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Keeping the chat's message list in order while agent replies start as unsaved placeholders.
3
+ *
4
+ * Only the server writes an agent's reply (A19): the chat shows an unsaved placeholder until the server acknowledges
5
+ * the run, then gives the placeholder the server row's ID. Until then it has no creation time, and a refresh of the
6
+ * conversation can already have brought the server's copy of the same row into the list.
7
+ */
8
+ import { UUIDsEqual } from '@memberjunction/global';
9
+ /** Oldest first. A message with no creation time yet (an unsaved placeholder) is the newest, not the oldest. */
10
+ export function CompareMessagesByCreatedAt(a, b) {
11
+ return createdAtOf(a) - createdAtOf(b);
12
+ }
13
+ /**
14
+ * The list with `message` in place of the first message that has its ID, and every other copy of that ID dropped (a
15
+ * placeholder that just took the ID of a server row the list already holds), or with `message` appended when none has
16
+ * it. Returns whether it was already there.
17
+ */
18
+ export function UpsertMessageById(messages, message) {
19
+ const index = messages.findIndex((m) => UUIDsEqual(m.ID, message.ID));
20
+ if (index < 0) {
21
+ return { Messages: [...messages, message], Existed: false };
22
+ }
23
+ const updated = messages
24
+ .map((m, i) => (i === index ? message : m))
25
+ .filter((m, i) => i === index || !UUIDsEqual(m.ID, message.ID));
26
+ return { Messages: updated, Existed: true };
27
+ }
28
+ function createdAtOf(message) {
29
+ return message.__mj_CreatedAt?.getTime() ?? Number.MAX_SAFE_INTEGER;
30
+ }
31
+ //# sourceMappingURL=message-list-order.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-list-order.js","sourceRoot":"","sources":["../../../src/lib/utils/message-list-order.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD,gHAAgH;AAChH,MAAM,UAAU,0BAA0B,CAAC,CAA6B,EAAE,CAA6B;IACrG,OAAO,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAAsC,EACtC,OAAmC;IAEnC,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACtE,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,OAAO,EAAE,QAAQ,EAAE,CAAC,GAAG,QAAQ,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC9D,CAAC;IACD,MAAM,OAAO,GAAG,QAAQ;SACrB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAC1C,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAClE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,WAAW,CAAC,OAAmC;IACtD,OAAO,OAAO,CAAC,cAAc,EAAE,OAAO,EAAE,IAAI,MAAM,CAAC,gBAAgB,CAAC;AACtE,CAAC","sourcesContent":["/**\n * Keeping the chat's message list in order while agent replies start as unsaved placeholders.\n *\n * Only the server writes an agent's reply (A19): the chat shows an unsaved placeholder until the server acknowledges\n * the run, then gives the placeholder the server row's ID. Until then it has no creation time, and a refresh of the\n * conversation can already have brought the server's copy of the same row into the list.\n */\nimport { UUIDsEqual } from '@memberjunction/global';\nimport type { MJConversationDetailEntity } from '@memberjunction/core-entities';\n\n/** Oldest first. A message with no creation time yet (an unsaved placeholder) is the newest, not the oldest. */\nexport function CompareMessagesByCreatedAt(a: MJConversationDetailEntity, b: MJConversationDetailEntity): number {\n return createdAtOf(a) - createdAtOf(b);\n}\n\n/**\n * The list with `message` in place of the first message that has its ID, and every other copy of that ID dropped (a\n * placeholder that just took the ID of a server row the list already holds), or with `message` appended when none has\n * it. Returns whether it was already there.\n */\nexport function UpsertMessageById(\n messages: MJConversationDetailEntity[],\n message: MJConversationDetailEntity\n): { Messages: MJConversationDetailEntity[]; Existed: boolean } {\n const index = messages.findIndex((m) => UUIDsEqual(m.ID, message.ID));\n if (index < 0) {\n return { Messages: [...messages, message], Existed: false };\n }\n const updated = messages\n .map((m, i) => (i === index ? message : m))\n .filter((m, i) => i === index || !UUIDsEqual(m.ID, message.ID));\n return { Messages: updated, Existed: true };\n}\n\nfunction createdAtOf(message: MJConversationDetailEntity): number {\n return message.__mj_CreatedAt?.getTime() ?? Number.MAX_SAFE_INTEGER;\n}\n"]}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Pinning a message on a fresh copy of its row.
3
+ *
4
+ * The chat's copy of an agent reply can carry streamed or local text that differs from the stored reply, and the
5
+ * server refuses a person's save that changes a reply's content (A19), so a pin saved through that copy is refused.
6
+ * Pinning loads the row as stored and changes only `IsPinned`, as the rating component does for its fields.
7
+ */
8
+ import type { IMetadataProvider } from '@memberjunction/core';
9
+ /** Saves `IsPinned` on the stored row; false when it can't be loaded or saved. */
10
+ export declare function SavePinState(provider: IMetadataProvider, conversationDetailId: string, pinned: boolean): Promise<boolean>;
11
+ //# sourceMappingURL=pin-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pin-state.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/pin-state.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAG9D,kFAAkF;AAClF,wBAAsB,YAAY,CAAC,QAAQ,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAK/H"}
@@ -0,0 +1,9 @@
1
+ /** Saves `IsPinned` on the stored row; false when it can't be loaded or saved. */
2
+ export async function SavePinState(provider, conversationDetailId, pinned) {
3
+ const fresh = await provider.GetEntityObject('MJ: Conversation Details');
4
+ if (!(await fresh.Load(conversationDetailId)))
5
+ return false;
6
+ fresh.IsPinned = pinned;
7
+ return fresh.Save();
8
+ }
9
+ //# sourceMappingURL=pin-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pin-state.js","sourceRoot":"","sources":["../../../src/lib/utils/pin-state.ts"],"names":[],"mappings":"AAUA,kFAAkF;AAClF,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAA2B,EAAE,oBAA4B,EAAE,MAAe;IAC3G,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,eAAe,CAA6B,0BAA0B,CAAC,CAAC;IACrG,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5D,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAC;IACxB,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC","sourcesContent":["/**\n * Pinning a message on a fresh copy of its row.\n *\n * The chat's copy of an agent reply can carry streamed or local text that differs from the stored reply, and the\n * server refuses a person's save that changes a reply's content (A19), so a pin saved through that copy is refused.\n * Pinning loads the row as stored and changes only `IsPinned`, as the rating component does for its fields.\n */\nimport type { IMetadataProvider } from '@memberjunction/core';\nimport type { MJConversationDetailEntity } from '@memberjunction/core-entities';\n\n/** Saves `IsPinned` on the stored row; false when it can't be loaded or saved. */\nexport async function SavePinState(provider: IMetadataProvider, conversationDetailId: string, pinned: boolean): Promise<boolean> {\n const fresh = await provider.GetEntityObject<MJConversationDetailEntity>('MJ: Conversation Details');\n if (!(await fresh.Load(conversationDetailId))) return false;\n fresh.IsPinned = pinned;\n return fresh.Save();\n}\n"]}
@@ -8,6 +8,7 @@ export * from './lib/utils/agent-turn-routing';
8
8
  export * from './lib/utils/decision-routing';
9
9
  export * from './lib/utils/conversation-branching';
10
10
  export * from './lib/utils/conversation-forks';
11
+ export * from './lib/utils/agent-failure-display';
11
12
  export * from './lib/services/data-cache.service';
12
13
  export * from './lib/services/artifact-state.service';
13
14
  export * from './lib/services/agent-state.service';
@@ -1 +1 @@
1
- {"version":3,"file":"public-api.d.ts","sourceRoot":"","sources":["../src/public-api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"public-api.d.ts","sourceRoot":"","sources":["../src/public-api.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,7 @@ export * from './lib/utils/decision-routing';
18
18
  // Fork rules: the delete guard and the open view (Main or one fork)
19
19
  export * from './lib/utils/conversation-branching';
20
20
  export * from './lib/utils/conversation-forks';
21
+ export * from './lib/utils/agent-failure-display';
21
22
  // Services - State
22
23
  export * from './lib/services/data-cache.service';
23
24
  export * from './lib/services/artifact-state.service';