@acorex-platform/module-conversation-client 0.0.37 → 0.0.46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/{acorex-platform-module-conversation-client-acorex-platform-module-conversation-client-C8FR7Snp.mjs → acorex-platform-module-conversation-client-acorex-platform-module-conversation-client-DUR2oyfP.mjs} +10935 -9294
- package/fesm2022/acorex-platform-module-conversation-client-acorex-platform-module-conversation-client-DUR2oyfP.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-conversation-client-after-message-sent.command-hVFQo07j.mjs → acorex-platform-module-conversation-client-after-message-sent.command-qTWATpgC.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-conversation-client-after-message-sent.command-hVFQo07j.mjs.map → acorex-platform-module-conversation-client-after-message-sent.command-qTWATpgC.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-conversation-client-assist-delegated-agent-detail-popup.component-D6XrMTQm.mjs → acorex-platform-module-conversation-client-assist-delegated-agent-detail-popup.component-DQWhOmBE.mjs} +8 -7
- package/fesm2022/{acorex-platform-module-conversation-client-assist-delegated-agent-detail-popup.component-D6XrMTQm.mjs.map → acorex-platform-module-conversation-client-assist-delegated-agent-detail-popup.component-DQWhOmBE.mjs.map} +1 -1
- package/fesm2022/acorex-platform-module-conversation-client-assist-message-renderer.component-DyVepuaW.mjs +1756 -0
- package/fesm2022/acorex-platform-module-conversation-client-assist-message-renderer.component-DyVepuaW.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-conversation-client-assist-tool-detail-popup.component-D8na_1QJ.mjs +120 -0
- package/fesm2022/{acorex-platform-module-conversation-client-assist-tool-detail-popup.component-BV1YH96m.mjs.map → acorex-platform-module-conversation-client-assist-tool-detail-popup.component-D8na_1QJ.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-conversation-client-chat-call-session-page.component-b84Na7R_.mjs → acorex-platform-module-conversation-client-chat-call-session-page.component-BeS4Duip.mjs} +747 -25
- package/fesm2022/acorex-platform-module-conversation-client-chat-call-session-page.component-BeS4Duip.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-conversation-client-chat-call-start-popup.component-BTOtRRPY.mjs → acorex-platform-module-conversation-client-chat-call-start-popup.component-BbEhkLLh.mjs} +4 -4
- package/fesm2022/{acorex-platform-module-conversation-client-chat-call-start-popup.component-BTOtRRPY.mjs.map → acorex-platform-module-conversation-client-chat-call-start-popup.component-BbEhkLLh.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-conversation-client-chat-conversation-info-media-view.component-CppNPfqe.mjs → acorex-platform-module-conversation-client-chat-conversation-info-media-view.component-Bnbj0e6M.mjs} +3 -3
- package/fesm2022/{acorex-platform-module-conversation-client-chat-conversation-info-media-view.component-CppNPfqe.mjs.map → acorex-platform-module-conversation-client-chat-conversation-info-media-view.component-Bnbj0e6M.mjs.map} +1 -1
- package/fesm2022/acorex-platform-module-conversation-client-chat-conversation-info-panel.component-bwT1-lAn.mjs +497 -0
- package/fesm2022/acorex-platform-module-conversation-client-chat-conversation-info-panel.component-bwT1-lAn.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-conversation-client-comments-page.component-BhSJiJY5.mjs → acorex-platform-module-conversation-client-comments-page.component-BxUz9jTX.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-conversation-client-comments-page.component-BhSJiJY5.mjs.map → acorex-platform-module-conversation-client-comments-page.component-BxUz9jTX.mjs.map} +1 -1
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entities-channel-audience.mjs +277 -0
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entities-channel-audience.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entities-channel-post.mjs +530 -0
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entities-channel-post.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entities-channel-receipt.mjs +206 -0
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entities-channel-receipt.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entities-message.mjs +65 -17
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entities-message.mjs.map +1 -1
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entities-room.mjs +231 -59
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entities-room.mjs.map +1 -1
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-acorex-platform-module-conversation-client-contracts-entity-catalog-CV_sCYGf.mjs +87 -0
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-acorex-platform-module-conversation-client-contracts-entity-catalog-CV_sCYGf.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-channel-audience.entity-DyaUcESJ.mjs +213 -0
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-channel-audience.entity-DyaUcESJ.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-channel-post.entity-CbBcChEt.mjs +466 -0
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-channel-post.entity-CbBcChEt.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-channel-receipt.entity-DtRFj8zV.mjs +142 -0
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-channel-receipt.entity-DtRFj8zV.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-conversation-client-contracts-entity-catalog-message.entity-Dz7cO1P4.mjs → acorex-platform-module-conversation-client-contracts-entity-catalog-message.entity-CJk1wEvA.mjs} +35 -19
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-message.entity-CJk1wEvA.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-room.entity-Ctt7qzfF.mjs +403 -0
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-room.entity-Ctt7qzfF.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog.mjs +1 -1
- package/fesm2022/acorex-platform-module-conversation-client-contracts.mjs +846 -4
- package/fesm2022/acorex-platform-module-conversation-client-contracts.mjs.map +1 -1
- package/fesm2022/acorex-platform-module-conversation-client-local-entities.mjs +3 -0
- package/fesm2022/acorex-platform-module-conversation-client-local-entities.mjs.map +1 -1
- package/fesm2022/{acorex-platform-module-conversation-client-mark-conversation-unread.command-D0rr0npJ.mjs → acorex-platform-module-conversation-client-mark-conversation-unread.command-juoWxu7I.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-conversation-client-mark-conversation-unread.command-D0rr0npJ.mjs.map → acorex-platform-module-conversation-client-mark-conversation-unread.command-juoWxu7I.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-conversation-client-open-chat.command-Bbgp4ZfT.mjs → acorex-platform-module-conversation-client-open-chat.command-ridcdmj7.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-conversation-client-open-chat.command-Bbgp4ZfT.mjs.map → acorex-platform-module-conversation-client-open-chat.command-ridcdmj7.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-conversation-client-retry-assist-response.command-BMZTab8j.mjs → acorex-platform-module-conversation-client-retry-assist-response.command-BsYxaH3g.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-conversation-client-retry-assist-response.command-BMZTab8j.mjs.map → acorex-platform-module-conversation-client-retry-assist-response.command-BsYxaH3g.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-conversation-client-sync-read-state.command-9G3Knrre.mjs → acorex-platform-module-conversation-client-sync-read-state.command-DsCyIdEk.mjs} +7 -2
- package/fesm2022/acorex-platform-module-conversation-client-sync-read-state.command-DsCyIdEk.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-conversation-client.mjs +1 -1
- package/package.json +14 -2
- package/types/acorex-platform-module-conversation-client-contracts-entities-channel-audience.d.ts +5 -0
- package/types/acorex-platform-module-conversation-client-contracts-entities-channel-post.d.ts +5 -0
- package/types/acorex-platform-module-conversation-client-contracts-entities-channel-receipt.d.ts +5 -0
- package/types/acorex-platform-module-conversation-client-contracts.d.ts +432 -2
- package/types/acorex-platform-module-conversation-client.d.ts +680 -161
- package/fesm2022/acorex-platform-module-conversation-client-acorex-platform-module-conversation-client-C8FR7Snp.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-conversation-client-assist-tool-detail-popup.component-BV1YH96m.mjs +0 -120
- package/fesm2022/acorex-platform-module-conversation-client-chat-call-session-page.component-b84Na7R_.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-conversation-client-chat-conversation-info-panel.component-C5xS98oE.mjs +0 -472
- package/fesm2022/acorex-platform-module-conversation-client-chat-conversation-info-panel.component-C5xS98oE.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-acorex-platform-module-conversation-client-contracts-entity-catalog-Cy3LwYMZ.mjs +0 -52
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-acorex-platform-module-conversation-client-contracts-entity-catalog-Cy3LwYMZ.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-message.entity-Dz7cO1P4.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-room.entity-B9txvc3y.mjs +0 -263
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-room.entity-B9txvc3y.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-conversation-client-sync-read-state.command-9G3Knrre.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-module-conversation-client-assist-delegated-agent-detail-popup.component-D6XrMTQm.mjs","sources":["../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/utils/assist-debug-information.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/utils/assist-delegated-agent-detail-export.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/utils/assist-delegated-agent-transcript-view.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/message-renderers/assist-delegated-agent-transcript-view.component.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/message-renderers/assist-delegated-agent-transcript-view.component.html","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/message-renderers/assist-delegated-agent-detail-popup.component.ts"],"sourcesContent":["//#region ---- Imports ----\n\nimport type { AXConversation, AXConversationMessage } from '@acorex/components/conversation';\nimport type {\n AXPAiChatMessage,\n AXPAiDelegatedAgentTranscriptEntry,\n AXPAiEngineLastProviderPayload,\n AXPAiEngineRunResult,\n AXPAiEngineUsageTotals,\n} from '@acorex-platform/module-ai-management-client';\nimport { axpAiChatTextMessage, axpSanitizeLastProviderPayloadForPersistence } from '@acorex-platform/module-ai-management-client';\n\nimport { axmReadAssistAiTranscript, axmReadAssistAiTranscriptRaw } from './assist-bot-transcript.util';\n\n//#endregion\n\n//#region ---- Types ----\n\n/** One conversation turn exported as an engine run result (user or assist). */\nexport interface AXMAssistConversationDebugTurn {\n messageId: string;\n timestamp: string;\n result: AXPAiEngineRunResult;\n}\n\n/** Full assist conversation debug export (chronological turns). */\nexport interface AXMAssistConversationDebugExport {\n exportedAt: string;\n conversation: {\n id: string;\n title?: string;\n type?: string;\n metadata?: unknown;\n participants?: unknown;\n };\n turns: AXMAssistConversationDebugTurn[];\n}\n\n//#endregion\n\n//#region ---- Message classification ----\n\n/** True when the message carries assist / AI debug payload worth exporting. */\nexport function axmIsAssistDebugMessage(message: AXConversationMessage | null | undefined): boolean {\n if (!message) {\n return false;\n }\n if (message.type === 'assist-response') {\n return true;\n }\n const meta = message.metadata as Record<string, unknown> | undefined;\n if (meta?.['isAssistResponse'] === true) {\n return true;\n }\n const transcript = axmReadAssistAiTranscript(meta);\n return transcript != null && transcript.length > 0;\n}\n\n//#endregion\n\n//#region ---- Serialization ----\n\nfunction toIsoTimestamp(value: AXConversationMessage['timestamp']): string {\n if (value instanceof Date) {\n return value.toISOString();\n }\n if (typeof value === 'string' || typeof value === 'number') {\n const parsed = new Date(value);\n if (!Number.isNaN(parsed.getTime())) {\n return parsed.toISOString();\n }\n }\n return String(value ?? '');\n}\n\nfunction readRecord(meta: Record<string, unknown> | undefined, key: string): unknown {\n return meta?.[key];\n}\n\n/**\n * Reconstructs {@link AXPAiEngineRunResult} from assist message metadata\n * (same shape returned by {@link AXPAiEngine.run}).\n */\nexport function axmBuildAssistEngineRunResult(message: AXConversationMessage): AXPAiEngineRunResult {\n const meta =\n typeof message.metadata === 'object' && message.metadata != null\n ? (message.metadata as Record<string, unknown>)\n : undefined;\n\n const result: AXPAiEngineRunResult = {\n messages: axmReadAssistAiTranscriptRaw(meta),\n };\n\n const usage = readRecord(meta, 'assistRunUsageTotals');\n if (usage != null && typeof usage === 'object') {\n result.usageTotals = usage as AXPAiEngineUsageTotals;\n }\n\n const lastProvider = readRecord(meta, 'assistRunLastProviderResult');\n if (lastProvider != null && typeof lastProvider === 'object') {\n result.lastProviderResult = axpSanitizeLastProviderPayloadForPersistence(\n lastProvider as AXPAiEngineLastProviderPayload,\n );\n }\n\n const delegated = readRecord(meta, 'assistRunDelegatedTranscriptsByCallId');\n if (delegated != null && typeof delegated === 'object' && !Array.isArray(delegated)) {\n result.delegatedTranscriptsByCallId = delegated as Record<string, AXPAiDelegatedAgentTranscriptEntry>;\n }\n\n return result;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction extractUserChatText(message: AXConversationMessage): string {\n const payload = message.payload;\n if (!isRecord(payload)) {\n return '';\n }\n const text = payload['text'];\n return typeof text === 'string' ? text.trim() : '';\n}\n\n/** User chat line as a minimal engine run result (`messages` only). */\nexport function axmBuildUserTurnEngineRunResult(message: AXConversationMessage): AXPAiEngineRunResult {\n const text = extractUserChatText(message);\n return {\n messages: text ? [axpAiChatTextMessage('user', text)] : [],\n };\n}\n\n/**\n * Pretty-printed JSON for clipboard export (single assist run — {@link AXPAiEngineRunResult}).\n */\nexport function axmFormatAssistMessageDebugText(message: AXConversationMessage): string {\n const run = axmIsAssistDebugMessage(message)\n ? axmBuildAssistEngineRunResult(message)\n : axmBuildUserTurnEngineRunResult(message);\n return JSON.stringify(run, null, 2);\n}\n\n/**\n * Pretty-printed JSON for clipboard export (conversation turns as engine run results).\n */\nexport function axmFormatAssistConversationDebugText(\n conversation: AXConversation | { id?: string; title?: string; type?: string; metadata?: unknown; participants?: unknown },\n messages: AXConversationMessage[],\n): string {\n const chronological = [...messages].sort(\n (a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime(),\n );\n\n const turns: AXMAssistConversationDebugTurn[] = chronological.map((message) => ({\n messageId: message.id,\n timestamp: toIsoTimestamp(message.timestamp),\n result: axmIsAssistDebugMessage(message)\n ? axmBuildAssistEngineRunResult(message)\n : axmBuildUserTurnEngineRunResult(message),\n }));\n\n const snapshot: AXMAssistConversationDebugExport = {\n exportedAt: new Date().toISOString(),\n conversation: {\n id: conversation.id ?? '',\n title: conversation.title,\n type: conversation.type,\n metadata: conversation.metadata,\n participants: conversation.participants,\n },\n turns,\n };\n\n return JSON.stringify(snapshot, null, 2);\n}\n\n/** Safe fragment for debug export filenames. */\nexport function axmSanitizeDebugFilenamePart(id: string): string {\n const sanitized = id.replace(/[^\\w.-]+/g, '_').slice(0, 80).trim();\n return sanitized.length > 0 ? sanitized : 'debug';\n}\n\n/** Triggers a browser download of pretty-printed JSON debug export. */\nexport function axmDownloadDebugJson(filename: string, text: string): void {\n if (!text.trim() || typeof document === 'undefined') {\n return;\n }\n const blob = new Blob([text], { type: 'application/json;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = filename.endsWith('.json') ? filename : `${filename}.json`;\n anchor.rel = 'noopener';\n anchor.click();\n URL.revokeObjectURL(url);\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type {\n AXPAiChatMessage,\n AXPAiDelegatedAgentTranscriptRunInput,\n} from '@acorex-platform/module-ai-management-client';\n\nimport { axmDownloadDebugJson, axmSanitizeDebugFilenamePart } from './assist-debug-information.util';\n\n//#endregion\n\n//#region ---- Types ----\n\n/** JSON shape for delegated specialist detail download. */\nexport interface AXMAssistDelegatedAgentDetailExport {\n exportedAt: string;\n delegationCallId: string;\n agentName?: string;\n runInput?: AXPAiDelegatedAgentTranscriptRunInput;\n messages: AXPAiChatMessage[];\n}\n\n//#endregion\n\n//#region ---- Export ----\n\nexport function axmFormatDelegatedAgentDetailExportJson(\n delegationCallId: string,\n messages: AXPAiChatMessage[],\n runInput?: AXPAiDelegatedAgentTranscriptRunInput,\n agentName?: string,\n): string {\n const snapshot: AXMAssistDelegatedAgentDetailExport = {\n exportedAt: new Date().toISOString(),\n delegationCallId: delegationCallId.trim(),\n ...(agentName?.trim() ? { agentName: agentName.trim() } : {}),\n ...(runInput ? { runInput } : {}),\n messages,\n };\n return JSON.stringify(snapshot, null, 2);\n}\n\nexport function axmDownloadDelegatedAgentDetailJson(\n delegationCallId: string,\n messages: AXPAiChatMessage[],\n runInput?: AXPAiDelegatedAgentTranscriptRunInput,\n agentName?: string,\n): void {\n const text = axmFormatDelegatedAgentDetailExportJson(delegationCallId, messages, runInput, agentName);\n const filename = `assist-delegated-agent-${axmSanitizeDebugFilenamePart(delegationCallId)}.json`;\n axmDownloadDebugJson(filename, text);\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type { AXConversationMessage } from '@acorex/components/conversation';\nimport type { AXPAiChatMessage } from '@acorex-platform/module-ai-management-client';\n\n//#endregion\n\n//#region ---- Tool result index ----\n\n/** Maps tool_call id → tool-role line carrying {@code tool_result} / {@code agent_result}. */\nexport function axmBuildToolResultByCallId(messages: AXPAiChatMessage[]): Map<string, AXPAiChatMessage> {\n const map = new Map<string, AXPAiChatMessage>();\n for (const line of messages) {\n if (line.role !== 'tool') {\n continue;\n }\n for (const seg of line.responses) {\n if (seg.type !== 'tool_result' && seg.type !== 'agent_result') {\n continue;\n }\n const callId = seg.callId?.trim();\n if (callId) {\n map.set(callId, line);\n }\n }\n }\n return map;\n}\n\n//#endregion\n\n//#region ---- Formatters ----\n\nexport function axmTryPrettyJson(raw: string): string {\n const trimmed = raw.trim();\n if (!trimmed) {\n return '';\n }\n try {\n return JSON.stringify(JSON.parse(trimmed), null, 2);\n } catch {\n return trimmed;\n }\n}\n\nexport function axmFormatTranscriptArgs(args: unknown): string {\n if (args == null) {\n return '';\n }\n if (typeof args === 'string') {\n return axmTryPrettyJson(args);\n }\n try {\n return JSON.stringify(args, null, 2);\n } catch {\n return String(args);\n }\n}\n\nexport function axmFormatTranscriptFallbackSegment(seg: unknown): string {\n try {\n return JSON.stringify(seg, null, 2);\n } catch {\n return String(seg);\n }\n}\n\n//#endregion\n\n//#region ---- Embed parent stub ----\n\n/** Minimal parent message for synthetic embed renderers inside the detail popup. */\nexport function axmDelegatedTranscriptEmbedParentStub(): AXConversationMessage {\n return {\n id: 'assist-delegated-transcript-embed',\n conversationId: '',\n senderId: 'assist',\n type: 'text',\n payload: { type: 'text', text: '' },\n status: 'sent',\n metadata: { assistEmbed: true },\n } as unknown as AXConversationMessage;\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXCodeEditorDefaultLanguage, AXCodeEditorModule } from '@acorex/components/code-editor';\nimport type { AXConversationMessage, AXConversationMessagePayload } from '@acorex/components/conversation';\nimport { AXConversationTextRendererComponent } from '@acorex/components/conversation';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport type {\n AXPAiChatMessage,\n AXPAiChatResponse,\n AXPAiDelegatedAgentResultSegment,\n} from '@acorex-platform/module-ai-management-client';\nimport {\n axpAiChatToolOrAgentResultBodyJson,\n axpAiDelegatedAgentPromptPreview,\n axpAiDelegatedAgentResultSegments,\n axpAiParseSupervisorAgentToolName,\n} from '@acorex-platform/module-ai-management-client';\nimport { AXPMarkdownTemplateDirective, AXPMarkdownViewerComponent } from '@acorex-platform/framework-client/layout/components';\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input, ViewEncapsulation } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport {\n axmAssistWidgetNodeFromUnknown,\n axmParseAssistTranscriptTextEnvelope,\n axmPartitionAssistAnswerText,\n axmSyntheticEmbedMessage,\n} from '../utils/assist-bot-transcript.util';\nimport {\n axmBuildToolResultByCallId,\n axmFormatTranscriptArgs,\n axmFormatTranscriptFallbackSegment,\n axmTryPrettyJson,\n} from '../utils/assist-delegated-agent-transcript-view.util';\nimport { axmAssistSegmentDirection } from '../utils/assist-segment-direction.util';\nimport { AXMAssistBotFileLineComponent } from './assist-bot-file-line.component';\nimport { AXMAssistSuggestionChipsComponent } from '../shared/assist-suggestion-chips.component';\nimport { AXMNodeMessageRendererComponent } from './node-message-renderer.component';\n\n//#endregion\n\n//#region ---- Component ----\n\n/**\n * Read-only {@link AXPAiChatMessage} transcript (role + responses[]) for delegated specialist detail.\n */\n@Component({\n selector: 'axm-assist-delegated-agent-transcript-view',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n AXConversationTextRendererComponent,\n AXMNodeMessageRendererComponent,\n AXMAssistBotFileLineComponent,\n AXMAssistSuggestionChipsComponent,\n AXCodeEditorModule,\n AXPMarkdownViewerComponent,\n AXPMarkdownTemplateDirective,\n FormsModule,\n AXTranslationModule,\n AsyncPipe,\n ],\n templateUrl: './assist-delegated-agent-transcript-view.component.html',\n styleUrls: [\n './assist-message-renderer.component.css',\n './assist-delegated-agent-transcript-view.component.css',\n ],\n})\nexport class AXMAssistDelegatedAgentTranscriptViewComponent {\n //#region ---- Inputs ----\n\n readonly messages = input<AXPAiChatMessage[]>([]);\n readonly embedParent = input.required<AXConversationMessage>();\n readonly emptyHint = input<string | undefined>(undefined);\n readonly agentTitleById = input<Record<string, string>>({});\n\n //#endregion\n\n //#region ---- Template helpers ----\n\n protected readonly segmentDir = axmAssistSegmentDirection;\n protected readonly parseAssistLineText = axmParseAssistTranscriptTextEnvelope;\n protected readonly axmAssistWidgetNodeFromUnknown = axmAssistWidgetNodeFromUnknown;\n protected readonly partitionAnswerText = axmPartitionAssistAnswerText;\n protected readonly isDelegatedAgentCommand = (command: string): boolean =>\n axpAiParseSupervisorAgentToolName(command) != null;\n\n //#endregion\n\n //#region ---- Computed ----\n\n readonly hasMessages = computed(() => this.messages().length > 0);\n\n readonly toolResultByCallId = computed(() => axmBuildToolResultByCallId(this.messages()));\n\n readonly displayLines = computed(() =>\n this.messages().map((line, lineIndex) => ({ line, lineIndex })),\n );\n\n //#endregion\n\n //#region ---- Segment renderers ----\n\n protected roleTranslationKey(role: AXPAiChatMessage['role']): string {\n return `@conversation:chat.assist-renderer.delegated-agent.roles.${role}`;\n }\n\n protected resolveToolDisplayTitle(command: string): string {\n const agentId = axpAiParseSupervisorAgentToolName(command);\n if (agentId) {\n const title = this.agentTitleById()[agentId];\n if (title?.trim()) {\n return title.trim();\n }\n return agentId;\n }\n return command?.trim() || 'Tool';\n }\n\n protected toolResultForCallId(callId: string | undefined): AXPAiChatMessage | null {\n if (!callId?.trim()) {\n return null;\n }\n return this.toolResultByCallId().get(callId.trim()) ?? null;\n }\n\n protected delegatedAgentOutcomeSegmentsForCall(res: AXPAiChatMessage | null): AXPAiDelegatedAgentResultSegment[] {\n if (!res) {\n return [];\n }\n const raw = axpAiChatToolOrAgentResultBodyJson(res);\n if (!raw.trim()) {\n return [];\n }\n try {\n const o = JSON.parse(raw) as Record<string, unknown>;\n if (o['success'] === false) {\n return [];\n }\n return axpAiDelegatedAgentResultSegments(o as { success?: boolean; data?: { responses?: AXPAiDelegatedAgentResultSegment[] } });\n } catch {\n return [];\n }\n }\n\n protected delegatedPromptPreview(argumentsValue: unknown): string {\n return axpAiDelegatedAgentPromptPreview(argumentsValue);\n }\n\n protected formatArgs(args: unknown): string {\n return axmFormatTranscriptArgs(args);\n }\n\n protected formatToolResultBody(line: AXPAiChatMessage): string {\n return axmTryPrettyJson(axpAiChatToolOrAgentResultBodyJson(line));\n }\n\n protected formatFallbackSegment(seg: AXPAiChatResponse): string {\n return axmFormatTranscriptFallbackSegment(seg);\n }\n\n protected syntheticTextMessage(lineIndex: number, segIndex: number, text: string): AXConversationMessage {\n return axmSyntheticEmbedMessage(this.embedParent(), `dt-${lineIndex}-${segIndex}`, {\n type: 'text',\n payload: { type: 'text', text },\n });\n }\n\n protected syntheticNodeEmbedMessage(lineIndex: number, segIndex: number, content: unknown): AXConversationMessage {\n return axmSyntheticEmbedMessage(this.embedParent(), `dn-${lineIndex}-${segIndex}`, {\n type: 'node',\n payload: { type: 'node', content } as unknown as AXConversationMessagePayload,\n });\n }\n\n protected syntheticNodeFromCode(code: string, suffix: string): AXConversationMessage {\n return axmSyntheticEmbedMessage(this.embedParent(), `dc-${suffix}`, {\n type: 'node',\n payload: { type: 'node', content: this.parseCodeAsWidgetContent(code) } as unknown as AXConversationMessagePayload,\n });\n }\n\n protected parseCodeAsWidgetContent(code: string): unknown {\n try {\n return JSON.parse(code.trim());\n } catch {\n return code;\n }\n }\n\n protected widgetNodeFromCode(code: string): ReturnType<typeof axmAssistWidgetNodeFromUnknown> {\n try {\n return axmAssistWidgetNodeFromUnknown(JSON.parse(code.trim()));\n } catch {\n return axmAssistWidgetNodeFromUnknown(code);\n }\n }\n\n protected sectionCollapseKey(lineIndex: number, segIndex: number, section: string): string {\n return `line-${lineIndex}-seg-${segIndex}-${section}`;\n }\n\n protected markdownCodeLanguage(segment: unknown): AXCodeEditorDefaultLanguage {\n if (this.isMarkdownCodeSegment(segment) && segment.language.trim()) {\n return segment.language as AXCodeEditorDefaultLanguage;\n }\n return 'javascript';\n }\n\n protected markdownCodeValue(segment: unknown): string {\n if (this.isMarkdownCodeSegment(segment)) {\n return segment.code;\n }\n return '';\n }\n\n private isMarkdownCodeSegment(segment: unknown): segment is { type: 'code'; language: string; code: string } {\n if (!segment || typeof segment !== 'object') {\n return false;\n }\n const candidate = segment as { type?: unknown; language?: unknown; code?: unknown };\n return candidate.type === 'code' && typeof candidate.language === 'string' && typeof candidate.code === 'string';\n }\n\n //#endregion\n}\n\n//#endregion\n","<div class=\"axm-delegated-transcript\">\n @if (!hasMessages() && emptyHint()) {\n <p class=\"axm-delegated-transcript__empty\">{{ emptyHint() }}</p>\n } @else {\n <div class=\"axm-delegated-transcript__lines\" role=\"list\">\n @for (item of displayLines(); track item.lineIndex) {\n @let line = item.line;\n @let lineIndex = item.lineIndex;\n <details\n class=\"axm-delegated-transcript__line-collapse\"\n role=\"listitem\"\n [class.axm-delegated-transcript__line-collapse--user]=\"line.role === 'user'\"\n [class.axm-delegated-transcript__line-collapse--assistant]=\"line.role === 'assistant'\"\n [attr.data-role]=\"line.role\"\n [open]=\"lineIndex === displayLines().length - 1 ? true : null\"\n >\n <summary class=\"axm-delegated-transcript__line-summary\">\n <span class=\"axm-delegated-transcript__role-pill\">{{ roleTranslationKey(line.role) | translate | async }}</span>\n @if (line.delegatedReflection) {\n <span class=\"axm-delegated-transcript__reflection-badge\">{{\n '@conversation:chat.assist-renderer.delegated-agent.reflection' | translate | async\n }}</span>\n }\n @if (line.name?.trim()) {\n <span class=\"axm-delegated-transcript__name\">{{ line.name }}</span>\n }\n </summary>\n\n <div class=\"axm-delegated-transcript__segments\">\n @for (seg of line.responses; track segIndex; let segIndex = $index) {\n @if (line.role === 'user' && seg.type === 'file') {\n <axm-assist-bot-file-line [parentMessage]=\"embedParent()\" [fileId]=\"seg.content.fileId\" />\n } @else if (line.role === 'user' && seg.type === 'text') {\n <details class=\"axm-delegated-transcript__section-collapse\">\n <summary class=\"axm-delegated-transcript__section-summary\">\n {{ '@conversation:chat.assist-renderer.sections.agent-answer' | translate | async }}\n </summary>\n <div class=\"axm-assist-bot__segment\" [attr.dir]=\"segmentDir(seg.content)\">\n <ax-conversation-text-renderer [message]=\"syntheticTextMessage(lineIndex, segIndex, seg.content)\" />\n </div>\n </details>\n } @else if (line.role === 'assistant' && seg.type === 'think') {\n <details class=\"axm-delegated-transcript__think\">\n <summary class=\"axm-delegated-transcript__think-summary\">\n <i class=\"fa-light fa-brain axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n {{ '@conversation:chat.assist-renderer.sections.thinking' | translate | async }}\n </summary>\n <div\n class=\"axm-assist-renderer__thinking-body axm-assist-bot__segment axm-assist-renderer__markdown\"\n [attr.dir]=\"segmentDir(seg.content)\"\n >\n <axp-markdown-viewer [markdown]=\"seg.content\">\n <ng-template axpMarkdownTemplate=\"code\" let-segment>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"markdownCodeValue(segment)\"\n [readonly]=\"true\"\n [language]=\"markdownCodeLanguage(segment)\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n </ng-template>\n </axp-markdown-viewer>\n </div>\n </details>\n } @else if (line.role === 'assistant' && seg.type === 'text') {\n @let parsedLine = parseAssistLineText(seg.content);\n @if (parsedLine.thinking?.trim()) {\n <details class=\"axm-delegated-transcript__think\">\n <summary class=\"axm-delegated-transcript__think-summary\">\n <i class=\"fa-light fa-brain axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n {{ '@conversation:chat.assist-renderer.sections.thinking' | translate | async }}\n </summary>\n <div\n class=\"axm-assist-renderer__thinking-body axm-assist-bot__segment axm-assist-renderer__markdown\"\n [attr.dir]=\"segmentDir(parsedLine.thinking ?? '')\"\n >\n <axp-markdown-viewer [markdown]=\"parsedLine.thinking ?? ''\">\n <ng-template axpMarkdownTemplate=\"code\" let-segment>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"markdownCodeValue(segment)\"\n [readonly]=\"true\"\n [language]=\"markdownCodeLanguage(segment)\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n </ng-template>\n </axp-markdown-viewer>\n </div>\n </details>\n }\n @if (parsedLine.body.trim()) {\n @let partitionedLine = partitionAnswerText(parsedLine.body);\n <details class=\"axm-delegated-transcript__section-collapse\" open>\n <summary class=\"axm-delegated-transcript__section-summary\">\n {{ '@conversation:chat.assist-renderer.sections.agent-answer' | translate | async }}\n </summary>\n @if (partitionedLine.markdown.trim()) {\n <div\n class=\"axm-assist-bot__segment axm-assist-renderer__markdown\"\n [attr.dir]=\"segmentDir(partitionedLine.markdown)\"\n >\n <axp-markdown-viewer [markdown]=\"partitionedLine.markdown\">\n <ng-template axpMarkdownTemplate=\"code\" let-segment>\n @if (widgetNodeFromCode(markdownCodeValue(segment))) {\n <div class=\"axm-assist-bot__segment axm-delegated-transcript__widget-embed\" dir=\"auto\">\n <axm-chat-user-form-renderer\n [message]=\"\n syntheticNodeFromCode(\n markdownCodeValue(segment),\n sectionCollapseKey(lineIndex, segIndex, 'md-code')\n )\n \"\n />\n </div>\n } @else {\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"markdownCodeValue(segment)\"\n [readonly]=\"true\"\n [language]=\"markdownCodeLanguage(segment)\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n }\n </ng-template>\n </axp-markdown-viewer>\n </div>\n }\n @for (renderable of partitionedLine.renderable; track $index) {\n @switch (renderable.type) {\n @case ('node') {\n @if (axmAssistWidgetNodeFromUnknown(renderable.content)) {\n <div class=\"axm-assist-bot__segment axm-delegated-transcript__widget-embed\" dir=\"auto\">\n <axm-chat-user-form-renderer\n [message]=\"\n syntheticNodeEmbedMessage(lineIndex, segIndex * 100 + $index, renderable.content)\n \"\n />\n </div>\n }\n }\n @case ('followUp') {\n <div class=\"axm-assist-bot__segment\" dir=\"auto\">\n <axm-assist-suggestion-chips [items]=\"renderable.content\" />\n </div>\n }\n @case ('file') {\n <axm-assist-bot-file-line\n [parentMessage]=\"embedParent()\"\n [fileId]=\"renderable.content.fileId\"\n />\n }\n }\n }\n </details>\n }\n } @else if (\n line.role === 'assistant' &&\n (seg.type === 'agent' || seg.type === 'tool') &&\n isDelegatedAgentCommand(seg.content.command)\n ) {\n <details class=\"axm-delegated-transcript__tool-collapse\">\n <summary class=\"axm-delegated-transcript__tool-panel-header\">\n <i class=\"fa-light fa-people-group axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n <span class=\"axm-delegated-transcript__tool-panel-title\">{{\n resolveToolDisplayTitle(seg.content.command)\n }}</span>\n </summary>\n <div class=\"axm-delegated-transcript__tool-panel-body\">\n <details class=\"axm-delegated-transcript__section-collapse\">\n <summary class=\"axm-delegated-transcript__section-summary\">\n {{ '@conversation:chat.assist-renderer.sections.agent-prompt' | translate | async }}\n </summary>\n <div\n class=\"axm-delegated-transcript__prompt axm-assist-bot__segment\"\n [attr.dir]=\"segmentDir(delegatedPromptPreview(seg.content.arguments))\"\n >\n {{ delegatedPromptPreview(seg.content.arguments) }}\n </div>\n </details>\n <details class=\"axm-delegated-transcript__section-collapse\">\n <summary class=\"axm-delegated-transcript__section-summary\">\n {{ '@conversation:chat.assist-renderer.sections.input' | translate | async }}\n </summary>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"formatArgs(seg.content.arguments)\"\n [readonly]=\"true\"\n language=\"json\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n </details>\n @if (toolResultForCallId(seg.callId); as resultLine) {\n @let outcomeSegs = delegatedAgentOutcomeSegmentsForCall(resultLine);\n @if (outcomeSegs.length > 0) {\n <details class=\"axm-delegated-transcript__section-collapse\" open>\n <summary class=\"axm-delegated-transcript__section-summary\">\n {{ '@conversation:chat.assist-renderer.sections.agent-answer' | translate | async }}\n </summary>\n @for (outSeg of outcomeSegs; track $index; let outcomeIndex = $index) {\n @switch (outSeg.type) {\n @case ('text') {\n @let parsedOut = parseAssistLineText(outSeg.content);\n @if (parsedOut.thinking?.trim()) {\n <details class=\"axm-delegated-transcript__think\">\n <summary class=\"axm-delegated-transcript__think-summary\">\n <i class=\"fa-light fa-brain axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n {{ '@conversation:chat.assist-renderer.sections.thinking' | translate | async }}\n </summary>\n <div\n class=\"axm-assist-renderer__thinking-body axm-assist-bot__segment axm-assist-renderer__markdown\"\n [attr.dir]=\"segmentDir(parsedOut.thinking ?? '')\"\n >\n <axp-markdown-viewer [markdown]=\"parsedOut.thinking ?? ''\">\n <ng-template axpMarkdownTemplate=\"code\" let-segment>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"markdownCodeValue(segment)\"\n [readonly]=\"true\"\n [language]=\"markdownCodeLanguage(segment)\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n </ng-template>\n </axp-markdown-viewer>\n </div>\n </details>\n }\n @if (parsedOut.body.trim()) {\n @let partitionedOut = partitionAnswerText(parsedOut.body);\n @if (partitionedOut.markdown.trim()) {\n <div\n class=\"axm-assist-bot__segment axm-assist-renderer__markdown\"\n [attr.dir]=\"segmentDir(partitionedOut.markdown)\"\n >\n <axp-markdown-viewer [markdown]=\"partitionedOut.markdown\">\n <ng-template axpMarkdownTemplate=\"code\" let-segment>\n @if (widgetNodeFromCode(markdownCodeValue(segment))) {\n <div\n class=\"axm-assist-bot__segment axm-delegated-transcript__widget-embed\"\n dir=\"auto\"\n >\n <axm-chat-user-form-renderer\n [message]=\"\n syntheticNodeFromCode(\n markdownCodeValue(segment),\n sectionCollapseKey(\n lineIndex,\n segIndex * 1000 + outcomeIndex,\n 'out-code'\n )\n )\n \"\n />\n </div>\n } @else {\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"markdownCodeValue(segment)\"\n [readonly]=\"true\"\n [language]=\"markdownCodeLanguage(segment)\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n }\n </ng-template>\n </axp-markdown-viewer>\n </div>\n }\n @for (renderable of partitionedOut.renderable; track $index; let renderableIndex = $index) {\n @switch (renderable.type) {\n @case ('node') {\n @if (axmAssistWidgetNodeFromUnknown(renderable.content)) {\n <div\n class=\"axm-assist-bot__segment axm-delegated-transcript__widget-embed\"\n dir=\"auto\"\n >\n <axm-chat-user-form-renderer\n [message]=\"\n syntheticNodeEmbedMessage(\n lineIndex,\n segIndex * 1000 + outcomeIndex * 10 + renderableIndex,\n renderable.content\n )\n \"\n />\n </div>\n }\n }\n @case ('followUp') {\n <div class=\"axm-assist-bot__segment\" dir=\"auto\">\n <axm-assist-suggestion-chips [items]=\"renderable.content\" />\n </div>\n }\n @case ('file') {\n <axm-assist-bot-file-line\n [parentMessage]=\"embedParent()\"\n [fileId]=\"renderable.content.fileId\"\n />\n }\n }\n }\n }\n }\n @case ('think') {\n <details class=\"axm-delegated-transcript__think\">\n <summary class=\"axm-delegated-transcript__think-summary\">\n <i class=\"fa-light fa-brain axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n {{ '@conversation:chat.assist-renderer.sections.thinking' | translate | async }}\n </summary>\n <div\n class=\"axm-assist-renderer__thinking-body axm-assist-bot__segment axm-assist-renderer__markdown\"\n [attr.dir]=\"segmentDir(outSeg.content)\"\n >\n <axp-markdown-viewer [markdown]=\"outSeg.content\">\n <ng-template axpMarkdownTemplate=\"code\" let-segment>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"markdownCodeValue(segment)\"\n [readonly]=\"true\"\n [language]=\"markdownCodeLanguage(segment)\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n </ng-template>\n </axp-markdown-viewer>\n </div>\n </details>\n }\n @case ('file') {\n <axm-assist-bot-file-line [parentMessage]=\"embedParent()\" [fileId]=\"outSeg.content.fileId\" />\n }\n @case ('node') {\n @if (axmAssistWidgetNodeFromUnknown(outSeg.content)) {\n <div class=\"axm-assist-bot__segment axm-delegated-transcript__widget-embed\" dir=\"auto\">\n <axm-chat-user-form-renderer\n [message]=\"\n syntheticNodeEmbedMessage(lineIndex, segIndex * 1000 + outcomeIndex, outSeg.content)\n \"\n />\n </div>\n }\n }\n @case ('followUp') {\n <div class=\"axm-assist-bot__segment\" dir=\"auto\">\n <axm-assist-suggestion-chips [items]=\"outSeg.content\" />\n </div>\n }\n }\n }\n </details>\n } @else {\n <details class=\"axm-delegated-transcript__section-collapse\">\n <summary class=\"axm-delegated-transcript__section-summary\">\n {{ '@conversation:chat.assist-renderer.sections.output' | translate | async }}\n </summary>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"formatToolResultBody(resultLine)\"\n [readonly]=\"true\"\n language=\"json\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n </details>\n }\n }\n </div>\n </details>\n } @else if (line.role === 'assistant' && (seg.type === 'agent' || seg.type === 'tool')) {\n <details class=\"axm-delegated-transcript__tool-collapse\">\n <summary class=\"axm-delegated-transcript__tool-panel-header\">\n <i class=\"fa-light fa-screwdriver-wrench axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n <span class=\"axm-delegated-transcript__tool-panel-title\">{{\n resolveToolDisplayTitle(seg.content.command)\n }}</span>\n </summary>\n <div class=\"axm-delegated-transcript__tool-panel-body\">\n <details class=\"axm-delegated-transcript__section-collapse\">\n <summary class=\"axm-delegated-transcript__section-summary\">\n {{ '@conversation:chat.assist-renderer.sections.input' | translate | async }}\n </summary>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"formatArgs(seg.content.arguments)\"\n [readonly]=\"true\"\n language=\"json\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n </details>\n @if (toolResultForCallId(seg.callId); as resultLine) {\n <details class=\"axm-delegated-transcript__section-collapse\" open>\n <summary class=\"axm-delegated-transcript__section-summary\">\n {{ '@conversation:chat.assist-renderer.sections.output' | translate | async }}\n </summary>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"formatToolResultBody(resultLine)\"\n [readonly]=\"true\"\n language=\"json\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n </details>\n }\n </div>\n </details>\n } @else if (line.role === 'assistant' && seg.type === 'node') {\n @if (axmAssistWidgetNodeFromUnknown(seg.content)) {\n <details class=\"axm-delegated-transcript__section-collapse\" open>\n <summary class=\"axm-delegated-transcript__section-summary\">\n {{ '@conversation:chat.assist-renderer.sections.agent-answer' | translate | async }}\n </summary>\n <div class=\"axm-assist-bot__segment axm-delegated-transcript__widget-embed\" dir=\"auto\">\n <axm-chat-user-form-renderer\n [message]=\"syntheticNodeEmbedMessage(lineIndex, segIndex, seg.content)\"\n />\n </div>\n </details>\n }\n } @else if (line.role === 'assistant' && seg.type === 'file') {\n <axm-assist-bot-file-line [parentMessage]=\"embedParent()\" [fileId]=\"seg.content.fileId\" />\n } @else if (line.role === 'tool' && (seg.type === 'tool_result' || seg.type === 'agent_result')) {\n <!-- Shown on the matching tool/agent block above -->\n } @else if (line.role === 'system' && seg.type === 'text') {\n <details class=\"axm-delegated-transcript__section-collapse\">\n <summary class=\"axm-delegated-transcript__section-summary\">\n {{ '@conversation:chat.assist-renderer.delegated-agent.roles.system' | translate | async }}\n </summary>\n <div class=\"axm-assist-bot__segment\" [attr.dir]=\"segmentDir(seg.content)\">\n <ax-conversation-text-renderer [message]=\"syntheticTextMessage(lineIndex, segIndex, seg.content)\" />\n </div>\n </details>\n } @else {\n <details class=\"axm-delegated-transcript__section-collapse\">\n <summary class=\"axm-delegated-transcript__section-summary\">\n {{ '@conversation:chat.assist-renderer.sections.output' | translate | async }}\n </summary>\n <div\n class=\"axm-assist-bot__fallback axm-assist-bot__segment\"\n [attr.dir]=\"segmentDir(formatFallbackSegment(seg))\"\n >\n {{ formatFallbackSegment(seg) }}\n </div>\n </details>\n }\n }\n </div>\n </details>\n }\n </div>\n }\n</div>\n","//#region ---- Imports ----\n\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXBasePageComponent } from '@acorex/components/page';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport type { AXPAiChatMessage, AXPAiDelegatedAgentTranscriptRunInput } from '@acorex-platform/module-ai-management-client';\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\n\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { axmDownloadDelegatedAgentDetailJson } from '../utils/assist-delegated-agent-detail-export.util';\nimport { axmDelegatedTranscriptEmbedParentStub } from '../utils/assist-delegated-agent-transcript-view.util';\nimport { AXMAssistDelegatedAgentTranscriptViewComponent } from './assist-delegated-agent-transcript-view.component';\n\n//#endregion\n\n//#region ---- Types ----\n\nexport interface AXMAssistDelegatedAgentDetailPopupData {\n delegationCallId: string;\n messages: AXPAiChatMessage[];\n runInput?: AXPAiDelegatedAgentTranscriptRunInput;\n agentName?: string;\n emptyHint?: string;\n agentTitleById?: Record<string, string>;\n}\n\n//#endregion\n\n//#region ---- Component ----\n\n@Component({\n selector: 'axm-assist-delegated-agent-detail-popup',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n AXMAssistDelegatedAgentTranscriptViewComponent,\n AXButtonModule,\n AXTranslationModule,\n AsyncPipe,\n AXDecoratorModule,\n ],\n template: `\n <div class=\"axm-assist-delegated-detail-popup\">\n <axm-assist-delegated-agent-transcript-view\n [messages]=\"messages\"\n [embedParent]=\"embedParent\"\n [emptyHint]=\"emptyHint\"\n [agentTitleById]=\"agentTitleById\"\n />\n <ax-footer>\n <ax-suffix>\n <ax-button\n look=\"outline\"\n color=\"primary\"\n icon=\"fa-light fa-download\"\n [text]=\"'@conversation:chat.assist-renderer.delegated-agent.download-json' | translate | async\"\n [disabled]=\"!messages.length\"\n (onClick)=\"downloadJson()\"\n ></ax-button>\n <ax-button\n look=\"solid\"\n color=\"primary\"\n [text]=\"'@general:actions.close.title' | translate | async\"\n (onClick)=\"close()\"\n ></ax-button>\n </ax-suffix>\n </ax-footer>\n </div>\n `,\n styles: [\n `\n .axm-assist-delegated-detail-popup {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n min-block-size: 0;\n }\n\n .axm-assist-delegated-detail-popup ax-footer ax-suffix {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: 0.5rem;\n }\n `,\n ],\n})\nexport class AXMAssistDelegatedAgentDetailPopupComponent extends AXBasePageComponent {\n /** Set by {@link AXPopupService} from `data`. */\n delegationCallId = '';\n\n messages: AXPAiChatMessage[] = [];\n\n runInput?: AXPAiDelegatedAgentTranscriptRunInput;\n\n agentName?: string;\n\n emptyHint?: string;\n\n agentTitleById: Record<string, string> = {};\n\n embedParent = axmDelegatedTranscriptEmbedParentStub();\n\n protected downloadJson(): void {\n axmDownloadDelegatedAgentDetailJson(\n this.delegationCallId,\n this.messages,\n this.runInput,\n this.agentName,\n );\n }\n}\n\n//#endregion\n"],"names":["i1","i2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-conversation-client-assist-delegated-agent-detail-popup.component-DQWhOmBE.mjs","sources":["../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/utils/assist-debug-information.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/utils/assist-delegated-agent-detail-export.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/utils/assist-delegated-agent-transcript-view.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/message-renderers/assist-delegated-agent-transcript-view.component.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/message-renderers/assist-delegated-agent-transcript-view.component.html","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/message-renderers/assist-delegated-agent-detail-popup.component.ts"],"sourcesContent":["//#region ---- Imports ----\n\nimport type { AXConversation, AXConversationMessage } from '@acorex/components/conversation';\nimport type {\n AXPAiChatMessage,\n AXPAiDelegatedAgentTranscriptEntry,\n AXPAiEngineLastProviderPayload,\n AXPAiEngineRunResult,\n AXPAiEngineUsageTotals,\n} from '@acorex-platform/module-ai-management-client';\nimport { axpAiChatTextMessage, axpSanitizeLastProviderPayloadForPersistence } from '@acorex-platform/module-ai-management-client';\n\nimport { axmReadAssistAiTranscript, axmReadAssistAiTranscriptRaw } from './assist-bot-transcript.util';\n\n//#endregion\n\n//#region ---- Types ----\n\n/** One conversation turn exported as an engine run result (user or assist). */\nexport interface AXMAssistConversationDebugTurn {\n messageId: string;\n timestamp: string;\n result: AXPAiEngineRunResult;\n}\n\n/** Full assist conversation debug export (chronological turns). */\nexport interface AXMAssistConversationDebugExport {\n exportedAt: string;\n conversation: {\n id: string;\n title?: string;\n type?: string;\n metadata?: unknown;\n participants?: unknown;\n };\n turns: AXMAssistConversationDebugTurn[];\n}\n\n//#endregion\n\n//#region ---- Message classification ----\n\n/** True when the message carries assist / AI debug payload worth exporting. */\nexport function axmIsAssistDebugMessage(message: AXConversationMessage | null | undefined): boolean {\n if (!message) {\n return false;\n }\n if (message.type === 'assist-response') {\n return true;\n }\n const meta = message.metadata as Record<string, unknown> | undefined;\n if (meta?.['isAssistResponse'] === true) {\n return true;\n }\n const transcript = axmReadAssistAiTranscript(meta);\n return transcript != null && transcript.length > 0;\n}\n\n//#endregion\n\n//#region ---- Serialization ----\n\nfunction toIsoTimestamp(value: AXConversationMessage['timestamp']): string {\n if (value instanceof Date) {\n return value.toISOString();\n }\n if (typeof value === 'string' || typeof value === 'number') {\n const parsed = new Date(value);\n if (!Number.isNaN(parsed.getTime())) {\n return parsed.toISOString();\n }\n }\n return String(value ?? '');\n}\n\nfunction readRecord(meta: Record<string, unknown> | undefined, key: string): unknown {\n return meta?.[key];\n}\n\n/**\n * Reconstructs {@link AXPAiEngineRunResult} from assist message metadata\n * (same shape returned by {@link AXPAiEngine.run}).\n */\nexport function axmBuildAssistEngineRunResult(message: AXConversationMessage): AXPAiEngineRunResult {\n const meta =\n typeof message.metadata === 'object' && message.metadata != null\n ? (message.metadata as Record<string, unknown>)\n : undefined;\n\n const result: AXPAiEngineRunResult = {\n messages: axmReadAssistAiTranscriptRaw(meta),\n };\n\n const usage = readRecord(meta, 'assistRunUsageTotals');\n if (usage != null && typeof usage === 'object') {\n result.usageTotals = usage as AXPAiEngineUsageTotals;\n }\n\n const lastProvider = readRecord(meta, 'assistRunLastProviderResult');\n if (lastProvider != null && typeof lastProvider === 'object') {\n result.lastProviderResult = axpSanitizeLastProviderPayloadForPersistence(\n lastProvider as AXPAiEngineLastProviderPayload,\n );\n }\n\n const delegated = readRecord(meta, 'assistRunDelegatedTranscriptsByCallId');\n if (delegated != null && typeof delegated === 'object' && !Array.isArray(delegated)) {\n result.delegatedTranscriptsByCallId = delegated as Record<string, AXPAiDelegatedAgentTranscriptEntry>;\n }\n\n return result;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction extractUserChatText(message: AXConversationMessage): string {\n const payload = message.payload;\n if (!isRecord(payload)) {\n return '';\n }\n const text = payload['text'];\n return typeof text === 'string' ? text.trim() : '';\n}\n\n/** User chat line as a minimal engine run result (`messages` only). */\nexport function axmBuildUserTurnEngineRunResult(message: AXConversationMessage): AXPAiEngineRunResult {\n const text = extractUserChatText(message);\n return {\n messages: text ? [axpAiChatTextMessage('user', text)] : [],\n };\n}\n\n/**\n * Pretty-printed JSON for clipboard export (single assist run — {@link AXPAiEngineRunResult}).\n */\nexport function axmFormatAssistMessageDebugText(message: AXConversationMessage): string {\n const run = axmIsAssistDebugMessage(message)\n ? axmBuildAssistEngineRunResult(message)\n : axmBuildUserTurnEngineRunResult(message);\n return JSON.stringify(run, null, 2);\n}\n\n/**\n * Pretty-printed JSON for clipboard export (conversation turns as engine run results).\n */\nexport function axmFormatAssistConversationDebugText(\n conversation: AXConversation | { id?: string; title?: string; type?: string; metadata?: unknown; participants?: unknown },\n messages: AXConversationMessage[],\n): string {\n const chronological = [...messages].sort(\n (a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime(),\n );\n\n const turns: AXMAssistConversationDebugTurn[] = chronological.map((message) => ({\n messageId: message.id,\n timestamp: toIsoTimestamp(message.timestamp),\n result: axmIsAssistDebugMessage(message)\n ? axmBuildAssistEngineRunResult(message)\n : axmBuildUserTurnEngineRunResult(message),\n }));\n\n const snapshot: AXMAssistConversationDebugExport = {\n exportedAt: new Date().toISOString(),\n conversation: {\n id: conversation.id ?? '',\n title: conversation.title,\n type: conversation.type,\n metadata: conversation.metadata,\n participants: conversation.participants,\n },\n turns,\n };\n\n return JSON.stringify(snapshot, null, 2);\n}\n\n/** Safe fragment for debug export filenames. */\nexport function axmSanitizeDebugFilenamePart(id: string): string {\n const sanitized = id.replace(/[^\\w.-]+/g, '_').slice(0, 80).trim();\n return sanitized.length > 0 ? sanitized : 'debug';\n}\n\n/** Triggers a browser download of pretty-printed JSON debug export. */\nexport function axmDownloadDebugJson(filename: string, text: string): void {\n if (!text.trim() || typeof document === 'undefined') {\n return;\n }\n const blob = new Blob([text], { type: 'application/json;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = filename.endsWith('.json') ? filename : `${filename}.json`;\n anchor.rel = 'noopener';\n anchor.click();\n URL.revokeObjectURL(url);\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type {\n AXPAiChatMessage,\n AXPAiDelegatedAgentTranscriptRunInput,\n} from '@acorex-platform/module-ai-management-client';\n\nimport { axmDownloadDebugJson, axmSanitizeDebugFilenamePart } from './assist-debug-information.util';\n\n//#endregion\n\n//#region ---- Types ----\n\n/** JSON shape for delegated specialist detail download. */\nexport interface AXMAssistDelegatedAgentDetailExport {\n exportedAt: string;\n delegationCallId: string;\n agentName?: string;\n runInput?: AXPAiDelegatedAgentTranscriptRunInput;\n messages: AXPAiChatMessage[];\n}\n\n//#endregion\n\n//#region ---- Export ----\n\nexport function axmFormatDelegatedAgentDetailExportJson(\n delegationCallId: string,\n messages: AXPAiChatMessage[],\n runInput?: AXPAiDelegatedAgentTranscriptRunInput,\n agentName?: string,\n): string {\n const snapshot: AXMAssistDelegatedAgentDetailExport = {\n exportedAt: new Date().toISOString(),\n delegationCallId: delegationCallId.trim(),\n ...(agentName?.trim() ? { agentName: agentName.trim() } : {}),\n ...(runInput ? { runInput } : {}),\n messages,\n };\n return JSON.stringify(snapshot, null, 2);\n}\n\nexport function axmDownloadDelegatedAgentDetailJson(\n delegationCallId: string,\n messages: AXPAiChatMessage[],\n runInput?: AXPAiDelegatedAgentTranscriptRunInput,\n agentName?: string,\n): void {\n const text = axmFormatDelegatedAgentDetailExportJson(delegationCallId, messages, runInput, agentName);\n const filename = `assist-delegated-agent-${axmSanitizeDebugFilenamePart(delegationCallId)}.json`;\n axmDownloadDebugJson(filename, text);\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type { AXConversationMessage } from '@acorex/components/conversation';\nimport type { AXPAiChatMessage } from '@acorex-platform/module-ai-management-client';\n\n//#endregion\n\n//#region ---- Tool result index ----\n\n/** Maps tool_call id → tool-role line carrying {@code tool_result} / {@code agent_result}. */\nexport function axmBuildToolResultByCallId(messages: AXPAiChatMessage[]): Map<string, AXPAiChatMessage> {\n const map = new Map<string, AXPAiChatMessage>();\n for (const line of messages) {\n if (line.role !== 'tool') {\n continue;\n }\n for (const seg of line.responses) {\n if (seg.type !== 'tool_result' && seg.type !== 'agent_result') {\n continue;\n }\n const callId = seg.callId?.trim();\n if (callId) {\n map.set(callId, line);\n }\n }\n }\n return map;\n}\n\n//#endregion\n\n//#region ---- Formatters ----\n\nexport function axmTryPrettyJson(raw: string): string {\n const trimmed = raw.trim();\n if (!trimmed) {\n return '';\n }\n try {\n return JSON.stringify(JSON.parse(trimmed), null, 2);\n } catch {\n return trimmed;\n }\n}\n\nexport function axmFormatTranscriptArgs(args: unknown): string {\n if (args == null) {\n return '';\n }\n if (typeof args === 'string') {\n return axmTryPrettyJson(args);\n }\n try {\n return JSON.stringify(args, null, 2);\n } catch {\n return String(args);\n }\n}\n\nexport function axmFormatTranscriptFallbackSegment(seg: unknown): string {\n try {\n return JSON.stringify(seg, null, 2);\n } catch {\n return String(seg);\n }\n}\n\n//#endregion\n\n//#region ---- Embed parent stub ----\n\n/** Minimal parent message for synthetic embed renderers inside the detail popup. */\nexport function axmDelegatedTranscriptEmbedParentStub(): AXConversationMessage {\n return {\n id: 'assist-delegated-transcript-embed',\n conversationId: '',\n senderId: 'assist',\n type: 'text',\n payload: { type: 'text', text: '' },\n status: 'sent',\n metadata: { assistEmbed: true },\n } as unknown as AXConversationMessage;\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXCodeEditorDefaultLanguage, AXCodeEditorModule } from '@acorex/components/code-editor';\nimport type { AXConversationMessage, AXConversationMessagePayload } from '@acorex/components/conversation';\nimport { AXConversationTextRendererComponent } from '@acorex/components/conversation';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport type {\n AXPAiChatMessage,\n AXPAiChatResponse,\n AXPAiDelegatedAgentResultSegment,\n} from '@acorex-platform/module-ai-management-client';\nimport {\n axpAiChatToolOrAgentResultBodyJson,\n axpAiDelegatedAgentPromptPreview,\n axpAiDelegatedAgentResultSegments,\n axpAiParseSupervisorAgentToolName,\n} from '@acorex-platform/module-ai-management-client';\nimport { AXPMarkdownTemplateDirective, AXPMarkdownViewerComponent } from '@acorex-platform/framework-client/layout/components';\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input, ViewEncapsulation } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport {\n axmAssistWidgetNodeFromUnknown,\n axmParseAssistTranscriptTextEnvelope,\n axmPartitionAssistAnswerText,\n axmSyntheticEmbedMessage,\n} from '../utils/assist-bot-transcript.util';\nimport {\n axmBuildToolResultByCallId,\n axmFormatTranscriptArgs,\n axmFormatTranscriptFallbackSegment,\n axmTryPrettyJson,\n} from '../utils/assist-delegated-agent-transcript-view.util';\nimport { axmAssistSegmentDirection } from '../utils/assist-segment-direction.util';\nimport { AXMAssistBotFileLineComponent } from './assist-bot-file-line.component';\nimport { AXMAssistSuggestionChipsComponent } from '../shared/assist-suggestion-chips.component';\nimport { AXMNodeMessageRendererComponent } from './node-message-renderer.component';\n\n//#endregion\n\n//#region ---- Component ----\n\n/**\n * Read-only {@link AXPAiChatMessage} transcript (role + responses[]) for delegated specialist detail.\n */\n@Component({\n selector: 'axm-assist-delegated-agent-transcript-view',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n AXConversationTextRendererComponent,\n AXMNodeMessageRendererComponent,\n AXMAssistBotFileLineComponent,\n AXMAssistSuggestionChipsComponent,\n AXCodeEditorModule,\n AXPMarkdownViewerComponent,\n AXPMarkdownTemplateDirective,\n FormsModule,\n AXTranslationModule,\n AsyncPipe,\n ],\n templateUrl: './assist-delegated-agent-transcript-view.component.html',\n styleUrls: [\n './assist-message-renderer.component.css',\n './assist-delegated-agent-transcript-view.component.css',\n ],\n})\nexport class AXMAssistDelegatedAgentTranscriptViewComponent {\n //#region ---- Inputs ----\n\n readonly messages = input<AXPAiChatMessage[]>([]);\n readonly embedParent = input.required<AXConversationMessage>();\n readonly emptyHint = input<string | undefined>(undefined);\n readonly agentTitleById = input<Record<string, string>>({});\n\n //#endregion\n\n //#region ---- Template helpers ----\n\n protected readonly segmentDir = axmAssistSegmentDirection;\n protected readonly parseAssistLineText = axmParseAssistTranscriptTextEnvelope;\n protected readonly axmAssistWidgetNodeFromUnknown = axmAssistWidgetNodeFromUnknown;\n protected readonly partitionAnswerText = axmPartitionAssistAnswerText;\n protected readonly isDelegatedAgentCommand = (command: string): boolean =>\n axpAiParseSupervisorAgentToolName(command) != null;\n\n //#endregion\n\n //#region ---- Computed ----\n\n readonly hasMessages = computed(() => this.messages().length > 0);\n\n readonly toolResultByCallId = computed(() => axmBuildToolResultByCallId(this.messages()));\n\n readonly displayLines = computed(() =>\n this.messages().map((line, lineIndex) => ({ line, lineIndex })),\n );\n\n //#endregion\n\n //#region ---- Segment renderers ----\n\n protected roleTranslationKey(role: AXPAiChatMessage['role']): string {\n return `@conversation:chat.assist-renderer.delegated-agent.roles.${role}`;\n }\n\n protected resolveToolDisplayTitle(command: string): string {\n const agentId = axpAiParseSupervisorAgentToolName(command);\n if (agentId) {\n const title = this.agentTitleById()[agentId];\n if (title?.trim()) {\n return title.trim();\n }\n return agentId;\n }\n return command?.trim() || 'Tool';\n }\n\n protected toolResultForCallId(callId: string | undefined): AXPAiChatMessage | null {\n if (!callId?.trim()) {\n return null;\n }\n return this.toolResultByCallId().get(callId.trim()) ?? null;\n }\n\n protected delegatedAgentOutcomeSegmentsForCall(res: AXPAiChatMessage | null): AXPAiDelegatedAgentResultSegment[] {\n if (!res) {\n return [];\n }\n const raw = axpAiChatToolOrAgentResultBodyJson(res);\n if (!raw.trim()) {\n return [];\n }\n try {\n const o = JSON.parse(raw) as Record<string, unknown>;\n if (o['success'] === false) {\n return [];\n }\n return axpAiDelegatedAgentResultSegments(o as { success?: boolean; data?: { responses?: AXPAiDelegatedAgentResultSegment[] } });\n } catch {\n return [];\n }\n }\n\n protected delegatedPromptPreview(argumentsValue: unknown): string {\n return axpAiDelegatedAgentPromptPreview(argumentsValue);\n }\n\n protected formatArgs(args: unknown): string {\n return axmFormatTranscriptArgs(args);\n }\n\n protected formatToolResultBody(line: AXPAiChatMessage): string {\n return axmTryPrettyJson(axpAiChatToolOrAgentResultBodyJson(line));\n }\n\n protected formatFallbackSegment(seg: AXPAiChatResponse): string {\n return axmFormatTranscriptFallbackSegment(seg);\n }\n\n protected syntheticTextMessage(lineIndex: number, segIndex: number, text: string): AXConversationMessage {\n return axmSyntheticEmbedMessage(this.embedParent(), `dt-${lineIndex}-${segIndex}`, {\n type: 'text',\n payload: { type: 'text', text },\n });\n }\n\n protected syntheticNodeEmbedMessage(lineIndex: number, segIndex: number, content: unknown): AXConversationMessage {\n return axmSyntheticEmbedMessage(this.embedParent(), `dn-${lineIndex}-${segIndex}`, {\n type: 'node',\n payload: { type: 'node', content } as unknown as AXConversationMessagePayload,\n });\n }\n\n protected syntheticNodeFromCode(code: string, suffix: string): AXConversationMessage {\n return axmSyntheticEmbedMessage(this.embedParent(), `dc-${suffix}`, {\n type: 'node',\n payload: { type: 'node', content: this.parseCodeAsWidgetContent(code) } as unknown as AXConversationMessagePayload,\n });\n }\n\n protected parseCodeAsWidgetContent(code: string): unknown {\n try {\n return JSON.parse(code.trim());\n } catch {\n return code;\n }\n }\n\n protected widgetNodeFromCode(code: string): ReturnType<typeof axmAssistWidgetNodeFromUnknown> {\n try {\n return axmAssistWidgetNodeFromUnknown(JSON.parse(code.trim()));\n } catch {\n return axmAssistWidgetNodeFromUnknown(code);\n }\n }\n\n protected sectionCollapseKey(lineIndex: number, segIndex: number, section: string): string {\n return `line-${lineIndex}-seg-${segIndex}-${section}`;\n }\n\n protected markdownCodeLanguage(segment: unknown): AXCodeEditorDefaultLanguage {\n if (this.isMarkdownCodeSegment(segment) && segment.language.trim()) {\n return segment.language as AXCodeEditorDefaultLanguage;\n }\n return 'javascript';\n }\n\n protected markdownCodeValue(segment: unknown): string {\n if (this.isMarkdownCodeSegment(segment)) {\n return segment.code;\n }\n return '';\n }\n\n private isMarkdownCodeSegment(segment: unknown): segment is { type: 'code'; language: string; code: string } {\n if (!segment || typeof segment !== 'object') {\n return false;\n }\n const candidate = segment as { type?: unknown; language?: unknown; code?: unknown };\n return candidate.type === 'code' && typeof candidate.language === 'string' && typeof candidate.code === 'string';\n }\n\n //#endregion\n}\n\n//#endregion\n","<div class=\"axm-delegated-transcript\">\n @if (!hasMessages() && emptyHint()) {\n <p class=\"axm-delegated-transcript__empty\">{{ emptyHint() }}</p>\n } @else {\n <div class=\"axm-delegated-transcript__lines\" role=\"list\">\n @for (item of displayLines(); track item.lineIndex) {\n @let line = item.line;\n @let lineIndex = item.lineIndex;\n <details\n class=\"axm-delegated-transcript__line-collapse\"\n role=\"listitem\"\n [class.axm-delegated-transcript__line-collapse--user]=\"line.role === 'user'\"\n [class.axm-delegated-transcript__line-collapse--assistant]=\"line.role === 'assistant'\"\n [attr.data-role]=\"line.role\"\n [open]=\"lineIndex === displayLines().length - 1 ? true : null\"\n >\n <summary class=\"axm-delegated-transcript__line-summary\">\n <span class=\"axm-delegated-transcript__role-pill\">{{ roleTranslationKey(line.role) | translate | async }}</span>\n @if (line.delegatedReflection) {\n <span class=\"axm-delegated-transcript__reflection-badge\">{{\n '@conversation:chat.assist-renderer.delegated-agent.reflection' | translate | async\n }}</span>\n }\n @if (line.name?.trim()) {\n <span class=\"axm-delegated-transcript__name\">{{ line.name }}</span>\n }\n </summary>\n\n <div class=\"axm-delegated-transcript__segments\">\n @for (seg of line.responses; track segIndex; let segIndex = $index) {\n @if (line.role === 'user' && seg.type === 'file') {\n <axm-assist-bot-file-line [parentMessage]=\"embedParent()\" [fileId]=\"seg.content.fileId\" />\n } @else if (line.role === 'user' && seg.type === 'text') {\n <details class=\"axm-delegated-transcript__section-collapse\">\n <summary class=\"axm-delegated-transcript__section-summary\">\n {{ '@conversation:chat.assist-renderer.sections.agent-answer' | translate | async }}\n </summary>\n <div class=\"axm-assist-bot__segment\" [attr.dir]=\"segmentDir(seg.content)\">\n <ax-conversation-text-renderer [message]=\"syntheticTextMessage(lineIndex, segIndex, seg.content)\" />\n </div>\n </details>\n } @else if (line.role === 'assistant' && seg.type === 'think') {\n <details class=\"axm-delegated-transcript__think\">\n <summary class=\"axm-delegated-transcript__think-summary\">\n <i class=\"fa-light fa-brain axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n {{ '@conversation:chat.assist-renderer.sections.thinking' | translate | async }}\n </summary>\n <div\n class=\"axm-assist-renderer__thinking-body axm-assist-bot__segment axm-assist-renderer__markdown\"\n [attr.dir]=\"segmentDir(seg.content)\"\n >\n <axp-markdown-viewer [markdown]=\"seg.content\">\n <ng-template axpMarkdownTemplate=\"code\" let-segment>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"markdownCodeValue(segment)\"\n [readonly]=\"true\"\n [language]=\"markdownCodeLanguage(segment)\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n </ng-template>\n </axp-markdown-viewer>\n </div>\n </details>\n } @else if (line.role === 'assistant' && seg.type === 'text') {\n @let parsedLine = parseAssistLineText(seg.content);\n @if (parsedLine.thinking?.trim()) {\n <details class=\"axm-delegated-transcript__think\">\n <summary class=\"axm-delegated-transcript__think-summary\">\n <i class=\"fa-light fa-brain axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n {{ '@conversation:chat.assist-renderer.sections.thinking' | translate | async }}\n </summary>\n <div\n class=\"axm-assist-renderer__thinking-body axm-assist-bot__segment axm-assist-renderer__markdown\"\n [attr.dir]=\"segmentDir(parsedLine.thinking ?? '')\"\n >\n <axp-markdown-viewer [markdown]=\"parsedLine.thinking ?? ''\">\n <ng-template axpMarkdownTemplate=\"code\" let-segment>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"markdownCodeValue(segment)\"\n [readonly]=\"true\"\n [language]=\"markdownCodeLanguage(segment)\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n </ng-template>\n </axp-markdown-viewer>\n </div>\n </details>\n }\n @if (parsedLine.body.trim()) {\n @let partitionedLine = partitionAnswerText(parsedLine.body);\n <details class=\"axm-delegated-transcript__section-collapse\" open>\n <summary class=\"axm-delegated-transcript__section-summary\">\n {{ '@conversation:chat.assist-renderer.sections.agent-answer' | translate | async }}\n </summary>\n @if (partitionedLine.markdown.trim()) {\n <div\n class=\"axm-assist-bot__segment axm-assist-renderer__markdown\"\n [attr.dir]=\"segmentDir(partitionedLine.markdown)\"\n >\n <axp-markdown-viewer [markdown]=\"partitionedLine.markdown\">\n <ng-template axpMarkdownTemplate=\"code\" let-segment>\n @if (widgetNodeFromCode(markdownCodeValue(segment))) {\n <div class=\"axm-assist-bot__segment axm-delegated-transcript__widget-embed\" dir=\"auto\">\n <axm-chat-user-form-renderer\n [message]=\"\n syntheticNodeFromCode(\n markdownCodeValue(segment),\n sectionCollapseKey(lineIndex, segIndex, 'md-code')\n )\n \"\n />\n </div>\n } @else {\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"markdownCodeValue(segment)\"\n [readonly]=\"true\"\n [language]=\"markdownCodeLanguage(segment)\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n }\n </ng-template>\n </axp-markdown-viewer>\n </div>\n }\n @for (renderable of partitionedLine.renderable; track $index) {\n @switch (renderable.type) {\n @case ('node') {\n @if (axmAssistWidgetNodeFromUnknown(renderable.content)) {\n <div class=\"axm-assist-bot__segment axm-delegated-transcript__widget-embed\" dir=\"auto\">\n <axm-chat-user-form-renderer\n [message]=\"\n syntheticNodeEmbedMessage(lineIndex, segIndex * 100 + $index, renderable.content)\n \"\n />\n </div>\n }\n }\n @case ('followUp') {\n <div class=\"axm-assist-bot__segment\" dir=\"auto\">\n <axm-assist-suggestion-chips [items]=\"renderable.content\" />\n </div>\n }\n @case ('file') {\n <axm-assist-bot-file-line\n [parentMessage]=\"embedParent()\"\n [fileId]=\"renderable.content.fileId\"\n />\n }\n }\n }\n </details>\n }\n } @else if (\n line.role === 'assistant' &&\n (seg.type === 'agent' || seg.type === 'tool') &&\n isDelegatedAgentCommand(seg.content.command)\n ) {\n <details class=\"axm-delegated-transcript__tool-collapse\">\n <summary class=\"axm-delegated-transcript__tool-panel-header\">\n <i class=\"fa-light fa-people-group axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n <span class=\"axm-delegated-transcript__tool-panel-title\">{{\n resolveToolDisplayTitle(seg.content.command)\n }}</span>\n </summary>\n <div class=\"axm-delegated-transcript__tool-panel-body\">\n <details class=\"axm-delegated-transcript__section-collapse\">\n <summary class=\"axm-delegated-transcript__section-summary\">\n {{ '@conversation:chat.assist-renderer.sections.agent-prompt' | translate | async }}\n </summary>\n <div\n class=\"axm-delegated-transcript__prompt axm-assist-bot__segment\"\n [attr.dir]=\"segmentDir(delegatedPromptPreview(seg.content.arguments))\"\n >\n {{ delegatedPromptPreview(seg.content.arguments) }}\n </div>\n </details>\n <details class=\"axm-delegated-transcript__section-collapse\">\n <summary class=\"axm-delegated-transcript__section-summary\">\n {{ '@conversation:chat.assist-renderer.sections.input' | translate | async }}\n </summary>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"formatArgs(seg.content.arguments)\"\n [readonly]=\"true\"\n language=\"json\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n </details>\n @if (toolResultForCallId(seg.callId); as resultLine) {\n @let outcomeSegs = delegatedAgentOutcomeSegmentsForCall(resultLine);\n @if (outcomeSegs.length > 0) {\n <details class=\"axm-delegated-transcript__section-collapse\" open>\n <summary class=\"axm-delegated-transcript__section-summary\">\n {{ '@conversation:chat.assist-renderer.sections.agent-answer' | translate | async }}\n </summary>\n @for (outSeg of outcomeSegs; track $index; let outcomeIndex = $index) {\n @switch (outSeg.type) {\n @case ('text') {\n @let parsedOut = parseAssistLineText(outSeg.content);\n @if (parsedOut.thinking?.trim()) {\n <details class=\"axm-delegated-transcript__think\">\n <summary class=\"axm-delegated-transcript__think-summary\">\n <i class=\"fa-light fa-brain axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n {{ '@conversation:chat.assist-renderer.sections.thinking' | translate | async }}\n </summary>\n <div\n class=\"axm-assist-renderer__thinking-body axm-assist-bot__segment axm-assist-renderer__markdown\"\n [attr.dir]=\"segmentDir(parsedOut.thinking ?? '')\"\n >\n <axp-markdown-viewer [markdown]=\"parsedOut.thinking ?? ''\">\n <ng-template axpMarkdownTemplate=\"code\" let-segment>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"markdownCodeValue(segment)\"\n [readonly]=\"true\"\n [language]=\"markdownCodeLanguage(segment)\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n </ng-template>\n </axp-markdown-viewer>\n </div>\n </details>\n }\n @if (parsedOut.body.trim()) {\n @let partitionedOut = partitionAnswerText(parsedOut.body);\n @if (partitionedOut.markdown.trim()) {\n <div\n class=\"axm-assist-bot__segment axm-assist-renderer__markdown\"\n [attr.dir]=\"segmentDir(partitionedOut.markdown)\"\n >\n <axp-markdown-viewer [markdown]=\"partitionedOut.markdown\">\n <ng-template axpMarkdownTemplate=\"code\" let-segment>\n @if (widgetNodeFromCode(markdownCodeValue(segment))) {\n <div\n class=\"axm-assist-bot__segment axm-delegated-transcript__widget-embed\"\n dir=\"auto\"\n >\n <axm-chat-user-form-renderer\n [message]=\"\n syntheticNodeFromCode(\n markdownCodeValue(segment),\n sectionCollapseKey(\n lineIndex,\n segIndex * 1000 + outcomeIndex,\n 'out-code'\n )\n )\n \"\n />\n </div>\n } @else {\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"markdownCodeValue(segment)\"\n [readonly]=\"true\"\n [language]=\"markdownCodeLanguage(segment)\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n }\n </ng-template>\n </axp-markdown-viewer>\n </div>\n }\n @for (renderable of partitionedOut.renderable; track $index; let renderableIndex = $index) {\n @switch (renderable.type) {\n @case ('node') {\n @if (axmAssistWidgetNodeFromUnknown(renderable.content)) {\n <div\n class=\"axm-assist-bot__segment axm-delegated-transcript__widget-embed\"\n dir=\"auto\"\n >\n <axm-chat-user-form-renderer\n [message]=\"\n syntheticNodeEmbedMessage(\n lineIndex,\n segIndex * 1000 + outcomeIndex * 10 + renderableIndex,\n renderable.content\n )\n \"\n />\n </div>\n }\n }\n @case ('followUp') {\n <div class=\"axm-assist-bot__segment\" dir=\"auto\">\n <axm-assist-suggestion-chips [items]=\"renderable.content\" />\n </div>\n }\n @case ('file') {\n <axm-assist-bot-file-line\n [parentMessage]=\"embedParent()\"\n [fileId]=\"renderable.content.fileId\"\n />\n }\n }\n }\n }\n }\n @case ('think') {\n <details class=\"axm-delegated-transcript__think\">\n <summary class=\"axm-delegated-transcript__think-summary\">\n <i class=\"fa-light fa-brain axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n {{ '@conversation:chat.assist-renderer.sections.thinking' | translate | async }}\n </summary>\n <div\n class=\"axm-assist-renderer__thinking-body axm-assist-bot__segment axm-assist-renderer__markdown\"\n [attr.dir]=\"segmentDir(outSeg.content)\"\n >\n <axp-markdown-viewer [markdown]=\"outSeg.content\">\n <ng-template axpMarkdownTemplate=\"code\" let-segment>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"markdownCodeValue(segment)\"\n [readonly]=\"true\"\n [language]=\"markdownCodeLanguage(segment)\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n </ng-template>\n </axp-markdown-viewer>\n </div>\n </details>\n }\n @case ('file') {\n <axm-assist-bot-file-line [parentMessage]=\"embedParent()\" [fileId]=\"outSeg.content.fileId\" />\n }\n @case ('node') {\n @if (axmAssistWidgetNodeFromUnknown(outSeg.content)) {\n <div class=\"axm-assist-bot__segment axm-delegated-transcript__widget-embed\" dir=\"auto\">\n <axm-chat-user-form-renderer\n [message]=\"\n syntheticNodeEmbedMessage(lineIndex, segIndex * 1000 + outcomeIndex, outSeg.content)\n \"\n />\n </div>\n }\n }\n @case ('followUp') {\n <div class=\"axm-assist-bot__segment\" dir=\"auto\">\n <axm-assist-suggestion-chips [items]=\"outSeg.content\" />\n </div>\n }\n }\n }\n </details>\n } @else {\n <details class=\"axm-delegated-transcript__section-collapse\">\n <summary class=\"axm-delegated-transcript__section-summary\">\n {{ '@conversation:chat.assist-renderer.sections.output' | translate | async }}\n </summary>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"formatToolResultBody(resultLine)\"\n [readonly]=\"true\"\n language=\"json\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n </details>\n }\n }\n </div>\n </details>\n } @else if (line.role === 'assistant' && (seg.type === 'agent' || seg.type === 'tool')) {\n <details class=\"axm-delegated-transcript__tool-collapse\">\n <summary class=\"axm-delegated-transcript__tool-panel-header\">\n <i class=\"fa-light fa-screwdriver-wrench axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n <span class=\"axm-delegated-transcript__tool-panel-title\">{{\n resolveToolDisplayTitle(seg.content.command)\n }}</span>\n </summary>\n <div class=\"axm-delegated-transcript__tool-panel-body\">\n <details class=\"axm-delegated-transcript__section-collapse\">\n <summary class=\"axm-delegated-transcript__section-summary\">\n {{ '@conversation:chat.assist-renderer.sections.input' | translate | async }}\n </summary>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"formatArgs(seg.content.arguments)\"\n [readonly]=\"true\"\n language=\"json\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n </details>\n @if (toolResultForCallId(seg.callId); as resultLine) {\n <details class=\"axm-delegated-transcript__section-collapse\" open>\n <summary class=\"axm-delegated-transcript__section-summary\">\n {{ '@conversation:chat.assist-renderer.sections.output' | translate | async }}\n </summary>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"formatToolResultBody(resultLine)\"\n [readonly]=\"true\"\n language=\"json\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n </details>\n }\n </div>\n </details>\n } @else if (line.role === 'assistant' && seg.type === 'node') {\n @if (axmAssistWidgetNodeFromUnknown(seg.content)) {\n <details class=\"axm-delegated-transcript__section-collapse\" open>\n <summary class=\"axm-delegated-transcript__section-summary\">\n {{ '@conversation:chat.assist-renderer.sections.agent-answer' | translate | async }}\n </summary>\n <div class=\"axm-assist-bot__segment axm-delegated-transcript__widget-embed\" dir=\"auto\">\n <axm-chat-user-form-renderer\n [message]=\"syntheticNodeEmbedMessage(lineIndex, segIndex, seg.content)\"\n />\n </div>\n </details>\n }\n } @else if (line.role === 'assistant' && seg.type === 'file') {\n <axm-assist-bot-file-line [parentMessage]=\"embedParent()\" [fileId]=\"seg.content.fileId\" />\n } @else if (line.role === 'tool' && (seg.type === 'tool_result' || seg.type === 'agent_result')) {\n <!-- Shown on the matching tool/agent block above -->\n } @else if (line.role === 'system' && seg.type === 'text') {\n <details class=\"axm-delegated-transcript__section-collapse\">\n <summary class=\"axm-delegated-transcript__section-summary\">\n {{ '@conversation:chat.assist-renderer.delegated-agent.roles.system' | translate | async }}\n </summary>\n <div class=\"axm-assist-bot__segment\" [attr.dir]=\"segmentDir(seg.content)\">\n <ax-conversation-text-renderer [message]=\"syntheticTextMessage(lineIndex, segIndex, seg.content)\" />\n </div>\n </details>\n } @else {\n <details class=\"axm-delegated-transcript__section-collapse\">\n <summary class=\"axm-delegated-transcript__section-summary\">\n {{ '@conversation:chat.assist-renderer.sections.output' | translate | async }}\n </summary>\n <div\n class=\"axm-assist-bot__fallback axm-assist-bot__segment\"\n [attr.dir]=\"segmentDir(formatFallbackSegment(seg))\"\n >\n {{ formatFallbackSegment(seg) }}\n </div>\n </details>\n }\n }\n </div>\n </details>\n }\n </div>\n }\n</div>\n","//#region ---- Imports ----\n\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXBasePageComponent } from '@acorex/components/page';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport type { AXPAiChatMessage, AXPAiDelegatedAgentTranscriptRunInput } from '@acorex-platform/module-ai-management-client';\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\n\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { axmDownloadDelegatedAgentDetailJson } from '../utils/assist-delegated-agent-detail-export.util';\nimport { axmDelegatedTranscriptEmbedParentStub } from '../utils/assist-delegated-agent-transcript-view.util';\nimport { AXMAssistDelegatedAgentTranscriptViewComponent } from './assist-delegated-agent-transcript-view.component';\n\n//#endregion\n\n//#region ---- Types ----\n\nexport interface AXMAssistDelegatedAgentDetailPopupData {\n delegationCallId: string;\n messages: AXPAiChatMessage[];\n runInput?: AXPAiDelegatedAgentTranscriptRunInput;\n agentName?: string;\n emptyHint?: string;\n agentTitleById?: Record<string, string>;\n}\n\n//#endregion\n\n//#region ---- Component ----\n\n@Component({\n selector: 'axm-assist-delegated-agent-detail-popup',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n AXMAssistDelegatedAgentTranscriptViewComponent,\n AXButtonModule,\n AXTranslationModule,\n AsyncPipe,\n AXDecoratorModule,\n ],\n template: `\n <div class=\"axm-assist-delegated-detail-popup\">\n <axm-assist-delegated-agent-transcript-view\n [messages]=\"messages\"\n [embedParent]=\"embedParent\"\n [emptyHint]=\"emptyHint\"\n [agentTitleById]=\"agentTitleById\"\n />\n <ax-footer>\n <ax-suffix>\n <ax-button\n look=\"outline\"\n color=\"primary\"\n icon=\"fa-light fa-download\"\n [text]=\"'@conversation:chat.assist-renderer.delegated-agent.download-json' | translate | async\"\n [disabled]=\"!messages.length\"\n (onClick)=\"downloadJson()\"\n ></ax-button>\n <ax-button\n look=\"solid\"\n color=\"primary\"\n [text]=\"'@general:actions.close.title' | translate | async\"\n (onClick)=\"close()\"\n ></ax-button>\n </ax-suffix>\n </ax-footer>\n </div>\n `,\n styles: [\n `\n .axm-assist-delegated-detail-popup {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n min-block-size: 0;\n }\n\n .axm-assist-delegated-detail-popup ax-footer ax-suffix {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: 0.5rem;\n }\n `,\n ],\n})\nexport class AXMAssistDelegatedAgentDetailPopupComponent extends AXBasePageComponent {\n /** Set by {@link AXPopupService} from `data`. */\n delegationCallId = '';\n\n messages: AXPAiChatMessage[] = [];\n\n runInput?: AXPAiDelegatedAgentTranscriptRunInput;\n\n agentName?: string;\n\n emptyHint?: string;\n\n agentTitleById: Record<string, string> = {};\n\n embedParent = axmDelegatedTranscriptEmbedParentStub();\n\n protected downloadJson(): void {\n axmDownloadDelegatedAgentDetailJson(\n this.delegationCallId,\n this.messages,\n this.runInput,\n this.agentName,\n );\n }\n}\n\n//#endregion\n"],"names":["i1","i2","i3"],"mappings":"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"}
|