@acorex/modules 21.0.0-next.51 → 21.0.0-next.54
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 -0
- package/fesm2022/{acorex-modules-ai-management-assist.entity-513RdKsz.mjs → acorex-modules-ai-management-assist.entity-CnyoIO-Z.mjs} +24 -16
- package/fesm2022/acorex-modules-ai-management-assist.entity-CnyoIO-Z.mjs.map +1 -0
- package/fesm2022/acorex-modules-ai-management.mjs +374 -35
- package/fesm2022/acorex-modules-ai-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-assessment-management-acorex-modules-assessment-management-BD5oxehv.mjs → acorex-modules-assessment-management-acorex-modules-assessment-management-DcPnI9fZ.mjs} +69 -505
- package/fesm2022/acorex-modules-assessment-management-acorex-modules-assessment-management-DcPnI9fZ.mjs.map +1 -0
- package/fesm2022/{acorex-modules-assessment-management-assessment-case.entity-BWj2PB39.mjs → acorex-modules-assessment-management-assessment-case.entity-D880d_qz.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-assessment-case.entity-BWj2PB39.mjs.map → acorex-modules-assessment-management-assessment-case.entity-D880d_qz.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-assessment-session.entity-BQnYnNOz.mjs → acorex-modules-assessment-management-assessment-session.entity-DvbocIN1.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-assessment-session.entity-BQnYnNOz.mjs.map → acorex-modules-assessment-management-assessment-session.entity-DvbocIN1.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-fill-assessment-session.command-BiS7QO_E.mjs → acorex-modules-assessment-management-fill-assessment-session.command-BMJ54EPO.mjs} +59 -85
- package/fesm2022/acorex-modules-assessment-management-fill-assessment-session.command-BMJ54EPO.mjs.map +1 -0
- package/fesm2022/{acorex-modules-assessment-management-index-BXw0Lf5c.mjs → acorex-modules-assessment-management-index-XdJCIYG3.mjs} +4 -4
- package/fesm2022/{acorex-modules-assessment-management-index-BXw0Lf5c.mjs.map → acorex-modules-assessment-management-index-XdJCIYG3.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-preview-question.command-Bm1v6ngB.mjs → acorex-modules-assessment-management-preview-question.command-CO8NfjEb.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-preview-question.command-Bm1v6ngB.mjs.map → acorex-modules-assessment-management-preview-question.command-CO8NfjEb.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-preview-questionnaire.command-Dja4PbGz.mjs → acorex-modules-assessment-management-preview-questionnaire.command-DSzbtU0e.mjs} +8 -8
- package/fesm2022/{acorex-modules-assessment-management-preview-questionnaire.command-Dja4PbGz.mjs.map → acorex-modules-assessment-management-preview-questionnaire.command-DSzbtU0e.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-BbkWs23A.mjs → acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-DbvxAUgb.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-BbkWs23A.mjs.map → acorex-modules-assessment-management-question-bank-interface-editor-widget-edit.component-DbvxAUgb.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-question-bank-item.entity-X8s42nZH.mjs → acorex-modules-assessment-management-question-bank-item.entity-DBfQhSKR.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-question-bank-item.entity-X8s42nZH.mjs.map → acorex-modules-assessment-management-question-bank-item.entity-DBfQhSKR.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-questionnaire-calculation.entity-d8HUAvWp.mjs → acorex-modules-assessment-management-questionnaire-calculation.entity-CL9s20qR.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-questionnaire-calculation.entity-d8HUAvWp.mjs.map → acorex-modules-assessment-management-questionnaire-calculation.entity-CL9s20qR.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-questionnaire-viewer-popup.component-YUDOSypz.mjs → acorex-modules-assessment-management-questionnaire-viewer-popup.component-CH_cJlSf.mjs} +205 -11
- package/fesm2022/acorex-modules-assessment-management-questionnaire-viewer-popup.component-CH_cJlSf.mjs.map +1 -0
- package/fesm2022/{acorex-modules-assessment-management-questionnaire.entity-q3Z4VIiA.mjs → acorex-modules-assessment-management-questionnaire.entity-CrryBMC2.mjs} +40 -3
- package/fesm2022/acorex-modules-assessment-management-questionnaire.entity-CrryBMC2.mjs.map +1 -0
- package/fesm2022/{acorex-modules-assessment-management-save-questionnaire-questions.command-4OLYEn35.mjs → acorex-modules-assessment-management-save-questionnaire-questions.command-Dq5VComh.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-save-questionnaire-questions.command-4OLYEn35.mjs.map → acorex-modules-assessment-management-save-questionnaire-questions.command-Dq5VComh.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-assessment-management-view-session-answers.command-DWEd-ZM_.mjs → acorex-modules-assessment-management-view-session-answers.command-DpppXekm.mjs} +2 -2
- package/fesm2022/{acorex-modules-assessment-management-view-session-answers.command-DWEd-ZM_.mjs.map → acorex-modules-assessment-management-view-session-answers.command-DpppXekm.mjs.map} +1 -1
- package/fesm2022/acorex-modules-assessment-management.mjs +1 -1
- package/fesm2022/{acorex-modules-asset-management-acorex-modules-asset-management-B1mg2dIR.mjs → acorex-modules-asset-management-acorex-modules-asset-management-BtcY1UQy.mjs} +8 -8
- package/fesm2022/{acorex-modules-asset-management-acorex-modules-asset-management-B1mg2dIR.mjs.map → acorex-modules-asset-management-acorex-modules-asset-management-BtcY1UQy.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-asset-management-asset-system-assignment.entity-lL1FBlzA.mjs → acorex-modules-asset-management-asset-system-assignment.entity-pKZoxsjk.mjs} +2 -2
- package/fesm2022/{acorex-modules-asset-management-asset-system-assignment.entity-lL1FBlzA.mjs.map → acorex-modules-asset-management-asset-system-assignment.entity-pKZoxsjk.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-asset-management-asset-system-type.entity-DFHVqE7a.mjs → acorex-modules-asset-management-asset-system-type.entity-CXz2G5v1.mjs} +2 -2
- package/fesm2022/{acorex-modules-asset-management-asset-system-type.entity-DFHVqE7a.mjs.map → acorex-modules-asset-management-asset-system-type.entity-CXz2G5v1.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-asset-management-asset-system.entity-DlpOp7Xj.mjs → acorex-modules-asset-management-asset-system.entity-C3zf6WVD.mjs} +13 -14
- package/fesm2022/acorex-modules-asset-management-asset-system.entity-C3zf6WVD.mjs.map +1 -0
- package/fesm2022/{acorex-modules-asset-management-asset-type-section-component.entity-CIkXc51V.mjs → acorex-modules-asset-management-asset-type-section-component.entity-DTaeNNBW.mjs} +2 -2
- package/fesm2022/{acorex-modules-asset-management-asset-type-section-component.entity-CIkXc51V.mjs.map → acorex-modules-asset-management-asset-type-section-component.entity-DTaeNNBW.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-asset-management-asset-type-section.entity-Ctxh5hGa.mjs → acorex-modules-asset-management-asset-type-section.entity-Bes5h7aJ.mjs} +2 -2
- package/fesm2022/{acorex-modules-asset-management-asset-type-section.entity-Ctxh5hGa.mjs.map → acorex-modules-asset-management-asset-type-section.entity-Bes5h7aJ.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-asset-management-asset-type.entity-CN6K0Uw3.mjs → acorex-modules-asset-management-asset-type.entity-Ch8h0sph.mjs} +21 -22
- package/fesm2022/acorex-modules-asset-management-asset-type.entity-Ch8h0sph.mjs.map +1 -0
- package/fesm2022/{acorex-modules-asset-management-asset.entity-2XZut6JS.mjs → acorex-modules-asset-management-asset.entity-DJ-A6lx1.mjs} +26 -26
- package/fesm2022/acorex-modules-asset-management-asset.entity-DJ-A6lx1.mjs.map +1 -0
- package/fesm2022/acorex-modules-asset-management.mjs +1 -1
- package/fesm2022/{acorex-modules-auth-acorex-modules-auth-CGiDe3e-.mjs → acorex-modules-auth-acorex-modules-auth-NPUjHz-F.mjs} +13 -13
- package/fesm2022/{acorex-modules-auth-acorex-modules-auth-CGiDe3e-.mjs.map → acorex-modules-auth-acorex-modules-auth-NPUjHz-F.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-app-chooser.component-Dt_2eXel.mjs → acorex-modules-auth-app-chooser.component-h61xNtRT.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-app-chooser.component-Dt_2eXel.mjs.map → acorex-modules-auth-app-chooser.component-h61xNtRT.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-login.module-Bl8pAhHc.mjs → acorex-modules-auth-login.module-DF5AHqYe.mjs} +4 -4
- package/fesm2022/{acorex-modules-auth-login.module-Bl8pAhHc.mjs.map → acorex-modules-auth-login.module-DF5AHqYe.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-master.layout-B8GSev0J.mjs → acorex-modules-auth-master.layout-00ZTMhc3.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-master.layout-B8GSev0J.mjs.map → acorex-modules-auth-master.layout-00ZTMhc3.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-oauth-callback.component-DleQ24IP.mjs → acorex-modules-auth-oauth-callback.component-Ce5Fw8Qd.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-oauth-callback.component-DleQ24IP.mjs.map → acorex-modules-auth-oauth-callback.component-Ce5Fw8Qd.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-password.component-D6ALMoO4.mjs → acorex-modules-auth-password.component-CU0AY-Ia.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-password.component-D6ALMoO4.mjs.map → acorex-modules-auth-password.component-CU0AY-Ia.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-password.component-C1GbARlM.mjs → acorex-modules-auth-password.component-DQYCm8wg.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-password.component-C1GbARlM.mjs.map → acorex-modules-auth-password.component-DQYCm8wg.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-routes-FDp1SEZA.mjs → acorex-modules-auth-routes-CM4fRaWb.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-routes-FDp1SEZA.mjs.map → acorex-modules-auth-routes-CM4fRaWb.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-settings.provider-CN7Lb38l.mjs → acorex-modules-auth-settings.provider-C_3D-9ia.mjs} +2 -2
- package/fesm2022/acorex-modules-auth-settings.provider-C_3D-9ia.mjs.map +1 -0
- package/fesm2022/{acorex-modules-auth-tenant-chooser.component-o55sauLG.mjs → acorex-modules-auth-tenant-chooser.component-BBztdcvq.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-tenant-chooser.component-o55sauLG.mjs.map → acorex-modules-auth-tenant-chooser.component-BBztdcvq.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-two-factor.module-CVrYPw5D.mjs → acorex-modules-auth-two-factor.module-C9AafF86.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-two-factor.module-CVrYPw5D.mjs.map → acorex-modules-auth-two-factor.module-C9AafF86.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-auth-user-sessions.component-BVglZAnc.mjs → acorex-modules-auth-user-sessions.component-Qw2sgsEe.mjs} +2 -2
- package/fesm2022/{acorex-modules-auth-user-sessions.component-BVglZAnc.mjs.map → acorex-modules-auth-user-sessions.component-Qw2sgsEe.mjs.map} +1 -1
- package/fesm2022/acorex-modules-auth.mjs +1 -1
- package/fesm2022/acorex-modules-common.mjs +8 -5
- package/fesm2022/acorex-modules-common.mjs.map +1 -1
- package/fesm2022/{acorex-modules-conversation-acorex-modules-conversation-ny5TQlkp.mjs → acorex-modules-conversation-acorex-modules-conversation-Bnjyq-wp.mjs} +1010 -164
- package/fesm2022/acorex-modules-conversation-acorex-modules-conversation-Bnjyq-wp.mjs.map +1 -0
- package/fesm2022/{acorex-modules-conversation-assist-delegated-agent-detail-popup.component-7O6som8z.mjs → acorex-modules-conversation-assist-delegated-agent-detail-popup.component-Df5LmYZI.mjs} +7 -6
- package/fesm2022/acorex-modules-conversation-assist-delegated-agent-detail-popup.component-Df5LmYZI.mjs.map +1 -0
- package/fesm2022/{acorex-modules-conversation-comments-page.component-Dm7U0ndQ.mjs → acorex-modules-conversation-comments-page.component-BXI4smIr.mjs} +2 -2
- package/fesm2022/{acorex-modules-conversation-comments-page.component-Dm7U0ndQ.mjs.map → acorex-modules-conversation-comments-page.component-BXI4smIr.mjs.map} +1 -1
- package/fesm2022/acorex-modules-conversation-send-assist-chat-message.command-B5qJnpCK.mjs +90 -0
- package/fesm2022/acorex-modules-conversation-send-assist-chat-message.command-B5qJnpCK.mjs.map +1 -0
- package/fesm2022/{acorex-modules-conversation-start-assist-chat.command-BLYoudtN.mjs → acorex-modules-conversation-start-assist-chat.command-DI3LAaDF.mjs} +2 -2
- package/fesm2022/{acorex-modules-conversation-start-assist-chat.command-BLYoudtN.mjs.map → acorex-modules-conversation-start-assist-chat.command-DI3LAaDF.mjs.map} +1 -1
- package/fesm2022/acorex-modules-conversation.mjs +1 -1
- package/fesm2022/acorex-modules-data-management.mjs +5 -3
- package/fesm2022/acorex-modules-data-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-document-management-drive-choose.component-BxQxZBca.mjs → acorex-modules-document-management-drive-choose.component-DyJoXajP.mjs} +4 -4
- package/fesm2022/{acorex-modules-document-management-drive-choose.component-BxQxZBca.mjs.map → acorex-modules-document-management-drive-choose.component-DyJoXajP.mjs.map} +1 -1
- package/fesm2022/acorex-modules-document-management.mjs +98 -24
- package/fesm2022/acorex-modules-document-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-form-template-management.mjs +53 -61
- package/fesm2022/acorex-modules-form-template-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-human-capital-management-acorex-modules-human-capital-management-B37ZqEql.mjs → acorex-modules-human-capital-management-acorex-modules-human-capital-management-XhV2JQXs.mjs} +23 -21
- package/fesm2022/acorex-modules-human-capital-management-acorex-modules-human-capital-management-XhV2JQXs.mjs.map +1 -0
- package/fesm2022/{acorex-modules-human-capital-management-approve-leave-request.command-Bf8iPUE-.mjs → acorex-modules-human-capital-management-approve-leave-request.command-Cre30Kp7.mjs} +2 -2
- package/fesm2022/{acorex-modules-human-capital-management-approve-leave-request.command-Bf8iPUE-.mjs.map → acorex-modules-human-capital-management-approve-leave-request.command-Cre30Kp7.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-human-capital-management-assign-position-assignment.command-DqX9OAq4.mjs → acorex-modules-human-capital-management-assign-position-assignment.command-NYgddiaD.mjs} +2 -2
- package/fesm2022/{acorex-modules-human-capital-management-assign-position-assignment.command-DqX9OAq4.mjs.map → acorex-modules-human-capital-management-assign-position-assignment.command-NYgddiaD.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-human-capital-management-cancel-leave-request.command-DQG0Al0X.mjs → acorex-modules-human-capital-management-cancel-leave-request.command-DPh-KQgN.mjs} +2 -2
- package/fesm2022/{acorex-modules-human-capital-management-cancel-leave-request.command-DQG0Al0X.mjs.map → acorex-modules-human-capital-management-cancel-leave-request.command-DPh-KQgN.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-human-capital-management-employee-lifecycle-process.entity-DSsgKG8S.mjs → acorex-modules-human-capital-management-employee-lifecycle-process.entity-LX68KORg.mjs} +2 -2
- package/fesm2022/{acorex-modules-human-capital-management-employee-lifecycle-process.entity-DSsgKG8S.mjs.map → acorex-modules-human-capital-management-employee-lifecycle-process.entity-LX68KORg.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-human-capital-management-employee.entity-C8PaZEDs.mjs → acorex-modules-human-capital-management-employee.entity-znCbbQUd.mjs} +2 -2
- package/fesm2022/{acorex-modules-human-capital-management-employee.entity-C8PaZEDs.mjs.map → acorex-modules-human-capital-management-employee.entity-znCbbQUd.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-human-capital-management-employment-type.entity-DhqHdESk.mjs → acorex-modules-human-capital-management-employment-type.entity-DUNB3zAB.mjs} +2 -2
- package/fesm2022/{acorex-modules-human-capital-management-employment-type.entity-DhqHdESk.mjs.map → acorex-modules-human-capital-management-employment-type.entity-DUNB3zAB.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-human-capital-management-leave-request.entity-CPdV6kiR.mjs → acorex-modules-human-capital-management-leave-request.entity-JyFrrCGE.mjs} +2 -2
- package/fesm2022/{acorex-modules-human-capital-management-leave-request.entity-CPdV6kiR.mjs.map → acorex-modules-human-capital-management-leave-request.entity-JyFrrCGE.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-human-capital-management-leave-type.entity-D3iarVMG.mjs → acorex-modules-human-capital-management-leave-type.entity-B61MiEPu.mjs} +2 -2
- package/fesm2022/{acorex-modules-human-capital-management-leave-type.entity-D3iarVMG.mjs.map → acorex-modules-human-capital-management-leave-type.entity-B61MiEPu.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-human-capital-management-lifecycle-process-type.entity-EazvPSR6.mjs → acorex-modules-human-capital-management-lifecycle-process-type.entity-DJqo2kTG.mjs} +9 -11
- package/fesm2022/acorex-modules-human-capital-management-lifecycle-process-type.entity-DJqo2kTG.mjs.map +1 -0
- package/fesm2022/{acorex-modules-human-capital-management-position-assignment.entity-mROyAoz-.mjs → acorex-modules-human-capital-management-position-assignment.entity-CKCC6bKg.mjs} +2 -2
- package/fesm2022/{acorex-modules-human-capital-management-position-assignment.entity-mROyAoz-.mjs.map → acorex-modules-human-capital-management-position-assignment.entity-CKCC6bKg.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-human-capital-management-reject-leave-request.command-Bq7OtST6.mjs → acorex-modules-human-capital-management-reject-leave-request.command-Blv08UQZ.mjs} +2 -2
- package/fesm2022/{acorex-modules-human-capital-management-reject-leave-request.command-Bq7OtST6.mjs.map → acorex-modules-human-capital-management-reject-leave-request.command-Blv08UQZ.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-human-capital-management-revoke-position-assignment.command-BpklMLve.mjs → acorex-modules-human-capital-management-revoke-position-assignment.command-lgEAbxYH.mjs} +2 -2
- package/fesm2022/{acorex-modules-human-capital-management-revoke-position-assignment.command-BpklMLve.mjs.map → acorex-modules-human-capital-management-revoke-position-assignment.command-lgEAbxYH.mjs.map} +1 -1
- package/fesm2022/acorex-modules-human-capital-management.mjs +1 -1
- package/fesm2022/acorex-modules-locale-management.mjs +1 -1
- package/fesm2022/acorex-modules-locale-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-maintenance-management-acorex-modules-maintenance-management-coPYjl8-.mjs → acorex-modules-maintenance-management-acorex-modules-maintenance-management-DiM2aFgg.mjs} +304 -206
- package/fesm2022/acorex-modules-maintenance-management-acorex-modules-maintenance-management-DiM2aFgg.mjs.map +1 -0
- package/fesm2022/{acorex-modules-maintenance-management-failure-effect.entity-BdnnavfB.mjs → acorex-modules-maintenance-management-failure-effect.entity-BCMeHmxS.mjs} +2 -2
- package/fesm2022/{acorex-modules-maintenance-management-failure-effect.entity-BdnnavfB.mjs.map → acorex-modules-maintenance-management-failure-effect.entity-BCMeHmxS.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-maintenance-management-failure-mode-asset-type.entity-tlcqWco6.mjs → acorex-modules-maintenance-management-failure-mode-asset-type.entity-ByBoVQ8D.mjs} +2 -2
- package/fesm2022/{acorex-modules-maintenance-management-failure-mode-asset-type.entity-tlcqWco6.mjs.map → acorex-modules-maintenance-management-failure-mode-asset-type.entity-ByBoVQ8D.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-maintenance-management-failure-mode-mechanism.entity-DivWl32L.mjs → acorex-modules-maintenance-management-failure-mode-mechanism.entity-BJs4KhkU.mjs} +2 -2
- package/fesm2022/{acorex-modules-maintenance-management-failure-mode-mechanism.entity-DivWl32L.mjs.map → acorex-modules-maintenance-management-failure-mode-mechanism.entity-BJs4KhkU.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-maintenance-management-failure-mode-solution.entity-9FiLeySZ.mjs → acorex-modules-maintenance-management-failure-mode-solution.entity-rw24sQxb.mjs} +2 -2
- package/fesm2022/{acorex-modules-maintenance-management-failure-mode-solution.entity-9FiLeySZ.mjs.map → acorex-modules-maintenance-management-failure-mode-solution.entity-rw24sQxb.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-maintenance-management-failure-register-cause.entity-3cq1KeYM.mjs → acorex-modules-maintenance-management-failure-register-cause.entity-C_6sjW8z.mjs} +2 -2
- package/fesm2022/{acorex-modules-maintenance-management-failure-register-cause.entity-3cq1KeYM.mjs.map → acorex-modules-maintenance-management-failure-register-cause.entity-C_6sjW8z.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-maintenance-management-failure-register-effect.entity-CaVb6rDn.mjs → acorex-modules-maintenance-management-failure-register-effect.entity-DCIAzSYQ.mjs} +2 -2
- package/fesm2022/{acorex-modules-maintenance-management-failure-register-effect.entity-CaVb6rDn.mjs.map → acorex-modules-maintenance-management-failure-register-effect.entity-DCIAzSYQ.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-maintenance-management-failure-register-mechanism.entity-C2UKW63M.mjs → acorex-modules-maintenance-management-failure-register-mechanism.entity-DlXr6A4i.mjs} +2 -2
- package/fesm2022/{acorex-modules-maintenance-management-failure-register-mechanism.entity-C2UKW63M.mjs.map → acorex-modules-maintenance-management-failure-register-mechanism.entity-DlXr6A4i.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-maintenance-management-failure-register.entity-KghFLCIJ.mjs → acorex-modules-maintenance-management-failure-register.entity-C4J3um7j.mjs} +2 -2
- package/fesm2022/{acorex-modules-maintenance-management-failure-register.entity-KghFLCIJ.mjs.map → acorex-modules-maintenance-management-failure-register.entity-C4J3um7j.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-maintenance-management-failure-severity.entity-BebswR7S.mjs → acorex-modules-maintenance-management-failure-severity.entity-C-spQtYx.mjs} +2 -2
- package/fesm2022/{acorex-modules-maintenance-management-failure-severity.entity-BebswR7S.mjs.map → acorex-modules-maintenance-management-failure-severity.entity-C-spQtYx.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-maintenance-management-maintenance-template.entity-1V4swUZ4.mjs → acorex-modules-maintenance-management-maintenance-template.entity-Huahnjhd.mjs} +100 -178
- package/fesm2022/acorex-modules-maintenance-management-maintenance-template.entity-Huahnjhd.mjs.map +1 -0
- package/fesm2022/{acorex-modules-maintenance-management-work-order-list-command-3hlrAtIr.mjs → acorex-modules-maintenance-management-work-order-list-command-1YsWctqu.mjs} +2 -2
- package/fesm2022/{acorex-modules-maintenance-management-work-order-list-command-3hlrAtIr.mjs.map → acorex-modules-maintenance-management-work-order-list-command-1YsWctqu.mjs.map} +1 -1
- package/fesm2022/acorex-modules-maintenance-management.mjs +1 -1
- package/fesm2022/acorex-modules-notification-management.mjs +1 -1
- package/fesm2022/acorex-modules-notification-management.mjs.map +1 -1
- package/fesm2022/acorex-modules-order-management-settings.provider-BFOghuIS.mjs +58 -0
- package/fesm2022/acorex-modules-order-management-settings.provider-BFOghuIS.mjs.map +1 -0
- package/fesm2022/acorex-modules-order-management.mjs +2 -2
- package/fesm2022/{acorex-modules-organization-management-acorex-modules-organization-management-CGzZcKEy.mjs → acorex-modules-organization-management-acorex-modules-organization-management-BZtWfgmH.mjs} +40 -120
- package/fesm2022/acorex-modules-organization-management-acorex-modules-organization-management-BZtWfgmH.mjs.map +1 -0
- package/fesm2022/{acorex-modules-organization-management-add-business-unit-to-business-unit.command-BEJyfR3P.mjs → acorex-modules-organization-management-add-business-unit-to-business-unit.command-C-yO5On4.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-add-business-unit-to-business-unit.command-BEJyfR3P.mjs.map → acorex-modules-organization-management-add-business-unit-to-business-unit.command-C-yO5On4.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-add-position-to-business-unit.command-DKgxg9q5.mjs → acorex-modules-organization-management-add-position-to-business-unit.command-BL5eWJ56.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-add-position-to-business-unit.command-DKgxg9q5.mjs.map → acorex-modules-organization-management-add-position-to-business-unit.command-BL5eWJ56.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-add-team-to-business-unit.command-DJJT7BXT.mjs → acorex-modules-organization-management-add-team-to-business-unit.command-l4N6g0Hc.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-add-team-to-business-unit.command-DJJT7BXT.mjs.map → acorex-modules-organization-management-add-team-to-business-unit.command-l4N6g0Hc.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-business-unit.entity-BAp38sib.mjs → acorex-modules-organization-management-business-unit.entity-CONTwX52.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-business-unit.entity-BAp38sib.mjs.map → acorex-modules-organization-management-business-unit.entity-CONTwX52.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-chart.entity-WfmpWj8R.mjs → acorex-modules-organization-management-chart.entity-DeKPBfgx.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-chart.entity-WfmpWj8R.mjs.map → acorex-modules-organization-management-chart.entity-DeKPBfgx.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-company.entity-BUVLrwjq.mjs → acorex-modules-organization-management-company.entity-BAlz8AfD.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-company.entity-BUVLrwjq.mjs.map → acorex-modules-organization-management-company.entity-BAlz8AfD.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-entity.provider-DH3eUGTu.mjs → acorex-modules-organization-management-entity.provider-DjPSiqcX.mjs} +15 -15
- package/fesm2022/{acorex-modules-organization-management-entity.provider-DH3eUGTu.mjs.map → acorex-modules-organization-management-entity.provider-DjPSiqcX.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-feature-definition.provider-DuScrBze.mjs → acorex-modules-organization-management-feature-definition.provider-BLmayeSc.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-feature-definition.provider-DuScrBze.mjs.map → acorex-modules-organization-management-feature-definition.provider-BLmayeSc.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-job-definition-pages-component.provider-D-J9JCsU.mjs → acorex-modules-organization-management-job-definition-pages-component.provider-HBi-EMRE.mjs} +3 -3
- package/fesm2022/{acorex-modules-organization-management-job-definition-pages-component.provider-D-J9JCsU.mjs.map → acorex-modules-organization-management-job-definition-pages-component.provider-HBi-EMRE.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-job-definition-responsibilities-page.component-Dsy5rFGw.mjs → acorex-modules-organization-management-job-definition-responsibilities-page.component-CtIfsZ6x.mjs} +3 -3
- package/fesm2022/{acorex-modules-organization-management-job-definition-responsibilities-page.component-Dsy5rFGw.mjs.map → acorex-modules-organization-management-job-definition-responsibilities-page.component-CtIfsZ6x.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-job-definition-skills-page.component-B73wLPby.mjs → acorex-modules-organization-management-job-definition-skills-page.component-C1vCQayM.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-job-definition-skills-page.component-B73wLPby.mjs.map → acorex-modules-organization-management-job-definition-skills-page.component-C1vCQayM.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-job-definition.entity-B7mWKYqb.mjs → acorex-modules-organization-management-job-definition.entity-Db5li0zL.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-job-definition.entity-B7mWKYqb.mjs.map → acorex-modules-organization-management-job-definition.entity-Db5li0zL.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-job-level.datasource-DibRoKXR.mjs → acorex-modules-organization-management-job-level.datasource-BTRKW7nq.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-job-level.datasource-DibRoKXR.mjs.map → acorex-modules-organization-management-job-level.datasource-BTRKW7nq.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-job-level.entity-C_MzeTw5.mjs → acorex-modules-organization-management-job-level.entity-Cn-91_r8.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-job-level.entity-C_MzeTw5.mjs.map → acorex-modules-organization-management-job-level.entity-Cn-91_r8.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-menu.provider-CQeJINzl.mjs → acorex-modules-organization-management-menu.provider-CVmV-hY5.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-menu.provider-CQeJINzl.mjs.map → acorex-modules-organization-management-menu.provider-CVmV-hY5.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-org-chart-default-node-contribution.provider-D3hCHSr_.mjs → acorex-modules-organization-management-org-chart-default-node-contribution.provider-bdtNexEf.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-org-chart-default-node-contribution.provider-D3hCHSr_.mjs.map → acorex-modules-organization-management-org-chart-default-node-contribution.provider-bdtNexEf.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-org-chart-employee-flyout-contribution.provider-Bv0I-45L.mjs → acorex-modules-organization-management-org-chart-employee-flyout-contribution.provider-B0aaFv5p.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-org-chart-employee-flyout-contribution.provider-Bv0I-45L.mjs.map → acorex-modules-organization-management-org-chart-employee-flyout-contribution.provider-B0aaFv5p.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-org-chart-position-employee-node-contribution.provider-DbfYza8q.mjs → acorex-modules-organization-management-org-chart-position-employee-node-contribution.provider-Xe4nhY3j.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-org-chart-position-employee-node-contribution.provider-DbfYza8q.mjs.map → acorex-modules-organization-management-org-chart-position-employee-node-contribution.provider-Xe4nhY3j.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-org-chart-ux-node-contribution.provider-C9APxguL.mjs → acorex-modules-organization-management-org-chart-ux-node-contribution.provider-CTprHwCi.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-org-chart-ux-node-contribution.provider-C9APxguL.mjs.map → acorex-modules-organization-management-org-chart-ux-node-contribution.provider-CTprHwCi.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-org-chart.page-BcHO5kKP.mjs → acorex-modules-organization-management-org-chart.page-ChXY8ncD.mjs} +133 -12
- package/fesm2022/acorex-modules-organization-management-org-chart.page-ChXY8ncD.mjs.map +1 -0
- package/fesm2022/{acorex-modules-organization-management-permission-definition.provider-BcIRJpBt.mjs → acorex-modules-organization-management-permission-definition.provider-8t2vBgtp.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-permission-definition.provider-BcIRJpBt.mjs.map → acorex-modules-organization-management-permission-definition.provider-8t2vBgtp.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-position.entity-DBOpLtSI.mjs → acorex-modules-organization-management-position.entity-BVWbTeks.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-position.entity-DBOpLtSI.mjs.map → acorex-modules-organization-management-position.entity-BVWbTeks.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-remove-position-from-business-unit.command-TqYgfnsy.mjs → acorex-modules-organization-management-remove-position-from-business-unit.command-DWzFncr1.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-remove-position-from-business-unit.command-TqYgfnsy.mjs.map → acorex-modules-organization-management-remove-position-from-business-unit.command-DWzFncr1.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-replace-position-assignee.command-BJ2gn0-A.mjs → acorex-modules-organization-management-replace-position-assignee.command-CNa-CZOv.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-replace-position-assignee.command-BJ2gn0-A.mjs.map → acorex-modules-organization-management-replace-position-assignee.command-CNa-CZOv.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-CZdMLIL-.mjs → acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-CTSCcyFv.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-CZdMLIL-.mjs.map → acorex-modules-organization-management-responsibilities-matrix-widget-edit.component-CTSCcyFv.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix-widget-view.component-BBo97rDN.mjs → acorex-modules-organization-management-responsibilities-matrix-widget-view.component-C82TQFS-.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix-widget-view.component-BBo97rDN.mjs.map → acorex-modules-organization-management-responsibilities-matrix-widget-view.component-C82TQFS-.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix.component-D9oH_Fbb.mjs → acorex-modules-organization-management-responsibilities-matrix.component-DjVuISfE.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-responsibilities-matrix.component-D9oH_Fbb.mjs.map → acorex-modules-organization-management-responsibilities-matrix.component-DjVuISfE.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-responsibility-level.entity-D6IG9Zc7.mjs → acorex-modules-organization-management-responsibility-level.entity-BlENDhF6.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-responsibility-level.entity-D6IG9Zc7.mjs.map → acorex-modules-organization-management-responsibility-level.entity-BlENDhF6.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-responsibility.entity-BosNxYjW.mjs → acorex-modules-organization-management-responsibility.entity-DamPTQMp.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-responsibility.entity-BosNxYjW.mjs.map → acorex-modules-organization-management-responsibility.entity-DamPTQMp.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-settings.provider-CL9C9UXA.mjs → acorex-modules-organization-management-settings.provider-CtQo6YHj.mjs} +3 -3
- package/fesm2022/acorex-modules-organization-management-settings.provider-CtQo6YHj.mjs.map +1 -0
- package/fesm2022/{acorex-modules-organization-management-team-business-unit.entity-CYFGTcHe.mjs → acorex-modules-organization-management-team-business-unit.entity-BfvqQb1K.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-team-business-unit.entity-CYFGTcHe.mjs.map → acorex-modules-organization-management-team-business-unit.entity-BfvqQb1K.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-team-member-role.entity-B5vNDne0.mjs → acorex-modules-organization-management-team-member-role.entity-wWoB56Il.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-team-member-role.entity-B5vNDne0.mjs.map → acorex-modules-organization-management-team-member-role.entity-wWoB56Il.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-team-member.entity-DsKuxCRB.mjs → acorex-modules-organization-management-team-member.entity-COGrDN_G.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-team-member.entity-DsKuxCRB.mjs.map → acorex-modules-organization-management-team-member.entity-COGrDN_G.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-organization-management-team.entity-Cg30cho_.mjs → acorex-modules-organization-management-team.entity-DC_rqp9e.mjs} +2 -2
- package/fesm2022/{acorex-modules-organization-management-team.entity-Cg30cho_.mjs.map → acorex-modules-organization-management-team.entity-DC_rqp9e.mjs.map} +1 -1
- package/fesm2022/acorex-modules-organization-management.mjs +1 -1
- package/fesm2022/{acorex-modules-platform-dev-tools-settings.provider-DKmgBUYt.mjs → acorex-modules-platform-dev-tools-settings.provider-BIVP27kT.mjs} +2 -2
- package/fesm2022/acorex-modules-platform-dev-tools-settings.provider-BIVP27kT.mjs.map +1 -0
- package/fesm2022/acorex-modules-platform-dev-tools.mjs +2 -2
- package/fesm2022/{acorex-modules-platform-management-acorex-modules-platform-management-DkOzj2Oy.mjs → acorex-modules-platform-management-acorex-modules-platform-management-5DJoQkx2.mjs} +1919 -4
- package/fesm2022/acorex-modules-platform-management-acorex-modules-platform-management-5DJoQkx2.mjs.map +1 -0
- package/fesm2022/{acorex-modules-platform-management-menu-list.component-agWZWchQ.mjs → acorex-modules-platform-management-menu-list.component-C3WBYbOt.mjs} +4 -4
- package/fesm2022/{acorex-modules-platform-management-menu-list.component-agWZWchQ.mjs.map → acorex-modules-platform-management-menu-list.component-C3WBYbOt.mjs.map} +1 -1
- package/fesm2022/acorex-modules-platform-management.mjs +1 -1
- package/fesm2022/{acorex-modules-settings-management-acorex-modules-settings-management-oArHHeSx.mjs → acorex-modules-settings-management-acorex-modules-settings-management-Di6Sxtq3.mjs} +5 -5
- package/fesm2022/{acorex-modules-settings-management-acorex-modules-settings-management-oArHHeSx.mjs.map → acorex-modules-settings-management-acorex-modules-settings-management-Di6Sxtq3.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-settings-management-permission-definition.provider-BsFyZ-gS.mjs → acorex-modules-settings-management-permission-definition.provider-Bml5VZUT.mjs} +2 -2
- package/fesm2022/{acorex-modules-settings-management-permission-definition.provider-BsFyZ-gS.mjs.map → acorex-modules-settings-management-permission-definition.provider-Bml5VZUT.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-settings-management-setting-page.component-BftWms4f.mjs → acorex-modules-settings-management-setting-page.component-lN-7sTpD.mjs} +4 -4
- package/fesm2022/{acorex-modules-settings-management-setting-page.component-BftWms4f.mjs.map → acorex-modules-settings-management-setting-page.component-lN-7sTpD.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-settings-management-setting-view.component-paKdiSEr.mjs → acorex-modules-settings-management-setting-view.component-D17G4RNQ.mjs} +15 -28
- package/fesm2022/acorex-modules-settings-management-setting-view.component-D17G4RNQ.mjs.map +1 -0
- package/fesm2022/acorex-modules-settings-management.mjs +1 -1
- package/fesm2022/acorex-modules-system-insight.mjs +1 -1
- package/fesm2022/acorex-modules-system-insight.mjs.map +1 -1
- package/fesm2022/{acorex-modules-task-management-acorex-modules-task-management-BL2IOcx3.mjs → acorex-modules-task-management-acorex-modules-task-management-LQn5gZ6p.mjs} +680 -10
- package/fesm2022/acorex-modules-task-management-acorex-modules-task-management-LQn5gZ6p.mjs.map +1 -0
- package/fesm2022/{acorex-modules-task-management-task-board.page-DUIHtqnr.mjs → acorex-modules-task-management-task-board.page-BokG-G6Z.mjs} +204 -591
- package/fesm2022/acorex-modules-task-management-task-board.page-BokG-G6Z.mjs.map +1 -0
- package/fesm2022/acorex-modules-task-management.mjs +1 -1
- package/fesm2022/acorex-modules-tenant-management.mjs +1 -1
- package/fesm2022/acorex-modules-tenant-management.mjs.map +1 -1
- package/fesm2022/{acorex-modules-workflow-management-activity-command-configurator-widget-edit.component-CYyr1kQk.mjs → acorex-modules-workflow-management-activity-command-configurator-widget-edit.component-OLbCD-7P.mjs} +4 -4
- package/fesm2022/{acorex-modules-workflow-management-activity-command-configurator-widget-edit.component-CYyr1kQk.mjs.map → acorex-modules-workflow-management-activity-command-configurator-widget-edit.component-OLbCD-7P.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-workflow-management-index-CHySddpP.mjs → acorex-modules-workflow-management-index-34UZrsxw.mjs} +2 -2
- package/fesm2022/{acorex-modules-workflow-management-index-CHySddpP.mjs.map → acorex-modules-workflow-management-index-34UZrsxw.mjs.map} +1 -1
- package/fesm2022/acorex-modules-workflow-management-index-BxqOP8AA.mjs +1207 -0
- package/fesm2022/acorex-modules-workflow-management-index-BxqOP8AA.mjs.map +1 -0
- package/fesm2022/{acorex-modules-workflow-management-index-DC_9M9dk.mjs → acorex-modules-workflow-management-index-Eh5DDK-V.mjs} +3 -3
- package/fesm2022/{acorex-modules-workflow-management-index-DC_9M9dk.mjs.map → acorex-modules-workflow-management-index-Eh5DDK-V.mjs.map} +1 -1
- package/fesm2022/{acorex-modules-workflow-management-save-workflow-definition-activities.command-fFO152ni.mjs → acorex-modules-workflow-management-save-workflow-definition-activities.command-CGNwslcn.mjs} +10 -5
- package/fesm2022/acorex-modules-workflow-management-save-workflow-definition-activities.command-CGNwslcn.mjs.map +1 -0
- package/fesm2022/{acorex-modules-workflow-management-workflow-definition.entity-CjQQpjdB.mjs → acorex-modules-workflow-management-workflow-definition.entity-DISpkWE4.mjs} +3 -7
- package/fesm2022/acorex-modules-workflow-management-workflow-definition.entity-DISpkWE4.mjs.map +1 -0
- package/fesm2022/{acorex-modules-workflow-management-workflow-instance.entity-BnKT3Wgh.mjs → acorex-modules-workflow-management-workflow-instance.entity-B_V3uMSI.mjs} +2 -2
- package/fesm2022/{acorex-modules-workflow-management-workflow-instance.entity-BnKT3Wgh.mjs.map → acorex-modules-workflow-management-workflow-instance.entity-B_V3uMSI.mjs.map} +1 -1
- package/fesm2022/acorex-modules-workflow-management-workflow-task-popover.component-DMszilef.mjs +356 -0
- package/fesm2022/acorex-modules-workflow-management-workflow-task-popover.component-DMszilef.mjs.map +1 -0
- package/fesm2022/acorex-modules-workflow-management.mjs +257 -130
- package/fesm2022/acorex-modules-workflow-management.mjs.map +1 -1
- package/package.json +2 -2
- package/types/acorex-modules-ai-management.d.ts +73 -5
- package/types/acorex-modules-assessment-management.d.ts +161 -97
- package/types/acorex-modules-asset-management.d.ts +3 -0
- package/types/acorex-modules-conversation.d.ts +12 -2
- package/types/acorex-modules-human-capital-management.d.ts +6 -6
- package/types/acorex-modules-maintenance-management.d.ts +28 -11
- package/types/acorex-modules-organization-management.d.ts +1 -27
- package/types/acorex-modules-platform-management.d.ts +518 -23
- package/types/acorex-modules-task-management.d.ts +100 -4
- package/types/acorex-modules-workflow-management.d.ts +53 -5
- package/fesm2022/acorex-modules-ai-management-assist.entity-513RdKsz.mjs.map +0 -1
- package/fesm2022/acorex-modules-assessment-management-acorex-modules-assessment-management-BD5oxehv.mjs.map +0 -1
- package/fesm2022/acorex-modules-assessment-management-fill-assessment-session.command-BiS7QO_E.mjs.map +0 -1
- package/fesm2022/acorex-modules-assessment-management-questionnaire-viewer-popup.component-YUDOSypz.mjs.map +0 -1
- package/fesm2022/acorex-modules-assessment-management-questionnaire.entity-q3Z4VIiA.mjs.map +0 -1
- package/fesm2022/acorex-modules-asset-management-asset-system.entity-DlpOp7Xj.mjs.map +0 -1
- package/fesm2022/acorex-modules-asset-management-asset-type.entity-CN6K0Uw3.mjs.map +0 -1
- package/fesm2022/acorex-modules-asset-management-asset.entity-2XZut6JS.mjs.map +0 -1
- package/fesm2022/acorex-modules-auth-settings.provider-CN7Lb38l.mjs.map +0 -1
- package/fesm2022/acorex-modules-conversation-acorex-modules-conversation-ny5TQlkp.mjs.map +0 -1
- package/fesm2022/acorex-modules-conversation-assist-delegated-agent-detail-popup.component-7O6som8z.mjs.map +0 -1
- package/fesm2022/acorex-modules-human-capital-management-acorex-modules-human-capital-management-B37ZqEql.mjs.map +0 -1
- package/fesm2022/acorex-modules-human-capital-management-lifecycle-process-type.entity-EazvPSR6.mjs.map +0 -1
- package/fesm2022/acorex-modules-maintenance-management-acorex-modules-maintenance-management-coPYjl8-.mjs.map +0 -1
- package/fesm2022/acorex-modules-maintenance-management-maintenance-template.entity-1V4swUZ4.mjs.map +0 -1
- package/fesm2022/acorex-modules-order-management-settings.provider-DF8JQ1PZ.mjs +0 -64
- package/fesm2022/acorex-modules-order-management-settings.provider-DF8JQ1PZ.mjs.map +0 -1
- package/fesm2022/acorex-modules-organization-management-acorex-modules-organization-management-CGzZcKEy.mjs.map +0 -1
- package/fesm2022/acorex-modules-organization-management-org-chart.page-BcHO5kKP.mjs.map +0 -1
- package/fesm2022/acorex-modules-organization-management-settings.provider-CL9C9UXA.mjs.map +0 -1
- package/fesm2022/acorex-modules-platform-dev-tools-settings.provider-DKmgBUYt.mjs.map +0 -1
- package/fesm2022/acorex-modules-platform-management-acorex-modules-platform-management-DkOzj2Oy.mjs.map +0 -1
- package/fesm2022/acorex-modules-settings-management-setting-view.component-paKdiSEr.mjs.map +0 -1
- package/fesm2022/acorex-modules-task-management-acorex-modules-task-management-BL2IOcx3.mjs.map +0 -1
- package/fesm2022/acorex-modules-task-management-task-board.page-DUIHtqnr.mjs.map +0 -1
- package/fesm2022/acorex-modules-workflow-management-index-jin24dmb.mjs +0 -726
- package/fesm2022/acorex-modules-workflow-management-index-jin24dmb.mjs.map +0 -1
- package/fesm2022/acorex-modules-workflow-management-save-workflow-definition-activities.command-fFO152ni.mjs.map +0 -1
- package/fesm2022/acorex-modules-workflow-management-workflow-definition.entity-CjQQpjdB.mjs.map +0 -1
|
@@ -2,24 +2,24 @@ import { AXConversationModule } from '@acorex/components/conversation';
|
|
|
2
2
|
import { AXPSessionService, AXPAuthGuard, AXP_PERMISSION_DEFINITION_PROVIDER } from '@acorex/platform/auth';
|
|
3
3
|
import { createAllQueryView, AXPEntityQueryType, AXPSettingsService, AXPCommonSettings, AXPFilterOperatorMiddlewareService, AXPEntityCommandScope, AXPFileStorageService, AXP_MENU_PROVIDER, AXP_SEARCH_PROVIDER, AXP_SEARCH_DEFINITION_PROVIDER } from '@acorex/platform/common';
|
|
4
4
|
import { AXPSystemActionType, AXPDataGenerator, AXPPlatformScope, AXPDeviceService, AXP_MODULE_MANIFEST_PROVIDER } from '@acorex/platform/core';
|
|
5
|
-
import { AXPThemeLayoutBlockComponent, AXPThemeLayoutStartSideComponent, AXPUserAvatarComponent,
|
|
5
|
+
import { AXPMarkdownViewerComponent, AXPThemeLayoutBlockComponent, AXPThemeLayoutStartSideComponent, AXPUserAvatarComponent, AXPMarkdownTemplateDirective, AXP_PAGE_COMPONENT_PROVIDER, AXP_TASK_BADGE_PROVIDERS } from '@acorex/platform/layout/components';
|
|
6
6
|
import { AXPEntityDefinitionRegistryService, AXMEntityCrudServiceImpl, entityMasterCrudActions, entityMasterRecordActions, AXPEntityService, cloneLayoutArrays, ensureLayoutSection, ensureLayoutPropertyView, resolveEntityPluginDetailPageOrder, ensureListActions, actionExists, AXP_ENTITY_ACTION_PLUGIN, AXP_ENTITY_DEFINITION_LOADER } from '@acorex/platform/layout/entity';
|
|
7
7
|
import { AXPRootLayoutComponent } from '@acorex/platform/themes/default';
|
|
8
8
|
import * as i5 from '@angular/common';
|
|
9
|
-
import { AsyncPipe, CommonModule, DecimalPipe, DatePipe } from '@angular/common';
|
|
10
|
-
import { provideCommandSetups } from '@acorex/platform/runtime';
|
|
9
|
+
import { AsyncPipe, CommonModule, isPlatformBrowser, DecimalPipe, DatePipe } from '@angular/common';
|
|
10
|
+
import { AXPCommandService, provideCommandSetups } from '@acorex/platform/runtime';
|
|
11
11
|
import * as i0 from '@angular/core';
|
|
12
|
-
import { inject, Injectable, NgModule, input,
|
|
12
|
+
import { inject, Injectable, NgModule, input, computed, ChangeDetectionStrategy, Component, signal, effect, untracked, output, viewChild, afterNextRender, DestroyRef, ElementRef, ViewEncapsulation, PLATFORM_ID, Injector, importProvidersFrom } from '@angular/core';
|
|
13
13
|
import { Router, ActivatedRoute, RouterModule, ROUTES } from '@angular/router';
|
|
14
14
|
import { sortBy } from 'lodash-es';
|
|
15
|
-
import { RootConfig as RootConfig$1,
|
|
16
|
-
import { AXConversationService, AXUserApi, AXConversationApi, AXMessageApi, AXRealtimeApi, conversationSharedStorage, AXNewConversationDialogComponent, 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,
|
|
15
|
+
import { RootConfig as RootConfig$1, axpAiAssistStarterPromptLabels, axpAiAssistInitialMessagesToTranscript, axpAiChatMessageGetText, AXPAiManagerService, axpAiChatMessagesFromProviderAssistant, axpAiChatMessageIsDelegatedReflectionExcluded, axpAiParseDelegatedAgentResultSegmentsFromUnknown, axpAiNormalizeFollowUpContent, 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';
|
|
16
|
+
import { AXConversationService, AXUserApi, AXConversationApi, AXMessageApi, AXRealtimeApi, conversationSharedStorage, AXNewConversationDialogComponent, AXConversationContainerDirective, AXSidebarComponent, AXInfoBarComponent, AXMessageListComponent, AXComposerComponent, AXComposerService, 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
17
|
import { AXToastService } from '@acorex/components/toast';
|
|
18
18
|
import * as i3 from '@acorex/core/translation';
|
|
19
19
|
import { AXTranslationService, AXTranslationModule } from '@acorex/core/translation';
|
|
20
|
-
import * as i1$
|
|
20
|
+
import * as i1$2 from '@acorex/platform/layout/widget-core';
|
|
21
21
|
import { AXPWidgetsCatalog, AXPValueWidgetComponent, AXPWidgetGroupEnum, AXPWidgetCoreModule, AXP_WIDGET_DEFINITION_PROVIDER } from '@acorex/platform/layout/widget-core';
|
|
22
|
-
import * as i1$
|
|
22
|
+
import * as i1$5 from '@acorex/platform/workflow';
|
|
23
23
|
import { AXPWorkflowAction, AXPWorkflowModule } from '@acorex/platform/workflow';
|
|
24
24
|
import { AXMNotificationConnectorService, AXP_NOTIFICATION_DEFINITION_PROVIDER } from '@acorex/modules/notification-management';
|
|
25
25
|
import { AXMUsersEntityService } from '@acorex/modules/security-management';
|
|
@@ -27,7 +27,7 @@ import { Subject, map, filter, merge, auditTime } from 'rxjs';
|
|
|
27
27
|
import * as i2 from '@acorex/components/button';
|
|
28
28
|
import { AXButtonModule, AXButtonComponent } from '@acorex/components/button';
|
|
29
29
|
import { AXDialogService } from '@acorex/components/dialog';
|
|
30
|
-
import * as
|
|
30
|
+
import * as i2$1 from '@acorex/components/decorators';
|
|
31
31
|
import { AXDecoratorModule } from '@acorex/components/decorators';
|
|
32
32
|
import { AXPPageLayoutBaseComponent, AXPPageLayoutComponent } from '@acorex/platform/layout/views';
|
|
33
33
|
import { toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
@@ -44,7 +44,7 @@ import { AXImageComponent, AXImageModule } from '@acorex/components/image';
|
|
|
44
44
|
import { AXListComponent } from '@acorex/components/list';
|
|
45
45
|
import { AXBasePageComponent } from '@acorex/components/page';
|
|
46
46
|
import { AXSearchBoxComponent } from '@acorex/components/search-box';
|
|
47
|
-
import * as i1$
|
|
47
|
+
import * as i1$1 from '@acorex/components/wysiwyg';
|
|
48
48
|
import { AXWysiwygModule } from '@acorex/components/wysiwyg';
|
|
49
49
|
import { trigger, transition, style, animate } from '@angular/animations';
|
|
50
50
|
import { DomSanitizer } from '@angular/platform-browser';
|
|
@@ -54,15 +54,16 @@ import { AXDropdownButtonModule } from '@acorex/components/dropdown-button';
|
|
|
54
54
|
import { AXFormModule } from '@acorex/components/form';
|
|
55
55
|
import * as i6 from '@acorex/components/loading';
|
|
56
56
|
import { AXLoadingModule } from '@acorex/components/loading';
|
|
57
|
-
import * as i2$
|
|
57
|
+
import * as i2$2 from '@acorex/components/skeleton';
|
|
58
58
|
import { AXSkeletonModule } from '@acorex/components/skeleton';
|
|
59
59
|
import { AXToolBarModule } from '@acorex/components/toolbar';
|
|
60
60
|
import * as i9 from '@acorex/core/format';
|
|
61
61
|
import { AXFormatModule } from '@acorex/core/format';
|
|
62
62
|
import { AXPLayoutBuilderService, AXPLayoutRendererComponent } from '@acorex/platform/layout/builder';
|
|
63
|
-
import
|
|
63
|
+
import { AXLabelModule } from '@acorex/components/label';
|
|
64
|
+
import * as i1$4 from '@acorex/cdk/accordion';
|
|
64
65
|
import { AXAccordionCdkModule } from '@acorex/cdk/accordion';
|
|
65
|
-
import * as i1$
|
|
66
|
+
import * as i1$3 from '@acorex/components/code-editor';
|
|
66
67
|
import { AXCodeEditorModule } from '@acorex/components/code-editor';
|
|
67
68
|
|
|
68
69
|
const config = {
|
|
@@ -102,6 +103,8 @@ const RootConfig = {
|
|
|
102
103
|
|
|
103
104
|
/** Starts a new bot conversation with the given AI assist model. */
|
|
104
105
|
const CONVERSATION_START_ASSIST_CHAT_COMMAND = 'Conversation:StartAssistChat';
|
|
106
|
+
/** Sends a user text message in the active assist chat, or starts a chat when {@code assistId} is provided. */
|
|
107
|
+
const CONVERSATION_SEND_ASSIST_CHAT_MESSAGE_COMMAND = 'Conversation:SendAssistChatMessage';
|
|
105
108
|
|
|
106
109
|
//#region ---- Imports ----
|
|
107
110
|
//#endregion
|
|
@@ -1917,63 +1920,261 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
1917
1920
|
args: [{ providedIn: 'root' }]
|
|
1918
1921
|
}], ctorParameters: () => [] });
|
|
1919
1922
|
|
|
1923
|
+
//#region ---- Imports ----
|
|
1924
|
+
//#endregion
|
|
1925
|
+
//#region ---- Command resolution ----
|
|
1926
|
+
/**
|
|
1927
|
+
* Resolves a follow-up chip command for Conversation assist.
|
|
1928
|
+
* AI follow-up output may use invalid `Registry:*` placeholders; those map to
|
|
1929
|
+
* {@link CONVERSATION_SEND_ASSIST_CHAT_MESSAGE_COMMAND} so the chip text is sent as the next user message.
|
|
1930
|
+
*/
|
|
1931
|
+
function axmAssistResolveFollowUpCommandName(rawName, commandExists) {
|
|
1932
|
+
const name = rawName.trim();
|
|
1933
|
+
if (name && commandExists(name)) {
|
|
1934
|
+
return name;
|
|
1935
|
+
}
|
|
1936
|
+
const withoutRegistryPrefix = name.startsWith('Registry:') ? name.slice('Registry:'.length).trim() : '';
|
|
1937
|
+
if (withoutRegistryPrefix && commandExists(withoutRegistryPrefix)) {
|
|
1938
|
+
return withoutRegistryPrefix;
|
|
1939
|
+
}
|
|
1940
|
+
return CONVERSATION_SEND_ASSIST_CHAT_MESSAGE_COMMAND;
|
|
1941
|
+
}
|
|
1942
|
+
/** Rewrites invalid follow-up commands (e.g. hallucinated `Registry:*` keys) before rendering chips. */
|
|
1943
|
+
function axmAssistNormalizeFollowUpItemForConversation(item) {
|
|
1944
|
+
const name = item.command.name.trim();
|
|
1945
|
+
if (!name || name.startsWith('Registry:')) {
|
|
1946
|
+
return {
|
|
1947
|
+
...item,
|
|
1948
|
+
command: {
|
|
1949
|
+
name: CONVERSATION_SEND_ASSIST_CHAT_MESSAGE_COMMAND,
|
|
1950
|
+
options: item.command.options,
|
|
1951
|
+
},
|
|
1952
|
+
};
|
|
1953
|
+
}
|
|
1954
|
+
return item;
|
|
1955
|
+
}
|
|
1956
|
+
function axmAssistNormalizeFollowUpItemsForConversation(items) {
|
|
1957
|
+
return items.map(axmAssistNormalizeFollowUpItemForConversation);
|
|
1958
|
+
}
|
|
1959
|
+
//#endregion
|
|
1960
|
+
//#region ---- Mapping ----
|
|
1961
|
+
/**
|
|
1962
|
+
* Maps assist starter prompts to follow-up chip items that run {@link CONVERSATION_SEND_ASSIST_CHAT_MESSAGE_COMMAND}.
|
|
1963
|
+
*/
|
|
1964
|
+
function axmAssistStarterPromptChipItems(source, options) {
|
|
1965
|
+
return axpAiAssistStarterPromptLabels(source).map((text) => ({
|
|
1966
|
+
text,
|
|
1967
|
+
command: {
|
|
1968
|
+
name: CONVERSATION_SEND_ASSIST_CHAT_MESSAGE_COMMAND,
|
|
1969
|
+
options: {
|
|
1970
|
+
...(options?.assistId ? { assistId: options.assistId } : {}),
|
|
1971
|
+
...(options?.conversationId ? { conversationId: options.conversationId } : {}),
|
|
1972
|
+
},
|
|
1973
|
+
},
|
|
1974
|
+
}));
|
|
1975
|
+
}
|
|
1976
|
+
//#endregion
|
|
1977
|
+
|
|
1920
1978
|
//#region ---- Imports ----
|
|
1921
1979
|
//#endregion
|
|
1922
1980
|
//#region ---- Component ----
|
|
1923
|
-
|
|
1981
|
+
/**
|
|
1982
|
+
* Assist suggestion chips (starter prompts and engine {@code followUp} segments).
|
|
1983
|
+
* Each item runs its platform command via {@link AXPCommandService}.
|
|
1984
|
+
*/
|
|
1985
|
+
class AXMAssistSuggestionChipsComponent {
|
|
1924
1986
|
constructor() {
|
|
1925
|
-
this.
|
|
1926
|
-
this.
|
|
1987
|
+
this.items = input([], ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
|
|
1988
|
+
this.normalizedItems = computed(() => axmAssistNormalizeFollowUpItemsForConversation(this.items()), ...(ngDevMode ? [{ debugName: "normalizedItems" }] : /* istanbul ignore next */ []));
|
|
1989
|
+
this.commandService = inject(AXPCommandService);
|
|
1990
|
+
this.translationService = inject(AXTranslationService);
|
|
1991
|
+
}
|
|
1992
|
+
async onChipClick(item) {
|
|
1993
|
+
const rawName = item.command.name.trim();
|
|
1994
|
+
if (!rawName) {
|
|
1995
|
+
return;
|
|
1996
|
+
}
|
|
1997
|
+
const name = axmAssistResolveFollowUpCommandName(rawName, (key) => this.commandService.exists(key));
|
|
1998
|
+
if (!this.commandService.exists(name)) {
|
|
1999
|
+
console.warn('[AXMAssistSuggestionChips] Command is not registered:', rawName);
|
|
2000
|
+
return;
|
|
2001
|
+
}
|
|
2002
|
+
const text = this.resolveItemText(item);
|
|
2003
|
+
await this.commandService.execute(name, {
|
|
2004
|
+
...(item.command.options ?? {}),
|
|
2005
|
+
...(text ? { text } : {}),
|
|
2006
|
+
});
|
|
1927
2007
|
}
|
|
1928
|
-
|
|
1929
|
-
const
|
|
1930
|
-
if (
|
|
1931
|
-
|
|
2008
|
+
resolveItemText(item) {
|
|
2009
|
+
const label = item.text;
|
|
2010
|
+
if (typeof label === 'string') {
|
|
2011
|
+
return label.trim();
|
|
1932
2012
|
}
|
|
2013
|
+
return (this.translationService.resolve(label) ?? '').trim();
|
|
1933
2014
|
}
|
|
1934
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type:
|
|
1935
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type:
|
|
1936
|
-
@if (
|
|
2015
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMAssistSuggestionChipsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2016
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMAssistSuggestionChipsComponent, isStandalone: true, selector: "axm-assist-suggestion-chips", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
2017
|
+
@if (normalizedItems().length > 0) {
|
|
1937
2018
|
<div
|
|
1938
|
-
class="
|
|
2019
|
+
class="ax-flex ax-gap-3 ax-justify-center ax-p-8 ax-flex-wrap"
|
|
1939
2020
|
role="list"
|
|
1940
2021
|
[attr.aria-label]="('@conversation:chat.starter-prompts.list-aria' | translate | async) ?? ''"
|
|
1941
2022
|
>
|
|
1942
|
-
@for (
|
|
2023
|
+
@for (item of normalizedItems(); track $index) {
|
|
1943
2024
|
<ax-button
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
(onClick)="onPromptClick(prompt)"
|
|
2025
|
+
class="ax-rounded-full"
|
|
2026
|
+
[look]="'twotone'"
|
|
2027
|
+
[text]="(item.text | translate | async)!"
|
|
2028
|
+
(onClick)="onChipClick(item)"
|
|
1949
2029
|
></ax-button>
|
|
1950
2030
|
}
|
|
1951
2031
|
</div>
|
|
1952
2032
|
}
|
|
1953
|
-
`, isInline: true,
|
|
2033
|
+
`, 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: i3.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1954
2034
|
}
|
|
1955
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type:
|
|
2035
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMAssistSuggestionChipsComponent, decorators: [{
|
|
1956
2036
|
type: Component,
|
|
1957
|
-
args: [{
|
|
1958
|
-
|
|
2037
|
+
args: [{
|
|
2038
|
+
selector: 'axm-assist-suggestion-chips',
|
|
2039
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
2040
|
+
imports: [AsyncPipe, AXButtonModule, AXTranslationModule],
|
|
2041
|
+
template: `
|
|
2042
|
+
@if (normalizedItems().length > 0) {
|
|
1959
2043
|
<div
|
|
1960
|
-
class="
|
|
2044
|
+
class="ax-flex ax-gap-3 ax-justify-center ax-p-8 ax-flex-wrap"
|
|
1961
2045
|
role="list"
|
|
1962
2046
|
[attr.aria-label]="('@conversation:chat.starter-prompts.list-aria' | translate | async) ?? ''"
|
|
1963
2047
|
>
|
|
1964
|
-
@for (
|
|
2048
|
+
@for (item of normalizedItems(); track $index) {
|
|
1965
2049
|
<ax-button
|
|
1966
|
-
|
|
1967
|
-
|
|
1968
|
-
|
|
1969
|
-
|
|
1970
|
-
(onClick)="onPromptClick(prompt)"
|
|
2050
|
+
class="ax-rounded-full"
|
|
2051
|
+
[look]="'twotone'"
|
|
2052
|
+
[text]="(item.text | translate | async)!"
|
|
2053
|
+
(onClick)="onChipClick(item)"
|
|
1971
2054
|
></ax-button>
|
|
1972
2055
|
}
|
|
1973
2056
|
</div>
|
|
1974
2057
|
}
|
|
1975
|
-
`,
|
|
1976
|
-
|
|
2058
|
+
`,
|
|
2059
|
+
}]
|
|
2060
|
+
}], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }] } });
|
|
2061
|
+
|
|
2062
|
+
//#region ---- Imports ----
|
|
2063
|
+
//#endregion
|
|
2064
|
+
//#region ---- Component ----
|
|
2065
|
+
/**
|
|
2066
|
+
* Mirrors conversation2 default empty state when assist welcome content is not configured.
|
|
2067
|
+
*/
|
|
2068
|
+
class AXMChatMessageListEmptyFallbackComponent {
|
|
2069
|
+
constructor() {
|
|
2070
|
+
//#region ---- Inputs ----
|
|
2071
|
+
this.conversation = input.required(...(ngDevMode ? [{ debugName: "conversation" }] : /* istanbul ignore next */ []));
|
|
2072
|
+
//#endregion
|
|
2073
|
+
//#region ---- Services & Dependencies ----
|
|
2074
|
+
this.translationService = inject(AXTranslationService);
|
|
2075
|
+
//#endregion
|
|
2076
|
+
//#region ---- Computed Properties ----
|
|
2077
|
+
this.iconClass = computed(() => iconClassForType(this.conversation().type), ...(ngDevMode ? [{ debugName: "iconClass" }] : /* istanbul ignore next */ []));
|
|
2078
|
+
this.eyebrowLabel = computed(() => eyebrowForType(this.conversation().type, this.translationService), ...(ngDevMode ? [{ debugName: "eyebrowLabel" }] : /* istanbul ignore next */ []));
|
|
2079
|
+
this.descriptionPrefix = computed(() => descriptionPrefixForType(this.conversation().type, this.translationService), ...(ngDevMode ? [{ debugName: "descriptionPrefix" }] : /* istanbul ignore next */ []));
|
|
2080
|
+
}
|
|
2081
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatMessageListEmptyFallbackComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2082
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.9", type: AXMChatMessageListEmptyFallbackComponent, isStandalone: true, selector: "axm-chat-message-list-empty-fallback", inputs: { conversation: { classPropertyName: "conversation", publicName: "conversation", isSignal: true, isRequired: true, transformFunction: null } }, host: { classAttribute: "ax-message-empty-host" }, ngImport: i0, template: `
|
|
2083
|
+
<div class="ax-message-empty" role="status" [attr.aria-label]="('@acorex:chat.status.no-messages' | translate | async) ?? ''">
|
|
2084
|
+
<div class="ax-message-empty__ambient" aria-hidden="true">
|
|
2085
|
+
<span class="ax-message-empty__grid"></span>
|
|
2086
|
+
</div>
|
|
2087
|
+
|
|
2088
|
+
<div class="ax-message-empty__card">
|
|
2089
|
+
<div class="ax-message-empty__icon-stack">
|
|
2090
|
+
<span class="ax-message-empty__pulse" aria-hidden="true"></span>
|
|
2091
|
+
<div class="ax-message-empty__icon-bg">
|
|
2092
|
+
<i [class]="iconClass()" aria-hidden="true"></i>
|
|
2093
|
+
</div>
|
|
2094
|
+
</div>
|
|
2095
|
+
|
|
2096
|
+
<p class="ax-message-empty__eyebrow">{{ eyebrowLabel() }}</p>
|
|
2097
|
+
<h3 class="ax-message-empty__title">{{ ('@acorex:chat.empty.no-messages-yet' | translate | async) ?? '' }}</h3>
|
|
2098
|
+
<p class="ax-message-empty__desc">
|
|
2099
|
+
{{ descriptionPrefix() }}
|
|
2100
|
+
<span class="ax-message-empty__name">{{ conversation().title }}</span>.
|
|
2101
|
+
</p>
|
|
2102
|
+
</div>
|
|
2103
|
+
</div>
|
|
2104
|
+
`, 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: i3.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
2105
|
+
}
|
|
2106
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatMessageListEmptyFallbackComponent, decorators: [{
|
|
2107
|
+
type: Component,
|
|
2108
|
+
args: [{ selector: 'axm-chat-message-list-empty-fallback', changeDetection: ChangeDetectionStrategy.OnPush, imports: [AsyncPipe, AXTranslationModule], host: {
|
|
2109
|
+
class: 'ax-message-empty-host',
|
|
2110
|
+
}, template: `
|
|
2111
|
+
<div class="ax-message-empty" role="status" [attr.aria-label]="('@acorex:chat.status.no-messages' | translate | async) ?? ''">
|
|
2112
|
+
<div class="ax-message-empty__ambient" aria-hidden="true">
|
|
2113
|
+
<span class="ax-message-empty__grid"></span>
|
|
2114
|
+
</div>
|
|
2115
|
+
|
|
2116
|
+
<div class="ax-message-empty__card">
|
|
2117
|
+
<div class="ax-message-empty__icon-stack">
|
|
2118
|
+
<span class="ax-message-empty__pulse" aria-hidden="true"></span>
|
|
2119
|
+
<div class="ax-message-empty__icon-bg">
|
|
2120
|
+
<i [class]="iconClass()" aria-hidden="true"></i>
|
|
2121
|
+
</div>
|
|
2122
|
+
</div>
|
|
2123
|
+
|
|
2124
|
+
<p class="ax-message-empty__eyebrow">{{ eyebrowLabel() }}</p>
|
|
2125
|
+
<h3 class="ax-message-empty__title">{{ ('@acorex:chat.empty.no-messages-yet' | translate | async) ?? '' }}</h3>
|
|
2126
|
+
<p class="ax-message-empty__desc">
|
|
2127
|
+
{{ descriptionPrefix() }}
|
|
2128
|
+
<span class="ax-message-empty__name">{{ conversation().title }}</span>.
|
|
2129
|
+
</p>
|
|
2130
|
+
</div>
|
|
2131
|
+
</div>
|
|
2132
|
+
`, 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"] }]
|
|
2133
|
+
}], propDecorators: { conversation: [{ type: i0.Input, args: [{ isSignal: true, alias: "conversation", required: true }] }] } });
|
|
2134
|
+
//#endregion
|
|
2135
|
+
//#region ---- Helpers ----
|
|
2136
|
+
function iconClassForType(type) {
|
|
2137
|
+
switch (type) {
|
|
2138
|
+
case 'private':
|
|
2139
|
+
return 'fa-light fa-comment-dots';
|
|
2140
|
+
case 'group':
|
|
2141
|
+
return 'fa-light fa-users';
|
|
2142
|
+
case 'channel':
|
|
2143
|
+
return 'fa-light fa-hashtag';
|
|
2144
|
+
case 'bot':
|
|
2145
|
+
return 'fa-light fa-robot';
|
|
2146
|
+
default:
|
|
2147
|
+
return 'fa-light fa-comments';
|
|
2148
|
+
}
|
|
2149
|
+
}
|
|
2150
|
+
function eyebrowForType(type, translation) {
|
|
2151
|
+
switch (type) {
|
|
2152
|
+
case 'private':
|
|
2153
|
+
return translation.translateSync('@acorex:chat.empty.eyebrow.direct-message');
|
|
2154
|
+
case 'group':
|
|
2155
|
+
return translation.translateSync('@acorex:chat.empty.eyebrow.group-chat');
|
|
2156
|
+
case 'channel':
|
|
2157
|
+
return translation.translateSync('@acorex:chat.empty.eyebrow.channel');
|
|
2158
|
+
case 'bot':
|
|
2159
|
+
return translation.translateSync('@acorex:chat.empty.eyebrow.assistant');
|
|
2160
|
+
default:
|
|
2161
|
+
return translation.translateSync('@acorex:chat.empty.eyebrow.conversation');
|
|
2162
|
+
}
|
|
2163
|
+
}
|
|
2164
|
+
function descriptionPrefixForType(type, translation) {
|
|
2165
|
+
switch (type) {
|
|
2166
|
+
case 'private':
|
|
2167
|
+
return translation.translateSync('@acorex:chat.empty.description.private-prefix');
|
|
2168
|
+
case 'group':
|
|
2169
|
+
return translation.translateSync('@acorex:chat.empty.description.group-prefix');
|
|
2170
|
+
case 'channel':
|
|
2171
|
+
return translation.translateSync('@acorex:chat.empty.description.channel-prefix');
|
|
2172
|
+
case 'bot':
|
|
2173
|
+
return translation.translateSync('@acorex:chat.empty.description.bot-prefix');
|
|
2174
|
+
default:
|
|
2175
|
+
return translation.translateSync('@acorex:chat.empty.description.conversation-prefix');
|
|
2176
|
+
}
|
|
2177
|
+
}
|
|
1977
2178
|
|
|
1978
2179
|
class AXMChatUserApi extends AXUserApi {
|
|
1979
2180
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatUserApi, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
@@ -2029,6 +2230,12 @@ async function conversationHasUserMessage(messageApi, currentUserId, conversatio
|
|
|
2029
2230
|
const result = await messageApi.getMessages(conversationId, pagination);
|
|
2030
2231
|
return result.items.some((message) => !isStreamingPlaceholder(message) && message.senderId === currentUserId);
|
|
2031
2232
|
}
|
|
2233
|
+
function initialMessageMarkdown(raw) {
|
|
2234
|
+
return axpAiAssistInitialMessagesToTranscript(raw)
|
|
2235
|
+
.map((line) => axpAiChatMessageGetText(line).trim())
|
|
2236
|
+
.filter((text) => text.length > 0)
|
|
2237
|
+
.join('\n\n');
|
|
2238
|
+
}
|
|
2032
2239
|
//#endregion
|
|
2033
2240
|
//#region ---- Component ----
|
|
2034
2241
|
class AXMChatAssistComposerStarterPromptsComponent {
|
|
@@ -2041,22 +2248,28 @@ class AXMChatAssistComposerStarterPromptsComponent {
|
|
|
2041
2248
|
this.userApi = inject(AXMChatUserApi);
|
|
2042
2249
|
this.entityService = inject(AXPEntityService);
|
|
2043
2250
|
this.translationService = inject(AXTranslationService);
|
|
2044
|
-
this.toastService = inject(AXToastService);
|
|
2045
2251
|
this.assistData = this.entityService
|
|
2046
2252
|
.withEntity(RootConfig$1.module.name, RootConfig$1.entities.assist.name)
|
|
2047
2253
|
.data();
|
|
2048
2254
|
//#endregion
|
|
2049
2255
|
//#region ---- State ----
|
|
2050
|
-
this.
|
|
2051
|
-
this.
|
|
2052
|
-
this.
|
|
2256
|
+
this.starterPromptItems = signal([], ...(ngDevMode ? [{ debugName: "starterPromptItems" }] : /* istanbul ignore next */ []));
|
|
2257
|
+
this.initialMessageMarkdown = signal('', ...(ngDevMode ? [{ debugName: "initialMessageMarkdown" }] : /* istanbul ignore next */ []));
|
|
2258
|
+
this.showWelcome = signal(false, ...(ngDevMode ? [{ debugName: "showWelcome" }] : /* istanbul ignore next */ []));
|
|
2259
|
+
this.activeConversation = computed(() => {
|
|
2260
|
+
const id = this.conversationService.activeConversationId();
|
|
2261
|
+
if (!id) {
|
|
2262
|
+
return null;
|
|
2263
|
+
}
|
|
2264
|
+
return conversationSharedStorage.conversations.get(id) ?? null;
|
|
2265
|
+
}, ...(ngDevMode ? [{ debugName: "activeConversation" }] : /* istanbul ignore next */ []));
|
|
2053
2266
|
this.loadGeneration = 0;
|
|
2054
2267
|
effect(() => {
|
|
2055
|
-
const conversationId = this.activeConversationId();
|
|
2268
|
+
const conversationId = this.conversationService.activeConversationId();
|
|
2056
2269
|
void this.syncForConversation(conversationId);
|
|
2057
2270
|
});
|
|
2058
2271
|
effect((onCleanup) => {
|
|
2059
|
-
const conversationId = untracked(() => this.activeConversationId());
|
|
2272
|
+
const conversationId = untracked(() => this.conversationService.activeConversationId());
|
|
2060
2273
|
if (!conversationId) {
|
|
2061
2274
|
return;
|
|
2062
2275
|
}
|
|
@@ -2070,46 +2283,33 @@ class AXMChatAssistComposerStarterPromptsComponent {
|
|
|
2070
2283
|
});
|
|
2071
2284
|
}
|
|
2072
2285
|
//#endregion
|
|
2073
|
-
//#region ---- UI Handlers ----
|
|
2074
|
-
async onPromptSelected(text) {
|
|
2075
|
-
const conversationId = this.activeConversationId();
|
|
2076
|
-
if (!conversationId || !text.trim()) {
|
|
2077
|
-
return;
|
|
2078
|
-
}
|
|
2079
|
-
try {
|
|
2080
|
-
const payload = { type: 'text', text: text.trim() };
|
|
2081
|
-
await this.conversationService.sendMessage({
|
|
2082
|
-
conversationId,
|
|
2083
|
-
type: 'text',
|
|
2084
|
-
payload,
|
|
2085
|
-
});
|
|
2086
|
-
this.visible.set(false);
|
|
2087
|
-
}
|
|
2088
|
-
catch (error) {
|
|
2089
|
-
console.error('Failed to send starter prompt:', error);
|
|
2090
|
-
const message = await this.translationService.translateAsync('@conversation:chat.starter-prompts.errors.send');
|
|
2091
|
-
this.toastService.danger(message);
|
|
2092
|
-
}
|
|
2093
|
-
}
|
|
2094
|
-
//#endregion
|
|
2095
2286
|
//#region ---- Sync ----
|
|
2096
2287
|
async syncForConversation(conversationId) {
|
|
2097
2288
|
const generation = ++this.loadGeneration;
|
|
2098
2289
|
if (!conversationId) {
|
|
2099
|
-
this.
|
|
2100
|
-
this.
|
|
2290
|
+
this.starterPromptItems.set([]);
|
|
2291
|
+
this.initialMessageMarkdown.set('');
|
|
2292
|
+
this.showWelcome.set(false);
|
|
2101
2293
|
return;
|
|
2102
2294
|
}
|
|
2103
2295
|
const conversation = conversationSharedStorage.conversations.get(conversationId);
|
|
2104
|
-
if (!conversation
|
|
2105
|
-
this.
|
|
2106
|
-
this.
|
|
2296
|
+
if (!conversation) {
|
|
2297
|
+
this.starterPromptItems.set([]);
|
|
2298
|
+
this.initialMessageMarkdown.set('');
|
|
2299
|
+
this.showWelcome.set(false);
|
|
2300
|
+
return;
|
|
2301
|
+
}
|
|
2302
|
+
if (!axmConversationHasAiChat(conversation)) {
|
|
2303
|
+
this.starterPromptItems.set([]);
|
|
2304
|
+
this.initialMessageMarkdown.set('');
|
|
2305
|
+
this.showWelcome.set(false);
|
|
2107
2306
|
return;
|
|
2108
2307
|
}
|
|
2109
2308
|
const assistId = extractAssistId(conversation);
|
|
2110
2309
|
if (!assistId) {
|
|
2111
|
-
this.
|
|
2112
|
-
this.
|
|
2310
|
+
this.starterPromptItems.set([]);
|
|
2311
|
+
this.initialMessageMarkdown.set('');
|
|
2312
|
+
this.showWelcome.set(false);
|
|
2113
2313
|
return;
|
|
2114
2314
|
}
|
|
2115
2315
|
try {
|
|
@@ -2119,50 +2319,72 @@ class AXMChatAssistComposerStarterPromptsComponent {
|
|
|
2119
2319
|
return;
|
|
2120
2320
|
}
|
|
2121
2321
|
if (hasUserMessage) {
|
|
2122
|
-
this.
|
|
2123
|
-
this.
|
|
2322
|
+
this.starterPromptItems.set([]);
|
|
2323
|
+
this.initialMessageMarkdown.set('');
|
|
2324
|
+
this.showWelcome.set(false);
|
|
2124
2325
|
return;
|
|
2125
2326
|
}
|
|
2126
2327
|
const assist = await this.assistData.byKey(assistId);
|
|
2127
2328
|
if (generation !== this.loadGeneration) {
|
|
2128
2329
|
return;
|
|
2129
2330
|
}
|
|
2130
|
-
const
|
|
2131
|
-
|
|
2132
|
-
|
|
2331
|
+
const items = axmAssistStarterPromptChipItems(assist, {
|
|
2332
|
+
conversationId: conversationId ?? undefined,
|
|
2333
|
+
});
|
|
2334
|
+
const welcomeMarkdown = initialMessageMarkdown(assist?.initialMessages);
|
|
2335
|
+
this.starterPromptItems.set(items);
|
|
2336
|
+
this.initialMessageMarkdown.set(welcomeMarkdown);
|
|
2337
|
+
this.showWelcome.set(welcomeMarkdown.length > 0 || items.length > 0);
|
|
2133
2338
|
}
|
|
2134
2339
|
catch (error) {
|
|
2135
|
-
console.error('Failed to load assist
|
|
2340
|
+
console.error('Failed to load assist welcome interaction:', error);
|
|
2136
2341
|
if (generation === this.loadGeneration) {
|
|
2137
|
-
this.
|
|
2138
|
-
this.
|
|
2342
|
+
this.starterPromptItems.set([]);
|
|
2343
|
+
this.initialMessageMarkdown.set('');
|
|
2344
|
+
this.showWelcome.set(false);
|
|
2139
2345
|
}
|
|
2140
2346
|
}
|
|
2141
2347
|
}
|
|
2142
2348
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatAssistComposerStarterPromptsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2143
2349
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMChatAssistComposerStarterPromptsComponent, isStandalone: true, selector: "axm-chat-assist-composer-starter-prompts", ngImport: i0, template: `
|
|
2144
|
-
@if (
|
|
2145
|
-
<div class="axm-chat-assist-
|
|
2146
|
-
|
|
2147
|
-
|
|
2148
|
-
|
|
2149
|
-
|
|
2350
|
+
@if (showWelcome()) {
|
|
2351
|
+
<div class="axm-chat-assist-welcome-empty">
|
|
2352
|
+
@if (initialMessageMarkdown().length > 0) {
|
|
2353
|
+
<div class="axm-chat-assist-welcome-empty__message">
|
|
2354
|
+
<axp-markdown-viewer [markdown]="initialMessageMarkdown()" />
|
|
2355
|
+
</div>
|
|
2356
|
+
}
|
|
2357
|
+
@if (starterPromptItems().length > 0) {
|
|
2358
|
+
<axm-assist-suggestion-chips [items]="starterPromptItems()" />
|
|
2359
|
+
}
|
|
2150
2360
|
</div>
|
|
2361
|
+
} @else if (activeConversation(); as conversation) {
|
|
2362
|
+
<axm-chat-message-list-empty-fallback [conversation]="conversation" />
|
|
2151
2363
|
}
|
|
2152
|
-
`, isInline: true, styles: [".axm-chat-assist-
|
|
2364
|
+
`, isInline: true, styles: [".axm-chat-assist-welcome-empty{width:min(100%,48rem);margin-inline:auto;display:flex;flex-direction:column;align-items:stretch;gap:.5rem;padding:.5rem 0 1rem}.axm-chat-assist-welcome-empty__message{padding:1rem 1.25rem;border-radius:1rem;border:1px solid rgba(var(--ax-sys-color-border-light-surface),.85);background:rgba(var(--ax-sys-color-lightest-surface),.72);text-align:start;line-height:1.6}\n"], dependencies: [{ kind: "component", type: AXMAssistSuggestionChipsComponent, selector: "axm-assist-suggestion-chips", inputs: ["items"] }, { kind: "component", type: AXMChatMessageListEmptyFallbackComponent, selector: "axm-chat-message-list-empty-fallback", inputs: ["conversation"] }, { kind: "component", type: AXPMarkdownViewerComponent, selector: "axp-markdown-viewer", inputs: ["markdown"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
2153
2365
|
}
|
|
2154
2366
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatAssistComposerStarterPromptsComponent, decorators: [{
|
|
2155
2367
|
type: Component,
|
|
2156
|
-
args: [{ selector: 'axm-chat-assist-composer-starter-prompts', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
2157
|
-
|
|
2158
|
-
|
|
2159
|
-
|
|
2160
|
-
|
|
2161
|
-
|
|
2162
|
-
|
|
2368
|
+
args: [{ selector: 'axm-chat-assist-composer-starter-prompts', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
2369
|
+
AXMAssistSuggestionChipsComponent,
|
|
2370
|
+
AXMChatMessageListEmptyFallbackComponent,
|
|
2371
|
+
AXPMarkdownViewerComponent,
|
|
2372
|
+
], template: `
|
|
2373
|
+
@if (showWelcome()) {
|
|
2374
|
+
<div class="axm-chat-assist-welcome-empty">
|
|
2375
|
+
@if (initialMessageMarkdown().length > 0) {
|
|
2376
|
+
<div class="axm-chat-assist-welcome-empty__message">
|
|
2377
|
+
<axp-markdown-viewer [markdown]="initialMessageMarkdown()" />
|
|
2378
|
+
</div>
|
|
2379
|
+
}
|
|
2380
|
+
@if (starterPromptItems().length > 0) {
|
|
2381
|
+
<axm-assist-suggestion-chips [items]="starterPromptItems()" />
|
|
2382
|
+
}
|
|
2163
2383
|
</div>
|
|
2384
|
+
} @else if (activeConversation(); as conversation) {
|
|
2385
|
+
<axm-chat-message-list-empty-fallback [conversation]="conversation" />
|
|
2164
2386
|
}
|
|
2165
|
-
`, styles: [".axm-chat-assist-
|
|
2387
|
+
`, styles: [".axm-chat-assist-welcome-empty{width:min(100%,48rem);margin-inline:auto;display:flex;flex-direction:column;align-items:stretch;gap:.5rem;padding:.5rem 0 1rem}.axm-chat-assist-welcome-empty__message{padding:1rem 1.25rem;border-radius:1rem;border:1px solid rgba(var(--ax-sys-color-border-light-surface),.85);background:rgba(var(--ax-sys-color-lightest-surface),.72);text-align:start;line-height:1.6}\n"] }]
|
|
2166
2388
|
}], ctorParameters: () => [] });
|
|
2167
2389
|
|
|
2168
2390
|
class AXMChatEmptyAssistComposerComponent {
|
|
@@ -2172,6 +2394,7 @@ class AXMChatEmptyAssistComposerComponent {
|
|
|
2172
2394
|
this.translationService = inject(AXTranslationService);
|
|
2173
2395
|
this.entityRegistry = inject(AXPEntityDefinitionRegistryService);
|
|
2174
2396
|
this.entityService = inject(AXPEntityService);
|
|
2397
|
+
this.aiManager = inject(AXPAiManagerService, { optional: true });
|
|
2175
2398
|
this.assistData = this.entityService
|
|
2176
2399
|
.withEntity(RootConfig$1.module.name, RootConfig$1.entities.assist.name)
|
|
2177
2400
|
.data();
|
|
@@ -2179,30 +2402,17 @@ class AXMChatEmptyAssistComposerComponent {
|
|
|
2179
2402
|
this.rows = signal([], ...(ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []));
|
|
2180
2403
|
this.loading = signal(true, ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
|
|
2181
2404
|
this.selectedAssistId = signal(undefined, ...(ngDevMode ? [{ debugName: "selectedAssistId" }] : /* istanbul ignore next */ []));
|
|
2182
|
-
this.
|
|
2405
|
+
this.starterPromptItems = signal([], ...(ngDevMode ? [{ debugName: "starterPromptItems" }] : /* istanbul ignore next */ []));
|
|
2183
2406
|
this.draftText = signal('', ...(ngDevMode ? [{ debugName: "draftText" }] : /* istanbul ignore next */ []));
|
|
2184
2407
|
this.sending = signal(false, ...(ngDevMode ? [{ debugName: "sending" }] : /* istanbul ignore next */ []));
|
|
2185
2408
|
this.draftInput = viewChild('draftInput', ...(ngDevMode ? [{ debugName: "draftInput" }] : /* istanbul ignore next */ []));
|
|
2186
2409
|
this.selectedAssistLabel = computed(() => {
|
|
2187
2410
|
const selected = this.rows().find((row) => row.id === this.selectedAssistId());
|
|
2188
|
-
|
|
2189
|
-
return '';
|
|
2190
|
-
}
|
|
2191
|
-
if (typeof selected.title === 'string') {
|
|
2192
|
-
return selected.title;
|
|
2193
|
-
}
|
|
2194
|
-
return this.translationService.resolve(selected.title) ?? selected.name;
|
|
2411
|
+
return selected?.title;
|
|
2195
2412
|
}, ...(ngDevMode ? [{ debugName: "selectedAssistLabel" }] : /* istanbul ignore next */ []));
|
|
2196
2413
|
this.assistsLoadPromise = null;
|
|
2197
2414
|
this.starterPromptsLoadGeneration = 0;
|
|
2198
2415
|
void this.ensureAssistsLoaded();
|
|
2199
|
-
effect(() => {
|
|
2200
|
-
const rows = this.rows();
|
|
2201
|
-
const current = untracked(() => this.selectedAssistId());
|
|
2202
|
-
if (rows.length && !current) {
|
|
2203
|
-
this.selectedAssistId.set(rows[0].id);
|
|
2204
|
-
}
|
|
2205
|
-
});
|
|
2206
2416
|
effect(() => {
|
|
2207
2417
|
const assistId = this.selectedAssistId();
|
|
2208
2418
|
void this.loadStarterPromptsForAssist(assistId);
|
|
@@ -2215,10 +2425,6 @@ class AXMChatEmptyAssistComposerComponent {
|
|
|
2215
2425
|
onAssistIdChange(value) {
|
|
2216
2426
|
this.selectedAssistId.set(value?.trim() || undefined);
|
|
2217
2427
|
}
|
|
2218
|
-
onStarterPromptSelected(text) {
|
|
2219
|
-
this.draftText.set(text);
|
|
2220
|
-
queueMicrotask(() => this.resizeDraftInput());
|
|
2221
|
-
}
|
|
2222
2428
|
canSend() {
|
|
2223
2429
|
const id = this.selectedAssistId();
|
|
2224
2430
|
const text = this.draftText().trim();
|
|
@@ -2289,18 +2495,45 @@ class AXMChatEmptyAssistComposerComponent {
|
|
|
2289
2495
|
async loadAssistsFromApi() {
|
|
2290
2496
|
this.loading.set(true);
|
|
2291
2497
|
try {
|
|
2292
|
-
|
|
2498
|
+
const rows = await axmLoadChatAiTargets(this.entityRegistry);
|
|
2499
|
+
this.rows.set(rows);
|
|
2500
|
+
this.selectedAssistId.set(await this.resolveInitialAssistId(rows));
|
|
2293
2501
|
}
|
|
2294
2502
|
catch (error) {
|
|
2295
2503
|
console.error('Failed to load AI chat targets (empty composer):', error);
|
|
2296
2504
|
const message = await this.translationService.translateAsync('@conversation:chat.empty-assist.errors.load-assists');
|
|
2297
2505
|
this.toastService.danger(message);
|
|
2298
2506
|
this.rows.set([]);
|
|
2507
|
+
this.selectedAssistId.set(undefined);
|
|
2299
2508
|
}
|
|
2300
2509
|
finally {
|
|
2301
2510
|
this.loading.set(false);
|
|
2302
2511
|
}
|
|
2303
2512
|
}
|
|
2513
|
+
/** Prefers the tenant default assist from AI Settings, then the first catalog row. */
|
|
2514
|
+
async resolveInitialAssistId(rows) {
|
|
2515
|
+
if (!rows.length) {
|
|
2516
|
+
return undefined;
|
|
2517
|
+
}
|
|
2518
|
+
const defaultAssistId = await this.resolveDefaultAssistId();
|
|
2519
|
+
if (defaultAssistId && rows.some((row) => row.id === defaultAssistId)) {
|
|
2520
|
+
return defaultAssistId;
|
|
2521
|
+
}
|
|
2522
|
+
return rows[0]?.id;
|
|
2523
|
+
}
|
|
2524
|
+
async resolveDefaultAssistId() {
|
|
2525
|
+
if (!this.aiManager) {
|
|
2526
|
+
return undefined;
|
|
2527
|
+
}
|
|
2528
|
+
try {
|
|
2529
|
+
const assist = await this.aiManager.getEffectiveAssist();
|
|
2530
|
+
return assist.id?.trim() || undefined;
|
|
2531
|
+
}
|
|
2532
|
+
catch (error) {
|
|
2533
|
+
console.warn('Failed to resolve default assist for empty chat composer:', error);
|
|
2534
|
+
return undefined;
|
|
2535
|
+
}
|
|
2536
|
+
}
|
|
2304
2537
|
targetAvatarUrl(row) {
|
|
2305
2538
|
const avatarUrl = row.professionImageUrl?.trim();
|
|
2306
2539
|
return avatarUrl ? avatarUrl : null;
|
|
@@ -2309,7 +2542,7 @@ class AXMChatEmptyAssistComposerComponent {
|
|
|
2309
2542
|
const generation = ++this.starterPromptsLoadGeneration;
|
|
2310
2543
|
const id = assistId?.trim();
|
|
2311
2544
|
if (!id) {
|
|
2312
|
-
this.
|
|
2545
|
+
this.starterPromptItems.set([]);
|
|
2313
2546
|
return;
|
|
2314
2547
|
}
|
|
2315
2548
|
try {
|
|
@@ -2317,12 +2550,12 @@ class AXMChatEmptyAssistComposerComponent {
|
|
|
2317
2550
|
if (generation !== this.starterPromptsLoadGeneration) {
|
|
2318
2551
|
return;
|
|
2319
2552
|
}
|
|
2320
|
-
this.
|
|
2553
|
+
this.starterPromptItems.set(axmAssistStarterPromptChipItems(assist, { assistId: id }));
|
|
2321
2554
|
}
|
|
2322
2555
|
catch (error) {
|
|
2323
2556
|
console.error('Failed to load assist starter prompts (empty composer):', error);
|
|
2324
2557
|
if (generation === this.starterPromptsLoadGeneration) {
|
|
2325
|
-
this.
|
|
2558
|
+
this.starterPromptItems.set([]);
|
|
2326
2559
|
}
|
|
2327
2560
|
}
|
|
2328
2561
|
}
|
|
@@ -2332,17 +2565,16 @@ class AXMChatEmptyAssistComposerComponent {
|
|
|
2332
2565
|
<div class="axm-chat-empty-assist-composer__caption">
|
|
2333
2566
|
{{ '@conversation:chat.empty-assist.caption' | translate | async }}
|
|
2334
2567
|
</div>
|
|
2335
|
-
|
|
2336
|
-
[prompts]="starterPrompts()"
|
|
2337
|
-
(promptSelected)="onStarterPromptSelected($event)"
|
|
2338
|
-
/>
|
|
2568
|
+
|
|
2339
2569
|
<div class="axm-chat-empty-assist-composer__composer-row">
|
|
2340
2570
|
<ax-button color="default" look="blank" class="ax-rounded-full">
|
|
2341
2571
|
<ax-icon icon="fa-regular fa-sparkles"></ax-icon>
|
|
2342
2572
|
<span class="axm-chat-empty-assist-composer__assist-text">
|
|
2343
|
-
{
|
|
2344
|
-
|
|
2345
|
-
}
|
|
2573
|
+
@if (selectedAssistLabel(); as assistLabel) {
|
|
2574
|
+
{{ assistLabel | translate | async }}
|
|
2575
|
+
} @else {
|
|
2576
|
+
{{ '@conversation:chat.empty-assist.assist-default' | translate | async }}
|
|
2577
|
+
}
|
|
2346
2578
|
</span>
|
|
2347
2579
|
<ax-dropdown-panel>
|
|
2348
2580
|
<ax-button-item-list>
|
|
@@ -2357,6 +2589,8 @@ class AXMChatEmptyAssistComposerComponent {
|
|
|
2357
2589
|
</ax-dropdown-panel>
|
|
2358
2590
|
</ax-button>
|
|
2359
2591
|
|
|
2592
|
+
@let assistTitle = (selectedAssistLabel() | translate | async) ?? '';
|
|
2593
|
+
|
|
2360
2594
|
<textarea
|
|
2361
2595
|
#draftInput
|
|
2362
2596
|
rows="1"
|
|
@@ -2365,7 +2599,11 @@ class AXMChatEmptyAssistComposerComponent {
|
|
|
2365
2599
|
(ngModelChange)="draftText.set($event ?? '')"
|
|
2366
2600
|
(input)="resizeDraftInput()"
|
|
2367
2601
|
(keydown)="onDraftKeydown($event)"
|
|
2368
|
-
[placeholder]="
|
|
2602
|
+
[placeholder]="
|
|
2603
|
+
('@conversation:chat.empty-assist.placeholder'
|
|
2604
|
+
| translate: { params: { assist: assistTitle } }
|
|
2605
|
+
| async) ?? ''
|
|
2606
|
+
"
|
|
2369
2607
|
></textarea>
|
|
2370
2608
|
<ax-button
|
|
2371
2609
|
color="default"
|
|
@@ -2380,8 +2618,9 @@ class AXMChatEmptyAssistComposerComponent {
|
|
|
2380
2618
|
}
|
|
2381
2619
|
</ax-button>
|
|
2382
2620
|
</div>
|
|
2621
|
+
<axm-assist-suggestion-chips [items]="starterPromptItems()" />
|
|
2383
2622
|
</div>
|
|
2384
|
-
`, isInline: true, styles: [".axm-chat-empty-assist-composer{width:min(100%,
|
|
2623
|
+
`, 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$1.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$1.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: i3.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
2385
2624
|
}
|
|
2386
2625
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatEmptyAssistComposerComponent, decorators: [{
|
|
2387
2626
|
type: Component,
|
|
@@ -2393,23 +2632,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
2393
2632
|
AXTextBoxModule,
|
|
2394
2633
|
AXDecoratorModule,
|
|
2395
2634
|
AXTranslationModule,
|
|
2396
|
-
|
|
2635
|
+
AXMAssistSuggestionChipsComponent,
|
|
2397
2636
|
], template: `
|
|
2398
2637
|
<div class="axm-chat-empty-assist-composer">
|
|
2399
2638
|
<div class="axm-chat-empty-assist-composer__caption">
|
|
2400
2639
|
{{ '@conversation:chat.empty-assist.caption' | translate | async }}
|
|
2401
2640
|
</div>
|
|
2402
|
-
|
|
2403
|
-
[prompts]="starterPrompts()"
|
|
2404
|
-
(promptSelected)="onStarterPromptSelected($event)"
|
|
2405
|
-
/>
|
|
2641
|
+
|
|
2406
2642
|
<div class="axm-chat-empty-assist-composer__composer-row">
|
|
2407
2643
|
<ax-button color="default" look="blank" class="ax-rounded-full">
|
|
2408
2644
|
<ax-icon icon="fa-regular fa-sparkles"></ax-icon>
|
|
2409
2645
|
<span class="axm-chat-empty-assist-composer__assist-text">
|
|
2410
|
-
{
|
|
2411
|
-
|
|
2412
|
-
}
|
|
2646
|
+
@if (selectedAssistLabel(); as assistLabel) {
|
|
2647
|
+
{{ assistLabel | translate | async }}
|
|
2648
|
+
} @else {
|
|
2649
|
+
{{ '@conversation:chat.empty-assist.assist-default' | translate | async }}
|
|
2650
|
+
}
|
|
2413
2651
|
</span>
|
|
2414
2652
|
<ax-dropdown-panel>
|
|
2415
2653
|
<ax-button-item-list>
|
|
@@ -2424,6 +2662,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
2424
2662
|
</ax-dropdown-panel>
|
|
2425
2663
|
</ax-button>
|
|
2426
2664
|
|
|
2665
|
+
@let assistTitle = (selectedAssistLabel() | translate | async) ?? '';
|
|
2666
|
+
|
|
2427
2667
|
<textarea
|
|
2428
2668
|
#draftInput
|
|
2429
2669
|
rows="1"
|
|
@@ -2432,7 +2672,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
2432
2672
|
(ngModelChange)="draftText.set($event ?? '')"
|
|
2433
2673
|
(input)="resizeDraftInput()"
|
|
2434
2674
|
(keydown)="onDraftKeydown($event)"
|
|
2435
|
-
[placeholder]="
|
|
2675
|
+
[placeholder]="
|
|
2676
|
+
('@conversation:chat.empty-assist.placeholder'
|
|
2677
|
+
| translate: { params: { assist: assistTitle } }
|
|
2678
|
+
| async) ?? ''
|
|
2679
|
+
"
|
|
2436
2680
|
></textarea>
|
|
2437
2681
|
<ax-button
|
|
2438
2682
|
color="default"
|
|
@@ -2447,8 +2691,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
2447
2691
|
}
|
|
2448
2692
|
</ax-button>
|
|
2449
2693
|
</div>
|
|
2694
|
+
<axm-assist-suggestion-chips [items]="starterPromptItems()" />
|
|
2450
2695
|
</div>
|
|
2451
|
-
`, styles: [".axm-chat-empty-assist-composer{width:min(100%,
|
|
2696
|
+
`, 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"] }]
|
|
2452
2697
|
}], ctorParameters: () => [], propDecorators: { conversationCreated: [{ type: i0.Output, args: ["conversationCreated"] }], draftInput: [{ type: i0.ViewChild, args: ['draftInput', { isSignal: true }] }] } });
|
|
2453
2698
|
|
|
2454
2699
|
class AXMChatWithAssistDialogComponent extends AXBasePageComponent {
|
|
@@ -2679,7 +2924,7 @@ class AXMChatWithAssistDialogComponent extends AXBasePageComponent {
|
|
|
2679
2924
|
</div>
|
|
2680
2925
|
}
|
|
2681
2926
|
</ng-template>
|
|
2682
|
-
`, 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:
|
|
2927
|
+
`, 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$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: AXTranslationModule }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
2683
2928
|
}
|
|
2684
2929
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatWithAssistDialogComponent, decorators: [{
|
|
2685
2930
|
type: Component,
|
|
@@ -2854,7 +3099,7 @@ class AXMChatSidebarNewActionsComponent {
|
|
|
2854
3099
|
</ax-fab-item>
|
|
2855
3100
|
</ax-fab>
|
|
2856
3101
|
</div>
|
|
2857
|
-
`, 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:
|
|
3102
|
+
`, 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$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
2858
3103
|
}
|
|
2859
3104
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatSidebarNewActionsComponent, decorators: [{
|
|
2860
3105
|
type: Component,
|
|
@@ -3021,7 +3266,7 @@ class AXMChatComponent extends AXPPageLayoutBaseComponent {
|
|
|
3021
3266
|
return this.activatedRoute.snapshot.parent?.paramMap.get('app') || 'platform';
|
|
3022
3267
|
}
|
|
3023
3268
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
3024
|
-
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)\"
|
|
3269
|
+
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 </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 </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\">\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>", 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$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: 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 }); }
|
|
3025
3270
|
}
|
|
3026
3271
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatComponent, decorators: [{
|
|
3027
3272
|
type: Component,
|
|
@@ -3043,7 +3288,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
3043
3288
|
], host: {
|
|
3044
3289
|
'(keydown.escape)': 'onContainerEscape()',
|
|
3045
3290
|
'[tabindex]': '"-1"',
|
|
3046
|
-
}, 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)\"
|
|
3291
|
+
}, 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 </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 </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\">\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>", 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"] }]
|
|
3047
3292
|
}] });
|
|
3048
3293
|
|
|
3049
3294
|
var chat_component = /*#__PURE__*/Object.freeze({
|
|
@@ -3141,6 +3386,7 @@ const AXM_ASSIST_TRANSCRIPT_NON_WIDGET_TYPES = new Set([
|
|
|
3141
3386
|
'image',
|
|
3142
3387
|
'audio',
|
|
3143
3388
|
'file',
|
|
3389
|
+
'followUp',
|
|
3144
3390
|
'tool',
|
|
3145
3391
|
'agent',
|
|
3146
3392
|
'tool_result',
|
|
@@ -3211,6 +3457,65 @@ function axmAssistLastTranscriptLine(transcript) {
|
|
|
3211
3457
|
}
|
|
3212
3458
|
return axmNormalizeAssistTranscriptLineResponses(transcript[transcript.length - 1]);
|
|
3213
3459
|
}
|
|
3460
|
+
/**
|
|
3461
|
+
* User-facing payload line for the assist bubble: merges visible assistant segments in the current turn,
|
|
3462
|
+
* including {@code followUp} from tool {@code agent_result} after auto-invoked specialists.
|
|
3463
|
+
*/
|
|
3464
|
+
function axmAssistUserFacingPayloadLine(transcript) {
|
|
3465
|
+
if (transcript.length === 0) {
|
|
3466
|
+
return null;
|
|
3467
|
+
}
|
|
3468
|
+
let lastUserIdx = -1;
|
|
3469
|
+
for (let i = transcript.length - 1; i >= 0; i--) {
|
|
3470
|
+
if (transcript[i].role === 'user') {
|
|
3471
|
+
lastUserIdx = i;
|
|
3472
|
+
break;
|
|
3473
|
+
}
|
|
3474
|
+
}
|
|
3475
|
+
const tail = lastUserIdx >= 0 ? transcript.slice(lastUserIdx) : transcript;
|
|
3476
|
+
const responses = [];
|
|
3477
|
+
let followUpItems = null;
|
|
3478
|
+
for (const m of tail) {
|
|
3479
|
+
if (m.role === 'assistant' && !axpAiChatMessageIsDelegatedReflectionExcluded(m)) {
|
|
3480
|
+
for (const r of m.responses) {
|
|
3481
|
+
if (r.type === 'text' || r.type === 'node' || r.type === 'file') {
|
|
3482
|
+
responses.push(r);
|
|
3483
|
+
}
|
|
3484
|
+
else if (r.type === 'followUp') {
|
|
3485
|
+
followUpItems = r.content;
|
|
3486
|
+
}
|
|
3487
|
+
}
|
|
3488
|
+
continue;
|
|
3489
|
+
}
|
|
3490
|
+
if (m.role !== 'tool') {
|
|
3491
|
+
continue;
|
|
3492
|
+
}
|
|
3493
|
+
for (const r of m.responses) {
|
|
3494
|
+
if (r.type !== 'agent_result') {
|
|
3495
|
+
continue;
|
|
3496
|
+
}
|
|
3497
|
+
const payload = r.content;
|
|
3498
|
+
if (payload.success !== true || payload.data?.responses == null) {
|
|
3499
|
+
continue;
|
|
3500
|
+
}
|
|
3501
|
+
for (const seg of payload.data.responses) {
|
|
3502
|
+
if (seg.type === 'followUp' && followUpItems == null) {
|
|
3503
|
+
followUpItems = seg.content;
|
|
3504
|
+
}
|
|
3505
|
+
else if (seg.type === 'text' || seg.type === 'node' || seg.type === 'file') {
|
|
3506
|
+
responses.push(seg);
|
|
3507
|
+
}
|
|
3508
|
+
}
|
|
3509
|
+
}
|
|
3510
|
+
}
|
|
3511
|
+
if (followUpItems != null && followUpItems.length > 0) {
|
|
3512
|
+
responses.push({ type: 'followUp', content: followUpItems });
|
|
3513
|
+
}
|
|
3514
|
+
if (responses.length === 0) {
|
|
3515
|
+
return null;
|
|
3516
|
+
}
|
|
3517
|
+
return axmNormalizeAssistTranscriptLineResponses({ role: 'assistant', responses });
|
|
3518
|
+
}
|
|
3214
3519
|
function axmBuildAssistTranscriptLinePayload(line) {
|
|
3215
3520
|
return {
|
|
3216
3521
|
type: AXM_ASSIST_TRANSCRIPT_LINE_PAYLOAD_TYPE,
|
|
@@ -3270,6 +3575,9 @@ function axmUserVisibleDelegatedSegment(seg) {
|
|
|
3270
3575
|
const body = axmParseAssistTranscriptTextEnvelope(seg.content).body.trim();
|
|
3271
3576
|
return body.length > 0 && body !== '```' && body !== '```json';
|
|
3272
3577
|
}
|
|
3578
|
+
if (seg.type === 'followUp') {
|
|
3579
|
+
return seg.content.length > 0;
|
|
3580
|
+
}
|
|
3273
3581
|
return false;
|
|
3274
3582
|
}
|
|
3275
3583
|
function axmUserVisibleChatResponse(line, seg) {
|
|
@@ -3287,6 +3595,9 @@ function axmUserVisibleChatResponse(line, seg) {
|
|
|
3287
3595
|
const body = axmParseAssistTranscriptTextEnvelope(seg.content).body.trim();
|
|
3288
3596
|
return body.length > 0 && body !== '```' && body !== '```json';
|
|
3289
3597
|
}
|
|
3598
|
+
if (seg.type === 'followUp') {
|
|
3599
|
+
return seg.content.length > 0;
|
|
3600
|
+
}
|
|
3290
3601
|
return false;
|
|
3291
3602
|
}
|
|
3292
3603
|
if (line.role === 'tool' && seg.type === 'agent_result') {
|
|
@@ -3301,6 +3612,7 @@ function axmUserVisibleChatResponse(line, seg) {
|
|
|
3301
3612
|
}
|
|
3302
3613
|
function axmAssistUserVisibleItemsForLine(line) {
|
|
3303
3614
|
const out = [];
|
|
3615
|
+
let followUpPushed = false;
|
|
3304
3616
|
for (const seg of line.responses) {
|
|
3305
3617
|
if (line.role === 'assistant') {
|
|
3306
3618
|
if (seg.type === 'text' && axmUserVisibleChatResponse(line, seg)) {
|
|
@@ -3317,6 +3629,10 @@ function axmAssistUserVisibleItemsForLine(line) {
|
|
|
3317
3629
|
name: seg.content.name,
|
|
3318
3630
|
});
|
|
3319
3631
|
}
|
|
3632
|
+
else if (seg.type === 'followUp' && !followUpPushed && axmUserVisibleChatResponse(line, seg)) {
|
|
3633
|
+
out.push({ kind: 'followUp', items: seg.content });
|
|
3634
|
+
followUpPushed = true;
|
|
3635
|
+
}
|
|
3320
3636
|
continue;
|
|
3321
3637
|
}
|
|
3322
3638
|
if (line.role === 'tool' && seg.type === 'agent_result') {
|
|
@@ -3343,11 +3659,26 @@ function axmAssistUserVisibleItemsForLine(line) {
|
|
|
3343
3659
|
name: ds.content.name,
|
|
3344
3660
|
});
|
|
3345
3661
|
}
|
|
3662
|
+
else if (ds.type === 'followUp' && !followUpPushed) {
|
|
3663
|
+
out.push({ kind: 'followUp', items: ds.content });
|
|
3664
|
+
followUpPushed = true;
|
|
3665
|
+
}
|
|
3346
3666
|
}
|
|
3347
3667
|
}
|
|
3348
3668
|
}
|
|
3349
3669
|
return out;
|
|
3350
3670
|
}
|
|
3671
|
+
/** Parses a raw {@code followUp} segment for UI (normalizes chip commands). */
|
|
3672
|
+
function axmAssistFollowUpItemsFromUnknown(raw) {
|
|
3673
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
|
|
3674
|
+
return [];
|
|
3675
|
+
}
|
|
3676
|
+
const rec = raw;
|
|
3677
|
+
if (rec['type'] !== 'followUp') {
|
|
3678
|
+
return [];
|
|
3679
|
+
}
|
|
3680
|
+
return axmAssistNormalizeFollowUpItemsForConversation(axpAiNormalizeFollowUpContent(rec['content']));
|
|
3681
|
+
}
|
|
3351
3682
|
//#endregion
|
|
3352
3683
|
|
|
3353
3684
|
/**
|
|
@@ -4189,7 +4520,7 @@ class AXMCommentComponent {
|
|
|
4189
4520
|
this.showToast(content, color);
|
|
4190
4521
|
}
|
|
4191
4522
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMCommentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
4192
|
-
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$2.AXWysiwygContainerComponent, selector: "ax-wysiwyg-container", inputs: ["look", "readonly", "disabled", "value", "placeHolder"], outputs: ["onValueChanged"] }, { kind: "component", type: i1$2.AXWysiwygViewComponent, selector: "ax-wysiwyg-view" }, { kind: "component", type: i1$2.AXWysiwygAlignmentComponent, selector: "ax-wysiwyg-alignment" }, { kind: "component", type: i1$2.AXWysiwygColorsComponent, selector: "ax-wysiwyg-colors" }, { kind: "component", type: i1$2.AXWysiwygFontStyleComponent, selector: "ax-wysiwyg-font-style" }, { kind: "component", type: i1$2.AXWysiwygHistoryComponent, selector: "ax-wysiwyg-history" }, { kind: "component", type: i1$2.AXWysiwygListComponent, selector: "ax-wysiwyg-list" }, { kind: "component", type: i1$2.AXWysiwygToolbarComponent, selector: "ax-wysiwyg-toolbar" }, { kind: "ngmodule", type: AXConversationModule }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i2$1.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i1$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i1$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXCommentModule }, { kind: "component", type: i4.AXCommentViewComponent, selector: "ax-comment-view" }, { kind: "component", type: i4.AXCommentContainerComponent, selector: "ax-comment-container" }, { kind: "component", type: i4.AXCommentItemComponent, selector: "ax-comment-item", inputs: ["replyCount", "repliesExpanded"], outputs: ["repliesExpandedChange"] }, { kind: "component", type: i4.AXCommentLikeComponent, selector: "ax-comment-like", inputs: ["like"], outputs: ["likeChange"] }, { kind: "component", type: i4.AXMenuOptionsComponent, selector: "ax-comment-menu-options" }, { kind: "component", type: i4.AXCommentReplyTextComponent, selector: "ax-comment-reply-text" }, { kind: "component", type: i4.AXCommentDateComponent, selector: "ax-comment-date" }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i2.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: i2.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i2.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXAvatarModule }, { kind: "ngmodule", type: AXImageModule }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i6.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "component", type: i3$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: [
|
|
4523
|
+
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: [
|
|
4193
4524
|
trigger('fadeIn', [
|
|
4194
4525
|
transition(':enter', [
|
|
4195
4526
|
style({ opacity: 0, transform: 'translateY(10px)' }),
|
|
@@ -4354,7 +4685,7 @@ class AXMCommentPopupComponent extends AXBasePageComponent {
|
|
|
4354
4685
|
// Angular
|
|
4355
4686
|
CommonModule }, { kind: "ngmodule", type:
|
|
4356
4687
|
// ACoreX
|
|
4357
|
-
AXDecoratorModule }, { kind: "component", type:
|
|
4688
|
+
AXDecoratorModule }, { 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: 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:
|
|
4358
4689
|
// Comment
|
|
4359
4690
|
AXMCommentComponent, selector: "axm-comment", inputs: ["refrenceType", "refrenceId", "subject"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
4360
4691
|
}
|
|
@@ -4818,6 +5149,506 @@ const AXM_RENAME_ASSIST_CONVERSATION_ACTION = {
|
|
|
4818
5149
|
};
|
|
4819
5150
|
//#endregion
|
|
4820
5151
|
|
|
5152
|
+
//#region ---- Imports ----
|
|
5153
|
+
//#endregion
|
|
5154
|
+
//#region ---- Constants ----
|
|
5155
|
+
/** Platform AiAgent catalog id for the speech-to-text specialist (see connectivity agent mock seed). */
|
|
5156
|
+
const AXM_SPEECH_TO_TEXT_AGENT_ID = 'c0000001-0000-4000-8000-000000000006';
|
|
5157
|
+
//#endregion
|
|
5158
|
+
//#region ---- Component ----
|
|
5159
|
+
class AXMChatVoiceRecorderComponent {
|
|
5160
|
+
//#endregion
|
|
5161
|
+
//#region ---- Lifecycle ----
|
|
5162
|
+
constructor() {
|
|
5163
|
+
//#region ---- Services & Dependencies ----
|
|
5164
|
+
this.platformId = inject(PLATFORM_ID);
|
|
5165
|
+
this.destroyRef = inject(DestroyRef);
|
|
5166
|
+
this.composerService = inject(AXComposerService);
|
|
5167
|
+
this.conversationService = inject(AXConversationService);
|
|
5168
|
+
this.messageApi = inject(AXMessageApi);
|
|
5169
|
+
this.commandService = inject(AXPCommandService);
|
|
5170
|
+
this.chatToolRunContext = inject(AXPAiChatToolRunContextService);
|
|
5171
|
+
this.aiManager = inject(AXPAiManagerService, { optional: true });
|
|
5172
|
+
this.runtimeContextBuilder = inject(AXPAiPlatformRuntimeContextBuilder);
|
|
5173
|
+
this.fileStorage = inject(AXPFileStorageService);
|
|
5174
|
+
this.toastService = inject(AXToastService);
|
|
5175
|
+
this.translation = inject(AXTranslationService);
|
|
5176
|
+
//#endregion
|
|
5177
|
+
//#region ---- Inputs & Outputs ----
|
|
5178
|
+
this.conversation = input.required(...(ngDevMode ? [{ debugName: "conversation" }] : /* istanbul ignore next */ []));
|
|
5179
|
+
this.service = input(...(ngDevMode ? [undefined, { debugName: "service" }] : /* istanbul ignore next */ []));
|
|
5180
|
+
this.recordingComplete = output();
|
|
5181
|
+
this.recordingCancelled = output();
|
|
5182
|
+
//#endregion
|
|
5183
|
+
//#region ---- State ----
|
|
5184
|
+
this.isRecording = signal(false, ...(ngDevMode ? [{ debugName: "isRecording" }] : /* istanbul ignore next */ []));
|
|
5185
|
+
this.isTranscribing = signal(false, ...(ngDevMode ? [{ debugName: "isTranscribing" }] : /* istanbul ignore next */ []));
|
|
5186
|
+
this.recordingDuration = signal(0, ...(ngDevMode ? [{ debugName: "recordingDuration" }] : /* istanbul ignore next */ []));
|
|
5187
|
+
this.recordingStartTime = 0;
|
|
5188
|
+
this.audioChunks = [];
|
|
5189
|
+
this.cancelled = false;
|
|
5190
|
+
this.suppressVoiceMessageSend = false;
|
|
5191
|
+
//#endregion
|
|
5192
|
+
//#region ---- Computed ----
|
|
5193
|
+
this.formattedTime = computed(() => {
|
|
5194
|
+
const duration = this.recordingDuration();
|
|
5195
|
+
const minutes = Math.floor(duration / 60);
|
|
5196
|
+
const seconds = duration % 60;
|
|
5197
|
+
return `${minutes}:${seconds.toString().padStart(2, '0')}`;
|
|
5198
|
+
}, ...(ngDevMode ? [{ debugName: "formattedTime" }] : /* istanbul ignore next */ []));
|
|
5199
|
+
this.destroyRef.onDestroy(() => this.stopAndCleanup());
|
|
5200
|
+
}
|
|
5201
|
+
//#endregion
|
|
5202
|
+
//#region ---- UI Handlers ----
|
|
5203
|
+
async applySpeechToText() {
|
|
5204
|
+
if (this.isTranscribing() || !this.isRecording()) {
|
|
5205
|
+
return;
|
|
5206
|
+
}
|
|
5207
|
+
try {
|
|
5208
|
+
const audioBlob = await this.waitForRecordingBlob();
|
|
5209
|
+
if (!audioBlob) {
|
|
5210
|
+
return;
|
|
5211
|
+
}
|
|
5212
|
+
this.isTranscribing.set(true);
|
|
5213
|
+
const text = await this.transcribeVoiceBlob(audioBlob);
|
|
5214
|
+
if (!text) {
|
|
5215
|
+
return;
|
|
5216
|
+
}
|
|
5217
|
+
this.composerService.draftText.set(text);
|
|
5218
|
+
this.composerService.hideComponent();
|
|
5219
|
+
setTimeout(() => {
|
|
5220
|
+
document.querySelector('.composer-input-wrapper textarea')?.focus();
|
|
5221
|
+
}, 100);
|
|
5222
|
+
}
|
|
5223
|
+
catch (error) {
|
|
5224
|
+
console.error('Speech-to-text failed:', error);
|
|
5225
|
+
this.composerService.hideComponent();
|
|
5226
|
+
const errTitle = await this.translation.translateAsync('@general:messages.error.title');
|
|
5227
|
+
const fallback = await this.translation.translateAsync('@conversation:chat.speech-to-text.errors.transcription-failed');
|
|
5228
|
+
const content = error instanceof Error ? error.message : fallback;
|
|
5229
|
+
await this.toastService.show({ color: 'danger', title: errTitle, content });
|
|
5230
|
+
}
|
|
5231
|
+
finally {
|
|
5232
|
+
this.isTranscribing.set(false);
|
|
5233
|
+
}
|
|
5234
|
+
}
|
|
5235
|
+
async startRecording() {
|
|
5236
|
+
if (!isPlatformBrowser(this.platformId)) {
|
|
5237
|
+
return;
|
|
5238
|
+
}
|
|
5239
|
+
try {
|
|
5240
|
+
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
|
|
5241
|
+
this.activeStream = stream;
|
|
5242
|
+
this.mediaRecorder = new MediaRecorder(stream);
|
|
5243
|
+
this.audioChunks = [];
|
|
5244
|
+
this.cancelled = false;
|
|
5245
|
+
this.mediaRecorder.ondataavailable = (event) => {
|
|
5246
|
+
if (event.data.size > 0) {
|
|
5247
|
+
this.audioChunks.push(event.data);
|
|
5248
|
+
}
|
|
5249
|
+
};
|
|
5250
|
+
this.mediaRecorder.onstop = async () => {
|
|
5251
|
+
stream.getTracks().forEach((track) => track.stop());
|
|
5252
|
+
this.activeStream = undefined;
|
|
5253
|
+
const pendingResolve = this.pendingBlobResolve;
|
|
5254
|
+
this.pendingBlobResolve = undefined;
|
|
5255
|
+
if (this.cancelled) {
|
|
5256
|
+
this.cancelled = false;
|
|
5257
|
+
pendingResolve?.(null);
|
|
5258
|
+
return;
|
|
5259
|
+
}
|
|
5260
|
+
const audioBlob = new Blob(this.audioChunks, {
|
|
5261
|
+
type: this.mediaRecorder?.mimeType?.trim() || this.audioChunks[0]?.type?.trim() || 'audio/webm',
|
|
5262
|
+
});
|
|
5263
|
+
pendingResolve?.(audioBlob.size > 0 ? audioBlob : null);
|
|
5264
|
+
if (this.suppressVoiceMessageSend) {
|
|
5265
|
+
this.suppressVoiceMessageSend = false;
|
|
5266
|
+
return;
|
|
5267
|
+
}
|
|
5268
|
+
this.recordingComplete.emit(audioBlob);
|
|
5269
|
+
const conv = this.conversation();
|
|
5270
|
+
if (conv && this.audioChunks.length > 0) {
|
|
5271
|
+
await this.sendVoiceMessage(audioBlob, conv);
|
|
5272
|
+
}
|
|
5273
|
+
};
|
|
5274
|
+
this.mediaRecorder.start(250);
|
|
5275
|
+
this.isRecording.set(true);
|
|
5276
|
+
this.recordingStartTime = Date.now();
|
|
5277
|
+
this.recordingDuration.set(0);
|
|
5278
|
+
this.timerInterval = window.setInterval(() => {
|
|
5279
|
+
const elapsed = Math.floor((Date.now() - this.recordingStartTime) / 1000);
|
|
5280
|
+
this.recordingDuration.set(elapsed);
|
|
5281
|
+
}, 1000);
|
|
5282
|
+
}
|
|
5283
|
+
catch (error) {
|
|
5284
|
+
console.error('Failed to start recording:', error);
|
|
5285
|
+
}
|
|
5286
|
+
}
|
|
5287
|
+
stopRecording() {
|
|
5288
|
+
if (this.mediaRecorder && this.isRecording()) {
|
|
5289
|
+
this.mediaRecorder.stop();
|
|
5290
|
+
this.isRecording.set(false);
|
|
5291
|
+
this.clearTimer();
|
|
5292
|
+
this.composerService.hideComponent();
|
|
5293
|
+
}
|
|
5294
|
+
}
|
|
5295
|
+
cancelRecording() {
|
|
5296
|
+
if (this.mediaRecorder && this.isRecording()) {
|
|
5297
|
+
this.cancelled = true;
|
|
5298
|
+
this.mediaRecorder.stop();
|
|
5299
|
+
this.isRecording.set(false);
|
|
5300
|
+
this.clearTimer();
|
|
5301
|
+
this.audioChunks = [];
|
|
5302
|
+
this.recordingCancelled.emit();
|
|
5303
|
+
this.composerService.hideComponent();
|
|
5304
|
+
}
|
|
5305
|
+
}
|
|
5306
|
+
cancel() {
|
|
5307
|
+
if (this.isRecording()) {
|
|
5308
|
+
this.cancelRecording();
|
|
5309
|
+
}
|
|
5310
|
+
else {
|
|
5311
|
+
this.composerService.hideComponent();
|
|
5312
|
+
}
|
|
5313
|
+
}
|
|
5314
|
+
//#endregion
|
|
5315
|
+
//#region ---- Utility Methods ----
|
|
5316
|
+
clearTimer() {
|
|
5317
|
+
if (this.timerInterval) {
|
|
5318
|
+
clearInterval(this.timerInterval);
|
|
5319
|
+
this.timerInterval = undefined;
|
|
5320
|
+
}
|
|
5321
|
+
}
|
|
5322
|
+
waitForRecordingBlob() {
|
|
5323
|
+
if (!this.mediaRecorder || !this.isRecording()) {
|
|
5324
|
+
return Promise.resolve(null);
|
|
5325
|
+
}
|
|
5326
|
+
return new Promise((resolve) => {
|
|
5327
|
+
this.pendingBlobResolve = resolve;
|
|
5328
|
+
this.suppressVoiceMessageSend = true;
|
|
5329
|
+
if (this.mediaRecorder.state === 'recording') {
|
|
5330
|
+
this.mediaRecorder.requestData();
|
|
5331
|
+
}
|
|
5332
|
+
this.mediaRecorder.stop();
|
|
5333
|
+
this.isRecording.set(false);
|
|
5334
|
+
this.clearTimer();
|
|
5335
|
+
});
|
|
5336
|
+
}
|
|
5337
|
+
extractAssistIdFromConversation(conversation) {
|
|
5338
|
+
const raw = conversation.metadata?.['assistId'];
|
|
5339
|
+
if (typeof raw === 'string' && raw.trim()) {
|
|
5340
|
+
return raw.trim();
|
|
5341
|
+
}
|
|
5342
|
+
for (const participant of conversation.participants ?? []) {
|
|
5343
|
+
const participantAssistId = participant.metadata?.['assistId'];
|
|
5344
|
+
if (typeof participantAssistId === 'string' && participantAssistId.trim()) {
|
|
5345
|
+
return participantAssistId.trim();
|
|
5346
|
+
}
|
|
5347
|
+
}
|
|
5348
|
+
return undefined;
|
|
5349
|
+
}
|
|
5350
|
+
async resolveAssistIdForTranscription() {
|
|
5351
|
+
if (!this.aiManager) {
|
|
5352
|
+
throw new Error('AI manager service is not available.');
|
|
5353
|
+
}
|
|
5354
|
+
const conversationAssistId = this.extractAssistIdFromConversation(this.conversation());
|
|
5355
|
+
const assist = await this.aiManager.getAssistForChat(conversationAssistId);
|
|
5356
|
+
const assistId = assist.id?.trim();
|
|
5357
|
+
if (!assistId) {
|
|
5358
|
+
throw new Error('No AI assist is configured for speech transcription.');
|
|
5359
|
+
}
|
|
5360
|
+
return assistId;
|
|
5361
|
+
}
|
|
5362
|
+
buildTranscriptCorrectionPrompt(rawText, platformRuntimeContext) {
|
|
5363
|
+
const locale = platformRuntimeContext.locale?.trim() || 'the UI locale from platform context';
|
|
5364
|
+
return [
|
|
5365
|
+
'Correct obvious misrecognized words and minor lexical or spelling errors in the transcript below.',
|
|
5366
|
+
`Keep the language aligned with UI locale (${locale}) and preserve the speaker's meaning.`,
|
|
5367
|
+
'Return ONLY the corrected plain text — no markdown, labels, quotes, or commentary.',
|
|
5368
|
+
'',
|
|
5369
|
+
rawText,
|
|
5370
|
+
].join('\n');
|
|
5371
|
+
}
|
|
5372
|
+
localeToTranscriptionLanguage(locale) {
|
|
5373
|
+
const trimmed = locale?.trim();
|
|
5374
|
+
if (!trimmed) {
|
|
5375
|
+
return undefined;
|
|
5376
|
+
}
|
|
5377
|
+
const primary = trimmed.split('-')[0]?.toLowerCase();
|
|
5378
|
+
return primary || undefined;
|
|
5379
|
+
}
|
|
5380
|
+
async correctTranscriptText(assistId, rawText, platformRuntimeContext) {
|
|
5381
|
+
const result = await this.commandService.execute(AIMANAGEMENT_STRUCTURED_TEXT_COMPLETION_COMMAND_KEY, {
|
|
5382
|
+
assistId,
|
|
5383
|
+
messages: [axpAiChatTextMessage('user', this.buildTranscriptCorrectionPrompt(rawText, platformRuntimeContext))],
|
|
5384
|
+
maxTokens: 2048,
|
|
5385
|
+
temperature: 0.2,
|
|
5386
|
+
});
|
|
5387
|
+
if (result?.success && typeof result.data?.text === 'string' && result.data.text.trim()) {
|
|
5388
|
+
return result.data.text.trim();
|
|
5389
|
+
}
|
|
5390
|
+
return rawText;
|
|
5391
|
+
}
|
|
5392
|
+
async persistVoiceRecordingForAi(audioBlob, conversationId) {
|
|
5393
|
+
const mimeType = audioBlob.type?.trim() || 'audio/webm';
|
|
5394
|
+
const fileName = `voice-${Date.now()}.webm`;
|
|
5395
|
+
const file = new File([audioBlob], fileName, { type: mimeType });
|
|
5396
|
+
const refId = conversationId.trim() || globalThis.crypto.randomUUID();
|
|
5397
|
+
const { fileId } = await persistAiChatAttachmentImage(this.fileStorage, file, refId);
|
|
5398
|
+
return { fileId, mimeType, name: fileName };
|
|
5399
|
+
}
|
|
5400
|
+
async transcribeVoiceBlob(audioBlob) {
|
|
5401
|
+
const assistId = await this.resolveAssistIdForTranscription();
|
|
5402
|
+
const platformRuntimeContext = await this.runtimeContextBuilder.build();
|
|
5403
|
+
const conversationId = this.conversation().id;
|
|
5404
|
+
const attachment = await this.persistVoiceRecordingForAi(audioBlob, conversationId);
|
|
5405
|
+
const language = this.localeToTranscriptionLanguage(platformRuntimeContext.locale);
|
|
5406
|
+
this.chatToolRunContext.setContext({
|
|
5407
|
+
assistId,
|
|
5408
|
+
chatTransport: 'openai',
|
|
5409
|
+
agentId: AXM_SPEECH_TO_TEXT_AGENT_ID,
|
|
5410
|
+
});
|
|
5411
|
+
try {
|
|
5412
|
+
const result = await this.commandService.execute(AIMANAGEMENT_CHAT_TRANSCRIBE_SPEECH_COMMAND_KEY, {
|
|
5413
|
+
fileId: attachment.fileId,
|
|
5414
|
+
...(language ? { language } : {}),
|
|
5415
|
+
});
|
|
5416
|
+
if (result == null || !result.success || typeof result.data?.text !== 'string' || !result.data.text.trim()) {
|
|
5417
|
+
const detail = result != null && typeof result.message?.text === 'string' && result.message.text.trim()
|
|
5418
|
+
? result.message.text
|
|
5419
|
+
: 'Speech transcription returned no text.';
|
|
5420
|
+
throw new Error(detail);
|
|
5421
|
+
}
|
|
5422
|
+
return this.correctTranscriptText(assistId, result.data.text.trim(), platformRuntimeContext);
|
|
5423
|
+
}
|
|
5424
|
+
finally {
|
|
5425
|
+
this.chatToolRunContext.setContext(null);
|
|
5426
|
+
}
|
|
5427
|
+
}
|
|
5428
|
+
async sendVoiceMessage(audioBlob, conversation) {
|
|
5429
|
+
try {
|
|
5430
|
+
const audioFile = new File([audioBlob], `voice-${Date.now()}.webm`, { type: 'audio/webm' });
|
|
5431
|
+
const uploadResult = await this.messageApi.uploadFile(audioFile, conversation.id);
|
|
5432
|
+
const command = {
|
|
5433
|
+
conversationId: conversation.id,
|
|
5434
|
+
type: 'voice',
|
|
5435
|
+
payload: {
|
|
5436
|
+
type: 'voice',
|
|
5437
|
+
url: uploadResult.url,
|
|
5438
|
+
duration: this.recordingDuration(),
|
|
5439
|
+
size: uploadResult.size,
|
|
5440
|
+
mimeType: uploadResult.mimeType,
|
|
5441
|
+
},
|
|
5442
|
+
};
|
|
5443
|
+
await this.conversationService.sendMessage(command);
|
|
5444
|
+
}
|
|
5445
|
+
catch (error) {
|
|
5446
|
+
console.error('Failed to send voice message:', error);
|
|
5447
|
+
}
|
|
5448
|
+
}
|
|
5449
|
+
stopAndCleanup() {
|
|
5450
|
+
this.clearTimer();
|
|
5451
|
+
if (this.mediaRecorder?.state === 'recording') {
|
|
5452
|
+
this.cancelled = true;
|
|
5453
|
+
this.mediaRecorder.stop();
|
|
5454
|
+
}
|
|
5455
|
+
this.activeStream?.getTracks().forEach((track) => track.stop());
|
|
5456
|
+
this.activeStream = undefined;
|
|
5457
|
+
}
|
|
5458
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatVoiceRecorderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5459
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMChatVoiceRecorderComponent, isStandalone: true, selector: "axm-chat-voice-recorder", inputs: { conversation: { classPropertyName: "conversation", publicName: "conversation", isSignal: true, isRequired: true, transformFunction: null }, service: { classPropertyName: "service", publicName: "service", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { recordingComplete: "recordingComplete", recordingCancelled: "recordingCancelled" }, ngImport: i0, template: `
|
|
5460
|
+
<div class="voice-recorder">
|
|
5461
|
+
<div class="recorder-header">
|
|
5462
|
+
<h3 class="recorder-title">{{ '@acorex:chat.voice-recorder.title' | translate | async }}</h3>
|
|
5463
|
+
<button
|
|
5464
|
+
type="button"
|
|
5465
|
+
class="close-button"
|
|
5466
|
+
(click)="cancel()"
|
|
5467
|
+
[attr.aria-label]="'@acorex:chat.actions.close' | translate | async"
|
|
5468
|
+
>
|
|
5469
|
+
<i class="fa-light fa-xmark"></i>
|
|
5470
|
+
</button>
|
|
5471
|
+
</div>
|
|
5472
|
+
|
|
5473
|
+
<div class="recorder-content">
|
|
5474
|
+
@if (isTranscribing()) {
|
|
5475
|
+
<div class="recorder-transcribing">
|
|
5476
|
+
<ax-loading></ax-loading>
|
|
5477
|
+
<span class="recorder-transcribing-text">{{
|
|
5478
|
+
'@acorex:chat.voice-recorder.transcribing' | translate | async
|
|
5479
|
+
}}</span>
|
|
5480
|
+
</div>
|
|
5481
|
+
} @else if (!isRecording()) {
|
|
5482
|
+
<div class="recorder-idle">
|
|
5483
|
+
<button type="button" class="record-button" (click)="startRecording()">
|
|
5484
|
+
<i class="fa-light fa-microphone"></i>
|
|
5485
|
+
</button>
|
|
5486
|
+
<!-- <button
|
|
5487
|
+
type="button"
|
|
5488
|
+
class="speech-to-text-button"
|
|
5489
|
+
[disabled]="isTranscribing()"
|
|
5490
|
+
(click)="applySpeechToText()"
|
|
5491
|
+
[attr.aria-label]="'@conversation:chat.speech-to-text.action' | translate | async"
|
|
5492
|
+
>
|
|
5493
|
+
<i class="fa-light fa-waveform-lines"></i>
|
|
5494
|
+
</button> -->
|
|
5495
|
+
<span class="recorder-hint">{{ '@acorex:chat.voice-recorder.tap-to-start' | translate | async }}</span>
|
|
5496
|
+
</div>
|
|
5497
|
+
} @else {
|
|
5498
|
+
<div class="recorder-active">
|
|
5499
|
+
<div class="recorder-info">
|
|
5500
|
+
<div class="recording-indicator">
|
|
5501
|
+
<span class="pulse-dot"></span>
|
|
5502
|
+
<span class="recording-text">{{ '@acorex:chat.voice-recorder.recording' | translate | async }}</span>
|
|
5503
|
+
</div>
|
|
5504
|
+
<div class="recording-time">{{ formattedTime() }}</div>
|
|
5505
|
+
</div>
|
|
5506
|
+
|
|
5507
|
+
<div class="recorder-actions">
|
|
5508
|
+
<ax-button
|
|
5509
|
+
[text]="translation.translateSync('@acorex:chat.actions.cancel')"
|
|
5510
|
+
[look]="'ghost'"
|
|
5511
|
+
(onClick)="cancelRecording()"
|
|
5512
|
+
>
|
|
5513
|
+
<ax-prefix>
|
|
5514
|
+
<ax-icon><i class="fa-light fa-xmark"></i></ax-icon>
|
|
5515
|
+
</ax-prefix>
|
|
5516
|
+
</ax-button>
|
|
5517
|
+
|
|
5518
|
+
<ax-button
|
|
5519
|
+
[text]="translation.translateSync('@acorex:chat.actions.send')"
|
|
5520
|
+
color="'primary'"
|
|
5521
|
+
(onClick)="stopRecording()"
|
|
5522
|
+
>
|
|
5523
|
+
<ax-prefix>
|
|
5524
|
+
<ax-icon><i class="fa-light fa-paper-plane"></i></ax-icon>
|
|
5525
|
+
</ax-prefix>
|
|
5526
|
+
</ax-button>
|
|
5527
|
+
|
|
5528
|
+
<ax-button
|
|
5529
|
+
[text]="translation.translateSync('@acorex:chat.actions.speach-to-text')"
|
|
5530
|
+
color="secondary"
|
|
5531
|
+
[disabled]="isTranscribing()"
|
|
5532
|
+
(onClick)="applySpeechToText()"
|
|
5533
|
+
>
|
|
5534
|
+
<ax-prefix>
|
|
5535
|
+
<ax-icon><i class="fa-light fa-paper-plane"></i></ax-icon>
|
|
5536
|
+
</ax-prefix>
|
|
5537
|
+
</ax-button>
|
|
5538
|
+
</div>
|
|
5539
|
+
</div>
|
|
5540
|
+
}
|
|
5541
|
+
</div>
|
|
5542
|
+
</div>
|
|
5543
|
+
`, 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$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: 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: i3.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
5544
|
+
}
|
|
5545
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMChatVoiceRecorderComponent, decorators: [{
|
|
5546
|
+
type: Component,
|
|
5547
|
+
args: [{ selector: 'axm-chat-voice-recorder', changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, AXButtonModule, AXDecoratorModule, AXLabelModule, AXLoadingModule, AXTranslationModule], template: `
|
|
5548
|
+
<div class="voice-recorder">
|
|
5549
|
+
<div class="recorder-header">
|
|
5550
|
+
<h3 class="recorder-title">{{ '@acorex:chat.voice-recorder.title' | translate | async }}</h3>
|
|
5551
|
+
<button
|
|
5552
|
+
type="button"
|
|
5553
|
+
class="close-button"
|
|
5554
|
+
(click)="cancel()"
|
|
5555
|
+
[attr.aria-label]="'@acorex:chat.actions.close' | translate | async"
|
|
5556
|
+
>
|
|
5557
|
+
<i class="fa-light fa-xmark"></i>
|
|
5558
|
+
</button>
|
|
5559
|
+
</div>
|
|
5560
|
+
|
|
5561
|
+
<div class="recorder-content">
|
|
5562
|
+
@if (isTranscribing()) {
|
|
5563
|
+
<div class="recorder-transcribing">
|
|
5564
|
+
<ax-loading></ax-loading>
|
|
5565
|
+
<span class="recorder-transcribing-text">{{
|
|
5566
|
+
'@acorex:chat.voice-recorder.transcribing' | translate | async
|
|
5567
|
+
}}</span>
|
|
5568
|
+
</div>
|
|
5569
|
+
} @else if (!isRecording()) {
|
|
5570
|
+
<div class="recorder-idle">
|
|
5571
|
+
<button type="button" class="record-button" (click)="startRecording()">
|
|
5572
|
+
<i class="fa-light fa-microphone"></i>
|
|
5573
|
+
</button>
|
|
5574
|
+
<!-- <button
|
|
5575
|
+
type="button"
|
|
5576
|
+
class="speech-to-text-button"
|
|
5577
|
+
[disabled]="isTranscribing()"
|
|
5578
|
+
(click)="applySpeechToText()"
|
|
5579
|
+
[attr.aria-label]="'@conversation:chat.speech-to-text.action' | translate | async"
|
|
5580
|
+
>
|
|
5581
|
+
<i class="fa-light fa-waveform-lines"></i>
|
|
5582
|
+
</button> -->
|
|
5583
|
+
<span class="recorder-hint">{{ '@acorex:chat.voice-recorder.tap-to-start' | translate | async }}</span>
|
|
5584
|
+
</div>
|
|
5585
|
+
} @else {
|
|
5586
|
+
<div class="recorder-active">
|
|
5587
|
+
<div class="recorder-info">
|
|
5588
|
+
<div class="recording-indicator">
|
|
5589
|
+
<span class="pulse-dot"></span>
|
|
5590
|
+
<span class="recording-text">{{ '@acorex:chat.voice-recorder.recording' | translate | async }}</span>
|
|
5591
|
+
</div>
|
|
5592
|
+
<div class="recording-time">{{ formattedTime() }}</div>
|
|
5593
|
+
</div>
|
|
5594
|
+
|
|
5595
|
+
<div class="recorder-actions">
|
|
5596
|
+
<ax-button
|
|
5597
|
+
[text]="translation.translateSync('@acorex:chat.actions.cancel')"
|
|
5598
|
+
[look]="'ghost'"
|
|
5599
|
+
(onClick)="cancelRecording()"
|
|
5600
|
+
>
|
|
5601
|
+
<ax-prefix>
|
|
5602
|
+
<ax-icon><i class="fa-light fa-xmark"></i></ax-icon>
|
|
5603
|
+
</ax-prefix>
|
|
5604
|
+
</ax-button>
|
|
5605
|
+
|
|
5606
|
+
<ax-button
|
|
5607
|
+
[text]="translation.translateSync('@acorex:chat.actions.send')"
|
|
5608
|
+
color="'primary'"
|
|
5609
|
+
(onClick)="stopRecording()"
|
|
5610
|
+
>
|
|
5611
|
+
<ax-prefix>
|
|
5612
|
+
<ax-icon><i class="fa-light fa-paper-plane"></i></ax-icon>
|
|
5613
|
+
</ax-prefix>
|
|
5614
|
+
</ax-button>
|
|
5615
|
+
|
|
5616
|
+
<ax-button
|
|
5617
|
+
[text]="translation.translateSync('@acorex:chat.actions.speach-to-text')"
|
|
5618
|
+
color="secondary"
|
|
5619
|
+
[disabled]="isTranscribing()"
|
|
5620
|
+
(onClick)="applySpeechToText()"
|
|
5621
|
+
>
|
|
5622
|
+
<ax-prefix>
|
|
5623
|
+
<ax-icon><i class="fa-light fa-paper-plane"></i></ax-icon>
|
|
5624
|
+
</ax-prefix>
|
|
5625
|
+
</ax-button>
|
|
5626
|
+
</div>
|
|
5627
|
+
</div>
|
|
5628
|
+
}
|
|
5629
|
+
</div>
|
|
5630
|
+
</div>
|
|
5631
|
+
`, 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"] }]
|
|
5632
|
+
}], ctorParameters: () => [], propDecorators: { conversation: [{ type: i0.Input, args: [{ isSignal: true, alias: "conversation", required: true }] }], service: [{ type: i0.Input, args: [{ isSignal: true, alias: "service", required: false }] }], recordingComplete: [{ type: i0.Output, args: ["recordingComplete"] }], recordingCancelled: [{ type: i0.Output, args: ["recordingCancelled"] }] } });
|
|
5633
|
+
|
|
5634
|
+
//#region ---- Imports ----
|
|
5635
|
+
//#endregion
|
|
5636
|
+
//#region ---- Action ----
|
|
5637
|
+
const AXM_CHAT_COMPOSER_VOICE_RECORDING_ACTION = {
|
|
5638
|
+
id: 'voice-recording',
|
|
5639
|
+
label: '@acorex:chat.voice',
|
|
5640
|
+
icon: 'fa-light fa-microphone',
|
|
5641
|
+
position: 'right',
|
|
5642
|
+
priority: 30,
|
|
5643
|
+
component: AXMChatVoiceRecorderComponent,
|
|
5644
|
+
toggleable: true,
|
|
5645
|
+
visible: (context) => {
|
|
5646
|
+
return !context.draftText?.trim() && !context.isEditing;
|
|
5647
|
+
},
|
|
5648
|
+
tooltip: '@acorex:chat.tooltips.record-voice-message',
|
|
5649
|
+
};
|
|
5650
|
+
//#endregion
|
|
5651
|
+
|
|
4821
5652
|
class AXMChatInfoBarAssistModelActionComponent {
|
|
4822
5653
|
constructor() {
|
|
4823
5654
|
//#region ---- Inputs ----
|
|
@@ -5277,7 +6108,7 @@ class AXMNodeMessageRendererComponent {
|
|
|
5277
6108
|
</div>
|
|
5278
6109
|
}
|
|
5279
6110
|
</div>
|
|
5280
|
-
`, 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$
|
|
6111
|
+
`, 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: i3.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
5281
6112
|
}
|
|
5282
6113
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMNodeMessageRendererComponent, decorators: [{
|
|
5283
6114
|
type: Component,
|
|
@@ -5356,18 +6187,19 @@ class AXMAssistTranscriptUserLineComponent {
|
|
|
5356
6187
|
return c.type === 'code' && typeof c.language === 'string' && typeof c.code === 'string';
|
|
5357
6188
|
}
|
|
5358
6189
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMAssistTranscriptUserLineComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5359
|
-
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 }\n }\n</div>\n", styles: [".axm-assist-renderer{display:flex;flex-direction:column;gap:.5rem}.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){margin-block:.45rem}.axm-assist-bot__segment ax-conversation-text-renderer li{line-height:1.8}.axm-assist-renderer__accordion-group{width:100%}.axm-assist-renderer__collapse-shell{border-radius:.625rem;overflow:hidden;background:rgb(var(--ax-sys-color-lighter-surface))}.axm-assist-renderer__collapse-body{margin:0;padding:0;border-radius:0 0 .5rem .5rem;background:transparent}.axm-assist-renderer__collapse-body>.axm-assist-renderer__agent-live-block--in-accordion{padding-inline:.5rem;padding-block-end:.35rem}.axm-assist-renderer__accordion-header{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.5rem .75rem;cursor:pointer;background:transparent;border:none;border-radius:.625rem .625rem 0 0;transition:background-color .15s ease}.axm-assist-renderer__collapse-shell>.axm-assist-renderer__accordion-header:hover{background:rgb(var(--ax-sys-color-light-surface))}.axm-assist-renderer__accordion-header-main{min-inline-size:0;display:flex;flex-direction:column;gap:.1rem}.axm-assist-renderer__accordion-header-title{font-size:.8125rem;line-height:1.25;font-weight:600;color:rgb(var(--ax-sys-color-on-surface));display:inline-flex;align-items:center;gap:.4rem}.axm-assist-renderer__header-trailing{flex-shrink:0;display:inline-flex;align-items:center;gap:.35rem}.axm-assist-renderer__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: "ngmodule", type: AXCodeEditorModule }, { kind: "component", type: i1$4.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 }); }
|
|
6190
|
+
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:.5rem;padding:.5rem}.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 }); }
|
|
5360
6191
|
}
|
|
5361
6192
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMAssistTranscriptUserLineComponent, decorators: [{
|
|
5362
6193
|
type: Component,
|
|
5363
6194
|
args: [{ selector: 'axm-assist-transcript-user-line', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
|
|
5364
6195
|
AXMNodeMessageRendererComponent,
|
|
5365
6196
|
AXMAssistBotImageLineComponent,
|
|
6197
|
+
AXMAssistSuggestionChipsComponent,
|
|
5366
6198
|
AXCodeEditorModule,
|
|
5367
6199
|
AXPMarkdownViewerComponent,
|
|
5368
6200
|
AXPMarkdownTemplateDirective,
|
|
5369
6201
|
FormsModule,
|
|
5370
|
-
], 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 }\n }\n</div>\n", styles: [".axm-assist-renderer{display:flex;flex-direction:column;gap:.5rem}.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){margin-block:.45rem}.axm-assist-bot__segment ax-conversation-text-renderer li{line-height:1.8}.axm-assist-renderer__accordion-group{width:100%}.axm-assist-renderer__collapse-shell{border-radius:.625rem;overflow:hidden;background:rgb(var(--ax-sys-color-lighter-surface))}.axm-assist-renderer__collapse-body{margin:0;padding:0;border-radius:0 0 .5rem .5rem;background:transparent}.axm-assist-renderer__collapse-body>.axm-assist-renderer__agent-live-block--in-accordion{padding-inline:.5rem;padding-block-end:.35rem}.axm-assist-renderer__accordion-header{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.5rem .75rem;cursor:pointer;background:transparent;border:none;border-radius:.625rem .625rem 0 0;transition:background-color .15s ease}.axm-assist-renderer__collapse-shell>.axm-assist-renderer__accordion-header:hover{background:rgb(var(--ax-sys-color-light-surface))}.axm-assist-renderer__accordion-header-main{min-inline-size:0;display:flex;flex-direction:column;gap:.1rem}.axm-assist-renderer__accordion-header-title{font-size:.8125rem;line-height:1.25;font-weight:600;color:rgb(var(--ax-sys-color-on-surface));display:inline-flex;align-items:center;gap:.4rem}.axm-assist-renderer__header-trailing{flex-shrink:0;display:inline-flex;align-items:center;gap:.35rem}.axm-assist-renderer__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"] }]
|
|
6202
|
+
], 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:.5rem;padding:.5rem}.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"] }]
|
|
5371
6203
|
}], propDecorators: { line: [{ type: i0.Input, args: [{ isSignal: true, alias: "line", required: true }] }], parentMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentMessage", required: true }] }] } });
|
|
5372
6204
|
|
|
5373
6205
|
//#region ---- Imports ----
|
|
@@ -5394,7 +6226,7 @@ async function axmOpenAssistDelegatedAgentDetailDialog(options) {
|
|
|
5394
6226
|
options.translationService.translateAsync('@conversation:chat.assist-renderer.delegated-agent.dialog-title-suffix'),
|
|
5395
6227
|
options.translationService.translateAsync('@conversation:chat.assist-renderer.delegated-agent.transcript-missing'),
|
|
5396
6228
|
]);
|
|
5397
|
-
const comp = (await import('./acorex-modules-conversation-assist-delegated-agent-detail-popup.component-
|
|
6229
|
+
const comp = (await import('./acorex-modules-conversation-assist-delegated-agent-detail-popup.component-Df5LmYZI.mjs'))
|
|
5398
6230
|
.AXMAssistDelegatedAgentDetailPopupComponent;
|
|
5399
6231
|
const data = {
|
|
5400
6232
|
messages: entry?.messages ?? [],
|
|
@@ -5505,7 +6337,7 @@ class AXMAssistMessageRendererComponent {
|
|
|
5505
6337
|
}
|
|
5506
6338
|
const raw = axmReadAssistAiTranscriptRaw(this.message().metadata);
|
|
5507
6339
|
if (raw.length > 0) {
|
|
5508
|
-
return
|
|
6340
|
+
return axmAssistUserFacingPayloadLine(raw);
|
|
5509
6341
|
}
|
|
5510
6342
|
return null;
|
|
5511
6343
|
}, ...(ngDevMode ? [{ debugName: "assistPayloadLine" }] : /* istanbul ignore next */ []));
|
|
@@ -5665,6 +6497,9 @@ class AXMAssistMessageRendererComponent {
|
|
|
5665
6497
|
if (s.type === 'text' || s.type === 'think') {
|
|
5666
6498
|
return s.content.trim().length > 0;
|
|
5667
6499
|
}
|
|
6500
|
+
if (s.type === 'followUp') {
|
|
6501
|
+
return s.content.length > 0;
|
|
6502
|
+
}
|
|
5668
6503
|
return false;
|
|
5669
6504
|
});
|
|
5670
6505
|
if (hasRenderableOutcome) {
|
|
@@ -5681,6 +6516,9 @@ class AXMAssistMessageRendererComponent {
|
|
|
5681
6516
|
if (line.role === 'assistant' && seg.type === 'file') {
|
|
5682
6517
|
return true;
|
|
5683
6518
|
}
|
|
6519
|
+
if (line.role === 'assistant' && seg.type === 'followUp') {
|
|
6520
|
+
return seg.content.length > 0;
|
|
6521
|
+
}
|
|
5684
6522
|
if (line.role === 'tool' && (seg.type === 'tool_result' || seg.type === 'agent_result')) {
|
|
5685
6523
|
return false;
|
|
5686
6524
|
}
|
|
@@ -6022,7 +6860,7 @@ class AXMAssistMessageRendererComponent {
|
|
|
6022
6860
|
}
|
|
6023
6861
|
}
|
|
6024
6862
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMAssistMessageRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
6025
|
-
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() && assistRunDebug(); as dbg) {\n <footer\n class=\"axm-assist-renderer__run-meta-wrap\"\n role=\"region\"\n [attr.aria-label]=\"('@conversation:chat.assist-renderer.aria.run-usage' | translate | async) ?? ''\"\n >\n <div class=\"axm-assist-renderer__accordion-group\" axAccordionGroup [accordion]=\"false\">\n <div\n class=\"axm-assist-renderer__thinking-accordion axm-assist-renderer__collapse-shell axm-assist-renderer__run-meta-accordion !ax-mb-0\"\n axAccordionItem\n #runMetaAcc=\"axAccordionItem\"\n [isCollapsed]=\"assistSectionIsCollapsed(assistRunMetaKey())\"\n (onClick)=\"onAssistAccordionClick($event, assistRunMetaKey())\"\n >\n <div\n class=\"axm-assist-renderer__accordion-header\"\n axAccordionItemHeader\n role=\"button\"\n [attr.aria-expanded]=\"!runMetaAcc.isCollapsed()\"\n >\n <div class=\"axm-assist-renderer__accordion-header-main\">\n <span class=\"axm-assist-renderer__accordion-header-title\">\n <i\n class=\"fa-light fa-chevron-down axm-assist-renderer__thinking-chevron\"\n [class.axm-assist-renderer__thinking-chevron--expanded]=\"!runMetaAcc.isCollapsed()\"\n aria-hidden=\"true\"\n ></i>\n <i class=\"fa-light fa-chart-line axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n {{ '@conversation:chat.assist-renderer.run-meta.title' | translate | async }}\n </span>\n <!-- @if (dbg.modelTitle || dbg.modelEntityId) {\n <span class=\"axm-assist-renderer__run-meta-header-sub\">{{ dbg.modelTitle || dbg.modelEntityId }}</span>\n } -->\n </div>\n </div>\n <div axAccordionItemContent>\n <div class=\"axm-assist-renderer__collapse-body\">\n <div class=\"axm-assist-renderer__run-meta axm-assist-renderer__run-meta--panel\">\n <div class=\"axm-assist-renderer__run-meta-grid\">\n @if (dbg.modelTitle || dbg.modelEntityId) {\n <div class=\"axm-assist-renderer__meta-tile axm-assist-renderer__meta-tile--wide\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@conversation:chat.assist-renderer.run-meta.model' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value\">{{ dbg.modelTitle || dbg.modelEntityId }}</div>\n <!-- @if (dbg.modelTitle && dbg.modelEntityId) {\n <div class=\"axm-assist-renderer__meta-tile-sub\">{{ dbg.modelEntityId }}</div>\n } -->\n </div>\n }\n @if (dbg.durationMs != null) {\n <div class=\"axm-assist-renderer__meta-tile\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@conversation:chat.assist-renderer.run-meta.duration' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value axm-assist-renderer__meta-tile-value--mono\">\n {{ formatAssistRunDuration(dbg.durationMs) }}\n </div>\n </div>\n }\n @if (dbg.usage; as totals) {\n <div class=\"axm-assist-renderer__meta-tile\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@ai-management:chat.usage-prompt' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value axm-assist-renderer__meta-tile-value--mono\">\n {{ totals.promptTokens | number }}\n @if (totals.cachedPromptTokens) {\n <span class=\"axm-assist-renderer__meta-tile-note\">\n (+{{ totals.cachedPromptTokens | number }}\n {{ '@ai-management:chat.usage-cached' | translate | async }})\n </span>\n }\n </div>\n </div>\n <div class=\"axm-assist-renderer__meta-tile\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@ai-management:chat.usage-completion' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value axm-assist-renderer__meta-tile-value--mono\">\n {{ totals.completionTokens | number }}\n </div>\n </div>\n <div class=\"axm-assist-renderer__meta-tile axm-assist-renderer__meta-tile--accent\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@conversation:chat.assist-renderer.run-meta.total-tokens' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value axm-assist-renderer__meta-tile-value--mono\">\n {{ totals.totalTokens | number }}\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </footer>\n }\n</div>\n", styles: [".axm-assist-renderer{display:flex;flex-direction:column;gap:.5rem}.axm-assist-bot,.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){margin-block:.45rem}.axm-assist-bot__segment ax-conversation-text-renderer li{line-height:1.8}.axm-assist-renderer__accordion-group{width:100%}.axm-assist-renderer__collapse-shell{border-radius:.625rem;overflow:hidden;background:rgb(var(--ax-sys-color-lighter-surface))}.axm-assist-renderer__collapse-body{margin:0;padding:0;border-radius:0 0 .5rem .5rem;background:transparent}.axm-assist-renderer__collapse-body>.axm-assist-renderer__agent-live-block--in-accordion{padding-inline:.5rem;padding-block-end:.35rem}.axm-assist-renderer__accordion-header{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.5rem .75rem;cursor:pointer;background:transparent;border:none;border-radius:.625rem .625rem 0 0;transition:background-color .15s ease}.axm-assist-renderer__collapse-shell>.axm-assist-renderer__accordion-header:hover{background:rgb(var(--ax-sys-color-light-surface))}.axm-assist-renderer__accordion-header-main{min-inline-size:0;display:flex;flex-direction:column;gap:.1rem}.axm-assist-renderer__accordion-header-title{font-size:.8125rem;line-height:1.25;font-weight:600;color:rgb(var(--ax-sys-color-on-surface));display:inline-flex;align-items:center;gap:.4rem}.axm-assist-renderer__header-trailing{flex-shrink:0;display:inline-flex;align-items:center;gap:.35rem}.axm-assist-renderer__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: "ngmodule", type: AXAccordionCdkModule }, { kind: "directive", type: i1$5.AXAccordionGroupDirective, selector: "[axAccordionGroup]", inputs: ["accordion", "activeIndex", "collapsedOnItemClick"], exportAs: ["axAccordionGroup"] }, { kind: "directive", type: i1$5.AXAccordionItemContentDirective, selector: "[axAccordionItemContent]", inputs: ["transition"], exportAs: ["axAccordionItemContent"] }, { kind: "directive", type: i1$5.AXAccordionItemHeaderDirective, selector: "[axAccordionItemHeader]", exportAs: ["axAccordionItemHeader"] }, { kind: "directive", type: i1$5.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$4.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 }); }
|
|
6863
|
+
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 === 'assistant' && seg.type === 'followUp') {\n <div class=\"axm-assist-bot__segment\" dir=\"auto\">\n <axm-assist-suggestion-chips [items]=\"seg.content\" />\n </div>\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() && assistRunDebug(); as dbg) {\n <footer\n class=\"axm-assist-renderer__run-meta-wrap\"\n role=\"region\"\n [attr.aria-label]=\"('@conversation:chat.assist-renderer.aria.run-usage' | translate | async) ?? ''\"\n >\n <div class=\"axm-assist-renderer__accordion-group\" axAccordionGroup [accordion]=\"false\">\n <div\n class=\"axm-assist-renderer__thinking-accordion axm-assist-renderer__collapse-shell axm-assist-renderer__run-meta-accordion !ax-mb-0\"\n axAccordionItem\n #runMetaAcc=\"axAccordionItem\"\n [isCollapsed]=\"assistSectionIsCollapsed(assistRunMetaKey())\"\n (onClick)=\"onAssistAccordionClick($event, assistRunMetaKey())\"\n >\n <div\n class=\"axm-assist-renderer__accordion-header\"\n axAccordionItemHeader\n role=\"button\"\n [attr.aria-expanded]=\"!runMetaAcc.isCollapsed()\"\n >\n <div class=\"axm-assist-renderer__accordion-header-main\">\n <span class=\"axm-assist-renderer__accordion-header-title\">\n <i\n class=\"fa-light fa-chevron-down axm-assist-renderer__thinking-chevron\"\n [class.axm-assist-renderer__thinking-chevron--expanded]=\"!runMetaAcc.isCollapsed()\"\n aria-hidden=\"true\"\n ></i>\n <i class=\"fa-light fa-chart-line axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n {{ '@conversation:chat.assist-renderer.run-meta.title' | translate | async }}\n </span>\n <!-- @if (dbg.modelTitle || dbg.modelEntityId) {\n <span class=\"axm-assist-renderer__run-meta-header-sub\">{{ dbg.modelTitle || dbg.modelEntityId }}</span>\n } -->\n </div>\n </div>\n <div axAccordionItemContent>\n <div class=\"axm-assist-renderer__collapse-body\">\n <div class=\"axm-assist-renderer__run-meta axm-assist-renderer__run-meta--panel\">\n <div class=\"axm-assist-renderer__run-meta-grid\">\n @if (dbg.modelTitle || dbg.modelEntityId) {\n <div class=\"axm-assist-renderer__meta-tile axm-assist-renderer__meta-tile--wide\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@conversation:chat.assist-renderer.run-meta.model' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value\">{{ dbg.modelTitle || dbg.modelEntityId }}</div>\n <!-- @if (dbg.modelTitle && dbg.modelEntityId) {\n <div class=\"axm-assist-renderer__meta-tile-sub\">{{ dbg.modelEntityId }}</div>\n } -->\n </div>\n }\n @if (dbg.durationMs != null) {\n <div class=\"axm-assist-renderer__meta-tile\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@conversation:chat.assist-renderer.run-meta.duration' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value axm-assist-renderer__meta-tile-value--mono\">\n {{ formatAssistRunDuration(dbg.durationMs) }}\n </div>\n </div>\n }\n @if (dbg.usage; as totals) {\n <div class=\"axm-assist-renderer__meta-tile\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@ai-management:chat.usage-prompt' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value axm-assist-renderer__meta-tile-value--mono\">\n {{ totals.promptTokens | number }}\n @if (totals.cachedPromptTokens) {\n <span class=\"axm-assist-renderer__meta-tile-note\">\n (+{{ totals.cachedPromptTokens | number }}\n {{ '@ai-management:chat.usage-cached' | translate | async }})\n </span>\n }\n </div>\n </div>\n <div class=\"axm-assist-renderer__meta-tile\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@ai-management:chat.usage-completion' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value axm-assist-renderer__meta-tile-value--mono\">\n {{ totals.completionTokens | number }}\n </div>\n </div>\n <div class=\"axm-assist-renderer__meta-tile axm-assist-renderer__meta-tile--accent\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@conversation:chat.assist-renderer.run-meta.total-tokens' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value axm-assist-renderer__meta-tile-value--mono\">\n {{ totals.totalTokens | number }}\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </footer>\n }\n</div>\n", styles: [".axm-assist-renderer{display:flex;flex-direction:column;gap:.5rem;padding:.5rem}.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 }); }
|
|
6026
6864
|
}
|
|
6027
6865
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMAssistMessageRendererComponent, decorators: [{
|
|
6028
6866
|
type: Component,
|
|
@@ -6031,6 +6869,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
6031
6869
|
AXMNodeMessageRendererComponent,
|
|
6032
6870
|
AXMAssistTranscriptUserLineComponent,
|
|
6033
6871
|
AXMAssistBotImageLineComponent,
|
|
6872
|
+
AXMAssistSuggestionChipsComponent,
|
|
6034
6873
|
AXAccordionCdkModule,
|
|
6035
6874
|
AXButtonModule,
|
|
6036
6875
|
AXCodeEditorModule,
|
|
@@ -6040,7 +6879,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
6040
6879
|
AXTranslationModule,
|
|
6041
6880
|
AsyncPipe,
|
|
6042
6881
|
DecimalPipe,
|
|
6043
|
-
], 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() && assistRunDebug(); as dbg) {\n <footer\n class=\"axm-assist-renderer__run-meta-wrap\"\n role=\"region\"\n [attr.aria-label]=\"('@conversation:chat.assist-renderer.aria.run-usage' | translate | async) ?? ''\"\n >\n <div class=\"axm-assist-renderer__accordion-group\" axAccordionGroup [accordion]=\"false\">\n <div\n class=\"axm-assist-renderer__thinking-accordion axm-assist-renderer__collapse-shell axm-assist-renderer__run-meta-accordion !ax-mb-0\"\n axAccordionItem\n #runMetaAcc=\"axAccordionItem\"\n [isCollapsed]=\"assistSectionIsCollapsed(assistRunMetaKey())\"\n (onClick)=\"onAssistAccordionClick($event, assistRunMetaKey())\"\n >\n <div\n class=\"axm-assist-renderer__accordion-header\"\n axAccordionItemHeader\n role=\"button\"\n [attr.aria-expanded]=\"!runMetaAcc.isCollapsed()\"\n >\n <div class=\"axm-assist-renderer__accordion-header-main\">\n <span class=\"axm-assist-renderer__accordion-header-title\">\n <i\n class=\"fa-light fa-chevron-down axm-assist-renderer__thinking-chevron\"\n [class.axm-assist-renderer__thinking-chevron--expanded]=\"!runMetaAcc.isCollapsed()\"\n aria-hidden=\"true\"\n ></i>\n <i class=\"fa-light fa-chart-line axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n {{ '@conversation:chat.assist-renderer.run-meta.title' | translate | async }}\n </span>\n <!-- @if (dbg.modelTitle || dbg.modelEntityId) {\n <span class=\"axm-assist-renderer__run-meta-header-sub\">{{ dbg.modelTitle || dbg.modelEntityId }}</span>\n } -->\n </div>\n </div>\n <div axAccordionItemContent>\n <div class=\"axm-assist-renderer__collapse-body\">\n <div class=\"axm-assist-renderer__run-meta axm-assist-renderer__run-meta--panel\">\n <div class=\"axm-assist-renderer__run-meta-grid\">\n @if (dbg.modelTitle || dbg.modelEntityId) {\n <div class=\"axm-assist-renderer__meta-tile axm-assist-renderer__meta-tile--wide\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@conversation:chat.assist-renderer.run-meta.model' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value\">{{ dbg.modelTitle || dbg.modelEntityId }}</div>\n <!-- @if (dbg.modelTitle && dbg.modelEntityId) {\n <div class=\"axm-assist-renderer__meta-tile-sub\">{{ dbg.modelEntityId }}</div>\n } -->\n </div>\n }\n @if (dbg.durationMs != null) {\n <div class=\"axm-assist-renderer__meta-tile\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@conversation:chat.assist-renderer.run-meta.duration' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value axm-assist-renderer__meta-tile-value--mono\">\n {{ formatAssistRunDuration(dbg.durationMs) }}\n </div>\n </div>\n }\n @if (dbg.usage; as totals) {\n <div class=\"axm-assist-renderer__meta-tile\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@ai-management:chat.usage-prompt' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value axm-assist-renderer__meta-tile-value--mono\">\n {{ totals.promptTokens | number }}\n @if (totals.cachedPromptTokens) {\n <span class=\"axm-assist-renderer__meta-tile-note\">\n (+{{ totals.cachedPromptTokens | number }}\n {{ '@ai-management:chat.usage-cached' | translate | async }})\n </span>\n }\n </div>\n </div>\n <div class=\"axm-assist-renderer__meta-tile\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@ai-management:chat.usage-completion' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value axm-assist-renderer__meta-tile-value--mono\">\n {{ totals.completionTokens | number }}\n </div>\n </div>\n <div class=\"axm-assist-renderer__meta-tile axm-assist-renderer__meta-tile--accent\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@conversation:chat.assist-renderer.run-meta.total-tokens' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value axm-assist-renderer__meta-tile-value--mono\">\n {{ totals.totalTokens | number }}\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </footer>\n }\n</div>\n", styles: [".axm-assist-renderer{display:flex;flex-direction:column;gap:.5rem}.axm-assist-bot,.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){margin-block:.45rem}.axm-assist-bot__segment ax-conversation-text-renderer li{line-height:1.8}.axm-assist-renderer__accordion-group{width:100%}.axm-assist-renderer__collapse-shell{border-radius:.625rem;overflow:hidden;background:rgb(var(--ax-sys-color-lighter-surface))}.axm-assist-renderer__collapse-body{margin:0;padding:0;border-radius:0 0 .5rem .5rem;background:transparent}.axm-assist-renderer__collapse-body>.axm-assist-renderer__agent-live-block--in-accordion{padding-inline:.5rem;padding-block-end:.35rem}.axm-assist-renderer__accordion-header{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.5rem .75rem;cursor:pointer;background:transparent;border:none;border-radius:.625rem .625rem 0 0;transition:background-color .15s ease}.axm-assist-renderer__collapse-shell>.axm-assist-renderer__accordion-header:hover{background:rgb(var(--ax-sys-color-light-surface))}.axm-assist-renderer__accordion-header-main{min-inline-size:0;display:flex;flex-direction:column;gap:.1rem}.axm-assist-renderer__accordion-header-title{font-size:.8125rem;line-height:1.25;font-weight:600;color:rgb(var(--ax-sys-color-on-surface));display:inline-flex;align-items:center;gap:.4rem}.axm-assist-renderer__header-trailing{flex-shrink:0;display:inline-flex;align-items:center;gap:.35rem}.axm-assist-renderer__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"] }]
|
|
6882
|
+
], 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 === 'assistant' && seg.type === 'followUp') {\n <div class=\"axm-assist-bot__segment\" dir=\"auto\">\n <axm-assist-suggestion-chips [items]=\"seg.content\" />\n </div>\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() && assistRunDebug(); as dbg) {\n <footer\n class=\"axm-assist-renderer__run-meta-wrap\"\n role=\"region\"\n [attr.aria-label]=\"('@conversation:chat.assist-renderer.aria.run-usage' | translate | async) ?? ''\"\n >\n <div class=\"axm-assist-renderer__accordion-group\" axAccordionGroup [accordion]=\"false\">\n <div\n class=\"axm-assist-renderer__thinking-accordion axm-assist-renderer__collapse-shell axm-assist-renderer__run-meta-accordion !ax-mb-0\"\n axAccordionItem\n #runMetaAcc=\"axAccordionItem\"\n [isCollapsed]=\"assistSectionIsCollapsed(assistRunMetaKey())\"\n (onClick)=\"onAssistAccordionClick($event, assistRunMetaKey())\"\n >\n <div\n class=\"axm-assist-renderer__accordion-header\"\n axAccordionItemHeader\n role=\"button\"\n [attr.aria-expanded]=\"!runMetaAcc.isCollapsed()\"\n >\n <div class=\"axm-assist-renderer__accordion-header-main\">\n <span class=\"axm-assist-renderer__accordion-header-title\">\n <i\n class=\"fa-light fa-chevron-down axm-assist-renderer__thinking-chevron\"\n [class.axm-assist-renderer__thinking-chevron--expanded]=\"!runMetaAcc.isCollapsed()\"\n aria-hidden=\"true\"\n ></i>\n <i class=\"fa-light fa-chart-line axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n {{ '@conversation:chat.assist-renderer.run-meta.title' | translate | async }}\n </span>\n <!-- @if (dbg.modelTitle || dbg.modelEntityId) {\n <span class=\"axm-assist-renderer__run-meta-header-sub\">{{ dbg.modelTitle || dbg.modelEntityId }}</span>\n } -->\n </div>\n </div>\n <div axAccordionItemContent>\n <div class=\"axm-assist-renderer__collapse-body\">\n <div class=\"axm-assist-renderer__run-meta axm-assist-renderer__run-meta--panel\">\n <div class=\"axm-assist-renderer__run-meta-grid\">\n @if (dbg.modelTitle || dbg.modelEntityId) {\n <div class=\"axm-assist-renderer__meta-tile axm-assist-renderer__meta-tile--wide\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@conversation:chat.assist-renderer.run-meta.model' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value\">{{ dbg.modelTitle || dbg.modelEntityId }}</div>\n <!-- @if (dbg.modelTitle && dbg.modelEntityId) {\n <div class=\"axm-assist-renderer__meta-tile-sub\">{{ dbg.modelEntityId }}</div>\n } -->\n </div>\n }\n @if (dbg.durationMs != null) {\n <div class=\"axm-assist-renderer__meta-tile\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@conversation:chat.assist-renderer.run-meta.duration' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value axm-assist-renderer__meta-tile-value--mono\">\n {{ formatAssistRunDuration(dbg.durationMs) }}\n </div>\n </div>\n }\n @if (dbg.usage; as totals) {\n <div class=\"axm-assist-renderer__meta-tile\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@ai-management:chat.usage-prompt' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value axm-assist-renderer__meta-tile-value--mono\">\n {{ totals.promptTokens | number }}\n @if (totals.cachedPromptTokens) {\n <span class=\"axm-assist-renderer__meta-tile-note\">\n (+{{ totals.cachedPromptTokens | number }}\n {{ '@ai-management:chat.usage-cached' | translate | async }})\n </span>\n }\n </div>\n </div>\n <div class=\"axm-assist-renderer__meta-tile\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@ai-management:chat.usage-completion' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value axm-assist-renderer__meta-tile-value--mono\">\n {{ totals.completionTokens | number }}\n </div>\n </div>\n <div class=\"axm-assist-renderer__meta-tile axm-assist-renderer__meta-tile--accent\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@conversation:chat.assist-renderer.run-meta.total-tokens' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value axm-assist-renderer__meta-tile-value--mono\">\n {{ totals.totalTokens | number }}\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </footer>\n }\n</div>\n", styles: [".axm-assist-renderer{display:flex;flex-direction:column;gap:.5rem;padding:.5rem}.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"] }]
|
|
6044
6883
|
}], propDecorators: { message: [{ type: i0.Input, args: [{ isSignal: true, alias: "message", required: true }] }] } });
|
|
6045
6884
|
|
|
6046
6885
|
/**
|
|
@@ -6211,7 +7050,7 @@ const AXM_CHAT_CONVERSATION2_PROVIDERS = [
|
|
|
6211
7050
|
AX_CONVERSATION_IMAGE_RENDERER,
|
|
6212
7051
|
AX_CONVERSATION_VIDEO_RENDERER,
|
|
6213
7052
|
AX_CONVERSATION_AUDIO_RENDERER,
|
|
6214
|
-
AX_CONVERSATION_VOICE_RENDERER,
|
|
7053
|
+
{ ...AX_CONVERSATION_VOICE_RENDERER, composerActions: [AXM_CHAT_COMPOSER_VOICE_RECORDING_ACTION] },
|
|
6215
7054
|
AX_CONVERSATION_FILE_RENDERER,
|
|
6216
7055
|
AX_CONVERSATION_LOCATION_RENDERER,
|
|
6217
7056
|
AX_CONVERSATION_STICKER_RENDERER,
|
|
@@ -6246,7 +7085,6 @@ const AXM_CHAT_CONVERSATION2_PROVIDERS = [
|
|
|
6246
7085
|
AX_CONVERSATION_COMPOSER_IMAGE_ACTION,
|
|
6247
7086
|
AX_CONVERSATION_COMPOSER_VIDEO_ACTION,
|
|
6248
7087
|
AX_CONVERSATION_COMPOSER_FILE_ACTION,
|
|
6249
|
-
AX_CONVERSATION_COMPOSER_VOICE_RECORDING_ACTION,
|
|
6250
7088
|
AX_CONVERSATION_COMPOSER_AUDIO_ACTION,
|
|
6251
7089
|
AX_CONVERSATION_COMPOSER_LOCATION_ACTION,
|
|
6252
7090
|
],
|
|
@@ -6441,7 +7279,7 @@ class AXMCommentsPageComponentProvider {
|
|
|
6441
7279
|
return [
|
|
6442
7280
|
{
|
|
6443
7281
|
key: COMMENTS_PAGE_COMPONENT_KEY,
|
|
6444
|
-
loader: () => import('./acorex-modules-conversation-comments-page.component-
|
|
7282
|
+
loader: () => import('./acorex-modules-conversation-comments-page.component-BXI4smIr.mjs').then((m) => m.AXMCommentsPageComponent),
|
|
6445
7283
|
},
|
|
6446
7284
|
];
|
|
6447
7285
|
}
|
|
@@ -6528,7 +7366,7 @@ function routesFactory() {
|
|
|
6528
7366
|
}
|
|
6529
7367
|
class AXMConversationModule {
|
|
6530
7368
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMConversationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
6531
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: AXMConversationModule, imports: [AXPWidgetCoreModule, i1$
|
|
7369
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: AXMConversationModule, imports: [AXPWidgetCoreModule, i1$5.AXPWorkflowModule,
|
|
6532
7370
|
// Entity Modules
|
|
6533
7371
|
AXMConversationTabEntityModule,
|
|
6534
7372
|
AXMRoomEntityModule,
|
|
@@ -6620,7 +7458,11 @@ class AXMConversationModule {
|
|
|
6620
7458
|
provideCommandSetups([
|
|
6621
7459
|
{
|
|
6622
7460
|
key: CONVERSATION_START_ASSIST_CHAT_COMMAND,
|
|
6623
|
-
command: () => import('./acorex-modules-conversation-start-assist-chat.command-
|
|
7461
|
+
command: () => import('./acorex-modules-conversation-start-assist-chat.command-DI3LAaDF.mjs').then((m) => m.AXMConversationStartAssistChatCommand),
|
|
7462
|
+
},
|
|
7463
|
+
{
|
|
7464
|
+
key: CONVERSATION_SEND_ASSIST_CHAT_MESSAGE_COMMAND,
|
|
7465
|
+
command: () => import('./acorex-modules-conversation-send-assist-chat-message.command-B5qJnpCK.mjs').then((m) => m.AXMConversationSendAssistChatMessageCommand),
|
|
6624
7466
|
},
|
|
6625
7467
|
]),
|
|
6626
7468
|
], imports: [AXPWidgetCoreModule,
|
|
@@ -6747,7 +7589,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
6747
7589
|
provideCommandSetups([
|
|
6748
7590
|
{
|
|
6749
7591
|
key: CONVERSATION_START_ASSIST_CHAT_COMMAND,
|
|
6750
|
-
command: () => import('./acorex-modules-conversation-start-assist-chat.command-
|
|
7592
|
+
command: () => import('./acorex-modules-conversation-start-assist-chat.command-DI3LAaDF.mjs').then((m) => m.AXMConversationStartAssistChatCommand),
|
|
7593
|
+
},
|
|
7594
|
+
{
|
|
7595
|
+
key: CONVERSATION_SEND_ASSIST_CHAT_MESSAGE_COMMAND,
|
|
7596
|
+
command: () => import('./acorex-modules-conversation-send-assist-chat-message.command-B5qJnpCK.mjs').then((m) => m.AXMConversationSendAssistChatMessageCommand),
|
|
6751
7597
|
},
|
|
6752
7598
|
]),
|
|
6753
7599
|
],
|
|
@@ -6758,5 +7604,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
6758
7604
|
* Generated bundle index. Do not edit.
|
|
6759
7605
|
*/
|
|
6760
7606
|
|
|
6761
|
-
export {
|
|
6762
|
-
//# sourceMappingURL=acorex-modules-conversation-acorex-modules-conversation-
|
|
7607
|
+
export { axmReadAssistAiTranscript as $, AXMChatAssistLauncherService as A, AXMCommentWidgetViewComponent as B, CONVERSATION_SEND_ASSIST_CHAT_MESSAGE_COMMAND as C, AXMConversationModule as D, AXMConversationTabEntityModule as E, AXMConversationTabService as F, AXMConversationTabServiceImpl as G, AXMMessageEntityModule as H, AXMMessageService as I, AXMMessageServiceImpl as J, AXMPermissionsKeys as K, AXMRoomEntityModule as L, AXMRoomService as M, AXMRoomServiceImpl as N, AXM_ASSIST_TRANSCRIPT_LINE_PAYLOAD_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, roomFactory as a3, tabFactory as a4, axmAssistSegmentDirection as b, axmParseAssistTranscriptTextEnvelope as c, axmAssistWidgetNodeFromUnknown as d, axmSyntheticEmbedMessage as e, AXMNodeMessageRendererComponent as f, AXMAssistBotImageLineComponent as g, AXMAssistSuggestionChipsComponent as h, AXMChatComponent as i, AXMChatConversationApi as j, AXMChatManagementService as k, AXMChatMessageApi as l, AXMChatRealtimeApi as m, AXMChatRealtimeService as n, AXMChatRealtimeServiceImpl as o, AXMChatService as p, AXMChatServiceImpl as q, AXMChatUserApi as r, AXMCommentManagementService as s, AXMCommentPopupComponent as t, AXMCommentPopupStartAction as u, AXMCommentPopupWorkflow as v, AXMCommentRealtimeService as w, AXMCommentRealtimeServiceImpl as x, AXMCommentService as y, AXMCommentServiceImpl as z };
|
|
7608
|
+
//# sourceMappingURL=acorex-modules-conversation-acorex-modules-conversation-Bnjyq-wp.mjs.map
|