@acorex/modules 21.0.0-next.64 → 21.0.0-next.67
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ai-management/README.md +1 -1
- package/fesm2022/{acorex-modules-ai-management-agent.entity-X51GLTdi.mjs → acorex-modules-ai-management-agent.entity-C3uhOrld.mjs} +81 -1
- package/fesm2022/acorex-modules-ai-management-agent.entity-C3uhOrld.mjs.map +1 -0
- package/fesm2022/{acorex-modules-ai-management-assist-delegated-agent-configurator-widget-edit.component-u1hZ4P5s.mjs → acorex-modules-ai-management-assist-delegated-agent-configurator-widget-edit.component-BC6vzGG9.mjs} +25 -3
- package/fesm2022/acorex-modules-ai-management-assist-delegated-agent-configurator-widget-edit.component-BC6vzGG9.mjs.map +1 -0
- package/fesm2022/{acorex-modules-ai-management-assist.entity-2h5KE9UH.mjs → acorex-modules-ai-management-assist.entity-DRXYUOAf.mjs} +2 -2
- package/fesm2022/acorex-modules-ai-management-assist.entity-DRXYUOAf.mjs.map +1 -0
- package/fesm2022/acorex-modules-ai-management.mjs +205 -38
- package/fesm2022/acorex-modules-ai-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-application-management.mjs +47 -2
- package/fesm2022/acorex-modules-application-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-assessment-management-acorex-modules-assessment-management-DqmJVJ0z.mjs → acorex-modules-assessment-management-acorex-modules-assessment-management-DHM3xrMh.mjs} +106 -88
- package/fesm2022/acorex-modules-assessment-management-acorex-modules-assessment-management-DHM3xrMh.mjs.map +1 -0
- package/fesm2022/{acorex-modules-assessment-management-assessment-case.entity-DhVwPz0T.mjs → acorex-modules-assessment-management-assessment-case.entity-DLO1sfD4.mjs} +3 -2
- package/fesm2022/acorex-modules-assessment-management-assessment-case.entity-DLO1sfD4.mjs.map +1 -0
- package/fesm2022/acorex-modules-assessment-management-assessment-session-answers-view.util-CDAdDXDl.mjs +122 -0
- package/fesm2022/acorex-modules-assessment-management-assessment-session-answers-view.util-CDAdDXDl.mjs.map +1 -0
- package/fesm2022/{acorex-modules-assessment-management-assessment-session.entity-BvV2Qgw1.mjs → acorex-modules-assessment-management-assessment-session.entity-FDgQPy0O.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-assessment-session.entity-BvV2Qgw1.mjs.map → acorex-modules-assessment-management-assessment-session.entity-FDgQPy0O.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-fill-assessment-session.command-4fkaeAG-.mjs → acorex-modules-assessment-management-fill-assessment-session.command-CfcHl3L_.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-fill-assessment-session.command-4fkaeAG-.mjs.map → acorex-modules-assessment-management-fill-assessment-session.command-CfcHl3L_.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-preview-question.command-6IGOdVVZ.mjs → acorex-modules-assessment-management-preview-question.command-DsQ_LTMn.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-preview-question.command-6IGOdVVZ.mjs.map → acorex-modules-assessment-management-preview-question.command-DsQ_LTMn.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-preview-questionnaire.command-CRDBe_BS.mjs → acorex-modules-assessment-management-preview-questionnaire.command-BKxRn8Ha.mjs} +7 -7
- package/fesm2022/acorex-modules-assessment-management-preview-questionnaire.command-BKxRn8Ha.mjs.map +1 -0
- package/fesm2022/{acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-B2ES-zcL.mjs → acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-Dxhk9mD4.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-B2ES-zcL.mjs.map → acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-Dxhk9mD4.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-question-bank-item.entity-Cw2WCdYK.mjs → acorex-modules-assessment-management-question-bank-item.entity-6H5NiAwi.mjs} +3 -2
- package/fesm2022/acorex-modules-assessment-management-question-bank-item.entity-6H5NiAwi.mjs.map +1 -0
- package/fesm2022/{acorex-modules-assessment-management-questionnaire-viewer-popup.component-D9I3S-ZT.mjs → acorex-modules-assessment-management-questionnaire-viewer-popup.component-B0ZKyWy5.mjs} +96 -7
- package/fesm2022/acorex-modules-assessment-management-questionnaire-viewer-popup.component-B0ZKyWy5.mjs.map +1 -0
- package/fesm2022/{acorex-modules-assessment-management-questionnaire.entity-D9nHUmQB.mjs → acorex-modules-assessment-management-questionnaire.entity-BS1ohT8P.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-questionnaire.entity-D9nHUmQB.mjs.map → acorex-modules-assessment-management-questionnaire.entity-BS1ohT8P.mjs.map} +1 -1
- package/fesm2022/acorex-modules-assessment-management-review-assessment-session.command-Dcopsdi4.mjs +228 -0
- package/fesm2022/acorex-modules-assessment-management-review-assessment-session.command-Dcopsdi4.mjs.map +1 -0
- package/fesm2022/{acorex-modules-assessment-management-view-session-answers.command-BOeO3Dit.mjs → acorex-modules-assessment-management-view-session-answers.command-3UWzJPH6.mjs} +4 -74
- package/fesm2022/acorex-modules-assessment-management-view-session-answers.command-3UWzJPH6.mjs.map +1 -0
- package/fesm2022/acorex-modules-assessment-management.mjs +1 -1
- package/fesm2022/{acorex-modules-asset-management-acorex-modules-asset-management-BtcY1UQy.mjs → acorex-modules-asset-management-acorex-modules-asset-management-BdiaXlkx.mjs} +12 -27
- package/fesm2022/acorex-modules-asset-management-acorex-modules-asset-management-BdiaXlkx.mjs.map +1 -0
- package/fesm2022/{acorex-modules-asset-management-asset-system-assignment.entity-pKZoxsjk.mjs → acorex-modules-asset-management-asset-system-assignment.entity-Bf9nJTkD.mjs} +2 -2
- package/fesm2022/{acorex-modules-asset-management-asset-system-assignment.entity-pKZoxsjk.mjs.map → acorex-modules-asset-management-asset-system-assignment.entity-Bf9nJTkD.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-asset-management-asset-system-type.entity-CXz2G5v1.mjs → acorex-modules-asset-management-asset-system-type.entity-Cbzu3bqC.mjs} +2 -2
- package/fesm2022/{acorex-modules-asset-management-asset-system-type.entity-CXz2G5v1.mjs.map → acorex-modules-asset-management-asset-system-type.entity-Cbzu3bqC.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-asset-management-asset-system.entity-C3zf6WVD.mjs → acorex-modules-asset-management-asset-system.entity-DA7dO3eE.mjs} +2 -2
- package/fesm2022/{acorex-modules-asset-management-asset-system.entity-C3zf6WVD.mjs.map → acorex-modules-asset-management-asset-system.entity-DA7dO3eE.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-asset-management-asset-type-section-component.entity-DTaeNNBW.mjs → acorex-modules-asset-management-asset-type-section-component.entity-C9B-TUQD.mjs} +2 -2
- package/fesm2022/{acorex-modules-asset-management-asset-type-section-component.entity-DTaeNNBW.mjs.map → acorex-modules-asset-management-asset-type-section-component.entity-C9B-TUQD.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-asset-management-asset-type-section.entity-Bes5h7aJ.mjs → acorex-modules-asset-management-asset-type-section.entity-BNz1Zfox.mjs} +2 -2
- package/fesm2022/{acorex-modules-asset-management-asset-type-section.entity-Bes5h7aJ.mjs.map → acorex-modules-asset-management-asset-type-section.entity-BNz1Zfox.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-asset-management-asset-type.entity-Ch8h0sph.mjs → acorex-modules-asset-management-asset-type.entity-D_bBxBKI.mjs} +2 -2
- package/fesm2022/{acorex-modules-asset-management-asset-type.entity-Ch8h0sph.mjs.map → acorex-modules-asset-management-asset-type.entity-D_bBxBKI.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-asset-management-asset.entity-DJ-A6lx1.mjs → acorex-modules-asset-management-asset.entity-Cf_H7edH.mjs} +74 -34
- package/fesm2022/acorex-modules-asset-management-asset.entity-Cf_H7edH.mjs.map +1 -0
- package/fesm2022/acorex-modules-asset-management.mjs +1 -1
- package/fesm2022/{acorex-modules-auth-acorex-modules-auth-D4IBi_VD.mjs → acorex-modules-auth-acorex-modules-auth-BUuEzfsI.mjs} +16 -14
- package/fesm2022/acorex-modules-auth-acorex-modules-auth-BUuEzfsI.mjs.map +1 -0
- package/fesm2022/{acorex-modules-auth-app-chooser.component-BEktaBWD.mjs → acorex-modules-auth-app-chooser.component-DnmLfX5x.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-app-chooser.component-BEktaBWD.mjs.map → acorex-modules-auth-app-chooser.component-DnmLfX5x.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-login.module-aAwHzXPj.mjs → acorex-modules-auth-login.module-D1-POhQk.mjs} +4 -4
- package/fesm2022/{acorex-modules-auth-login.module-aAwHzXPj.mjs.map → acorex-modules-auth-login.module-D1-POhQk.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-master.layout-BapDYFZ_.mjs → acorex-modules-auth-master.layout-DMP4RC6L.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-master.layout-BapDYFZ_.mjs.map → acorex-modules-auth-master.layout-DMP4RC6L.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-oauth-callback.component-Cyu2vqyK.mjs → acorex-modules-auth-oauth-callback.component-BhfFPeWT.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-oauth-callback.component-Cyu2vqyK.mjs.map → acorex-modules-auth-oauth-callback.component-BhfFPeWT.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-password.component-DB-ac0Rn.mjs → acorex-modules-auth-password.component-BMVSHYy7.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-password.component-DB-ac0Rn.mjs.map → acorex-modules-auth-password.component-BMVSHYy7.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-password.component-cPmwNpuq.mjs → acorex-modules-auth-password.component-Cm8DsDvu.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-password.component-cPmwNpuq.mjs.map → acorex-modules-auth-password.component-Cm8DsDvu.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-routes-r72zIRTa.mjs → acorex-modules-auth-routes-B85OzgW1.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-routes-r72zIRTa.mjs.map → acorex-modules-auth-routes-B85OzgW1.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-tenant-chooser.component-AQA2o6Ty.mjs → acorex-modules-auth-tenant-chooser.component-D6_rL2WP.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-tenant-chooser.component-AQA2o6Ty.mjs.map → acorex-modules-auth-tenant-chooser.component-D6_rL2WP.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-two-factor.module-Dx0CC5ic.mjs → acorex-modules-auth-two-factor.module-DfyDQIw-.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-two-factor.module-Dx0CC5ic.mjs.map → acorex-modules-auth-two-factor.module-DfyDQIw-.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-user-sessions.component-3Wr7DUDQ.mjs → acorex-modules-auth-user-sessions.component-gJSHI_eh.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-user-sessions.component-3Wr7DUDQ.mjs.map → acorex-modules-auth-user-sessions.component-gJSHI_eh.mjs.map} +1 -1
- package/fesm2022/acorex-modules-auth.mjs +1 -1
- package/fesm2022/acorex-modules-common.mjs +1 -201
- package/fesm2022/acorex-modules-common.mjs.map +1 -1
- package/fesm2022/{acorex-modules-content-management-acorex-modules-content-management-CO8lZb34.mjs → acorex-modules-content-management-acorex-modules-content-management-txpooXrE.mjs} +9 -42
- package/fesm2022/acorex-modules-content-management-acorex-modules-content-management-txpooXrE.mjs.map +1 -0
- package/fesm2022/{acorex-modules-content-management-permission-definition.provider-Bcq5uOVH.mjs → acorex-modules-content-management-permission-definition.provider-D9woYm2m.mjs} +2 -2
- package/fesm2022/{acorex-modules-content-management-permission-definition.provider-Bcq5uOVH.mjs.map → acorex-modules-content-management-permission-definition.provider-D9woYm2m.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-content-management-template-content-editor-widget-edit.component-D_q_xWeI.mjs → acorex-modules-content-management-template-content-editor-widget-edit.component-CQa1h31v.mjs} +2 -2
- package/fesm2022/{acorex-modules-content-management-template-content-editor-widget-edit.component-D_q_xWeI.mjs.map → acorex-modules-content-management-template-content-editor-widget-edit.component-CQa1h31v.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-content-management-template-content-editor-widget-view.component-DU5y6UxK.mjs → acorex-modules-content-management-template-content-editor-widget-view.component-DzM4oMNV.mjs} +2 -2
- package/fesm2022/{acorex-modules-content-management-template-content-editor-widget-view.component-DU5y6UxK.mjs.map → acorex-modules-content-management-template-content-editor-widget-view.component-DzM4oMNV.mjs.map} +1 -1
- package/fesm2022/acorex-modules-content-management.mjs +1 -1
- package/fesm2022/{acorex-modules-conversation-acorex-modules-conversation-DkdNLMKa.mjs → acorex-modules-conversation-acorex-modules-conversation-DYW31fEm.mjs} +157 -68
- package/fesm2022/acorex-modules-conversation-acorex-modules-conversation-DYW31fEm.mjs.map +1 -0
- package/fesm2022/acorex-modules-conversation-assist-delegated-agent-detail-popup.component-DQlE8l4c.mjs +329 -0
- package/fesm2022/acorex-modules-conversation-assist-delegated-agent-detail-popup.component-DQlE8l4c.mjs.map +1 -0
- package/fesm2022/{acorex-modules-conversation-comments-page.component-ehUCjoFD.mjs → acorex-modules-conversation-comments-page.component-CNqL-HdS.mjs} +2 -2
- package/fesm2022/{acorex-modules-conversation-comments-page.component-ehUCjoFD.mjs.map → acorex-modules-conversation-comments-page.component-CNqL-HdS.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-conversation-send-assist-chat-message.command-ZNcVi54N.mjs → acorex-modules-conversation-send-assist-chat-message.command-CuYYEqhb.mjs} +2 -2
- package/fesm2022/{acorex-modules-conversation-send-assist-chat-message.command-ZNcVi54N.mjs.map → acorex-modules-conversation-send-assist-chat-message.command-CuYYEqhb.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-conversation-start-assist-chat.command-CX6lm1lG.mjs → acorex-modules-conversation-start-assist-chat.command-BKwrZJDs.mjs} +2 -2
- package/fesm2022/{acorex-modules-conversation-start-assist-chat.command-CX6lm1lG.mjs.map → acorex-modules-conversation-start-assist-chat.command-BKwrZJDs.mjs.map} +1 -1
- package/fesm2022/acorex-modules-conversation.mjs +1 -1
- package/fesm2022/acorex-modules-data-management.mjs +78 -21
- package/fesm2022/acorex-modules-data-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-document-management.mjs +4 -4
- package/fesm2022/acorex-modules-document-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-help-desk-acorex-modules-help-desk-DVlO9JZw.mjs → acorex-modules-help-desk-acorex-modules-help-desk-IoBGIJ-Y.mjs} +5 -5
- package/fesm2022/acorex-modules-help-desk-acorex-modules-help-desk-IoBGIJ-Y.mjs.map +1 -0
- package/fesm2022/{acorex-modules-help-desk-capture-screen.component-rNPehEf8.mjs → acorex-modules-help-desk-capture-screen.component-DnupDyZu.mjs} +2 -2
- package/fesm2022/{acorex-modules-help-desk-capture-screen.component-rNPehEf8.mjs.map → acorex-modules-help-desk-capture-screen.component-DnupDyZu.mjs.map} +1 -1
- package/fesm2022/acorex-modules-help-desk.mjs +1 -1
- package/fesm2022/{acorex-modules-human-capital-management-acorex-modules-human-capital-management-uRz1c5Km.mjs → acorex-modules-human-capital-management-acorex-modules-human-capital-management-DrKulwY-.mjs} +20 -20
- package/fesm2022/{acorex-modules-human-capital-management-acorex-modules-human-capital-management-uRz1c5Km.mjs.map → acorex-modules-human-capital-management-acorex-modules-human-capital-management-DrKulwY-.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-human-capital-management-approve-leave-request.command-23klKnTy.mjs → acorex-modules-human-capital-management-approve-leave-request.command-TavX6h7z.mjs} +2 -2
- package/fesm2022/{acorex-modules-human-capital-management-approve-leave-request.command-23klKnTy.mjs.map → acorex-modules-human-capital-management-approve-leave-request.command-TavX6h7z.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-human-capital-management-assign-position-assignment.command-BJ8xUiR2.mjs → acorex-modules-human-capital-management-assign-position-assignment.command-ZEmi88vf.mjs} +2 -2
- package/fesm2022/{acorex-modules-human-capital-management-assign-position-assignment.command-BJ8xUiR2.mjs.map → acorex-modules-human-capital-management-assign-position-assignment.command-ZEmi88vf.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-human-capital-management-cancel-leave-request.command-B3u1gXWI.mjs → acorex-modules-human-capital-management-cancel-leave-request.command-DzIMYIhe.mjs} +2 -2
- package/fesm2022/{acorex-modules-human-capital-management-cancel-leave-request.command-B3u1gXWI.mjs.map → acorex-modules-human-capital-management-cancel-leave-request.command-DzIMYIhe.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-human-capital-management-employee.entity-uhwOOw_y.mjs → acorex-modules-human-capital-management-employee.entity-CrVU_3Jv.mjs} +4 -10
- package/fesm2022/acorex-modules-human-capital-management-employee.entity-CrVU_3Jv.mjs.map +1 -0
- package/fesm2022/{acorex-modules-human-capital-management-employment-type.entity-BQe82rsr.mjs → acorex-modules-human-capital-management-employment-type.entity-BeiaEsNZ.mjs} +2 -2
- package/fesm2022/{acorex-modules-human-capital-management-employment-type.entity-BQe82rsr.mjs.map → acorex-modules-human-capital-management-employment-type.entity-BeiaEsNZ.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-human-capital-management-leave-request.entity-CE4hs4C8.mjs → acorex-modules-human-capital-management-leave-request.entity-QeY6lcUY.mjs} +2 -2
- package/fesm2022/{acorex-modules-human-capital-management-leave-request.entity-CE4hs4C8.mjs.map → acorex-modules-human-capital-management-leave-request.entity-QeY6lcUY.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-human-capital-management-leave-type.entity-DJ4EEUKg.mjs → acorex-modules-human-capital-management-leave-type.entity-D7B3adkZ.mjs} +2 -2
- package/fesm2022/{acorex-modules-human-capital-management-leave-type.entity-DJ4EEUKg.mjs.map → acorex-modules-human-capital-management-leave-type.entity-D7B3adkZ.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-human-capital-management-lifecycle-event-type.entity-CB2hlyOP.mjs → acorex-modules-human-capital-management-lifecycle-event-type.entity-Dim-8hT7.mjs} +6 -3
- package/fesm2022/acorex-modules-human-capital-management-lifecycle-event-type.entity-Dim-8hT7.mjs.map +1 -0
- package/fesm2022/{acorex-modules-human-capital-management-lifecycle-event.entity-DWonFZpU.mjs → acorex-modules-human-capital-management-lifecycle-event.entity-3HtYOKrY.mjs} +17 -5
- package/fesm2022/acorex-modules-human-capital-management-lifecycle-event.entity-3HtYOKrY.mjs.map +1 -0
- package/fesm2022/{acorex-modules-human-capital-management-position-assignment.entity-o8PjggiT.mjs → acorex-modules-human-capital-management-position-assignment.entity-Byxt921P.mjs} +2 -2
- package/fesm2022/{acorex-modules-human-capital-management-position-assignment.entity-o8PjggiT.mjs.map → acorex-modules-human-capital-management-position-assignment.entity-Byxt921P.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-human-capital-management-reject-leave-request.command-B6sr7oey.mjs → acorex-modules-human-capital-management-reject-leave-request.command-CAvjZTG9.mjs} +2 -2
- package/fesm2022/{acorex-modules-human-capital-management-reject-leave-request.command-B6sr7oey.mjs.map → acorex-modules-human-capital-management-reject-leave-request.command-CAvjZTG9.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-human-capital-management-revoke-position-assignment.command-aH7qTRnr.mjs → acorex-modules-human-capital-management-revoke-position-assignment.command-BeWrsQo8.mjs} +2 -2
- package/fesm2022/{acorex-modules-human-capital-management-revoke-position-assignment.command-aH7qTRnr.mjs.map → acorex-modules-human-capital-management-revoke-position-assignment.command-BeWrsQo8.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-human-capital-management-start-lifecycle-event-flow.command-B-VsXS4c.mjs → acorex-modules-human-capital-management-start-lifecycle-event-flow.command-Bz2SZcmm.mjs} +2 -2
- package/fesm2022/{acorex-modules-human-capital-management-start-lifecycle-event-flow.command-B-VsXS4c.mjs.map → acorex-modules-human-capital-management-start-lifecycle-event-flow.command-Bz2SZcmm.mjs.map} +1 -1
- package/fesm2022/acorex-modules-human-capital-management.mjs +1 -1
- package/fesm2022/acorex-modules-locale-management.mjs +68 -1
- package/fesm2022/acorex-modules-locale-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-meeting-management.mjs +1 -1
- package/fesm2022/acorex-modules-meeting-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-notification-management-notification-page.component-B017YY1H.mjs → acorex-modules-notification-management-notification-page.component-6YOiGgKm.mjs} +2 -2
- package/fesm2022/{acorex-modules-notification-management-notification-page.component-B017YY1H.mjs.map → acorex-modules-notification-management-notification-page.component-6YOiGgKm.mjs.map} +1 -1
- package/fesm2022/acorex-modules-notification-management.mjs +2 -2
- package/fesm2022/acorex-modules-notification-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-organization-management-acorex-modules-organization-management-BZtWfgmH.mjs → acorex-modules-organization-management-acorex-modules-organization-management-Iopv_G-d.mjs} +37 -37
- package/fesm2022/{acorex-modules-organization-management-acorex-modules-organization-management-BZtWfgmH.mjs.map → acorex-modules-organization-management-acorex-modules-organization-management-Iopv_G-d.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-add-business-unit-to-business-unit.command-C-yO5On4.mjs → acorex-modules-organization-management-add-business-unit-to-business-unit.command-D7NChP_A.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-add-business-unit-to-business-unit.command-C-yO5On4.mjs.map → acorex-modules-organization-management-add-business-unit-to-business-unit.command-D7NChP_A.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-add-position-to-business-unit.command-BL5eWJ56.mjs → acorex-modules-organization-management-add-position-to-business-unit.command-PkeqXFt1.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-add-position-to-business-unit.command-BL5eWJ56.mjs.map → acorex-modules-organization-management-add-position-to-business-unit.command-PkeqXFt1.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-add-team-to-business-unit.command-l4N6g0Hc.mjs → acorex-modules-organization-management-add-team-to-business-unit.command-jalyX-F4.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-add-team-to-business-unit.command-l4N6g0Hc.mjs.map → acorex-modules-organization-management-add-team-to-business-unit.command-jalyX-F4.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-business-unit.entity-CONTwX52.mjs → acorex-modules-organization-management-business-unit.entity-CBjAC9Ip.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-business-unit.entity-CONTwX52.mjs.map → acorex-modules-organization-management-business-unit.entity-CBjAC9Ip.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-chart.entity-DeKPBfgx.mjs → acorex-modules-organization-management-chart.entity-CaY_5LGN.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-chart.entity-DeKPBfgx.mjs.map → acorex-modules-organization-management-chart.entity-CaY_5LGN.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-company.entity-BAlz8AfD.mjs → acorex-modules-organization-management-company.entity-BUBhqyCn.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-company.entity-BAlz8AfD.mjs.map → acorex-modules-organization-management-company.entity-BUBhqyCn.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-entity.provider-DjPSiqcX.mjs → acorex-modules-organization-management-entity.provider-BZsy_wi6.mjs} +15 -15
- package/fesm2022/{acorex-modules-organization-management-entity.provider-DjPSiqcX.mjs.map → acorex-modules-organization-management-entity.provider-BZsy_wi6.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-feature-definition.provider-BLmayeSc.mjs → acorex-modules-organization-management-feature-definition.provider-CEO1nSFP.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-feature-definition.provider-BLmayeSc.mjs.map → acorex-modules-organization-management-feature-definition.provider-CEO1nSFP.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-job-definition-pages-component.provider-HBi-EMRE.mjs → acorex-modules-organization-management-job-definition-pages-component.provider-ChRGp5ZI.mjs} +3 -3
- package/fesm2022/{acorex-modules-organization-management-job-definition-pages-component.provider-HBi-EMRE.mjs.map → acorex-modules-organization-management-job-definition-pages-component.provider-ChRGp5ZI.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-job-definition-responsibilities-page.component-CtIfsZ6x.mjs → acorex-modules-organization-management-job-definition-responsibilities-page.component-aWZO09Xw.mjs} +3 -3
- package/fesm2022/{acorex-modules-organization-management-job-definition-responsibilities-page.component-CtIfsZ6x.mjs.map → acorex-modules-organization-management-job-definition-responsibilities-page.component-aWZO09Xw.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-job-definition-skills-page.component-C1vCQayM.mjs → acorex-modules-organization-management-job-definition-skills-page.component-DJcFhQM9.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-job-definition-skills-page.component-C1vCQayM.mjs.map → acorex-modules-organization-management-job-definition-skills-page.component-DJcFhQM9.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-job-definition.entity-Db5li0zL.mjs → acorex-modules-organization-management-job-definition.entity-BoM49wYi.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-job-definition.entity-Db5li0zL.mjs.map → acorex-modules-organization-management-job-definition.entity-BoM49wYi.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-job-level.datasource-BTRKW7nq.mjs → acorex-modules-organization-management-job-level.datasource-DbQG79uR.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-job-level.datasource-BTRKW7nq.mjs.map → acorex-modules-organization-management-job-level.datasource-DbQG79uR.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-job-level.entity-Cn-91_r8.mjs → acorex-modules-organization-management-job-level.entity-XO-NsBG-.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-job-level.entity-Cn-91_r8.mjs.map → acorex-modules-organization-management-job-level.entity-XO-NsBG-.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-menu.provider-CVmV-hY5.mjs → acorex-modules-organization-management-menu.provider-DXW6aUIX.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-menu.provider-CVmV-hY5.mjs.map → acorex-modules-organization-management-menu.provider-DXW6aUIX.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-org-chart-default-node-contribution.provider-bdtNexEf.mjs → acorex-modules-organization-management-org-chart-default-node-contribution.provider-ClKr6K6Y.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-org-chart-default-node-contribution.provider-bdtNexEf.mjs.map → acorex-modules-organization-management-org-chart-default-node-contribution.provider-ClKr6K6Y.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-org-chart-employee-flyout-contribution.provider-B0aaFv5p.mjs → acorex-modules-organization-management-org-chart-employee-flyout-contribution.provider-BjIDzwXF.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-org-chart-employee-flyout-contribution.provider-B0aaFv5p.mjs.map → acorex-modules-organization-management-org-chart-employee-flyout-contribution.provider-BjIDzwXF.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-org-chart-position-employee-node-contribution.provider-Xe4nhY3j.mjs → acorex-modules-organization-management-org-chart-position-employee-node-contribution.provider-DRAlUmIa.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-org-chart-position-employee-node-contribution.provider-Xe4nhY3j.mjs.map → acorex-modules-organization-management-org-chart-position-employee-node-contribution.provider-DRAlUmIa.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-org-chart-ux-node-contribution.provider-CTprHwCi.mjs → acorex-modules-organization-management-org-chart-ux-node-contribution.provider-DwSjov_Z.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-org-chart-ux-node-contribution.provider-CTprHwCi.mjs.map → acorex-modules-organization-management-org-chart-ux-node-contribution.provider-DwSjov_Z.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-org-chart.page-ChXY8ncD.mjs → acorex-modules-organization-management-org-chart.page-CuPEM-_N.mjs} +3 -3
- package/fesm2022/{acorex-modules-organization-management-org-chart.page-ChXY8ncD.mjs.map → acorex-modules-organization-management-org-chart.page-CuPEM-_N.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-permission-definition.provider-8t2vBgtp.mjs → acorex-modules-organization-management-permission-definition.provider-BNthP0QV.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-permission-definition.provider-8t2vBgtp.mjs.map → acorex-modules-organization-management-permission-definition.provider-BNthP0QV.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-position.entity-BVWbTeks.mjs → acorex-modules-organization-management-position.entity-Cja3CYmL.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-position.entity-BVWbTeks.mjs.map → acorex-modules-organization-management-position.entity-Cja3CYmL.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-remove-position-from-business-unit.command-DWzFncr1.mjs → acorex-modules-organization-management-remove-position-from-business-unit.command-Dm1a6-uO.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-remove-position-from-business-unit.command-DWzFncr1.mjs.map → acorex-modules-organization-management-remove-position-from-business-unit.command-Dm1a6-uO.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-replace-position-assignee.command-CNa-CZOv.mjs → acorex-modules-organization-management-replace-position-assignee.command-BWtzQZyW.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-replace-position-assignee.command-CNa-CZOv.mjs.map → acorex-modules-organization-management-replace-position-assignee.command-BWtzQZyW.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-CTSCcyFv.mjs → acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-C4W0VlL5.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-CTSCcyFv.mjs.map → acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-C4W0VlL5.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix-widget-view.component-C82TQFS-.mjs → acorex-modules-organization-management-responsibilities-matrix-widget-view.component-CaPqjai7.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix-widget-view.component-C82TQFS-.mjs.map → acorex-modules-organization-management-responsibilities-matrix-widget-view.component-CaPqjai7.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix.component-DjVuISfE.mjs → acorex-modules-organization-management-responsibilities-matrix.component-nJuP6fA0.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix.component-DjVuISfE.mjs.map → acorex-modules-organization-management-responsibilities-matrix.component-nJuP6fA0.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-responsibility-level.entity-BlENDhF6.mjs → acorex-modules-organization-management-responsibility-level.entity-CvvzIjvE.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-responsibility-level.entity-BlENDhF6.mjs.map → acorex-modules-organization-management-responsibility-level.entity-CvvzIjvE.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-responsibility.entity-DamPTQMp.mjs → acorex-modules-organization-management-responsibility.entity-Cc0Ou-hc.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-responsibility.entity-DamPTQMp.mjs.map → acorex-modules-organization-management-responsibility.entity-Cc0Ou-hc.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-settings.provider-CtQo6YHj.mjs → acorex-modules-organization-management-settings.provider-C33ZatCD.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-settings.provider-CtQo6YHj.mjs.map → acorex-modules-organization-management-settings.provider-C33ZatCD.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-team-business-unit.entity-BfvqQb1K.mjs → acorex-modules-organization-management-team-business-unit.entity-DGuF5ux1.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-team-business-unit.entity-BfvqQb1K.mjs.map → acorex-modules-organization-management-team-business-unit.entity-DGuF5ux1.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-team-member-role.entity-wWoB56Il.mjs → acorex-modules-organization-management-team-member-role.entity-BMXkNavp.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-team-member-role.entity-wWoB56Il.mjs.map → acorex-modules-organization-management-team-member-role.entity-BMXkNavp.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-team-member.entity-COGrDN_G.mjs → acorex-modules-organization-management-team-member.entity-Deem7M3N.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-team-member.entity-COGrDN_G.mjs.map → acorex-modules-organization-management-team-member.entity-Deem7M3N.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-team.entity-DC_rqp9e.mjs → acorex-modules-organization-management-team.entity-CNmpaJ3F.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-team.entity-DC_rqp9e.mjs.map → acorex-modules-organization-management-team.entity-CNmpaJ3F.mjs.map} +1 -1
- package/fesm2022/acorex-modules-organization-management.mjs +1 -1
- package/fesm2022/{acorex-modules-product-catalog-product-sku.entity-BNJHLs-b.mjs → acorex-modules-product-catalog-product-sku.entity-C3ynevYI.mjs} +2 -2
- package/fesm2022/acorex-modules-product-catalog-product-sku.entity-C3ynevYI.mjs.map +1 -0
- package/fesm2022/acorex-modules-product-catalog.mjs +1 -1
- package/fesm2022/acorex-modules-security-management.mjs +76 -2
- package/fesm2022/acorex-modules-security-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-settings-management-acorex-modules-settings-management-B4Ee8USF.mjs → acorex-modules-settings-management-acorex-modules-settings-management-Dj9u0VEL.mjs} +5 -5
- package/fesm2022/{acorex-modules-settings-management-acorex-modules-settings-management-B4Ee8USF.mjs.map → acorex-modules-settings-management-acorex-modules-settings-management-Dj9u0VEL.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-settings-management-permission-definition.provider-nNhEFyc-.mjs → acorex-modules-settings-management-permission-definition.provider-DpRn1jAo.mjs} +2 -2
- package/fesm2022/{acorex-modules-settings-management-permission-definition.provider-nNhEFyc-.mjs.map → acorex-modules-settings-management-permission-definition.provider-DpRn1jAo.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-settings-management-setting-page.component-CEvWwS_a.mjs → acorex-modules-settings-management-setting-page.component-C9wPgm_P.mjs} +2 -2
- package/fesm2022/{acorex-modules-settings-management-setting-page.component-CEvWwS_a.mjs.map → acorex-modules-settings-management-setting-page.component-C9wPgm_P.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-settings-management-setting-view.component-C6ftmjuK.mjs → acorex-modules-settings-management-setting-view.component-BQ69Bx8C.mjs} +31 -4
- package/fesm2022/acorex-modules-settings-management-setting-view.component-BQ69Bx8C.mjs.map +1 -0
- package/fesm2022/acorex-modules-settings-management.mjs +1 -1
- package/fesm2022/{acorex-modules-task-management-acorex-modules-task-management-DAh3IByo.mjs → acorex-modules-task-management-acorex-modules-task-management-BB7eeaYX.mjs} +7 -9
- package/fesm2022/acorex-modules-task-management-acorex-modules-task-management-BB7eeaYX.mjs.map +1 -0
- package/fesm2022/{acorex-modules-task-management-task-board.page-C2hB9JPM.mjs → acorex-modules-task-management-task-board.page-BmUIngWk.mjs} +7 -7
- package/fesm2022/{acorex-modules-task-management-task-board.page-C2hB9JPM.mjs.map → acorex-modules-task-management-task-board.page-BmUIngWk.mjs.map} +1 -1
- package/fesm2022/acorex-modules-task-management.mjs +1 -1
- package/fesm2022/acorex-modules-tenant-management.mjs +46 -1
- package/fesm2022/acorex-modules-tenant-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-workflow-management-index-BhVZ1Bcw.mjs → acorex-modules-workflow-management-index-CdaVEEgn.mjs} +2 -2
- package/fesm2022/acorex-modules-workflow-management-index-CdaVEEgn.mjs.map +1 -0
- package/fesm2022/acorex-modules-workflow-management-index-CxheG2ry.mjs +307 -0
- package/fesm2022/acorex-modules-workflow-management-index-CxheG2ry.mjs.map +1 -0
- package/fesm2022/{acorex-modules-workflow-management-workflow-task-popover.component-DjYDwHWU.mjs → acorex-modules-workflow-management-workflow-task-popover.component-B4hEv2-a.mjs} +3 -3
- package/fesm2022/{acorex-modules-workflow-management-workflow-task-popover.component-DjYDwHWU.mjs.map → acorex-modules-workflow-management-workflow-task-popover.component-B4hEv2-a.mjs.map} +1 -1
- package/fesm2022/acorex-modules-workflow-management.mjs +634 -129
- package/fesm2022/acorex-modules-workflow-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-workplacesafety-management-hazard-status.provider-v1cFaa3q.mjs +70 -0
- package/fesm2022/acorex-modules-workplacesafety-management-hazard-status.provider-v1cFaa3q.mjs.map +1 -0
- package/fesm2022/acorex-modules-workplacesafety-management.mjs +826 -0
- package/fesm2022/acorex-modules-workplacesafety-management.mjs.map +1 -0
- package/package.json +6 -2
- package/types/acorex-modules-ai-management.d.ts +46 -24
- package/types/acorex-modules-assessment-management.d.ts +8 -0
- package/types/acorex-modules-asset-management.d.ts +6 -0
- package/types/acorex-modules-common.d.ts +3 -9
- package/types/acorex-modules-conversation.d.ts +24 -5
- package/types/acorex-modules-dashboard-management.d.ts +7 -0
- package/types/acorex-modules-data-management.d.ts +11 -3
- package/types/acorex-modules-document-management.d.ts +14 -0
- package/types/acorex-modules-report-management.d.ts +7 -0
- package/types/acorex-modules-workflow-management.d.ts +92 -58
- package/types/acorex-modules-workplacesafety-management.d.ts +143 -0
- package/fesm2022/acorex-modules-ai-management-agent.entity-X51GLTdi.mjs.map +0 -1
- package/fesm2022/acorex-modules-ai-management-assist-delegated-agent-configurator-widget-edit.component-u1hZ4P5s.mjs.map +0 -1
- package/fesm2022/acorex-modules-ai-management-assist.entity-2h5KE9UH.mjs.map +0 -1
- package/fesm2022/acorex-modules-assessment-management-acorex-modules-assessment-management-DqmJVJ0z.mjs.map +0 -1
- package/fesm2022/acorex-modules-assessment-management-assessment-case.entity-DhVwPz0T.mjs.map +0 -1
- package/fesm2022/acorex-modules-assessment-management-preview-questionnaire.command-CRDBe_BS.mjs.map +0 -1
- package/fesm2022/acorex-modules-assessment-management-question-bank-item.entity-Cw2WCdYK.mjs.map +0 -1
- package/fesm2022/acorex-modules-assessment-management-questionnaire-viewer-popup.component-D9I3S-ZT.mjs.map +0 -1
- package/fesm2022/acorex-modules-assessment-management-view-session-answers.command-BOeO3Dit.mjs.map +0 -1
- package/fesm2022/acorex-modules-asset-management-acorex-modules-asset-management-BtcY1UQy.mjs.map +0 -1
- package/fesm2022/acorex-modules-asset-management-asset.entity-DJ-A6lx1.mjs.map +0 -1
- package/fesm2022/acorex-modules-auth-acorex-modules-auth-D4IBi_VD.mjs.map +0 -1
- package/fesm2022/acorex-modules-common-attachments-page.component-rc-wRjbZ.mjs +0 -92
- package/fesm2022/acorex-modules-common-attachments-page.component-rc-wRjbZ.mjs.map +0 -1
- package/fesm2022/acorex-modules-content-management-acorex-modules-content-management-CO8lZb34.mjs.map +0 -1
- package/fesm2022/acorex-modules-conversation-acorex-modules-conversation-DkdNLMKa.mjs.map +0 -1
- package/fesm2022/acorex-modules-conversation-assist-delegated-agent-detail-popup.component-VKPbkRqI.mjs +0 -288
- package/fesm2022/acorex-modules-conversation-assist-delegated-agent-detail-popup.component-VKPbkRqI.mjs.map +0 -1
- package/fesm2022/acorex-modules-help-desk-acorex-modules-help-desk-DVlO9JZw.mjs.map +0 -1
- package/fesm2022/acorex-modules-human-capital-management-employee.entity-uhwOOw_y.mjs.map +0 -1
- package/fesm2022/acorex-modules-human-capital-management-lifecycle-event-type.entity-CB2hlyOP.mjs.map +0 -1
- package/fesm2022/acorex-modules-human-capital-management-lifecycle-event.entity-DWonFZpU.mjs.map +0 -1
- package/fesm2022/acorex-modules-product-catalog-product-sku.entity-BNJHLs-b.mjs.map +0 -1
- package/fesm2022/acorex-modules-settings-management-setting-view.component-C6ftmjuK.mjs.map +0 -1
- package/fesm2022/acorex-modules-task-management-acorex-modules-task-management-DAh3IByo.mjs.map +0 -1
- package/fesm2022/acorex-modules-workflow-management-index-BhVZ1Bcw.mjs.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
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, AXPSettingsService, AXPCommonSettings, AXPFilterOperatorMiddlewareService, AXPEntityCommandScope, AXPFileStorageService, AXP_MENU_PROVIDER, AXP_SEARCH_PROVIDER, AXP_SEARCH_DEFINITION_PROVIDER } from '@acorex/platform/common';
|
|
3
|
+
import { createAllQueryView, AXPEntityQueryType, AXPSettingsService, AXPCommonSettings, AXPFileStorageStatus, AXPFilterOperatorMiddlewareService, AXPEntityCommandScope, AXPFileStorageService, AXP_MENU_PROVIDER, AXP_SEARCH_PROVIDER, AXP_SEARCH_DEFINITION_PROVIDER } from '@acorex/platform/common';
|
|
4
4
|
import { AXPSystemActionType, AXPPlatformScope, AXPDeviceService, AXP_MODULE_MANIFEST_PROVIDER } from '@acorex/platform/core';
|
|
5
5
|
import { AXPMarkdownViewerComponent, AXPThemeLayoutBlockComponent, AXPThemeLayoutStartSideComponent, AXPUserAvatarComponent, AXPMarkdownTemplateDirective, AXP_PAGE_COMPONENT_PROVIDER, AXP_TASK_BADGE_PROVIDERS } from '@acorex/platform/layout/components';
|
|
6
6
|
import { AXMEntityCrudServiceImpl, entityMasterCrudActions, entityMasterRecordActions, AXPEntityDefinitionRegistryService, AXPEntityService, cloneLayoutArrays, ensureLayoutSection, ensureLayoutPropertyView, resolveEntityPluginDetailPageOrder, ensureListActions, actionExists, AXP_ENTITY_ACTION_PLUGIN, AXP_ENTITY_DEFINITION_LOADER } from '@acorex/platform/layout/entity';
|
|
@@ -14,22 +14,22 @@ import { Router, ActivatedRoute, RouterModule, ROUTES } from '@angular/router';
|
|
|
14
14
|
import * as i1$2 from '@acorex/platform/layout/widget-core';
|
|
15
15
|
import { AXPWidgetsCatalog, AXPValueWidgetComponent, AXPWidgetGroupEnum, AXPWidgetCoreModule, AXP_WIDGET_DEFINITION_PROVIDER } from '@acorex/platform/layout/widget-core';
|
|
16
16
|
import { sortBy } from 'lodash-es';
|
|
17
|
-
import { RootConfig as RootConfig$1, axpAiAssistStarterPromptLabels, axpAiAssistInitialMessagesToTranscript, axpAiChatMessageGetText, AXPAiManagerService, axpAiChatMessageIsDelegatedReflectionExcluded, axpAiDelegatedAgentResultSegments, axpAiChatTextMessage, AXPAiChatToolRunContextService, AXPAiPlatformRuntimeContextBuilder, AIMANAGEMENT_STRUCTURED_TEXT_COMPLETION_COMMAND_KEY, persistAiChatAttachmentImage, AIMANAGEMENT_CHAT_TRANSCRIBE_SPEECH_COMMAND_KEY, AXPAiAssistChatModelCatalogService, axpAiParseSupervisorAgentToolName, axpAiDelegatedAgentPromptPreview, axpAiChatToolOrAgentResultBodyJson, axpAiDelegatedAgentOutcomeResponsesPlainText } from '@acorex/modules/ai-management';
|
|
18
|
-
import { AXConversationService, AXUserApi, AXConversationApi, AXMessageApi, AXRealtimeApi, conversationSharedStorage, AXNewConversationDialogComponent, AXComposerService, AXInfoBarService, AXConversationContainerDirective, AXSidebarComponent, AXInfoBarComponent, AXMessageListComponent, AXComposerComponent, 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_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, 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';
|
|
17
|
+
import { RootConfig as RootConfig$1, axpAiAssistStarterPromptLabels, axpAiAssistInitialMessagesToTranscript, axpAiChatMessageGetText, AXPAiManagerService, axpAiChatMessageIsDelegatedReflectionExcluded, axpAiDelegatedAgentResultSegments, axpSanitizeLastProviderPayloadForPersistence, axpAiChatTextMessage, AXPAiChatToolRunContextService, AXPAiPlatformRuntimeContextBuilder, AIMANAGEMENT_STRUCTURED_TEXT_COMPLETION_COMMAND_KEY, persistAiChatAttachmentImage, AIMANAGEMENT_CHAT_TRANSCRIBE_SPEECH_COMMAND_KEY, AXPAiAssistChatModelCatalogService, axpAiParseSupervisorAgentToolName, axpAiDelegatedAgentPromptPreview, axpAiChatToolOrAgentResultBodyJson, axpAiDelegatedAgentOutcomeResponsesPlainText } from '@acorex/modules/ai-management';
|
|
18
|
+
import { AXConversationService, AXUserApi, AXConversationApi, AXMessageApi, AXUploaderApi, AXRealtimeApi, conversationSharedStorage, AXNewConversationDialogComponent, AXComposerService, AXInfoBarService, AXConversationContainerDirective, AXSidebarComponent, AXInfoBarComponent, AXMessageListComponent, AXComposerComponent, 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_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, 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';
|
|
19
19
|
import { AXToastService } from '@acorex/components/toast';
|
|
20
|
-
import * as
|
|
20
|
+
import * as i2$1 from '@acorex/core/translation';
|
|
21
21
|
import { AXTranslationService, AXTranslationModule } from '@acorex/core/translation';
|
|
22
22
|
import * as i1$5 from '@acorex/platform/workflow';
|
|
23
23
|
import { AXPWorkflowAction, AXPWorkflowModule } from '@acorex/platform/workflow';
|
|
24
24
|
import * as i2 from '@acorex/components/button';
|
|
25
25
|
import { AXButtonModule, AXButtonComponent } from '@acorex/components/button';
|
|
26
|
-
import * as i2$
|
|
26
|
+
import * as i2$2 from '@acorex/components/decorators';
|
|
27
27
|
import { AXDecoratorModule } from '@acorex/components/decorators';
|
|
28
28
|
import { AXDialogService } from '@acorex/components/dialog';
|
|
29
29
|
import { AXPPageLayoutBaseComponent, AXPPageLayoutComponent } from '@acorex/platform/layout/views';
|
|
30
30
|
import { toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
31
31
|
import { map, Subject, filter } from 'rxjs';
|
|
32
|
-
import * as i3
|
|
32
|
+
import * as i3 from '@acorex/components/dropdown';
|
|
33
33
|
import { AXDropdownModule } from '@acorex/components/dropdown';
|
|
34
34
|
import { AXTextBoxModule } from '@acorex/components/text-box';
|
|
35
35
|
import * as i1 from '@angular/forms';
|
|
@@ -53,7 +53,7 @@ import { AXDropdownButtonModule } from '@acorex/components/dropdown-button';
|
|
|
53
53
|
import { AXFormModule } from '@acorex/components/form';
|
|
54
54
|
import * as i6 from '@acorex/components/loading';
|
|
55
55
|
import { AXLoadingModule } from '@acorex/components/loading';
|
|
56
|
-
import * as i2$
|
|
56
|
+
import * as i2$3 from '@acorex/components/skeleton';
|
|
57
57
|
import { AXSkeletonModule } from '@acorex/components/skeleton';
|
|
58
58
|
import { AXToolBarModule } from '@acorex/components/toolbar';
|
|
59
59
|
import * as i9 from '@acorex/core/format';
|
|
@@ -1426,7 +1426,7 @@ class AXMAssistSuggestionChipsComponent {
|
|
|
1426
1426
|
}
|
|
1427
1427
|
</div>
|
|
1428
1428
|
}
|
|
1429
|
-
`, isInline: true, dependencies: [{ 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: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type:
|
|
1429
|
+
`, isInline: true, dependencies: [{ 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: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: i2$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1430
1430
|
}
|
|
1431
1431
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMAssistSuggestionChipsComponent, decorators: [{
|
|
1432
1432
|
type: Component,
|
|
@@ -1497,7 +1497,7 @@ class AXMChatMessageListEmptyFallbackComponent {
|
|
|
1497
1497
|
</p>
|
|
1498
1498
|
</div>
|
|
1499
1499
|
</div>
|
|
1500
|
-
`, isInline: true, styles: [":host.ax-message-empty-host{display:block;width:100%;max-width:min(24rem,100%);margin-inline:auto}.ax-message-empty{position:relative;isolation:isolate;padding:.25rem}.ax-message-empty__ambient{position:absolute;inset:-2rem -1rem -1rem;z-index:0;pointer-events:none;overflow:hidden;border-radius:2rem}.ax-message-empty__grid{position:absolute;inset:0;background-image:linear-gradient(rgba(var(--ax-sys-color-on-surface),.04) 1px,transparent 1px),linear-gradient(90deg,rgba(var(--ax-sys-color-on-surface),.04) 1px,transparent 1px);background-size:24px 24px;mask-image:radial-gradient(ellipse 80% 70% at 50% 45%,black 20%,transparent 75%);opacity:.5}.ax-message-empty__card{position:relative;z-index:1;display:flex;flex-direction:column;align-items:center;text-align:center;padding:2rem 1.75rem 2.125rem;border-radius:1.25rem;border:1px solid rgba(var(--ax-sys-color-border-light-surface),.85);background:linear-gradient(165deg,rgba(var(--ax-sys-color-lightest-surface),.72),rgba(var(--ax-sys-color-surface),.55))}.ax-message-empty__icon-stack{position:relative;display:grid;place-items:center;margin-bottom:1.25rem}.ax-message-empty__pulse{position:absolute;width:5.5rem;height:5.5rem;border-radius:50%;background:radial-gradient(circle,rgba(var(--ax-sys-color-primary-500),.22),transparent 70%);animation:axm-empty-pulse 3.2s ease-in-out infinite}.ax-message-empty__icon-bg{position:relative;display:grid;place-items:center;width:4.25rem;height:4.25rem;border-radius:1.125rem;background:linear-gradient(145deg,rgba(var(--ax-sys-color-primary-500),.16),rgba(var(--ax-sys-color-primary-600),.06));border:1px solid rgba(var(--ax-sys-color-primary-500),.22);box-shadow:0 1px rgba(var(--ax-sys-color-on-primary-surface),.06) inset,0 12px 28px -16px rgba(var(--ax-sys-color-primary-600),.45)}.ax-message-empty__icon-bg i{font-size:1.875rem;line-height:1;color:rgb(var(--ax-sys-color-primary-600));opacity:.92}.ax-message-empty__eyebrow{margin:0 0 .35rem;font-size:.6875rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:rgb(var(--ax-sys-color-primary-600));opacity:.85}.ax-message-empty__title{margin:0 0 .65rem;font-size:1.375rem;font-weight:600;letter-spacing:-.03em;line-height:1.25;color:rgb(var(--ax-sys-color-on-surface))}.ax-message-empty__desc{margin:0;font-size:.9375rem;line-height:1.65;color:rgb(var(--ax-sys-color-on-surface));opacity:.62;max-width:20rem}.ax-message-empty__name{font-weight:600;color:rgb(var(--ax-sys-color-on-surface));opacity:.88}@keyframes axm-empty-pulse{0%,to{transform:scale(.92);opacity:.55}50%{transform:scale(1.06);opacity:.85}}@media(prefers-reduced-motion:reduce){.ax-message-empty__pulse{animation:none}}\n"], dependencies: [{ kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type:
|
|
1500
|
+
`, isInline: true, styles: [":host.ax-message-empty-host{display:block;width:100%;max-width:min(24rem,100%);margin-inline:auto}.ax-message-empty{position:relative;isolation:isolate;padding:.25rem}.ax-message-empty__ambient{position:absolute;inset:-2rem -1rem -1rem;z-index:0;pointer-events:none;overflow:hidden;border-radius:2rem}.ax-message-empty__grid{position:absolute;inset:0;background-image:linear-gradient(rgba(var(--ax-sys-color-on-surface),.04) 1px,transparent 1px),linear-gradient(90deg,rgba(var(--ax-sys-color-on-surface),.04) 1px,transparent 1px);background-size:24px 24px;mask-image:radial-gradient(ellipse 80% 70% at 50% 45%,black 20%,transparent 75%);opacity:.5}.ax-message-empty__card{position:relative;z-index:1;display:flex;flex-direction:column;align-items:center;text-align:center;padding:2rem 1.75rem 2.125rem;border-radius:1.25rem;border:1px solid rgba(var(--ax-sys-color-border-light-surface),.85);background:linear-gradient(165deg,rgba(var(--ax-sys-color-lightest-surface),.72),rgba(var(--ax-sys-color-surface),.55))}.ax-message-empty__icon-stack{position:relative;display:grid;place-items:center;margin-bottom:1.25rem}.ax-message-empty__pulse{position:absolute;width:5.5rem;height:5.5rem;border-radius:50%;background:radial-gradient(circle,rgba(var(--ax-sys-color-primary-500),.22),transparent 70%);animation:axm-empty-pulse 3.2s ease-in-out infinite}.ax-message-empty__icon-bg{position:relative;display:grid;place-items:center;width:4.25rem;height:4.25rem;border-radius:1.125rem;background:linear-gradient(145deg,rgba(var(--ax-sys-color-primary-500),.16),rgba(var(--ax-sys-color-primary-600),.06));border:1px solid rgba(var(--ax-sys-color-primary-500),.22);box-shadow:0 1px rgba(var(--ax-sys-color-on-primary-surface),.06) inset,0 12px 28px -16px rgba(var(--ax-sys-color-primary-600),.45)}.ax-message-empty__icon-bg i{font-size:1.875rem;line-height:1;color:rgb(var(--ax-sys-color-primary-600));opacity:.92}.ax-message-empty__eyebrow{margin:0 0 .35rem;font-size:.6875rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:rgb(var(--ax-sys-color-primary-600));opacity:.85}.ax-message-empty__title{margin:0 0 .65rem;font-size:1.375rem;font-weight:600;letter-spacing:-.03em;line-height:1.25;color:rgb(var(--ax-sys-color-on-surface))}.ax-message-empty__desc{margin:0;font-size:.9375rem;line-height:1.65;color:rgb(var(--ax-sys-color-on-surface));opacity:.62;max-width:20rem}.ax-message-empty__name{font-weight:600;color:rgb(var(--ax-sys-color-on-surface));opacity:.88}@keyframes axm-empty-pulse{0%,to{transform:scale(.92);opacity:.55}50%{transform:scale(1.06);opacity:.85}}@media(prefers-reduced-motion:reduce){.ax-message-empty__pulse{animation:none}}\n"], dependencies: [{ kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: i2$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1501
1501
|
}
|
|
1502
1502
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatMessageListEmptyFallbackComponent, decorators: [{
|
|
1503
1503
|
type: Component,
|
|
@@ -1572,6 +1572,10 @@ function descriptionPrefixForType(type, translation) {
|
|
|
1572
1572
|
}
|
|
1573
1573
|
}
|
|
1574
1574
|
|
|
1575
|
+
//#region ---- Imports ----
|
|
1576
|
+
//#endregion
|
|
1577
|
+
//#region ---- Chat API tokens (mock or production implementations) ----
|
|
1578
|
+
/** User profile, discovery, and presence for conversation chat. */
|
|
1575
1579
|
class AXMChatUserApi extends AXUserApi {
|
|
1576
1580
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatUserApi, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1577
1581
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatUserApi }); }
|
|
@@ -1579,6 +1583,7 @@ class AXMChatUserApi extends AXUserApi {
|
|
|
1579
1583
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatUserApi, decorators: [{
|
|
1580
1584
|
type: Injectable
|
|
1581
1585
|
}] });
|
|
1586
|
+
/** Conversation CRUD, participants, and inbox for conversation chat. */
|
|
1582
1587
|
class AXMChatConversationApi extends AXConversationApi {
|
|
1583
1588
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatConversationApi, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1584
1589
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatConversationApi }); }
|
|
@@ -1586,6 +1591,7 @@ class AXMChatConversationApi extends AXConversationApi {
|
|
|
1586
1591
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatConversationApi, decorators: [{
|
|
1587
1592
|
type: Injectable
|
|
1588
1593
|
}] });
|
|
1594
|
+
/** Message CRUD, reactions, and assist replies for conversation chat. */
|
|
1589
1595
|
class AXMChatMessageApi extends AXMessageApi {
|
|
1590
1596
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatMessageApi, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1591
1597
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatMessageApi }); }
|
|
@@ -1593,6 +1599,15 @@ class AXMChatMessageApi extends AXMessageApi {
|
|
|
1593
1599
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatMessageApi, decorators: [{
|
|
1594
1600
|
type: Injectable
|
|
1595
1601
|
}] });
|
|
1602
|
+
/** Media upload and URL resolution for conversation chat. */
|
|
1603
|
+
class AXMChatUploaderApi extends AXUploaderApi {
|
|
1604
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatUploaderApi, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1605
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatUploaderApi }); }
|
|
1606
|
+
}
|
|
1607
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatUploaderApi, decorators: [{
|
|
1608
|
+
type: Injectable
|
|
1609
|
+
}] });
|
|
1610
|
+
/** Realtime streams (messages, typing, presence) for conversation chat. */
|
|
1596
1611
|
class AXMChatRealtimeApi extends AXRealtimeApi {
|
|
1597
1612
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatRealtimeApi, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1598
1613
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatRealtimeApi }); }
|
|
@@ -2016,7 +2031,7 @@ class AXMChatEmptyAssistComposerComponent {
|
|
|
2016
2031
|
</div>
|
|
2017
2032
|
<axm-assist-suggestion-chips [items]="starterPromptItems()" />
|
|
2018
2033
|
</div>
|
|
2019
|
-
`, isInline: true, styles: [".axm-chat-empty-assist-composer{width:min(100%,64rem);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
|
|
2034
|
+
`, isInline: true, styles: [".axm-chat-empty-assist-composer{width:min(100%,64rem);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: i2$2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXMAssistSuggestionChipsComponent, selector: "axm-assist-suggestion-chips", inputs: ["items"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i2$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
2020
2035
|
}
|
|
2021
2036
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatEmptyAssistComposerComponent, decorators: [{
|
|
2022
2037
|
type: Component,
|
|
@@ -2320,7 +2335,7 @@ class AXMChatWithAssistDialogComponent extends AXBasePageComponent {
|
|
|
2320
2335
|
</div>
|
|
2321
2336
|
}
|
|
2322
2337
|
</ng-template>
|
|
2323
|
-
`, 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: i2$
|
|
2338
|
+
`, 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: i2$2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2$2.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 }); }
|
|
2324
2339
|
}
|
|
2325
2340
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatWithAssistDialogComponent, decorators: [{
|
|
2326
2341
|
type: Component,
|
|
@@ -2495,7 +2510,7 @@ class AXMChatSidebarNewActionsComponent {
|
|
|
2495
2510
|
</ax-fab-item>
|
|
2496
2511
|
</ax-fab>
|
|
2497
2512
|
</div>
|
|
2498
|
-
`, 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: i2$
|
|
2513
|
+
`, 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: i2$2.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 }); }
|
|
2499
2514
|
}
|
|
2500
2515
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatSidebarNewActionsComponent, decorators: [{
|
|
2501
2516
|
type: Component,
|
|
@@ -2609,20 +2624,18 @@ class AXMChatComponent extends AXPPageLayoutBaseComponent {
|
|
|
2609
2624
|
* @param conversationId - The ID of the selected conversation.
|
|
2610
2625
|
*/
|
|
2611
2626
|
onConversationSelected(conversationId) {
|
|
2612
|
-
|
|
2613
|
-
|
|
2614
|
-
|
|
2615
|
-
if (this.routeConversationId() !== conversationId) {
|
|
2627
|
+
const routeConversationId = this.routeConversationId();
|
|
2628
|
+
if (routeConversationId !== conversationId) {
|
|
2629
|
+
// URL is the source of truth; #syncConversationWithRoute selects the conversation.
|
|
2616
2630
|
void this.router.navigate([this.#getAppRouteSegment(), 'chat', conversationId]);
|
|
2617
2631
|
}
|
|
2632
|
+
else if (this.conversationService.activeConversationId() !== conversationId) {
|
|
2633
|
+
void this.conversationService.selectConversation(conversationId);
|
|
2634
|
+
}
|
|
2618
2635
|
// On mobile, close the sidebar when a conversation is selected
|
|
2619
2636
|
if (this.deviceService.isMobileDevice()) {
|
|
2620
2637
|
this.toggleStartSide();
|
|
2621
2638
|
}
|
|
2622
|
-
this.infoBarService.hideComponent();
|
|
2623
|
-
this.composerService.hideComponent();
|
|
2624
|
-
//optional
|
|
2625
|
-
// this.composerService.draftText.set('');
|
|
2626
2639
|
}
|
|
2627
2640
|
/**
|
|
2628
2641
|
* Navigates back to the conversation list (mobile view).
|
|
@@ -2671,7 +2684,7 @@ class AXMChatComponent extends AXPPageLayoutBaseComponent {
|
|
|
2671
2684
|
return this.activatedRoute.snapshot.parent?.paramMap.get('app') || 'platform';
|
|
2672
2685
|
}
|
|
2673
2686
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
2674
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMChatComponent, isStandalone: true, selector: "axm-chat", host: { listeners: { "keydown.escape": "onContainerEscape()" }, properties: { "tabindex": "\"-1\"" } }, usesInheritance: true, ngImport: i0, template: "<axp-page-layout #container axConversationContainer>\n <!-- Sidebar: Always visible on desktop, visible on mobile only when no conversation is selected -->\n\n <axp-layout-start-side class=\"ax-border-e ax-lightest-surface ax-h-full\">\n <axp-layout-content class=\"ax-flex ax-flex-col ax-min-h-0 ax-max-w-80\">\n <div class=\"ax-h-full ax-flex ax-flex-col ax-shrink-0\">\n <ax-conversation-sidebar (conversationSelected)=\"onConversationSelected($event.id)\" class=\"ax-group\">\n <ax-suffix>\n <div class=\"ax-flex ax-h-14 ax-shrink-0 ax-items-center ax-justify-end ax-overflow-hidden\">\n <axm-chat-sidebar-new-actions\n class=\"group-hover:!ax-translate-y-0 !ax-translate-y-36 ax-transition-transform ax-duration-200\"\n (conversationCreated)=\"onConversationSelected($event)\"\n />\n </div>\n </ax-suffix>\n </ax-conversation-sidebar>\n </div>\n </axp-layout-content>\n </axp-layout-start-side>\n\n <!-- Chat content: Always visible on desktop, visible on mobile only when a conversation is selected -->\n\n <axp-page-content class=\"ax-h-full ax-overflow-hidden !ax-p-0 ax-flex ax-min-h-0 ax-flex-col\">\n @if (showChatList()) {\n <ax-conversation-sidebar (conversationSelected)=\"onConversationSelected($event.id)\" class=\"ax-group\">\n <ax-suffix>\n <div class=\"ax-flex ax-h-14 ax-shrink-0 ax-items-center ax-justify-end ax-overflow-hidden\">\n <axm-chat-sidebar-new-actions\n class=\"group-hover:!ax-translate-y-0 !ax-translate-y-36 ax-transition-transform ax-duration-200\"\n (conversationCreated)=\"onConversationSelected($event)\"\n />\n </div>\n </ax-suffix>\n </ax-conversation-sidebar>\n } @else {\n <div class=\"ax-flex ax-h-full ax-min-h-0 ax-flex-1 ax-flex-col\">\n <ax-conversation-info-bar class=\"ax-shadow-md\">\n <ax-prefix>\n <!-- Back button visible only on mobile -->\n @if (deviceService.isMobileDevice()) {\n <ax-button look=\"blank\" (onClick)=\"openChatList()\">\n <ax-icon icon=\"fa-light fa-bars\"></ax-icon>\n </ax-button>\n } @else {\n <ax-button class=\"ax-rounded-full\" look=\"blank\" (onClick)=\"onContainerEscape()\" aria-label=\"Close Chat\">\n <ax-icon icon=\"fa-light fa-xmark ax-text-xl\"></ax-icon>\n </ax-button>\n }\n </ax-prefix>\n </ax-conversation-info-bar>\n <ax-conversation-message-list class=\"ax-min-h-0 ax-flex-1 ax-overflow-hidden\" style=\"direction: ltr\">\n <div ax-conversation-message-list-no-active class=\"ax-block\" style=\"width: min(95%, 50rem)\">\n <axm-chat-empty-assist-composer (conversationCreated)=\"onConversationSelected($event)\" />\n </div>\n <axm-chat-assist-composer-starter-prompts ax-conversation-message-list-empty />\n </ax-conversation-message-list>\n </div>\n }\n </axp-page-content>\n\n <axp-page-footer class=\"ax-block\">\n <ax-conversation-composer></ax-conversation-composer>\n </axp-page-footer>\n</axp-page-layout>\n", styles: [":host ::ng-deep #axp-page-footer-container{padding:0!important}:host ::ng-deep .date-separator{z-index:50!important}:host ::ng-deep axp-layout-header{padding:0!important}\n"], dependencies: [{ kind: "directive", type: AXConversationContainerDirective, selector: "[axConversationContainer]" }, { kind: "component", type: AXSidebarComponent, selector: "ax-conversation-sidebar", outputs: ["conversationSelected"] }, { kind: "component", type: AXInfoBarComponent, selector: "ax-conversation-info-bar", outputs: ["avatarClick", "searchClick", "searchQuery", "menuItemAction"] }, { kind: "component", type: AXMessageListComponent, selector: "ax-conversation-message-list", inputs: ["avatarTemplate"], outputs: ["messageAction"] }, { kind: "component", type: AXComposerComponent, selector: "ax-conversation-composer", outputs: ["messageSent", "emojiClick", "attachClick", "voiceClick"] }, { 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: AXDecoratorModule }, { kind: "component", type: i2$
|
|
2687
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMChatComponent, isStandalone: true, selector: "axm-chat", host: { listeners: { "keydown.escape": "onContainerEscape()" }, properties: { "tabindex": "\"-1\"" } }, usesInheritance: true, ngImport: i0, template: "<axp-page-layout #container axConversationContainer>\n <!-- Sidebar: Always visible on desktop, visible on mobile only when no conversation is selected -->\n\n <axp-layout-start-side class=\"ax-border-e ax-lightest-surface ax-h-full\">\n <axp-layout-content class=\"ax-flex ax-flex-col ax-min-h-0 ax-max-w-80\">\n <div class=\"ax-h-full ax-flex ax-flex-col ax-shrink-0\">\n <ax-conversation-sidebar (conversationSelected)=\"onConversationSelected($event.id)\" class=\"ax-group\">\n <ax-suffix>\n <div class=\"ax-flex ax-h-14 ax-shrink-0 ax-items-center ax-justify-end ax-overflow-hidden\">\n <axm-chat-sidebar-new-actions\n class=\"group-hover:!ax-translate-y-0 !ax-translate-y-36 ax-transition-transform ax-duration-200\"\n (conversationCreated)=\"onConversationSelected($event)\"\n />\n </div>\n </ax-suffix>\n </ax-conversation-sidebar>\n </div>\n </axp-layout-content>\n </axp-layout-start-side>\n\n <!-- Chat content: Always visible on desktop, visible on mobile only when a conversation is selected -->\n\n <axp-page-content class=\"ax-h-full ax-overflow-hidden !ax-p-0 ax-flex ax-min-h-0 ax-flex-col\">\n @if (showChatList()) {\n <ax-conversation-sidebar (conversationSelected)=\"onConversationSelected($event.id)\" class=\"ax-group\">\n <ax-suffix>\n <div class=\"ax-flex ax-h-14 ax-shrink-0 ax-items-center ax-justify-end ax-overflow-hidden\">\n <axm-chat-sidebar-new-actions\n class=\"group-hover:!ax-translate-y-0 !ax-translate-y-36 ax-transition-transform ax-duration-200\"\n (conversationCreated)=\"onConversationSelected($event)\"\n />\n </div>\n </ax-suffix>\n </ax-conversation-sidebar>\n } @else {\n <div class=\"ax-flex ax-h-full ax-min-h-0 ax-flex-1 ax-flex-col\">\n <ax-conversation-info-bar class=\"ax-shadow-md\">\n <ax-prefix>\n <!-- Back button visible only on mobile -->\n @if (deviceService.isMobileDevice()) {\n <ax-button look=\"blank\" (onClick)=\"openChatList()\">\n <ax-icon icon=\"fa-light fa-bars\"></ax-icon>\n </ax-button>\n } @else {\n <ax-button class=\"ax-rounded-full\" look=\"blank\" (onClick)=\"onContainerEscape()\" aria-label=\"Close Chat\">\n <ax-icon icon=\"fa-light fa-xmark ax-text-xl\"></ax-icon>\n </ax-button>\n }\n </ax-prefix>\n </ax-conversation-info-bar>\n <ax-conversation-message-list class=\"ax-min-h-0 ax-flex-1 ax-overflow-hidden\" style=\"direction: ltr\">\n <div ax-conversation-message-list-no-active class=\"ax-block\" style=\"width: min(95%, 50rem)\">\n <axm-chat-empty-assist-composer (conversationCreated)=\"onConversationSelected($event)\" />\n </div>\n <axm-chat-assist-composer-starter-prompts ax-conversation-message-list-empty />\n </ax-conversation-message-list>\n </div>\n }\n </axp-page-content>\n\n <axp-page-footer class=\"ax-block\">\n <ax-conversation-composer></ax-conversation-composer>\n </axp-page-footer>\n</axp-page-layout>\n", styles: [":host ::ng-deep #axp-page-footer-container{padding:0!important}:host ::ng-deep .date-separator{z-index:50!important}:host ::ng-deep axp-layout-header{padding:0!important}\n"], dependencies: [{ kind: "directive", type: AXConversationContainerDirective, selector: "[axConversationContainer]" }, { kind: "component", type: AXSidebarComponent, selector: "ax-conversation-sidebar", outputs: ["conversationSelected"] }, { kind: "component", type: AXInfoBarComponent, selector: "ax-conversation-info-bar", outputs: ["avatarClick", "searchClick", "searchQuery", "menuItemAction"] }, { kind: "component", type: AXMessageListComponent, selector: "ax-conversation-message-list", inputs: ["avatarTemplate"], outputs: ["messageAction"] }, { kind: "component", type: AXComposerComponent, selector: "ax-conversation-composer", outputs: ["messageSent", "emojiClick", "attachClick", "voiceClick"] }, { 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: AXDecoratorModule }, { kind: "component", type: i2$2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2$2.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: "component", type: AXPPageLayoutComponent, selector: "axp-page-layout" }, { kind: "component", type: AXPThemeLayoutBlockComponent, selector: " axp-page-content, axp-page-footer-container, axp-page-footer, axp-page-header, axp-page-header-container, axp-page-toolbar, axp-layout-content, axp-layout-page-content, axp-layout-sections, axp-layout-body, axp-layout-page-body, axp-layout-prefix, axp-layout-suffix, axp-layout-title-bar, axp-layout-title, axp-layout-title-actions, axp-layout-nav-button, axp-layout-description, axp-layout-breadcrumbs, axp-layout-list-action, " }, { kind: "component", type: AXPThemeLayoutStartSideComponent, selector: "axp-layout-page-start-side, axp-layout-start-side" }, { kind: "component", type: AXMChatSidebarNewActionsComponent, selector: "axm-chat-sidebar-new-actions", outputs: ["conversationCreated"] }, { kind: "component", type: AXMChatEmptyAssistComposerComponent, selector: "axm-chat-empty-assist-composer", outputs: ["conversationCreated"] }, { kind: "component", type: AXMChatAssistComposerStarterPromptsComponent, selector: "axm-chat-assist-composer-starter-prompts" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
2675
2688
|
}
|
|
2676
2689
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatComponent, decorators: [{
|
|
2677
2690
|
type: Component,
|
|
@@ -2701,6 +2714,40 @@ var chat_component = /*#__PURE__*/Object.freeze({
|
|
|
2701
2714
|
AXMChatComponent: AXMChatComponent
|
|
2702
2715
|
});
|
|
2703
2716
|
|
|
2717
|
+
//#region ---- Imports ----
|
|
2718
|
+
//#endregion
|
|
2719
|
+
//#region ---- Constants ----
|
|
2720
|
+
/** refType for multimedia attachments sent from conversation chat. */
|
|
2721
|
+
const AXM_CONVERSATION_CHAT_ATTACHMENT_REF_TYPE = `${RootConfig.module.name}.ChatAttachment`;
|
|
2722
|
+
/** File storage category for conversation chat attachments. */
|
|
2723
|
+
const AXM_CONVERSATION_CHAT_ATTACHMENT_CATEGORY = 'chat-attachment';
|
|
2724
|
+
//#endregion
|
|
2725
|
+
//#region ---- Persistence ----
|
|
2726
|
+
/**
|
|
2727
|
+
* Persists a chat attachment; {@link refId} is typically the conversation id (batch grouping for multi-send).
|
|
2728
|
+
*/
|
|
2729
|
+
async function persistChatAttachment(fileStorage, file, refId) {
|
|
2730
|
+
const trimmed = refId.trim();
|
|
2731
|
+
if (!trimmed) {
|
|
2732
|
+
throw new Error('refId is required for chat attachment persistence.');
|
|
2733
|
+
}
|
|
2734
|
+
const info = await fileStorage.save({
|
|
2735
|
+
file,
|
|
2736
|
+
name: file.name,
|
|
2737
|
+
refId: trimmed,
|
|
2738
|
+
refType: AXM_CONVERSATION_CHAT_ATTACHMENT_REF_TYPE,
|
|
2739
|
+
category: AXM_CONVERSATION_CHAT_ATTACHMENT_CATEGORY,
|
|
2740
|
+
status: AXPFileStorageStatus.Temporary,
|
|
2741
|
+
});
|
|
2742
|
+
const fileId = info.fileId?.trim();
|
|
2743
|
+
if (!fileId) {
|
|
2744
|
+
throw new Error('File storage did not return a fileId.');
|
|
2745
|
+
}
|
|
2746
|
+
await fileStorage.commit(fileId);
|
|
2747
|
+
return { fileId };
|
|
2748
|
+
}
|
|
2749
|
+
//#endregion
|
|
2750
|
+
|
|
2704
2751
|
//#region ---- Imports ----
|
|
2705
2752
|
//#endregion
|
|
2706
2753
|
//#region ---- Transcript read ----
|
|
@@ -2862,11 +2909,32 @@ function axmAssistUserFacingPayloadLine(transcript) {
|
|
|
2862
2909
|
const tail = lastUserIdx >= 0 ? transcript.slice(lastUserIdx) : transcript;
|
|
2863
2910
|
const responses = [];
|
|
2864
2911
|
let followUpItems = null;
|
|
2912
|
+
const nodeKeys = new Set();
|
|
2913
|
+
const fileIds = new Set();
|
|
2914
|
+
const tryPushVisible = (seg) => {
|
|
2915
|
+
if (seg.type === 'node') {
|
|
2916
|
+
const key = JSON.stringify(seg.content);
|
|
2917
|
+
if (nodeKeys.has(key)) {
|
|
2918
|
+
return;
|
|
2919
|
+
}
|
|
2920
|
+
nodeKeys.add(key);
|
|
2921
|
+
}
|
|
2922
|
+
else if (seg.type === 'file') {
|
|
2923
|
+
const fileId = seg.content.fileId?.trim() ?? '';
|
|
2924
|
+
if (fileId && fileIds.has(fileId)) {
|
|
2925
|
+
return;
|
|
2926
|
+
}
|
|
2927
|
+
if (fileId) {
|
|
2928
|
+
fileIds.add(fileId);
|
|
2929
|
+
}
|
|
2930
|
+
}
|
|
2931
|
+
responses.push(seg);
|
|
2932
|
+
};
|
|
2865
2933
|
for (const m of tail) {
|
|
2866
2934
|
if (m.role === 'assistant' && !axpAiChatMessageIsDelegatedReflectionExcluded(m)) {
|
|
2867
2935
|
for (const r of m.responses) {
|
|
2868
2936
|
if (r.type === 'text' || r.type === 'node' || r.type === 'file') {
|
|
2869
|
-
|
|
2937
|
+
tryPushVisible(r);
|
|
2870
2938
|
}
|
|
2871
2939
|
else if (r.type === 'followUp') {
|
|
2872
2940
|
followUpItems = r.content;
|
|
@@ -2890,7 +2958,7 @@ function axmAssistUserFacingPayloadLine(transcript) {
|
|
|
2890
2958
|
followUpItems = seg.content;
|
|
2891
2959
|
}
|
|
2892
2960
|
else if (seg.type === 'text' || seg.type === 'node' || seg.type === 'file') {
|
|
2893
|
-
|
|
2961
|
+
tryPushVisible(seg);
|
|
2894
2962
|
}
|
|
2895
2963
|
}
|
|
2896
2964
|
}
|
|
@@ -3012,8 +3080,7 @@ function axmAssistUserVisibleItemsForLine(line) {
|
|
|
3012
3080
|
out.push({
|
|
3013
3081
|
kind: 'file',
|
|
3014
3082
|
fileId: seg.content.fileId,
|
|
3015
|
-
|
|
3016
|
-
name: seg.content.name,
|
|
3083
|
+
...(seg.content.isDownloadable ? { isDownloadable: true } : {}),
|
|
3017
3084
|
});
|
|
3018
3085
|
}
|
|
3019
3086
|
else if (seg.type === 'followUp' && !followUpPushed && axmUserVisibleChatResponse(line, seg)) {
|
|
@@ -3045,8 +3112,7 @@ function axmAssistUserVisibleItemsForLine(line) {
|
|
|
3045
3112
|
out.push({
|
|
3046
3113
|
kind: 'file',
|
|
3047
3114
|
fileId: ds.content.fileId,
|
|
3048
|
-
|
|
3049
|
-
name: ds.content.name,
|
|
3115
|
+
...(ds.content.isDownloadable ? { isDownloadable: true } : {}),
|
|
3050
3116
|
});
|
|
3051
3117
|
}
|
|
3052
3118
|
else if (ds.type === 'followUp' && !followUpPushed) {
|
|
@@ -3914,7 +3980,7 @@ class AXMCommentComponent {
|
|
|
3914
3980
|
this.showToast(content, color);
|
|
3915
3981
|
}
|
|
3916
3982
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMCommentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
3917
|
-
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=\"ax-size-full ax-flex ax-flex-col ax-justify-between ax-overflow-hidden\">\n <ax-comment-container class=\"ax-overflow-auto\">\n @if (isLoading()) {\n <div class=\"ax-flex ax-items-center ax-py-12 ax-bg-lightest ax-px-5\">\n <ax-skeleton class=\"ax-min-w-16 ax-h-16 ax-rounded-full ax-me-4\"></ax-skeleton>\n <div class=\"ax-flex ax-flex-col ax-gap-2 ax-w-full\">\n <ax-skeleton class=\"ax-w-full ax-h-6 ax-rounded\"></ax-skeleton>\n <ax-skeleton class=\"ax-w-full ax-h-2 ax-rounded-full\"></ax-skeleton>\n <ax-skeleton class=\"ax-w-full ax-h-2 ax-rounded-full\"></ax-skeleton>\n <ax-skeleton class=\"ax-w-8/12 ax-h-2 ax-rounded-full\"></ax-skeleton>\n </div>\n </div>\n } @else if (comments().length > 0) {\n <ax-comment-view class=\"ax-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=\"ax-flex ax-flex-col ax-gap-4 ax-justify-center ax-items-center ax-p-10\">\n <svg\n class=\"ax-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=\"ax-text-center ax-text-neutral-600 ax-font-semibold ax-leading-loose ax-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=\"ax-flex ax-flex-col\">\n @if (isReplyingMode() || isEditingMode()) {\n <div\n class=\"ax-flex ax-justify-between ax-rounded-b-none ax-border ax-border-surface ax-border-b-0 ax-rounded-lg ax-px-6 ax-py-3 ax-w-full ax-items-center ax-overflow-hidden ax-text-sm ax-leading-none\"\n >\n <div (click)=\"scrollMain()\" class=\"ax-flex ax-justify-start ax-items-center ax-cursor-pointer\">\n <i\n [class]=\"isReplyingMode() ? 'fa-reply' : 'fa-pen'\"\n class=\"fa-light ax-text-primary-500 dark:ax-text-primary-300 ax-text-2xl ax-me-4\"\n ></i>\n <div class=\"ax-flex ax-flex-col ax-gap-2 ax-justify-between ax-align-middle ax-leading-4 ax-overflow-hidden\">\n <p class=\"ax-text-primary-500 dark:ax-text-primary-300\">\n @if (isReplyingMode()) {\n {{ '@conversation:comments.actions.reply-to' | translate | async }}\n <span class=\"ax-font-bold\">{{ activeReplyComment()?.userName }}</span>\n } @else {\n {{ '@conversation:comments.actions.edit-message' | translate | async }}\n }\n </p>\n <div\n class=\"ax-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 ax-text-2xl fa-xmark ax-cursor-pointer\"></i></div>\n </div>\n }\n <ax-wysiwyg-container #w [look]=\"wysiwygOptions().look\" [(ngModel)]=\"commentContent\">\n <ax-wysiwyg-view class=\"ax-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$1.AXWysiwygContainerComponent, selector: "ax-wysiwyg-container", inputs: ["look", "readonly", "disabled", "value", "placeHolder"], outputs: ["onValueChanged"] }, { kind: "component", type: i1$1.AXWysiwygViewComponent, selector: "ax-wysiwyg-view" }, { kind: "component", type: i1$1.AXWysiwygAlignmentComponent, selector: "ax-wysiwyg-alignment" }, { kind: "component", type: i1$1.AXWysiwygColorsComponent, selector: "ax-wysiwyg-colors" }, { kind: "component", type: i1$1.AXWysiwygFontStyleComponent, selector: "ax-wysiwyg-font-style" }, { kind: "component", type: i1$1.AXWysiwygHistoryComponent, selector: "ax-wysiwyg-history" }, { kind: "component", type: i1$1.AXWysiwygListComponent, selector: "ax-wysiwyg-list" }, { kind: "component", type: i1$1.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: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2$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$1.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.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], animations: [
|
|
3983
|
+
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=\"ax-size-full ax-flex ax-flex-col ax-justify-between ax-overflow-hidden\">\n <ax-comment-container class=\"ax-overflow-auto\">\n @if (isLoading()) {\n <div class=\"ax-flex ax-items-center ax-py-12 ax-bg-lightest ax-px-5\">\n <ax-skeleton class=\"ax-min-w-16 ax-h-16 ax-rounded-full ax-me-4\"></ax-skeleton>\n <div class=\"ax-flex ax-flex-col ax-gap-2 ax-w-full\">\n <ax-skeleton class=\"ax-w-full ax-h-6 ax-rounded\"></ax-skeleton>\n <ax-skeleton class=\"ax-w-full ax-h-2 ax-rounded-full\"></ax-skeleton>\n <ax-skeleton class=\"ax-w-full ax-h-2 ax-rounded-full\"></ax-skeleton>\n <ax-skeleton class=\"ax-w-8/12 ax-h-2 ax-rounded-full\"></ax-skeleton>\n </div>\n </div>\n } @else if (comments().length > 0) {\n <ax-comment-view class=\"ax-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=\"ax-flex ax-flex-col ax-gap-4 ax-justify-center ax-items-center ax-p-10\">\n <svg\n class=\"ax-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=\"ax-text-center ax-text-neutral-600 ax-font-semibold ax-leading-loose ax-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=\"ax-flex ax-flex-col\">\n @if (isReplyingMode() || isEditingMode()) {\n <div\n class=\"ax-flex ax-justify-between ax-rounded-b-none ax-border ax-border-surface ax-border-b-0 ax-rounded-lg ax-px-6 ax-py-3 ax-w-full ax-items-center ax-overflow-hidden ax-text-sm ax-leading-none\"\n >\n <div (click)=\"scrollMain()\" class=\"ax-flex ax-justify-start ax-items-center ax-cursor-pointer\">\n <i\n [class]=\"isReplyingMode() ? 'fa-reply' : 'fa-pen'\"\n class=\"fa-light ax-text-primary-500 dark:ax-text-primary-300 ax-text-2xl ax-me-4\"\n ></i>\n <div class=\"ax-flex ax-flex-col ax-gap-2 ax-justify-between ax-align-middle ax-leading-4 ax-overflow-hidden\">\n <p class=\"ax-text-primary-500 dark:ax-text-primary-300\">\n @if (isReplyingMode()) {\n {{ '@conversation:comments.actions.reply-to' | translate | async }}\n <span class=\"ax-font-bold\">{{ activeReplyComment()?.userName }}</span>\n } @else {\n {{ '@conversation:comments.actions.edit-message' | translate | async }}\n }\n </p>\n <div\n class=\"ax-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 ax-text-2xl fa-xmark ax-cursor-pointer\"></i></div>\n </div>\n }\n <ax-wysiwyg-container #w [look]=\"wysiwygOptions().look\" [(ngModel)]=\"commentContent\">\n <ax-wysiwyg-view class=\"ax-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$1.AXWysiwygContainerComponent, selector: "ax-wysiwyg-container", inputs: ["look", "readonly", "disabled", "value", "placeHolder"], outputs: ["onValueChanged"] }, { kind: "component", type: i1$1.AXWysiwygViewComponent, selector: "ax-wysiwyg-view" }, { kind: "component", type: i1$1.AXWysiwygAlignmentComponent, selector: "ax-wysiwyg-alignment" }, { kind: "component", type: i1$1.AXWysiwygColorsComponent, selector: "ax-wysiwyg-colors" }, { kind: "component", type: i1$1.AXWysiwygFontStyleComponent, selector: "ax-wysiwyg-font-style" }, { kind: "component", type: i1$1.AXWysiwygHistoryComponent, selector: "ax-wysiwyg-history" }, { kind: "component", type: i1$1.AXWysiwygListComponent, selector: "ax-wysiwyg-list" }, { kind: "component", type: i1$1.AXWysiwygToolbarComponent, selector: "ax-wysiwyg-toolbar" }, { kind: "ngmodule", type: AXConversationModule }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i2$3.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2$2.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: [
|
|
3918
3984
|
trigger('fadeIn', [
|
|
3919
3985
|
transition(':enter', [
|
|
3920
3986
|
style({ opacity: 0, transform: 'translateY(10px)' }),
|
|
@@ -4079,9 +4145,9 @@ class AXMCommentPopupComponent extends AXBasePageComponent {
|
|
|
4079
4145
|
// Angular
|
|
4080
4146
|
CommonModule }, { kind: "ngmodule", type:
|
|
4081
4147
|
// ACoreX
|
|
4082
|
-
AXDecoratorModule }, { kind: "component", type: i2$
|
|
4148
|
+
AXDecoratorModule }, { kind: "component", type: i2$2.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:
|
|
4083
4149
|
// Comment
|
|
4084
|
-
AXMCommentComponent, selector: "axm-comment", inputs: ["refrenceType", "refrenceId", "subject"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type:
|
|
4150
|
+
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 }); }
|
|
4085
4151
|
}
|
|
4086
4152
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMCommentPopupComponent, decorators: [{
|
|
4087
4153
|
type: Component,
|
|
@@ -4234,7 +4300,7 @@ function axmBuildAssistEngineRunResult(message) {
|
|
|
4234
4300
|
}
|
|
4235
4301
|
const lastProvider = readRecord(meta, 'assistRunLastProviderResult');
|
|
4236
4302
|
if (lastProvider != null && typeof lastProvider === 'object') {
|
|
4237
|
-
result.lastProviderResult = lastProvider;
|
|
4303
|
+
result.lastProviderResult = axpSanitizeLastProviderPayloadForPersistence(lastProvider);
|
|
4238
4304
|
}
|
|
4239
4305
|
const delegated = readRecord(meta, 'assistRunDelegatedTranscriptsByCallId');
|
|
4240
4306
|
if (delegated != null && typeof delegated === 'object' && !Array.isArray(delegated)) {
|
|
@@ -4525,7 +4591,6 @@ class AXMChatVoiceRecorderComponent {
|
|
|
4525
4591
|
this.destroyRef = inject(DestroyRef);
|
|
4526
4592
|
this.composerService = inject(AXComposerService);
|
|
4527
4593
|
this.conversationService = inject(AXConversationService);
|
|
4528
|
-
this.messageApi = inject(AXMessageApi);
|
|
4529
4594
|
this.commandService = inject(AXPCommandService);
|
|
4530
4595
|
this.chatToolRunContext = inject(AXPAiChatToolRunContextService);
|
|
4531
4596
|
this.aiManager = inject(AXPAiManagerService, { optional: true });
|
|
@@ -4720,7 +4785,10 @@ class AXMChatVoiceRecorderComponent {
|
|
|
4720
4785
|
return assistId;
|
|
4721
4786
|
}
|
|
4722
4787
|
buildTranscriptCorrectionPrompt(rawText, platformRuntimeContext) {
|
|
4723
|
-
const
|
|
4788
|
+
const localeRaw = platformRuntimeContext['locale'];
|
|
4789
|
+
const locale = typeof localeRaw === 'string' && localeRaw.trim()
|
|
4790
|
+
? localeRaw.trim()
|
|
4791
|
+
: 'the UI locale from platform context';
|
|
4724
4792
|
return [
|
|
4725
4793
|
'Correct obvious misrecognized words and minor lexical or spelling errors in the transcript below.',
|
|
4726
4794
|
`Keep the language aligned with UI locale (${locale}) and preserve the speaker's meaning.`,
|
|
@@ -4767,7 +4835,8 @@ class AXMChatVoiceRecorderComponent {
|
|
|
4767
4835
|
const platformRuntimeContext = await this.runtimeContextBuilder.build();
|
|
4768
4836
|
const conversationId = this.conversation().id;
|
|
4769
4837
|
const attachment = await this.persistVoiceRecordingForAi(audioBlob, conversationId);
|
|
4770
|
-
const
|
|
4838
|
+
const localeForSpeech = platformRuntimeContext['locale'];
|
|
4839
|
+
const language = this.localeToTranscriptionLanguage(typeof localeForSpeech === 'string' ? localeForSpeech : undefined);
|
|
4771
4840
|
this.chatToolRunContext.setContext({
|
|
4772
4841
|
assistId,
|
|
4773
4842
|
chatTransport,
|
|
@@ -4798,19 +4867,21 @@ class AXMChatVoiceRecorderComponent {
|
|
|
4798
4867
|
async sendVoiceMessage(audioBlob, conversation) {
|
|
4799
4868
|
try {
|
|
4800
4869
|
const audioFile = new File([audioBlob], `voice-${Date.now()}.webm`, { type: 'audio/webm' });
|
|
4801
|
-
|
|
4802
|
-
const command = {
|
|
4870
|
+
await this.conversationService.sendMessage({
|
|
4803
4871
|
conversationId: conversation.id,
|
|
4804
4872
|
type: 'voice',
|
|
4805
4873
|
payload: {
|
|
4806
4874
|
type: 'voice',
|
|
4807
|
-
url:
|
|
4875
|
+
url: '',
|
|
4808
4876
|
duration: this.recordingDuration(),
|
|
4809
|
-
size: uploadResult.size,
|
|
4810
|
-
mimeType: uploadResult.mimeType,
|
|
4811
4877
|
},
|
|
4812
|
-
}
|
|
4813
|
-
|
|
4878
|
+
}, {
|
|
4879
|
+
media: {
|
|
4880
|
+
source: audioFile,
|
|
4881
|
+
fileName: audioFile.name,
|
|
4882
|
+
mimeType: audioFile.type,
|
|
4883
|
+
},
|
|
4884
|
+
});
|
|
4814
4885
|
}
|
|
4815
4886
|
catch (error) {
|
|
4816
4887
|
console.error('Failed to send voice message:', error);
|
|
@@ -4910,7 +4981,7 @@ class AXMChatVoiceRecorderComponent {
|
|
|
4910
4981
|
}
|
|
4911
4982
|
</div>
|
|
4912
4983
|
</div>
|
|
4913
|
-
`, isInline: true, styles: [":host{display:block;width:100%}.voice-recorder{display:flex;flex-direction:column;width:100%;background:rgb(var(--ax-sys-color-lightest-surface))}.recorder-header{display:flex;align-items:center;justify-content:space-between;padding:.75rem 1rem;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface))}.recorder-title{margin:0;font-size:.875rem;font-weight:600}.close-button{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;background:transparent;border-radius:50%;font-size:1rem;cursor:pointer;transition:all .2s;opacity:.7}.close-button:hover{background:rgb(var(--ax-sys-color-light-surface));opacity:1}.recorder-content{display:flex;align-items:center;width:100%;padding:1rem}.recorder-idle{display:flex;align-items:center;gap:1rem;width:100%}.record-button,.speech-to-text-button{display:flex;align-items:center;justify-content:center;width:56px;height:56px;border:none;border-radius:50%;font-size:1.5rem;cursor:pointer;transition:all .2s}.record-button{background:rgb(var(--ax-sys-color-primary-500));color:rgb(var(--ax-sys-color-on-primary-surface));box-shadow:0 2px 8px rgba(var(--ax-sys-color-primary-500),.3)}.record-button:hover{background:rgb(var(--ax-sys-color-primary-600))}.speech-to-text-button{background:rgb(var(--ax-sys-color-secondary-surface));color:rgb(var(--ax-sys-color-on-secondary-surface));box-shadow:0 2px 8px rgba(var(--ax-sys-color-secondary-500),.2)}.speech-to-text-button:hover:not(:disabled){background:rgb(var(--ax-sys-color-secondary-600))}.speech-to-text-button:disabled{opacity:.6;cursor:not-allowed}.recorder-hint{font-size:.875rem;opacity:.7}.recorder-transcribing{display:flex;align-items:center;justify-content:center;gap:.75rem;width:100%;padding:.5rem 0}.recorder-transcribing-text{font-size:.875rem;font-weight:500;color:rgb(var(--ax-sys-color-on-light-surface))}.recorder-active{display:flex;align-items:center;justify-content:space-between;width:100%;gap:1rem}.recorder-info{display:flex;align-items:center;gap:1.5rem;flex:1}.recording-indicator{display:flex;align-items:center;gap:.5rem}.pulse-dot{width:12px;height:12px;background:rgb(var(--ax-sys-color-danger-500));border-radius:50%;animation:pulse 1.5s ease-in-out infinite}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.recording-text{font-size:.875rem;font-weight:600;color:rgb(var(--ax-sys-color-danger-500))}.recording-time{font-size:1.25rem;font-weight:600;font-variant-numeric:tabular-nums;min-width:80px}.recorder-actions{display:flex;align-items:center;gap:.75rem}@media(max-width:768px){.voice-recorder{padding:.75rem}.record-button,.speech-to-text-button{width:48px;height:48px;font-size:1.25rem}.recorder-info{gap:1rem}.recording-time{font-size:1.125rem;font-variant-numeric:tabular-nums}.recorder-actions{gap:.5rem}}@media(max-width:480px){.recorder-hint{font-size:.8125rem}.recording-text{display:none}.recording-time{font-size:1rem;min-width:60px;font-variant-numeric:tabular-nums}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: AXDecoratorModule }, { kind: "component", type: i2$
|
|
4984
|
+
`, isInline: true, styles: [":host{display:block;width:100%}.voice-recorder{display:flex;flex-direction:column;width:100%;background:rgb(var(--ax-sys-color-lightest-surface))}.recorder-header{display:flex;align-items:center;justify-content:space-between;padding:.75rem 1rem;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface))}.recorder-title{margin:0;font-size:.875rem;font-weight:600}.close-button{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;background:transparent;border-radius:50%;font-size:1rem;cursor:pointer;transition:all .2s;opacity:.7}.close-button:hover{background:rgb(var(--ax-sys-color-light-surface));opacity:1}.recorder-content{display:flex;align-items:center;width:100%;padding:1rem}.recorder-idle{display:flex;align-items:center;gap:1rem;width:100%}.record-button,.speech-to-text-button{display:flex;align-items:center;justify-content:center;width:56px;height:56px;border:none;border-radius:50%;font-size:1.5rem;cursor:pointer;transition:all .2s}.record-button{background:rgb(var(--ax-sys-color-primary-500));color:rgb(var(--ax-sys-color-on-primary-surface));box-shadow:0 2px 8px rgba(var(--ax-sys-color-primary-500),.3)}.record-button:hover{background:rgb(var(--ax-sys-color-primary-600))}.speech-to-text-button{background:rgb(var(--ax-sys-color-secondary-surface));color:rgb(var(--ax-sys-color-on-secondary-surface));box-shadow:0 2px 8px rgba(var(--ax-sys-color-secondary-500),.2)}.speech-to-text-button:hover:not(:disabled){background:rgb(var(--ax-sys-color-secondary-600))}.speech-to-text-button:disabled{opacity:.6;cursor:not-allowed}.recorder-hint{font-size:.875rem;opacity:.7}.recorder-transcribing{display:flex;align-items:center;justify-content:center;gap:.75rem;width:100%;padding:.5rem 0}.recorder-transcribing-text{font-size:.875rem;font-weight:500;color:rgb(var(--ax-sys-color-on-light-surface))}.recorder-active{display:flex;align-items:center;justify-content:space-between;width:100%;gap:1rem}.recorder-info{display:flex;align-items:center;gap:1.5rem;flex:1}.recording-indicator{display:flex;align-items:center;gap:.5rem}.pulse-dot{width:12px;height:12px;background:rgb(var(--ax-sys-color-danger-500));border-radius:50%;animation:pulse 1.5s ease-in-out infinite}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.recording-text{font-size:.875rem;font-weight:600;color:rgb(var(--ax-sys-color-danger-500))}.recording-time{font-size:1.25rem;font-weight:600;font-variant-numeric:tabular-nums;min-width:80px}.recorder-actions{display:flex;align-items:center;gap:.75rem}@media(max-width:768px){.voice-recorder{padding:.75rem}.record-button,.speech-to-text-button{width:48px;height:48px;font-size:1.25rem}.recorder-info{gap:1rem}.recording-time{font-size:1.125rem;font-variant-numeric:tabular-nums}.recorder-actions{gap:.5rem}}@media(max-width:480px){.recorder-hint{font-size:.8125rem}.recording-text{display:none}.recording-time{font-size:1rem;min-width:60px;font-variant-numeric:tabular-nums}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: AXDecoratorModule }, { kind: "component", type: i2$2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2$2.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: AXLabelModule }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i6.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i2$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
4914
4985
|
}
|
|
4915
4986
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatVoiceRecorderComponent, decorators: [{
|
|
4916
4987
|
type: Component,
|
|
@@ -5143,7 +5214,7 @@ class AXMChatInfoBarAssistModelActionComponent {
|
|
|
5143
5214
|
}
|
|
5144
5215
|
</div>
|
|
5145
5216
|
}
|
|
5146
|
-
`, 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:
|
|
5217
|
+
`, 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 }); }
|
|
5147
5218
|
}
|
|
5148
5219
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatInfoBarAssistModelActionComponent, decorators: [{
|
|
5149
5220
|
type: Component,
|
|
@@ -5244,12 +5315,16 @@ class AXMAssistBotImageLineComponent {
|
|
|
5244
5315
|
type: 'image',
|
|
5245
5316
|
payload: {
|
|
5246
5317
|
type: 'image',
|
|
5247
|
-
|
|
5248
|
-
|
|
5249
|
-
|
|
5250
|
-
|
|
5251
|
-
|
|
5252
|
-
|
|
5318
|
+
images: [
|
|
5319
|
+
{
|
|
5320
|
+
url,
|
|
5321
|
+
thumbnailUrl: url,
|
|
5322
|
+
width: 400,
|
|
5323
|
+
height: 300,
|
|
5324
|
+
mimeType: this.mimeType(),
|
|
5325
|
+
},
|
|
5326
|
+
],
|
|
5327
|
+
caption: undefined,
|
|
5253
5328
|
},
|
|
5254
5329
|
});
|
|
5255
5330
|
}, ...(ngDevMode ? [{ debugName: "syntheticMessage" }] : /* istanbul ignore next */ []));
|
|
@@ -5305,7 +5380,7 @@ class AXMAssistBotImageLineComponent {
|
|
|
5305
5380
|
} @else if (errorText()) {
|
|
5306
5381
|
<p class="axm-assist-bot-image-line__err">{{ ((errorText() ?? '') | translate | async) ?? '' }}</p>
|
|
5307
5382
|
}
|
|
5308
|
-
`, 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:
|
|
5383
|
+
`, 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 }); }
|
|
5309
5384
|
}
|
|
5310
5385
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMAssistBotImageLineComponent, decorators: [{
|
|
5311
5386
|
type: Component,
|
|
@@ -5478,7 +5553,7 @@ class AXMNodeMessageRendererComponent {
|
|
|
5478
5553
|
</div>
|
|
5479
5554
|
}
|
|
5480
5555
|
</div>
|
|
5481
|
-
`, 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$2.AXPWidgetContainerComponent, selector: "axp-widgets-container", inputs: ["context", "functions"], outputs: ["onContextChanged"] }, { kind: "directive", type: i1$2.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:
|
|
5556
|
+
`, 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$2.AXPWidgetContainerComponent, selector: "axp-widgets-container", inputs: ["context", "functions"], outputs: ["onContextChanged"] }, { kind: "directive", type: i1$2.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 }); }
|
|
5482
5557
|
}
|
|
5483
5558
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMNodeMessageRendererComponent, decorators: [{
|
|
5484
5559
|
type: Component,
|
|
@@ -5557,7 +5632,7 @@ class AXMAssistTranscriptUserLineComponent {
|
|
|
5557
5632
|
return c.type === 'code' && typeof c.language === 'string' && typeof c.code === 'string';
|
|
5558
5633
|
}
|
|
5559
5634
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMAssistTranscriptUserLineComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5560
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMAssistTranscriptUserLineComponent, isStandalone: true, selector: "axm-assist-transcript-user-line", inputs: { line: { classPropertyName: "line", publicName: "line", isSignal: true, isRequired: true, transformFunction: null }, parentMessage: { classPropertyName: "parentMessage", publicName: "parentMessage", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<div class=\"axm-assist-bot axm-assist-bot__final-line\">\n @for (item of items(); track $index; let itemIndex = $index) {\n @switch (item.kind) {\n @case ('text') {\n @let parsed = parseAssistLineText(item.content);\n @if (parsed.body.trim()) {\n <div class=\"axm-assist-bot__segment axm-assist-renderer__markdown\" [attr.dir]=\"segmentDir(parsed.body)\">\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 @case ('node') {\n @if (axmAssistWidgetNodeFromUnknown(item.content)) {\n <div class=\"axm-assist-bot__segment\" dir=\"auto\">\n <axm-chat-user-form-renderer [message]=\"syntheticNodeMessage(itemIndex, item.content)\" />\n </div>\n }\n }\n @case ('file') {\n <axm-assist-bot-image-line\n [parentMessage]=\"parentMessage()\"\n [fileId]=\"item.fileId\"\n [mimeType]=\"item.mimeType\"\n [name]=\"item.name\"\n />\n }\n @case ('followUp') {\n <div class=\"axm-assist-bot__segment\" dir=\"auto\">\n <axm-assist-suggestion-chips [items]=\"item.items\" />\n </div>\n }\n }\n }\n</div>\n", styles: [".axm-assist-renderer{display:flex;flex-direction:column;gap:.25rem}.axm-assist-renderer axm-assist-suggestion-chips>div{padding:0;padding-top:1rem}.axm-assist-bot,.axm-assist-bot__final-line{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),.axm-assist-renderer__markdown .axp-markdown-viewer__content :is(p,ul,ol){margin-block:.45rem}.axm-assist-bot__segment ax-conversation-text-renderer li,.axm-assist-renderer__markdown .axp-markdown-viewer__content 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__delegated-agent-detail-link{padding:.25rem;text-decoration:underline;padding-top:0}.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{background:rgb(var(--ax-sys-color-warning-100))}.axm-assist-renderer__badge--primary{background:rgb(var(--ax-sys-color-primary-100))}.axm-assist-renderer__badge--success{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: 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: "component", type: AXMAssistSuggestionChipsComponent, selector: "axm-assist-suggestion-chips", inputs: ["items"] }, { kind: "ngmodule", type: AXCodeEditorModule }, { kind: "component", type: i1$3.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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
5635
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMAssistTranscriptUserLineComponent, isStandalone: true, selector: "axm-assist-transcript-user-line", inputs: { line: { classPropertyName: "line", publicName: "line", isSignal: true, isRequired: true, transformFunction: null }, parentMessage: { classPropertyName: "parentMessage", publicName: "parentMessage", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<div class=\"axm-assist-bot axm-assist-bot__final-line\">\n @for (item of items(); track $index; let itemIndex = $index) {\n @switch (item.kind) {\n @case ('text') {\n @let parsed = parseAssistLineText(item.content);\n @if (parsed.body.trim()) {\n <div class=\"axm-assist-bot__segment axm-assist-renderer__markdown\" [attr.dir]=\"segmentDir(parsed.body)\">\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 @case ('node') {\n @if (axmAssistWidgetNodeFromUnknown(item.content)) {\n <div class=\"axm-assist-bot__segment\" dir=\"auto\">\n <axm-chat-user-form-renderer [message]=\"syntheticNodeMessage(itemIndex, item.content)\" />\n </div>\n }\n }\n @case ('file') {\n <axm-assist-bot-image-line\n [parentMessage]=\"parentMessage()\"\n [fileId]=\"item.fileId\"\n />\n }\n @case ('followUp') {\n <div class=\"axm-assist-bot__segment\" dir=\"auto\">\n <axm-assist-suggestion-chips [items]=\"item.items\" />\n </div>\n }\n }\n }\n</div>\n", styles: [".axm-assist-renderer{display:flex;flex-direction:column;gap:.25rem}.axm-assist-renderer axm-assist-suggestion-chips>div{padding:0;padding-top:1rem}.axm-assist-bot,.axm-assist-bot__final-line{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),.axm-assist-renderer__markdown .axp-markdown-viewer__content :is(p,ul,ol){margin-block:.45rem}.axm-assist-bot__segment ax-conversation-text-renderer li,.axm-assist-renderer__markdown .axp-markdown-viewer__content 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__delegated-agent-detail-link{padding:.25rem;text-decoration:underline;padding-top:0}.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{background:rgb(var(--ax-sys-color-warning-100))}.axm-assist-renderer__badge--primary{background:rgb(var(--ax-sys-color-primary-100))}.axm-assist-renderer__badge--success{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: 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: "component", type: AXMAssistSuggestionChipsComponent, selector: "axm-assist-suggestion-chips", inputs: ["items"] }, { kind: "ngmodule", type: AXCodeEditorModule }, { kind: "component", type: i1$3.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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
5561
5636
|
}
|
|
5562
5637
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMAssistTranscriptUserLineComponent, decorators: [{
|
|
5563
5638
|
type: Component,
|
|
@@ -5569,7 +5644,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
5569
5644
|
AXPMarkdownViewerComponent,
|
|
5570
5645
|
AXPMarkdownTemplateDirective,
|
|
5571
5646
|
FormsModule,
|
|
5572
|
-
], template: "<div class=\"axm-assist-bot axm-assist-bot__final-line\">\n @for (item of items(); track $index; let itemIndex = $index) {\n @switch (item.kind) {\n @case ('text') {\n @let parsed = parseAssistLineText(item.content);\n @if (parsed.body.trim()) {\n <div class=\"axm-assist-bot__segment axm-assist-renderer__markdown\" [attr.dir]=\"segmentDir(parsed.body)\">\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 @case ('node') {\n @if (axmAssistWidgetNodeFromUnknown(item.content)) {\n <div class=\"axm-assist-bot__segment\" dir=\"auto\">\n <axm-chat-user-form-renderer [message]=\"syntheticNodeMessage(itemIndex, item.content)\" />\n </div>\n }\n }\n @case ('file') {\n <axm-assist-bot-image-line\n [parentMessage]=\"parentMessage()\"\n [fileId]=\"item.fileId\"\n [mimeType]=\"item.mimeType\"\n [name]=\"item.name\"\n />\n }\n @case ('followUp') {\n <div class=\"axm-assist-bot__segment\" dir=\"auto\">\n <axm-assist-suggestion-chips [items]=\"item.items\" />\n </div>\n }\n }\n }\n</div>\n", styles: [".axm-assist-renderer{display:flex;flex-direction:column;gap:.25rem}.axm-assist-renderer axm-assist-suggestion-chips>div{padding:0;padding-top:1rem}.axm-assist-bot,.axm-assist-bot__final-line{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),.axm-assist-renderer__markdown .axp-markdown-viewer__content :is(p,ul,ol){margin-block:.45rem}.axm-assist-bot__segment ax-conversation-text-renderer li,.axm-assist-renderer__markdown .axp-markdown-viewer__content 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__delegated-agent-detail-link{padding:.25rem;text-decoration:underline;padding-top:0}.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{background:rgb(var(--ax-sys-color-warning-100))}.axm-assist-renderer__badge--primary{background:rgb(var(--ax-sys-color-primary-100))}.axm-assist-renderer__badge--success{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"] }]
|
|
5647
|
+
], template: "<div class=\"axm-assist-bot axm-assist-bot__final-line\">\n @for (item of items(); track $index; let itemIndex = $index) {\n @switch (item.kind) {\n @case ('text') {\n @let parsed = parseAssistLineText(item.content);\n @if (parsed.body.trim()) {\n <div class=\"axm-assist-bot__segment axm-assist-renderer__markdown\" [attr.dir]=\"segmentDir(parsed.body)\">\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 @case ('node') {\n @if (axmAssistWidgetNodeFromUnknown(item.content)) {\n <div class=\"axm-assist-bot__segment\" dir=\"auto\">\n <axm-chat-user-form-renderer [message]=\"syntheticNodeMessage(itemIndex, item.content)\" />\n </div>\n }\n }\n @case ('file') {\n <axm-assist-bot-image-line\n [parentMessage]=\"parentMessage()\"\n [fileId]=\"item.fileId\"\n />\n }\n @case ('followUp') {\n <div class=\"axm-assist-bot__segment\" dir=\"auto\">\n <axm-assist-suggestion-chips [items]=\"item.items\" />\n </div>\n }\n }\n }\n</div>\n", styles: [".axm-assist-renderer{display:flex;flex-direction:column;gap:.25rem}.axm-assist-renderer axm-assist-suggestion-chips>div{padding:0;padding-top:1rem}.axm-assist-bot,.axm-assist-bot__final-line{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),.axm-assist-renderer__markdown .axp-markdown-viewer__content :is(p,ul,ol){margin-block:.45rem}.axm-assist-bot__segment ax-conversation-text-renderer li,.axm-assist-renderer__markdown .axp-markdown-viewer__content 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__delegated-agent-detail-link{padding:.25rem;text-decoration:underline;padding-top:0}.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{background:rgb(var(--ax-sys-color-warning-100))}.axm-assist-renderer__badge--primary{background:rgb(var(--ax-sys-color-primary-100))}.axm-assist-renderer__badge--success{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"] }]
|
|
5573
5648
|
}], propDecorators: { line: [{ type: i0.Input, args: [{ isSignal: true, alias: "line", required: true }] }], parentMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentMessage", required: true }] }] } });
|
|
5574
5649
|
|
|
5575
5650
|
//#region ---- Imports ----
|
|
@@ -5596,10 +5671,13 @@ async function axmOpenAssistDelegatedAgentDetailDialog(options) {
|
|
|
5596
5671
|
options.translationService.translateAsync('@conversation:chat.assist-renderer.delegated-agent.dialog-title-suffix'),
|
|
5597
5672
|
options.translationService.translateAsync('@conversation:chat.assist-renderer.delegated-agent.transcript-missing'),
|
|
5598
5673
|
]);
|
|
5599
|
-
const comp = (await import('./acorex-modules-conversation-assist-delegated-agent-detail-popup.component-
|
|
5674
|
+
const comp = (await import('./acorex-modules-conversation-assist-delegated-agent-detail-popup.component-DQlE8l4c.mjs'))
|
|
5600
5675
|
.AXMAssistDelegatedAgentDetailPopupComponent;
|
|
5601
5676
|
const data = {
|
|
5677
|
+
delegationCallId: callId,
|
|
5602
5678
|
messages: entry?.messages ?? [],
|
|
5679
|
+
runInput: entry?.runInput,
|
|
5680
|
+
agentName: entry?.agentName?.trim() || titleBase,
|
|
5603
5681
|
emptyHint: entry?.messages?.length ? undefined : missingHint,
|
|
5604
5682
|
agentTitleById: options.agentTitleById ?? (catalogId && catalogTitle ? { [catalogId]: catalogTitle } : {}),
|
|
5605
5683
|
};
|
|
@@ -6252,7 +6330,7 @@ class AXMAssistMessageRendererComponent {
|
|
|
6252
6330
|
}
|
|
6253
6331
|
}
|
|
6254
6332
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMAssistMessageRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
6255
|
-
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 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 class=\"axm-assist-renderer__delegated-agent-detail-link\">\n <ax-button\n look=\"link\"\n color=\"primary\"\n class=\"ax-sm\"\n [text]=\"('@conversation:chat.assist-renderer.delegated-agent.detail' | translate | async) ?? ''\"\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 </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 <div class=\"axm-assist-renderer__delegated-agent-detail-link\">\n <ax-button\n look=\"link\"\n color=\"primary\"\n class=\"ax-sm\"\n [text]=\"('@conversation:chat.assist-renderer.delegated-agent.detail' | translate | async) ?? ''\"\n [attr.aria-label]=\"\n ('@conversation:chat.assist-renderer.delegated-agent.detail-aria' | translate | async) ?? ''\n \"\n (onClick)=\"\n openDelegatedAgentTranscriptDialog(\n seg.callId,\n seg.content.command,\n delegatedAgentLabelForCall(seg.callId)\n )\n \"\n ></ax-button>\n </div>\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 ax-inline-block ax-w-3 ax-h-3 ax-rounded-full ax-border-2 ax-border-primary-500 ax-border-t-transparent fa-spin ax-shrink-0\"\n aria-hidden=\"true\"\n ></span>\n <span class=\"axm-assist-renderer__activity-label ax-text-xs ax-text-muted ax-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 @if (assistPayloadLine(); as line) {\n <div\n role=\"region\"\n [attr.aria-label]=\"('@conversation:chat.assist-renderer.aria.assistant-response' | translate | async) ?? ''\"\n >\n <axm-assist-transcript-user-line [line]=\"line\" [parentMessage]=\"message()\" />\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 ax-inline-block ax-w-3 ax-h-3 ax-rounded-full ax-border-2 ax-border-primary-500 ax-border-t-transparent fa-spin ax-shrink-0\"\n aria-hidden=\"true\"\n ></span>\n <span class=\"axm-assist-renderer__activity-label ax-text-xs ax-text-muted ax-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 ax-inline-block ax-w-3 ax-h-3 ax-rounded-full ax-border-2 ax-border-primary-500 ax-border-t-transparent fa-spin ax-shrink-0\"\n aria-hidden=\"true\"\n ></span>\n <span class=\"axm-assist-renderer__activity-label ax-text-xs ax-text-muted ax-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 ax-inline-flex ax-items-center ax-gap-2 ax-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 ax-inline-block ax-w-3 ax-h-3 ax-rounded-full ax-border-2 ax-border-primary-500 ax-border-t-transparent fa-spin ax-shrink-0\"\n aria-hidden=\"true\"\n ></span>\n } @else {\n <span\n class=\"ax-inline-block ax-w-3 ax-h-3 ax-rounded-full ax-bg-success-500 ax-shrink-0\"\n aria-hidden=\"true\"\n ></span>\n }\n <i class=\"fa-light fa-people-group ax-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 <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=\"ax-inline-block ax-w-2.5 ax-h-2.5 ax-rounded-full ax-border-2 ax-border-primary-500 ax-border-t-transparent fa-spin ax-shrink-0\"\n aria-hidden=\"true\"\n ></span>\n } @else {\n <span\n class=\"ax-inline-block ax-w-2.5 ax-h-2.5 ax-rounded-full ax-bg-success-500 ax-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 @if (tc.state !== 'running') {\n <div class=\"axm-assist-renderer__delegated-agent-detail-link\">\n <ax-button\n look=\"link\"\n color=\"primary\"\n class=\"ax-sm\"\n [text]=\"('@conversation:chat.assist-renderer.delegated-agent.detail' | translate | async) ?? ''\"\n [attr.aria-label]=\"\n ('@conversation:chat.assist-renderer.delegated-agent.detail-aria' | translate | async) ??\n ''\n \"\n (onClick)=\"\n openDelegatedAgentTranscriptDialog(tc.id, tc.name, delegatedAgentLabelForCall(tc.id))\n \"\n ></ax-button>\n </div>\n }\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 ax-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() && !isStreaming() && assistDebugFollowUpItems().length > 0) {\n <div class=\"axm-assist-bot__segment\" dir=\"auto\">\n <axm-assist-suggestion-chips [items]=\"assistDebugFollowUpItems()\" />\n </div>\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:.25rem}.axm-assist-renderer axm-assist-suggestion-chips>div{padding:0;padding-top:1rem}.axm-assist-bot,.axm-assist-bot__final-line{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),.axm-assist-renderer__markdown .axp-markdown-viewer__content :is(p,ul,ol){margin-block:.45rem}.axm-assist-bot__segment ax-conversation-text-renderer li,.axm-assist-renderer__markdown .axp-markdown-viewer__content 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__delegated-agent-detail-link{padding:.25rem;text-decoration:underline;padding-top:0}.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{background:rgb(var(--ax-sys-color-warning-100))}.axm-assist-renderer__badge--primary{background:rgb(var(--ax-sys-color-primary-100))}.axm-assist-renderer__badge--success{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: AXMAssistTranscriptUserLineComponent, selector: "axm-assist-transcript-user-line", inputs: ["line", "parentMessage"] }, { kind: "component", type: AXMAssistBotImageLineComponent, selector: "axm-assist-bot-image-line", inputs: ["parentMessage", "fileId", "mimeType", "name"] }, { kind: "component", type: AXMAssistSuggestionChipsComponent, selector: "axm-assist-suggestion-chips", inputs: ["items"] }, { 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: i1$3.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: i3.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: DecimalPipe, name: "number" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
6333
|
+
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 />\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 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 class=\"axm-assist-renderer__delegated-agent-detail-link\">\n <ax-button\n look=\"link\"\n color=\"primary\"\n class=\"ax-sm\"\n [text]=\"('@conversation:chat.assist-renderer.delegated-agent.detail' | translate | async) ?? ''\"\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 </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 />\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 <div class=\"axm-assist-renderer__delegated-agent-detail-link\">\n <ax-button\n look=\"link\"\n color=\"primary\"\n class=\"ax-sm\"\n [text]=\"('@conversation:chat.assist-renderer.delegated-agent.detail' | translate | async) ?? ''\"\n [attr.aria-label]=\"\n ('@conversation:chat.assist-renderer.delegated-agent.detail-aria' | translate | async) ?? ''\n \"\n (onClick)=\"\n openDelegatedAgentTranscriptDialog(\n seg.callId,\n seg.content.command,\n delegatedAgentLabelForCall(seg.callId)\n )\n \"\n ></ax-button>\n </div>\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 />\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 ax-inline-block ax-w-3 ax-h-3 ax-rounded-full ax-border-2 ax-border-primary-500 ax-border-t-transparent fa-spin ax-shrink-0\"\n aria-hidden=\"true\"\n ></span>\n <span class=\"axm-assist-renderer__activity-label ax-text-xs ax-text-muted ax-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 @if (assistPayloadLine(); as line) {\n <div\n role=\"region\"\n [attr.aria-label]=\"('@conversation:chat.assist-renderer.aria.assistant-response' | translate | async) ?? ''\"\n >\n <axm-assist-transcript-user-line [line]=\"line\" [parentMessage]=\"message()\" />\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 ax-inline-block ax-w-3 ax-h-3 ax-rounded-full ax-border-2 ax-border-primary-500 ax-border-t-transparent fa-spin ax-shrink-0\"\n aria-hidden=\"true\"\n ></span>\n <span class=\"axm-assist-renderer__activity-label ax-text-xs ax-text-muted ax-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 ax-inline-block ax-w-3 ax-h-3 ax-rounded-full ax-border-2 ax-border-primary-500 ax-border-t-transparent fa-spin ax-shrink-0\"\n aria-hidden=\"true\"\n ></span>\n <span class=\"axm-assist-renderer__activity-label ax-text-xs ax-text-muted ax-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 ax-inline-flex ax-items-center ax-gap-2 ax-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 ax-inline-block ax-w-3 ax-h-3 ax-rounded-full ax-border-2 ax-border-primary-500 ax-border-t-transparent fa-spin ax-shrink-0\"\n aria-hidden=\"true\"\n ></span>\n } @else {\n <span\n class=\"ax-inline-block ax-w-3 ax-h-3 ax-rounded-full ax-bg-success-500 ax-shrink-0\"\n aria-hidden=\"true\"\n ></span>\n }\n <i class=\"fa-light fa-people-group ax-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 <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=\"ax-inline-block ax-w-2.5 ax-h-2.5 ax-rounded-full ax-border-2 ax-border-primary-500 ax-border-t-transparent fa-spin ax-shrink-0\"\n aria-hidden=\"true\"\n ></span>\n } @else {\n <span\n class=\"ax-inline-block ax-w-2.5 ax-h-2.5 ax-rounded-full ax-bg-success-500 ax-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 @if (tc.state !== 'running') {\n <div class=\"axm-assist-renderer__delegated-agent-detail-link\">\n <ax-button\n look=\"link\"\n color=\"primary\"\n class=\"ax-sm\"\n [text]=\"('@conversation:chat.assist-renderer.delegated-agent.detail' | translate | async) ?? ''\"\n [attr.aria-label]=\"\n ('@conversation:chat.assist-renderer.delegated-agent.detail-aria' | translate | async) ??\n ''\n \"\n (onClick)=\"\n openDelegatedAgentTranscriptDialog(tc.id, tc.name, delegatedAgentLabelForCall(tc.id))\n \"\n ></ax-button>\n </div>\n }\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 ax-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() && !isStreaming() && assistDebugFollowUpItems().length > 0) {\n <div class=\"axm-assist-bot__segment\" dir=\"auto\">\n <axm-assist-suggestion-chips [items]=\"assistDebugFollowUpItems()\" />\n </div>\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:.25rem}.axm-assist-renderer axm-assist-suggestion-chips>div{padding:0;padding-top:1rem}.axm-assist-bot,.axm-assist-bot__final-line{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),.axm-assist-renderer__markdown .axp-markdown-viewer__content :is(p,ul,ol){margin-block:.45rem}.axm-assist-bot__segment ax-conversation-text-renderer li,.axm-assist-renderer__markdown .axp-markdown-viewer__content 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__delegated-agent-detail-link{padding:.25rem;text-decoration:underline;padding-top:0}.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{background:rgb(var(--ax-sys-color-warning-100))}.axm-assist-renderer__badge--primary{background:rgb(var(--ax-sys-color-primary-100))}.axm-assist-renderer__badge--success{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: AXMAssistTranscriptUserLineComponent, selector: "axm-assist-transcript-user-line", inputs: ["line", "parentMessage"] }, { kind: "component", type: AXMAssistBotImageLineComponent, selector: "axm-assist-bot-image-line", inputs: ["parentMessage", "fileId", "mimeType", "name"] }, { kind: "component", type: AXMAssistSuggestionChipsComponent, selector: "axm-assist-suggestion-chips", inputs: ["items"] }, { 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: i1$3.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 }); }
|
|
6256
6334
|
}
|
|
6257
6335
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMAssistMessageRendererComponent, decorators: [{
|
|
6258
6336
|
type: Component,
|
|
@@ -6271,7 +6349,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
6271
6349
|
AXTranslationModule,
|
|
6272
6350
|
AsyncPipe,
|
|
6273
6351
|
DecimalPipe,
|
|
6274
|
-
], 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 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 class=\"axm-assist-renderer__delegated-agent-detail-link\">\n <ax-button\n look=\"link\"\n color=\"primary\"\n class=\"ax-sm\"\n [text]=\"('@conversation:chat.assist-renderer.delegated-agent.detail' | translate | async) ?? ''\"\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 </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 <div class=\"axm-assist-renderer__delegated-agent-detail-link\">\n <ax-button\n look=\"link\"\n color=\"primary\"\n class=\"ax-sm\"\n [text]=\"('@conversation:chat.assist-renderer.delegated-agent.detail' | translate | async) ?? ''\"\n [attr.aria-label]=\"\n ('@conversation:chat.assist-renderer.delegated-agent.detail-aria' | translate | async) ?? ''\n \"\n (onClick)=\"\n openDelegatedAgentTranscriptDialog(\n seg.callId,\n seg.content.command,\n delegatedAgentLabelForCall(seg.callId)\n )\n \"\n ></ax-button>\n </div>\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 ax-inline-block ax-w-3 ax-h-3 ax-rounded-full ax-border-2 ax-border-primary-500 ax-border-t-transparent fa-spin ax-shrink-0\"\n aria-hidden=\"true\"\n ></span>\n <span class=\"axm-assist-renderer__activity-label ax-text-xs ax-text-muted ax-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 @if (assistPayloadLine(); as line) {\n <div\n role=\"region\"\n [attr.aria-label]=\"('@conversation:chat.assist-renderer.aria.assistant-response' | translate | async) ?? ''\"\n >\n <axm-assist-transcript-user-line [line]=\"line\" [parentMessage]=\"message()\" />\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 ax-inline-block ax-w-3 ax-h-3 ax-rounded-full ax-border-2 ax-border-primary-500 ax-border-t-transparent fa-spin ax-shrink-0\"\n aria-hidden=\"true\"\n ></span>\n <span class=\"axm-assist-renderer__activity-label ax-text-xs ax-text-muted ax-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 ax-inline-block ax-w-3 ax-h-3 ax-rounded-full ax-border-2 ax-border-primary-500 ax-border-t-transparent fa-spin ax-shrink-0\"\n aria-hidden=\"true\"\n ></span>\n <span class=\"axm-assist-renderer__activity-label ax-text-xs ax-text-muted ax-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 ax-inline-flex ax-items-center ax-gap-2 ax-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 ax-inline-block ax-w-3 ax-h-3 ax-rounded-full ax-border-2 ax-border-primary-500 ax-border-t-transparent fa-spin ax-shrink-0\"\n aria-hidden=\"true\"\n ></span>\n } @else {\n <span\n class=\"ax-inline-block ax-w-3 ax-h-3 ax-rounded-full ax-bg-success-500 ax-shrink-0\"\n aria-hidden=\"true\"\n ></span>\n }\n <i class=\"fa-light fa-people-group ax-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 <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=\"ax-inline-block ax-w-2.5 ax-h-2.5 ax-rounded-full ax-border-2 ax-border-primary-500 ax-border-t-transparent fa-spin ax-shrink-0\"\n aria-hidden=\"true\"\n ></span>\n } @else {\n <span\n class=\"ax-inline-block ax-w-2.5 ax-h-2.5 ax-rounded-full ax-bg-success-500 ax-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 @if (tc.state !== 'running') {\n <div class=\"axm-assist-renderer__delegated-agent-detail-link\">\n <ax-button\n look=\"link\"\n color=\"primary\"\n class=\"ax-sm\"\n [text]=\"('@conversation:chat.assist-renderer.delegated-agent.detail' | translate | async) ?? ''\"\n [attr.aria-label]=\"\n ('@conversation:chat.assist-renderer.delegated-agent.detail-aria' | translate | async) ??\n ''\n \"\n (onClick)=\"\n openDelegatedAgentTranscriptDialog(tc.id, tc.name, delegatedAgentLabelForCall(tc.id))\n \"\n ></ax-button>\n </div>\n }\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 ax-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() && !isStreaming() && assistDebugFollowUpItems().length > 0) {\n <div class=\"axm-assist-bot__segment\" dir=\"auto\">\n <axm-assist-suggestion-chips [items]=\"assistDebugFollowUpItems()\" />\n </div>\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:.25rem}.axm-assist-renderer axm-assist-suggestion-chips>div{padding:0;padding-top:1rem}.axm-assist-bot,.axm-assist-bot__final-line{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),.axm-assist-renderer__markdown .axp-markdown-viewer__content :is(p,ul,ol){margin-block:.45rem}.axm-assist-bot__segment ax-conversation-text-renderer li,.axm-assist-renderer__markdown .axp-markdown-viewer__content 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__delegated-agent-detail-link{padding:.25rem;text-decoration:underline;padding-top:0}.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{background:rgb(var(--ax-sys-color-warning-100))}.axm-assist-renderer__badge--primary{background:rgb(var(--ax-sys-color-primary-100))}.axm-assist-renderer__badge--success{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"] }]
|
|
6352
|
+
], 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 />\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 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 class=\"axm-assist-renderer__delegated-agent-detail-link\">\n <ax-button\n look=\"link\"\n color=\"primary\"\n class=\"ax-sm\"\n [text]=\"('@conversation:chat.assist-renderer.delegated-agent.detail' | translate | async) ?? ''\"\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 </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 />\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 <div class=\"axm-assist-renderer__delegated-agent-detail-link\">\n <ax-button\n look=\"link\"\n color=\"primary\"\n class=\"ax-sm\"\n [text]=\"('@conversation:chat.assist-renderer.delegated-agent.detail' | translate | async) ?? ''\"\n [attr.aria-label]=\"\n ('@conversation:chat.assist-renderer.delegated-agent.detail-aria' | translate | async) ?? ''\n \"\n (onClick)=\"\n openDelegatedAgentTranscriptDialog(\n seg.callId,\n seg.content.command,\n delegatedAgentLabelForCall(seg.callId)\n )\n \"\n ></ax-button>\n </div>\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 />\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 ax-inline-block ax-w-3 ax-h-3 ax-rounded-full ax-border-2 ax-border-primary-500 ax-border-t-transparent fa-spin ax-shrink-0\"\n aria-hidden=\"true\"\n ></span>\n <span class=\"axm-assist-renderer__activity-label ax-text-xs ax-text-muted ax-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 @if (assistPayloadLine(); as line) {\n <div\n role=\"region\"\n [attr.aria-label]=\"('@conversation:chat.assist-renderer.aria.assistant-response' | translate | async) ?? ''\"\n >\n <axm-assist-transcript-user-line [line]=\"line\" [parentMessage]=\"message()\" />\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 ax-inline-block ax-w-3 ax-h-3 ax-rounded-full ax-border-2 ax-border-primary-500 ax-border-t-transparent fa-spin ax-shrink-0\"\n aria-hidden=\"true\"\n ></span>\n <span class=\"axm-assist-renderer__activity-label ax-text-xs ax-text-muted ax-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 ax-inline-block ax-w-3 ax-h-3 ax-rounded-full ax-border-2 ax-border-primary-500 ax-border-t-transparent fa-spin ax-shrink-0\"\n aria-hidden=\"true\"\n ></span>\n <span class=\"axm-assist-renderer__activity-label ax-text-xs ax-text-muted ax-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 ax-inline-flex ax-items-center ax-gap-2 ax-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 ax-inline-block ax-w-3 ax-h-3 ax-rounded-full ax-border-2 ax-border-primary-500 ax-border-t-transparent fa-spin ax-shrink-0\"\n aria-hidden=\"true\"\n ></span>\n } @else {\n <span\n class=\"ax-inline-block ax-w-3 ax-h-3 ax-rounded-full ax-bg-success-500 ax-shrink-0\"\n aria-hidden=\"true\"\n ></span>\n }\n <i class=\"fa-light fa-people-group ax-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 <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=\"ax-inline-block ax-w-2.5 ax-h-2.5 ax-rounded-full ax-border-2 ax-border-primary-500 ax-border-t-transparent fa-spin ax-shrink-0\"\n aria-hidden=\"true\"\n ></span>\n } @else {\n <span\n class=\"ax-inline-block ax-w-2.5 ax-h-2.5 ax-rounded-full ax-bg-success-500 ax-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 @if (tc.state !== 'running') {\n <div class=\"axm-assist-renderer__delegated-agent-detail-link\">\n <ax-button\n look=\"link\"\n color=\"primary\"\n class=\"ax-sm\"\n [text]=\"('@conversation:chat.assist-renderer.delegated-agent.detail' | translate | async) ?? ''\"\n [attr.aria-label]=\"\n ('@conversation:chat.assist-renderer.delegated-agent.detail-aria' | translate | async) ??\n ''\n \"\n (onClick)=\"\n openDelegatedAgentTranscriptDialog(tc.id, tc.name, delegatedAgentLabelForCall(tc.id))\n \"\n ></ax-button>\n </div>\n }\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 ax-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() && !isStreaming() && assistDebugFollowUpItems().length > 0) {\n <div class=\"axm-assist-bot__segment\" dir=\"auto\">\n <axm-assist-suggestion-chips [items]=\"assistDebugFollowUpItems()\" />\n </div>\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:.25rem}.axm-assist-renderer axm-assist-suggestion-chips>div{padding:0;padding-top:1rem}.axm-assist-bot,.axm-assist-bot__final-line{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),.axm-assist-renderer__markdown .axp-markdown-viewer__content :is(p,ul,ol){margin-block:.45rem}.axm-assist-bot__segment ax-conversation-text-renderer li,.axm-assist-renderer__markdown .axp-markdown-viewer__content 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__delegated-agent-detail-link{padding:.25rem;text-decoration:underline;padding-top:0}.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{background:rgb(var(--ax-sys-color-warning-100))}.axm-assist-renderer__badge--primary{background:rgb(var(--ax-sys-color-primary-100))}.axm-assist-renderer__badge--success{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"] }]
|
|
6275
6353
|
}], propDecorators: { message: [{ type: i0.Input, args: [{ isSignal: true, alias: "message", required: true }] }] } });
|
|
6276
6354
|
|
|
6277
6355
|
/**
|
|
@@ -6422,6 +6500,7 @@ async function copyMessageText(message) {
|
|
|
6422
6500
|
}
|
|
6423
6501
|
await globalThis.navigator?.clipboard?.writeText?.(copyText);
|
|
6424
6502
|
}
|
|
6503
|
+
//#endregion
|
|
6425
6504
|
//#region ---- Providers ----
|
|
6426
6505
|
/**
|
|
6427
6506
|
* Registers `@acorex/components/conversation2` for the whole conversation module so
|
|
@@ -6432,8 +6511,17 @@ const AXM_CHAT_CONVERSATION2_PROVIDERS = [
|
|
|
6432
6511
|
userApi: AXMChatUserApi,
|
|
6433
6512
|
conversationApi: AXMChatConversationApi,
|
|
6434
6513
|
messageApi: AXMChatMessageApi,
|
|
6514
|
+
uploaderApi: AXMChatUploaderApi,
|
|
6435
6515
|
realtimeApi: AXMChatRealtimeApi,
|
|
6436
|
-
config: {
|
|
6516
|
+
config: {
|
|
6517
|
+
messagePageSize: 30,
|
|
6518
|
+
conversationPageSize: 20,
|
|
6519
|
+
infiniteScrollThreshold: 200,
|
|
6520
|
+
scrollThreshold: 100,
|
|
6521
|
+
maxFileSize: 10 * 1024 * 1024,
|
|
6522
|
+
allowedFileTypes: ['image/*', 'video/*', 'audio/*'],
|
|
6523
|
+
maxFilesPerMessage: 3,
|
|
6524
|
+
},
|
|
6437
6525
|
registry: {
|
|
6438
6526
|
messageRenderers: [
|
|
6439
6527
|
AXM_CONVERSATION_BOT_RENDERER,
|
|
@@ -6511,6 +6599,7 @@ const AXM_CHAT_CONVERSATION2_PROVIDERS = [
|
|
|
6511
6599
|
{ provide: AXUserApi, useExisting: AXMChatUserApi },
|
|
6512
6600
|
{ provide: AXConversationApi, useExisting: AXMChatConversationApi },
|
|
6513
6601
|
{ provide: AXMessageApi, useExisting: AXMChatMessageApi },
|
|
6602
|
+
{ provide: AXUploaderApi, useExisting: AXMChatUploaderApi },
|
|
6514
6603
|
{ provide: AXRealtimeApi, useExisting: AXMChatRealtimeApi },
|
|
6515
6604
|
];
|
|
6516
6605
|
//#endregion
|
|
@@ -6537,7 +6626,7 @@ class AXMChatNotificationContentComponent {
|
|
|
6537
6626
|
<ax-button (onClick)="goToChat($event)" [text]="'Go to Chat'"></ax-button> -->
|
|
6538
6627
|
</div>
|
|
6539
6628
|
</div>
|
|
6540
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type:
|
|
6629
|
+
`, 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 }); }
|
|
6541
6630
|
}
|
|
6542
6631
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatNotificationContentComponent, decorators: [{
|
|
6543
6632
|
type: Component,
|
|
@@ -6663,7 +6752,7 @@ class AXMCommentsPageComponentProvider {
|
|
|
6663
6752
|
return [
|
|
6664
6753
|
{
|
|
6665
6754
|
key: COMMENTS_PAGE_COMPONENT_KEY,
|
|
6666
|
-
loader: () => import('./acorex-modules-conversation-comments-page.component-
|
|
6755
|
+
loader: () => import('./acorex-modules-conversation-comments-page.component-CNqL-HdS.mjs').then((m) => m.AXMCommentsPageComponent),
|
|
6667
6756
|
},
|
|
6668
6757
|
];
|
|
6669
6758
|
}
|
|
@@ -6704,9 +6793,9 @@ function routesFactory() {
|
|
|
6704
6793
|
{
|
|
6705
6794
|
path: ':id',
|
|
6706
6795
|
loadComponent: () => Promise.resolve().then(function () { return chat_component; }).then((c) => c.AXMChatComponent),
|
|
6707
|
-
//
|
|
6708
|
-
//
|
|
6709
|
-
data: { reuse:
|
|
6796
|
+
// Reuse the chat shell when switching `:id` so conversation2 can restore per-conversation composer
|
|
6797
|
+
// drafts without destroying AXMChatComponent (selectConversation reloads messages).
|
|
6798
|
+
data: { reuse: true },
|
|
6710
6799
|
},
|
|
6711
6800
|
],
|
|
6712
6801
|
},
|
|
@@ -6833,11 +6922,11 @@ class AXMConversationModule {
|
|
|
6833
6922
|
provideCommandSetups([
|
|
6834
6923
|
{
|
|
6835
6924
|
key: CONVERSATION_START_ASSIST_CHAT_COMMAND,
|
|
6836
|
-
command: () => import('./acorex-modules-conversation-start-assist-chat.command-
|
|
6925
|
+
command: () => import('./acorex-modules-conversation-start-assist-chat.command-BKwrZJDs.mjs').then((m) => m.AXMConversationStartAssistChatCommand),
|
|
6837
6926
|
},
|
|
6838
6927
|
{
|
|
6839
6928
|
key: CONVERSATION_SEND_ASSIST_CHAT_MESSAGE_COMMAND,
|
|
6840
|
-
command: () => import('./acorex-modules-conversation-send-assist-chat-message.command-
|
|
6929
|
+
command: () => import('./acorex-modules-conversation-send-assist-chat-message.command-CuYYEqhb.mjs').then((m) => m.AXMConversationSendAssistChatMessageCommand),
|
|
6841
6930
|
},
|
|
6842
6931
|
]),
|
|
6843
6932
|
], imports: [AXPWidgetCoreModule,
|
|
@@ -6955,11 +7044,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
6955
7044
|
provideCommandSetups([
|
|
6956
7045
|
{
|
|
6957
7046
|
key: CONVERSATION_START_ASSIST_CHAT_COMMAND,
|
|
6958
|
-
command: () => import('./acorex-modules-conversation-start-assist-chat.command-
|
|
7047
|
+
command: () => import('./acorex-modules-conversation-start-assist-chat.command-BKwrZJDs.mjs').then((m) => m.AXMConversationStartAssistChatCommand),
|
|
6959
7048
|
},
|
|
6960
7049
|
{
|
|
6961
7050
|
key: CONVERSATION_SEND_ASSIST_CHAT_MESSAGE_COMMAND,
|
|
6962
|
-
command: () => import('./acorex-modules-conversation-send-assist-chat-message.command-
|
|
7051
|
+
command: () => import('./acorex-modules-conversation-send-assist-chat-message.command-CuYYEqhb.mjs').then((m) => m.AXMConversationSendAssistChatMessageCommand),
|
|
6963
7052
|
},
|
|
6964
7053
|
]),
|
|
6965
7054
|
],
|
|
@@ -6970,5 +7059,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
6970
7059
|
* Generated bundle index. Do not edit.
|
|
6971
7060
|
*/
|
|
6972
7061
|
|
|
6973
|
-
export {
|
|
6974
|
-
//# sourceMappingURL=acorex-modules-conversation-acorex-modules-conversation-
|
|
7062
|
+
export { axmReadAssistAiTranscript as $, AXMChatAssistLauncherService as A, AXMConversationTabEntityModule as B, CONVERSATION_SEND_ASSIST_CHAT_MESSAGE_COMMAND as C, AXMConversationTabService as D, AXMConversationTabServiceImpl as E, AXMMessageEntityModule as F, AXMMessageService as G, AXMMessageServiceImpl as H, AXMPermissionsKeys as I, AXMRoomEntityModule as J, AXMRoomService as K, AXMRoomServiceImpl as L, AXM_ASSIST_TRANSCRIPT_LINE_PAYLOAD_TYPE as M, AXM_CONVERSATION_CHAT_ATTACHMENT_CATEGORY as N, AXM_CONVERSATION_CHAT_ATTACHMENT_REF_TYPE as O, AXPCommentWidget as P, COMMENTS_PAGE_COMPONENT_KEY as Q, RootConfig as R, axmAssistFollowUpItemsFromUnknown as S, axmAssistLastTranscriptLine as T, axmAssistUserFacingPayloadLine as U, axmAssistUserVisibleItemsForLine as V, axmBuildAssistTranscriptLinePayload as W, axmIsAssistPeerParticipant as X, axmNormalizeAssistTranscriptForChatUi as Y, axmNormalizeAssistTranscriptLineResponses as Z, axmParseAssistTranscriptLinePayload as _, AXMCommentComponent as a, axmReadAssistAiTranscriptRaw as a0, commentsPlugin as a1, messageFactory as a2, persistChatAttachment as a3, roomFactory as a4, tabFactory as a5, axmSanitizeDebugFilenamePart as b, axmDownloadDebugJson as c, axmAssistSegmentDirection as d, axmParseAssistTranscriptTextEnvelope as e, axmAssistWidgetNodeFromUnknown as f, axmSyntheticEmbedMessage as g, AXMNodeMessageRendererComponent as h, AXMAssistBotImageLineComponent as i, AXMAssistSuggestionChipsComponent as j, AXMChatComponent as k, AXMChatConversationApi as l, AXMChatMessageApi as m, AXMChatRealtimeApi as n, AXMChatUploaderApi as o, AXMChatUserApi as p, AXMCommentManagementService as q, AXMCommentPopupComponent as r, AXMCommentPopupStartAction as s, AXMCommentPopupWorkflow as t, AXMCommentRealtimeService as u, AXMCommentRealtimeServiceImpl as v, AXMCommentService as w, AXMCommentServiceImpl as x, AXMCommentWidgetViewComponent as y, AXMConversationModule as z };
|
|
7063
|
+
//# sourceMappingURL=acorex-modules-conversation-acorex-modules-conversation-DYW31fEm.mjs.map
|