@acorex-platform/extension-ai-conversation-client 0.0.46 → 0.0.49

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 (10) hide show
  1. package/fesm2022/{acorex-platform-extension-ai-conversation-client-acorex-platform-extension-ai-conversation-client-CTr53paj.mjs → acorex-platform-extension-ai-conversation-client-acorex-platform-extension-ai-conversation-client-DfdGeEG4.mjs} +262 -95
  2. package/fesm2022/acorex-platform-extension-ai-conversation-client-acorex-platform-extension-ai-conversation-client-DfdGeEG4.mjs.map +1 -0
  3. package/fesm2022/{acorex-platform-extension-ai-conversation-client-send-assist-chat-message.command-DIwe0Kes.mjs → acorex-platform-extension-ai-conversation-client-send-assist-chat-message.command-B6QodNVg.mjs} +2 -2
  4. package/fesm2022/{acorex-platform-extension-ai-conversation-client-send-assist-chat-message.command-DIwe0Kes.mjs.map → acorex-platform-extension-ai-conversation-client-send-assist-chat-message.command-B6QodNVg.mjs.map} +1 -1
  5. package/fesm2022/{acorex-platform-extension-ai-conversation-client-start-assist-chat.command-CQM2377i.mjs → acorex-platform-extension-ai-conversation-client-start-assist-chat.command-zQPeOCRi.mjs} +2 -2
  6. package/fesm2022/{acorex-platform-extension-ai-conversation-client-start-assist-chat.command-CQM2377i.mjs.map → acorex-platform-extension-ai-conversation-client-start-assist-chat.command-zQPeOCRi.mjs.map} +1 -1
  7. package/fesm2022/acorex-platform-extension-ai-conversation-client.mjs +1 -1
  8. package/package.json +3 -3
  9. package/types/acorex-platform-extension-ai-conversation-client.d.ts +8 -1
  10. package/fesm2022/acorex-platform-extension-ai-conversation-client-acorex-platform-extension-ai-conversation-client-CTr53paj.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-platform-extension-ai-conversation-client-start-assist-chat.command-CQM2377i.mjs","sources":["../../../../libs/extensions/ai/conversation/client/src/lib/commands/start-assist-chat.command.ts"],"sourcesContent":["import { AXPRuntimeCommandResult } from '@acorex-platform/framework-shared/core';\nimport { AXPCommand, type AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport { Injectable, inject } from '@angular/core';\nimport { AXMChatAssistLauncherService } from '../services/assist-chat-launcher.service';\nimport type { AXMStartAssistChatOptions, AXMStartAssistChatResult } from '../services/assist-chat-launcher.types';\n\n@Injectable({ providedIn: 'root' })\nexport class AXMConversationStartAssistChatCommand\n implements AXPCommand<AXMStartAssistChatOptions, AXMStartAssistChatResult | null>\n{\n private readonly launcher = inject(AXMChatAssistLauncherService);\n\n async execute(\n input: AXMStartAssistChatOptions | unknown,\n ): AXPCommandExecuteResultPromise<AXMStartAssistChatResult | null> {\n const raw = input as { options?: Partial<AXMStartAssistChatOptions> } & Record<string, unknown>;\n const options: Partial<AXMStartAssistChatOptions> = {\n ...(raw.options ?? {}),\n ...(raw as unknown as Partial<AXMStartAssistChatOptions>),\n };\n\n const targetId =\n (typeof options.targetId === 'string' ? options.targetId.trim() : '') ||\n (typeof options.assistId === 'string' ? options.assistId.trim() : '');\n if (!targetId) {\n return {\n success: false,\n message: { text: 'targetId is required for Conversation:StartAssistChat.' },\n };\n }\n\n const result = await this.launcher.startAssistChat({\n targetId,\n navigate: options.navigate,\n ...(options.launchContext ? { launchContext: options.launchContext } : {}),\n });\n\n if (!result) {\n return { success: false };\n }\n\n return { success: true, kind: 'object', data: result };\n }\n}\n"],"names":[],"mappings":";;;;MAOa,qCAAqC,CAAA;AADlD,IAAA,WAAA,GAAA;AAImB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,4BAA4B,CAAC;AAiCjE,IAAA;IA/BC,MAAM,OAAO,CACX,KAA0C,EAAA;QAE1C,MAAM,GAAG,GAAG,KAAmF;AAC/F,QAAA,MAAM,OAAO,GAAuC;AAClD,YAAA,IAAI,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;AACtB,YAAA,GAAI,GAAqD;SAC1D;QAED,MAAM,QAAQ,GACZ,CAAC,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE;aACnE,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC;QACvE,IAAI,CAAC,QAAQ,EAAE;YACb,OAAO;AACL,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,OAAO,EAAE,EAAE,IAAI,EAAE,wDAAwD,EAAE;aAC5E;QACH;QAEA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;YACjD,QAAQ;YACR,QAAQ,EAAE,OAAO,CAAC,QAAQ;AAC1B,YAAA,IAAI,OAAO,CAAC,aAAa,GAAG,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC;AAC3E,SAAA,CAAC;QAEF,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE;QAC3B;AAEA,QAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE;IACxD;8GAnCW,qCAAqC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAArC,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qCAAqC,cADxB,MAAM,EAAA,CAAA,CAAA;;2FACnB,qCAAqC,EAAA,UAAA,EAAA,CAAA;kBADjD,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;"}
1
+ {"version":3,"file":"acorex-platform-extension-ai-conversation-client-start-assist-chat.command-zQPeOCRi.mjs","sources":["../../../../libs/extensions/ai/conversation/client/src/lib/commands/start-assist-chat.command.ts"],"sourcesContent":["import { AXPRuntimeCommandResult } from '@acorex-platform/framework-shared/core';\nimport { AXPCommand, type AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport { Injectable, inject } from '@angular/core';\nimport { AXMChatAssistLauncherService } from '../services/assist-chat-launcher.service';\nimport type { AXMStartAssistChatOptions, AXMStartAssistChatResult } from '../services/assist-chat-launcher.types';\n\n@Injectable({ providedIn: 'root' })\nexport class AXMConversationStartAssistChatCommand\n implements AXPCommand<AXMStartAssistChatOptions, AXMStartAssistChatResult | null>\n{\n private readonly launcher = inject(AXMChatAssistLauncherService);\n\n async execute(\n input: AXMStartAssistChatOptions | unknown,\n ): AXPCommandExecuteResultPromise<AXMStartAssistChatResult | null> {\n const raw = input as { options?: Partial<AXMStartAssistChatOptions> } & Record<string, unknown>;\n const options: Partial<AXMStartAssistChatOptions> = {\n ...(raw.options ?? {}),\n ...(raw as unknown as Partial<AXMStartAssistChatOptions>),\n };\n\n const targetId =\n (typeof options.targetId === 'string' ? options.targetId.trim() : '') ||\n (typeof options.assistId === 'string' ? options.assistId.trim() : '');\n if (!targetId) {\n return {\n success: false,\n message: { text: 'targetId is required for Conversation:StartAssistChat.' },\n };\n }\n\n const result = await this.launcher.startAssistChat({\n targetId,\n navigate: options.navigate,\n ...(options.launchContext ? { launchContext: options.launchContext } : {}),\n });\n\n if (!result) {\n return { success: false };\n }\n\n return { success: true, kind: 'object', data: result };\n }\n}\n"],"names":[],"mappings":";;;;MAOa,qCAAqC,CAAA;AADlD,IAAA,WAAA,GAAA;AAImB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,4BAA4B,CAAC;AAiCjE,IAAA;IA/BC,MAAM,OAAO,CACX,KAA0C,EAAA;QAE1C,MAAM,GAAG,GAAG,KAAmF;AAC/F,QAAA,MAAM,OAAO,GAAuC;AAClD,YAAA,IAAI,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;AACtB,YAAA,GAAI,GAAqD;SAC1D;QAED,MAAM,QAAQ,GACZ,CAAC,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE;aACnE,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC;QACvE,IAAI,CAAC,QAAQ,EAAE;YACb,OAAO;AACL,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,OAAO,EAAE,EAAE,IAAI,EAAE,wDAAwD,EAAE;aAC5E;QACH;QAEA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;YACjD,QAAQ;YACR,QAAQ,EAAE,OAAO,CAAC,QAAQ;AAC1B,YAAA,IAAI,OAAO,CAAC,aAAa,GAAG,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC;AAC3E,SAAA,CAAC;QAEF,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE;QAC3B;AAEA,QAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE;IACxD;8GAnCW,qCAAqC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAArC,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qCAAqC,cADxB,MAAM,EAAA,CAAA,CAAA;;2FACnB,qCAAqC,EAAA,UAAA,EAAA,CAAA;kBADjD,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;"}
@@ -1,3 +1,3 @@
1
- export { a as AXCConversationAssistResponseService, b as AXEAIConversationExtensionModule, c as AXEConversationAssistResponseService, d as AXMContextualAssistLauncherService } from './acorex-platform-extension-ai-conversation-client-acorex-platform-extension-ai-conversation-client-CTr53paj.mjs';
1
+ export { a as AXCConversationAssistResponseService, b as AXEAIConversationExtensionModule, c as AXEConversationAssistResponseService, d as AXMContextualAssistLauncherService } from './acorex-platform-extension-ai-conversation-client-acorex-platform-extension-ai-conversation-client-DfdGeEG4.mjs';
2
2
  export { AXM_ASSIST_LAUNCH_CONTEXT_METADATA_KEY, AXM_CONTEXTUAL_ASSIST_ACTION_ENTITY_RECORD, AXM_CONTEXTUAL_ASSIST_KIND_ENTITY_RECORD, AXM_CONTEXTUAL_ASSIST_LAYOUT_JSON_KEY, AXM_CONTEXTUAL_ASSIST_MAX_LAYOUT_JSON_CHARS } from '@acorex-platform/module-conversation-client/contracts';
3
3
  //# sourceMappingURL=acorex-platform-extension-ai-conversation-client.mjs.map
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@acorex-platform/extension-ai-conversation-client",
3
- "version": "0.0.46",
3
+ "version": "0.0.49",
4
4
  "sideEffects": false,
5
5
  "peerDependencies": {
6
- "@acorex-platform/module-ai-management-client": "0.0.46",
7
- "@acorex-platform/module-conversation-client": "0.0.46",
6
+ "@acorex-platform/module-ai-management-client": "0.0.49",
7
+ "@acorex-platform/module-conversation-client": "0.0.49",
8
8
  "@angular/common": "^21.0.0 || ^22.0.0",
9
9
  "@angular/core": "^21.0.0 || ^22.0.0"
10
10
  },
@@ -1,6 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import * as i1 from '@acorex-platform/framework-client/core';
3
- import { AXMConversationAssistResponsePort } from '@acorex-platform/module-conversation-client';
3
+ import { AXMConversationAssistResponsePort, AXMMiniChatAssistSelection } from '@acorex-platform/module-conversation-client';
4
4
  import { AXConversationSendMessageCommand, AXConversationMessage } from '@acorex/components/conversation';
5
5
  import { AXMContextualAssistContext } from '@acorex-platform/module-conversation-client/contracts';
6
6
  export { AXMContextualAssistColumnValue, AXMContextualAssistContext, AXMEntityRecordAssistPayload, AXMFormTemplateDesignerAssistDataSourceRef, AXMFormTemplateDesignerAssistPayload, AXMFormTemplateDesignerAssistWidgetRef, AXM_ASSIST_LAUNCH_CONTEXT_METADATA_KEY, AXM_CONTEXTUAL_ASSIST_ACTION_ENTITY_RECORD, AXM_CONTEXTUAL_ASSIST_KIND_ENTITY_RECORD, AXM_CONTEXTUAL_ASSIST_LAYOUT_JSON_KEY, AXM_CONTEXTUAL_ASSIST_MAX_LAYOUT_JSON_CHARS } from '@acorex-platform/module-conversation-client/contracts';
@@ -109,10 +109,17 @@ declare const AXCConversationAssistResponseService: typeof AXEConversationAssist
109
109
  declare class AXMContextualAssistLauncherService {
110
110
  private readonly panelService;
111
111
  isOpen(): boolean;
112
+ /** True while the window is on screen (a retained hidden window is not visible). */
113
+ isVisible(): boolean;
112
114
  open(context: AXMContextualAssistContext, options?: {
113
115
  assistId?: string;
116
+ assistSelection?: AXMMiniChatAssistSelection;
114
117
  forceNewChat?: boolean;
118
+ minimizable?: boolean;
119
+ retainOnClose?: boolean;
115
120
  }): Promise<void>;
121
+ /** Hides a retained window, or destroys the window when retention is off. */
122
+ dismiss(): void;
116
123
  /** Closes the panel when it is open; otherwise opens it (restores the last thread). */
117
124
  toggle(context: AXMContextualAssistContext, options?: {
118
125
  assistId?: string;
@@ -1 +0,0 @@
1
- {"version":3,"file":"acorex-platform-extension-ai-conversation-client-acorex-platform-extension-ai-conversation-client-CTr53paj.mjs","sources":["../../../../libs/extensions/ai/conversation/client/src/lib/services/chat-assist-catalog.service.ts","../../../../libs/extensions/ai/conversation/client/src/lib/services/assist-chat-launcher.service.ts","../../../../libs/extensions/ai/conversation/client/src/lib/assist-search.provider.ts","../../../../libs/extensions/ai/conversation/client/src/lib/assist-search-definition.provider.ts","../../../../libs/extensions/ai/conversation/client/src/lib/empty-state/chat-empty-assist-composer.component.ts","../../../../libs/extensions/ai/conversation/client/src/lib/empty-state/chat-empty-state.provider.ts","../../../../libs/extensions/ai/conversation/client/src/lib/mini-chat/mini-chat-inbox-filter.provider.ts","../../../../libs/extensions/ai/conversation/client/src/lib/ports/assist-default-resolver.provider.ts","../../../../libs/extensions/ai/conversation/client/src/lib/services/conversation-assist-response.service.ts","../../../../libs/extensions/ai/conversation/client/src/lib/side-bar/chat-with-assist-dialog.component.ts","../../../../libs/extensions/ai/conversation/client/src/lib/side-bar/chat-sidebar-assist-action.provider.ts","../../../../libs/extensions/ai/conversation/client/src/lib/contextual-assist/contextual-assist-launcher.service.ts","../../../../libs/extensions/ai/conversation/client/src/lib/ai-conversation-extension.module.ts","../../../../libs/extensions/ai/conversation/client/src/acorex-platform-extension-ai-conversation-client.ts"],"sourcesContent":["//#region ---- Imports ----\n\nimport { Injectable, inject } from '@angular/core';\nimport type { AXPMultiLanguageString } from '@acorex-platform/framework-shared/core';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport type { AXMChatAiTargetRow } from '@acorex-platform/module-conversation-client';\nimport {\n AXM_AI_MANAGEMENT_ASSIST_ENTITY_NAME,\n AXM_AI_MANAGEMENT_MODULE_NAME,\n} from '@acorex-platform/module-conversation-client';\nimport type {\n AXMAssistConversationSnapshotLite,\n AXPAiEffectiveAssistRowLite,\n} from '@acorex-platform/module-conversation-client';\n\n//#endregion\n\n//#region ---- Service ----\n\n/**\n * In-memory assist catalog for chat pickers and welcome UI (AI extension).\n * Loads assist rows once via Query and dedupes GetById for starter prompts / metadata.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXMChatAssistCatalogService {\n //#region ---- Services & Dependencies -----\n\n private readonly entityService = inject(AXPEntityService);\n private readonly assistData = this.entityService\n .withEntity(AXM_AI_MANAGEMENT_MODULE_NAME, AXM_AI_MANAGEMENT_ASSIST_ENTITY_NAME)\n .data<\n string,\n AXPAiEffectiveAssistRowLite,\n AXPAiEffectiveAssistRowLite,\n AXPAiEffectiveAssistRowLite,\n AXPAiEffectiveAssistRowLite\n >();\n\n //#endregion\n\n //#region ---- State Signals -----\n\n private catalogTargets: AXMChatAiTargetRow[] | null = null;\n private readonly fullRowsById = new Map<string, AXPAiEffectiveAssistRowLite>();\n private loadPromise: Promise<AXMChatAiTargetRow[]> | null = null;\n private readonly byKeyChains = new Map<string, Promise<AXPAiEffectiveAssistRowLite | null>>();\n\n //#endregion\n\n //#region ---- Catalog ----\n\n async loadCatalogTargets(force = false): Promise<AXMChatAiTargetRow[]> {\n // Never treat an empty first paint as a permanent cache — early opens can race entity readiness.\n if (!force && this.catalogTargets != null && this.catalogTargets.length > 0) {\n return this.catalogTargets;\n }\n if (!force && this.loadPromise) {\n return this.loadPromise;\n }\n\n this.loadPromise = this.fetchCatalogTargets();\n try {\n this.catalogTargets = await this.loadPromise;\n return this.catalogTargets;\n } finally {\n this.loadPromise = null;\n }\n }\n\n private async fetchCatalogTargets(): Promise<AXMChatAiTargetRow[]> {\n const queryResult = await this.assistData.query({\n skip: 0,\n take: 500,\n });\n const items = (queryResult?.items ?? []) as AXPAiEffectiveAssistRowLite[];\n const targets: AXMChatAiTargetRow[] = [];\n\n for (const item of items) {\n const id = String(item.id ?? '').trim();\n if (!id) {\n continue;\n }\n this.fullRowsById.set(id, item);\n targets.push(this.toTargetRow(item));\n }\n\n return targets.sort((a, b) => a.name.localeCompare(b.name, undefined, { sensitivity: 'base' }));\n }\n\n private toTargetRow(item: AXPAiEffectiveAssistRowLite): AXMChatAiTargetRow {\n const id = String(item.id ?? '').trim();\n return {\n id,\n name: String(item.name ?? ''),\n title: (item.title ?? item.name ?? id) as AXPMultiLanguageString | string,\n description: item.description as AXPMultiLanguageString | string | undefined,\n professionImageUrl:\n typeof item.professionImageUrl === 'string' ? item.professionImageUrl : undefined,\n };\n }\n\n //#endregion\n\n //#region ---- Assist reads ----\n\n getCachedAssist(assistId: string): AXPAiEffectiveAssistRowLite | null {\n const scoped = assistId?.trim();\n if (!scoped) {\n return null;\n }\n return this.fullRowsById.get(scoped) ?? null;\n }\n\n async getAssist(assistId: string): Promise<AXPAiEffectiveAssistRowLite | null> {\n const scoped = assistId?.trim();\n if (!scoped) {\n return null;\n }\n\n const cached = this.fullRowsById.get(scoped);\n if (cached) {\n return cached;\n }\n\n const inflight = this.byKeyChains.get(scoped);\n if (inflight) {\n return inflight;\n }\n\n const task = this.assistData.byKey(scoped).then((row) => {\n if (row) {\n this.fullRowsById.set(scoped, row);\n }\n return row ?? null;\n });\n this.byKeyChains.set(scoped, task);\n try {\n return await task;\n } finally {\n if (this.byKeyChains.get(scoped) === task) {\n this.byKeyChains.delete(scoped);\n }\n }\n }\n\n primeAssist(row: AXPAiEffectiveAssistRowLite): void {\n const id = row.id?.trim();\n if (!id) {\n return;\n }\n this.fullRowsById.set(id, row);\n }\n\n toSnapshot(row: AXPAiEffectiveAssistRowLite): AXMAssistConversationSnapshotLite {\n return {\n initialMessages: row.initialMessages,\n starterPrompts: row.starterPrompts,\n modelId: row.modelId,\n };\n }\n\n //#endregion\n}\n\n//#endregion\n","import { AXConversation, AXConversationService } from '@acorex/components/conversation';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPMultiLanguageString } from '@acorex-platform/framework-shared/core';\nimport {\n axmBuildAiChatConversationMetadata,\n axmChatAiPeerParticipantId,\n axmChatAiTargetAvatarUrl,\n axmChatAiTargetDisplayDescription,\n axmChatAiTargetDisplayName,\n axmFilterChatAiTargets,\n AXMConversationEntityStoreService,\n AXMEntityChatService,\n axmEntityRefFromLaunchContext,\n type AXMChatAiTargetRow,\n} from '@acorex-platform/module-conversation-client';\nimport {\n AXM_ASSIST_LAUNCH_CONTEXT_METADATA_KEY,\n axmSanitizeContextualAssistContext,\n type AXMContextualAssistContext,\n} from '@acorex-platform/module-conversation-client/contracts';\nimport { AXMChatAssistCatalogService } from './chat-assist-catalog.service';\nimport { Injectable, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport type { AXMStartAssistChatOptions, AXMStartAssistChatResult } from './assist-chat-launcher.types';\n\n@Injectable({ providedIn: 'root' })\nexport class AXMChatAssistLauncherService {\n private readonly conversationService = inject(AXConversationService);\n private readonly entityChatService = inject(AXMEntityChatService);\n private readonly assistCatalog = inject(AXMChatAssistCatalogService);\n private readonly entityStore = inject(AXMConversationEntityStoreService);\n private readonly translationService = inject(AXTranslationService);\n private readonly sessionService = inject(AXPSessionService);\n private readonly router = inject(Router);\n private readonly toastService = inject(AXToastService);\n\n async loadTargets(force = false): Promise<AXMChatAiTargetRow[]> {\n return this.assistCatalog.loadCatalogTargets(force);\n }\n\n displayName(row: AXMChatAiTargetRow): string {\n return axmChatAiTargetDisplayName(this.#resolveMl.bind(this), row);\n }\n\n displayDescription(row: AXMChatAiTargetRow): string | undefined {\n return axmChatAiTargetDisplayDescription(this.#resolveMl.bind(this), row);\n }\n\n targetAvatarUrl(row: AXMChatAiTargetRow): string | null {\n return axmChatAiTargetAvatarUrl(row);\n }\n\n filterTargets(rows: AXMChatAiTargetRow[], query: string): AXMChatAiTargetRow[] {\n return axmFilterChatAiTargets(this.#resolveMl.bind(this), rows, query);\n }\n\n async startAssistChat(options: AXMStartAssistChatOptions): Promise<AXMStartAssistChatResult | null> {\n const targetId = (options.targetId ?? options.assistId)?.trim();\n if (!targetId) {\n return null;\n }\n\n const row = options.targetRow ?? (await this.loadTargets()).find((r) => r.id === targetId);\n if (!row) {\n const message = await this.translationService.translateAsync('@conversation:chat.assist-dialog.errors.start-chat');\n this.toastService.danger(message);\n return null;\n }\n\n return this.startAssistChatFromRow(row, options.navigate !== false, options.launchContext);\n }\n\n async startAssistChatFromRow(\n row: AXMChatAiTargetRow,\n navigate = true,\n launchContext?: AXMContextualAssistContext,\n ): Promise<AXMStartAssistChatResult | null> {\n try {\n const conversation = await this.#createTargetConversation(row, launchContext);\n await this.conversationService.selectConversation(conversation.id);\n if (navigate) {\n await this.navigateToConversation(conversation.id);\n }\n\n return { conversation };\n } catch (error: unknown) {\n console.error('Failed to start AI chat:', error);\n const message = await this.translationService.translateAsync('@conversation:chat.assist-dialog.errors.start-chat');\n this.toastService.danger(message);\n return null;\n }\n }\n\n /** Navigate after the picker dialog has emitted close — avoids ObjectUnsubscribedError on popup teardown. */\n async navigateToConversation(conversationId: string): Promise<void> {\n const scoped = conversationId.trim();\n if (!scoped) {\n return;\n }\n await this.router.navigate([this.#applicationRouteSegment(), 'chat', scoped]);\n }\n\n async #createTargetConversation(\n row: AXMChatAiTargetRow,\n launchContext?: AXMContextualAssistContext,\n ): Promise<AXConversation> {\n await this.assistCatalog.loadCatalogTargets();\n const participantId = axmChatAiPeerParticipantId(row.id);\n const title = this.displayName(row);\n const avatar = this.targetAvatarUrl(row);\n const assistRow = this.assistCatalog.getCachedAssist(row.id);\n const assistSnapshot = assistRow ? this.assistCatalog.toSnapshot(assistRow) : undefined;\n const metadata = axmBuildAiChatConversationMetadata(row, assistSnapshot);\n if (launchContext) {\n metadata[AXM_ASSIST_LAUNCH_CONTEXT_METADATA_KEY] = axmSanitizeContextualAssistContext(launchContext);\n }\n\n const entityRef = axmEntityRefFromLaunchContext(launchContext);\n if (entityRef) {\n return this.entityChatService.createEntityChat(entityRef, row.id, metadata);\n }\n\n const conversation = await this.conversationService.createConversation([participantId], 'bot', {\n title,\n ...(avatar ? { avatar } : {}),\n icon: 'fa-solid fa-robot',\n metadata,\n });\n this.entityStore.cacheConversation(conversation);\n this.entityStore.cacheEmptyMessageList(conversation.id);\n return conversation;\n }\n\n #resolveMl(value: AXPMultiLanguageString): string | undefined {\n return this.translationService.resolve(value);\n }\n\n #applicationRouteSegment(): string {\n return this.sessionService.application?.name ?? 'platform';\n }\n}\n","import { AXPSearchProvider, AXPSearchResult } from '@acorex-platform/framework-client/common';\nimport {\n axmChatAiTargetShortcutDescriptionKey,\n type AXMChatAiTargetRow,\n CONVERSATION_START_ASSIST_CHAT_COMMAND,\n} from '@acorex-platform/module-conversation-client';\nimport { inject, Injectable } from '@angular/core';\nimport { sortBy } from 'lodash-es';\nimport { AXMChatAssistLauncherService } from './services/assist-chat-launcher.service';\n\n/** Search group key used by Conversation AI extension. */\nexport const AXM_CONVERSATION_ASSIST_SEARCH_GROUP = 'conversation-assist';\n\n@Injectable()\nexport class AXMConversationAssistSearchProvider implements AXPSearchProvider {\n private readonly launcher = inject(AXMChatAssistLauncherService);\n\n async search(text: string): Promise<AXPSearchResult[]> {\n let rows: AXMChatAiTargetRow[];\n try {\n rows = await this.launcher.loadTargets();\n } catch (error: unknown) {\n console.error('Failed to load AI chat targets for shortcut search:', error);\n return [];\n }\n\n const filtered = this.launcher.filterTargets(rows, text);\n const sorted = sortBy(filtered, (row) => this.launcher.displayName(row).toLowerCase());\n\n return sorted.map<AXPSearchResult>((row) => ({\n id: row.id,\n group: AXM_CONVERSATION_ASSIST_SEARCH_GROUP,\n title: row.title,\n description: row.description ?? axmChatAiTargetShortcutDescriptionKey(),\n icon: 'fa-solid fa-robot',\n data: { id: row.id, name: row.name },\n command: {\n name: CONVERSATION_START_ASSIST_CHAT_COMMAND,\n options: {\n targetId: row.id,\n },\n },\n }));\n }\n}\n","import { AXPSearchDefinitionProvider, AXPSearchDefinitionProviderContext } from '@acorex-platform/framework-client/common';\nimport { AXPSystemActionType } from '@acorex-platform/framework-shared/core';\nimport { Injectable } from '@angular/core';\nimport { AXM_CONVERSATION_ASSIST_SEARCH_GROUP } from './assist-search.provider';\n\n@Injectable()\nexport class AXMConversationAssistSearchDefinitionProvider implements AXPSearchDefinitionProvider {\n async provide(context: AXPSearchDefinitionProviderContext): Promise<void> {\n context.addDefinition(\n AXM_CONVERSATION_ASSIST_SEARCH_GROUP,\n '@conversation:search.assist.group-title',\n AXM_CONVERSATION_ASSIST_SEARCH_GROUP,\n 'fa-solid fa-robot',\n 4,\n {\n format: {\n id: '{{id}}',\n },\n actions: [\n {\n name: 'start-assist-chat',\n type: AXPSystemActionType.View,\n priority: 'primary',\n },\n ],\n },\n );\n }\n}\n","import { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport { AXPMultiLanguageString, runtimeCommandPayloadData } from '@acorex-platform/framework-shared/core';\nimport { AIMANAGEMENT_STRUCTURED_TEXT_COMPLETION_COMMAND_KEY, axpAiChatTextMessage } from '@acorex-platform/module-ai-management-client/contracts';\nimport {\n AXMAssistSuggestionChipsComponent,\n AXMChatComposerAssistPickerComponent,\n AXM_ASSIST_DEFAULT_RESOLVER_PORT,\n AXMChatEmptyAssistSessionService,\n axmAssistStarterPromptChipItems,\n axmEntityRefFromLaunchContext,\n type AXMChatAiTargetRow,\n type AXMChatEmptyAssistCreatedHandler,\n type AXMEntityChatRef,\n type AXPAiChatFollowUpItemLite,\n} from '@acorex-platform/module-conversation-client';\nimport {\n AXM_CONTEXTUAL_ASSIST_STARTER_SYSTEM_PROMPT,\n axmBuildContextualAssistStarterUserPrompt,\n axmParseContextualAssistStarterItems,\n axmSanitizeContextualAssistContext,\n type AXMContextualAssistContext,\n} from '@acorex-platform/module-conversation-client/contracts';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXConversationService } from '@acorex/components/conversation';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXDropdownModule } from '@acorex/components/dropdown';\nimport { AXLoadingModule } from '@acorex/components/loading';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXLocaleService } from '@acorex/core/locale';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, DestroyRef, ElementRef, computed, effect, inject, input, output, signal, viewChild } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { AXMChatAssistCatalogService } from '../services/chat-assist-catalog.service';\n\nconst FALLBACK_CHIP_KEYS = ['@conversation:chat.contextual-assist.fallback.summarize', '@conversation:chat.contextual-assist.fallback.what-can-i-change', '@conversation:chat.contextual-assist.fallback.explain-record'] as const;\n\ntype AXMChatEmptyDraftKind = 'image' | 'video' | 'audio' | 'file';\n\ninterface AXMChatEmptyDraftFile {\n id: string;\n file: File;\n kind: AXMChatEmptyDraftKind;\n preview?: string;\n}\n\nconst DRAFT_KIND_ICONS: Record<AXMChatEmptyDraftKind, string> = {\n image: 'fa-light fa-image',\n video: 'fa-light fa-video',\n audio: 'fa-light fa-music',\n file: 'fa-light fa-file',\n};\n\nconst MAX_EMPTY_DRAFT_FILES = 3;\n\n@Component({\n selector: 'axm-chat-empty-assist-composer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'axm-chat-empty-assist-composer-host',\n '[class.axm-chat-empty-assist-composer-host--compact]': 'compact()',\n '[attr.dir]': 'textDirection()',\n '[style.direction]': 'textDirection()',\n },\n imports: [\n CommonModule,\n FormsModule,\n AXButtonModule,\n AXDecoratorModule,\n AXDropdownModule,\n AXLoadingModule,\n AXTranslationModule,\n AXMAssistSuggestionChipsComponent,\n AXMChatComposerAssistPickerComponent,\n ],\n template: `\n <div class=\"axm-chat-empty-assist-composer\">\n <div class=\"axm-chat-empty-assist-composer__hero\">\n @if (compact()) {\n <span class=\"axm-chat-empty-assist-composer__hero-icon\" aria-hidden=\"true\">\n <ax-icon icon=\"fa-regular fa-sparkles\"></ax-icon>\n </span>\n }\n <div class=\"axm-chat-empty-assist-composer__caption\">\n {{ (compact() ? '@conversation:mini-chat.empty.title' : '@conversation:chat.empty-assist.caption') | translate | async }}\n </div>\n @if (compact()) {\n <p class=\"axm-chat-empty-assist-composer__subtitle\">\n {{ '@conversation:mini-chat.empty.subtitle' | translate | async }}\n </p>\n }\n </div>\n\n <!-- ----- Lookalike composer: attach and type stay local until send ----- -->\n @if (!hasActiveConversation()) {\n <div class=\"axm-chat-empty-assist-composer__composer\">\n <!---->\n <!-- ----- Local attachment chips before the first message is sent ----- -->\n @if (draftFiles().length > 0) {\n <div class=\"axm-chat-empty-assist-composer__attachments\">\n <div class=\"axm-chat-empty-assist-composer__attachments-scroll\" role=\"list\">\n @for (attachment of draftFiles(); track attachment.id) {\n <div\n class=\"axm-chat-empty-assist-composer__attachment\"\n role=\"listitem\"\n [class.axm-chat-empty-assist-composer__attachment--media]=\"attachment.kind === 'image' || attachment.kind === 'video'\"\n [class.axm-chat-empty-assist-composer__attachment--file]=\"attachment.kind === 'audio' || attachment.kind === 'file'\"\n [title]=\"attachment.file.name\"\n >\n <!---->\n <!-- ----- Image thumbnail ----- -->\n @if (attachment.kind === 'image' && attachment.preview) {\n <span class=\"axm-chat-empty-assist-composer__attachment-thumb\" aria-hidden=\"true\">\n <img [src]=\"attachment.preview\" alt=\"\" />\n </span>\n }\n <!-- ----- Video thumbnail ----- -->\n @else if (attachment.kind === 'video' && attachment.preview) {\n <span class=\"axm-chat-empty-assist-composer__attachment-thumb\" aria-hidden=\"true\">\n <video [src]=\"attachment.preview\" muted playsinline preload=\"metadata\"></video>\n </span>\n }\n <!-- ----- File name fallback ----- -->\n @else {\n <span class=\"axm-chat-empty-assist-composer__attachment-icon\" aria-hidden=\"true\">\n <i [class]=\"draftFileIcon(attachment.kind)\"></i>\n </span>\n <span class=\"axm-chat-empty-assist-composer__attachment-name\">{{ attachment.file.name }}</span>\n }\n <button\n type=\"button\"\n class=\"axm-chat-empty-assist-composer__attachment-remove\"\n [attr.aria-label]=\"('@acorex:chat.actions.remove-attachment' | translate | async) ?? ''\"\n (click)=\"removeDraftFile(attachment.id); $event.stopPropagation()\"\n >\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n }\n <button\n type=\"button\"\n class=\"axm-chat-empty-assist-composer__attachment-add\"\n [disabled]=\"isBusy() || draftFiles().length >= maxDraftFiles\"\n [attr.aria-label]=\"('@acorex:chat.pickers.common.add-more' | translate | async) ?? ''\"\n (click)=\"browseDraftFiles()\"\n >\n <i class=\"fa-light fa-plus\"></i>\n </button>\n </div>\n </div>\n }\n <div class=\"axm-chat-empty-assist-composer__input-row\">\n <div class=\"axm-chat-empty-assist-composer__actions-start\">\n <ax-button\n class=\"rounded-full text-xl\"\n look=\"blank\"\n [iconOnly]=\"true\"\n [disabled]=\"isBusy() || draftFiles().length >= maxDraftFiles\"\n [text]=\"('@acorex:chat.tooltips.attach-file' | translate | async) ?? ''\"\n (onClick)=\"browseDraftFiles()\"\n >\n <ax-prefix>\n <i class=\"fa-light fa-paperclip\"></i>\n </ax-prefix>\n </ax-button>\n <ax-button\n class=\"rounded-full axm-chat-composer-assist-picker\"\n look=\"blank\"\n [iconOnly]=\"true\"\n [disabled]=\"isBusy() || rows().length === 0\"\n [text]=\"('@conversation:chat.empty-assist.assist-default' | translate | async) ?? ''\"\n >\n <ax-prefix>\n <i class=\"fa-light fa-sparkles\"></i>\n </ax-prefix>\n <!---->\n <!-- ----- Assist list as a dropdown, not a popup ----- -->\n @if (rows().length > 0) {\n <ax-dropdown-panel>\n <axm-chat-composer-assist-picker />\n </ax-dropdown-panel>\n }\n </ax-button>\n </div>\n <textarea\n #draftInput\n rows=\"1\"\n class=\"axm-chat-empty-assist-composer__textarea\"\n [ngModel]=\"draftText()\"\n (ngModelChange)=\"draftText.set($event ?? '')\"\n (input)=\"resizeDraftInput()\"\n (keydown)=\"onDraftKeydown($event)\"\n [disabled]=\"isBusy()\"\n [placeholder]=\"draftPlaceholder()\"\n ></textarea>\n <div class=\"axm-chat-empty-assist-composer__primary\">\n <ax-button\n class=\"rounded-full\"\n [class.composer-primary-button--send]=\"canSend()\"\n look=\"blank\"\n color=\"primary\"\n [iconOnly]=\"true\"\n [disabled]=\"!canSend()\"\n [text]=\"('@acorex:chat.actions.send' | translate | async) ?? ''\"\n (onClick)=\"send()\"\n >\n <ax-prefix>\n <i class=\"fa-solid fa-paper-plane-top\"></i>\n </ax-prefix>\n </ax-button>\n </div>\n </div>\n <input #fileInput class=\"axm-chat-empty-assist-composer__file-input\" type=\"file\" multiple (change)=\"onDraftFilesSelected($event)\" />\n </div>\n }\n\n <!-- ----- Starter chips loading indicator ----- -->\n @if (chipsLoading()) {\n <div class=\"axm-chat-empty-assist-composer__chips-loading\">\n <ax-loading></ax-loading>\n <p class=\"axm-chat-empty-assist-composer__suggestions-label\">\n {{ '@conversation:chat.contextual-assist.chips-loading' | translate | async }}\n </p>\n </div>\n }\n <!-- ----- Starter suggestion chips ----- -->\n @else if (starterPromptItems().length > 0) {\n <div class=\"axm-chat-empty-assist-composer__suggestions\">\n <!---->\n <!-- ----- Compact starter section label ----- -->\n @if (compact()) {\n <p class=\"axm-chat-empty-assist-composer__suggestions-label\">\n {{ '@conversation:mini-chat.try-asking' | translate | async }}\n </p>\n }\n <axm-assist-suggestion-chips [items]=\"starterPromptItems()\" [compact]=\"compact()\" [sendInPlace]=\"sendStarterPromptsInPlace()\" [disabled]=\"loading()\" (conversationCreated)=\"conversationCreated.emit($event)\" />\n </div>\n }\n </div>\n `,\n styles: `\n :host {\n display: block;\n width: 100%;\n }\n\n :host(.axm-chat-empty-assist-composer-host--compact) {\n display: flex;\n height: 100%;\n min-height: 0;\n }\n\n .axm-chat-empty-assist-composer {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n width: min(100%, 64rem);\n margin-inline: auto;\n }\n\n .axm-chat-empty-assist-composer__hero {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.625rem;\n }\n\n .axm-chat-empty-assist-composer__hero-icon {\n display: grid;\n place-items: center;\n width: 2.5rem;\n height: 2.5rem;\n border-radius: 0.875rem;\n color: rgb(var(--ax-sys-color-primary-600));\n background: linear-gradient(145deg, rgba(var(--ax-sys-color-primary-500), 0.14), rgba(var(--ax-sys-color-primary-500), 0.04));\n border: 1px solid rgba(var(--ax-sys-color-primary-500), 0.18);\n }\n\n .axm-chat-empty-assist-composer__composer {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n overflow: hidden;\n border-radius: 2em;\n border: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n background: rgb(var(--ax-sys-color-lightest-surface));\n }\n\n .axm-chat-empty-assist-composer__attachments {\n display: flex;\n align-items: center;\n width: 100%;\n min-width: 0;\n padding: 0.625rem 0.75rem 0.5rem;\n border-bottom: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n }\n\n .axm-chat-empty-assist-composer__attachments-scroll {\n display: flex;\n flex: 1 1 auto;\n flex-wrap: nowrap;\n align-items: center;\n gap: 0.5rem;\n min-width: 0;\n width: 0;\n overflow-x: auto;\n overflow-y: hidden;\n padding-block: 0.5rem;\n scrollbar-width: thin;\n }\n\n .axm-chat-empty-assist-composer__attachment {\n position: relative;\n display: flex;\n flex-shrink: 0;\n align-items: center;\n }\n\n .axm-chat-empty-assist-composer__attachment--file {\n width: 11rem;\n max-width: 11rem;\n height: 2.75rem;\n gap: 0.5rem;\n padding-inline: 0.5rem 1.75rem;\n border-radius: 0.5rem;\n border: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n background: rgb(var(--ax-sys-color-surface));\n }\n\n .axm-chat-empty-assist-composer__attachment-thumb {\n display: flex;\n width: 2.75rem;\n height: 2.75rem;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n border-radius: 0.5rem;\n border: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n background: rgb(var(--ax-sys-color-surface));\n }\n\n .axm-chat-empty-assist-composer__attachment-thumb img,\n .axm-chat-empty-assist-composer__attachment-thumb video {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n .axm-chat-empty-assist-composer__attachment-icon {\n display: flex;\n width: 1.75rem;\n height: 1.75rem;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n font-size: 0.875rem;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.8;\n }\n\n .axm-chat-empty-assist-composer__attachment-name {\n min-width: 0;\n flex: 1 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 0.8125rem;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .axm-chat-empty-assist-composer__attachment-remove {\n position: absolute;\n inset-block-start: -0.35rem;\n inset-inline-end: -0.35rem;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 1.25rem;\n height: 1.25rem;\n padding: 0;\n border: none;\n border-radius: 9999px;\n background: rgb(var(--ax-sys-color-danger-500));\n color: rgb(var(--ax-sys-color-lightest-surface));\n font-size: 0.625rem;\n cursor: pointer;\n }\n\n .axm-chat-empty-assist-composer__attachment-add {\n display: flex;\n width: 2.75rem;\n height: 2.75rem;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n padding: 0;\n border-radius: 0.5rem;\n border: 1px dashed rgb(var(--ax-sys-color-border-light-surface));\n background: transparent;\n color: rgb(var(--ax-sys-color-on-surface));\n font-size: 1rem;\n cursor: pointer;\n }\n\n .axm-chat-empty-assist-composer__attachment-add:disabled {\n cursor: default;\n opacity: 0.4;\n }\n\n .axm-chat-empty-assist-composer__input-row {\n display: flex;\n width: 100%;\n min-width: 0;\n align-items: center;\n gap: 0.5rem;\n padding: 0.25rem 0.5rem;\n }\n\n .axm-chat-empty-assist-composer__actions-start,\n .axm-chat-empty-assist-composer__primary {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n gap: 0.25rem;\n }\n\n .axm-chat-empty-assist-composer__actions-start ax-icon i,\n .axm-chat-empty-assist-composer__actions-start ax-prefix i,\n .axm-chat-empty-assist-composer__primary ax-prefix i {\n font-size: 1.375rem;\n line-height: 1;\n }\n\n .axm-chat-empty-assist-composer__textarea {\n flex: 1 1 auto;\n min-width: 0;\n min-height: 2.25rem;\n max-height: 14rem;\n margin: 0;\n padding-block: 0.25rem;\n border: none;\n outline: none;\n resize: none;\n overflow: hidden;\n background: transparent;\n font-size: inherit;\n line-height: 1.5;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .axm-chat-empty-assist-composer__textarea::placeholder {\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.45;\n }\n\n .axm-chat-empty-assist-composer__file-input {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n }\n\n .axm-chat-empty-assist-composer__caption {\n margin-bottom: 1.25rem;\n text-align: center;\n font-size: clamp(1.9rem, 3.4vw, 2.7rem);\n line-height: 1.15;\n font-weight: 700;\n letter-spacing: -0.02em;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .axm-chat-empty-assist-composer__suggestions {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n }\n\n .axm-chat-empty-assist-composer__suggestions-label {\n margin: 0;\n padding-inline: 0.125rem;\n font-size: 0.6875rem;\n font-weight: 600;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.52;\n }\n\n .axm-chat-empty-assist-composer__chips-loading {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.5rem;\n padding-block: 0.5rem;\n }\n\n :host(.axm-chat-empty-assist-composer-host--compact) .axm-chat-empty-assist-composer {\n width: 100%;\n max-width: none;\n height: 100%;\n min-height: 0;\n gap: 0.875rem;\n justify-content: center;\n overflow: hidden;\n padding-block: 0.5rem 0.125rem;\n }\n\n :host(.axm-chat-empty-assist-composer-host--compact) .axm-chat-empty-assist-composer__hero {\n flex-shrink: 0;\n gap: 0.5rem;\n padding-block-start: 0.5rem;\n }\n\n :host(.axm-chat-empty-assist-composer-host--compact) .axm-chat-empty-assist-composer__hero-icon {\n width: 2.5rem;\n height: 2.5rem;\n border-radius: 0.875rem;\n color: rgb(var(--ax-sys-color-primary-600));\n }\n\n :host(.axm-chat-empty-assist-composer-host--compact) .axm-chat-empty-assist-composer__caption {\n margin-bottom: 0;\n font-size: 1.125rem;\n line-height: 1.3;\n font-weight: 700;\n letter-spacing: -0.03em;\n }\n\n :host(.axm-chat-empty-assist-composer-host--compact) .axm-chat-empty-assist-composer__composer {\n flex-shrink: 0;\n width: 100%;\n border-radius: 1.5rem;\n border-color: rgba(var(--ax-sys-color-border-light-surface), 0.95);\n }\n\n :host(.axm-chat-empty-assist-composer-host--compact) .axm-chat-empty-assist-composer__textarea {\n min-height: 1.625rem;\n max-height: 8rem;\n font-size: 0.875rem;\n line-height: 1.4;\n }\n\n :host(.axm-chat-empty-assist-composer-host--compact) .axm-chat-empty-assist-composer__subtitle {\n margin: 0;\n max-width: 20rem;\n text-align: center;\n font-size: 0.8125rem;\n line-height: 1.5;\n font-weight: 400;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.58;\n }\n\n :host(.axm-chat-empty-assist-composer-host--compact) .axm-chat-empty-assist-composer__suggestions,\n :host(.axm-chat-empty-assist-composer-host--compact) .axm-chat-empty-assist-composer__chips-loading {\n display: flex;\n flex-direction: column;\n flex: 0 1 auto;\n min-height: 0;\n overflow: auto;\n justify-content: flex-start;\n }\n\n :host(.axm-chat-empty-assist-composer-host--compact) .axm-chat-empty-assist-composer__suggestions {\n gap: 0.5rem;\n margin-top: 0.125rem;\n }\n\n :host(.axm-chat-empty-assist-composer-host--compact) .axm-chat-empty-assist-composer__suggestions-label {\n flex-shrink: 0;\n margin-block-end: 0.125rem;\n letter-spacing: 0.02em;\n text-transform: none;\n font-size: 0.75rem;\n font-weight: 500;\n opacity: 0.55;\n }\n\n :host(.axm-chat-empty-assist-composer-host--compact) axm-assist-suggestion-chips {\n flex: 0 1 auto;\n min-height: 0;\n overflow: hidden;\n }\n `,\n})\nexport class AXMChatEmptyAssistComposerComponent {\n //#region ----- Services & Dependencies -----\n\n private readonly commandService = inject(AXPCommandService);\n private readonly toastService = inject(AXToastService);\n private readonly translationService = inject(AXTranslationService);\n private readonly localeService = inject(AXLocaleService);\n private readonly assistCatalog = inject(AXMChatAssistCatalogService);\n private readonly emptyAssistSession = inject(AXMChatEmptyAssistSessionService);\n private readonly conversationService = inject(AXConversationService);\n private readonly defaultAssistResolver = inject(AXM_ASSIST_DEFAULT_RESOLVER_PORT, { optional: true });\n private readonly destroyRef = inject(DestroyRef);\n private readonly draftInput = viewChild<ElementRef<HTMLTextAreaElement>>('draftInput');\n private readonly fileInput = viewChild<ElementRef<HTMLInputElement>>('fileInput');\n\n //#endregion\n\n //#region ----- Inputs / Outputs -----\n\n readonly conversationCreated = output<string>();\n readonly initialAssistId = input<string | undefined>(undefined);\n readonly entityId = input<string | undefined>(undefined);\n readonly entityType = input<string | undefined>(undefined);\n readonly sendStarterPromptsInPlace = input(false);\n readonly launchContext = input<AXMContextualAssistContext | undefined>(undefined);\n readonly compact = input(false);\n readonly assistConversationCreated = input<AXMChatEmptyAssistCreatedHandler | undefined>(undefined);\n\n //#endregion\n\n //#region ----- State Signals -----\n\n private readonly localeProfile = toSignal(this.localeService.profileChanged$, {\n initialValue: this.localeService.activeProfile(),\n });\n\n readonly textDirection = computed(() => (this.localeProfile()?.i18nMeta?.rtl === true ? 'rtl' : 'ltr'));\n readonly hasActiveConversation = computed(() => Boolean(this.conversationService.activeConversationId()?.trim()));\n readonly rows = signal<AXMChatAiTargetRow[]>([]);\n readonly loading = signal(true);\n readonly sending = signal(false);\n readonly chipsLoading = signal(false);\n readonly selectedAssistId = signal<string | undefined>(undefined);\n readonly draftText = signal('');\n readonly draftFiles = signal<AXMChatEmptyDraftFile[]>([]);\n readonly starterPromptItems = signal<AXPAiChatFollowUpItemLite[]>([]);\n readonly maxDraftFiles = MAX_EMPTY_DRAFT_FILES;\n readonly isBusy = computed(() => this.sending() || this.loading());\n readonly canSend = computed(\n () =>\n Boolean(this.selectedAssistId()) &&\n !this.isBusy() &&\n (this.draftText().trim().length > 0 || this.draftFiles().length > 0),\n );\n readonly selectedAssistLabel = computed(() => {\n const selected = this.rows().find((row) => row.id === this.selectedAssistId());\n return this.translationService.resolve(selected?.title as AXPMultiLanguageString) ?? selected?.name ?? '';\n });\n readonly draftPlaceholder = computed(() => {\n if (this.compact()) {\n return this.translationService.translateSync('@conversation:mini-chat.composer.placeholder');\n }\n const assist = this.selectedAssistLabel();\n return this.translationService.translateSync('@conversation:chat.empty-assist.placeholder', {\n params: { assist },\n });\n });\n private assistsLoadPromise: Promise<void> | null = null;\n private starterPromptsLoadGeneration = 0;\n private starterAbort: AbortController | null = null;\n\n //#endregion\n\n //#region ----- Lifecycle -----\n\n constructor() {\n void this.ensureAssistsLoaded();\n this.destroyRef.onDestroy(() => {\n this.starterAbort?.abort();\n this.clearDraftFiles();\n this.emptyAssistSession.closeAssistPicker();\n });\n effect(() => {\n const sessionAssistId = this.emptyAssistSession.selectedAssistId();\n if (sessionAssistId && sessionAssistId !== this.selectedAssistId()) {\n this.selectedAssistId.set(sessionAssistId);\n }\n });\n effect(() => {\n this.emptyAssistSession.bind({\n selectedAssistId: this.selectedAssistId(),\n rows: this.rows(),\n entityId: this.entityId(),\n entityType: this.entityType(),\n launchContext: this.launchContext(),\n });\n });\n effect(() => {\n this.draftText();\n queueMicrotask(() => this.resizeDraftInput());\n });\n effect(() => {\n const assistId = this.selectedAssistId();\n const launchContext = this.launchContext();\n if (launchContext) {\n void this.loadContextualChips(assistId, launchContext);\n return;\n }\n void this.loadStarterPromptsForAssist(assistId);\n });\n }\n\n //#endregion\n\n //#region ----- Event Handlers -----\n\n readonly onAssistConversationCreated: AXMChatEmptyAssistCreatedHandler = (conversationId) => {\n const handler = this.assistConversationCreated();\n if (handler) {\n return handler(conversationId);\n }\n this.conversationCreated.emit(conversationId);\n };\n\n draftFileIcon(kind: AXMChatEmptyDraftKind): string {\n return DRAFT_KIND_ICONS[kind];\n }\n\n browseDraftFiles(): void {\n this.fileInput()?.nativeElement.click();\n }\n\n onDraftFilesSelected(event: Event): void {\n const input = event.target;\n if (!(input instanceof HTMLInputElement)) {\n return;\n }\n const selected = Array.from(input.files ?? []);\n input.value = '';\n if (selected.length === 0) {\n return;\n }\n\n const remaining = Math.max(0, MAX_EMPTY_DRAFT_FILES - this.draftFiles().length);\n const accepted = selected.slice(0, remaining);\n if (accepted.length === 0) {\n return;\n }\n\n this.draftFiles.update((current) => [\n ...current,\n ...accepted.map((file) => this.toDraftFile(file)),\n ]);\n }\n\n removeDraftFile(id: string): void {\n const current = this.draftFiles();\n const next = current.filter((item) => item.id !== id);\n current\n .filter((item) => item.id === id)\n .forEach((item) => this.revokePreview(item.preview));\n this.draftFiles.set(next);\n }\n\n resizeDraftInput(): void {\n const textarea = this.draftInput()?.nativeElement;\n if (!textarea) {\n return;\n }\n textarea.style.height = '0px';\n textarea.style.height = `${Math.min(textarea.scrollHeight, this.compact() ? 128 : 224)}px`;\n }\n\n onDraftKeydown(event: KeyboardEvent): void {\n if (event.key !== 'Enter' || event.shiftKey || event.isComposing) {\n return;\n }\n event.preventDefault();\n if (this.canSend()) {\n void this.send();\n }\n }\n\n async send(): Promise<void> {\n if (!this.canSend()) {\n return;\n }\n const text = this.draftText();\n const files = this.draftFiles().map((item) => item.file);\n this.sending.set(true);\n try {\n const conversationId = await this.emptyAssistSession.sendWelcome(text, files, this.onAssistConversationCreated);\n if (conversationId) {\n this.draftText.set('');\n this.clearDraftFiles();\n }\n } finally {\n this.sending.set(false);\n }\n }\n\n //#endregion\n\n //#region ----- Draft files -----\n\n private toDraftFile(file: File): AXMChatEmptyDraftFile {\n const kind = this.classifyDraftFile(file);\n return {\n id: globalThis.crypto?.randomUUID?.() ?? `${file.name}-${file.size}-${Date.now()}`,\n file,\n kind,\n preview: kind === 'image' || kind === 'video' ? URL.createObjectURL(file) : undefined,\n };\n }\n\n private classifyDraftFile(file: File): AXMChatEmptyDraftKind {\n const type = file.type.toLowerCase();\n if (type.startsWith('image/')) {\n return 'image';\n }\n if (type.startsWith('video/')) {\n return 'video';\n }\n if (type.startsWith('audio/')) {\n return 'audio';\n }\n return 'file';\n }\n\n private clearDraftFiles(): void {\n this.draftFiles().forEach((item) => this.revokePreview(item.preview));\n this.draftFiles.set([]);\n }\n\n private revokePreview(preview: string | undefined): void {\n if (preview) {\n URL.revokeObjectURL(preview);\n }\n }\n\n //#endregion\n\n //#region ----- Data Loading -----\n\n private async ensureAssistsLoaded(): Promise<void> {\n if (!this.assistsLoadPromise) this.assistsLoadPromise = this.loadAssistsFromApi();\n await this.assistsLoadPromise;\n }\n\n private async loadAssistsFromApi(): Promise<void> {\n this.loading.set(true);\n try {\n let rows = await this.assistCatalog.loadCatalogTargets();\n if (!rows.length) {\n rows = await this.assistCatalog.loadCatalogTargets(true);\n }\n this.rows.set(rows);\n this.selectedAssistId.set(await this.resolveInitialAssistId(rows));\n } catch (error: unknown) {\n console.error('Failed to load AI chat targets (empty composer):', error);\n const message = await this.translationService.translateAsync('@conversation:chat.empty-assist.errors.load-assists');\n this.toastService.danger(message);\n this.rows.set([]);\n this.selectedAssistId.set(undefined);\n } finally {\n this.loading.set(false);\n }\n }\n\n private async resolveInitialAssistId(rows: AXMChatAiTargetRow[]): Promise<string | undefined> {\n if (!rows.length) return undefined;\n const requestedId = this.initialAssistId()?.trim();\n if (requestedId && rows.some((row) => row.id === requestedId)) return requestedId;\n const defaultAssistId = await this.resolveDefaultAssistId();\n if (defaultAssistId && rows.some((row) => row.id === defaultAssistId)) return defaultAssistId;\n return rows[0]?.id;\n }\n\n private async resolveDefaultAssistId(): Promise<string | undefined> {\n if (!this.defaultAssistResolver) return undefined;\n try {\n return await this.defaultAssistResolver.getDefaultAssistId();\n } catch {\n return undefined;\n }\n }\n\n private async loadStarterPromptsForAssist(assistId: string | undefined): Promise<void> {\n this.starterAbort?.abort();\n this.chipsLoading.set(false);\n const generation = ++this.starterPromptsLoadGeneration;\n const id = assistId?.trim();\n if (!id) {\n this.starterPromptItems.set([]);\n return;\n }\n try {\n const assist = await this.assistCatalog.getAssist(id);\n if (!assist || generation !== this.starterPromptsLoadGeneration) {\n if (generation === this.starterPromptsLoadGeneration && !assist) {\n this.starterPromptItems.set([]);\n }\n return;\n }\n const entityRef = this.resolveEntityChatRef();\n const isEntityChat = Boolean(entityRef);\n const sendInPlace = this.sendStarterPromptsInPlace();\n const launchContext = this.launchContext();\n this.starterPromptItems.set(\n axmAssistStarterPromptChipItems(assist, {\n assistId: id,\n ...(entityRef ? { entityId: entityRef.entityId, entityType: entityRef.entityType } : {}),\n ...(sendInPlace || isEntityChat ? { navigate: false } : {}),\n ...(launchContext ? { launchContext } : {}),\n }),\n );\n } catch {\n if (generation === this.starterPromptsLoadGeneration) this.starterPromptItems.set([]);\n }\n }\n\n private async loadContextualChips(assistId: string | undefined, launchContext: AXMContextualAssistContext): Promise<void> {\n const id = assistId?.trim();\n if (!id) {\n this.starterPromptItems.set([]);\n this.chipsLoading.set(false);\n return;\n }\n\n this.starterAbort?.abort();\n const abort = new AbortController();\n this.starterAbort = abort;\n const generation = ++this.starterPromptsLoadGeneration;\n this.chipsLoading.set(true);\n try {\n const locale = this.localeService.activeProfile()?.localeInfo?.code ?? 'en-US';\n const context = axmSanitizeContextualAssistContext(launchContext);\n const result = await this.commandService.execute(AIMANAGEMENT_STRUCTURED_TEXT_COMPLETION_COMMAND_KEY, {\n assistId: id,\n messages: [axpAiChatTextMessage('system', AXM_CONTEXTUAL_ASSIST_STARTER_SYSTEM_PROMPT), axpAiChatTextMessage('user', axmBuildContextualAssistStarterUserPrompt(context, locale))],\n maxTokens: 512,\n temperature: 0.3,\n });\n if (abort.signal.aborted || generation !== this.starterPromptsLoadGeneration) {\n return;\n }\n const data = runtimeCommandPayloadData(result) as { text?: string } | undefined;\n const items = axmParseContextualAssistStarterItems(data?.text ?? '');\n const labels = items.length > 0 ? items : await this.fallbackChipLabels();\n this.starterPromptItems.set(this.toInPlaceChipItems(labels, id, context));\n } catch {\n if (!abort.signal.aborted && generation === this.starterPromptsLoadGeneration) {\n const labels = await this.fallbackChipLabels();\n this.starterPromptItems.set(this.toInPlaceChipItems(labels, id, axmSanitizeContextualAssistContext(launchContext)));\n }\n } finally {\n if (!abort.signal.aborted && generation === this.starterPromptsLoadGeneration) {\n this.chipsLoading.set(false);\n }\n }\n }\n\n private toInPlaceChipItems(labels: string[], assistId: string, launchContext: AXMContextualAssistContext): AXPAiChatFollowUpItemLite[] {\n const entityRef = this.resolveEntityChatRef();\n return axmAssistStarterPromptChipItems(\n { starterPrompts: labels.map((text) => ({ text })) },\n {\n assistId,\n navigate: false,\n launchContext,\n ...(entityRef ? { entityId: entityRef.entityId, entityType: entityRef.entityType } : {}),\n },\n );\n }\n\n private resolveEntityChatRef(): AXMEntityChatRef | undefined {\n const entityId = this.entityId()?.trim();\n const entityType = this.entityType()?.trim();\n if (entityId && entityType) {\n return { entityId, entityType };\n }\n return axmEntityRefFromLaunchContext(this.launchContext());\n }\n\n private async fallbackChipLabels(): Promise<string[]> {\n const labels: string[] = [];\n for (const key of FALLBACK_CHIP_KEYS) {\n const text = (await this.translationService.translateAsync(key))?.trim();\n if (text) {\n labels.push(text);\n }\n }\n return labels;\n }\n\n //#endregion\n}\n","import { AXM_CHAT_EMPTY_STATE_COMPONENT } from '@acorex-platform/module-conversation-client';\nimport { Provider } from '@angular/core';\nimport { AXMChatEmptyAssistComposerComponent } from './chat-empty-assist-composer.component';\n\nexport const AXE_CHAT_EMPTY_STATE_PROVIDERS: Provider[] = [\n {\n provide: AXM_CHAT_EMPTY_STATE_COMPONENT,\n useValue: AXMChatEmptyAssistComposerComponent,\n },\n];\n","import type { AXConversation } from '@acorex/components/conversation';\nimport { AXM_MINI_CHAT_INBOX_CONVERSATION_FILTER, axmConversationHasAiChat } from '@acorex-platform/module-conversation-client';\nimport { Provider } from '@angular/core';\n\nexport const AXE_MINI_CHAT_INBOX_FILTER_PROVIDERS: Provider[] = [\n {\n provide: AXM_MINI_CHAT_INBOX_CONVERSATION_FILTER,\n useValue: (conversation: AXConversation) => axmConversationHasAiChat(conversation.metadata),\n },\n];\n","import { AXPAiManagerService } from '@acorex-platform/module-ai-management-client';\nimport {\n AXM_ASSIST_DEFAULT_RESOLVER_PORT,\n type AXMAssistDefaultResolverPort,\n} from '@acorex-platform/module-conversation-client';\nimport { Provider, inject } from '@angular/core';\n\nclass AXEAssistDefaultResolver implements AXMAssistDefaultResolverPort {\n private readonly aiManager = inject(AXPAiManagerService);\n\n async getDefaultAssistId(): Promise<string | undefined> {\n const assist = await this.aiManager.getEffectiveAssist();\n return assist.id?.trim() || undefined;\n }\n}\n\nexport const AXE_ASSIST_DEFAULT_RESOLVER_PROVIDERS: Provider[] = [\n AXEAssistDefaultResolver,\n {\n provide: AXM_ASSIST_DEFAULT_RESOLVER_PORT,\n useExisting: AXEAssistDefaultResolver,\n },\n];\n","//#region ---- Imports ----\n\nimport { AXPCommandService, AXPRuntimeTransportService } from '@acorex-platform/framework-client/runtime';\nimport { runtimeCommandPayloadData } from '@acorex-platform/framework-shared/core';\nimport { AIMANAGEMENT_STRUCTURED_TEXT_COMPLETION_COMMAND_KEY, AXMAiManagementTransportKeys, axpAiChatTextMessage } from '@acorex-platform/module-ai-management-client/contracts';\nimport type { AXMConversationAssistResponsePort } from '@acorex-platform/module-conversation-client';\nimport {\n AXMConversationEntityStoreService,\n AXMConversationFocusService,\n CONVERSATION_SYNC_READ_STATE_COMMAND,\n axmAssistHasFinalizeMetadata,\n axmAssistPersistedMessageLooksComplete,\n axmConversationHasAiChat,\n axmIsAssistRetryableStatus,\n axmIsAssistTerminalStatus,\n axmMessageEntityToMessage,\n axmReadAssistResponseStatus,\n axmReadReplyToUserMessageId,\n axmRoomEntityToConversation,\n axmRoomWithAssistPeerDisplayName,\n axmShouldPreferPersistedAssistOverLiveCache,\n axmSyncAssistPeerDisplayName,\n} from '@acorex-platform/module-conversation-client';\nimport type { AXMConversationRoom } from '@acorex-platform/module-conversation-client/contracts';\nimport type { ConversationAssistFrontendToolCall, ConversationAssistWireEvent } from '@acorex-platform/module-conversation-client/contracts';\nimport {\n AXM_ASSIST_CONVERSATION_TITLE_SYSTEM_PROMPT,\n axmCompareMessagesChronologically,\n axmEnsureAssistMessageSortsAfterReplyTarget,\n axmExtractAssistIdFromMetadata,\n axmSanitizeAiGeneratedConversationTitle,\n extractMessageTextFromPayload,\n} from '@acorex-platform/module-conversation-client/contracts';\nimport {\n AXConversationComposerGenerationStateService,\n type AXConversation,\n type AXConversationMessage,\n type AXConversationSendMessageCommand,\n} from '@acorex/components/conversation';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { DestroyRef, Injectable, inject } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\n//#endregion\n\n//#region ---- Helpers ----\n\nfunction coerceTimestampMs(value: Date | string | number | undefined): number {\n if (value instanceof Date) {\n return value.getTime();\n }\n if (typeof value === 'number') {\n return value;\n }\n if (typeof value === 'string') {\n const parsed = Date.parse(value);\n return Number.isNaN(parsed) ? 0 : parsed;\n }\n return 0;\n}\n\n//#endregion\n\n//#region ---- Conversation assist response (SSE subscriber) ----\n\n/**\n * Subscribes to server-side assist SSE and forwards message patches to the in-memory realtime bus.\n * AI generation and entity persistence run on the server ({@link AiConversationAssistResponseService}).\n */\n@Injectable()\nexport class AXEConversationAssistResponseService implements AXMConversationAssistResponsePort {\n private readonly transportService = inject(AXPRuntimeTransportService);\n private readonly toastService = inject(AXToastService);\n private readonly translation = inject(AXTranslationService);\n private readonly store = inject(AXMConversationEntityStoreService);\n private readonly focus = inject(AXMConversationFocusService);\n private readonly commandService = inject(AXPCommandService);\n private readonly generationState = inject(AXConversationComposerGenerationStateService);\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly messageCache = new Map<string, AXConversationMessage>();\n private readonly forgottenMessageIds = new Set<string>();\n private readonly conversationCache = new Map<string, AXConversation>();\n private readonly streamTasks = new Map<string, Promise<void>>();\n private readonly streamReconnectTimers = new Map<string, ReturnType<typeof setTimeout>>();\n private readonly lastAssistSyncAt = new Map<string, number>();\n private currentUserId = '';\n private composerGenerationConversationId: string | null = null;\n private readonly cancelAssistByConversation = new Map<string, Promise<void>>();\n private readonly userCancelledConversationIds = new Set<string>();\n\n private static readonly ASSIST_SYNC_MIN_INTERVAL_MS = 2000;\n\n constructor() {\n this.generationState.onCancelled.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n const conversationId =\n this.composerGenerationConversationId?.trim()\n || this.focus.getFocusedConversationId()?.trim()\n || '';\n void this.cancelAssistGeneration(conversationId);\n });\n }\n\n async handleAfterUserMessage(\n conversationId: string,\n _userMessageId: string,\n _command: AXConversationSendMessageCommand,\n currentUserId: string,\n options?: { skipAssistSync?: boolean },\n ): Promise<void> {\n this.currentUserId = currentUserId;\n this.ensureAssistStreamSubscription(conversationId);\n const scoped = conversationId.trim();\n this.userCancelledConversationIds.delete(scoped);\n if (!this.conversationCache.has(scoped)) {\n const storeCached = this.store.getCachedConversation(scoped);\n if (storeCached) {\n this.conversationCache.set(scoped, storeCached);\n }\n }\n const focusedId = this.focus.getFocusedConversationId();\n if (focusedId === scoped || !focusedId) {\n this.markComposerGenerating(scoped, true);\n }\n if (!options?.skipAssistSync && !this.streamTasks.has(scoped)) {\n void this.requestAssistSync(conversationId, { force: true });\n }\n }\n\n async retryAssistResponse(conversationId: string, messageId: string): Promise<AXConversationMessage> {\n await this.warmConversationCache(conversationId);\n await this.reconcileStaleAssistPlaceholders(conversationId);\n\n const cached = this.messageCache.get(messageId) ?? null;\n const persisted = await this.store.getMessage(messageId);\n const message = persisted ?? cached;\n if (!message) {\n throw new Error('Message not found');\n }\n if (!axmIsAssistRetryableStatus(axmReadAssistResponseStatus(message.metadata))) {\n throw new Error('Assist response is not retryable');\n }\n\n const replyToUserMessageId = axmReadReplyToUserMessageId(message.metadata);\n if (!persisted && !replyToUserMessageId) {\n this.messageCache.delete(messageId);\n throw new Error('Message not found');\n }\n if (!persisted) {\n this.messageCache.delete(messageId);\n }\n\n this.ensureAssistStreamSubscription(conversationId);\n this.userCancelledConversationIds.delete(conversationId.trim());\n if (this.focus.isFocused(conversationId)) {\n this.markComposerGenerating(conversationId, true);\n }\n\n try {\n const entity = await this.transportService.execute<{ conversationId: string; messageId: string; replyToUserMessageId?: string }, unknown>(AXMAiManagementTransportKeys.ConversationAssist.RetryAssist, {\n conversationId,\n messageId,\n ...(replyToUserMessageId ? { replyToUserMessageId } : {}),\n });\n const mapped = axmMessageEntityToMessage(entity as Parameters<typeof axmMessageEntityToMessage>[0]);\n this.applyLiveMessage(mapped, { isNew: false });\n return mapped;\n } catch (error) {\n if (this.focus.isFocused(conversationId)) {\n this.markComposerGenerating(conversationId, false);\n }\n throw error;\n }\n }\n\n async reconcileStaleAssistPlaceholders(conversationId?: string): Promise<void> {\n const scoped = conversationId?.trim();\n if (scoped) {\n const hasStreaming = await this.hasStreamingAssistPlaceholders(scoped);\n if (!hasStreaming) {\n return;\n }\n if (!this.conversationCache.has(scoped)) {\n await this.warmConversationCache(scoped);\n }\n // Show any drafts buffered while this chat was unfocused before sync may rewrite status.\n if (this.focus.isFocused(scoped)) {\n this.flushLiveCacheToBus(scoped);\n }\n this.ensureAssistStreamSubscription(scoped);\n await this.requestAssistSync(scoped, { force: true });\n } else {\n const streaming = await this.store.loadStreamingAssistPlaceholderMessages();\n for (const message of streaming) {\n this.messageCache.set(message.id, message);\n }\n const conversationIds = new Set(streaming.map((message) => message.conversationId).filter(Boolean));\n for (const id of conversationIds) {\n await this.syncAssistMessagesFromStore(id);\n await this.requestAssistSync(id);\n }\n }\n for (const message of this.messageCache.values()) {\n if (scoped && message.conversationId !== scoped) {\n continue;\n }\n const status = axmReadAssistResponseStatus(message.metadata);\n if (status === 'incomplete' && axmAssistPersistedMessageLooksComplete(message)) {\n await this.repairAssistResponseAsComplete(message);\n continue;\n }\n if (status !== 'streaming') {\n continue;\n }\n if (axmAssistPersistedMessageLooksComplete(message)) {\n await this.repairAssistResponseAsComplete(message);\n continue;\n }\n this.ensureAssistStreamSubscription(message.conversationId);\n }\n\n if (scoped && this.focus.isFocused(scoped)) {\n this.flushLiveCacheToBus(scoped);\n }\n }\n\n getLiveMessage(messageId: string): AXConversationMessage | null {\n const cached = this.messageCache.get(messageId);\n return cached ? this.withStreamDraftForDisplay(cached) : null;\n }\n\n async hasStreamingAssistPlaceholders(conversationId: string): Promise<boolean> {\n const scoped = conversationId?.trim();\n if (!scoped) {\n return false;\n }\n for (const message of this.messageCache.values()) {\n if (message.conversationId === scoped && axmReadAssistResponseStatus(message.metadata) === 'streaming') {\n return true;\n }\n }\n const cachedList = this.store.getCachedMessageList(scoped);\n if (cachedList?.some((message) => axmReadAssistResponseStatus(message.metadata) === 'streaming')) {\n return true;\n }\n const streaming = await this.store.loadStreamingAssistPlaceholderMessages(scoped);\n return streaming.length > 0;\n }\n\n mergeLiveConversationMessages(conversationId: string, persisted: AXConversationMessage[]): AXConversationMessage[] {\n const byId = new Map<string, AXConversationMessage>();\n for (const message of persisted) {\n if (message.deleted || this.forgottenMessageIds.has(message.id)) {\n continue;\n }\n byId.set(message.id, message);\n }\n for (const message of this.messageCache.values()) {\n if (message.conversationId !== conversationId || message.deleted || this.forgottenMessageIds.has(message.id)) {\n continue;\n }\n const existing = byId.get(message.id);\n if (existing && axmShouldPreferPersistedAssistOverLiveCache(existing, message)) {\n continue;\n }\n byId.set(message.id, this.withStreamDraftForDisplay(message));\n }\n return [...byId.values()].sort((a, b) => axmCompareMessagesChronologically(a, b));\n }\n\n forgetLiveMessages(messageIds: string[]): void {\n for (const rawId of messageIds) {\n const messageId = rawId.trim();\n if (!messageId) {\n continue;\n }\n this.forgottenMessageIds.add(messageId);\n this.messageCache.delete(messageId);\n }\n }\n\n private ensureAssistStreamSubscription(conversationId: string): void {\n const key = conversationId.trim();\n if (!key || this.streamTasks.has(key)) {\n return;\n }\n\n const task = this.runAssistStream(key).finally(() => {\n this.streamTasks.delete(key);\n // Reattach in the background while placeholders are still streaming (e.g. after leaving the chat).\n this.scheduleAssistStreamReconnect(key, { allowUnfocused: true });\n });\n this.streamTasks.set(key, task);\n }\n\n private async runAssistStream(conversationId: string): Promise<void> {\n try {\n await this.transportService.execute(AXMAiManagementTransportKeys.ConversationAssist.Subscribe, {\n conversationId,\n onEvent: async (event: ConversationAssistWireEvent) => {\n await this.handleAssistWireEvent(event);\n },\n });\n } catch (error: unknown) {\n if (this.isBenignAssistStreamClose(conversationId, error)) {\n return;\n }\n const message = error instanceof Error ? error.message : String(error);\n await this.handleAssistStreamTransportFailure(conversationId, message);\n } finally {\n await this.syncAssistMessagesFromStore(conversationId);\n }\n }\n\n private async requestAssistSync(conversationId: string, options?: { force?: boolean }): Promise<void> {\n const key = conversationId.trim();\n if (!key) {\n return;\n }\n const now = Date.now();\n const last = this.lastAssistSyncAt.get(key) ?? 0;\n if (!options?.force && now - last < AXEConversationAssistResponseService.ASSIST_SYNC_MIN_INTERVAL_MS) {\n return;\n }\n this.lastAssistSyncAt.set(key, now);\n\n try {\n const body = await this.transportService.execute<{ conversationId: string }, { messages?: unknown[] }>(AXMAiManagementTransportKeys.ConversationAssist.AssistSync, { conversationId });\n const messages = Array.isArray(body.messages) ? body.messages : [];\n for (const raw of messages) {\n try {\n const mapped = axmMessageEntityToMessage(raw as Parameters<typeof axmMessageEntityToMessage>[0]);\n this.applyLiveMessage(mapped, { isNew: !this.messageCache.has(mapped.id) });\n } catch {\n // ignore malformed rows\n }\n }\n } catch {\n // Stream catch-up is best-effort; store sync still runs.\n }\n }\n\n private async handleAssistWireEvent(event: ConversationAssistWireEvent): Promise<void> {\n switch (event.type) {\n case 'assist_started': {\n if (this.shouldIgnoreStreamingAfterUserCancel(event.conversationId)) {\n break;\n }\n void this.markUserMessageSeenByAssist(event.conversationId, event.userMessageId);\n const mapped = axmMessageEntityToMessage(event.message);\n this.applyLiveMessage(mapped, { isNew: !this.messageCache.has(mapped.id) });\n this.syncComposerGeneratingForConversation(event.conversationId, true);\n break;\n }\n case 'message_patch': {\n const mapped = axmMessageEntityToMessage(event.message);\n const status = axmReadAssistResponseStatus(mapped.metadata);\n if (status === 'streaming' && this.shouldIgnoreStreamingAfterUserCancel(mapped.conversationId)) {\n break;\n }\n const isNew = !this.messageCache.has(mapped.id);\n this.applyLiveMessage(mapped, { isNew });\n if (status === 'streaming') {\n this.syncComposerGeneratingForConversation(mapped.conversationId, true);\n } else if (axmIsAssistTerminalStatus(status)) {\n this.syncComposerGeneratingForConversation(mapped.conversationId, false);\n }\n break;\n }\n case 'conversation_patch': {\n const syncedRoom = axmRoomWithAssistPeerDisplayName(event.room);\n const conversation = axmSyncAssistPeerDisplayName(axmRoomEntityToConversation(syncedRoom, this.currentUserId));\n this.conversationCache.set(conversation.id, conversation);\n this.store.publishConversationUpdate(conversation);\n break;\n }\n case 'assist_completed': {\n const mapped = axmMessageEntityToMessage(event.message);\n if (this.shouldIgnoreStreamingAfterUserCancel(mapped.conversationId)) {\n this.syncComposerGeneratingForConversation(mapped.conversationId, false);\n break;\n }\n this.applyLiveMessage(mapped, { isNew: false });\n void this.maybeMarkFocusedIncomingRead(mapped);\n if (event.room) {\n this.applyAssistConversationRoomPatch(event.room);\n }\n void this.maybeApplyAssistAutoTitleAfterComplete(mapped);\n this.syncComposerGeneratingForConversation(mapped.conversationId, false);\n break;\n }\n case 'assist_failed': {\n const mapped = axmMessageEntityToMessage(event.message);\n this.applyLiveMessage(mapped, { isNew: false });\n if (this.focus.isFocused(mapped.conversationId) && axmReadAssistResponseStatus(mapped.metadata) === 'failed') {\n void this.showAssistToast('@conversation:chat.assist.errors.title', event.error);\n }\n this.syncComposerGeneratingForConversation(mapped.conversationId, false);\n break;\n }\n case 'frontend_tool_call': {\n const cancelId = this.composerGenerationConversationId;\n if (cancelId && this.shouldIgnoreStreamingAfterUserCancel(cancelId)) {\n break;\n }\n await this.submitFrontendToolResult(event.runId, event.call);\n break;\n }\n default:\n break;\n }\n }\n\n private async submitFrontendToolResult(runId: string, call: ConversationAssistFrontendToolCall): Promise<void> {\n try {\n const result = await this.transportService.execute(AXMAiManagementTransportKeys.Engine.SubmitToolResult, {\n runId,\n call,\n });\n if (result && typeof result === 'object' && 'ok' in result && (result as { ok?: boolean }).ok === false) {\n return;\n }\n } catch (error: unknown) {\n const text = error instanceof Error ? error.message : String(error);\n void this.showAssistToast('@conversation:chat.assist.errors.tool-title', text);\n }\n }\n\n private async showAssistToast(titleKey: string, content: string): Promise<void> {\n const title = await this.translation.translateAsync(titleKey);\n this.toastService.show({\n color: titleKey.includes('stream') ? 'warning' : 'danger',\n title,\n content,\n });\n }\n\n /** Server generates the title via AI; client applies `conversation_patch` / `assist_completed.room`. */\n private async applyAssistAiTitleFromUserText(conversationId: string, userText: string): Promise<void> {\n const scopedId = conversationId.trim();\n const scopedText = userText.trim();\n if (!scopedId || !scopedText) {\n return;\n }\n\n const conversation = this.conversationCache.get(scopedId) ?? (await this.store.getConversation(scopedId));\n if (!conversation || !axmConversationHasAiChat(conversation.metadata as Record<string, unknown> | undefined)) {\n return;\n }\n\n const metadata = (conversation.metadata ?? {}) as Record<string, unknown>;\n if (metadata['isTitleCustomized'] === true || metadata['isTitleAutoGenerated'] === true) {\n return;\n }\n\n const assistId = axmExtractAssistIdFromMetadata(metadata);\n const modelEntityId = typeof metadata['modelEntityId'] === 'string' && metadata['modelEntityId'].trim() ? metadata['modelEntityId'].trim() : undefined;\n\n const result = await this.commandService.execute(AIMANAGEMENT_STRUCTURED_TEXT_COMPLETION_COMMAND_KEY, {\n assistId,\n modelEntityId,\n messages: [axpAiChatTextMessage('system', AXM_ASSIST_CONVERSATION_TITLE_SYSTEM_PROMPT), axpAiChatTextMessage('user', scopedText)],\n maxTokens: 48,\n temperature: 0.3,\n });\n\n const data = runtimeCommandPayloadData(result) as { text?: string } | undefined;\n const normalizedTitle = axmSanitizeAiGeneratedConversationTitle(data?.text ?? '');\n if (!normalizedTitle || normalizedTitle === conversation.title?.trim()) {\n return;\n }\n\n const updated = axmSyncAssistPeerDisplayName({\n ...conversation,\n title: normalizedTitle,\n metadata: {\n ...metadata,\n isTitleCustomized: false,\n isTitleAutoGenerated: true,\n },\n });\n this.conversationCache.set(updated.id, updated);\n this.store.publishConversationUpdate(updated);\n }\n\n /** After assist completes — memory update first; entity persist is async and must not block streaming UI. */\n private applyAssistConversationRoomPatch(room: AXMConversationRoom): void {\n const syncedRoom = axmRoomWithAssistPeerDisplayName(room);\n const conversation = axmSyncAssistPeerDisplayName(axmRoomEntityToConversation(syncedRoom, this.currentUserId));\n this.conversationCache.set(conversation.id, conversation);\n this.store.publishConversationUpdate(conversation);\n void this.store.persistAssistTitlePatch(syncedRoom);\n }\n\n /** Client fallback when server room patch is missing or peer display name is still the assist catalog label. */\n private async maybeApplyAssistAutoTitleAfterComplete(assistMessage: AXConversationMessage): Promise<void> {\n const conversationId = assistMessage.conversationId?.trim();\n if (!conversationId) {\n return;\n }\n\n const conversation = this.conversationCache.get(conversationId) ?? (await this.store.getConversation(conversationId));\n if (!conversation || !axmConversationHasAiChat(conversation.metadata as Record<string, unknown> | undefined)) {\n return;\n }\n\n const metadata = (conversation.metadata ?? {}) as Record<string, unknown>;\n if (metadata['isTitleCustomized'] === true || metadata['isTitleAutoGenerated'] === true) {\n const peerSynced = axmSyncAssistPeerDisplayName(conversation);\n if (peerSynced !== conversation) {\n this.conversationCache.set(peerSynced.id, peerSynced);\n this.store.publishConversationUpdate(peerSynced);\n }\n return;\n }\n\n let userText = '';\n const replyToId = axmReadReplyToUserMessageId(assistMessage.metadata);\n if (replyToId) {\n const userMessage = this.messageCache.get(replyToId) ?? (await this.store.getMessage(replyToId));\n if (userMessage?.type === 'text') {\n userText = extractMessageTextFromPayload(userMessage.payload).trim();\n }\n }\n if (!userText) {\n const cachedMessages = this.store.getCachedMessageList(conversationId);\n const firstUserText = cachedMessages?.find((message) => !message.deleted && message.senderId === this.currentUserId && message.type === 'text' && extractMessageTextFromPayload(message.payload).trim().length > 0);\n userText = firstUserText ? extractMessageTextFromPayload(firstUserText.payload).trim() : '';\n }\n if (!userText) {\n const loadedMessages = await this.store.loadConversationMessages(conversationId);\n const firstUserText = loadedMessages.find((message) => !message.deleted && message.senderId === this.currentUserId && message.type === 'text' && extractMessageTextFromPayload(message.payload).trim().length > 0);\n userText = firstUserText ? extractMessageTextFromPayload(firstUserText.payload).trim() : '';\n }\n\n if (!userText) {\n return;\n }\n\n void this.applyAssistAiTitleFromUserText(conversationId, userText);\n }\n\n private async markUserMessageSeenByAssist(conversationId: string, userMessageId: string): Promise<void> {\n const scopedId = userMessageId?.trim();\n if (!scopedId) {\n return;\n }\n\n const message = this.store.getCachedMessage(scopedId) ?? this.messageCache.get(scopedId);\n if (!message || message.conversationId !== conversationId) {\n return;\n }\n if (message.senderId !== this.currentUserId || message.status === 'read') {\n return;\n }\n\n this.store.publishMessageUpdate({ ...message, status: 'read' });\n }\n\n private async maybeMarkFocusedIncomingRead(message: AXConversationMessage): Promise<void> {\n const conversationId = message.conversationId?.trim();\n if (!conversationId || !this.focus.isFocused(conversationId)) {\n return;\n }\n if (message.senderId === this.currentUserId || message.status === 'read') {\n return;\n }\n\n await this.commandService.execute(CONVERSATION_SYNC_READ_STATE_COMMAND, {\n conversationId,\n messageIds: [message.id],\n currentUserId: this.currentUserId,\n });\n }\n\n private applyLiveMessage(message: AXConversationMessage, options: { isNew: boolean }): void {\n if (message.deleted || this.forgottenMessageIds.has(message.id)) {\n this.forgottenMessageIds.add(message.id);\n this.messageCache.delete(message.id);\n this.store.publishMessageDeletion(message.id);\n return;\n }\n\n this.forgottenMessageIds.delete(message.id);\n if (this.shouldIgnoreStaleUserTextPatch(message)) {\n return;\n }\n if (\n axmReadAssistResponseStatus(message.metadata) === 'streaming'\n && this.shouldIgnoreStreamingAfterUserCancel(message.conversationId)\n ) {\n return;\n }\n const normalized = this.coerceLaggyStreamingTerminal(message);\n if (this.shouldIgnoreStaleStreamingDowngrade(normalized)) {\n return;\n }\n if (this.shouldIgnoreStaleIncompleteWhileLiveStreaming(normalized)) {\n return;\n }\n if (axmReadAssistResponseStatus(normalized.metadata) === 'streaming' && axmAssistPersistedMessageLooksComplete(normalized)) {\n void this.repairAssistResponseAsComplete(normalized);\n return;\n }\n\n // Keep canonical streaming shape in cache (draft stays in metadata); mirror draft only for UI bus.\n const canonical = this.ensureAssistChronology(normalized);\n this.messageCache.set(canonical.id, canonical);\n if (!this.focus.isFocused(canonical.conversationId)) {\n return;\n }\n const forDisplay = this.withStreamDraftForDisplay(canonical);\n if (options.isNew) {\n this.store.publishNewMessage(forDisplay);\n return;\n }\n this.store.publishMessageUpdate(forDisplay);\n }\n\n /** Keeps assist bubbles below the linked user turn when client/server clocks disagree. */\n private ensureAssistChronology(message: AXConversationMessage): AXConversationMessage {\n const replyToId = axmReadReplyToUserMessageId(message.metadata);\n if (!replyToId) {\n return message;\n }\n const replyTarget = this.messageCache.get(replyToId);\n if (!replyTarget) {\n return message;\n }\n return axmEnsureAssistMessageSortsAfterReplyTarget(message, replyTarget.timestamp);\n }\n\n /** Status can lag behind finalize metadata or transcript payload on late patches. */\n private coerceLaggyStreamingTerminal(message: AXConversationMessage): AXConversationMessage {\n const status = axmReadAssistResponseStatus(message.metadata);\n if (status !== 'streaming') {\n return message;\n }\n\n const meta = message.metadata as Record<string, unknown> | undefined;\n const transcripts = meta?.['transcripts'];\n const hasTranscripts = Array.isArray(transcripts) && transcripts.length > 0;\n if (!axmAssistHasFinalizeMetadata(meta) && !hasTranscripts) {\n return message;\n }\n\n const nextMeta = { ...(meta ?? {}) } as Record<string, unknown>;\n nextMeta['isStreaming'] = false;\n nextMeta['assistResponseStatus'] = 'complete';\n delete nextMeta['assistResponseError'];\n delete nextMeta['streamDraftText'];\n delete nextMeta['streamDraftThink'];\n return { ...message, metadata: nextMeta };\n }\n\n /**\n * After a user-text edit, entity cache / status-seen persist can emit the pre-edit payload.\n * Keep the newer local bubble (and never put the old text into the live cache).\n */\n private shouldIgnoreStaleUserTextPatch(incoming: AXConversationMessage): boolean {\n if (incoming.metadata?.['isAssistResponse'] === true || incoming.type === 'assist-response') {\n return false;\n }\n if (incoming.type !== 'text') {\n return false;\n }\n\n const local = this.store.getCachedMessage(incoming.id) ?? this.messageCache.get(incoming.id);\n if (!local) {\n return false;\n }\n\n const localText = extractMessageTextFromPayload(local.payload);\n const incomingText = extractMessageTextFromPayload(incoming.payload);\n if (localText === incomingText) {\n return false;\n }\n\n const localEdited = coerceTimestampMs(local.editedAt);\n const incomingEdited = coerceTimestampMs(incoming.editedAt);\n return localEdited > 0 && incomingEdited < localEdited + 5000;\n }\n\n /** Ignore out-of-order streaming patches after a terminal assist state was applied. */\n private shouldIgnoreStaleStreamingDowngrade(incoming: AXConversationMessage): boolean {\n if (axmReadAssistResponseStatus(incoming.metadata) !== 'streaming') {\n return false;\n }\n if (axmAssistHasFinalizeMetadata(incoming.metadata)) {\n return false;\n }\n\n const cached = this.messageCache.get(incoming.id);\n if (!cached) {\n return false;\n }\n\n const cachedStatus = axmReadAssistResponseStatus(cached.metadata);\n if (axmIsAssistTerminalStatus(cachedStatus)) {\n return true;\n }\n return axmAssistHasFinalizeMetadata(cached.metadata);\n }\n\n /**\n * Assist-sync may reclaim a row as incomplete while the live SSE subscription is still\n * receiving drafts (page refresh / server restart path). Never ignore cancel/supersede.\n */\n private shouldIgnoreStaleIncompleteWhileLiveStreaming(incoming: AXConversationMessage): boolean {\n const incomingStatus = axmReadAssistResponseStatus(incoming.metadata);\n if (incomingStatus !== 'incomplete' && incomingStatus !== 'failed') {\n return false;\n }\n const meta = incoming.metadata as Record<string, unknown> | undefined;\n const err = typeof meta?.['assistResponseError'] === 'string' ? meta['assistResponseError'] : '';\n // Real cancel / provider failures must always win over the live draft cache.\n if (!err.includes('page refresh or server restart')) {\n return false;\n }\n if (!this.streamTasks.has(incoming.conversationId.trim())) {\n return false;\n }\n const cached = this.messageCache.get(incoming.id);\n if (!cached || axmReadAssistResponseStatus(cached.metadata) !== 'streaming') {\n return false;\n }\n const cachedMeta = cached.metadata as Record<string, unknown> | undefined;\n const incomingMeta = incoming.metadata as Record<string, unknown> | undefined;\n const cachedDraft = typeof cachedMeta?.['streamDraftText'] === 'string' ? cachedMeta['streamDraftText'] : '';\n const incomingDraft = typeof incomingMeta?.['streamDraftText'] === 'string' ? incomingMeta['streamDraftText'] : '';\n const incomingText = (incoming.payload as { type?: string; text?: string } | undefined)?.type === 'text' ? String((incoming.payload as { text?: string }).text ?? '') : '';\n return cachedDraft.length >= Math.max(incomingDraft.length, incomingText.trim().length);\n }\n\n /** Maps streaming draft metadata into a display-friendly message for the chat renderer. */\n private withStreamDraftForDisplay(message: AXConversationMessage): AXConversationMessage {\n const meta = message.metadata as Record<string, unknown> | undefined;\n if (axmReadAssistResponseStatus(meta) !== 'streaming') {\n return message;\n }\n const streamDraftText = typeof meta?.['streamDraftText'] === 'string' ? meta['streamDraftText'] : '';\n if (!streamDraftText.trim()) {\n return message;\n }\n const payload = message.payload as unknown as Record<string, unknown> | undefined;\n const hasVisibleText = payload?.['type'] === 'text' && typeof payload['text'] === 'string' && (payload['text'] as string).trim().length > 0;\n if (hasVisibleText) {\n return message;\n }\n return {\n ...message,\n payload: { type: 'text', text: streamDraftText },\n metadata: { ...meta },\n };\n }\n\n private async repairAssistResponseAsComplete(message: AXConversationMessage): Promise<void> {\n const meta = { ...(message.metadata ?? {}) } as Record<string, unknown>;\n const streamDraftText = typeof meta['streamDraftText'] === 'string' ? meta['streamDraftText'] : '';\n const payload = message.payload as unknown as Record<string, unknown> | undefined;\n const hasPayloadContent = (payload?.['type'] === 'text' && typeof payload['text'] === 'string' && payload['text'].trim().length > 0) || (payload?.['type'] === 'assist-transcript-line' && payload['line'] != null);\n const next: AXConversationMessage = { ...message };\n if (!hasPayloadContent && streamDraftText.trim().length > 0) {\n next.payload = { type: 'text', text: streamDraftText.trim() };\n }\n const nextMeta = { ...(next.metadata ?? {}) } as Record<string, unknown>;\n nextMeta['isStreaming'] = false;\n nextMeta['assistResponseStatus'] = 'complete';\n delete nextMeta['assistResponseError'];\n delete nextMeta['streamDraftText'];\n delete nextMeta['streamDraftThink'];\n next.metadata = nextMeta;\n this.applyLiveMessage(next, { isNew: false });\n }\n\n private async warmConversationCache(conversationId: string): Promise<void> {\n if (this.conversationCache.has(conversationId)) {\n await this.syncAssistMessagesFromStore(conversationId);\n return;\n }\n const conversation = await this.store.getConversation(conversationId);\n if (conversation) {\n this.conversationCache.set(conversationId, conversation);\n if (axmConversationHasAiChat(conversation.metadata as Record<string, unknown> | undefined)) {\n this.ensureAssistStreamSubscription(conversationId);\n }\n }\n await this.syncAssistMessagesFromStore(conversationId);\n }\n\n private async syncAssistMessagesFromStore(conversationId: string): Promise<void> {\n const scoped = conversationId.trim();\n if (!scoped) {\n return;\n }\n\n const hasLiveStreaming = [...this.messageCache.values()].some((message) => message.conversationId === scoped && axmReadAssistResponseStatus(message.metadata) === 'streaming');\n const cachedList = this.store.getCachedMessageList(scoped);\n const hasCachedStreaming = cachedList?.some((message) => axmReadAssistResponseStatus(message.metadata) === 'streaming') ?? false;\n\n const persisted = cachedList && !hasLiveStreaming && !hasCachedStreaming ? cachedList : await this.store.loadConversationMessages(scoped);\n const persistedIds = new Set(persisted.map((message) => message.id));\n for (const [id, message] of this.messageCache.entries()) {\n if (message.conversationId !== scoped || persistedIds.has(id)) {\n continue;\n }\n const status = axmReadAssistResponseStatus(message.metadata);\n if (axmIsAssistTerminalStatus(status)) {\n this.messageCache.delete(id);\n }\n }\n for (const message of persisted) {\n const meta = message.metadata as Record<string, unknown> | undefined;\n if (meta?.['isAssistResponse'] !== true && message.type !== 'assist-response') {\n continue;\n }\n const cached = this.messageCache.get(message.id);\n if (cached && axmShouldPreferPersistedAssistOverLiveCache(message, cached)) {\n this.messageCache.delete(message.id);\n }\n const status = axmReadAssistResponseStatus(message.metadata);\n if (status === 'streaming') {\n if (axmAssistPersistedMessageLooksComplete(message)) {\n await this.repairAssistResponseAsComplete(message);\n } else {\n this.applyLiveMessage(message, { isNew: !this.messageCache.has(message.id) });\n }\n continue;\n }\n if (status === 'failed' || status === 'complete' || status === 'incomplete') {\n this.applyLiveMessage(message, { isNew: false });\n }\n }\n }\n\n private scheduleAssistStreamReconnect(conversationId: string, options?: { allowUnfocused?: boolean }): void {\n const key = conversationId.trim();\n if (!key) {\n return;\n }\n if (!options?.allowUnfocused && !this.focus.isFocused(key)) {\n return;\n }\n\n const hasStreaming = [...this.messageCache.values()].some((message) => message.conversationId === key && axmReadAssistResponseStatus(message.metadata) === 'streaming');\n if (!hasStreaming) {\n return;\n }\n\n const existing = this.streamReconnectTimers.get(key);\n if (existing) {\n clearTimeout(existing);\n }\n\n const timer = setTimeout(() => {\n this.streamReconnectTimers.delete(key);\n if (this.streamTasks.has(key)) {\n return;\n }\n const stillStreaming = [...this.messageCache.values()].some((message) => message.conversationId === key && axmReadAssistResponseStatus(message.metadata) === 'streaming');\n if (!stillStreaming) {\n return;\n }\n this.ensureAssistStreamSubscription(key);\n }, 2000);\n this.streamReconnectTimers.set(key, timer);\n }\n\n private isBenignAssistStreamClose(conversationId: string, error: unknown): boolean {\n if (!this.focus.isFocused(conversationId)) {\n return true;\n }\n const message = error instanceof Error ? error.message : String(error);\n if (message === 'BodyStreamBuffer was aborted') {\n return true;\n }\n return error instanceof DOMException && error.name === 'AbortError';\n }\n\n private flushLiveCacheToBus(conversationId: string): void {\n if (!this.focus.isFocused(conversationId)) {\n return;\n }\n for (const message of this.messageCache.values()) {\n if (message.conversationId !== conversationId || message.deleted) {\n continue;\n }\n const next = this.withStreamDraftForDisplay(message);\n this.store.publishMessageUpdate(next);\n }\n }\n\n private async handleAssistStreamTransportFailure(conversationId: string, errorMessage: string): Promise<void> {\n if (!this.focus.isFocused(conversationId)) {\n return;\n }\n await this.syncAssistMessagesFromStore(conversationId);\n await this.requestAssistSync(conversationId);\n const stillStreaming = [...this.messageCache.values()].filter((message) => message.conversationId === conversationId && axmReadAssistResponseStatus(message.metadata) === 'streaming');\n for (const message of stillStreaming) {\n const meta = { ...(message.metadata ?? {}) } as Record<string, unknown>;\n meta['isStreaming'] = false;\n meta['assistResponseStatus'] = 'incomplete';\n meta['assistResponseError'] = errorMessage;\n this.applyLiveMessage({ ...message, metadata: meta }, { isNew: false });\n }\n if (stillStreaming.length > 0) {\n void this.showAssistToast('@conversation:chat.assist.errors.stream-title', errorMessage);\n }\n this.syncComposerGeneratingForConversation(conversationId, false);\n }\n\n //#region ----- Composer generation state -----\n\n /** Syncs composer Stop / spinner with assist streaming for the focused conversation. */\n async syncComposerGenerationForFocus(conversationId: string | null): Promise<void> {\n const scoped = conversationId?.trim();\n if (!scoped) {\n this.markComposerGenerating(null, false);\n return;\n }\n const hasStreaming = await this.hasStreamingAssistPlaceholders(scoped);\n if (this.userCancelledConversationIds.has(scoped)) {\n this.markComposerGenerating(scoped, false);\n return;\n }\n if (hasStreaming && this.shouldDeferGeneratingTrue(scoped)) {\n return;\n }\n this.markComposerGenerating(scoped, hasStreaming);\n }\n\n async cancelAssistGeneration(conversationId: string): Promise<void> {\n const scoped =\n conversationId.trim()\n || this.composerGenerationConversationId?.trim()\n || this.focus.getFocusedConversationId()?.trim()\n || this.resolveActiveStreamingConversationId();\n\n if (!scoped) {\n this.markComposerGenerating(null, false);\n return;\n }\n\n this.userCancelledConversationIds.add(scoped);\n this.freezeLiveStreamingAsUserCancelled(scoped);\n\n const existing = this.cancelAssistByConversation.get(scoped);\n if (existing) {\n return existing;\n }\n\n const pending = this.runCancelAssistGeneration(scoped).finally(() => {\n if (this.cancelAssistByConversation.get(scoped) === pending) {\n this.cancelAssistByConversation.delete(scoped);\n }\n });\n this.cancelAssistByConversation.set(scoped, pending);\n return pending;\n }\n\n private async runCancelAssistGeneration(conversationId: string): Promise<void> {\n const scoped = conversationId.trim();\n if (!scoped) {\n this.markComposerGenerating(null, false);\n return;\n }\n\n try {\n await this.transportService.execute(AXMAiManagementTransportKeys.ConversationAssist.CancelAssist, {\n conversationId: scoped,\n });\n await this.requestAssistSync(scoped, { force: true });\n await this.syncAssistMessagesFromStore(scoped);\n this.markComposerGenerating(scoped, false);\n } catch (error: unknown) {\n const text = error instanceof Error ? error.message : String(error);\n if (this.focus.isFocused(scoped)) {\n void this.showAssistToast('@conversation:chat.assist.errors.stream-title', text);\n }\n this.userCancelledConversationIds.delete(scoped);\n const hasStreaming = await this.hasStreamingAssistPlaceholders(scoped);\n this.markComposerGenerating(scoped, hasStreaming);\n }\n }\n\n private freezeLiveStreamingAsUserCancelled(conversationId: string): void {\n for (const message of [...this.messageCache.values()]) {\n if (message.conversationId !== conversationId) {\n continue;\n }\n if (axmReadAssistResponseStatus(message.metadata) !== 'streaming') {\n continue;\n }\n const meta = { ...(message.metadata ?? {}) } as Record<string, unknown>;\n meta['isStreaming'] = false;\n meta['assistResponseStatus'] = 'incomplete';\n meta['assistResponseError'] = 'Cancelled by user.';\n this.applyLiveMessage({ ...message, metadata: meta }, { isNew: false });\n }\n }\n\n private shouldIgnoreStreamingAfterUserCancel(conversationId: string): boolean {\n const scoped = conversationId.trim();\n return this.userCancelledConversationIds.has(scoped) || this.cancelAssistByConversation.has(scoped);\n }\n\n private markComposerGenerating(conversationId: string | null, generating: boolean): void {\n if (generating && conversationId) {\n this.composerGenerationConversationId = conversationId;\n this.generationState.setGenerating(true);\n return;\n }\n\n if (!generating) {\n if (\n conversationId &&\n this.composerGenerationConversationId &&\n this.composerGenerationConversationId !== conversationId\n ) {\n return;\n }\n this.composerGenerationConversationId = null;\n this.generationState.setGenerating(false);\n }\n }\n\n private syncComposerGeneratingForConversation(conversationId: string, generating: boolean): void {\n if (!this.focus.isFocused(conversationId)) {\n return;\n }\n if (generating && this.shouldDeferGeneratingTrue(conversationId)) {\n return;\n }\n this.markComposerGenerating(conversationId, generating);\n }\n\n /** Stream patches must not reset `stopping` back to `generating` while cancel is in flight. */\n private shouldDeferGeneratingTrue(conversationId: string): boolean {\n return (\n this.cancelAssistByConversation.has(conversationId)\n || this.userCancelledConversationIds.has(conversationId)\n || this.generationState.isStopping()\n );\n }\n\n private resolveActiveStreamingConversationId(): string | null {\n for (const message of this.messageCache.values()) {\n if (axmReadAssistResponseStatus(message.metadata) === 'streaming') {\n return message.conversationId;\n }\n }\n return this.composerGenerationConversationId;\n }\n\n //#endregion\n}\n\n/** @deprecated Use {@link AXEConversationAssistResponseService}. */\nexport const AXCConversationAssistResponseService = AXEConversationAssistResponseService;\n\n//#endregion\n","import { AXPAvatarComponent } from '@acorex-platform/framework-client/layout/components';\nimport { AXPLayoutThemeService } from '@acorex-platform/framework-client/themes/shared';\nimport {\n axmChatAiTargetAvatarUrl,\n axmChatAiTargetDisplayName,\n axmFilterChatAiTargets,\n type AXMChatAiTargetRow,\n} from '@acorex-platform/module-conversation-client';\nimport { AXClosableComponent, AXComponentCloseEvent, AXDataSource } from '@acorex/cdk/common';\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { AXConversation } from '@acorex/components/conversation';\nimport { AXDecoratorGenericComponent } from '@acorex/components/decorators';\nimport { AXListComponent } from '@acorex/components/list';\nimport { AXBasePageComponent } from '@acorex/components/page';\nimport type { AXPopupRef } from '@acorex/components/popup';\nimport { AXSearchBoxComponent } from '@acorex/components/search-box';\nimport { AXSkeletonComponent } from '@acorex/components/skeleton';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, TemplateRef, effect, inject, input, signal, viewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { AXMChatAssistLauncherService } from '../services/assist-chat-launcher.service';\n\n@Component({\n selector: 'axm-chat-with-assist-dialog',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, FormsModule, AXButtonComponent, AXListComponent, AXSearchBoxComponent, AXPAvatarComponent, AXDecoratorGenericComponent, AXSkeletonComponent, AXTranslationModule],\n providers: [{ provide: AXClosableComponent, useExisting: AXMChatWithAssistDialogComponent }],\n template: `\n <div class=\"new-conversation-panel\">\n <div class=\"new-conversation-dialog-content\">\n <div class=\"form-field form-field--grow\">\n <div class=\"users-list-wrap\">\n <div class=\"users-list-search\">\n <ax-search-box [value]=\"searchQuery()\" (valueChange)=\"onSearchChange($event)\" [disabled]=\"starting()\" [placeholder]=\"('@conversation:chat.assist-dialog.search.placeholder' | translate | async) ?? ''\"></ax-search-box>\n </div>\n <ax-list\n #assistsList\n class=\"users-list\"\n [dataSource]=\"assistListDataSource\"\n [multiple]=\"false\"\n [checkbox]=\"false\"\n [disabled]=\"starting()\"\n [valueField]=\"'id'\"\n [textField]=\"'name'\"\n [itemHeight]=\"60\"\n [ngModel]=\"selectedTargetIds()\"\n (ngModelChange)=\"onSelectedTargetsChange($event ?? [])\"\n [emptyTemplate]=\"assistsListEmptyTpl()\"\n [loadingTemplate]=\"assistsListLoadingTpl()\"\n [itemTemplate]=\"assistItemTpl\"\n ></ax-list>\n </div>\n </div>\n </div>\n <ax-footer class=\"dialog-footer\">\n <ax-suffix>\n <ax-button [text]=\"('@conversation:comments.actions.cancel.title' | translate | async) ?? ''\" [look]=\"'solid'\" [disabled]=\"starting()\" (onClick)=\"onCancel()\"></ax-button>\n <ax-button\n [text]=\"('@conversation:chat.assist-dialog.actions.start-chat' | translate | async) ?? ''\"\n [look]=\"'solid'\"\n [color]=\"'primary'\"\n [disabled]=\"!selectedTargetIds().length || loading() || starting()\"\n (onClick)=\"onStartChat()\"\n ></ax-button>\n </ax-suffix>\n </ax-footer>\n </div>\n\n <ng-template #assistsListEmpty>\n <div class=\"users-list-empty\">\n @if (searchQuery()) {\n {{ '@conversation:chat.assist-dialog.states.no-search-result' | translate | async }}\n } @else {\n {{ '@conversation:chat.assist-dialog.states.no-assists' | translate | async }}\n }\n </div>\n </ng-template>\n\n <ng-template #assistsListLoading>\n <div class=\"user-item-skeleton\">\n <ax-skeleton class=\"skeleton-avatar\" [animated]=\"true\"></ax-skeleton>\n <div class=\"skeleton-text\">\n <ax-skeleton class=\"skeleton-name\" [animated]=\"true\"></ax-skeleton>\n <ax-skeleton class=\"skeleton-description\" [animated]=\"true\"></ax-skeleton>\n </div>\n </div>\n </ng-template>\n\n <ng-template #assistItemTpl let-item>\n @if (targetFromItem(item); as row) {\n <div class=\"user-item-content\">\n <axp-avatar [size]=\"48\" [fullName]=\"displayName(row)\" [src]=\"targetAvatarUrl(row) ?? ''\" />\n <div class=\"user-item-text\">\n <span class=\"truncated user-name-text\">{{ row.title | translate | async }}</span>\n @if (row.description) {\n <span class=\"user-description-text truncated\">{{ row.description | translate | async }}</span>\n }\n </div>\n </div>\n }\n </ng-template>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n\n .new-conversation-panel {\n display: flex;\n flex-direction: column;\n width: 100%;\n overflow: hidden;\n }\n\n .new-conversation-dialog-content {\n flex: 1;\n min-height: 0;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n }\n\n .form-field--grow {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n }\n\n .form-field {\n display: flex;\n flex-direction: column;\n gap: 0.35rem;\n }\n\n .users-list-wrap {\n display: flex;\n flex-direction: column;\n height: min(50vh, 36rem);\n overflow: hidden;\n }\n\n .users-list-search {\n flex: 0 0 auto;\n padding: 0.5rem 0.75rem;\n border-bottom: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n background: rgb(var(--ax-sys-color-lighter-surface));\n }\n\n .users-list {\n display: block;\n flex: 1 1 auto;\n min-height: 0;\n }\n\n .user-item-content {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n height: 100%;\n padding: 0.5rem 0.75rem;\n min-width: 0;\n }\n\n .user-item-text {\n display: flex;\n flex-direction: column;\n justify-content: center;\n min-width: 0;\n flex: 1;\n gap: 0.125rem;\n }\n\n .user-name-text {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 0.875rem;\n line-height: 1.25rem;\n font-weight: 500;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .user-description-text {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 0.875rem;\n line-height: 1.25rem;\n font-weight: 400;\n opacity: 0.72;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .users-list-empty {\n padding: 1rem;\n text-align: center;\n font-size: 0.85rem;\n opacity: 0.7;\n }\n\n .user-item-skeleton {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n height: 60px;\n padding: 0.5rem 1.25rem;\n min-width: 0;\n }\n\n .skeleton-avatar {\n flex: 0 0 auto;\n width: 3rem;\n height: 3rem;\n border-radius: 9999px;\n }\n\n .skeleton-text {\n display: flex;\n flex-direction: column;\n min-width: 0;\n flex: 1;\n gap: 0.5rem;\n }\n\n .skeleton-name {\n height: 1rem;\n width: 60%;\n border-radius: 0.25rem;\n }\n\n .skeleton-description {\n height: 0.75rem;\n width: 40%;\n border-radius: 0.25rem;\n }\n `,\n ],\n})\nexport class AXMChatWithAssistDialogComponent extends AXBasePageComponent {\n private readonly toastService = inject(AXToastService);\n private readonly translationService = inject(AXTranslationService);\n private readonly assistLauncher = inject(AXMChatAssistLauncherService);\n private readonly layoutTheme = inject(AXPLayoutThemeService);\n\n readonly __popup__ = input<AXPopupRef | undefined>(undefined);\n readonly embeddedInTabs = input(false);\n readonly rows = signal<AXMChatAiTargetRow[]>([]);\n readonly loading = signal(true);\n readonly starting = signal(false);\n readonly searchQuery = signal('');\n readonly selectedTargetIds = signal<string[]>([]);\n\n private targetsLoadPromise: Promise<void> | null = null;\n readonly assistListDataSource = new AXDataSource<unknown>({\n pageSize: 100,\n key: 'id',\n load: async (e) => {\n await this.ensureTargetsLoaded();\n const filtered = this.filteredTargetRows() as unknown[];\n return { items: filtered.slice(e.skip, e.skip + e.take), total: filtered.length };\n },\n byKey: (key) => Promise.resolve(this.rows().find((r) => r.id === key) ?? null),\n });\n\n readonly assistsListEmptyTpl = viewChild.required<TemplateRef<unknown>>('assistsListEmpty');\n readonly assistsListLoadingTpl = viewChild.required<TemplateRef<unknown>>('assistsListLoading');\n readonly assistsList = viewChild<AXListComponent>('assistsList');\n\n private readonly syncPopupTitle = effect(() => {\n if (this.embeddedInTabs()) return;\n const popupRef = this.__popup__();\n if (popupRef) {\n this.setTitle = (t: string) => popupRef.setTitle(t);\n void this.#updatePopupTitle(popupRef);\n }\n });\n\n targetFromItem(item: unknown): AXMChatAiTargetRow | null {\n if (!item || typeof item !== 'object') return null;\n const o = item as Record<string, unknown>;\n if ('data' in o && o['data'] && typeof o['data'] === 'object') return o['data'] as AXMChatAiTargetRow;\n if (typeof o['id'] === 'string' && typeof o['name'] === 'string') return o as unknown as AXMChatAiTargetRow;\n return null;\n }\n\n onSelectedTargetsChange(value: string[] | string | null): void {\n if (value == null) {\n this.selectedTargetIds.set([]);\n return;\n }\n this.selectedTargetIds.set(Array.isArray(value) ? value : [value]);\n }\n\n onSearchChange(value: string): void {\n this.searchQuery.set(value ?? '');\n this.assistsList()?.refresh(false);\n }\n\n private async ensureTargetsLoaded(): Promise<void> {\n if (!this.targetsLoadPromise) this.targetsLoadPromise = this.loadTargetsFromApi();\n await this.targetsLoadPromise;\n }\n\n private async loadTargetsFromApi(): Promise<void> {\n this.loading.set(true);\n try {\n let targets = await this.assistLauncher.loadTargets();\n if (!targets.length) {\n targets = await this.assistLauncher.loadTargets(true);\n }\n this.rows.set(targets);\n } catch (error: unknown) {\n console.error('Failed to load AI chat targets:', error);\n const message = await this.translationService.translateAsync('@conversation:chat.assist-dialog.errors.load-assists');\n this.toastService.danger(message);\n this.rows.set([]);\n } finally {\n this.loading.set(false);\n queueMicrotask(() => this.assistsList()?.refresh(false));\n }\n }\n\n private filteredTargetRows(): AXMChatAiTargetRow[] {\n return axmFilterChatAiTargets((value) => this.translationService.resolve(value), this.rows(), this.searchQuery());\n }\n\n displayName(row: AXMChatAiTargetRow): string {\n return axmChatAiTargetDisplayName((value) => this.translationService.resolve(value), row);\n }\n\n targetAvatarUrl(row: AXMChatAiTargetRow): string | null {\n return axmChatAiTargetAvatarUrl(row);\n }\n\n onCancel(): void {\n const event = new AXComponentCloseEvent();\n event.component = this;\n event.data = null;\n this.onClosed.emit(event);\n }\n\n async onStartChat(): Promise<void> {\n if (this.starting()) {\n return;\n }\n\n const targetId = this.selectedTargetIds()[0];\n if (!targetId) {\n return;\n }\n\n const row = this.rows().find((r) => r.id === targetId);\n if (!row) {\n return;\n }\n\n this.starting.set(true);\n this.layoutTheme.setOverlayLoading(true);\n try {\n // Create + select without route change first. Navigating while the popup is open\n // destroys this component and unsubscribes `onClosed` → ObjectUnsubscribedError toast.\n const result = await this.assistLauncher.startAssistChatFromRow(row, false);\n if (!result?.conversation) {\n return;\n }\n\n const event = new AXComponentCloseEvent();\n event.component = this;\n event.data = result.conversation as AXConversation;\n this.#emitClosed(event);\n await this.assistLauncher.navigateToConversation(result.conversation.id);\n } catch (error: unknown) {\n console.error('Failed to start assist chat:', error);\n const message = await this.translationService.translateAsync('@conversation:chat.assist-dialog.errors.start-chat');\n this.toastService.danger(message);\n } finally {\n this.starting.set(false);\n this.layoutTheme.setOverlayLoading(false);\n }\n }\n\n #emitClosed(event: AXComponentCloseEvent): void {\n try {\n this.onClosed.emit(event);\n } catch {\n // Popup may already be tearing down; conversation was created successfully.\n }\n }\n\n async #updatePopupTitle(popupRef: AXPopupRef): Promise<void> {\n const title = await this.translationService.translateAsync('@conversation:new-conversation.actions.chat-with-ai');\n popupRef.setTitle(title);\n }\n}\n","import { AXClickEvent } from '@acorex/cdk/common';\nimport { AXPopupService } from '@acorex/components/popup';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport {\n AXM_CHAT_SIDEBAR_ACTION_PROVIDER,\n type AXMChatSidebarAction,\n} from '@acorex-platform/module-conversation-client';\nimport { Provider, inject } from '@angular/core';\nimport { AXMChatAssistLauncherService } from '../services/assist-chat-launcher.service';\nimport { AXMChatWithAssistDialogComponent } from './chat-with-assist-dialog.component';\n\nclass AXMChatSidebarAssistAction implements AXMChatSidebarAction {\n id = 'chat-with-ai';\n label = '@conversation:new-conversation.actions.chat-with-ai';\n icon = 'fa-light fa-robot';\n priority = 20;\n\n private readonly popupService = inject(AXPopupService);\n private readonly translationService = inject(AXTranslationService);\n private readonly assistLauncher = inject(AXMChatAssistLauncherService);\n\n async run(event?: AXClickEvent): Promise<null> {\n event?.nativeEvent?.stopPropagation();\n // Await catalog so the dialog's first AXList load is not racing an empty/incomplete query.\n await this.assistLauncher.loadTargets();\n const title = await this.translationService.translateAsync('@conversation:new-conversation.actions.chat-with-ai');\n await this.popupService.open(AXMChatWithAssistDialogComponent, {\n title,\n size: 'sm',\n closeButton: true,\n });\n return null;\n }\n}\n\nexport const AXM_CHAT_SIDEBAR_ASSIST_ACTION_PROVIDERS: Provider[] = [\n AXMChatSidebarAssistAction,\n {\n provide: AXM_CHAT_SIDEBAR_ACTION_PROVIDER,\n useExisting: AXMChatSidebarAssistAction,\n multi: true,\n },\n];\n","//#region ----- Imports -----\n\nimport { AXMMiniChatPanelService, axmEntityRefFromLaunchContext } from '@acorex-platform/module-conversation-client';\nimport { axmSanitizeContextualAssistContext, type AXMContextualAssistContext } from '@acorex-platform/module-conversation-client/contracts';\nimport { Injectable, inject } from '@angular/core';\n\n//#endregion\n\n//#region ----- Service -----\n\n/**\n * Opens the shared mini-chat overlay with caller-supplied assist context.\n * Same panel as the header inbox so streaming and route persistence stay aligned.\n */\n@Injectable()\nexport class AXMContextualAssistLauncherService {\n //#region ----- Services & Dependencies -----\n\n private readonly panelService = inject(AXMMiniChatPanelService);\n\n //#endregion\n\n //#region ----- Public API -----\n\n isOpen(): boolean {\n return this.panelService.isOpen();\n }\n\n async open(\n context: AXMContextualAssistContext,\n options?: { assistId?: string; forceNewChat?: boolean },\n ): Promise<void> {\n const launchContext = axmSanitizeContextualAssistContext(context);\n const assistId = options?.assistId?.trim();\n const entityRef = axmEntityRefFromLaunchContext(launchContext);\n await this.panelService.open({\n ...(entityRef\n ? { scope: 'entity' as const, entityId: entityRef.entityId, entityType: entityRef.entityType }\n : { scope: 'inbox' as const }),\n forceNewChat: options?.forceNewChat ?? true,\n showInfoBar: false,\n showComposer: true,\n launchContext,\n ...(assistId ? { assistId } : {}),\n });\n }\n\n /** Closes the panel when it is open; otherwise opens it (restores the last thread). */\n async toggle(\n context: AXMContextualAssistContext,\n options?: { assistId?: string },\n ): Promise<void> {\n if (this.isOpen()) {\n this.close();\n return;\n }\n await this.open(context, { ...options, forceNewChat: false });\n }\n\n close(): void {\n this.panelService.close();\n }\n\n //#endregion\n}\n\n//#endregion\n","import { AXP_SEARCH_DEFINITION_PROVIDER, AXP_SEARCH_PROVIDER } from '@acorex-platform/framework-client/common';\nimport { AXPComponentSlotModule, AXP_APP_STARTUP_PRIORITY, provideAppStartUpTask } from '@acorex-platform/framework-client/core';\nimport { provideCommandSetups } from '@acorex-platform/framework-client/runtime';\nimport {\n CONVERSATION_SEND_ASSIST_CHAT_MESSAGE_COMMAND,\n CONVERSATION_START_ASSIST_CHAT_COMMAND,\n AXM_CHAT_ASSIST_CATALOG_PORT,\n AXM_CONVERSATION_ASSIST_BACKGROUND_OPERATION_HANDLERS,\n AXM_CONVERSATION_ASSIST_RESPONSE_PORT,\n AXMMiniChatHeaderSlotComponent,\n AXMMiniChatFooterDockComponent,\n} from '@acorex-platform/module-conversation-client';\nimport { NgModule, inject } from '@angular/core';\nimport { AXMConversationAssistSearchDefinitionProvider } from './assist-search-definition.provider';\nimport { AXMConversationAssistSearchProvider } from './assist-search.provider';\nimport { AXE_CHAT_EMPTY_STATE_PROVIDERS } from './empty-state/chat-empty-state.provider';\nimport { AXE_MINI_CHAT_INBOX_FILTER_PROVIDERS } from './mini-chat/mini-chat-inbox-filter.provider';\nimport { AXE_ASSIST_DEFAULT_RESOLVER_PROVIDERS } from './ports/assist-default-resolver.provider';\nimport { AXEConversationAssistResponseService } from './services/conversation-assist-response.service';\nimport { AXM_CHAT_SIDEBAR_ASSIST_ACTION_PROVIDERS } from './side-bar/chat-sidebar-assist-action.provider';\nimport { AXMChatAssistLauncherService } from './services/assist-chat-launcher.service';\nimport { AXMChatAssistCatalogService } from './services/chat-assist-catalog.service';\nimport { AXMContextualAssistLauncherService } from './contextual-assist/contextual-assist-launcher.service';\n\n@NgModule({\n imports: [\n AXPComponentSlotModule.forChild({\n 'root-header-end': [\n {\n priority: 55,\n name: 'conversation-mini-chat',\n component: AXMMiniChatHeaderSlotComponent,\n },\n ],\n 'root-footer-end': [\n {\n priority: 5,\n name: 'conversation-mini-chat-dock',\n component: AXMMiniChatFooterDockComponent,\n },\n ],\n }),\n ],\n providers: [\n {\n provide: AXM_CONVERSATION_ASSIST_RESPONSE_PORT,\n useClass: AXEConversationAssistResponseService,\n },\n {\n provide: AXM_CHAT_ASSIST_CATALOG_PORT,\n useExisting: AXMChatAssistCatalogService,\n },\n ...AXM_CONVERSATION_ASSIST_BACKGROUND_OPERATION_HANDLERS,\n {\n provide: AXP_SEARCH_PROVIDER,\n useClass: AXMConversationAssistSearchProvider,\n multi: true,\n },\n {\n provide: AXP_SEARCH_DEFINITION_PROVIDER,\n useClass: AXMConversationAssistSearchDefinitionProvider,\n multi: true,\n },\n ...AXE_CHAT_EMPTY_STATE_PROVIDERS,\n ...AXE_MINI_CHAT_INBOX_FILTER_PROVIDERS,\n ...AXE_ASSIST_DEFAULT_RESOLVER_PROVIDERS,\n ...AXM_CHAT_SIDEBAR_ASSIST_ACTION_PROVIDERS,\n AXMContextualAssistLauncherService,\n provideAppStartUpTask(() => {\n const launcher = inject(AXMChatAssistLauncherService);\n return {\n name: 'conversation-assist-catalog-warm',\n priority: AXP_APP_STARTUP_PRIORITY.conversationSessionSync + 1,\n run: async () => {\n void launcher.loadTargets();\n },\n };\n }),\n provideCommandSetups([\n {\n key: CONVERSATION_START_ASSIST_CHAT_COMMAND,\n command: () => import('./commands/start-assist-chat.command').then((m) => m.AXMConversationStartAssistChatCommand),\n },\n {\n key: CONVERSATION_SEND_ASSIST_CHAT_MESSAGE_COMMAND,\n command: () =>\n import('./commands/send-assist-chat-message.command').then((m) => m.AXMConversationSendAssistChatMessageCommand),\n },\n ]),\n ],\n})\nexport class AXEAIConversationExtensionModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["AIMANAGEMENT_STRUCTURED_TEXT_COMPLETION_COMMAND_KEY","axpAiChatTextMessage","i2","i3","i1"],"mappings":"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"}