@acorex/modules 21.0.0-beta.3 → 21.0.0-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (240) hide show
  1. package/fesm2022/acorex-modules-ai-management-agent-registry-tool-configurator-widget-column.component-DDVQwyU4.mjs.map +1 -1
  2. 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
  3. package/fesm2022/acorex-modules-ai-management-agent-registry-tool-configurator-widget-edit.component-C-XsPEIg.mjs.map +1 -0
  4. package/fesm2022/{acorex-modules-ai-management-agent.entity-CsiCzwYK.mjs → acorex-modules-ai-management-agent.entity-D6-0_Ms3.mjs} +2 -2
  5. package/fesm2022/acorex-modules-ai-management-agent.entity-D6-0_Ms3.mjs.map +1 -0
  6. package/fesm2022/acorex-modules-ai-management-assist-delegated-agent-configurator-widget-column.component-tSpJYIZh.mjs.map +1 -1
  7. 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
  8. package/fesm2022/acorex-modules-ai-management-assist-delegated-agent-configurator-widget-edit.component-u1hZ4P5s.mjs.map +1 -0
  9. package/fesm2022/{acorex-modules-ai-management-assist.entity-Be5vnFVn.mjs → acorex-modules-ai-management-assist.entity-DfW-FFCt.mjs} +2 -2
  10. package/fesm2022/{acorex-modules-ai-management-assist.entity-Be5vnFVn.mjs.map → acorex-modules-ai-management-assist.entity-DfW-FFCt.mjs.map} +1 -1
  11. package/fesm2022/{acorex-modules-ai-management-model.entity-BjTtbWDk.mjs → acorex-modules-ai-management-model.entity-DiDaXVa3.mjs} +2 -2
  12. package/fesm2022/{acorex-modules-ai-management-model.entity-BjTtbWDk.mjs.map → acorex-modules-ai-management-model.entity-DiDaXVa3.mjs.map} +1 -1
  13. 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
  14. 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
  15. package/fesm2022/acorex-modules-ai-management.mjs +4630 -1
  16. package/fesm2022/acorex-modules-ai-management.mjs.map +1 -1
  17. package/fesm2022/acorex-modules-application-management.mjs +11 -15
  18. package/fesm2022/acorex-modules-application-management.mjs.map +1 -1
  19. 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
  20. package/fesm2022/acorex-modules-asset-management-acorex-modules-asset-management-Blejt-Mo.mjs.map +1 -0
  21. package/fesm2022/{acorex-modules-asset-management-asset-rental-history.entity-CXgiPWiW.mjs → acorex-modules-asset-management-asset-rental-history.entity-C6V8Nuvb.mjs} +2 -2
  22. 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
  23. 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
  24. 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
  25. package/fesm2022/{acorex-modules-asset-management-asset-system-type.entity-DkV2P0sF.mjs → acorex-modules-asset-management-asset-system-type.entity-CfoB6Faf.mjs} +2 -2
  26. 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
  27. package/fesm2022/{acorex-modules-asset-management-asset-system.entity-bLGHHcCr.mjs → acorex-modules-asset-management-asset-system.entity-CvKC7MKH.mjs} +2 -2
  28. package/fesm2022/{acorex-modules-asset-management-asset-system.entity-bLGHHcCr.mjs.map → acorex-modules-asset-management-asset-system.entity-CvKC7MKH.mjs.map} +1 -1
  29. 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
  30. package/fesm2022/acorex-modules-asset-management-asset-type-section-component.entity-xfRZM5vK.mjs.map +1 -0
  31. package/fesm2022/{acorex-modules-asset-management-asset-type-section.entity-BoONUtWp.mjs → acorex-modules-asset-management-asset-type-section.entity-DdEcyihk.mjs} +2 -2
  32. 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
  33. package/fesm2022/{acorex-modules-asset-management-asset-type.entity-BjaLvZuH.mjs → acorex-modules-asset-management-asset-type.entity-D78ztUZ5.mjs} +108 -28
  34. package/fesm2022/acorex-modules-asset-management-asset-type.entity-D78ztUZ5.mjs.map +1 -0
  35. package/fesm2022/{acorex-modules-asset-management-asset.entity-Bn-WKIkL.mjs → acorex-modules-asset-management-asset.entity-3dFsNRkr.mjs} +2 -205
  36. package/fesm2022/acorex-modules-asset-management-asset.entity-3dFsNRkr.mjs.map +1 -0
  37. package/fesm2022/acorex-modules-asset-management.mjs +1 -1
  38. package/fesm2022/{acorex-modules-auth-acorex-modules-auth-DzCtP4qB.mjs → acorex-modules-auth-acorex-modules-auth-OxprG_fC.mjs} +13 -13
  39. package/fesm2022/{acorex-modules-auth-acorex-modules-auth-DzCtP4qB.mjs.map → acorex-modules-auth-acorex-modules-auth-OxprG_fC.mjs.map} +1 -1
  40. package/fesm2022/{acorex-modules-auth-app-chooser.component-BQF1I-wB.mjs → acorex-modules-auth-app-chooser.component-CVIfaOZn.mjs} +2 -2
  41. package/fesm2022/{acorex-modules-auth-app-chooser.component-BQF1I-wB.mjs.map → acorex-modules-auth-app-chooser.component-CVIfaOZn.mjs.map} +1 -1
  42. package/fesm2022/{acorex-modules-auth-login.module-5ZArig0w.mjs → acorex-modules-auth-login.module-DcHZK-R8.mjs} +4 -4
  43. package/fesm2022/{acorex-modules-auth-login.module-5ZArig0w.mjs.map → acorex-modules-auth-login.module-DcHZK-R8.mjs.map} +1 -1
  44. package/fesm2022/{acorex-modules-auth-master.layout-a4QkegZJ.mjs → acorex-modules-auth-master.layout-BxFGH1Ns.mjs} +2 -2
  45. package/fesm2022/{acorex-modules-auth-master.layout-a4QkegZJ.mjs.map → acorex-modules-auth-master.layout-BxFGH1Ns.mjs.map} +1 -1
  46. package/fesm2022/{acorex-modules-auth-oauth-callback.component-DTxqNJ2C.mjs → acorex-modules-auth-oauth-callback.component-D7wdpp8i.mjs} +2 -2
  47. package/fesm2022/{acorex-modules-auth-oauth-callback.component-DTxqNJ2C.mjs.map → acorex-modules-auth-oauth-callback.component-D7wdpp8i.mjs.map} +1 -1
  48. package/fesm2022/{acorex-modules-auth-password.component-BecuTKvO.mjs → acorex-modules-auth-password.component-BStzALYp.mjs} +2 -2
  49. package/fesm2022/{acorex-modules-auth-password.component-BecuTKvO.mjs.map → acorex-modules-auth-password.component-BStzALYp.mjs.map} +1 -1
  50. package/fesm2022/{acorex-modules-auth-password.component-DmJZoAp1.mjs → acorex-modules-auth-password.component-CD6RCeFv.mjs} +2 -2
  51. package/fesm2022/{acorex-modules-auth-password.component-DmJZoAp1.mjs.map → acorex-modules-auth-password.component-CD6RCeFv.mjs.map} +1 -1
  52. package/fesm2022/{acorex-modules-auth-routes-DMqZIUs0.mjs → acorex-modules-auth-routes-DaEUQGPG.mjs} +2 -2
  53. package/fesm2022/{acorex-modules-auth-routes-DMqZIUs0.mjs.map → acorex-modules-auth-routes-DaEUQGPG.mjs.map} +1 -1
  54. package/fesm2022/{acorex-modules-auth-settings.provider-DkhbuDBO.mjs → acorex-modules-auth-settings.provider-CN7Lb38l.mjs} +26 -31
  55. package/fesm2022/acorex-modules-auth-settings.provider-CN7Lb38l.mjs.map +1 -0
  56. package/fesm2022/{acorex-modules-auth-tenant-chooser.component-C-apfDuQ.mjs → acorex-modules-auth-tenant-chooser.component-B-iqLVe6.mjs} +2 -2
  57. package/fesm2022/{acorex-modules-auth-tenant-chooser.component-C-apfDuQ.mjs.map → acorex-modules-auth-tenant-chooser.component-B-iqLVe6.mjs.map} +1 -1
  58. package/fesm2022/{acorex-modules-auth-two-factor.module-BqbFsq9G.mjs → acorex-modules-auth-two-factor.module-BMKzyFEP.mjs} +2 -2
  59. package/fesm2022/{acorex-modules-auth-two-factor.module-BqbFsq9G.mjs.map → acorex-modules-auth-two-factor.module-BMKzyFEP.mjs.map} +1 -1
  60. package/fesm2022/{acorex-modules-auth-user-sessions.component-D7vXGWMN.mjs → acorex-modules-auth-user-sessions.component-Xnz3S1SD.mjs} +2 -2
  61. package/fesm2022/{acorex-modules-auth-user-sessions.component-D7vXGWMN.mjs.map → acorex-modules-auth-user-sessions.component-Xnz3S1SD.mjs.map} +1 -1
  62. package/fesm2022/acorex-modules-auth.mjs +1 -1
  63. package/fesm2022/acorex-modules-common.mjs +8 -33
  64. package/fesm2022/acorex-modules-common.mjs.map +1 -1
  65. package/fesm2022/acorex-modules-conversation.mjs +1109 -2289
  66. package/fesm2022/acorex-modules-conversation.mjs.map +1 -1
  67. 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
  68. package/fesm2022/acorex-modules-dashboard-management-acorex-modules-dashboard-management-WBZHuJyY.mjs.map +1 -0
  69. package/fesm2022/{acorex-modules-dashboard-management-index-DQHOwMS6.mjs → acorex-modules-dashboard-management-index-oHkAfJTJ.mjs} +2 -2
  70. package/fesm2022/{acorex-modules-dashboard-management-index-DQHOwMS6.mjs.map → acorex-modules-dashboard-management-index-oHkAfJTJ.mjs.map} +1 -1
  71. package/fesm2022/acorex-modules-dashboard-management.mjs +1 -1
  72. package/fesm2022/acorex-modules-document-management.mjs +116 -15
  73. package/fesm2022/acorex-modules-document-management.mjs.map +1 -1
  74. package/fesm2022/acorex-modules-form-template-management.mjs +13 -17
  75. package/fesm2022/acorex-modules-form-template-management.mjs.map +1 -1
  76. package/fesm2022/acorex-modules-locale-management.mjs +68 -70
  77. package/fesm2022/acorex-modules-locale-management.mjs.map +1 -1
  78. package/fesm2022/{acorex-modules-maintenance-management-acorex-modules-maintenance-management-B5wf4zMI.mjs → acorex-modules-maintenance-management-acorex-modules-maintenance-management-C0LLBxMR.mjs} +40 -38
  79. package/fesm2022/acorex-modules-maintenance-management-acorex-modules-maintenance-management-C0LLBxMR.mjs.map +1 -0
  80. package/fesm2022/{acorex-modules-maintenance-management-failure-effect.entity-Cv5KnboB.mjs → acorex-modules-maintenance-management-failure-effect.entity-D8yOqKWQ.mjs} +2 -2
  81. package/fesm2022/{acorex-modules-maintenance-management-failure-effect.entity-Cv5KnboB.mjs.map → acorex-modules-maintenance-management-failure-effect.entity-D8yOqKWQ.mjs.map} +1 -1
  82. 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
  83. 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
  84. package/fesm2022/{acorex-modules-maintenance-management-failure-mode-mechanism.entity-nxOdHZxu.mjs → acorex-modules-maintenance-management-failure-mode-mechanism.entity-yR11e9TU.mjs} +2 -2
  85. 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
  86. package/fesm2022/{acorex-modules-maintenance-management-failure-mode-solution.entity-ApD80Scc.mjs → acorex-modules-maintenance-management-failure-mode-solution.entity-BD4Uz6G-.mjs} +2 -2
  87. 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
  88. 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
  89. 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
  90. package/fesm2022/{acorex-modules-maintenance-management-failure-register-effect.entity-DpoqULBf.mjs → acorex-modules-maintenance-management-failure-register-effect.entity-DQE5nqiN.mjs} +2 -2
  91. 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
  92. 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
  93. 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
  94. package/fesm2022/{acorex-modules-maintenance-management-failure-register.entity-C4Az4Rr9.mjs → acorex-modules-maintenance-management-failure-register.entity-DSnrVaWI.mjs} +2 -2
  95. package/fesm2022/{acorex-modules-maintenance-management-failure-register.entity-C4Az4Rr9.mjs.map → acorex-modules-maintenance-management-failure-register.entity-DSnrVaWI.mjs.map} +1 -1
  96. package/fesm2022/{acorex-modules-maintenance-management-failure-severity.entity-BZo6UUun.mjs → acorex-modules-maintenance-management-failure-severity.entity-DZoMhgW7.mjs} +2 -2
  97. package/fesm2022/{acorex-modules-maintenance-management-failure-severity.entity-BZo6UUun.mjs.map → acorex-modules-maintenance-management-failure-severity.entity-DZoMhgW7.mjs.map} +1 -1
  98. package/fesm2022/{acorex-modules-maintenance-management-maintenance-template.entity-DxYY0hpG.mjs → acorex-modules-maintenance-management-maintenance-template.entity-qf2WNKB_.mjs} +2 -2
  99. package/fesm2022/{acorex-modules-maintenance-management-maintenance-template.entity-DxYY0hpG.mjs.map → acorex-modules-maintenance-management-maintenance-template.entity-qf2WNKB_.mjs.map} +1 -1
  100. package/fesm2022/acorex-modules-maintenance-management.mjs +1 -1
  101. package/fesm2022/acorex-modules-notification-management.mjs +34 -38
  102. package/fesm2022/acorex-modules-notification-management.mjs.map +1 -1
  103. package/fesm2022/{acorex-modules-order-management-settings.provider-BzNJIZCu.mjs → acorex-modules-order-management-settings.provider-DF8JQ1PZ.mjs} +6 -11
  104. package/fesm2022/acorex-modules-order-management-settings.provider-DF8JQ1PZ.mjs.map +1 -0
  105. package/fesm2022/acorex-modules-order-management.mjs +2 -2
  106. package/fesm2022/{acorex-modules-organization-management-acorex-modules-organization-management-CUWv9tbF.mjs → acorex-modules-organization-management-acorex-modules-organization-management-BDnIsf2j.mjs} +27 -27
  107. 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
  108. 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
  109. 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
  110. 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
  111. 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
  112. package/fesm2022/{acorex-modules-organization-management-business-unit.entity-DwRpPYNe.mjs → acorex-modules-organization-management-business-unit.entity-CuFBCQ7T.mjs} +2 -2
  113. package/fesm2022/{acorex-modules-organization-management-business-unit.entity-DwRpPYNe.mjs.map → acorex-modules-organization-management-business-unit.entity-CuFBCQ7T.mjs.map} +1 -1
  114. package/fesm2022/{acorex-modules-organization-management-chart.entity-lm0udbe7.mjs → acorex-modules-organization-management-chart.entity-B7oSgI4o.mjs} +2 -2
  115. package/fesm2022/{acorex-modules-organization-management-chart.entity-lm0udbe7.mjs.map → acorex-modules-organization-management-chart.entity-B7oSgI4o.mjs.map} +1 -1
  116. package/fesm2022/{acorex-modules-organization-management-company.entity-DW43rdVi.mjs → acorex-modules-organization-management-company.entity-BSDic10Z.mjs} +2 -2
  117. package/fesm2022/{acorex-modules-organization-management-company.entity-DW43rdVi.mjs.map → acorex-modules-organization-management-company.entity-BSDic10Z.mjs.map} +1 -1
  118. package/fesm2022/{acorex-modules-organization-management-entity.provider-DGmP_q74.mjs → acorex-modules-organization-management-entity.provider-BkWwyLUZ.mjs} +15 -15
  119. package/fesm2022/{acorex-modules-organization-management-entity.provider-DGmP_q74.mjs.map → acorex-modules-organization-management-entity.provider-BkWwyLUZ.mjs.map} +1 -1
  120. package/fesm2022/{acorex-modules-organization-management-feature-definition.provider-Bm0hlncD.mjs → acorex-modules-organization-management-feature-definition.provider-D8Tsj3hk.mjs} +2 -2
  121. package/fesm2022/{acorex-modules-organization-management-feature-definition.provider-Bm0hlncD.mjs.map → acorex-modules-organization-management-feature-definition.provider-D8Tsj3hk.mjs.map} +1 -1
  122. 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
  123. 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
  124. 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
  125. 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
  126. 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
  127. 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
  128. package/fesm2022/{acorex-modules-organization-management-job-definition.entity-enxYD1x1.mjs → acorex-modules-organization-management-job-definition.entity-DAo8xR1H.mjs} +2 -2
  129. package/fesm2022/{acorex-modules-organization-management-job-definition.entity-enxYD1x1.mjs.map → acorex-modules-organization-management-job-definition.entity-DAo8xR1H.mjs.map} +1 -1
  130. package/fesm2022/{acorex-modules-organization-management-job-level.datasource-CRm1uNQa.mjs → acorex-modules-organization-management-job-level.datasource-C7ElEuZx.mjs} +2 -2
  131. package/fesm2022/{acorex-modules-organization-management-job-level.datasource-CRm1uNQa.mjs.map → acorex-modules-organization-management-job-level.datasource-C7ElEuZx.mjs.map} +1 -1
  132. 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
  133. 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
  134. package/fesm2022/{acorex-modules-organization-management-menu.provider-DZSDOHOa.mjs → acorex-modules-organization-management-menu.provider-DWt62uxv.mjs} +2 -2
  135. package/fesm2022/{acorex-modules-organization-management-menu.provider-DZSDOHOa.mjs.map → acorex-modules-organization-management-menu.provider-DWt62uxv.mjs.map} +1 -1
  136. package/fesm2022/{acorex-modules-organization-management-org-chart.page-BUSEFJJZ.mjs → acorex-modules-organization-management-org-chart.page-Rh8xmXaj.mjs} +2 -2
  137. package/fesm2022/{acorex-modules-organization-management-org-chart.page-BUSEFJJZ.mjs.map → acorex-modules-organization-management-org-chart.page-Rh8xmXaj.mjs.map} +1 -1
  138. package/fesm2022/{acorex-modules-organization-management-permission-definition.provider-DEfUgyRh.mjs → acorex-modules-organization-management-permission-definition.provider-3TD89ErD.mjs} +2 -2
  139. package/fesm2022/{acorex-modules-organization-management-permission-definition.provider-DEfUgyRh.mjs.map → acorex-modules-organization-management-permission-definition.provider-3TD89ErD.mjs.map} +1 -1
  140. package/fesm2022/{acorex-modules-organization-management-position.entity-D1JU0rla.mjs → acorex-modules-organization-management-position.entity-Cysj_53n.mjs} +2 -2
  141. package/fesm2022/{acorex-modules-organization-management-position.entity-D1JU0rla.mjs.map → acorex-modules-organization-management-position.entity-Cysj_53n.mjs.map} +1 -1
  142. 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
  143. 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
  144. package/fesm2022/{acorex-modules-organization-management-replace-position-assignee.command-DyJIOBOp.mjs → acorex-modules-organization-management-replace-position-assignee.command-Cf8VR0tX.mjs} +2 -2
  145. 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
  146. 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
  147. 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
  148. 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
  149. 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
  150. package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix.component-42Aqvq6J.mjs → acorex-modules-organization-management-responsibilities-matrix.component-58s3Qfyg.mjs} +2 -2
  151. package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix.component-42Aqvq6J.mjs.map → acorex-modules-organization-management-responsibilities-matrix.component-58s3Qfyg.mjs.map} +1 -1
  152. package/fesm2022/{acorex-modules-organization-management-responsibility-level.entity-DIy5Kv_4.mjs → acorex-modules-organization-management-responsibility-level.entity-DWWQB7ke.mjs} +2 -2
  153. 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
  154. package/fesm2022/{acorex-modules-organization-management-responsibility.entity-BBlERaap.mjs → acorex-modules-organization-management-responsibility.entity-C4V55fKt.mjs} +2 -2
  155. package/fesm2022/{acorex-modules-organization-management-responsibility.entity-BBlERaap.mjs.map → acorex-modules-organization-management-responsibility.entity-C4V55fKt.mjs.map} +1 -1
  156. package/fesm2022/{acorex-modules-organization-management-settings.provider-BohjJ4JD.mjs → acorex-modules-organization-management-settings.provider-BD70P1XV.mjs} +21 -24
  157. package/fesm2022/acorex-modules-organization-management-settings.provider-BD70P1XV.mjs.map +1 -0
  158. package/fesm2022/{acorex-modules-organization-management-team-business-unit.entity-UDotxAM4.mjs → acorex-modules-organization-management-team-business-unit.entity-B5T1fYAF.mjs} +2 -2
  159. 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
  160. 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
  161. 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
  162. package/fesm2022/{acorex-modules-organization-management-team-member.entity-C13rpUNN.mjs → acorex-modules-organization-management-team-member.entity-CZPmF9f6.mjs} +2 -2
  163. package/fesm2022/{acorex-modules-organization-management-team-member.entity-C13rpUNN.mjs.map → acorex-modules-organization-management-team-member.entity-CZPmF9f6.mjs.map} +1 -1
  164. package/fesm2022/{acorex-modules-organization-management-team.entity-CTajHYMs.mjs → acorex-modules-organization-management-team.entity-CCfWLgDx.mjs} +2 -2
  165. package/fesm2022/{acorex-modules-organization-management-team.entity-CTajHYMs.mjs.map → acorex-modules-organization-management-team.entity-CCfWLgDx.mjs.map} +1 -1
  166. package/fesm2022/acorex-modules-organization-management.mjs +1 -1
  167. package/fesm2022/{acorex-modules-platform-dev-tools-settings.provider-CGyf-4eq.mjs → acorex-modules-platform-dev-tools-settings.provider-DKmgBUYt.mjs} +2 -2
  168. package/fesm2022/acorex-modules-platform-dev-tools-settings.provider-DKmgBUYt.mjs.map +1 -0
  169. package/fesm2022/acorex-modules-platform-dev-tools.mjs +2 -2
  170. package/fesm2022/{acorex-modules-platform-management-acorex-modules-platform-management-DCR1ziGj.mjs → acorex-modules-platform-management-acorex-modules-platform-management-D0D56pWx.mjs} +12 -4
  171. package/fesm2022/acorex-modules-platform-management-acorex-modules-platform-management-D0D56pWx.mjs.map +1 -0
  172. package/fesm2022/acorex-modules-platform-management-entity-master-actions-for-ai.util-OCk5eqQz.mjs +56 -0
  173. package/fesm2022/acorex-modules-platform-management-entity-master-actions-for-ai.util-OCk5eqQz.mjs.map +1 -0
  174. package/fesm2022/acorex-modules-platform-management-list-platform-navigation-for-ai.query-C3-eBMwF.mjs +198 -0
  175. package/fesm2022/acorex-modules-platform-management-list-platform-navigation-for-ai.query-C3-eBMwF.mjs.map +1 -0
  176. 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
  177. package/fesm2022/acorex-modules-platform-management-list-registered-entities.query-BZVD9YPU.mjs.map +1 -0
  178. package/fesm2022/{acorex-modules-platform-management-menu-list.component-ClShYP8I.mjs → acorex-modules-platform-management-menu-list.component-BE9_j1Xy.mjs} +2 -2
  179. 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
  180. package/fesm2022/acorex-modules-platform-management.mjs +1 -1
  181. 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
  182. package/fesm2022/acorex-modules-settings-management-acorex-modules-settings-management-DHihkQXi.mjs.map +1 -0
  183. package/fesm2022/{acorex-modules-settings-management-permission-definition.provider-DWSlCjno.mjs → acorex-modules-settings-management-permission-definition.provider-DZoXbvt_.mjs} +2 -2
  184. package/fesm2022/{acorex-modules-settings-management-permission-definition.provider-DWSlCjno.mjs.map → acorex-modules-settings-management-permission-definition.provider-DZoXbvt_.mjs.map} +1 -1
  185. package/fesm2022/{acorex-modules-settings-management-setting-page.component-DukQDWHe.mjs → acorex-modules-settings-management-setting-page.component-B6UoszKZ.mjs} +5 -4
  186. package/fesm2022/acorex-modules-settings-management-setting-page.component-B6UoszKZ.mjs.map +1 -0
  187. package/fesm2022/{acorex-modules-settings-management-setting-view.component-C-PiEhLL.mjs → acorex-modules-settings-management-setting-view.component-BGCXJQ_L.mjs} +2 -2
  188. 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
  189. package/fesm2022/acorex-modules-settings-management.mjs +1 -1
  190. 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
  191. package/fesm2022/acorex-modules-task-management-acorex-modules-task-management-ZcP94xuL.mjs.map +1 -0
  192. package/fesm2022/{acorex-modules-task-management-task-board.page-BOrgjwax.mjs → acorex-modules-task-management-task-board.page-CEW3SrBz.mjs} +2 -2
  193. package/fesm2022/{acorex-modules-task-management-task-board.page-BOrgjwax.mjs.map → acorex-modules-task-management-task-board.page-CEW3SrBz.mjs.map} +1 -1
  194. package/fesm2022/acorex-modules-task-management.mjs +1 -1
  195. package/fesm2022/acorex-modules-tenant-management.mjs +3 -7
  196. package/fesm2022/acorex-modules-tenant-management.mjs.map +1 -1
  197. package/package.json +2 -2
  198. package/platform-management/README.md +4 -0
  199. package/types/acorex-modules-ai-management.d.ts +150 -527
  200. package/types/acorex-modules-asset-management.d.ts +7 -79
  201. package/types/acorex-modules-common.d.ts +3 -6
  202. package/types/acorex-modules-conversation.d.ts +60 -4
  203. package/types/acorex-modules-document-management.d.ts +20 -8
  204. package/types/acorex-modules-maintenance-management.d.ts +0 -2
  205. package/types/acorex-modules-notification-management.d.ts +0 -3
  206. package/types/acorex-modules-settings-management.d.ts +3 -0
  207. package/types/acorex-modules-task-management.d.ts +0 -1
  208. package/types/acorex-modules-tenant-management.d.ts +0 -1
  209. package/fesm2022/acorex-modules-ai-management-acorex-modules-ai-management-DZ_SXRAW.mjs +0 -8782
  210. package/fesm2022/acorex-modules-ai-management-acorex-modules-ai-management-DZ_SXRAW.mjs.map +0 -1
  211. package/fesm2022/acorex-modules-ai-management-agent-registry-tool-configurator-widget-edit.component-CwLff8ut.mjs.map +0 -1
  212. package/fesm2022/acorex-modules-ai-management-agent.entity-CsiCzwYK.mjs.map +0 -1
  213. package/fesm2022/acorex-modules-ai-management-ai-delegated-agent-transcript-popup.component-BWxdBe9t.mjs +0 -1255
  214. package/fesm2022/acorex-modules-ai-management-ai-delegated-agent-transcript-popup.component-BWxdBe9t.mjs.map +0 -1
  215. package/fesm2022/acorex-modules-ai-management-assist-delegated-agent-configurator-widget-edit.component-DQWeuAd6.mjs.map +0 -1
  216. package/fesm2022/acorex-modules-ai-management-index-BFMvZNvI.mjs +0 -2
  217. package/fesm2022/acorex-modules-ai-management-index-BFMvZNvI.mjs.map +0 -1
  218. package/fesm2022/acorex-modules-asset-management-acorex-modules-asset-management-p_zMwIBs.mjs.map +0 -1
  219. package/fesm2022/acorex-modules-asset-management-asset-state-history.entity-Cwics4Zo.mjs +0 -258
  220. package/fesm2022/acorex-modules-asset-management-asset-state-history.entity-Cwics4Zo.mjs.map +0 -1
  221. package/fesm2022/acorex-modules-asset-management-asset-status.rules-B7KwWQEe.mjs +0 -98
  222. package/fesm2022/acorex-modules-asset-management-asset-status.rules-B7KwWQEe.mjs.map +0 -1
  223. package/fesm2022/acorex-modules-asset-management-asset-type-section-component.entity-B_ct599s.mjs.map +0 -1
  224. package/fesm2022/acorex-modules-asset-management-asset-type.entity-BjaLvZuH.mjs.map +0 -1
  225. package/fesm2022/acorex-modules-asset-management-asset.entity-Bn-WKIkL.mjs.map +0 -1
  226. package/fesm2022/acorex-modules-asset-management-assetLifecycle-state.provider-DZ5r2zx7.mjs +0 -192
  227. package/fesm2022/acorex-modules-asset-management-assetLifecycle-state.provider-DZ5r2zx7.mjs.map +0 -1
  228. package/fesm2022/acorex-modules-asset-management-status.provider-C41t4e2U.mjs +0 -363
  229. package/fesm2022/acorex-modules-asset-management-status.provider-C41t4e2U.mjs.map +0 -1
  230. package/fesm2022/acorex-modules-auth-settings.provider-DkhbuDBO.mjs.map +0 -1
  231. package/fesm2022/acorex-modules-dashboard-management-acorex-modules-dashboard-management-qboFnd_p.mjs.map +0 -1
  232. package/fesm2022/acorex-modules-maintenance-management-acorex-modules-maintenance-management-B5wf4zMI.mjs.map +0 -1
  233. package/fesm2022/acorex-modules-order-management-settings.provider-BzNJIZCu.mjs.map +0 -1
  234. package/fesm2022/acorex-modules-organization-management-settings.provider-BohjJ4JD.mjs.map +0 -1
  235. package/fesm2022/acorex-modules-platform-dev-tools-settings.provider-CGyf-4eq.mjs.map +0 -1
  236. package/fesm2022/acorex-modules-platform-management-acorex-modules-platform-management-DCR1ziGj.mjs.map +0 -1
  237. package/fesm2022/acorex-modules-platform-management-list-registered-entities.query-B6-zV_Ml.mjs.map +0 -1
  238. package/fesm2022/acorex-modules-settings-management-acorex-modules-settings-management-7TUWK_qS.mjs.map +0 -1
  239. package/fesm2022/acorex-modules-settings-management-setting-page.component-DukQDWHe.mjs.map +0 -1
  240. 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, AXPFilterOperatorMiddlewareService, AXPEntityCommandScope, AXPSettingsService, AXPCommonSettings, AXPFileStorageService, AXP_MENU_PROVIDER } from '@acorex/platform/common';
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, SecurityContext, Injector, importProvidersFrom } from '@angular/core';
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$6 from '@acorex/platform/workflow';
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, AX_CONVERSATION_TAB_CHANNELS, AX_CONVERSATION_TAB_UNREAD, AX_CONVERSATION_TAB_ARCHIVED, 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';
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 i3$1 from '@acorex/core/translation';
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, axpAiDelegatedAgentPromptPreview, axpAiParseSupervisorAgentToolName, axpAiChatToolOrAgentResultBodyJson } from '@acorex/modules/ai-management';
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$1 from '@acorex/components/skeleton';
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 i2$2 from '@acorex/components/badge';
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: i3$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
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: i3$1.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
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: i3$1.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
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(/&lt;(\/?redacted_thinking)&gt;/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: i3$1.AXTranslatorPipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
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
- class AXMChatInfoBarAssistModelActionComponent {
3643
- constructor() {
3644
- //#region ---- Inputs ----
3645
- this.conversation = input.required(...(ngDevMode ? [{ debugName: "conversation" }] : /* istanbul ignore next */ []));
3646
- this.service = input(undefined, ...(ngDevMode ? [{ debugName: "service" }] : /* istanbul ignore next */ []));
3647
- //#endregion
3648
- //#region ---- Services & Dependencies ----
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
- async syncDebugMode() {
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: i3$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
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 ---- Transcript read ----
3822
- /**
3823
- * Reorders assist transcript lines for chat UI: all **think** first, then tool/agent
3824
- * and `tool`-role results in their original order, then all **text** (final answer).
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
- const out = [];
3857
- if (thinkParts.length > 0) {
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
- * Reads AI transcript lines from assist message metadata (final `aiTranscript` or streaming `aiTranscriptDraft`),
3874
- * in display order for the assist renderer.
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 axmReadAssistAiTranscript(metadata) {
3877
- if (typeof metadata !== 'object' || metadata == null) {
3878
- return null;
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
- // Final Angular sanitization guards against unexpected HTML fragments.
4081
- return sanitizer?.sanitize(SecurityContext.HTML, rendered) ?? rendered;
4082
- }
4083
- function renderInlineMarkdown(raw) {
4084
- const escaped = escapeHtml(raw ?? '');
4085
- const codeProtected = [];
4086
- const withCodePlaceholders = escaped.replace(/`([^`]+)`/g, (_m, code) => {
4087
- const token = `__AXM_CODE_${codeProtected.length}__`;
4088
- codeProtected.push(`<code>${code}</code>`);
4089
- return token;
4090
- });
4091
- const withLinks = withCodePlaceholders.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g, (_m, text, href) => {
4092
- const safeHref = sanitizeLink(href);
4093
- if (!safeHref) {
4094
- return text;
4095
- }
4096
- return `<a href="${safeHref}" target="_blank" rel="noopener noreferrer">${text}</a>`;
4097
- });
4098
- const withBold = withLinks.replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>');
4099
- const withStrike = withBold.replace(/~~([^~]+)~~/g, '<del>$1</del>');
4100
- const withItalic = withStrike.replace(/(^|[^\*])\*([^*\n]+)\*/g, '$1<em>$2</em>');
4101
- return withItalic.replace(/__AXM_CODE_(\d+)__/g, (_m, index) => codeProtected[Number(index)] ?? '');
4102
- }
4103
- function normalizeInput(raw) {
4104
- return (raw ?? '')
4105
- .replace(/\r\n/g, '\n')
4106
- // Line breaks: any HTML <br> variant (with attributes, XHTML-style, case-insensitive).
4107
- .replace(/<\s*br\b[^>]*>/gi, '\n')
4108
- // Same when the tag was HTML-escaped in the source (e.g. rich text or double-encoded snippets).
4109
- .replace(/&lt;\s*br\b[\s\S]*?&gt;/gi, '\n')
4110
- .replace(/\n?<\s*hr\s*\/?\s*>\n?/gi, '\n\n---\n\n')
4111
- .replace(/\t/g, ' ')
4112
- .trim();
4113
- }
4114
- function sanitizeLink(rawHref) {
4115
- const href = (rawHref ?? '').trim();
4116
- if (!href) {
4117
- return null;
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, '&amp;')
4128
- .replace(/</g, '&lt;')
4129
- .replace(/>/g, '&gt;')
4130
- .replace(/"/g, '&quot;')
4131
- .replace(/'/g, '&#39;');
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: i3$1.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
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: i3$1.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
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 = parseAssistContent;
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 text = this.message().payload?.['text'];
4584
- return typeof text === 'string' ? text : '';
4585
- }, ...(ngDevMode ? [{ debugName: "streamText" }] : /* istanbul ignore next */ []));
4586
- this.toolCalls = computed(() => {
4587
- const raw = this.readMeta('toolCalls');
4588
- return Array.isArray(raw) ? raw : [];
4589
- }, ...(ngDevMode ? [{ debugName: "toolCalls" }] : /* istanbul ignore next */ []));
4590
- this.parsed = computed(() => {
4591
- if (this.isStreaming()) {
4592
- return { thinking: null, body: '' };
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
- const text = this.message().payload?.['text'];
4595
- return parseAssistContent(typeof text === 'string' ? text : '');
4596
- }, ...(ngDevMode ? [{ debugName: "parsed" }] : /* istanbul ignore next */ []));
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
- renderMarkdown(raw) {
4611
- return axmRenderAssistMarkdown(raw, this.sanitizer);
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 data = o['data'];
4657
- if (data != null && typeof data === 'object' && !Array.isArray(data)) {
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
- return raw.trim() ? raw : '';
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 data = o['data'];
4684
- if (data != null && typeof data === 'object' && !Array.isArray(data)) {
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.get(AXPCommonSettings.DebugMode);
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
- AXBadgeModule,
5496
+ AXButtonModule,
5721
5497
  AXCodeEditorModule,
5498
+ AXPMarkdownViewerComponent,
5499
+ AXPMarkdownTemplateDirective,
5722
5500
  FormsModule,
5723
5501
  AXTranslationModule,
5724
5502
  AsyncPipe,
5725
- ], template: `
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(/&lt;(\/?redacted_thinking)&gt;/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 isAssistConversation(conversation) {
6799
- const assistId = conversation?.metadata?.['assistId'];
6800
- return typeof assistId === 'string' && assistId.trim().length > 0;
5611
+ function isRecord(value) {
5612
+ return typeof value === 'object' && value !== null;
6801
5613
  }
6802
- async function renameAssistConversation(context) {
6803
- const conversationId = context?.conversation?.id?.trim();
6804
- if (!conversationId || !context.conversationService?.updateConversation) {
6805
- return;
5614
+ function extractMessageCopyText(message) {
5615
+ if (!message) {
5616
+ return '';
6806
5617
  }
6807
- let nextTitle = '';
6808
- const popupTitle = (await context.translationService?.translateAsync?.('@conversation:chat.assist-conversation.rename.title')) ??
6809
- 'Rename Chat';
6810
- if (context.popupService?.open) {
6811
- const popupResult = await context.popupService.open(AXMAssistConversationRenameDialogComponent, {
6812
- title: popupTitle,
6813
- size: 'sm',
6814
- closeButton: true,
6815
- data: {
6816
- titleValue: context.conversation?.title ?? '',
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
- else {
6822
- const fallbackValue = globalThis.prompt(popupTitle, context.conversation?.title ?? '');
6823
- nextTitle = fallbackValue?.trim() ?? '';
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
- if (!nextTitle || nextTitle === (context.conversation?.title ?? '').trim()) {
5646
+ return '';
5647
+ }
5648
+ async function copyMessageText(message) {
5649
+ const copyText = extractMessageCopyText(message);
5650
+ if (!copyText) {
6826
5651
  return;
6827
5652
  }
6828
- await context.conversationService.updateConversation(conversationId, {
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
- AX_CONVERSATION_TAB_CHANNELS,
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
- id: 'rename-assist-conversation',
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: i3$1.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
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
- data: { reuse: true },
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$6.AXPWorkflowModule,
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