@acorex/modules 21.0.0-next.31 → 21.0.0-next.33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/{acorex-modules-ai-management-acorex-modules-ai-management-B6lnG21F.mjs → acorex-modules-ai-management-acorex-modules-ai-management-WuqoH4OL.mjs} +10 -11
- package/fesm2022/acorex-modules-ai-management-acorex-modules-ai-management-WuqoH4OL.mjs.map +1 -0
- package/fesm2022/{acorex-modules-ai-management-agent.entity-C2APPc7g.mjs → acorex-modules-ai-management-agent.entity-DK9GNMdR.mjs} +2 -2
- package/fesm2022/{acorex-modules-ai-management-agent.entity-C2APPc7g.mjs.map → acorex-modules-ai-management-agent.entity-DK9GNMdR.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-ai-management-ai-delegated-agent-transcript-popup.component-D_54-MqC.mjs → acorex-modules-ai-management-ai-delegated-agent-transcript-popup.component-CWXEW9yL.mjs} +2 -2
- package/fesm2022/{acorex-modules-ai-management-ai-delegated-agent-transcript-popup.component-D_54-MqC.mjs.map → acorex-modules-ai-management-ai-delegated-agent-transcript-popup.component-CWXEW9yL.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-ai-management-assist-delegated-agent-configurator-widget-edit.component-pG9y9bqO.mjs → acorex-modules-ai-management-assist-delegated-agent-configurator-widget-edit.component-CNKwIqUE.mjs} +6 -4
- package/fesm2022/acorex-modules-ai-management-assist-delegated-agent-configurator-widget-edit.component-CNKwIqUE.mjs.map +1 -0
- package/fesm2022/{acorex-modules-ai-management-assist.entity-D7sIFWTx.mjs → acorex-modules-ai-management-assist.entity-DX2U9sd5.mjs} +2 -2
- package/fesm2022/{acorex-modules-ai-management-assist.entity-D7sIFWTx.mjs.map → acorex-modules-ai-management-assist.entity-DX2U9sd5.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-ai-management-index-DoOTRMvM.mjs → acorex-modules-ai-management-index-KX3TVRXr.mjs} +2 -2
- package/fesm2022/{acorex-modules-ai-management-index-DoOTRMvM.mjs.map → acorex-modules-ai-management-index-KX3TVRXr.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-ai-management-model.entity-xhfG1tFZ.mjs → acorex-modules-ai-management-model.entity-BeuDUahR.mjs} +2 -2
- package/fesm2022/{acorex-modules-ai-management-model.entity-xhfG1tFZ.mjs.map → acorex-modules-ai-management-model.entity-BeuDUahR.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-ai-management-open-ai-endpoint.entity-Bot8Ctq1.mjs → acorex-modules-ai-management-open-ai-endpoint.entity-D-9unl6i.mjs} +2 -2
- package/fesm2022/{acorex-modules-ai-management-open-ai-endpoint.entity-Bot8Ctq1.mjs.map → acorex-modules-ai-management-open-ai-endpoint.entity-D-9unl6i.mjs.map} +1 -1
- package/fesm2022/acorex-modules-ai-management.mjs +1 -1
- package/fesm2022/{acorex-modules-assessment-management-acorex-modules-assessment-management-D1DhOSYU.mjs → acorex-modules-assessment-management-acorex-modules-assessment-management-BNK6C-Ng.mjs} +25 -25
- package/fesm2022/{acorex-modules-assessment-management-acorex-modules-assessment-management-D1DhOSYU.mjs.map → acorex-modules-assessment-management-acorex-modules-assessment-management-BNK6C-Ng.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-assessment-case.entity-BwwarDP0.mjs → acorex-modules-assessment-management-assessment-case.entity-Ds8pRzvE.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-assessment-case.entity-BwwarDP0.mjs.map → acorex-modules-assessment-management-assessment-case.entity-Ds8pRzvE.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-assessment-session.entity-CQNn4Ryb.mjs → acorex-modules-assessment-management-assessment-session.entity-tq1Q4wkS.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-assessment-session.entity-CQNn4Ryb.mjs.map → acorex-modules-assessment-management-assessment-session.entity-tq1Q4wkS.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-fill-assessment-session.command-AptlLpWh.mjs → acorex-modules-assessment-management-fill-assessment-session.command-yf0PnWC0.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-fill-assessment-session.command-AptlLpWh.mjs.map → acorex-modules-assessment-management-fill-assessment-session.command-yf0PnWC0.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-index-BBzx9W5u.mjs → acorex-modules-assessment-management-index-B2SncZAW.mjs} +6 -6
- package/fesm2022/acorex-modules-assessment-management-index-B2SncZAW.mjs.map +1 -0
- package/fesm2022/{acorex-modules-assessment-management-preview-question.command-BMoPn_op.mjs → acorex-modules-assessment-management-preview-question.command-DPzL8C44.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-preview-question.command-BMoPn_op.mjs.map → acorex-modules-assessment-management-preview-question.command-DPzL8C44.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-preview-questionnaire.command-BI7JJIbZ.mjs → acorex-modules-assessment-management-preview-questionnaire.command-BrI5gFtx.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-preview-questionnaire.command-BI7JJIbZ.mjs.map → acorex-modules-assessment-management-preview-questionnaire.command-BrI5gFtx.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-BfWuSVG9.mjs → acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-XD5IJpvW.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-BfWuSVG9.mjs.map → acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-XD5IJpvW.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-question-bank-item.entity-CcDAcPJJ.mjs → acorex-modules-assessment-management-question-bank-item.entity-CZ32sQ9M.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-question-bank-item.entity-CcDAcPJJ.mjs.map → acorex-modules-assessment-management-question-bank-item.entity-CZ32sQ9M.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-questionnaire-calculation.entity-DC7xwETF.mjs → acorex-modules-assessment-management-questionnaire-calculation.entity-C7gf4s1y.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-questionnaire-calculation.entity-DC7xwETF.mjs.map → acorex-modules-assessment-management-questionnaire-calculation.entity-C7gf4s1y.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-questionnaire-viewer-popup.component-DF7F-quh.mjs → acorex-modules-assessment-management-questionnaire-viewer-popup.component-BZyIlYWg.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-questionnaire-viewer-popup.component-DF7F-quh.mjs.map → acorex-modules-assessment-management-questionnaire-viewer-popup.component-BZyIlYWg.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-questionnaire.entity-zybar1sK.mjs → acorex-modules-assessment-management-questionnaire.entity-CmmThk2f.mjs} +3 -3
- package/fesm2022/{acorex-modules-assessment-management-questionnaire.entity-zybar1sK.mjs.map → acorex-modules-assessment-management-questionnaire.entity-CmmThk2f.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-save-questionnaire-questions.command-DqJ-_k-4.mjs → acorex-modules-assessment-management-save-questionnaire-questions.command-GLqvK8wB.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-save-questionnaire-questions.command-DqJ-_k-4.mjs.map → acorex-modules-assessment-management-save-questionnaire-questions.command-GLqvK8wB.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-view-session-answers.command-IHxXETJQ.mjs → acorex-modules-assessment-management-view-session-answers.command-CU1TVonZ.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-view-session-answers.command-IHxXETJQ.mjs.map → acorex-modules-assessment-management-view-session-answers.command-CU1TVonZ.mjs.map} +1 -1
- package/fesm2022/acorex-modules-assessment-management.mjs +1 -1
- package/fesm2022/acorex-modules-dashboard-management.mjs +4337 -3486
- package/fesm2022/acorex-modules-dashboard-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-data-management.mjs +3 -2
- package/fesm2022/acorex-modules-data-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-organization-management-org-chart.page-eRTHzLDQ.mjs +784 -0
- package/fesm2022/acorex-modules-organization-management-org-chart.page-eRTHzLDQ.mjs.map +1 -0
- package/fesm2022/acorex-modules-organization-management.mjs +3 -9
- package/fesm2022/acorex-modules-organization-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-workflow-management.mjs +488 -105
- package/fesm2022/acorex-modules-workflow-management.mjs.map +1 -1
- package/package.json +2 -2
- package/types/acorex-modules-dashboard-management.d.ts +395 -216
- package/types/acorex-modules-organization-management.d.ts +3 -12
- package/types/acorex-modules-workflow-management.d.ts +27 -0
- package/fesm2022/acorex-modules-ai-management-acorex-modules-ai-management-B6lnG21F.mjs.map +0 -1
- package/fesm2022/acorex-modules-ai-management-assist-delegated-agent-configurator-widget-edit.component-pG9y9bqO.mjs.map +0 -1
- package/fesm2022/acorex-modules-assessment-management-index-BBzx9W5u.mjs.map +0 -1
- package/fesm2022/acorex-modules-organization-management-org-chart.page-E0hy7dXg.mjs +0 -638
- package/fesm2022/acorex-modules-organization-management-org-chart.page-E0hy7dXg.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-modules-ai-management-acorex-modules-ai-management-B6lnG21F.mjs","sources":["../../../../libs/modules/ai-management/src/lib/const.ts","../../../../libs/modules/ai-management/src/lib/manifest.ts","../../../../libs/modules/ai-management/src/lib/entity.provider.ts","../../../../libs/modules/ai-management/src/lib/menu.keys.ts","../../../../libs/modules/ai-management/src/lib/menu.provider.ts","../../../../libs/modules/ai-management/src/lib/settings.keys.ts","../../../../libs/modules/ai-management/src/lib/settings.provider.ts","../../../../libs/modules/ai-management/src/lib/datasources/ai-agent-catalog.datasource.ts","../../../../libs/modules/ai-management/src/lib/datasources/ai-model-catalog.datasource.ts","../../../../libs/modules/ai-management/src/lib/tags/ai-model-purpose-tag.provider.ts","../../../../libs/modules/ai-management/src/lib/features/assist-delegated-agent-configurator/assist-delegated-agent-configurator-widget.config.ts","../../../../libs/modules/ai-management/src/lib/widget-definition.provider.ts","../../../../libs/modules/ai-management/src/lib/ai-management.module.ts","../../../../libs/modules/ai-management/src/lib/utils/ai-delegated-agent-prompt-preview.util.ts","../../../../libs/modules/ai-management/src/lib/utils/ai-tool-command-args-normalize.ts","../../../../libs/modules/ai-management/src/lib/features/ai-engine.types.ts","../../../../libs/modules/ai-management/src/lib/utils/assist-initial-messages.util.ts","../../../../libs/modules/ai-management/src/lib/features/ai-platform-runtime-context.builder.ts","../../../../libs/modules/ai-management/src/lib/tools/chat-generate-image.command.definition.ts","../../../../libs/modules/ai-management/src/lib/tools/chat-transcribe-speech.command.definition.ts","../../../../libs/modules/ai-management/src/lib/tools/chat-synthesize-speech.command.definition.ts","../../../../libs/modules/ai-management/src/lib/tools/extract-document-text.command.definition.ts","../../../../libs/modules/ai-management/src/lib/tools/structured-text-completion.command.definition.ts","../../../../libs/modules/ai-management/src/lib/tools/ai-chat-tool.command-keys.ts","../../../../libs/modules/ai-management/src/lib/tools/ai-chat-tool-run-context.service.ts","../../../../libs/modules/ai-management/src/lib/tools/ai-chat-tool.llm-parameters.ts","../../../../libs/modules/ai-management/src/lib/features/image/ai-generated-image-persist.ts","../../../../libs/modules/ai-management/src/lib/features/ai-assist-chat-model-catalog.service.ts","../../../../libs/modules/ai-management/src/lib/features/ai-engine.ts","../../../../libs/modules/ai-management/src/lib/features/ai-manager.service.ts","../../../../libs/modules/ai-management/src/lib/features/chat/ai-chat-thinking.util.ts","../../../../libs/modules/ai-management/src/lib/features/chat/ai-chat-display-items.build.ts","../../../../libs/modules/ai-management/src/lib/features/chat/ai-chat-tool-audio-preview.component.ts","../../../../libs/modules/ai-management/src/lib/features/chat/ai-chat-tool-image-preview.component.ts","../../../../libs/modules/ai-management/src/lib/features/chat/ai-chat-tool-execute.service.ts","../../../../libs/modules/ai-management/src/lib/features/chat/ai-chat-page.component.ts","../../../../libs/modules/ai-management/src/acorex-modules-ai-management.ts"],"sourcesContent":["//#region ---- Module Config ----\n\nconst config = {\n i18n: 'ai-management',\n module: 'AiManagement',\n route: 'ai-management',\n};\n\nexport const RootConfig = {\n config,\n module: {\n name: config.module,\n route: config.route,\n title: `@${config.i18n}:module.title`,\n icon: 'fa-light fa-robot',\n },\n entities: {\n model: {\n name: 'AiModel',\n fullName: `${config.module}.AiModel`,\n title: '@ai-management:models.entities.model.title',\n titlePlural: '@ai-management:models.entities.model.plural',\n icon: 'fa-light fa-microchip',\n },\n assist: {\n name: 'Assist',\n fullName: `${config.module}.Assist`,\n title: '@ai-management:assists.entities.assist.title',\n titlePlural: '@ai-management:assists.entities.assist.plural',\n icon: 'fa-light fa-user-robot',\n },\n agent: {\n name: 'AiAgent',\n fullName: `${config.module}.AiAgent`,\n title: '@ai-management:agents.entities.agent.title',\n titlePlural: '@ai-management:agents.entities.agent.plural',\n icon: 'fa-light fa-people-group',\n },\n openAiEndpoint: {\n name: 'OpenAiEndpoint',\n fullName: `${config.module}.OpenAiEndpoint`,\n title: '@ai-management:open-ai-endpoints.entities.endpoint.title',\n titlePlural: '@ai-management:open-ai-endpoints.entities.endpoint.plural',\n icon: 'fa-light fa-plug',\n },\n },\n};\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPModuleManifest } from '@acorex/platform/core';\nimport { RootConfig } from './const';\n\n//#endregion\n\n//#region ---- Manifest Definition ----\n\n/**\n * AI Management Module Manifest.\n * Defines module metadata for AI provider and API key management.\n */\nexport const AiManagementManifest: AXPModuleManifest = {\n name: RootConfig.module.name,\n version: '1.0.0',\n title: RootConfig.module.title,\n icon: RootConfig.module.icon,\n i18n: RootConfig.config.i18n,\n dependencies: [],\n};\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPEntity } from '@acorex/platform/common';\nimport { AXPEntityDefinitionLoader, AXPEntityPreloadEntity } from '@acorex/platform/layout/entity';\nimport { Injectable } from '@angular/core';\nimport { RootConfig } from './const';\n\n//#endregion\n\n//#region ---- Entity Provider ----\n\n@Injectable()\nexport class AXMAiManagementEntityProvider implements AXPEntityDefinitionLoader {\n preload(): AXPEntityPreloadEntity[] {\n const module = RootConfig.module.name;\n return Object.values(RootConfig.entities).map((entity: { name: string }) => ({\n module,\n entity: entity.name,\n }));\n }\n\n async get(moduleName: string, entityName: string): Promise<AXPEntity | null> {\n if (moduleName !== RootConfig.module.name) return null;\n switch (entityName) {\n case RootConfig.entities.model.name:\n return (await import('./entities/model/model.entity')).factory();\n case RootConfig.entities.assist.name:\n return (await import('./entities/assist/assist.entity')).assistFactory();\n case RootConfig.entities.agent.name:\n return (await import('./entities/agent/agent.entity')).agentFactory();\n case RootConfig.entities.openAiEndpoint.name:\n return (await import('./entities/open-ai-endpoint/open-ai-endpoint.entity')).openAiEndpointFactory();\n default:\n return null;\n }\n }\n\n async list(): Promise<{ name: string; module: string }[]> {\n const m = RootConfig.module.name;\n return Promise.resolve(\n Object.values(RootConfig.entities).map((e) => ({ name: e.name, module: m }))\n );\n }\n}\n\n//#endregion\n","//#region ---- Menu Keys ----\n\n/**\n * AI Management menu keys.\n * Pattern: AiManagement:Menu:{Path}\n */\nexport const AXPAiManagementMenuKeys = {\n /** OpenAI-compatible HTTP endpoints (base URL + API key). */\n OpenAiEndpoints: 'AiManagement:Menu:OpenAiEndpoints',\n /** List of AI models (from providers). */\n Models: 'AiManagement:Menu:Models',\n /** AI Chat page. */\n Chat: 'AiManagement:Menu:Chat',\n /** List of Assists. */\n Assists: 'AiManagement:Menu:Assists',\n /** Delegated specialist agents (supervisor routing). */\n Agents: 'AiManagement:Menu:Agents',\n} as const;\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPCommonMenuKeys } from '@acorex/modules/common';\nimport { AXPMenuProvider, AXPMenuProviderContext } from '@acorex/platform/common';\nimport { AXPSessionService } from '@acorex/platform/auth';\nimport { AXPEntityService } from '@acorex/platform/layout/entity';\nimport { inject, Injectable } from '@angular/core';\nimport { RootConfig } from './const';\nimport { AXPAiManagementMenuKeys } from './menu.keys';\n\n//#endregion\n\n//#region ---- Menu Provider ----\n\n@Injectable()\nexport class AXMAiManagementMenuProvider implements AXPMenuProvider {\n private readonly sessionService = inject(AXPSessionService);\n private readonly entityService = inject(AXPEntityService);\n\n async provide(context: AXPMenuProviderContext): Promise<void> {\n const appName = this.sessionService.application?.name ?? '';\n const module = RootConfig.module;\n\n //#region ---- Configuration > AI Management (assists, models) ----\n\n const aiManagementConfigMenu = context.find(AXPCommonMenuKeys.AiManagementConfig);\n if (!aiManagementConfigMenu.exists) {\n context.find(AXPCommonMenuKeys.Configuration).addItems([\n {\n name: AXPCommonMenuKeys.AiManagementConfig,\n text: '@general:menus.ai-management.title',\n icon: module.icon,\n type: 'menu',\n priority: 8941,\n children: [],\n },\n ]);\n }\n\n context.find(AXPCommonMenuKeys.AiManagementConfig).addItems([\n {\n name: AXPAiManagementMenuKeys.Agents,\n text: '@ai-management:module.menus.agents.title',\n path: this.entityService.createPath(module.name, RootConfig.entities.agent.name),\n icon: RootConfig.entities.agent.icon,\n priority: -1,\n },\n {\n name: AXPAiManagementMenuKeys.Assists,\n text: '@ai-management:module.menus.assists.title',\n path: this.entityService.createPath(module.name, RootConfig.entities.assist.name),\n icon: RootConfig.entities.assist.icon,\n priority: 0,\n },\n {\n name: AXPAiManagementMenuKeys.OpenAiEndpoints,\n text: '@ai-management:module.menus.open-ai-endpoints.title',\n path: this.entityService.createPath(module.name, RootConfig.entities.openAiEndpoint.name),\n icon: RootConfig.entities.openAiEndpoint.icon,\n priority: 2,\n },\n {\n name: AXPAiManagementMenuKeys.Models,\n text: '@ai-management:module.menus.models.title',\n path: this.entityService.createPath(module.name, RootConfig.entities.model.name),\n icon: RootConfig.entities.model.icon,\n priority: 1,\n },\n ]);\n\n //#endregion\n\n //#region ---- Root: AI Chat (next to Reports) ----\n\n context.addItems([\n {\n name: AXPAiManagementMenuKeys.Chat,\n text: '@ai-management:module.menus.chat.title',\n path: `/${appName}/ai-management/chat`,\n icon: 'fa-light fa-comments',\n priority: 900002,\n },\n ]);\n\n //#endregion\n }\n}\n\n//#endregion\n","//#region ---- Setting Keys ----\n\n/**\n * AI Management setting keys.\n * Pattern: AiManagement:Setting:{Path}\n */\nexport const AXPAiManagementSettings = {\n /** Assist primary key (`id`) used when no assist is explicitly selected (tenant-scoped). */\n DefaultAssistId: 'AiManagement:Setting:DefaultAssistId',\n Providers: {\n Gemini: {\n ApiKey: 'AiManagement:Setting:Providers.Gemini.ApiKey',\n },\n },\n} as const;\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXTranslationService } from '@acorex/core/translation';\nimport {\n AXPSettingDefinitionProvider,\n AXPSettingDefinitionProviderContext,\n} from '@acorex/platform/common';\nimport { AXPWidgetsList } from '@acorex/modules/common';\nimport { inject } from '@angular/core';\nimport { RootConfig } from './const';\nimport { AXPAiManagementSettings } from './settings.keys';\nimport { objectKeyValueTransforms } from '@acorex/platform/core';\n\n//#endregion\n\n//#region ---- Settings Provider ----\n\nexport class AXMAiManagementSettingProvider implements AXPSettingDefinitionProvider {\n private readonly translationService = inject(AXTranslationService);\n\n async provide(context: AXPSettingDefinitionProviderContext): Promise<void> {\n const trans = async (key: string) =>\n await this.translationService.translateAsync(`@ai-management:settings.${key}`);\n\n context\n .addGroup(\n 'ai-settings',\n await trans('group.title'),\n await trans('group.description'),\n 'fa-light fa-robot'\n )\n .addSection(\n 'default-assist',\n await trans('section.default-assist.title'),\n await trans('section.default-assist.description'),\n )\n .addSetting({\n key: AXPAiManagementSettings.DefaultAssistId,\n title: await trans('default-assist.name.title'),\n scope: 'T',\n isInherited: true,\n valueTransforms: objectKeyValueTransforms('name'),\n widget: {\n type: AXPWidgetsList.Editors.LookupBox,\n options: {\n entity: `${RootConfig.module.name}.${RootConfig.entities.assist.name}`,\n look: 'select',\n multiple: false,\n textField: 'title',\n valueField: 'name',\n hasClearButton: true,\n },\n },\n description: await trans('default-assist.name.description'),\n })\n .endSection()\n .addSection('gemini', await trans('section.gemini.title'), await trans('section.gemini.description'))\n .addSetting({\n key: AXPAiManagementSettings.Providers.Gemini.ApiKey,\n title: await trans('gemini.api-key.title'),\n scope: 'T',\n isInherited: true,\n defaultValue: '',\n widget: {\n type: AXPWidgetsList.Editors.TextBox,\n options: {\n placeholder: await trans('gemini.api-key.placeholder'),\n },\n },\n description: await trans('gemini.api-key.description'),\n })\n .endSection()\n .endGroup();\n }\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXDataSource } from '@acorex/cdk/common';\nimport { AXPDataSourceDefinition, AXPDataSourceDefinitionProvider, AXPFilterDefinition } from '@acorex/platform/core';\nimport { AXPEntityDetailDto, AXPEntityService } from '@acorex/platform/layout/entity';\nimport { AXPWidgetsCatalog } from '@acorex/platform/layout/widget-core';\nimport { inject, Injectable } from '@angular/core';\nimport { RootConfig } from '../const';\n\n//#endregion\n\n/** Registry name for AiAgent catalog rows (delegated specialist definitions). */\nexport const AI_AGENT_CATALOG_DATASOURCE_NAME = 'ai-management-agent-catalog';\n\n//#region ---- Provider ----\n\n@Injectable()\nexport class AXMAiAgentCatalogDataSourceDefinition implements AXPDataSourceDefinitionProvider {\n private readonly entityService = inject(AXPEntityService);\n\n items(): Promise<AXPDataSourceDefinition[]> {\n const accessor = this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.agent.name)\n .data<string, AXPEntityDetailDto<string>, AXPEntityDetailDto<string>>();\n\n const columns = [\n { name: 'id', title: 'ID', datatype: 'uuid', type: AXPWidgetsCatalog.text },\n { name: 'title', title: 'Title', datatype: 'string', type: AXPWidgetsCatalog.text },\n { name: 'name', title: 'Name', datatype: 'string', type: AXPWidgetsCatalog.text },\n ];\n\n const filters = [\n {\n field: 'title',\n title: 'Title',\n operator: { type: 'contains' },\n widget: { type: AXPWidgetsCatalog.text },\n filterType: { advance: true, inline: true },\n } as AXPFilterDefinition,\n ];\n\n return Promise.resolve([\n {\n name: AI_AGENT_CATALOG_DATASOURCE_NAME,\n title: 'AI Agents (delegated specialists)',\n source: () => {\n return new AXDataSource({\n key: 'id',\n load: async (e) => {\n const res = await accessor.query({\n skip: e?.skip ?? 0,\n take: e?.take ?? 500,\n sort: [{ field: 'title', dir: 'asc' }],\n });\n return {\n items: (res.items ?? []) as unknown[],\n total: res.total ?? (res.items?.length ?? 0),\n };\n },\n byKey: async (key: unknown) => {\n return (await accessor.byKey(key as string)) as unknown;\n },\n pageSize: 500,\n });\n },\n columns,\n filters,\n textField: { name: 'title', title: 'Title' },\n valueField: { name: 'id', title: 'ID' },\n },\n ]);\n }\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXDataSource } from '@acorex/cdk/common';\nimport { AXPDataSourceDefinition, AXPDataSourceDefinitionProvider, AXPFilterDefinition } from '@acorex/platform/core';\nimport { AXPEntityDetailDto, AXPEntityService } from '@acorex/platform/layout/entity';\nimport { AXPWidgetsCatalog } from '@acorex/platform/layout/widget-core';\nimport { inject, Injectable } from '@angular/core';\nimport { RootConfig } from '../const';\n\n//#endregion\n\n/**\n * Full AI model catalog for chat (rows that include `chat` or `vision` in `modelPurposes`).\n * Registry name: {@link AI_MODEL_CATALOG_DATASOURCE_NAME}.\n */\nexport const AI_MODEL_CATALOG_DATASOURCE_NAME = 'ai-management-model-catalog';\n\n/**\n * Image-generation models only (`modelPurposes` includes `image`).\n * Registry name: {@link AI_MODEL_IMAGE_CATALOG_DATASOURCE_NAME}.\n */\nexport const AI_MODEL_IMAGE_CATALOG_DATASOURCE_NAME = 'ai-management-model-catalog-image';\n\n/**\n * Speech-to-text models only (`modelPurposes` includes `speech`).\n * Registry name: {@link AI_MODEL_SPEECH_CATALOG_DATASOURCE_NAME}.\n */\nexport const AI_MODEL_SPEECH_CATALOG_DATASOURCE_NAME = 'ai-management-model-catalog-speech';\n\n/**\n * Text-to-speech models only (`modelPurposes` includes `tts`).\n * Registry name: {@link AI_MODEL_TTS_CATALOG_DATASOURCE_NAME}.\n */\nexport const AI_MODEL_TTS_CATALOG_DATASOURCE_NAME = 'ai-management-model-catalog-tts';\n\nexport type AXMAiModelPurposeSlug = 'chat' | 'vision' | 'image' | 'speech' | 'tts';\n\n/** Normalizes `modelPurposes` (and legacy `modelPurpose`) to unique non-empty slugs. */\nexport function normalizeModelPurposes(row: Record<string, unknown> | null | undefined): string[] {\n if (!row) {\n return ['chat'];\n }\n const multi = row['modelPurposes'];\n if (Array.isArray(multi) && multi.length > 0) {\n const out = multi\n .map((x) => String(x).trim())\n .filter((x) => x.length > 0);\n return [...new Set(out)];\n }\n const legacy = row['modelPurpose'];\n if (legacy == null || legacy === '') {\n return ['chat'];\n }\n return [String(legacy)];\n}\n\nexport function modelRowHasPurpose(\n row: Record<string, unknown> | null | undefined,\n purpose: AXMAiModelPurposeSlug,\n): boolean {\n return normalizeModelPurposes(row).includes(purpose);\n}\n\n/** Rows usable in chat / completion pickers: include `chat` or `vision`; not image/speech/tts-only. */\nexport function isChatPurposeModelRow(row: Record<string, unknown> | null | undefined): boolean {\n const p = normalizeModelPurposes(row);\n return p.includes('chat') || p.includes('vision');\n}\n\nexport function isImagePurposeModelRow(row: Record<string, unknown> | null | undefined): boolean {\n return modelRowHasPurpose(row, 'image');\n}\n\nexport function isSpeechPurposeModelRow(row: Record<string, unknown> | null | undefined): boolean {\n return modelRowHasPurpose(row, 'speech');\n}\n\nexport function isTtsPurposeModelRow(row: Record<string, unknown> | null | undefined): boolean {\n return modelRowHasPurpose(row, 'tts');\n}\n\n//#region ---- Provider ----\n\n@Injectable()\nexport class AXMAiModelCatalogDataSourceDefinition implements AXPDataSourceDefinitionProvider {\n private readonly entityService = inject(AXPEntityService);\n\n items(): Promise<AXPDataSourceDefinition[]> {\n const accessor = this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.model.name)\n .data<string, AXPEntityDetailDto<string>, AXPEntityDetailDto<string>>();\n\n const columns = [\n {\n name: 'id',\n title: 'ID',\n datatype: 'uuid',\n type: AXPWidgetsCatalog.text,\n },\n {\n name: 'title',\n title: 'Title',\n datatype: 'string',\n type: AXPWidgetsCatalog.text,\n },\n ];\n\n const filters = [\n {\n field: 'title',\n title: 'Title',\n operator: { type: 'contains' },\n widget: { type: AXPWidgetsCatalog.text },\n filterType: { advance: true, inline: true },\n } as AXPFilterDefinition,\n ];\n\n const loadFiltered = async (\n e: { skip?: number; take?: number } | undefined,\n keep: (row: Record<string, unknown>) => boolean,\n ) => {\n const res = await accessor.query({\n skip: e?.skip ?? 0,\n take: e?.take ?? 500,\n sort: [{ field: 'title', dir: 'asc' }],\n });\n const all = (res.items ?? []) as unknown as Record<string, unknown>[];\n const items = all.filter(keep);\n return {\n items,\n total: items.length,\n };\n };\n\n return Promise.resolve([\n {\n name: AI_MODEL_CATALOG_DATASOURCE_NAME,\n title: 'AI Models (chat)',\n source: () => {\n return new AXDataSource({\n key: 'id',\n load: async (e) => loadFiltered(e, isChatPurposeModelRow),\n byKey: async (key: unknown) => {\n const row = (await accessor.byKey(key as string)) as unknown as Record<string, unknown> | null;\n if (!row || !isChatPurposeModelRow(row)) {\n return null;\n }\n return row;\n },\n pageSize: 500,\n });\n },\n columns,\n filters,\n textField: { name: 'title', title: 'Title' },\n valueField: { name: 'id', title: 'ID' },\n },\n {\n name: AI_MODEL_IMAGE_CATALOG_DATASOURCE_NAME,\n title: 'AI Models (image)',\n source: () => {\n return new AXDataSource({\n key: 'id',\n load: async (e) => loadFiltered(e, (row) => isImagePurposeModelRow(row)),\n byKey: async (key: unknown) => {\n const row = (await accessor.byKey(key as string)) as unknown as Record<string, unknown> | null;\n if (!row || !isImagePurposeModelRow(row)) {\n return null;\n }\n return row;\n },\n pageSize: 500,\n });\n },\n columns,\n filters,\n textField: { name: 'title', title: 'Title' },\n valueField: { name: 'id', title: 'ID' },\n },\n {\n name: AI_MODEL_SPEECH_CATALOG_DATASOURCE_NAME,\n title: 'AI Models (speech)',\n source: () => {\n return new AXDataSource({\n key: 'id',\n load: async (e) => loadFiltered(e, (row) => isSpeechPurposeModelRow(row)),\n byKey: async (key: unknown) => {\n const row = (await accessor.byKey(key as string)) as unknown as Record<string, unknown> | null;\n if (!row || !isSpeechPurposeModelRow(row)) {\n return null;\n }\n return row;\n },\n pageSize: 500,\n });\n },\n columns,\n filters,\n textField: { name: 'title', title: 'Title' },\n valueField: { name: 'id', title: 'ID' },\n },\n {\n name: AI_MODEL_TTS_CATALOG_DATASOURCE_NAME,\n title: 'AI Models (text-to-speech)',\n source: () => {\n return new AXDataSource({\n key: 'id',\n load: async (e) => loadFiltered(e, (row) => isTtsPurposeModelRow(row)),\n byKey: async (key: unknown) => {\n const row = (await accessor.byKey(key as string)) as unknown as Record<string, unknown> | null;\n if (!row || !isTtsPurposeModelRow(row)) {\n return null;\n }\n return row;\n },\n pageSize: 500,\n });\n },\n columns,\n filters,\n textField: { name: 'title', title: 'Title' },\n valueField: { name: 'id', title: 'ID' },\n },\n ]);\n }\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPTag, AXPTagProvider } from '@acorex/platform/core';\nimport { Injectable } from '@angular/core';\n\n//#endregion\n\n/**\n * System tags for the AiModel entity `modelPurposes` field (tag-editor).\n * `title` values are stored as-is on the entity; keep them stable slugs.\n */\nconst AI_MODEL_PURPOSE_TAGS: AXPTag[] = [\n {\n id: 'ai-model-purpose-chat',\n title: 'chat',\n color: '#0284c7',\n description: 'Chat / text completion',\n scope: 'system',\n },\n {\n id: 'ai-model-purpose-vision',\n title: 'vision',\n color: '#7c3aed',\n description: 'Multimodal (image input in chat)',\n scope: 'system',\n },\n {\n id: 'ai-model-purpose-image',\n title: 'image',\n color: '#db2777',\n description: 'Image generation',\n scope: 'system',\n },\n {\n id: 'ai-model-purpose-speech',\n title: 'speech',\n color: '#16a34a',\n description: 'Speech to text',\n scope: 'system',\n },\n {\n id: 'ai-model-purpose-tts',\n title: 'tts',\n color: '#ea580c',\n description: 'Text to speech',\n scope: 'system',\n },\n];\n\n//#region ---- Provider ----\n\n@Injectable()\nexport class AXMAiModelPurposeTagProvider extends AXPTagProvider {\n readonly name = 'ai-model-purpose';\n\n override provide(): Promise<AXPTag[]> {\n return Promise.resolve(AI_MODEL_PURPOSE_TAGS);\n }\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXP_DATA_PATH_PROPERTY, AXP_NAME_PROPERTY } from '@acorex/platform/layout/widgets';\nimport { AXP_WIDGETS_EDITOR_CATEGORY, AXPWidgetConfig, AXPWidgetGroupEnum } from '@acorex/platform/layout/widget-core';\nimport { AI_AGENT_CATALOG_DATASOURCE_NAME } from '../../datasources/ai-agent-catalog.datasource';\n\n//#endregion\n\n//#region ---- Config ----\n\nexport const AXMAssistDelegatedAgentConfiguratorWidget: AXPWidgetConfig = {\n name: 'assist-delegated-agent-configurator',\n title: 'Assist Delegated Agent Configurator',\n icon: 'fa-light fa-user-robot',\n description: 'Select a delegated agent and configure injected delegated parameters.',\n categories: AXP_WIDGETS_EDITOR_CATEGORY,\n groups: [AXPWidgetGroupEnum.UtilityWidget],\n type: 'editor',\n defaultFilterWidgetName: 'string-filter',\n properties: [\n AXP_NAME_PROPERTY,\n AXP_DATA_PATH_PROPERTY,\n {\n name: 'label',\n title: 'Label',\n visible: true,\n group: { name: 'general', title: 'General', order: 1 },\n schema: {\n dataType: 'string',\n defaultValue: '@ai-management:assists.entities.assist.fields.delegated-agent.title',\n interface: {\n path: 'label',\n type: 'text-box',\n options: {\n placeholder: 'Field label',\n },\n },\n },\n },\n {\n name: 'readonly',\n title: 'Readonly',\n visible: true,\n group: { name: 'behavior', title: 'Behavior', order: 2 },\n schema: {\n dataType: 'string',\n interface: {\n path: 'options.readonly',\n type: 'text-box',\n options: {\n placeholder: 'true / false / expression',\n },\n },\n },\n },\n {\n name: 'dataSource',\n title: 'Data Source',\n visible: true,\n group: { name: 'data', title: 'Data', order: 3 },\n schema: {\n dataType: 'string',\n defaultValue: AI_AGENT_CATALOG_DATASOURCE_NAME,\n interface: {\n path: 'options.dataSource',\n type: 'text-box',\n },\n },\n },\n ],\n components: {\n edit: {\n component: () =>\n import('./assist-delegated-agent-configurator-widget-edit.component').then(\n (c) => c.AXMAssistDelegatedAgentConfiguratorWidgetEditComponent,\n ),\n },\n designer: {\n component: () =>\n import('./assist-delegated-agent-configurator-widget-edit.component').then(\n (c) => c.AXMAssistDelegatedAgentConfiguratorWidgetEditComponent,\n ),\n },\n column: {\n component: () =>\n import('./assist-delegated-agent-configurator-widget-column.component').then(\n (c) => c.AXMAssistDelegatedAgentConfiguratorWidgetColumnComponent,\n ),\n },\n },\n};\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPWidgetDefinitionProvider } from '@acorex/platform/layout/widget-core';\nimport { Injectable } from '@angular/core';\nimport { AXMAssistDelegatedAgentConfiguratorWidget } from './features/assist-delegated-agent-configurator/assist-delegated-agent-configurator-widget.config';\n\n//#endregion\n\n//#region ---- AI Management Widgets Provider ----\n\nconst AI_MANAGEMENT_WIDGETS = [AXMAssistDelegatedAgentConfiguratorWidget];\n\n@Injectable()\nexport class AXMAiManagementWidgetsProvider implements AXPWidgetDefinitionProvider {\n getWidgets() {\n return AI_MANAGEMENT_WIDGETS;\n }\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPAuthGuard } from '@acorex/platform/auth';\nimport { AXP_MENU_PROVIDER, AXP_SETTING_DEFINITION_PROVIDER } from '@acorex/platform/common';\nimport {\n AXPComponentSlotModule,\n AXP_DATASOURCE_DEFINITION_PROVIDER,\n AXP_MODULE_MANIFEST_PROVIDER,\n AXP_TAG_PROVIDER,\n} from '@acorex/platform/core';\nimport { AXP_ENTITY_DEFINITION_LOADER } from '@acorex/platform/layout/entity';\nimport { AXP_WIDGET_DEFINITION_PROVIDER } from '@acorex/platform/layout/widget-core';\nimport { AXPWidgetsModule } from '@acorex/platform/layout/widgets';\nimport { AXPRootLayoutComponent } from '@acorex/platform/themes/default';\nimport { NgModule } from '@angular/core';\nimport { ROUTES, Routes } from '@angular/router';\nimport { AiManagementManifest } from './manifest';\nimport { AXMAiManagementEntityProvider } from './entity.provider';\nimport { AXMAiManagementMenuProvider } from './menu.provider';\nimport { AXMAiManagementSettingProvider } from './settings.provider';\nimport { AXMAiAgentCatalogDataSourceDefinition } from './datasources/ai-agent-catalog.datasource';\nimport { AXMAiModelCatalogDataSourceDefinition } from './datasources/ai-model-catalog.datasource';\nimport { AXMAiModelPurposeTagProvider } from './tags/ai-model-purpose-tag.provider';\nimport { AXMAiManagementWidgetsProvider } from './widget-definition.provider';\n\n//#endregion\n\n//#region ---- Routes ----\n\nfunction routesFactory(): Routes {\n return [\n {\n path: ':app/ai-management/chat',\n canActivate: [AXPAuthGuard],\n loadComponent: () => AXPRootLayoutComponent,\n title: 'AI Chat',\n children: [\n {\n path: '',\n loadComponent: () =>\n import('./features').then((c) => c.AXMAiChatPageComponent),\n data: { reuse: true },\n },\n ],\n },\n ];\n}\n\n//#endregion\n\n//#region ---- Module ----\n\n@NgModule({\n imports: [\n AXPComponentSlotModule.forChild({\n }),\n AXPWidgetsModule,\n ],\n providers: [\n {\n provide: ROUTES,\n multi: true,\n useFactory: routesFactory,\n },\n {\n provide: AXP_ENTITY_DEFINITION_LOADER,\n useClass: AXMAiManagementEntityProvider,\n multi: true,\n },\n {\n provide: AXP_MODULE_MANIFEST_PROVIDER,\n useValue: AiManagementManifest,\n multi: true,\n },\n {\n provide: AXP_MENU_PROVIDER,\n useClass: AXMAiManagementMenuProvider,\n multi: true,\n },\n {\n provide: AXP_SETTING_DEFINITION_PROVIDER,\n useClass: AXMAiManagementSettingProvider,\n multi: true,\n },\n {\n provide: AXP_DATASOURCE_DEFINITION_PROVIDER,\n useClass: AXMAiModelCatalogDataSourceDefinition,\n multi: true,\n },\n {\n provide: AXP_DATASOURCE_DEFINITION_PROVIDER,\n useClass: AXMAiAgentCatalogDataSourceDefinition,\n multi: true,\n },\n {\n provide: AXP_WIDGET_DEFINITION_PROVIDER,\n useClass: AXMAiManagementWidgetsProvider,\n multi: true,\n },\n {\n provide: AXP_TAG_PROVIDER,\n useClass: AXMAiModelPurposeTagProvider,\n multi: true,\n },\n ],\n})\nexport class AXMAiManagementModule {}\n\n//#endregion\n","//#region ---- Delegated agent prompt preview ----\n\nfunction normalizeDelegatedAgentToolArgs(argumentsValue: unknown): Record<string, unknown> | null {\n if (argumentsValue == null) {\n return null;\n }\n if (typeof argumentsValue === 'object' && !Array.isArray(argumentsValue)) {\n return { ...(argumentsValue as Record<string, unknown>) };\n }\n if (typeof argumentsValue === 'string') {\n const t = argumentsValue.trim();\n if (!t) {\n return null;\n }\n try {\n const p = JSON.parse(t) as unknown;\n if (p != null && typeof p === 'object' && !Array.isArray(p)) {\n return p as Record<string, unknown>;\n }\n } catch {\n return null;\n }\n }\n return null;\n}\n\nfunction formatArgsFallback(argumentsValue: unknown): string {\n if (argumentsValue == null) {\n return '';\n }\n if (typeof argumentsValue === 'string') {\n return argumentsValue;\n }\n try {\n return JSON.stringify(argumentsValue, null, 2);\n } catch {\n return String(argumentsValue);\n }\n}\n\n/**\n * Human-readable specialist prompt from delegated-agent tool arguments (conversation / mini-chat UI).\n */\nexport function axpAiDelegatedAgentPromptPreview(argumentsValue: unknown): string {\n const obj = normalizeDelegatedAgentToolArgs(argumentsValue);\n if (!obj) {\n return formatArgsFallback(argumentsValue);\n }\n const preferKeys = ['query', 'task', 'prompt', 'message', 'userMessage', 'instruction', 'goal'] as const;\n for (const k of preferKeys) {\n const v = obj[k];\n if (typeof v === 'string' && v.trim()) {\n return v.trim();\n }\n }\n const keys = Object.keys(obj);\n if (keys.length === 1) {\n const only = obj[keys[0]!];\n if (typeof only === 'string' && only.trim()) {\n return only.trim();\n }\n }\n try {\n return JSON.stringify(obj, null, 2);\n } catch {\n return formatArgsFallback(argumentsValue);\n }\n}\n\n//#endregion\n","//#region ---- AI tool command args ----\n\nimport { axpCreateEntityAiToolInputDefaults } from '@acorex/platform/layout/entity';\n\n/**\n * Recursively parses string values that look like JSON objects or arrays, then\n * normalizes nested values the same way.\n *\n * LLM tool calls often stringify nested payloads (e.g. `__context__` for\n * `Entity:Create`). Use this before passing args to the command or query service\n * from AI paths only — not inside generic command infrastructure.\n *\n * @param toolName When set, command-specific AI defaults from command definitions are merged (e.g. `Entity:Create` redirect).\n */\nexport function normalizeAiToolCommandArgs(value: unknown, toolName?: string): unknown {\n const normalized = normalizeLikelyJsonStringValuesRecursive(value);\n return applyAiToolInputDefaultsByCommandName(toolName, normalized);\n}\n\nfunction normalizeLikelyJsonStringValuesRecursive(value: unknown): unknown {\n if (value === null || value === undefined) {\n return value;\n }\n\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (\n (trimmed.startsWith('{') && trimmed.endsWith('}')) ||\n (trimmed.startsWith('[') && trimmed.endsWith(']'))\n ) {\n try {\n const parsed: unknown = JSON.parse(trimmed);\n return normalizeLikelyJsonStringValuesRecursive(parsed);\n } catch {\n return value;\n }\n }\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => normalizeLikelyJsonStringValuesRecursive(item));\n }\n\n if (typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n out[key] = normalizeLikelyJsonStringValuesRecursive(obj[key]);\n }\n return out;\n }\n\n return value;\n}\n\nfunction applyAiToolInputDefaultsByCommandName(toolName: string | undefined, payload: unknown): unknown {\n if (toolName !== 'Entity:Create') {\n return payload;\n }\n return mergeEntityCreateAiToolDefaults(payload);\n}\n\n/** Applies `axpCreateEntityAiToolInputDefaults` so AI flows do not trigger post-create navigation. */\nfunction mergeEntityCreateAiToolDefaults(payload: unknown): unknown {\n if (payload == null || typeof payload !== 'object' || Array.isArray(payload)) {\n return payload;\n }\n const p = payload as Record<string, unknown>;\n const ctx = (p['__context__'] as Record<string, unknown> | undefined) ?? {};\n const opts = (ctx['options'] as Record<string, unknown> | undefined) ?? {};\n const proc = (opts['process'] as Record<string, unknown> | undefined) ?? {};\n const defProcess = axpCreateEntityAiToolInputDefaults.__context__.options.process;\n p['__context__'] = {\n ...ctx,\n options: {\n ...opts,\n process: {\n ...proc,\n ...defProcess,\n },\n },\n };\n return p;\n}\n\n//#endregion\n","//#region ---- Constants ----\n\n/** Prefix for supervisor-delegated specialist tools (`${AXPAI_SUPERVISOR_AGENT_TOOL_PREFIX}${agentId}`). */\nexport const AXPAI_SUPERVISOR_AGENT_TOOL_PREFIX = 'agent:' as const;\n\n/** Default cap for main assist / direct-agent chat tool rounds (one provider call per step). */\nexport const AXPAI_ENGINE_DEFAULT_MAX_STEPS = 16;\n\n/** Default cap for delegated specialist sub-runs when the agent row has no positive `maxSteps`. */\nexport const AXPAI_DELEGATED_AGENT_DEFAULT_MAX_STEPS = 8;\n\n/** System prompt for vision OCR / document text extraction. */\nexport const AXPAI_DOCUMENT_VISION_EXTRACTION_SYSTEM =\n 'You are a precise document-reading assistant. Extract readable plain text from the attached file. Preserve headings and lists where obvious. If the content is unreadable, return a short explanation. Output plain text only, no markdown code fences.';\n\n/** Default user line when the caller passes an empty instruction for vision extraction. */\nexport const AXPAI_DOCUMENT_VISION_DEFAULT_USER_INSTRUCTION =\n 'Extract all readable text from this document. Return plain text only.';\n\n//#endregion\n\n//#region ---- Core aliases ----\n\nexport type AXPAiChatTransport = 'openai' | 'gemini';\n\nexport type AXPAiPlanningMode = 'off' | 'once' | 'when-needed';\n\n//#endregion\n\n//#region ---- Platform runtime context ----\n\n/**\n * Snapshot of session / tenant / regional defaults injected into system prompts.\n * Built by {@link AXPAiPlatformRuntimeContextBuilder}.\n */\nexport interface AXPAiPlatformRuntimeContext {\n userId?: string;\n userDisplayName?: string;\n tenantId?: string;\n tenantTitle?: string;\n applicationId?: string;\n applicationTitle?: string;\n locale?: string;\n calendarSystem?: string;\n timeZone?: string;\n country?: string;\n currentInstant?: string;\n currentLocalDateTime?: string;\n notes?: string;\n}\n\n//#endregion\n\n//#region ---- Delegated agent parameter bindings (supervisor / assist) ----\n\n/** Who supplies a delegated `agent:<id>` tool argument at runtime. */\nexport type AXPAiDelegatedParameterBinding = 'assist_locked' | 'assist_default' | 'supervisor';\n\n/**\n * Per-field policy for arguments the supervisor passes when calling a delegated specialist.\n * Names are the tool argument keys; the runtime builds supervisor JSON Schema from this list.\n */\nexport interface AXPAiDelegatedParameterDefinition {\n name: string;\n title?: string;\n description?: string;\n binding: AXPAiDelegatedParameterBinding;\n /** Used when assist row has no value for an `assist_default` key (optional fallback). */\n defaultValue?: unknown;\n /**\n * Optional UI grouping for property viewer / assist parameter editor (collapsible groups in one tab).\n */\n group?: {\n name: string;\n title: string;\n order?: number;\n };\n}\n\n//#endregion\n\n//#region ---- Catalog / entity row shapes (effective rows) ----\n\n/** Effective Assist entity row (chat policy, prompts, delegated routing). */\nexport interface AXPAiEffectiveAssistRow {\n id: string;\n name?: string;\n title?: string;\n description?: string;\n systemPrompt?: string;\n planningMode?: unknown;\n /** Official chat model (AiModel catalog id) for supervisor assist runs. */\n modelId?: string;\n /** Populated for list display when using lookup; mirrors AiModel `title` / `name`. */\n aiModel?: { id?: string; title?: string; name?: string };\n imageModelId?: string;\n initialMessages?: string | null;\n /**\n * Agents this assist may delegate to: each item has `type` = AiAgent catalog id\n * and `options` = values for `assist_locked` / `assist_default` (see agent {@link AXPAiEffectiveAgentRow.parameterDefinitions}).\n */\n delegatedAgents?: { type?: string; options?: Record<string, unknown> }[] | null;\n}\n\n/** Effective AiAgent catalog row (registry scope + optional supervisor JSON schema). */\nexport interface AXPAiEffectiveAgentRow {\n id: string;\n name?: string;\n title?: string;\n description?: string;\n systemPrompt?: string;\n modelEntityId?: string | null;\n toolIds?: unknown;\n queryIds?: unknown;\n maxSteps?: number;\n /** Defines keys, bindings, and drives supervisor JSON Schema (empty or omitted → default `query` only). */\n parameterDefinitions?: AXPAiDelegatedParameterDefinition[] | null;\n}\n\n//#endregion\n\n//#region ---- Model list (picker service) ----\n\nexport interface AXPAiChatModelListRequest {\n assistId?: string | null;\n directAgentId?: string | null;\n}\n\nexport interface AXPAiChatModelListItem {\n id: string;\n name: string;\n title: string;\n chatTransport?: string;\n maxContextTokens?: number;\n inputPricePerMillion?: number;\n outputPricePerMillion?: number;\n cachedInputPricePerMillion?: number;\n}\n\n//#endregion\n\n//#region ---- Chat transcript: responses & messages ----\n\nexport interface AXPAiChatTextResponse {\n type: 'text';\n content: string;\n}\n\nexport interface AXPAiChatImageResponse {\n type: 'image';\n content: {\n fileId: string;\n mimeType: string;\n name?: string;\n };\n}\n\n/** User message attachment or tool-produced audio segment (replay in chat UI). */\nexport interface AXPAiChatAudioResponse {\n type: 'audio';\n content: {\n fileId: string;\n mimeType: string;\n name?: string;\n };\n}\n\nexport interface AXPAiChatNodeResponse {\n type: 'node';\n content: unknown;\n}\n\n/** Assistant-side tool / agent invocation segment (replay + OpenAI `tool_calls`). */\nexport interface AXPAiChatToolInvocationContent {\n command: string;\n arguments: unknown;\n}\n\nexport interface AXPAiChatToolAssistantResponse {\n type: 'tool';\n content: AXPAiChatToolInvocationContent;\n callId?: string;\n}\n\nexport interface AXPAiChatAgentAssistantResponse {\n type: 'agent';\n content: AXPAiChatToolInvocationContent;\n callId?: string;\n}\n\nexport interface AXPAiChatToolResultResponse {\n type: 'tool_result';\n callId: string;\n content: unknown;\n}\n\nexport interface AXPAiDelegatedAgentResultPayload {\n success: boolean;\n error?: string;\n data?: {\n answer?: string;\n agentName?: string;\n agentId?: string;\n };\n}\n\nexport interface AXPAiChatAgentResultResponse {\n type: 'agent_result';\n callId: string;\n name?: string;\n content: AXPAiDelegatedAgentResultPayload;\n}\n\nexport type AXPAiChatResponse =\n | AXPAiChatTextResponse\n | AXPAiChatImageResponse\n | AXPAiChatAudioResponse\n | AXPAiChatNodeResponse\n | AXPAiChatToolAssistantResponse\n | AXPAiChatAgentAssistantResponse\n | AXPAiChatToolResultResponse\n | AXPAiChatAgentResultResponse;\n\n/**\n * One chat line in the persisted transcript (`user` / `assistant` / `system` / `tool`).\n * Optional {@link AXPAiChatMessage.delegatedReflection} marks ephemeral delegated sub-run reflections.\n */\nexport interface AXPAiChatMessage {\n role: 'system' | 'user' | 'assistant' | 'tool';\n responses: AXPAiChatResponse[];\n /** OpenAI `name` on tool results / some provider echoes. */\n name?: string;\n /** When true, excluded from delegated “answer” synthesis (see {@link axpAiChatMessageIsDelegatedReflectionExcluded}). */\n delegatedReflection?: boolean;\n}\n\n//#endregion\n\n//#region ---- Tool calls & schemas ----\n\nexport interface AXPAiToolCall {\n id: string;\n name: string;\n arguments: unknown;\n}\n\nexport interface AXPAiToolSchema {\n name: string;\n description?: string;\n parameters: Record<string, unknown>;\n}\n\n/** Registry allow-list on an assist or agent (command ids / query ids). */\nexport interface AXPAiEngineRegistryToolFields {\n toolIds?: unknown;\n queryIds?: unknown;\n}\n\n//#endregion\n\n//#region ---- Engine: last provider snapshot (mock / future real API) ----\n\n/**\n * Normalized payload from the last underlying LLM/vendor call during an engine run.\n * Detailed chat/extract/image request types live in connectivity mock (`ai-chat-provider.types`).\n */\nexport interface AXPAiEngineLastProviderPayload {\n messages: AXPAiChatMessage[];\n toolCalls?: AXPAiToolCall[];\n rawResponse?: unknown;\n}\n\n//#endregion\n\n//#region ---- Engine run: usage, options, results ----\n\nexport interface AXPAiEngineUsageTotals {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n cachedPromptTokens?: number;\n}\n\n/** Cached specialist transcript for a supervisor `agent:*` tool_call id (mock LRU / future server mirror). */\nexport interface AXPAiDelegatedAgentTranscriptEntry {\n agentName?: string;\n messages: AXPAiChatMessage[];\n}\n\nexport interface AXPAiDelegatedNestedToolCallContext {\n delegationCallId: string;\n agentId: string;\n agentName?: string;\n}\n\nexport interface AXPAiEngineRunOptions {\n messages: AXPAiChatMessage[];\n assistId?: string;\n /** Direct AiAgent thread (registry tools only); uses tenant default assist for model policy when assist id omitted. */\n directAgentId?: string;\n modelEntityId?: string;\n /** Legacy catalog `name` (API id) before entity ids were used. */\n modelId?: string;\n maxSteps?: number;\n maxTokens?: number;\n temperature?: number;\n /** Overrides assist-stored planning for this run (UI / tests). */\n planningMode?: AXPAiPlanningMode;\n platformRuntimeContext?: AXPAiPlatformRuntimeContext | null;\n onAssistantStreamReset?: () => void;\n onAssistantStreamDelta?: (delta: string) => void;\n onToolCallStart?: (call: AXPAiToolCall) => void;\n onToolCallEnd?: (call: AXPAiToolCall, resultMessage: AXPAiChatMessage) => void;\n onDelegatedAgentNestedToolCallStart?: (ctx: AXPAiDelegatedNestedToolCallContext, call: AXPAiToolCall) => void;\n onDelegatedAgentNestedToolCallEnd?: (\n ctx: AXPAiDelegatedNestedToolCallContext,\n call: AXPAiToolCall,\n resultMessage: AXPAiChatMessage,\n ) => void;\n onDelegatedAgentNestedStreamReset?: (ctx: AXPAiDelegatedNestedToolCallContext) => void;\n onDelegatedAgentNestedStreamDelta?: (ctx: AXPAiDelegatedNestedToolCallContext, delta: string) => void;\n onDelegatedAgentReflectionPhase?: (active: boolean) => void;\n}\n\nexport interface AXPAiEngineRunResult {\n messages: AXPAiChatMessage[];\n lastProviderResult?: AXPAiEngineLastProviderPayload;\n usageTotals?: AXPAiEngineUsageTotals;\n delegatedTranscriptsByCallId?: Record<string, AXPAiDelegatedAgentTranscriptEntry>;\n}\n\n//#endregion\n\n//#region ---- Structured text & media requests ----\n\nexport interface AXPAiStructuredTextCompletionOptions {\n assistId?: string;\n modelEntityId?: string;\n modelId?: string;\n messages: AXPAiChatMessage[];\n maxTokens?: number;\n temperature?: number;\n platformRuntimeContext?: AXPAiPlatformRuntimeContext | null;\n}\n\nexport interface AXPAiExtractDocumentTextFromStoredFileRequest {\n assistId: string;\n chatTransport: AXPAiChatTransport;\n fileId: string;\n instruction?: string;\n modelEntityId?: string;\n}\n\n//#endregion\n\n//#region ---- Loose tool/agent result bodies (persisted tool output JSON) ----\n\nexport type AXPAiChatToolResultBody = unknown;\n\nexport type AXPAiChatAgentResultBody = AXPAiDelegatedAgentResultPayload;\n\n//#endregion\n\n//#region ---- Transcript helpers ----\n\nexport function axpAiChatTextMessage(role: AXPAiChatMessage['role'], text: string): AXPAiChatMessage {\n return {\n role,\n responses: [{ type: 'text', content: text }],\n };\n}\n\nexport function axpAiChatUserMessage(responses: AXPAiChatResponse[]): AXPAiChatMessage {\n return {\n role: 'user',\n responses,\n };\n}\n\nexport function axpAiChatMessageGetText(message: AXPAiChatMessage): string {\n const parts: string[] = [];\n for (const r of message.responses) {\n if (r.type === 'text') {\n parts.push(r.content);\n } else if (r.type === 'node') {\n try {\n parts.push(JSON.stringify({ type: 'node', content: r.content }));\n } catch {\n parts.push('[node]');\n }\n }\n }\n return parts.join('\\n\\n');\n}\n\nexport function axpAiChatMessagesFromProviderAssistant(\n text: string,\n toolCalls?: AXPAiToolCall[],\n): AXPAiChatMessage[] {\n const trimmed = text.trim();\n const calls = toolCalls ?? [];\n const out: AXPAiChatMessage[] = [];\n if (trimmed.length > 0) {\n out.push(axpAiChatTextMessage('assistant', trimmed));\n }\n for (const tc of calls) {\n out.push({\n role: 'assistant',\n responses: [\n {\n type: 'tool',\n content: {\n command: tc.name,\n arguments: tc.arguments,\n },\n callId: tc.id,\n },\n ],\n });\n }\n if (out.length === 0) {\n out.push(axpAiChatTextMessage('assistant', ''));\n }\n return out;\n}\n\nexport function axpAiToolCallFromAssistantToolMessage(message: AXPAiChatMessage): AXPAiToolCall | null {\n if (message.role !== 'assistant') {\n return null;\n }\n for (const r of message.responses) {\n if (r.type === 'tool' || r.type === 'agent') {\n const callId = r.callId?.trim() ?? '';\n const command = r.content.command?.trim() ?? '';\n if (!command) {\n return null;\n }\n return {\n id: callId || `call_${command}`,\n name: command,\n arguments: r.content.arguments,\n };\n }\n }\n return null;\n}\n\nexport function axpAiChatToolResultMessage(callId: string, content: unknown, toolName?: string): AXPAiChatMessage {\n const id = callId.trim();\n return {\n role: 'tool',\n ...(toolName?.trim() ? { name: toolName.trim() } : {}),\n responses: [\n {\n type: 'tool_result',\n callId: id,\n content,\n },\n ],\n };\n}\n\nexport function axpAiChatAgentResultMessage(\n callId: string,\n content: AXPAiDelegatedAgentResultPayload,\n toolName?: string,\n): AXPAiChatMessage {\n const id = callId.trim();\n return {\n role: 'tool',\n ...(toolName?.trim() ? { name: toolName.trim() } : {}),\n responses: [\n {\n type: 'agent_result',\n callId: id,\n content,\n },\n ],\n };\n}\n\nexport function axpAiNormalizeHandlerResultToToolBody(handlerResult: unknown): unknown {\n if (handlerResult === undefined || handlerResult === null) {\n return { success: false, error: 'Tool returned no result.' };\n }\n if (typeof handlerResult === 'string') {\n const t = handlerResult.trim();\n if (!t) {\n return { success: false, error: 'Tool returned an empty string.' };\n }\n try {\n return JSON.parse(t) as unknown;\n } catch {\n return { success: true, data: handlerResult };\n }\n }\n if (typeof handlerResult === 'object' && !Array.isArray(handlerResult)) {\n return handlerResult;\n }\n return { success: true, data: handlerResult };\n}\n\nexport function axpAiChatToolOrAgentResultBodyJson(message: AXPAiChatMessage): string {\n const tr = message.responses.find((r) => r.type === 'tool_result' || r.type === 'agent_result');\n if (!tr || (tr.type !== 'tool_result' && tr.type !== 'agent_result')) {\n return '';\n }\n try {\n return JSON.stringify(tr.content);\n } catch {\n return String(tr.content);\n }\n}\n\n/**\n * Compact JSON string of a tool-role message’s `tool_result` body (transcript tail / logs).\n */\nexport function axpAiChatToolResultBodyJson(message: AXPAiChatMessage): string {\n return axpAiChatToolOrAgentResultBodyJson(message);\n}\n\n//#endregion\n\n//#region ---- Supervisor delegated-agent helpers ----\n\nexport function axpAiSupervisorAgentToolName(agentCatalogId: string): string {\n return `${AXPAI_SUPERVISOR_AGENT_TOOL_PREFIX}${agentCatalogId.trim()}`;\n}\n\nexport function axpAiParseSupervisorAgentToolName(toolName: string): string | null {\n const n = toolName.trim();\n if (!n.startsWith(AXPAI_SUPERVISOR_AGENT_TOOL_PREFIX)) {\n return null;\n }\n const id = n.slice(AXPAI_SUPERVISOR_AGENT_TOOL_PREFIX.length).trim();\n return id.length > 0 ? id : null;\n}\n\n//#endregion\n\n//#region ---- Assistant message transforms (delegated sub-run) ----\n\nexport function axpAiMergePlainAssistantTextTurn(messages: AXPAiChatMessage[]): AXPAiChatMessage[] {\n const chunks: string[] = [];\n for (const m of messages) {\n if (m.role !== 'assistant') {\n continue;\n }\n const onlyText = m.responses.length > 0 && m.responses.every((r) => r.type === 'text');\n if (!onlyText) {\n continue;\n }\n const t = axpAiChatMessageGetText(m).trim();\n if (t.length > 0) {\n chunks.push(t);\n }\n }\n const joined = chunks.join('\\n\\n').trim();\n if (!joined) {\n return [];\n }\n return [axpAiChatTextMessage('assistant', joined)];\n}\n\nexport function axpAiPruneAssistantPiecesToFirstToolOnly(messages: AXPAiChatMessage[]): AXPAiChatMessage[] {\n const out: AXPAiChatMessage[] = [];\n let keptTool = false;\n for (const m of messages) {\n if (m.role !== 'assistant') {\n out.push(m);\n continue;\n }\n const idx = m.responses.findIndex((r) => r.type === 'tool' || r.type === 'agent');\n if (idx < 0) {\n out.push(m);\n continue;\n }\n if (!keptTool) {\n out.push({\n ...m,\n responses: m.responses.slice(0, idx + 1),\n });\n keptTool = true;\n }\n }\n return out;\n}\n\nexport function axpAiChatDelegatedReflectionAssistantMessage(reflectionText: string): AXPAiChatMessage {\n return {\n role: 'assistant',\n delegatedReflection: true,\n responses: [{ type: 'text', content: reflectionText }],\n };\n}\n\nexport function axpAiChatMessageIsDelegatedReflectionExcluded(message: AXPAiChatMessage): boolean {\n return message.delegatedReflection === true;\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { axpAiChatTextMessage, type AXPAiChatMessage } from '../features/ai-engine.types';\n\n//#endregion\n\n/** Maximum length for assist initial transcript text after HTML strip (characters). */\nconst ASSIST_INITIAL_MESSAGES_MAX_LENGTH = 16_000;\n\n//#region ---- HTML / rich text to plain ----\n\n/**\n * Strips HTML tags and decodes a few common entities for safe plain-text transcript lines.\n * Used for Assist `initialMessages` (may be stored as rich text HTML).\n */\nexport function axpAiStripAssistInitialHtmlToPlain(raw: string): string {\n let s = raw\n .replace(/<\\/p>\\s*(?:<br\\s*\\/?>\\s*)*<p[^>]*>/gi, '\\n\\n')\n .replace(/<\\/p>\\s*<p[^>]*>/gi, '\\n\\n')\n .replace(/<br\\s*\\/?>/gi, '\\n');\n s = s.replace(/<\\/(div|h[1-6]|li|tr)>/gi, '\\n');\n s = s.replace(/<[^>]+>/g, '');\n s = s\n .replace(/ /gi, ' ')\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\");\n s = s.replace(/\\r\\n/g, '\\n').trim();\n if (s.length > ASSIST_INITIAL_MESSAGES_MAX_LENGTH) {\n s = s.slice(0, ASSIST_INITIAL_MESSAGES_MAX_LENGTH).trimEnd() + '…';\n }\n return s;\n}\n\n//#endregion\n\n//#region ---- Transcript messages ----\n\n/**\n * Converts assist `initialMessages` (HTML or plain) into one or more `assistant` transcript lines.\n * Non-empty paragraphs (split by blank lines) become separate messages; single block stays one message.\n */\nexport function axpAiAssistInitialMessagesToTranscript(\n raw: string | null | undefined,\n): AXPAiChatMessage[] {\n const trimmed = raw?.trim() ?? '';\n if (!trimmed) {\n return [];\n }\n const plain = axpAiStripAssistInitialHtmlToPlain(trimmed);\n if (!plain) {\n return [];\n }\n const blocks = plain\n .split(/\\n{2,}/)\n .map((b) => b.replace(/\\n+/g, ' ').trim())\n .filter((b) => b.length > 0);\n if (blocks.length === 0) {\n return [];\n }\n return blocks.map((text) => axpAiChatTextMessage('assistant', text));\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXPRegionalSetting, AXPSettingsService } from '@acorex/platform/common';\nimport { AXPPlatformScope } from '@acorex/platform/core';\nimport { AXPSessionService } from '@acorex/platform/auth';\nimport { Injectable, inject } from '@angular/core';\nimport type { AXPAiPlatformRuntimeContext } from './ai-engine.types';\n\n//#endregion\n\n//#region ---- Local time formatting ----\n\n/**\n * Formats {@link now} in {@link ianaTimeZone} for English system prompts; falls back to UTC on invalid zone.\n */\nfunction formatNowForRuntimeContext(now: Date, ianaTimeZone: string | undefined): string {\n const tz = ianaTimeZone?.trim() || 'UTC';\n try {\n return (\n now.toLocaleString('en-US', {\n timeZone: tz,\n dateStyle: 'full',\n timeStyle: 'long',\n }) + ` (${tz})`\n );\n } catch {\n return now.toISOString() + ' (UTC)';\n }\n}\n\n//#endregion\n\n//#region ---- Builder ----\n\n/**\n * Builds {@link AXPAiPlatformRuntimeContext} from session and user-scoped regional settings.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPAiPlatformRuntimeContextBuilder {\n //#region ---- Services & Dependencies ----\n\n private readonly session = inject(AXPSessionService);\n private readonly settings = inject(AXPSettingsService);\n private readonly translation = inject(AXTranslationService);\n\n //#endregion\n\n //#region ---- Public API ----\n\n /**\n * Resolves current user, tenant, application, UI language, and regional preferences from storage.\n */\n async build(): Promise<AXPAiPlatformRuntimeContext> {\n const user = this.session.user;\n const tenant = this.session.tenant;\n const application = this.session.application;\n const userScope = this.settings.scope(AXPPlatformScope.User);\n\n const [calendarRaw, tzRaw, countryRaw] = await Promise.all([\n userScope.get(AXPRegionalSetting.Calendar),\n userScope.get(AXPRegionalSetting.TimeZone),\n userScope.get(AXPRegionalSetting.Country),\n ]);\n\n const calendarSystem = typeof calendarRaw === 'string' && calendarRaw.trim() ? calendarRaw.trim() : undefined;\n const timeZone = typeof tzRaw === 'string' && tzRaw.trim() ? tzRaw.trim() : undefined;\n const country = typeof countryRaw === 'string' && countryRaw.trim() ? countryRaw.trim() : undefined;\n\n const locale = this.translation.getActiveLang();\n const now = new Date();\n\n return {\n userId: user?.id,\n userDisplayName: [user?.name?.trim(), user?.title?.trim()].find((s) => s && s.length > 0),\n tenantId: tenant?.id,\n tenantTitle: tenant?.title?.trim() || tenant?.name?.trim(),\n applicationId: application?.id,\n applicationTitle: application?.title?.trim() || application?.name?.trim(),\n locale,\n calendarSystem,\n timeZone,\n country,\n currentInstant: now.toISOString(),\n currentLocalDateTime: formatNowForRuntimeContext(now, timeZone),\n };\n }\n\n //#endregion\n}\n\n//#endregion\n","/**\n * Build-time only. Do not import from Angular modules.\n */\nimport { defineCommand } from '@acorex/platform/runtime/catalog-command-definition';\n\n/** Generates an image from a text prompt; default image model comes from the delegated specialist row (`delegatedAgents[].options.model`). */\nexport const AIMANAGEMENT_CHAT_GENERATE_IMAGE_COMMAND_KEY = 'AiManagement:ChatGenerateImage' as const;\n\nexport const aiManagementChatGenerateImageCommandDefinition = defineCommand({\n key: AIMANAGEMENT_CHAT_GENERATE_IMAGE_COMMAND_KEY,\n title: 'Generate image (chat)',\n description:\n 'Generates an image from a text description. Pass catalog image model id or rely on options.model for the image-generation delegated specialist on this assist; routing uses the model row (transport and provider).',\n executionMode: 'both',\n inputs: [\n {\n name: 'model',\n title: 'Model',\n description:\n 'Optional AiModel catalog row id (image purpose). When omitted, uses delegatedAgents[].options.model for the active delegated specialist (agentId in run context).',\n interface: { name: 'text-editor' },\n },\n {\n name: 'prompt',\n title: 'Prompt',\n description: 'Detailed description of the image to generate.',\n interface: { name: 'text-editor' },\n validations: [{ rule: 'required' }],\n },\n {\n name: 'size',\n title: 'Size',\n description: 'Optional size hint (e.g. 1024x1024). May be ignored.',\n interface: { name: 'text-editor' },\n },\n {\n name: 'style',\n title: 'Style',\n description: 'Optional style hint merged into the prompt by the backend.',\n interface: { name: 'text-editor' },\n },\n ],\n outputs: [\n {\n name: 'fileId',\n title: 'File id',\n description: 'Persisted file id when storage succeeds.',\n interface: { name: 'text-editor' },\n },\n {\n name: 'prompt',\n title: 'Prompt',\n description: 'Original prompt text.',\n interface: { name: 'text-editor' },\n },\n {\n name: 'imageUrl',\n title: 'Image URL',\n description: 'Short https or data URL fallback when persistence fails.',\n interface: { name: 'text-editor' },\n },\n ],\n outcomes: {\n mode: 'static',\n values: ['success'],\n },\n capabilities: ['ai'],\n ai: {\n tags: ['ai-tool', 'ai-chat', 'image'],\n },\n});\n","/**\n * Build-time only. Do not import from Angular modules.\n */\nimport { defineCommand } from '@acorex/platform/runtime/catalog-command-definition';\n\n/** Transcribes audio from a stored file; default speech model comes from the delegated specialist row (`delegatedAgents[].options.model`). */\nexport const AIMANAGEMENT_CHAT_TRANSCRIBE_SPEECH_COMMAND_KEY = 'AiManagement:ChatTranscribeSpeech' as const;\n\nexport const aiManagementChatTranscribeSpeechCommandDefinition = defineCommand({\n key: AIMANAGEMENT_CHAT_TRANSCRIBE_SPEECH_COMMAND_KEY,\n title: 'Transcribe speech (chat)',\n description:\n 'Transcribes audio from a platform file id. Pass catalog speech model id or rely on options.model for the speech-to-text delegated specialist on this assist; routing uses the model row (transport and provider).',\n executionMode: 'both',\n inputs: [\n {\n name: 'model',\n title: 'Model',\n description:\n 'Optional AiModel catalog row id (speech purpose). When omitted, uses delegatedAgents[].options.model for the active delegated specialist (agentId in run context).',\n interface: { name: 'text-editor' },\n },\n {\n name: 'fileId',\n title: 'File id',\n description: 'Platform file storage id for the audio attachment.',\n interface: { name: 'text-editor' },\n validations: [{ rule: 'required' }],\n },\n {\n name: 'language',\n title: 'Language',\n description: 'Optional BCP-47 language hint (e.g. en) when supported by the provider.',\n interface: { name: 'text-editor' },\n },\n ],\n outputs: [\n {\n name: 'text',\n title: 'Text',\n description: 'Transcribed plain text.',\n interface: { name: 'text-editor' },\n },\n ],\n outcomes: {\n mode: 'static',\n values: ['success'],\n },\n capabilities: ['ai'],\n ai: {\n tags: ['ai-tool', 'ai-chat', 'speech'],\n },\n});\n","/**\n * Build-time only. Do not import from Angular modules.\n */\nimport { defineCommand } from '@acorex/platform/runtime/catalog-command-definition';\n\n/** Synthesizes speech audio from text; default TTS model comes from the delegated specialist row (`delegatedAgents[].options.model`). */\nexport const AIMANAGEMENT_CHAT_SYNTHESIZE_SPEECH_COMMAND_KEY = 'AiManagement:ChatSynthesizeSpeech' as const;\n\nexport const aiManagementChatSynthesizeSpeechCommandDefinition = defineCommand({\n key: AIMANAGEMENT_CHAT_SYNTHESIZE_SPEECH_COMMAND_KEY,\n title: 'Synthesize speech (chat)',\n description:\n 'Converts text to spoken audio and stores it in platform file storage. Pass catalog TTS model id or rely on options.model for the text-to-speech delegated specialist on this assist; routing uses the model row (transport and provider).',\n executionMode: 'both',\n inputs: [\n {\n name: 'model',\n title: 'Model',\n description:\n 'Optional AiModel catalog row id (tts purpose). When omitted, uses delegatedAgents[].options.model for the active delegated specialist (agentId in run context).',\n interface: { name: 'text-editor' },\n },\n {\n name: 'text',\n title: 'Text',\n description: 'Plain text to speak (provider input length limits apply, e.g. OpenAI 4096 characters).',\n interface: { name: 'text-editor' },\n validations: [{ rule: 'required' }],\n },\n {\n name: 'voice',\n title: 'Voice',\n description:\n 'Optional OpenAI voice id: alloy, echo, fable, onyx, nova, shimmer. When omitted, uses delegatedAgents[].options.voice or alloy.',\n interface: { name: 'text-editor' },\n },\n {\n name: 'responseFormat',\n title: 'Response format',\n description: 'Optional audio format for OpenAI (mp3, opus, aac, flac, wav, pcm). Default mp3.',\n interface: { name: 'text-editor' },\n },\n ],\n outputs: [\n {\n name: 'fileId',\n title: 'File id',\n description: 'Persisted audio file id when storage succeeds.',\n interface: { name: 'text-editor' },\n },\n {\n name: 'text',\n title: 'Text',\n description: 'Source text that was synthesized.',\n interface: { name: 'text-editor' },\n },\n {\n name: 'mimeType',\n title: 'MIME type',\n description: 'Audio MIME type of the stored file.',\n interface: { name: 'text-editor' },\n },\n ],\n outcomes: {\n mode: 'static',\n values: ['success'],\n },\n capabilities: ['ai'],\n ai: {\n tags: ['ai-tool', 'ai-chat', 'tts'],\n },\n});\n","/**\n * Build-time only. Do not import from Angular modules.\n */\nimport { defineCommand } from '@acorex/platform/runtime/catalog-command-definition';\n\nexport const AIMANAGEMENT_EXTRACT_DOCUMENT_TEXT_COMMAND_KEY = 'AiManagement:ExtractDocumentText' as const;\n\nexport const aiManagementExtractDocumentTextCommandDefinition = defineCommand({\n key: AIMANAGEMENT_EXTRACT_DOCUMENT_TEXT_COMMAND_KEY,\n title: 'Extract text from document image',\n description:\n 'Transcribes visible text from an image stored in platform file storage (scans, photos of documents, forms, including medical paperwork). Uses the active chat model’s vision capability. Output is informational transcription only—not clinical interpretation.',\n executionMode: 'both',\n inputs: [\n {\n name: 'fileId',\n title: 'File id',\n description:\n 'Platform file storage id for the image (same as chat image attachments). Supported formats follow the active vision model (e.g. PNG, JPEG, WEBP).',\n interface: { name: 'text-editor' },\n validations: [{ rule: 'required' }],\n },\n {\n name: 'instruction',\n title: 'Instruction',\n description:\n 'Optional extra instructions (e.g. language, focus on lab values only, preserve table layout).',\n interface: { name: 'text-editor' },\n },\n ],\n outputs: [\n {\n name: 'text',\n title: 'Extracted text',\n description: 'Transcribed text with structure preserved where possible.',\n interface: { name: 'text-editor' },\n },\n ],\n outcomes: {\n mode: 'static',\n values: ['success'],\n },\n capabilities: ['ai'],\n ai: {\n shortDescription:\n 'OCR-style transcription from an image file id using the chat vision model; preserves layout; no medical diagnosis.',\n tags: ['ai-tool', 'ai-chat', 'ocr', 'vision', 'document', 'multimodal'],\n },\n});\n","/**\n * Build-time only. Do not import from Angular modules.\n */\nimport { defineCommand } from '@acorex/platform/runtime/catalog-command-definition';\n\nexport const AIMANAGEMENT_STRUCTURED_TEXT_COMPLETION_COMMAND_KEY =\n 'AiManagement:StructuredTextCompletion' as const;\n\nexport const aiManagementStructuredTextCompletionCommandDefinition = defineCommand({\n key: AIMANAGEMENT_STRUCTURED_TEXT_COMPLETION_COMMAND_KEY,\n title: 'Structured text completion',\n description:\n 'Single-turn chat completion without tools (e.g. map OCR text to JSON). Uses the resolved assist model.',\n executionMode: 'both',\n inputs: [],\n outputs: [\n {\n name: 'text',\n title: 'Assistant text',\n description: 'Plain text from the model.',\n interface: { name: 'large-text-editor' },\n },\n ],\n outcomes: {\n mode: 'static',\n values: ['success'],\n },\n capabilities: ['ai'],\n ai: {\n shortDescription: 'Tool-free structured completion for metadata mapping and similar tasks.',\n tags: ['ai-tool', 'ai-chat', 'completion'],\n },\n});\n","//#region ---- AI chat registry command keys (re-exports) ----\n\nexport { AIMANAGEMENT_CHAT_GENERATE_IMAGE_COMMAND_KEY } from './chat-generate-image.command.definition';\nexport { AIMANAGEMENT_CHAT_TRANSCRIBE_SPEECH_COMMAND_KEY } from './chat-transcribe-speech.command.definition';\nexport { AIMANAGEMENT_CHAT_SYNTHESIZE_SPEECH_COMMAND_KEY } from './chat-synthesize-speech.command.definition';\nexport { AIMANAGEMENT_EXTRACT_DOCUMENT_TEXT_COMMAND_KEY } from './extract-document-text.command.definition';\nexport { AIMANAGEMENT_STRUCTURED_TEXT_COMPLETION_COMMAND_KEY } from './structured-text-completion.command.definition';\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { Injectable, signal } from '@angular/core';\nimport type { AXPAiChatTransport } from '../features/ai-engine.types';\n\n//#endregion\n\n//#region ---- Run context ----\n\nexport interface AXPAiChatToolRunContext {\n assistId: string;\n chatTransport: AXPAiChatTransport;\n /** AiModel catalog row id for the active chat model (when resolved). */\n modelEntityId?: string;\n /** Set during a delegated agent sub-run (specialist executing registry tools). */\n agentId?: string;\n agentName?: string;\n}\n\n/**\n * Per chat run: stores which assist and chat transport are active.\n * Injected commands (e.g. image generation) read this instead of receiving assist/transport inside tool args.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPAiChatToolRunContextService {\n private readonly runContext = signal<AXPAiChatToolRunContext | null>(null);\n\n setContext(ctx: AXPAiChatToolRunContext | null): void {\n this.runContext.set(ctx);\n }\n\n getContext(): AXPAiChatToolRunContext | null {\n return this.runContext();\n }\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AIMANAGEMENT_CHAT_GENERATE_IMAGE_COMMAND_KEY } from './chat-generate-image.command.definition';\nimport { AIMANAGEMENT_CHAT_SYNTHESIZE_SPEECH_COMMAND_KEY } from './chat-synthesize-speech.command.definition';\nimport { AIMANAGEMENT_CHAT_TRANSCRIBE_SPEECH_COMMAND_KEY } from './chat-transcribe-speech.command.definition';\n\n//#endregion\n\n//#region ---- LLM JSON Schema overrides ----\n\n/**\n * Registry rows map inputs to string-typed JSON schemas. Override parameters for AI chat tools\n * so models receive accurate types (arrays, booleans, nested objects).\n */\nexport function getAiChatCommandLlmParametersOverride(\n commandName: string,\n): Record<string, unknown> | null {\n switch (commandName) {\n case AIMANAGEMENT_CHAT_GENERATE_IMAGE_COMMAND_KEY:\n return {\n type: 'object',\n properties: {\n model: {\n type: 'string',\n description:\n 'Optional catalog AiModel row id for image generation. Omit to use options.model on the image delegated specialist row.',\n },\n prompt: {\n type: 'string',\n description: 'Detailed text description of the image to generate.',\n },\n size: {\n type: 'string',\n description: 'Optional size hint for backends that support it (e.g. 1024x1024). May be ignored.',\n },\n style: {\n type: 'string',\n description:\n 'Optional style hint (e.g. photorealistic, flat vector). May be merged into the prompt by the backend.',\n },\n },\n required: ['prompt'],\n };\n case AIMANAGEMENT_CHAT_TRANSCRIBE_SPEECH_COMMAND_KEY:\n return {\n type: 'object',\n properties: {\n model: {\n type: 'string',\n description:\n 'Optional catalog AiModel row id for speech-to-text. Omit to use options.model on the speech delegated specialist row.',\n },\n fileId: {\n type: 'string',\n description: 'Platform file storage id for the audio file to transcribe.',\n },\n language: {\n type: 'string',\n description: 'Optional language hint (e.g. en) when supported by the provider.',\n },\n },\n required: ['fileId'],\n };\n case AIMANAGEMENT_CHAT_SYNTHESIZE_SPEECH_COMMAND_KEY:\n return {\n type: 'object',\n properties: {\n model: {\n type: 'string',\n description:\n 'Optional catalog AiModel row id for text-to-speech (purpose tts). Omit to use options.model on the TTS delegated specialist row.',\n },\n text: {\n type: 'string',\n description: 'Plain text to convert to speech.',\n },\n voice: {\n type: 'string',\n description:\n 'Optional OpenAI voice (alloy, echo, fable, onyx, nova, shimmer). Omit to use options.voice or alloy.',\n },\n responseFormat: {\n type: 'string',\n description: 'Optional audio format: mp3, opus, aac, flac, wav, pcm. Default mp3.',\n },\n },\n required: ['text'],\n };\n default:\n return null;\n }\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { RootConfig } from '../../const';\nimport {\n type AXPFileStorageService,\n AXPFileStorageStatus,\n} from '@acorex/platform/common';\n\n//#endregion\n\n//#region ---- Constants ----\n\n/** Max length for relaying an https image URL in tool_result when persistence fails (CORS, etc.). */\nexport const AI_GENERATED_IMAGE_MAX_REMOTE_URL_IN_TOOL = 2048;\n\n/** refType for files created from in-chat image tool output. */\nexport const AI_CHAT_GENERATED_IMAGE_REF_TYPE = `${RootConfig.module.name}.AiChatGeneratedImage`;\n\n/** refType for files created from in-chat text-to-speech tool output. */\nexport const AI_CHAT_GENERATED_SPEECH_REF_TYPE = `${RootConfig.module.name}.AiChatGeneratedSpeech`;\n\n/** refType for user-attached images in AI chat; {@link persistAiChatAttachmentImage} uses a batch ref id. */\nexport const AI_CHAT_ATTACHMENT_REF_TYPE = `${RootConfig.module.name}.AiChatAttachment`;\n\n/** File storage category for user chat image attachments. */\nexport const AI_CHAT_ATTACHMENT_CATEGORY = 'ai-chat-attachment';\n\n//#endregion\n\n//#region ---- URL / File conversion ----\n\n/**\n * Builds a File from a vendor image URL (https) or data URL (base64 image).\n */\nexport async function blobOrFileFromImageResult(\n imageUrl: string,\n defaultName = 'ai-generated.png',\n): Promise<File> {\n const trimmed = imageUrl.trim();\n if (!trimmed) {\n throw new Error('Image URL is empty.');\n }\n\n if (trimmed.startsWith('data:')) {\n const res = await fetch(trimmed);\n if (!res.ok) {\n throw new Error(`Failed to read data URL (${res.status}).`);\n }\n const blob = await res.blob();\n const mime = blob.type || parseDataUrlMime(trimmed) || 'image/png';\n return new File([blob], defaultName, { type: mime });\n }\n\n if (trimmed.startsWith('https://') || trimmed.startsWith('http://')) {\n const res = await fetch(trimmed);\n if (!res.ok) {\n throw new Error(`Failed to fetch image (${res.status}).`);\n }\n const blob = await res.blob();\n const mime =\n blob.type ||\n res.headers.get('Content-Type')?.split(';')[0]?.trim() ||\n 'image/png';\n const ext = mime.includes('jpeg') || mime.includes('jpg') ? 'jpg' : mime.includes('webp') ? 'webp' : 'png';\n return new File([blob], defaultName.replace(/\\.[^.]+$/, '') + '.' + ext, { type: mime });\n }\n\n throw new Error('Unsupported image URL scheme (expected https: or data:).');\n}\n\nfunction parseDataUrlMime(dataUrl: string): string | undefined {\n const m = /^data:([^;,]+)[;,]/.exec(dataUrl);\n return m?.[1]?.trim();\n}\n\n//#endregion\n\n//#region ---- Persistence ----\n\n/**\n * Saves the file and commits it so it appears in storage queries as committed.\n */\nexport async function persistAiGeneratedImage(\n fileStorage: AXPFileStorageService,\n file: File,\n ref: { refId: string; refType: string },\n): Promise<{ fileId: string }> {\n const info = await fileStorage.save({\n file,\n name: file.name,\n refId: ref.refId,\n refType: ref.refType,\n category: 'ai-generated-image',\n status: AXPFileStorageStatus.Temporary,\n });\n const fileId = info.fileId?.trim();\n if (!fileId) {\n throw new Error('File storage did not return a fileId.');\n }\n await fileStorage.commit(fileId);\n return { fileId };\n}\n\n/**\n * Persists a user-selected chat image; refId groups files uploaded in the same composer batch.\n */\nexport async function persistAiChatAttachmentImage(\n fileStorage: AXPFileStorageService,\n file: File,\n refId: string,\n): Promise<{ fileId: string }> {\n const trimmed = refId.trim();\n if (!trimmed) {\n throw new Error('refId is required for chat attachment persistence.');\n }\n const info = await fileStorage.save({\n file,\n name: file.name,\n refId: trimmed,\n refType: AI_CHAT_ATTACHMENT_REF_TYPE,\n category: AI_CHAT_ATTACHMENT_CATEGORY,\n status: AXPFileStorageStatus.Temporary,\n });\n const fileId = info.fileId?.trim();\n if (!fileId) {\n throw new Error('File storage did not return a fileId.');\n }\n await fileStorage.commit(fileId);\n return { fileId };\n}\n\n/**\n * Saves synthesized speech bytes and commits so the file id can be replayed in chat.\n */\nexport async function persistAiGeneratedSpeech(\n fileStorage: AXPFileStorageService,\n file: File,\n ref: { refId: string; refType: string },\n): Promise<{ fileId: string }> {\n const info = await fileStorage.save({\n file,\n name: file.name,\n refId: ref.refId,\n refType: ref.refType,\n category: 'ai-generated-speech',\n status: AXPFileStorageStatus.Temporary,\n });\n const fileId = info.fileId?.trim();\n if (!fileId) {\n throw new Error('File storage did not return a fileId.');\n }\n await fileStorage.commit(fileId);\n return { fileId };\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { Injectable, inject } from '@angular/core';\nimport { AXPEntityService } from '@acorex/platform/layout/entity';\nimport { RootConfig } from '../const';\nimport { isChatPurposeModelRow } from '../datasources/ai-model-catalog.datasource';\nimport type {\n AXPAiChatModelListItem,\n AXPAiChatModelListRequest,\n} from './ai-engine.types';\n\n//#endregion\n\n//#region ---- Row types (entity query) ----\n\ninterface CatalogModelRow {\n id: string;\n name?: string;\n title?: string;\n chatTransport?: string;\n openAiEndpointId?: string;\n maxContextTokens?: number;\n inputPricePerMillion?: number;\n outputPricePerMillion?: number;\n cachedInputPricePerMillion?: number;\n isDisabled?: boolean;\n openAiEndpointIsDisabled?: boolean;\n}\n\ninterface CatalogOpenAiEndpointRow {\n id: string;\n isDisabled?: boolean;\n}\n\n//#endregion\n\n/**\n * Lists chat-purpose AI models (catalog), without using {@link AXPAiEngine}.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPAiAssistChatModelCatalogService {\n //#region ---- Services & Dependencies ----\n\n private readonly entityService = inject(AXPEntityService);\n\n private readonly modelData = this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.model.name)\n .data<string, CatalogModelRow, CatalogModelRow, CatalogModelRow, CatalogModelRow>();\n\n private readonly openAiEndpointData = this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.openAiEndpoint.name)\n .data<\n string,\n CatalogOpenAiEndpointRow,\n CatalogOpenAiEndpointRow,\n CatalogOpenAiEndpointRow,\n CatalogOpenAiEndpointRow\n >();\n\n //#endregion\n\n //#region ---- Public API ----\n\n /**\n * All active chat-purpose models in the catalog (assist / agent policy is applied at engine runtime).\n */\n async listModels(_request?: AXPAiChatModelListRequest): Promise<AXPAiChatModelListItem[]> {\n const queryResult = await this.modelData.query({\n skip: 0,\n take: 500,\n });\n const items = (queryResult?.items ?? []) as CatalogModelRow[];\n let rows = items.filter((x) => isChatPurposeModelRow(x as unknown as Record<string, unknown>));\n\n rows = await this.filterModelsActiveForChat(rows);\n\n return rows.map((x) => ({\n id: x.id,\n name: x.name?.trim() ?? '',\n title: x.title?.trim() ?? x.name?.trim() ?? x.id,\n chatTransport: x.chatTransport,\n maxContextTokens:\n typeof x.maxContextTokens === 'number' && x.maxContextTokens > 0\n ? x.maxContextTokens\n : undefined,\n inputPricePerMillion:\n typeof x.inputPricePerMillion === 'number' && x.inputPricePerMillion > 0\n ? x.inputPricePerMillion\n : undefined,\n outputPricePerMillion:\n typeof x.outputPricePerMillion === 'number' && x.outputPricePerMillion > 0\n ? x.outputPricePerMillion\n : undefined,\n cachedInputPricePerMillion:\n typeof x.cachedInputPricePerMillion === 'number' && x.cachedInputPricePerMillion > 0\n ? x.cachedInputPricePerMillion\n : undefined,\n }));\n }\n\n //#endregion\n\n //#region ---- Model filtering ----\n\n /**\n * Chat pickers only use models that are enabled and backed by an enabled OpenAI endpoint when applicable.\n */\n private async filterModelsActiveForChat(rows: CatalogModelRow[]): Promise<CatalogModelRow[]> {\n const endpointIds = [\n ...new Set(\n rows\n .filter((r) => String(r.chatTransport ?? '').toLowerCase() === 'openai' && r.openAiEndpointId?.trim())\n .map((r) => r.openAiEndpointId!.trim()),\n ),\n ];\n const endpointDisabled = new Map<string, boolean>();\n for (const id of endpointIds) {\n const ep = await this.openAiEndpointData.byKey(id);\n endpointDisabled.set(id, ep?.isDisabled === true);\n }\n\n return rows.filter((x) => {\n if (x.isDisabled === true) {\n return false;\n }\n if (x.openAiEndpointIsDisabled === true) {\n return false;\n }\n const transport = String(x.chatTransport ?? '').toLowerCase();\n if (transport === 'openai' && x.openAiEndpointId?.trim()) {\n if (endpointDisabled.get(x.openAiEndpointId.trim()) === true) {\n return false;\n }\n }\n return true;\n });\n }\n\n //#endregion\n}\n","//#region ---- Imports ----\n\nimport { Injectable } from '@angular/core';\nimport type { AXPAiEngineRunOptions, AXPAiEngineRunResult } from './ai-engine.types';\n\n//#endregion\n\n//#region ---- Engine (abstract service) ----\n\n/**\n * Backend boundary for AI assist runs (chat + tool rounds). Connectivity implementations execute registry\n * commands/queries during the run loop.\n * Wire a concrete implementation via Angular providers (for example `provide: AXPAiEngine` with `useClass`).\n */\n@Injectable()\nexport abstract class AXPAiEngine {\n /**\n * Sends the conversation to the AI backend and returns updated messages (including tool rounds).\n */\n abstract run(options: AXPAiEngineRunOptions): Promise<AXPAiEngineRunResult>;\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPSettingsService } from '@acorex/platform/common';\nimport { Injectable, inject } from '@angular/core';\nimport { AXPEntityService } from '@acorex/platform/layout/entity';\nimport { RootConfig } from '../const';\nimport { AXPAiManagementSettings } from '../settings.keys';\nimport { AXPAiEngine } from './ai-engine';\nimport type { AXPAiEngineRunOptions, AXPAiEngineRunResult, AXPAiEffectiveAssistRow } from './ai-engine.types';\n\n//#endregion\n\n//#region ---- Row types (UI / queries) ----\n\nexport interface AXPAiAssistPickerRow {\n id: string;\n name?: string;\n title: string;\n}\n\ntype AXMAiAssistRow = AXPAiEffectiveAssistRow;\ntype AXMAiAssistPickerRow = AXPAiAssistPickerRow;\n\n//#endregion\n\n/**\n * Frontend facade for AI chat UX: assist listing, tenant default selection, and chat runs.\n * Delegates {@link AXPAiEngine.run} to connectivity implementations.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPAiManagerService {\n //#region ---- Services & Dependencies ----\n\n private readonly aiEngine = inject(AXPAiEngine);\n private readonly entityService = inject(AXPEntityService);\n private readonly settings = inject(AXPSettingsService);\n\n private readonly assistData = this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.assist.name)\n .data<string, AXMAiAssistRow, AXMAiAssistRow, AXMAiAssistRow, AXMAiAssistRow>();\n\n private readonly assistListData = this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.assist.name)\n .data<string, AXMAiAssistPickerRow, AXMAiAssistPickerRow, AXMAiAssistPickerRow, AXMAiAssistPickerRow>();\n\n private readonly agentListData = this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.agent.name)\n .data<string, AXMAiAssistPickerRow, AXMAiAssistPickerRow, AXMAiAssistPickerRow, AXMAiAssistPickerRow>();\n\n //#endregion\n\n //#region ---- Assist catalog (frontend) ----\n\n /**\n * Loads assist rows for UI pickers (e.g. header menu).\n */\n async listAssistPickerRows(): Promise<AXPAiAssistPickerRow[]> {\n try {\n const result = await this.assistListData.query({\n skip: 0,\n take: 500,\n sort: [{ field: 'title', dir: 'asc' }],\n });\n const items = (result?.items ?? []) as AXMAiAssistPickerRow[];\n return items.filter((r) => r.id?.length);\n } catch {\n return [];\n }\n }\n\n /**\n * Loads AiAgent catalog rows for direct specialist chat (header picker).\n */\n async listAgentPickerRows(): Promise<AXPAiAssistPickerRow[]> {\n try {\n const result = await this.agentListData.query({\n skip: 0,\n take: 500,\n sort: [{ field: 'title', dir: 'asc' }],\n });\n const items = (result?.items ?? []) as AXMAiAssistPickerRow[];\n return items.filter((r) => r.id?.length);\n } catch {\n return [];\n }\n }\n\n /**\n * Loads the effective assist from `DefaultAssistId` (tenant setting), or the assist named `platform-default`.\n */\n async getEffectiveAssist(): Promise<AXPAiEffectiveAssistRow> {\n const raw = await this.settings.get<unknown>(AXPAiManagementSettings.DefaultAssistId);\n const assistId =\n typeof raw === 'string'\n ? raw.trim()\n : (raw as { value?: string })?.value != null\n ? String((raw as { value?: string }).value).trim()\n : '';\n\n if (assistId) {\n const byId = await this.assistData.byKey(assistId);\n if (byId) {\n return byId;\n }\n throw new Error(\n `AI assist with id \"${assistId}\" was not found. Open AI Management → AI Settings and pick a valid default assist.`,\n );\n }\n\n const queryResult = await this.assistData.query({\n skip: 0,\n take: 1,\n filter: {\n field: 'name',\n operator: { type: 'equal' },\n value: 'platform-default',\n },\n });\n\n const items = (queryResult?.items ?? []) as AXPAiEffectiveAssistRow[];\n const record = items[0];\n\n if (!record) {\n throw new Error(\n 'No default assist is configured. Create an assist named \"platform-default\" or select one under AI Settings.',\n );\n }\n\n return record;\n }\n\n /**\n * Resolves the assist row for chat: explicit primary key, otherwise the effective default from settings.\n */\n async getAssistForChat(assistId?: string | null): Promise<AXPAiEffectiveAssistRow> {\n const id = assistId?.trim();\n if (id) {\n const row = await this.assistData.byKey(id);\n if (!row) {\n throw new Error(\n `Assist \"${id}\" was not found. Open AI Management → Assists or clear the assist id in the chat URL.`,\n );\n }\n return row;\n }\n return this.getEffectiveAssist();\n }\n\n //#endregion\n\n //#region ---- Engine delegation ----\n\n run(options: AXPAiEngineRunOptions): Promise<AXPAiEngineRunResult> {\n return this.aiEngine.run(options);\n }\n\n //#endregion\n}\n","//#region ---- Utility Methods ----\n\nexport interface AssistantParsedContent {\n thinking: string | null;\n body: string;\n}\n\n/**\n * If some layers store escaped brackets, normalize so the main regex can match.\n */\nfunction normalizeRedactedTags(raw: string): string {\n return raw.replace(/<(\\/?redacted_thinking)>/gi, '<$1>');\n}\n\n/**\n * Pulls model thinking out of `<redacted_thinking>…</redacted_thinking>`; rest of the string is `body`.\n */\nexport function parseAssistantContentForDisplay(content: unknown): AssistantParsedContent {\n const raw = normalizeRedactedTags(\n typeof content === 'string' ? content : content == null ? '' : String(content),\n );\n\n if (!raw) {\n return { thinking: null, body: '' };\n }\n\n const thinkingParts: string[] = [];\n const re = /<redacted_thinking>([\\s\\S]*?)<\\/redacted_thinking>/gi;\n const body = raw\n .replace(re, (_match, inner: string) => {\n const t = inner.trim();\n if (t.length) {\n thinkingParts.push(t);\n }\n return '';\n })\n .trim();\n\n const thinking = thinkingParts.length ? thinkingParts.join('\\n\\n') : null;\n\n return { thinking, body };\n}\n\n/**\n * Visible reply only: same as `parseAssistantContentForDisplay(content).body`.\n */\nexport function stripAssistantThinkingForDisplay(content: unknown): string {\n return parseAssistantContentForDisplay(content).body;\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type { AXPAiChatMessage, AXPAiChatResponse, AXPAiToolCall } from '../ai-engine.types';\nimport {\n axpAiChatMessageGetText,\n axpAiChatToolOrAgentResultBodyJson,\n axpAiToolCallFromAssistantToolMessage,\n} from '../ai-engine.types';\n\n//#endregion\n\n//#region ---- Types ----\n\n/** One tool call matched with the tool-role message content that follows the assistant turn. */\nexport interface AXMAiChatToolCallPair {\n call: AXPAiToolCall;\n outputContent: string;\n}\n\n/** Assistant tool round: optional preamble text lines, then tool/result pairs, optional follow-up text. */\nexport interface AXMAiChatToolTurnItem {\n kind: 'tool-turn';\n /** Assistant `text` lines that preceded the first tool call in this round. */\n preambleMessages: AXPAiChatMessage[];\n pairs: AXMAiChatToolCallPair[];\n /** When the model called tools and then responded with text, the follow-up message is absorbed here. */\n followUpMessage?: AXPAiChatMessage;\n}\n\nexport interface AXMAiChatSimpleItem {\n kind: 'simple';\n message: AXPAiChatMessage;\n}\n\nexport type AXMAiChatDisplayItem = AXMAiChatToolTurnItem | AXMAiChatSimpleItem;\n\n//#endregion\n\n//#region ---- Build display items ----\n\nfunction isAssistantInvocationSegment(r: AXPAiChatResponse | undefined): boolean {\n return r?.type === 'tool' || r?.type === 'agent';\n}\n\n/**\n * Aligns assistant tool lines with tool results. The agent stores N consecutive `assistant` tool\n * rows then N consecutive `tool` tool_result rows (same order as execution), not interleaved.\n * Match output to each call by {@link AXPAiToolCall.id} / {@link AXPAiChatToolResultResponse.callId}.\n */\nfunction consumeAssistantToolPairs(\n messages: AXPAiChatMessage[],\n start: number,\n): { pairs: AXMAiChatToolCallPair[]; nextIndex: number } {\n const calls: AXPAiToolCall[] = [];\n let j = start;\n while (\n j < messages.length &&\n messages[j].role === 'assistant' &&\n isAssistantInvocationSegment(messages[j].responses[0])\n ) {\n const call = axpAiToolCallFromAssistantToolMessage(messages[j]);\n if (call) {\n calls.push(call);\n }\n j++;\n }\n\n const resultsByCallId = new Map<string, string>();\n while (\n j < messages.length &&\n messages[j].role === 'tool' &&\n messages[j].responses.some((r) => r.type === 'tool_result' || r.type === 'agent_result')\n ) {\n const tm = messages[j];\n const tr = tm.responses.find((r) => r.type === 'tool_result' || r.type === 'agent_result');\n const id = tr?.callId?.trim() ?? '';\n if (id) {\n resultsByCallId.set(id, axpAiChatToolOrAgentResultBodyJson(tm));\n }\n j++;\n }\n\n const pairs: AXMAiChatToolCallPair[] = calls.map((call) => ({\n call,\n outputContent: resultsByCallId.get(call.id) ?? '',\n }));\n\n return { pairs, nextIndex: j };\n}\n\nfunction tryConsumeAssistantTextFollowUp(\n messages: AXPAiChatMessage[],\n start: number,\n): { message: AXPAiChatMessage | undefined; nextIndex: number } {\n if (\n start < messages.length &&\n messages[start].role === 'assistant' &&\n messages[start].responses[0]?.type === 'text' &&\n axpAiChatMessageGetText(messages[start]).trim()\n ) {\n return { message: messages[start], nextIndex: start + 1 };\n }\n return { message: undefined, nextIndex: start };\n}\n\n/**\n * Groups assistant preamble text, tool/result pairs, and optional follow-up text into {@link AXMAiChatToolTurnItem}.\n */\nexport function axmBuildChatDisplayItems(messages: AXPAiChatMessage[]): AXMAiChatDisplayItem[] {\n const items: AXMAiChatDisplayItem[] = [];\n let i = 0;\n while (i < messages.length) {\n if (messages[i].role === 'assistant' && messages[i].responses[0]?.type === 'text') {\n const preambleMessages: AXPAiChatMessage[] = [];\n while (\n i < messages.length &&\n messages[i].role === 'assistant' &&\n messages[i].responses[0]?.type === 'text'\n ) {\n preambleMessages.push(messages[i]);\n i++;\n }\n if (\n i < messages.length &&\n messages[i].role === 'assistant' &&\n isAssistantInvocationSegment(messages[i].responses[0])\n ) {\n const { pairs, nextIndex } = consumeAssistantToolPairs(messages, i);\n const follow = tryConsumeAssistantTextFollowUp(messages, nextIndex);\n items.push({\n kind: 'tool-turn',\n preambleMessages,\n pairs,\n followUpMessage: follow.message,\n });\n i = follow.nextIndex;\n continue;\n }\n for (const pm of preambleMessages) {\n items.push({ kind: 'simple', message: pm });\n }\n continue;\n }\n if (messages[i].role === 'assistant' && isAssistantInvocationSegment(messages[i].responses[0])) {\n const { pairs, nextIndex } = consumeAssistantToolPairs(messages, i);\n const follow = tryConsumeAssistantTextFollowUp(messages, nextIndex);\n items.push({\n kind: 'tool-turn',\n preambleMessages: [],\n pairs,\n followUpMessage: follow.message,\n });\n i = follow.nextIndex;\n continue;\n }\n items.push({ kind: 'simple', message: messages[i] });\n i++;\n }\n return items;\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPFileStorageService } from '@acorex/platform/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n effect,\n inject,\n input,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\n\n//#endregion\n\n/**\n * Loads audio from {@link AXPFileStorageService} by fileId for chat TTS tool output preview.\n */\n@Component({\n selector: 'axm-ai-chat-tool-audio-preview',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n @if (audioSrc(); as src) {\n <audio\n class=\"ax-block ax-w-full ax-max-w-md\"\n controls\n preload=\"metadata\"\n [attr.aria-label]=\"ariaLabel() ?? titleText()\"\n >\n <source [src]=\"src\" [type]=\"mimeType()\" />\n </audio>\n } @else if (errorText(); as err) {\n <p class=\"ax-text-sm ax-text-danger ax-m-0\">{{ err }}</p>\n }\n `,\n})\nexport class AXMAiChatToolAudioPreviewComponent {\n //#region ---- Services & Dependencies ----\n\n private readonly fileStorage = inject(AXPFileStorageService);\n private readonly destroyRef = inject(DestroyRef);\n\n //#endregion\n\n //#region ---- Inputs ----\n\n readonly fileId = input<string>('');\n\n readonly mimeType = input<string>('audio/mpeg');\n\n /** Short caption (e.g. spoken text snippet). */\n readonly titleText = input<string>('Generated speech');\n\n readonly ariaLabel = input<string | undefined>(undefined);\n\n //#endregion\n\n //#region ---- State ----\n\n readonly audioSrc = signal<string | null>(null);\n\n readonly errorText = signal<string | null>(null);\n\n private objectUrlToRevoke: string | null = null;\n\n private loadGeneration = 0;\n\n //#endregion\n\n //#region ---- Lifecycle / effects ----\n\n constructor() {\n effect(() => {\n const id = this.fileId()?.trim() ?? '';\n const gen = ++this.loadGeneration;\n this.revokeObjectUrl();\n this.audioSrc.set(null);\n this.errorText.set(null);\n if (!id) {\n return;\n }\n\n void this.fileStorage\n .getInfo(id)\n .then((info) => {\n if (gen !== this.loadGeneration) {\n return;\n }\n const url = info.url?.trim();\n if (url) {\n this.audioSrc.set(url);\n return;\n }\n const bin = info.binary;\n if (bin instanceof Blob) {\n const ou = URL.createObjectURL(bin);\n this.objectUrlToRevoke = ou;\n this.audioSrc.set(ou);\n return;\n }\n this.errorText.set('Audio file could not be loaded.');\n })\n .catch(() => {\n if (gen !== this.loadGeneration) {\n return;\n }\n this.errorText.set('Audio file could not be loaded.');\n });\n });\n\n this.destroyRef.onDestroy(() => this.revokeObjectUrl());\n }\n\n //#endregion\n\n //#region ---- Utility Methods ----\n\n private revokeObjectUrl(): void {\n if (this.objectUrlToRevoke) {\n URL.revokeObjectURL(this.objectUrlToRevoke);\n this.objectUrlToRevoke = null;\n }\n }\n\n //#endregion\n}\n","//#region ---- Imports ----\n\nimport { AXPFileStorageService } from '@acorex/platform/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n effect,\n inject,\n input,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\n\n//#endregion\n\n/**\n * Loads an image from {@link AXPFileStorageService} by fileId for chat tool output preview.\n */\n@Component({\n selector: 'axm-ai-chat-tool-image-preview',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n @if (imageSrc(); as src) {\n <img\n [src]=\"src\"\n [alt]=\"altText()\"\n class=\"ax-block ax-max-w-full ax-h-auto ax-max-h-[min(70vh,32rem)]\"\n [attr.aria-label]=\"ariaLabel() ?? altText()\"\n />\n } @else if (errorText(); as err) {\n <p class=\"ax-text-sm ax-text-danger ax-m-0\">{{ err }}</p>\n }\n `,\n})\nexport class AXMAiChatToolImagePreviewComponent {\n //#region ---- Services & Dependencies ----\n\n private readonly fileStorage = inject(AXPFileStorageService);\n private readonly destroyRef = inject(DestroyRef);\n\n //#endregion\n\n //#region ---- Inputs ----\n\n readonly fileId = input<string>('');\n\n readonly altText = input<string>('Generated image');\n\n readonly ariaLabel = input<string | undefined>(undefined);\n\n //#endregion\n\n //#region ---- State ----\n\n readonly imageSrc = signal<string | null>(null);\n\n readonly errorText = signal<string | null>(null);\n\n private objectUrlToRevoke: string | null = null;\n\n private loadGeneration = 0;\n\n //#endregion\n\n //#region ---- Lifecycle / effects ----\n\n constructor() {\n effect(() => {\n const id = this.fileId()?.trim() ?? '';\n const gen = ++this.loadGeneration;\n this.revokeObjectUrl();\n this.imageSrc.set(null);\n this.errorText.set(null);\n if (!id) {\n return;\n }\n\n void this.fileStorage\n .getInfo(id)\n .then((info) => {\n if (gen !== this.loadGeneration) {\n return;\n }\n const url = info.url?.trim();\n if (url) {\n this.imageSrc.set(url);\n return;\n }\n const bin = info.binary;\n if (bin instanceof Blob) {\n const ou = URL.createObjectURL(bin);\n this.objectUrlToRevoke = ou;\n this.imageSrc.set(ou);\n return;\n }\n this.errorText.set('Image file could not be loaded.');\n })\n .catch(() => {\n if (gen !== this.loadGeneration) {\n return;\n }\n this.errorText.set('Image file could not be loaded.');\n });\n });\n\n this.destroyRef.onDestroy(() => this.revokeObjectUrl());\n }\n\n //#endregion\n\n //#region ---- Utility Methods ----\n\n private revokeObjectUrl(): void {\n if (this.objectUrlToRevoke) {\n URL.revokeObjectURL(this.objectUrlToRevoke);\n this.objectUrlToRevoke = null;\n }\n }\n\n //#endregion\n}\n","//#region ---- Imports ----\n\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { type AXPAiToolCall } from '../ai-engine.types';\nimport { normalizeAiToolCommandArgs } from '../../utils/ai-tool-command-args-normalize';\nimport { type AXPDialogRef, AXPLayoutBuilderService, type IFlexContainerBuilder } from '@acorex/platform/layout/builder';\nimport { AXPCommandService, AXPQueryService } from '@acorex/platform/runtime';\nimport { inject, Injectable } from '@angular/core';\n\n//#endregion\n\n//#region ---- Service ----\n\n/**\n * Opens the tool/query execute dialog (edit JSON / fields, run command or query) shared by\n * {@link AXMAiChatPageComponent} and {@link AXMAiDelegatedAgentTranscriptPopupComponent}.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXMAiChatToolExecuteService {\n //#region ---- Services & Dependencies ----\n\n private readonly layoutBuilder = inject(AXPLayoutBuilderService);\n private readonly commandService = inject(AXPCommandService);\n private readonly queryService = inject(AXPQueryService);\n private readonly translateService = inject(AXTranslationService);\n private readonly toastService = inject(AXToastService);\n\n //#endregion\n\n //#region ---- Public API ----\n\n /**\n * Opens a layout-builder dialog to edit tool arguments and runs the command or query.\n */\n async openToolExecuteDialog(call: AXPAiToolCall): Promise<void> {\n const form = this.prepareToolExecuteForm(call.arguments);\n const jsonFieldLabel = await this.translateService.translateAsync('@ai-management:chat.tool-execute-json-field');\n const titleBase = await this.translateService.translateAsync('@ai-management:chat.tool-execute-dialog-title');\n const dialogTitle = `${titleBase} — ${call.name}`;\n const submitLabel = await this.translateService.translateAsync('@ai-management:chat.tool-execute-submit');\n const cancelLabel = await this.translateService.translateAsync('@general:actions.cancel.title');\n\n await this.layoutBuilder\n .create()\n .dialog<boolean>((dialog) => {\n dialog\n .setTitle(dialogTitle)\n .setSize('md')\n .setCloseButton(true)\n .setContext(form.initial)\n .content((flex) => {\n flex.setDirection('column').setGap('10px');\n this.appendToolExecuteFormFields(flex, form.parsed, jsonFieldLabel, form.useRootJson);\n })\n .setActions((actions) => {\n actions.cancel(cancelLabel).submit(submitLabel);\n })\n .onAction(async (dialogRef: AXPDialogRef) => {\n const act = dialogRef.action();\n if (act === 'cancel') {\n return false;\n }\n let payload: unknown;\n try {\n payload = this.denormalizeToolExecutePayload(\n dialogRef.context() as Record<string, unknown>,\n form.jsonStringKeys,\n form.useRootJson,\n call.name,\n );\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n await this.toastService.show({\n color: 'danger',\n title: await this.translateService.translateAsync('@general:messages.error.title'),\n content: msg,\n });\n throw e instanceof Error ? e : new Error(msg);\n }\n await this.dispatchToolExecute(call.name, payload);\n return true;\n });\n })\n .show();\n }\n\n //#endregion\n\n //#region ---- Form & dispatch (private) ----\n\n private prepareToolExecuteForm(args: unknown): {\n parsed: Record<string, unknown>;\n initial: Record<string, unknown>;\n jsonStringKeys: string[];\n useRootJson: boolean;\n } {\n const emptyRoot = (): {\n parsed: Record<string, unknown>;\n initial: Record<string, unknown>;\n jsonStringKeys: string[];\n useRootJson: boolean;\n } => ({\n parsed: {},\n initial: { __rootJson: '{}' },\n jsonStringKeys: ['__rootJson'],\n useRootJson: true,\n });\n\n if (args === null || args === undefined) {\n return emptyRoot();\n }\n if (typeof args === 'string') {\n const trimmed = args.trim();\n if (!trimmed) {\n return emptyRoot();\n }\n try {\n return this.prepareToolExecuteForm(JSON.parse(trimmed) as unknown);\n } catch {\n return {\n parsed: { _raw: trimmed },\n initial: { _raw: trimmed },\n jsonStringKeys: [],\n useRootJson: false,\n };\n }\n }\n if (Array.isArray(args)) {\n return {\n parsed: {},\n initial: { __rootJson: JSON.stringify(args, null, 2) },\n jsonStringKeys: ['__rootJson'],\n useRootJson: true,\n };\n }\n if (typeof args === 'object') {\n const parsed = { ...(args as Record<string, unknown>) };\n const keys = Object.keys(parsed);\n if (keys.length === 0) {\n return emptyRoot();\n }\n const initial: Record<string, unknown> = {};\n const jsonStringKeys: string[] = [];\n for (const key of keys) {\n const val = parsed[key];\n if (val === null || val === undefined) {\n initial[key] = '';\n } else if (typeof val === 'boolean' || typeof val === 'number') {\n initial[key] = val;\n } else if (typeof val === 'string') {\n const trimmed = val.trim();\n if (\n (trimmed.startsWith('{') && trimmed.endsWith('}')) ||\n (trimmed.startsWith('[') && trimmed.endsWith(']'))\n ) {\n try {\n JSON.parse(trimmed);\n initial[key] = val;\n jsonStringKeys.push(key);\n } catch {\n initial[key] = val;\n }\n } else {\n initial[key] = val;\n }\n } else {\n initial[key] = JSON.stringify(val, null, 2);\n jsonStringKeys.push(key);\n }\n }\n return { parsed, initial, jsonStringKeys, useRootJson: false };\n }\n return {\n parsed: { _raw: args },\n initial: { _raw: String(args) },\n jsonStringKeys: [],\n useRootJson: false,\n };\n }\n\n private appendToolExecuteFormFields(\n flex: IFlexContainerBuilder,\n parsed: Record<string, unknown>,\n jsonFieldLabel: string,\n useRootJson: boolean,\n ): void {\n if (useRootJson) {\n flex.formField(jsonFieldLabel, (field) => {\n field.path('__rootJson');\n field.largeTextBox({ rows: 10, placeholder: '{}' });\n });\n return;\n }\n const keys = Object.keys(parsed);\n for (const key of keys) {\n const val = parsed[key];\n flex.formField(key, (field) => {\n field.path(key);\n if (val === null || val === undefined) {\n field.textBox({});\n } else if (typeof val === 'boolean') {\n field.toggleSwitch({});\n } else if (typeof val === 'number') {\n field.numberBox({});\n } else if (typeof val === 'string') {\n field.textBox({});\n } else {\n field.largeTextBox({ rows: 6 });\n }\n });\n }\n }\n\n private denormalizeToolExecutePayload(\n context: Record<string, unknown>,\n jsonStringKeys: string[],\n useRootJson: boolean,\n toolName: string,\n ): unknown {\n if (useRootJson) {\n const raw = String(context['__rootJson'] ?? '{}');\n return normalizeAiToolCommandArgs(JSON.parse(raw) as unknown, toolName);\n }\n const out: Record<string, unknown> = { ...context };\n for (const k of jsonStringKeys) {\n const raw = out[k];\n if (typeof raw === 'string') {\n try {\n out[k] = JSON.parse(raw) as unknown;\n } catch {\n /* keep string */\n }\n }\n }\n return normalizeAiToolCommandArgs(out, toolName);\n }\n\n private async dispatchToolExecute(toolName: string, payload: unknown): Promise<void> {\n const successTitle = await this.translateService.translateAsync('@ai-management:chat.tool-execute-done');\n const errTitle = await this.translateService.translateAsync('@general:messages.error.title');\n const notRegistered = await this.translateService.translateAsync('@ai-management:chat.tool-execute-not-registered');\n\n if (this.commandService.exists(toolName)) {\n const result = await this.commandService.execute(toolName, payload);\n const ok = result?.success !== false;\n const content =\n result?.message?.text ??\n (result?.data !== undefined ? JSON.stringify(result.data, null, 2) : JSON.stringify(result, null, 2));\n await this.toastService.show({\n color: ok ? 'success' : 'warning',\n title: ok ? successTitle : errTitle,\n content: content ?? '',\n });\n return;\n }\n if (this.queryService.exists(toolName)) {\n const input =\n payload != null && typeof payload === 'object' && !Array.isArray(payload)\n ? (payload as Record<string, unknown>)\n : {};\n const data = await this.queryService.fetch(toolName, input);\n await this.toastService.show({\n color: 'success',\n title: successTitle,\n content: data != null ? JSON.stringify(data, null, 2) : '—',\n });\n return;\n }\n\n await this.toastService.show({\n color: 'warning',\n title: errTitle,\n content: notRegistered,\n });\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXValueChangedEvent } from '@acorex/cdk/common';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXPopupService } from '@acorex/components/popup';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXFormModule } from '@acorex/components/form';\nimport { AXTextAreaModule } from '@acorex/components/text-area';\nimport { AXFileService } from '@acorex/core/file';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport {\n type AXPAiDelegatedAgentTranscriptEntry,\n type AXPAiEffectiveAssistRow,\n type AXPAiChatResponse,\n type AXPAiDelegatedNestedToolCallContext,\n type AXPAiEngineUsageTotals,\n type AXPAiToolCall,\n type AXPAiChatMessage,\n axpAiChatMessageGetText,\n axpAiChatTextMessage,\n axpAiChatToolOrAgentResultBodyJson,\n axpAiChatUserMessage,\n axpAiParseSupervisorAgentToolName,\n} from '../ai-engine.types';\nimport { axpAiAssistInitialMessagesToTranscript } from '../../utils/assist-initial-messages.util';\nimport { persistAiChatAttachmentImage } from '../image/ai-generated-image-persist';\nimport { AXPEntityService } from '@acorex/platform/layout/entity';\nimport { AXPActionMenuItem, AXPExecuteCommand } from '@acorex/platform/core';\nimport { AXPFileStorageService } from '@acorex/platform/common';\nimport { AXPThemeLayoutBlockComponent } from '@acorex/platform/layout/components';\nimport { AXPLayoutBuilderService } from '@acorex/platform/layout/builder';\nimport { AXPPageLayoutBase, AXPPageLayoutBaseComponent, AXPPageLayoutComponent } from '@acorex/platform/layout/views';\nimport { AXPLayoutRendererComponent } from '@acorex/platform/layout/builder';\nimport type { AXPWidgetNode } from '@acorex/platform/layout/widget-core';\nimport { CommonModule, isPlatformBrowser } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n OnInit,\n PLATFORM_ID,\n ViewEncapsulation,\n computed,\n inject,\n model,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport {\n AIMANAGEMENT_CHAT_GENERATE_IMAGE_COMMAND_KEY,\n AIMANAGEMENT_CHAT_SYNTHESIZE_SPEECH_COMMAND_KEY,\n} from '../../tools/ai-chat-tool.command-keys';\nimport { RootConfig } from '../../const';\nimport { AXPAiAssistChatModelCatalogService } from '../ai-assist-chat-model-catalog.service';\nimport { AXPAiManagerService } from '../ai-manager.service';\nimport { AXPAiPlatformRuntimeContextBuilder } from '../ai-platform-runtime-context.builder';\nimport {\n type AssistantParsedContent,\n parseAssistantContentForDisplay,\n} from './ai-chat-thinking.util';\nimport {\n axmBuildChatDisplayItems,\n type AXMAiChatToolCallPair,\n type AXMAiChatToolTurnItem,\n} from './ai-chat-display-items.build';\nimport { AXMAiChatToolAudioPreviewComponent } from './ai-chat-tool-audio-preview.component';\nimport { AXMAiChatToolImagePreviewComponent } from './ai-chat-tool-image-preview.component';\nimport { AXMAiChatToolExecuteService } from './ai-chat-tool-execute.service';\n\n//#endregion\n\n//#region ---- Types ----\n\ninterface AXMAiChatPageAgentRow {\n id: string;\n modelEntityId?: string | null;\n}\n\ninterface AXMAiModelListRow {\n id: string;\n name: string;\n title: string;\n chatTransport?: string;\n maxContextTokens?: number;\n inputPricePerMillion?: number;\n outputPricePerMillion?: number;\n cachedInputPricePerMillion?: number;\n}\n\ninterface AXMAiAssistPickerRow {\n id: string;\n name?: string;\n title: string;\n}\n\n/** Live status of a single tool call during engine execution (before final messages arrive). */\ninterface AXMAiLiveToolCallStatus {\n call: AXPAiToolCall;\n state: 'running' | 'done';\n resultContent?: string;\n}\n\n/** One image staged in the composer (not in the thread until send). */\ninterface AXMAiComposerDraftImage {\n clientId: string;\n /** Local preview only; revoked when the slot is removed or after send. */\n previewUrl: string;\n mimeType: string;\n name?: string;\n /** Set after {@link persistAiChatAttachmentImage} succeeds. */\n fileId?: string;\n}\n\n/** One audio file staged in the composer (not in the thread until send). */\ninterface AXMAiComposerDraftAudio {\n clientId: string;\n mimeType: string;\n name?: string;\n /** Set after {@link persistAiChatAttachmentImage} succeeds. */\n fileId?: string;\n}\n\n/** Parsed delegated-agent (`agent:<id>`) tool result body for chat UI. */\ninterface AXMAiDelegatedAgentToolParsed {\n agentName?: string;\n answer?: string;\n error?: string;\n}\n\n//#endregion\n\n//#region ---- Component ----\n\n/**\n * AI chat page built with Acorex layout and form controls only (no conversation/chat shell component).\n */\n@Component({\n selector: 'axm-ai-chat-page',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <axp-page-layout [dir]=\"layoutDirection()\">\n <axp-page-content class=\"ax-flex ax-flex-col ax-min-h-0 ax-overflow-hidden\">\n <section\n class=\"ax-flex ax-flex-col ax-h-full ax-min-h-0 ax-bg-lightest dark:ax-bg-lighter\"\n >\n <!-- Message thread (ChatGPT-style: user pill on the end, assistant flush to surface) -->\n <div\n class=\"ax-flex-1 ax-min-h-[40vh] ax-overflow-y-auto\"\n role=\"log\"\n [attr.aria-label]=\"'@ai-management:chat.title' | translate | async\"\n >\n <div\n class=\"ax-mx-auto ax-w-full ax-px-4 ax-py-6 ax-space-y-8\"\n [class.ax-max-w-6xl]=\"threadUsesAssistLayout()\"\n [class.ax-max-w-3xl]=\"!threadUsesAssistLayout()\"\n >\n @if (messages().length === 0 && assistBootstrapMessages().length === 0) {\n <p class=\"ax-text-sm ax-text-muted ax-text-center ax-py-8\">\n {{ '@ai-management:chat.empty-hint' | translate | async }}\n </p>\n }\n @for (item of chatDisplayItems(); track $index) {\n @if (item.kind === 'tool-turn') {\n <div class=\"ax-w-full ax-min-w-0 ax-text-sm ax-leading-relaxed ax-text-on-lightest\">\n <div class=\"ax-flex ax-flex-col ax-gap-2 ax-min-w-0\">\n @if (\n !(\n toolTurnPreamblePlain(item) === '' &&\n item.pairs.length\n )\n ) {\n @let parsedTurn = parseAssistantMessageForDisplay(toolTurnPreamblePlain(item));\n @if (parsedTurn.thinking) {\n <details\n class=\"ax-rounded ax-border ax-border-default/70 dark:ax-border-darker ax-bg-default-50/80 dark:ax-bg-default-100/50 ax-px-2 ax-py-1 ax-mb-1\"\n [attr.dir]=\"'auto'\"\n [attr.aria-label]=\"('@ai-management:chat.assistant-thinking-label' | translate | async) ?? ''\"\n >\n <summary\n class=\"ax-cursor-pointer ax-select-none ax-min-w-0 ax-text-xs ax-text-muted ax-outline-none focus-visible:ax-ring-2 focus-visible:ax-ring-primary-300 ax-line-clamp-1 ax-break-words\"\n >\n {{ parsedTurn.thinking }}\n </summary>\n <div\n class=\"ax-mt-2 ax-pt-2 ax-border-t ax-border-default/50 dark:ax-border-darker ax-text-xs ax-text-muted ax-whitespace-pre-wrap ax-break-words\"\n >\n {{ parsedTurn.thinking }}\n </div>\n </details>\n }\n @if (parsedTurn.body.trim()) {\n <div class=\"ax-whitespace-pre-line ax-break-words\" [attr.dir]=\"'auto'\">{{ parsedTurn.body }}</div>\n }\n }\n @if (item.pairs.length) {\n <div class=\"ax-mt-1 ax-flex ax-flex-col ax-gap-2\">\n @for (p of item.pairs; track p.call.id) {\n @if (getGenerateImagePreview(p); as gimg) {\n <div\n class=\"ax-rounded-lg ax-border ax-border-default/70 dark:ax-border-darker ax-bg-lightest dark:ax-bg-default-50 ax-overflow-hidden ax-max-w-full\"\n >\n @if (gimg.fileId) {\n <axm-ai-chat-tool-image-preview\n [fileId]=\"gimg.fileId\"\n [altText]=\"gimg.alt\"\n [ariaLabel]=\"(('@ai-management:chat.generated-image-aria-label' | translate | async) ?? gimg.alt)\"\n />\n } @else if (gimg.imageUrl) {\n <img\n [src]=\"gimg.imageUrl\"\n [alt]=\"gimg.alt\"\n class=\"ax-block ax-max-w-full ax-h-auto ax-max-h-[min(70vh,32rem)]\"\n [attr.aria-label]=\"('@ai-management:chat.generated-image-aria-label' | translate | async) ?? gimg.alt\"\n />\n }\n </div>\n }\n @if (getSynthesizeSpeechPreview(p); as gaudio) {\n <div\n class=\"ax-rounded-lg ax-border ax-border-default/70 dark:ax-border-darker ax-bg-lightest dark:ax-bg-default-50 ax-p-3 ax-max-w-full\"\n >\n @if (gaudio.fileId) {\n <axm-ai-chat-tool-audio-preview\n [fileId]=\"gaudio.fileId\"\n [mimeType]=\"gaudio.mimeType\"\n [titleText]=\"gaudio.title\"\n [ariaLabel]=\"(('@ai-management:chat.generated-speech-aria-label' | translate | async) ?? gaudio.title)\"\n />\n }\n </div>\n }\n @if (showDelegatedAgentMiniChat(p.call.name)) {\n @let ar = parseDelegatedAgentToolResult(p.outputContent);\n <details\n class=\"ax-rounded-lg ax-border ax-border-default dark:ax-border-darker ax-bg-lightest/50 dark:ax-bg-default-50 ax-px-2 ax-py-1\"\n >\n <summary\n class=\"ax-cursor-pointer ax-select-none ax-text-xs ax-font-medium ax-outline-none focus-visible:ax-ring-2 focus-visible:ax-ring-primary-300 ax-flex ax-items-center ax-gap-2 ax-flex-wrap ax-min-w-0\"\n >\n @if (p.outputContent.trim()) {\n <span\n class=\"ax-inline-block ax-w-3 ax-h-3 ax-rounded-full ax-bg-success-500 ax-shrink-0\"\n aria-hidden=\"true\"\n ></span>\n } @else {\n <span\n class=\"ax-inline-block ax-w-3 ax-h-3 ax-rounded-full ax-bg-default-400 dark:ax-bg-default-500 ax-shrink-0\"\n aria-hidden=\"true\"\n ></span>\n }\n <span class=\"ax-inline-flex ax-items-baseline ax-gap-1 ax-min-w-0 ax-break-words\">\n <span>{{ '@ai-management:chat.agent-prefix' | translate | async }}:</span>\n @if (ar.agentName) {\n <span class=\"ax-font-semibold\">{{ ar.agentName }}</span>\n } @else if (p.outputContent.trim()) {\n <span class=\"ax-text-muted ax-font-normal\">{{\n '@ai-management:chat.agent-name-unknown' | translate | async\n }}</span>\n } @else {\n <span class=\"ax-text-muted ax-italic ax-font-normal\">{{\n '@ai-management:chat.tool-executing' | translate | async\n }}</span>\n }\n </span>\n @if (p.outputContent.trim()) {\n <span class=\"ax-text-success-600 dark:ax-text-success-400 ax-shrink-0\">\n {{ '@ai-management:chat.tool-done' | translate | async }}\n </span>\n }\n <span\n class=\"ax-inline-flex ax-shrink-0 ax-ms-auto\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n >\n <ax-button\n look=\"outline\"\n [text]=\"('@ai-management:chat.delegated-agent-detail' | translate | async) ?? ''\"\n [attr.aria-label]=\"('@ai-management:chat.delegated-agent-detail-aria' | translate | async) ?? ''\"\n (onClick)=\"openDelegatedAgentTranscriptDialog(p.call.id, p.call.name, ar.agentName)\"\n ></ax-button>\n </span>\n </summary>\n <div\n class=\"ax-mt-2 ax-space-y-3 ax-pt-2 ax-border-t ax-border-default/60 dark:ax-border-darker\"\n >\n <div class=\"ax-flex ax-justify-end ax-w-full ax-min-w-0\">\n <div\n class=\"ax-max-w-[min(92%,42rem)] ax-min-w-0 ax-rounded-[1.25rem] ax-px-4 ax-py-2.5 ax-text-sm ax-leading-relaxed ax-text-on-lightest ax-bg-default-300/95 dark:ax-bg-default-500/95 ax-shadow-sm ax-ring-1 ax-ring-inset ax-ring-default/20 dark:ax-ring-white/10\"\n >\n <div\n class=\"ax-whitespace-pre-wrap ax-break-words\"\n [attr.dir]=\"'auto'\"\n >\n {{ getAgentDelegatedPromptPreview(p.call.arguments) }}\n </div>\n </div>\n </div>\n <div\n class=\"ax-flex ax-flex-col ax-gap-2 ax-min-w-0 ax-text-sm ax-leading-relaxed ax-text-on-lightest\"\n >\n @if (ar.error) {\n <p class=\"ax-m-0 ax-text-danger-600 dark:ax-text-danger-400 ax-whitespace-pre-wrap ax-break-words\">\n {{ ar.error }}\n </p>\n } @else if (ar.answer) {\n <div class=\"ax-whitespace-pre-wrap ax-break-words\" [attr.dir]=\"'auto'\">\n {{ ar.answer }}\n </div>\n } @else if (p.outputContent.trim()) {\n <pre\n class=\"ax-m-0 ax-max-h-48 ax-overflow-auto ax-rounded ax-bg-default-50 dark:ax-bg-default-200 ax-p-2 ax-font-mono ax-text-[0.75rem] ax-leading-snug ax-whitespace-pre-wrap ax-break-words\"\n >{{ formatToolResultBody(p.outputContent) }}</pre\n >\n } @else {\n <p class=\"ax-m-0 ax-text-xs ax-text-muted ax-italic\">\n {{ '@ai-management:chat.tool-output-pending' | translate | async }}\n </p>\n }\n </div>\n </div>\n </details>\n } @else {\n <details\n class=\"ax-rounded ax-border ax-border-default dark:ax-border-darker ax-bg-lightest/50 dark:ax-bg-default-50 ax-px-2 ax-py-1\"\n >\n <summary\n class=\"ax-cursor-pointer ax-select-none ax-text-xs ax-font-medium ax-outline-none focus-visible:ax-ring-2 focus-visible:ax-ring-primary-300 ax-flex ax-items-center ax-gap-2 ax-flex-wrap\"\n >\n @if (p.outputContent.trim()) {\n <span\n class=\"ax-inline-block ax-w-3 ax-h-3 ax-rounded-full ax-bg-success-500 ax-shrink-0\"\n aria-hidden=\"true\"\n ></span>\n <code\n class=\"ax-px-1 ax-py-0.5 ax-rounded ax-bg-default-200 dark:ax-bg-default-300 ax-text-[0.8em] ax-text-on-lightest\"\n >{{ p.call.name }}</code\n >\n <span class=\"ax-text-success-600 dark:ax-text-success-400\">\n {{ '@ai-management:chat.tool-done' | translate | async }}\n </span>\n <span\n class=\"ax-ml-auto ax-inline-flex ax-shrink-0\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n >\n <ax-button\n look=\"outline\"\n [text]=\"('@ai-management:chat.tool-run-again' | translate | async) ?? ''\"\n (onClick)=\"openToolExecuteDialog(p.call)\"\n ></ax-button>\n </span>\n } @else {\n <span\n class=\"ax-inline-block ax-w-3 ax-h-3 ax-rounded-full ax-bg-default-400 dark:ax-bg-default-500 ax-shrink-0\"\n aria-hidden=\"true\"\n ></span>\n <code\n class=\"ax-px-1 ax-py-0.5 ax-rounded ax-bg-default-200 dark:ax-bg-default-300 ax-text-[0.8em] ax-text-on-lightest\"\n >{{ p.call.name }}</code\n >\n <span class=\"ax-text-muted ax-italic ax-text-[0.85em]\">\n {{ '@ai-management:chat.tool-output-pending' | translate | async }}\n </span>\n }\n </summary>\n <div class=\"ax-mt-2 ax-space-y-1 ax-pt-1 ax-border-t ax-border-default/60 dark:ax-border-darker\">\n <div class=\"ax-text-[0.7rem] ax-uppercase ax-tracking-wide ax-text-muted\">\n {{ '@ai-management:chat.tool-input' | translate | async }}\n </div>\n <pre\n class=\"ax-m-0 ax-max-h-48 ax-overflow-auto ax-rounded ax-bg-default-50 dark:ax-bg-default-200 ax-p-2 ax-font-mono ax-text-[0.7rem] ax-leading-snug ax-whitespace-pre-wrap ax-break-words\"\n >{{ formatToolArguments(p.call.arguments) }}</pre\n >\n <div class=\"ax-text-[0.7rem] ax-uppercase ax-tracking-wide ax-text-muted\">\n {{ '@ai-management:chat.tool-output' | translate | async }}\n </div>\n @if (p.outputContent.trim()) {\n <pre\n class=\"ax-m-0 ax-max-h-48 ax-overflow-auto ax-rounded ax-bg-default-50 dark:ax-bg-default-200 ax-p-2 ax-font-mono ax-text-[0.7rem] ax-leading-snug ax-whitespace-pre-wrap ax-break-words\"\n >{{ formatToolResultBody(p.outputContent) }}</pre\n >\n } @else {\n <p class=\"ax-m-0 ax-text-xs ax-text-muted ax-italic\">\n {{ '@ai-management:chat.tool-output-pending' | translate | async }}\n </p>\n }\n </div>\n </details>\n }\n }\n </div>\n }\n @if (item.followUpMessage; as followUp) {\n @let parsedFollowUp = parseAssistantMessageForDisplay(chatMessageText(followUp));\n @if (parsedFollowUp.thinking) {\n <details\n class=\"ax-rounded ax-border ax-border-default/70 dark:ax-border-darker ax-bg-default-50/80 dark:ax-bg-default-100/50 ax-px-2 ax-py-1\"\n [attr.dir]=\"'auto'\"\n [attr.aria-label]=\"('@ai-management:chat.assistant-thinking-label' | translate | async) ?? ''\"\n >\n <summary\n class=\"ax-cursor-pointer ax-select-none ax-min-w-0 ax-text-xs ax-text-muted ax-outline-none focus-visible:ax-ring-2 focus-visible:ax-ring-primary-300 ax-line-clamp-1 ax-break-words\"\n >\n {{ parsedFollowUp.thinking }}\n </summary>\n <div\n class=\"ax-mt-2 ax-pt-2 ax-border-t ax-border-default/50 dark:ax-border-darker ax-text-xs ax-text-muted ax-whitespace-pre-wrap ax-break-words\"\n >\n {{ parsedFollowUp.thinking }}\n </div>\n </details>\n }\n @if (parsedFollowUp.body.trim()) {\n <div class=\"ax-whitespace-pre-line ax-break-words\" [attr.dir]=\"'auto'\">{{ parsedFollowUp.body }}</div>\n }\n }\n </div>\n </div>\n } @else {\n @if (item.message.role === 'user') {\n <div class=\"ax-w-full ax-flex ax-min-w-0\">\n <div\n class=\"ax-ms-auto ax-min-w-0 ax-rounded-[1.25rem] ax-text-sm ax-leading-relaxed ax-text-on-lightest ax-flex ax-flex-col ax-gap-2 ax-bg-default-300/95 dark:ax-bg-default-500/95 ax-shadow-sm ax-ring-1 ax-ring-inset ax-ring-default/20 dark:ax-ring-white/10\"\n [class.ax-max-w-[min(90%,52rem)]]=\"threadUsesAssistLayout()\"\n [class.ax-max-w-[min(85%,36rem)]]=\"!threadUsesAssistLayout()\"\n [class.ax-px-4]=\"!userMessageAttachmentOnlyBubble(item.message)\"\n [class.ax-py-2.5]=\"!userMessageAttachmentOnlyBubble(item.message)\"\n [class.ax-p-2]=\"userMessageAttachmentOnlyBubble(item.message)\"\n >\n <span class=\"ax-flex ax-flex-col ax-gap-2 ax-whitespace-pre-line ax-break-words ax-min-w-0\">\n @for (seg of item.message.responses; track $index) {\n @if (seg.type === 'image') {\n <span class=\"ax-flex ax-flex-col ax-gap-1 ax-min-w-0 ax-max-w-full\">\n <axm-ai-chat-tool-image-preview\n [fileId]=\"seg.content.fileId\"\n [altText]=\"seg.content.name?.trim() || 'Attached image'\"\n [ariaLabel]=\"(('@ai-management:chat.attached-image-aria-label' | translate | async) ?? '')\"\n />\n </span>\n } @else if (seg.type === 'audio') {\n <span\n class=\"ax-inline-flex ax-items-center ax-gap-2 ax-min-w-0 ax-max-w-full ax-rounded ax-border ax-border-default/60 dark:ax-border-darker ax-bg-default-50/80 dark:ax-bg-default-100/40 ax-px-3 ax-py-1.5 ax-text-sm\"\n >\n <span class=\"ax-text-muted ax-shrink-0\">{{\n '@ai-management:chat.attached-audio-label' | translate | async\n }}</span>\n <span class=\"ax-truncate ax-min-w-0\" [attr.title]=\"seg.content.name ?? ''\">{{\n seg.content.name?.trim() || ('@ai-management:chat.audio-untitled' | translate | async)\n }}</span>\n </span>\n } @else if (seg.type === 'text') {\n <span class=\"ax-whitespace-pre-line\" [attr.dir]=\"'auto'\">{{ seg.content }}</span>\n }\n }\n </span>\n </div>\n </div>\n } @else {\n <div class=\"ax-w-full ax-min-w-0 ax-text-sm ax-leading-relaxed ax-text-on-lightest\">\n <div class=\"ax-flex ax-flex-col ax-gap-2 ax-whitespace-pre-line ax-break-words ax-min-w-0\">\n @if (item.message.role === 'tool') {\n <span [attr.dir]=\"'auto'\">{{ formatToolMessageSummary(item.message) }}</span>\n } @else if (\n item.message.role === 'assistant' &&\n item.message.responses[0]?.type === 'node'\n ) {\n @if (asAssistantLayoutNode(item.message); as layoutNode) {\n <div class=\"ax-min-w-0\" [attr.dir]=\"'auto'\">\n <axp-layout-renderer [layout]=\"layoutNode\" mode=\"view\" [context]=\"{}\" />\n </div>\n }\n } @else if (item.message.role === 'assistant') {\n @let parsed = parseAssistantMessageForDisplay(chatMessageText(item.message));\n @if (parsed.thinking) {\n <details\n class=\"ax-rounded ax-border ax-border-default/70 dark:ax-border-darker ax-bg-default-50/80 dark:ax-bg-default-100/50 ax-px-2 ax-py-1\"\n [attr.dir]=\"'auto'\"\n [attr.aria-label]=\"('@ai-management:chat.assistant-thinking-label' | translate | async) ?? ''\"\n >\n <summary\n class=\"ax-cursor-pointer ax-select-none ax-min-w-0 ax-text-xs ax-text-muted ax-outline-none focus-visible:ax-ring-2 focus-visible:ax-ring-primary-300 ax-line-clamp-1 ax-break-words\"\n >\n {{ parsed.thinking }}\n </summary>\n <div\n class=\"ax-mt-2 ax-pt-2 ax-border-t ax-border-default/50 dark:ax-border-darker ax-text-xs ax-text-muted ax-whitespace-pre-wrap ax-break-words\"\n >\n {{ parsed.thinking }}\n </div>\n </details>\n }\n @if (parsed.body.trim()) {\n <span class=\"ax-whitespace-pre-line\" [attr.dir]=\"'auto'\">{{ parsed.body }}</span>\n }\n } @else {\n <span [attr.dir]=\"'auto'\">{{ chatMessageText(item.message) }}</span>\n }\n </div>\n </div>\n }\n }\n }\n @if (\n isBusy() &&\n (liveToolCalls().length > 0 ||\n liveStatusHasAnyStreamingPreview() ||\n delegatedAgentReflectionLoading())\n ) {\n <div\n class=\"ax-w-full ax-min-w-0 ax-text-sm ax-leading-relaxed ax-text-on-lightest\"\n role=\"status\"\n aria-live=\"polite\"\n >\n <div class=\"ax-flex ax-flex-col ax-gap-2 ax-min-w-0\">\n @for (lt of liveToolCalls(); track lt.call.id) {\n @if (showDelegatedAgentMiniChat(lt.call.name)) {\n @let lar = parseDelegatedAgentToolResult(lt.resultContent ?? '');\n <details\n class=\"ax-rounded-lg ax-border ax-border-default dark:ax-border-darker ax-bg-lightest/50 dark:ax-bg-default-50 ax-px-2 ax-py-1\"\n [attr.open]=\"lt.state === 'running' ? true : null\"\n >\n <summary\n class=\"ax-cursor-pointer ax-select-none ax-text-xs ax-font-medium ax-outline-none focus-visible:ax-ring-2 focus-visible:ax-ring-primary-300 ax-flex ax-items-center ax-gap-2 ax-flex-wrap ax-min-w-0\"\n >\n @if (lt.state === 'running') {\n <span class=\"ax-inline-block ax-w-3 ax-h-3 ax-rounded-full ax-border-2 ax-border-primary-500 ax-border-t-transparent fa-solid fa-spinner ax-animate-twSpin ax-animate-infinite ax-shrink-0\"></span>\n } @else {\n <span class=\"ax-inline-block ax-w-3 ax-h-3 ax-rounded-full ax-bg-success-500 ax-shrink-0\"></span>\n }\n <span class=\"ax-inline-flex ax-items-baseline ax-gap-1 ax-min-w-0 ax-break-words\">\n <span>{{ '@ai-management:chat.agent-prefix' | translate | async }}:</span>\n @if (lar.agentName) {\n <span class=\"ax-font-semibold\">{{ lar.agentName }}</span>\n } @else if (lt.resultContent?.trim()) {\n <span class=\"ax-text-muted ax-font-normal\">{{\n '@ai-management:chat.agent-name-unknown' | translate | async\n }}</span>\n } @else {\n <span class=\"ax-text-muted ax-italic ax-font-normal\">{{\n '@ai-management:chat.tool-executing' | translate | async\n }}</span>\n }\n </span>\n <span [class]=\"lt.state === 'running' ? 'ax-text-muted ax-italic ax-shrink-0' : 'ax-text-success-600 dark:ax-text-success-400 ax-shrink-0'\">\n {{ (lt.state === 'running' ? '@ai-management:chat.tool-executing' : '@ai-management:chat.tool-done') | translate | async }}\n </span>\n <span\n class=\"ax-inline-flex ax-shrink-0 ax-ms-auto\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n >\n <ax-button\n look=\"outline\"\n [text]=\"('@ai-management:chat.delegated-agent-detail' | translate | async) ?? ''\"\n [attr.aria-label]=\"('@ai-management:chat.delegated-agent-detail-aria' | translate | async) ?? ''\"\n (onClick)=\"openDelegatedAgentTranscriptDialog(lt.call.id, lt.call.name, lar.agentName)\"\n ></ax-button>\n </span>\n </summary>\n <div\n class=\"ax-mt-2 ax-space-y-3 ax-pt-2 ax-border-t ax-border-default/60 dark:ax-border-darker\"\n >\n @let nestedLive = nestedDelegatedLiveToolCallsFor(lt.call.id);\n @let nestedStream = nestedDelegatedStreamingPreviewFor(lt.call.id);\n <div class=\"ax-flex ax-justify-end ax-w-full ax-min-w-0\">\n <div\n class=\"ax-max-w-[min(92%,42rem)] ax-min-w-0 ax-rounded-[1.25rem] ax-px-4 ax-py-2.5 ax-text-sm ax-leading-relaxed ax-text-on-lightest ax-bg-default-300/95 dark:ax-bg-default-500/95 ax-shadow-sm ax-ring-1 ax-ring-inset ax-ring-default/20 dark:ax-ring-white/10\"\n >\n <div class=\"ax-whitespace-pre-wrap ax-break-words\" [attr.dir]=\"'auto'\">\n {{ getAgentDelegatedPromptPreview(lt.call.arguments) }}\n </div>\n </div>\n </div>\n @if (nestedStream.length > 0) {\n <div class=\"ax-whitespace-pre-line ax-break-words\" [attr.dir]=\"'auto'\">{{ nestedStream }}</div>\n }\n @if (nestedLive.length > 0) {\n <div class=\"ax-flex ax-flex-col ax-gap-2 ax-min-w-0\">\n @for (nt of nestedLive; track nt.call.id) {\n <details\n class=\"ax-rounded ax-border ax-border-default dark:ax-border-darker ax-bg-lightest/50 dark:ax-bg-default-50 ax-px-2 ax-py-1\"\n [attr.open]=\"nt.state === 'running' ? true : null\"\n >\n <summary\n class=\"ax-cursor-pointer ax-select-none ax-text-xs ax-font-medium ax-outline-none focus-visible:ax-ring-2 focus-visible:ax-ring-primary-300 ax-flex ax-items-center ax-gap-2 ax-flex-wrap\"\n >\n @if (nt.state === 'running') {\n <span class=\"ax-inline-block ax-w-3 ax-h-3 ax-rounded-full ax-border-2 ax-border-primary-500 ax-border-t-transparent ax-animate-spin ax-shrink-0\"></span>\n } @else {\n <span class=\"ax-inline-block ax-w-3 ax-h-3 ax-rounded-full ax-bg-success-500 ax-shrink-0\"></span>\n }\n <code class=\"ax-px-1 ax-py-0.5 ax-rounded ax-bg-default-200 dark:ax-bg-default-300 ax-text-[0.8em] ax-text-on-lightest\">{{ nt.call.name }}</code>\n <span [class]=\"nt.state === 'running' ? 'ax-text-muted ax-italic' : 'ax-text-success-600 dark:ax-text-success-400'\">\n {{ (nt.state === 'running' ? '@ai-management:chat.tool-executing' : '@ai-management:chat.tool-done') | translate | async }}\n </span>\n @if (nt.state === 'done') {\n <span\n class=\"ax-ml-auto ax-inline-flex ax-shrink-0\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n >\n <ax-button\n look=\"outline\"\n [text]=\"('@ai-management:chat.tool-run-again' | translate | async) ?? ''\"\n (onClick)=\"openToolExecuteDialog(nt.call)\"\n ></ax-button>\n </span>\n }\n </summary>\n <div class=\"ax-mt-2 ax-pt-1 ax-border-t ax-border-default/60 dark:ax-border-darker ax-space-y-1\">\n <div class=\"ax-text-[0.7rem] ax-uppercase ax-tracking-wide ax-text-muted\">\n {{ '@ai-management:chat.tool-input' | translate | async }}\n </div>\n <pre\n class=\"ax-m-0 ax-max-h-32 ax-overflow-auto ax-rounded ax-bg-default-50 dark:ax-bg-default-200 ax-p-2 ax-font-mono ax-text-[0.7rem] ax-leading-snug ax-whitespace-pre-wrap ax-break-words\"\n >{{ formatToolArguments(nt.call.arguments) }}</pre\n >\n @if (nt.resultContent) {\n <div class=\"ax-text-[0.7rem] ax-uppercase ax-tracking-wide ax-text-muted\">\n {{ '@ai-management:chat.tool-output' | translate | async }}\n </div>\n <pre\n class=\"ax-m-0 ax-max-h-32 ax-overflow-auto ax-rounded ax-bg-default-50 dark:ax-bg-default-200 ax-p-2 ax-font-mono ax-text-[0.7rem] ax-leading-snug ax-whitespace-pre-wrap ax-break-words\"\n >{{ formatToolResultBody(nt.resultContent) }}</pre\n >\n }\n </div>\n </details>\n }\n </div>\n }\n <div class=\"ax-flex ax-flex-col ax-gap-2 ax-min-w-0 ax-text-sm ax-leading-relaxed ax-text-on-lightest\">\n @if (lar.error) {\n <p class=\"ax-m-0 ax-text-danger-600 dark:ax-text-danger-400 ax-whitespace-pre-wrap ax-break-words\">\n {{ lar.error }}\n </p>\n } @else if (lar.answer) {\n <div class=\"ax-whitespace-pre-wrap ax-break-words\" [attr.dir]=\"'auto'\">{{ lar.answer }}</div>\n } @else if (lt.resultContent?.trim()) {\n <pre\n class=\"ax-m-0 ax-max-h-32 ax-overflow-auto ax-rounded ax-bg-default-50 dark:ax-bg-default-200 ax-p-2 ax-font-mono ax-text-[0.75rem] ax-leading-snug ax-whitespace-pre-wrap ax-break-words\"\n >{{ formatToolResultBody(lt.resultContent ?? '') }}</pre\n >\n } @else {\n <p class=\"ax-m-0 ax-text-xs ax-text-muted ax-italic\">\n {{ '@ai-management:chat.tool-output-pending' | translate | async }}\n </p>\n }\n </div>\n </div>\n </details>\n } @else {\n <details\n class=\"ax-rounded ax-border ax-border-default dark:ax-border-darker ax-bg-lightest/50 dark:ax-bg-default-50 ax-px-2 ax-py-1\"\n [attr.open]=\"lt.state === 'running' ? true : null\"\n >\n <summary\n class=\"ax-cursor-pointer ax-select-none ax-text-xs ax-font-medium ax-outline-none focus-visible:ax-ring-2 focus-visible:ax-ring-primary-300 ax-flex ax-items-center ax-gap-2 ax-flex-wrap\"\n >\n @if (lt.state === 'running') {\n <span class=\"ax-inline-block ax-w-3 ax-h-3 ax-rounded-full ax-border-2 ax-border-primary-500 ax-border-t-transparent fa-solid fa-spinner ax-animate-twSpin ax-animate-infinite ax-shrink-0\"></span>\n } @else {\n <span class=\"ax-inline-block ax-w-3 ax-h-3 ax-rounded-full ax-bg-success-500 ax-shrink-0\"></span>\n }\n <code class=\"ax-px-1 ax-py-0.5 ax-rounded ax-bg-default-200 dark:ax-bg-default-300 ax-text-[0.8em] ax-text-on-lightest\">{{ lt.call.name }}</code>\n <span [class]=\"lt.state === 'running' ? 'ax-text-muted ax-italic' : 'ax-text-success-600 dark:ax-text-success-400'\">\n {{ (lt.state === 'running' ? '@ai-management:chat.tool-executing' : '@ai-management:chat.tool-done') | translate | async }}\n </span>\n @if (lt.state === 'done') {\n <span\n class=\"ax-ml-auto ax-inline-flex ax-shrink-0\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n >\n <ax-button\n look=\"outline\"\n [text]=\"('@ai-management:chat.tool-run-again' | translate | async) ?? ''\"\n (onClick)=\"openToolExecuteDialog(lt.call)\"\n ></ax-button>\n </span>\n }\n </summary>\n <div class=\"ax-mt-2 ax-pt-1 ax-border-t ax-border-default/60 dark:ax-border-darker ax-space-y-1\">\n <div class=\"ax-text-[0.7rem] ax-uppercase ax-tracking-wide ax-text-muted\">\n {{ '@ai-management:chat.tool-input' | translate | async }}\n </div>\n <pre\n class=\"ax-m-0 ax-max-h-32 ax-overflow-auto ax-rounded ax-bg-default-50 dark:ax-bg-default-200 ax-p-2 ax-font-mono ax-text-[0.7rem] ax-leading-snug ax-whitespace-pre-wrap ax-break-words\"\n >{{ formatToolArguments(lt.call.arguments) }}</pre\n >\n @if (lt.resultContent) {\n <div class=\"ax-text-[0.7rem] ax-uppercase ax-tracking-wide ax-text-muted\">\n {{ '@ai-management:chat.tool-output' | translate | async }}\n </div>\n <pre\n class=\"ax-m-0 ax-max-h-32 ax-overflow-auto ax-rounded ax-bg-default-50 dark:ax-bg-default-200 ax-p-2 ax-font-mono ax-text-[0.7rem] ax-leading-snug ax-whitespace-pre-wrap ax-break-words\"\n >{{ formatToolResultBody(lt.resultContent) }}</pre\n >\n }\n </div>\n </details>\n }\n }\n @if (streamingAssistantPreview().length > 0) {\n <div class=\"ax-whitespace-pre-line ax-break-words\" [attr.dir]=\"'auto'\">{{ streamingAssistantPreview() }}</div>\n }\n @if (delegatedAgentReflectionLoading()) {\n <div\n class=\"ax-flex ax-items-center ax-gap-2 ax-text-xs ax-text-muted ax-italic\"\n role=\"status\"\n aria-live=\"polite\"\n >\n <span\n class=\"ax-inline-block ax-w-3 ax-h-3 ax-rounded-full ax-border-2 ax-border-primary-500 ax-border-t-transparent fa-solid fa-spinner ax-animate-twSpin ax-animate-infinite ax-shrink-0\"\n ></span>\n <span>{{ '@ai-management:chat.delegated-agent-reflecting' | translate | async }}</span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Context meter & usage -->\n <div\n class=\"ax-flex ax-items-center ax-gap-3 ax-flex-wrap ax-justify-between ax-px-4 ax-py-2 ax-border-t ax-border-default/70 dark:ax-border-darker ax-bg-lightest dark:ax-bg-lighter ax-text-xs ax-text-muted\"\n [attr.aria-label]=\"('@ai-management:chat.context-used' | translate | async) ?? ''\"\n >\n <div class=\"ax-flex ax-shrink-0 ax-items-center ax-gap-2\">\n <ax-button\n look=\"outline\"\n color=\"secondary\"\n [text]=\"('@ai-management:chat.logs' | translate | async) ?? ''\"\n [attr.aria-label]=\"('@ai-management:chat.logs' | translate | async) ?? ''\"\n (onClick)=\"openMessagesLogDialog()\"\n ></ax-button>\n <ax-button\n look=\"outline\"\n color=\"secondary\"\n [text]=\"('@ai-management:chat.download-json' | translate | async) ?? ''\"\n [attr.aria-label]=\"('@ai-management:chat.download-json' | translate | async) ?? ''\"\n (onClick)=\"downloadMessagesJson()\"\n ></ax-button>\n </div>\n <div\n class=\"ax-flex ax-flex-1 ax-min-w-0 ax-items-center ax-gap-3 ax-flex-wrap ax-justify-end\"\n >\n @if (lastUsageTotals(); as totals) {\n <span class=\"ax-hidden sm:ax-flex ax-items-center ax-gap-1 ax-tabular-nums\">\n <span class=\"ax-font-medium ax-text-on-lightest\">{{ '@ai-management:chat.usage-prompt' | translate | async }}:</span>\n <span>{{ totals.promptTokens | number }}</span>\n @if (totals.cachedPromptTokens) {\n <span class=\"ax-text-success-600 dark:ax-text-success-400\">({{ '@ai-management:chat.usage-cached' | translate | async }}: {{ totals.cachedPromptTokens | number }})</span>\n }\n <span class=\"ax-mx-1\">|</span>\n <span class=\"ax-font-medium ax-text-on-lightest\">{{ '@ai-management:chat.usage-completion' | translate | async }}:</span>\n <span>{{ totals.completionTokens | number }}</span>\n </span>\n }\n @if (estimatedCostLabel(); as cost) {\n <span\n class=\"ax-font-medium ax-tabular-nums ax-text-warning-700 dark:ax-text-warning-300\"\n [attr.title]=\"('@ai-management:chat.cost-tooltip' | translate | async) ?? ''\"\n >{{ cost }}</span>\n }\n <span class=\"ax-hidden sm:ax-inline\">{{\n '@ai-management:chat.context-used' | translate | async\n }}</span>\n <svg class=\"ax-shrink-0\" width=\"40\" height=\"40\" viewBox=\"0 0 36 36\" aria-hidden=\"true\">\n <circle\n cx=\"18\"\n cy=\"18\"\n r=\"15.915\"\n fill=\"none\"\n class=\"ax-stroke-default-200 dark:ax-stroke-default-300\"\n stroke-width=\"3\"\n />\n <circle\n cx=\"18\"\n cy=\"18\"\n r=\"15.915\"\n fill=\"none\"\n class=\"ax-stroke-primary-500\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n transform=\"rotate(-90 18 18)\"\n [attr.stroke-dasharray]=\"contextMeterCircumference()\"\n [attr.stroke-dashoffset]=\"contextMeterStrokeDashOffset()\"\n />\n </svg>\n @if (contextMeterPercent() !== null) {\n <span class=\"ax-font-medium ax-tabular-nums ax-text-on-lightest\">{{ contextMeterPercent() }}%</span>\n } @else {\n <span>{{ '@ai-management:chat.context-meter-unknown' | translate | async }}</span>\n }\n </div>\n </div>\n\n <!-- Composer -->\n <div\n class=\"ax-border-t ax-border-default dark:ax-border-darkest ax-p-4 ax-bg-lightest dark:ax-bg-lighter ax-flex ax-flex-col ax-gap-3\"\n >\n @if (draftComposerImages().length > 0 || draftComposerAudios().length > 0 || isComposerSaving()) {\n <div\n class=\"ax-rounded-lg ax-border ax-border-default/70 dark:ax-border-darker ax-bg-default-50/80 dark:ax-bg-default-100/40 ax-p-2 ax-flex ax-flex-col ax-gap-2\"\n [attr.aria-label]=\"('@ai-management:chat.composer-attachments-region' | translate | async) ?? ''\"\n >\n <div class=\"ax-flex ax-flex-wrap ax-items-center ax-justify-between ax-gap-2 ax-text-xs ax-text-muted\">\n <span>\n @if (isComposerSaving()) {\n {{ '@ai-management:chat.composer-uploading' | translate | async }}\n } @else {\n @if (draftComposerImages().length > 0) {\n <span>{{ draftComposerImages().length }} {{ '@ai-management:chat.composer-images-count' | translate | async }}</span>\n }\n @if (draftComposerImages().length > 0 && draftComposerAudios().length > 0) {\n <span class=\"ax-mx-1\">·</span>\n }\n @if (draftComposerAudios().length > 0) {\n <span>{{ draftComposerAudios().length }} {{ '@ai-management:chat.composer-audio-count' | translate | async }}</span>\n }\n }\n </span>\n </div>\n @if (draftComposerImages().length > 0) {\n <div class=\"ax-flex ax-flex-wrap ax-gap-2\">\n @for (slot of draftComposerImages(); track slot.clientId) {\n <div\n class=\"ax-relative ax-h-16 ax-w-16 ax-shrink-0 ax-overflow-hidden ax-rounded-md ax-border ax-border-default/60 dark:ax-border-darker ax-bg-lightest\"\n >\n <img\n [src]=\"slot.previewUrl\"\n [alt]=\"slot.name ?? ''\"\n class=\"ax-h-full ax-w-full ax-object-cover\"\n />\n @if (!slot.fileId) {\n <span\n class=\"ax-absolute ax-inset-0 ax-flex ax-items-center ax-justify-center ax-bg-default/40 ax-text-[0.65rem] ax-font-medium ax-text-on-lightest\"\n >…</span\n >\n }\n <button\n type=\"button\"\n class=\"ax-absolute ax-end-0.5 ax-top-0.5 ax-flex ax-h-5 ax-w-5 ax-items-center ax-justify-center ax-rounded ax-bg-default/80 ax-text-[0.7rem] ax-leading-none ax-text-on-lightest hover:ax-bg-default focus-visible:ax-outline-none focus-visible:ax-ring-2 focus-visible:ax-ring-primary-400\"\n [disabled]=\"isBusy() || isComposerSaving()\"\n [attr.aria-label]=\"('@ai-management:chat.remove-draft-image' | translate | async) ?? ''\"\n (click)=\"removeDraftImage(slot.clientId)\"\n >\n ×\n </button>\n </div>\n }\n </div>\n }\n @if (draftComposerAudios().length > 0) {\n <div class=\"ax-flex ax-flex-col ax-gap-1\">\n @for (slot of draftComposerAudios(); track slot.clientId) {\n <div\n class=\"ax-flex ax-items-center ax-justify-between ax-gap-2 ax-rounded ax-border ax-border-default/60 dark:ax-border-darker ax-bg-lightest ax-px-2 ax-py-1.5 ax-text-xs ax-min-w-0\"\n >\n <span class=\"ax-truncate ax-text-on-lightest\" [attr.title]=\"slot.name ?? ''\">\n {{ '@ai-management:chat.attached-audio-label' | translate | async }}:\n {{ slot.name?.trim() || ('@ai-management:chat.audio-untitled' | translate | async) }}\n </span>\n @if (!slot.fileId) {\n <span class=\"ax-text-muted ax-shrink-0\">…</span>\n }\n <button\n type=\"button\"\n class=\"ax-shrink-0 ax-flex ax-h-6 ax-w-6 ax-items-center ax-justify-center ax-rounded ax-bg-default/80 ax-text-[0.85rem] ax-leading-none ax-text-on-lightest hover:ax-bg-default focus-visible:ax-outline-none focus-visible:ax-ring-2 focus-visible:ax-ring-primary-400\"\n [disabled]=\"isBusy() || isComposerSaving()\"\n [attr.aria-label]=\"('@ai-management:chat.remove-draft-audio' | translate | async) ?? ''\"\n (click)=\"removeDraftAudio(slot.clientId)\"\n >\n ×\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <ax-form-field>\n <ax-text-area\n [rows]=\"4\"\n [disabled]=\"isBusy()\"\n [ngModel]=\"input()\"\n (onValueChanged)=\"onComposerValueChanged($event)\"\n [placeholder]=\"('@ai-management:chat.placeholder' | translate | async) ?? ''\"\n ></ax-text-area>\n </ax-form-field>\n\n <div class=\"ax-flex ax-flex-col ax-gap-2 sm:ax-flex-row sm:ax-items-center sm:ax-justify-end\">\n <div class=\"ax-inline-flex ax-w-full ax-min-h-10 sm:ax-w-auto sm:ax-shrink-0 ax-flex-wrap ax-gap-2\">\n <ax-button\n class=\"ax-w-full sm:ax-w-auto\"\n look=\"outline\"\n color=\"secondary\"\n type=\"button\"\n [disabled]=\"isBusy() || isComposerSaving()\"\n [text]=\"('@ai-management:chat.upload-images' | translate | async) ?? ''\"\n [attr.aria-label]=\"('@ai-management:chat.upload-images-aria' | translate | async) ?? ''\"\n (onClick)=\"openChatImagePicker()\"\n ></ax-button>\n <ax-button\n class=\"ax-w-full sm:ax-w-auto\"\n look=\"outline\"\n color=\"secondary\"\n type=\"button\"\n [disabled]=\"isBusy() || isComposerSaving()\"\n [text]=\"('@ai-management:chat.upload-audio' | translate | async) ?? ''\"\n [attr.aria-label]=\"('@ai-management:chat.upload-audio-aria' | translate | async) ?? ''\"\n (onClick)=\"openChatAudioPicker()\"\n ></ax-button>\n </div>\n <ax-button\n class=\"ax-w-full sm:ax-flex-1 sm:ax-max-w-md\"\n color=\"primary\"\n [disabled]=\"isBusy() || !canSend()\"\n [text]=\"\n isBusy()\n ? ('@ai-management:chat.sending' | translate | async)\n : ('@ai-management:chat.send' | translate | async)\n \"\n (onClick)=\"send()\"\n ></ax-button>\n </div>\n </div>\n </section>\n </axp-page-content>\n </axp-page-layout>\n `,\n imports: [\n CommonModule,\n FormsModule,\n AXButtonModule,\n AXFormModule,\n AXDecoratorModule,\n AXTextAreaModule,\n AXTranslationModule,\n AXMAiChatToolImagePreviewComponent,\n AXMAiChatToolAudioPreviewComponent,\n AXPPageLayoutComponent,\n AXPThemeLayoutBlockComponent,\n AXPLayoutRendererComponent,\n ],\n providers: [{ provide: AXPPageLayoutBase, useExisting: AXMAiChatPageComponent }],\n})\nexport class AXMAiChatPageComponent extends AXPPageLayoutBaseComponent implements OnInit {\n //#region ---- Services & Dependencies ----\n\n private readonly aiManager = inject(AXPAiManagerService);\n private readonly modelCatalog = inject(AXPAiAssistChatModelCatalogService);\n private readonly entityService = inject(AXPEntityService);\n\n private readonly agentData = this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.agent.name)\n .data<string, AXMAiChatPageAgentRow, AXMAiChatPageAgentRow, AXMAiChatPageAgentRow, AXMAiChatPageAgentRow>();\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n private readonly layoutBuilder = inject(AXPLayoutBuilderService);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly fileStorage = inject(AXPFileStorageService);\n /** File picker API shared with platform file-uploader (`AXFileService.choose`, upload-from-computer action). */\n private readonly fileService = inject(AXFileService);\n private readonly popupService = inject(AXPopupService);\n private readonly chatToolExecute = inject(AXMAiChatToolExecuteService);\n private readonly platformRuntimeContextBuilder = inject(AXPAiPlatformRuntimeContextBuilder);\n\n //#endregion\n\n //#region ---- State ----\n\n /** Primary key of the selected Assist row (supervisor chat). Cleared when {@link selectedDirectAgentId} is set. */\n readonly selectedAssistId = model<string | undefined>(undefined);\n\n /**\n * Direct AiAgent specialist chat (registry tools, classic tool I/O UI). Cleared when an assist is selected.\n */\n readonly selectedDirectAgentId = model<string | undefined>(undefined);\n\n /** Wide layout + delegated-agent mini-chat blocks (assist / supervisor mode only). */\n readonly threadUsesAssistLayout = computed(() => !this.selectedDirectAgentId()?.trim());\n\n readonly messages = signal<AXPAiChatMessage[]>([]);\n\n /**\n * Assist-configured greeting lines shown in the thread but **not** sent to the agent.\n * Keeping them out of {@link messages} avoids a duplicate assistant reply after the first user turn.\n */\n readonly assistBootstrapMessages = signal<AXPAiChatMessage[]>([]);\n\n /**\n * Merges each assistant message that requested tools with the following tool-role messages\n * so the thread can show one collapsible I/O block per tool call.\n */\n readonly chatDisplayItems = computed(() => {\n const bootstrap = this.assistBootstrapMessages();\n const fromBootstrap = bootstrap.map((message) => ({\n kind: 'simple' as const,\n message,\n }));\n return [...fromBootstrap, ...axmBuildChatDisplayItems(this.messages())];\n });\n\n /** Bootstrap + conversation (for JSON export / debug dialog). */\n readonly fullTranscriptMessages = computed(() => [\n ...this.assistBootstrapMessages(),\n ...this.messages(),\n ]);\n\n readonly input = signal('');\n\n /**\n * Groups image lines + optional text for one multimodal send; set on first file pick in a turn.\n */\n readonly draftAttachmentGroupId = signal<string | null>(null);\n\n /**\n * Images chosen for the next message (shown above the composer with instant local previews).\n * Not part of {@link messages} until the user sends.\n */\n readonly draftComposerImages = signal<AXMAiComposerDraftImage[]>([]);\n\n /** Audio files chosen for the next message (persisted like images). */\n readonly draftComposerAudios = signal<AXMAiComposerDraftAudio[]>([]);\n\n /** True while files are being saved to storage after picker closes. */\n readonly isComposerSaving = signal(false);\n\n readonly isBusy = signal(false);\n readonly layoutDirection = signal<'ltr' | 'rtl'>('ltr');\n readonly assistLoadError = signal(false);\n readonly effectiveAssist = signal<AXPAiEffectiveAssistRow | null>(null);\n\n /** Resolved AiModel catalog row id for metrics (assist {@link AXPAiEffectiveAssistRow.modelId} or agent `modelEntityId`). */\n readonly selectedModelId = model<string | undefined>(undefined);\n\n /** Full chat catalog (for pricing / context meter on the active resolved model). */\n readonly modelRows = signal<AXMAiModelListRow[]>([]);\n\n /** Last aggregated token usage from the agent run (for context meter). */\n readonly lastUsageTotals = signal<AXPAiEngineUsageTotals | null>(null);\n\n /**\n * Specialist sub-run transcripts keyed by supervisor tool_call id (merged from each {@link AXPAiManagerService.run} result).\n */\n readonly delegatedTranscriptsByCallId = signal<Record<string, AXPAiDelegatedAgentTranscriptEntry>>({});\n\n /** Incremental assistant text while the provider streams (OpenAI SSE). */\n readonly streamingAssistantPreview = signal('');\n\n /**\n * Incremental assistant text streamed inside a delegated `agent:*` sub-run, keyed by supervisor tool_call id.\n * Kept separate from {@link streamingAssistantPreview} so specialist text stays in the delegation collapse.\n */\n private readonly delegatedNestedStreamingPreview = signal<Map<string, string>>(new Map());\n\n /** True when supervisor preview or any delegated nested stream has visible text (live status strip). */\n readonly liveStatusHasAnyStreamingPreview = computed(() => {\n if (this.streamingAssistantPreview().length > 0) {\n return true;\n }\n for (const text of this.delegatedNestedStreamingPreview().values()) {\n if (text.length > 0) {\n return true;\n }\n }\n return false;\n });\n\n /** Live tool execution status during an active agent run (cleared when run completes). */\n readonly liveToolCalls = signal<AXMAiLiveToolCallStatus[]>([]);\n\n /**\n * Nested registry tool calls inside a delegated `agent:*` run, keyed by the supervisor tool_call id\n * (same id as the parent collapse / transcript). Not mixed into {@link liveToolCalls}.\n */\n private readonly delegatedNestedLiveToolCalls = signal<Map<string, AXMAiLiveToolCallStatus[]>>(\n new Map(),\n );\n\n /** Delegated agent sub-run: tool-free reflection after a tool result (shows loading only). */\n readonly delegatedAgentReflectionLoading = signal(false);\n\n readonly selectedModelRow = computed(() => {\n const id = this.selectedModelId()?.trim();\n if (!id) {\n return undefined;\n }\n return this.modelRows().find((r) => r.id === id);\n });\n\n readonly contextMeterPercent = computed(() => {\n const totals = this.lastUsageTotals();\n const max = this.selectedModelRow()?.maxContextTokens;\n if (totals == null || !max || max <= 0) {\n return null;\n }\n return Math.min(100, Math.round((totals.totalTokens / max) * 100));\n });\n\n /** Estimated session cost in USD based on model pricing and token totals. */\n readonly estimatedCostUsd = computed(() => {\n const totals = this.lastUsageTotals();\n const model = this.selectedModelRow();\n if (!totals || !model) {\n return null;\n }\n const inputRate = model.inputPricePerMillion ?? 0;\n const outputRate = model.outputPricePerMillion ?? 0;\n const cachedRate = model.cachedInputPricePerMillion ?? inputRate;\n if (inputRate <= 0 && outputRate <= 0) {\n return null;\n }\n const cachedPrompt = totals.cachedPromptTokens ?? 0;\n const nonCachedPrompt = Math.max(0, totals.promptTokens - cachedPrompt);\n const inputCost = (nonCachedPrompt / 1_000_000) * inputRate;\n const cachedCost = (cachedPrompt / 1_000_000) * cachedRate;\n const outputCost = (totals.completionTokens / 1_000_000) * outputRate;\n return inputCost + cachedCost + outputCost;\n });\n\n /** Formats the estimated cost as a short string (e.g. \"$0.0012\"). */\n readonly estimatedCostLabel = computed(() => {\n const cost = this.estimatedCostUsd();\n if (cost === null) {\n return null;\n }\n if (cost < 0.0001) {\n return '$0.0000';\n }\n if (cost < 0.01) {\n return `$${cost.toFixed(4)}`;\n }\n return `$${cost.toFixed(2)}`;\n });\n\n private static readonly contextMeterR = 15.915;\n\n readonly contextMeterCircumference = computed(\n () => Math.round(2 * Math.PI * AXMAiChatPageComponent.contextMeterR * 1000) / 1000,\n );\n\n readonly contextMeterStrokeDashOffset = computed(() => {\n const c = this.contextMeterCircumference();\n const p = this.contextMeterPercent();\n if (p === null) {\n return c;\n }\n return c * (1 - p / 100);\n });\n\n /** Send enabled when there is composer text or staged images/audio (all saved to storage). */\n readonly canSend = computed(() => {\n if (this.isBusy() || this.isComposerSaving()) {\n return false;\n }\n const textOk = this.input().trim().length > 0;\n const draftImg = this.draftComposerImages();\n const draftAud = this.draftComposerAudios();\n const allImagesSaved =\n draftImg.length === 0 || draftImg.every((s) => Boolean(s.fileId?.trim()));\n const allAudiosSaved =\n draftAud.length === 0 || draftAud.every((s) => Boolean(s.fileId?.trim()));\n if (!allImagesSaved || !allAudiosSaved) {\n return false;\n }\n if (draftImg.length === 0 && draftAud.length === 0) {\n return textOk;\n }\n return textOk || draftImg.length > 0 || draftAud.length > 0;\n });\n\n /** Assists listed in the page header dropdown. */\n protected assistPickerRows: AXMAiAssistPickerRow[] = [];\n\n /** Agents listed for direct specialist chat (same row shape as assists). */\n protected agentPickerRows: AXMAiAssistPickerRow[] = [];\n\n private static readonly maxChatImageBytes = 20 * 1024 * 1024;\n\n private static readonly maxChatImagesPerTurn = 20;\n\n private static readonly maxChatAudioBytes = 25 * 1024 * 1024;\n\n private static readonly maxChatAudioPerTurn = 5;\n\n /** Windows / some browsers omit `type` or use octet-stream; rely on extension when needed. */\n private static readonly chatImageNameExtPattern = /\\.(png|jpe?g|gif|webp|bmp|svg|ico|heic|heif)$/i;\n\n private static readonly chatAudioNameExtPattern = /\\.(mp3|m4a|aac|wav|webm|ogg|opus|flac)$/i;\n\n /**\n * Returns true for normal image/* types and for empty/octet-stream when the file name looks like an image.\n */\n private static isLikelyChatImageFile(file: File): boolean {\n const t = file.type?.trim() ?? '';\n if (t.startsWith('image/')) {\n return true;\n }\n if (t === 'application/octet-stream' || t === '') {\n return AXMAiChatPageComponent.chatImageNameExtPattern.test(file.name);\n }\n return false;\n }\n\n private static isLikelyChatAudioFile(file: File): boolean {\n const t = file.type?.trim() ?? '';\n if (t.startsWith('audio/')) {\n return true;\n }\n if (t === 'application/octet-stream' || t === '') {\n return AXMAiChatPageComponent.chatAudioNameExtPattern.test(file.name);\n }\n return false;\n }\n\n /** MIME for storage/API when the browser omits or misreports `file.type`. */\n private static mimeTypeForChatAttachment(file: File): string {\n const t = file.type?.trim() ?? '';\n if (t.startsWith('image/')) {\n return t;\n }\n const m = /\\.([^.]+)$/i.exec(file.name);\n const ext = (m?.[1] ?? '').toLowerCase();\n const byExt: Record<string, string> = {\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n gif: 'image/gif',\n webp: 'image/webp',\n bmp: 'image/bmp',\n svg: 'image/svg+xml',\n ico: 'image/x-icon',\n heic: 'image/heic',\n heif: 'image/heif',\n };\n return byExt[ext] ?? 'image/jpeg';\n }\n\n //#endregion\n\n //#region ---- Page title & header actions ----\n\n override async getPageTitle(): Promise<string> {\n return this.translateService.translateAsync('@ai-management:chat.title');\n }\n\n override async getPrimaryMenuItems(): Promise<AXPActionMenuItem[]> {\n const assists = this.assistPickerRows;\n const agents = this.agentPickerRows;\n if (assists.length === 0 && agents.length === 0) {\n return [];\n }\n\n const assistPx = await this.translateService.translateAsync('@ai-management:chat.picker-assist-prefix');\n const agentPx = await this.translateService.translateAsync('@ai-management:chat.picker-agent-prefix');\n const targetLabel = await this.translateService.translateAsync('@ai-management:chat.chat-target-label');\n\n const currentAgentId = this.selectedDirectAgentId()?.trim();\n const currentAssistId = this.selectedAssistId()?.trim();\n let currentTitle: string;\n if (currentAgentId) {\n currentTitle = `${agentPx} ${this.agentPickerRows.find((r) => r.id === currentAgentId)?.title ?? currentAgentId}`;\n } else if (currentAssistId) {\n currentTitle = `${assistPx} ${this.assistPickerRows.find((r) => r.id === currentAssistId)?.title ?? currentAssistId}`;\n } else {\n currentTitle = await this.translateService.translateAsync('@ai-management:chat.select-assist');\n }\n\n const assistItems: AXPActionMenuItem[] = assists.map((r) => ({\n name: `assist-${r.id}`,\n title: `${assistPx} ${r.title}`,\n icon: 'fa-user-robot',\n command: {\n name: 'ai-chat-select-assist',\n options: { assistId: r.id },\n metadata: { isSelected: !currentAgentId && r.id === currentAssistId },\n },\n }));\n\n const agentItems: AXPActionMenuItem[] = agents.map((r) => ({\n name: `agent-${r.id}`,\n title: `${agentPx} ${r.title}`,\n icon: 'fa-people-group',\n command: {\n name: 'ai-chat-select-agent',\n options: { agentId: r.id },\n metadata: { isSelected: r.id === currentAgentId },\n },\n }));\n\n return [\n {\n name: 'ai-chat-target-picker',\n title: `${targetLabel}: ${currentTitle}`,\n icon: 'fa-comments',\n items: [...assistItems, ...agentItems],\n },\n ];\n }\n\n override async execute(command: AXPExecuteCommand): Promise<void> {\n if (command.name === 'ai-chat-select-assist') {\n const raw = command.options?.['assistId'];\n const id = typeof raw === 'string' ? raw.trim() : '';\n if (id) {\n await this.onAssistPicked(id);\n }\n return;\n }\n if (command.name === 'ai-chat-select-agent') {\n const raw = command.options?.['agentId'];\n const id = typeof raw === 'string' ? raw.trim() : '';\n if (id) {\n await this.onAgentPicked(id);\n }\n return;\n }\n await super.execute(command);\n }\n\n //#endregion\n\n //#region ---- Lifecycle ----\n\n constructor() {\n super();\n this.updateLayoutDirection();\n this.translateService.langChanges$.subscribe(() => {\n this.updateLayoutDirection();\n });\n }\n\n override async ngOnInit(): Promise<void> {\n await super.ngOnInit();\n await this.loadAssistPickerRowsFromManager();\n await this.loadAgentPickerRowsFromManager();\n\n const qp = this.route.snapshot.queryParamMap;\n const agentFromQuery = qp.get('agentId')?.trim();\n const assistFromQuery = (qp.get('assistId') ?? qp.get('assist'))?.trim();\n\n if (agentFromQuery && this.agentPickerRows.some((r) => r.id === agentFromQuery)) {\n this.selectedDirectAgentId.set(agentFromQuery);\n this.selectedAssistId.set(undefined);\n } else if (assistFromQuery && this.assistPickerRows.some((r) => r.id === assistFromQuery)) {\n this.selectedAssistId.set(assistFromQuery);\n this.selectedDirectAgentId.set(undefined);\n } else {\n this.selectedDirectAgentId.set(undefined);\n if (assistFromQuery || agentFromQuery) {\n this.selectedAssistId.set(undefined);\n }\n if (!this.selectedAssistId()?.trim() && !this.selectedDirectAgentId()?.trim()) {\n const fallback = await this.aiManager.getAssistForChat(undefined);\n this.selectedAssistId.set(fallback.id);\n }\n }\n\n await this.loadEffectiveAssistForChat();\n this.seedInitialMessagesFromEffectiveAssist();\n await this.loadModels();\n this.recompute();\n }\n\n //#endregion\n\n //#region ---- UI Handlers ----\n\n /**\n * Parses assistant text: <redacted_thinking> for collapsible UI, remaining body for the main reply.\n */\n parseAssistantMessageForDisplay(raw: string | null | undefined): AssistantParsedContent {\n return parseAssistantContentForDisplay(raw);\n }\n\n /**\n * True when the tool name is a supervisor delegated agent (`agent:<catalogId>`).\n */\n protected isDelegatedAgentToolCall(toolName: string): boolean {\n return axpAiParseSupervisorAgentToolName(toolName) != null;\n }\n\n /**\n * Mini-chat UI for delegated agents applies only in assist (supervisor) mode.\n */\n protected showDelegatedAgentMiniChat(toolName: string): boolean {\n return this.isDelegatedAgentToolCall(toolName) && this.threadUsesAssistLayout();\n }\n\n /**\n * Parses JSON tool-result bodies returned by delegated agent execution (`data.agentName`, `answer`).\n */\n protected parseDelegatedAgentToolResult(content: string): AXMAiDelegatedAgentToolParsed {\n const trimmed = content?.trim() ?? '';\n if (!trimmed) {\n return {};\n }\n try {\n const o = JSON.parse(trimmed) as Record<string, unknown>;\n if (typeof o['success'] === 'boolean' && o['success'] === false) {\n const errRaw = o['error'];\n const err =\n typeof errRaw === 'string' && errRaw.trim()\n ? errRaw.trim()\n : 'Request failed.';\n return { error: err };\n }\n if (o['success'] !== true || !o['data'] || typeof o['data'] !== 'object' || Array.isArray(o['data'])) {\n return {};\n }\n const d = o['data'] as Record<string, unknown>;\n const agentName =\n typeof d['agentName'] === 'string' && d['agentName'].trim() ? d['agentName'].trim() : undefined;\n const answerRaw = typeof d['answer'] === 'string' ? d['answer'] : undefined;\n const answer = answerRaw?.trim() ? answerRaw : undefined;\n return {\n ...(agentName ? { agentName } : {}),\n ...(answer ? { answer } : {}),\n };\n } catch {\n return {};\n }\n }\n\n /**\n * Human-readable specialist prompt from delegated-agent tool arguments (for mini-chat UI).\n */\n protected getAgentDelegatedPromptPreview(argumentsValue: unknown): string {\n const obj = this.normalizeDelegatedAgentToolArgs(argumentsValue);\n if (!obj) {\n return this.formatToolArguments(argumentsValue);\n }\n const preferKeys = ['query', 'task', 'prompt', 'message', 'userMessage', 'instruction', 'goal'] as const;\n for (const k of preferKeys) {\n const v = obj[k];\n if (typeof v === 'string' && v.trim()) {\n return v.trim();\n }\n }\n const keys = Object.keys(obj);\n if (keys.length === 1) {\n const only = obj[keys[0]!];\n if (typeof only === 'string' && only.trim()) {\n return only.trim();\n }\n }\n try {\n return JSON.stringify(obj, null, 2);\n } catch {\n return this.formatToolArguments(argumentsValue);\n }\n }\n\n private normalizeDelegatedAgentToolArgs(argumentsValue: unknown): Record<string, unknown> | null {\n if (argumentsValue == null) {\n return null;\n }\n if (typeof argumentsValue === 'object' && !Array.isArray(argumentsValue)) {\n return { ...(argumentsValue as Record<string, unknown>) };\n }\n if (typeof argumentsValue === 'string') {\n const t = argumentsValue.trim();\n if (!t) {\n return null;\n }\n try {\n const p = JSON.parse(t) as unknown;\n if (p != null && typeof p === 'object' && !Array.isArray(p)) {\n return p as Record<string, unknown>;\n }\n } catch {\n return null;\n }\n }\n return null;\n }\n\n /**\n * Plain `text` payload for templates (user / assistant transcripts).\n */\n protected chatMessageText(message: AXPAiChatMessage): string {\n return axpAiChatMessageGetText(message);\n }\n\n /**\n * User bubble uses the muted “attachment” style when every segment is image and/or audio (no text).\n */\n protected userMessageAttachmentOnlyBubble(message: AXPAiChatMessage): boolean {\n return (\n message.role === 'user' &&\n message.responses.length > 0 &&\n message.responses.every(\n (r: AXPAiChatResponse) => r.type === 'image' || r.type === 'audio',\n )\n );\n }\n\n /**\n * Concatenates preamble assistant text lines for a tool-turn header block.\n */\n protected toolTurnPreamblePlain(item: AXMAiChatToolTurnItem): string {\n return item.preambleMessages.map((m) => axpAiChatMessageGetText(m)).join('\\n').trim();\n }\n\n /**\n * Layout node for assistant `node` responses when the payload matches {@link AXPWidgetNode}.\n */\n protected asAssistantLayoutNode(message: AXPAiChatMessage): AXPWidgetNode | null {\n if (message.role !== 'assistant') {\n return null;\n }\n const nodeSeg = message.responses.find((r: AXPAiChatResponse) => r.type === 'node');\n if (!nodeSeg || nodeSeg.type !== 'node') {\n return null;\n }\n const c = nodeSeg.content;\n if (\n c != null &&\n typeof c === 'object' &&\n !Array.isArray(c) &&\n typeof (c as Record<string, unknown>)['type'] === 'string'\n ) {\n return c as AXPWidgetNode;\n }\n return null;\n }\n\n /**\n * Parses `AiManagement:ChatGenerateImage` tool output for inline image preview.\n * Prefers persisted `fileId` (resolved via file storage); falls back to legacy `imageUrl`.\n */\n /**\n * Parses `AiManagement:ChatSynthesizeSpeech` tool output for inline audio playback.\n */\n getSynthesizeSpeechPreview(\n pair: AXMAiChatToolCallPair,\n ): { fileId?: string; mimeType: string; title: string } | null {\n if (pair.call.name !== AIMANAGEMENT_CHAT_SYNTHESIZE_SPEECH_COMMAND_KEY) {\n return null;\n }\n const raw = pair.outputContent?.trim();\n if (!raw) {\n return null;\n }\n try {\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n if (parsed['success'] !== true || !parsed['data'] || typeof parsed['data'] !== 'object') {\n return null;\n }\n const data = parsed['data'] as Record<string, unknown>;\n const fileId = typeof data['fileId'] === 'string' ? data['fileId'].trim() : '';\n const text = typeof data['text'] === 'string' ? data['text'].trim() : '';\n const mimeType =\n typeof data['mimeType'] === 'string' && data['mimeType'].trim()\n ? data['mimeType'].trim()\n : 'audio/mpeg';\n const title = text ? (text.length > 80 ? `${text.slice(0, 80)}…` : text) : 'Generated speech';\n if (fileId) {\n return { fileId, mimeType, title };\n }\n return null;\n } catch {\n return null;\n }\n }\n\n getGenerateImagePreview(\n pair: AXMAiChatToolCallPair,\n ): { fileId?: string; imageUrl?: string; alt: string } | null {\n if (pair.call.name !== AIMANAGEMENT_CHAT_GENERATE_IMAGE_COMMAND_KEY) {\n return null;\n }\n const raw = pair.outputContent?.trim();\n if (!raw) {\n return null;\n }\n try {\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n if (parsed['success'] !== true || !parsed['data'] || typeof parsed['data'] !== 'object') {\n return null;\n }\n const data = parsed['data'] as Record<string, unknown>;\n const fileId = typeof data['fileId'] === 'string' ? data['fileId'].trim() : '';\n const imageUrl = typeof data['imageUrl'] === 'string' ? data['imageUrl'].trim() : '';\n const prompt = typeof data['prompt'] === 'string' ? data['prompt'].trim() : '';\n const alt = prompt || 'Generated image';\n if (fileId) {\n return { fileId, alt };\n }\n if (imageUrl) {\n return { imageUrl, alt };\n }\n return null;\n } catch {\n return null;\n }\n }\n\n /**\n * Pretty-prints tool arguments for the tool I/O panel.\n */\n formatToolArguments(argumentsValue: unknown): string {\n if (argumentsValue === undefined || argumentsValue === null) {\n return '';\n }\n if (typeof argumentsValue === 'string') {\n return this.formatJsonStringIfPossible(argumentsValue);\n }\n try {\n return JSON.stringify(argumentsValue, null, 2);\n } catch {\n return String(argumentsValue);\n }\n }\n\n /**\n * Pretty-prints tool result JSON when valid; otherwise returns raw text.\n */\n formatToolResultBody(content: string): string {\n return this.formatJsonStringIfPossible(content);\n }\n\n /**\n * Short label for a standalone tool message (e.g. grouping failed).\n */\n formatToolMessageSummary(message: AXPAiChatMessage): string {\n const tr = message.responses.find(\n (r: AXPAiChatResponse) => r.type === 'tool_result' || r.type === 'agent_result',\n );\n if (message.role !== 'tool' || !tr) {\n return message.name?.trim() || message.role;\n }\n const label = message.name?.trim() || 'tool';\n const raw = axpAiChatToolOrAgentResultBodyJson(message);\n if (!raw) {\n return label;\n }\n try {\n const parsed = JSON.parse(raw) as { success?: boolean };\n if (typeof parsed.success === 'boolean') {\n return parsed.success ? `${label} · ok` : `${label} · failed`;\n }\n } catch {\n // Not JSON — show compact raw fragment\n }\n return raw.length > 100 ? `${label} · ${raw.slice(0, 100)}…` : `${label} · ${raw}`;\n }\n\n private formatJsonStringIfPossible(raw: string): string {\n const trimmed = raw.trim();\n if (!trimmed) {\n return '';\n }\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n return JSON.stringify(parsed, null, 2);\n } catch {\n return raw;\n }\n }\n\n /**\n * Unique `callId`s from `agent_result` lines in the transcript (supervisor delegates).\n */\n private collectAgentResultCallIds(messages: AXPAiChatMessage[]): string[] {\n const ids: string[] = [];\n for (const m of messages) {\n if (m.role !== 'tool') {\n continue;\n }\n const ar = m.responses.find((x: AXPAiChatResponse) => x.type === 'agent_result');\n if (ar && ar.type === 'agent_result' && ar.callId.trim()) {\n ids.push(ar.callId.trim());\n }\n }\n return [...new Set(ids)];\n }\n\n /**\n * Resolves display name for a delegate from the slim `agent_result` row when the in-memory store has no title.\n */\n private resolveAgentDisplayNameFromTranscript(\n messages: AXPAiChatMessage[],\n callId: string,\n ): string | null {\n const id = callId.trim();\n if (!id) {\n return null;\n }\n for (const m of messages) {\n if (m.role !== 'tool') {\n continue;\n }\n const ar = m.responses.find((x: AXPAiChatResponse) => x.type === 'agent_result');\n if (!ar || ar.type !== 'agent_result' || ar.callId.trim() !== id) {\n continue;\n }\n const name = ar.content.data?.agentName?.trim();\n return name || null;\n }\n return null;\n }\n\n private updateLayoutDirection(): void {\n const language = this.translateService.getActiveLang();\n this.layoutDirection.set(language?.startsWith('fa') || language?.startsWith('ar') ? 'rtl' : 'ltr');\n }\n\n onComposerValueChanged(e: AXValueChangedEvent): void {\n if (!e.isUserInteraction) {\n return;\n }\n this.input.set(String(e.value ?? ''));\n }\n\n /**\n * Opens the system file picker via {@link AXFileService.choose} (same as file-uploader “upload from computer”).\n */\n openChatImagePicker(): void {\n void this.pickComposerChatImages();\n }\n\n openChatAudioPicker(): void {\n void this.pickComposerChatAudios();\n }\n\n /**\n * Resolves picked files then stages previews and persists via {@link AXPFileStorageService} (like platform file-uploader → storage).\n */\n private async pickComposerChatImages(): Promise<void> {\n if (!isPlatformBrowser(this.platformId)) {\n this.logChatComposerImage('choose-skip', { reason: 'not-browser' });\n return;\n }\n if (this.isBusy() || this.isComposerSaving()) {\n this.logChatComposerImage('choose-skip', {\n reason: 'busy',\n isBusy: this.isBusy(),\n isComposerSaving: this.isComposerSaving(),\n });\n return;\n }\n this.logChatComposerImage('choose-start');\n try {\n const files = await this.fileService.choose({\n multiple: true,\n accept: 'image/*',\n });\n this.logChatComposerImage('choose-result', {\n count: files.length,\n files: files.map((f) => ({\n name: f.name,\n type: f.type || '(empty)',\n size: f.size,\n })),\n });\n if (files.length === 0) {\n return;\n }\n await this.processComposerChatImageFiles(files);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n this.logChatComposerImage('choose-error', { error: msg });\n }\n }\n\n /**\n * Debug logging for composer image flow. Filter DevTools console by: AI Chat composer image\n */\n private logChatComposerImage(event: string, data?: Record<string, unknown>): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n if (data && Object.keys(data).length > 0) {\n console.log(`[AI Chat composer image] ${event}`, data);\n } else {\n console.log(`[AI Chat composer image] ${event}`);\n }\n }\n\n /**\n * Shows a non-blocking warning toast for composer upload validation (translations load asynchronously).\n */\n private showComposerUploadWarning(translationKey: string): void {\n void (async (): Promise<void> => {\n const errTitle = await this.translateService.translateAsync('@general:messages.error.title');\n const content = await this.translateService.translateAsync(translationKey);\n await this.toastService.show({ color: 'warning', title: errTitle, content });\n })();\n }\n\n /**\n * Stages images above the composer: instant `URL` previews, then persists to file storage.\n * Images are appended to the thread on send only.\n */\n private async processComposerChatImageFiles(files: File[]): Promise<void> {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n let groupId = this.draftAttachmentGroupId();\n if (!groupId?.trim()) {\n groupId = globalThis.crypto.randomUUID();\n this.draftAttachmentGroupId.set(groupId);\n }\n const gid = groupId.trim();\n\n const existing = this.draftComposerImages().length;\n if (existing + files.length > AXMAiChatPageComponent.maxChatImagesPerTurn) {\n this.logChatComposerImage('validation-fail', { reason: 'too-many', existing, adding: files.length });\n this.showComposerUploadWarning('@ai-management:chat.upload-too-many');\n return;\n }\n\n const newSlots: AXMAiComposerDraftImage[] = [];\n const filesForPersist: File[] = [];\n\n for (const file of files) {\n if (!AXMAiChatPageComponent.isLikelyChatImageFile(file)) {\n this.logChatComposerImage('validation-fail', {\n reason: 'invalid-type',\n name: file.name,\n type: file.type || '(empty)',\n });\n this.showComposerUploadWarning('@ai-management:chat.upload-invalid-type');\n return;\n }\n if (file.size > AXMAiChatPageComponent.maxChatImageBytes) {\n this.logChatComposerImage('validation-fail', {\n reason: 'too-large',\n name: file.name,\n size: file.size,\n max: AXMAiChatPageComponent.maxChatImageBytes,\n });\n this.showComposerUploadWarning('@ai-management:chat.upload-too-large');\n return;\n }\n const mimeType = AXMAiChatPageComponent.mimeTypeForChatAttachment(file);\n const fileForStorage =\n file.type.trim().startsWith('image/') && file.type.trim().length > 0\n ? file\n : new File([file], file.name, { type: mimeType });\n newSlots.push({\n clientId: globalThis.crypto.randomUUID(),\n previewUrl: URL.createObjectURL(file),\n mimeType,\n name: file.name,\n });\n filesForPersist.push(fileForStorage);\n }\n\n this.draftComposerImages.update((prev) => [...prev, ...newSlots]);\n this.logChatComposerImage('draft-staged', {\n newSlots: newSlots.length,\n totalDraft: this.draftComposerImages().length,\n attachmentRefId: gid,\n });\n\n this.isComposerSaving.set(true);\n this.logChatComposerImage('persist-start', { files: filesForPersist.length });\n try {\n for (let i = 0; i < filesForPersist.length; i++) {\n const file = filesForPersist[i];\n const clientId = newSlots[i].clientId;\n try {\n const { fileId } = await persistAiChatAttachmentImage(this.fileStorage, file, gid);\n this.logChatComposerImage('persist-file-ok', {\n index: i,\n clientId,\n fileId: fileId?.slice(0, 8) + '…',\n name: file.name,\n });\n this.draftComposerImages.update((prev) =>\n prev.map((s) => (s.clientId === clientId ? { ...s, fileId } : s)),\n );\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n this.logChatComposerImage('persist-file-error', {\n index: i,\n clientId,\n name: file.name,\n error: msg,\n });\n this.draftComposerImages.update((prev) => {\n const slot = prev.find((s) => s.clientId === clientId);\n if (slot) {\n URL.revokeObjectURL(slot.previewUrl);\n }\n return prev.filter((s) => s.clientId !== clientId);\n });\n if (this.draftComposerImages().length === 0) {\n this.draftAttachmentGroupId.set(null);\n }\n const errTitle = await this.translateService.translateAsync('@general:messages.error.title');\n const uploadFailed = await this.translateService.translateAsync('@ai-management:chat.upload-error');\n await this.toastService.show({\n color: 'danger',\n title: errTitle,\n content: `${uploadFailed} ${msg}`,\n });\n return;\n }\n }\n this.logChatComposerImage('persist-all-done');\n } finally {\n this.isComposerSaving.set(false);\n this.logChatComposerImage('persist-finally', {\n isComposerSaving: false,\n draftCount: this.draftComposerImages().length,\n });\n }\n }\n\n private async pickComposerChatAudios(): Promise<void> {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n if (this.isBusy() || this.isComposerSaving()) {\n return;\n }\n try {\n const files = await this.fileService.choose({\n multiple: true,\n accept: 'audio/*',\n });\n if (files.length === 0) {\n return;\n }\n await this.processComposerChatAudioFiles(files);\n } catch {\n /* user cancelled or picker error */\n }\n }\n\n private async processComposerChatAudioFiles(files: File[]): Promise<void> {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n let groupId = this.draftAttachmentGroupId();\n if (!groupId?.trim()) {\n groupId = globalThis.crypto.randomUUID();\n this.draftAttachmentGroupId.set(groupId);\n }\n const gid = groupId.trim();\n\n const existing = this.draftComposerAudios().length;\n if (existing + files.length > AXMAiChatPageComponent.maxChatAudioPerTurn) {\n this.showComposerUploadWarning('@ai-management:chat.upload-audio-too-many');\n return;\n }\n\n const newSlots: AXMAiComposerDraftAudio[] = [];\n const filesForPersist: File[] = [];\n\n for (const file of files) {\n if (!AXMAiChatPageComponent.isLikelyChatAudioFile(file)) {\n this.showComposerUploadWarning('@ai-management:chat.upload-audio-invalid-type');\n return;\n }\n if (file.size > AXMAiChatPageComponent.maxChatAudioBytes) {\n this.showComposerUploadWarning('@ai-management:chat.upload-audio-too-large');\n return;\n }\n const mimeType = AXMAiChatPageComponent.mimeTypeForChatAttachment(file);\n const fileForStorage =\n file.type.trim().startsWith('audio/') && file.type.trim().length > 0\n ? file\n : new File([file], file.name, { type: mimeType });\n newSlots.push({\n clientId: globalThis.crypto.randomUUID(),\n mimeType,\n name: file.name,\n });\n filesForPersist.push(fileForStorage);\n }\n\n this.draftComposerAudios.update((prev) => [...prev, ...newSlots]);\n\n this.isComposerSaving.set(true);\n try {\n for (let i = 0; i < filesForPersist.length; i++) {\n const file = filesForPersist[i];\n const clientId = newSlots[i].clientId;\n try {\n const { fileId } = await persistAiChatAttachmentImage(this.fileStorage, file, gid);\n this.draftComposerAudios.update((prev) =>\n prev.map((s) => (s.clientId === clientId ? { ...s, fileId } : s)),\n );\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n this.draftComposerAudios.update((prev) => prev.filter((s) => s.clientId !== clientId));\n if (this.draftComposerAudios().length === 0 && this.draftComposerImages().length === 0) {\n this.draftAttachmentGroupId.set(null);\n }\n const errTitle = await this.translateService.translateAsync('@general:messages.error.title');\n const uploadFailed = await this.translateService.translateAsync('@ai-management:chat.upload-audio-error');\n await this.toastService.show({\n color: 'danger',\n title: errTitle,\n content: `${uploadFailed} ${msg}`,\n });\n return;\n }\n }\n } finally {\n this.isComposerSaving.set(false);\n }\n }\n\n /**\n * Removes one staged image from the composer and revokes its object URL.\n */\n removeDraftImage(clientId: string): void {\n const id = clientId.trim();\n if (!id) {\n return;\n }\n this.draftComposerImages.update((prev) => {\n const slot = prev.find((s) => s.clientId === id);\n if (slot) {\n URL.revokeObjectURL(slot.previewUrl);\n }\n const next = prev.filter((s) => s.clientId !== id);\n if (next.length === 0 && this.draftComposerAudios().length === 0) {\n this.draftAttachmentGroupId.set(null);\n }\n return next;\n });\n }\n\n removeDraftAudio(clientId: string): void {\n const id = clientId.trim();\n if (!id) {\n return;\n }\n this.draftComposerAudios.update((prev) => {\n const next = prev.filter((s) => s.clientId !== id);\n if (next.length === 0 && this.draftComposerImages().length === 0) {\n this.draftAttachmentGroupId.set(null);\n }\n return next;\n });\n }\n\n /**\n * Revokes blob URLs and clears composer draft state (assist switch, etc.).\n */\n private clearComposerDraftState(): void {\n for (const s of this.draftComposerImages()) {\n URL.revokeObjectURL(s.previewUrl);\n }\n this.draftComposerImages.set([]);\n this.draftComposerAudios.set([]);\n this.draftAttachmentGroupId.set(null);\n this.isComposerSaving.set(false);\n }\n\n /**\n * Opens a read-only JSON viewer with the full transcript ({@link messages}) for debugging.\n */\n async openMessagesLogDialog(): Promise<void> {\n const dialogTitle = await this.translateService.translateAsync(\n '@ai-management:chat.messages-log-dialog-title',\n );\n const mainTranscriptLabel = await this.translateService.translateAsync(\n '@ai-management:chat.messages-log-main-transcript',\n );\n const delegatedMissing = await this.translateService.translateAsync(\n '@ai-management:chat.messages-log-delegated-missing',\n );\n\n const transcript = this.fullTranscriptMessages();\n const displayTranscript = this.cloneMessagesForJsonViewer(transcript);\n\n const callIds = this.collectAgentResultCallIds(transcript);\n const delegatedRuns: { agentTitle: string; messages: unknown }[] = [];\n for (const callId of callIds) {\n const entry = this.delegatedTranscriptsByCallId()[callId];\n const name =\n entry?.agentName?.trim() ||\n this.resolveAgentDisplayNameFromTranscript(transcript, callId) ||\n callId;\n delegatedRuns.push({\n agentTitle: name,\n messages: entry\n ? this.cloneMessagesForJsonViewer(entry.messages)\n : { note: delegatedMissing },\n });\n }\n\n const dialogRef = await this.layoutBuilder\n .create()\n .dialog((dialog) => {\n dialog\n .setTitle(dialogTitle)\n .setSize('lg')\n .setCloseButton(true)\n .setContext({\n value: {\n transcript: displayTranscript,\n delegatedRuns,\n },\n })\n .content((layoutBuilder) => {\n layoutBuilder.flex((flex) => {\n flex.mode('view').setOptions({\n flexDirection: 'column',\n gap: '12px',\n maxHeight: '75vh',\n overflowY: 'auto',\n });\n flex.formField(mainTranscriptLabel, (field) => {\n // Form-field `customWidget` does not accept a widget delegate; set path on the field so the child binds to context.\n field.path('value.transcript');\n field.customWidget('json-viewer');\n });\n delegatedRuns.forEach((run, i) => {\n flex.formField(run.agentTitle, (field) => {\n field.path(`value.delegatedRuns.${i}.messages`);\n field.customWidget('json-viewer');\n });\n });\n });\n })\n .setActions((actions) => {\n actions.cancel('@general:actions.close.title');\n });\n })\n .show();\n\n if (dialogRef.action() === 'cancel') {\n dialogRef.close();\n }\n }\n\n /**\n * Opens a read-only view of the specialist sub-run transcript for one delegated agent tool call\n * (same in-memory cache as Logs / JSON export).\n */\n protected async openDelegatedAgentTranscriptDialog(\n callIdRaw: string,\n toolName: string,\n resolvedAgentLabel?: string,\n ): Promise<void> {\n const callId = callIdRaw?.trim() ?? '';\n if (!callId) {\n return;\n }\n const entry = this.delegatedTranscriptsByCallId()[callId];\n const catalogId = axpAiParseSupervisorAgentToolName(toolName);\n const catalogTitle =\n catalogId != null\n ? this.agentPickerRows.find((r) => r.id === catalogId)?.title?.trim()\n : undefined;\n const titleBase =\n resolvedAgentLabel?.trim() || entry?.agentName?.trim() || catalogTitle || toolName;\n const suffix = await this.translateService.translateAsync(\n '@ai-management:chat.delegated-agent-transcript-suffix',\n );\n const missing = await this.translateService.translateAsync(\n '@ai-management:chat.messages-log-delegated-missing',\n );\n const comp = (await import('./ai-delegated-agent-transcript-popup.component'))\n .AXMAiDelegatedAgentTranscriptPopupComponent;\n await this.popupService.open(comp, {\n title: `${titleBase} — ${suffix}`,\n size: 'lg',\n data: {\n messages: entry?.messages ?? [],\n emptyHint: entry?.messages?.length ? undefined : missing,\n },\n });\n }\n\n /**\n * Deep-clones chat messages into plain JSON data for {@link openMessagesLogDialog}.\n */\n private cloneMessagesForJsonViewer(messages: AXPAiChatMessage[]): unknown {\n try {\n return structuredClone(messages);\n } catch {\n return JSON.parse(JSON.stringify(messages)) as unknown;\n }\n }\n\n /**\n * Downloads the current transcript as a pretty-printed JSON file (browser only).\n */\n downloadMessagesJson(): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n const data = this.cloneMessagesForJsonViewer(this.fullTranscriptMessages());\n const json = JSON.stringify(data, null, 2);\n const blob = new Blob([json], { 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 = this.buildChatTranscriptFilename();\n anchor.click();\n URL.revokeObjectURL(url);\n }\n\n private buildChatTranscriptFilename(): string {\n const stamp = new Date().toISOString().replace(/[:.]/g, '-');\n return `ai-chat-messages-${stamp}.json`;\n }\n\n /**\n * Opens a layout-builder dialog to edit tool arguments and runs the same command or query\n * directly via {@link AXPCommandService} / {@link AXPQueryService}.\n */\n async openToolExecuteDialog(call: AXPAiToolCall): Promise<void> {\n await this.chatToolExecute.openToolExecuteDialog(call);\n }\n\n async send(): Promise<void> {\n if (!this.canSend() || this.isBusy()) {\n return;\n }\n\n const text = this.input().trim();\n const gid = this.draftAttachmentGroupId()?.trim();\n const draftImg = this.draftComposerImages();\n const draftAud = this.draftComposerAudios();\n\n let nextMessages: AXPAiChatMessage[];\n\n if (gid && (draftImg.length > 0 || draftAud.length > 0)) {\n for (const s of draftImg) {\n const fid = s.fileId?.trim();\n if (!fid) {\n const errTitle = await this.translateService.translateAsync('@general:messages.error.title');\n const msg = await this.translateService.translateAsync('@ai-management:chat.images-still-saving');\n await this.toastService.show({ color: 'warning', title: errTitle, content: msg });\n return;\n }\n }\n for (const s of draftAud) {\n const fid = s.fileId?.trim();\n if (!fid) {\n const errTitle = await this.translateService.translateAsync('@general:messages.error.title');\n const msg = await this.translateService.translateAsync('@ai-management:chat.audio-still-saving');\n await this.toastService.show({ color: 'warning', title: errTitle, content: msg });\n return;\n }\n }\n const responses: AXPAiChatResponse[] = [\n ...draftImg.map((s) => ({\n type: 'image' as const,\n content: {\n fileId: s.fileId!.trim(),\n mimeType: s.mimeType.trim() || 'application/octet-stream',\n ...(s.name?.trim() ? { name: s.name.trim() } : {}),\n },\n })),\n ...draftAud.map((s) => ({\n type: 'audio' as const,\n content: {\n fileId: s.fileId!.trim(),\n mimeType: s.mimeType.trim() || 'application/octet-stream',\n ...(s.name?.trim() ? { name: s.name.trim() } : {}),\n },\n })),\n ];\n if (text) {\n responses.push({ type: 'text', content: text });\n }\n nextMessages = [...this.messages(), axpAiChatUserMessage(responses)];\n } else if (text) {\n nextMessages = [...this.messages(), axpAiChatTextMessage('user', text)];\n } else {\n return;\n }\n\n this.clearComposerDraftState();\n this.input.set('');\n await this.runAgentWithMessages(nextMessages);\n }\n\n private async runAgentWithMessages(nextMessages: AXPAiChatMessage[]): Promise<void> {\n this.messages.set(nextMessages);\n this.isBusy.set(true);\n this.lastUsageTotals.set(null);\n this.streamingAssistantPreview.set('');\n this.liveToolCalls.set([]);\n this.delegatedNestedLiveToolCalls.set(new Map());\n this.delegatedNestedStreamingPreview.set(new Map());\n this.delegatedAgentReflectionLoading.set(false);\n\n try {\n const platformRuntimeContext = await this.platformRuntimeContextBuilder.build();\n const directAgentId = this.selectedDirectAgentId()?.trim();\n const assistId = this.selectedAssistId()?.trim();\n const result = await this.aiManager.run({\n messages: nextMessages,\n platformRuntimeContext,\n ...(directAgentId ? { directAgentId } : assistId ? { assistId } : {}),\n onAssistantStreamReset: () => {\n this.streamingAssistantPreview.set('');\n },\n onAssistantStreamDelta: (delta: string) => {\n this.streamingAssistantPreview.update((prev) => prev + delta);\n },\n onToolCallStart: (call: AXPAiToolCall) => {\n this.liveToolCalls.update((prev) => [...prev, { call, state: 'running' }]);\n },\n onToolCallEnd: (call: AXPAiToolCall, resultMessage: AXPAiChatMessage) => {\n this.liveToolCalls.update((prev) =>\n prev.map((t) =>\n t.call.id === call.id\n ? {\n ...t,\n state: 'done' as const,\n resultContent: axpAiChatToolOrAgentResultBodyJson(resultMessage),\n }\n : t,\n ),\n );\n },\n onDelegatedAgentNestedToolCallStart: (ctx: AXPAiDelegatedNestedToolCallContext, call: AXPAiToolCall) => {\n this.pushDelegatedNestedLiveTool(ctx, call);\n },\n onDelegatedAgentNestedToolCallEnd: (\n ctx: AXPAiDelegatedNestedToolCallContext,\n call: AXPAiToolCall,\n resultMessage: AXPAiChatMessage,\n ) => {\n this.completeDelegatedNestedLiveTool(ctx, call, resultMessage);\n },\n onDelegatedAgentNestedStreamReset: (ctx: AXPAiDelegatedNestedToolCallContext) => {\n this.resetDelegatedNestedStreamingPreview(ctx);\n },\n onDelegatedAgentNestedStreamDelta: (ctx: AXPAiDelegatedNestedToolCallContext, delta: string) => {\n this.appendDelegatedNestedStreamingPreview(ctx, delta);\n },\n onDelegatedAgentReflectionPhase: (active: boolean) => {\n this.delegatedAgentReflectionLoading.set(active);\n },\n });\n this.messages.set(result.messages);\n this.lastUsageTotals.set(result.usageTotals ?? null);\n if (result.delegatedTranscriptsByCallId && Object.keys(result.delegatedTranscriptsByCallId).length > 0) {\n this.delegatedTranscriptsByCallId.update((prev) => ({\n ...prev,\n ...result.delegatedTranscriptsByCallId,\n }));\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n this.messages.set([...this.messages(), axpAiChatTextMessage('assistant', message)]);\n } finally {\n this.streamingAssistantPreview.set('');\n this.liveToolCalls.set([]);\n this.delegatedNestedLiveToolCalls.set(new Map());\n this.delegatedNestedStreamingPreview.set(new Map());\n this.delegatedAgentReflectionLoading.set(false);\n this.isBusy.set(false);\n }\n }\n\n /**\n * Streaming assistant text for one delegation id (delegated agent sub-run).\n */\n protected nestedDelegatedStreamingPreviewFor(delegationCallId: string): string {\n const id = delegationCallId?.trim();\n if (!id) {\n return '';\n }\n return this.delegatedNestedStreamingPreview().get(id) ?? '';\n }\n\n private resetDelegatedNestedStreamingPreview(ctx: AXPAiDelegatedNestedToolCallContext): void {\n const id = ctx.delegationCallId?.trim();\n if (!id) {\n return;\n }\n this.delegatedNestedStreamingPreview.update((m) => {\n const next = new Map(m);\n next.set(id, '');\n return next;\n });\n }\n\n private appendDelegatedNestedStreamingPreview(ctx: AXPAiDelegatedNestedToolCallContext, delta: string): void {\n const id = ctx.delegationCallId?.trim();\n if (!id) {\n return;\n }\n this.delegatedNestedStreamingPreview.update((m) => {\n const next = new Map(m);\n const prev = next.get(id) ?? '';\n next.set(id, prev + delta);\n return next;\n });\n }\n\n /**\n * Live nested tools for a supervisor `agent:*` tool_call id (delegation collapse).\n */\n protected nestedDelegatedLiveToolCallsFor(delegationCallId: string): AXMAiLiveToolCallStatus[] {\n const id = delegationCallId?.trim();\n if (!id) {\n return [];\n }\n return this.delegatedNestedLiveToolCalls().get(id) ?? [];\n }\n\n private pushDelegatedNestedLiveTool(ctx: AXPAiDelegatedNestedToolCallContext, call: AXPAiToolCall): void {\n const id = ctx.delegationCallId?.trim();\n if (!id) {\n return;\n }\n this.delegatedNestedLiveToolCalls.update((m) => {\n const next = new Map(m);\n const prev = next.get(id) ?? [];\n next.set(id, [...prev, { call, state: 'running' }]);\n return next;\n });\n }\n\n private completeDelegatedNestedLiveTool(\n ctx: AXPAiDelegatedNestedToolCallContext,\n call: AXPAiToolCall,\n resultMessage: AXPAiChatMessage,\n ): void {\n const id = ctx.delegationCallId?.trim();\n if (!id) {\n return;\n }\n const resultContent = axpAiChatToolOrAgentResultBodyJson(resultMessage);\n this.delegatedNestedLiveToolCalls.update((m) => {\n const next = new Map(m);\n const prev = next.get(id) ?? [];\n next.set(\n id,\n prev.map((t) =>\n t.call.id === call.id ? { ...t, state: 'done' as const, resultContent } : t,\n ),\n );\n return next;\n });\n }\n\n //#endregion\n\n //#region ---- Assist & models ----\n\n private async loadAssistPickerRowsFromManager(): Promise<void> {\n this.assistPickerRows = await this.aiManager.listAssistPickerRows();\n }\n\n private async loadAgentPickerRowsFromManager(): Promise<void> {\n this.agentPickerRows = await this.aiManager.listAgentPickerRows();\n }\n\n private async onAssistPicked(assistId: string): Promise<void> {\n if (this.selectedAssistId() === assistId && !this.selectedDirectAgentId()?.trim()) {\n return;\n }\n this.selectedDirectAgentId.set(undefined);\n this.selectedAssistId.set(assistId);\n this.messages.set([]);\n this.assistBootstrapMessages.set([]);\n this.selectedModelId.set(undefined);\n this.lastUsageTotals.set(null);\n this.delegatedTranscriptsByCallId.set({});\n this.clearComposerDraftState();\n await this.router.navigate([], {\n relativeTo: this.route,\n queryParams: { assistId, assist: null, agentId: null },\n queryParamsHandling: 'merge',\n replaceUrl: true,\n });\n await this.loadEffectiveAssistForChat();\n this.seedInitialMessagesFromEffectiveAssist();\n await this.loadModels();\n this.recompute();\n }\n\n private async onAgentPicked(agentId: string): Promise<void> {\n if (this.selectedDirectAgentId() === agentId) {\n return;\n }\n this.selectedAssistId.set(undefined);\n this.selectedDirectAgentId.set(agentId);\n this.messages.set([]);\n this.assistBootstrapMessages.set([]);\n this.selectedModelId.set(undefined);\n this.lastUsageTotals.set(null);\n this.delegatedTranscriptsByCallId.set({});\n this.clearComposerDraftState();\n await this.router.navigate([], {\n relativeTo: this.route,\n queryParams: { agentId, assistId: null, assist: null },\n queryParamsHandling: 'merge',\n replaceUrl: true,\n });\n await this.loadEffectiveAssistForChat();\n this.seedInitialMessagesFromEffectiveAssist();\n await this.loadModels();\n this.recompute();\n }\n\n /**\n * Loads assist-configured greeting lines for display only (see {@link assistBootstrapMessages}).\n */\n private seedInitialMessagesFromEffectiveAssist(): void {\n if (this.messages().length > 0) {\n return;\n }\n const assist = this.effectiveAssist();\n if (!assist) {\n this.assistBootstrapMessages.set([]);\n return;\n }\n const seed = axpAiAssistInitialMessagesToTranscript(assist.initialMessages);\n this.assistBootstrapMessages.set(seed);\n }\n\n private async loadEffectiveAssistForChat(): Promise<void> {\n this.assistLoadError.set(false);\n if (this.selectedDirectAgentId()?.trim()) {\n this.effectiveAssist.set(null);\n return;\n }\n try {\n const id = this.selectedAssistId()?.trim();\n const assist = await this.aiManager.getAssistForChat(id || undefined);\n this.effectiveAssist.set(assist);\n } catch {\n this.effectiveAssist.set(null);\n this.assistLoadError.set(true);\n }\n }\n\n private async loadModels(): Promise<void> {\n try {\n const rows = await this.modelCatalog.listModels({});\n const directAgentId = this.selectedDirectAgentId()?.trim();\n let preferredId: string | undefined;\n if (directAgentId) {\n const ag = await this.agentData.byKey(directAgentId);\n preferredId = ag?.modelEntityId?.trim();\n if (!preferredId) {\n const assist = await this.aiManager.getEffectiveAssist();\n preferredId = assist.modelId?.trim();\n }\n } else {\n preferredId = this.effectiveAssist()?.modelId?.trim();\n }\n const preferred = preferredId ? rows.find((r) => r.id === preferredId) : undefined;\n const ordered = preferred\n ? [preferred, ...rows.filter((r) => r.id !== preferredId)]\n : rows;\n this.modelRows.set(ordered);\n if (preferredId) {\n this.selectedModelId.set(preferredId);\n } else if (ordered[0]?.id) {\n this.selectedModelId.set(ordered[0].id);\n } else {\n this.selectedModelId.set(undefined);\n }\n } catch {\n this.modelRows.set([]);\n this.selectedModelId.set(undefined);\n }\n }\n\n //#endregion\n}\n\n//#endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1"],"mappings":"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"}
|