@acorex/modules 21.0.0-beta.3 → 21.0.0-beta.4
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-agent-registry-tool-configurator-widget-column.component-DDVQwyU4.mjs.map +1 -1
- package/fesm2022/{acorex-modules-ai-management-agent-registry-tool-configurator-widget-edit.component-CwLff8ut.mjs → acorex-modules-ai-management-agent-registry-tool-configurator-widget-edit.component-C-XsPEIg.mjs} +2 -2
- package/fesm2022/acorex-modules-ai-management-agent-registry-tool-configurator-widget-edit.component-C-XsPEIg.mjs.map +1 -0
- package/fesm2022/{acorex-modules-ai-management-agent.entity-CsiCzwYK.mjs → acorex-modules-ai-management-agent.entity-D6-0_Ms3.mjs} +2 -2
- package/fesm2022/acorex-modules-ai-management-agent.entity-D6-0_Ms3.mjs.map +1 -0
- package/fesm2022/acorex-modules-ai-management-assist-delegated-agent-configurator-widget-column.component-tSpJYIZh.mjs.map +1 -1
- package/fesm2022/{acorex-modules-ai-management-assist-delegated-agent-configurator-widget-edit.component-DQWeuAd6.mjs → acorex-modules-ai-management-assist-delegated-agent-configurator-widget-edit.component-u1hZ4P5s.mjs} +2 -2
- package/fesm2022/acorex-modules-ai-management-assist-delegated-agent-configurator-widget-edit.component-u1hZ4P5s.mjs.map +1 -0
- package/fesm2022/{acorex-modules-ai-management-assist.entity-Be5vnFVn.mjs → acorex-modules-ai-management-assist.entity-DfW-FFCt.mjs} +2 -2
- package/fesm2022/{acorex-modules-ai-management-assist.entity-Be5vnFVn.mjs.map → acorex-modules-ai-management-assist.entity-DfW-FFCt.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-ai-management-model.entity-BjTtbWDk.mjs → acorex-modules-ai-management-model.entity-DiDaXVa3.mjs} +2 -2
- package/fesm2022/{acorex-modules-ai-management-model.entity-BjTtbWDk.mjs.map → acorex-modules-ai-management-model.entity-DiDaXVa3.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-ai-management-open-ai-endpoint.entity-CfKav_1a.mjs → acorex-modules-ai-management-open-ai-endpoint.entity-CZLNKtl0.mjs} +2 -2
- package/fesm2022/{acorex-modules-ai-management-open-ai-endpoint.entity-CfKav_1a.mjs.map → acorex-modules-ai-management-open-ai-endpoint.entity-CZLNKtl0.mjs.map} +1 -1
- package/fesm2022/acorex-modules-ai-management.mjs +4630 -1
- package/fesm2022/acorex-modules-ai-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-application-management.mjs +11 -15
- package/fesm2022/acorex-modules-application-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-asset-management-acorex-modules-asset-management-p_zMwIBs.mjs → acorex-modules-asset-management-acorex-modules-asset-management-Blejt-Mo.mjs} +57 -51
- package/fesm2022/acorex-modules-asset-management-acorex-modules-asset-management-Blejt-Mo.mjs.map +1 -0
- package/fesm2022/{acorex-modules-asset-management-asset-rental-history.entity-CXgiPWiW.mjs → acorex-modules-asset-management-asset-rental-history.entity-C6V8Nuvb.mjs} +2 -2
- package/fesm2022/{acorex-modules-asset-management-asset-rental-history.entity-CXgiPWiW.mjs.map → acorex-modules-asset-management-asset-rental-history.entity-C6V8Nuvb.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-asset-management-asset-system-assignment.entity-C-UodoTZ.mjs → acorex-modules-asset-management-asset-system-assignment.entity-CtCyaI46.mjs} +2 -2
- package/fesm2022/{acorex-modules-asset-management-asset-system-assignment.entity-C-UodoTZ.mjs.map → acorex-modules-asset-management-asset-system-assignment.entity-CtCyaI46.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-asset-management-asset-system-type.entity-DkV2P0sF.mjs → acorex-modules-asset-management-asset-system-type.entity-CfoB6Faf.mjs} +2 -2
- package/fesm2022/{acorex-modules-asset-management-asset-system-type.entity-DkV2P0sF.mjs.map → acorex-modules-asset-management-asset-system-type.entity-CfoB6Faf.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-asset-management-asset-system.entity-bLGHHcCr.mjs → acorex-modules-asset-management-asset-system.entity-CvKC7MKH.mjs} +2 -2
- package/fesm2022/{acorex-modules-asset-management-asset-system.entity-bLGHHcCr.mjs.map → acorex-modules-asset-management-asset-system.entity-CvKC7MKH.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-asset-management-asset-type-section-component.entity-B_ct599s.mjs → acorex-modules-asset-management-asset-type-section-component.entity-xfRZM5vK.mjs} +32 -31
- package/fesm2022/acorex-modules-asset-management-asset-type-section-component.entity-xfRZM5vK.mjs.map +1 -0
- package/fesm2022/{acorex-modules-asset-management-asset-type-section.entity-BoONUtWp.mjs → acorex-modules-asset-management-asset-type-section.entity-DdEcyihk.mjs} +2 -2
- package/fesm2022/{acorex-modules-asset-management-asset-type-section.entity-BoONUtWp.mjs.map → acorex-modules-asset-management-asset-type-section.entity-DdEcyihk.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-asset-management-asset-type.entity-BjaLvZuH.mjs → acorex-modules-asset-management-asset-type.entity-D78ztUZ5.mjs} +108 -28
- package/fesm2022/acorex-modules-asset-management-asset-type.entity-D78ztUZ5.mjs.map +1 -0
- package/fesm2022/{acorex-modules-asset-management-asset.entity-Bn-WKIkL.mjs → acorex-modules-asset-management-asset.entity-3dFsNRkr.mjs} +2 -205
- package/fesm2022/acorex-modules-asset-management-asset.entity-3dFsNRkr.mjs.map +1 -0
- package/fesm2022/acorex-modules-asset-management.mjs +1 -1
- package/fesm2022/{acorex-modules-auth-acorex-modules-auth-DzCtP4qB.mjs → acorex-modules-auth-acorex-modules-auth-OxprG_fC.mjs} +13 -13
- package/fesm2022/{acorex-modules-auth-acorex-modules-auth-DzCtP4qB.mjs.map → acorex-modules-auth-acorex-modules-auth-OxprG_fC.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-app-chooser.component-BQF1I-wB.mjs → acorex-modules-auth-app-chooser.component-CVIfaOZn.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-app-chooser.component-BQF1I-wB.mjs.map → acorex-modules-auth-app-chooser.component-CVIfaOZn.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-login.module-5ZArig0w.mjs → acorex-modules-auth-login.module-DcHZK-R8.mjs} +4 -4
- package/fesm2022/{acorex-modules-auth-login.module-5ZArig0w.mjs.map → acorex-modules-auth-login.module-DcHZK-R8.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-master.layout-a4QkegZJ.mjs → acorex-modules-auth-master.layout-BxFGH1Ns.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-master.layout-a4QkegZJ.mjs.map → acorex-modules-auth-master.layout-BxFGH1Ns.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-oauth-callback.component-DTxqNJ2C.mjs → acorex-modules-auth-oauth-callback.component-D7wdpp8i.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-oauth-callback.component-DTxqNJ2C.mjs.map → acorex-modules-auth-oauth-callback.component-D7wdpp8i.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-password.component-BecuTKvO.mjs → acorex-modules-auth-password.component-BStzALYp.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-password.component-BecuTKvO.mjs.map → acorex-modules-auth-password.component-BStzALYp.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-password.component-DmJZoAp1.mjs → acorex-modules-auth-password.component-CD6RCeFv.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-password.component-DmJZoAp1.mjs.map → acorex-modules-auth-password.component-CD6RCeFv.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-routes-DMqZIUs0.mjs → acorex-modules-auth-routes-DaEUQGPG.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-routes-DMqZIUs0.mjs.map → acorex-modules-auth-routes-DaEUQGPG.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-settings.provider-DkhbuDBO.mjs → acorex-modules-auth-settings.provider-CN7Lb38l.mjs} +26 -31
- package/fesm2022/acorex-modules-auth-settings.provider-CN7Lb38l.mjs.map +1 -0
- package/fesm2022/{acorex-modules-auth-tenant-chooser.component-C-apfDuQ.mjs → acorex-modules-auth-tenant-chooser.component-B-iqLVe6.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-tenant-chooser.component-C-apfDuQ.mjs.map → acorex-modules-auth-tenant-chooser.component-B-iqLVe6.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-two-factor.module-BqbFsq9G.mjs → acorex-modules-auth-two-factor.module-BMKzyFEP.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-two-factor.module-BqbFsq9G.mjs.map → acorex-modules-auth-two-factor.module-BMKzyFEP.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-user-sessions.component-D7vXGWMN.mjs → acorex-modules-auth-user-sessions.component-Xnz3S1SD.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-user-sessions.component-D7vXGWMN.mjs.map → acorex-modules-auth-user-sessions.component-Xnz3S1SD.mjs.map} +1 -1
- package/fesm2022/acorex-modules-auth.mjs +1 -1
- package/fesm2022/acorex-modules-common.mjs +8 -33
- package/fesm2022/acorex-modules-common.mjs.map +1 -1
- package/fesm2022/acorex-modules-conversation.mjs +1109 -2289
- package/fesm2022/acorex-modules-conversation.mjs.map +1 -1
- package/fesm2022/{acorex-modules-dashboard-management-acorex-modules-dashboard-management-qboFnd_p.mjs → acorex-modules-dashboard-management-acorex-modules-dashboard-management-WBZHuJyY.mjs} +3 -4
- package/fesm2022/acorex-modules-dashboard-management-acorex-modules-dashboard-management-WBZHuJyY.mjs.map +1 -0
- package/fesm2022/{acorex-modules-dashboard-management-index-DQHOwMS6.mjs → acorex-modules-dashboard-management-index-oHkAfJTJ.mjs} +2 -2
- package/fesm2022/{acorex-modules-dashboard-management-index-DQHOwMS6.mjs.map → acorex-modules-dashboard-management-index-oHkAfJTJ.mjs.map} +1 -1
- package/fesm2022/acorex-modules-dashboard-management.mjs +1 -1
- package/fesm2022/acorex-modules-document-management.mjs +116 -15
- package/fesm2022/acorex-modules-document-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-form-template-management.mjs +13 -17
- package/fesm2022/acorex-modules-form-template-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-locale-management.mjs +68 -70
- package/fesm2022/acorex-modules-locale-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-maintenance-management-acorex-modules-maintenance-management-B5wf4zMI.mjs → acorex-modules-maintenance-management-acorex-modules-maintenance-management-C0LLBxMR.mjs} +40 -38
- package/fesm2022/acorex-modules-maintenance-management-acorex-modules-maintenance-management-C0LLBxMR.mjs.map +1 -0
- package/fesm2022/{acorex-modules-maintenance-management-failure-effect.entity-Cv5KnboB.mjs → acorex-modules-maintenance-management-failure-effect.entity-D8yOqKWQ.mjs} +2 -2
- package/fesm2022/{acorex-modules-maintenance-management-failure-effect.entity-Cv5KnboB.mjs.map → acorex-modules-maintenance-management-failure-effect.entity-D8yOqKWQ.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-maintenance-management-failure-mode-asset-type.entity-BBL3-hfv.mjs → acorex-modules-maintenance-management-failure-mode-asset-type.entity-CHXkbEHG.mjs} +2 -2
- package/fesm2022/{acorex-modules-maintenance-management-failure-mode-asset-type.entity-BBL3-hfv.mjs.map → acorex-modules-maintenance-management-failure-mode-asset-type.entity-CHXkbEHG.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-maintenance-management-failure-mode-mechanism.entity-nxOdHZxu.mjs → acorex-modules-maintenance-management-failure-mode-mechanism.entity-yR11e9TU.mjs} +2 -2
- package/fesm2022/{acorex-modules-maintenance-management-failure-mode-mechanism.entity-nxOdHZxu.mjs.map → acorex-modules-maintenance-management-failure-mode-mechanism.entity-yR11e9TU.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-maintenance-management-failure-mode-solution.entity-ApD80Scc.mjs → acorex-modules-maintenance-management-failure-mode-solution.entity-BD4Uz6G-.mjs} +2 -2
- package/fesm2022/{acorex-modules-maintenance-management-failure-mode-solution.entity-ApD80Scc.mjs.map → acorex-modules-maintenance-management-failure-mode-solution.entity-BD4Uz6G-.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-maintenance-management-failure-register-cause.entity-CibfwJLG.mjs → acorex-modules-maintenance-management-failure-register-cause.entity-CZFgl-t4.mjs} +2 -2
- package/fesm2022/{acorex-modules-maintenance-management-failure-register-cause.entity-CibfwJLG.mjs.map → acorex-modules-maintenance-management-failure-register-cause.entity-CZFgl-t4.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-maintenance-management-failure-register-effect.entity-DpoqULBf.mjs → acorex-modules-maintenance-management-failure-register-effect.entity-DQE5nqiN.mjs} +2 -2
- package/fesm2022/{acorex-modules-maintenance-management-failure-register-effect.entity-DpoqULBf.mjs.map → acorex-modules-maintenance-management-failure-register-effect.entity-DQE5nqiN.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-maintenance-management-failure-register-mechanism.entity-0-J2Hkmn.mjs → acorex-modules-maintenance-management-failure-register-mechanism.entity-C6mhbWzU.mjs} +2 -2
- package/fesm2022/{acorex-modules-maintenance-management-failure-register-mechanism.entity-0-J2Hkmn.mjs.map → acorex-modules-maintenance-management-failure-register-mechanism.entity-C6mhbWzU.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-maintenance-management-failure-register.entity-C4Az4Rr9.mjs → acorex-modules-maintenance-management-failure-register.entity-DSnrVaWI.mjs} +2 -2
- package/fesm2022/{acorex-modules-maintenance-management-failure-register.entity-C4Az4Rr9.mjs.map → acorex-modules-maintenance-management-failure-register.entity-DSnrVaWI.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-maintenance-management-failure-severity.entity-BZo6UUun.mjs → acorex-modules-maintenance-management-failure-severity.entity-DZoMhgW7.mjs} +2 -2
- package/fesm2022/{acorex-modules-maintenance-management-failure-severity.entity-BZo6UUun.mjs.map → acorex-modules-maintenance-management-failure-severity.entity-DZoMhgW7.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-maintenance-management-maintenance-template.entity-DxYY0hpG.mjs → acorex-modules-maintenance-management-maintenance-template.entity-qf2WNKB_.mjs} +2 -2
- package/fesm2022/{acorex-modules-maintenance-management-maintenance-template.entity-DxYY0hpG.mjs.map → acorex-modules-maintenance-management-maintenance-template.entity-qf2WNKB_.mjs.map} +1 -1
- package/fesm2022/acorex-modules-maintenance-management.mjs +1 -1
- package/fesm2022/acorex-modules-notification-management.mjs +34 -38
- package/fesm2022/acorex-modules-notification-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-order-management-settings.provider-BzNJIZCu.mjs → acorex-modules-order-management-settings.provider-DF8JQ1PZ.mjs} +6 -11
- package/fesm2022/acorex-modules-order-management-settings.provider-DF8JQ1PZ.mjs.map +1 -0
- package/fesm2022/acorex-modules-order-management.mjs +2 -2
- package/fesm2022/{acorex-modules-organization-management-acorex-modules-organization-management-CUWv9tbF.mjs → acorex-modules-organization-management-acorex-modules-organization-management-BDnIsf2j.mjs} +27 -27
- package/fesm2022/{acorex-modules-organization-management-acorex-modules-organization-management-CUWv9tbF.mjs.map → acorex-modules-organization-management-acorex-modules-organization-management-BDnIsf2j.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-add-business-unit-to-business-unit.command-BKWt1YeU.mjs → acorex-modules-organization-management-add-business-unit-to-business-unit.command-BB8-LTp8.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-add-business-unit-to-business-unit.command-BKWt1YeU.mjs.map → acorex-modules-organization-management-add-business-unit-to-business-unit.command-BB8-LTp8.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-add-position-to-business-unit.command-yRvXPaBm.mjs → acorex-modules-organization-management-add-position-to-business-unit.command-BaEW7Jx8.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-add-position-to-business-unit.command-yRvXPaBm.mjs.map → acorex-modules-organization-management-add-position-to-business-unit.command-BaEW7Jx8.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-business-unit.entity-DwRpPYNe.mjs → acorex-modules-organization-management-business-unit.entity-CuFBCQ7T.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-business-unit.entity-DwRpPYNe.mjs.map → acorex-modules-organization-management-business-unit.entity-CuFBCQ7T.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-chart.entity-lm0udbe7.mjs → acorex-modules-organization-management-chart.entity-B7oSgI4o.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-chart.entity-lm0udbe7.mjs.map → acorex-modules-organization-management-chart.entity-B7oSgI4o.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-company.entity-DW43rdVi.mjs → acorex-modules-organization-management-company.entity-BSDic10Z.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-company.entity-DW43rdVi.mjs.map → acorex-modules-organization-management-company.entity-BSDic10Z.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-entity.provider-DGmP_q74.mjs → acorex-modules-organization-management-entity.provider-BkWwyLUZ.mjs} +15 -15
- package/fesm2022/{acorex-modules-organization-management-entity.provider-DGmP_q74.mjs.map → acorex-modules-organization-management-entity.provider-BkWwyLUZ.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-feature-definition.provider-Bm0hlncD.mjs → acorex-modules-organization-management-feature-definition.provider-D8Tsj3hk.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-feature-definition.provider-Bm0hlncD.mjs.map → acorex-modules-organization-management-feature-definition.provider-D8Tsj3hk.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-job-definition-pages-component.provider-BdMIRbOs.mjs → acorex-modules-organization-management-job-definition-pages-component.provider-cHJU9tB2.mjs} +3 -3
- package/fesm2022/{acorex-modules-organization-management-job-definition-pages-component.provider-BdMIRbOs.mjs.map → acorex-modules-organization-management-job-definition-pages-component.provider-cHJU9tB2.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-job-definition-responsibilities-page.component-DtZTvokB.mjs → acorex-modules-organization-management-job-definition-responsibilities-page.component-Yu4gOQ6K.mjs} +3 -3
- package/fesm2022/{acorex-modules-organization-management-job-definition-responsibilities-page.component-DtZTvokB.mjs.map → acorex-modules-organization-management-job-definition-responsibilities-page.component-Yu4gOQ6K.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-job-definition-skills-page.component-B2uaOaWD.mjs → acorex-modules-organization-management-job-definition-skills-page.component-DV8x-8VB.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-job-definition-skills-page.component-B2uaOaWD.mjs.map → acorex-modules-organization-management-job-definition-skills-page.component-DV8x-8VB.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-job-definition.entity-enxYD1x1.mjs → acorex-modules-organization-management-job-definition.entity-DAo8xR1H.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-job-definition.entity-enxYD1x1.mjs.map → acorex-modules-organization-management-job-definition.entity-DAo8xR1H.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-job-level.datasource-CRm1uNQa.mjs → acorex-modules-organization-management-job-level.datasource-C7ElEuZx.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-job-level.datasource-CRm1uNQa.mjs.map → acorex-modules-organization-management-job-level.datasource-C7ElEuZx.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-job-level.entity-D_m_u12t.mjs → acorex-modules-organization-management-job-level.entity-Dw3YK9-O.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-job-level.entity-D_m_u12t.mjs.map → acorex-modules-organization-management-job-level.entity-Dw3YK9-O.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-menu.provider-DZSDOHOa.mjs → acorex-modules-organization-management-menu.provider-DWt62uxv.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-menu.provider-DZSDOHOa.mjs.map → acorex-modules-organization-management-menu.provider-DWt62uxv.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-org-chart.page-BUSEFJJZ.mjs → acorex-modules-organization-management-org-chart.page-Rh8xmXaj.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-org-chart.page-BUSEFJJZ.mjs.map → acorex-modules-organization-management-org-chart.page-Rh8xmXaj.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-permission-definition.provider-DEfUgyRh.mjs → acorex-modules-organization-management-permission-definition.provider-3TD89ErD.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-permission-definition.provider-DEfUgyRh.mjs.map → acorex-modules-organization-management-permission-definition.provider-3TD89ErD.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-position.entity-D1JU0rla.mjs → acorex-modules-organization-management-position.entity-Cysj_53n.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-position.entity-D1JU0rla.mjs.map → acorex-modules-organization-management-position.entity-Cysj_53n.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-remove-position-from-business-unit.command-D2WMXNJg.mjs → acorex-modules-organization-management-remove-position-from-business-unit.command-BkQyq1ho.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-remove-position-from-business-unit.command-D2WMXNJg.mjs.map → acorex-modules-organization-management-remove-position-from-business-unit.command-BkQyq1ho.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-replace-position-assignee.command-DyJIOBOp.mjs → acorex-modules-organization-management-replace-position-assignee.command-Cf8VR0tX.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-replace-position-assignee.command-DyJIOBOp.mjs.map → acorex-modules-organization-management-replace-position-assignee.command-Cf8VR0tX.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-BTXGfRVf.mjs → acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-BeQ-nXpS.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-BTXGfRVf.mjs.map → acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-BeQ-nXpS.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix-widget-view.component-Cv_Aicyi.mjs → acorex-modules-organization-management-responsibilities-matrix-widget-view.component-Ie_39X99.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix-widget-view.component-Cv_Aicyi.mjs.map → acorex-modules-organization-management-responsibilities-matrix-widget-view.component-Ie_39X99.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix.component-42Aqvq6J.mjs → acorex-modules-organization-management-responsibilities-matrix.component-58s3Qfyg.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix.component-42Aqvq6J.mjs.map → acorex-modules-organization-management-responsibilities-matrix.component-58s3Qfyg.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-responsibility-level.entity-DIy5Kv_4.mjs → acorex-modules-organization-management-responsibility-level.entity-DWWQB7ke.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-responsibility-level.entity-DIy5Kv_4.mjs.map → acorex-modules-organization-management-responsibility-level.entity-DWWQB7ke.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-responsibility.entity-BBlERaap.mjs → acorex-modules-organization-management-responsibility.entity-C4V55fKt.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-responsibility.entity-BBlERaap.mjs.map → acorex-modules-organization-management-responsibility.entity-C4V55fKt.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-settings.provider-BohjJ4JD.mjs → acorex-modules-organization-management-settings.provider-BD70P1XV.mjs} +21 -24
- package/fesm2022/acorex-modules-organization-management-settings.provider-BD70P1XV.mjs.map +1 -0
- package/fesm2022/{acorex-modules-organization-management-team-business-unit.entity-UDotxAM4.mjs → acorex-modules-organization-management-team-business-unit.entity-B5T1fYAF.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-team-business-unit.entity-UDotxAM4.mjs.map → acorex-modules-organization-management-team-business-unit.entity-B5T1fYAF.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-team-member-role.entity-DfJ-QUdc.mjs → acorex-modules-organization-management-team-member-role.entity-dPp_dK-g.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-team-member-role.entity-DfJ-QUdc.mjs.map → acorex-modules-organization-management-team-member-role.entity-dPp_dK-g.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-team-member.entity-C13rpUNN.mjs → acorex-modules-organization-management-team-member.entity-CZPmF9f6.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-team-member.entity-C13rpUNN.mjs.map → acorex-modules-organization-management-team-member.entity-CZPmF9f6.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-team.entity-CTajHYMs.mjs → acorex-modules-organization-management-team.entity-CCfWLgDx.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-team.entity-CTajHYMs.mjs.map → acorex-modules-organization-management-team.entity-CCfWLgDx.mjs.map} +1 -1
- package/fesm2022/acorex-modules-organization-management.mjs +1 -1
- package/fesm2022/{acorex-modules-platform-dev-tools-settings.provider-CGyf-4eq.mjs → acorex-modules-platform-dev-tools-settings.provider-DKmgBUYt.mjs} +2 -2
- package/fesm2022/acorex-modules-platform-dev-tools-settings.provider-DKmgBUYt.mjs.map +1 -0
- package/fesm2022/acorex-modules-platform-dev-tools.mjs +2 -2
- package/fesm2022/{acorex-modules-platform-management-acorex-modules-platform-management-DCR1ziGj.mjs → acorex-modules-platform-management-acorex-modules-platform-management-D0D56pWx.mjs} +12 -4
- package/fesm2022/acorex-modules-platform-management-acorex-modules-platform-management-D0D56pWx.mjs.map +1 -0
- package/fesm2022/acorex-modules-platform-management-entity-master-actions-for-ai.util-OCk5eqQz.mjs +56 -0
- package/fesm2022/acorex-modules-platform-management-entity-master-actions-for-ai.util-OCk5eqQz.mjs.map +1 -0
- package/fesm2022/acorex-modules-platform-management-list-platform-navigation-for-ai.query-C3-eBMwF.mjs +198 -0
- package/fesm2022/acorex-modules-platform-management-list-platform-navigation-for-ai.query-C3-eBMwF.mjs.map +1 -0
- package/fesm2022/{acorex-modules-platform-management-list-registered-entities.query-B6-zV_Ml.mjs → acorex-modules-platform-management-list-registered-entities.query-BZVD9YPU.mjs} +26 -4
- package/fesm2022/acorex-modules-platform-management-list-registered-entities.query-BZVD9YPU.mjs.map +1 -0
- package/fesm2022/{acorex-modules-platform-management-menu-list.component-ClShYP8I.mjs → acorex-modules-platform-management-menu-list.component-BE9_j1Xy.mjs} +2 -2
- package/fesm2022/{acorex-modules-platform-management-menu-list.component-ClShYP8I.mjs.map → acorex-modules-platform-management-menu-list.component-BE9_j1Xy.mjs.map} +1 -1
- package/fesm2022/acorex-modules-platform-management.mjs +1 -1
- package/fesm2022/{acorex-modules-settings-management-acorex-modules-settings-management-7TUWK_qS.mjs → acorex-modules-settings-management-acorex-modules-settings-management-DHihkQXi.mjs} +88 -13
- package/fesm2022/acorex-modules-settings-management-acorex-modules-settings-management-DHihkQXi.mjs.map +1 -0
- package/fesm2022/{acorex-modules-settings-management-permission-definition.provider-DWSlCjno.mjs → acorex-modules-settings-management-permission-definition.provider-DZoXbvt_.mjs} +2 -2
- package/fesm2022/{acorex-modules-settings-management-permission-definition.provider-DWSlCjno.mjs.map → acorex-modules-settings-management-permission-definition.provider-DZoXbvt_.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-settings-management-setting-page.component-DukQDWHe.mjs → acorex-modules-settings-management-setting-page.component-B6UoszKZ.mjs} +5 -4
- package/fesm2022/acorex-modules-settings-management-setting-page.component-B6UoszKZ.mjs.map +1 -0
- package/fesm2022/{acorex-modules-settings-management-setting-view.component-C-PiEhLL.mjs → acorex-modules-settings-management-setting-view.component-BGCXJQ_L.mjs} +2 -2
- package/fesm2022/{acorex-modules-settings-management-setting-view.component-C-PiEhLL.mjs.map → acorex-modules-settings-management-setting-view.component-BGCXJQ_L.mjs.map} +1 -1
- package/fesm2022/acorex-modules-settings-management.mjs +1 -1
- package/fesm2022/{acorex-modules-task-management-acorex-modules-task-management-C-inbbcy.mjs → acorex-modules-task-management-acorex-modules-task-management-ZcP94xuL.mjs} +25 -28
- package/fesm2022/acorex-modules-task-management-acorex-modules-task-management-ZcP94xuL.mjs.map +1 -0
- package/fesm2022/{acorex-modules-task-management-task-board.page-BOrgjwax.mjs → acorex-modules-task-management-task-board.page-CEW3SrBz.mjs} +2 -2
- package/fesm2022/{acorex-modules-task-management-task-board.page-BOrgjwax.mjs.map → acorex-modules-task-management-task-board.page-CEW3SrBz.mjs.map} +1 -1
- package/fesm2022/acorex-modules-task-management.mjs +1 -1
- package/fesm2022/acorex-modules-tenant-management.mjs +3 -7
- package/fesm2022/acorex-modules-tenant-management.mjs.map +1 -1
- package/package.json +2 -2
- package/platform-management/README.md +4 -0
- package/types/acorex-modules-ai-management.d.ts +150 -527
- package/types/acorex-modules-asset-management.d.ts +7 -79
- package/types/acorex-modules-common.d.ts +3 -6
- package/types/acorex-modules-conversation.d.ts +60 -4
- package/types/acorex-modules-document-management.d.ts +20 -8
- package/types/acorex-modules-maintenance-management.d.ts +0 -2
- package/types/acorex-modules-notification-management.d.ts +0 -3
- package/types/acorex-modules-settings-management.d.ts +3 -0
- package/types/acorex-modules-task-management.d.ts +0 -1
- package/types/acorex-modules-tenant-management.d.ts +0 -1
- package/fesm2022/acorex-modules-ai-management-acorex-modules-ai-management-DZ_SXRAW.mjs +0 -8782
- package/fesm2022/acorex-modules-ai-management-acorex-modules-ai-management-DZ_SXRAW.mjs.map +0 -1
- package/fesm2022/acorex-modules-ai-management-agent-registry-tool-configurator-widget-edit.component-CwLff8ut.mjs.map +0 -1
- package/fesm2022/acorex-modules-ai-management-agent.entity-CsiCzwYK.mjs.map +0 -1
- package/fesm2022/acorex-modules-ai-management-ai-delegated-agent-transcript-popup.component-BWxdBe9t.mjs +0 -1255
- package/fesm2022/acorex-modules-ai-management-ai-delegated-agent-transcript-popup.component-BWxdBe9t.mjs.map +0 -1
- package/fesm2022/acorex-modules-ai-management-assist-delegated-agent-configurator-widget-edit.component-DQWeuAd6.mjs.map +0 -1
- package/fesm2022/acorex-modules-ai-management-index-BFMvZNvI.mjs +0 -2
- package/fesm2022/acorex-modules-ai-management-index-BFMvZNvI.mjs.map +0 -1
- package/fesm2022/acorex-modules-asset-management-acorex-modules-asset-management-p_zMwIBs.mjs.map +0 -1
- package/fesm2022/acorex-modules-asset-management-asset-state-history.entity-Cwics4Zo.mjs +0 -258
- package/fesm2022/acorex-modules-asset-management-asset-state-history.entity-Cwics4Zo.mjs.map +0 -1
- package/fesm2022/acorex-modules-asset-management-asset-status.rules-B7KwWQEe.mjs +0 -98
- package/fesm2022/acorex-modules-asset-management-asset-status.rules-B7KwWQEe.mjs.map +0 -1
- package/fesm2022/acorex-modules-asset-management-asset-type-section-component.entity-B_ct599s.mjs.map +0 -1
- package/fesm2022/acorex-modules-asset-management-asset-type.entity-BjaLvZuH.mjs.map +0 -1
- package/fesm2022/acorex-modules-asset-management-asset.entity-Bn-WKIkL.mjs.map +0 -1
- package/fesm2022/acorex-modules-asset-management-assetLifecycle-state.provider-DZ5r2zx7.mjs +0 -192
- package/fesm2022/acorex-modules-asset-management-assetLifecycle-state.provider-DZ5r2zx7.mjs.map +0 -1
- package/fesm2022/acorex-modules-asset-management-status.provider-C41t4e2U.mjs +0 -363
- package/fesm2022/acorex-modules-asset-management-status.provider-C41t4e2U.mjs.map +0 -1
- package/fesm2022/acorex-modules-auth-settings.provider-DkhbuDBO.mjs.map +0 -1
- package/fesm2022/acorex-modules-dashboard-management-acorex-modules-dashboard-management-qboFnd_p.mjs.map +0 -1
- package/fesm2022/acorex-modules-maintenance-management-acorex-modules-maintenance-management-B5wf4zMI.mjs.map +0 -1
- package/fesm2022/acorex-modules-order-management-settings.provider-BzNJIZCu.mjs.map +0 -1
- package/fesm2022/acorex-modules-organization-management-settings.provider-BohjJ4JD.mjs.map +0 -1
- package/fesm2022/acorex-modules-platform-dev-tools-settings.provider-CGyf-4eq.mjs.map +0 -1
- package/fesm2022/acorex-modules-platform-management-acorex-modules-platform-management-DCR1ziGj.mjs.map +0 -1
- package/fesm2022/acorex-modules-platform-management-list-registered-entities.query-B6-zV_Ml.mjs.map +0 -1
- package/fesm2022/acorex-modules-settings-management-acorex-modules-settings-management-7TUWK_qS.mjs.map +0 -1
- package/fesm2022/acorex-modules-settings-management-setting-page.component-DukQDWHe.mjs.map +0 -1
- package/fesm2022/acorex-modules-task-management-acorex-modules-task-management-C-inbbcy.mjs.map +0 -1
|
@@ -1,38 +1,37 @@
|
|
|
1
1
|
import { AXConversationModule } from '@acorex/components/conversation';
|
|
2
2
|
import { AXPSessionService, AXPAuthGuard, AXP_PERMISSION_DEFINITION_PROVIDER } from '@acorex/platform/auth';
|
|
3
|
-
import { createAllQueryView, AXPEntityQueryType,
|
|
4
|
-
import { AXPDataGenerator, AXPDeviceService, AXP_MODULE_MANIFEST_PROVIDER } from '@acorex/platform/core';
|
|
5
|
-
import { AXPThemeLayoutBlockComponent, AXPThemeLayoutStartSideComponent, AXPUserAvatarComponent, AXP_PAGE_COMPONENT_PROVIDER, AXP_TASK_BADGE_PROVIDERS } from '@acorex/platform/layout/components';
|
|
3
|
+
import { createAllQueryView, AXPEntityQueryType, AXPSettingsService, AXPCommonSettings, AXPFilterOperatorMiddlewareService, AXPEntityCommandScope, AXPFileStorageService, AXP_MENU_PROVIDER } from '@acorex/platform/common';
|
|
4
|
+
import { AXPDataGenerator, AXPPlatformScope, AXPDeviceService, AXP_MODULE_MANIFEST_PROVIDER } from '@acorex/platform/core';
|
|
5
|
+
import { AXPThemeLayoutBlockComponent, AXPThemeLayoutStartSideComponent, AXPUserAvatarComponent, AXPMarkdownViewerComponent, AXPMarkdownTemplateDirective, AXP_PAGE_COMPONENT_PROVIDER, AXP_TASK_BADGE_PROVIDERS } from '@acorex/platform/layout/components';
|
|
6
6
|
import { AXMEntityCrudServiceImpl, entityMasterCrudActions, entityMasterRecordActions, AXPEntityDefinitionRegistryService, cloneLayoutArrays, ensureLayoutSection, ensureLayoutPropertyView, resolveEntityPluginDetailPageOrder, ensureListActions, actionExists, AXPEntityService, AXP_ENTITY_ACTION_PLUGIN, AXP_ENTITY_DEFINITION_LOADER } from '@acorex/platform/layout/entity';
|
|
7
7
|
import { AXPRootLayoutComponent } from '@acorex/platform/themes/default';
|
|
8
8
|
import * as i5 from '@angular/common';
|
|
9
|
-
import { CommonModule, AsyncPipe, DatePipe } from '@angular/common';
|
|
9
|
+
import { CommonModule, AsyncPipe, DecimalPipe, DatePipe } from '@angular/common';
|
|
10
10
|
import * as i0 from '@angular/core';
|
|
11
|
-
import { Injectable, NgModule, inject, output, signal, viewChild, computed, effect, untracked, ChangeDetectionStrategy, Component, input, afterNextRender, DestroyRef, ElementRef, ViewEncapsulation,
|
|
11
|
+
import { Injectable, NgModule, inject, output, signal, viewChild, computed, effect, untracked, ChangeDetectionStrategy, Component, input, afterNextRender, DestroyRef, ElementRef, ViewEncapsulation, Injector, importProvidersFrom } from '@angular/core';
|
|
12
12
|
import { Router, ActivatedRoute, RouterModule, ROUTES } from '@angular/router';
|
|
13
13
|
import * as i1$3 from '@acorex/platform/layout/widget-core';
|
|
14
14
|
import { AXPWidgetsCatalog, AXPValueWidgetComponent, AXPWidgetGroupEnum, AXPWidgetCoreModule, AXP_WIDGET_DEFINITION_PROVIDER } from '@acorex/platform/layout/widget-core';
|
|
15
|
-
import * as i1$
|
|
15
|
+
import * as i1$5 from '@acorex/platform/workflow';
|
|
16
16
|
import { AXPWorkflowAction, AXPWorkflowModule } from '@acorex/platform/workflow';
|
|
17
17
|
import { AXMNotificationConnectorService, AXP_NOTIFICATION_DEFINITION_PROVIDER } from '@acorex/modules/notification-management';
|
|
18
18
|
import { AXMUsersEntityService } from '@acorex/modules/security-management';
|
|
19
19
|
import { Subject, map, filter, merge, auditTime } from 'rxjs';
|
|
20
20
|
import * as i2 from '@acorex/components/button';
|
|
21
21
|
import { AXButtonModule, AXButtonComponent } from '@acorex/components/button';
|
|
22
|
-
import { AXConversationService, AXNewConversationDialogComponent, AXConversationContainerDirective, AXSidebarComponent, AXInfoBarComponent, AXMessageListComponent, AXComposerComponent, AXUserApi, AXConversationApi, AXMessageApi, AXRealtimeApi, conversationSharedStorage, axConversationIndexedDbStorage, AXImageRendererComponent, AXTextRendererComponent, provideConversation, AX_CONVERSATION_ITEM_MUTE_ACTION, AX_CONVERSATION_ITEM_PIN_ACTION, AX_CONVERSATION_ITEM_MARK_READ_ACTION, AX_CONVERSATION_ITEM_DIVIDER, AX_CONVERSATION_ITEM_DELETE_ACTION, AX_CONVERSATION_ITEM_BLOCK_ACTION, AX_CONVERSATION_INFO_BAR_SEARCH_ACTION, AX_CONVERSATION_INFO_BAR_INFO_ACTION, AX_CONVERSATION_INFO_BAR_MUTE_ACTION, AX_CONVERSATION_INFO_BAR_DIVIDER, AX_CONVERSATION_INFO_BAR_DELETE_ACTION, AX_CONVERSATION_INFO_BAR_BLOCK_ACTION, AX_CONVERSATION_TAB_ALL, AX_CONVERSATION_TAB_PRIVATE, AX_CONVERSATION_TAB_GROUPS,
|
|
22
|
+
import { AXConversationService, AXNewConversationDialogComponent, AXConversationContainerDirective, AXSidebarComponent, AXInfoBarComponent, AXMessageListComponent, AXComposerComponent, AXUserApi, AXConversationApi, AXMessageApi, AXRealtimeApi, conversationSharedStorage, axConversationIndexedDbStorage, AXImageRendererComponent, AXTextRendererComponent, provideConversation, AX_CONVERSATION_ITEM_MUTE_ACTION, AX_CONVERSATION_ITEM_PIN_ACTION, AX_CONVERSATION_ITEM_MARK_READ_ACTION, AX_CONVERSATION_ITEM_DIVIDER, AX_CONVERSATION_ITEM_DELETE_ACTION, AX_CONVERSATION_ITEM_BLOCK_ACTION, AX_CONVERSATION_INFO_BAR_SEARCH_ACTION, AX_CONVERSATION_INFO_BAR_INFO_ACTION, AX_CONVERSATION_INFO_BAR_MUTE_ACTION, AX_CONVERSATION_INFO_BAR_DIVIDER, AX_CONVERSATION_INFO_BAR_DELETE_ACTION, AX_CONVERSATION_INFO_BAR_BLOCK_ACTION, AX_CONVERSATION_TAB_ALL, AX_CONVERSATION_TAB_PRIVATE, AX_CONVERSATION_TAB_GROUPS, AX_CONVERSATION_COMPOSER_EMOJI_TAB, AX_CONVERSATION_COMPOSER_STICKER_TAB, AX_CONVERSATION_COMPOSER_EMOJI_ACTION, AX_CONVERSATION_COMPOSER_IMAGE_ACTION, AX_CONVERSATION_COMPOSER_VIDEO_ACTION, AX_CONVERSATION_COMPOSER_FILE_ACTION, AX_CONVERSATION_COMPOSER_VOICE_RECORDING_ACTION, AX_CONVERSATION_COMPOSER_AUDIO_ACTION, AX_CONVERSATION_COMPOSER_LOCATION_ACTION, AX_CONVERSATION_MESSAGE_REPLY_ACTION, AX_CONVERSATION_MESSAGE_FORWARD_ACTION, AX_CONVERSATION_MESSAGE_EDIT_ACTION, AX_CONVERSATION_MESSAGE_DELETE_ACTION, AXComposerService, AX_CONVERSATION_TEXT_RENDERER, AX_CONVERSATION_IMAGE_RENDERER, AX_CONVERSATION_VIDEO_RENDERER, AX_CONVERSATION_AUDIO_RENDERER, AX_CONVERSATION_VOICE_RENDERER, AX_CONVERSATION_FILE_RENDERER, AX_CONVERSATION_LOCATION_RENDERER, AX_CONVERSATION_STICKER_RENDERER } from '@acorex/components/conversation2';
|
|
23
23
|
import { AXDialogService } from '@acorex/components/dialog';
|
|
24
24
|
import * as i1$1 from '@acorex/components/decorators';
|
|
25
25
|
import { AXDecoratorModule } from '@acorex/components/decorators';
|
|
26
|
-
import * as
|
|
26
|
+
import * as i2$1 from '@acorex/core/translation';
|
|
27
27
|
import { AXTranslationService, AXTranslationModule } from '@acorex/core/translation';
|
|
28
28
|
import { AXPPageLayoutBaseComponent, AXPPageLayoutComponent } from '@acorex/platform/layout/views';
|
|
29
29
|
import { toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
30
30
|
import * as i3 from '@acorex/components/dropdown';
|
|
31
31
|
import { AXDropdownModule } from '@acorex/components/dropdown';
|
|
32
|
-
import * as i1$5 from '@acorex/components/text-box';
|
|
33
32
|
import { AXTextBoxModule } from '@acorex/components/text-box';
|
|
34
33
|
import { AXToastService } from '@acorex/components/toast';
|
|
35
|
-
import { RootConfig as RootConfig$1, AXPAiAssistChatModelCatalogService, axpAiChatMessageGetText,
|
|
34
|
+
import { RootConfig as RootConfig$1, axpAiParseDelegatedAgentResultSegmentsFromUnknown, axpAiChatTextMessage, AXPAiAssistChatModelCatalogService, axpAiParseSupervisorAgentToolName, axpAiChatMessageGetText, axpAiChatMessageIsDelegatedReflectionExcluded, axpAiDelegatedAgentPromptPreview, axpAiChatToolOrAgentResultBodyJson, axpAiDelegatedAgentOutcomeResponsesPlainText } from '@acorex/modules/ai-management';
|
|
36
35
|
import * as i1 from '@angular/forms';
|
|
37
36
|
import { FormsModule } from '@angular/forms';
|
|
38
37
|
import { AXFabComponent, AXFabItemComponent } from '@acorex/components/fab';
|
|
@@ -53,18 +52,16 @@ import { AXDropdownButtonModule } from '@acorex/components/dropdown-button';
|
|
|
53
52
|
import { AXFormModule } from '@acorex/components/form';
|
|
54
53
|
import * as i6 from '@acorex/components/loading';
|
|
55
54
|
import { AXLoadingModule } from '@acorex/components/loading';
|
|
56
|
-
import * as i2$
|
|
55
|
+
import * as i2$2 from '@acorex/components/skeleton';
|
|
57
56
|
import { AXSkeletonModule } from '@acorex/components/skeleton';
|
|
58
57
|
import { AXToolBarModule } from '@acorex/components/toolbar';
|
|
59
58
|
import * as i9 from '@acorex/core/format';
|
|
60
59
|
import { AXFormatModule } from '@acorex/core/format';
|
|
60
|
+
import { AXPLayoutBuilderService, AXPLayoutRendererComponent } from '@acorex/platform/layout/builder';
|
|
61
61
|
import * as i1$4 from '@acorex/cdk/accordion';
|
|
62
62
|
import { AXAccordionCdkModule } from '@acorex/cdk/accordion';
|
|
63
|
-
import * as
|
|
64
|
-
import { AXBadgeModule } from '@acorex/components/badge';
|
|
65
|
-
import * as i3$2 from '@acorex/components/code-editor';
|
|
63
|
+
import * as i3$1 from '@acorex/components/code-editor';
|
|
66
64
|
import { AXCodeEditorModule } from '@acorex/components/code-editor';
|
|
67
|
-
import { AXPLayoutRendererComponent } from '@acorex/platform/layout/builder';
|
|
68
65
|
|
|
69
66
|
const config = {
|
|
70
67
|
i18n: 'conversation',
|
|
@@ -1588,6 +1585,56 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
1588
1585
|
}]
|
|
1589
1586
|
}] });
|
|
1590
1587
|
|
|
1588
|
+
//#region ---- Imports ----
|
|
1589
|
+
//#endregion
|
|
1590
|
+
//#region ---- Module cache (sync reads for action visibility) ----
|
|
1591
|
+
/** Updated by {@link AXMAssistChatDebugModeService}; read from action `visible` without injection context. */
|
|
1592
|
+
const axmAssistChatDebugModeState = {
|
|
1593
|
+
enabled: false,
|
|
1594
|
+
resolved: false,
|
|
1595
|
+
};
|
|
1596
|
+
//#endregion
|
|
1597
|
+
//#region ---- Service ----
|
|
1598
|
+
/**
|
|
1599
|
+
* Resolves tenant debug mode once and mirrors it to {@link axmAssistChatDebugModeState}
|
|
1600
|
+
* so conversation2 action `visible` callbacks can stay synchronous.
|
|
1601
|
+
*/
|
|
1602
|
+
class AXMAssistChatDebugModeService {
|
|
1603
|
+
//#endregion
|
|
1604
|
+
//#region ---- Lifecycle ----
|
|
1605
|
+
constructor() {
|
|
1606
|
+
//#region ---- Services & Dependencies ----
|
|
1607
|
+
this.settingsService = inject(AXPSettingsService);
|
|
1608
|
+
void this.refresh();
|
|
1609
|
+
}
|
|
1610
|
+
//#endregion
|
|
1611
|
+
//#region ---- API ----
|
|
1612
|
+
/** Re-reads tenant debug mode and updates the module cache. */
|
|
1613
|
+
async refresh() {
|
|
1614
|
+
try {
|
|
1615
|
+
const debugMode = await this.settingsService
|
|
1616
|
+
.scope(AXPPlatformScope.Tenant)
|
|
1617
|
+
.get(AXPCommonSettings.DebugMode);
|
|
1618
|
+
axmAssistChatDebugModeState.enabled = !!debugMode;
|
|
1619
|
+
}
|
|
1620
|
+
catch {
|
|
1621
|
+
axmAssistChatDebugModeState.enabled = false;
|
|
1622
|
+
}
|
|
1623
|
+
finally {
|
|
1624
|
+
axmAssistChatDebugModeState.resolved = true;
|
|
1625
|
+
}
|
|
1626
|
+
}
|
|
1627
|
+
isDebugModeActive() {
|
|
1628
|
+
return axmAssistChatDebugModeState.resolved && axmAssistChatDebugModeState.enabled;
|
|
1629
|
+
}
|
|
1630
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMAssistChatDebugModeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1631
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMAssistChatDebugModeService, providedIn: 'root' }); }
|
|
1632
|
+
}
|
|
1633
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMAssistChatDebugModeService, decorators: [{
|
|
1634
|
+
type: Injectable,
|
|
1635
|
+
args: [{ providedIn: 'root' }]
|
|
1636
|
+
}], ctorParameters: () => [] });
|
|
1637
|
+
|
|
1591
1638
|
class AXMChatEmptyAssistComposerComponent {
|
|
1592
1639
|
constructor() {
|
|
1593
1640
|
this.conversationService = inject(AXConversationService);
|
|
@@ -1779,7 +1826,7 @@ class AXMChatEmptyAssistComposerComponent {
|
|
|
1779
1826
|
</ax-button>
|
|
1780
1827
|
</div>
|
|
1781
1828
|
</div>
|
|
1782
|
-
`, isInline: true, styles: [".axm-chat-empty-assist-composer{width:min(100%,48rem);margin-inline:auto}.axm-chat-empty-assist-composer__caption{margin-bottom:3rem;text-align:center;font-size:clamp(1.9rem,3.4vw,2.7rem);line-height:1.15;font-weight:700;letter-spacing:-.02em}.axm-chat-empty-assist-composer__composer-row{display:flex;gap:.375rem;align-items:end;padding:.5rem;border-radius:2em;border:1px solid;border-color:rgba(var(--ax-sys-color-border-lighter-surface))}.axm-chat-empty-assist-composer__assist-text{display:inline-block;max-width:12rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.axm-chat-empty-assist-composer__textarea{resize:none;overflow:hidden;background:transparent;min-height:2.25rem;max-height:14rem;line-height:1.5;padding-block:.25rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i2.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: i2.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i2.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "component", type: i3.AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXTextBoxModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i1$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type:
|
|
1829
|
+
`, isInline: true, styles: [".axm-chat-empty-assist-composer{width:min(100%,48rem);margin-inline:auto}.axm-chat-empty-assist-composer__caption{margin-bottom:3rem;text-align:center;font-size:clamp(1.9rem,3.4vw,2.7rem);line-height:1.15;font-weight:700;letter-spacing:-.02em}.axm-chat-empty-assist-composer__composer-row{display:flex;gap:.375rem;align-items:end;padding:.5rem;border-radius:2em;border:1px solid;border-color:rgba(var(--ax-sys-color-border-lighter-surface))}.axm-chat-empty-assist-composer__assist-text{display:inline-block;max-width:12rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.axm-chat-empty-assist-composer__textarea{resize:none;overflow:hidden;background:transparent;min-height:2.25rem;max-height:14rem;line-height:1.5;padding-block:.25rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i2.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: i2.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i2.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "component", type: i3.AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXTextBoxModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i1$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i2$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1783
1830
|
}
|
|
1784
1831
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatEmptyAssistComposerComponent, decorators: [{
|
|
1785
1832
|
type: Component,
|
|
@@ -2099,7 +2146,7 @@ class AXMChatWithAssistDialogComponent extends AXBasePageComponent {
|
|
|
2099
2146
|
</div>
|
|
2100
2147
|
}
|
|
2101
2148
|
</ng-template>
|
|
2102
|
-
`, isInline: true, styles: [":host{display:block}.new-conversation-panel{display:flex;flex-direction:column;width:100%;overflow:hidden}.new-conversation-dialog-content{flex:1;min-height:0;overflow:hidden;display:flex;flex-direction:column;gap:.75rem}.form-field--grow{flex:1;min-height:0;display:flex;flex-direction:column}.form-field{display:flex;flex-direction:column;gap:.35rem}.users-list-wrap{height:min(50vh,36rem);overflow:hidden}.users-list{display:block;height:100%}.users-list-header{display:block;position:sticky;top:0;z-index:1;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface))}.users-list-header-inner{padding:.5rem .75rem}.user-item-content{display:flex;align-items:center;gap:.5rem;height:100%;padding:.5rem .75rem;min-width:0}.user-item-text{display:flex;flex-direction:column;justify-content:center;min-width:0;flex:1;gap:.1rem}.user-name-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:1rem;line-height:1.5rem;font-weight:500}.user-description-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.875rem;line-height:1.25rem;font-weight:400;opacity:.72;color:rgb(var(--ax-sys-color-on-surface))}.users-list-empty{padding:1rem;text-align:center;font-size:.85rem;opacity:.7}.dialog-footer{flex-shrink:0;padding:1rem;border-top:1px solid var(--ax-border-color, #e5e7eb);display:flex;justify-content:flex-end}.dialog-footer>ax-suffix{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:.75rem}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: AXListComponent, selector: "ax-list", inputs: ["id", "name", "disabled", "readonly", "valueField", "textField", "textTemplate", "disabledField", "multiple", "selectionMode", "isItemTruncated", "showItemTooltip", "dataSource", "itemHeight", "itemTemplate", "emptyTemplate", "loadingTemplate", "checkbox"], outputs: ["onValueChanged", "disabledChange", "readonlyChange", "onBlur", "onFocus", "onItemClick", "onItemSelected", "onScrolledIndexChanged"] }, { kind: "component", type: AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type", "autoSearch"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "component", type: AXAvatarComponent, selector: "ax-avatar", inputs: ["color", "size", "shape", "look"], outputs: ["sizeChange"] }, { kind: "component", type: AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i1$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i1$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type:
|
|
2149
|
+
`, isInline: true, styles: [":host{display:block}.new-conversation-panel{display:flex;flex-direction:column;width:100%;overflow:hidden}.new-conversation-dialog-content{flex:1;min-height:0;overflow:hidden;display:flex;flex-direction:column;gap:.75rem}.form-field--grow{flex:1;min-height:0;display:flex;flex-direction:column}.form-field{display:flex;flex-direction:column;gap:.35rem}.users-list-wrap{height:min(50vh,36rem);overflow:hidden}.users-list{display:block;height:100%}.users-list-header{display:block;position:sticky;top:0;z-index:1;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface))}.users-list-header-inner{padding:.5rem .75rem}.user-item-content{display:flex;align-items:center;gap:.5rem;height:100%;padding:.5rem .75rem;min-width:0}.user-item-text{display:flex;flex-direction:column;justify-content:center;min-width:0;flex:1;gap:.1rem}.user-name-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:1rem;line-height:1.5rem;font-weight:500}.user-description-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.875rem;line-height:1.25rem;font-weight:400;opacity:.72;color:rgb(var(--ax-sys-color-on-surface))}.users-list-empty{padding:1rem;text-align:center;font-size:.85rem;opacity:.7}.dialog-footer{flex-shrink:0;padding:1rem;border-top:1px solid var(--ax-border-color, #e5e7eb);display:flex;justify-content:flex-end}.dialog-footer>ax-suffix{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:.75rem}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: AXListComponent, selector: "ax-list", inputs: ["id", "name", "disabled", "readonly", "valueField", "textField", "textTemplate", "disabledField", "multiple", "selectionMode", "isItemTruncated", "showItemTooltip", "dataSource", "itemHeight", "itemTemplate", "emptyTemplate", "loadingTemplate", "checkbox"], outputs: ["onValueChanged", "disabledChange", "readonlyChange", "onBlur", "onFocus", "onItemClick", "onItemSelected", "onScrolledIndexChanged"] }, { kind: "component", type: AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type", "autoSearch"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "component", type: AXAvatarComponent, selector: "ax-avatar", inputs: ["color", "size", "shape", "look"], outputs: ["sizeChange"] }, { kind: "component", type: AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i1$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i1$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i2$1.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
2103
2150
|
}
|
|
2104
2151
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatWithAssistDialogComponent, decorators: [{
|
|
2105
2152
|
type: Component,
|
|
@@ -2275,7 +2322,7 @@ class AXMChatSidebarNewActionsComponent {
|
|
|
2275
2322
|
</ax-fab-item>
|
|
2276
2323
|
</ax-fab>
|
|
2277
2324
|
</div>
|
|
2278
|
-
`, isInline: true, styles: [":host{display:block}.new-conversation-button-container-inner{display:flex;justify-content:end;align-items:center;padding-inline-end:.25rem}.new-conversation-fab{z-index:1}\n"], dependencies: [{ kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: AXFabComponent, selector: "ax-fab", inputs: ["label", "popupStyle", "popupPlacement", "size"], outputs: ["popupPlacementChange", "onClick", "onOpened", "onClosed"] }, { kind: "component", type: AXFabItemComponent, selector: "ax-fab-item", inputs: ["label"], outputs: ["onClick"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i1$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type:
|
|
2325
|
+
`, isInline: true, styles: [":host{display:block}.new-conversation-button-container-inner{display:flex;justify-content:end;align-items:center;padding-inline-end:.25rem}.new-conversation-fab{z-index:1}\n"], dependencies: [{ kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: AXFabComponent, selector: "ax-fab", inputs: ["label", "popupStyle", "popupPlacement", "size"], outputs: ["popupPlacementChange", "onClick", "onOpened", "onClosed"] }, { kind: "component", type: AXFabItemComponent, selector: "ax-fab-item", inputs: ["label"], outputs: ["onClick"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i1$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i2$1.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
2279
2326
|
}
|
|
2280
2327
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatSidebarNewActionsComponent, decorators: [{
|
|
2281
2328
|
type: Component,
|
|
@@ -2305,6 +2352,8 @@ class AXMChatComponent extends AXPPageLayoutBaseComponent {
|
|
|
2305
2352
|
super(...arguments);
|
|
2306
2353
|
//#region ---- Services & Dependencies ----
|
|
2307
2354
|
this.conversationService = inject(AXConversationService);
|
|
2355
|
+
/** Eagerly resolves tenant debug mode for assist debug download action visibility. */
|
|
2356
|
+
this._assistChatDebugModeInit = inject(AXMAssistChatDebugModeService);
|
|
2308
2357
|
this.router = inject(Router);
|
|
2309
2358
|
this.activatedRoute = inject(ActivatedRoute);
|
|
2310
2359
|
this.dialogService = inject(AXDialogService);
|
|
@@ -2498,6 +2547,259 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
2498
2547
|
type: Injectable
|
|
2499
2548
|
}] });
|
|
2500
2549
|
|
|
2550
|
+
//#region ---- Imports ----
|
|
2551
|
+
//#endregion
|
|
2552
|
+
//#region ---- Transcript read ----
|
|
2553
|
+
/**
|
|
2554
|
+
* Reorders assist transcript lines for chat UI: all **think** first, then tool/agent
|
|
2555
|
+
* and `tool`-role results in their original order, then all **text** (final answer).
|
|
2556
|
+
* This matches chronological expectation (agent call and its result appear before the
|
|
2557
|
+
* assistant's closing message).
|
|
2558
|
+
*/
|
|
2559
|
+
function axmNormalizeAssistTranscriptForChatUi(input) {
|
|
2560
|
+
if (input.length === 0) {
|
|
2561
|
+
return input;
|
|
2562
|
+
}
|
|
2563
|
+
const thinkParts = [];
|
|
2564
|
+
const textParts = [];
|
|
2565
|
+
const middle = [];
|
|
2566
|
+
for (const m of input) {
|
|
2567
|
+
if (m.role === 'tool' || m.role === 'user' || m.role === 'system') {
|
|
2568
|
+
middle.push(m);
|
|
2569
|
+
continue;
|
|
2570
|
+
}
|
|
2571
|
+
if (m.role !== 'assistant') {
|
|
2572
|
+
middle.push(m);
|
|
2573
|
+
continue;
|
|
2574
|
+
}
|
|
2575
|
+
for (const r of m.responses) {
|
|
2576
|
+
if (r.type === 'think') {
|
|
2577
|
+
thinkParts.push(r.content);
|
|
2578
|
+
}
|
|
2579
|
+
else if (r.type === 'text') {
|
|
2580
|
+
textParts.push(r.content);
|
|
2581
|
+
}
|
|
2582
|
+
else {
|
|
2583
|
+
middle.push({ role: 'assistant', responses: [r] });
|
|
2584
|
+
}
|
|
2585
|
+
}
|
|
2586
|
+
}
|
|
2587
|
+
const out = [];
|
|
2588
|
+
if (thinkParts.length > 0) {
|
|
2589
|
+
out.push({
|
|
2590
|
+
role: 'assistant',
|
|
2591
|
+
responses: [{ type: 'think', content: thinkParts.join('\n\n') }],
|
|
2592
|
+
});
|
|
2593
|
+
}
|
|
2594
|
+
out.push(...middle);
|
|
2595
|
+
if (textParts.length > 0) {
|
|
2596
|
+
out.push({
|
|
2597
|
+
role: 'assistant',
|
|
2598
|
+
responses: [{ type: 'text', content: textParts.join('\n\n') }],
|
|
2599
|
+
});
|
|
2600
|
+
}
|
|
2601
|
+
return out;
|
|
2602
|
+
}
|
|
2603
|
+
/**
|
|
2604
|
+
* Reads AI transcript lines from assist message metadata (final `aiTranscript` or streaming `aiTranscriptDraft`),
|
|
2605
|
+
* in display order for the assist renderer.
|
|
2606
|
+
*/
|
|
2607
|
+
function axmReadAssistAiTranscript(metadata) {
|
|
2608
|
+
if (typeof metadata !== 'object' || metadata == null) {
|
|
2609
|
+
return null;
|
|
2610
|
+
}
|
|
2611
|
+
const m = metadata;
|
|
2612
|
+
const final = m['aiTranscript'];
|
|
2613
|
+
const draft = m['aiTranscriptDraft'];
|
|
2614
|
+
if (Array.isArray(final) && final.length > 0) {
|
|
2615
|
+
return axmNormalizeAssistTranscriptForChatUi(final);
|
|
2616
|
+
}
|
|
2617
|
+
if (Array.isArray(draft) && draft.length > 0) {
|
|
2618
|
+
return axmNormalizeAssistTranscriptForChatUi(draft);
|
|
2619
|
+
}
|
|
2620
|
+
return null;
|
|
2621
|
+
}
|
|
2622
|
+
/**
|
|
2623
|
+
* Raw {@link AXPAiChatMessage} lines as persisted by the engine/mock (`aiTranscript` / `aiTranscriptDraft`),
|
|
2624
|
+
* without chat UI reordering.
|
|
2625
|
+
*/
|
|
2626
|
+
function axmReadAssistAiTranscriptRaw(metadata) {
|
|
2627
|
+
if (typeof metadata !== 'object' || metadata == null) {
|
|
2628
|
+
return [];
|
|
2629
|
+
}
|
|
2630
|
+
const m = metadata;
|
|
2631
|
+
const final = m['aiTranscript'];
|
|
2632
|
+
const draft = m['aiTranscriptDraft'];
|
|
2633
|
+
if (Array.isArray(final) && final.length > 0) {
|
|
2634
|
+
return final;
|
|
2635
|
+
}
|
|
2636
|
+
if (Array.isArray(draft) && draft.length > 0) {
|
|
2637
|
+
return draft;
|
|
2638
|
+
}
|
|
2639
|
+
return [];
|
|
2640
|
+
}
|
|
2641
|
+
//#endregion
|
|
2642
|
+
//#region ---- Layout / synthetic helpers ----
|
|
2643
|
+
/**
|
|
2644
|
+
* Transcript response discriminators ({@link AXPAiChatResponse} `type` values).
|
|
2645
|
+
* These must not be treated as {@link AXPWidgetNode} `type` when coercing unknown JSON.
|
|
2646
|
+
*/
|
|
2647
|
+
const AXM_ASSIST_TRANSCRIPT_NON_WIDGET_TYPES = new Set([
|
|
2648
|
+
'text',
|
|
2649
|
+
'think',
|
|
2650
|
+
'image',
|
|
2651
|
+
'audio',
|
|
2652
|
+
'file',
|
|
2653
|
+
'tool',
|
|
2654
|
+
'agent',
|
|
2655
|
+
'tool_result',
|
|
2656
|
+
'agent_result',
|
|
2657
|
+
]);
|
|
2658
|
+
const AXM_ASSIST_NODE_ENVELOPE_UNWRAP_MAX_DEPTH = 6;
|
|
2659
|
+
/**
|
|
2660
|
+
* Returns `content` as an {@link AXPWidgetNode} when it looks like a widget tree.
|
|
2661
|
+
* Rejects assistant transcript segment shapes (e.g. `{ type: 'text', content: '...' }`) and unwraps
|
|
2662
|
+
* a single `{ type: 'node', content: <widget> }` envelope if present.
|
|
2663
|
+
*/
|
|
2664
|
+
function axmAssistWidgetNodeFromUnknown(content, depth = 0) {
|
|
2665
|
+
if (depth > AXM_ASSIST_NODE_ENVELOPE_UNWRAP_MAX_DEPTH) {
|
|
2666
|
+
return null;
|
|
2667
|
+
}
|
|
2668
|
+
if (content == null || typeof content !== 'object' || Array.isArray(content)) {
|
|
2669
|
+
return null;
|
|
2670
|
+
}
|
|
2671
|
+
const rec = content;
|
|
2672
|
+
const t = rec['type'];
|
|
2673
|
+
if (typeof t !== 'string') {
|
|
2674
|
+
return null;
|
|
2675
|
+
}
|
|
2676
|
+
if (t === 'node' && 'content' in rec) {
|
|
2677
|
+
return axmAssistWidgetNodeFromUnknown(rec['content'], depth + 1);
|
|
2678
|
+
}
|
|
2679
|
+
if (AXM_ASSIST_TRANSCRIPT_NON_WIDGET_TYPES.has(t)) {
|
|
2680
|
+
return null;
|
|
2681
|
+
}
|
|
2682
|
+
return content;
|
|
2683
|
+
}
|
|
2684
|
+
/**
|
|
2685
|
+
* Returns the first `node` segment's content as an {@link AXPWidgetNode} when it looks like a widget tree.
|
|
2686
|
+
*/
|
|
2687
|
+
function axmAssistNodeAsLayoutNode(message) {
|
|
2688
|
+
if (message.role !== 'assistant') {
|
|
2689
|
+
return null;
|
|
2690
|
+
}
|
|
2691
|
+
const n = message.responses.find((r) => r.type === 'node');
|
|
2692
|
+
return n?.type === 'node' ? axmAssistWidgetNodeFromUnknown(n.content) : null;
|
|
2693
|
+
}
|
|
2694
|
+
/**
|
|
2695
|
+
* Builds a synthetic {@link AXMessage} for embedding default conversation renderers (text, image, etc.).
|
|
2696
|
+
*/
|
|
2697
|
+
function axmSyntheticEmbedMessage(parent, suffix, partial) {
|
|
2698
|
+
return {
|
|
2699
|
+
...parent,
|
|
2700
|
+
id: `${parent.id}::${suffix}`,
|
|
2701
|
+
type: partial.type,
|
|
2702
|
+
payload: partial.payload,
|
|
2703
|
+
metadata: { ...(typeof parent.metadata === 'object' && parent.metadata != null ? parent.metadata : {}), assistEmbed: true },
|
|
2704
|
+
replyTo: undefined,
|
|
2705
|
+
};
|
|
2706
|
+
}
|
|
2707
|
+
//#endregion
|
|
2708
|
+
//#region ---- Final deliverable (persisted message payload) ----
|
|
2709
|
+
/**
|
|
2710
|
+
* Parses assistant transcript text: strips {@code redacted_thinking} blocks into {@code thinking}
|
|
2711
|
+
* and returns the visible {@code body} (same rules as the assist message renderer).
|
|
2712
|
+
*/
|
|
2713
|
+
function axmParseAssistTranscriptTextEnvelope(raw) {
|
|
2714
|
+
if (!raw) {
|
|
2715
|
+
return { thinking: null, body: '' };
|
|
2716
|
+
}
|
|
2717
|
+
const normalized = raw.replace(/<(\/?redacted_thinking)>/gi, '<$1>');
|
|
2718
|
+
const parts = [];
|
|
2719
|
+
const body = normalized
|
|
2720
|
+
.replace(/<think>([\s\S]*?)<\/redacted_thinking>/gi, (_m, inner) => {
|
|
2721
|
+
const t = inner.trim();
|
|
2722
|
+
if (t) {
|
|
2723
|
+
parts.push(t);
|
|
2724
|
+
}
|
|
2725
|
+
return '';
|
|
2726
|
+
})
|
|
2727
|
+
.trim();
|
|
2728
|
+
return { thinking: parts.length ? parts.join('\n\n') : null, body };
|
|
2729
|
+
}
|
|
2730
|
+
function axmLastDelegatedAgentOutcomeSegments(transcript) {
|
|
2731
|
+
for (let i = transcript.length - 1; i >= 0; i--) {
|
|
2732
|
+
const line = transcript[i];
|
|
2733
|
+
if (!line || line.role !== 'tool') {
|
|
2734
|
+
continue;
|
|
2735
|
+
}
|
|
2736
|
+
for (const seg of line.responses) {
|
|
2737
|
+
if (seg.type !== 'agent_result') {
|
|
2738
|
+
continue;
|
|
2739
|
+
}
|
|
2740
|
+
const c = seg.content;
|
|
2741
|
+
if (c.success !== true || c.data == null || typeof c.data !== 'object' || Array.isArray(c.data)) {
|
|
2742
|
+
continue;
|
|
2743
|
+
}
|
|
2744
|
+
const responses = c.data['responses'];
|
|
2745
|
+
const parsed = axpAiParseDelegatedAgentResultSegmentsFromUnknown(responses);
|
|
2746
|
+
if (parsed.length > 0) {
|
|
2747
|
+
return parsed;
|
|
2748
|
+
}
|
|
2749
|
+
}
|
|
2750
|
+
}
|
|
2751
|
+
return null;
|
|
2752
|
+
}
|
|
2753
|
+
/**
|
|
2754
|
+
* Last chronological assistant {@code node} (renderable widget) or non-empty {@code text} segment wins.
|
|
2755
|
+
* When the transcript has no such segment, {@code fallbackText} is used as plain text.
|
|
2756
|
+
*/
|
|
2757
|
+
function axmExtractAssistFinalDeliverableFromTranscript(transcript, fallbackText) {
|
|
2758
|
+
let last = null;
|
|
2759
|
+
for (const line of transcript) {
|
|
2760
|
+
if (line.role !== 'assistant') {
|
|
2761
|
+
continue;
|
|
2762
|
+
}
|
|
2763
|
+
for (const seg of line.responses) {
|
|
2764
|
+
if (seg.type === 'node' && axmAssistWidgetNodeFromUnknown(seg.content) != null) {
|
|
2765
|
+
last = { kind: 'node', content: seg.content };
|
|
2766
|
+
}
|
|
2767
|
+
else if (seg.type === 'text') {
|
|
2768
|
+
const body = axmParseAssistTranscriptTextEnvelope(seg.content).body.trim();
|
|
2769
|
+
if (body) {
|
|
2770
|
+
last = { kind: 'text', text: seg.content };
|
|
2771
|
+
}
|
|
2772
|
+
}
|
|
2773
|
+
}
|
|
2774
|
+
}
|
|
2775
|
+
const delegatedSegs = axmLastDelegatedAgentOutcomeSegments(transcript);
|
|
2776
|
+
if (!last && delegatedSegs && delegatedSegs.length > 0) {
|
|
2777
|
+
for (let i = delegatedSegs.length - 1; i >= 0; i--) {
|
|
2778
|
+
const seg = delegatedSegs[i];
|
|
2779
|
+
if (seg.type === 'node' && axmAssistWidgetNodeFromUnknown(seg.content) != null) {
|
|
2780
|
+
last = { kind: 'node', content: seg.content };
|
|
2781
|
+
break;
|
|
2782
|
+
}
|
|
2783
|
+
}
|
|
2784
|
+
if (!last) {
|
|
2785
|
+
const textJoin = delegatedSegs
|
|
2786
|
+
.filter((s) => s.type === 'text')
|
|
2787
|
+
.map((s) => axmParseAssistTranscriptTextEnvelope(s.content).body.trim())
|
|
2788
|
+
.filter((t) => t.length > 0)
|
|
2789
|
+
.join('\n\n')
|
|
2790
|
+
.trim();
|
|
2791
|
+
if (textJoin) {
|
|
2792
|
+
last = { kind: 'text', text: textJoin };
|
|
2793
|
+
}
|
|
2794
|
+
}
|
|
2795
|
+
}
|
|
2796
|
+
if (last) {
|
|
2797
|
+
return last;
|
|
2798
|
+
}
|
|
2799
|
+
return { kind: 'text', text: fallbackText.trim() };
|
|
2800
|
+
}
|
|
2801
|
+
//#endregion
|
|
2802
|
+
|
|
2501
2803
|
/**
|
|
2502
2804
|
* True when the participant is an AI Assist peer (synthetic `assist-*` id or assist metadata).
|
|
2503
2805
|
* Such entries should not appear in human-only pickers (e.g. regular "New chat").
|
|
@@ -3337,7 +3639,7 @@ class AXMCommentComponent {
|
|
|
3337
3639
|
this.showToast(content, color);
|
|
3338
3640
|
}
|
|
3339
3641
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMCommentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
3340
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMCommentComponent, isStandalone: true, selector: "axm-comment", inputs: { refrenceType: { classPropertyName: "refrenceType", publicName: "refrenceType", isSignal: true, isRequired: true, transformFunction: null }, refrenceId: { classPropertyName: "refrenceId", publicName: "refrenceId", isSignal: true, isRequired: true, transformFunction: null }, subject: { classPropertyName: "subject", publicName: "subject", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "wysiwygEditor", first: true, predicate: ["w"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"size-full flex flex-col justify-between overflow-hidden\">\n <ax-comment-container class=\"overflow-auto\">\n @if (isLoading()) {\n <div class=\"flex items-center py-12 bg-lightest px-5\">\n <ax-skeleton class=\"min-w-16 h-16 rounded-full me-4\"></ax-skeleton>\n <div class=\"flex flex-col gap-2 w-full\">\n <ax-skeleton class=\"w-full h-6 rounded\"></ax-skeleton>\n <ax-skeleton class=\"w-full h-2 rounded-full\"></ax-skeleton>\n <ax-skeleton class=\"w-full h-2 rounded-full\"></ax-skeleton>\n <ax-skeleton class=\"w-8/12 h-2 rounded-full\"></ax-skeleton>\n </div>\n </div>\n } @else if (comments().length > 0) {\n <ax-comment-view class=\"bg-lightest\">\n @for (comment of comments(); track comment.id) {\n <ax-comment-item\n [id]=\"comment.id!\"\n [replyCount]=\"comment.replyCount\"\n [repliesExpanded]=\"isRepliesExpanded(comment.id!)\"\n (repliesExpandedChange)=\"onRepliesExpandedChange(comment.id!, $event)\"\n [class.highlighted]=\"highlightedCommentId() === comment.id\"\n [@fadeIn]\n >\n <axp-user-avatar #user [size]=\"40\" [userId]=\"comment.author.id\" ngProjectAs=\"'ax-avatar'\"></axp-user-avatar>\n <ax-title>{{ user.firstName() + ' ' + user.lastName() }}</ax-title>\n <ax-comment-date>{{ comment.auditInfo?.created?.at! | format: 'timeleft' | async }} </ax-comment-date>\n <ax-comment-menu-options>\n <ax-button class=\"ax-sm\" look=\"blank\" color=\"neutral\">\n <ax-icon icon=\"ax-icon ax-icon-solid ax-icon-more-horizontal\"></ax-icon>\n </ax-button>\n\n <ax-dropdown-panel>\n <ax-button-item-list>\n <ax-button-item\n [text]=\"('@conversation:comments.actions.edit.title' | translate | async) ?? ''\"\n color=\"neutral\"\n (click)=\"editMessage(comment, undefined, user.firstName() + ' ' + user.lastName())\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-edit\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n\n <ax-button-item\n [text]=\"('@conversation:comments.actions.delete.title' | translate | async) ?? ''\"\n color=\"danger\"\n (click)=\"deleteComment(comment.id!)\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-trash-can\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-comment-menu-options>\n <ax-content [innerHTML]=\"sanitizeHtml(comment.message.content)\"></ax-content>\n <ax-comment-like (click)=\"toggleLike(comment)\" [like]=\"isLikedByUser(comment)\">\n {{ getReactionsCount(comment) }}\n </ax-comment-like>\n <ax-comment-reply-text\n (click)=\"replyMessage(comment, undefined, user.firstName() + ' ' + user.lastName())\"\n ></ax-comment-reply-text>\n @for (reply of comment.replies; track reply.id) {\n <ax-comment-item [id]=\"reply.id\" [class.highlighted]=\"highlightedCommentId() === reply.id\" [@fadeIn]>\n <axp-user-avatar\n #user2\n [size]=\"40\"\n [userId]=\"reply.author.id\"\n ngProjectAs=\"'ax-avatar'\"\n ></axp-user-avatar>\n <ax-title>{{ user2.firstName() + ' ' + user2.lastName() }}</ax-title>\n <ax-comment-date>{{ reply.auditInfo?.created?.at! | format: 'timeleft' | async }} </ax-comment-date>\n <ax-comment-menu-options>\n <ax-button class=\"ax-sm\" look=\"blank\" color=\"neutral\">\n <ax-icon icon=\"ax-icon ax-icon-solid ax-icon-more-horizontal\"></ax-icon>\n </ax-button>\n\n <ax-dropdown-panel>\n <ax-button-item-list>\n <ax-button-item\n [text]=\"('@conversation:comments.actions.edit.title' | translate | async) ?? ''\"\n color=\"neutral\"\n (click)=\"editMessage(comment, reply, user2.firstName() + ' ' + user2.lastName())\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-edit\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n <ax-button-item\n [text]=\"('@conversation:comments.actions.delete.title' | translate | async) ?? ''\"\n color=\"danger\"\n (click)=\"deleteComment(reply.id!)\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-trash-can\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-comment-menu-options>\n <ax-content [innerHTML]=\"sanitizeHtml(reply.message.content)\"></ax-content>\n <ax-comment-like (click)=\"toggleLike(reply)\" [like]=\"isLikedByUser(reply)\">\n {{ getReactionsCount(reply) }}\n </ax-comment-like>\n <ax-comment-reply-text\n (click)=\"replyMessage(comment, reply, user2.firstName() + ' ' + user2.lastName())\"\n ></ax-comment-reply-text>\n </ax-comment-item>\n }\n </ax-comment-item>\n }\n </ax-comment-view>\n } @else {\n <div>\n <div class=\"flex flex-col gap-4 justify-center items-center p-10\">\n <svg\n class=\"mx-auto\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"154\"\n height=\"161\"\n viewBox=\"0 0 154 161\"\n fill=\"none\"\n >\n <path\n d=\"M0.0616455 84.4268C0.0616455 42.0213 34.435 7.83765 76.6507 7.83765C118.803 7.83765 153.224 42.0055 153.224 84.4268C153.224 102.42 147.026 118.974 136.622 132.034C122.282 150.138 100.367 161 76.6507 161C52.7759 161 30.9882 150.059 16.6633 132.034C6.25961 118.974 0.0616455 102.42 0.0616455 84.4268Z\"\n fill=\"#EEF2FF\"\n />\n <path\n d=\"M96.8189 0.632498L96.8189 0.632384L96.8083 0.630954C96.2034 0.549581 95.5931 0.5 94.9787 0.5H29.338C22.7112 0.5 17.3394 5.84455 17.3394 12.4473V142.715C17.3394 149.318 22.7112 154.662 29.338 154.662H123.948C130.591 154.662 135.946 149.317 135.946 142.715V38.9309C135.946 38.0244 135.847 37.1334 135.648 36.2586L135.648 36.2584C135.117 33.9309 133.874 31.7686 132.066 30.1333C132.066 30.1331 132.065 30.1329 132.065 30.1327L103.068 3.65203C103.068 3.6519 103.067 3.65177 103.067 3.65164C101.311 2.03526 99.1396 0.995552 96.8189 0.632498Z\"\n fill=\"white\"\n stroke=\"#E5E7EB\"\n />\n <ellipse cx=\"80.0618\" cy=\"81\" rx=\"28.0342\" ry=\"28.0342\" fill=\"#EEF2FF\" />\n <path\n d=\"M99.2393 61.3061L99.2391 61.3058C88.498 50.5808 71.1092 50.5804 60.3835 61.3061C49.6423 72.0316 49.6422 89.4361 60.3832 100.162C71.109 110.903 88.4982 110.903 99.2393 100.162C109.965 89.4363 109.965 72.0317 99.2393 61.3061ZM105.863 54.6832C120.249 69.0695 120.249 92.3985 105.863 106.785C91.4605 121.171 68.1468 121.171 53.7446 106.785C39.3582 92.3987 39.3582 69.0693 53.7446 54.683C68.1468 40.2965 91.4605 40.2966 105.863 54.6832Z\"\n stroke=\"#E5E7EB\"\n />\n <path\n d=\"M110.782 119.267L102.016 110.492C104.888 108.267 107.476 105.651 109.564 102.955L118.329 111.729L110.782 119.267Z\"\n stroke=\"#E5E7EB\"\n />\n <path\n d=\"M139.122 125.781L139.122 125.78L123.313 109.988C123.313 109.987 123.313 109.987 123.312 109.986C121.996 108.653 119.849 108.657 118.521 109.985L118.871 110.335L118.521 109.985L109.047 119.459C107.731 120.775 107.735 122.918 109.044 124.247L109.047 124.249L124.858 140.06C128.789 143.992 135.191 143.992 139.122 140.06C143.069 136.113 143.069 129.728 139.122 125.781Z\"\n fill=\"#A5B4FC\"\n stroke=\"#818CF8\"\n />\n <path\n d=\"M83.185 87.2285C82.5387 87.2285 82.0027 86.6926 82.0027 86.0305C82.0027 83.3821 77.9987 83.3821 77.9987 86.0305C77.9987 86.6926 77.4627 87.2285 76.8006 87.2285C76.1543 87.2285 75.6183 86.6926 75.6183 86.0305C75.6183 80.2294 84.3831 80.2451 84.3831 86.0305C84.3831 86.6926 83.8471 87.2285 83.185 87.2285Z\"\n fill=\"#4F46E5\"\n />\n <path\n d=\"M93.3528 77.0926H88.403C87.7409 77.0926 87.2049 76.5567 87.2049 75.8946C87.2049 75.2483 87.7409 74.7123 88.403 74.7123H93.3528C94.0149 74.7123 94.5509 75.2483 94.5509 75.8946C94.5509 76.5567 94.0149 77.0926 93.3528 77.0926Z\"\n fill=\"#4F46E5\"\n />\n <path\n d=\"M71.5987 77.0925H66.6488C65.9867 77.0925 65.4507 76.5565 65.4507 75.8945C65.4507 75.2481 65.9867 74.7122 66.6488 74.7122H71.5987C72.245 74.7122 72.781 75.2481 72.781 75.8945C72.781 76.5565 72.245 77.0925 71.5987 77.0925Z\"\n fill=\"#4F46E5\"\n />\n <rect x=\"38.3522\" y=\"21.5128\" width=\"41.0256\" height=\"2.73504\" rx=\"1.36752\" fill=\"#4F46E5\" />\n <rect x=\"38.3522\" y=\"133.65\" width=\"54.7009\" height=\"5.47009\" rx=\"2.73504\" fill=\"#A5B4FC\" />\n <rect x=\"38.3522\" y=\"29.7179\" width=\"13.6752\" height=\"2.73504\" rx=\"1.36752\" fill=\"#4F46E5\" />\n <circle cx=\"56.13\" cy=\"31.0854\" r=\"1.36752\" fill=\"#4F46E5\" />\n <circle cx=\"61.6001\" cy=\"31.0854\" r=\"1.36752\" fill=\"#4F46E5\" />\n <circle cx=\"67.0702\" cy=\"31.0854\" r=\"1.36752\" fill=\"#4F46E5\" />\n </svg>\n <div>\n <h2 class=\"text-center text-neutral-600 font-semibold leading-loose pb-2\">\n {{ '@conversation:comments.components.comment.empty-states.no-comments.title' | translate | async }}\n </h2>\n </div>\n </div>\n </div>\n }\n </ax-comment-container>\n <div class=\"flex flex-col\">\n @if (isReplyingMode() || isEditingMode()) {\n <div\n class=\"flex justify-between rounded-b-none border border-surface border-b-0 rounded-lg px-6 py-3 w-full items-center overflow-hidden text-sm leading-none\"\n >\n <div (click)=\"scrollMain()\" class=\"flex justify-start items-center cursor-pointer\">\n <i\n [class]=\"isReplyingMode() ? 'fa-reply' : 'fa-pen'\"\n class=\"fa-light text-primary-500 dark:text-primary-300 text-2xl me-4\"\n ></i>\n <div class=\"flex flex-col gap-2 justify-between align-middle leading-4 overflow-hidden\">\n <p class=\"text-primary-500 dark:text-primary-300\">\n @if (isReplyingMode()) {\n {{ '@conversation:comments.actions.reply-to' | translate | async }}\n <span class=\"font-bold\">{{ activeReplyComment()?.userName }}</span>\n } @else {\n {{ '@conversation:comments.actions.edit-message' | translate | async }}\n }\n </p>\n <div\n class=\"truncate\"\n [innerHTML]=\"\n isReplyingMode()\n ? sanitizeHtml(activeReplyComment()?.message?.content ?? '')\n : sanitizeHtml(activeEditComment()?.message?.content ?? '')\n \"\n ></div>\n </div>\n </div>\n <div><i (click)=\"resetReplyEditState()\" class=\"fa-light text-2xl fa-xmark cursor-pointer\"></i></div>\n </div>\n }\n <ax-wysiwyg-container #w [look]=\"wysiwygOptions().look\" [(ngModel)]=\"commentContent\">\n <ax-wysiwyg-view class=\"min-h-28\"></ax-wysiwyg-view>\n <ax-wysiwyg-toolbar>\n <ax-prefix>\n <ax-wysiwyg-history></ax-wysiwyg-history>\n <ax-wysiwyg-font-style></ax-wysiwyg-font-style>\n <ax-wysiwyg-colors></ax-wysiwyg-colors>\n <ax-wysiwyg-list></ax-wysiwyg-list>\n <ax-wysiwyg-alignment></ax-wysiwyg-alignment>\n </ax-prefix>\n <ax-suffix>\n <ax-button\n [disabled]=\"hasCooldown() || !commentContent()\"\n (click)=\"submitComment()\"\n [text]=\"'@conversation:comments.actions.send.title' | translate | async\"\n >\n @if (isSubmitting()) {\n <ax-loading></ax-loading>\n }\n </ax-button>\n </ax-suffix>\n </ax-wysiwyg-toolbar>\n </ax-wysiwyg-container>\n </div>\n</div>\n", styles: [":host{display:block;width:100%;height:100%}ax-wysiwyg-container .ax-editor-container{border-top-left-radius:0!important;border-top-right-radius:0!important}ax-wysiwyg-container .ax-error-message{padding-left:.5rem}ax-comment-item.highlighted{animation:comment-highlight-pulse 2.5s cubic-bezier(.4,0,.2,1) forwards}@keyframes comment-highlight-pulse{0%{background-color:transparent;box-shadow:inset 3px 0 0 0 transparent}10%{background-color:rgba(var(--ax-sys-color-primary-lightest-surface),.5);box-shadow:inset 3px 0 rgb(var(--ax-sys-color-primary-surface))}35%{background-color:rgba(var(--ax-sys-color-primary-lightest-surface),.3);box-shadow:inset 3px 0 rgba(var(--ax-sys-color-primary-lighter-surface),.8)}60%{background-color:rgba(var(--ax-sys-color-primary-lightest-surface),.4);box-shadow:inset 3px 0 rgba(var(--ax-sys-color-primary-lightest-surface),.6)}to{background-color:transparent;box-shadow:inset 3px 0 0 0 transparent}}\n"], dependencies: [{ kind: "ngmodule", type: AXWysiwygModule }, { kind: "component", type: i1$2.AXWysiwygContainerComponent, selector: "ax-wysiwyg-container", inputs: ["look", "readonly", "disabled", "value", "placeHolder"], outputs: ["onValueChanged"] }, { kind: "component", type: i1$2.AXWysiwygViewComponent, selector: "ax-wysiwyg-view" }, { kind: "component", type: i1$2.AXWysiwygAlignmentComponent, selector: "ax-wysiwyg-alignment" }, { kind: "component", type: i1$2.AXWysiwygColorsComponent, selector: "ax-wysiwyg-colors" }, { kind: "component", type: i1$2.AXWysiwygFontStyleComponent, selector: "ax-wysiwyg-font-style" }, { kind: "component", type: i1$2.AXWysiwygHistoryComponent, selector: "ax-wysiwyg-history" }, { kind: "component", type: i1$2.AXWysiwygListComponent, selector: "ax-wysiwyg-list" }, { kind: "component", type: i1$2.AXWysiwygToolbarComponent, selector: "ax-wysiwyg-toolbar" }, { kind: "ngmodule", type: AXConversationModule }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i2$1.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i1$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i1$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXCommentModule }, { kind: "component", type: i4.AXCommentViewComponent, selector: "ax-comment-view" }, { kind: "component", type: i4.AXCommentContainerComponent, selector: "ax-comment-container" }, { kind: "component", type: i4.AXCommentItemComponent, selector: "ax-comment-item", inputs: ["replyCount", "repliesExpanded"], outputs: ["repliesExpandedChange"] }, { kind: "component", type: i4.AXCommentLikeComponent, selector: "ax-comment-like", inputs: ["like"], outputs: ["likeChange"] }, { kind: "component", type: i4.AXMenuOptionsComponent, selector: "ax-comment-menu-options" }, { kind: "component", type: i4.AXCommentReplyTextComponent, selector: "ax-comment-reply-text" }, { kind: "component", type: i4.AXCommentDateComponent, selector: "ax-comment-date" }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i2.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: i2.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i2.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXAvatarModule }, { kind: "ngmodule", type: AXImageModule }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i6.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "component", type: i3.AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXFormatModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXFormModule }, { kind: "ngmodule", type: AXToolBarModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXDropdownButtonModule }, { kind: "component", type: AXPUserAvatarComponent, selector: "axp-user-avatar", inputs: ["size", "userId"] }, { kind: "pipe", type: i9.AXFormatPipe, name: "format" }, { kind: "pipe", type: i3$1.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], animations: [
|
|
3642
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMCommentComponent, isStandalone: true, selector: "axm-comment", inputs: { refrenceType: { classPropertyName: "refrenceType", publicName: "refrenceType", isSignal: true, isRequired: true, transformFunction: null }, refrenceId: { classPropertyName: "refrenceId", publicName: "refrenceId", isSignal: true, isRequired: true, transformFunction: null }, subject: { classPropertyName: "subject", publicName: "subject", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "wysiwygEditor", first: true, predicate: ["w"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"size-full flex flex-col justify-between overflow-hidden\">\n <ax-comment-container class=\"overflow-auto\">\n @if (isLoading()) {\n <div class=\"flex items-center py-12 bg-lightest px-5\">\n <ax-skeleton class=\"min-w-16 h-16 rounded-full me-4\"></ax-skeleton>\n <div class=\"flex flex-col gap-2 w-full\">\n <ax-skeleton class=\"w-full h-6 rounded\"></ax-skeleton>\n <ax-skeleton class=\"w-full h-2 rounded-full\"></ax-skeleton>\n <ax-skeleton class=\"w-full h-2 rounded-full\"></ax-skeleton>\n <ax-skeleton class=\"w-8/12 h-2 rounded-full\"></ax-skeleton>\n </div>\n </div>\n } @else if (comments().length > 0) {\n <ax-comment-view class=\"bg-lightest\">\n @for (comment of comments(); track comment.id) {\n <ax-comment-item\n [id]=\"comment.id!\"\n [replyCount]=\"comment.replyCount\"\n [repliesExpanded]=\"isRepliesExpanded(comment.id!)\"\n (repliesExpandedChange)=\"onRepliesExpandedChange(comment.id!, $event)\"\n [class.highlighted]=\"highlightedCommentId() === comment.id\"\n [@fadeIn]\n >\n <axp-user-avatar #user [size]=\"40\" [userId]=\"comment.author.id\" ngProjectAs=\"'ax-avatar'\"></axp-user-avatar>\n <ax-title>{{ user.firstName() + ' ' + user.lastName() }}</ax-title>\n <ax-comment-date>{{ comment.auditInfo?.created?.at! | format: 'timeleft' | async }} </ax-comment-date>\n <ax-comment-menu-options>\n <ax-button class=\"ax-sm\" look=\"blank\" color=\"neutral\">\n <ax-icon icon=\"ax-icon ax-icon-solid ax-icon-more-horizontal\"></ax-icon>\n </ax-button>\n\n <ax-dropdown-panel>\n <ax-button-item-list>\n <ax-button-item\n [text]=\"('@conversation:comments.actions.edit.title' | translate | async) ?? ''\"\n color=\"neutral\"\n (click)=\"editMessage(comment, undefined, user.firstName() + ' ' + user.lastName())\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-edit\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n\n <ax-button-item\n [text]=\"('@conversation:comments.actions.delete.title' | translate | async) ?? ''\"\n color=\"danger\"\n (click)=\"deleteComment(comment.id!)\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-trash-can\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-comment-menu-options>\n <ax-content [innerHTML]=\"sanitizeHtml(comment.message.content)\"></ax-content>\n <ax-comment-like (click)=\"toggleLike(comment)\" [like]=\"isLikedByUser(comment)\">\n {{ getReactionsCount(comment) }}\n </ax-comment-like>\n <ax-comment-reply-text\n (click)=\"replyMessage(comment, undefined, user.firstName() + ' ' + user.lastName())\"\n ></ax-comment-reply-text>\n @for (reply of comment.replies; track reply.id) {\n <ax-comment-item [id]=\"reply.id\" [class.highlighted]=\"highlightedCommentId() === reply.id\" [@fadeIn]>\n <axp-user-avatar\n #user2\n [size]=\"40\"\n [userId]=\"reply.author.id\"\n ngProjectAs=\"'ax-avatar'\"\n ></axp-user-avatar>\n <ax-title>{{ user2.firstName() + ' ' + user2.lastName() }}</ax-title>\n <ax-comment-date>{{ reply.auditInfo?.created?.at! | format: 'timeleft' | async }} </ax-comment-date>\n <ax-comment-menu-options>\n <ax-button class=\"ax-sm\" look=\"blank\" color=\"neutral\">\n <ax-icon icon=\"ax-icon ax-icon-solid ax-icon-more-horizontal\"></ax-icon>\n </ax-button>\n\n <ax-dropdown-panel>\n <ax-button-item-list>\n <ax-button-item\n [text]=\"('@conversation:comments.actions.edit.title' | translate | async) ?? ''\"\n color=\"neutral\"\n (click)=\"editMessage(comment, reply, user2.firstName() + ' ' + user2.lastName())\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-edit\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n <ax-button-item\n [text]=\"('@conversation:comments.actions.delete.title' | translate | async) ?? ''\"\n color=\"danger\"\n (click)=\"deleteComment(reply.id!)\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-trash-can\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-comment-menu-options>\n <ax-content [innerHTML]=\"sanitizeHtml(reply.message.content)\"></ax-content>\n <ax-comment-like (click)=\"toggleLike(reply)\" [like]=\"isLikedByUser(reply)\">\n {{ getReactionsCount(reply) }}\n </ax-comment-like>\n <ax-comment-reply-text\n (click)=\"replyMessage(comment, reply, user2.firstName() + ' ' + user2.lastName())\"\n ></ax-comment-reply-text>\n </ax-comment-item>\n }\n </ax-comment-item>\n }\n </ax-comment-view>\n } @else {\n <div>\n <div class=\"flex flex-col gap-4 justify-center items-center p-10\">\n <svg\n class=\"mx-auto\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"154\"\n height=\"161\"\n viewBox=\"0 0 154 161\"\n fill=\"none\"\n >\n <path\n d=\"M0.0616455 84.4268C0.0616455 42.0213 34.435 7.83765 76.6507 7.83765C118.803 7.83765 153.224 42.0055 153.224 84.4268C153.224 102.42 147.026 118.974 136.622 132.034C122.282 150.138 100.367 161 76.6507 161C52.7759 161 30.9882 150.059 16.6633 132.034C6.25961 118.974 0.0616455 102.42 0.0616455 84.4268Z\"\n fill=\"#EEF2FF\"\n />\n <path\n d=\"M96.8189 0.632498L96.8189 0.632384L96.8083 0.630954C96.2034 0.549581 95.5931 0.5 94.9787 0.5H29.338C22.7112 0.5 17.3394 5.84455 17.3394 12.4473V142.715C17.3394 149.318 22.7112 154.662 29.338 154.662H123.948C130.591 154.662 135.946 149.317 135.946 142.715V38.9309C135.946 38.0244 135.847 37.1334 135.648 36.2586L135.648 36.2584C135.117 33.9309 133.874 31.7686 132.066 30.1333C132.066 30.1331 132.065 30.1329 132.065 30.1327L103.068 3.65203C103.068 3.6519 103.067 3.65177 103.067 3.65164C101.311 2.03526 99.1396 0.995552 96.8189 0.632498Z\"\n fill=\"white\"\n stroke=\"#E5E7EB\"\n />\n <ellipse cx=\"80.0618\" cy=\"81\" rx=\"28.0342\" ry=\"28.0342\" fill=\"#EEF2FF\" />\n <path\n d=\"M99.2393 61.3061L99.2391 61.3058C88.498 50.5808 71.1092 50.5804 60.3835 61.3061C49.6423 72.0316 49.6422 89.4361 60.3832 100.162C71.109 110.903 88.4982 110.903 99.2393 100.162C109.965 89.4363 109.965 72.0317 99.2393 61.3061ZM105.863 54.6832C120.249 69.0695 120.249 92.3985 105.863 106.785C91.4605 121.171 68.1468 121.171 53.7446 106.785C39.3582 92.3987 39.3582 69.0693 53.7446 54.683C68.1468 40.2965 91.4605 40.2966 105.863 54.6832Z\"\n stroke=\"#E5E7EB\"\n />\n <path\n d=\"M110.782 119.267L102.016 110.492C104.888 108.267 107.476 105.651 109.564 102.955L118.329 111.729L110.782 119.267Z\"\n stroke=\"#E5E7EB\"\n />\n <path\n d=\"M139.122 125.781L139.122 125.78L123.313 109.988C123.313 109.987 123.313 109.987 123.312 109.986C121.996 108.653 119.849 108.657 118.521 109.985L118.871 110.335L118.521 109.985L109.047 119.459C107.731 120.775 107.735 122.918 109.044 124.247L109.047 124.249L124.858 140.06C128.789 143.992 135.191 143.992 139.122 140.06C143.069 136.113 143.069 129.728 139.122 125.781Z\"\n fill=\"#A5B4FC\"\n stroke=\"#818CF8\"\n />\n <path\n d=\"M83.185 87.2285C82.5387 87.2285 82.0027 86.6926 82.0027 86.0305C82.0027 83.3821 77.9987 83.3821 77.9987 86.0305C77.9987 86.6926 77.4627 87.2285 76.8006 87.2285C76.1543 87.2285 75.6183 86.6926 75.6183 86.0305C75.6183 80.2294 84.3831 80.2451 84.3831 86.0305C84.3831 86.6926 83.8471 87.2285 83.185 87.2285Z\"\n fill=\"#4F46E5\"\n />\n <path\n d=\"M93.3528 77.0926H88.403C87.7409 77.0926 87.2049 76.5567 87.2049 75.8946C87.2049 75.2483 87.7409 74.7123 88.403 74.7123H93.3528C94.0149 74.7123 94.5509 75.2483 94.5509 75.8946C94.5509 76.5567 94.0149 77.0926 93.3528 77.0926Z\"\n fill=\"#4F46E5\"\n />\n <path\n d=\"M71.5987 77.0925H66.6488C65.9867 77.0925 65.4507 76.5565 65.4507 75.8945C65.4507 75.2481 65.9867 74.7122 66.6488 74.7122H71.5987C72.245 74.7122 72.781 75.2481 72.781 75.8945C72.781 76.5565 72.245 77.0925 71.5987 77.0925Z\"\n fill=\"#4F46E5\"\n />\n <rect x=\"38.3522\" y=\"21.5128\" width=\"41.0256\" height=\"2.73504\" rx=\"1.36752\" fill=\"#4F46E5\" />\n <rect x=\"38.3522\" y=\"133.65\" width=\"54.7009\" height=\"5.47009\" rx=\"2.73504\" fill=\"#A5B4FC\" />\n <rect x=\"38.3522\" y=\"29.7179\" width=\"13.6752\" height=\"2.73504\" rx=\"1.36752\" fill=\"#4F46E5\" />\n <circle cx=\"56.13\" cy=\"31.0854\" r=\"1.36752\" fill=\"#4F46E5\" />\n <circle cx=\"61.6001\" cy=\"31.0854\" r=\"1.36752\" fill=\"#4F46E5\" />\n <circle cx=\"67.0702\" cy=\"31.0854\" r=\"1.36752\" fill=\"#4F46E5\" />\n </svg>\n <div>\n <h2 class=\"text-center text-neutral-600 font-semibold leading-loose pb-2\">\n {{ '@conversation:comments.components.comment.empty-states.no-comments.title' | translate | async }}\n </h2>\n </div>\n </div>\n </div>\n }\n </ax-comment-container>\n <div class=\"flex flex-col\">\n @if (isReplyingMode() || isEditingMode()) {\n <div\n class=\"flex justify-between rounded-b-none border border-surface border-b-0 rounded-lg px-6 py-3 w-full items-center overflow-hidden text-sm leading-none\"\n >\n <div (click)=\"scrollMain()\" class=\"flex justify-start items-center cursor-pointer\">\n <i\n [class]=\"isReplyingMode() ? 'fa-reply' : 'fa-pen'\"\n class=\"fa-light text-primary-500 dark:text-primary-300 text-2xl me-4\"\n ></i>\n <div class=\"flex flex-col gap-2 justify-between align-middle leading-4 overflow-hidden\">\n <p class=\"text-primary-500 dark:text-primary-300\">\n @if (isReplyingMode()) {\n {{ '@conversation:comments.actions.reply-to' | translate | async }}\n <span class=\"font-bold\">{{ activeReplyComment()?.userName }}</span>\n } @else {\n {{ '@conversation:comments.actions.edit-message' | translate | async }}\n }\n </p>\n <div\n class=\"truncate\"\n [innerHTML]=\"\n isReplyingMode()\n ? sanitizeHtml(activeReplyComment()?.message?.content ?? '')\n : sanitizeHtml(activeEditComment()?.message?.content ?? '')\n \"\n ></div>\n </div>\n </div>\n <div><i (click)=\"resetReplyEditState()\" class=\"fa-light text-2xl fa-xmark cursor-pointer\"></i></div>\n </div>\n }\n <ax-wysiwyg-container #w [look]=\"wysiwygOptions().look\" [(ngModel)]=\"commentContent\">\n <ax-wysiwyg-view class=\"min-h-28\"></ax-wysiwyg-view>\n <ax-wysiwyg-toolbar>\n <ax-prefix>\n <ax-wysiwyg-history></ax-wysiwyg-history>\n <ax-wysiwyg-font-style></ax-wysiwyg-font-style>\n <ax-wysiwyg-colors></ax-wysiwyg-colors>\n <ax-wysiwyg-list></ax-wysiwyg-list>\n <ax-wysiwyg-alignment></ax-wysiwyg-alignment>\n </ax-prefix>\n <ax-suffix>\n <ax-button\n [disabled]=\"hasCooldown() || !commentContent()\"\n (click)=\"submitComment()\"\n [text]=\"'@conversation:comments.actions.send.title' | translate | async\"\n >\n @if (isSubmitting()) {\n <ax-loading></ax-loading>\n }\n </ax-button>\n </ax-suffix>\n </ax-wysiwyg-toolbar>\n </ax-wysiwyg-container>\n </div>\n</div>\n", styles: [":host{display:block;width:100%;height:100%}ax-wysiwyg-container .ax-editor-container{border-top-left-radius:0!important;border-top-right-radius:0!important}ax-wysiwyg-container .ax-error-message{padding-left:.5rem}ax-comment-item.highlighted{animation:comment-highlight-pulse 2.5s cubic-bezier(.4,0,.2,1) forwards}@keyframes comment-highlight-pulse{0%{background-color:transparent;box-shadow:inset 3px 0 0 0 transparent}10%{background-color:rgba(var(--ax-sys-color-primary-lightest-surface),.5);box-shadow:inset 3px 0 rgb(var(--ax-sys-color-primary-surface))}35%{background-color:rgba(var(--ax-sys-color-primary-lightest-surface),.3);box-shadow:inset 3px 0 rgba(var(--ax-sys-color-primary-lighter-surface),.8)}60%{background-color:rgba(var(--ax-sys-color-primary-lightest-surface),.4);box-shadow:inset 3px 0 rgba(var(--ax-sys-color-primary-lightest-surface),.6)}to{background-color:transparent;box-shadow:inset 3px 0 0 0 transparent}}\n"], dependencies: [{ kind: "ngmodule", type: AXWysiwygModule }, { kind: "component", type: i1$2.AXWysiwygContainerComponent, selector: "ax-wysiwyg-container", inputs: ["look", "readonly", "disabled", "value", "placeHolder"], outputs: ["onValueChanged"] }, { kind: "component", type: i1$2.AXWysiwygViewComponent, selector: "ax-wysiwyg-view" }, { kind: "component", type: i1$2.AXWysiwygAlignmentComponent, selector: "ax-wysiwyg-alignment" }, { kind: "component", type: i1$2.AXWysiwygColorsComponent, selector: "ax-wysiwyg-colors" }, { kind: "component", type: i1$2.AXWysiwygFontStyleComponent, selector: "ax-wysiwyg-font-style" }, { kind: "component", type: i1$2.AXWysiwygHistoryComponent, selector: "ax-wysiwyg-history" }, { kind: "component", type: i1$2.AXWysiwygListComponent, selector: "ax-wysiwyg-list" }, { kind: "component", type: i1$2.AXWysiwygToolbarComponent, selector: "ax-wysiwyg-toolbar" }, { kind: "ngmodule", type: AXConversationModule }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i2$2.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i1$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i1$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXCommentModule }, { kind: "component", type: i4.AXCommentViewComponent, selector: "ax-comment-view" }, { kind: "component", type: i4.AXCommentContainerComponent, selector: "ax-comment-container" }, { kind: "component", type: i4.AXCommentItemComponent, selector: "ax-comment-item", inputs: ["replyCount", "repliesExpanded"], outputs: ["repliesExpandedChange"] }, { kind: "component", type: i4.AXCommentLikeComponent, selector: "ax-comment-like", inputs: ["like"], outputs: ["likeChange"] }, { kind: "component", type: i4.AXMenuOptionsComponent, selector: "ax-comment-menu-options" }, { kind: "component", type: i4.AXCommentReplyTextComponent, selector: "ax-comment-reply-text" }, { kind: "component", type: i4.AXCommentDateComponent, selector: "ax-comment-date" }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i2.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: i2.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i2.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXAvatarModule }, { kind: "ngmodule", type: AXImageModule }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i6.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "component", type: i3.AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXFormatModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXFormModule }, { kind: "ngmodule", type: AXToolBarModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXDropdownButtonModule }, { kind: "component", type: AXPUserAvatarComponent, selector: "axp-user-avatar", inputs: ["size", "userId"] }, { kind: "pipe", type: i9.AXFormatPipe, name: "format" }, { kind: "pipe", type: i2$1.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], animations: [
|
|
3341
3643
|
trigger('fadeIn', [
|
|
3342
3644
|
transition(':enter', [
|
|
3343
3645
|
style({ opacity: 0, transform: 'translateY(10px)' }),
|
|
@@ -3504,7 +3806,7 @@ class AXMCommentPopupComponent extends AXBasePageComponent {
|
|
|
3504
3806
|
// ACoreX
|
|
3505
3807
|
AXDecoratorModule }, { kind: "component", type: i1$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i2.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type:
|
|
3506
3808
|
// Comment
|
|
3507
|
-
AXMCommentComponent, selector: "axm-comment", inputs: ["refrenceType", "refrenceId", "subject"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type:
|
|
3809
|
+
AXMCommentComponent, selector: "axm-comment", inputs: ["refrenceType", "refrenceId", "subject"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i2$1.AXTranslatorPipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
3508
3810
|
}
|
|
3509
3811
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMCommentPopupComponent, decorators: [{
|
|
3510
3812
|
type: Component,
|
|
@@ -3639,38 +3941,366 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
3639
3941
|
type: Injectable
|
|
3640
3942
|
}], ctorParameters: () => [] });
|
|
3641
3943
|
|
|
3642
|
-
|
|
3643
|
-
|
|
3644
|
-
|
|
3645
|
-
|
|
3646
|
-
|
|
3647
|
-
|
|
3648
|
-
|
|
3649
|
-
this.modelCatalog = inject(AXPAiAssistChatModelCatalogService);
|
|
3650
|
-
this.entityService = inject(AXPEntityService);
|
|
3651
|
-
this.settingsService = inject(AXPSettingsService);
|
|
3652
|
-
this.debugModeEnabled = signal(false, ...(ngDevMode ? [{ debugName: "debugModeEnabled" }] : /* istanbul ignore next */ []));
|
|
3653
|
-
this.assistData = this.entityService
|
|
3654
|
-
.withEntity(RootConfig$1.module.name, RootConfig$1.entities.assist.name)
|
|
3655
|
-
.data();
|
|
3656
|
-
//#endregion
|
|
3657
|
-
//#region ---- State ----
|
|
3658
|
-
this.error = signal(false, ...(ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []));
|
|
3659
|
-
this.resolvedModelTitle = signal(undefined, ...(ngDevMode ? [{ debugName: "resolvedModelTitle" }] : /* istanbul ignore next */ []));
|
|
3660
|
-
this.isAssistConversation = signal(false, ...(ngDevMode ? [{ debugName: "isAssistConversation" }] : /* istanbul ignore next */ []));
|
|
3661
|
-
this.ariaLabel = computed(() => this.resolvedModelTitle() ?? '', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
|
|
3662
|
-
this.currentConversationId = null;
|
|
3663
|
-
this.loadDebugMode = effect(() => {
|
|
3664
|
-
void this.syncDebugMode();
|
|
3665
|
-
}, ...(ngDevMode ? [{ debugName: "loadDebugMode" }] : /* istanbul ignore next */ []));
|
|
3666
|
-
//#endregion
|
|
3667
|
-
//#region ---- Effects ----
|
|
3668
|
-
this.loadOnConversationChange = effect(() => {
|
|
3669
|
-
const conversation = this.conversation();
|
|
3670
|
-
void this.syncModels(conversation);
|
|
3671
|
-
}, ...(ngDevMode ? [{ debugName: "loadOnConversationChange" }] : /* istanbul ignore next */ []));
|
|
3944
|
+
//#region ---- Imports ----
|
|
3945
|
+
//#endregion
|
|
3946
|
+
//#region ---- Message classification ----
|
|
3947
|
+
/** True when the message carries assist / AI debug payload worth exporting. */
|
|
3948
|
+
function axmIsAssistDebugMessage(message) {
|
|
3949
|
+
if (!message) {
|
|
3950
|
+
return false;
|
|
3672
3951
|
}
|
|
3673
|
-
|
|
3952
|
+
if (message.type === 'assist-response') {
|
|
3953
|
+
return true;
|
|
3954
|
+
}
|
|
3955
|
+
const meta = message.metadata;
|
|
3956
|
+
if (meta?.['isAssistResponse'] === true) {
|
|
3957
|
+
return true;
|
|
3958
|
+
}
|
|
3959
|
+
const transcript = axmReadAssistAiTranscript(meta);
|
|
3960
|
+
return transcript != null && transcript.length > 0;
|
|
3961
|
+
}
|
|
3962
|
+
//#endregion
|
|
3963
|
+
//#region ---- Serialization ----
|
|
3964
|
+
function toIsoTimestamp(value) {
|
|
3965
|
+
if (value instanceof Date) {
|
|
3966
|
+
return value.toISOString();
|
|
3967
|
+
}
|
|
3968
|
+
if (typeof value === 'string' || typeof value === 'number') {
|
|
3969
|
+
const parsed = new Date(value);
|
|
3970
|
+
if (!Number.isNaN(parsed.getTime())) {
|
|
3971
|
+
return parsed.toISOString();
|
|
3972
|
+
}
|
|
3973
|
+
}
|
|
3974
|
+
return String(value ?? '');
|
|
3975
|
+
}
|
|
3976
|
+
function readRecord(meta, key) {
|
|
3977
|
+
return meta?.[key];
|
|
3978
|
+
}
|
|
3979
|
+
/**
|
|
3980
|
+
* Reconstructs {@link AXPAiEngineRunResult} from assist message metadata
|
|
3981
|
+
* (same shape returned by {@link AXPAiEngine.run}).
|
|
3982
|
+
*/
|
|
3983
|
+
function axmBuildAssistEngineRunResult(message) {
|
|
3984
|
+
const meta = typeof message.metadata === 'object' && message.metadata != null
|
|
3985
|
+
? message.metadata
|
|
3986
|
+
: undefined;
|
|
3987
|
+
const result = {
|
|
3988
|
+
messages: axmReadAssistAiTranscriptRaw(meta),
|
|
3989
|
+
};
|
|
3990
|
+
const usage = readRecord(meta, 'assistRunUsageTotals');
|
|
3991
|
+
if (usage != null && typeof usage === 'object') {
|
|
3992
|
+
result.usageTotals = usage;
|
|
3993
|
+
}
|
|
3994
|
+
const lastProvider = readRecord(meta, 'assistRunLastProviderResult');
|
|
3995
|
+
if (lastProvider != null && typeof lastProvider === 'object') {
|
|
3996
|
+
result.lastProviderResult = lastProvider;
|
|
3997
|
+
}
|
|
3998
|
+
const delegated = readRecord(meta, 'assistRunDelegatedTranscriptsByCallId');
|
|
3999
|
+
if (delegated != null && typeof delegated === 'object' && !Array.isArray(delegated)) {
|
|
4000
|
+
result.delegatedTranscriptsByCallId = delegated;
|
|
4001
|
+
}
|
|
4002
|
+
return result;
|
|
4003
|
+
}
|
|
4004
|
+
function isRecord$1(value) {
|
|
4005
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
4006
|
+
}
|
|
4007
|
+
function extractUserChatText(message) {
|
|
4008
|
+
const payload = message.payload;
|
|
4009
|
+
if (!isRecord$1(payload)) {
|
|
4010
|
+
return '';
|
|
4011
|
+
}
|
|
4012
|
+
const text = payload['text'];
|
|
4013
|
+
return typeof text === 'string' ? text.trim() : '';
|
|
4014
|
+
}
|
|
4015
|
+
/** User chat line as a minimal engine run result (`messages` only). */
|
|
4016
|
+
function axmBuildUserTurnEngineRunResult(message) {
|
|
4017
|
+
const text = extractUserChatText(message);
|
|
4018
|
+
return {
|
|
4019
|
+
messages: text ? [axpAiChatTextMessage('user', text)] : [],
|
|
4020
|
+
};
|
|
4021
|
+
}
|
|
4022
|
+
/**
|
|
4023
|
+
* Pretty-printed JSON for clipboard export (single assist run — {@link AXPAiEngineRunResult}).
|
|
4024
|
+
*/
|
|
4025
|
+
function axmFormatAssistMessageDebugText(message) {
|
|
4026
|
+
const run = axmIsAssistDebugMessage(message)
|
|
4027
|
+
? axmBuildAssistEngineRunResult(message)
|
|
4028
|
+
: axmBuildUserTurnEngineRunResult(message);
|
|
4029
|
+
return JSON.stringify(run, null, 2);
|
|
4030
|
+
}
|
|
4031
|
+
/**
|
|
4032
|
+
* Pretty-printed JSON for clipboard export (conversation turns as engine run results).
|
|
4033
|
+
*/
|
|
4034
|
+
function axmFormatAssistConversationDebugText(conversation, messages) {
|
|
4035
|
+
const chronological = [...messages].sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());
|
|
4036
|
+
const turns = chronological.map((message) => ({
|
|
4037
|
+
messageId: message.id,
|
|
4038
|
+
timestamp: toIsoTimestamp(message.timestamp),
|
|
4039
|
+
result: axmIsAssistDebugMessage(message)
|
|
4040
|
+
? axmBuildAssistEngineRunResult(message)
|
|
4041
|
+
: axmBuildUserTurnEngineRunResult(message),
|
|
4042
|
+
}));
|
|
4043
|
+
const snapshot = {
|
|
4044
|
+
exportedAt: new Date().toISOString(),
|
|
4045
|
+
conversation: {
|
|
4046
|
+
id: conversation.id ?? '',
|
|
4047
|
+
title: conversation.title,
|
|
4048
|
+
type: conversation.type,
|
|
4049
|
+
metadata: conversation.metadata,
|
|
4050
|
+
participants: conversation.participants,
|
|
4051
|
+
},
|
|
4052
|
+
turns,
|
|
4053
|
+
};
|
|
4054
|
+
return JSON.stringify(snapshot, null, 2);
|
|
4055
|
+
}
|
|
4056
|
+
/** Safe fragment for debug export filenames. */
|
|
4057
|
+
function axmSanitizeDebugFilenamePart(id) {
|
|
4058
|
+
const sanitized = id.replace(/[^\w.-]+/g, '_').slice(0, 80).trim();
|
|
4059
|
+
return sanitized.length > 0 ? sanitized : 'debug';
|
|
4060
|
+
}
|
|
4061
|
+
/** Triggers a browser download of pretty-printed JSON debug export. */
|
|
4062
|
+
function axmDownloadDebugJson(filename, text) {
|
|
4063
|
+
if (!text.trim() || typeof document === 'undefined') {
|
|
4064
|
+
return;
|
|
4065
|
+
}
|
|
4066
|
+
const blob = new Blob([text], { type: 'application/json;charset=utf-8' });
|
|
4067
|
+
const url = URL.createObjectURL(blob);
|
|
4068
|
+
const anchor = document.createElement('a');
|
|
4069
|
+
anchor.href = url;
|
|
4070
|
+
anchor.download = filename.endsWith('.json') ? filename : `${filename}.json`;
|
|
4071
|
+
anchor.rel = 'noopener';
|
|
4072
|
+
anchor.click();
|
|
4073
|
+
URL.revokeObjectURL(url);
|
|
4074
|
+
}
|
|
4075
|
+
//#endregion
|
|
4076
|
+
|
|
4077
|
+
//#region ---- Imports ----
|
|
4078
|
+
//#endregion
|
|
4079
|
+
//#region ---- Constants ----
|
|
4080
|
+
const DOWNLOAD_DEBUG_ACTION_ID = 'download-debug-information';
|
|
4081
|
+
const DOWNLOAD_DEBUG_LABEL = '@conversation:chat.actions.download-debug-information';
|
|
4082
|
+
//#endregion
|
|
4083
|
+
//#region ---- Helpers ----
|
|
4084
|
+
function isAssistConversation(conversation) {
|
|
4085
|
+
const assistId = conversation?.metadata?.['assistId'];
|
|
4086
|
+
return typeof assistId === 'string' && assistId.trim().length > 0;
|
|
4087
|
+
}
|
|
4088
|
+
function isDebugExportVisible() {
|
|
4089
|
+
return axmAssistChatDebugModeState.resolved && axmAssistChatDebugModeState.enabled;
|
|
4090
|
+
}
|
|
4091
|
+
function isAssistMessageDebugExportVisible(message) {
|
|
4092
|
+
return isDebugExportVisible() && axmIsAssistDebugMessage(message);
|
|
4093
|
+
}
|
|
4094
|
+
function isAssistConversationDebugExportVisible(context) {
|
|
4095
|
+
return (isDebugExportVisible() &&
|
|
4096
|
+
isAssistConversation(context?.conversation) &&
|
|
4097
|
+
!!context?.conversation?.id?.trim());
|
|
4098
|
+
}
|
|
4099
|
+
async function loadAllConversationMessages(messageApi, conversationId) {
|
|
4100
|
+
const pageSize = 100;
|
|
4101
|
+
let page = 0;
|
|
4102
|
+
const collected = [];
|
|
4103
|
+
while (true) {
|
|
4104
|
+
const pagination = { page, pageSize };
|
|
4105
|
+
const result = await messageApi.getMessages(conversationId, pagination);
|
|
4106
|
+
collected.push(...result.items);
|
|
4107
|
+
if (!result.hasMore) {
|
|
4108
|
+
break;
|
|
4109
|
+
}
|
|
4110
|
+
page += 1;
|
|
4111
|
+
}
|
|
4112
|
+
return collected;
|
|
4113
|
+
}
|
|
4114
|
+
//#endregion
|
|
4115
|
+
//#region ---- Message action ----
|
|
4116
|
+
const AXM_DOWNLOAD_ASSIST_MESSAGE_DEBUG_ACTION = {
|
|
4117
|
+
id: DOWNLOAD_DEBUG_ACTION_ID,
|
|
4118
|
+
label: DOWNLOAD_DEBUG_LABEL,
|
|
4119
|
+
icon: 'fa-light fa-download',
|
|
4120
|
+
priority: 94,
|
|
4121
|
+
visible: (message) => isAssistMessageDebugExportVisible(message),
|
|
4122
|
+
enabled: (message) => isAssistMessageDebugExportVisible(message),
|
|
4123
|
+
handler: async (context) => {
|
|
4124
|
+
const debugMode = inject(AXMAssistChatDebugModeService);
|
|
4125
|
+
if (!debugMode.isDebugModeActive()) {
|
|
4126
|
+
return;
|
|
4127
|
+
}
|
|
4128
|
+
const text = axmFormatAssistMessageDebugText(context.message);
|
|
4129
|
+
const filename = `assist-debug-message-${axmSanitizeDebugFilenamePart(context.message.id)}.json`;
|
|
4130
|
+
axmDownloadDebugJson(filename, text);
|
|
4131
|
+
},
|
|
4132
|
+
};
|
|
4133
|
+
//#endregion
|
|
4134
|
+
//#region ---- Conversation item action ----
|
|
4135
|
+
const AXM_DOWNLOAD_ASSIST_CONVERSATION_DEBUG_ACTION = {
|
|
4136
|
+
id: DOWNLOAD_DEBUG_ACTION_ID,
|
|
4137
|
+
label: DOWNLOAD_DEBUG_LABEL,
|
|
4138
|
+
icon: 'fa-light fa-download',
|
|
4139
|
+
priority: 105,
|
|
4140
|
+
visible: (context) => isAssistConversationDebugExportVisible(context),
|
|
4141
|
+
enabled: true,
|
|
4142
|
+
handler: async (context) => {
|
|
4143
|
+
const debugMode = inject(AXMAssistChatDebugModeService);
|
|
4144
|
+
const messageApi = context.messageApi ?? inject(AXMessageApi);
|
|
4145
|
+
const conversation = context.conversation;
|
|
4146
|
+
const conversationId = conversation?.id?.trim();
|
|
4147
|
+
if (!debugMode.isDebugModeActive() || !conversationId || !conversation) {
|
|
4148
|
+
return;
|
|
4149
|
+
}
|
|
4150
|
+
const messages = await loadAllConversationMessages(messageApi, conversationId);
|
|
4151
|
+
const text = axmFormatAssistConversationDebugText(conversation, messages);
|
|
4152
|
+
const filename = `assist-debug-conversation-${axmSanitizeDebugFilenamePart(conversationId)}.json`;
|
|
4153
|
+
axmDownloadDebugJson(filename, text);
|
|
4154
|
+
},
|
|
4155
|
+
};
|
|
4156
|
+
//#endregion
|
|
4157
|
+
|
|
4158
|
+
//#region ---- Imports ----
|
|
4159
|
+
//#endregion
|
|
4160
|
+
//#region ---- Helpers ----
|
|
4161
|
+
/** True when the conversation is an assist / AI bot chat. */
|
|
4162
|
+
function axmIsAssistBotConversation(conversation) {
|
|
4163
|
+
if (conversation.type === 'bot') {
|
|
4164
|
+
return true;
|
|
4165
|
+
}
|
|
4166
|
+
const fromMeta = conversation.metadata?.['assistId'];
|
|
4167
|
+
if (typeof fromMeta === 'string' && fromMeta.trim().length > 0) {
|
|
4168
|
+
return true;
|
|
4169
|
+
}
|
|
4170
|
+
for (const participant of conversation.participants ?? []) {
|
|
4171
|
+
if (typeof participant.id === 'string' && participant.id.startsWith('assist-')) {
|
|
4172
|
+
return true;
|
|
4173
|
+
}
|
|
4174
|
+
const fromParticipant = participant.metadata?.['assistId'];
|
|
4175
|
+
if (typeof fromParticipant === 'string' && fromParticipant.trim().length > 0) {
|
|
4176
|
+
return true;
|
|
4177
|
+
}
|
|
4178
|
+
}
|
|
4179
|
+
return false;
|
|
4180
|
+
}
|
|
4181
|
+
//#endregion
|
|
4182
|
+
//#region ---- Bot tab ----
|
|
4183
|
+
/** Sidebar tab for AI assist conversations (`type: 'bot'` or assist metadata). */
|
|
4184
|
+
const AXM_CONVERSATION_TAB_BOT = {
|
|
4185
|
+
id: 'bot',
|
|
4186
|
+
label: '@conversation:chat.tabs.bot',
|
|
4187
|
+
icon: 'fa-light fa-robot',
|
|
4188
|
+
priority: 30,
|
|
4189
|
+
filter: (conversations) => conversations.filter((conversation) => axmIsAssistBotConversation(conversation)),
|
|
4190
|
+
};
|
|
4191
|
+
//#endregion
|
|
4192
|
+
|
|
4193
|
+
//#region ---- Imports ----
|
|
4194
|
+
//#endregion
|
|
4195
|
+
//#region ---- Rename handler ----
|
|
4196
|
+
async function renameAssistConversation(conversation, services) {
|
|
4197
|
+
const conversationId = conversation.id?.trim();
|
|
4198
|
+
if (!conversationId) {
|
|
4199
|
+
return;
|
|
4200
|
+
}
|
|
4201
|
+
const [dialogTitle, cancelLabel, saveLabel, placeholder] = await Promise.all([
|
|
4202
|
+
services.translationService.translateAsync('@conversation:chat.assist-conversation.rename.title'),
|
|
4203
|
+
services.translationService.translateAsync('@conversation:comments.actions.cancel.title'),
|
|
4204
|
+
services.translationService.translateAsync('@conversation:chat.assist-conversation.rename.actions.save'),
|
|
4205
|
+
services.translationService.translateAsync('@conversation:chat.assist-conversation.rename.placeholder'),
|
|
4206
|
+
]);
|
|
4207
|
+
const nextTitle = await services.layoutBuilder
|
|
4208
|
+
.create()
|
|
4209
|
+
.dialog((dialog) => {
|
|
4210
|
+
dialog
|
|
4211
|
+
.setTitle(dialogTitle ?? 'Rename Chat')
|
|
4212
|
+
.setSize('sm')
|
|
4213
|
+
.setCloseButton(true)
|
|
4214
|
+
.setContext({ title: conversation.title ?? '' })
|
|
4215
|
+
.content((flex) => {
|
|
4216
|
+
flex.setDirection('column').setGap('10px');
|
|
4217
|
+
flex.formField('', (field) => {
|
|
4218
|
+
field.path('title');
|
|
4219
|
+
field.textBox({ placeholder: placeholder ?? '' });
|
|
4220
|
+
});
|
|
4221
|
+
})
|
|
4222
|
+
.setActions((actions) => {
|
|
4223
|
+
actions.cancel(cancelLabel ?? 'Cancel').submit(saveLabel ?? 'Save');
|
|
4224
|
+
})
|
|
4225
|
+
.onAction(async (dialogRef) => {
|
|
4226
|
+
if (dialogRef.action() === 'cancel') {
|
|
4227
|
+
return false;
|
|
4228
|
+
}
|
|
4229
|
+
const title = String(dialogRef.context().title ?? '').trim();
|
|
4230
|
+
if (!title) {
|
|
4231
|
+
return false;
|
|
4232
|
+
}
|
|
4233
|
+
return title;
|
|
4234
|
+
});
|
|
4235
|
+
})
|
|
4236
|
+
.show();
|
|
4237
|
+
if (typeof nextTitle !== 'string' || !nextTitle || nextTitle === (conversation.title ?? '').trim()) {
|
|
4238
|
+
return;
|
|
4239
|
+
}
|
|
4240
|
+
await services.conversationService.updateConversation(conversationId, {
|
|
4241
|
+
title: nextTitle,
|
|
4242
|
+
metadata: {
|
|
4243
|
+
...(conversation.metadata ?? {}),
|
|
4244
|
+
isTitleCustomized: true,
|
|
4245
|
+
isTitleAutoGenerated: false,
|
|
4246
|
+
},
|
|
4247
|
+
});
|
|
4248
|
+
}
|
|
4249
|
+
//#endregion
|
|
4250
|
+
//#region ---- Action ----
|
|
4251
|
+
const AXM_RENAME_ASSIST_CONVERSATION_ACTION = {
|
|
4252
|
+
id: 'rename-assist-conversation',
|
|
4253
|
+
label: '@conversation:chat.assist-conversation.rename.action',
|
|
4254
|
+
icon: 'fa-light fa-pen',
|
|
4255
|
+
priority: 110,
|
|
4256
|
+
visible: (context) => axmIsAssistBotConversation(context.conversation),
|
|
4257
|
+
enabled: true,
|
|
4258
|
+
handler: async (context) => {
|
|
4259
|
+
const conversation = context.conversation;
|
|
4260
|
+
if (!conversation) {
|
|
4261
|
+
return;
|
|
4262
|
+
}
|
|
4263
|
+
await renameAssistConversation(conversation, {
|
|
4264
|
+
layoutBuilder: inject(AXPLayoutBuilderService),
|
|
4265
|
+
conversationService: inject(AXConversationService),
|
|
4266
|
+
translationService: inject(AXTranslationService),
|
|
4267
|
+
});
|
|
4268
|
+
},
|
|
4269
|
+
};
|
|
4270
|
+
//#endregion
|
|
4271
|
+
|
|
4272
|
+
class AXMChatInfoBarAssistModelActionComponent {
|
|
4273
|
+
constructor() {
|
|
4274
|
+
//#region ---- Inputs ----
|
|
4275
|
+
this.conversation = input.required(...(ngDevMode ? [{ debugName: "conversation" }] : /* istanbul ignore next */ []));
|
|
4276
|
+
this.service = input(undefined, ...(ngDevMode ? [{ debugName: "service" }] : /* istanbul ignore next */ []));
|
|
4277
|
+
//#endregion
|
|
4278
|
+
//#region ---- Services & Dependencies ----
|
|
4279
|
+
this.modelCatalog = inject(AXPAiAssistChatModelCatalogService);
|
|
4280
|
+
this.entityService = inject(AXPEntityService);
|
|
4281
|
+
this.settingsService = inject(AXPSettingsService);
|
|
4282
|
+
this.debugModeEnabled = signal(false, ...(ngDevMode ? [{ debugName: "debugModeEnabled" }] : /* istanbul ignore next */ []));
|
|
4283
|
+
this.assistData = this.entityService
|
|
4284
|
+
.withEntity(RootConfig$1.module.name, RootConfig$1.entities.assist.name)
|
|
4285
|
+
.data();
|
|
4286
|
+
//#endregion
|
|
4287
|
+
//#region ---- State ----
|
|
4288
|
+
this.error = signal(false, ...(ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []));
|
|
4289
|
+
this.resolvedModelTitle = signal(undefined, ...(ngDevMode ? [{ debugName: "resolvedModelTitle" }] : /* istanbul ignore next */ []));
|
|
4290
|
+
this.isAssistConversation = signal(false, ...(ngDevMode ? [{ debugName: "isAssistConversation" }] : /* istanbul ignore next */ []));
|
|
4291
|
+
this.ariaLabel = computed(() => this.resolvedModelTitle() ?? '', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
|
|
4292
|
+
this.currentConversationId = null;
|
|
4293
|
+
this.loadDebugMode = effect(() => {
|
|
4294
|
+
void this.syncDebugMode();
|
|
4295
|
+
}, ...(ngDevMode ? [{ debugName: "loadDebugMode" }] : /* istanbul ignore next */ []));
|
|
4296
|
+
//#endregion
|
|
4297
|
+
//#region ---- Effects ----
|
|
4298
|
+
this.loadOnConversationChange = effect(() => {
|
|
4299
|
+
const conversation = this.conversation();
|
|
4300
|
+
void this.syncModels(conversation);
|
|
4301
|
+
}, ...(ngDevMode ? [{ debugName: "loadOnConversationChange" }] : /* istanbul ignore next */ []));
|
|
4302
|
+
}
|
|
4303
|
+
async syncDebugMode() {
|
|
3674
4304
|
try {
|
|
3675
4305
|
const debugMode = await this.settingsService.get(AXPCommonSettings.DebugMode);
|
|
3676
4306
|
this.debugModeEnabled.set(!!debugMode);
|
|
@@ -3765,7 +4395,7 @@ class AXMChatInfoBarAssistModelActionComponent {
|
|
|
3765
4395
|
}
|
|
3766
4396
|
</div>
|
|
3767
4397
|
}
|
|
3768
|
-
`, isInline: true, styles: [":host{display:block;width:100%}.axm-chat-assist-model-action{width:min(100%,24rem)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type:
|
|
4398
|
+
`, isInline: true, styles: [":host{display:block;width:100%}.axm-chat-assist-model-action{width:min(100%,24rem)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i2$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
3769
4399
|
}
|
|
3770
4400
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatInfoBarAssistModelActionComponent, decorators: [{
|
|
3771
4401
|
type: Component,
|
|
@@ -3818,317 +4448,75 @@ const AXM_CHAT_INFO_BAR_ASSIST_MODEL_ACTION = {
|
|
|
3818
4448
|
|
|
3819
4449
|
//#region ---- Imports ----
|
|
3820
4450
|
//#endregion
|
|
3821
|
-
//#region ----
|
|
3822
|
-
|
|
3823
|
-
|
|
3824
|
-
|
|
3825
|
-
* This matches chronological expectation (agent call and its result appear before the
|
|
3826
|
-
* assistant's closing message).
|
|
3827
|
-
*/
|
|
3828
|
-
function axmNormalizeAssistTranscriptForChatUi(input) {
|
|
3829
|
-
if (input.length === 0) {
|
|
3830
|
-
return input;
|
|
3831
|
-
}
|
|
3832
|
-
const thinkParts = [];
|
|
3833
|
-
const textParts = [];
|
|
3834
|
-
const middle = [];
|
|
3835
|
-
for (const m of input) {
|
|
3836
|
-
if (m.role === 'tool' || m.role === 'user' || m.role === 'system') {
|
|
3837
|
-
middle.push(m);
|
|
3838
|
-
continue;
|
|
3839
|
-
}
|
|
3840
|
-
if (m.role !== 'assistant') {
|
|
3841
|
-
middle.push(m);
|
|
3842
|
-
continue;
|
|
3843
|
-
}
|
|
3844
|
-
for (const r of m.responses) {
|
|
3845
|
-
if (r.type === 'think') {
|
|
3846
|
-
thinkParts.push(r.content);
|
|
3847
|
-
}
|
|
3848
|
-
else if (r.type === 'text') {
|
|
3849
|
-
textParts.push(r.content);
|
|
3850
|
-
}
|
|
3851
|
-
else {
|
|
3852
|
-
middle.push({ role: 'assistant', responses: [r] });
|
|
3853
|
-
}
|
|
3854
|
-
}
|
|
4451
|
+
//#region ---- Dialog ----
|
|
4452
|
+
function cloneMessagesForJsonViewer(messages) {
|
|
4453
|
+
try {
|
|
4454
|
+
return structuredClone(messages);
|
|
3855
4455
|
}
|
|
3856
|
-
|
|
3857
|
-
|
|
3858
|
-
out.push({
|
|
3859
|
-
role: 'assistant',
|
|
3860
|
-
responses: [{ type: 'think', content: thinkParts.join('\n\n') }],
|
|
3861
|
-
});
|
|
4456
|
+
catch {
|
|
4457
|
+
return JSON.parse(JSON.stringify(messages));
|
|
3862
4458
|
}
|
|
3863
|
-
out.push(...middle);
|
|
3864
|
-
if (textParts.length > 0) {
|
|
3865
|
-
out.push({
|
|
3866
|
-
role: 'assistant',
|
|
3867
|
-
responses: [{ type: 'text', content: textParts.join('\n\n') }],
|
|
3868
|
-
});
|
|
3869
|
-
}
|
|
3870
|
-
return out;
|
|
3871
4459
|
}
|
|
3872
4460
|
/**
|
|
3873
|
-
*
|
|
3874
|
-
*
|
|
4461
|
+
* Read-only specialist sub-run transcript for one delegated {@code agent:*} tool call
|
|
4462
|
+
* (layout-builder dialog with JSON viewer; inspired by AI Chat specialist detail, conversation-owned).
|
|
3875
4463
|
*/
|
|
3876
|
-
function
|
|
3877
|
-
|
|
3878
|
-
|
|
3879
|
-
|
|
3880
|
-
const m = metadata;
|
|
3881
|
-
const final = m['aiTranscript'];
|
|
3882
|
-
const draft = m['aiTranscriptDraft'];
|
|
3883
|
-
if (Array.isArray(final) && final.length > 0) {
|
|
3884
|
-
return axmNormalizeAssistTranscriptForChatUi(final);
|
|
3885
|
-
}
|
|
3886
|
-
if (Array.isArray(draft) && draft.length > 0) {
|
|
3887
|
-
return axmNormalizeAssistTranscriptForChatUi(draft);
|
|
3888
|
-
}
|
|
3889
|
-
return null;
|
|
3890
|
-
}
|
|
3891
|
-
//#endregion
|
|
3892
|
-
//#region ---- Layout / synthetic helpers ----
|
|
3893
|
-
/**
|
|
3894
|
-
* Transcript response discriminators ({@link AXPAiChatResponse} `type` values).
|
|
3895
|
-
* These must not be treated as {@link AXPWidgetNode} `type` when coercing unknown JSON.
|
|
3896
|
-
*/
|
|
3897
|
-
const AXM_ASSIST_TRANSCRIPT_NON_WIDGET_TYPES = new Set([
|
|
3898
|
-
'text',
|
|
3899
|
-
'think',
|
|
3900
|
-
'image',
|
|
3901
|
-
'audio',
|
|
3902
|
-
'file',
|
|
3903
|
-
'tool',
|
|
3904
|
-
'agent',
|
|
3905
|
-
'tool_result',
|
|
3906
|
-
'agent_result',
|
|
3907
|
-
]);
|
|
3908
|
-
const AXM_ASSIST_NODE_ENVELOPE_UNWRAP_MAX_DEPTH = 6;
|
|
3909
|
-
/**
|
|
3910
|
-
* Returns `content` as an {@link AXPWidgetNode} when it looks like a widget tree.
|
|
3911
|
-
* Rejects assistant transcript segment shapes (e.g. `{ type: 'text', content: '...' }`) and unwraps
|
|
3912
|
-
* a single `{ type: 'node', content: <widget> }` envelope if present.
|
|
3913
|
-
*/
|
|
3914
|
-
function axmAssistWidgetNodeFromUnknown(content, depth = 0) {
|
|
3915
|
-
if (depth > AXM_ASSIST_NODE_ENVELOPE_UNWRAP_MAX_DEPTH) {
|
|
3916
|
-
return null;
|
|
3917
|
-
}
|
|
3918
|
-
if (content == null || typeof content !== 'object' || Array.isArray(content)) {
|
|
3919
|
-
return null;
|
|
3920
|
-
}
|
|
3921
|
-
const rec = content;
|
|
3922
|
-
const t = rec['type'];
|
|
3923
|
-
if (typeof t !== 'string') {
|
|
3924
|
-
return null;
|
|
3925
|
-
}
|
|
3926
|
-
if (t === 'node' && 'content' in rec) {
|
|
3927
|
-
return axmAssistWidgetNodeFromUnknown(rec['content'], depth + 1);
|
|
3928
|
-
}
|
|
3929
|
-
if (AXM_ASSIST_TRANSCRIPT_NON_WIDGET_TYPES.has(t)) {
|
|
3930
|
-
return null;
|
|
3931
|
-
}
|
|
3932
|
-
return content;
|
|
3933
|
-
}
|
|
3934
|
-
/**
|
|
3935
|
-
* Returns the first `node` segment's content as an {@link AXPWidgetNode} when it looks like a widget tree.
|
|
3936
|
-
*/
|
|
3937
|
-
function axmAssistNodeAsLayoutNode(message) {
|
|
3938
|
-
if (message.role !== 'assistant') {
|
|
3939
|
-
return null;
|
|
3940
|
-
}
|
|
3941
|
-
const n = message.responses.find((r) => r.type === 'node');
|
|
3942
|
-
return n?.type === 'node' ? axmAssistWidgetNodeFromUnknown(n.content) : null;
|
|
3943
|
-
}
|
|
3944
|
-
/**
|
|
3945
|
-
* Builds a synthetic {@link AXMessage} for embedding default conversation renderers (text, image, etc.).
|
|
3946
|
-
*/
|
|
3947
|
-
function axmSyntheticEmbedMessage(parent, suffix, partial) {
|
|
3948
|
-
return {
|
|
3949
|
-
...parent,
|
|
3950
|
-
id: `${parent.id}::${suffix}`,
|
|
3951
|
-
type: partial.type,
|
|
3952
|
-
payload: partial.payload,
|
|
3953
|
-
metadata: { ...(typeof parent.metadata === 'object' && parent.metadata != null ? parent.metadata : {}), assistEmbed: true },
|
|
3954
|
-
replyTo: undefined,
|
|
3955
|
-
};
|
|
3956
|
-
}
|
|
3957
|
-
//#endregion
|
|
3958
|
-
|
|
3959
|
-
//#region ---- Markdown rendering ----
|
|
3960
|
-
/**
|
|
3961
|
-
* Escapes raw HTML and renders a safe markdown subset for assistant text.
|
|
3962
|
-
* The output includes lightweight typography defaults for cleaner readability.
|
|
3963
|
-
*/
|
|
3964
|
-
function axmRenderAssistMarkdown(raw, sanitizer) {
|
|
3965
|
-
const input = normalizeInput(raw);
|
|
3966
|
-
if (!input) {
|
|
3967
|
-
return '';
|
|
3968
|
-
}
|
|
3969
|
-
const lines = input.split('\n');
|
|
3970
|
-
const parts = [];
|
|
3971
|
-
const paragraphBuffer = [];
|
|
3972
|
-
let activeListType = null;
|
|
3973
|
-
let inFence = false;
|
|
3974
|
-
let fenceLanguage = '';
|
|
3975
|
-
const fenceBuffer = [];
|
|
3976
|
-
const flushParagraph = () => {
|
|
3977
|
-
if (!paragraphBuffer.length) {
|
|
3978
|
-
return;
|
|
3979
|
-
}
|
|
3980
|
-
const joined = paragraphBuffer.join('<br />');
|
|
3981
|
-
parts.push(`<p style="margin:0.55rem 0; line-height:1.8;">${renderInlineMarkdown(joined)}</p>`);
|
|
3982
|
-
paragraphBuffer.length = 0;
|
|
3983
|
-
};
|
|
3984
|
-
const closeList = () => {
|
|
3985
|
-
if (!activeListType) {
|
|
3986
|
-
return;
|
|
3987
|
-
}
|
|
3988
|
-
parts.push(`</${activeListType}>`);
|
|
3989
|
-
activeListType = null;
|
|
3990
|
-
};
|
|
3991
|
-
const flushFence = () => {
|
|
3992
|
-
const body = escapeHtml(fenceBuffer.join('\n'));
|
|
3993
|
-
const langAttr = fenceLanguage ? ` data-language="${escapeHtml(fenceLanguage)}"` : '';
|
|
3994
|
-
parts.push(`<pre style="margin:0.65rem 0; line-height:1.65; overflow:auto;"><code${langAttr}>${body}</code></pre>`);
|
|
3995
|
-
fenceBuffer.length = 0;
|
|
3996
|
-
fenceLanguage = '';
|
|
3997
|
-
};
|
|
3998
|
-
for (const originalLine of lines) {
|
|
3999
|
-
const line = originalLine.trimEnd();
|
|
4000
|
-
const trimmed = line.trim();
|
|
4001
|
-
const fenceStart = trimmed.match(/^```([a-zA-Z0-9_-]+)?\s*$/);
|
|
4002
|
-
if (fenceStart) {
|
|
4003
|
-
flushParagraph();
|
|
4004
|
-
closeList();
|
|
4005
|
-
if (inFence) {
|
|
4006
|
-
flushFence();
|
|
4007
|
-
inFence = false;
|
|
4008
|
-
}
|
|
4009
|
-
else {
|
|
4010
|
-
inFence = true;
|
|
4011
|
-
fenceLanguage = (fenceStart[1] ?? '').trim();
|
|
4012
|
-
}
|
|
4013
|
-
continue;
|
|
4014
|
-
}
|
|
4015
|
-
if (inFence) {
|
|
4016
|
-
fenceBuffer.push(line);
|
|
4017
|
-
continue;
|
|
4018
|
-
}
|
|
4019
|
-
if (!trimmed) {
|
|
4020
|
-
flushParagraph();
|
|
4021
|
-
closeList();
|
|
4022
|
-
continue;
|
|
4023
|
-
}
|
|
4024
|
-
const hr = trimmed.match(/^(-{3,}|\*{3,}|_{3,})$/);
|
|
4025
|
-
if (hr) {
|
|
4026
|
-
flushParagraph();
|
|
4027
|
-
closeList();
|
|
4028
|
-
parts.push('<hr style="margin:0.9rem 0; opacity:0.25;" />');
|
|
4029
|
-
continue;
|
|
4030
|
-
}
|
|
4031
|
-
const heading = trimmed.match(/^(#{1,6})\s+(.+)$/);
|
|
4032
|
-
if (heading) {
|
|
4033
|
-
flushParagraph();
|
|
4034
|
-
closeList();
|
|
4035
|
-
const level = heading[1].length;
|
|
4036
|
-
parts.push(`<h${level} style="margin:0.75rem 0 0.4rem; line-height:1.4;">${renderInlineMarkdown(heading[2])}</h${level}>`);
|
|
4037
|
-
continue;
|
|
4038
|
-
}
|
|
4039
|
-
const quote = trimmed.match(/^>\s?(.*)$/);
|
|
4040
|
-
if (quote) {
|
|
4041
|
-
flushParagraph();
|
|
4042
|
-
closeList();
|
|
4043
|
-
parts.push(`<blockquote style="margin:0.6rem 0; line-height:1.75; padding-inline:0.65rem 0.45rem;">${renderInlineMarkdown(quote[1])}</blockquote>`);
|
|
4044
|
-
continue;
|
|
4045
|
-
}
|
|
4046
|
-
const bullet = trimmed.match(/^[-*+]\s+(.+)$/);
|
|
4047
|
-
if (bullet) {
|
|
4048
|
-
flushParagraph();
|
|
4049
|
-
if (activeListType !== 'ul') {
|
|
4050
|
-
closeList();
|
|
4051
|
-
activeListType = 'ul';
|
|
4052
|
-
parts.push('<ul style="margin:0.55rem 0; line-height:1.8; padding-inline-start:1.15rem;">');
|
|
4053
|
-
}
|
|
4054
|
-
parts.push(`<li>${renderInlineMarkdown(bullet[1])}</li>`);
|
|
4055
|
-
continue;
|
|
4056
|
-
}
|
|
4057
|
-
const ordered = trimmed.match(/^\d+\.\s+(.+)$/);
|
|
4058
|
-
if (ordered) {
|
|
4059
|
-
flushParagraph();
|
|
4060
|
-
if (activeListType !== 'ol') {
|
|
4061
|
-
closeList();
|
|
4062
|
-
activeListType = 'ol';
|
|
4063
|
-
parts.push('<ol style="margin:0.55rem 0; line-height:1.8; padding-inline-start:1.2rem;">');
|
|
4064
|
-
}
|
|
4065
|
-
parts.push(`<li>${renderInlineMarkdown(ordered[1])}</li>`);
|
|
4066
|
-
continue;
|
|
4067
|
-
}
|
|
4068
|
-
closeList();
|
|
4069
|
-
paragraphBuffer.push(trimmed);
|
|
4070
|
-
}
|
|
4071
|
-
if (inFence) {
|
|
4072
|
-
flushFence();
|
|
4073
|
-
}
|
|
4074
|
-
flushParagraph();
|
|
4075
|
-
closeList();
|
|
4076
|
-
const rendered = parts.join('\n').trim();
|
|
4077
|
-
if (!rendered) {
|
|
4078
|
-
return '';
|
|
4464
|
+
async function axmOpenAssistDelegatedAgentDetailDialog(options) {
|
|
4465
|
+
const callId = options.callId?.trim() ?? '';
|
|
4466
|
+
if (!callId) {
|
|
4467
|
+
return;
|
|
4079
4468
|
}
|
|
4080
|
-
|
|
4081
|
-
|
|
4082
|
-
|
|
4083
|
-
|
|
4084
|
-
|
|
4085
|
-
|
|
4086
|
-
|
|
4087
|
-
|
|
4088
|
-
|
|
4089
|
-
|
|
4090
|
-
|
|
4091
|
-
|
|
4092
|
-
|
|
4093
|
-
|
|
4094
|
-
|
|
4095
|
-
|
|
4096
|
-
|
|
4097
|
-
|
|
4098
|
-
|
|
4099
|
-
|
|
4100
|
-
|
|
4101
|
-
|
|
4102
|
-
|
|
4103
|
-
|
|
4104
|
-
|
|
4105
|
-
|
|
4106
|
-
|
|
4107
|
-
|
|
4108
|
-
|
|
4109
|
-
|
|
4110
|
-
|
|
4111
|
-
|
|
4112
|
-
|
|
4113
|
-
|
|
4114
|
-
|
|
4115
|
-
|
|
4116
|
-
|
|
4117
|
-
|
|
4469
|
+
const entry = options.delegatedTranscriptsByCallId[callId];
|
|
4470
|
+
const catalogId = axpAiParseSupervisorAgentToolName(options.toolName);
|
|
4471
|
+
const catalogTitle = catalogId != null ? options.resolveCatalogTitle?.(catalogId)?.trim() : undefined;
|
|
4472
|
+
const titleBase = options.resolvedAgentLabel?.trim() ||
|
|
4473
|
+
entry?.agentName?.trim() ||
|
|
4474
|
+
catalogTitle ||
|
|
4475
|
+
options.toolName.trim() ||
|
|
4476
|
+
callId;
|
|
4477
|
+
const [titleSuffix, transcriptLabel, missingHint, closeLabel] = await Promise.all([
|
|
4478
|
+
options.translationService.translateAsync('@conversation:chat.assist-renderer.delegated-agent.dialog-title-suffix'),
|
|
4479
|
+
options.translationService.translateAsync('@conversation:chat.assist-renderer.delegated-agent.transcript-label'),
|
|
4480
|
+
options.translationService.translateAsync('@conversation:chat.assist-renderer.delegated-agent.transcript-missing'),
|
|
4481
|
+
options.translationService.translateAsync('@general:actions.close.title'),
|
|
4482
|
+
]);
|
|
4483
|
+
const displayMessages = entry?.messages?.length
|
|
4484
|
+
? cloneMessagesForJsonViewer(entry.messages)
|
|
4485
|
+
: { note: missingHint ?? 'No cached specialist transcript for this tool call.' };
|
|
4486
|
+
const dialogRef = await options.layoutBuilder
|
|
4487
|
+
.create()
|
|
4488
|
+
.dialog((dialog) => {
|
|
4489
|
+
dialog
|
|
4490
|
+
.setTitle(`${titleBase} — ${titleSuffix ?? 'Full Specialist Run'}`)
|
|
4491
|
+
.setSize('lg')
|
|
4492
|
+
.setCloseButton(true)
|
|
4493
|
+
.setContext({
|
|
4494
|
+
value: {
|
|
4495
|
+
messages: displayMessages,
|
|
4496
|
+
},
|
|
4497
|
+
})
|
|
4498
|
+
.content((layout) => {
|
|
4499
|
+
layout.flex((flex) => {
|
|
4500
|
+
flex.mode('view').setOptions({
|
|
4501
|
+
flexDirection: 'column',
|
|
4502
|
+
gap: '12px',
|
|
4503
|
+
maxHeight: '75vh',
|
|
4504
|
+
overflowY: 'auto',
|
|
4505
|
+
});
|
|
4506
|
+
flex.formField(transcriptLabel ?? 'Specialist transcript', (field) => {
|
|
4507
|
+
field.path('value.messages');
|
|
4508
|
+
field.customWidget('json-viewer');
|
|
4509
|
+
});
|
|
4510
|
+
});
|
|
4511
|
+
})
|
|
4512
|
+
.setActions((actions) => {
|
|
4513
|
+
actions.cancel(closeLabel ?? 'Close');
|
|
4514
|
+
});
|
|
4515
|
+
})
|
|
4516
|
+
.show();
|
|
4517
|
+
if (dialogRef.action() === 'cancel') {
|
|
4518
|
+
dialogRef.close();
|
|
4118
4519
|
}
|
|
4119
|
-
const isProtocolAllowed = href.startsWith('https://') ||
|
|
4120
|
-
href.startsWith('http://') ||
|
|
4121
|
-
href.startsWith('mailto:') ||
|
|
4122
|
-
href.startsWith('tel:');
|
|
4123
|
-
return isProtocolAllowed ? escapeHtml(href) : null;
|
|
4124
|
-
}
|
|
4125
|
-
function escapeHtml(raw) {
|
|
4126
|
-
return raw
|
|
4127
|
-
.replace(/&/g, '&')
|
|
4128
|
-
.replace(/</g, '<')
|
|
4129
|
-
.replace(/>/g, '>')
|
|
4130
|
-
.replace(/"/g, '"')
|
|
4131
|
-
.replace(/'/g, ''');
|
|
4132
4520
|
}
|
|
4133
4521
|
//#endregion
|
|
4134
4522
|
|
|
@@ -4248,7 +4636,7 @@ class AXMAssistBotImageLineComponent {
|
|
|
4248
4636
|
} @else if (errorText()) {
|
|
4249
4637
|
<p class="axm-assist-bot-image-line__err">{{ ((errorText() ?? '') | translate | async) ?? '' }}</p>
|
|
4250
4638
|
}
|
|
4251
|
-
`, isInline: true, styles: [":host{display:block;max-inline-size:min(100%,40rem)}.axm-assist-bot-image-line__err{margin:0;font-size:.8125rem;color:rgb(var(--ax-sys-color-danger-600, 220 38 38))}\n"], dependencies: [{ kind: "component", type: AXImageRendererComponent, selector: "ax-conversation-image-renderer", inputs: ["message"], outputs: ["imageClick"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type:
|
|
4639
|
+
`, isInline: true, styles: [":host{display:block;max-inline-size:min(100%,40rem)}.axm-assist-bot-image-line__err{margin:0;font-size:.8125rem;color:rgb(var(--ax-sys-color-danger-600, 220 38 38))}\n"], dependencies: [{ kind: "component", type: AXImageRendererComponent, selector: "ax-conversation-image-renderer", inputs: ["message"], outputs: ["imageClick"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i2$1.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
4252
4640
|
}
|
|
4253
4641
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMAssistBotImageLineComponent, decorators: [{
|
|
4254
4642
|
type: Component,
|
|
@@ -4422,7 +4810,7 @@ class AXMNodeMessageRendererComponent {
|
|
|
4422
4810
|
</div>
|
|
4423
4811
|
}
|
|
4424
4812
|
</div>
|
|
4425
|
-
`, isInline: true, styles: [":host{display:block;inline-size:min(100%,28rem)}:host:has(.axm-user-form-renderer--assist-embed){inline-size:100%;max-inline-size:none}\n"], dependencies: [{ kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "component", type: i1$3.AXPWidgetContainerComponent, selector: "axp-widgets-container", inputs: ["context", "functions"], outputs: ["onContextChanged"] }, { kind: "directive", type: i1$3.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged", "onLoad"], exportAs: ["widgetRenderer"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i2.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXPLayoutRendererComponent, selector: "axp-layout-renderer", inputs: ["layout", "context", "look", "mode"], outputs: ["contextChange", "contextInitiated", "validityChange"] }, { kind: "pipe", type:
|
|
4813
|
+
`, isInline: true, styles: [":host{display:block;inline-size:min(100%,28rem)}:host:has(.axm-user-form-renderer--assist-embed){inline-size:100%;max-inline-size:none}\n"], dependencies: [{ kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "component", type: i1$3.AXPWidgetContainerComponent, selector: "axp-widgets-container", inputs: ["context", "functions"], outputs: ["onContextChanged"] }, { kind: "directive", type: i1$3.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged", "onLoad"], exportAs: ["widgetRenderer"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i2.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXPLayoutRendererComponent, selector: "axp-layout-renderer", inputs: ["layout", "context", "look", "mode"], outputs: ["contextChange", "contextInitiated", "validityChange"] }, { kind: "pipe", type: i2$1.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
4426
4814
|
}
|
|
4427
4815
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMNodeMessageRendererComponent, decorators: [{
|
|
4428
4816
|
type: Component,
|
|
@@ -4474,14 +4862,14 @@ class AXMAssistMessageRendererComponent {
|
|
|
4474
4862
|
//#region ---- Template helpers (exposed for template) ----
|
|
4475
4863
|
this.axpAiChatMessageGetText = axpAiChatMessageGetText;
|
|
4476
4864
|
this.axmAssistWidgetNodeFromUnknown = axmAssistWidgetNodeFromUnknown;
|
|
4477
|
-
this.parseAssistLineText =
|
|
4865
|
+
this.parseAssistLineText = axmParseAssistTranscriptTextEnvelope;
|
|
4478
4866
|
this.segmentDir = axmAssistSegmentDirection;
|
|
4479
4867
|
//#endregion
|
|
4480
4868
|
//#region ---- State ----
|
|
4481
4869
|
this.entityService = inject(AXPEntityService);
|
|
4482
4870
|
this.settingsService = inject(AXPSettingsService);
|
|
4483
|
-
this.sanitizer = inject(DomSanitizer);
|
|
4484
4871
|
this.translation = inject(AXTranslationService);
|
|
4872
|
+
this.layoutBuilder = inject(AXPLayoutBuilderService);
|
|
4485
4873
|
this.agentData = this.entityService
|
|
4486
4874
|
.withEntity(RootConfig$1.module.name, RootConfig$1.entities.agent.name)
|
|
4487
4875
|
.data();
|
|
@@ -4489,6 +4877,30 @@ class AXMAssistMessageRendererComponent {
|
|
|
4489
4877
|
this.agentTitleById = signal({}, ...(ngDevMode ? [{ debugName: "agentTitleById" }] : /* istanbul ignore next */ []));
|
|
4490
4878
|
this.contentState = signal('ready', ...(ngDevMode ? [{ debugName: "contentState" }] : /* istanbul ignore next */ []));
|
|
4491
4879
|
this.debugModeEnabled = signal(false, ...(ngDevMode ? [{ debugName: "debugModeEnabled" }] : /* istanbul ignore next */ []));
|
|
4880
|
+
/** False until tenant debug setting has been read; avoids flashing debug UI before resolve. */
|
|
4881
|
+
this.debugModeResolved = signal(false, ...(ngDevMode ? [{ debugName: "debugModeResolved" }] : /* istanbul ignore next */ []));
|
|
4882
|
+
/** Debug transcript/tools UI — only after settings resolve and debug is on. */
|
|
4883
|
+
this.showDebugUi = computed(() => this.debugModeResolved() && this.debugModeEnabled(), ...(ngDevMode ? [{ debugName: "showDebugUi" }] : /* istanbul ignore next */ []));
|
|
4884
|
+
/** User-facing UI (no tools/thinking accordions); used while unresolved and when debug is off. */
|
|
4885
|
+
this.showNonDebugUi = computed(() => !this.showDebugUi(), ...(ngDevMode ? [{ debugName: "showNonDebugUi" }] : /* istanbul ignore next */ []));
|
|
4886
|
+
/** Persisted assist run metadata (mock writes {@code assistRun*} keys on finalize). */
|
|
4887
|
+
this.assistRunDebug = computed(() => {
|
|
4888
|
+
const meta = this.message().metadata;
|
|
4889
|
+
if (!meta) {
|
|
4890
|
+
return null;
|
|
4891
|
+
}
|
|
4892
|
+
const usage = meta['assistRunUsageTotals'];
|
|
4893
|
+
const durationRaw = meta['assistRunDurationMs'];
|
|
4894
|
+
const modelEntityId = meta['assistRunModelEntityId'];
|
|
4895
|
+
const modelTitle = meta['assistRunModelTitle'];
|
|
4896
|
+
const durationMs = typeof durationRaw === 'number' && Number.isFinite(durationRaw) ? durationRaw : undefined;
|
|
4897
|
+
const id = typeof modelEntityId === 'string' && modelEntityId.trim() ? modelEntityId.trim() : undefined;
|
|
4898
|
+
const title = typeof modelTitle === 'string' && modelTitle.trim() ? modelTitle.trim() : undefined;
|
|
4899
|
+
if (!usage && durationMs == null && !id && !title) {
|
|
4900
|
+
return null;
|
|
4901
|
+
}
|
|
4902
|
+
return { usage, durationMs, modelEntityId: id, modelTitle: title };
|
|
4903
|
+
}, ...(ngDevMode ? [{ debugName: "assistRunDebug" }] : /* istanbul ignore next */ []));
|
|
4492
4904
|
this.rendererState = computed(() => ({
|
|
4493
4905
|
deliveryStatus: this.message().status,
|
|
4494
4906
|
contentState: this.contentState(),
|
|
@@ -4498,6 +4910,17 @@ class AXMAssistMessageRendererComponent {
|
|
|
4498
4910
|
this.transcriptLines = computed(() => {
|
|
4499
4911
|
return axmReadAssistAiTranscript(this.message().metadata) ?? [];
|
|
4500
4912
|
}, ...(ngDevMode ? [{ debugName: "transcriptLines" }] : /* istanbul ignore next */ []));
|
|
4913
|
+
this.delegatedTranscriptsByCallId = computed(() => {
|
|
4914
|
+
const meta = this.message().metadata;
|
|
4915
|
+
if (typeof meta !== 'object' || meta == null) {
|
|
4916
|
+
return {};
|
|
4917
|
+
}
|
|
4918
|
+
const delegated = meta['assistRunDelegatedTranscriptsByCallId'];
|
|
4919
|
+
if (typeof delegated !== 'object' || delegated == null || Array.isArray(delegated)) {
|
|
4920
|
+
return {};
|
|
4921
|
+
}
|
|
4922
|
+
return delegated;
|
|
4923
|
+
}, ...(ngDevMode ? [{ debugName: "delegatedTranscriptsByCallId" }] : /* istanbul ignore next */ []));
|
|
4501
4924
|
this.toolResultByCallId = computed(() => {
|
|
4502
4925
|
const map = new Map();
|
|
4503
4926
|
for (const line of this.transcriptLines()) {
|
|
@@ -4516,6 +4939,38 @@ class AXMAssistMessageRendererComponent {
|
|
|
4516
4939
|
return map;
|
|
4517
4940
|
}, ...(ngDevMode ? [{ debugName: "toolResultByCallId" }] : /* istanbul ignore next */ []));
|
|
4518
4941
|
this.useTranscriptUi = computed(() => this.transcriptLines().length > 0, ...(ngDevMode ? [{ debugName: "useTranscriptUi" }] : /* istanbul ignore next */ []));
|
|
4942
|
+
this.assistPayloadView = computed(() => {
|
|
4943
|
+
const payload = this.message().payload;
|
|
4944
|
+
if (payload == null || typeof payload !== 'object') {
|
|
4945
|
+
return { kind: 'none' };
|
|
4946
|
+
}
|
|
4947
|
+
const disc = payload['type'];
|
|
4948
|
+
if (disc === 'node' && 'content' in payload && axmAssistWidgetNodeFromUnknown(payload['content']) != null) {
|
|
4949
|
+
return { kind: 'node', content: payload['content'] };
|
|
4950
|
+
}
|
|
4951
|
+
if (disc === 'text' && typeof payload['text'] === 'string') {
|
|
4952
|
+
return { kind: 'text', text: payload['text'] };
|
|
4953
|
+
}
|
|
4954
|
+
if (typeof payload['text'] === 'string') {
|
|
4955
|
+
return { kind: 'text', text: payload['text'] };
|
|
4956
|
+
}
|
|
4957
|
+
return { kind: 'none' };
|
|
4958
|
+
}, ...(ngDevMode ? [{ debugName: "assistPayloadView" }] : /* istanbul ignore next */ []));
|
|
4959
|
+
/**
|
|
4960
|
+
* Transcript lines that render at least one visible segment. Skips e.g. {@code tool} role lines
|
|
4961
|
+
* whose results are merged into assistant tool UI (would otherwise produce empty {@code axm-assist-bot__line}).
|
|
4962
|
+
*/
|
|
4963
|
+
this.visibleTranscriptLines = computed(() => {
|
|
4964
|
+
const lines = this.transcriptLines();
|
|
4965
|
+
const out = [];
|
|
4966
|
+
for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {
|
|
4967
|
+
const line = lines[lineIndex];
|
|
4968
|
+
if (this.transcriptLineHasVisibleUi(line)) {
|
|
4969
|
+
out.push({ line, lineIndex });
|
|
4970
|
+
}
|
|
4971
|
+
}
|
|
4972
|
+
return out;
|
|
4973
|
+
}, ...(ngDevMode ? [{ debugName: "visibleTranscriptLines" }] : /* istanbul ignore next */ []));
|
|
4519
4974
|
this.syncAgentTitles = effect(() => {
|
|
4520
4975
|
const ids = new Set();
|
|
4521
4976
|
for (const line of this.transcriptLines()) {
|
|
@@ -4565,35 +5020,130 @@ class AXMAssistMessageRendererComponent {
|
|
|
4565
5020
|
if (text) {
|
|
4566
5021
|
return 'responding';
|
|
4567
5022
|
}
|
|
4568
|
-
return 'starting';
|
|
4569
|
-
}, ...(ngDevMode ? [{ debugName: "assistStreamingPhase" }] : /* istanbul ignore next */ []));
|
|
4570
|
-
this.assistActivityMessageKey = computed(() => {
|
|
4571
|
-
const phase = this.assistStreamingPhase();
|
|
4572
|
-
return `@conversation:chat.assist-renderer.activity.${phase}`;
|
|
4573
|
-
}, ...(ngDevMode ? [{ debugName: "assistActivityMessageKey" }] : /* istanbul ignore next */ []));
|
|
4574
|
-
this.streamThink = computed(() => {
|
|
4575
|
-
const v = this.readMeta('streamDraftThink');
|
|
4576
|
-
return typeof v === 'string' ? v : '';
|
|
4577
|
-
}, ...(ngDevMode ? [{ debugName: "streamThink" }] : /* istanbul ignore next */ []));
|
|
4578
|
-
this.streamText = computed(() => {
|
|
4579
|
-
const d = this.readMeta('streamDraftText');
|
|
4580
|
-
if (typeof d === 'string' && d.length > 0) {
|
|
4581
|
-
return d;
|
|
5023
|
+
return 'starting';
|
|
5024
|
+
}, ...(ngDevMode ? [{ debugName: "assistStreamingPhase" }] : /* istanbul ignore next */ []));
|
|
5025
|
+
this.assistActivityMessageKey = computed(() => {
|
|
5026
|
+
const phase = this.assistStreamingPhase();
|
|
5027
|
+
return `@conversation:chat.assist-renderer.activity.${phase}`;
|
|
5028
|
+
}, ...(ngDevMode ? [{ debugName: "assistActivityMessageKey" }] : /* istanbul ignore next */ []));
|
|
5029
|
+
this.streamThink = computed(() => {
|
|
5030
|
+
const v = this.readMeta('streamDraftThink');
|
|
5031
|
+
return typeof v === 'string' ? v : '';
|
|
5032
|
+
}, ...(ngDevMode ? [{ debugName: "streamThink" }] : /* istanbul ignore next */ []));
|
|
5033
|
+
this.streamText = computed(() => {
|
|
5034
|
+
const d = this.readMeta('streamDraftText');
|
|
5035
|
+
if (typeof d === 'string' && d.length > 0) {
|
|
5036
|
+
return d;
|
|
5037
|
+
}
|
|
5038
|
+
const text = this.message().payload?.['text'];
|
|
5039
|
+
return typeof text === 'string' ? text : '';
|
|
5040
|
+
}, ...(ngDevMode ? [{ debugName: "streamText" }] : /* istanbul ignore next */ []));
|
|
5041
|
+
this.toolCalls = computed(() => {
|
|
5042
|
+
const raw = this.readMeta('toolCalls');
|
|
5043
|
+
return Array.isArray(raw) ? raw : [];
|
|
5044
|
+
}, ...(ngDevMode ? [{ debugName: "toolCalls" }] : /* istanbul ignore next */ []));
|
|
5045
|
+
this.parsed = computed(() => {
|
|
5046
|
+
if (this.isStreaming()) {
|
|
5047
|
+
return { thinking: null, body: '' };
|
|
5048
|
+
}
|
|
5049
|
+
const view = this.assistPayloadView();
|
|
5050
|
+
const raw = view.kind === 'text'
|
|
5051
|
+
? view.text
|
|
5052
|
+
: this.message().payload?.['text'];
|
|
5053
|
+
return axmParseAssistTranscriptTextEnvelope(typeof raw === 'string' ? raw : '');
|
|
5054
|
+
}, ...(ngDevMode ? [{ debugName: "parsed" }] : /* istanbul ignore next */ []));
|
|
5055
|
+
/**
|
|
5056
|
+
* Non-debug finalized UI already shows {@link assistPayloadView} (widget or markdown body);
|
|
5057
|
+
* legacy blocks must not duplicate the same answer.
|
|
5058
|
+
*/
|
|
5059
|
+
this.assistNonDebugPayloadFinalShown = computed(() => {
|
|
5060
|
+
if (this.showDebugUi() || this.isStreaming()) {
|
|
5061
|
+
return false;
|
|
5062
|
+
}
|
|
5063
|
+
const v = this.assistPayloadView();
|
|
5064
|
+
if (v.kind === 'node') {
|
|
5065
|
+
return true;
|
|
5066
|
+
}
|
|
5067
|
+
if (v.kind === 'text' && axmParseAssistTranscriptTextEnvelope(v.text).body.trim()) {
|
|
5068
|
+
return true;
|
|
5069
|
+
}
|
|
5070
|
+
return false;
|
|
5071
|
+
}, ...(ngDevMode ? [{ debugName: "assistNonDebugPayloadFinalShown" }] : /* istanbul ignore next */ []));
|
|
5072
|
+
}
|
|
5073
|
+
/**
|
|
5074
|
+
* Assistant text shown in the transcript: hides delegated sub-run reflection lines from the main markdown stream
|
|
5075
|
+
* unless debug mode is on.
|
|
5076
|
+
*/
|
|
5077
|
+
assistTranscriptAssistantTextBodyForDisplay(line, body) {
|
|
5078
|
+
if (axpAiChatMessageIsDelegatedReflectionExcluded(line) && !this.showDebugUi()) {
|
|
5079
|
+
return '';
|
|
5080
|
+
}
|
|
5081
|
+
return body ?? '';
|
|
5082
|
+
}
|
|
5083
|
+
transcriptLineHasVisibleUi(line) {
|
|
5084
|
+
const debug = this.showDebugUi();
|
|
5085
|
+
for (const seg of line.responses) {
|
|
5086
|
+
if (this.transcriptSegmentHasVisibleUi(line, seg, debug)) {
|
|
5087
|
+
return true;
|
|
5088
|
+
}
|
|
5089
|
+
}
|
|
5090
|
+
return false;
|
|
5091
|
+
}
|
|
5092
|
+
transcriptSegmentHasVisibleUi(line, seg, debug) {
|
|
5093
|
+
if (line.role === 'user' && seg.type === 'file') {
|
|
5094
|
+
return true;
|
|
5095
|
+
}
|
|
5096
|
+
if (line.role === 'user' && seg.type === 'text') {
|
|
5097
|
+
return true;
|
|
5098
|
+
}
|
|
5099
|
+
if (line.role === 'assistant' && seg.type === 'think' && debug) {
|
|
5100
|
+
return true;
|
|
5101
|
+
}
|
|
5102
|
+
if (line.role === 'assistant' && seg.type === 'text') {
|
|
5103
|
+
const parsed = this.parseAssistLineText(seg.content);
|
|
5104
|
+
if (debug && parsed.thinking) {
|
|
5105
|
+
return true;
|
|
5106
|
+
}
|
|
5107
|
+
return parsed.body.trim().length > 0;
|
|
5108
|
+
}
|
|
5109
|
+
if (line.role === 'assistant' &&
|
|
5110
|
+
(seg.type === 'agent' || seg.type === 'tool') &&
|
|
5111
|
+
this.isDelegatedAgentCommand(seg.content.command)) {
|
|
5112
|
+
if (debug) {
|
|
5113
|
+
return true;
|
|
4582
5114
|
}
|
|
4583
|
-
const
|
|
4584
|
-
|
|
4585
|
-
|
|
4586
|
-
|
|
4587
|
-
|
|
4588
|
-
|
|
4589
|
-
|
|
4590
|
-
|
|
4591
|
-
|
|
4592
|
-
return
|
|
5115
|
+
const res = this.toolResultForCallId(seg.callId);
|
|
5116
|
+
const outcomeSegs = this.delegatedAgentOutcomeSegmentsForCall(res);
|
|
5117
|
+
const hasRenderableOutcome = outcomeSegs.some((s) => {
|
|
5118
|
+
if (s.type === 'file' || s.type === 'node') {
|
|
5119
|
+
return true;
|
|
5120
|
+
}
|
|
5121
|
+
if (s.type === 'text' || s.type === 'think') {
|
|
5122
|
+
return s.content.trim().length > 0;
|
|
5123
|
+
}
|
|
5124
|
+
return false;
|
|
5125
|
+
});
|
|
5126
|
+
if (hasRenderableOutcome) {
|
|
5127
|
+
return true;
|
|
4593
5128
|
}
|
|
4594
|
-
|
|
4595
|
-
|
|
4596
|
-
|
|
5129
|
+
return this.delegatedAgentAnswerForCall(res).trim().length > 0;
|
|
5130
|
+
}
|
|
5131
|
+
if (line.role === 'assistant' && seg.type === 'tool' && debug) {
|
|
5132
|
+
return true;
|
|
5133
|
+
}
|
|
5134
|
+
if (line.role === 'assistant' && seg.type === 'node') {
|
|
5135
|
+
return axmAssistWidgetNodeFromUnknown(seg.content) != null;
|
|
5136
|
+
}
|
|
5137
|
+
if (line.role === 'assistant' && seg.type === 'file') {
|
|
5138
|
+
return true;
|
|
5139
|
+
}
|
|
5140
|
+
if (line.role === 'tool' && (seg.type === 'tool_result' || seg.type === 'agent_result')) {
|
|
5141
|
+
return false;
|
|
5142
|
+
}
|
|
5143
|
+
if (line.role === 'system' && seg.type === 'text' && debug) {
|
|
5144
|
+
return true;
|
|
5145
|
+
}
|
|
5146
|
+
return debug || line.role !== 'assistant';
|
|
4597
5147
|
}
|
|
4598
5148
|
syntheticTextMessage(lineIndex, segIndex, text) {
|
|
4599
5149
|
return axmSyntheticEmbedMessage(this.message(), `ut-${lineIndex}-${segIndex}`, {
|
|
@@ -4607,8 +5157,24 @@ class AXMAssistMessageRendererComponent {
|
|
|
4607
5157
|
payload: { type: 'node', content },
|
|
4608
5158
|
});
|
|
4609
5159
|
}
|
|
4610
|
-
|
|
4611
|
-
|
|
5160
|
+
/** Embeds the finalized assist {@code node} payload for the chat layout renderer (non-debug path). */
|
|
5161
|
+
syntheticFinalPayloadNodeMessage(content) {
|
|
5162
|
+
return axmSyntheticEmbedMessage(this.message(), 'payload-node', {
|
|
5163
|
+
type: 'node',
|
|
5164
|
+
payload: { type: 'node', content },
|
|
5165
|
+
});
|
|
5166
|
+
}
|
|
5167
|
+
markdownCodeLanguage(segment) {
|
|
5168
|
+
if (this.isMarkdownCodeSegment(segment) && segment.language.trim()) {
|
|
5169
|
+
return segment.language;
|
|
5170
|
+
}
|
|
5171
|
+
return 'javascript';
|
|
5172
|
+
}
|
|
5173
|
+
markdownCodeValue(segment) {
|
|
5174
|
+
if (this.isMarkdownCodeSegment(segment)) {
|
|
5175
|
+
return segment.code;
|
|
5176
|
+
}
|
|
5177
|
+
return '';
|
|
4612
5178
|
}
|
|
4613
5179
|
resolveToolDisplayTitle(command) {
|
|
4614
5180
|
const agentId = this.extractAgentIdFromCommand(command);
|
|
@@ -4642,6 +5208,25 @@ class AXMAssistMessageRendererComponent {
|
|
|
4642
5208
|
isDelegatedAgentCommand(command) {
|
|
4643
5209
|
return axpAiParseSupervisorAgentToolName(command) != null;
|
|
4644
5210
|
}
|
|
5211
|
+
delegatedAgentOutcomeSegmentsForCall(res) {
|
|
5212
|
+
if (!res) {
|
|
5213
|
+
return [];
|
|
5214
|
+
}
|
|
5215
|
+
const raw = axpAiChatToolOrAgentResultBodyJson(res);
|
|
5216
|
+
if (!raw.trim()) {
|
|
5217
|
+
return [];
|
|
5218
|
+
}
|
|
5219
|
+
try {
|
|
5220
|
+
const o = JSON.parse(raw);
|
|
5221
|
+
if (o['success'] === false) {
|
|
5222
|
+
return [];
|
|
5223
|
+
}
|
|
5224
|
+
return axpAiParseDelegatedAgentResultSegmentsFromUnknown(o['data']?.['responses']);
|
|
5225
|
+
}
|
|
5226
|
+
catch {
|
|
5227
|
+
return [];
|
|
5228
|
+
}
|
|
5229
|
+
}
|
|
4645
5230
|
delegatedAnswerFromToolResult(resultLine) {
|
|
4646
5231
|
if (!resultLine) {
|
|
4647
5232
|
return '';
|
|
@@ -4653,18 +5238,19 @@ class AXMAssistMessageRendererComponent {
|
|
|
4653
5238
|
const err = o['error'];
|
|
4654
5239
|
return typeof err === 'string' && err.trim() ? err.trim() : 'Request failed.';
|
|
4655
5240
|
}
|
|
4656
|
-
const
|
|
4657
|
-
|
|
4658
|
-
const answer = data['answer'];
|
|
4659
|
-
if (typeof answer === 'string' && answer.trim()) {
|
|
4660
|
-
return answer.trim();
|
|
4661
|
-
}
|
|
4662
|
-
}
|
|
5241
|
+
const segs = axpAiParseDelegatedAgentResultSegmentsFromUnknown(o['data']?.['responses']);
|
|
5242
|
+
return axpAiDelegatedAgentOutcomeResponsesPlainText(segs);
|
|
4663
5243
|
}
|
|
4664
5244
|
catch {
|
|
4665
5245
|
return raw.trim();
|
|
4666
5246
|
}
|
|
4667
|
-
|
|
5247
|
+
}
|
|
5248
|
+
isMarkdownCodeSegment(segment) {
|
|
5249
|
+
if (!segment || typeof segment !== 'object') {
|
|
5250
|
+
return false;
|
|
5251
|
+
}
|
|
5252
|
+
const candidate = segment;
|
|
5253
|
+
return candidate.type === 'code' && typeof candidate.language === 'string' && typeof candidate.code === 'string';
|
|
4668
5254
|
}
|
|
4669
5255
|
/**
|
|
4670
5256
|
* Parses the same agent JSON body shape as {@link delegatedAnswerFromToolResult} from raw tool `output` stored in metadata.
|
|
@@ -4680,22 +5266,67 @@ class AXMAssistMessageRendererComponent {
|
|
|
4680
5266
|
const err = o['error'];
|
|
4681
5267
|
return typeof err === 'string' && err.trim() ? err.trim() : 'Request failed.';
|
|
4682
5268
|
}
|
|
4683
|
-
const
|
|
4684
|
-
|
|
4685
|
-
const answer = data['answer'];
|
|
4686
|
-
if (typeof answer === 'string' && answer.trim()) {
|
|
4687
|
-
return answer.trim();
|
|
4688
|
-
}
|
|
4689
|
-
}
|
|
5269
|
+
const segs = axpAiParseDelegatedAgentResultSegmentsFromUnknown(o['data']?.['responses']);
|
|
5270
|
+
return axpAiDelegatedAgentOutcomeResponsesPlainText(segs);
|
|
4690
5271
|
}
|
|
4691
5272
|
catch {
|
|
4692
5273
|
return raw;
|
|
4693
5274
|
}
|
|
4694
|
-
return raw;
|
|
4695
5275
|
}
|
|
4696
5276
|
delegatedAgentAnswerForCall(res) {
|
|
4697
5277
|
return this.delegatedAnswerFromToolResult(res);
|
|
4698
5278
|
}
|
|
5279
|
+
delegatedAgentLabelForCall(callId) {
|
|
5280
|
+
const resultLine = this.toolResultForCallId(callId);
|
|
5281
|
+
if (!resultLine) {
|
|
5282
|
+
return undefined;
|
|
5283
|
+
}
|
|
5284
|
+
return this.parseDelegatedAgentToolResult(axpAiChatToolOrAgentResultBodyJson(resultLine)).agentName;
|
|
5285
|
+
}
|
|
5286
|
+
async openDelegatedAgentTranscriptDialog(callId, toolName, resolvedAgentLabel) {
|
|
5287
|
+
await axmOpenAssistDelegatedAgentDetailDialog({
|
|
5288
|
+
callId: callId ?? '',
|
|
5289
|
+
toolName,
|
|
5290
|
+
delegatedTranscriptsByCallId: this.delegatedTranscriptsByCallId(),
|
|
5291
|
+
resolvedAgentLabel: resolvedAgentLabel ?? this.delegatedAgentLabelForCall(callId),
|
|
5292
|
+
resolveCatalogTitle: (agentId) => this.agentTitleById()[agentId],
|
|
5293
|
+
layoutBuilder: this.layoutBuilder,
|
|
5294
|
+
translationService: this.translation,
|
|
5295
|
+
});
|
|
5296
|
+
}
|
|
5297
|
+
parseDelegatedAgentToolResult(content) {
|
|
5298
|
+
const trimmed = content?.trim() ?? '';
|
|
5299
|
+
if (!trimmed) {
|
|
5300
|
+
return {};
|
|
5301
|
+
}
|
|
5302
|
+
try {
|
|
5303
|
+
const o = JSON.parse(trimmed);
|
|
5304
|
+
if (o['success'] === false || o['success'] !== true) {
|
|
5305
|
+
return {};
|
|
5306
|
+
}
|
|
5307
|
+
const data = o['data'];
|
|
5308
|
+
if (data == null || typeof data !== 'object' || Array.isArray(data)) {
|
|
5309
|
+
return {};
|
|
5310
|
+
}
|
|
5311
|
+
const agentName = data['agentName'];
|
|
5312
|
+
return typeof agentName === 'string' && agentName.trim() ? { agentName: agentName.trim() } : {};
|
|
5313
|
+
}
|
|
5314
|
+
catch {
|
|
5315
|
+
return {};
|
|
5316
|
+
}
|
|
5317
|
+
}
|
|
5318
|
+
/**
|
|
5319
|
+
* Human-readable wall time for the assist API run (mock stores {@code assistRunDurationMs}).
|
|
5320
|
+
*/
|
|
5321
|
+
formatAssistRunDuration(ms) {
|
|
5322
|
+
if (!Number.isFinite(ms) || ms < 0) {
|
|
5323
|
+
return '—';
|
|
5324
|
+
}
|
|
5325
|
+
if (ms < 1000) {
|
|
5326
|
+
return `${Math.round(ms)} ms`;
|
|
5327
|
+
}
|
|
5328
|
+
return `${(ms / 1000).toFixed(1)} s`;
|
|
5329
|
+
}
|
|
4699
5330
|
formatFallbackSegment(seg) {
|
|
4700
5331
|
try {
|
|
4701
5332
|
return JSON.stringify(seg, null, 2);
|
|
@@ -4716,6 +5347,9 @@ class AXMAssistMessageRendererComponent {
|
|
|
4716
5347
|
assistThinkFinalKey() {
|
|
4717
5348
|
return 'think:final';
|
|
4718
5349
|
}
|
|
5350
|
+
assistRunMetaKey() {
|
|
5351
|
+
return 'run-meta';
|
|
5352
|
+
}
|
|
4719
5353
|
assistAgentKey(callId) {
|
|
4720
5354
|
return `agent:${(callId ?? '').trim() || 'unknown'}`;
|
|
4721
5355
|
}
|
|
@@ -4837,878 +5471,20 @@ class AXMAssistMessageRendererComponent {
|
|
|
4837
5471
|
}
|
|
4838
5472
|
async syncDebugMode() {
|
|
4839
5473
|
try {
|
|
4840
|
-
const debugMode = await this.settingsService
|
|
5474
|
+
const debugMode = await this.settingsService
|
|
5475
|
+
.scope(AXPPlatformScope.Tenant)
|
|
5476
|
+
.get(AXPCommonSettings.DebugMode);
|
|
4841
5477
|
this.debugModeEnabled.set(!!debugMode);
|
|
4842
5478
|
}
|
|
4843
5479
|
catch {
|
|
4844
5480
|
this.debugModeEnabled.set(false);
|
|
4845
5481
|
}
|
|
5482
|
+
finally {
|
|
5483
|
+
this.debugModeResolved.set(true);
|
|
5484
|
+
}
|
|
4846
5485
|
}
|
|
4847
5486
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMAssistMessageRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
4848
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMAssistMessageRendererComponent, isStandalone: true, selector: "axm-assist-message-renderer", inputs: { message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
|
|
4849
|
-
<div class="axm-assist-renderer">
|
|
4850
|
-
@if (useTranscriptUi()) {
|
|
4851
|
-
<div
|
|
4852
|
-
class="axm-assist-bot"
|
|
4853
|
-
role="region"
|
|
4854
|
-
[attr.aria-label]="('@conversation:chat.assist-renderer.aria.assistant-response' | translate | async) ?? ''"
|
|
4855
|
-
>
|
|
4856
|
-
@for (line of transcriptLines(); track lineIndex; let lineIndex = $index) {
|
|
4857
|
-
<div
|
|
4858
|
-
class="axm-assist-bot__line"
|
|
4859
|
-
[class.axm-assist-bot__line--user]="line.role === 'user'"
|
|
4860
|
-
[class.axm-assist-bot__line--tool-role]="line.role === 'tool'"
|
|
4861
|
-
>
|
|
4862
|
-
@for (seg of line.responses; track segIndex; let segIndex = $index) {
|
|
4863
|
-
@if (line.role === 'user' && seg.type === 'image') {
|
|
4864
|
-
<axm-assist-bot-image-line
|
|
4865
|
-
[parentMessage]="message()"
|
|
4866
|
-
[fileId]="seg.content.fileId"
|
|
4867
|
-
[mimeType]="seg.content.mimeType"
|
|
4868
|
-
[name]="seg.content.name"
|
|
4869
|
-
/>
|
|
4870
|
-
} @else if (line.role === 'user' && seg.type === 'text') {
|
|
4871
|
-
<div class="axm-assist-bot__segment" [attr.dir]="segmentDir(seg.content)">
|
|
4872
|
-
<ax-conversation-text-renderer [message]="syntheticTextMessage(lineIndex, segIndex, seg.content)" />
|
|
4873
|
-
</div>
|
|
4874
|
-
} @else if (line.role === 'assistant' && seg.type === 'think') {
|
|
4875
|
-
<div class="axm-assist-renderer__accordion-group" axAccordionGroup [accordion]="false">
|
|
4876
|
-
<div
|
|
4877
|
-
class="axm-assist-renderer__thinking-accordion mb-0!"
|
|
4878
|
-
axAccordionItem
|
|
4879
|
-
#thinkAcc="axAccordionItem"
|
|
4880
|
-
[isCollapsed]="assistSectionIsCollapsed(assistThinkKey(lineIndex, segIndex))"
|
|
4881
|
-
(onClick)="onAssistAccordionClick($event, assistThinkKey(lineIndex, segIndex))"
|
|
4882
|
-
>
|
|
4883
|
-
<div
|
|
4884
|
-
class="axm-assist-renderer__accordion-header axm-assist-renderer__accordion-header--thinking"
|
|
4885
|
-
axAccordionItemHeader
|
|
4886
|
-
role="button"
|
|
4887
|
-
[attr.aria-expanded]="!thinkAcc.isCollapsed()"
|
|
4888
|
-
>
|
|
4889
|
-
<div class="axm-assist-renderer__accordion-header-main">
|
|
4890
|
-
<span class="axm-assist-renderer__accordion-header-title">
|
|
4891
|
-
<i
|
|
4892
|
-
class="fa-light fa-chevron-down axm-assist-renderer__thinking-chevron"
|
|
4893
|
-
[class.axm-assist-renderer__thinking-chevron--expanded]="!thinkAcc.isCollapsed()"
|
|
4894
|
-
aria-hidden="true"
|
|
4895
|
-
></i>
|
|
4896
|
-
{{ '@conversation:chat.assist-renderer.sections.thinking' | translate | async }}
|
|
4897
|
-
</span>
|
|
4898
|
-
</div>
|
|
4899
|
-
<ax-badge
|
|
4900
|
-
[look]="'twotone'"
|
|
4901
|
-
[text]="('@conversation:chat.assist-renderer.badges.internal' | translate | async) ?? ''"
|
|
4902
|
-
[color]="'warning'"
|
|
4903
|
-
></ax-badge>
|
|
4904
|
-
</div>
|
|
4905
|
-
<div axAccordionItemContent>
|
|
4906
|
-
<div
|
|
4907
|
-
class="axm-assist-renderer__thinking-body axm-assist-bot__segment"
|
|
4908
|
-
[attr.dir]="segmentDir(seg.content)"
|
|
4909
|
-
>
|
|
4910
|
-
{{ seg.content }}
|
|
4911
|
-
</div>
|
|
4912
|
-
</div>
|
|
4913
|
-
</div>
|
|
4914
|
-
</div>
|
|
4915
|
-
} @else if (line.role === 'assistant' && seg.type === 'text') {
|
|
4916
|
-
@let parsedLine = parseAssistLineText(seg.content);
|
|
4917
|
-
@if (debugModeEnabled() && parsedLine.thinking) {
|
|
4918
|
-
<div class="axm-assist-renderer__accordion-group" axAccordionGroup [accordion]="false">
|
|
4919
|
-
<div
|
|
4920
|
-
class="axm-assist-renderer__thinking-accordion mb-0!"
|
|
4921
|
-
axAccordionItem
|
|
4922
|
-
#thinkAcc="axAccordionItem"
|
|
4923
|
-
[isCollapsed]="assistSectionIsCollapsed(assistThinkKey(lineIndex, segIndex))"
|
|
4924
|
-
(onClick)="onAssistAccordionClick($event, assistThinkKey(lineIndex, segIndex))"
|
|
4925
|
-
>
|
|
4926
|
-
<div
|
|
4927
|
-
class="axm-assist-renderer__accordion-header axm-assist-renderer__accordion-header--thinking"
|
|
4928
|
-
axAccordionItemHeader
|
|
4929
|
-
role="button"
|
|
4930
|
-
[attr.aria-expanded]="!thinkAcc.isCollapsed()"
|
|
4931
|
-
>
|
|
4932
|
-
<div class="axm-assist-renderer__accordion-header-main">
|
|
4933
|
-
<span class="axm-assist-renderer__accordion-header-title">
|
|
4934
|
-
<i
|
|
4935
|
-
class="fa-light fa-chevron-down axm-assist-renderer__thinking-chevron"
|
|
4936
|
-
[class.axm-assist-renderer__thinking-chevron--expanded]="!thinkAcc.isCollapsed()"
|
|
4937
|
-
aria-hidden="true"
|
|
4938
|
-
></i>
|
|
4939
|
-
{{ '@conversation:chat.assist-renderer.sections.thinking' | translate | async }}
|
|
4940
|
-
</span>
|
|
4941
|
-
</div>
|
|
4942
|
-
<ax-badge
|
|
4943
|
-
[look]="'twotone'"
|
|
4944
|
-
[text]="('@conversation:chat.assist-renderer.badges.internal' | translate | async) ?? ''"
|
|
4945
|
-
[color]="'warning'"
|
|
4946
|
-
></ax-badge>
|
|
4947
|
-
</div>
|
|
4948
|
-
<div axAccordionItemContent>
|
|
4949
|
-
<div
|
|
4950
|
-
class="axm-assist-renderer__thinking-body axm-assist-bot__segment"
|
|
4951
|
-
[attr.dir]="segmentDir(parsedLine.thinking)"
|
|
4952
|
-
>
|
|
4953
|
-
{{ parsedLine.thinking }}
|
|
4954
|
-
</div>
|
|
4955
|
-
</div>
|
|
4956
|
-
</div>
|
|
4957
|
-
</div>
|
|
4958
|
-
}
|
|
4959
|
-
@if (parsedLine.body.trim()) {
|
|
4960
|
-
<div
|
|
4961
|
-
class="axm-assist-bot__segment axm-assist-renderer__markdown"
|
|
4962
|
-
[attr.dir]="segmentDir(parsedLine.body)"
|
|
4963
|
-
[innerHTML]="renderMarkdown(parsedLine.body)"
|
|
4964
|
-
></div>
|
|
4965
|
-
}
|
|
4966
|
-
} @else if (
|
|
4967
|
-
line.role === 'assistant' &&
|
|
4968
|
-
(seg.type === 'agent' || seg.type === 'tool') &&
|
|
4969
|
-
isDelegatedAgentCommand(seg.content.command) &&
|
|
4970
|
-
!debugModeEnabled()
|
|
4971
|
-
) {
|
|
4972
|
-
@let agLive = toolCallEntryFor(seg.callId);
|
|
4973
|
-
@let res = toolResultForCallId(seg.callId);
|
|
4974
|
-
@let agentAnswerText = delegatedAgentAnswerForCall(res);
|
|
4975
|
-
<div class="axm-assist-renderer__accordion-group" axAccordionGroup [accordion]="false">
|
|
4976
|
-
<div
|
|
4977
|
-
class="axm-assist-renderer__tool-card axm-assist-renderer__agent-accordion mb-0!"
|
|
4978
|
-
axAccordionItem
|
|
4979
|
-
#agentAcc="axAccordionItem"
|
|
4980
|
-
[isCollapsed]="assistSectionIsCollapsed(assistAgentKey(seg.callId))"
|
|
4981
|
-
(onClick)="onAssistAccordionClick($event, assistAgentKey(seg.callId))"
|
|
4982
|
-
>
|
|
4983
|
-
<div
|
|
4984
|
-
class="axm-assist-renderer__accordion-header"
|
|
4985
|
-
axAccordionItemHeader
|
|
4986
|
-
role="button"
|
|
4987
|
-
[attr.aria-expanded]="!agentAcc.isCollapsed()"
|
|
4988
|
-
>
|
|
4989
|
-
<div class="axm-assist-renderer__accordion-header-main">
|
|
4990
|
-
<span
|
|
4991
|
-
class="axm-assist-renderer__accordion-header-title inline-flex items-center gap-2 flex-wrap"
|
|
4992
|
-
>
|
|
4993
|
-
<i
|
|
4994
|
-
class="fa-light fa-chevron-down axm-assist-renderer__thinking-chevron"
|
|
4995
|
-
[class.axm-assist-renderer__thinking-chevron--expanded]="!agentAcc.isCollapsed()"
|
|
4996
|
-
aria-hidden="true"
|
|
4997
|
-
></i>
|
|
4998
|
-
@if (agLive?.state === 'running') {
|
|
4999
|
-
<span
|
|
5000
|
-
class="axm-assist-renderer__agent-live-spin inline-block w-3 h-3 rounded-full border-2 border-primary-500 border-t-transparent animate-spin shrink-0"
|
|
5001
|
-
aria-hidden="true"
|
|
5002
|
-
></span>
|
|
5003
|
-
} @else {
|
|
5004
|
-
<span
|
|
5005
|
-
class="inline-block w-3 h-3 rounded-full bg-success-500 shrink-0"
|
|
5006
|
-
aria-hidden="true"
|
|
5007
|
-
></span>
|
|
5008
|
-
}
|
|
5009
|
-
<i class="fa-light fa-people-group text-primary-500" aria-hidden="true"></i>
|
|
5010
|
-
<span class="axm-assist-renderer__agent-live-title">{{
|
|
5011
|
-
resolveToolDisplayTitle(seg.content.command)
|
|
5012
|
-
}}</span>
|
|
5013
|
-
</span>
|
|
5014
|
-
</div>
|
|
5015
|
-
<ax-badge
|
|
5016
|
-
[look]="'twotone'"
|
|
5017
|
-
[text]="
|
|
5018
|
-
(resolveToolBadge(
|
|
5019
|
-
seg.content.command,
|
|
5020
|
-
agLive?.state === 'running'
|
|
5021
|
-
? '@conversation:chat.assist-renderer.badges.running'
|
|
5022
|
-
: '@conversation:chat.assist-renderer.badges.agent'
|
|
5023
|
-
)
|
|
5024
|
-
| translate
|
|
5025
|
-
| async) ?? ''
|
|
5026
|
-
"
|
|
5027
|
-
[color]="agLive?.state === 'running' ? 'primary' : 'success'"
|
|
5028
|
-
></ax-badge>
|
|
5029
|
-
</div>
|
|
5030
|
-
<div axAccordionItemContent>
|
|
5031
|
-
<div
|
|
5032
|
-
class="axm-assist-renderer__agent-live-block axm-assist-renderer__agent-live-block--in-accordion"
|
|
5033
|
-
role="region"
|
|
5034
|
-
>
|
|
5035
|
-
<div
|
|
5036
|
-
class="axm-assist-renderer__agent-live-prompt"
|
|
5037
|
-
[attr.dir]="segmentDir(delegatedPromptPreview(seg.content.arguments))"
|
|
5038
|
-
>
|
|
5039
|
-
{{ delegatedPromptPreview(seg.content.arguments) }}
|
|
5040
|
-
</div>
|
|
5041
|
-
@if (agLive?.nestedStreamText?.trim()) {
|
|
5042
|
-
<div
|
|
5043
|
-
class="axm-assist-renderer__agent-live-stream"
|
|
5044
|
-
[attr.dir]="segmentDir(agLive?.nestedStreamText ?? '')"
|
|
5045
|
-
>
|
|
5046
|
-
{{ agLive?.nestedStreamText }}
|
|
5047
|
-
</div>
|
|
5048
|
-
}
|
|
5049
|
-
@if (agLive?.nestedTools?.length) {
|
|
5050
|
-
<div class="axm-assist-renderer__agent-live-nested-tools">
|
|
5051
|
-
@for (nt of agLive?.nestedTools ?? []; track nt.id) {
|
|
5052
|
-
<div class="axm-assist-renderer__agent-live-nested-row">
|
|
5053
|
-
@if (nt.state === 'running') {
|
|
5054
|
-
<span
|
|
5055
|
-
class="inline-block w-2.5 h-2.5 rounded-full border-2 border-primary-500 border-t-transparent animate-spin shrink-0"
|
|
5056
|
-
aria-hidden="true"
|
|
5057
|
-
></span>
|
|
5058
|
-
} @else {
|
|
5059
|
-
<span
|
|
5060
|
-
class="inline-block w-2.5 h-2.5 rounded-full bg-success-500 shrink-0"
|
|
5061
|
-
aria-hidden="true"
|
|
5062
|
-
></span>
|
|
5063
|
-
}
|
|
5064
|
-
<code class="axm-assist-renderer__agent-live-nested-name">{{ nt.name }}</code>
|
|
5065
|
-
<span class="axm-assist-renderer__agent-live-nested-status">{{
|
|
5066
|
-
nt.state === 'running' ? '…' : '✓'
|
|
5067
|
-
}}</span>
|
|
5068
|
-
</div>
|
|
5069
|
-
}
|
|
5070
|
-
</div>
|
|
5071
|
-
}
|
|
5072
|
-
@if (agentAnswerText) {
|
|
5073
|
-
<div class="axm-assist-renderer__agent-live-nested-tools">
|
|
5074
|
-
<div class="axm-assist-renderer__tool-section-label">
|
|
5075
|
-
{{ '@conversation:chat.assist-renderer.sections.agent-answer' | translate | async }}
|
|
5076
|
-
</div>
|
|
5077
|
-
<div
|
|
5078
|
-
class="axm-assist-renderer__agent-live-stream"
|
|
5079
|
-
[attr.dir]="segmentDir(agentAnswerText)"
|
|
5080
|
-
>
|
|
5081
|
-
{{ agentAnswerText }}
|
|
5082
|
-
</div>
|
|
5083
|
-
</div>
|
|
5084
|
-
}
|
|
5085
|
-
</div>
|
|
5086
|
-
</div>
|
|
5087
|
-
</div>
|
|
5088
|
-
</div>
|
|
5089
|
-
} @else if (
|
|
5090
|
-
line.role === 'assistant' &&
|
|
5091
|
-
(seg.type === 'agent' || seg.type === 'tool') &&
|
|
5092
|
-
isDelegatedAgentCommand(seg.content.command) &&
|
|
5093
|
-
debugModeEnabled()
|
|
5094
|
-
) {
|
|
5095
|
-
<div class="axm-assist-renderer__accordion-group" axAccordionGroup [accordion]="false">
|
|
5096
|
-
<div
|
|
5097
|
-
class="axm-assist-renderer__tool-card !mb-0"
|
|
5098
|
-
axAccordionItem
|
|
5099
|
-
#agentDebugAcc="axAccordionItem"
|
|
5100
|
-
[isCollapsed]="assistSectionIsCollapsed(assistAgentKey(seg.callId))"
|
|
5101
|
-
(onClick)="onAssistAccordionClick($event, assistAgentKey(seg.callId))"
|
|
5102
|
-
>
|
|
5103
|
-
<div class="axm-assist-renderer__accordion-header" axAccordionItemHeader>
|
|
5104
|
-
<div class="axm-assist-renderer__accordion-header-main">
|
|
5105
|
-
<span class="axm-assist-renderer__accordion-header-title">
|
|
5106
|
-
<i
|
|
5107
|
-
class="fa-light fa-chevron-down axm-assist-renderer__thinking-chevron"
|
|
5108
|
-
[class.axm-assist-renderer__thinking-chevron--expanded]="!agentDebugAcc.isCollapsed()"
|
|
5109
|
-
aria-hidden="true"
|
|
5110
|
-
></i>
|
|
5111
|
-
<i class="fa-light fa-screwdriver-wrench axm-assist-renderer__tool-title-icon"></i>
|
|
5112
|
-
{{ resolveToolDisplayTitle(seg.content.command) }}
|
|
5113
|
-
</span>
|
|
5114
|
-
</div>
|
|
5115
|
-
<span
|
|
5116
|
-
class="axm-assist-renderer__accordion-header-badge axm-assist-renderer__accordion-header-badge--primary"
|
|
5117
|
-
>
|
|
5118
|
-
<ax-badge
|
|
5119
|
-
[look]="'twotone'"
|
|
5120
|
-
[text]="
|
|
5121
|
-
(resolveToolBadge(seg.content.command, '@conversation:chat.assist-renderer.badges.agent')
|
|
5122
|
-
| translate
|
|
5123
|
-
| async) ?? ''
|
|
5124
|
-
"
|
|
5125
|
-
[color]="'primary'"
|
|
5126
|
-
></ax-badge>
|
|
5127
|
-
</span>
|
|
5128
|
-
</div>
|
|
5129
|
-
<div axAccordionItemContent>
|
|
5130
|
-
<div class="axm-assist-renderer__tool-body">
|
|
5131
|
-
<div class="axm-assist-renderer__tool-section-label">
|
|
5132
|
-
{{ '@conversation:chat.assist-renderer.sections.input' | translate | async }}
|
|
5133
|
-
</div>
|
|
5134
|
-
<div class="axm-assist-renderer__tool-editor-wrap" style="direction: ltr;">
|
|
5135
|
-
<ax-code-editor
|
|
5136
|
-
[ngModel]="formatArgs(seg.content.arguments)"
|
|
5137
|
-
[readonly]="true"
|
|
5138
|
-
language="json"
|
|
5139
|
-
[lineNumbers]="true"
|
|
5140
|
-
class="axm-assist-renderer__tool-editor"
|
|
5141
|
-
></ax-code-editor>
|
|
5142
|
-
</div>
|
|
5143
|
-
@if (toolResultForCallId(seg.callId); as resultLine) {
|
|
5144
|
-
<div class="axm-assist-renderer__tool-section-label">
|
|
5145
|
-
{{ '@conversation:chat.assist-renderer.sections.output' | translate | async }}
|
|
5146
|
-
</div>
|
|
5147
|
-
<div class="axm-assist-renderer__tool-editor-wrap" style="direction: ltr;">
|
|
5148
|
-
<ax-code-editor
|
|
5149
|
-
[ngModel]="formatToolResultBody(resultLine)"
|
|
5150
|
-
[readonly]="true"
|
|
5151
|
-
language="json"
|
|
5152
|
-
[lineNumbers]="true"
|
|
5153
|
-
class="axm-assist-renderer__tool-editor"
|
|
5154
|
-
></ax-code-editor>
|
|
5155
|
-
</div>
|
|
5156
|
-
}
|
|
5157
|
-
</div>
|
|
5158
|
-
</div>
|
|
5159
|
-
</div>
|
|
5160
|
-
</div>
|
|
5161
|
-
} @else if (line.role === 'assistant' && seg.type === 'tool' && !debugModeEnabled()) {
|
|
5162
|
-
@let tc = toolCallEntryFor(seg.callId);
|
|
5163
|
-
<div
|
|
5164
|
-
class="axm-assist-renderer__tool-compact flex items-center gap-2 rounded-md border border-default/50 bg-default-50/40 px-2 py-1.5 text-sm"
|
|
5165
|
-
role="status"
|
|
5166
|
-
[attr.aria-label]="resolveToolDisplayTitle(seg.content.command)"
|
|
5167
|
-
>
|
|
5168
|
-
@if (tc?.state === 'running') {
|
|
5169
|
-
<span
|
|
5170
|
-
class="inline-block w-2.5 h-2.5 rounded-full border-2 border-primary-500 border-t-transparent animate-spin shrink-0"
|
|
5171
|
-
aria-hidden="true"
|
|
5172
|
-
></span>
|
|
5173
|
-
} @else {
|
|
5174
|
-
<i class="fa-light fa-check text-success-500 shrink-0" aria-hidden="true"></i>
|
|
5175
|
-
}
|
|
5176
|
-
<span class="font-medium min-w-0 truncate">{{ resolveToolDisplayTitle(seg.content.command) }}</span>
|
|
5177
|
-
</div>
|
|
5178
|
-
} @else if (line.role === 'assistant' && seg.type === 'tool' && debugModeEnabled()) {
|
|
5179
|
-
<div class="axm-assist-renderer__accordion-group" axAccordionGroup [accordion]="false">
|
|
5180
|
-
<div
|
|
5181
|
-
class="axm-assist-renderer__tool-card !mb-0"
|
|
5182
|
-
axAccordionItem
|
|
5183
|
-
#toolDebugAcc="axAccordionItem"
|
|
5184
|
-
[isCollapsed]="assistSectionIsCollapsed(assistToolKey(seg.callId))"
|
|
5185
|
-
(onClick)="onAssistAccordionClick($event, assistToolKey(seg.callId))"
|
|
5186
|
-
>
|
|
5187
|
-
<div class="axm-assist-renderer__accordion-header" axAccordionItemHeader>
|
|
5188
|
-
<div class="axm-assist-renderer__accordion-header-main">
|
|
5189
|
-
<span class="axm-assist-renderer__accordion-header-title">
|
|
5190
|
-
<i
|
|
5191
|
-
class="fa-light fa-chevron-down axm-assist-renderer__thinking-chevron"
|
|
5192
|
-
[class.axm-assist-renderer__thinking-chevron--expanded]="!toolDebugAcc.isCollapsed()"
|
|
5193
|
-
aria-hidden="true"
|
|
5194
|
-
></i>
|
|
5195
|
-
<i class="fa-light fa-screwdriver-wrench axm-assist-renderer__tool-title-icon"></i>
|
|
5196
|
-
{{ resolveToolDisplayTitle(seg.content.command) }}
|
|
5197
|
-
</span>
|
|
5198
|
-
</div>
|
|
5199
|
-
<span
|
|
5200
|
-
class="axm-assist-renderer__accordion-header-badge axm-assist-renderer__accordion-header-badge--primary"
|
|
5201
|
-
>
|
|
5202
|
-
<ax-badge
|
|
5203
|
-
[look]="'twotone'"
|
|
5204
|
-
[text]="
|
|
5205
|
-
(resolveToolBadge(seg.content.command, '@conversation:chat.assist-renderer.badges.tool')
|
|
5206
|
-
| translate
|
|
5207
|
-
| async) ?? ''
|
|
5208
|
-
"
|
|
5209
|
-
[color]="'primary'"
|
|
5210
|
-
></ax-badge>
|
|
5211
|
-
</span>
|
|
5212
|
-
</div>
|
|
5213
|
-
<div axAccordionItemContent>
|
|
5214
|
-
<div class="axm-assist-renderer__tool-body">
|
|
5215
|
-
<div class="axm-assist-renderer__tool-section-label">
|
|
5216
|
-
{{ '@conversation:chat.assist-renderer.sections.input' | translate | async }}
|
|
5217
|
-
</div>
|
|
5218
|
-
<div class="axm-assist-renderer__tool-editor-wrap" style="direction: ltr;">
|
|
5219
|
-
<ax-code-editor
|
|
5220
|
-
[ngModel]="formatArgs(seg.content.arguments)"
|
|
5221
|
-
[readonly]="true"
|
|
5222
|
-
language="json"
|
|
5223
|
-
[lineNumbers]="true"
|
|
5224
|
-
class="axm-assist-renderer__tool-editor"
|
|
5225
|
-
></ax-code-editor>
|
|
5226
|
-
</div>
|
|
5227
|
-
@if (toolResultForCallId(seg.callId); as resultLine) {
|
|
5228
|
-
<div class="axm-assist-renderer__tool-section-label">
|
|
5229
|
-
{{ '@conversation:chat.assist-renderer.sections.output' | translate | async }}
|
|
5230
|
-
</div>
|
|
5231
|
-
<div class="axm-assist-renderer__tool-editor-wrap" style="direction: ltr;">
|
|
5232
|
-
<ax-code-editor
|
|
5233
|
-
[ngModel]="formatToolResultBody(resultLine)"
|
|
5234
|
-
[readonly]="true"
|
|
5235
|
-
language="json"
|
|
5236
|
-
[lineNumbers]="true"
|
|
5237
|
-
class="axm-assist-renderer__tool-editor"
|
|
5238
|
-
></ax-code-editor>
|
|
5239
|
-
</div>
|
|
5240
|
-
}
|
|
5241
|
-
</div>
|
|
5242
|
-
</div>
|
|
5243
|
-
</div>
|
|
5244
|
-
</div>
|
|
5245
|
-
} @else if (line.role === 'assistant' && seg.type === 'node') {
|
|
5246
|
-
@let assistNodeWidget = axmAssistWidgetNodeFromUnknown(seg.content);
|
|
5247
|
-
@if (assistNodeWidget) {
|
|
5248
|
-
<div class="axm-assist-bot__segment" dir="auto">
|
|
5249
|
-
<axm-chat-user-form-renderer
|
|
5250
|
-
[message]="syntheticNodeEmbedMessage(lineIndex, segIndex, seg.content)"
|
|
5251
|
-
/>
|
|
5252
|
-
</div>
|
|
5253
|
-
}
|
|
5254
|
-
} @else if (line.role === 'assistant' && seg.type === 'image') {
|
|
5255
|
-
<axm-assist-bot-image-line
|
|
5256
|
-
[parentMessage]="message()"
|
|
5257
|
-
[fileId]="seg.content.fileId"
|
|
5258
|
-
[mimeType]="seg.content.mimeType"
|
|
5259
|
-
[name]="seg.content.name"
|
|
5260
|
-
/>
|
|
5261
|
-
} @else if (line.role === 'tool' && (seg.type === 'tool_result' || seg.type === 'agent_result')) {
|
|
5262
|
-
<!-- merged into the corresponding tool/agent accordion -->
|
|
5263
|
-
} @else if (line.role === 'system' && seg.type === 'text') {
|
|
5264
|
-
<div class="axm-assist-bot__segment" [attr.dir]="segmentDir(seg.content)">
|
|
5265
|
-
<ax-conversation-text-renderer [message]="syntheticTextMessage(lineIndex, segIndex, seg.content)" />
|
|
5266
|
-
</div>
|
|
5267
|
-
} @else {
|
|
5268
|
-
<div
|
|
5269
|
-
class="axm-assist-bot__fallback axm-assist-bot__segment"
|
|
5270
|
-
[attr.dir]="segmentDir(formatFallbackSegment(seg))"
|
|
5271
|
-
>
|
|
5272
|
-
{{ formatFallbackSegment(seg) }}
|
|
5273
|
-
</div>
|
|
5274
|
-
}
|
|
5275
|
-
}
|
|
5276
|
-
</div>
|
|
5277
|
-
}
|
|
5278
|
-
@if (isStreaming()) {
|
|
5279
|
-
<div class="axm-assist-renderer__streaming-activity" role="status" aria-live="polite">
|
|
5280
|
-
<span
|
|
5281
|
-
class="axm-assist-renderer__activity-spin inline-block w-3 h-3 rounded-full border-2 border-primary-500 border-t-transparent animate-spin shrink-0"
|
|
5282
|
-
aria-hidden="true"
|
|
5283
|
-
></span>
|
|
5284
|
-
<span class="axm-assist-renderer__activity-label text-xs text-muted italic">{{
|
|
5285
|
-
assistActivityMessageKey() | translate | async
|
|
5286
|
-
}}</span>
|
|
5287
|
-
</div>
|
|
5288
|
-
}
|
|
5289
|
-
@if (isStreaming() && streamText().trim()) {
|
|
5290
|
-
<span class="axm-assist-renderer__cursor" aria-hidden="true"></span>
|
|
5291
|
-
}
|
|
5292
|
-
</div>
|
|
5293
|
-
} @else {
|
|
5294
|
-
@if (isStreaming()) {
|
|
5295
|
-
<div class="axm-assist-renderer__stream-content">
|
|
5296
|
-
<div class="axm-assist-renderer__streaming-activity" role="status" aria-live="polite">
|
|
5297
|
-
<span
|
|
5298
|
-
class="axm-assist-renderer__activity-spin inline-block w-3 h-3 rounded-full border-2 border-primary-500 border-t-transparent animate-spin shrink-0"
|
|
5299
|
-
aria-hidden="true"
|
|
5300
|
-
></span>
|
|
5301
|
-
<span class="axm-assist-renderer__activity-label text-xs text-muted italic">{{
|
|
5302
|
-
assistActivityMessageKey() | translate | async
|
|
5303
|
-
}}</span>
|
|
5304
|
-
</div>
|
|
5305
|
-
@if (streamThink().trim()) {
|
|
5306
|
-
<div class="axm-assist-renderer__accordion-group" axAccordionGroup [accordion]="false">
|
|
5307
|
-
<div
|
|
5308
|
-
class="axm-assist-renderer__thinking-accordion !mb-0"
|
|
5309
|
-
axAccordionItem
|
|
5310
|
-
#thinkAcc="axAccordionItem"
|
|
5311
|
-
[isCollapsed]="assistSectionIsCollapsed(assistThinkStreamKey())"
|
|
5312
|
-
(onClick)="onAssistAccordionClick($event, assistThinkStreamKey())"
|
|
5313
|
-
>
|
|
5314
|
-
<div
|
|
5315
|
-
class="axm-assist-renderer__accordion-header axm-assist-renderer__accordion-header--thinking"
|
|
5316
|
-
axAccordionItemHeader
|
|
5317
|
-
role="button"
|
|
5318
|
-
[attr.aria-expanded]="!thinkAcc.isCollapsed()"
|
|
5319
|
-
>
|
|
5320
|
-
<div class="axm-assist-renderer__accordion-header-main">
|
|
5321
|
-
<span class="axm-assist-renderer__accordion-header-title">
|
|
5322
|
-
<i
|
|
5323
|
-
class="fa-light fa-chevron-down axm-assist-renderer__thinking-chevron"
|
|
5324
|
-
[class.axm-assist-renderer__thinking-chevron--expanded]="!thinkAcc.isCollapsed()"
|
|
5325
|
-
aria-hidden="true"
|
|
5326
|
-
></i>
|
|
5327
|
-
{{ '@conversation:chat.assist-renderer.sections.thinking' | translate | async }}
|
|
5328
|
-
</span>
|
|
5329
|
-
</div>
|
|
5330
|
-
<ax-badge
|
|
5331
|
-
[look]="'twotone'"
|
|
5332
|
-
[text]="('@conversation:chat.assist-renderer.badges.internal' | translate | async) ?? ''"
|
|
5333
|
-
[color]="'warning'"
|
|
5334
|
-
></ax-badge>
|
|
5335
|
-
</div>
|
|
5336
|
-
<div axAccordionItemContent>
|
|
5337
|
-
<div
|
|
5338
|
-
class="axm-assist-renderer__thinking-body axm-assist-bot__segment"
|
|
5339
|
-
[attr.dir]="segmentDir(streamThink())"
|
|
5340
|
-
>
|
|
5341
|
-
{{ streamThink() }}
|
|
5342
|
-
</div>
|
|
5343
|
-
</div>
|
|
5344
|
-
</div>
|
|
5345
|
-
</div>
|
|
5346
|
-
}
|
|
5347
|
-
@if (streamText()) {
|
|
5348
|
-
<div class="axm-assist-renderer__text axm-assist-bot__segment" [attr.dir]="segmentDir(streamText())">
|
|
5349
|
-
{{ streamText() }}
|
|
5350
|
-
</div>
|
|
5351
|
-
}
|
|
5352
|
-
@if (toolCalls().length) {
|
|
5353
|
-
<div class="axm-assist-renderer__tools">
|
|
5354
|
-
@for (tc of toolCalls(); track tc.id) {
|
|
5355
|
-
@if (isDelegatedAgentCommand(tc.name)) {
|
|
5356
|
-
@let legacyAgentAns = delegatedAnswerFromToolOutputString(tc.output);
|
|
5357
|
-
<div class="axm-assist-renderer__accordion-group" axAccordionGroup [accordion]="false">
|
|
5358
|
-
<div
|
|
5359
|
-
class="axm-assist-renderer__tool-card axm-assist-renderer__agent-accordion !mb-0"
|
|
5360
|
-
axAccordionItem
|
|
5361
|
-
#legacyAgentAcc="axAccordionItem"
|
|
5362
|
-
[isCollapsed]="assistSectionIsCollapsed(assistAgentKey(tc.id))"
|
|
5363
|
-
(onClick)="onAssistAccordionClick($event, assistAgentKey(tc.id))"
|
|
5364
|
-
>
|
|
5365
|
-
<div
|
|
5366
|
-
class="axm-assist-renderer__accordion-header"
|
|
5367
|
-
axAccordionItemHeader
|
|
5368
|
-
role="button"
|
|
5369
|
-
[attr.aria-expanded]="!legacyAgentAcc.isCollapsed()"
|
|
5370
|
-
>
|
|
5371
|
-
<div class="axm-assist-renderer__accordion-header-main">
|
|
5372
|
-
<span
|
|
5373
|
-
class="axm-assist-renderer__accordion-header-title inline-flex items-center gap-2 flex-wrap"
|
|
5374
|
-
>
|
|
5375
|
-
<i
|
|
5376
|
-
class="fa-light fa-chevron-down axm-assist-renderer__thinking-chevron"
|
|
5377
|
-
[class.axm-assist-renderer__thinking-chevron--expanded]="!legacyAgentAcc.isCollapsed()"
|
|
5378
|
-
aria-hidden="true"
|
|
5379
|
-
></i>
|
|
5380
|
-
@if (tc.state === 'running') {
|
|
5381
|
-
<span
|
|
5382
|
-
class="axm-assist-renderer__agent-live-spin inline-block w-3 h-3 rounded-full border-2 border-primary-500 border-t-transparent animate-spin shrink-0"
|
|
5383
|
-
aria-hidden="true"
|
|
5384
|
-
></span>
|
|
5385
|
-
} @else {
|
|
5386
|
-
<span
|
|
5387
|
-
class="inline-block w-3 h-3 rounded-full bg-success-500 shrink-0"
|
|
5388
|
-
aria-hidden="true"
|
|
5389
|
-
></span>
|
|
5390
|
-
}
|
|
5391
|
-
<i class="fa-light fa-people-group text-primary-500" aria-hidden="true"></i>
|
|
5392
|
-
<span class="axm-assist-renderer__agent-live-title">{{
|
|
5393
|
-
resolveToolDisplayTitle(tc.name)
|
|
5394
|
-
}}</span>
|
|
5395
|
-
</span>
|
|
5396
|
-
</div>
|
|
5397
|
-
<ax-badge
|
|
5398
|
-
[look]="'twotone'"
|
|
5399
|
-
[text]="
|
|
5400
|
-
(resolveToolBadge(
|
|
5401
|
-
tc.name,
|
|
5402
|
-
tc.state === 'running'
|
|
5403
|
-
? '@conversation:chat.assist-renderer.badges.running'
|
|
5404
|
-
: '@conversation:chat.assist-renderer.badges.agent'
|
|
5405
|
-
)
|
|
5406
|
-
| translate
|
|
5407
|
-
| async) ?? ''
|
|
5408
|
-
"
|
|
5409
|
-
[color]="tc.state === 'running' ? 'primary' : 'success'"
|
|
5410
|
-
></ax-badge>
|
|
5411
|
-
</div>
|
|
5412
|
-
<div axAccordionItemContent>
|
|
5413
|
-
<div
|
|
5414
|
-
class="axm-assist-renderer__agent-live-block axm-assist-renderer__agent-live-block--in-accordion"
|
|
5415
|
-
role="region"
|
|
5416
|
-
>
|
|
5417
|
-
<div
|
|
5418
|
-
class="axm-assist-renderer__agent-live-prompt"
|
|
5419
|
-
[attr.dir]="segmentDir(delegatedPromptPreview(tc.arguments))"
|
|
5420
|
-
>
|
|
5421
|
-
{{ delegatedPromptPreview(tc.arguments) }}
|
|
5422
|
-
</div>
|
|
5423
|
-
@if (tc.nestedStreamText?.trim()) {
|
|
5424
|
-
<div
|
|
5425
|
-
class="axm-assist-renderer__agent-live-stream"
|
|
5426
|
-
[attr.dir]="segmentDir(tc.nestedStreamText ?? '')"
|
|
5427
|
-
>
|
|
5428
|
-
{{ tc.nestedStreamText }}
|
|
5429
|
-
</div>
|
|
5430
|
-
}
|
|
5431
|
-
@if (tc.nestedTools?.length) {
|
|
5432
|
-
<div class="axm-assist-renderer__agent-live-nested-tools">
|
|
5433
|
-
@for (nt of tc.nestedTools; track nt.id) {
|
|
5434
|
-
<div class="axm-assist-renderer__agent-live-nested-row">
|
|
5435
|
-
@if (nt.state === 'running') {
|
|
5436
|
-
<span
|
|
5437
|
-
class="inline-block w-2.5 h-2.5 rounded-full border-2 border-primary-500 border-t-transparent animate-spin shrink-0"
|
|
5438
|
-
aria-hidden="true"
|
|
5439
|
-
></span>
|
|
5440
|
-
} @else {
|
|
5441
|
-
<span
|
|
5442
|
-
class="inline-block w-2.5 h-2.5 rounded-full bg-success-500 shrink-0"
|
|
5443
|
-
aria-hidden="true"
|
|
5444
|
-
></span>
|
|
5445
|
-
}
|
|
5446
|
-
<code class="axm-assist-renderer__agent-live-nested-name">{{ nt.name }}</code>
|
|
5447
|
-
<span class="axm-assist-renderer__agent-live-nested-status">{{
|
|
5448
|
-
nt.state === 'running' ? '…' : '✓'
|
|
5449
|
-
}}</span>
|
|
5450
|
-
</div>
|
|
5451
|
-
}
|
|
5452
|
-
</div>
|
|
5453
|
-
}
|
|
5454
|
-
@if (legacyAgentAns) {
|
|
5455
|
-
<div class="axm-assist-renderer__agent-live-nested-tools">
|
|
5456
|
-
<div class="axm-assist-renderer__tool-section-label">
|
|
5457
|
-
{{ '@conversation:chat.assist-renderer.sections.agent-answer' | translate | async }}
|
|
5458
|
-
</div>
|
|
5459
|
-
<div
|
|
5460
|
-
class="axm-assist-renderer__agent-live-stream"
|
|
5461
|
-
[attr.dir]="segmentDir(legacyAgentAns)"
|
|
5462
|
-
>
|
|
5463
|
-
{{ legacyAgentAns }}
|
|
5464
|
-
</div>
|
|
5465
|
-
</div>
|
|
5466
|
-
}
|
|
5467
|
-
</div>
|
|
5468
|
-
</div>
|
|
5469
|
-
</div>
|
|
5470
|
-
</div>
|
|
5471
|
-
} @else {
|
|
5472
|
-
@if (debugModeEnabled()) {
|
|
5473
|
-
<div class="axm-assist-renderer__accordion-group" axAccordionGroup [accordion]="false">
|
|
5474
|
-
<div
|
|
5475
|
-
class="axm-assist-renderer__tool-card !-mb-0"
|
|
5476
|
-
axAccordionItem
|
|
5477
|
-
#legacyStreamDbgAcc="axAccordionItem"
|
|
5478
|
-
[isCollapsed]="assistSectionIsCollapsed(assistLegacyToolAccordionKey(tc))"
|
|
5479
|
-
(onClick)="onAssistLegacyAccordionClick($event, tc)"
|
|
5480
|
-
>
|
|
5481
|
-
<div class="axm-assist-renderer__accordion-header" axAccordionItemHeader>
|
|
5482
|
-
<div class="axm-assist-renderer__accordion-header-main">
|
|
5483
|
-
<span class="axm-assist-renderer__accordion-header-title">
|
|
5484
|
-
<i
|
|
5485
|
-
class="fa-light fa-chevron-down axm-assist-renderer__thinking-chevron"
|
|
5486
|
-
[class.axm-assist-renderer__thinking-chevron--expanded]="
|
|
5487
|
-
!legacyStreamDbgAcc.isCollapsed()
|
|
5488
|
-
"
|
|
5489
|
-
aria-hidden="true"
|
|
5490
|
-
></i>
|
|
5491
|
-
<i class="fa-light fa-screwdriver-wrench axm-assist-renderer__tool-title-icon"></i>
|
|
5492
|
-
{{ resolveToolDisplayTitle(tc.name) }}
|
|
5493
|
-
</span>
|
|
5494
|
-
</div>
|
|
5495
|
-
<span
|
|
5496
|
-
class="axm-assist-renderer__accordion-header-badge"
|
|
5497
|
-
[class.axm-assist-renderer__accordion-header-badge--primary]="tc.state === 'running'"
|
|
5498
|
-
[class.axm-assist-renderer__accordion-header-badge--success]="tc.state === 'done'"
|
|
5499
|
-
>
|
|
5500
|
-
<ax-badge
|
|
5501
|
-
[look]="'twotone'"
|
|
5502
|
-
[text]="
|
|
5503
|
-
(resolveToolBadge(
|
|
5504
|
-
tc.name,
|
|
5505
|
-
tc.state === 'running'
|
|
5506
|
-
? '@conversation:chat.assist-renderer.badges.running'
|
|
5507
|
-
: '@conversation:chat.assist-renderer.badges.done'
|
|
5508
|
-
)
|
|
5509
|
-
| translate
|
|
5510
|
-
| async) ?? ''
|
|
5511
|
-
"
|
|
5512
|
-
[color]="tc.state === 'running' ? 'primary' : 'success'"
|
|
5513
|
-
></ax-badge>
|
|
5514
|
-
</span>
|
|
5515
|
-
</div>
|
|
5516
|
-
<div axAccordionItemContent>
|
|
5517
|
-
<div class="axm-assist-renderer__tool-body">
|
|
5518
|
-
<div class="axm-assist-renderer__tool-section-label">
|
|
5519
|
-
{{ '@conversation:chat.assist-renderer.sections.input' | translate | async }}
|
|
5520
|
-
</div>
|
|
5521
|
-
<div class="axm-assist-renderer__tool-editor-wrap" style="direction: ltr;">
|
|
5522
|
-
<ax-code-editor
|
|
5523
|
-
[ngModel]="formatArgs(tc.arguments)"
|
|
5524
|
-
[readonly]="true"
|
|
5525
|
-
language="json"
|
|
5526
|
-
[lineNumbers]="true"
|
|
5527
|
-
class="axm-assist-renderer__tool-editor"
|
|
5528
|
-
></ax-code-editor>
|
|
5529
|
-
</div>
|
|
5530
|
-
@if (tc.output) {
|
|
5531
|
-
<div class="axm-assist-renderer__tool-section-label">
|
|
5532
|
-
{{ '@conversation:chat.assist-renderer.sections.output' | translate | async }}
|
|
5533
|
-
</div>
|
|
5534
|
-
<div class="axm-assist-renderer__tool-editor-wrap" style="direction: ltr;">
|
|
5535
|
-
<ax-code-editor
|
|
5536
|
-
[ngModel]="formatJson(tc.output)"
|
|
5537
|
-
[readonly]="true"
|
|
5538
|
-
language="json"
|
|
5539
|
-
[lineNumbers]="true"
|
|
5540
|
-
class="axm-assist-renderer__tool-editor"
|
|
5541
|
-
></ax-code-editor>
|
|
5542
|
-
</div>
|
|
5543
|
-
}
|
|
5544
|
-
</div>
|
|
5545
|
-
</div>
|
|
5546
|
-
</div>
|
|
5547
|
-
</div>
|
|
5548
|
-
} @else {
|
|
5549
|
-
<div
|
|
5550
|
-
class="axm-assist-renderer__tool-compact flex items-center gap-2 rounded-md border border-default/50 bg-default-50/40 px-2 py-1.5 text-sm"
|
|
5551
|
-
role="status"
|
|
5552
|
-
>
|
|
5553
|
-
@if (tc.state === 'running') {
|
|
5554
|
-
<span
|
|
5555
|
-
class="inline-block w-2.5 h-2.5 rounded-full border-2 border-primary-500 border-t-transparent animate-spin shrink-0"
|
|
5556
|
-
aria-hidden="true"
|
|
5557
|
-
></span>
|
|
5558
|
-
} @else {
|
|
5559
|
-
<i class="fa-light fa-check text-success-500 shrink-0" aria-hidden="true"></i>
|
|
5560
|
-
}
|
|
5561
|
-
<span class="font-medium min-w-0 truncate">{{ resolveToolDisplayTitle(tc.name) }}</span>
|
|
5562
|
-
</div>
|
|
5563
|
-
}
|
|
5564
|
-
}
|
|
5565
|
-
}
|
|
5566
|
-
</div>
|
|
5567
|
-
}
|
|
5568
|
-
@if (isStreaming() && streamText().trim()) {
|
|
5569
|
-
<span class="axm-assist-renderer__cursor"></span>
|
|
5570
|
-
} @else if (isStreaming() && !streamThink().trim() && !streamText().trim() && !toolCalls().length) {
|
|
5571
|
-
<div class="axm-assist-renderer__waiting">
|
|
5572
|
-
<span class="axm-assist-renderer__dot"></span>
|
|
5573
|
-
<span class="axm-assist-renderer__dot"></span>
|
|
5574
|
-
<span class="axm-assist-renderer__dot"></span>
|
|
5575
|
-
</div>
|
|
5576
|
-
}
|
|
5577
|
-
</div>
|
|
5578
|
-
} @else {
|
|
5579
|
-
@if (debugModeEnabled() && parsed().thinking) {
|
|
5580
|
-
<div class="axm-assist-renderer__accordion-group" axAccordionGroup [accordion]="false">
|
|
5581
|
-
<div
|
|
5582
|
-
class="axm-assist-renderer__thinking-accordion !mb-0"
|
|
5583
|
-
axAccordionItem
|
|
5584
|
-
#thinkAcc="axAccordionItem"
|
|
5585
|
-
[isCollapsed]="assistSectionIsCollapsed(assistThinkFinalKey())"
|
|
5586
|
-
(onClick)="onAssistAccordionClick($event, assistThinkFinalKey())"
|
|
5587
|
-
>
|
|
5588
|
-
<div
|
|
5589
|
-
class="axm-assist-renderer__accordion-header axm-assist-renderer__accordion-header--thinking"
|
|
5590
|
-
axAccordionItemHeader
|
|
5591
|
-
role="button"
|
|
5592
|
-
[attr.aria-expanded]="!thinkAcc.isCollapsed()"
|
|
5593
|
-
>
|
|
5594
|
-
<div class="axm-assist-renderer__accordion-header-main">
|
|
5595
|
-
<span class="axm-assist-renderer__accordion-header-title">
|
|
5596
|
-
<i
|
|
5597
|
-
class="fa-light fa-chevron-down axm-assist-renderer__thinking-chevron"
|
|
5598
|
-
[class.axm-assist-renderer__thinking-chevron--expanded]="!thinkAcc.isCollapsed()"
|
|
5599
|
-
aria-hidden="true"
|
|
5600
|
-
></i>
|
|
5601
|
-
{{ '@conversation:chat.assist-renderer.sections.thinking' | translate | async }}
|
|
5602
|
-
</span>
|
|
5603
|
-
</div>
|
|
5604
|
-
<ax-badge
|
|
5605
|
-
[look]="'twotone'"
|
|
5606
|
-
[text]="('@conversation:chat.assist-renderer.badges.internal' | translate | async) ?? ''"
|
|
5607
|
-
[color]="'warning'"
|
|
5608
|
-
></ax-badge>
|
|
5609
|
-
</div>
|
|
5610
|
-
<div axAccordionItemContent>
|
|
5611
|
-
<div
|
|
5612
|
-
class="axm-assist-renderer__thinking-body axm-assist-bot__segment"
|
|
5613
|
-
[attr.dir]="segmentDir(parsed().thinking)"
|
|
5614
|
-
>
|
|
5615
|
-
{{ parsed().thinking }}
|
|
5616
|
-
</div>
|
|
5617
|
-
</div>
|
|
5618
|
-
</div>
|
|
5619
|
-
</div>
|
|
5620
|
-
}
|
|
5621
|
-
@if (debugModeEnabled() && toolCalls().length) {
|
|
5622
|
-
<div class="axm-assist-renderer__tools">
|
|
5623
|
-
@for (tc of toolCalls(); track tc.id) {
|
|
5624
|
-
<div class="axm-assist-renderer__accordion-group" axAccordionGroup [accordion]="false">
|
|
5625
|
-
<div
|
|
5626
|
-
class="axm-assist-renderer__tool-card !mb-0"
|
|
5627
|
-
axAccordionItem
|
|
5628
|
-
#legacyDoneDbgAcc="axAccordionItem"
|
|
5629
|
-
[isCollapsed]="assistSectionIsCollapsed(assistLegacyToolAccordionKey(tc))"
|
|
5630
|
-
(onClick)="onAssistLegacyAccordionClick($event, tc)"
|
|
5631
|
-
>
|
|
5632
|
-
<div class="axm-assist-renderer__accordion-header" axAccordionItemHeader>
|
|
5633
|
-
<div class="axm-assist-renderer__accordion-header-main">
|
|
5634
|
-
<span class="axm-assist-renderer__accordion-header-title">
|
|
5635
|
-
<i
|
|
5636
|
-
class="fa-light fa-chevron-down axm-assist-renderer__thinking-chevron"
|
|
5637
|
-
[class.axm-assist-renderer__thinking-chevron--expanded]="!legacyDoneDbgAcc.isCollapsed()"
|
|
5638
|
-
aria-hidden="true"
|
|
5639
|
-
></i>
|
|
5640
|
-
<i class="fa-light fa-screwdriver-wrench axm-assist-renderer__tool-title-icon"></i>
|
|
5641
|
-
{{ resolveToolDisplayTitle(tc.name) }}
|
|
5642
|
-
</span>
|
|
5643
|
-
</div>
|
|
5644
|
-
<span
|
|
5645
|
-
class="axm-assist-renderer__accordion-header-badge axm-assist-renderer__accordion-header-badge--success"
|
|
5646
|
-
>
|
|
5647
|
-
<ax-badge
|
|
5648
|
-
[look]="'twotone'"
|
|
5649
|
-
[text]="
|
|
5650
|
-
(resolveToolBadge(tc.name, '@conversation:chat.assist-renderer.badges.done')
|
|
5651
|
-
| translate
|
|
5652
|
-
| async) ?? ''
|
|
5653
|
-
"
|
|
5654
|
-
[color]="'success'"
|
|
5655
|
-
></ax-badge>
|
|
5656
|
-
</span>
|
|
5657
|
-
</div>
|
|
5658
|
-
<div axAccordionItemContent>
|
|
5659
|
-
<div class="axm-assist-renderer__tool-body">
|
|
5660
|
-
<div class="axm-assist-renderer__tool-section-label">
|
|
5661
|
-
{{ '@conversation:chat.assist-renderer.sections.input' | translate | async }}
|
|
5662
|
-
</div>
|
|
5663
|
-
<div class="axm-assist-renderer__tool-editor-wrap" style="direction: ltr;">
|
|
5664
|
-
<ax-code-editor
|
|
5665
|
-
[ngModel]="formatArgs(tc.arguments)"
|
|
5666
|
-
[readonly]="true"
|
|
5667
|
-
language="json"
|
|
5668
|
-
[lineNumbers]="true"
|
|
5669
|
-
class="axm-assist-renderer__tool-editor"
|
|
5670
|
-
></ax-code-editor>
|
|
5671
|
-
</div>
|
|
5672
|
-
@if (tc.nestedStreamText?.trim()) {
|
|
5673
|
-
<div
|
|
5674
|
-
class="axm-assist-renderer__text axm-assist-bot__segment pt-1"
|
|
5675
|
-
[attr.dir]="segmentDir(tc.nestedStreamText ?? '')"
|
|
5676
|
-
>
|
|
5677
|
-
{{ tc.nestedStreamText }}
|
|
5678
|
-
</div>
|
|
5679
|
-
}
|
|
5680
|
-
@if (tc.output) {
|
|
5681
|
-
<div class="axm-assist-renderer__tool-section-label">
|
|
5682
|
-
{{ '@conversation:chat.assist-renderer.sections.output' | translate | async }}
|
|
5683
|
-
</div>
|
|
5684
|
-
<div class="axm-assist-renderer__tool-editor-wrap" style="direction: ltr;">
|
|
5685
|
-
<ax-code-editor
|
|
5686
|
-
[ngModel]="formatJson(tc.output)"
|
|
5687
|
-
[readonly]="true"
|
|
5688
|
-
language="json"
|
|
5689
|
-
[lineNumbers]="true"
|
|
5690
|
-
class="axm-assist-renderer__tool-editor"
|
|
5691
|
-
></ax-code-editor>
|
|
5692
|
-
</div>
|
|
5693
|
-
}
|
|
5694
|
-
</div>
|
|
5695
|
-
</div>
|
|
5696
|
-
</div>
|
|
5697
|
-
</div>
|
|
5698
|
-
}
|
|
5699
|
-
</div>
|
|
5700
|
-
}
|
|
5701
|
-
@if (parsed().body) {
|
|
5702
|
-
<div
|
|
5703
|
-
class="axm-assist-renderer__text axm-assist-bot__segment axm-assist-renderer__markdown"
|
|
5704
|
-
[attr.dir]="segmentDir(parsed().body)"
|
|
5705
|
-
[innerHTML]="renderMarkdown(parsed().body)"
|
|
5706
|
-
></div>
|
|
5707
|
-
}
|
|
5708
|
-
}
|
|
5709
|
-
}
|
|
5710
|
-
</div>
|
|
5711
|
-
`, isInline: true, styles: [".axm-assist-renderer{display:flex;flex-direction:column;gap:.5rem}.axm-assist-bot{display:flex;flex-direction:column;gap:.75rem}.axm-assist-bot__segment{unicode-bidi:isolate;font-size:.95rem;line-height:1.8;letter-spacing:.002em;color:rgb(var(--ax-sys-color-on-surface));text-wrap:pretty}.axm-assist-bot__line--user{align-self:flex-end}.axm-assist-bot__line--tool-role{align-self:stretch}.axm-assist-bot__tool-result{border-radius:.5rem;border:1px solid var(--ax-color-border-default, rgba(0, 0, 0, .1));background:var(--ax-color-surface, rgba(0, 0, 0, .02));padding:.5rem .75rem}.axm-assist-bot__fallback{font-size:.88rem;line-height:1.75;white-space:pre-wrap;word-break:break-word;opacity:.9}.axm-assist-renderer__cursor{display:inline-block;inline-size:6px;block-size:1em;margin-inline-start:2px;background:var(--ax-color-primary-500);border-radius:1px;animation:axm-blink .8s steps(2) infinite;vertical-align:text-bottom}@keyframes axm-blink{0%{opacity:1}50%{opacity:0}}.axm-assist-renderer__stream-content{display:flex;flex-direction:column;gap:.5rem}.axm-assist-renderer__streaming-activity{display:flex;align-items:center;gap:.5rem;padding-block:.15rem}.axm-assist-renderer__activity-label{line-height:1.45}.axm-assist-renderer__text{white-space:pre-line;word-break:break-word;line-height:1.85;font-size:.95rem;letter-spacing:.002em;text-wrap:pretty}.axm-assist-bot__segment ax-conversation-text-renderer{display:block}.axm-assist-bot__segment ax-conversation-text-renderer :is(p,ul,ol){margin-block:.45rem}.axm-assist-bot__segment ax-conversation-text-renderer li{line-height:1.8}.axm-assist-renderer__markdown :is(h1,h2,h3,h4,h5,h6){margin:.55rem 0 .35rem;line-height:1.35;font-weight:600}.axm-assist-renderer__markdown p{margin:.35rem 0}.axm-assist-renderer__markdown ul{margin:.4rem 0;padding-inline-start:1.1rem}.axm-assist-renderer__markdown blockquote{margin:.5rem 0;padding-inline:.65rem .5rem;border-inline-start:3px solid rgba(var(--ax-sys-color-primary),.35);background:rgba(var(--ax-sys-color-primary),.06);border-radius:.25rem}.axm-assist-renderer__markdown code{font-family:var(--ax-font-mono, monospace);font-size:.9em;padding:.1rem .3rem;border-radius:.25rem;background:var(--ax-color-ghost, rgba(0, 0, 0, .06))}.axm-assist-renderer__accordion-group{width:100%}.axm-assist-renderer__accordion-header{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.625rem .75rem;cursor:pointer;background-color:var(--color-lighter);color:var(--color-on-lighter);border-color:var(--color-border-lighter)}.axm-assist-renderer__accordion-header-main{min-inline-size:0;display:flex;flex-direction:column;gap:.1rem}.axm-assist-renderer__accordion-header-title{font-size:.78rem;line-height:1.2;font-weight:600;color:var(--ax-color-text-primary, #111827);display:inline-flex;align-items:center;gap:.35rem}.axm-assist-renderer__accordion-header-badge{flex-shrink:0}.axm-assist-renderer__accordion-header-badge--primary{background:rgba(var(--ax-sys-color-primary),.12);border-color:rgba(var(--ax-sys-color-primary),.25);color:rgb(var(--ax-sys-color-primary))}.axm-assist-renderer__accordion-header-badge--success{background:#16a34a1f;border-color:#16a34a40;color:#15803d}.axm-assist-renderer__accordion-header-badge--danger{background:#dc26261f;border-color:#dc262640;color:#b91c1c}.axm-assist-renderer__accordion-header--thinking{background:linear-gradient(180deg,#f59e0b1f,#f59e0b0a),var(--ax-color-surface, #fff)}.axm-assist-renderer__thinking-chevron{display:inline-block;font-size:.65rem;opacity:.75;transition:transform .2s ease;line-height:1;flex-shrink:0}.axm-assist-renderer__thinking-chevron--expanded{transform:rotate(180deg)}.axm-assist-renderer__thinking-body{padding:0 .75rem .625rem;font-size:.75rem;color:var(--ax-color-text-muted, #888);white-space:pre-wrap;word-break:break-word;line-height:1.5;border-block-start:1px solid var(--ax-color-border-default, rgba(0, 0, 0, .06));padding-block-start:.5rem}.axm-assist-renderer__tools{display:flex;flex-direction:column;gap:.375rem}.axm-assist-renderer__tool-card{border-radius:.5rem;border:1px solid var(--ax-color-border-default, rgba(0, 0, 0, .08));background:var(--ax-color-surface, rgba(255, 255, 255, .6));overflow:hidden}.axm-assist-renderer__tool-body{padding:.5rem .75rem .625rem;border-block-start:1px solid var(--ax-color-border-default, rgba(0, 0, 0, .06));display:flex;flex-direction:column;gap:.25rem}.axm-assist-renderer__tool-section-label{font-size:.625rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--ax-color-text-muted, #888)}.axm-assist-renderer__tool-pre{margin:0;max-block-size:10rem;overflow:auto;border-radius:.375rem;background:var(--ax-color-ghost, rgba(0, 0, 0, .03));padding:.5rem;font-family:var(--ax-font-mono, monospace);font-size:.675rem;line-height:1.45;white-space:pre-wrap;word-break:break-word}.axm-assist-renderer__tool-editor-wrap{border-radius:.375rem;overflow:hidden}.axm-assist-renderer__waiting{display:flex;gap:.25rem;padding:.25rem 0}.axm-assist-renderer__dot{inline-size:6px;block-size:6px;border-radius:50%;background:var(--ax-color-text-muted, #999);animation:axm-blink 1.2s ease-in-out infinite}.axm-assist-renderer__dot:nth-child(2){animation-delay:.2s}.axm-assist-renderer__dot:nth-child(3){animation-delay:.4s}.axm-assist-renderer__agent-live-block{border-radius:.75rem;border:1px solid var(--ax-color-border-default, rgba(0, 0, 0, .1));background:var(--ax-color-surface, rgba(255, 255, 255, .72));padding:.75rem .875rem;display:flex;flex-direction:column;gap:.65rem;max-inline-size:min(42rem,100%)}.axm-assist-renderer__agent-live-block--in-accordion{border:none;border-radius:0;background:transparent;padding:.5rem 0 0;max-inline-size:none}.axm-assist-renderer__agent-live-header{display:flex;align-items:center;flex-wrap:wrap;gap:.5rem}.axm-assist-renderer__agent-live-title{font-size:.8125rem;font-weight:600;color:var(--ax-color-text-primary, #111827);flex:1;min-inline-size:0}.axm-assist-renderer__agent-live-prompt{font-size:.8125rem;line-height:1.55;white-space:pre-wrap;word-break:break-word;padding:.5rem .75rem;border-radius:1.25rem;background:var(--ax-color-ghost, rgba(0, 0, 0, .05));align-self:flex-end;max-inline-size:min(92%,36rem)}.axm-assist-renderer__agent-live-stream{font-size:.8125rem;line-height:1.55;white-space:pre-line;word-break:break-word;padding-block-start:.15rem}.axm-assist-renderer__agent-live-nested-tools{display:flex;flex-direction:column;gap:.35rem;padding-block-start:.15rem;border-block-start:1px solid var(--ax-color-border-default, rgba(0, 0, 0, .08))}.axm-assist-renderer__agent-live-nested-row{display:flex;align-items:center;gap:.45rem;font-size:.72rem}.axm-assist-renderer__agent-live-nested-name{font-family:var(--ax-font-mono, monospace);font-size:.7rem;flex:1;min-inline-size:0;overflow:hidden;text-overflow:ellipsis}.axm-assist-renderer__agent-live-nested-status{color:var(--ax-color-text-muted, #888);flex-shrink:0}\n/*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "component", type: AXTextRendererComponent, selector: "ax-conversation-text-renderer", inputs: ["message"] }, { kind: "component", type: AXMNodeMessageRendererComponent, selector: "axm-chat-user-form-renderer", inputs: ["message", "node"], outputs: ["formSubmitted"] }, { kind: "component", type: AXMAssistBotImageLineComponent, selector: "axm-assist-bot-image-line", inputs: ["parentMessage", "fileId", "mimeType", "name"] }, { kind: "ngmodule", type: AXAccordionCdkModule }, { kind: "directive", type: i1$4.AXAccordionGroupDirective, selector: "[axAccordionGroup]", inputs: ["accordion", "activeIndex", "collapsedOnItemClick"], exportAs: ["axAccordionGroup"] }, { kind: "directive", type: i1$4.AXAccordionItemContentDirective, selector: "[axAccordionItemContent]", inputs: ["transition"], exportAs: ["axAccordionItemContent"] }, { kind: "directive", type: i1$4.AXAccordionItemHeaderDirective, selector: "[axAccordionItemHeader]", exportAs: ["axAccordionItemHeader"] }, { kind: "directive", type: i1$4.AXAccordionItemDirective, selector: "[axAccordionItem]", inputs: ["isCollapsed"], outputs: ["isCollapsedChange", "onClick"], exportAs: ["axAccordionItem"] }, { kind: "ngmodule", type: AXBadgeModule }, { kind: "component", type: i2$2.AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { kind: "ngmodule", type: AXCodeEditorModule }, { kind: "component", type: i3$2.AXCodeEditorComponent, selector: "ax-code-editor", inputs: ["disabled", "value", "state", "name", "id", "language", "readonly", "placeholder", "lineNumbers", "lineWrapping", "tabSize", "indentWithTab", "theme", "extensions", "ariaLabel", "focusOnReady", "formatOnSave", "minRow", "customCompletions"], outputs: ["onValueChanged", "valueChange", "stateChange", "readonlyChange", "disabledChange", "ready", "save"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i3$1.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
5487
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMAssistMessageRendererComponent, isStandalone: true, selector: "axm-assist-message-renderer", inputs: { message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<div class=\"axm-assist-renderer\">\n @if (showDebugUi() && useTranscriptUi()) {\n <div\n class=\"axm-assist-bot\"\n role=\"region\"\n [attr.aria-label]=\"('@conversation:chat.assist-renderer.aria.assistant-response' | translate | async) ?? ''\"\n >\n @for (item of visibleTranscriptLines(); track item.lineIndex) {\n @let line = item.line;\n @let lineIndex = item.lineIndex;\n <div\n class=\"axm-assist-bot__line\"\n [class.axm-assist-bot__line--user]=\"line.role === 'user'\"\n [class.axm-assist-bot__line--tool-role]=\"line.role === 'tool'\"\n >\n @for (seg of line.responses; track segIndex; let segIndex = $index) {\n @if (line.role === 'user' && seg.type === 'file') {\n <axm-assist-bot-image-line\n [parentMessage]=\"message()\"\n [fileId]=\"seg.content.fileId\"\n [mimeType]=\"seg.content.mimeType\"\n [name]=\"seg.content.name\"\n />\n } @else if (line.role === 'user' && seg.type === 'text') {\n <div class=\"axm-assist-bot__segment\" [attr.dir]=\"segmentDir(seg.content)\">\n <ax-conversation-text-renderer [message]=\"syntheticTextMessage(lineIndex, segIndex, seg.content)\" />\n </div>\n } @else if (line.role === 'assistant' && seg.type === 'think' && showDebugUi()) {\n <div class=\"axm-assist-renderer__accordion-group\" axAccordionGroup [accordion]=\"false\">\n <div\n class=\"axm-assist-renderer__thinking-accordion axm-assist-renderer__collapse-shell !ax-mb-0\"\n axAccordionItem\n #thinkAcc=\"axAccordionItem\"\n [isCollapsed]=\"assistSectionIsCollapsed(assistThinkKey(lineIndex, segIndex))\"\n (onClick)=\"onAssistAccordionClick($event, assistThinkKey(lineIndex, segIndex))\"\n >\n <div\n class=\"axm-assist-renderer__accordion-header\"\n axAccordionItemHeader\n role=\"button\"\n [attr.aria-expanded]=\"!thinkAcc.isCollapsed()\"\n >\n <div class=\"axm-assist-renderer__accordion-header-main\">\n <span class=\"axm-assist-renderer__accordion-header-title\">\n <i\n class=\"fa-light fa-chevron-down axm-assist-renderer__thinking-chevron\"\n [class.axm-assist-renderer__thinking-chevron--expanded]=\"!thinkAcc.isCollapsed()\"\n aria-hidden=\"true\"\n ></i>\n <i class=\"fa-light fa-brain axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n {{ '@conversation:chat.assist-renderer.sections.thinking' | translate | async }}\n </span>\n </div>\n </div>\n <div axAccordionItemContent>\n <div class=\"axm-assist-renderer__collapse-body\">\n <div\n class=\"axm-assist-renderer__thinking-body axm-assist-bot__segment\"\n [attr.dir]=\"segmentDir(seg.content)\"\n >\n {{ seg.content }}\n </div>\n </div>\n </div>\n </div>\n </div>\n } @else if (line.role === 'assistant' && seg.type === 'text') {\n @let parsedLine = parseAssistLineText(seg.content);\n @let displayBody = assistTranscriptAssistantTextBodyForDisplay(line, parsedLine.body);\n @if (showDebugUi() && parsedLine.thinking) {\n <div class=\"axm-assist-renderer__accordion-group\" axAccordionGroup [accordion]=\"false\">\n <div\n class=\"axm-assist-renderer__thinking-accordion axm-assist-renderer__collapse-shell !ax-mb-0\"\n axAccordionItem\n #thinkAcc=\"axAccordionItem\"\n [isCollapsed]=\"assistSectionIsCollapsed(assistThinkKey(lineIndex, segIndex))\"\n (onClick)=\"onAssistAccordionClick($event, assistThinkKey(lineIndex, segIndex))\"\n >\n <div\n class=\"axm-assist-renderer__accordion-header\"\n axAccordionItemHeader\n role=\"button\"\n [attr.aria-expanded]=\"!thinkAcc.isCollapsed()\"\n >\n <div class=\"axm-assist-renderer__accordion-header-main\">\n <span class=\"axm-assist-renderer__accordion-header-title\">\n <i\n class=\"fa-light fa-chevron-down axm-assist-renderer__thinking-chevron\"\n [class.axm-assist-renderer__thinking-chevron--expanded]=\"!thinkAcc.isCollapsed()\"\n aria-hidden=\"true\"\n ></i>\n <i class=\"fa-light fa-brain axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n {{ '@conversation:chat.assist-renderer.sections.thinking' | translate | async }}\n </span>\n </div>\n </div>\n <div axAccordionItemContent>\n <div class=\"axm-assist-renderer__collapse-body\">\n <div\n class=\"axm-assist-renderer__thinking-body axm-assist-bot__segment\"\n [attr.dir]=\"segmentDir(parsedLine.thinking)\"\n >\n {{ parsedLine.thinking }}\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n @if (displayBody.trim()) {\n <div class=\"axm-assist-bot__segment axm-assist-renderer__markdown\" [attr.dir]=\"segmentDir(displayBody)\">\n <axp-markdown-viewer [markdown]=\"displayBody\">\n <ng-template axpMarkdownTemplate=\"code\" let-segment>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"markdownCodeValue(segment)\"\n [readonly]=\"true\"\n [language]=\"markdownCodeLanguage(segment)\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n </ng-template>\n </axp-markdown-viewer>\n </div>\n }\n } @else if (\n line.role === 'assistant' &&\n (seg.type === 'agent' || seg.type === 'tool') &&\n isDelegatedAgentCommand(seg.content.command)\n ) {\n @if (showDebugUi()) {\n <div class=\"axm-assist-renderer__accordion-group\" axAccordionGroup [accordion]=\"false\">\n <div\n class=\"axm-assist-renderer__tool-card axm-assist-renderer__collapse-shell !ax-mb-0\"\n axAccordionItem\n #agentDebugAcc=\"axAccordionItem\"\n [isCollapsed]=\"assistSectionIsCollapsed(assistAgentKey(seg.callId))\"\n (onClick)=\"onAssistAccordionClick($event, assistAgentKey(seg.callId))\"\n >\n <div class=\"axm-assist-renderer__accordion-header\" axAccordionItemHeader>\n <div class=\"axm-assist-renderer__accordion-header-main\">\n <span class=\"axm-assist-renderer__accordion-header-title\">\n <i\n class=\"fa-light fa-chevron-down axm-assist-renderer__thinking-chevron\"\n [class.axm-assist-renderer__thinking-chevron--expanded]=\"!agentDebugAcc.isCollapsed()\"\n aria-hidden=\"true\"\n ></i>\n <i class=\"fa-light fa-screwdriver-wrench axm-assist-renderer__tool-title-icon\"></i>\n {{ resolveToolDisplayTitle(seg.content.command) }}\n </span>\n </div>\n <div class=\"axm-assist-renderer__header-trailing\">\n <span\n class=\"axm-assist-renderer__header-actions\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n >\n <ax-button\n look=\"outline\"\n class=\"ax-sm\"\n [text]=\"\n ('@conversation:chat.assist-renderer.delegated-agent.detail' | translate | async) ?? ''\n \"\n [attr.aria-label]=\"\n ('@conversation:chat.assist-renderer.delegated-agent.detail-aria' | translate | async) ??\n ''\n \"\n (onClick)=\"\n openDelegatedAgentTranscriptDialog(\n seg.callId,\n seg.content.command,\n delegatedAgentLabelForCall(seg.callId)\n )\n \"\n ></ax-button>\n </span>\n <span class=\"axm-assist-renderer__badge axm-assist-renderer__badge--primary\">{{\n (resolveToolBadge(seg.content.command, '@conversation:chat.assist-renderer.badges.agent')\n | translate\n | async) ?? ''\n }}</span>\n </div>\n </div>\n <div axAccordionItemContent>\n <div class=\"axm-assist-renderer__collapse-body\">\n <div class=\"axm-assist-renderer__tool-body\">\n <div class=\"axm-assist-renderer__tool-section-label\">\n {{ '@conversation:chat.assist-renderer.sections.input' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"formatArgs(seg.content.arguments)\"\n [readonly]=\"true\"\n language=\"json\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n @if (toolResultForCallId(seg.callId); as resultLine) {\n <div class=\"axm-assist-renderer__tool-section-label\">\n {{ '@conversation:chat.assist-renderer.sections.output' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"formatToolResultBody(resultLine)\"\n [readonly]=\"true\"\n language=\"json\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n } @else {\n @let res = toolResultForCallId(seg.callId);\n @let outcomeSegs = delegatedAgentOutcomeSegmentsForCall(res);\n @if (outcomeSegs.length > 0) {\n @for (outSeg of outcomeSegs; track $index) {\n @switch (outSeg.type) {\n @case ('text') {\n @let parsedOut = parseAssistLineText(outSeg.content);\n @if (parsedOut.body.trim()) {\n <div\n class=\"axm-assist-bot__segment axm-assist-renderer__markdown\"\n [attr.dir]=\"segmentDir(parsedOut.body)\"\n >\n <axp-markdown-viewer [markdown]=\"parsedOut.body\">\n <ng-template axpMarkdownTemplate=\"code\" let-segment>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"markdownCodeValue(segment)\"\n [readonly]=\"true\"\n [language]=\"markdownCodeLanguage(segment)\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n </ng-template>\n </axp-markdown-viewer>\n </div>\n }\n }\n @case ('think') {\n @if (showDebugUi()) {\n <div class=\"axm-assist-bot__segment\" [attr.dir]=\"segmentDir(outSeg.content)\">\n {{ outSeg.content }}\n </div>\n }\n }\n @case ('file') {\n <axm-assist-bot-image-line\n [parentMessage]=\"message()\"\n [fileId]=\"outSeg.content.fileId\"\n [mimeType]=\"outSeg.content.mimeType\"\n [name]=\"outSeg.content.name\"\n />\n }\n @case ('node') {\n @let assistNodeWidget = axmAssistWidgetNodeFromUnknown(outSeg.content);\n @if (assistNodeWidget) {\n <div class=\"axm-assist-bot__segment\" dir=\"auto\">\n <axm-chat-user-form-renderer\n [message]=\"syntheticNodeEmbedMessage(lineIndex, segIndex * 1000 + $index, outSeg.content)\"\n />\n </div>\n }\n }\n }\n }\n } @else if (delegatedAgentAnswerForCall(res).trim()) {\n @let agentFallbackText = delegatedAgentAnswerForCall(res);\n <div\n class=\"axm-assist-bot__segment axm-assist-renderer__markdown\"\n [attr.dir]=\"segmentDir(agentFallbackText)\"\n >\n <axp-markdown-viewer [markdown]=\"agentFallbackText\">\n <ng-template axpMarkdownTemplate=\"code\" let-segment>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"markdownCodeValue(segment)\"\n [readonly]=\"true\"\n [language]=\"markdownCodeLanguage(segment)\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n </ng-template>\n </axp-markdown-viewer>\n </div>\n }\n }\n } @else if (line.role === 'assistant' && seg.type === 'tool' && showDebugUi()) {\n <div class=\"axm-assist-renderer__accordion-group\" axAccordionGroup [accordion]=\"false\">\n <div\n class=\"axm-assist-renderer__tool-card axm-assist-renderer__collapse-shell !ax-mb-0\"\n axAccordionItem\n #toolDebugAcc=\"axAccordionItem\"\n [isCollapsed]=\"assistSectionIsCollapsed(assistToolKey(seg.callId))\"\n (onClick)=\"onAssistAccordionClick($event, assistToolKey(seg.callId))\"\n >\n <div class=\"axm-assist-renderer__accordion-header\" axAccordionItemHeader>\n <div class=\"axm-assist-renderer__accordion-header-main\">\n <span class=\"axm-assist-renderer__accordion-header-title\">\n <i\n class=\"fa-light fa-chevron-down axm-assist-renderer__thinking-chevron\"\n [class.axm-assist-renderer__thinking-chevron--expanded]=\"!toolDebugAcc.isCollapsed()\"\n aria-hidden=\"true\"\n ></i>\n <i class=\"fa-light fa-screwdriver-wrench axm-assist-renderer__tool-title-icon\"></i>\n {{ resolveToolDisplayTitle(seg.content.command) }}\n </span>\n </div>\n <span class=\"axm-assist-renderer__badge axm-assist-renderer__badge--primary\">{{\n (resolveToolBadge(seg.content.command, '@conversation:chat.assist-renderer.badges.tool')\n | translate\n | async) ?? ''\n }}</span>\n </div>\n <div axAccordionItemContent>\n <div class=\"axm-assist-renderer__collapse-body\">\n <div class=\"axm-assist-renderer__tool-body\">\n <div class=\"axm-assist-renderer__tool-section-label\">\n {{ '@conversation:chat.assist-renderer.sections.input' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"formatArgs(seg.content.arguments)\"\n [readonly]=\"true\"\n language=\"json\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n @if (toolResultForCallId(seg.callId); as resultLine) {\n <div class=\"axm-assist-renderer__tool-section-label\">\n {{ '@conversation:chat.assist-renderer.sections.output' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"formatToolResultBody(resultLine)\"\n [readonly]=\"true\"\n language=\"json\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n } @else if (line.role === 'assistant' && seg.type === 'node') {\n @let assistNodeWidget = axmAssistWidgetNodeFromUnknown(seg.content);\n @if (assistNodeWidget) {\n <div class=\"axm-assist-bot__segment\" dir=\"auto\">\n <axm-chat-user-form-renderer\n [message]=\"syntheticNodeEmbedMessage(lineIndex, segIndex, seg.content)\"\n />\n </div>\n }\n } @else if (line.role === 'assistant' && seg.type === 'file') {\n <axm-assist-bot-image-line\n [parentMessage]=\"message()\"\n [fileId]=\"seg.content.fileId\"\n [mimeType]=\"seg.content.mimeType\"\n [name]=\"seg.content.name\"\n />\n } @else if (line.role === 'tool' && (seg.type === 'tool_result' || seg.type === 'agent_result')) {\n <!-- merged into the corresponding tool/agent accordion -->\n } @else if (line.role === 'system' && seg.type === 'text' && showDebugUi()) {\n <div class=\"axm-assist-bot__segment\" [attr.dir]=\"segmentDir(seg.content)\">\n <ax-conversation-text-renderer [message]=\"syntheticTextMessage(lineIndex, segIndex, seg.content)\" />\n </div>\n } @else {\n @if (showDebugUi() || line.role !== 'assistant') {\n <div\n class=\"axm-assist-bot__fallback axm-assist-bot__segment\"\n [attr.dir]=\"segmentDir(formatFallbackSegment(seg))\"\n >\n {{ formatFallbackSegment(seg) }}\n </div>\n }\n }\n }\n </div>\n }\n @if (isStreaming()) {\n <div class=\"axm-assist-renderer__streaming-activity\" role=\"status\" aria-live=\"polite\">\n <span\n class=\"axm-assist-renderer__activity-spin inline-block w-3 h-3 rounded-full border-2 border-primary-500 border-t-transparent fa-spin shrink-0\"\n aria-hidden=\"true\"\n ></span>\n <span class=\"axm-assist-renderer__activity-label text-xs text-muted italic\">{{\n assistActivityMessageKey() | translate | async\n }}</span>\n </div>\n }\n <!-- @if (isStreaming() && streamText().trim()) {\n <span class=\"axm-assist-renderer__cursor\" aria-hidden=\"true\"></span>\n } -->\n </div>\n } @else if (!showDebugUi() && !isStreaming()) {\n @let pv = assistPayloadView();\n @if (pv.kind === 'node') {\n <div class=\"axm-assist-bot__segment\" dir=\"auto\">\n <axm-chat-user-form-renderer [message]=\"syntheticFinalPayloadNodeMessage(pv.content)\" />\n </div>\n } @else if (pv.kind === 'text' && parsed().body) {\n <div\n class=\"axm-assist-renderer__text axm-assist-bot__segment axm-assist-renderer__markdown\"\n [attr.dir]=\"segmentDir(parsed().body)\"\n >\n <axp-markdown-viewer [markdown]=\"parsed().body\">\n <ng-template axpMarkdownTemplate=\"code\" let-segment>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"markdownCodeValue(segment)\"\n [readonly]=\"true\"\n [language]=\"markdownCodeLanguage(segment)\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n </ng-template>\n </axp-markdown-viewer>\n </div>\n }\n } @else if (!showDebugUi() && isStreaming()) {\n <div class=\"axm-assist-renderer__stream-content axm-assist-renderer__stream-content--non-debug\">\n <div class=\"axm-assist-renderer__streaming-activity\" role=\"status\" aria-live=\"polite\">\n <span\n class=\"axm-assist-renderer__activity-spin inline-block w-3 h-3 rounded-full border-2 border-primary-500 border-t-transparent fa-spin shrink-0\"\n aria-hidden=\"true\"\n ></span>\n <span class=\"axm-assist-renderer__activity-label text-xs text-muted italic\">{{\n assistActivityMessageKey() | translate | async\n }}</span>\n </div>\n </div>\n } @else if (showDebugUi()) {\n @if (isStreaming()) {\n <div class=\"axm-assist-renderer__stream-content\">\n <div class=\"axm-assist-renderer__streaming-activity\" role=\"status\" aria-live=\"polite\">\n <span\n class=\"axm-assist-renderer__activity-spin inline-block w-3 h-3 rounded-full border-2 border-primary-500 border-t-transparent fa-spin shrink-0\"\n aria-hidden=\"true\"\n ></span>\n <span class=\"axm-assist-renderer__activity-label text-xs text-muted italic\">{{\n assistActivityMessageKey() | translate | async\n }}</span>\n </div>\n @if (streamThink().trim()) {\n <div class=\"axm-assist-renderer__accordion-group\" axAccordionGroup [accordion]=\"false\">\n <div\n class=\"axm-assist-renderer__thinking-accordion axm-assist-renderer__collapse-shell !ax-mb-0\"\n axAccordionItem\n #thinkAcc=\"axAccordionItem\"\n [isCollapsed]=\"assistSectionIsCollapsed(assistThinkStreamKey())\"\n (onClick)=\"onAssistAccordionClick($event, assistThinkStreamKey())\"\n >\n <div\n class=\"axm-assist-renderer__accordion-header\"\n axAccordionItemHeader\n role=\"button\"\n [attr.aria-expanded]=\"!thinkAcc.isCollapsed()\"\n >\n <div class=\"axm-assist-renderer__accordion-header-main\">\n <span class=\"axm-assist-renderer__accordion-header-title\">\n <i\n class=\"fa-light fa-chevron-down axm-assist-renderer__thinking-chevron\"\n [class.axm-assist-renderer__thinking-chevron--expanded]=\"!thinkAcc.isCollapsed()\"\n aria-hidden=\"true\"\n ></i>\n <i class=\"fa-light fa-brain axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n {{ '@conversation:chat.assist-renderer.sections.thinking' | translate | async }}\n </span>\n </div>\n </div>\n <div axAccordionItemContent>\n <div class=\"axm-assist-renderer__collapse-body\">\n <div\n class=\"axm-assist-renderer__thinking-body axm-assist-bot__segment\"\n [attr.dir]=\"segmentDir(streamThink())\"\n >\n {{ streamThink() }}\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n @if (streamText()) {\n <div class=\"axm-assist-renderer__text axm-assist-bot__segment\" [attr.dir]=\"segmentDir(streamText())\">\n {{ streamText() }}\n </div>\n }\n @if (toolCalls().length) {\n <div class=\"axm-assist-renderer__tools\">\n @for (tc of toolCalls(); track tc.id) {\n @if (isDelegatedAgentCommand(tc.name)) {\n @let legacyAgentAns = delegatedAnswerFromToolOutputString(tc.output);\n <div class=\"axm-assist-renderer__accordion-group\" axAccordionGroup [accordion]=\"false\">\n <div\n class=\"axm-assist-renderer__tool-card axm-assist-renderer__agent-accordion axm-assist-renderer__collapse-shell\"\n axAccordionItem\n #legacyAgentAcc=\"axAccordionItem\"\n [isCollapsed]=\"assistSectionIsCollapsed(assistAgentKey(tc.id))\"\n (onClick)=\"onAssistAccordionClick($event, assistAgentKey(tc.id))\"\n >\n <div\n class=\"axm-assist-renderer__accordion-header\"\n axAccordionItemHeader\n role=\"button\"\n [attr.aria-expanded]=\"!legacyAgentAcc.isCollapsed()\"\n >\n <div class=\"axm-assist-renderer__accordion-header-main\">\n <span\n class=\"axm-assist-renderer__accordion-header-title inline-flex items-center gap-2 flex-wrap\"\n >\n <i\n class=\"fa-light fa-chevron-down axm-assist-renderer__thinking-chevron\"\n [class.axm-assist-renderer__thinking-chevron--expanded]=\"!legacyAgentAcc.isCollapsed()\"\n aria-hidden=\"true\"\n ></i>\n @if (tc.state === 'running') {\n <span\n class=\"axm-assist-renderer__agent-live-spin inline-block w-3 h-3 rounded-full border-2 border-primary-500 border-t-transparent fa-spin shrink-0\"\n aria-hidden=\"true\"\n ></span>\n } @else {\n <span\n class=\"inline-block w-3 h-3 rounded-full bg-success-500 shrink-0\"\n aria-hidden=\"true\"\n ></span>\n }\n <i class=\"fa-light fa-people-group text-primary-500\" aria-hidden=\"true\"></i>\n <span class=\"axm-assist-renderer__agent-live-title\">{{\n resolveToolDisplayTitle(tc.name)\n }}</span>\n </span>\n </div>\n <div class=\"axm-assist-renderer__header-trailing\">\n @if (tc.state !== 'running') {\n <span\n class=\"axm-assist-renderer__header-actions\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n >\n <ax-button\n look=\"outline\"\n class=\"ax-sm\"\n [text]=\"\n ('@conversation:chat.assist-renderer.delegated-agent.detail' | translate | async) ?? ''\n \"\n [attr.aria-label]=\"\n ('@conversation:chat.assist-renderer.delegated-agent.detail-aria'\n | translate\n | async) ?? ''\n \"\n (onClick)=\"\n openDelegatedAgentTranscriptDialog(tc.id, tc.name, delegatedAgentLabelForCall(tc.id))\n \"\n ></ax-button>\n </span>\n }\n <span\n class=\"axm-assist-renderer__badge\"\n [class.axm-assist-renderer__badge--primary]=\"tc.state === 'running'\"\n [class.axm-assist-renderer__badge--success]=\"tc.state !== 'running'\"\n >\n {{\n (resolveToolBadge(\n tc.name,\n tc.state === 'running'\n ? '@conversation:chat.assist-renderer.badges.running'\n : '@conversation:chat.assist-renderer.badges.agent'\n )\n | translate\n | async) ?? ''\n }}\n </span>\n </div>\n </div>\n <div axAccordionItemContent>\n <div class=\"axm-assist-renderer__collapse-body\">\n <div\n class=\"axm-assist-renderer__agent-live-block axm-assist-renderer__agent-live-block--in-accordion\"\n role=\"region\"\n >\n <div\n class=\"axm-assist-renderer__agent-live-prompt\"\n [attr.dir]=\"segmentDir(delegatedPromptPreview(tc.arguments))\"\n >\n {{ delegatedPromptPreview(tc.arguments) }}\n </div>\n @if (tc.nestedStreamText?.trim()) {\n <div\n class=\"axm-assist-renderer__agent-live-stream\"\n [attr.dir]=\"segmentDir(tc.nestedStreamText ?? '')\"\n >\n {{ tc.nestedStreamText }}\n </div>\n }\n @if (tc.nestedTools?.length) {\n <div class=\"axm-assist-renderer__agent-live-nested-tools\">\n @for (nt of tc.nestedTools; track nt.id) {\n <div class=\"axm-assist-renderer__agent-live-nested-row\">\n @if (nt.state === 'running') {\n <span\n class=\"inline-block w-2.5 h-2.5 rounded-full border-2 border-primary-500 border-t-transparent fa-spin shrink-0\"\n aria-hidden=\"true\"\n ></span>\n } @else {\n <span\n class=\"inline-block w-2.5 h-2.5 rounded-full bg-success-500 shrink-0\"\n aria-hidden=\"true\"\n ></span>\n }\n <code class=\"axm-assist-renderer__agent-live-nested-name\">{{ nt.name }}</code>\n <span class=\"axm-assist-renderer__agent-live-nested-status\">{{\n nt.state === 'running' ? '\u2026' : '\u2713'\n }}</span>\n </div>\n }\n </div>\n }\n @if (legacyAgentAns) {\n <div class=\"axm-assist-renderer__agent-live-nested-tools\">\n <div class=\"axm-assist-renderer__tool-section-label\">\n {{ '@conversation:chat.assist-renderer.sections.agent-answer' | translate | async }}\n </div>\n <div\n class=\"axm-assist-renderer__agent-live-stream\"\n [attr.dir]=\"segmentDir(legacyAgentAns)\"\n >\n {{ legacyAgentAns }}\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n } @else {\n <div class=\"axm-assist-renderer__accordion-group\" axAccordionGroup [accordion]=\"false\">\n <div\n class=\"axm-assist-renderer__tool-card axm-assist-renderer__collapse-shell\"\n axAccordionItem\n #legacyStreamDbgAcc=\"axAccordionItem\"\n [isCollapsed]=\"assistSectionIsCollapsed(assistLegacyToolAccordionKey(tc))\"\n (onClick)=\"onAssistLegacyAccordionClick($event, tc)\"\n >\n <div class=\"axm-assist-renderer__accordion-header\" axAccordionItemHeader>\n <div class=\"axm-assist-renderer__accordion-header-main\">\n <span class=\"axm-assist-renderer__accordion-header-title\">\n <i\n class=\"fa-light fa-chevron-down axm-assist-renderer__thinking-chevron\"\n [class.axm-assist-renderer__thinking-chevron--expanded]=\"!legacyStreamDbgAcc.isCollapsed()\"\n aria-hidden=\"true\"\n ></i>\n <i class=\"fa-light fa-screwdriver-wrench axm-assist-renderer__tool-title-icon\"></i>\n {{ resolveToolDisplayTitle(tc.name) }}\n </span>\n </div>\n <span\n class=\"axm-assist-renderer__badge\"\n [class.axm-assist-renderer__badge--primary]=\"tc.state === 'running'\"\n [class.axm-assist-renderer__badge--success]=\"tc.state === 'done'\"\n >\n {{\n (resolveToolBadge(\n tc.name,\n tc.state === 'running'\n ? '@conversation:chat.assist-renderer.badges.running'\n : '@conversation:chat.assist-renderer.badges.done'\n )\n | translate\n | async) ?? ''\n }}\n </span>\n </div>\n <div axAccordionItemContent>\n <div class=\"axm-assist-renderer__collapse-body\">\n <div class=\"axm-assist-renderer__tool-body\">\n <div class=\"axm-assist-renderer__tool-section-label\">\n {{ '@conversation:chat.assist-renderer.sections.input' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"formatArgs(tc.arguments)\"\n [readonly]=\"true\"\n language=\"json\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n @if (tc.output) {\n <div class=\"axm-assist-renderer__tool-section-label\">\n {{ '@conversation:chat.assist-renderer.sections.output' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"formatJson(tc.output)\"\n [readonly]=\"true\"\n language=\"json\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n }\n </div>\n }\n @if (isStreaming() && streamText().trim()) {\n <span class=\"axm-assist-renderer__cursor\"></span>\n } @else if (isStreaming() && !streamText().trim() && !streamThink().trim() && !toolCalls().length) {\n <div class=\"axm-assist-renderer__waiting\">\n <span class=\"axm-assist-renderer__dot\"></span>\n <span class=\"axm-assist-renderer__dot\"></span>\n <span class=\"axm-assist-renderer__dot\"></span>\n </div>\n }\n </div>\n } @else {\n @if (parsed().thinking) {\n <div class=\"axm-assist-renderer__accordion-group\" axAccordionGroup [accordion]=\"false\">\n <div\n class=\"axm-assist-renderer__thinking-accordion axm-assist-renderer__collapse-shell !ax-mb-0\"\n axAccordionItem\n #thinkAcc=\"axAccordionItem\"\n [isCollapsed]=\"assistSectionIsCollapsed(assistThinkFinalKey())\"\n (onClick)=\"onAssistAccordionClick($event, assistThinkFinalKey())\"\n >\n <div\n class=\"axm-assist-renderer__accordion-header\"\n axAccordionItemHeader\n role=\"button\"\n [attr.aria-expanded]=\"!thinkAcc.isCollapsed()\"\n >\n <div class=\"axm-assist-renderer__accordion-header-main\">\n <span class=\"axm-assist-renderer__accordion-header-title\">\n <i\n class=\"fa-light fa-chevron-down axm-assist-renderer__thinking-chevron\"\n [class.axm-assist-renderer__thinking-chevron--expanded]=\"!thinkAcc.isCollapsed()\"\n aria-hidden=\"true\"\n ></i>\n <i class=\"fa-light fa-brain axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n {{ '@conversation:chat.assist-renderer.sections.thinking' | translate | async }}\n </span>\n </div>\n </div>\n <div axAccordionItemContent>\n <div class=\"axm-assist-renderer__collapse-body\">\n <div\n class=\"axm-assist-renderer__thinking-body axm-assist-bot__segment\"\n [attr.dir]=\"segmentDir(parsed().thinking)\"\n >\n {{ parsed().thinking }}\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n @if (toolCalls().length) {\n <div class=\"axm-assist-renderer__tools\">\n @for (tc of toolCalls(); track tc.id) {\n <div class=\"axm-assist-renderer__accordion-group\" axAccordionGroup [accordion]=\"false\">\n <div\n class=\"axm-assist-renderer__tool-card axm-assist-renderer__collapse-shell\"\n axAccordionItem\n #legacyDoneDbgAcc=\"axAccordionItem\"\n [isCollapsed]=\"assistSectionIsCollapsed(assistLegacyToolAccordionKey(tc))\"\n (onClick)=\"onAssistLegacyAccordionClick($event, tc)\"\n >\n <div class=\"axm-assist-renderer__accordion-header\" axAccordionItemHeader>\n <div class=\"axm-assist-renderer__accordion-header-main\">\n <span class=\"axm-assist-renderer__accordion-header-title\">\n <i\n class=\"fa-light fa-chevron-down axm-assist-renderer__thinking-chevron\"\n [class.axm-assist-renderer__thinking-chevron--expanded]=\"!legacyDoneDbgAcc.isCollapsed()\"\n aria-hidden=\"true\"\n ></i>\n <i class=\"fa-light fa-screwdriver-wrench axm-assist-renderer__tool-title-icon\"></i>\n {{ resolveToolDisplayTitle(tc.name) }}\n </span>\n </div>\n <span class=\"axm-assist-renderer__badge axm-assist-renderer__badge--success\">{{\n (resolveToolBadge(tc.name, '@conversation:chat.assist-renderer.badges.done') | translate | async) ??\n ''\n }}</span>\n </div>\n <div axAccordionItemContent>\n <div class=\"axm-assist-renderer__collapse-body\">\n <div class=\"axm-assist-renderer__tool-body\">\n <div class=\"axm-assist-renderer__tool-section-label\">\n {{ '@conversation:chat.assist-renderer.sections.input' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"formatArgs(tc.arguments)\"\n [readonly]=\"true\"\n language=\"json\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n @if (tc.nestedStreamText?.trim()) {\n <div\n class=\"axm-assist-renderer__text axm-assist-bot__segment pt-1\"\n [attr.dir]=\"segmentDir(tc.nestedStreamText ?? '')\"\n >\n {{ tc.nestedStreamText }}\n </div>\n }\n @if (tc.output) {\n <div class=\"axm-assist-renderer__tool-section-label\">\n {{ '@conversation:chat.assist-renderer.sections.output' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"formatJson(tc.output)\"\n [readonly]=\"true\"\n language=\"json\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n }\n @if (parsed().body && !assistNonDebugPayloadFinalShown()) {\n <div\n class=\"axm-assist-renderer__text axm-assist-bot__segment axm-assist-renderer__markdown\"\n [attr.dir]=\"segmentDir(parsed().body)\"\n >\n <axp-markdown-viewer [markdown]=\"parsed().body\">\n <ng-template axpMarkdownTemplate=\"code\" let-segment>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"markdownCodeValue(segment)\"\n [readonly]=\"true\"\n [language]=\"markdownCodeLanguage(segment)\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n </ng-template>\n </axp-markdown-viewer>\n </div>\n }\n }\n }\n @if (showDebugUi() && assistRunDebug(); as dbg) {\n <footer\n class=\"axm-assist-renderer__run-meta-wrap\"\n role=\"region\"\n [attr.aria-label]=\"('@conversation:chat.assist-renderer.aria.run-usage' | translate | async) ?? ''\"\n >\n <div class=\"axm-assist-renderer__accordion-group\" axAccordionGroup [accordion]=\"false\">\n <div\n class=\"axm-assist-renderer__thinking-accordion axm-assist-renderer__collapse-shell axm-assist-renderer__run-meta-accordion !ax-mb-0\"\n axAccordionItem\n #runMetaAcc=\"axAccordionItem\"\n [isCollapsed]=\"assistSectionIsCollapsed(assistRunMetaKey())\"\n (onClick)=\"onAssistAccordionClick($event, assistRunMetaKey())\"\n >\n <div\n class=\"axm-assist-renderer__accordion-header\"\n axAccordionItemHeader\n role=\"button\"\n [attr.aria-expanded]=\"!runMetaAcc.isCollapsed()\"\n >\n <div class=\"axm-assist-renderer__accordion-header-main\">\n <span class=\"axm-assist-renderer__accordion-header-title\">\n <i\n class=\"fa-light fa-chevron-down axm-assist-renderer__thinking-chevron\"\n [class.axm-assist-renderer__thinking-chevron--expanded]=\"!runMetaAcc.isCollapsed()\"\n aria-hidden=\"true\"\n ></i>\n <i class=\"fa-light fa-chart-line axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n {{ '@conversation:chat.assist-renderer.run-meta.title' | translate | async }}\n </span>\n <!-- @if (dbg.modelTitle || dbg.modelEntityId) {\n <span class=\"axm-assist-renderer__run-meta-header-sub\">{{ dbg.modelTitle || dbg.modelEntityId }}</span>\n } -->\n </div>\n </div>\n <div axAccordionItemContent>\n <div class=\"axm-assist-renderer__collapse-body\">\n <div class=\"axm-assist-renderer__run-meta axm-assist-renderer__run-meta--panel\">\n <div class=\"axm-assist-renderer__run-meta-grid\">\n @if (dbg.modelTitle || dbg.modelEntityId) {\n <div class=\"axm-assist-renderer__meta-tile axm-assist-renderer__meta-tile--wide\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@conversation:chat.assist-renderer.run-meta.model' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value\">{{ dbg.modelTitle || dbg.modelEntityId }}</div>\n <!-- @if (dbg.modelTitle && dbg.modelEntityId) {\n <div class=\"axm-assist-renderer__meta-tile-sub\">{{ dbg.modelEntityId }}</div>\n } -->\n </div>\n }\n @if (dbg.durationMs != null) {\n <div class=\"axm-assist-renderer__meta-tile\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@conversation:chat.assist-renderer.run-meta.duration' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value axm-assist-renderer__meta-tile-value--mono\">\n {{ formatAssistRunDuration(dbg.durationMs) }}\n </div>\n </div>\n }\n @if (dbg.usage; as totals) {\n <div class=\"axm-assist-renderer__meta-tile\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@ai-management:chat.usage-prompt' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value axm-assist-renderer__meta-tile-value--mono\">\n {{ totals.promptTokens | number }}\n @if (totals.cachedPromptTokens) {\n <span class=\"axm-assist-renderer__meta-tile-note\">\n (+{{ totals.cachedPromptTokens | number }}\n {{ '@ai-management:chat.usage-cached' | translate | async }})\n </span>\n }\n </div>\n </div>\n <div class=\"axm-assist-renderer__meta-tile\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@ai-management:chat.usage-completion' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value axm-assist-renderer__meta-tile-value--mono\">\n {{ totals.completionTokens | number }}\n </div>\n </div>\n <div class=\"axm-assist-renderer__meta-tile axm-assist-renderer__meta-tile--accent\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@conversation:chat.assist-renderer.run-meta.total-tokens' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value axm-assist-renderer__meta-tile-value--mono\">\n {{ totals.totalTokens | number }}\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </footer>\n }\n</div>\n", styles: [".axm-assist-renderer{display:flex;flex-direction:column;gap:.5rem}.axm-assist-bot{display:flex;flex-direction:column;gap:.75rem}.axm-assist-bot__segment{unicode-bidi:isolate;font-size:.95rem;line-height:1.8;letter-spacing:.002em;color:rgb(var(--ax-sys-color-on-surface));text-wrap:pretty}.axm-assist-bot__line--user{align-self:flex-end}.axm-assist-bot__line--tool-role{align-self:stretch}.axm-assist-bot__tool-result{border-radius:.5rem;background:rgb(var(--ax-sys-color-lighter-surface));padding:.5rem .75rem}.axm-assist-bot__fallback{font-size:.88rem;line-height:1.75;word-break:break-word;opacity:.9}.axm-assist-renderer__cursor{display:inline-block;inline-size:6px;block-size:1em;margin-inline-start:2px;background:rgb(var(--ax-sys-color-primary-500));border-radius:1px;animation:axm-blink .8s steps(2) infinite;vertical-align:text-bottom}@keyframes axm-blink{0%{opacity:1}50%{opacity:0}}.axm-assist-renderer__stream-content{display:flex;flex-direction:column;gap:.5rem}.axm-assist-renderer__streaming-activity{display:flex;align-items:center;gap:.5rem;padding-block:.15rem}.axm-assist-renderer__activity-label{line-height:1.45}.axm-assist-renderer__text{white-space:pre-line;word-break:break-word;line-height:1.85;font-size:.95rem;letter-spacing:.002em;text-wrap:pretty}.axm-assist-bot__segment ax-conversation-text-renderer{display:block}.axm-assist-bot__segment ax-conversation-text-renderer :is(p,ul,ol){margin-block:.45rem}.axm-assist-bot__segment ax-conversation-text-renderer li{line-height:1.8}.axm-assist-renderer__accordion-group{width:100%}.axm-assist-renderer__collapse-shell{border-radius:.625rem;overflow:hidden;background:rgb(var(--ax-sys-color-lighter-surface))}.axm-assist-renderer__collapse-body{margin:0;padding:0;border-radius:0 0 .5rem .5rem;background:transparent}.axm-assist-renderer__collapse-body>.axm-assist-renderer__agent-live-block--in-accordion{padding-inline:.5rem;padding-block-end:.35rem}.axm-assist-renderer__accordion-header{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.5rem .75rem;cursor:pointer;background:transparent;border:none;border-radius:.625rem .625rem 0 0;transition:background-color .15s ease}.axm-assist-renderer__collapse-shell>.axm-assist-renderer__accordion-header:hover{background:rgb(var(--ax-sys-color-light-surface))}.axm-assist-renderer__accordion-header-main{min-inline-size:0;display:flex;flex-direction:column;gap:.1rem}.axm-assist-renderer__accordion-header-title{font-size:.8125rem;line-height:1.25;font-weight:600;color:rgb(var(--ax-sys-color-on-surface));display:inline-flex;align-items:center;gap:.4rem}.axm-assist-renderer__header-trailing{flex-shrink:0;display:inline-flex;align-items:center;gap:.35rem}.axm-assist-renderer__header-actions{display:inline-flex;align-items:center}.axm-assist-renderer__badge{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;max-width:min(100%,14rem);padding:.1875rem .65rem;border-radius:9999px;font-size:.6875rem;font-weight:600;line-height:1.3;letter-spacing:.03em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.axm-assist-renderer__badge--warning{color:rgb(var(--ax-sys-color-on-warning-light-surface));background:rgb(var(--ax-sys-color-warning-100))}.axm-assist-renderer__badge--primary{color:rgb(var(--ax-sys-color-on-primary-lightest-surface));background:rgb(var(--ax-sys-color-primary-100))}.axm-assist-renderer__badge--success{color:rgb(var(--ax-sys-color-on-success-darker-surface));background:rgb(var(--ax-sys-color-success-100))}.axm-assist-renderer__thinking-chevron{display:inline-block;font-size:.65rem;opacity:.65;transition:transform .2s ease;line-height:1;flex-shrink:0}.axm-assist-renderer__thinking-chevron--expanded{transform:rotate(180deg)}.axm-assist-renderer__thinking-body{padding:.625rem .75rem .75rem;font-size:.78rem;color:rgb(var(--ax-sys-color-neutral-700));word-break:break-word;line-height:1.55}.axm-assist-renderer__tools{display:flex;flex-direction:column;gap:.5rem}.axm-assist-renderer__tool-card{border-radius:.625rem;overflow:hidden}.axm-assist-renderer__tool-body{padding:.625rem .75rem .75rem;display:flex;flex-direction:column;gap:.35rem}.axm-assist-renderer__tool-section-label{font-size:.625rem;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:rgb(var(--ax-sys-color-neutral-700))}.axm-assist-renderer__tool-pre{margin:0;max-block-size:10rem;overflow:auto;border-radius:.375rem;background:rgb(var(--ax-sys-color-light-surface));padding:.5rem;font-family:var(--ax-font-mono, monospace);font-size:.675rem;line-height:1.45;word-break:break-word}.axm-assist-renderer__run-meta-wrap{margin-block-start:.45rem}.axm-assist-renderer__run-meta-header-sub{font-size:.7rem;line-height:1.35;color:rgb(var(--ax-sys-color-neutral-700));white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.axm-assist-renderer__run-meta{margin-block-start:.45rem;padding:.55rem .65rem .6rem;border-radius:.625rem;background:rgb(var(--ax-sys-color-lighter-surface));display:flex;flex-direction:column;gap:.45rem}.axm-assist-renderer__run-meta--panel{margin-block-start:0;padding:.45rem .5rem .55rem;background:transparent;border-radius:0}.axm-assist-renderer__run-meta-grid{display:flex;gap:.4rem}.axm-assist-renderer__meta-tile{min-width:0;padding:.4rem .5rem .45rem;border-radius:.45rem;background:rgb(var(--ax-sys-color-light-surface))}.axm-assist-renderer__meta-tile--wide{grid-column:1 / -1}.axm-assist-renderer__meta-tile--accent{background:rgb(var(--ax-sys-color-primary-50))}.axm-assist-renderer__meta-tile-label{font-size:.6rem;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:rgb(var(--ax-sys-color-neutral-700));margin-block-end:.2rem}.axm-assist-renderer__meta-tile-value{font-size:.78rem;font-weight:600;line-height:1.35;color:rgb(var(--ax-sys-color-on-surface));word-break:break-word}.axm-assist-renderer__meta-tile-value--mono{font-variant-numeric:tabular-nums;font-feature-settings:\"tnum\" 1}.axm-assist-renderer__meta-tile-sub{margin-block-start:.15rem;font-size:.65rem;line-height:1.3;color:rgb(var(--ax-sys-color-neutral-700));font-family:var(--ax-font-mono, ui-monospace, monospace);word-break:break-all}.axm-assist-renderer__meta-tile-note{display:inline;margin-inline-start:.2rem;font-size:.65rem;font-weight:500;color:rgb(var(--ax-sys-color-success-700))}.axm-assist-renderer__tool-editor-wrap{border-radius:.375rem;overflow:hidden;background:rgb(var(--ax-sys-color-light-surface))}.axm-assist-renderer__waiting{display:flex;gap:.25rem;padding:.25rem 0}.axm-assist-renderer__dot{inline-size:6px;block-size:6px;border-radius:50%;background:rgb(var(--ax-sys-color-neutral-500));animation:axm-blink 1.2s ease-in-out infinite}.axm-assist-renderer__dot:nth-child(2){animation-delay:.2s}.axm-assist-renderer__dot:nth-child(3){animation-delay:.4s}.axm-assist-renderer__agent-live-block{border-radius:.75rem;background:rgb(var(--ax-sys-color-lighter-surface));padding:.75rem .875rem;display:flex;flex-direction:column;gap:.65rem;max-inline-size:min(42rem,100%)}.axm-assist-renderer__agent-live-block--in-accordion{background:rgb(var(--ax-sys-color-light-surface));border-radius:.5rem;padding:.5rem .55rem .55rem;max-inline-size:none}.axm-assist-renderer__agent-live-header{display:flex;align-items:center;flex-wrap:wrap;gap:.5rem}.axm-assist-renderer__agent-live-title{font-size:.8125rem;font-weight:600;color:rgb(var(--ax-sys-color-on-surface));flex:1;min-inline-size:0}.axm-assist-renderer__agent-live-prompt{font-size:.8125rem;line-height:1.55;word-break:break-word;padding:.5rem .75rem;border-radius:1.25rem;background:rgb(var(--ax-sys-color-lightest-surface));align-self:flex-end;max-inline-size:min(92%,36rem)}.axm-assist-renderer__agent-live-stream{font-size:.8125rem;line-height:1.55;white-space:pre-line;word-break:break-word;padding-block-start:.15rem}.axm-assist-renderer__agent-live-nested-tools{display:flex;flex-direction:column;gap:.35rem;padding-block-start:.35rem}.axm-assist-renderer__agent-live-nested-row{display:flex;align-items:center;gap:.45rem;font-size:.72rem}.axm-assist-renderer__agent-live-nested-name{font-family:var(--ax-font-mono, monospace);font-size:.7rem;flex:1;min-inline-size:0;overflow:hidden;text-overflow:ellipsis}.axm-assist-renderer__agent-live-nested-status{color:rgb(var(--ax-sys-color-neutral-600));flex-shrink:0}\n"], dependencies: [{ kind: "component", type: AXTextRendererComponent, selector: "ax-conversation-text-renderer", inputs: ["message"] }, { kind: "component", type: AXMNodeMessageRendererComponent, selector: "axm-chat-user-form-renderer", inputs: ["message", "node"], outputs: ["formSubmitted"] }, { kind: "component", type: AXMAssistBotImageLineComponent, selector: "axm-assist-bot-image-line", inputs: ["parentMessage", "fileId", "mimeType", "name"] }, { kind: "ngmodule", type: AXAccordionCdkModule }, { kind: "directive", type: i1$4.AXAccordionGroupDirective, selector: "[axAccordionGroup]", inputs: ["accordion", "activeIndex", "collapsedOnItemClick"], exportAs: ["axAccordionGroup"] }, { kind: "directive", type: i1$4.AXAccordionItemContentDirective, selector: "[axAccordionItemContent]", inputs: ["transition"], exportAs: ["axAccordionItemContent"] }, { kind: "directive", type: i1$4.AXAccordionItemHeaderDirective, selector: "[axAccordionItemHeader]", exportAs: ["axAccordionItemHeader"] }, { kind: "directive", type: i1$4.AXAccordionItemDirective, selector: "[axAccordionItem]", inputs: ["isCollapsed"], outputs: ["isCollapsedChange", "onClick"], exportAs: ["axAccordionItem"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i2.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXCodeEditorModule }, { kind: "component", type: i3$1.AXCodeEditorComponent, selector: "ax-code-editor", inputs: ["disabled", "value", "state", "name", "id", "language", "readonly", "placeholder", "lineNumbers", "lineWrapping", "tabSize", "indentWithTab", "theme", "extensions", "ariaLabel", "focusOnReady", "formatOnSave", "minRow", "customCompletions"], outputs: ["onValueChanged", "valueChange", "stateChange", "readonlyChange", "disabledChange", "ready", "save"] }, { kind: "component", type: AXPMarkdownViewerComponent, selector: "axp-markdown-viewer", inputs: ["markdown"] }, { kind: "directive", type: AXPMarkdownTemplateDirective, selector: "ng-template[axpMarkdownTemplate]", inputs: ["axpMarkdownTemplate"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i2$1.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: DecimalPipe, name: "number" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
5712
5488
|
}
|
|
5713
5489
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMAssistMessageRendererComponent, decorators: [{
|
|
5714
5490
|
type: Component,
|
|
@@ -5717,893 +5493,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
5717
5493
|
AXMNodeMessageRendererComponent,
|
|
5718
5494
|
AXMAssistBotImageLineComponent,
|
|
5719
5495
|
AXAccordionCdkModule,
|
|
5720
|
-
|
|
5496
|
+
AXButtonModule,
|
|
5721
5497
|
AXCodeEditorModule,
|
|
5498
|
+
AXPMarkdownViewerComponent,
|
|
5499
|
+
AXPMarkdownTemplateDirective,
|
|
5722
5500
|
FormsModule,
|
|
5723
5501
|
AXTranslationModule,
|
|
5724
5502
|
AsyncPipe,
|
|
5725
|
-
|
|
5726
|
-
<div class="axm-assist-renderer">
|
|
5727
|
-
@if (useTranscriptUi()) {
|
|
5728
|
-
<div
|
|
5729
|
-
class="axm-assist-bot"
|
|
5730
|
-
role="region"
|
|
5731
|
-
[attr.aria-label]="('@conversation:chat.assist-renderer.aria.assistant-response' | translate | async) ?? ''"
|
|
5732
|
-
>
|
|
5733
|
-
@for (line of transcriptLines(); track lineIndex; let lineIndex = $index) {
|
|
5734
|
-
<div
|
|
5735
|
-
class="axm-assist-bot__line"
|
|
5736
|
-
[class.axm-assist-bot__line--user]="line.role === 'user'"
|
|
5737
|
-
[class.axm-assist-bot__line--tool-role]="line.role === 'tool'"
|
|
5738
|
-
>
|
|
5739
|
-
@for (seg of line.responses; track segIndex; let segIndex = $index) {
|
|
5740
|
-
@if (line.role === 'user' && seg.type === 'image') {
|
|
5741
|
-
<axm-assist-bot-image-line
|
|
5742
|
-
[parentMessage]="message()"
|
|
5743
|
-
[fileId]="seg.content.fileId"
|
|
5744
|
-
[mimeType]="seg.content.mimeType"
|
|
5745
|
-
[name]="seg.content.name"
|
|
5746
|
-
/>
|
|
5747
|
-
} @else if (line.role === 'user' && seg.type === 'text') {
|
|
5748
|
-
<div class="axm-assist-bot__segment" [attr.dir]="segmentDir(seg.content)">
|
|
5749
|
-
<ax-conversation-text-renderer [message]="syntheticTextMessage(lineIndex, segIndex, seg.content)" />
|
|
5750
|
-
</div>
|
|
5751
|
-
} @else if (line.role === 'assistant' && seg.type === 'think') {
|
|
5752
|
-
<div class="axm-assist-renderer__accordion-group" axAccordionGroup [accordion]="false">
|
|
5753
|
-
<div
|
|
5754
|
-
class="axm-assist-renderer__thinking-accordion mb-0!"
|
|
5755
|
-
axAccordionItem
|
|
5756
|
-
#thinkAcc="axAccordionItem"
|
|
5757
|
-
[isCollapsed]="assistSectionIsCollapsed(assistThinkKey(lineIndex, segIndex))"
|
|
5758
|
-
(onClick)="onAssistAccordionClick($event, assistThinkKey(lineIndex, segIndex))"
|
|
5759
|
-
>
|
|
5760
|
-
<div
|
|
5761
|
-
class="axm-assist-renderer__accordion-header axm-assist-renderer__accordion-header--thinking"
|
|
5762
|
-
axAccordionItemHeader
|
|
5763
|
-
role="button"
|
|
5764
|
-
[attr.aria-expanded]="!thinkAcc.isCollapsed()"
|
|
5765
|
-
>
|
|
5766
|
-
<div class="axm-assist-renderer__accordion-header-main">
|
|
5767
|
-
<span class="axm-assist-renderer__accordion-header-title">
|
|
5768
|
-
<i
|
|
5769
|
-
class="fa-light fa-chevron-down axm-assist-renderer__thinking-chevron"
|
|
5770
|
-
[class.axm-assist-renderer__thinking-chevron--expanded]="!thinkAcc.isCollapsed()"
|
|
5771
|
-
aria-hidden="true"
|
|
5772
|
-
></i>
|
|
5773
|
-
{{ '@conversation:chat.assist-renderer.sections.thinking' | translate | async }}
|
|
5774
|
-
</span>
|
|
5775
|
-
</div>
|
|
5776
|
-
<ax-badge
|
|
5777
|
-
[look]="'twotone'"
|
|
5778
|
-
[text]="('@conversation:chat.assist-renderer.badges.internal' | translate | async) ?? ''"
|
|
5779
|
-
[color]="'warning'"
|
|
5780
|
-
></ax-badge>
|
|
5781
|
-
</div>
|
|
5782
|
-
<div axAccordionItemContent>
|
|
5783
|
-
<div
|
|
5784
|
-
class="axm-assist-renderer__thinking-body axm-assist-bot__segment"
|
|
5785
|
-
[attr.dir]="segmentDir(seg.content)"
|
|
5786
|
-
>
|
|
5787
|
-
{{ seg.content }}
|
|
5788
|
-
</div>
|
|
5789
|
-
</div>
|
|
5790
|
-
</div>
|
|
5791
|
-
</div>
|
|
5792
|
-
} @else if (line.role === 'assistant' && seg.type === 'text') {
|
|
5793
|
-
@let parsedLine = parseAssistLineText(seg.content);
|
|
5794
|
-
@if (debugModeEnabled() && parsedLine.thinking) {
|
|
5795
|
-
<div class="axm-assist-renderer__accordion-group" axAccordionGroup [accordion]="false">
|
|
5796
|
-
<div
|
|
5797
|
-
class="axm-assist-renderer__thinking-accordion mb-0!"
|
|
5798
|
-
axAccordionItem
|
|
5799
|
-
#thinkAcc="axAccordionItem"
|
|
5800
|
-
[isCollapsed]="assistSectionIsCollapsed(assistThinkKey(lineIndex, segIndex))"
|
|
5801
|
-
(onClick)="onAssistAccordionClick($event, assistThinkKey(lineIndex, segIndex))"
|
|
5802
|
-
>
|
|
5803
|
-
<div
|
|
5804
|
-
class="axm-assist-renderer__accordion-header axm-assist-renderer__accordion-header--thinking"
|
|
5805
|
-
axAccordionItemHeader
|
|
5806
|
-
role="button"
|
|
5807
|
-
[attr.aria-expanded]="!thinkAcc.isCollapsed()"
|
|
5808
|
-
>
|
|
5809
|
-
<div class="axm-assist-renderer__accordion-header-main">
|
|
5810
|
-
<span class="axm-assist-renderer__accordion-header-title">
|
|
5811
|
-
<i
|
|
5812
|
-
class="fa-light fa-chevron-down axm-assist-renderer__thinking-chevron"
|
|
5813
|
-
[class.axm-assist-renderer__thinking-chevron--expanded]="!thinkAcc.isCollapsed()"
|
|
5814
|
-
aria-hidden="true"
|
|
5815
|
-
></i>
|
|
5816
|
-
{{ '@conversation:chat.assist-renderer.sections.thinking' | translate | async }}
|
|
5817
|
-
</span>
|
|
5818
|
-
</div>
|
|
5819
|
-
<ax-badge
|
|
5820
|
-
[look]="'twotone'"
|
|
5821
|
-
[text]="('@conversation:chat.assist-renderer.badges.internal' | translate | async) ?? ''"
|
|
5822
|
-
[color]="'warning'"
|
|
5823
|
-
></ax-badge>
|
|
5824
|
-
</div>
|
|
5825
|
-
<div axAccordionItemContent>
|
|
5826
|
-
<div
|
|
5827
|
-
class="axm-assist-renderer__thinking-body axm-assist-bot__segment"
|
|
5828
|
-
[attr.dir]="segmentDir(parsedLine.thinking)"
|
|
5829
|
-
>
|
|
5830
|
-
{{ parsedLine.thinking }}
|
|
5831
|
-
</div>
|
|
5832
|
-
</div>
|
|
5833
|
-
</div>
|
|
5834
|
-
</div>
|
|
5835
|
-
}
|
|
5836
|
-
@if (parsedLine.body.trim()) {
|
|
5837
|
-
<div
|
|
5838
|
-
class="axm-assist-bot__segment axm-assist-renderer__markdown"
|
|
5839
|
-
[attr.dir]="segmentDir(parsedLine.body)"
|
|
5840
|
-
[innerHTML]="renderMarkdown(parsedLine.body)"
|
|
5841
|
-
></div>
|
|
5842
|
-
}
|
|
5843
|
-
} @else if (
|
|
5844
|
-
line.role === 'assistant' &&
|
|
5845
|
-
(seg.type === 'agent' || seg.type === 'tool') &&
|
|
5846
|
-
isDelegatedAgentCommand(seg.content.command) &&
|
|
5847
|
-
!debugModeEnabled()
|
|
5848
|
-
) {
|
|
5849
|
-
@let agLive = toolCallEntryFor(seg.callId);
|
|
5850
|
-
@let res = toolResultForCallId(seg.callId);
|
|
5851
|
-
@let agentAnswerText = delegatedAgentAnswerForCall(res);
|
|
5852
|
-
<div class="axm-assist-renderer__accordion-group" axAccordionGroup [accordion]="false">
|
|
5853
|
-
<div
|
|
5854
|
-
class="axm-assist-renderer__tool-card axm-assist-renderer__agent-accordion mb-0!"
|
|
5855
|
-
axAccordionItem
|
|
5856
|
-
#agentAcc="axAccordionItem"
|
|
5857
|
-
[isCollapsed]="assistSectionIsCollapsed(assistAgentKey(seg.callId))"
|
|
5858
|
-
(onClick)="onAssistAccordionClick($event, assistAgentKey(seg.callId))"
|
|
5859
|
-
>
|
|
5860
|
-
<div
|
|
5861
|
-
class="axm-assist-renderer__accordion-header"
|
|
5862
|
-
axAccordionItemHeader
|
|
5863
|
-
role="button"
|
|
5864
|
-
[attr.aria-expanded]="!agentAcc.isCollapsed()"
|
|
5865
|
-
>
|
|
5866
|
-
<div class="axm-assist-renderer__accordion-header-main">
|
|
5867
|
-
<span
|
|
5868
|
-
class="axm-assist-renderer__accordion-header-title inline-flex items-center gap-2 flex-wrap"
|
|
5869
|
-
>
|
|
5870
|
-
<i
|
|
5871
|
-
class="fa-light fa-chevron-down axm-assist-renderer__thinking-chevron"
|
|
5872
|
-
[class.axm-assist-renderer__thinking-chevron--expanded]="!agentAcc.isCollapsed()"
|
|
5873
|
-
aria-hidden="true"
|
|
5874
|
-
></i>
|
|
5875
|
-
@if (agLive?.state === 'running') {
|
|
5876
|
-
<span
|
|
5877
|
-
class="axm-assist-renderer__agent-live-spin inline-block w-3 h-3 rounded-full border-2 border-primary-500 border-t-transparent animate-spin shrink-0"
|
|
5878
|
-
aria-hidden="true"
|
|
5879
|
-
></span>
|
|
5880
|
-
} @else {
|
|
5881
|
-
<span
|
|
5882
|
-
class="inline-block w-3 h-3 rounded-full bg-success-500 shrink-0"
|
|
5883
|
-
aria-hidden="true"
|
|
5884
|
-
></span>
|
|
5885
|
-
}
|
|
5886
|
-
<i class="fa-light fa-people-group text-primary-500" aria-hidden="true"></i>
|
|
5887
|
-
<span class="axm-assist-renderer__agent-live-title">{{
|
|
5888
|
-
resolveToolDisplayTitle(seg.content.command)
|
|
5889
|
-
}}</span>
|
|
5890
|
-
</span>
|
|
5891
|
-
</div>
|
|
5892
|
-
<ax-badge
|
|
5893
|
-
[look]="'twotone'"
|
|
5894
|
-
[text]="
|
|
5895
|
-
(resolveToolBadge(
|
|
5896
|
-
seg.content.command,
|
|
5897
|
-
agLive?.state === 'running'
|
|
5898
|
-
? '@conversation:chat.assist-renderer.badges.running'
|
|
5899
|
-
: '@conversation:chat.assist-renderer.badges.agent'
|
|
5900
|
-
)
|
|
5901
|
-
| translate
|
|
5902
|
-
| async) ?? ''
|
|
5903
|
-
"
|
|
5904
|
-
[color]="agLive?.state === 'running' ? 'primary' : 'success'"
|
|
5905
|
-
></ax-badge>
|
|
5906
|
-
</div>
|
|
5907
|
-
<div axAccordionItemContent>
|
|
5908
|
-
<div
|
|
5909
|
-
class="axm-assist-renderer__agent-live-block axm-assist-renderer__agent-live-block--in-accordion"
|
|
5910
|
-
role="region"
|
|
5911
|
-
>
|
|
5912
|
-
<div
|
|
5913
|
-
class="axm-assist-renderer__agent-live-prompt"
|
|
5914
|
-
[attr.dir]="segmentDir(delegatedPromptPreview(seg.content.arguments))"
|
|
5915
|
-
>
|
|
5916
|
-
{{ delegatedPromptPreview(seg.content.arguments) }}
|
|
5917
|
-
</div>
|
|
5918
|
-
@if (agLive?.nestedStreamText?.trim()) {
|
|
5919
|
-
<div
|
|
5920
|
-
class="axm-assist-renderer__agent-live-stream"
|
|
5921
|
-
[attr.dir]="segmentDir(agLive?.nestedStreamText ?? '')"
|
|
5922
|
-
>
|
|
5923
|
-
{{ agLive?.nestedStreamText }}
|
|
5924
|
-
</div>
|
|
5925
|
-
}
|
|
5926
|
-
@if (agLive?.nestedTools?.length) {
|
|
5927
|
-
<div class="axm-assist-renderer__agent-live-nested-tools">
|
|
5928
|
-
@for (nt of agLive?.nestedTools ?? []; track nt.id) {
|
|
5929
|
-
<div class="axm-assist-renderer__agent-live-nested-row">
|
|
5930
|
-
@if (nt.state === 'running') {
|
|
5931
|
-
<span
|
|
5932
|
-
class="inline-block w-2.5 h-2.5 rounded-full border-2 border-primary-500 border-t-transparent animate-spin shrink-0"
|
|
5933
|
-
aria-hidden="true"
|
|
5934
|
-
></span>
|
|
5935
|
-
} @else {
|
|
5936
|
-
<span
|
|
5937
|
-
class="inline-block w-2.5 h-2.5 rounded-full bg-success-500 shrink-0"
|
|
5938
|
-
aria-hidden="true"
|
|
5939
|
-
></span>
|
|
5940
|
-
}
|
|
5941
|
-
<code class="axm-assist-renderer__agent-live-nested-name">{{ nt.name }}</code>
|
|
5942
|
-
<span class="axm-assist-renderer__agent-live-nested-status">{{
|
|
5943
|
-
nt.state === 'running' ? '…' : '✓'
|
|
5944
|
-
}}</span>
|
|
5945
|
-
</div>
|
|
5946
|
-
}
|
|
5947
|
-
</div>
|
|
5948
|
-
}
|
|
5949
|
-
@if (agentAnswerText) {
|
|
5950
|
-
<div class="axm-assist-renderer__agent-live-nested-tools">
|
|
5951
|
-
<div class="axm-assist-renderer__tool-section-label">
|
|
5952
|
-
{{ '@conversation:chat.assist-renderer.sections.agent-answer' | translate | async }}
|
|
5953
|
-
</div>
|
|
5954
|
-
<div
|
|
5955
|
-
class="axm-assist-renderer__agent-live-stream"
|
|
5956
|
-
[attr.dir]="segmentDir(agentAnswerText)"
|
|
5957
|
-
>
|
|
5958
|
-
{{ agentAnswerText }}
|
|
5959
|
-
</div>
|
|
5960
|
-
</div>
|
|
5961
|
-
}
|
|
5962
|
-
</div>
|
|
5963
|
-
</div>
|
|
5964
|
-
</div>
|
|
5965
|
-
</div>
|
|
5966
|
-
} @else if (
|
|
5967
|
-
line.role === 'assistant' &&
|
|
5968
|
-
(seg.type === 'agent' || seg.type === 'tool') &&
|
|
5969
|
-
isDelegatedAgentCommand(seg.content.command) &&
|
|
5970
|
-
debugModeEnabled()
|
|
5971
|
-
) {
|
|
5972
|
-
<div class="axm-assist-renderer__accordion-group" axAccordionGroup [accordion]="false">
|
|
5973
|
-
<div
|
|
5974
|
-
class="axm-assist-renderer__tool-card !mb-0"
|
|
5975
|
-
axAccordionItem
|
|
5976
|
-
#agentDebugAcc="axAccordionItem"
|
|
5977
|
-
[isCollapsed]="assistSectionIsCollapsed(assistAgentKey(seg.callId))"
|
|
5978
|
-
(onClick)="onAssistAccordionClick($event, assistAgentKey(seg.callId))"
|
|
5979
|
-
>
|
|
5980
|
-
<div class="axm-assist-renderer__accordion-header" axAccordionItemHeader>
|
|
5981
|
-
<div class="axm-assist-renderer__accordion-header-main">
|
|
5982
|
-
<span class="axm-assist-renderer__accordion-header-title">
|
|
5983
|
-
<i
|
|
5984
|
-
class="fa-light fa-chevron-down axm-assist-renderer__thinking-chevron"
|
|
5985
|
-
[class.axm-assist-renderer__thinking-chevron--expanded]="!agentDebugAcc.isCollapsed()"
|
|
5986
|
-
aria-hidden="true"
|
|
5987
|
-
></i>
|
|
5988
|
-
<i class="fa-light fa-screwdriver-wrench axm-assist-renderer__tool-title-icon"></i>
|
|
5989
|
-
{{ resolveToolDisplayTitle(seg.content.command) }}
|
|
5990
|
-
</span>
|
|
5991
|
-
</div>
|
|
5992
|
-
<span
|
|
5993
|
-
class="axm-assist-renderer__accordion-header-badge axm-assist-renderer__accordion-header-badge--primary"
|
|
5994
|
-
>
|
|
5995
|
-
<ax-badge
|
|
5996
|
-
[look]="'twotone'"
|
|
5997
|
-
[text]="
|
|
5998
|
-
(resolveToolBadge(seg.content.command, '@conversation:chat.assist-renderer.badges.agent')
|
|
5999
|
-
| translate
|
|
6000
|
-
| async) ?? ''
|
|
6001
|
-
"
|
|
6002
|
-
[color]="'primary'"
|
|
6003
|
-
></ax-badge>
|
|
6004
|
-
</span>
|
|
6005
|
-
</div>
|
|
6006
|
-
<div axAccordionItemContent>
|
|
6007
|
-
<div class="axm-assist-renderer__tool-body">
|
|
6008
|
-
<div class="axm-assist-renderer__tool-section-label">
|
|
6009
|
-
{{ '@conversation:chat.assist-renderer.sections.input' | translate | async }}
|
|
6010
|
-
</div>
|
|
6011
|
-
<div class="axm-assist-renderer__tool-editor-wrap" style="direction: ltr;">
|
|
6012
|
-
<ax-code-editor
|
|
6013
|
-
[ngModel]="formatArgs(seg.content.arguments)"
|
|
6014
|
-
[readonly]="true"
|
|
6015
|
-
language="json"
|
|
6016
|
-
[lineNumbers]="true"
|
|
6017
|
-
class="axm-assist-renderer__tool-editor"
|
|
6018
|
-
></ax-code-editor>
|
|
6019
|
-
</div>
|
|
6020
|
-
@if (toolResultForCallId(seg.callId); as resultLine) {
|
|
6021
|
-
<div class="axm-assist-renderer__tool-section-label">
|
|
6022
|
-
{{ '@conversation:chat.assist-renderer.sections.output' | translate | async }}
|
|
6023
|
-
</div>
|
|
6024
|
-
<div class="axm-assist-renderer__tool-editor-wrap" style="direction: ltr;">
|
|
6025
|
-
<ax-code-editor
|
|
6026
|
-
[ngModel]="formatToolResultBody(resultLine)"
|
|
6027
|
-
[readonly]="true"
|
|
6028
|
-
language="json"
|
|
6029
|
-
[lineNumbers]="true"
|
|
6030
|
-
class="axm-assist-renderer__tool-editor"
|
|
6031
|
-
></ax-code-editor>
|
|
6032
|
-
</div>
|
|
6033
|
-
}
|
|
6034
|
-
</div>
|
|
6035
|
-
</div>
|
|
6036
|
-
</div>
|
|
6037
|
-
</div>
|
|
6038
|
-
} @else if (line.role === 'assistant' && seg.type === 'tool' && !debugModeEnabled()) {
|
|
6039
|
-
@let tc = toolCallEntryFor(seg.callId);
|
|
6040
|
-
<div
|
|
6041
|
-
class="axm-assist-renderer__tool-compact flex items-center gap-2 rounded-md border border-default/50 bg-default-50/40 px-2 py-1.5 text-sm"
|
|
6042
|
-
role="status"
|
|
6043
|
-
[attr.aria-label]="resolveToolDisplayTitle(seg.content.command)"
|
|
6044
|
-
>
|
|
6045
|
-
@if (tc?.state === 'running') {
|
|
6046
|
-
<span
|
|
6047
|
-
class="inline-block w-2.5 h-2.5 rounded-full border-2 border-primary-500 border-t-transparent animate-spin shrink-0"
|
|
6048
|
-
aria-hidden="true"
|
|
6049
|
-
></span>
|
|
6050
|
-
} @else {
|
|
6051
|
-
<i class="fa-light fa-check text-success-500 shrink-0" aria-hidden="true"></i>
|
|
6052
|
-
}
|
|
6053
|
-
<span class="font-medium min-w-0 truncate">{{ resolveToolDisplayTitle(seg.content.command) }}</span>
|
|
6054
|
-
</div>
|
|
6055
|
-
} @else if (line.role === 'assistant' && seg.type === 'tool' && debugModeEnabled()) {
|
|
6056
|
-
<div class="axm-assist-renderer__accordion-group" axAccordionGroup [accordion]="false">
|
|
6057
|
-
<div
|
|
6058
|
-
class="axm-assist-renderer__tool-card !mb-0"
|
|
6059
|
-
axAccordionItem
|
|
6060
|
-
#toolDebugAcc="axAccordionItem"
|
|
6061
|
-
[isCollapsed]="assistSectionIsCollapsed(assistToolKey(seg.callId))"
|
|
6062
|
-
(onClick)="onAssistAccordionClick($event, assistToolKey(seg.callId))"
|
|
6063
|
-
>
|
|
6064
|
-
<div class="axm-assist-renderer__accordion-header" axAccordionItemHeader>
|
|
6065
|
-
<div class="axm-assist-renderer__accordion-header-main">
|
|
6066
|
-
<span class="axm-assist-renderer__accordion-header-title">
|
|
6067
|
-
<i
|
|
6068
|
-
class="fa-light fa-chevron-down axm-assist-renderer__thinking-chevron"
|
|
6069
|
-
[class.axm-assist-renderer__thinking-chevron--expanded]="!toolDebugAcc.isCollapsed()"
|
|
6070
|
-
aria-hidden="true"
|
|
6071
|
-
></i>
|
|
6072
|
-
<i class="fa-light fa-screwdriver-wrench axm-assist-renderer__tool-title-icon"></i>
|
|
6073
|
-
{{ resolveToolDisplayTitle(seg.content.command) }}
|
|
6074
|
-
</span>
|
|
6075
|
-
</div>
|
|
6076
|
-
<span
|
|
6077
|
-
class="axm-assist-renderer__accordion-header-badge axm-assist-renderer__accordion-header-badge--primary"
|
|
6078
|
-
>
|
|
6079
|
-
<ax-badge
|
|
6080
|
-
[look]="'twotone'"
|
|
6081
|
-
[text]="
|
|
6082
|
-
(resolveToolBadge(seg.content.command, '@conversation:chat.assist-renderer.badges.tool')
|
|
6083
|
-
| translate
|
|
6084
|
-
| async) ?? ''
|
|
6085
|
-
"
|
|
6086
|
-
[color]="'primary'"
|
|
6087
|
-
></ax-badge>
|
|
6088
|
-
</span>
|
|
6089
|
-
</div>
|
|
6090
|
-
<div axAccordionItemContent>
|
|
6091
|
-
<div class="axm-assist-renderer__tool-body">
|
|
6092
|
-
<div class="axm-assist-renderer__tool-section-label">
|
|
6093
|
-
{{ '@conversation:chat.assist-renderer.sections.input' | translate | async }}
|
|
6094
|
-
</div>
|
|
6095
|
-
<div class="axm-assist-renderer__tool-editor-wrap" style="direction: ltr;">
|
|
6096
|
-
<ax-code-editor
|
|
6097
|
-
[ngModel]="formatArgs(seg.content.arguments)"
|
|
6098
|
-
[readonly]="true"
|
|
6099
|
-
language="json"
|
|
6100
|
-
[lineNumbers]="true"
|
|
6101
|
-
class="axm-assist-renderer__tool-editor"
|
|
6102
|
-
></ax-code-editor>
|
|
6103
|
-
</div>
|
|
6104
|
-
@if (toolResultForCallId(seg.callId); as resultLine) {
|
|
6105
|
-
<div class="axm-assist-renderer__tool-section-label">
|
|
6106
|
-
{{ '@conversation:chat.assist-renderer.sections.output' | translate | async }}
|
|
6107
|
-
</div>
|
|
6108
|
-
<div class="axm-assist-renderer__tool-editor-wrap" style="direction: ltr;">
|
|
6109
|
-
<ax-code-editor
|
|
6110
|
-
[ngModel]="formatToolResultBody(resultLine)"
|
|
6111
|
-
[readonly]="true"
|
|
6112
|
-
language="json"
|
|
6113
|
-
[lineNumbers]="true"
|
|
6114
|
-
class="axm-assist-renderer__tool-editor"
|
|
6115
|
-
></ax-code-editor>
|
|
6116
|
-
</div>
|
|
6117
|
-
}
|
|
6118
|
-
</div>
|
|
6119
|
-
</div>
|
|
6120
|
-
</div>
|
|
6121
|
-
</div>
|
|
6122
|
-
} @else if (line.role === 'assistant' && seg.type === 'node') {
|
|
6123
|
-
@let assistNodeWidget = axmAssistWidgetNodeFromUnknown(seg.content);
|
|
6124
|
-
@if (assistNodeWidget) {
|
|
6125
|
-
<div class="axm-assist-bot__segment" dir="auto">
|
|
6126
|
-
<axm-chat-user-form-renderer
|
|
6127
|
-
[message]="syntheticNodeEmbedMessage(lineIndex, segIndex, seg.content)"
|
|
6128
|
-
/>
|
|
6129
|
-
</div>
|
|
6130
|
-
}
|
|
6131
|
-
} @else if (line.role === 'assistant' && seg.type === 'image') {
|
|
6132
|
-
<axm-assist-bot-image-line
|
|
6133
|
-
[parentMessage]="message()"
|
|
6134
|
-
[fileId]="seg.content.fileId"
|
|
6135
|
-
[mimeType]="seg.content.mimeType"
|
|
6136
|
-
[name]="seg.content.name"
|
|
6137
|
-
/>
|
|
6138
|
-
} @else if (line.role === 'tool' && (seg.type === 'tool_result' || seg.type === 'agent_result')) {
|
|
6139
|
-
<!-- merged into the corresponding tool/agent accordion -->
|
|
6140
|
-
} @else if (line.role === 'system' && seg.type === 'text') {
|
|
6141
|
-
<div class="axm-assist-bot__segment" [attr.dir]="segmentDir(seg.content)">
|
|
6142
|
-
<ax-conversation-text-renderer [message]="syntheticTextMessage(lineIndex, segIndex, seg.content)" />
|
|
6143
|
-
</div>
|
|
6144
|
-
} @else {
|
|
6145
|
-
<div
|
|
6146
|
-
class="axm-assist-bot__fallback axm-assist-bot__segment"
|
|
6147
|
-
[attr.dir]="segmentDir(formatFallbackSegment(seg))"
|
|
6148
|
-
>
|
|
6149
|
-
{{ formatFallbackSegment(seg) }}
|
|
6150
|
-
</div>
|
|
6151
|
-
}
|
|
6152
|
-
}
|
|
6153
|
-
</div>
|
|
6154
|
-
}
|
|
6155
|
-
@if (isStreaming()) {
|
|
6156
|
-
<div class="axm-assist-renderer__streaming-activity" role="status" aria-live="polite">
|
|
6157
|
-
<span
|
|
6158
|
-
class="axm-assist-renderer__activity-spin inline-block w-3 h-3 rounded-full border-2 border-primary-500 border-t-transparent animate-spin shrink-0"
|
|
6159
|
-
aria-hidden="true"
|
|
6160
|
-
></span>
|
|
6161
|
-
<span class="axm-assist-renderer__activity-label text-xs text-muted italic">{{
|
|
6162
|
-
assistActivityMessageKey() | translate | async
|
|
6163
|
-
}}</span>
|
|
6164
|
-
</div>
|
|
6165
|
-
}
|
|
6166
|
-
@if (isStreaming() && streamText().trim()) {
|
|
6167
|
-
<span class="axm-assist-renderer__cursor" aria-hidden="true"></span>
|
|
6168
|
-
}
|
|
6169
|
-
</div>
|
|
6170
|
-
} @else {
|
|
6171
|
-
@if (isStreaming()) {
|
|
6172
|
-
<div class="axm-assist-renderer__stream-content">
|
|
6173
|
-
<div class="axm-assist-renderer__streaming-activity" role="status" aria-live="polite">
|
|
6174
|
-
<span
|
|
6175
|
-
class="axm-assist-renderer__activity-spin inline-block w-3 h-3 rounded-full border-2 border-primary-500 border-t-transparent animate-spin shrink-0"
|
|
6176
|
-
aria-hidden="true"
|
|
6177
|
-
></span>
|
|
6178
|
-
<span class="axm-assist-renderer__activity-label text-xs text-muted italic">{{
|
|
6179
|
-
assistActivityMessageKey() | translate | async
|
|
6180
|
-
}}</span>
|
|
6181
|
-
</div>
|
|
6182
|
-
@if (streamThink().trim()) {
|
|
6183
|
-
<div class="axm-assist-renderer__accordion-group" axAccordionGroup [accordion]="false">
|
|
6184
|
-
<div
|
|
6185
|
-
class="axm-assist-renderer__thinking-accordion !mb-0"
|
|
6186
|
-
axAccordionItem
|
|
6187
|
-
#thinkAcc="axAccordionItem"
|
|
6188
|
-
[isCollapsed]="assistSectionIsCollapsed(assistThinkStreamKey())"
|
|
6189
|
-
(onClick)="onAssistAccordionClick($event, assistThinkStreamKey())"
|
|
6190
|
-
>
|
|
6191
|
-
<div
|
|
6192
|
-
class="axm-assist-renderer__accordion-header axm-assist-renderer__accordion-header--thinking"
|
|
6193
|
-
axAccordionItemHeader
|
|
6194
|
-
role="button"
|
|
6195
|
-
[attr.aria-expanded]="!thinkAcc.isCollapsed()"
|
|
6196
|
-
>
|
|
6197
|
-
<div class="axm-assist-renderer__accordion-header-main">
|
|
6198
|
-
<span class="axm-assist-renderer__accordion-header-title">
|
|
6199
|
-
<i
|
|
6200
|
-
class="fa-light fa-chevron-down axm-assist-renderer__thinking-chevron"
|
|
6201
|
-
[class.axm-assist-renderer__thinking-chevron--expanded]="!thinkAcc.isCollapsed()"
|
|
6202
|
-
aria-hidden="true"
|
|
6203
|
-
></i>
|
|
6204
|
-
{{ '@conversation:chat.assist-renderer.sections.thinking' | translate | async }}
|
|
6205
|
-
</span>
|
|
6206
|
-
</div>
|
|
6207
|
-
<ax-badge
|
|
6208
|
-
[look]="'twotone'"
|
|
6209
|
-
[text]="('@conversation:chat.assist-renderer.badges.internal' | translate | async) ?? ''"
|
|
6210
|
-
[color]="'warning'"
|
|
6211
|
-
></ax-badge>
|
|
6212
|
-
</div>
|
|
6213
|
-
<div axAccordionItemContent>
|
|
6214
|
-
<div
|
|
6215
|
-
class="axm-assist-renderer__thinking-body axm-assist-bot__segment"
|
|
6216
|
-
[attr.dir]="segmentDir(streamThink())"
|
|
6217
|
-
>
|
|
6218
|
-
{{ streamThink() }}
|
|
6219
|
-
</div>
|
|
6220
|
-
</div>
|
|
6221
|
-
</div>
|
|
6222
|
-
</div>
|
|
6223
|
-
}
|
|
6224
|
-
@if (streamText()) {
|
|
6225
|
-
<div class="axm-assist-renderer__text axm-assist-bot__segment" [attr.dir]="segmentDir(streamText())">
|
|
6226
|
-
{{ streamText() }}
|
|
6227
|
-
</div>
|
|
6228
|
-
}
|
|
6229
|
-
@if (toolCalls().length) {
|
|
6230
|
-
<div class="axm-assist-renderer__tools">
|
|
6231
|
-
@for (tc of toolCalls(); track tc.id) {
|
|
6232
|
-
@if (isDelegatedAgentCommand(tc.name)) {
|
|
6233
|
-
@let legacyAgentAns = delegatedAnswerFromToolOutputString(tc.output);
|
|
6234
|
-
<div class="axm-assist-renderer__accordion-group" axAccordionGroup [accordion]="false">
|
|
6235
|
-
<div
|
|
6236
|
-
class="axm-assist-renderer__tool-card axm-assist-renderer__agent-accordion !mb-0"
|
|
6237
|
-
axAccordionItem
|
|
6238
|
-
#legacyAgentAcc="axAccordionItem"
|
|
6239
|
-
[isCollapsed]="assistSectionIsCollapsed(assistAgentKey(tc.id))"
|
|
6240
|
-
(onClick)="onAssistAccordionClick($event, assistAgentKey(tc.id))"
|
|
6241
|
-
>
|
|
6242
|
-
<div
|
|
6243
|
-
class="axm-assist-renderer__accordion-header"
|
|
6244
|
-
axAccordionItemHeader
|
|
6245
|
-
role="button"
|
|
6246
|
-
[attr.aria-expanded]="!legacyAgentAcc.isCollapsed()"
|
|
6247
|
-
>
|
|
6248
|
-
<div class="axm-assist-renderer__accordion-header-main">
|
|
6249
|
-
<span
|
|
6250
|
-
class="axm-assist-renderer__accordion-header-title inline-flex items-center gap-2 flex-wrap"
|
|
6251
|
-
>
|
|
6252
|
-
<i
|
|
6253
|
-
class="fa-light fa-chevron-down axm-assist-renderer__thinking-chevron"
|
|
6254
|
-
[class.axm-assist-renderer__thinking-chevron--expanded]="!legacyAgentAcc.isCollapsed()"
|
|
6255
|
-
aria-hidden="true"
|
|
6256
|
-
></i>
|
|
6257
|
-
@if (tc.state === 'running') {
|
|
6258
|
-
<span
|
|
6259
|
-
class="axm-assist-renderer__agent-live-spin inline-block w-3 h-3 rounded-full border-2 border-primary-500 border-t-transparent animate-spin shrink-0"
|
|
6260
|
-
aria-hidden="true"
|
|
6261
|
-
></span>
|
|
6262
|
-
} @else {
|
|
6263
|
-
<span
|
|
6264
|
-
class="inline-block w-3 h-3 rounded-full bg-success-500 shrink-0"
|
|
6265
|
-
aria-hidden="true"
|
|
6266
|
-
></span>
|
|
6267
|
-
}
|
|
6268
|
-
<i class="fa-light fa-people-group text-primary-500" aria-hidden="true"></i>
|
|
6269
|
-
<span class="axm-assist-renderer__agent-live-title">{{
|
|
6270
|
-
resolveToolDisplayTitle(tc.name)
|
|
6271
|
-
}}</span>
|
|
6272
|
-
</span>
|
|
6273
|
-
</div>
|
|
6274
|
-
<ax-badge
|
|
6275
|
-
[look]="'twotone'"
|
|
6276
|
-
[text]="
|
|
6277
|
-
(resolveToolBadge(
|
|
6278
|
-
tc.name,
|
|
6279
|
-
tc.state === 'running'
|
|
6280
|
-
? '@conversation:chat.assist-renderer.badges.running'
|
|
6281
|
-
: '@conversation:chat.assist-renderer.badges.agent'
|
|
6282
|
-
)
|
|
6283
|
-
| translate
|
|
6284
|
-
| async) ?? ''
|
|
6285
|
-
"
|
|
6286
|
-
[color]="tc.state === 'running' ? 'primary' : 'success'"
|
|
6287
|
-
></ax-badge>
|
|
6288
|
-
</div>
|
|
6289
|
-
<div axAccordionItemContent>
|
|
6290
|
-
<div
|
|
6291
|
-
class="axm-assist-renderer__agent-live-block axm-assist-renderer__agent-live-block--in-accordion"
|
|
6292
|
-
role="region"
|
|
6293
|
-
>
|
|
6294
|
-
<div
|
|
6295
|
-
class="axm-assist-renderer__agent-live-prompt"
|
|
6296
|
-
[attr.dir]="segmentDir(delegatedPromptPreview(tc.arguments))"
|
|
6297
|
-
>
|
|
6298
|
-
{{ delegatedPromptPreview(tc.arguments) }}
|
|
6299
|
-
</div>
|
|
6300
|
-
@if (tc.nestedStreamText?.trim()) {
|
|
6301
|
-
<div
|
|
6302
|
-
class="axm-assist-renderer__agent-live-stream"
|
|
6303
|
-
[attr.dir]="segmentDir(tc.nestedStreamText ?? '')"
|
|
6304
|
-
>
|
|
6305
|
-
{{ tc.nestedStreamText }}
|
|
6306
|
-
</div>
|
|
6307
|
-
}
|
|
6308
|
-
@if (tc.nestedTools?.length) {
|
|
6309
|
-
<div class="axm-assist-renderer__agent-live-nested-tools">
|
|
6310
|
-
@for (nt of tc.nestedTools; track nt.id) {
|
|
6311
|
-
<div class="axm-assist-renderer__agent-live-nested-row">
|
|
6312
|
-
@if (nt.state === 'running') {
|
|
6313
|
-
<span
|
|
6314
|
-
class="inline-block w-2.5 h-2.5 rounded-full border-2 border-primary-500 border-t-transparent animate-spin shrink-0"
|
|
6315
|
-
aria-hidden="true"
|
|
6316
|
-
></span>
|
|
6317
|
-
} @else {
|
|
6318
|
-
<span
|
|
6319
|
-
class="inline-block w-2.5 h-2.5 rounded-full bg-success-500 shrink-0"
|
|
6320
|
-
aria-hidden="true"
|
|
6321
|
-
></span>
|
|
6322
|
-
}
|
|
6323
|
-
<code class="axm-assist-renderer__agent-live-nested-name">{{ nt.name }}</code>
|
|
6324
|
-
<span class="axm-assist-renderer__agent-live-nested-status">{{
|
|
6325
|
-
nt.state === 'running' ? '…' : '✓'
|
|
6326
|
-
}}</span>
|
|
6327
|
-
</div>
|
|
6328
|
-
}
|
|
6329
|
-
</div>
|
|
6330
|
-
}
|
|
6331
|
-
@if (legacyAgentAns) {
|
|
6332
|
-
<div class="axm-assist-renderer__agent-live-nested-tools">
|
|
6333
|
-
<div class="axm-assist-renderer__tool-section-label">
|
|
6334
|
-
{{ '@conversation:chat.assist-renderer.sections.agent-answer' | translate | async }}
|
|
6335
|
-
</div>
|
|
6336
|
-
<div
|
|
6337
|
-
class="axm-assist-renderer__agent-live-stream"
|
|
6338
|
-
[attr.dir]="segmentDir(legacyAgentAns)"
|
|
6339
|
-
>
|
|
6340
|
-
{{ legacyAgentAns }}
|
|
6341
|
-
</div>
|
|
6342
|
-
</div>
|
|
6343
|
-
}
|
|
6344
|
-
</div>
|
|
6345
|
-
</div>
|
|
6346
|
-
</div>
|
|
6347
|
-
</div>
|
|
6348
|
-
} @else {
|
|
6349
|
-
@if (debugModeEnabled()) {
|
|
6350
|
-
<div class="axm-assist-renderer__accordion-group" axAccordionGroup [accordion]="false">
|
|
6351
|
-
<div
|
|
6352
|
-
class="axm-assist-renderer__tool-card !-mb-0"
|
|
6353
|
-
axAccordionItem
|
|
6354
|
-
#legacyStreamDbgAcc="axAccordionItem"
|
|
6355
|
-
[isCollapsed]="assistSectionIsCollapsed(assistLegacyToolAccordionKey(tc))"
|
|
6356
|
-
(onClick)="onAssistLegacyAccordionClick($event, tc)"
|
|
6357
|
-
>
|
|
6358
|
-
<div class="axm-assist-renderer__accordion-header" axAccordionItemHeader>
|
|
6359
|
-
<div class="axm-assist-renderer__accordion-header-main">
|
|
6360
|
-
<span class="axm-assist-renderer__accordion-header-title">
|
|
6361
|
-
<i
|
|
6362
|
-
class="fa-light fa-chevron-down axm-assist-renderer__thinking-chevron"
|
|
6363
|
-
[class.axm-assist-renderer__thinking-chevron--expanded]="
|
|
6364
|
-
!legacyStreamDbgAcc.isCollapsed()
|
|
6365
|
-
"
|
|
6366
|
-
aria-hidden="true"
|
|
6367
|
-
></i>
|
|
6368
|
-
<i class="fa-light fa-screwdriver-wrench axm-assist-renderer__tool-title-icon"></i>
|
|
6369
|
-
{{ resolveToolDisplayTitle(tc.name) }}
|
|
6370
|
-
</span>
|
|
6371
|
-
</div>
|
|
6372
|
-
<span
|
|
6373
|
-
class="axm-assist-renderer__accordion-header-badge"
|
|
6374
|
-
[class.axm-assist-renderer__accordion-header-badge--primary]="tc.state === 'running'"
|
|
6375
|
-
[class.axm-assist-renderer__accordion-header-badge--success]="tc.state === 'done'"
|
|
6376
|
-
>
|
|
6377
|
-
<ax-badge
|
|
6378
|
-
[look]="'twotone'"
|
|
6379
|
-
[text]="
|
|
6380
|
-
(resolveToolBadge(
|
|
6381
|
-
tc.name,
|
|
6382
|
-
tc.state === 'running'
|
|
6383
|
-
? '@conversation:chat.assist-renderer.badges.running'
|
|
6384
|
-
: '@conversation:chat.assist-renderer.badges.done'
|
|
6385
|
-
)
|
|
6386
|
-
| translate
|
|
6387
|
-
| async) ?? ''
|
|
6388
|
-
"
|
|
6389
|
-
[color]="tc.state === 'running' ? 'primary' : 'success'"
|
|
6390
|
-
></ax-badge>
|
|
6391
|
-
</span>
|
|
6392
|
-
</div>
|
|
6393
|
-
<div axAccordionItemContent>
|
|
6394
|
-
<div class="axm-assist-renderer__tool-body">
|
|
6395
|
-
<div class="axm-assist-renderer__tool-section-label">
|
|
6396
|
-
{{ '@conversation:chat.assist-renderer.sections.input' | translate | async }}
|
|
6397
|
-
</div>
|
|
6398
|
-
<div class="axm-assist-renderer__tool-editor-wrap" style="direction: ltr;">
|
|
6399
|
-
<ax-code-editor
|
|
6400
|
-
[ngModel]="formatArgs(tc.arguments)"
|
|
6401
|
-
[readonly]="true"
|
|
6402
|
-
language="json"
|
|
6403
|
-
[lineNumbers]="true"
|
|
6404
|
-
class="axm-assist-renderer__tool-editor"
|
|
6405
|
-
></ax-code-editor>
|
|
6406
|
-
</div>
|
|
6407
|
-
@if (tc.output) {
|
|
6408
|
-
<div class="axm-assist-renderer__tool-section-label">
|
|
6409
|
-
{{ '@conversation:chat.assist-renderer.sections.output' | translate | async }}
|
|
6410
|
-
</div>
|
|
6411
|
-
<div class="axm-assist-renderer__tool-editor-wrap" style="direction: ltr;">
|
|
6412
|
-
<ax-code-editor
|
|
6413
|
-
[ngModel]="formatJson(tc.output)"
|
|
6414
|
-
[readonly]="true"
|
|
6415
|
-
language="json"
|
|
6416
|
-
[lineNumbers]="true"
|
|
6417
|
-
class="axm-assist-renderer__tool-editor"
|
|
6418
|
-
></ax-code-editor>
|
|
6419
|
-
</div>
|
|
6420
|
-
}
|
|
6421
|
-
</div>
|
|
6422
|
-
</div>
|
|
6423
|
-
</div>
|
|
6424
|
-
</div>
|
|
6425
|
-
} @else {
|
|
6426
|
-
<div
|
|
6427
|
-
class="axm-assist-renderer__tool-compact flex items-center gap-2 rounded-md border border-default/50 bg-default-50/40 px-2 py-1.5 text-sm"
|
|
6428
|
-
role="status"
|
|
6429
|
-
>
|
|
6430
|
-
@if (tc.state === 'running') {
|
|
6431
|
-
<span
|
|
6432
|
-
class="inline-block w-2.5 h-2.5 rounded-full border-2 border-primary-500 border-t-transparent animate-spin shrink-0"
|
|
6433
|
-
aria-hidden="true"
|
|
6434
|
-
></span>
|
|
6435
|
-
} @else {
|
|
6436
|
-
<i class="fa-light fa-check text-success-500 shrink-0" aria-hidden="true"></i>
|
|
6437
|
-
}
|
|
6438
|
-
<span class="font-medium min-w-0 truncate">{{ resolveToolDisplayTitle(tc.name) }}</span>
|
|
6439
|
-
</div>
|
|
6440
|
-
}
|
|
6441
|
-
}
|
|
6442
|
-
}
|
|
6443
|
-
</div>
|
|
6444
|
-
}
|
|
6445
|
-
@if (isStreaming() && streamText().trim()) {
|
|
6446
|
-
<span class="axm-assist-renderer__cursor"></span>
|
|
6447
|
-
} @else if (isStreaming() && !streamThink().trim() && !streamText().trim() && !toolCalls().length) {
|
|
6448
|
-
<div class="axm-assist-renderer__waiting">
|
|
6449
|
-
<span class="axm-assist-renderer__dot"></span>
|
|
6450
|
-
<span class="axm-assist-renderer__dot"></span>
|
|
6451
|
-
<span class="axm-assist-renderer__dot"></span>
|
|
6452
|
-
</div>
|
|
6453
|
-
}
|
|
6454
|
-
</div>
|
|
6455
|
-
} @else {
|
|
6456
|
-
@if (debugModeEnabled() && parsed().thinking) {
|
|
6457
|
-
<div class="axm-assist-renderer__accordion-group" axAccordionGroup [accordion]="false">
|
|
6458
|
-
<div
|
|
6459
|
-
class="axm-assist-renderer__thinking-accordion !mb-0"
|
|
6460
|
-
axAccordionItem
|
|
6461
|
-
#thinkAcc="axAccordionItem"
|
|
6462
|
-
[isCollapsed]="assistSectionIsCollapsed(assistThinkFinalKey())"
|
|
6463
|
-
(onClick)="onAssistAccordionClick($event, assistThinkFinalKey())"
|
|
6464
|
-
>
|
|
6465
|
-
<div
|
|
6466
|
-
class="axm-assist-renderer__accordion-header axm-assist-renderer__accordion-header--thinking"
|
|
6467
|
-
axAccordionItemHeader
|
|
6468
|
-
role="button"
|
|
6469
|
-
[attr.aria-expanded]="!thinkAcc.isCollapsed()"
|
|
6470
|
-
>
|
|
6471
|
-
<div class="axm-assist-renderer__accordion-header-main">
|
|
6472
|
-
<span class="axm-assist-renderer__accordion-header-title">
|
|
6473
|
-
<i
|
|
6474
|
-
class="fa-light fa-chevron-down axm-assist-renderer__thinking-chevron"
|
|
6475
|
-
[class.axm-assist-renderer__thinking-chevron--expanded]="!thinkAcc.isCollapsed()"
|
|
6476
|
-
aria-hidden="true"
|
|
6477
|
-
></i>
|
|
6478
|
-
{{ '@conversation:chat.assist-renderer.sections.thinking' | translate | async }}
|
|
6479
|
-
</span>
|
|
6480
|
-
</div>
|
|
6481
|
-
<ax-badge
|
|
6482
|
-
[look]="'twotone'"
|
|
6483
|
-
[text]="('@conversation:chat.assist-renderer.badges.internal' | translate | async) ?? ''"
|
|
6484
|
-
[color]="'warning'"
|
|
6485
|
-
></ax-badge>
|
|
6486
|
-
</div>
|
|
6487
|
-
<div axAccordionItemContent>
|
|
6488
|
-
<div
|
|
6489
|
-
class="axm-assist-renderer__thinking-body axm-assist-bot__segment"
|
|
6490
|
-
[attr.dir]="segmentDir(parsed().thinking)"
|
|
6491
|
-
>
|
|
6492
|
-
{{ parsed().thinking }}
|
|
6493
|
-
</div>
|
|
6494
|
-
</div>
|
|
6495
|
-
</div>
|
|
6496
|
-
</div>
|
|
6497
|
-
}
|
|
6498
|
-
@if (debugModeEnabled() && toolCalls().length) {
|
|
6499
|
-
<div class="axm-assist-renderer__tools">
|
|
6500
|
-
@for (tc of toolCalls(); track tc.id) {
|
|
6501
|
-
<div class="axm-assist-renderer__accordion-group" axAccordionGroup [accordion]="false">
|
|
6502
|
-
<div
|
|
6503
|
-
class="axm-assist-renderer__tool-card !mb-0"
|
|
6504
|
-
axAccordionItem
|
|
6505
|
-
#legacyDoneDbgAcc="axAccordionItem"
|
|
6506
|
-
[isCollapsed]="assistSectionIsCollapsed(assistLegacyToolAccordionKey(tc))"
|
|
6507
|
-
(onClick)="onAssistLegacyAccordionClick($event, tc)"
|
|
6508
|
-
>
|
|
6509
|
-
<div class="axm-assist-renderer__accordion-header" axAccordionItemHeader>
|
|
6510
|
-
<div class="axm-assist-renderer__accordion-header-main">
|
|
6511
|
-
<span class="axm-assist-renderer__accordion-header-title">
|
|
6512
|
-
<i
|
|
6513
|
-
class="fa-light fa-chevron-down axm-assist-renderer__thinking-chevron"
|
|
6514
|
-
[class.axm-assist-renderer__thinking-chevron--expanded]="!legacyDoneDbgAcc.isCollapsed()"
|
|
6515
|
-
aria-hidden="true"
|
|
6516
|
-
></i>
|
|
6517
|
-
<i class="fa-light fa-screwdriver-wrench axm-assist-renderer__tool-title-icon"></i>
|
|
6518
|
-
{{ resolveToolDisplayTitle(tc.name) }}
|
|
6519
|
-
</span>
|
|
6520
|
-
</div>
|
|
6521
|
-
<span
|
|
6522
|
-
class="axm-assist-renderer__accordion-header-badge axm-assist-renderer__accordion-header-badge--success"
|
|
6523
|
-
>
|
|
6524
|
-
<ax-badge
|
|
6525
|
-
[look]="'twotone'"
|
|
6526
|
-
[text]="
|
|
6527
|
-
(resolveToolBadge(tc.name, '@conversation:chat.assist-renderer.badges.done')
|
|
6528
|
-
| translate
|
|
6529
|
-
| async) ?? ''
|
|
6530
|
-
"
|
|
6531
|
-
[color]="'success'"
|
|
6532
|
-
></ax-badge>
|
|
6533
|
-
</span>
|
|
6534
|
-
</div>
|
|
6535
|
-
<div axAccordionItemContent>
|
|
6536
|
-
<div class="axm-assist-renderer__tool-body">
|
|
6537
|
-
<div class="axm-assist-renderer__tool-section-label">
|
|
6538
|
-
{{ '@conversation:chat.assist-renderer.sections.input' | translate | async }}
|
|
6539
|
-
</div>
|
|
6540
|
-
<div class="axm-assist-renderer__tool-editor-wrap" style="direction: ltr;">
|
|
6541
|
-
<ax-code-editor
|
|
6542
|
-
[ngModel]="formatArgs(tc.arguments)"
|
|
6543
|
-
[readonly]="true"
|
|
6544
|
-
language="json"
|
|
6545
|
-
[lineNumbers]="true"
|
|
6546
|
-
class="axm-assist-renderer__tool-editor"
|
|
6547
|
-
></ax-code-editor>
|
|
6548
|
-
</div>
|
|
6549
|
-
@if (tc.nestedStreamText?.trim()) {
|
|
6550
|
-
<div
|
|
6551
|
-
class="axm-assist-renderer__text axm-assist-bot__segment pt-1"
|
|
6552
|
-
[attr.dir]="segmentDir(tc.nestedStreamText ?? '')"
|
|
6553
|
-
>
|
|
6554
|
-
{{ tc.nestedStreamText }}
|
|
6555
|
-
</div>
|
|
6556
|
-
}
|
|
6557
|
-
@if (tc.output) {
|
|
6558
|
-
<div class="axm-assist-renderer__tool-section-label">
|
|
6559
|
-
{{ '@conversation:chat.assist-renderer.sections.output' | translate | async }}
|
|
6560
|
-
</div>
|
|
6561
|
-
<div class="axm-assist-renderer__tool-editor-wrap" style="direction: ltr;">
|
|
6562
|
-
<ax-code-editor
|
|
6563
|
-
[ngModel]="formatJson(tc.output)"
|
|
6564
|
-
[readonly]="true"
|
|
6565
|
-
language="json"
|
|
6566
|
-
[lineNumbers]="true"
|
|
6567
|
-
class="axm-assist-renderer__tool-editor"
|
|
6568
|
-
></ax-code-editor>
|
|
6569
|
-
</div>
|
|
6570
|
-
}
|
|
6571
|
-
</div>
|
|
6572
|
-
</div>
|
|
6573
|
-
</div>
|
|
6574
|
-
</div>
|
|
6575
|
-
}
|
|
6576
|
-
</div>
|
|
6577
|
-
}
|
|
6578
|
-
@if (parsed().body) {
|
|
6579
|
-
<div
|
|
6580
|
-
class="axm-assist-renderer__text axm-assist-bot__segment axm-assist-renderer__markdown"
|
|
6581
|
-
[attr.dir]="segmentDir(parsed().body)"
|
|
6582
|
-
[innerHTML]="renderMarkdown(parsed().body)"
|
|
6583
|
-
></div>
|
|
6584
|
-
}
|
|
6585
|
-
}
|
|
6586
|
-
}
|
|
6587
|
-
</div>
|
|
6588
|
-
`, styles: [".axm-assist-renderer{display:flex;flex-direction:column;gap:.5rem}.axm-assist-bot{display:flex;flex-direction:column;gap:.75rem}.axm-assist-bot__segment{unicode-bidi:isolate;font-size:.95rem;line-height:1.8;letter-spacing:.002em;color:rgb(var(--ax-sys-color-on-surface));text-wrap:pretty}.axm-assist-bot__line--user{align-self:flex-end}.axm-assist-bot__line--tool-role{align-self:stretch}.axm-assist-bot__tool-result{border-radius:.5rem;border:1px solid var(--ax-color-border-default, rgba(0, 0, 0, .1));background:var(--ax-color-surface, rgba(0, 0, 0, .02));padding:.5rem .75rem}.axm-assist-bot__fallback{font-size:.88rem;line-height:1.75;white-space:pre-wrap;word-break:break-word;opacity:.9}.axm-assist-renderer__cursor{display:inline-block;inline-size:6px;block-size:1em;margin-inline-start:2px;background:var(--ax-color-primary-500);border-radius:1px;animation:axm-blink .8s steps(2) infinite;vertical-align:text-bottom}@keyframes axm-blink{0%{opacity:1}50%{opacity:0}}.axm-assist-renderer__stream-content{display:flex;flex-direction:column;gap:.5rem}.axm-assist-renderer__streaming-activity{display:flex;align-items:center;gap:.5rem;padding-block:.15rem}.axm-assist-renderer__activity-label{line-height:1.45}.axm-assist-renderer__text{white-space:pre-line;word-break:break-word;line-height:1.85;font-size:.95rem;letter-spacing:.002em;text-wrap:pretty}.axm-assist-bot__segment ax-conversation-text-renderer{display:block}.axm-assist-bot__segment ax-conversation-text-renderer :is(p,ul,ol){margin-block:.45rem}.axm-assist-bot__segment ax-conversation-text-renderer li{line-height:1.8}.axm-assist-renderer__markdown :is(h1,h2,h3,h4,h5,h6){margin:.55rem 0 .35rem;line-height:1.35;font-weight:600}.axm-assist-renderer__markdown p{margin:.35rem 0}.axm-assist-renderer__markdown ul{margin:.4rem 0;padding-inline-start:1.1rem}.axm-assist-renderer__markdown blockquote{margin:.5rem 0;padding-inline:.65rem .5rem;border-inline-start:3px solid rgba(var(--ax-sys-color-primary),.35);background:rgba(var(--ax-sys-color-primary),.06);border-radius:.25rem}.axm-assist-renderer__markdown code{font-family:var(--ax-font-mono, monospace);font-size:.9em;padding:.1rem .3rem;border-radius:.25rem;background:var(--ax-color-ghost, rgba(0, 0, 0, .06))}.axm-assist-renderer__accordion-group{width:100%}.axm-assist-renderer__accordion-header{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.625rem .75rem;cursor:pointer;background-color:var(--color-lighter);color:var(--color-on-lighter);border-color:var(--color-border-lighter)}.axm-assist-renderer__accordion-header-main{min-inline-size:0;display:flex;flex-direction:column;gap:.1rem}.axm-assist-renderer__accordion-header-title{font-size:.78rem;line-height:1.2;font-weight:600;color:var(--ax-color-text-primary, #111827);display:inline-flex;align-items:center;gap:.35rem}.axm-assist-renderer__accordion-header-badge{flex-shrink:0}.axm-assist-renderer__accordion-header-badge--primary{background:rgba(var(--ax-sys-color-primary),.12);border-color:rgba(var(--ax-sys-color-primary),.25);color:rgb(var(--ax-sys-color-primary))}.axm-assist-renderer__accordion-header-badge--success{background:#16a34a1f;border-color:#16a34a40;color:#15803d}.axm-assist-renderer__accordion-header-badge--danger{background:#dc26261f;border-color:#dc262640;color:#b91c1c}.axm-assist-renderer__accordion-header--thinking{background:linear-gradient(180deg,#f59e0b1f,#f59e0b0a),var(--ax-color-surface, #fff)}.axm-assist-renderer__thinking-chevron{display:inline-block;font-size:.65rem;opacity:.75;transition:transform .2s ease;line-height:1;flex-shrink:0}.axm-assist-renderer__thinking-chevron--expanded{transform:rotate(180deg)}.axm-assist-renderer__thinking-body{padding:0 .75rem .625rem;font-size:.75rem;color:var(--ax-color-text-muted, #888);white-space:pre-wrap;word-break:break-word;line-height:1.5;border-block-start:1px solid var(--ax-color-border-default, rgba(0, 0, 0, .06));padding-block-start:.5rem}.axm-assist-renderer__tools{display:flex;flex-direction:column;gap:.375rem}.axm-assist-renderer__tool-card{border-radius:.5rem;border:1px solid var(--ax-color-border-default, rgba(0, 0, 0, .08));background:var(--ax-color-surface, rgba(255, 255, 255, .6));overflow:hidden}.axm-assist-renderer__tool-body{padding:.5rem .75rem .625rem;border-block-start:1px solid var(--ax-color-border-default, rgba(0, 0, 0, .06));display:flex;flex-direction:column;gap:.25rem}.axm-assist-renderer__tool-section-label{font-size:.625rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--ax-color-text-muted, #888)}.axm-assist-renderer__tool-pre{margin:0;max-block-size:10rem;overflow:auto;border-radius:.375rem;background:var(--ax-color-ghost, rgba(0, 0, 0, .03));padding:.5rem;font-family:var(--ax-font-mono, monospace);font-size:.675rem;line-height:1.45;white-space:pre-wrap;word-break:break-word}.axm-assist-renderer__tool-editor-wrap{border-radius:.375rem;overflow:hidden}.axm-assist-renderer__waiting{display:flex;gap:.25rem;padding:.25rem 0}.axm-assist-renderer__dot{inline-size:6px;block-size:6px;border-radius:50%;background:var(--ax-color-text-muted, #999);animation:axm-blink 1.2s ease-in-out infinite}.axm-assist-renderer__dot:nth-child(2){animation-delay:.2s}.axm-assist-renderer__dot:nth-child(3){animation-delay:.4s}.axm-assist-renderer__agent-live-block{border-radius:.75rem;border:1px solid var(--ax-color-border-default, rgba(0, 0, 0, .1));background:var(--ax-color-surface, rgba(255, 255, 255, .72));padding:.75rem .875rem;display:flex;flex-direction:column;gap:.65rem;max-inline-size:min(42rem,100%)}.axm-assist-renderer__agent-live-block--in-accordion{border:none;border-radius:0;background:transparent;padding:.5rem 0 0;max-inline-size:none}.axm-assist-renderer__agent-live-header{display:flex;align-items:center;flex-wrap:wrap;gap:.5rem}.axm-assist-renderer__agent-live-title{font-size:.8125rem;font-weight:600;color:var(--ax-color-text-primary, #111827);flex:1;min-inline-size:0}.axm-assist-renderer__agent-live-prompt{font-size:.8125rem;line-height:1.55;white-space:pre-wrap;word-break:break-word;padding:.5rem .75rem;border-radius:1.25rem;background:var(--ax-color-ghost, rgba(0, 0, 0, .05));align-self:flex-end;max-inline-size:min(92%,36rem)}.axm-assist-renderer__agent-live-stream{font-size:.8125rem;line-height:1.55;white-space:pre-line;word-break:break-word;padding-block-start:.15rem}.axm-assist-renderer__agent-live-nested-tools{display:flex;flex-direction:column;gap:.35rem;padding-block-start:.15rem;border-block-start:1px solid var(--ax-color-border-default, rgba(0, 0, 0, .08))}.axm-assist-renderer__agent-live-nested-row{display:flex;align-items:center;gap:.45rem;font-size:.72rem}.axm-assist-renderer__agent-live-nested-name{font-family:var(--ax-font-mono, monospace);font-size:.7rem;flex:1;min-inline-size:0;overflow:hidden;text-overflow:ellipsis}.axm-assist-renderer__agent-live-nested-status{color:var(--ax-color-text-muted, #888);flex-shrink:0}\n/*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */\n"] }]
|
|
5503
|
+
DecimalPipe,
|
|
5504
|
+
], template: "<div class=\"axm-assist-renderer\">\n @if (showDebugUi() && useTranscriptUi()) {\n <div\n class=\"axm-assist-bot\"\n role=\"region\"\n [attr.aria-label]=\"('@conversation:chat.assist-renderer.aria.assistant-response' | translate | async) ?? ''\"\n >\n @for (item of visibleTranscriptLines(); track item.lineIndex) {\n @let line = item.line;\n @let lineIndex = item.lineIndex;\n <div\n class=\"axm-assist-bot__line\"\n [class.axm-assist-bot__line--user]=\"line.role === 'user'\"\n [class.axm-assist-bot__line--tool-role]=\"line.role === 'tool'\"\n >\n @for (seg of line.responses; track segIndex; let segIndex = $index) {\n @if (line.role === 'user' && seg.type === 'file') {\n <axm-assist-bot-image-line\n [parentMessage]=\"message()\"\n [fileId]=\"seg.content.fileId\"\n [mimeType]=\"seg.content.mimeType\"\n [name]=\"seg.content.name\"\n />\n } @else if (line.role === 'user' && seg.type === 'text') {\n <div class=\"axm-assist-bot__segment\" [attr.dir]=\"segmentDir(seg.content)\">\n <ax-conversation-text-renderer [message]=\"syntheticTextMessage(lineIndex, segIndex, seg.content)\" />\n </div>\n } @else if (line.role === 'assistant' && seg.type === 'think' && showDebugUi()) {\n <div class=\"axm-assist-renderer__accordion-group\" axAccordionGroup [accordion]=\"false\">\n <div\n class=\"axm-assist-renderer__thinking-accordion axm-assist-renderer__collapse-shell !ax-mb-0\"\n axAccordionItem\n #thinkAcc=\"axAccordionItem\"\n [isCollapsed]=\"assistSectionIsCollapsed(assistThinkKey(lineIndex, segIndex))\"\n (onClick)=\"onAssistAccordionClick($event, assistThinkKey(lineIndex, segIndex))\"\n >\n <div\n class=\"axm-assist-renderer__accordion-header\"\n axAccordionItemHeader\n role=\"button\"\n [attr.aria-expanded]=\"!thinkAcc.isCollapsed()\"\n >\n <div class=\"axm-assist-renderer__accordion-header-main\">\n <span class=\"axm-assist-renderer__accordion-header-title\">\n <i\n class=\"fa-light fa-chevron-down axm-assist-renderer__thinking-chevron\"\n [class.axm-assist-renderer__thinking-chevron--expanded]=\"!thinkAcc.isCollapsed()\"\n aria-hidden=\"true\"\n ></i>\n <i class=\"fa-light fa-brain axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n {{ '@conversation:chat.assist-renderer.sections.thinking' | translate | async }}\n </span>\n </div>\n </div>\n <div axAccordionItemContent>\n <div class=\"axm-assist-renderer__collapse-body\">\n <div\n class=\"axm-assist-renderer__thinking-body axm-assist-bot__segment\"\n [attr.dir]=\"segmentDir(seg.content)\"\n >\n {{ seg.content }}\n </div>\n </div>\n </div>\n </div>\n </div>\n } @else if (line.role === 'assistant' && seg.type === 'text') {\n @let parsedLine = parseAssistLineText(seg.content);\n @let displayBody = assistTranscriptAssistantTextBodyForDisplay(line, parsedLine.body);\n @if (showDebugUi() && parsedLine.thinking) {\n <div class=\"axm-assist-renderer__accordion-group\" axAccordionGroup [accordion]=\"false\">\n <div\n class=\"axm-assist-renderer__thinking-accordion axm-assist-renderer__collapse-shell !ax-mb-0\"\n axAccordionItem\n #thinkAcc=\"axAccordionItem\"\n [isCollapsed]=\"assistSectionIsCollapsed(assistThinkKey(lineIndex, segIndex))\"\n (onClick)=\"onAssistAccordionClick($event, assistThinkKey(lineIndex, segIndex))\"\n >\n <div\n class=\"axm-assist-renderer__accordion-header\"\n axAccordionItemHeader\n role=\"button\"\n [attr.aria-expanded]=\"!thinkAcc.isCollapsed()\"\n >\n <div class=\"axm-assist-renderer__accordion-header-main\">\n <span class=\"axm-assist-renderer__accordion-header-title\">\n <i\n class=\"fa-light fa-chevron-down axm-assist-renderer__thinking-chevron\"\n [class.axm-assist-renderer__thinking-chevron--expanded]=\"!thinkAcc.isCollapsed()\"\n aria-hidden=\"true\"\n ></i>\n <i class=\"fa-light fa-brain axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n {{ '@conversation:chat.assist-renderer.sections.thinking' | translate | async }}\n </span>\n </div>\n </div>\n <div axAccordionItemContent>\n <div class=\"axm-assist-renderer__collapse-body\">\n <div\n class=\"axm-assist-renderer__thinking-body axm-assist-bot__segment\"\n [attr.dir]=\"segmentDir(parsedLine.thinking)\"\n >\n {{ parsedLine.thinking }}\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n @if (displayBody.trim()) {\n <div class=\"axm-assist-bot__segment axm-assist-renderer__markdown\" [attr.dir]=\"segmentDir(displayBody)\">\n <axp-markdown-viewer [markdown]=\"displayBody\">\n <ng-template axpMarkdownTemplate=\"code\" let-segment>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"markdownCodeValue(segment)\"\n [readonly]=\"true\"\n [language]=\"markdownCodeLanguage(segment)\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n </ng-template>\n </axp-markdown-viewer>\n </div>\n }\n } @else if (\n line.role === 'assistant' &&\n (seg.type === 'agent' || seg.type === 'tool') &&\n isDelegatedAgentCommand(seg.content.command)\n ) {\n @if (showDebugUi()) {\n <div class=\"axm-assist-renderer__accordion-group\" axAccordionGroup [accordion]=\"false\">\n <div\n class=\"axm-assist-renderer__tool-card axm-assist-renderer__collapse-shell !ax-mb-0\"\n axAccordionItem\n #agentDebugAcc=\"axAccordionItem\"\n [isCollapsed]=\"assistSectionIsCollapsed(assistAgentKey(seg.callId))\"\n (onClick)=\"onAssistAccordionClick($event, assistAgentKey(seg.callId))\"\n >\n <div class=\"axm-assist-renderer__accordion-header\" axAccordionItemHeader>\n <div class=\"axm-assist-renderer__accordion-header-main\">\n <span class=\"axm-assist-renderer__accordion-header-title\">\n <i\n class=\"fa-light fa-chevron-down axm-assist-renderer__thinking-chevron\"\n [class.axm-assist-renderer__thinking-chevron--expanded]=\"!agentDebugAcc.isCollapsed()\"\n aria-hidden=\"true\"\n ></i>\n <i class=\"fa-light fa-screwdriver-wrench axm-assist-renderer__tool-title-icon\"></i>\n {{ resolveToolDisplayTitle(seg.content.command) }}\n </span>\n </div>\n <div class=\"axm-assist-renderer__header-trailing\">\n <span\n class=\"axm-assist-renderer__header-actions\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n >\n <ax-button\n look=\"outline\"\n class=\"ax-sm\"\n [text]=\"\n ('@conversation:chat.assist-renderer.delegated-agent.detail' | translate | async) ?? ''\n \"\n [attr.aria-label]=\"\n ('@conversation:chat.assist-renderer.delegated-agent.detail-aria' | translate | async) ??\n ''\n \"\n (onClick)=\"\n openDelegatedAgentTranscriptDialog(\n seg.callId,\n seg.content.command,\n delegatedAgentLabelForCall(seg.callId)\n )\n \"\n ></ax-button>\n </span>\n <span class=\"axm-assist-renderer__badge axm-assist-renderer__badge--primary\">{{\n (resolveToolBadge(seg.content.command, '@conversation:chat.assist-renderer.badges.agent')\n | translate\n | async) ?? ''\n }}</span>\n </div>\n </div>\n <div axAccordionItemContent>\n <div class=\"axm-assist-renderer__collapse-body\">\n <div class=\"axm-assist-renderer__tool-body\">\n <div class=\"axm-assist-renderer__tool-section-label\">\n {{ '@conversation:chat.assist-renderer.sections.input' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"formatArgs(seg.content.arguments)\"\n [readonly]=\"true\"\n language=\"json\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n @if (toolResultForCallId(seg.callId); as resultLine) {\n <div class=\"axm-assist-renderer__tool-section-label\">\n {{ '@conversation:chat.assist-renderer.sections.output' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"formatToolResultBody(resultLine)\"\n [readonly]=\"true\"\n language=\"json\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n } @else {\n @let res = toolResultForCallId(seg.callId);\n @let outcomeSegs = delegatedAgentOutcomeSegmentsForCall(res);\n @if (outcomeSegs.length > 0) {\n @for (outSeg of outcomeSegs; track $index) {\n @switch (outSeg.type) {\n @case ('text') {\n @let parsedOut = parseAssistLineText(outSeg.content);\n @if (parsedOut.body.trim()) {\n <div\n class=\"axm-assist-bot__segment axm-assist-renderer__markdown\"\n [attr.dir]=\"segmentDir(parsedOut.body)\"\n >\n <axp-markdown-viewer [markdown]=\"parsedOut.body\">\n <ng-template axpMarkdownTemplate=\"code\" let-segment>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"markdownCodeValue(segment)\"\n [readonly]=\"true\"\n [language]=\"markdownCodeLanguage(segment)\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n </ng-template>\n </axp-markdown-viewer>\n </div>\n }\n }\n @case ('think') {\n @if (showDebugUi()) {\n <div class=\"axm-assist-bot__segment\" [attr.dir]=\"segmentDir(outSeg.content)\">\n {{ outSeg.content }}\n </div>\n }\n }\n @case ('file') {\n <axm-assist-bot-image-line\n [parentMessage]=\"message()\"\n [fileId]=\"outSeg.content.fileId\"\n [mimeType]=\"outSeg.content.mimeType\"\n [name]=\"outSeg.content.name\"\n />\n }\n @case ('node') {\n @let assistNodeWidget = axmAssistWidgetNodeFromUnknown(outSeg.content);\n @if (assistNodeWidget) {\n <div class=\"axm-assist-bot__segment\" dir=\"auto\">\n <axm-chat-user-form-renderer\n [message]=\"syntheticNodeEmbedMessage(lineIndex, segIndex * 1000 + $index, outSeg.content)\"\n />\n </div>\n }\n }\n }\n }\n } @else if (delegatedAgentAnswerForCall(res).trim()) {\n @let agentFallbackText = delegatedAgentAnswerForCall(res);\n <div\n class=\"axm-assist-bot__segment axm-assist-renderer__markdown\"\n [attr.dir]=\"segmentDir(agentFallbackText)\"\n >\n <axp-markdown-viewer [markdown]=\"agentFallbackText\">\n <ng-template axpMarkdownTemplate=\"code\" let-segment>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"markdownCodeValue(segment)\"\n [readonly]=\"true\"\n [language]=\"markdownCodeLanguage(segment)\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n </ng-template>\n </axp-markdown-viewer>\n </div>\n }\n }\n } @else if (line.role === 'assistant' && seg.type === 'tool' && showDebugUi()) {\n <div class=\"axm-assist-renderer__accordion-group\" axAccordionGroup [accordion]=\"false\">\n <div\n class=\"axm-assist-renderer__tool-card axm-assist-renderer__collapse-shell !ax-mb-0\"\n axAccordionItem\n #toolDebugAcc=\"axAccordionItem\"\n [isCollapsed]=\"assistSectionIsCollapsed(assistToolKey(seg.callId))\"\n (onClick)=\"onAssistAccordionClick($event, assistToolKey(seg.callId))\"\n >\n <div class=\"axm-assist-renderer__accordion-header\" axAccordionItemHeader>\n <div class=\"axm-assist-renderer__accordion-header-main\">\n <span class=\"axm-assist-renderer__accordion-header-title\">\n <i\n class=\"fa-light fa-chevron-down axm-assist-renderer__thinking-chevron\"\n [class.axm-assist-renderer__thinking-chevron--expanded]=\"!toolDebugAcc.isCollapsed()\"\n aria-hidden=\"true\"\n ></i>\n <i class=\"fa-light fa-screwdriver-wrench axm-assist-renderer__tool-title-icon\"></i>\n {{ resolveToolDisplayTitle(seg.content.command) }}\n </span>\n </div>\n <span class=\"axm-assist-renderer__badge axm-assist-renderer__badge--primary\">{{\n (resolveToolBadge(seg.content.command, '@conversation:chat.assist-renderer.badges.tool')\n | translate\n | async) ?? ''\n }}</span>\n </div>\n <div axAccordionItemContent>\n <div class=\"axm-assist-renderer__collapse-body\">\n <div class=\"axm-assist-renderer__tool-body\">\n <div class=\"axm-assist-renderer__tool-section-label\">\n {{ '@conversation:chat.assist-renderer.sections.input' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"formatArgs(seg.content.arguments)\"\n [readonly]=\"true\"\n language=\"json\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n @if (toolResultForCallId(seg.callId); as resultLine) {\n <div class=\"axm-assist-renderer__tool-section-label\">\n {{ '@conversation:chat.assist-renderer.sections.output' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"formatToolResultBody(resultLine)\"\n [readonly]=\"true\"\n language=\"json\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n } @else if (line.role === 'assistant' && seg.type === 'node') {\n @let assistNodeWidget = axmAssistWidgetNodeFromUnknown(seg.content);\n @if (assistNodeWidget) {\n <div class=\"axm-assist-bot__segment\" dir=\"auto\">\n <axm-chat-user-form-renderer\n [message]=\"syntheticNodeEmbedMessage(lineIndex, segIndex, seg.content)\"\n />\n </div>\n }\n } @else if (line.role === 'assistant' && seg.type === 'file') {\n <axm-assist-bot-image-line\n [parentMessage]=\"message()\"\n [fileId]=\"seg.content.fileId\"\n [mimeType]=\"seg.content.mimeType\"\n [name]=\"seg.content.name\"\n />\n } @else if (line.role === 'tool' && (seg.type === 'tool_result' || seg.type === 'agent_result')) {\n <!-- merged into the corresponding tool/agent accordion -->\n } @else if (line.role === 'system' && seg.type === 'text' && showDebugUi()) {\n <div class=\"axm-assist-bot__segment\" [attr.dir]=\"segmentDir(seg.content)\">\n <ax-conversation-text-renderer [message]=\"syntheticTextMessage(lineIndex, segIndex, seg.content)\" />\n </div>\n } @else {\n @if (showDebugUi() || line.role !== 'assistant') {\n <div\n class=\"axm-assist-bot__fallback axm-assist-bot__segment\"\n [attr.dir]=\"segmentDir(formatFallbackSegment(seg))\"\n >\n {{ formatFallbackSegment(seg) }}\n </div>\n }\n }\n }\n </div>\n }\n @if (isStreaming()) {\n <div class=\"axm-assist-renderer__streaming-activity\" role=\"status\" aria-live=\"polite\">\n <span\n class=\"axm-assist-renderer__activity-spin inline-block w-3 h-3 rounded-full border-2 border-primary-500 border-t-transparent fa-spin shrink-0\"\n aria-hidden=\"true\"\n ></span>\n <span class=\"axm-assist-renderer__activity-label text-xs text-muted italic\">{{\n assistActivityMessageKey() | translate | async\n }}</span>\n </div>\n }\n <!-- @if (isStreaming() && streamText().trim()) {\n <span class=\"axm-assist-renderer__cursor\" aria-hidden=\"true\"></span>\n } -->\n </div>\n } @else if (!showDebugUi() && !isStreaming()) {\n @let pv = assistPayloadView();\n @if (pv.kind === 'node') {\n <div class=\"axm-assist-bot__segment\" dir=\"auto\">\n <axm-chat-user-form-renderer [message]=\"syntheticFinalPayloadNodeMessage(pv.content)\" />\n </div>\n } @else if (pv.kind === 'text' && parsed().body) {\n <div\n class=\"axm-assist-renderer__text axm-assist-bot__segment axm-assist-renderer__markdown\"\n [attr.dir]=\"segmentDir(parsed().body)\"\n >\n <axp-markdown-viewer [markdown]=\"parsed().body\">\n <ng-template axpMarkdownTemplate=\"code\" let-segment>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"markdownCodeValue(segment)\"\n [readonly]=\"true\"\n [language]=\"markdownCodeLanguage(segment)\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n </ng-template>\n </axp-markdown-viewer>\n </div>\n }\n } @else if (!showDebugUi() && isStreaming()) {\n <div class=\"axm-assist-renderer__stream-content axm-assist-renderer__stream-content--non-debug\">\n <div class=\"axm-assist-renderer__streaming-activity\" role=\"status\" aria-live=\"polite\">\n <span\n class=\"axm-assist-renderer__activity-spin inline-block w-3 h-3 rounded-full border-2 border-primary-500 border-t-transparent fa-spin shrink-0\"\n aria-hidden=\"true\"\n ></span>\n <span class=\"axm-assist-renderer__activity-label text-xs text-muted italic\">{{\n assistActivityMessageKey() | translate | async\n }}</span>\n </div>\n </div>\n } @else if (showDebugUi()) {\n @if (isStreaming()) {\n <div class=\"axm-assist-renderer__stream-content\">\n <div class=\"axm-assist-renderer__streaming-activity\" role=\"status\" aria-live=\"polite\">\n <span\n class=\"axm-assist-renderer__activity-spin inline-block w-3 h-3 rounded-full border-2 border-primary-500 border-t-transparent fa-spin shrink-0\"\n aria-hidden=\"true\"\n ></span>\n <span class=\"axm-assist-renderer__activity-label text-xs text-muted italic\">{{\n assistActivityMessageKey() | translate | async\n }}</span>\n </div>\n @if (streamThink().trim()) {\n <div class=\"axm-assist-renderer__accordion-group\" axAccordionGroup [accordion]=\"false\">\n <div\n class=\"axm-assist-renderer__thinking-accordion axm-assist-renderer__collapse-shell !ax-mb-0\"\n axAccordionItem\n #thinkAcc=\"axAccordionItem\"\n [isCollapsed]=\"assistSectionIsCollapsed(assistThinkStreamKey())\"\n (onClick)=\"onAssistAccordionClick($event, assistThinkStreamKey())\"\n >\n <div\n class=\"axm-assist-renderer__accordion-header\"\n axAccordionItemHeader\n role=\"button\"\n [attr.aria-expanded]=\"!thinkAcc.isCollapsed()\"\n >\n <div class=\"axm-assist-renderer__accordion-header-main\">\n <span class=\"axm-assist-renderer__accordion-header-title\">\n <i\n class=\"fa-light fa-chevron-down axm-assist-renderer__thinking-chevron\"\n [class.axm-assist-renderer__thinking-chevron--expanded]=\"!thinkAcc.isCollapsed()\"\n aria-hidden=\"true\"\n ></i>\n <i class=\"fa-light fa-brain axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n {{ '@conversation:chat.assist-renderer.sections.thinking' | translate | async }}\n </span>\n </div>\n </div>\n <div axAccordionItemContent>\n <div class=\"axm-assist-renderer__collapse-body\">\n <div\n class=\"axm-assist-renderer__thinking-body axm-assist-bot__segment\"\n [attr.dir]=\"segmentDir(streamThink())\"\n >\n {{ streamThink() }}\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n @if (streamText()) {\n <div class=\"axm-assist-renderer__text axm-assist-bot__segment\" [attr.dir]=\"segmentDir(streamText())\">\n {{ streamText() }}\n </div>\n }\n @if (toolCalls().length) {\n <div class=\"axm-assist-renderer__tools\">\n @for (tc of toolCalls(); track tc.id) {\n @if (isDelegatedAgentCommand(tc.name)) {\n @let legacyAgentAns = delegatedAnswerFromToolOutputString(tc.output);\n <div class=\"axm-assist-renderer__accordion-group\" axAccordionGroup [accordion]=\"false\">\n <div\n class=\"axm-assist-renderer__tool-card axm-assist-renderer__agent-accordion axm-assist-renderer__collapse-shell\"\n axAccordionItem\n #legacyAgentAcc=\"axAccordionItem\"\n [isCollapsed]=\"assistSectionIsCollapsed(assistAgentKey(tc.id))\"\n (onClick)=\"onAssistAccordionClick($event, assistAgentKey(tc.id))\"\n >\n <div\n class=\"axm-assist-renderer__accordion-header\"\n axAccordionItemHeader\n role=\"button\"\n [attr.aria-expanded]=\"!legacyAgentAcc.isCollapsed()\"\n >\n <div class=\"axm-assist-renderer__accordion-header-main\">\n <span\n class=\"axm-assist-renderer__accordion-header-title inline-flex items-center gap-2 flex-wrap\"\n >\n <i\n class=\"fa-light fa-chevron-down axm-assist-renderer__thinking-chevron\"\n [class.axm-assist-renderer__thinking-chevron--expanded]=\"!legacyAgentAcc.isCollapsed()\"\n aria-hidden=\"true\"\n ></i>\n @if (tc.state === 'running') {\n <span\n class=\"axm-assist-renderer__agent-live-spin inline-block w-3 h-3 rounded-full border-2 border-primary-500 border-t-transparent fa-spin shrink-0\"\n aria-hidden=\"true\"\n ></span>\n } @else {\n <span\n class=\"inline-block w-3 h-3 rounded-full bg-success-500 shrink-0\"\n aria-hidden=\"true\"\n ></span>\n }\n <i class=\"fa-light fa-people-group text-primary-500\" aria-hidden=\"true\"></i>\n <span class=\"axm-assist-renderer__agent-live-title\">{{\n resolveToolDisplayTitle(tc.name)\n }}</span>\n </span>\n </div>\n <div class=\"axm-assist-renderer__header-trailing\">\n @if (tc.state !== 'running') {\n <span\n class=\"axm-assist-renderer__header-actions\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\"\n >\n <ax-button\n look=\"outline\"\n class=\"ax-sm\"\n [text]=\"\n ('@conversation:chat.assist-renderer.delegated-agent.detail' | translate | async) ?? ''\n \"\n [attr.aria-label]=\"\n ('@conversation:chat.assist-renderer.delegated-agent.detail-aria'\n | translate\n | async) ?? ''\n \"\n (onClick)=\"\n openDelegatedAgentTranscriptDialog(tc.id, tc.name, delegatedAgentLabelForCall(tc.id))\n \"\n ></ax-button>\n </span>\n }\n <span\n class=\"axm-assist-renderer__badge\"\n [class.axm-assist-renderer__badge--primary]=\"tc.state === 'running'\"\n [class.axm-assist-renderer__badge--success]=\"tc.state !== 'running'\"\n >\n {{\n (resolveToolBadge(\n tc.name,\n tc.state === 'running'\n ? '@conversation:chat.assist-renderer.badges.running'\n : '@conversation:chat.assist-renderer.badges.agent'\n )\n | translate\n | async) ?? ''\n }}\n </span>\n </div>\n </div>\n <div axAccordionItemContent>\n <div class=\"axm-assist-renderer__collapse-body\">\n <div\n class=\"axm-assist-renderer__agent-live-block axm-assist-renderer__agent-live-block--in-accordion\"\n role=\"region\"\n >\n <div\n class=\"axm-assist-renderer__agent-live-prompt\"\n [attr.dir]=\"segmentDir(delegatedPromptPreview(tc.arguments))\"\n >\n {{ delegatedPromptPreview(tc.arguments) }}\n </div>\n @if (tc.nestedStreamText?.trim()) {\n <div\n class=\"axm-assist-renderer__agent-live-stream\"\n [attr.dir]=\"segmentDir(tc.nestedStreamText ?? '')\"\n >\n {{ tc.nestedStreamText }}\n </div>\n }\n @if (tc.nestedTools?.length) {\n <div class=\"axm-assist-renderer__agent-live-nested-tools\">\n @for (nt of tc.nestedTools; track nt.id) {\n <div class=\"axm-assist-renderer__agent-live-nested-row\">\n @if (nt.state === 'running') {\n <span\n class=\"inline-block w-2.5 h-2.5 rounded-full border-2 border-primary-500 border-t-transparent fa-spin shrink-0\"\n aria-hidden=\"true\"\n ></span>\n } @else {\n <span\n class=\"inline-block w-2.5 h-2.5 rounded-full bg-success-500 shrink-0\"\n aria-hidden=\"true\"\n ></span>\n }\n <code class=\"axm-assist-renderer__agent-live-nested-name\">{{ nt.name }}</code>\n <span class=\"axm-assist-renderer__agent-live-nested-status\">{{\n nt.state === 'running' ? '\u2026' : '\u2713'\n }}</span>\n </div>\n }\n </div>\n }\n @if (legacyAgentAns) {\n <div class=\"axm-assist-renderer__agent-live-nested-tools\">\n <div class=\"axm-assist-renderer__tool-section-label\">\n {{ '@conversation:chat.assist-renderer.sections.agent-answer' | translate | async }}\n </div>\n <div\n class=\"axm-assist-renderer__agent-live-stream\"\n [attr.dir]=\"segmentDir(legacyAgentAns)\"\n >\n {{ legacyAgentAns }}\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n } @else {\n <div class=\"axm-assist-renderer__accordion-group\" axAccordionGroup [accordion]=\"false\">\n <div\n class=\"axm-assist-renderer__tool-card axm-assist-renderer__collapse-shell\"\n axAccordionItem\n #legacyStreamDbgAcc=\"axAccordionItem\"\n [isCollapsed]=\"assistSectionIsCollapsed(assistLegacyToolAccordionKey(tc))\"\n (onClick)=\"onAssistLegacyAccordionClick($event, tc)\"\n >\n <div class=\"axm-assist-renderer__accordion-header\" axAccordionItemHeader>\n <div class=\"axm-assist-renderer__accordion-header-main\">\n <span class=\"axm-assist-renderer__accordion-header-title\">\n <i\n class=\"fa-light fa-chevron-down axm-assist-renderer__thinking-chevron\"\n [class.axm-assist-renderer__thinking-chevron--expanded]=\"!legacyStreamDbgAcc.isCollapsed()\"\n aria-hidden=\"true\"\n ></i>\n <i class=\"fa-light fa-screwdriver-wrench axm-assist-renderer__tool-title-icon\"></i>\n {{ resolveToolDisplayTitle(tc.name) }}\n </span>\n </div>\n <span\n class=\"axm-assist-renderer__badge\"\n [class.axm-assist-renderer__badge--primary]=\"tc.state === 'running'\"\n [class.axm-assist-renderer__badge--success]=\"tc.state === 'done'\"\n >\n {{\n (resolveToolBadge(\n tc.name,\n tc.state === 'running'\n ? '@conversation:chat.assist-renderer.badges.running'\n : '@conversation:chat.assist-renderer.badges.done'\n )\n | translate\n | async) ?? ''\n }}\n </span>\n </div>\n <div axAccordionItemContent>\n <div class=\"axm-assist-renderer__collapse-body\">\n <div class=\"axm-assist-renderer__tool-body\">\n <div class=\"axm-assist-renderer__tool-section-label\">\n {{ '@conversation:chat.assist-renderer.sections.input' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"formatArgs(tc.arguments)\"\n [readonly]=\"true\"\n language=\"json\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n @if (tc.output) {\n <div class=\"axm-assist-renderer__tool-section-label\">\n {{ '@conversation:chat.assist-renderer.sections.output' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"formatJson(tc.output)\"\n [readonly]=\"true\"\n language=\"json\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n }\n </div>\n }\n @if (isStreaming() && streamText().trim()) {\n <span class=\"axm-assist-renderer__cursor\"></span>\n } @else if (isStreaming() && !streamText().trim() && !streamThink().trim() && !toolCalls().length) {\n <div class=\"axm-assist-renderer__waiting\">\n <span class=\"axm-assist-renderer__dot\"></span>\n <span class=\"axm-assist-renderer__dot\"></span>\n <span class=\"axm-assist-renderer__dot\"></span>\n </div>\n }\n </div>\n } @else {\n @if (parsed().thinking) {\n <div class=\"axm-assist-renderer__accordion-group\" axAccordionGroup [accordion]=\"false\">\n <div\n class=\"axm-assist-renderer__thinking-accordion axm-assist-renderer__collapse-shell !ax-mb-0\"\n axAccordionItem\n #thinkAcc=\"axAccordionItem\"\n [isCollapsed]=\"assistSectionIsCollapsed(assistThinkFinalKey())\"\n (onClick)=\"onAssistAccordionClick($event, assistThinkFinalKey())\"\n >\n <div\n class=\"axm-assist-renderer__accordion-header\"\n axAccordionItemHeader\n role=\"button\"\n [attr.aria-expanded]=\"!thinkAcc.isCollapsed()\"\n >\n <div class=\"axm-assist-renderer__accordion-header-main\">\n <span class=\"axm-assist-renderer__accordion-header-title\">\n <i\n class=\"fa-light fa-chevron-down axm-assist-renderer__thinking-chevron\"\n [class.axm-assist-renderer__thinking-chevron--expanded]=\"!thinkAcc.isCollapsed()\"\n aria-hidden=\"true\"\n ></i>\n <i class=\"fa-light fa-brain axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n {{ '@conversation:chat.assist-renderer.sections.thinking' | translate | async }}\n </span>\n </div>\n </div>\n <div axAccordionItemContent>\n <div class=\"axm-assist-renderer__collapse-body\">\n <div\n class=\"axm-assist-renderer__thinking-body axm-assist-bot__segment\"\n [attr.dir]=\"segmentDir(parsed().thinking)\"\n >\n {{ parsed().thinking }}\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n @if (toolCalls().length) {\n <div class=\"axm-assist-renderer__tools\">\n @for (tc of toolCalls(); track tc.id) {\n <div class=\"axm-assist-renderer__accordion-group\" axAccordionGroup [accordion]=\"false\">\n <div\n class=\"axm-assist-renderer__tool-card axm-assist-renderer__collapse-shell\"\n axAccordionItem\n #legacyDoneDbgAcc=\"axAccordionItem\"\n [isCollapsed]=\"assistSectionIsCollapsed(assistLegacyToolAccordionKey(tc))\"\n (onClick)=\"onAssistLegacyAccordionClick($event, tc)\"\n >\n <div class=\"axm-assist-renderer__accordion-header\" axAccordionItemHeader>\n <div class=\"axm-assist-renderer__accordion-header-main\">\n <span class=\"axm-assist-renderer__accordion-header-title\">\n <i\n class=\"fa-light fa-chevron-down axm-assist-renderer__thinking-chevron\"\n [class.axm-assist-renderer__thinking-chevron--expanded]=\"!legacyDoneDbgAcc.isCollapsed()\"\n aria-hidden=\"true\"\n ></i>\n <i class=\"fa-light fa-screwdriver-wrench axm-assist-renderer__tool-title-icon\"></i>\n {{ resolveToolDisplayTitle(tc.name) }}\n </span>\n </div>\n <span class=\"axm-assist-renderer__badge axm-assist-renderer__badge--success\">{{\n (resolveToolBadge(tc.name, '@conversation:chat.assist-renderer.badges.done') | translate | async) ??\n ''\n }}</span>\n </div>\n <div axAccordionItemContent>\n <div class=\"axm-assist-renderer__collapse-body\">\n <div class=\"axm-assist-renderer__tool-body\">\n <div class=\"axm-assist-renderer__tool-section-label\">\n {{ '@conversation:chat.assist-renderer.sections.input' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"formatArgs(tc.arguments)\"\n [readonly]=\"true\"\n language=\"json\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n @if (tc.nestedStreamText?.trim()) {\n <div\n class=\"axm-assist-renderer__text axm-assist-bot__segment pt-1\"\n [attr.dir]=\"segmentDir(tc.nestedStreamText ?? '')\"\n >\n {{ tc.nestedStreamText }}\n </div>\n }\n @if (tc.output) {\n <div class=\"axm-assist-renderer__tool-section-label\">\n {{ '@conversation:chat.assist-renderer.sections.output' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"formatJson(tc.output)\"\n [readonly]=\"true\"\n language=\"json\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n }\n @if (parsed().body && !assistNonDebugPayloadFinalShown()) {\n <div\n class=\"axm-assist-renderer__text axm-assist-bot__segment axm-assist-renderer__markdown\"\n [attr.dir]=\"segmentDir(parsed().body)\"\n >\n <axp-markdown-viewer [markdown]=\"parsed().body\">\n <ng-template axpMarkdownTemplate=\"code\" let-segment>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor\n [ngModel]=\"markdownCodeValue(segment)\"\n [readonly]=\"true\"\n [language]=\"markdownCodeLanguage(segment)\"\n [lineNumbers]=\"true\"\n class=\"axm-assist-renderer__tool-editor\"\n ></ax-code-editor>\n </div>\n </ng-template>\n </axp-markdown-viewer>\n </div>\n }\n }\n }\n @if (showDebugUi() && assistRunDebug(); as dbg) {\n <footer\n class=\"axm-assist-renderer__run-meta-wrap\"\n role=\"region\"\n [attr.aria-label]=\"('@conversation:chat.assist-renderer.aria.run-usage' | translate | async) ?? ''\"\n >\n <div class=\"axm-assist-renderer__accordion-group\" axAccordionGroup [accordion]=\"false\">\n <div\n class=\"axm-assist-renderer__thinking-accordion axm-assist-renderer__collapse-shell axm-assist-renderer__run-meta-accordion !ax-mb-0\"\n axAccordionItem\n #runMetaAcc=\"axAccordionItem\"\n [isCollapsed]=\"assistSectionIsCollapsed(assistRunMetaKey())\"\n (onClick)=\"onAssistAccordionClick($event, assistRunMetaKey())\"\n >\n <div\n class=\"axm-assist-renderer__accordion-header\"\n axAccordionItemHeader\n role=\"button\"\n [attr.aria-expanded]=\"!runMetaAcc.isCollapsed()\"\n >\n <div class=\"axm-assist-renderer__accordion-header-main\">\n <span class=\"axm-assist-renderer__accordion-header-title\">\n <i\n class=\"fa-light fa-chevron-down axm-assist-renderer__thinking-chevron\"\n [class.axm-assist-renderer__thinking-chevron--expanded]=\"!runMetaAcc.isCollapsed()\"\n aria-hidden=\"true\"\n ></i>\n <i class=\"fa-light fa-chart-line axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n {{ '@conversation:chat.assist-renderer.run-meta.title' | translate | async }}\n </span>\n <!-- @if (dbg.modelTitle || dbg.modelEntityId) {\n <span class=\"axm-assist-renderer__run-meta-header-sub\">{{ dbg.modelTitle || dbg.modelEntityId }}</span>\n } -->\n </div>\n </div>\n <div axAccordionItemContent>\n <div class=\"axm-assist-renderer__collapse-body\">\n <div class=\"axm-assist-renderer__run-meta axm-assist-renderer__run-meta--panel\">\n <div class=\"axm-assist-renderer__run-meta-grid\">\n @if (dbg.modelTitle || dbg.modelEntityId) {\n <div class=\"axm-assist-renderer__meta-tile axm-assist-renderer__meta-tile--wide\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@conversation:chat.assist-renderer.run-meta.model' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value\">{{ dbg.modelTitle || dbg.modelEntityId }}</div>\n <!-- @if (dbg.modelTitle && dbg.modelEntityId) {\n <div class=\"axm-assist-renderer__meta-tile-sub\">{{ dbg.modelEntityId }}</div>\n } -->\n </div>\n }\n @if (dbg.durationMs != null) {\n <div class=\"axm-assist-renderer__meta-tile\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@conversation:chat.assist-renderer.run-meta.duration' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value axm-assist-renderer__meta-tile-value--mono\">\n {{ formatAssistRunDuration(dbg.durationMs) }}\n </div>\n </div>\n }\n @if (dbg.usage; as totals) {\n <div class=\"axm-assist-renderer__meta-tile\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@ai-management:chat.usage-prompt' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value axm-assist-renderer__meta-tile-value--mono\">\n {{ totals.promptTokens | number }}\n @if (totals.cachedPromptTokens) {\n <span class=\"axm-assist-renderer__meta-tile-note\">\n (+{{ totals.cachedPromptTokens | number }}\n {{ '@ai-management:chat.usage-cached' | translate | async }})\n </span>\n }\n </div>\n </div>\n <div class=\"axm-assist-renderer__meta-tile\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@ai-management:chat.usage-completion' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value axm-assist-renderer__meta-tile-value--mono\">\n {{ totals.completionTokens | number }}\n </div>\n </div>\n <div class=\"axm-assist-renderer__meta-tile axm-assist-renderer__meta-tile--accent\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@conversation:chat.assist-renderer.run-meta.total-tokens' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value axm-assist-renderer__meta-tile-value--mono\">\n {{ totals.totalTokens | number }}\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </footer>\n }\n</div>\n", styles: [".axm-assist-renderer{display:flex;flex-direction:column;gap:.5rem}.axm-assist-bot{display:flex;flex-direction:column;gap:.75rem}.axm-assist-bot__segment{unicode-bidi:isolate;font-size:.95rem;line-height:1.8;letter-spacing:.002em;color:rgb(var(--ax-sys-color-on-surface));text-wrap:pretty}.axm-assist-bot__line--user{align-self:flex-end}.axm-assist-bot__line--tool-role{align-self:stretch}.axm-assist-bot__tool-result{border-radius:.5rem;background:rgb(var(--ax-sys-color-lighter-surface));padding:.5rem .75rem}.axm-assist-bot__fallback{font-size:.88rem;line-height:1.75;word-break:break-word;opacity:.9}.axm-assist-renderer__cursor{display:inline-block;inline-size:6px;block-size:1em;margin-inline-start:2px;background:rgb(var(--ax-sys-color-primary-500));border-radius:1px;animation:axm-blink .8s steps(2) infinite;vertical-align:text-bottom}@keyframes axm-blink{0%{opacity:1}50%{opacity:0}}.axm-assist-renderer__stream-content{display:flex;flex-direction:column;gap:.5rem}.axm-assist-renderer__streaming-activity{display:flex;align-items:center;gap:.5rem;padding-block:.15rem}.axm-assist-renderer__activity-label{line-height:1.45}.axm-assist-renderer__text{white-space:pre-line;word-break:break-word;line-height:1.85;font-size:.95rem;letter-spacing:.002em;text-wrap:pretty}.axm-assist-bot__segment ax-conversation-text-renderer{display:block}.axm-assist-bot__segment ax-conversation-text-renderer :is(p,ul,ol){margin-block:.45rem}.axm-assist-bot__segment ax-conversation-text-renderer li{line-height:1.8}.axm-assist-renderer__accordion-group{width:100%}.axm-assist-renderer__collapse-shell{border-radius:.625rem;overflow:hidden;background:rgb(var(--ax-sys-color-lighter-surface))}.axm-assist-renderer__collapse-body{margin:0;padding:0;border-radius:0 0 .5rem .5rem;background:transparent}.axm-assist-renderer__collapse-body>.axm-assist-renderer__agent-live-block--in-accordion{padding-inline:.5rem;padding-block-end:.35rem}.axm-assist-renderer__accordion-header{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.5rem .75rem;cursor:pointer;background:transparent;border:none;border-radius:.625rem .625rem 0 0;transition:background-color .15s ease}.axm-assist-renderer__collapse-shell>.axm-assist-renderer__accordion-header:hover{background:rgb(var(--ax-sys-color-light-surface))}.axm-assist-renderer__accordion-header-main{min-inline-size:0;display:flex;flex-direction:column;gap:.1rem}.axm-assist-renderer__accordion-header-title{font-size:.8125rem;line-height:1.25;font-weight:600;color:rgb(var(--ax-sys-color-on-surface));display:inline-flex;align-items:center;gap:.4rem}.axm-assist-renderer__header-trailing{flex-shrink:0;display:inline-flex;align-items:center;gap:.35rem}.axm-assist-renderer__header-actions{display:inline-flex;align-items:center}.axm-assist-renderer__badge{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;max-width:min(100%,14rem);padding:.1875rem .65rem;border-radius:9999px;font-size:.6875rem;font-weight:600;line-height:1.3;letter-spacing:.03em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.axm-assist-renderer__badge--warning{color:rgb(var(--ax-sys-color-on-warning-light-surface));background:rgb(var(--ax-sys-color-warning-100))}.axm-assist-renderer__badge--primary{color:rgb(var(--ax-sys-color-on-primary-lightest-surface));background:rgb(var(--ax-sys-color-primary-100))}.axm-assist-renderer__badge--success{color:rgb(var(--ax-sys-color-on-success-darker-surface));background:rgb(var(--ax-sys-color-success-100))}.axm-assist-renderer__thinking-chevron{display:inline-block;font-size:.65rem;opacity:.65;transition:transform .2s ease;line-height:1;flex-shrink:0}.axm-assist-renderer__thinking-chevron--expanded{transform:rotate(180deg)}.axm-assist-renderer__thinking-body{padding:.625rem .75rem .75rem;font-size:.78rem;color:rgb(var(--ax-sys-color-neutral-700));word-break:break-word;line-height:1.55}.axm-assist-renderer__tools{display:flex;flex-direction:column;gap:.5rem}.axm-assist-renderer__tool-card{border-radius:.625rem;overflow:hidden}.axm-assist-renderer__tool-body{padding:.625rem .75rem .75rem;display:flex;flex-direction:column;gap:.35rem}.axm-assist-renderer__tool-section-label{font-size:.625rem;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:rgb(var(--ax-sys-color-neutral-700))}.axm-assist-renderer__tool-pre{margin:0;max-block-size:10rem;overflow:auto;border-radius:.375rem;background:rgb(var(--ax-sys-color-light-surface));padding:.5rem;font-family:var(--ax-font-mono, monospace);font-size:.675rem;line-height:1.45;word-break:break-word}.axm-assist-renderer__run-meta-wrap{margin-block-start:.45rem}.axm-assist-renderer__run-meta-header-sub{font-size:.7rem;line-height:1.35;color:rgb(var(--ax-sys-color-neutral-700));white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.axm-assist-renderer__run-meta{margin-block-start:.45rem;padding:.55rem .65rem .6rem;border-radius:.625rem;background:rgb(var(--ax-sys-color-lighter-surface));display:flex;flex-direction:column;gap:.45rem}.axm-assist-renderer__run-meta--panel{margin-block-start:0;padding:.45rem .5rem .55rem;background:transparent;border-radius:0}.axm-assist-renderer__run-meta-grid{display:flex;gap:.4rem}.axm-assist-renderer__meta-tile{min-width:0;padding:.4rem .5rem .45rem;border-radius:.45rem;background:rgb(var(--ax-sys-color-light-surface))}.axm-assist-renderer__meta-tile--wide{grid-column:1 / -1}.axm-assist-renderer__meta-tile--accent{background:rgb(var(--ax-sys-color-primary-50))}.axm-assist-renderer__meta-tile-label{font-size:.6rem;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:rgb(var(--ax-sys-color-neutral-700));margin-block-end:.2rem}.axm-assist-renderer__meta-tile-value{font-size:.78rem;font-weight:600;line-height:1.35;color:rgb(var(--ax-sys-color-on-surface));word-break:break-word}.axm-assist-renderer__meta-tile-value--mono{font-variant-numeric:tabular-nums;font-feature-settings:\"tnum\" 1}.axm-assist-renderer__meta-tile-sub{margin-block-start:.15rem;font-size:.65rem;line-height:1.3;color:rgb(var(--ax-sys-color-neutral-700));font-family:var(--ax-font-mono, ui-monospace, monospace);word-break:break-all}.axm-assist-renderer__meta-tile-note{display:inline;margin-inline-start:.2rem;font-size:.65rem;font-weight:500;color:rgb(var(--ax-sys-color-success-700))}.axm-assist-renderer__tool-editor-wrap{border-radius:.375rem;overflow:hidden;background:rgb(var(--ax-sys-color-light-surface))}.axm-assist-renderer__waiting{display:flex;gap:.25rem;padding:.25rem 0}.axm-assist-renderer__dot{inline-size:6px;block-size:6px;border-radius:50%;background:rgb(var(--ax-sys-color-neutral-500));animation:axm-blink 1.2s ease-in-out infinite}.axm-assist-renderer__dot:nth-child(2){animation-delay:.2s}.axm-assist-renderer__dot:nth-child(3){animation-delay:.4s}.axm-assist-renderer__agent-live-block{border-radius:.75rem;background:rgb(var(--ax-sys-color-lighter-surface));padding:.75rem .875rem;display:flex;flex-direction:column;gap:.65rem;max-inline-size:min(42rem,100%)}.axm-assist-renderer__agent-live-block--in-accordion{background:rgb(var(--ax-sys-color-light-surface));border-radius:.5rem;padding:.5rem .55rem .55rem;max-inline-size:none}.axm-assist-renderer__agent-live-header{display:flex;align-items:center;flex-wrap:wrap;gap:.5rem}.axm-assist-renderer__agent-live-title{font-size:.8125rem;font-weight:600;color:rgb(var(--ax-sys-color-on-surface));flex:1;min-inline-size:0}.axm-assist-renderer__agent-live-prompt{font-size:.8125rem;line-height:1.55;word-break:break-word;padding:.5rem .75rem;border-radius:1.25rem;background:rgb(var(--ax-sys-color-lightest-surface));align-self:flex-end;max-inline-size:min(92%,36rem)}.axm-assist-renderer__agent-live-stream{font-size:.8125rem;line-height:1.55;white-space:pre-line;word-break:break-word;padding-block-start:.15rem}.axm-assist-renderer__agent-live-nested-tools{display:flex;flex-direction:column;gap:.35rem;padding-block-start:.35rem}.axm-assist-renderer__agent-live-nested-row{display:flex;align-items:center;gap:.45rem;font-size:.72rem}.axm-assist-renderer__agent-live-nested-name{font-family:var(--ax-font-mono, monospace);font-size:.7rem;flex:1;min-inline-size:0;overflow:hidden;text-overflow:ellipsis}.axm-assist-renderer__agent-live-nested-status{color:rgb(var(--ax-sys-color-neutral-600));flex-shrink:0}\n"] }]
|
|
6589
5505
|
}], propDecorators: { message: [{ type: i0.Input, args: [{ isSignal: true, alias: "message", required: true }] }] } });
|
|
6590
|
-
//#endregion
|
|
6591
|
-
//#region ---- Thinking Parser ----
|
|
6592
|
-
function parseAssistContent(raw) {
|
|
6593
|
-
if (!raw)
|
|
6594
|
-
return { thinking: null, body: '' };
|
|
6595
|
-
const normalized = raw.replace(/<(\/?redacted_thinking)>/gi, '<$1>');
|
|
6596
|
-
const parts = [];
|
|
6597
|
-
const body = normalized
|
|
6598
|
-
.replace(/<redacted_thinking>([\s\S]*?)<\/redacted_thinking>/gi, (_m, inner) => {
|
|
6599
|
-
const t = inner.trim();
|
|
6600
|
-
if (t)
|
|
6601
|
-
parts.push(t);
|
|
6602
|
-
return '';
|
|
6603
|
-
})
|
|
6604
|
-
.trim();
|
|
6605
|
-
return { thinking: parts.length ? parts.join('\n\n') : null, body };
|
|
6606
|
-
}
|
|
6607
5506
|
|
|
6608
5507
|
/**
|
|
6609
5508
|
* Renderer for AI assist (bot) responses.
|
|
@@ -6706,135 +5605,53 @@ const AXM_CONVERSATION_NODE_RENDERER = {
|
|
|
6706
5605
|
icon: 'fa-light fa-rectangle-list',
|
|
6707
5606
|
};
|
|
6708
5607
|
|
|
6709
|
-
class AXMAssistConversationRenameDialogComponent extends AXBasePageComponent {
|
|
6710
|
-
constructor() {
|
|
6711
|
-
super(...arguments);
|
|
6712
|
-
/** Set by {@link AXPopupService} from `data`. */
|
|
6713
|
-
this.titleValue = '';
|
|
6714
|
-
this.title = signal('', ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
|
|
6715
|
-
}
|
|
6716
|
-
ngOnInit() {
|
|
6717
|
-
this.title.set(this.titleValue ?? '');
|
|
6718
|
-
}
|
|
6719
|
-
onTitleChange(value) {
|
|
6720
|
-
this.title.set((value ?? '').toString());
|
|
6721
|
-
}
|
|
6722
|
-
canSave() {
|
|
6723
|
-
return this.title().trim().length > 0;
|
|
6724
|
-
}
|
|
6725
|
-
onCancel() {
|
|
6726
|
-
this.close(null);
|
|
6727
|
-
}
|
|
6728
|
-
onSave() {
|
|
6729
|
-
const nextTitle = this.title().trim();
|
|
6730
|
-
if (!nextTitle) {
|
|
6731
|
-
return;
|
|
6732
|
-
}
|
|
6733
|
-
this.close(nextTitle);
|
|
6734
|
-
}
|
|
6735
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMAssistConversationRenameDialogComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
6736
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.9", type: AXMAssistConversationRenameDialogComponent, isStandalone: true, selector: "axm-assist-conversation-rename-dialog", usesInheritance: true, ngImport: i0, template: `
|
|
6737
|
-
<div class="rename-dialog">
|
|
6738
|
-
123
|
|
6739
|
-
<ax-text-box
|
|
6740
|
-
[value]="title()"
|
|
6741
|
-
(valueChange)="onTitleChange($event)"
|
|
6742
|
-
[placeholder]="('@conversation:chat.assist-conversation.rename.placeholder' | translate | async) ?? ''"
|
|
6743
|
-
></ax-text-box>
|
|
6744
|
-
|
|
6745
|
-
<ax-footer class="rename-dialog__footer">
|
|
6746
|
-
<ax-suffix>
|
|
6747
|
-
<ax-button
|
|
6748
|
-
[look]="'solid'"
|
|
6749
|
-
[text]="('@conversation:comments.actions.cancel.title' | translate | async) ?? ''"
|
|
6750
|
-
(onClick)="onCancel()"
|
|
6751
|
-
></ax-button>
|
|
6752
|
-
<ax-button
|
|
6753
|
-
[look]="'solid'"
|
|
6754
|
-
[color]="'primary'"
|
|
6755
|
-
[disabled]="!canSave()"
|
|
6756
|
-
[text]="('@conversation:chat.assist-conversation.rename.actions.save' | translate | async) ?? ''"
|
|
6757
|
-
(onClick)="onSave()"
|
|
6758
|
-
></ax-button>
|
|
6759
|
-
</ax-suffix>
|
|
6760
|
-
</ax-footer>
|
|
6761
|
-
</div>
|
|
6762
|
-
`, isInline: true, styles: [":host{display:block}.rename-dialog{display:flex;flex-direction:column;gap:1rem;padding:1rem}.rename-dialog__footer{display:flex;justify-content:flex-end}.rename-dialog__footer>ax-suffix{display:flex;gap:.75rem}\n"], dependencies: [{ kind: "component", type: AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXTextBoxModule }, { kind: "component", type: i1$5.AXTextBoxComponent, selector: "ax-text-box", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "id", "placeholder", "maxLength", "allowNull", "type", "autoComplete", "look", "maskPattern", "customTokens", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "onMaskChanged"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i1$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i3$1.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
6763
|
-
}
|
|
6764
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMAssistConversationRenameDialogComponent, decorators: [{
|
|
6765
|
-
type: Component,
|
|
6766
|
-
args: [{ selector: 'axm-assist-conversation-rename-dialog', changeDetection: ChangeDetectionStrategy.OnPush, imports: [AXButtonComponent, AXTextBoxModule, AXDecoratorModule, AXTranslationModule, AsyncPipe], template: `
|
|
6767
|
-
<div class="rename-dialog">
|
|
6768
|
-
123
|
|
6769
|
-
<ax-text-box
|
|
6770
|
-
[value]="title()"
|
|
6771
|
-
(valueChange)="onTitleChange($event)"
|
|
6772
|
-
[placeholder]="('@conversation:chat.assist-conversation.rename.placeholder' | translate | async) ?? ''"
|
|
6773
|
-
></ax-text-box>
|
|
6774
|
-
|
|
6775
|
-
<ax-footer class="rename-dialog__footer">
|
|
6776
|
-
<ax-suffix>
|
|
6777
|
-
<ax-button
|
|
6778
|
-
[look]="'solid'"
|
|
6779
|
-
[text]="('@conversation:comments.actions.cancel.title' | translate | async) ?? ''"
|
|
6780
|
-
(onClick)="onCancel()"
|
|
6781
|
-
></ax-button>
|
|
6782
|
-
<ax-button
|
|
6783
|
-
[look]="'solid'"
|
|
6784
|
-
[color]="'primary'"
|
|
6785
|
-
[disabled]="!canSave()"
|
|
6786
|
-
[text]="('@conversation:chat.assist-conversation.rename.actions.save' | translate | async) ?? ''"
|
|
6787
|
-
(onClick)="onSave()"
|
|
6788
|
-
></ax-button>
|
|
6789
|
-
</ax-suffix>
|
|
6790
|
-
</ax-footer>
|
|
6791
|
-
</div>
|
|
6792
|
-
`, styles: [":host{display:block}.rename-dialog{display:flex;flex-direction:column;gap:1rem;padding:1rem}.rename-dialog__footer{display:flex;justify-content:flex-end}.rename-dialog__footer>ax-suffix{display:flex;gap:.75rem}\n"] }]
|
|
6793
|
-
}] });
|
|
6794
|
-
|
|
6795
5608
|
//#region ---- Imports ----
|
|
6796
5609
|
//#endregion
|
|
6797
5610
|
//#region ---- Assist conversation helpers ----
|
|
6798
|
-
function
|
|
6799
|
-
|
|
6800
|
-
return typeof assistId === 'string' && assistId.trim().length > 0;
|
|
5611
|
+
function isRecord(value) {
|
|
5612
|
+
return typeof value === 'object' && value !== null;
|
|
6801
5613
|
}
|
|
6802
|
-
|
|
6803
|
-
|
|
6804
|
-
|
|
6805
|
-
return;
|
|
5614
|
+
function extractMessageCopyText(message) {
|
|
5615
|
+
if (!message) {
|
|
5616
|
+
return '';
|
|
6806
5617
|
}
|
|
6807
|
-
|
|
6808
|
-
|
|
6809
|
-
|
|
6810
|
-
|
|
6811
|
-
|
|
6812
|
-
|
|
6813
|
-
|
|
6814
|
-
|
|
6815
|
-
|
|
6816
|
-
|
|
6817
|
-
},
|
|
6818
|
-
});
|
|
6819
|
-
nextTitle = typeof popupResult?.data === 'string' ? popupResult.data.trim() : '';
|
|
5618
|
+
if (!isRecord(message.payload)) {
|
|
5619
|
+
return '';
|
|
5620
|
+
}
|
|
5621
|
+
const payloadText = message.payload['text'];
|
|
5622
|
+
if (typeof payloadText === 'string') {
|
|
5623
|
+
return payloadText.trim();
|
|
5624
|
+
}
|
|
5625
|
+
const payloadContent = message.payload['content'];
|
|
5626
|
+
if (typeof payloadContent === 'string') {
|
|
5627
|
+
return payloadContent.trim();
|
|
6820
5628
|
}
|
|
6821
|
-
|
|
6822
|
-
|
|
6823
|
-
|
|
5629
|
+
const payloadResponses = message.payload['responses'];
|
|
5630
|
+
if (Array.isArray(payloadResponses)) {
|
|
5631
|
+
const collected = payloadResponses
|
|
5632
|
+
.map((response) => {
|
|
5633
|
+
if (!isRecord(response)) {
|
|
5634
|
+
return '';
|
|
5635
|
+
}
|
|
5636
|
+
const content = response['content'];
|
|
5637
|
+
return typeof content === 'string' ? content.trim() : '';
|
|
5638
|
+
})
|
|
5639
|
+
.filter((part) => part.length > 0)
|
|
5640
|
+
.join('\n\n')
|
|
5641
|
+
.trim();
|
|
5642
|
+
if (collected.length > 0) {
|
|
5643
|
+
return collected;
|
|
5644
|
+
}
|
|
6824
5645
|
}
|
|
6825
|
-
|
|
5646
|
+
return '';
|
|
5647
|
+
}
|
|
5648
|
+
async function copyMessageText(message) {
|
|
5649
|
+
const copyText = extractMessageCopyText(message);
|
|
5650
|
+
if (!copyText) {
|
|
6826
5651
|
return;
|
|
6827
5652
|
}
|
|
6828
|
-
await
|
|
6829
|
-
title: nextTitle,
|
|
6830
|
-
metadata: {
|
|
6831
|
-
...(context.conversation?.metadata ?? {}),
|
|
6832
|
-
isTitleCustomized: true,
|
|
6833
|
-
isTitleAutoGenerated: false,
|
|
6834
|
-
},
|
|
6835
|
-
});
|
|
5653
|
+
await globalThis.navigator?.clipboard?.writeText?.(copyText);
|
|
6836
5654
|
}
|
|
6837
|
-
//#endregion
|
|
6838
5655
|
//#region ---- Providers ----
|
|
6839
5656
|
/**
|
|
6840
5657
|
* Registers `@acorex/components/conversation2` for the whole conversation module so
|
|
@@ -6861,6 +5678,18 @@ const AXM_CHAT_CONVERSATION2_PROVIDERS = [
|
|
|
6861
5678
|
AX_CONVERSATION_STICKER_RENDERER,
|
|
6862
5679
|
],
|
|
6863
5680
|
messageActions: [
|
|
5681
|
+
AXM_DOWNLOAD_ASSIST_MESSAGE_DEBUG_ACTION,
|
|
5682
|
+
{
|
|
5683
|
+
id: 'copy-message',
|
|
5684
|
+
label: '@conversation:chat.actions.copy',
|
|
5685
|
+
icon: 'fa-light fa-copy',
|
|
5686
|
+
priority: 95,
|
|
5687
|
+
visible: (message) => extractMessageCopyText(message).length > 0,
|
|
5688
|
+
enabled: (message) => extractMessageCopyText(message).length > 0,
|
|
5689
|
+
handler: async (context) => {
|
|
5690
|
+
await copyMessageText(context.message);
|
|
5691
|
+
},
|
|
5692
|
+
},
|
|
6864
5693
|
{
|
|
6865
5694
|
...AX_CONVERSATION_MESSAGE_REPLY_ACTION,
|
|
6866
5695
|
visible: (arg) => arg.metadata?.['isAssistResponse'] !== true,
|
|
@@ -6887,9 +5716,7 @@ const AXM_CHAT_CONVERSATION2_PROVIDERS = [
|
|
|
6887
5716
|
AX_CONVERSATION_TAB_ALL,
|
|
6888
5717
|
AX_CONVERSATION_TAB_PRIVATE,
|
|
6889
5718
|
AX_CONVERSATION_TAB_GROUPS,
|
|
6890
|
-
|
|
6891
|
-
AX_CONVERSATION_TAB_UNREAD,
|
|
6892
|
-
AX_CONVERSATION_TAB_ARCHIVED,
|
|
5719
|
+
AXM_CONVERSATION_TAB_BOT,
|
|
6893
5720
|
],
|
|
6894
5721
|
infoBarActions: [
|
|
6895
5722
|
AXM_CHAT_INFO_BAR_ASSIST_MODEL_ACTION,
|
|
@@ -6901,17 +5728,8 @@ const AXM_CHAT_CONVERSATION2_PROVIDERS = [
|
|
|
6901
5728
|
AX_CONVERSATION_INFO_BAR_BLOCK_ACTION,
|
|
6902
5729
|
],
|
|
6903
5730
|
conversationItemActions: [
|
|
6904
|
-
|
|
6905
|
-
|
|
6906
|
-
label: '@conversation:chat.assist-conversation.rename.action',
|
|
6907
|
-
icon: 'fa-light fa-pen',
|
|
6908
|
-
priority: 110,
|
|
6909
|
-
visible: (context) => isAssistConversation(context?.conversation),
|
|
6910
|
-
enabled: true,
|
|
6911
|
-
handler: async (context) => {
|
|
6912
|
-
await renameAssistConversation(context);
|
|
6913
|
-
},
|
|
6914
|
-
},
|
|
5731
|
+
AXM_DOWNLOAD_ASSIST_CONVERSATION_DEBUG_ACTION,
|
|
5732
|
+
AXM_RENAME_ASSIST_CONVERSATION_ACTION,
|
|
6915
5733
|
AX_CONVERSATION_ITEM_MUTE_ACTION,
|
|
6916
5734
|
AX_CONVERSATION_ITEM_PIN_ACTION,
|
|
6917
5735
|
AX_CONVERSATION_ITEM_MARK_READ_ACTION,
|
|
@@ -6950,7 +5768,7 @@ class AXMChatNotificationContentComponent {
|
|
|
6950
5768
|
<ax-button (onClick)="goToChat($event)" [text]="'Go to Chat'"></ax-button> -->
|
|
6951
5769
|
</div>
|
|
6952
5770
|
</div>
|
|
6953
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type:
|
|
5771
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i2$1.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
6954
5772
|
}
|
|
6955
5773
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatNotificationContentComponent, decorators: [{
|
|
6956
5774
|
type: Component,
|
|
@@ -7125,7 +5943,9 @@ function routesFactory() {
|
|
|
7125
5943
|
{
|
|
7126
5944
|
path: ':id',
|
|
7127
5945
|
loadComponent: () => Promise.resolve().then(function () { return chat_component; }).then((c) => c.AXMChatComponent),
|
|
7128
|
-
|
|
5946
|
+
// Do not use `reuse: true` here: same route path with a different `:id` must recreate the chat
|
|
5947
|
+
// shell so conversation2 reloads messages (see AXPEntityReuseStrategy `queryParamsChange` branch).
|
|
5948
|
+
data: { reuse: 'queryParamsChange' },
|
|
7129
5949
|
},
|
|
7130
5950
|
],
|
|
7131
5951
|
},
|
|
@@ -7169,7 +5989,7 @@ function routesFactory() {
|
|
|
7169
5989
|
}
|
|
7170
5990
|
class AXMConversationModule {
|
|
7171
5991
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMConversationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
7172
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: AXMConversationModule, imports: [AXPWidgetCoreModule, i1$
|
|
5992
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: AXMConversationModule, imports: [AXPWidgetCoreModule, i1$5.AXPWorkflowModule,
|
|
7173
5993
|
// Entity Modules
|
|
7174
5994
|
AXMConversationTabEntityModule,
|
|
7175
5995
|
AXMRoomEntityModule,
|
|
@@ -7367,5 +6187,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
7367
6187
|
* Generated bundle index. Do not edit.
|
|
7368
6188
|
*/
|
|
7369
6189
|
|
|
7370
|
-
export { AXMChatComponent, AXMChatConversationApi, AXMChatManagementService, AXMChatMessageApi, AXMChatRealtimeApi, AXMChatRealtimeService, AXMChatRealtimeServiceImpl, AXMChatService, AXMChatServiceImpl, AXMChatUserApi, AXMCommentComponent, AXMCommentManagementService, AXMCommentPopupComponent, AXMCommentPopupStartAction, AXMCommentPopupWorkflow, AXMCommentRealtimeService, AXMCommentRealtimeServiceImpl, AXMCommentService, AXMCommentServiceImpl, AXMCommentWidgetViewComponent, AXMConversationModule, AXMConversationTabEntityModule, AXMConversationTabService, AXMConversationTabServiceImpl, AXMMessageEntityModule, AXMMessageService, AXMMessageServiceImpl, AXMRoomEntityModule, AXMRoomService, AXMRoomServiceImpl, AXPCommentWidget, COMMENTS_PAGE_COMPONENT_KEY, RootConfig, axmIsAssistPeerParticipant, commentsPlugin, messageFactory, roomFactory, tabFactory };
|
|
6190
|
+
export { AXMChatComponent, AXMChatConversationApi, AXMChatManagementService, AXMChatMessageApi, AXMChatRealtimeApi, AXMChatRealtimeService, AXMChatRealtimeServiceImpl, AXMChatService, AXMChatServiceImpl, AXMChatUserApi, AXMCommentComponent, AXMCommentManagementService, AXMCommentPopupComponent, AXMCommentPopupStartAction, AXMCommentPopupWorkflow, AXMCommentRealtimeService, AXMCommentRealtimeServiceImpl, AXMCommentService, AXMCommentServiceImpl, AXMCommentWidgetViewComponent, AXMConversationModule, AXMConversationTabEntityModule, AXMConversationTabService, AXMConversationTabServiceImpl, AXMMessageEntityModule, AXMMessageService, AXMMessageServiceImpl, AXMRoomEntityModule, AXMRoomService, AXMRoomServiceImpl, AXPCommentWidget, COMMENTS_PAGE_COMPONENT_KEY, RootConfig, axmAssistNodeAsLayoutNode, axmAssistWidgetNodeFromUnknown, axmExtractAssistFinalDeliverableFromTranscript, axmIsAssistPeerParticipant, axmNormalizeAssistTranscriptForChatUi, axmParseAssistTranscriptTextEnvelope, axmReadAssistAiTranscript, axmReadAssistAiTranscriptRaw, axmSyntheticEmbedMessage, commentsPlugin, messageFactory, roomFactory, tabFactory };
|
|
7371
6191
|
//# sourceMappingURL=acorex-modules-conversation.mjs.map
|