@acorex/modules 21.0.0-next.46 → 21.0.0-next.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/acorex-modules-ai-management.mjs +52 -164
- package/fesm2022/acorex-modules-ai-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-common-search-popup.component-BbRyjGia.mjs → acorex-modules-common-search-popup.component-CVuE0xgM.mjs} +14 -7
- package/fesm2022/acorex-modules-common-search-popup.component-CVuE0xgM.mjs.map +1 -0
- package/fesm2022/acorex-modules-common.mjs +2 -2
- package/fesm2022/{acorex-modules-conversation-acorex-modules-conversation-Dm9D7la2.mjs → acorex-modules-conversation-acorex-modules-conversation-F7nQo1GU.mjs} +364 -112
- package/fesm2022/acorex-modules-conversation-acorex-modules-conversation-F7nQo1GU.mjs.map +1 -0
- package/fesm2022/{acorex-modules-conversation-assist-delegated-agent-detail-popup.component-DnKfkEg1.mjs → acorex-modules-conversation-assist-delegated-agent-detail-popup.component-BB5Uyydt.mjs} +2 -2
- package/fesm2022/{acorex-modules-conversation-assist-delegated-agent-detail-popup.component-DnKfkEg1.mjs.map → acorex-modules-conversation-assist-delegated-agent-detail-popup.component-BB5Uyydt.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-conversation-comments-page.component-JPIzhBys.mjs → acorex-modules-conversation-comments-page.component-QnDogSDy.mjs} +2 -2
- package/fesm2022/{acorex-modules-conversation-comments-page.component-JPIzhBys.mjs.map → acorex-modules-conversation-comments-page.component-QnDogSDy.mjs.map} +1 -1
- package/fesm2022/acorex-modules-conversation-start-assist-chat.command-DRlWzEDp.mjs +45 -0
- package/fesm2022/acorex-modules-conversation-start-assist-chat.command-DRlWzEDp.mjs.map +1 -0
- package/fesm2022/acorex-modules-conversation.mjs +1 -1
- package/fesm2022/{acorex-modules-dashboard-management-acorex-modules-dashboard-management-D11VudG8.mjs → acorex-modules-dashboard-management-acorex-modules-dashboard-management-kk0CINL1.mjs} +5 -5
- package/fesm2022/acorex-modules-dashboard-management-acorex-modules-dashboard-management-kk0CINL1.mjs.map +1 -0
- package/fesm2022/{acorex-modules-dashboard-management-index-DB3Uh1wL.mjs → acorex-modules-dashboard-management-index-Bhm8mAON.mjs} +2 -2
- package/fesm2022/{acorex-modules-dashboard-management-index-DB3Uh1wL.mjs.map → acorex-modules-dashboard-management-index-Bhm8mAON.mjs.map} +1 -1
- package/fesm2022/acorex-modules-dashboard-management.mjs +1 -1
- package/fesm2022/acorex-modules-person-core.mjs +4 -0
- package/fesm2022/acorex-modules-person-core.mjs.map +1 -1
- package/fesm2022/{acorex-modules-platform-dev-tools-menu.provider-BFueKnuF.mjs → acorex-modules-platform-dev-tools-menu.provider-DDjYvQr7.mjs} +6 -2
- package/fesm2022/acorex-modules-platform-dev-tools-menu.provider-DDjYvQr7.mjs.map +1 -0
- package/fesm2022/acorex-modules-platform-dev-tools.mjs +42 -5
- package/fesm2022/acorex-modules-platform-dev-tools.mjs.map +1 -1
- package/fesm2022/acorex-modules-project-management.mjs +33 -3
- package/fesm2022/acorex-modules-project-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-report-management.mjs +12 -8
- package/fesm2022/acorex-modules-report-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-task-management-acorex-modules-task-management-BIEMYKVF.mjs → acorex-modules-task-management-acorex-modules-task-management-BL2IOcx3.mjs} +2 -2
- package/fesm2022/{acorex-modules-task-management-acorex-modules-task-management-BIEMYKVF.mjs.map → acorex-modules-task-management-acorex-modules-task-management-BL2IOcx3.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-task-management-task-board.page-CkVHYIl5.mjs → acorex-modules-task-management-task-board.page-DUIHtqnr.mjs} +138 -68
- package/fesm2022/acorex-modules-task-management-task-board.page-DUIHtqnr.mjs.map +1 -0
- package/fesm2022/acorex-modules-task-management.mjs +1 -1
- package/fesm2022/{acorex-modules-workflow-management-activity-command-configurator-widget-edit.component-Dj6LkQeZ.mjs → acorex-modules-workflow-management-activity-command-configurator-widget-edit.component-CYyr1kQk.mjs} +3 -3
- package/fesm2022/{acorex-modules-workflow-management-activity-command-configurator-widget-edit.component-Dj6LkQeZ.mjs.map → acorex-modules-workflow-management-activity-command-configurator-widget-edit.component-CYyr1kQk.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-workflow-management-index-Eh5DDK-V.mjs → acorex-modules-workflow-management-index-DC_9M9dk.mjs} +3 -3
- package/fesm2022/{acorex-modules-workflow-management-index-Eh5DDK-V.mjs.map → acorex-modules-workflow-management-index-DC_9M9dk.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-workflow-management-index-V4OesZTq.mjs → acorex-modules-workflow-management-index-jin24dmb.mjs} +3 -3
- package/fesm2022/{acorex-modules-workflow-management-index-V4OesZTq.mjs.map → acorex-modules-workflow-management-index-jin24dmb.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-workflow-management-workflow-instance.entity-B_V3uMSI.mjs → acorex-modules-workflow-management-workflow-instance.entity-BnKT3Wgh.mjs} +2 -2
- package/fesm2022/{acorex-modules-workflow-management-workflow-instance.entity-B_V3uMSI.mjs.map → acorex-modules-workflow-management-workflow-instance.entity-BnKT3Wgh.mjs.map} +1 -1
- package/fesm2022/acorex-modules-workflow-management.mjs +8 -15
- package/fesm2022/acorex-modules-workflow-management.mjs.map +1 -1
- package/package.json +2 -2
- package/types/acorex-modules-ai-management.d.ts +17 -22
- package/types/acorex-modules-conversation.d.ts +7 -1
- package/types/acorex-modules-dashboard-management.d.ts +2 -2
- package/types/acorex-modules-platform-dev-tools.d.ts +16 -2
- package/types/acorex-modules-report-management.d.ts +8 -1
- package/types/acorex-modules-workflow-management.d.ts +2 -3
- package/fesm2022/acorex-modules-common-search-popup.component-BbRyjGia.mjs.map +0 -1
- package/fesm2022/acorex-modules-conversation-acorex-modules-conversation-Dm9D7la2.mjs.map +0 -1
- package/fesm2022/acorex-modules-dashboard-management-acorex-modules-dashboard-management-D11VudG8.mjs.map +0 -1
- package/fesm2022/acorex-modules-platform-dev-tools-menu.provider-BFueKnuF.mjs.map +0 -1
- package/fesm2022/acorex-modules-task-management-task-board.page-CkVHYIl5.mjs.map +0 -1
- package/fesm2022/acorex-modules-workflow-management-workflow-task-popover.component-l37iXJIY.mjs +0 -362
- package/fesm2022/acorex-modules-workflow-management-workflow-task-popover.component-l37iXJIY.mjs.map +0 -1
|
@@ -1,15 +1,22 @@
|
|
|
1
1
|
import { AXConversationModule } from '@acorex/components/conversation';
|
|
2
2
|
import { AXPSessionService, AXPAuthGuard, AXP_PERMISSION_DEFINITION_PROVIDER } from '@acorex/platform/auth';
|
|
3
|
-
import { createAllQueryView, AXPEntityQueryType, AXPSettingsService, AXPCommonSettings, AXPFilterOperatorMiddlewareService, AXPEntityCommandScope, AXPFileStorageService, AXP_MENU_PROVIDER } from '@acorex/platform/common';
|
|
4
|
-
import { AXPDataGenerator, AXPPlatformScope, AXPDeviceService, AXP_MODULE_MANIFEST_PROVIDER } from '@acorex/platform/core';
|
|
3
|
+
import { createAllQueryView, AXPEntityQueryType, AXPSettingsService, AXPCommonSettings, AXPFilterOperatorMiddlewareService, AXPEntityCommandScope, AXPFileStorageService, AXP_MENU_PROVIDER, AXP_SEARCH_PROVIDER, AXP_SEARCH_DEFINITION_PROVIDER } from '@acorex/platform/common';
|
|
4
|
+
import { AXPSystemActionType, AXPDataGenerator, AXPPlatformScope, AXPDeviceService, AXP_MODULE_MANIFEST_PROVIDER } from '@acorex/platform/core';
|
|
5
5
|
import { AXPThemeLayoutBlockComponent, AXPThemeLayoutStartSideComponent, AXPUserAvatarComponent, AXPMarkdownViewerComponent, AXPMarkdownTemplateDirective, AXP_PAGE_COMPONENT_PROVIDER, AXP_TASK_BADGE_PROVIDERS } from '@acorex/platform/layout/components';
|
|
6
|
-
import { AXMEntityCrudServiceImpl, entityMasterCrudActions, entityMasterRecordActions,
|
|
6
|
+
import { AXPEntityDefinitionRegistryService, AXMEntityCrudServiceImpl, entityMasterCrudActions, entityMasterRecordActions, cloneLayoutArrays, ensureLayoutSection, ensureLayoutPropertyView, resolveEntityPluginDetailPageOrder, ensureListActions, actionExists, AXPEntityService, AXP_ENTITY_ACTION_PLUGIN, AXP_ENTITY_DEFINITION_LOADER } from '@acorex/platform/layout/entity';
|
|
7
7
|
import { AXPRootLayoutComponent } from '@acorex/platform/themes/default';
|
|
8
8
|
import * as i5 from '@angular/common';
|
|
9
9
|
import { CommonModule, AsyncPipe, DecimalPipe, DatePipe } from '@angular/common';
|
|
10
|
+
import { provideCommandSetups } from '@acorex/platform/runtime';
|
|
10
11
|
import * as i0 from '@angular/core';
|
|
11
|
-
import { Injectable, NgModule,
|
|
12
|
+
import { inject, Injectable, NgModule, output, signal, viewChild, computed, effect, untracked, ChangeDetectionStrategy, Component, input, afterNextRender, DestroyRef, ElementRef, ViewEncapsulation, Injector, importProvidersFrom } from '@angular/core';
|
|
12
13
|
import { Router, ActivatedRoute, RouterModule, ROUTES } from '@angular/router';
|
|
14
|
+
import { sortBy } from 'lodash-es';
|
|
15
|
+
import { RootConfig as RootConfig$1, axpAiChatMessagesFromProviderAssistant, axpAiParseDelegatedAgentResultSegmentsFromUnknown, axpAiChatTextMessage, AXPAiAssistChatModelCatalogService, axpAiParseSupervisorAgentToolName, axpAiChatMessageGetText, axpAiChatMessageIsDelegatedReflectionExcluded, axpAiDelegatedAgentPromptPreview, axpAiChatToolOrAgentResultBodyJson, axpAiDelegatedAgentOutcomeResponsesPlainText } from '@acorex/modules/ai-management';
|
|
16
|
+
import { AXConversationService, AXNewConversationDialogComponent, AXConversationContainerDirective, AXSidebarComponent, AXInfoBarComponent, AXMessageListComponent, AXComposerComponent, AXUserApi, AXConversationApi, AXMessageApi, AXRealtimeApi, conversationSharedStorage, axConversationIndexedDbStorage, AXImageRendererComponent, AXTextRendererComponent, provideConversation, AX_CONVERSATION_ITEM_MUTE_ACTION, AX_CONVERSATION_ITEM_PIN_ACTION, AX_CONVERSATION_ITEM_MARK_READ_ACTION, AX_CONVERSATION_ITEM_DIVIDER, AX_CONVERSATION_ITEM_DELETE_ACTION, AX_CONVERSATION_ITEM_BLOCK_ACTION, AX_CONVERSATION_INFO_BAR_SEARCH_ACTION, AX_CONVERSATION_INFO_BAR_INFO_ACTION, AX_CONVERSATION_INFO_BAR_MUTE_ACTION, AX_CONVERSATION_INFO_BAR_DIVIDER, AX_CONVERSATION_INFO_BAR_DELETE_ACTION, AX_CONVERSATION_INFO_BAR_BLOCK_ACTION, AX_CONVERSATION_TAB_ALL, AX_CONVERSATION_TAB_PRIVATE, AX_CONVERSATION_TAB_GROUPS, AX_CONVERSATION_COMPOSER_EMOJI_TAB, AX_CONVERSATION_COMPOSER_STICKER_TAB, AX_CONVERSATION_COMPOSER_EMOJI_ACTION, AX_CONVERSATION_COMPOSER_IMAGE_ACTION, AX_CONVERSATION_COMPOSER_VIDEO_ACTION, AX_CONVERSATION_COMPOSER_FILE_ACTION, AX_CONVERSATION_COMPOSER_VOICE_RECORDING_ACTION, AX_CONVERSATION_COMPOSER_AUDIO_ACTION, AX_CONVERSATION_COMPOSER_LOCATION_ACTION, AX_CONVERSATION_MESSAGE_REPLY_ACTION, AX_CONVERSATION_MESSAGE_FORWARD_ACTION, AX_CONVERSATION_MESSAGE_EDIT_ACTION, AX_CONVERSATION_MESSAGE_DELETE_ACTION, AXComposerService, AX_CONVERSATION_TEXT_RENDERER, AX_CONVERSATION_IMAGE_RENDERER, AX_CONVERSATION_VIDEO_RENDERER, AX_CONVERSATION_AUDIO_RENDERER, AX_CONVERSATION_VOICE_RENDERER, AX_CONVERSATION_FILE_RENDERER, AX_CONVERSATION_LOCATION_RENDERER, AX_CONVERSATION_STICKER_RENDERER } from '@acorex/components/conversation2';
|
|
17
|
+
import { AXToastService } from '@acorex/components/toast';
|
|
18
|
+
import * as i3$1 from '@acorex/core/translation';
|
|
19
|
+
import { AXTranslationService, AXTranslationModule } from '@acorex/core/translation';
|
|
13
20
|
import * as i1$3 from '@acorex/platform/layout/widget-core';
|
|
14
21
|
import { AXPWidgetsCatalog, AXPValueWidgetComponent, AXPWidgetGroupEnum, AXPWidgetCoreModule, AXP_WIDGET_DEFINITION_PROVIDER } from '@acorex/platform/layout/widget-core';
|
|
15
22
|
import * as i1$6 from '@acorex/platform/workflow';
|
|
@@ -19,19 +26,14 @@ import { AXMUsersEntityService } from '@acorex/modules/security-management';
|
|
|
19
26
|
import { Subject, map, filter, merge, auditTime } from 'rxjs';
|
|
20
27
|
import * as i2 from '@acorex/components/button';
|
|
21
28
|
import { AXButtonModule, AXButtonComponent } from '@acorex/components/button';
|
|
22
|
-
import { AXConversationService, AXNewConversationDialogComponent, AXConversationContainerDirective, AXSidebarComponent, AXInfoBarComponent, AXMessageListComponent, AXComposerComponent, AXUserApi, AXConversationApi, AXMessageApi, AXRealtimeApi, conversationSharedStorage, axConversationIndexedDbStorage, AXImageRendererComponent, AXTextRendererComponent, provideConversation, AX_CONVERSATION_ITEM_MUTE_ACTION, AX_CONVERSATION_ITEM_PIN_ACTION, AX_CONVERSATION_ITEM_MARK_READ_ACTION, AX_CONVERSATION_ITEM_DIVIDER, AX_CONVERSATION_ITEM_DELETE_ACTION, AX_CONVERSATION_ITEM_BLOCK_ACTION, AX_CONVERSATION_INFO_BAR_SEARCH_ACTION, AX_CONVERSATION_INFO_BAR_INFO_ACTION, AX_CONVERSATION_INFO_BAR_MUTE_ACTION, AX_CONVERSATION_INFO_BAR_DIVIDER, AX_CONVERSATION_INFO_BAR_DELETE_ACTION, AX_CONVERSATION_INFO_BAR_BLOCK_ACTION, AX_CONVERSATION_TAB_ALL, AX_CONVERSATION_TAB_PRIVATE, AX_CONVERSATION_TAB_GROUPS, AX_CONVERSATION_COMPOSER_EMOJI_TAB, AX_CONVERSATION_COMPOSER_STICKER_TAB, AX_CONVERSATION_COMPOSER_EMOJI_ACTION, AX_CONVERSATION_COMPOSER_IMAGE_ACTION, AX_CONVERSATION_COMPOSER_VIDEO_ACTION, AX_CONVERSATION_COMPOSER_FILE_ACTION, AX_CONVERSATION_COMPOSER_VOICE_RECORDING_ACTION, AX_CONVERSATION_COMPOSER_AUDIO_ACTION, AX_CONVERSATION_COMPOSER_LOCATION_ACTION, AX_CONVERSATION_MESSAGE_REPLY_ACTION, AX_CONVERSATION_MESSAGE_FORWARD_ACTION, AX_CONVERSATION_MESSAGE_EDIT_ACTION, AX_CONVERSATION_MESSAGE_DELETE_ACTION, AXComposerService, AX_CONVERSATION_TEXT_RENDERER, AX_CONVERSATION_IMAGE_RENDERER, AX_CONVERSATION_VIDEO_RENDERER, AX_CONVERSATION_AUDIO_RENDERER, AX_CONVERSATION_VOICE_RENDERER, AX_CONVERSATION_FILE_RENDERER, AX_CONVERSATION_LOCATION_RENDERER, AX_CONVERSATION_STICKER_RENDERER } from '@acorex/components/conversation2';
|
|
23
29
|
import { AXDialogService } from '@acorex/components/dialog';
|
|
24
30
|
import * as i1$1 from '@acorex/components/decorators';
|
|
25
31
|
import { AXDecoratorModule } from '@acorex/components/decorators';
|
|
26
|
-
import * as i3$1 from '@acorex/core/translation';
|
|
27
|
-
import { AXTranslationService, AXTranslationModule } from '@acorex/core/translation';
|
|
28
32
|
import { AXPPageLayoutBaseComponent, AXPPageLayoutComponent } from '@acorex/platform/layout/views';
|
|
29
33
|
import { toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
30
34
|
import * as i3 from '@acorex/components/dropdown';
|
|
31
35
|
import { AXDropdownModule } from '@acorex/components/dropdown';
|
|
32
36
|
import { AXTextBoxModule } from '@acorex/components/text-box';
|
|
33
|
-
import { AXToastService } from '@acorex/components/toast';
|
|
34
|
-
import { RootConfig as RootConfig$1, axpAiChatMessagesFromProviderAssistant, axpAiParseDelegatedAgentResultSegmentsFromUnknown, axpAiChatTextMessage, AXPAiAssistChatModelCatalogService, axpAiParseSupervisorAgentToolName, axpAiChatMessageGetText, axpAiChatMessageIsDelegatedReflectionExcluded, axpAiDelegatedAgentPromptPreview, axpAiChatToolOrAgentResultBodyJson, axpAiDelegatedAgentOutcomeResponsesPlainText } from '@acorex/modules/ai-management';
|
|
35
37
|
import * as i1 from '@angular/forms';
|
|
36
38
|
import { FormsModule } from '@angular/forms';
|
|
37
39
|
import { AXFabComponent, AXFabItemComponent } from '@acorex/components/fab';
|
|
@@ -98,6 +100,298 @@ const RootConfig = {
|
|
|
98
100
|
},
|
|
99
101
|
};
|
|
100
102
|
|
|
103
|
+
/** Starts a new bot conversation with the given AI assist model. */
|
|
104
|
+
const CONVERSATION_START_ASSIST_CHAT_COMMAND = 'Conversation:StartAssistChat';
|
|
105
|
+
|
|
106
|
+
//#region ---- Imports ----
|
|
107
|
+
//#endregion
|
|
108
|
+
//#region ---- Participant & metadata ----
|
|
109
|
+
/** Synthetic bot participant id for assist or agent-as-assist chats. */
|
|
110
|
+
function axmChatAiPeerParticipantId(catalogId) {
|
|
111
|
+
return `assist-${catalogId.trim()}`;
|
|
112
|
+
}
|
|
113
|
+
/** Conversation metadata for starting an AI chat from a picker row. */
|
|
114
|
+
function axmBuildAiChatConversationMetadata(row) {
|
|
115
|
+
if (row.kind === 'agent') {
|
|
116
|
+
return { directAgentId: row.id };
|
|
117
|
+
}
|
|
118
|
+
return { assistId: row.id };
|
|
119
|
+
}
|
|
120
|
+
/** True when conversation metadata targets an assist row or a direct agent-as-assist chat. */
|
|
121
|
+
function axmConversationHasAiChat(conversation) {
|
|
122
|
+
const meta = conversation?.metadata;
|
|
123
|
+
if (!meta) {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
const assistId = meta['assistId'];
|
|
127
|
+
if (typeof assistId === 'string' && assistId.trim()) {
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
const directAgentId = meta['directAgentId'];
|
|
131
|
+
return typeof directAgentId === 'string' && directAgentId.trim().length > 0;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Loads assist rows plus agents flagged with `isAssist` for Conversation AI chat pickers.
|
|
135
|
+
*/
|
|
136
|
+
async function axmLoadChatAiTargets(entityRegistry) {
|
|
137
|
+
const [assists, agents] = await Promise.all([
|
|
138
|
+
axmQueryEntityList(entityRegistry, RootConfig$1.entities.assist.name),
|
|
139
|
+
axmQueryEntityList(entityRegistry, RootConfig$1.entities.agent.name),
|
|
140
|
+
]);
|
|
141
|
+
const assistRows = assists.map((raw) => ({
|
|
142
|
+
id: String(raw['id'] ?? ''),
|
|
143
|
+
name: String(raw['name'] ?? ''),
|
|
144
|
+
title: raw['title'],
|
|
145
|
+
description: raw['description'],
|
|
146
|
+
professionImageUrl: typeof raw['professionImageUrl'] === 'string' ? raw['professionImageUrl'] : undefined,
|
|
147
|
+
kind: 'assist',
|
|
148
|
+
}));
|
|
149
|
+
const agentRows = agents
|
|
150
|
+
.filter((raw) => raw['isAssist'] === true)
|
|
151
|
+
.map((raw) => ({
|
|
152
|
+
id: String(raw['id'] ?? ''),
|
|
153
|
+
name: String(raw['name'] ?? ''),
|
|
154
|
+
title: raw['title'],
|
|
155
|
+
description: raw['description'],
|
|
156
|
+
kind: 'agent',
|
|
157
|
+
}));
|
|
158
|
+
return [...assistRows, ...agentRows]
|
|
159
|
+
.filter((row) => row.id.trim().length > 0)
|
|
160
|
+
.sort((a, b) => a.name.localeCompare(b.name, undefined, { sensitivity: 'base' }));
|
|
161
|
+
}
|
|
162
|
+
//#endregion
|
|
163
|
+
//#region ---- Display & filter (dialog + global search) ----
|
|
164
|
+
/** Resolves ML or plain string for search/display. */
|
|
165
|
+
function axmResolveChatAiTargetText(resolveMl, value) {
|
|
166
|
+
if (!value) {
|
|
167
|
+
return '';
|
|
168
|
+
}
|
|
169
|
+
if (typeof value === 'string') {
|
|
170
|
+
return value;
|
|
171
|
+
}
|
|
172
|
+
return resolveMl(value) ?? '';
|
|
173
|
+
}
|
|
174
|
+
function axmChatAiTargetDisplayName(resolveMl, row) {
|
|
175
|
+
return axmResolveChatAiTargetText(resolveMl, row.title).trim() || row.name.trim() || row.id;
|
|
176
|
+
}
|
|
177
|
+
function axmChatAiTargetDisplayDescription(resolveMl, row) {
|
|
178
|
+
if (!row.description) {
|
|
179
|
+
return undefined;
|
|
180
|
+
}
|
|
181
|
+
const text = axmResolveChatAiTargetText(resolveMl, row.description).trim();
|
|
182
|
+
return text || undefined;
|
|
183
|
+
}
|
|
184
|
+
function axmChatAiTargetAvatarUrl(row) {
|
|
185
|
+
const url = row.professionImageUrl?.trim();
|
|
186
|
+
return url ? url : null;
|
|
187
|
+
}
|
|
188
|
+
/** Fallback i18n key for rows with no catalog description. */
|
|
189
|
+
function axmChatAiTargetShortcutDescriptionKey(row) {
|
|
190
|
+
return row.kind === 'agent'
|
|
191
|
+
? '@conversation:search.assist.shortcut-description-agent'
|
|
192
|
+
: '@conversation:search.assist.shortcut-description';
|
|
193
|
+
}
|
|
194
|
+
/** Same filter as {@link AXMChatWithAssistDialogComponent} target list search. */
|
|
195
|
+
function axmFilterChatAiTargets(resolveMl, rows, query) {
|
|
196
|
+
const q = query.trim().toLowerCase();
|
|
197
|
+
if (!q) {
|
|
198
|
+
return rows;
|
|
199
|
+
}
|
|
200
|
+
return rows.filter((r) => {
|
|
201
|
+
const titleText = axmResolveChatAiTargetText(resolveMl, r.title).toLowerCase();
|
|
202
|
+
return (r.name.toLowerCase().includes(q) ||
|
|
203
|
+
titleText.includes(q) ||
|
|
204
|
+
axmResolveChatAiTargetText(resolveMl, r.description).toLowerCase().includes(q));
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
//#endregion
|
|
208
|
+
//#region ---- Entity list query ----
|
|
209
|
+
async function axmQueryEntityList(entityRegistry, entityName) {
|
|
210
|
+
const entity = await entityRegistry.resolve(RootConfig$1.module.name, entityName);
|
|
211
|
+
const execute = entity.queries?.list?.execute;
|
|
212
|
+
if (!execute) {
|
|
213
|
+
throw new Error(`${entityName} entity has no list query.`);
|
|
214
|
+
}
|
|
215
|
+
const res = await execute({
|
|
216
|
+
skip: 0,
|
|
217
|
+
take: 500,
|
|
218
|
+
sort: [{ name: 'name', dir: 'asc' }],
|
|
219
|
+
});
|
|
220
|
+
return res.items ?? [];
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
//#region ---- Imports ----
|
|
224
|
+
//#endregion
|
|
225
|
+
//#region ---- Service ----
|
|
226
|
+
/**
|
|
227
|
+
* Starts bot conversations from AI target rows (assists + agents with `isAssist`),
|
|
228
|
+
* shared by global search shortcuts and {@link AXMConversationStartAssistChatCommand}.
|
|
229
|
+
*/
|
|
230
|
+
class AXMChatAssistLauncherService {
|
|
231
|
+
constructor() {
|
|
232
|
+
this.conversationService = inject(AXConversationService);
|
|
233
|
+
this.entityRegistry = inject(AXPEntityDefinitionRegistryService);
|
|
234
|
+
this.translationService = inject(AXTranslationService);
|
|
235
|
+
this.sessionService = inject(AXPSessionService);
|
|
236
|
+
this.router = inject(Router);
|
|
237
|
+
this.toastService = inject(AXToastService);
|
|
238
|
+
this.targetsCache = null;
|
|
239
|
+
this.loadPromise = null;
|
|
240
|
+
}
|
|
241
|
+
async loadTargets(force = false) {
|
|
242
|
+
if (!force && this.targetsCache) {
|
|
243
|
+
return this.targetsCache;
|
|
244
|
+
}
|
|
245
|
+
if (!force && this.loadPromise) {
|
|
246
|
+
return this.loadPromise;
|
|
247
|
+
}
|
|
248
|
+
this.loadPromise = axmLoadChatAiTargets(this.entityRegistry);
|
|
249
|
+
try {
|
|
250
|
+
this.targetsCache = await this.loadPromise;
|
|
251
|
+
return this.targetsCache;
|
|
252
|
+
}
|
|
253
|
+
finally {
|
|
254
|
+
this.loadPromise = null;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
displayName(row) {
|
|
258
|
+
return axmChatAiTargetDisplayName(this.#resolveMl.bind(this), row);
|
|
259
|
+
}
|
|
260
|
+
displayDescription(row) {
|
|
261
|
+
return axmChatAiTargetDisplayDescription(this.#resolveMl.bind(this), row);
|
|
262
|
+
}
|
|
263
|
+
targetAvatarUrl(row) {
|
|
264
|
+
return axmChatAiTargetAvatarUrl(row);
|
|
265
|
+
}
|
|
266
|
+
filterTargets(rows, query) {
|
|
267
|
+
return axmFilterChatAiTargets(this.#resolveMl.bind(this), rows, query);
|
|
268
|
+
}
|
|
269
|
+
async startAssistChat(options) {
|
|
270
|
+
const targetId = (options.targetId ?? options.assistId)?.trim();
|
|
271
|
+
if (!targetId) {
|
|
272
|
+
return null;
|
|
273
|
+
}
|
|
274
|
+
const rows = await this.loadTargets();
|
|
275
|
+
const row = rows.find((r) => r.id === targetId && (!options.targetKind || r.kind === options.targetKind)) ??
|
|
276
|
+
rows.find((r) => r.id === targetId);
|
|
277
|
+
if (!row) {
|
|
278
|
+
const message = await this.translationService.translateAsync('@conversation:chat.assist-dialog.errors.start-chat');
|
|
279
|
+
this.toastService.danger(message);
|
|
280
|
+
return null;
|
|
281
|
+
}
|
|
282
|
+
try {
|
|
283
|
+
const conversation = await this.#createTargetConversation(row);
|
|
284
|
+
await this.conversationService.selectConversation(conversation.id);
|
|
285
|
+
if (options.navigate !== false) {
|
|
286
|
+
await this.router.navigate([this.#applicationRouteSegment(), 'chat', conversation.id]);
|
|
287
|
+
}
|
|
288
|
+
return { conversation };
|
|
289
|
+
}
|
|
290
|
+
catch (error) {
|
|
291
|
+
console.error('Failed to start AI chat:', error);
|
|
292
|
+
const message = await this.translationService.translateAsync('@conversation:chat.assist-dialog.errors.start-chat');
|
|
293
|
+
this.toastService.danger(message);
|
|
294
|
+
return null;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
async #createTargetConversation(row) {
|
|
298
|
+
const participantId = axmChatAiPeerParticipantId(row.id);
|
|
299
|
+
const title = this.displayName(row);
|
|
300
|
+
const avatar = this.targetAvatarUrl(row);
|
|
301
|
+
return this.conversationService.createConversation([participantId], 'bot', {
|
|
302
|
+
title,
|
|
303
|
+
...(avatar ? { avatar } : {}),
|
|
304
|
+
icon: 'fa-solid fa-robot',
|
|
305
|
+
metadata: axmBuildAiChatConversationMetadata(row),
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
#resolveMl(value) {
|
|
309
|
+
return this.translationService.resolve(value);
|
|
310
|
+
}
|
|
311
|
+
#applicationRouteSegment() {
|
|
312
|
+
return this.sessionService.application?.name ?? 'platform';
|
|
313
|
+
}
|
|
314
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatAssistLauncherService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
315
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatAssistLauncherService, providedIn: 'root' }); }
|
|
316
|
+
}
|
|
317
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatAssistLauncherService, decorators: [{
|
|
318
|
+
type: Injectable,
|
|
319
|
+
args: [{ providedIn: 'root' }]
|
|
320
|
+
}] });
|
|
321
|
+
|
|
322
|
+
/** Search group key — AI chat targets (assists + agent-as-assist), not conversation history. */
|
|
323
|
+
const AXM_CONVERSATION_ASSIST_SEARCH_GROUP = 'conversation-assist';
|
|
324
|
+
//#endregion
|
|
325
|
+
//#region ---- Provider ----
|
|
326
|
+
/**
|
|
327
|
+
* Global search entries to start a new AI chat — same catalog as
|
|
328
|
+
* {@link AXMChatWithAssistDialogComponent} / {@link AXMChatSidebarNewActionsComponent}.
|
|
329
|
+
*
|
|
330
|
+
* Note: the shared global search popup only queries when the text length is > 2.
|
|
331
|
+
*/
|
|
332
|
+
class AXMConversationAssistSearchProvider {
|
|
333
|
+
constructor() {
|
|
334
|
+
this.launcher = inject(AXMChatAssistLauncherService);
|
|
335
|
+
}
|
|
336
|
+
async search(text) {
|
|
337
|
+
let rows;
|
|
338
|
+
try {
|
|
339
|
+
rows = await this.launcher.loadTargets();
|
|
340
|
+
}
|
|
341
|
+
catch (error) {
|
|
342
|
+
console.error('Failed to load AI chat targets for shortcut search:', error);
|
|
343
|
+
return [];
|
|
344
|
+
}
|
|
345
|
+
const filtered = this.launcher.filterTargets(rows, text);
|
|
346
|
+
const sorted = sortBy(filtered, (row) => this.launcher.displayName(row).toLowerCase());
|
|
347
|
+
return sorted.map((row) => ({
|
|
348
|
+
id: row.id,
|
|
349
|
+
group: AXM_CONVERSATION_ASSIST_SEARCH_GROUP,
|
|
350
|
+
title: row.title,
|
|
351
|
+
description: row.description ?? axmChatAiTargetShortcutDescriptionKey(row),
|
|
352
|
+
icon: 'fa-solid fa-robot',
|
|
353
|
+
data: { id: row.id, name: row.name, kind: row.kind },
|
|
354
|
+
command: {
|
|
355
|
+
name: CONVERSATION_START_ASSIST_CHAT_COMMAND,
|
|
356
|
+
options: {
|
|
357
|
+
targetId: row.id,
|
|
358
|
+
targetKind: row.kind,
|
|
359
|
+
},
|
|
360
|
+
},
|
|
361
|
+
}));
|
|
362
|
+
}
|
|
363
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMConversationAssistSearchProvider, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
364
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMConversationAssistSearchProvider }); }
|
|
365
|
+
}
|
|
366
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMConversationAssistSearchProvider, decorators: [{
|
|
367
|
+
type: Injectable
|
|
368
|
+
}] });
|
|
369
|
+
|
|
370
|
+
//#endregion
|
|
371
|
+
//#region ---- Provider ----
|
|
372
|
+
/** Search group for AI assist shortcut picker (not chat/conversation history). */
|
|
373
|
+
class AXMConversationAssistSearchDefinitionProvider {
|
|
374
|
+
async provide(context) {
|
|
375
|
+
context.addDefinition(AXM_CONVERSATION_ASSIST_SEARCH_GROUP, '@conversation:search.assist.group-title', AXM_CONVERSATION_ASSIST_SEARCH_GROUP, 'fa-solid fa-robot', 4, {
|
|
376
|
+
format: {
|
|
377
|
+
id: '{{id}}',
|
|
378
|
+
},
|
|
379
|
+
actions: [
|
|
380
|
+
{
|
|
381
|
+
name: 'start-assist-chat',
|
|
382
|
+
type: AXPSystemActionType.View,
|
|
383
|
+
priority: 'primary',
|
|
384
|
+
},
|
|
385
|
+
],
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMConversationAssistSearchDefinitionProvider, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
389
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMConversationAssistSearchDefinitionProvider }); }
|
|
390
|
+
}
|
|
391
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMConversationAssistSearchDefinitionProvider, decorators: [{
|
|
392
|
+
type: Injectable
|
|
393
|
+
}] });
|
|
394
|
+
|
|
101
395
|
class AXMConversationTabService extends AXMEntityCrudServiceImpl {
|
|
102
396
|
}
|
|
103
397
|
class AXMConversationTabServiceImpl extends AXMConversationTabService {
|
|
@@ -922,6 +1216,12 @@ const AXPConversationMenuKeys = {
|
|
|
922
1216
|
Conversations: 'Conversation:Menu:Conversations',
|
|
923
1217
|
};
|
|
924
1218
|
|
|
1219
|
+
const AXMPermissionsKeys = {
|
|
1220
|
+
Conversation: {
|
|
1221
|
+
Management: 'Conversation:Permission:Management',
|
|
1222
|
+
},
|
|
1223
|
+
};
|
|
1224
|
+
|
|
925
1225
|
class AXMMenuProvider {
|
|
926
1226
|
constructor() {
|
|
927
1227
|
this.sessionService = inject(AXPSessionService);
|
|
@@ -937,6 +1237,9 @@ class AXMMenuProvider {
|
|
|
937
1237
|
priority: 30,
|
|
938
1238
|
icon: RootConfig.entities.room.icon,
|
|
939
1239
|
badgeKey: 'badge-chat',
|
|
1240
|
+
policy: {
|
|
1241
|
+
permissions: [AXMPermissionsKeys.Conversation.Management],
|
|
1242
|
+
},
|
|
940
1243
|
},
|
|
941
1244
|
]);
|
|
942
1245
|
}
|
|
@@ -947,9 +1250,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
947
1250
|
type: Injectable
|
|
948
1251
|
}] });
|
|
949
1252
|
|
|
1253
|
+
//#endregion
|
|
1254
|
+
//#region ---- Permission Definition Provider ----
|
|
950
1255
|
class AXMPermissionDefinitionProvider {
|
|
951
1256
|
async define(context) {
|
|
952
|
-
|
|
1257
|
+
const keys = AXMPermissionsKeys.Conversation;
|
|
1258
|
+
const modulePermissions = '@conversation:module.permissions';
|
|
1259
|
+
context
|
|
1260
|
+
.addGroup(RootConfig.module.name, `${modulePermissions}.title`, `${modulePermissions}.description`)
|
|
1261
|
+
.addPermission(keys.Management, `${modulePermissions}.manage.title`, `${modulePermissions}.manage.description`)
|
|
1262
|
+
.endPermission()
|
|
1263
|
+
.endGroup();
|
|
953
1264
|
}
|
|
954
1265
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMPermissionDefinitionProvider, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
955
1266
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMPermissionDefinitionProvider }); }
|
|
@@ -1635,77 +1946,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
1635
1946
|
args: [{ providedIn: 'root' }]
|
|
1636
1947
|
}], ctorParameters: () => [] });
|
|
1637
1948
|
|
|
1638
|
-
//#region ---- Imports ----
|
|
1639
|
-
//#endregion
|
|
1640
|
-
//#region ---- Participant & metadata ----
|
|
1641
|
-
/** Synthetic bot participant id for assist or agent-as-assist chats. */
|
|
1642
|
-
function axmChatAiPeerParticipantId(catalogId) {
|
|
1643
|
-
return `assist-${catalogId.trim()}`;
|
|
1644
|
-
}
|
|
1645
|
-
/** Conversation metadata for starting an AI chat from a picker row. */
|
|
1646
|
-
function axmBuildAiChatConversationMetadata(row) {
|
|
1647
|
-
if (row.kind === 'agent') {
|
|
1648
|
-
return { directAgentId: row.id };
|
|
1649
|
-
}
|
|
1650
|
-
return { assistId: row.id };
|
|
1651
|
-
}
|
|
1652
|
-
/** True when conversation metadata targets an assist row or a direct agent-as-assist chat. */
|
|
1653
|
-
function axmConversationHasAiChat(conversation) {
|
|
1654
|
-
const meta = conversation?.metadata;
|
|
1655
|
-
if (!meta) {
|
|
1656
|
-
return false;
|
|
1657
|
-
}
|
|
1658
|
-
const assistId = meta['assistId'];
|
|
1659
|
-
if (typeof assistId === 'string' && assistId.trim()) {
|
|
1660
|
-
return true;
|
|
1661
|
-
}
|
|
1662
|
-
const directAgentId = meta['directAgentId'];
|
|
1663
|
-
return typeof directAgentId === 'string' && directAgentId.trim().length > 0;
|
|
1664
|
-
}
|
|
1665
|
-
/**
|
|
1666
|
-
* Loads assist rows plus agents flagged with `isAssist` for Conversation AI chat pickers.
|
|
1667
|
-
*/
|
|
1668
|
-
async function axmLoadChatAiTargets(entityRegistry) {
|
|
1669
|
-
const [assists, agents] = await Promise.all([
|
|
1670
|
-
axmQueryEntityList(entityRegistry, RootConfig$1.entities.assist.name),
|
|
1671
|
-
axmQueryEntityList(entityRegistry, RootConfig$1.entities.agent.name),
|
|
1672
|
-
]);
|
|
1673
|
-
const assistRows = assists.map((raw) => ({
|
|
1674
|
-
id: String(raw['id'] ?? ''),
|
|
1675
|
-
name: String(raw['name'] ?? ''),
|
|
1676
|
-
title: raw['title'],
|
|
1677
|
-
description: raw['description'],
|
|
1678
|
-
professionImageUrl: typeof raw['professionImageUrl'] === 'string' ? raw['professionImageUrl'] : undefined,
|
|
1679
|
-
kind: 'assist',
|
|
1680
|
-
}));
|
|
1681
|
-
const agentRows = agents
|
|
1682
|
-
.filter((raw) => raw['isAssist'] === true)
|
|
1683
|
-
.map((raw) => ({
|
|
1684
|
-
id: String(raw['id'] ?? ''),
|
|
1685
|
-
name: String(raw['name'] ?? ''),
|
|
1686
|
-
title: raw['title'],
|
|
1687
|
-
description: raw['description'],
|
|
1688
|
-
kind: 'agent',
|
|
1689
|
-
}));
|
|
1690
|
-
return [...assistRows, ...agentRows]
|
|
1691
|
-
.filter((row) => row.id.trim().length > 0)
|
|
1692
|
-
.sort((a, b) => a.name.localeCompare(b.name, undefined, { sensitivity: 'base' }));
|
|
1693
|
-
}
|
|
1694
|
-
async function axmQueryEntityList(entityRegistry, entityName) {
|
|
1695
|
-
const entity = await entityRegistry.resolve(RootConfig$1.module.name, entityName);
|
|
1696
|
-
const execute = entity.queries?.list?.execute;
|
|
1697
|
-
if (!execute) {
|
|
1698
|
-
throw new Error(`${entityName} entity has no list query.`);
|
|
1699
|
-
}
|
|
1700
|
-
const res = await execute({
|
|
1701
|
-
skip: 0,
|
|
1702
|
-
take: 500,
|
|
1703
|
-
sort: [{ name: 'name', dir: 'asc' }],
|
|
1704
|
-
});
|
|
1705
|
-
return res.items ?? [];
|
|
1706
|
-
}
|
|
1707
|
-
//#endregion
|
|
1708
|
-
|
|
1709
1949
|
class AXMChatEmptyAssistComposerComponent {
|
|
1710
1950
|
constructor() {
|
|
1711
1951
|
this.conversationService = inject(AXConversationService);
|
|
@@ -2035,33 +2275,13 @@ class AXMChatWithAssistDialogComponent extends AXBasePageComponent {
|
|
|
2035
2275
|
}
|
|
2036
2276
|
}
|
|
2037
2277
|
filteredTargetRows() {
|
|
2038
|
-
|
|
2039
|
-
const list = this.rows();
|
|
2040
|
-
if (!q) {
|
|
2041
|
-
return list;
|
|
2042
|
-
}
|
|
2043
|
-
return list.filter((r) => {
|
|
2044
|
-
const titleText = this.resolveSearchableTitle(r.title).toLowerCase();
|
|
2045
|
-
return (r.name.toLowerCase().includes(q) ||
|
|
2046
|
-
titleText.includes(q) ||
|
|
2047
|
-
this.resolveSearchableTitle(r.description).toLowerCase().includes(q));
|
|
2048
|
-
});
|
|
2049
|
-
}
|
|
2050
|
-
resolveSearchableTitle(value) {
|
|
2051
|
-
if (!value) {
|
|
2052
|
-
return '';
|
|
2053
|
-
}
|
|
2054
|
-
if (typeof value === 'string') {
|
|
2055
|
-
return value;
|
|
2056
|
-
}
|
|
2057
|
-
return this.translationService.resolve(value) ?? '';
|
|
2278
|
+
return axmFilterChatAiTargets((value) => this.translationService.resolve(value), this.rows(), this.searchQuery());
|
|
2058
2279
|
}
|
|
2059
2280
|
displayName(row) {
|
|
2060
|
-
return
|
|
2281
|
+
return axmChatAiTargetDisplayName((value) => this.translationService.resolve(value), row);
|
|
2061
2282
|
}
|
|
2062
2283
|
targetAvatarUrl(row) {
|
|
2063
|
-
|
|
2064
|
-
return avatarUrl ? avatarUrl : null;
|
|
2284
|
+
return axmChatAiTargetAvatarUrl(row);
|
|
2065
2285
|
}
|
|
2066
2286
|
onCancel() {
|
|
2067
2287
|
const event = new AXComponentCloseEvent();
|
|
@@ -2171,7 +2391,7 @@ class AXMChatWithAssistDialogComponent extends AXBasePageComponent {
|
|
|
2171
2391
|
<div class="user-item-content">
|
|
2172
2392
|
<ax-avatar [size]="54">
|
|
2173
2393
|
@if (targetAvatarUrl(row); as avatarUrl) {
|
|
2174
|
-
<ax-image [src]="avatarUrl" [alt]="
|
|
2394
|
+
<ax-image [src]="avatarUrl" [alt]="row.title | translate | async"></ax-image>
|
|
2175
2395
|
} @else {
|
|
2176
2396
|
<ax-icon
|
|
2177
2397
|
><i
|
|
@@ -2188,7 +2408,7 @@ class AXMChatWithAssistDialogComponent extends AXBasePageComponent {
|
|
|
2188
2408
|
}
|
|
2189
2409
|
</ax-avatar>
|
|
2190
2410
|
<div class="user-item-text">
|
|
2191
|
-
<span class="ax-truncated user-name-text">{{
|
|
2411
|
+
<span class="ax-truncated user-name-text">{{ row.title | translate | async }}</span>
|
|
2192
2412
|
@if (row.description) {
|
|
2193
2413
|
<span class="user-description-text ax-truncated">{{ row.description | translate | async }}</span>
|
|
2194
2414
|
}
|
|
@@ -2277,7 +2497,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
2277
2497
|
<div class="user-item-content">
|
|
2278
2498
|
<ax-avatar [size]="54">
|
|
2279
2499
|
@if (targetAvatarUrl(row); as avatarUrl) {
|
|
2280
|
-
<ax-image [src]="avatarUrl" [alt]="
|
|
2500
|
+
<ax-image [src]="avatarUrl" [alt]="row.title | translate | async"></ax-image>
|
|
2281
2501
|
} @else {
|
|
2282
2502
|
<ax-icon
|
|
2283
2503
|
><i
|
|
@@ -2294,7 +2514,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
2294
2514
|
}
|
|
2295
2515
|
</ax-avatar>
|
|
2296
2516
|
<div class="user-item-text">
|
|
2297
|
-
<span class="ax-truncated user-name-text">{{
|
|
2517
|
+
<span class="ax-truncated user-name-text">{{ row.title | translate | async }}</span>
|
|
2298
2518
|
@if (row.description) {
|
|
2299
2519
|
<span class="user-description-text ax-truncated">{{ row.description | translate | async }}</span>
|
|
2300
2520
|
}
|
|
@@ -4981,7 +5201,7 @@ async function axmOpenAssistDelegatedAgentDetailDialog(options) {
|
|
|
4981
5201
|
options.translationService.translateAsync('@conversation:chat.assist-renderer.delegated-agent.dialog-title-suffix'),
|
|
4982
5202
|
options.translationService.translateAsync('@conversation:chat.assist-renderer.delegated-agent.transcript-missing'),
|
|
4983
5203
|
]);
|
|
4984
|
-
const comp = (await import('./acorex-modules-conversation-assist-delegated-agent-detail-popup.component-
|
|
5204
|
+
const comp = (await import('./acorex-modules-conversation-assist-delegated-agent-detail-popup.component-BB5Uyydt.mjs'))
|
|
4985
5205
|
.AXMAssistDelegatedAgentDetailPopupComponent;
|
|
4986
5206
|
const data = {
|
|
4987
5207
|
messages: entry?.messages ?? [],
|
|
@@ -6028,7 +6248,7 @@ class AXMCommentsPageComponentProvider {
|
|
|
6028
6248
|
return [
|
|
6029
6249
|
{
|
|
6030
6250
|
key: COMMENTS_PAGE_COMPONENT_KEY,
|
|
6031
|
-
loader: () => import('./acorex-modules-conversation-comments-page.component-
|
|
6251
|
+
loader: () => import('./acorex-modules-conversation-comments-page.component-QnDogSDy.mjs').then((m) => m.AXMCommentsPageComponent),
|
|
6032
6252
|
},
|
|
6033
6253
|
];
|
|
6034
6254
|
}
|
|
@@ -6194,6 +6414,22 @@ class AXMConversationModule {
|
|
|
6194
6414
|
useClass: AXMConversationWidgetsProvider,
|
|
6195
6415
|
multi: true,
|
|
6196
6416
|
},
|
|
6417
|
+
{
|
|
6418
|
+
provide: AXP_SEARCH_PROVIDER,
|
|
6419
|
+
useClass: AXMConversationAssistSearchProvider,
|
|
6420
|
+
multi: true,
|
|
6421
|
+
},
|
|
6422
|
+
{
|
|
6423
|
+
provide: AXP_SEARCH_DEFINITION_PROVIDER,
|
|
6424
|
+
useClass: AXMConversationAssistSearchDefinitionProvider,
|
|
6425
|
+
multi: true,
|
|
6426
|
+
},
|
|
6427
|
+
provideCommandSetups([
|
|
6428
|
+
{
|
|
6429
|
+
key: CONVERSATION_START_ASSIST_CHAT_COMMAND,
|
|
6430
|
+
command: () => import('./acorex-modules-conversation-start-assist-chat.command-DRlWzEDp.mjs').then((m) => m.AXMConversationStartAssistChatCommand),
|
|
6431
|
+
},
|
|
6432
|
+
]),
|
|
6197
6433
|
], imports: [AXPWidgetCoreModule,
|
|
6198
6434
|
AXPWorkflowModule.forChild({
|
|
6199
6435
|
actions: {
|
|
@@ -6305,6 +6541,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
6305
6541
|
useClass: AXMConversationWidgetsProvider,
|
|
6306
6542
|
multi: true,
|
|
6307
6543
|
},
|
|
6544
|
+
{
|
|
6545
|
+
provide: AXP_SEARCH_PROVIDER,
|
|
6546
|
+
useClass: AXMConversationAssistSearchProvider,
|
|
6547
|
+
multi: true,
|
|
6548
|
+
},
|
|
6549
|
+
{
|
|
6550
|
+
provide: AXP_SEARCH_DEFINITION_PROVIDER,
|
|
6551
|
+
useClass: AXMConversationAssistSearchDefinitionProvider,
|
|
6552
|
+
multi: true,
|
|
6553
|
+
},
|
|
6554
|
+
provideCommandSetups([
|
|
6555
|
+
{
|
|
6556
|
+
key: CONVERSATION_START_ASSIST_CHAT_COMMAND,
|
|
6557
|
+
command: () => import('./acorex-modules-conversation-start-assist-chat.command-DRlWzEDp.mjs').then((m) => m.AXMConversationStartAssistChatCommand),
|
|
6558
|
+
},
|
|
6559
|
+
]),
|
|
6308
6560
|
],
|
|
6309
6561
|
}]
|
|
6310
6562
|
}] });
|
|
@@ -6313,5 +6565,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
6313
6565
|
* Generated bundle index. Do not edit.
|
|
6314
6566
|
*/
|
|
6315
6567
|
|
|
6316
|
-
export {
|
|
6317
|
-
//# sourceMappingURL=acorex-modules-conversation-acorex-modules-conversation-
|
|
6568
|
+
export { roomFactory as $, AXMChatAssistLauncherService as A, AXMConversationModule as B, AXMConversationTabEntityModule as C, AXMConversationTabService as D, AXMConversationTabServiceImpl as E, AXMMessageEntityModule as F, AXMMessageService as G, AXMMessageServiceImpl as H, AXMPermissionsKeys as I, AXMRoomEntityModule as J, AXMRoomService as K, AXMRoomServiceImpl as L, AXM_ASSIST_TRANSCRIPT_LINE_PAYLOAD_TYPE as M, AXPCommentWidget as N, COMMENTS_PAGE_COMPONENT_KEY as O, axmAssistLastTranscriptLine as P, axmAssistUserVisibleItemsForLine as Q, RootConfig as R, axmBuildAssistTranscriptLinePayload as S, axmIsAssistPeerParticipant as T, axmNormalizeAssistTranscriptForChatUi as U, axmNormalizeAssistTranscriptLineResponses as V, axmParseAssistTranscriptLinePayload as W, axmReadAssistAiTranscript as X, axmReadAssistAiTranscriptRaw as Y, commentsPlugin as Z, messageFactory as _, AXMCommentComponent as a, tabFactory as a0, axmAssistSegmentDirection as b, axmParseAssistTranscriptTextEnvelope as c, axmAssistWidgetNodeFromUnknown as d, axmSyntheticEmbedMessage as e, AXMNodeMessageRendererComponent as f, AXMAssistBotImageLineComponent as g, AXMChatComponent as h, AXMChatConversationApi as i, AXMChatManagementService as j, AXMChatMessageApi as k, AXMChatRealtimeApi as l, AXMChatRealtimeService as m, AXMChatRealtimeServiceImpl as n, AXMChatService as o, AXMChatServiceImpl as p, AXMChatUserApi as q, AXMCommentManagementService as r, AXMCommentPopupComponent as s, AXMCommentPopupStartAction as t, AXMCommentPopupWorkflow as u, AXMCommentRealtimeService as v, AXMCommentRealtimeServiceImpl as w, AXMCommentService as x, AXMCommentServiceImpl as y, AXMCommentWidgetViewComponent as z };
|
|
6569
|
+
//# sourceMappingURL=acorex-modules-conversation-acorex-modules-conversation-F7nQo1GU.mjs.map
|