@futdevpro/ccap 1.1.3020 → 1.1.3029
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/client-dist/{agent-instances.module-QJYTOFVD.js → agent-instances.module-ZEDAGCTO.js} +2 -2
- package/client-dist/{ca.module-V6FHCYQZ.js → ca.module-PGILVKST.js} +2 -2
- package/client-dist/{cc-usage-dashboard.component-KKBXRYK2.js → cc-usage-dashboard.component-HW55BF7X.js} +2 -2
- package/client-dist/{cc.module-TWMW5L4N.js → cc.module-FWD5FAE2.js} +2 -2
- package/client-dist/{chunk-MNSQBWJT.js → chunk-2E5MEUC6.js} +2 -2
- package/client-dist/{chunk-IQY4KZS6.js → chunk-2HOSTFZM.js} +2 -2
- package/client-dist/{chunk-EHUUQ4OK.js → chunk-2QKSYFBS.js} +2 -2
- package/client-dist/{chunk-BXG7G2X6.js → chunk-3COYWANK.js} +2 -2
- package/client-dist/{chunk-6NBGNC3H.js → chunk-3CSKYOXL.js} +2 -2
- package/client-dist/{chunk-RKSXVMK3.js → chunk-3LQ5ZNQK.js} +2 -2
- package/client-dist/{chunk-2DVBHA4Z.js → chunk-4AMEHBWO.js} +2 -2
- package/client-dist/{chunk-OI272NTT.js → chunk-57RXVP5S.js} +2 -2
- package/client-dist/{chunk-64BJE4DK.js → chunk-5WWTZ2LQ.js} +2 -2
- package/client-dist/{chunk-FWKJUH2U.js → chunk-6NKAOL4H.js} +2 -2
- package/client-dist/{chunk-LFUANSXL.js → chunk-7O5Q7ZE5.js} +2 -2
- package/client-dist/{chunk-6AZPCJZH.js → chunk-AFMSZ2A4.js} +2 -2
- package/client-dist/{chunk-V675ASMV.js → chunk-AMUBZLYY.js} +2 -2
- package/client-dist/{chunk-XVDUJ377.js → chunk-ATCDMHJZ.js} +2 -2
- package/client-dist/{chunk-KCRKTCBJ.js → chunk-B5OAVRIE.js} +2 -2
- package/client-dist/{chunk-BHLFSRHB.js → chunk-CPT4H4CB.js} +2 -2
- package/client-dist/{chunk-6YEOZ4N2.js → chunk-E4MCYQLX.js} +2 -2
- package/client-dist/{chunk-23CFTV2G.js → chunk-EPQSURW3.js} +3 -3
- package/client-dist/{chunk-23CFTV2G.js.map → chunk-EPQSURW3.js.map} +4 -4
- package/client-dist/{chunk-LPEBEZLT.js → chunk-F7CCYE3D.js} +2 -2
- package/client-dist/{chunk-AMWUKLOU.js → chunk-F7EMYMLE.js} +2 -2
- package/client-dist/{chunk-CZCAVIJH.js → chunk-FES32KDN.js} +2 -2
- package/client-dist/{chunk-Y3RRN6DW.js → chunk-GC7C3V7Z.js} +2 -2
- package/client-dist/{chunk-BB7FGQZ6.js → chunk-HOPBJ2PM.js} +2 -2
- package/client-dist/{chunk-4WXLIFZO.js → chunk-ISSG57FN.js} +2 -2
- package/client-dist/{chunk-NU2KNJJR.js → chunk-JC5YKRA2.js} +2 -2
- package/client-dist/{chunk-UTLVTJDS.js → chunk-JIVE4XG6.js} +2 -2
- package/client-dist/{chunk-7ZGELPVY.js → chunk-K5ULMCZN.js} +2 -2
- package/client-dist/{chunk-3RSQSP4C.js → chunk-KKBOPOS7.js} +2 -2
- package/client-dist/{chunk-ML4DFCM7.js → chunk-KMDWVDZN.js} +2 -2
- package/client-dist/{chunk-H72IPZYU.js → chunk-KMQOD27X.js} +2 -2
- package/client-dist/{chunk-EDVIWTET.js → chunk-KQ62B5RJ.js} +2 -2
- package/client-dist/{chunk-EDVIWTET.js.map → chunk-KQ62B5RJ.js.map} +1 -1
- package/client-dist/{chunk-EZVZVLJ5.js → chunk-KRDY4QE4.js} +2 -2
- package/client-dist/{chunk-SXNYAZ4X.js → chunk-KVLIWG6J.js} +2 -2
- package/client-dist/{chunk-HLDXMJXQ.js → chunk-LFUSTUZT.js} +2 -2
- package/client-dist/{chunk-3AX4B4S2.js → chunk-LYGC4TVK.js} +2 -2
- package/client-dist/{chunk-SHV4JGOU.js → chunk-NMWXUTFQ.js} +2 -2
- package/client-dist/{chunk-DCWGOTWA.js → chunk-ODNT6WDP.js} +2 -2
- package/client-dist/{chunk-W7SAAPHP.js → chunk-Q4MVYEES.js} +2 -2
- package/client-dist/{chunk-T2GOFY7H.js → chunk-Q5KLVNNE.js} +2 -2
- package/client-dist/{chunk-C7INBKQK.js → chunk-QMPZ46LB.js} +2 -2
- package/client-dist/{chunk-DNRMCCHG.js → chunk-QUFSDVHR.js} +2 -2
- package/client-dist/{chunk-QV3SDDFJ.js → chunk-RCRXEUZM.js} +2 -2
- package/client-dist/{chunk-CXIYKPBA.js → chunk-RMJTPSHP.js} +2 -2
- package/client-dist/{chunk-OXDWH3A2.js → chunk-RWNN5KRV.js} +2 -2
- package/client-dist/{chunk-JUK4XI7S.js → chunk-RZY5FFKY.js} +2 -2
- package/client-dist/{chunk-JUK4XI7S.js.map → chunk-RZY5FFKY.js.map} +1 -1
- package/client-dist/{chunk-W2SLMCXE.js → chunk-SREB74HR.js} +2 -2
- package/client-dist/{chunk-67F7P6KL.js → chunk-TLAPOIAO.js} +2 -2
- package/client-dist/{chunk-FQHJM7LJ.js → chunk-TTI6NQVT.js} +2 -2
- package/client-dist/{chunk-QPQEQKWT.js → chunk-UHRVQGRT.js} +2 -2
- package/client-dist/{chunk-PEGIXIM2.js → chunk-W36ACK74.js} +2 -2
- package/client-dist/{chunk-LDJGPMMN.js → chunk-W3AWLRVB.js} +2 -2
- package/client-dist/{chunk-MAA7SWVG.js → chunk-WETMMHZO.js} +2 -2
- package/client-dist/{chunk-H3DS6OH7.js → chunk-WF6HPH3A.js} +2 -2
- package/client-dist/{chunk-YQD6EY4L.js → chunk-WIWLBRQI.js} +2 -2
- package/client-dist/{chunk-H4ZDV4Z3.js → chunk-ZBEUOVWM.js} +2 -2
- package/client-dist/{chunk-YGFCHNXR.js → chunk-ZYHUZVCB.js} +2 -2
- package/client-dist/{consultant.module-LQMXZENA.js → consultant.module-IBY4ZJRF.js} +2 -2
- package/client-dist/{consultant.module-LQMXZENA.js.map → consultant.module-IBY4ZJRF.js.map} +2 -2
- package/client-dist/{crd.module-WGQKKE3M.js → crd.module-XJ435KXN.js} +2 -2
- package/client-dist/{dashboard.module-C4WZIP4Y.js → dashboard.module-NUTWD5IC.js} +2 -2
- package/client-dist/{do.module-CAPIRHU6.js → do.module-C2QZR75Z.js} +2 -2
- package/client-dist/{document-library.module-IPYWYSAQ.js → document-library.module-OGNPLK6G.js} +2 -2
- package/client-dist/{embedding-eval.module-3QA5HRDF.js → embedding-eval.module-66JRL7MA.js} +2 -2
- package/client-dist/{embedding-registry.module-LM26SUUJ.js → embedding-registry.module-JHKAP6KF.js} +2 -2
- package/client-dist/{err.module-IZTPG7LQ.js → err.module-TK43XPZB.js} +2 -2
- package/client-dist/{feedback.module-MX4GLRZK.js → feedback.module-7R5EBLO4.js} +2 -2
- package/client-dist/{host-runtime-mcp.module-6KK7IW7M.js → host-runtime-mcp.module-SUOQT2ZI.js} +2 -2
- package/client-dist/index.html +1 -1
- package/client-dist/{live-dev-pipeline.module-KHZRQJ4E.js → live-dev-pipeline.module-CHSRLAND.js} +2 -2
- package/client-dist/{logs.module-GCB2VJNV.js → logs.module-MC4V6CB2.js} +2 -2
- package/client-dist/{main-ZW4FR256.js → main-RS7R4GTV.js} +3 -3
- package/client-dist/{master-control-remote-poc.module-GKP2IF4U.js → master-control-remote-poc.module-SREH7RYL.js} +2 -2
- package/client-dist/{mobile-app.module-JOXNLUM2.js → mobile-app.module-2A5OJQ46.js} +2 -2
- package/client-dist/{model-registry.module-KRFLXT23.js → model-registry.module-XIOF6NIA.js} +2 -2
- package/client-dist/{oc.module-ZQV6ELSQ.js → oc.module-MVIAO2U2.js} +2 -2
- package/client-dist/{orc.module-BOS7IKQO.js → orc.module-T4VFJF4P.js} +2 -2
- package/client-dist/{project-management.module-54PADR43.js → project-management.module-LRYIMGFZ.js} +2 -2
- package/client-dist/project-source-routed.module-FVGM4IBL.js +2 -0
- package/client-dist/{scheduler.module-Z2HR2ZZQ.js → scheduler.module-5VRTICQ7.js} +2 -2
- package/client-dist/{session.module-HYDKLM4I.js → session.module-N3QOIA3B.js} +2 -2
- package/client-dist/{set.module-MY7SOS6L.js → set.module-3LY5JECS.js} +2 -2
- package/client-dist/{setup.module-JEOJCKS5.js → setup.module-IVQJMJMO.js} +2 -2
- package/client-dist/{terminals.module-SFUXL6IK.js → terminals.module-TDVJE7TG.js} +2 -2
- package/client-dist/{voice-notes-poc.module-T6WAIRNR.js → voice-notes-poc.module-KD4FX6MQ.js} +2 -2
- package/client-dist/{wfs.module-SBGLOPUM.js → wfs.module-7FFTZILZ.js} +2 -2
- package/package.json +1 -1
- package/client-dist/project-source-routed.module-XPZTKJ4O.js +0 -2
- /package/client-dist/{agent-instances.module-QJYTOFVD.js.map → agent-instances.module-ZEDAGCTO.js.map} +0 -0
- /package/client-dist/{ca.module-V6FHCYQZ.js.map → ca.module-PGILVKST.js.map} +0 -0
- /package/client-dist/{cc-usage-dashboard.component-KKBXRYK2.js.map → cc-usage-dashboard.component-HW55BF7X.js.map} +0 -0
- /package/client-dist/{cc.module-TWMW5L4N.js.map → cc.module-FWD5FAE2.js.map} +0 -0
- /package/client-dist/{chunk-MNSQBWJT.js.map → chunk-2E5MEUC6.js.map} +0 -0
- /package/client-dist/{chunk-IQY4KZS6.js.map → chunk-2HOSTFZM.js.map} +0 -0
- /package/client-dist/{chunk-EHUUQ4OK.js.map → chunk-2QKSYFBS.js.map} +0 -0
- /package/client-dist/{chunk-BXG7G2X6.js.map → chunk-3COYWANK.js.map} +0 -0
- /package/client-dist/{chunk-6NBGNC3H.js.map → chunk-3CSKYOXL.js.map} +0 -0
- /package/client-dist/{chunk-RKSXVMK3.js.map → chunk-3LQ5ZNQK.js.map} +0 -0
- /package/client-dist/{chunk-2DVBHA4Z.js.map → chunk-4AMEHBWO.js.map} +0 -0
- /package/client-dist/{chunk-OI272NTT.js.map → chunk-57RXVP5S.js.map} +0 -0
- /package/client-dist/{chunk-64BJE4DK.js.map → chunk-5WWTZ2LQ.js.map} +0 -0
- /package/client-dist/{chunk-FWKJUH2U.js.map → chunk-6NKAOL4H.js.map} +0 -0
- /package/client-dist/{chunk-LFUANSXL.js.map → chunk-7O5Q7ZE5.js.map} +0 -0
- /package/client-dist/{chunk-6AZPCJZH.js.map → chunk-AFMSZ2A4.js.map} +0 -0
- /package/client-dist/{chunk-V675ASMV.js.map → chunk-AMUBZLYY.js.map} +0 -0
- /package/client-dist/{chunk-XVDUJ377.js.map → chunk-ATCDMHJZ.js.map} +0 -0
- /package/client-dist/{chunk-KCRKTCBJ.js.map → chunk-B5OAVRIE.js.map} +0 -0
- /package/client-dist/{chunk-BHLFSRHB.js.map → chunk-CPT4H4CB.js.map} +0 -0
- /package/client-dist/{chunk-6YEOZ4N2.js.map → chunk-E4MCYQLX.js.map} +0 -0
- /package/client-dist/{chunk-LPEBEZLT.js.map → chunk-F7CCYE3D.js.map} +0 -0
- /package/client-dist/{chunk-AMWUKLOU.js.map → chunk-F7EMYMLE.js.map} +0 -0
- /package/client-dist/{chunk-CZCAVIJH.js.map → chunk-FES32KDN.js.map} +0 -0
- /package/client-dist/{chunk-Y3RRN6DW.js.map → chunk-GC7C3V7Z.js.map} +0 -0
- /package/client-dist/{chunk-BB7FGQZ6.js.map → chunk-HOPBJ2PM.js.map} +0 -0
- /package/client-dist/{chunk-4WXLIFZO.js.map → chunk-ISSG57FN.js.map} +0 -0
- /package/client-dist/{chunk-NU2KNJJR.js.map → chunk-JC5YKRA2.js.map} +0 -0
- /package/client-dist/{chunk-UTLVTJDS.js.map → chunk-JIVE4XG6.js.map} +0 -0
- /package/client-dist/{chunk-7ZGELPVY.js.map → chunk-K5ULMCZN.js.map} +0 -0
- /package/client-dist/{chunk-3RSQSP4C.js.map → chunk-KKBOPOS7.js.map} +0 -0
- /package/client-dist/{chunk-ML4DFCM7.js.map → chunk-KMDWVDZN.js.map} +0 -0
- /package/client-dist/{chunk-H72IPZYU.js.map → chunk-KMQOD27X.js.map} +0 -0
- /package/client-dist/{chunk-EZVZVLJ5.js.map → chunk-KRDY4QE4.js.map} +0 -0
- /package/client-dist/{chunk-SXNYAZ4X.js.map → chunk-KVLIWG6J.js.map} +0 -0
- /package/client-dist/{chunk-HLDXMJXQ.js.map → chunk-LFUSTUZT.js.map} +0 -0
- /package/client-dist/{chunk-3AX4B4S2.js.map → chunk-LYGC4TVK.js.map} +0 -0
- /package/client-dist/{chunk-SHV4JGOU.js.map → chunk-NMWXUTFQ.js.map} +0 -0
- /package/client-dist/{chunk-DCWGOTWA.js.map → chunk-ODNT6WDP.js.map} +0 -0
- /package/client-dist/{chunk-W7SAAPHP.js.map → chunk-Q4MVYEES.js.map} +0 -0
- /package/client-dist/{chunk-T2GOFY7H.js.map → chunk-Q5KLVNNE.js.map} +0 -0
- /package/client-dist/{chunk-C7INBKQK.js.map → chunk-QMPZ46LB.js.map} +0 -0
- /package/client-dist/{chunk-DNRMCCHG.js.map → chunk-QUFSDVHR.js.map} +0 -0
- /package/client-dist/{chunk-QV3SDDFJ.js.map → chunk-RCRXEUZM.js.map} +0 -0
- /package/client-dist/{chunk-CXIYKPBA.js.map → chunk-RMJTPSHP.js.map} +0 -0
- /package/client-dist/{chunk-OXDWH3A2.js.map → chunk-RWNN5KRV.js.map} +0 -0
- /package/client-dist/{chunk-W2SLMCXE.js.map → chunk-SREB74HR.js.map} +0 -0
- /package/client-dist/{chunk-67F7P6KL.js.map → chunk-TLAPOIAO.js.map} +0 -0
- /package/client-dist/{chunk-FQHJM7LJ.js.map → chunk-TTI6NQVT.js.map} +0 -0
- /package/client-dist/{chunk-QPQEQKWT.js.map → chunk-UHRVQGRT.js.map} +0 -0
- /package/client-dist/{chunk-PEGIXIM2.js.map → chunk-W36ACK74.js.map} +0 -0
- /package/client-dist/{chunk-LDJGPMMN.js.map → chunk-W3AWLRVB.js.map} +0 -0
- /package/client-dist/{chunk-MAA7SWVG.js.map → chunk-WETMMHZO.js.map} +0 -0
- /package/client-dist/{chunk-H3DS6OH7.js.map → chunk-WF6HPH3A.js.map} +0 -0
- /package/client-dist/{chunk-YQD6EY4L.js.map → chunk-WIWLBRQI.js.map} +0 -0
- /package/client-dist/{chunk-H4ZDV4Z3.js.map → chunk-ZBEUOVWM.js.map} +0 -0
- /package/client-dist/{chunk-YGFCHNXR.js.map → chunk-ZYHUZVCB.js.map} +0 -0
- /package/client-dist/{crd.module-WGQKKE3M.js.map → crd.module-XJ435KXN.js.map} +0 -0
- /package/client-dist/{dashboard.module-C4WZIP4Y.js.map → dashboard.module-NUTWD5IC.js.map} +0 -0
- /package/client-dist/{do.module-CAPIRHU6.js.map → do.module-C2QZR75Z.js.map} +0 -0
- /package/client-dist/{document-library.module-IPYWYSAQ.js.map → document-library.module-OGNPLK6G.js.map} +0 -0
- /package/client-dist/{embedding-eval.module-3QA5HRDF.js.map → embedding-eval.module-66JRL7MA.js.map} +0 -0
- /package/client-dist/{embedding-registry.module-LM26SUUJ.js.map → embedding-registry.module-JHKAP6KF.js.map} +0 -0
- /package/client-dist/{err.module-IZTPG7LQ.js.map → err.module-TK43XPZB.js.map} +0 -0
- /package/client-dist/{feedback.module-MX4GLRZK.js.map → feedback.module-7R5EBLO4.js.map} +0 -0
- /package/client-dist/{host-runtime-mcp.module-6KK7IW7M.js.map → host-runtime-mcp.module-SUOQT2ZI.js.map} +0 -0
- /package/client-dist/{live-dev-pipeline.module-KHZRQJ4E.js.map → live-dev-pipeline.module-CHSRLAND.js.map} +0 -0
- /package/client-dist/{logs.module-GCB2VJNV.js.map → logs.module-MC4V6CB2.js.map} +0 -0
- /package/client-dist/{main-ZW4FR256.js.map → main-RS7R4GTV.js.map} +0 -0
- /package/client-dist/{master-control-remote-poc.module-GKP2IF4U.js.map → master-control-remote-poc.module-SREH7RYL.js.map} +0 -0
- /package/client-dist/{mobile-app.module-JOXNLUM2.js.map → mobile-app.module-2A5OJQ46.js.map} +0 -0
- /package/client-dist/{model-registry.module-KRFLXT23.js.map → model-registry.module-XIOF6NIA.js.map} +0 -0
- /package/client-dist/{oc.module-ZQV6ELSQ.js.map → oc.module-MVIAO2U2.js.map} +0 -0
- /package/client-dist/{orc.module-BOS7IKQO.js.map → orc.module-T4VFJF4P.js.map} +0 -0
- /package/client-dist/{project-management.module-54PADR43.js.map → project-management.module-LRYIMGFZ.js.map} +0 -0
- /package/client-dist/{project-source-routed.module-XPZTKJ4O.js.map → project-source-routed.module-FVGM4IBL.js.map} +0 -0
- /package/client-dist/{scheduler.module-Z2HR2ZZQ.js.map → scheduler.module-5VRTICQ7.js.map} +0 -0
- /package/client-dist/{session.module-HYDKLM4I.js.map → session.module-N3QOIA3B.js.map} +0 -0
- /package/client-dist/{set.module-MY7SOS6L.js.map → set.module-3LY5JECS.js.map} +0 -0
- /package/client-dist/{setup.module-JEOJCKS5.js.map → setup.module-IVQJMJMO.js.map} +0 -0
- /package/client-dist/{terminals.module-SFUXL6IK.js.map → terminals.module-TDVJE7TG.js.map} +0 -0
- /package/client-dist/{voice-notes-poc.module-T6WAIRNR.js.map → voice-notes-poc.module-KD4FX6MQ.js.map} +0 -0
- /package/client-dist/{wfs.module-SBGLOPUM.js.map → wfs.module-7FFTZILZ.js.map} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["src/app/_modules/consultant/_collections/con-input-storage.util.ts", "src/app/_modules/consultant/_services/consultant.api-service.ts", "src/app/_modules/consultant/_services/consultant.data-service.ts", "src/app/_modules/consultant/_collections/con-picker-model.util.ts", "src/app/_modules/consultant/_components/ccap-consultant-dashboard/con-dashboard.component.ts", "src/app/_modules/consultant/_components/ccap-consultant-dashboard/con-dashboard.component.html", "src/app/_modules/consultant/_components/ccap-consultant-shell/con-shell.component.ts", "src/app/_modules/consultant/_components/ccap-consultant-shell/con-shell.component.html", "src/app/_modules/consultant/_collections/con-msg-to-bubble-view.util.ts", "src/app/_modules/consultant/_components/ccap-consultant-detail/con-detail.component.ts", "src/app/_modules/consultant/_components/ccap-consultant-detail/con-detail.component.html", "src/app/_modules/consultant/consultant.module.ts"],
|
|
4
|
-
"sourcesContent": ["import { Shr_LocalStoragePersistence_Util } from '../../shared/_collections/utils/storage/shr-local-storage-persistence.util';\n\n/** localStorage prefix a Consultant shell UI állapotához. */\nconst STORAGE_PREFIX: string = 'ccap-consultant';\n\n/**\n * Consultant felület panel/sidebar localStorage — SSOT a host komponensben, prefix izolálva.\n *\n * REQ-UI-MENU-STATE-001 (cycle 447): a metódusok a shared\n * `Shr_LocalStoragePersistence_Util`-ra delegálnak. LocalStorage kulcs-formátum\n * változatlan (`ccap-consultant:*` prefix) — backward-compat.\n */\nexport class Con_InputStorage_Util {\n\n /** Panel nyitott/zárt állapot mentése. */\n static savePanelOpen(panelKey: string, isOpen: boolean): void {\n Shr_LocalStoragePersistence_Util.writeBoolean(`${STORAGE_PREFIX}:panelOpen:${panelKey}`, isOpen);\n }\n\n /** Panel nyitott/zárt állapot betöltése. */\n static loadPanelOpen(panelKey: string, defaultOpen: boolean): boolean {\n return Shr_LocalStoragePersistence_Util.readBoolean(\n `${STORAGE_PREFIX}:panelOpen:${panelKey}`,\n defaultOpen,\n );\n }\n\n /** Panel szélesség mentése (px). */\n static savePanelWidth(panelKey: string, width: number): void {\n Shr_LocalStoragePersistence_Util.writeNumber(`${STORAGE_PREFIX}:panelWidth:${panelKey}`, width);\n }\n\n /** Panel szélesség betöltése (px). */\n static loadPanelWidth(panelKey: string, defaultWidth: number): number {\n return Shr_LocalStoragePersistence_Util.readNumber(\n `${STORAGE_PREFIX}:panelWidth:${panelKey}`,\n defaultWidth,\n );\n }\n}\n", "import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\n\nimport { firstValueFrom } from 'rxjs';\n\nimport { environment } from '../../../../environments/environment';\n\n/**\n * Consultant POC REST API.\n */\n@Injectable({ providedIn: 'root' })\nexport class Consultant_ApiService {\n\n private readonly baseUrl: string = `${environment.api.baseUrl}/consultant`;\n\n private readonly http: HttpClient = inject(HttpClient);\n\n /**\n * Thread lista.\n */\n listThreads(): Promise<{ threads: Record<string, unknown>[] }> {\n return firstValueFrom(\n this.http.get<{ threads: Record<string, unknown>[] }>(this.baseUrl),\n );\n }\n\n /**\n * Picker opciók: Model Registry lista + default pair szerver oldali merge-elve.\n * A response tartalmazza az effektív defaults párost is.\n */\n getPickerOptions(): Promise<{\n entries: Record<string, unknown>[];\n defaults: { providerInstanceId: string; model: string };\n }> {\n return firstValueFrom(\n this.http.get<{\n entries: Record<string, unknown>[];\n defaults: { providerInstanceId: string; model: string };\n }>(`${this.baseUrl}/picker-options`),\n );\n }\n\n /**\n * Új thread.\n */\n createThread(params: {\n label?: string;\n providerInstanceId: string;\n model: string;\n }): Promise<{ thread: Record<string, unknown> }> {\n return firstValueFrom(\n this.http.post<{ thread: Record<string, unknown> }>(this.baseUrl, params),\n );\n }\n\n /**\n * Thread részletek.\n */\n getThread(threadId: string): Promise<{ thread: Record<string, unknown> }> {\n return firstValueFrom(\n this.http.get<{ thread: Record<string, unknown> }>(\n `${this.baseUrl}/${encodeURIComponent(threadId)}`,\n ),\n );\n }\n\n /**\n * Thread meta patch.\n */\n patchThread(params: {\n threadId: string;\n label?: string;\n providerInstanceId?: string;\n model?: string;\n }): Promise<{ thread: Record<string, unknown> }> {\n const body: Record<string, unknown> = {};\n if (params.label != null) {\n body.label = params.label;\n }\n if (params.providerInstanceId != null) {\n body.providerInstanceId = params.providerInstanceId;\n }\n if (params.model != null) {\n body.model = params.model;\n }\n return firstValueFrom(\n this.http.patch<{ thread: Record<string, unknown> }>(\n `${this.baseUrl}/${encodeURIComponent(params.threadId)}`,\n body,\n ),\n );\n }\n\n /**\n * Thread törlés.\n */\n deleteThread(threadId: string): Promise<{ ok: boolean }> {\n return firstValueFrom(\n this.http.delete<{ ok: boolean }>(\n `${this.baseUrl}/${encodeURIComponent(threadId)}`,\n ),\n );\n }\n\n /**\n * Üzenet küldése.\n */\n postMessage(params: {\n threadId: string;\n text: string;\n allowWebSearch: boolean;\n attachments: Record<string, unknown>[];\n }): Promise<Record<string, unknown>> {\n return firstValueFrom(\n this.http.post<Record<string, unknown>>(\n `${this.baseUrl}/${encodeURIComponent(params.threadId)}/messages`,\n {\n text: params.text,\n allowWebSearch: params.allowWebSearch,\n attachments: params.attachments,\n },\n ),\n );\n }\n}\n", "import { inject, Injectable, signal, WritableSignal } from '@angular/core';\n\nimport { Consultant_ApiService } from './consultant.api-service';\nimport {\n CCAP_ConsultantMessage_Client_Interface,\n CCAP_ConsultantThreadDetail_Client_Interface,\n CCAP_ConsultantThreadSummary_Client_Interface,\n} from '../../../_models/interfaces/consultant/ccap-consultant-client.interface';\nimport {\n MRg_ListItem_Response,\n} from '../../ai-systems/_modules/model-registry/_services/mrg-list-item.interface';\nimport { CCAP_GlobalError_ControlService } from '../../../_services/control-services/ccap-global-error.control-service';\n\n/**\n * Consultant POC állapot (SSOT).\n */\n@Injectable({ providedIn: 'root' })\nexport class Consultant_DataService {\n\n private readonly consultant_AS: Consultant_ApiService = inject(Consultant_ApiService);\n private readonly globalError_CS: CCAP_GlobalError_ControlService =\n inject(CCAP_GlobalError_ControlService);\n\n readonly threads_$: WritableSignal<CCAP_ConsultantThreadSummary_Client_Interface[]> =\n signal<CCAP_ConsultantThreadSummary_Client_Interface[]>([]);\n\n readonly threadsLoading_$: WritableSignal<boolean> = signal<boolean>(false);\n readonly threadsError_$: WritableSignal<unknown | null> = signal<unknown | null>(null);\n\n readonly selectedThread_$: WritableSignal<CCAP_ConsultantThreadDetail_Client_Interface | null> =\n signal<CCAP_ConsultantThreadDetail_Client_Interface | null>(null);\n\n readonly selectedThreadLoading_$: WritableSignal<boolean> = signal<boolean>(false);\n readonly selectedThreadError_$: WritableSignal<unknown | null> = signal<unknown | null>(null);\n\n readonly sending_$: WritableSignal<boolean> = signal<boolean>(false);\n\n readonly activeThreadId_$: WritableSignal<string> = signal<string>('');\n\n /** Effektív default provider/model pár (szerver SSOT: SC_Effective). */\n readonly defaults_$: WritableSignal<{ providerInstanceId: string; model: string }> =\n signal<{ providerInstanceId: string; model: string }>({ providerInstanceId: '', model: '' });\n\n /** Picker opciók (registry lista + default pair szerver oldali merge). */\n readonly pickerOptions_$: WritableSignal<MRg_ListItem_Response[]> =\n signal<MRg_ListItem_Response[]>([]);\n\n readonly pickerOptionsLoading_$: WritableSignal<boolean> = signal<boolean>(false);\n\n /**\n * Picker opciók betöltése (registry + default pair szerver oldali merge).\n * A defaults_$ signal-t is frissíti a válasz defaults mezőjéből.\n */\n async loadPickerOptions(): Promise<void> {\n this.pickerOptionsLoading_$.set(true);\n try {\n const res: {\n entries: Record<string, unknown>[];\n defaults: { providerInstanceId: string; model: string };\n } = await this.consultant_AS.getPickerOptions();\n const entries: MRg_ListItem_Response[] = Array.isArray(res.entries)\n ? res.entries.map(Consultant_DataService.parseRegistryEntry).filter(\n (e: MRg_ListItem_Response | null): e is MRg_ListItem_Response => e !== null,\n )\n : [];\n this.pickerOptions_$.set(entries);\n this.defaults_$.set({\n providerInstanceId: typeof res.defaults?.providerInstanceId === 'string'\n ? res.defaults.providerInstanceId : '',\n model: typeof res.defaults?.model === 'string' ? res.defaults.model : '',\n });\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'Consultant_DataService.loadPickerOptions');\n } finally {\n this.pickerOptionsLoading_$.set(false);\n }\n }\n\n /**\n * Thread lista betöltése.\n */\n async loadThreads(): Promise<void> {\n this.threadsLoading_$.set(true);\n this.threadsError_$.set(null);\n try {\n const res: { threads: Record<string, unknown>[] } = await this.consultant_AS.listThreads();\n const rawList: Record<string, unknown>[] = Array.isArray(res.threads) ? res.threads : [];\n const mapped: CCAP_ConsultantThreadSummary_Client_Interface[] = rawList.map(\n (row: Record<string, unknown>): CCAP_ConsultantThreadSummary_Client_Interface => ({\n threadId: typeof row.threadId === 'string' ? row.threadId : '',\n label: typeof row.label === 'string' ? row.label : '',\n providerInstanceId:\n typeof row.providerInstanceId === 'string' ? row.providerInstanceId : '',\n model: typeof row.model === 'string' ? row.model : '',\n messageCount: typeof row.messageCount === 'number' ? row.messageCount : 0,\n updatedAt: typeof row.updatedAt === 'string' ? row.updatedAt : '',\n }),\n );\n this.threads_$.set(mapped);\n } catch (err: unknown) {\n this.threadsError_$.set(err);\n this.globalError_CS.showError(err, 'Consultant_DataService.loadThreads');\n } finally {\n this.threadsLoading_$.set(false);\n }\n }\n\n /**\n * Egy thread részletei.\n */\n async loadThreadDetail(threadId: string): Promise<void> {\n this.activeThreadId_$.set(threadId);\n this.selectedThreadLoading_$.set(true);\n this.selectedThreadError_$.set(null);\n try {\n const res: { thread: Record<string, unknown> } = await this.consultant_AS.getThread(threadId);\n const detail: CCAP_ConsultantThreadDetail_Client_Interface | null =\n Consultant_DataService.parseThreadDetail(res.thread);\n this.selectedThread_$.set(detail);\n } catch (err: unknown) {\n this.selectedThreadError_$.set(err);\n this.globalError_CS.showError(err, 'Consultant_DataService.loadThreadDetail');\n } finally {\n this.selectedThreadLoading_$.set(false);\n }\n }\n\n /**\n * Üzenet küldés + lista frissítés.\n */\n async sendMessage(params: {\n threadId: string;\n text: string;\n allowWebSearch: boolean;\n attachments: Record<string, unknown>[];\n }): Promise<void> {\n this.sending_$.set(true);\n try {\n const res: Record<string, unknown> = await this.consultant_AS.postMessage(params);\n const threadRaw: unknown = res.thread;\n if (Consultant_DataService.isPlainRecord(threadRaw)) {\n const detail: CCAP_ConsultantThreadDetail_Client_Interface | null =\n Consultant_DataService.parseThreadDetail(threadRaw);\n this.selectedThread_$.set(detail);\n }\n await this.loadThreads();\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'Consultant_DataService.sendMessage');\n throw err;\n } finally {\n this.sending_$.set(false);\n }\n }\n\n /**\n * Provider/modell frissítés.\n */\n async updateThreadConfig(params: {\n threadId: string;\n providerInstanceId?: string;\n model?: string;\n label?: string;\n }): Promise<void> {\n try {\n const res: { thread: Record<string, unknown> } = await this.consultant_AS.patchThread(params);\n const detail: CCAP_ConsultantThreadDetail_Client_Interface | null =\n Consultant_DataService.parseThreadDetail(res.thread);\n this.selectedThread_$.set(detail);\n await this.loadThreads();\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'Consultant_DataService.updateThreadConfig');\n throw err;\n }\n }\n\n /**\n * Új thread létrehozása.\n */\n async createThread(params: {\n label?: string;\n providerInstanceId: string;\n model: string;\n }): Promise<string> {\n try {\n const res: { thread: Record<string, unknown> } = await this.consultant_AS.createThread(params);\n const idRaw: unknown = res.thread.threadId;\n const threadId: string = typeof idRaw === 'string' ? idRaw : '';\n await this.loadThreads();\n return threadId;\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'Consultant_DataService.createThread');\n throw err;\n }\n }\n\n /**\n * Thread törlése.\n */\n async deleteThread(threadId: string): Promise<void> {\n try {\n await this.consultant_AS.deleteThread(threadId);\n if (this.activeThreadId_$() === threadId) {\n this.selectedThread_$.set(null);\n this.activeThreadId_$.set('');\n }\n await this.loadThreads();\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'Consultant_DataService.deleteThread');\n throw err;\n }\n }\n\n /**\n * API thread objektum → részletek típus.\n */\n private static parseThreadDetail(\n raw: Record<string, unknown>,\n ): CCAP_ConsultantThreadDetail_Client_Interface | null {\n const threadId: string = typeof raw['threadId'] === 'string' ? raw['threadId'] : '';\n if (!threadId.length) {\n return null;\n }\n const messagesRaw: unknown = raw['messages'];\n const messages: CCAP_ConsultantMessage_Client_Interface[] = [];\n if (Array.isArray(messagesRaw)) {\n for (const m of messagesRaw) {\n if (!Consultant_DataService.isPlainRecord(m)) {\n continue;\n }\n const id: string = typeof m.id === 'string' ? m.id : '';\n const roleRaw: unknown = m.role;\n if (roleRaw !== 'user' && roleRaw !== 'assistant') {\n continue;\n }\n const msg: CCAP_ConsultantMessage_Client_Interface = {\n id: id,\n role: roleRaw,\n };\n if (typeof m.rawUserText === 'string') {\n msg.rawUserText = m.rawUserText;\n }\n if (typeof m.content === 'string') {\n msg.content = m.content;\n }\n const upRaw: unknown = m.userParts;\n if (Array.isArray(upRaw)) {\n const parts: CCAP_ConsultantMessage_Client_Interface['userParts'] = [];\n for (const p of upRaw) {\n if (!Consultant_DataService.isPlainRecord(p)) {\n continue;\n }\n const t: unknown = p.type;\n if (t !== 'text' && t !== 'image_url') {\n continue;\n }\n const part: {\n type: 'text' | 'image_url';\n text?: string;\n imageUrl?: string;\n } = { type: t };\n if (typeof p.text === 'string') {\n part.text = p.text;\n }\n if (typeof p.imageUrl === 'string') {\n part.imageUrl = p.imageUrl;\n }\n parts.push(part);\n }\n msg.userParts = parts;\n }\n messages.push(msg);\n }\n }\n return {\n threadId: threadId,\n label: typeof raw['label'] === 'string' ? raw['label'] : '',\n providerInstanceId:\n typeof raw['providerInstanceId'] === 'string' ? raw['providerInstanceId'] : '',\n model: typeof raw['model'] === 'string' ? raw['model'] : '',\n messages: messages,\n updatedAt: typeof raw['updatedAt'] === 'string' ? raw['updatedAt'] : '',\n };\n }\n\n private static isPlainRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n }\n\n /**\n * Registry entry JSON → típusos `MRg_ListItem_Response`.\n * Csak a picker-hez szükséges mezőket parsoljuk; null ha strukturálisan érvénytelen.\n */\n private static parseRegistryEntry(raw: unknown): MRg_ListItem_Response | null {\n if (!Consultant_DataService.isPlainRecord(raw)) {\n return null;\n }\n const provider: string = typeof raw['provider'] === 'string' ? raw['provider'] : '';\n const modelName: string = typeof raw['modelName'] === 'string' ? raw['modelName'] : '';\n if (!provider.length || !modelName.length) {\n return null;\n }\n const capsRaw: unknown = raw['capabilities'];\n const capabilities: string[] | undefined = Array.isArray(capsRaw)\n ? capsRaw.filter((c: unknown): c is string => typeof c === 'string')\n : undefined;\n return {\n id: typeof raw['id'] === 'string' ? raw['id'] : '',\n provider: provider,\n modelName: modelName,\n enabled: raw['enabled'] === true,\n capabilities: capabilities,\n };\n }\n}\n", "import { MRg_ListItem_Response } from '../../ai-systems/_modules/model-registry/_services/mrg-list-item.interface';\n\n/**\n * Consultant picker provider/model lista util (SSOT: mindenhol ugyanez a logika).\n */\nexport class Con_PickerModel_Util {\n\n /**\n * Egyedi, rendezett provider lista a picker entry-kből.\n */\n static collectSortedProviders(entries: MRg_ListItem_Response[]): string[] {\n const set: Set<string> = new Set<string>();\n for (const e of entries) {\n const prov: string = e.provider.trim();\n if (prov.length > 0) {\n set.add(prov);\n }\n }\n return [...set].sort();\n }\n\n /**\n * Adott providerhez tartozó egyedi, rendezett modellek.\n */\n static collectSortedModelsForProvider(\n entries: MRg_ListItem_Response[],\n provider: string,\n ): string[] {\n const p: string = provider.trim();\n if (!p.length) {\n return [];\n }\n const names: string[] = [];\n for (const e of entries) {\n const mn: string = e.modelName.trim();\n if (e.provider === p && mn.length > 0) {\n names.push(mn);\n }\n }\n return [...new Set(names)].sort();\n }\n}\n", "import { Component, OnInit, inject, signal, computed } from '@angular/core';\nimport { Router } from '@angular/router';\n\nimport { ProviderDisplayLabel_Util } from '../../../../_collections/display/provider-display-label.util';\nimport { Consultant_DataService } from '../../_services/consultant.data-service';\nimport { ModelRegistry_DataService } from '../../../ai-systems/_modules/model-registry/_services/model-registry.data-service';\nimport { MRg_SetupConfig_Type } from '../../../ai-systems/_modules/model-registry/_services/mrg-setup-config.type';\nimport { S_SessionListRowView_Interface } from '../../../shared/_models/interfaces/s-session-list-row-view.interface';\nimport { CCAP_ConsultantThreadSummary_Client_Interface } from '../../../../_models/interfaces/consultant/ccap-consultant-client.interface';\nimport { Con_PickerModel_Util } from '../../_collections/con-picker-model.util';\n\n/**\n * Consultant thread lista + új chat.\n */\n@Component({\n selector: 'app-ccap-consultant-dashboard',\n templateUrl: './con-dashboard.component.html',\n host: { class: 'flex flex-col flex-1 min-h-0 overflow-hidden' },\n})\n/** Con_Dashboard_Component class. */\nexport class Con_Dashboard_Component implements OnInit {\n\n readonly consultant_DS: Consultant_DataService = inject(Consultant_DataService);\n private readonly router: Router = inject(Router);\n private readonly modelRegistry_DS: ModelRegistry_DataService =\n inject(ModelRegistry_DataService);\n\n readonly isCreateOpen_$ = signal<boolean>(false);\n readonly newLabel_$ = signal<string>('');\n readonly newProvider_$ = signal<string>('');\n readonly newModel_$ = signal<string>('');\n readonly isCreating_$ = signal<boolean>(false);\n\n /**\n * Egyedi provider instance id-k a szerveri picker listából.\n */\n readonly providerOptions_$ = computed((): string[] => {\n return Con_PickerModel_Util.collectSortedProviders(this.consultant_DS.pickerOptions_$());\n });\n\n /**\n * Kiválasztott providerhez tartozó modellek.\n */\n readonly modelsForNewProvider_$ = computed((): string[] => {\n return Con_PickerModel_Util.collectSortedModelsForProvider(\n this.consultant_DS.pickerOptions_$(),\n this.newProvider_$(),\n );\n });\n\n /**\n * Provider id → megjelenített címke (display label config-ból).\n */\n readonly providerDisplayLabelsMap_$ = computed((): Record<string, string> => {\n const config: MRg_SetupConfig_Type = this.modelRegistry_DS.setupConfigForRegistry_$();\n const providers: string[] = this.providerOptions_$();\n const m: Record<string, string> = {};\n for (const p of providers) {\n if (m[p] == null) {\n m[p] = ProviderDisplayLabel_Util.getProviderDisplayLabel(p, config);\n }\n }\n return m;\n });\n\n /**\n * Thread lista sorokhoz: ismert providerInstanceId → display label.\n */\n readonly threadProviderDisplayLabels_$ = computed((): Record<string, string> => {\n const config: MRg_SetupConfig_Type = this.modelRegistry_DS.setupConfigForRegistry_$();\n const ids: Set<string> = new Set<string>();\n for (const t of this.consultant_DS.threads_$()) {\n const id: string = t.providerInstanceId.trim();\n if (id.length > 0) {\n ids.add(id);\n }\n }\n for (const p of this.providerOptions_$()) {\n ids.add(p);\n }\n const m: Record<string, string> = {};\n for (const id of ids) {\n m[id] = ProviderDisplayLabel_Util.getProviderDisplayLabel(id, config);\n }\n return m;\n });\n\n /** Thread lista → shared list row view model mapping. */\n readonly threadRowViews_$ = computed((): S_SessionListRowView_Interface[] =>\n this.consultant_DS.threads_$().map(\n (t: CCAP_ConsultantThreadSummary_Client_Interface): S_SessionListRowView_Interface => ({\n id: t.threadId,\n label: t.label || t.threadId,\n status: '',\n statusColorClass: 'bg-neutral-600',\n isArchived: false,\n lastActivityAt: t.updatedAt,\n isRunning: false,\n }),\n ),\n );\n\n // ── Context menu state ──────────────────────────────────────\n\n /** Kontextmenü thread-je (null = zárt). */\n readonly ctxMenuThread_$ = signal<CCAP_ConsultantThreadSummary_Client_Interface | null>(null);\n\n /** Kontextmenü pozíció. */\n readonly ctxMenuPos_$ = signal<{ x: number; y: number }>({ x: 0, y: 0 });\n\n ngOnInit(): void {\n void this.consultant_DS.loadThreads();\n void this.consultant_DS.loadPickerOptions();\n void this.modelRegistry_DS.loadSetupConfigForRegistry();\n }\n\n /**\n * Navigálás a kiválasztott consultant thread-re.\n */\n handleSelectThread(threadId: string): void {\n void this.router.navigate(['/consultant', threadId]);\n }\n\n /**\n * Modál megnyitás: friss picker opciók + szerveri defaults pre-selection.\n */\n async handleOpenCreate(): Promise<void> {\n await this.consultant_DS.loadPickerOptions();\n const defaults: { providerInstanceId: string; model: string } = this.consultant_DS.defaults_$();\n const providers: string[] = this.providerOptions_$();\n if (defaults.providerInstanceId.length > 0 && providers.includes(defaults.providerInstanceId)) {\n const models: string[] = Con_PickerModel_Util.collectSortedModelsForProvider(\n this.consultant_DS.pickerOptions_$(),\n defaults.providerInstanceId,\n );\n if (defaults.model.length > 0 && models.includes(defaults.model)) {\n this.newProvider_$.set(defaults.providerInstanceId);\n this.newModel_$.set(defaults.model);\n } else {\n this.newProvider_$.set(defaults.providerInstanceId);\n this.newModel_$.set(models[0] ?? '');\n }\n } else {\n const firstP: string = providers[0] ?? '';\n this.newProvider_$.set(firstP);\n const fallbackModels: string[] = Con_PickerModel_Util.collectSortedModelsForProvider(\n this.consultant_DS.pickerOptions_$(),\n firstP,\n );\n this.newModel_$.set(fallbackModels[0] ?? '');\n }\n this.newLabel_$.set('');\n this.isCreateOpen_$.set(true);\n }\n\n /**\n * Új thread modál bezárása.\n */\n handleCloseCreate(): void {\n this.isCreateOpen_$.set(false);\n }\n\n /**\n * Provider váltás — modell lista első elemére állítás.\n */\n handleProviderChange(value: string): void {\n this.newProvider_$.set(value);\n const models: string[] = Con_PickerModel_Util.collectSortedModelsForProvider(\n this.consultant_DS.pickerOptions_$(),\n value,\n );\n this.newModel_$.set(models[0] ?? '');\n }\n\n /**\n * Új consultant thread létrehozása a kiválasztott provider/model párossal.\n */\n async handleCreateThread(): Promise<void> {\n const provider: string = this.newProvider_$().trim();\n const model: string = this.newModel_$().trim();\n if (!provider.length || !model.length) {\n return;\n }\n this.isCreating_$.set(true);\n try {\n const label: string = this.newLabel_$().trim();\n const id: string = await this.consultant_DS.createThread({\n label: label.length > 0 ? label : undefined,\n providerInstanceId: provider,\n model: model,\n });\n this.isCreateOpen_$.set(false);\n if (id.length > 0) {\n void this.router.navigate(['/consultant', id]);\n }\n } finally {\n this.isCreating_$.set(false);\n }\n }\n\n // ── Context menu handlers ────────────────────────────────────\n\n /** Shared list row contextMenu output kezelése. */\n handleRowContextMenu(payload: { event: MouseEvent; id: string }): void {\n const thread: CCAP_ConsultantThreadSummary_Client_Interface | undefined =\n this.consultant_DS.threads_$().find(\n (t: CCAP_ConsultantThreadSummary_Client_Interface): boolean => t.threadId === payload.id,\n );\n if (!thread) {\n return;\n }\n this.ctxMenuThread_$.set(thread);\n this.ctxMenuPos_$.set({ x: payload.event.clientX, y: payload.event.clientY });\n }\n\n /** Kontextmenü bezárása. */\n handleCloseCtxMenu(): void {\n this.ctxMenuThread_$.set(null);\n }\n\n /** Delete a kontextmenüből. */\n async handleCtxDelete(): Promise<void> {\n const thread: CCAP_ConsultantThreadSummary_Client_Interface | null = this.ctxMenuThread_$();\n if (!thread) {\n return;\n }\n this.handleCloseCtxMenu();\n try {\n await this.consultant_DS.deleteThread(thread.threadId);\n void this.router.navigate(['/consultant']);\n } catch {\n // Hibát a data service kezeli\n }\n }\n}\n", "<div class=\"flex flex-col flex-1 min-h-0\">\n <div class=\"shrink-0 p-2 border-b border-neonDefault flex items-center gap-2\">\n <span class=\"text-xs font-semibold text-neutral-300 flex-1 truncate\">Consultant</span>\n <button\n type=\"button\"\n class=\"px-2 py-1 text-xs border border-neonDefault text-neutral-300 hover:bg-neutral-700 rounded transition-colors\"\n (click)=\"handleOpenCreate()\">\n + New\n </button>\n </div>\n\n <div class=\"flex-1 overflow-y-auto\">\n @if (consultant_DS.threadsLoading_$()) {\n <div class=\"p-3 text-xs text-neutral-500\">Loading...</div>\n } @else if (threadRowViews_$().length) {\n @for (row of threadRowViews_$(); track row.id) {\n <app-s-session-list-row\n [view]=\"row\"\n [isActive]=\"consultant_DS.activeThreadId_$() === row.id\"\n (selected)=\"handleSelectThread($event)\"\n (contextMenu)=\"handleRowContextMenu($event)\" />\n }\n } @else {\n <div class=\"p-4 text-center text-neutral-500 text-xs\">No threads</div>\n }\n </div>\n</div>\n\n@if (isCreateOpen_$()) {\n <div class=\"fixed inset-0 z-40 flex items-center justify-center bg-black/60 p-4\" (click)=\"handleCloseCreate()\">\n <div\n class=\"w-full max-w-md rounded-lg border border-neonDefault bg-neutral-900 p-4 shadow-xl\"\n (click)=\"$event.stopPropagation()\">\n <h3 class=\"text-sm font-semibold text-neutral-200 mb-3\">New consultant thread</h3>\n <div class=\"flex flex-col gap-2 text-xs\">\n <label class=\"text-neutral-400\">Label (optional)</label>\n <input\n class=\"w-full px-2 py-1 rounded bg-neutral-800 border border-neutral-600 text-neutral-200\"\n [ngModel]=\"newLabel_$()\"\n (ngModelChange)=\"newLabel_$.set($event)\" />\n\n <label class=\"text-neutral-400\">Provider</label>\n <select\n class=\"w-full px-2 py-1 rounded bg-neutral-800 border border-neutral-600 text-neutral-200\"\n [ngModel]=\"newProvider_$()\"\n (ngModelChange)=\"handleProviderChange($event)\">\n @for (p of providerOptions_$(); track p) {\n <option [value]=\"p\">{{ providerDisplayLabelsMap_$()[p] || p }}</option>\n }\n </select>\n\n <label class=\"text-neutral-400\">Model</label>\n <select\n class=\"w-full px-2 py-1 rounded bg-neutral-800 border border-neutral-600 text-neutral-200\"\n [ngModel]=\"newModel_$()\"\n (ngModelChange)=\"newModel_$.set($event)\">\n @for (m of modelsForNewProvider_$(); track m) {\n <option [value]=\"m\">{{ m }}</option>\n }\n </select>\n </div>\n <div class=\"flex justify-end gap-2 mt-4\">\n <button\n type=\"button\"\n class=\"px-2 py-1 text-xs border border-neutral-600 text-neutral-400 rounded\"\n (click)=\"handleCloseCreate()\">\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"px-2 py-1 text-xs border border-neonDefault text-neutral-200 rounded disabled:opacity-40\"\n [disabled]=\"isCreating_$() || !newProvider_$().trim() || !newModel_$().trim()\"\n (click)=\"handleCreateThread()\">\n Create\n </button>\n </div>\n </div>\n </div>\n}\n\n<!-- Context menu overlay -->\n@if (ctxMenuThread_$(); as ctxThread) {\n <div class=\"fixed inset-0 z-40\" (click)=\"handleCloseCtxMenu()\"></div>\n <div class=\"fixed z-50 min-w-[140px] bg-neutral-900 border border-neutral-700 rounded-lg shadow-xl py-1 text-xs\"\n [style.left.px]=\"ctxMenuPos_$().x\"\n [style.top.px]=\"ctxMenuPos_$().y\">\n <button\n class=\"w-full text-left px-3 py-1.5 text-red-400 hover:bg-red-500/10 transition-colors\"\n (click)=\"handleCtxDelete()\">\n Delete\n </button>\n </div>\n}\n", "import { Component, OnInit, signal } from '@angular/core';\n\nimport { Con_InputStorage_Util } from '../../_collections/con-input-storage.util';\nimport {\n SESSION_SHELL_SIDEBAR_DEFAULT_WIDTH_PX,\n SESSION_SHELL_SIDEBAR_MAX_WIDTH_PX,\n SESSION_SHELL_SIDEBAR_MIN_WIDTH_PX,\n} from '../../../shared/_collections/consts/session-detail-panel-layout.const';\nimport { SHR_DocumentPointerDrag_Util } from '../../../shared/_collections/utils/shr-document-pointer-drag.util';\n\n/**\n * Consultant POC shell: resizable bal lista + router-outlet (OC/CC session minta).\n */\n@Component({\n selector: 'app-ccap-consultant-shell',\n templateUrl: './con-shell.component.html',\n host: { class: 'flex min-h-0 w-full flex-1 flex-col overflow-hidden' },\n})\n/** Con_Shell_Component class. */\nexport class Con_Shell_Component implements OnInit {\n\n /** Bal sidebar szélessége (px). */\n readonly sidebarWidth_$ = signal<number>(SESSION_SHELL_SIDEBAR_DEFAULT_WIDTH_PX);\n\n /** Sidebar látható. */\n readonly isSidebarOpen_$ = signal<boolean>(true);\n\n /** Resize közben select-none a root-on. */\n readonly isResizing_$ = signal<boolean>(false);\n\n ngOnInit(): void {\n const stored: number = Con_InputStorage_Util.loadPanelWidth(\n 'sidebar',\n SESSION_SHELL_SIDEBAR_DEFAULT_WIDTH_PX,\n );\n this.sidebarWidth_$.set(\n Math.max(\n SESSION_SHELL_SIDEBAR_MIN_WIDTH_PX,\n Math.min(SESSION_SHELL_SIDEBAR_MAX_WIDTH_PX, stored),\n ),\n );\n this.isSidebarOpen_$.set(Con_InputStorage_Util.loadPanelOpen('sidebar', true));\n }\n\n /**\n * Sidebar resize drag indítása.\n */\n handleSidebarResizeStart(event: PointerEvent): void {\n const startX: number = event.clientX;\n const startWidth: number = this.sidebarWidth_$();\n this.isResizing_$.set(true);\n SHR_DocumentPointerDrag_Util.attachUntilPointerUp({\n startEvent: event,\n onMove: (e: PointerEvent): void => {\n const delta: number = e.clientX - startX;\n const newWidth: number = Math.max(\n SESSION_SHELL_SIDEBAR_MIN_WIDTH_PX,\n Math.min(SESSION_SHELL_SIDEBAR_MAX_WIDTH_PX, startWidth + delta),\n );\n this.sidebarWidth_$.set(newWidth);\n },\n onEnd: (): void => {\n this.isResizing_$.set(false);\n Con_InputStorage_Util.savePanelWidth('sidebar', this.sidebarWidth_$());\n },\n });\n }\n\n /**\n * Sidebar ki/be — állapot mentése.\n */\n handleToggleSidebar(): void {\n this.isSidebarOpen_$.update((v: boolean): boolean => !v);\n Con_InputStorage_Util.savePanelOpen('sidebar', this.isSidebarOpen_$());\n }\n}\n", "<div class=\"flex min-h-0 w-full flex-1 flex-col overflow-hidden\" [class.select-none]=\"isResizing_$()\">\n <app-s-session-shell-toolbar>\n <div sSessionToolbarLeft class=\"flex items-center gap-1 min-w-0\">\n <button\n type=\"button\"\n class=\"px-2 py-1 text-xs border border-neonDefault text-neutral-300 hover:bg-neutral-700 rounded transition-colors flex items-center gap-1 shrink-0\"\n (click)=\"handleToggleSidebar()\">\n <svg\n class=\"w-3 h-3 shrink-0 transition-transform duration-150\"\n [class.rotate-90]=\"isSidebarOpen_$()\"\n [class.-rotate-90]=\"!isSidebarOpen_$()\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n Consultant\n </button>\n </div>\n <div sSessionToolbarCenter class=\"min-w-0\"></div>\n <div sSessionToolbarRight class=\"min-w-0\"></div>\n </app-s-session-shell-toolbar>\n\n <app-s-resizable-session-shell-layout\n [isSidebarOpen]=\"isSidebarOpen_$()\"\n [sidebarWidthPx]=\"sidebarWidth_$()\"\n [isResizing]=\"isResizing_$()\"\n (sidebarResizeStart)=\"handleSidebarResizeStart($event)\">\n <div sSessionShellSidebar class=\"flex flex-col overflow-hidden h-full\">\n <app-ccap-consultant-dashboard />\n </div>\n <div\n sSessionShellMain\n class=\"flex min-h-0 flex-1 flex-col overflow-hidden [&>router-outlet]:contents\">\n <router-outlet />\n </div>\n </app-s-resizable-session-shell-layout>\n</div>\n", "import { CCAP_AgentConsoleBubbleKind_Type } from '../../../_enums/shared/ccap-agent-console-bubble-kind.enum';\nimport { CCAP_AgentConsoleBubbleView_Interface } from '../../../_models/interfaces/shared/ccap-agent-console-bubble-view.interface';\nimport { CCAP_ConsultantMessage_Client_Interface } from '../../../_models/interfaces/consultant/ccap-consultant-client.interface';\n\n/**\n * Consultant üzenet → közös buborék view-model.\n */\nexport class Con_MsgToBubbleView_Util {\n\n /**\n * Consultant thread üzenet mapelése.\n */\n static fromMessage(msg: CCAP_ConsultantMessage_Client_Interface): CCAP_AgentConsoleBubbleView_Interface {\n const isUser: boolean = msg.role === 'user';\n const bodyText: string = isUser\n ? Con_MsgToBubbleView_Util.buildUserBodyText(msg)\n : (msg.content ?? '');\n return {\n listKey: msg.id,\n kind: isUser ? CCAP_AgentConsoleBubbleKind_Type.userPrompt : CCAP_AgentConsoleBubbleKind_Type.assistant,\n bodyText: bodyText,\n isUserAligned: isUser,\n flags: {\n showCopy: true,\n showRawInfo: false,\n useEditDiffForExpandable: false,\n },\n };\n }\n\n /**\n * User sor: nyers szöveg + több userPart esetén attachment jelölés (régi detail megjelenítés).\n */\n private static buildUserBodyText(msg: CCAP_ConsultantMessage_Client_Interface): string {\n const raw: string = (msg.rawUserText ?? '').trim();\n const hasParts: boolean = (msg.userParts?.length ?? 0) > 1;\n if (hasParts) {\n return raw.length > 0 ? `${raw}\\n[attachments]` : '[attachments]';\n }\n if (raw.length > 0) {\n return raw;\n }\n return msg.content ?? '';\n }\n}\n", "import {\n Component,\n computed,\n effect,\n inject,\n OnDestroy,\n signal,\n ViewChild,\n WritableSignal,\n} from '@angular/core';\nimport { ActivatedRoute, ParamMap, Router } from '@angular/router';\n\nimport { map } from 'rxjs';\n\nimport { DyNX_SubscriptionControl } from '@futdevpro/ngx-dynamo';\n\nimport { Consultant_DataService } from '../../_services/consultant.data-service';\nimport { VNP_InputUi_DataService } from '../../../dev/_modules/poc/_modules/voice-notes-poc/_services/vnp-input-ui.data-service';\nimport {\n S_SessionInput_Component,\n} from '../../../shared/_components/session-ui/s-session-input/s-session-input.component';\nimport { Con_PickerModel_Util } from '../../_collections/con-picker-model.util';\nimport {\n CCAP_PendingAttachment_Interface,\n} from '../../../../_models/interfaces/session/ccap-pending-attachment.interface';\nimport {\n CCAP_ConsultantMessage_Client_Interface,\n} from '../../../../_models/interfaces/consultant/ccap-consultant-client.interface';\nimport { CCAP_AgentConsoleBubbleView_Interface } from '../../../../_models/interfaces/shared/ccap-agent-console-bubble-view.interface';\nimport { Con_MsgToBubbleView_Util } from '../../_collections/con-msg-to-bubble-view.util';\n\n/**\n * Consultant chat részletek: üzenetek, composer, modellváltás.\n */\n@Component({\n selector: 'app-ccap-consultant-detail',\n templateUrl: './con-detail.component.html',\n host: { class: 'flex flex-col flex-1 min-h-0 overflow-hidden' },\n})\n/** Con_Detail_Component class. */\nexport class Con_Detail_Component extends DyNX_SubscriptionControl implements OnDestroy {\n\n readonly consultant_DS: Consultant_DataService = inject(Consultant_DataService);\n private readonly route: ActivatedRoute = inject(ActivatedRoute);\n private readonly router: Router = inject(Router);\n private readonly voiceInputUi_DS: VNP_InputUi_DataService =\n inject(VNP_InputUi_DataService);\n\n /** Shared session input komponens referencia (clearAttachments küldés után). */\n @ViewChild(S_SessionInput_Component) private sessionInputRef: S_SessionInput_Component | undefined;\n\n readonly composerText_$: WritableSignal<string> = signal<string>('');\n readonly allowWebSearch_$: WritableSignal<boolean> = signal<boolean>(false);\n\n readonly localLabel_$: WritableSignal<string> = signal<string>('');\n readonly localProvider_$: WritableSignal<string> = signal<string>('');\n readonly localModel_$: WritableSignal<string> = signal<string>('');\n\n /**\n * Provider opciók a szerveri picker listából (SSOT: data service).\n */\n readonly providerOptions_$ = computed((): string[] => {\n return Con_PickerModel_Util.collectSortedProviders(this.consultant_DS.pickerOptions_$());\n });\n\n /**\n * Model lista a kiválasztott providerhez (SSOT: shared util, template-ben nincs method hívás).\n */\n readonly modelsForSelectedProvider_$ = computed((): string[] => {\n return Con_PickerModel_Util.collectSortedModelsForProvider(\n this.consultant_DS.pickerOptions_$(),\n this.localProvider_$(),\n );\n });\n\n /**\n * Thread üzenetek buborék view-modelje (track: listKey = message id).\n */\n readonly consultantBubbleViews_$ = computed((): CCAP_AgentConsoleBubbleView_Interface[] => {\n const t = this.consultant_DS.selectedThread_$();\n if (!t) {\n return [];\n }\n return t.messages.map(\n (m: CCAP_ConsultantMessage_Client_Interface): CCAP_AgentConsoleBubbleView_Interface =>\n Con_MsgToBubbleView_Util.fromMessage(m),\n );\n });\n\n /** Shared input komponensből érkező attachment-ek (küldéshez konvertáljuk). */\n private pendingAttachments: CCAP_PendingAttachment_Interface[] = [];\n\n constructor() {\n super();\n this.addSubscription(this.route.paramMap.pipe(\n map((pm: ParamMap): string => pm.get('threadId') ?? ''),\n ).subscribe((threadId: string): void => {\n if (threadId.length > 0) {\n void this.consultant_DS.loadThreadDetail(threadId);\n } else {\n this.consultant_DS.selectedThread_$.set(null);\n this.consultant_DS.activeThreadId_$.set('');\n }\n }));\n\n effect((): void => {\n const t = this.consultant_DS.selectedThread_$();\n if (t != null) {\n this.localLabel_$.set(t.label);\n this.localProvider_$.set(t.providerInstanceId);\n this.localModel_$.set(t.model);\n }\n }, { allowSignalWrites: true });\n\n void this.consultant_DS.loadPickerOptions();\n }\n\n override ngOnDestroy(): void {\n super.ngOnDestroy();\n }\n\n handleProviderChange(value: string): void {\n this.localProvider_$.set(value);\n const models: string[] = Con_PickerModel_Util.collectSortedModelsForProvider(\n this.consultant_DS.pickerOptions_$(),\n value,\n );\n const cur: string = this.localModel_$();\n if (!models.includes(cur)) {\n this.localModel_$.set(models[0] ?? '');\n }\n }\n\n async handleApplyConfig(): Promise<void> {\n const threadId: string = this.consultant_DS.activeThreadId_$();\n if (!threadId.length) {\n return;\n }\n await this.consultant_DS.updateThreadConfig({\n threadId: threadId,\n label: this.localLabel_$(),\n providerInstanceId: this.localProvider_$(),\n model: this.localModel_$(),\n });\n }\n\n async handleDeleteThread(): Promise<void> {\n const threadId: string = this.consultant_DS.activeThreadId_$();\n if (!threadId.length) {\n return;\n }\n await this.consultant_DS.deleteThread(threadId);\n void this.router.navigate(['/consultant']);\n }\n\n /**\n * Shared input komponens attachment lista változás.\n */\n handleAttachmentsChanged(attachments: CCAP_PendingAttachment_Interface[]): void {\n this.pendingAttachments = attachments;\n }\n\n /**\n * Voice szegmens transcribe: akkumuláció + auto-send csak isFinal=true esetén.\n */\n handleVoiceSegment(event: { text: string; isFinal: boolean }): void {\n const t: string = event.text.trim();\n if (!t.length) {\n return;\n }\n const current: string = this.composerText_$().trim();\n this.composerText_$.set(current.length > 0 ? `${current} ${t}` : t);\n if (this.voiceInputUi_DS.autoSendAfterVoice_$() && event.isFinal) {\n void this.handleSend();\n }\n }\n\n /**\n * Üzenet küldése — pending attachment-eket consultant API formátumra konvertálja.\n */\n async handleSend(): Promise<void> {\n const threadId: string = this.consultant_DS.activeThreadId_$();\n if (!threadId.length) {\n return;\n }\n const text: string = this.composerText_$().trim();\n const currentAttachments: CCAP_PendingAttachment_Interface[] = [...this.pendingAttachments];\n if (!text.length && !currentAttachments.length) {\n return;\n }\n const attachments: Record<string, unknown>[] = currentAttachments.map(\n (a: CCAP_PendingAttachment_Interface): Record<string, unknown> => ({\n kind: a.isImage ? 'image' : 'textDocument',\n mimeType: a.mimeType,\n fileName: a.fileName,\n dataBase64: a.base64,\n }),\n );\n await this.consultant_DS.sendMessage({\n threadId: threadId,\n text: text,\n allowWebSearch: this.allowWebSearch_$(),\n attachments: attachments,\n });\n this.composerText_$.set('');\n this.pendingAttachments = [];\n this.sessionInputRef?.clearAttachments();\n }\n\n}\n", "@if (!consultant_DS.activeThreadId_$()) {\n <div class=\"flex flex-1 items-center justify-center p-4 text-xs text-neutral-500\">\n Select a thread or create a new consultant chat.\n </div>\n} @else if (consultant_DS.selectedThreadLoading_$()) {\n <div class=\"flex flex-1 items-center justify-center text-xs text-neutral-500\">Loading…</div>\n} @else {\n @if (consultant_DS.selectedThread_$()) {\n <app-s-session-chat-column-layout>\n <div\n sChatColumnHeader\n class=\"flex shrink-0 flex-col gap-2 border-b border-neonDefault bg-ccapSurface p-2\">\n <div class=\"flex flex-wrap items-end gap-2\">\n <div class=\"flex flex-col gap-0.5\">\n <span class=\"text-[10px] text-neutral-500\">Label</span>\n <input\n class=\"w-40 rounded border border-neutral-600 bg-neutral-800 px-2 py-1 text-xs text-neutral-200\"\n [ngModel]=\"localLabel_$()\"\n (ngModelChange)=\"localLabel_$.set($event)\" />\n </div>\n <div class=\"flex flex-col gap-0.5\">\n <span class=\"text-[10px] text-neutral-500\">Provider</span>\n <select\n class=\"w-36 rounded border border-neutral-600 bg-neutral-800 px-2 py-1 text-xs text-neutral-200\"\n [ngModel]=\"localProvider_$()\"\n (ngModelChange)=\"handleProviderChange($event)\">\n @for (p of providerOptions_$(); track p) {\n <option [value]=\"p\">{{ p }}</option>\n }\n </select>\n </div>\n <div class=\"flex flex-col gap-0.5\">\n <span class=\"text-[10px] text-neutral-500\">Model</span>\n <select\n class=\"w-40 rounded border border-neutral-600 bg-neutral-800 px-2 py-1 text-xs text-neutral-200\"\n [ngModel]=\"localModel_$()\"\n (ngModelChange)=\"localModel_$.set($event)\">\n @for (m of modelsForSelectedProvider_$(); track m) {\n <option [value]=\"m\">{{ m }}</option>\n }\n </select>\n </div>\n <button\n type=\"button\"\n class=\"rounded border border-neonDefault px-2 py-1 text-xs text-neutral-300\"\n (click)=\"handleApplyConfig()\">\n Apply\n </button>\n <button\n type=\"button\"\n class=\"ml-auto rounded border border-red-900 px-2 py-1 text-xs text-red-300\"\n (click)=\"handleDeleteThread()\">\n Delete\n </button>\n </div>\n </div>\n\n <div sChatColumnScroll class=\"flex flex-col gap-3 p-3\">\n @for (row of consultantBubbleViews_$(); track row.listKey) {\n <div\n class=\"max-w-[85%]\"\n [class.self-end]=\"row.isUserAligned === true\"\n [class.self-start]=\"row.isUserAligned !== true\">\n <app-s-agent-console-message-bubble [view]=\"row\" />\n </div>\n }\n </div>\n\n <div sChatColumnComposer class=\"flex flex-col\">\n <label class=\"flex cursor-pointer items-center gap-2 px-2 pt-1 text-[10px] text-neutral-400\">\n <input type=\"checkbox\" [ngModel]=\"allowWebSearch_$()\" (ngModelChange)=\"allowWebSearch_$.set($event)\" />\n Allow web search (Brave)\n </label>\n <app-s-session-input\n [draftText]=\"composerText_$()\"\n (draftTextChange)=\"composerText_$.set($event)\"\n [isSending]=\"consultant_DS.sending_$()\"\n [enableAttachments]=\"true\"\n acceptedFileTypes=\"image/png,image/jpeg,image/webp,image/gif,.txt,.md,text/plain,text/markdown\"\n placeholder=\"Message…\"\n [textareaRows]=\"3\"\n (sendRequested)=\"handleSend()\"\n (attachmentsChanged)=\"handleAttachmentsChanged($event)\">\n <app-ccap-voice-record-button\n sInputTextareaAccessory\n [compactLayout]=\"true\"\n (transcriptSegmentReady)=\"handleVoiceSegment($event)\">\n </app-ccap-voice-record-button>\n </app-s-session-input>\n </div>\n </app-s-session-chat-column-layout>\n } @else {\n <div class=\"flex flex-1 items-center justify-center p-4 text-xs text-neutral-500\">\n Thread not loaded.\n </div>\n }\n}\n", "import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { RouterModule, Routes } from '@angular/router';\n\nimport { CCAP_ErrorDisplay_Component } from '../../_components/ccap-error-display/ccap-error-display.component';\nimport { CCAP_VoiceRecordButton_Component } from '../../_components/ccap-voice-record-button/ccap-voice-record-button.component';\nimport { Shared_Module } from '../shared/shared.module';\nimport { Con_Shell_Component } from './_components/ccap-consultant-shell/con-shell.component';\nimport { Con_Dashboard_Component } from './_components/ccap-consultant-dashboard/con-dashboard.component';\nimport { Con_Detail_Component } from './_components/ccap-consultant-detail/con-detail.component';\n\nconst consultantRoutes: Routes = [\n {\n path: '',\n component: Con_Shell_Component,\n children: [\n { path: '', component: Con_Detail_Component },\n { path: ':threadId', component: Con_Detail_Component },\n ],\n },\n];\n\n/**\n * Consultant POC modul: egyszerű chat, provider/modell, mellékletek.\n */\n@NgModule({\n declarations: [\n Con_Shell_Component,\n Con_Dashboard_Component,\n Con_Detail_Component,\n ],\n imports: [\n CommonModule,\n FormsModule,\n RouterModule.forChild(consultantRoutes),\n CCAP_ErrorDisplay_Component,\n CCAP_VoiceRecordButton_Component,\n Shared_Module,\n ],\n})\n/** Consultant_Module class. */\nexport class Consultant_Module {}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { Shr_LocalStoragePersistence_Util } from '../../shared/_collections/utils/storage/shr-local-storage-persistence.util';\n\n/** localStorage prefix a Consultant shell UI állapotához. */\nconst STORAGE_PREFIX: string = 'ccap-consultant';\n\n/**\n * Consultant felület panel/sidebar localStorage — SSOT a host komponensben, prefix izolálva.\n *\n * REQ-UI-MENU-STATE-001 (cycle 447): a metódusok a shared\n * `Shr_LocalStoragePersistence_Util`-ra delegálnak. LocalStorage kulcs-formátum\n * változatlan (`ccap-consultant:*` prefix) — backward-compat.\n */\nexport class Con_InputStorage_Util {\n\n /** Panel nyitott/zárt állapot mentése. */\n static savePanelOpen(panelKey: string, isOpen: boolean): void {\n Shr_LocalStoragePersistence_Util.writeBoolean(`${STORAGE_PREFIX}:panelOpen:${panelKey}`, isOpen);\n }\n\n /** Panel nyitott/zárt állapot betöltése. */\n static loadPanelOpen(panelKey: string, defaultOpen: boolean): boolean {\n return Shr_LocalStoragePersistence_Util.readBoolean(\n `${STORAGE_PREFIX}:panelOpen:${panelKey}`,\n defaultOpen,\n );\n }\n\n /** Panel szélesség mentése (px). */\n static savePanelWidth(panelKey: string, width: number): void {\n Shr_LocalStoragePersistence_Util.writeNumber(`${STORAGE_PREFIX}:panelWidth:${panelKey}`, width);\n }\n\n /** Panel szélesség betöltése (px). */\n static loadPanelWidth(panelKey: string, defaultWidth: number): number {\n return Shr_LocalStoragePersistence_Util.readNumber(\n `${STORAGE_PREFIX}:panelWidth:${panelKey}`,\n defaultWidth,\n );\n }\n}\n", "import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\n\nimport { firstValueFrom } from 'rxjs';\n\nimport { environment } from '../../../../environments/environment';\n\n/**\n * Consultant POC REST API.\n */\n@Injectable({ providedIn: 'root' })\nexport class Consultant_ApiService {\n\n private readonly baseUrl: string = `${environment.api.baseUrl}/consultant`;\n\n private readonly http: HttpClient = inject(HttpClient);\n\n /**\n * Thread lista.\n */\n listThreads(): Promise<{ threads: Record<string, unknown>[] }> {\n return firstValueFrom(\n this.http.get<{ threads: Record<string, unknown>[] }>(this.baseUrl),\n );\n }\n\n /**\n * Picker opciók: Model Registry lista + default pair szerver oldali merge-elve.\n * A response tartalmazza az effektív defaults párost is.\n */\n getPickerOptions(): Promise<{\n entries: Record<string, unknown>[];\n defaults: { providerInstanceId: string; model: string };\n }> {\n return firstValueFrom(\n this.http.get<{\n entries: Record<string, unknown>[];\n defaults: { providerInstanceId: string; model: string };\n }>(`${this.baseUrl}/picker-options`),\n );\n }\n\n /**\n * Új thread.\n */\n createThread(params: {\n label?: string;\n providerInstanceId: string;\n model: string;\n }): Promise<{ thread: Record<string, unknown> }> {\n return firstValueFrom(\n this.http.post<{ thread: Record<string, unknown> }>(this.baseUrl, params),\n );\n }\n\n /**\n * Thread részletek.\n */\n getThread(threadId: string): Promise<{ thread: Record<string, unknown> }> {\n return firstValueFrom(\n this.http.get<{ thread: Record<string, unknown> }>(\n `${this.baseUrl}/${encodeURIComponent(threadId)}`,\n ),\n );\n }\n\n /**\n * Thread meta patch.\n */\n patchThread(params: {\n threadId: string;\n label?: string;\n providerInstanceId?: string;\n model?: string;\n }): Promise<{ thread: Record<string, unknown> }> {\n const body: Record<string, unknown> = {};\n if (params.label != null) {\n body.label = params.label;\n }\n if (params.providerInstanceId != null) {\n body.providerInstanceId = params.providerInstanceId;\n }\n if (params.model != null) {\n body.model = params.model;\n }\n return firstValueFrom(\n this.http.patch<{ thread: Record<string, unknown> }>(\n `${this.baseUrl}/${encodeURIComponent(params.threadId)}`,\n body,\n ),\n );\n }\n\n /**\n * Thread törlés.\n */\n deleteThread(threadId: string): Promise<{ ok: boolean }> {\n return firstValueFrom(\n this.http.delete<{ ok: boolean }>(\n `${this.baseUrl}/${encodeURIComponent(threadId)}`,\n ),\n );\n }\n\n /**\n * Üzenet küldése.\n */\n postMessage(params: {\n threadId: string;\n text: string;\n allowWebSearch: boolean;\n attachments: Record<string, unknown>[];\n }): Promise<Record<string, unknown>> {\n return firstValueFrom(\n this.http.post<Record<string, unknown>>(\n `${this.baseUrl}/${encodeURIComponent(params.threadId)}/messages`,\n {\n text: params.text,\n allowWebSearch: params.allowWebSearch,\n attachments: params.attachments,\n },\n ),\n );\n }\n}\n", "import { inject, Injectable, signal, WritableSignal } from '@angular/core';\n\nimport { Consultant_ApiService } from './consultant.api-service';\nimport {\n CCAP_ConsultantMessage_Client_Interface,\n CCAP_ConsultantThreadDetail_Client_Interface,\n CCAP_ConsultantThreadSummary_Client_Interface,\n} from '../../../_models/interfaces/consultant/ccap-consultant-client.interface';\nimport {\n MRg_ListItem_Response,\n} from '../../ai-systems/_modules/model-registry/_services/mrg-list-item.interface';\nimport { CCAP_GlobalError_ControlService } from '../../../_services/control-services/ccap-global-error.control-service';\n\n/**\n * Consultant POC állapot (SSOT).\n */\n@Injectable({ providedIn: 'root' })\nexport class Consultant_DataService {\n\n private readonly consultant_AS: Consultant_ApiService = inject(Consultant_ApiService);\n private readonly globalError_CS: CCAP_GlobalError_ControlService =\n inject(CCAP_GlobalError_ControlService);\n\n readonly threads_$: WritableSignal<CCAP_ConsultantThreadSummary_Client_Interface[]> =\n signal<CCAP_ConsultantThreadSummary_Client_Interface[]>([]);\n\n readonly threadsLoading_$: WritableSignal<boolean> = signal<boolean>(false);\n readonly threadsError_$: WritableSignal<unknown | null> = signal<unknown | null>(null);\n\n readonly selectedThread_$: WritableSignal<CCAP_ConsultantThreadDetail_Client_Interface | null> =\n signal<CCAP_ConsultantThreadDetail_Client_Interface | null>(null);\n\n readonly selectedThreadLoading_$: WritableSignal<boolean> = signal<boolean>(false);\n readonly selectedThreadError_$: WritableSignal<unknown | null> = signal<unknown | null>(null);\n\n readonly sending_$: WritableSignal<boolean> = signal<boolean>(false);\n\n readonly activeThreadId_$: WritableSignal<string> = signal<string>('');\n\n /** Effektív default provider/model pár (szerver SSOT: SC_Effective). */\n readonly defaults_$: WritableSignal<{ providerInstanceId: string; model: string }> =\n signal<{ providerInstanceId: string; model: string }>({ providerInstanceId: '', model: '' });\n\n /** Picker opciók (registry lista + default pair szerver oldali merge). */\n readonly pickerOptions_$: WritableSignal<MRg_ListItem_Response[]> =\n signal<MRg_ListItem_Response[]>([]);\n\n readonly pickerOptionsLoading_$: WritableSignal<boolean> = signal<boolean>(false);\n\n /**\n * Picker opciók betöltése (registry + default pair szerver oldali merge).\n * A defaults_$ signal-t is frissíti a válasz defaults mezőjéből.\n */\n async loadPickerOptions(): Promise<void> {\n this.pickerOptionsLoading_$.set(true);\n try {\n const res: {\n entries: Record<string, unknown>[];\n defaults: { providerInstanceId: string; model: string };\n } = await this.consultant_AS.getPickerOptions();\n const entries: MRg_ListItem_Response[] = Array.isArray(res.entries)\n ? res.entries.map(Consultant_DataService.parseRegistryEntry).filter(\n (e: MRg_ListItem_Response | null): e is MRg_ListItem_Response => e !== null,\n )\n : [];\n this.pickerOptions_$.set(entries);\n this.defaults_$.set({\n providerInstanceId: typeof res.defaults?.providerInstanceId === 'string'\n ? res.defaults.providerInstanceId : '',\n model: typeof res.defaults?.model === 'string' ? res.defaults.model : '',\n });\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'Consultant_DataService.loadPickerOptions');\n } finally {\n this.pickerOptionsLoading_$.set(false);\n }\n }\n\n /**\n * Thread lista betöltése.\n */\n async loadThreads(): Promise<void> {\n this.threadsLoading_$.set(true);\n this.threadsError_$.set(null);\n try {\n const res: { threads: Record<string, unknown>[] } = await this.consultant_AS.listThreads();\n const rawList: Record<string, unknown>[] = Array.isArray(res.threads) ? res.threads : [];\n const mapped: CCAP_ConsultantThreadSummary_Client_Interface[] = rawList.map(\n (row: Record<string, unknown>): CCAP_ConsultantThreadSummary_Client_Interface => ({\n threadId: typeof row.threadId === 'string' ? row.threadId : '',\n label: typeof row.label === 'string' ? row.label : '',\n providerInstanceId:\n typeof row.providerInstanceId === 'string' ? row.providerInstanceId : '',\n model: typeof row.model === 'string' ? row.model : '',\n messageCount: typeof row.messageCount === 'number' ? row.messageCount : 0,\n updatedAt: typeof row.updatedAt === 'string' ? row.updatedAt : '',\n }),\n );\n this.threads_$.set(mapped);\n } catch (err: unknown) {\n this.threadsError_$.set(err);\n this.globalError_CS.showError(err, 'Consultant_DataService.loadThreads');\n } finally {\n this.threadsLoading_$.set(false);\n }\n }\n\n /**\n * Egy thread részletei.\n */\n async loadThreadDetail(threadId: string): Promise<void> {\n this.activeThreadId_$.set(threadId);\n this.selectedThreadLoading_$.set(true);\n this.selectedThreadError_$.set(null);\n try {\n const res: { thread: Record<string, unknown> } = await this.consultant_AS.getThread(threadId);\n const detail: CCAP_ConsultantThreadDetail_Client_Interface | null =\n Consultant_DataService.parseThreadDetail(res.thread);\n this.selectedThread_$.set(detail);\n } catch (err: unknown) {\n this.selectedThreadError_$.set(err);\n this.globalError_CS.showError(err, 'Consultant_DataService.loadThreadDetail');\n } finally {\n this.selectedThreadLoading_$.set(false);\n }\n }\n\n /**\n * Üzenet küldés + lista frissítés.\n */\n async sendMessage(params: {\n threadId: string;\n text: string;\n allowWebSearch: boolean;\n attachments: Record<string, unknown>[];\n }): Promise<void> {\n this.sending_$.set(true);\n try {\n const res: Record<string, unknown> = await this.consultant_AS.postMessage(params);\n const threadRaw: unknown = res.thread;\n if (Consultant_DataService.isPlainRecord(threadRaw)) {\n const detail: CCAP_ConsultantThreadDetail_Client_Interface | null =\n Consultant_DataService.parseThreadDetail(threadRaw);\n this.selectedThread_$.set(detail);\n }\n await this.loadThreads();\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'Consultant_DataService.sendMessage');\n throw err;\n } finally {\n this.sending_$.set(false);\n }\n }\n\n /**\n * Provider/modell frissítés.\n */\n async updateThreadConfig(params: {\n threadId: string;\n providerInstanceId?: string;\n model?: string;\n label?: string;\n }): Promise<void> {\n try {\n const res: { thread: Record<string, unknown> } = await this.consultant_AS.patchThread(params);\n const detail: CCAP_ConsultantThreadDetail_Client_Interface | null =\n Consultant_DataService.parseThreadDetail(res.thread);\n this.selectedThread_$.set(detail);\n await this.loadThreads();\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'Consultant_DataService.updateThreadConfig');\n throw err;\n }\n }\n\n /**\n * Új thread létrehozása.\n */\n async createThread(params: {\n label?: string;\n providerInstanceId: string;\n model: string;\n }): Promise<string> {\n try {\n const res: { thread: Record<string, unknown> } = await this.consultant_AS.createThread(params);\n const idRaw: unknown = res.thread.threadId;\n const threadId: string = typeof idRaw === 'string' ? idRaw : '';\n await this.loadThreads();\n return threadId;\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'Consultant_DataService.createThread');\n throw err;\n }\n }\n\n /**\n * Thread törlése.\n */\n async deleteThread(threadId: string): Promise<void> {\n try {\n await this.consultant_AS.deleteThread(threadId);\n if (this.activeThreadId_$() === threadId) {\n this.selectedThread_$.set(null);\n this.activeThreadId_$.set('');\n }\n await this.loadThreads();\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'Consultant_DataService.deleteThread');\n throw err;\n }\n }\n\n /**\n * API thread objektum → részletek típus.\n */\n private static parseThreadDetail(\n raw: Record<string, unknown>,\n ): CCAP_ConsultantThreadDetail_Client_Interface | null {\n const threadId: string = typeof raw['threadId'] === 'string' ? raw['threadId'] : '';\n if (!threadId.length) {\n return null;\n }\n const messagesRaw: unknown = raw['messages'];\n const messages: CCAP_ConsultantMessage_Client_Interface[] = [];\n if (Array.isArray(messagesRaw)) {\n for (const m of messagesRaw) {\n if (!Consultant_DataService.isPlainRecord(m)) {\n continue;\n }\n const id: string = typeof m.id === 'string' ? m.id : '';\n const roleRaw: unknown = m.role;\n if (roleRaw !== 'user' && roleRaw !== 'assistant') {\n continue;\n }\n const msg: CCAP_ConsultantMessage_Client_Interface = {\n id: id,\n role: roleRaw,\n };\n if (typeof m.rawUserText === 'string') {\n msg.rawUserText = m.rawUserText;\n }\n if (typeof m.content === 'string') {\n msg.content = m.content;\n }\n const upRaw: unknown = m.userParts;\n if (Array.isArray(upRaw)) {\n const parts: CCAP_ConsultantMessage_Client_Interface['userParts'] = [];\n for (const p of upRaw) {\n if (!Consultant_DataService.isPlainRecord(p)) {\n continue;\n }\n const t: unknown = p.type;\n if (t !== 'text' && t !== 'image_url') {\n continue;\n }\n const part: {\n type: 'text' | 'image_url';\n text?: string;\n imageUrl?: string;\n } = { type: t };\n if (typeof p.text === 'string') {\n part.text = p.text;\n }\n if (typeof p.imageUrl === 'string') {\n part.imageUrl = p.imageUrl;\n }\n parts.push(part);\n }\n msg.userParts = parts;\n }\n messages.push(msg);\n }\n }\n return {\n threadId: threadId,\n label: typeof raw['label'] === 'string' ? raw['label'] : '',\n providerInstanceId:\n typeof raw['providerInstanceId'] === 'string' ? raw['providerInstanceId'] : '',\n model: typeof raw['model'] === 'string' ? raw['model'] : '',\n messages: messages,\n updatedAt: typeof raw['updatedAt'] === 'string' ? raw['updatedAt'] : '',\n };\n }\n\n private static isPlainRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n }\n\n /**\n * Registry entry JSON → típusos `MRg_ListItem_Response`.\n * Csak a picker-hez szükséges mezőket parsoljuk; null ha strukturálisan érvénytelen.\n */\n private static parseRegistryEntry(raw: unknown): MRg_ListItem_Response | null {\n if (!Consultant_DataService.isPlainRecord(raw)) {\n return null;\n }\n const provider: string = typeof raw['provider'] === 'string' ? raw['provider'] : '';\n const modelName: string = typeof raw['modelName'] === 'string' ? raw['modelName'] : '';\n if (!provider.length || !modelName.length) {\n return null;\n }\n const capsRaw: unknown = raw['capabilities'];\n const capabilities: string[] | undefined = Array.isArray(capsRaw)\n ? capsRaw.filter((c: unknown): c is string => typeof c === 'string')\n : undefined;\n return {\n id: typeof raw['id'] === 'string' ? raw['id'] : '',\n provider: provider,\n modelName: modelName,\n enabled: raw['enabled'] === true,\n capabilities: capabilities,\n };\n }\n}\n", "import { MRg_ListItem_Response } from '../../ai-systems/_modules/model-registry/_services/mrg-list-item.interface';\n\n/**\n * Consultant picker provider/model lista util (SSOT: mindenhol ugyanez a logika).\n */\nexport class Con_PickerModel_Util {\n\n /**\n * Egyedi, rendezett provider lista a picker entry-kből.\n */\n static collectSortedProviders(entries: MRg_ListItem_Response[]): string[] {\n const set: Set<string> = new Set<string>();\n for (const e of entries) {\n const prov: string = e.provider.trim();\n if (prov.length > 0) {\n set.add(prov);\n }\n }\n return [...set].sort();\n }\n\n /**\n * Adott providerhez tartozó egyedi, rendezett modellek.\n */\n static collectSortedModelsForProvider(\n entries: MRg_ListItem_Response[],\n provider: string,\n ): string[] {\n const p: string = provider.trim();\n if (!p.length) {\n return [];\n }\n const names: string[] = [];\n for (const e of entries) {\n const mn: string = e.modelName.trim();\n if (e.provider === p && mn.length > 0) {\n names.push(mn);\n }\n }\n return [...new Set(names)].sort();\n }\n}\n", "import { Component, OnInit, inject, signal, computed } from '@angular/core';\nimport { Router } from '@angular/router';\n\nimport { ProviderDisplayLabel_Util } from '../../../../_collections/display/provider-display-label.util';\nimport { Consultant_DataService } from '../../_services/consultant.data-service';\nimport { ModelRegistry_DataService } from '../../../ai-systems/_modules/model-registry/_services/model-registry.data-service';\nimport { MRg_SetupConfig_Type } from '../../../ai-systems/_modules/model-registry/_services/mrg-setup-config.type';\nimport { S_SessionListRowView_Interface } from '../../../shared/_models/interfaces/s-session-list-row-view.interface';\nimport { CCAP_ConsultantThreadSummary_Client_Interface } from '../../../../_models/interfaces/consultant/ccap-consultant-client.interface';\nimport { Con_PickerModel_Util } from '../../_collections/con-picker-model.util';\n\n/**\n * Consultant thread lista + új chat.\n */\n@Component({\n selector: 'app-ccap-consultant-dashboard',\n templateUrl: './con-dashboard.component.html',\n host: { class: 'flex flex-col flex-1 min-h-0 overflow-hidden' },\n})\n/** Con_Dashboard_Component class. */\nexport class Con_Dashboard_Component implements OnInit {\n\n readonly consultant_DS: Consultant_DataService = inject(Consultant_DataService);\n private readonly router: Router = inject(Router);\n private readonly modelRegistry_DS: ModelRegistry_DataService =\n inject(ModelRegistry_DataService);\n\n readonly isCreateOpen_$ = signal<boolean>(false);\n readonly newLabel_$ = signal<string>('');\n readonly newProvider_$ = signal<string>('');\n readonly newModel_$ = signal<string>('');\n readonly isCreating_$ = signal<boolean>(false);\n\n /**\n * Egyedi provider instance id-k a szerveri picker listából.\n */\n readonly providerOptions_$ = computed((): string[] => {\n return Con_PickerModel_Util.collectSortedProviders(this.consultant_DS.pickerOptions_$());\n });\n\n /**\n * Kiválasztott providerhez tartozó modellek.\n */\n readonly modelsForNewProvider_$ = computed((): string[] => {\n return Con_PickerModel_Util.collectSortedModelsForProvider(\n this.consultant_DS.pickerOptions_$(),\n this.newProvider_$(),\n );\n });\n\n /**\n * Provider id → megjelenített címke (display label config-ból).\n */\n readonly providerDisplayLabelsMap_$ = computed((): Record<string, string> => {\n const config: MRg_SetupConfig_Type = this.modelRegistry_DS.setupConfigForRegistry_$();\n const providers: string[] = this.providerOptions_$();\n const m: Record<string, string> = {};\n for (const p of providers) {\n if (m[p] == null) {\n m[p] = ProviderDisplayLabel_Util.getProviderDisplayLabel(p, config);\n }\n }\n return m;\n });\n\n /**\n * Thread lista sorokhoz: ismert providerInstanceId → display label.\n */\n readonly threadProviderDisplayLabels_$ = computed((): Record<string, string> => {\n const config: MRg_SetupConfig_Type = this.modelRegistry_DS.setupConfigForRegistry_$();\n const ids: Set<string> = new Set<string>();\n for (const t of this.consultant_DS.threads_$()) {\n const id: string = t.providerInstanceId.trim();\n if (id.length > 0) {\n ids.add(id);\n }\n }\n for (const p of this.providerOptions_$()) {\n ids.add(p);\n }\n const m: Record<string, string> = {};\n for (const id of ids) {\n m[id] = ProviderDisplayLabel_Util.getProviderDisplayLabel(id, config);\n }\n return m;\n });\n\n /** Thread lista → shared list row view model mapping. */\n readonly threadRowViews_$ = computed((): S_SessionListRowView_Interface[] =>\n this.consultant_DS.threads_$().map(\n (t: CCAP_ConsultantThreadSummary_Client_Interface): S_SessionListRowView_Interface => ({\n id: t.threadId,\n label: t.label || t.threadId,\n status: '',\n statusColorClass: 'bg-neutral-600',\n isArchived: false,\n lastActivityAt: t.updatedAt,\n isRunning: false,\n }),\n ),\n );\n\n // ── Context menu state ──────────────────────────────────────\n\n /** Kontextmenü thread-je (null = zárt). */\n readonly ctxMenuThread_$ = signal<CCAP_ConsultantThreadSummary_Client_Interface | null>(null);\n\n /** Kontextmenü pozíció. */\n readonly ctxMenuPos_$ = signal<{ x: number; y: number }>({ x: 0, y: 0 });\n\n ngOnInit(): void {\n void this.consultant_DS.loadThreads();\n void this.consultant_DS.loadPickerOptions();\n void this.modelRegistry_DS.loadSetupConfigForRegistry();\n }\n\n /**\n * Navigálás a kiválasztott consultant thread-re.\n */\n handleSelectThread(threadId: string): void {\n void this.router.navigate(['/consultant', threadId]);\n }\n\n /**\n * Modál megnyitás: friss picker opciók + szerveri defaults pre-selection.\n */\n async handleOpenCreate(): Promise<void> {\n await this.consultant_DS.loadPickerOptions();\n const defaults: { providerInstanceId: string; model: string } = this.consultant_DS.defaults_$();\n const providers: string[] = this.providerOptions_$();\n if (defaults.providerInstanceId.length > 0 && providers.includes(defaults.providerInstanceId)) {\n const models: string[] = Con_PickerModel_Util.collectSortedModelsForProvider(\n this.consultant_DS.pickerOptions_$(),\n defaults.providerInstanceId,\n );\n if (defaults.model.length > 0 && models.includes(defaults.model)) {\n this.newProvider_$.set(defaults.providerInstanceId);\n this.newModel_$.set(defaults.model);\n } else {\n this.newProvider_$.set(defaults.providerInstanceId);\n this.newModel_$.set(models[0] ?? '');\n }\n } else {\n const firstP: string = providers[0] ?? '';\n this.newProvider_$.set(firstP);\n const fallbackModels: string[] = Con_PickerModel_Util.collectSortedModelsForProvider(\n this.consultant_DS.pickerOptions_$(),\n firstP,\n );\n this.newModel_$.set(fallbackModels[0] ?? '');\n }\n this.newLabel_$.set('');\n this.isCreateOpen_$.set(true);\n }\n\n /**\n * Új thread modál bezárása.\n */\n handleCloseCreate(): void {\n this.isCreateOpen_$.set(false);\n }\n\n /**\n * Provider váltás — modell lista első elemére állítás.\n */\n handleProviderChange(value: string): void {\n this.newProvider_$.set(value);\n const models: string[] = Con_PickerModel_Util.collectSortedModelsForProvider(\n this.consultant_DS.pickerOptions_$(),\n value,\n );\n this.newModel_$.set(models[0] ?? '');\n }\n\n /**\n * Új consultant thread létrehozása a kiválasztott provider/model párossal.\n */\n async handleCreateThread(): Promise<void> {\n const provider: string = this.newProvider_$().trim();\n const model: string = this.newModel_$().trim();\n if (!provider.length || !model.length) {\n return;\n }\n this.isCreating_$.set(true);\n try {\n const label: string = this.newLabel_$().trim();\n const id: string = await this.consultant_DS.createThread({\n label: label.length > 0 ? label : undefined,\n providerInstanceId: provider,\n model: model,\n });\n this.isCreateOpen_$.set(false);\n if (id.length > 0) {\n void this.router.navigate(['/consultant', id]);\n }\n } finally {\n this.isCreating_$.set(false);\n }\n }\n\n // ── Context menu handlers ────────────────────────────────────\n\n /** Shared list row contextMenu output kezelése. */\n handleRowContextMenu(payload: { event: MouseEvent; id: string }): void {\n const thread: CCAP_ConsultantThreadSummary_Client_Interface | undefined =\n this.consultant_DS.threads_$().find(\n (t: CCAP_ConsultantThreadSummary_Client_Interface): boolean => t.threadId === payload.id,\n );\n if (!thread) {\n return;\n }\n this.ctxMenuThread_$.set(thread);\n this.ctxMenuPos_$.set({ x: payload.event.clientX, y: payload.event.clientY });\n }\n\n /** Kontextmenü bezárása. */\n handleCloseCtxMenu(): void {\n this.ctxMenuThread_$.set(null);\n }\n\n /** Delete a kontextmenüből. */\n async handleCtxDelete(): Promise<void> {\n const thread: CCAP_ConsultantThreadSummary_Client_Interface | null = this.ctxMenuThread_$();\n if (!thread) {\n return;\n }\n this.handleCloseCtxMenu();\n try {\n await this.consultant_DS.deleteThread(thread.threadId);\n void this.router.navigate(['/consultant']);\n } catch {\n // Hibát a data service kezeli\n }\n }\n}\n", "<div class=\"flex flex-col flex-1 min-h-0\">\n <div class=\"shrink-0 p-2 border-b border-neonDefault flex items-center gap-2\">\n <span class=\"text-xs font-semibold text-neutral-300 flex-1 truncate\">Consultant</span>\n <button\n type=\"button\"\n class=\"px-2 py-1 text-xs border border-neonDefault text-neutral-300 hover:bg-neutral-700 rounded transition-colors\"\n (click)=\"handleOpenCreate()\">\n + New\n </button>\n </div>\n\n <div class=\"flex-1 overflow-y-auto\">\n @if (consultant_DS.threadsLoading_$()) {\n <div class=\"p-3 text-xs text-neutral-500\">Loading...</div>\n } @else if (threadRowViews_$().length) {\n @for (row of threadRowViews_$(); track row.id) {\n <app-s-session-info-card\n [view]=\"row\"\n [isActive]=\"consultant_DS.activeThreadId_$() === row.id\"\n (selected)=\"handleSelectThread($event)\"\n (contextMenu)=\"handleRowContextMenu($event)\" />\n }\n } @else {\n <div class=\"p-4 text-center text-neutral-500 text-xs\">No threads</div>\n }\n </div>\n</div>\n\n@if (isCreateOpen_$()) {\n <div class=\"fixed inset-0 z-40 flex items-center justify-center bg-black/60 p-4\" (click)=\"handleCloseCreate()\">\n <div\n class=\"w-full max-w-md rounded-lg border border-neonDefault bg-neutral-900 p-4 shadow-xl\"\n (click)=\"$event.stopPropagation()\">\n <h3 class=\"text-sm font-semibold text-neutral-200 mb-3\">New consultant thread</h3>\n <div class=\"flex flex-col gap-2 text-xs\">\n <label class=\"text-neutral-400\">Label (optional)</label>\n <input\n class=\"w-full px-2 py-1 rounded bg-neutral-800 border border-neutral-600 text-neutral-200\"\n [ngModel]=\"newLabel_$()\"\n (ngModelChange)=\"newLabel_$.set($event)\" />\n\n <label class=\"text-neutral-400\">Provider</label>\n <select\n class=\"w-full px-2 py-1 rounded bg-neutral-800 border border-neutral-600 text-neutral-200\"\n [ngModel]=\"newProvider_$()\"\n (ngModelChange)=\"handleProviderChange($event)\">\n @for (p of providerOptions_$(); track p) {\n <option [value]=\"p\">{{ providerDisplayLabelsMap_$()[p] || p }}</option>\n }\n </select>\n\n <label class=\"text-neutral-400\">Model</label>\n <select\n class=\"w-full px-2 py-1 rounded bg-neutral-800 border border-neutral-600 text-neutral-200\"\n [ngModel]=\"newModel_$()\"\n (ngModelChange)=\"newModel_$.set($event)\">\n @for (m of modelsForNewProvider_$(); track m) {\n <option [value]=\"m\">{{ m }}</option>\n }\n </select>\n </div>\n <div class=\"flex justify-end gap-2 mt-4\">\n <button\n type=\"button\"\n class=\"px-2 py-1 text-xs border border-neutral-600 text-neutral-400 rounded\"\n (click)=\"handleCloseCreate()\">\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"px-2 py-1 text-xs border border-neonDefault text-neutral-200 rounded disabled:opacity-40\"\n [disabled]=\"isCreating_$() || !newProvider_$().trim() || !newModel_$().trim()\"\n (click)=\"handleCreateThread()\">\n Create\n </button>\n </div>\n </div>\n </div>\n}\n\n<!-- Context menu overlay -->\n@if (ctxMenuThread_$(); as ctxThread) {\n <div class=\"fixed inset-0 z-40\" (click)=\"handleCloseCtxMenu()\"></div>\n <div class=\"fixed z-50 min-w-[140px] bg-neutral-900 border border-neutral-700 rounded-lg shadow-xl py-1 text-xs\"\n [style.left.px]=\"ctxMenuPos_$().x\"\n [style.top.px]=\"ctxMenuPos_$().y\">\n <button\n class=\"w-full text-left px-3 py-1.5 text-red-400 hover:bg-red-500/10 transition-colors\"\n (click)=\"handleCtxDelete()\">\n Delete\n </button>\n </div>\n}\n", "import { Component, OnInit, signal } from '@angular/core';\n\nimport { Con_InputStorage_Util } from '../../_collections/con-input-storage.util';\nimport {\n SESSION_SHELL_SIDEBAR_DEFAULT_WIDTH_PX,\n SESSION_SHELL_SIDEBAR_MAX_WIDTH_PX,\n SESSION_SHELL_SIDEBAR_MIN_WIDTH_PX,\n} from '../../../shared/_collections/consts/session-detail-panel-layout.const';\nimport { SHR_DocumentPointerDrag_Util } from '../../../shared/_collections/utils/shr-document-pointer-drag.util';\n\n/**\n * Consultant POC shell: resizable bal lista + router-outlet (OC/CC session minta).\n */\n@Component({\n selector: 'app-ccap-consultant-shell',\n templateUrl: './con-shell.component.html',\n host: { class: 'flex min-h-0 w-full flex-1 flex-col overflow-hidden' },\n})\n/** Con_Shell_Component class. */\nexport class Con_Shell_Component implements OnInit {\n\n /** Bal sidebar szélessége (px). */\n readonly sidebarWidth_$ = signal<number>(SESSION_SHELL_SIDEBAR_DEFAULT_WIDTH_PX);\n\n /** Sidebar látható. */\n readonly isSidebarOpen_$ = signal<boolean>(true);\n\n /** Resize közben select-none a root-on. */\n readonly isResizing_$ = signal<boolean>(false);\n\n ngOnInit(): void {\n const stored: number = Con_InputStorage_Util.loadPanelWidth(\n 'sidebar',\n SESSION_SHELL_SIDEBAR_DEFAULT_WIDTH_PX,\n );\n this.sidebarWidth_$.set(\n Math.max(\n SESSION_SHELL_SIDEBAR_MIN_WIDTH_PX,\n Math.min(SESSION_SHELL_SIDEBAR_MAX_WIDTH_PX, stored),\n ),\n );\n this.isSidebarOpen_$.set(Con_InputStorage_Util.loadPanelOpen('sidebar', true));\n }\n\n /**\n * Sidebar resize drag indítása.\n */\n handleSidebarResizeStart(event: PointerEvent): void {\n const startX: number = event.clientX;\n const startWidth: number = this.sidebarWidth_$();\n this.isResizing_$.set(true);\n SHR_DocumentPointerDrag_Util.attachUntilPointerUp({\n startEvent: event,\n onMove: (e: PointerEvent): void => {\n const delta: number = e.clientX - startX;\n const newWidth: number = Math.max(\n SESSION_SHELL_SIDEBAR_MIN_WIDTH_PX,\n Math.min(SESSION_SHELL_SIDEBAR_MAX_WIDTH_PX, startWidth + delta),\n );\n this.sidebarWidth_$.set(newWidth);\n },\n onEnd: (): void => {\n this.isResizing_$.set(false);\n Con_InputStorage_Util.savePanelWidth('sidebar', this.sidebarWidth_$());\n },\n });\n }\n\n /**\n * Sidebar ki/be — állapot mentése.\n */\n handleToggleSidebar(): void {\n this.isSidebarOpen_$.update((v: boolean): boolean => !v);\n Con_InputStorage_Util.savePanelOpen('sidebar', this.isSidebarOpen_$());\n }\n}\n", "<div class=\"flex min-h-0 w-full flex-1 flex-col overflow-hidden\" [class.select-none]=\"isResizing_$()\">\n <app-s-session-shell-toolbar>\n <div sSessionToolbarLeft class=\"flex items-center gap-1 min-w-0\">\n <button\n type=\"button\"\n class=\"px-2 py-1 text-xs border border-neonDefault text-neutral-300 hover:bg-neutral-700 rounded transition-colors flex items-center gap-1 shrink-0\"\n (click)=\"handleToggleSidebar()\">\n <svg\n class=\"w-3 h-3 shrink-0 transition-transform duration-150\"\n [class.rotate-90]=\"isSidebarOpen_$()\"\n [class.-rotate-90]=\"!isSidebarOpen_$()\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n Consultant\n </button>\n </div>\n <div sSessionToolbarCenter class=\"min-w-0\"></div>\n <div sSessionToolbarRight class=\"min-w-0\"></div>\n </app-s-session-shell-toolbar>\n\n <app-s-resizable-session-shell-layout\n [isSidebarOpen]=\"isSidebarOpen_$()\"\n [sidebarWidthPx]=\"sidebarWidth_$()\"\n [isResizing]=\"isResizing_$()\"\n (sidebarResizeStart)=\"handleSidebarResizeStart($event)\">\n <div sSessionShellSidebar class=\"flex flex-col overflow-hidden h-full\">\n <app-ccap-consultant-dashboard />\n </div>\n <div\n sSessionShellMain\n class=\"flex min-h-0 flex-1 flex-col overflow-hidden [&>router-outlet]:contents\">\n <router-outlet />\n </div>\n </app-s-resizable-session-shell-layout>\n</div>\n", "import { CCAP_AgentConsoleBubbleKind_Type } from '../../../_enums/shared/ccap-agent-console-bubble-kind.enum';\nimport { CCAP_AgentConsoleBubbleView_Interface } from '../../../_models/interfaces/shared/ccap-agent-console-bubble-view.interface';\nimport { CCAP_ConsultantMessage_Client_Interface } from '../../../_models/interfaces/consultant/ccap-consultant-client.interface';\n\n/**\n * Consultant üzenet → közös buborék view-model.\n */\nexport class Con_MsgToBubbleView_Util {\n\n /**\n * Consultant thread üzenet mapelése.\n */\n static fromMessage(msg: CCAP_ConsultantMessage_Client_Interface): CCAP_AgentConsoleBubbleView_Interface {\n const isUser: boolean = msg.role === 'user';\n const bodyText: string = isUser\n ? Con_MsgToBubbleView_Util.buildUserBodyText(msg)\n : (msg.content ?? '');\n return {\n listKey: msg.id,\n kind: isUser ? CCAP_AgentConsoleBubbleKind_Type.userPrompt : CCAP_AgentConsoleBubbleKind_Type.assistant,\n bodyText: bodyText,\n isUserAligned: isUser,\n flags: {\n showCopy: true,\n showRawInfo: false,\n useEditDiffForExpandable: false,\n },\n };\n }\n\n /**\n * User sor: nyers szöveg + több userPart esetén attachment jelölés (régi detail megjelenítés).\n */\n private static buildUserBodyText(msg: CCAP_ConsultantMessage_Client_Interface): string {\n const raw: string = (msg.rawUserText ?? '').trim();\n const hasParts: boolean = (msg.userParts?.length ?? 0) > 1;\n if (hasParts) {\n return raw.length > 0 ? `${raw}\\n[attachments]` : '[attachments]';\n }\n if (raw.length > 0) {\n return raw;\n }\n return msg.content ?? '';\n }\n}\n", "import {\n Component,\n computed,\n effect,\n inject,\n OnDestroy,\n signal,\n ViewChild,\n WritableSignal,\n} from '@angular/core';\nimport { ActivatedRoute, ParamMap, Router } from '@angular/router';\n\nimport { map } from 'rxjs';\n\nimport { DyNX_SubscriptionControl } from '@futdevpro/ngx-dynamo';\n\nimport { Consultant_DataService } from '../../_services/consultant.data-service';\nimport { VNP_InputUi_DataService } from '../../../dev/_modules/poc/_modules/voice-notes-poc/_services/vnp-input-ui.data-service';\nimport {\n S_SessionInput_Component,\n} from '../../../shared/_components/session-ui/s-session-input/s-session-input.component';\nimport { Con_PickerModel_Util } from '../../_collections/con-picker-model.util';\nimport {\n CCAP_PendingAttachment_Interface,\n} from '../../../../_models/interfaces/session/ccap-pending-attachment.interface';\nimport {\n CCAP_ConsultantMessage_Client_Interface,\n} from '../../../../_models/interfaces/consultant/ccap-consultant-client.interface';\nimport { CCAP_AgentConsoleBubbleView_Interface } from '../../../../_models/interfaces/shared/ccap-agent-console-bubble-view.interface';\nimport { Con_MsgToBubbleView_Util } from '../../_collections/con-msg-to-bubble-view.util';\n\n/**\n * Consultant chat részletek: üzenetek, composer, modellváltás.\n */\n@Component({\n selector: 'app-ccap-consultant-detail',\n templateUrl: './con-detail.component.html',\n host: { class: 'flex flex-col flex-1 min-h-0 overflow-hidden' },\n})\n/** Con_Detail_Component class. */\nexport class Con_Detail_Component extends DyNX_SubscriptionControl implements OnDestroy {\n\n readonly consultant_DS: Consultant_DataService = inject(Consultant_DataService);\n private readonly route: ActivatedRoute = inject(ActivatedRoute);\n private readonly router: Router = inject(Router);\n private readonly voiceInputUi_DS: VNP_InputUi_DataService =\n inject(VNP_InputUi_DataService);\n\n /** Shared session input komponens referencia (clearAttachments küldés után). */\n @ViewChild(S_SessionInput_Component) private sessionInputRef: S_SessionInput_Component | undefined;\n\n readonly composerText_$: WritableSignal<string> = signal<string>('');\n readonly allowWebSearch_$: WritableSignal<boolean> = signal<boolean>(false);\n\n readonly localLabel_$: WritableSignal<string> = signal<string>('');\n readonly localProvider_$: WritableSignal<string> = signal<string>('');\n readonly localModel_$: WritableSignal<string> = signal<string>('');\n\n /**\n * Provider opciók a szerveri picker listából (SSOT: data service).\n */\n readonly providerOptions_$ = computed((): string[] => {\n return Con_PickerModel_Util.collectSortedProviders(this.consultant_DS.pickerOptions_$());\n });\n\n /**\n * Model lista a kiválasztott providerhez (SSOT: shared util, template-ben nincs method hívás).\n */\n readonly modelsForSelectedProvider_$ = computed((): string[] => {\n return Con_PickerModel_Util.collectSortedModelsForProvider(\n this.consultant_DS.pickerOptions_$(),\n this.localProvider_$(),\n );\n });\n\n /**\n * Thread üzenetek buborék view-modelje (track: listKey = message id).\n */\n readonly consultantBubbleViews_$ = computed((): CCAP_AgentConsoleBubbleView_Interface[] => {\n const t = this.consultant_DS.selectedThread_$();\n if (!t) {\n return [];\n }\n return t.messages.map(\n (m: CCAP_ConsultantMessage_Client_Interface): CCAP_AgentConsoleBubbleView_Interface =>\n Con_MsgToBubbleView_Util.fromMessage(m),\n );\n });\n\n /** Shared input komponensből érkező attachment-ek (küldéshez konvertáljuk). */\n private pendingAttachments: CCAP_PendingAttachment_Interface[] = [];\n\n constructor() {\n super();\n this.addSubscription(this.route.paramMap.pipe(\n map((pm: ParamMap): string => pm.get('threadId') ?? ''),\n ).subscribe((threadId: string): void => {\n if (threadId.length > 0) {\n void this.consultant_DS.loadThreadDetail(threadId);\n } else {\n this.consultant_DS.selectedThread_$.set(null);\n this.consultant_DS.activeThreadId_$.set('');\n }\n }));\n\n effect((): void => {\n const t = this.consultant_DS.selectedThread_$();\n if (t != null) {\n this.localLabel_$.set(t.label);\n this.localProvider_$.set(t.providerInstanceId);\n this.localModel_$.set(t.model);\n }\n }, { allowSignalWrites: true });\n\n void this.consultant_DS.loadPickerOptions();\n }\n\n override ngOnDestroy(): void {\n super.ngOnDestroy();\n }\n\n handleProviderChange(value: string): void {\n this.localProvider_$.set(value);\n const models: string[] = Con_PickerModel_Util.collectSortedModelsForProvider(\n this.consultant_DS.pickerOptions_$(),\n value,\n );\n const cur: string = this.localModel_$();\n if (!models.includes(cur)) {\n this.localModel_$.set(models[0] ?? '');\n }\n }\n\n async handleApplyConfig(): Promise<void> {\n const threadId: string = this.consultant_DS.activeThreadId_$();\n if (!threadId.length) {\n return;\n }\n await this.consultant_DS.updateThreadConfig({\n threadId: threadId,\n label: this.localLabel_$(),\n providerInstanceId: this.localProvider_$(),\n model: this.localModel_$(),\n });\n }\n\n async handleDeleteThread(): Promise<void> {\n const threadId: string = this.consultant_DS.activeThreadId_$();\n if (!threadId.length) {\n return;\n }\n await this.consultant_DS.deleteThread(threadId);\n void this.router.navigate(['/consultant']);\n }\n\n /**\n * Shared input komponens attachment lista változás.\n */\n handleAttachmentsChanged(attachments: CCAP_PendingAttachment_Interface[]): void {\n this.pendingAttachments = attachments;\n }\n\n /**\n * Voice szegmens transcribe: akkumuláció + auto-send csak isFinal=true esetén.\n */\n handleVoiceSegment(event: { text: string; isFinal: boolean }): void {\n const t: string = event.text.trim();\n if (!t.length) {\n return;\n }\n const current: string = this.composerText_$().trim();\n this.composerText_$.set(current.length > 0 ? `${current} ${t}` : t);\n if (this.voiceInputUi_DS.autoSendAfterVoice_$() && event.isFinal) {\n void this.handleSend();\n }\n }\n\n /**\n * Üzenet küldése — pending attachment-eket consultant API formátumra konvertálja.\n */\n async handleSend(): Promise<void> {\n const threadId: string = this.consultant_DS.activeThreadId_$();\n if (!threadId.length) {\n return;\n }\n const text: string = this.composerText_$().trim();\n const currentAttachments: CCAP_PendingAttachment_Interface[] = [...this.pendingAttachments];\n if (!text.length && !currentAttachments.length) {\n return;\n }\n const attachments: Record<string, unknown>[] = currentAttachments.map(\n (a: CCAP_PendingAttachment_Interface): Record<string, unknown> => ({\n kind: a.isImage ? 'image' : 'textDocument',\n mimeType: a.mimeType,\n fileName: a.fileName,\n dataBase64: a.base64,\n }),\n );\n await this.consultant_DS.sendMessage({\n threadId: threadId,\n text: text,\n allowWebSearch: this.allowWebSearch_$(),\n attachments: attachments,\n });\n this.composerText_$.set('');\n this.pendingAttachments = [];\n this.sessionInputRef?.clearAttachments();\n }\n\n}\n", "@if (!consultant_DS.activeThreadId_$()) {\n <div class=\"flex flex-1 items-center justify-center p-4 text-xs text-neutral-500\">\n Select a thread or create a new consultant chat.\n </div>\n} @else if (consultant_DS.selectedThreadLoading_$()) {\n <div class=\"flex flex-1 items-center justify-center text-xs text-neutral-500\">Loading…</div>\n} @else {\n @if (consultant_DS.selectedThread_$()) {\n <app-s-session-chat-column-layout>\n <div\n sChatColumnHeader\n class=\"flex shrink-0 flex-col gap-2 border-b border-neonDefault bg-ccapSurface p-2\">\n <div class=\"flex flex-wrap items-end gap-2\">\n <div class=\"flex flex-col gap-0.5\">\n <span class=\"text-[10px] text-neutral-500\">Label</span>\n <input\n class=\"w-40 rounded border border-neutral-600 bg-neutral-800 px-2 py-1 text-xs text-neutral-200\"\n [ngModel]=\"localLabel_$()\"\n (ngModelChange)=\"localLabel_$.set($event)\" />\n </div>\n <div class=\"flex flex-col gap-0.5\">\n <span class=\"text-[10px] text-neutral-500\">Provider</span>\n <select\n class=\"w-36 rounded border border-neutral-600 bg-neutral-800 px-2 py-1 text-xs text-neutral-200\"\n [ngModel]=\"localProvider_$()\"\n (ngModelChange)=\"handleProviderChange($event)\">\n @for (p of providerOptions_$(); track p) {\n <option [value]=\"p\">{{ p }}</option>\n }\n </select>\n </div>\n <div class=\"flex flex-col gap-0.5\">\n <span class=\"text-[10px] text-neutral-500\">Model</span>\n <select\n class=\"w-40 rounded border border-neutral-600 bg-neutral-800 px-2 py-1 text-xs text-neutral-200\"\n [ngModel]=\"localModel_$()\"\n (ngModelChange)=\"localModel_$.set($event)\">\n @for (m of modelsForSelectedProvider_$(); track m) {\n <option [value]=\"m\">{{ m }}</option>\n }\n </select>\n </div>\n <button\n type=\"button\"\n class=\"rounded border border-neonDefault px-2 py-1 text-xs text-neutral-300\"\n (click)=\"handleApplyConfig()\">\n Apply\n </button>\n <button\n type=\"button\"\n class=\"ml-auto rounded border border-red-900 px-2 py-1 text-xs text-red-300\"\n (click)=\"handleDeleteThread()\">\n Delete\n </button>\n </div>\n </div>\n\n <div sChatColumnScroll class=\"flex flex-col gap-3 p-3\">\n @for (row of consultantBubbleViews_$(); track row.listKey) {\n <div\n class=\"max-w-[85%]\"\n [class.self-end]=\"row.isUserAligned === true\"\n [class.self-start]=\"row.isUserAligned !== true\">\n <app-s-agent-console-message-bubble [view]=\"row\" />\n </div>\n }\n </div>\n\n <div sChatColumnComposer class=\"flex flex-col\">\n <label class=\"flex cursor-pointer items-center gap-2 px-2 pt-1 text-[10px] text-neutral-400\">\n <input type=\"checkbox\" [ngModel]=\"allowWebSearch_$()\" (ngModelChange)=\"allowWebSearch_$.set($event)\" />\n Allow web search (Brave)\n </label>\n <app-s-session-input\n [draftText]=\"composerText_$()\"\n (draftTextChange)=\"composerText_$.set($event)\"\n [isSending]=\"consultant_DS.sending_$()\"\n [enableAttachments]=\"true\"\n acceptedFileTypes=\"image/png,image/jpeg,image/webp,image/gif,.txt,.md,text/plain,text/markdown\"\n placeholder=\"Message…\"\n [textareaRows]=\"3\"\n (sendRequested)=\"handleSend()\"\n (attachmentsChanged)=\"handleAttachmentsChanged($event)\">\n <app-ccap-voice-record-button\n sInputTextareaAccessory\n [compactLayout]=\"true\"\n (transcriptSegmentReady)=\"handleVoiceSegment($event)\">\n </app-ccap-voice-record-button>\n </app-s-session-input>\n </div>\n </app-s-session-chat-column-layout>\n } @else {\n <div class=\"flex flex-1 items-center justify-center p-4 text-xs text-neutral-500\">\n Thread not loaded.\n </div>\n }\n}\n", "import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { RouterModule, Routes } from '@angular/router';\n\nimport { CCAP_ErrorDisplay_Component } from '../../_components/ccap-error-display/ccap-error-display.component';\nimport { CCAP_VoiceRecordButton_Component } from '../../_components/ccap-voice-record-button/ccap-voice-record-button.component';\nimport { Shared_Module } from '../shared/shared.module';\nimport { Con_Shell_Component } from './_components/ccap-consultant-shell/con-shell.component';\nimport { Con_Dashboard_Component } from './_components/ccap-consultant-dashboard/con-dashboard.component';\nimport { Con_Detail_Component } from './_components/ccap-consultant-detail/con-detail.component';\n\nconst consultantRoutes: Routes = [\n {\n path: '',\n component: Con_Shell_Component,\n children: [\n { path: '', component: Con_Detail_Component },\n { path: ':threadId', component: Con_Detail_Component },\n ],\n },\n];\n\n/**\n * Consultant POC modul: egyszerű chat, provider/modell, mellékletek.\n */\n@NgModule({\n declarations: [\n Con_Shell_Component,\n Con_Dashboard_Component,\n Con_Detail_Component,\n ],\n imports: [\n CommonModule,\n FormsModule,\n RouterModule.forChild(consultantRoutes),\n CCAP_ErrorDisplay_Component,\n CCAP_VoiceRecordButton_Component,\n Shared_Module,\n ],\n})\n/** Consultant_Module class. */\nexport class Consultant_Module {}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["STORAGE_PREFIX", "Con_InputStorage_Util", "savePanelOpen", "panelKey", "isOpen", "Shr_LocalStoragePersistence_Util", "writeBoolean", "loadPanelOpen", "defaultOpen", "readBoolean", "savePanelWidth", "width", "writeNumber", "loadPanelWidth", "defaultWidth", "readNumber", "Consultant_ApiService", "baseUrl", "environment", "api", "http", "inject", "HttpClient", "listThreads", "firstValueFrom", "get", "getPickerOptions", "createThread", "params", "post", "getThread", "threadId", "encodeURIComponent", "patchThread", "body", "label", "providerInstanceId", "model", "patch", "deleteThread", "delete", "postMessage", "text", "allowWebSearch", "attachments", "factory", "\u0275fac", "providedIn", "Consultant_DataService", "consultant_AS", "inject", "Consultant_ApiService", "globalError_CS", "CCAP_GlobalError_ControlService", "threads_$", "signal", "threadsLoading_$", "threadsError_$", "selectedThread_$", "selectedThreadLoading_$", "selectedThreadError_$", "sending_$", "activeThreadId_$", "defaults_$", "providerInstanceId", "model", "pickerOptions_$", "pickerOptionsLoading_$", "loadPickerOptions", "__async", "set", "res", "getPickerOptions", "entries", "Array", "isArray", "map", "parseRegistryEntry", "filter", "e", "defaults", "err", "showError", "loadThreads", "listThreads", "mapped", "threads", "row", "threadId", "label", "messageCount", "updatedAt", "loadThreadDetail", "getThread", "detail", "parseThreadDetail", "thread", "sendMessage", "params", "threadRaw", "postMessage", "isPlainRecord", "updateThreadConfig", "patchThread", "createThread", "idRaw", "deleteThread", "raw", "length", "messagesRaw", "messages", "m", "id", "roleRaw", "role", "msg", "rawUserText", "content", "upRaw", "userParts", "parts", "p", "t", "type", "part", "text", "imageUrl", "push", "value", "provider", "modelName", "capsRaw", "capabilities", "c", "undefined", "enabled", "factory", "\u0275fac", "providedIn", "Con_PickerModel_Util", "collectSortedProviders", "entries", "set", "Set", "e", "prov", "provider", "trim", "length", "add", "sort", "collectSortedModelsForProvider", "p", "names", "mn", "modelName", "push", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275listener", "$event", "\u0275\u0275restoreView", "_r1", "ctx_r1", "\u0275\u0275nextContext", "\u0275\u0275resetView", "handleSelectThread", "handleRowContextMenu", "\u0275\u0275property", "row_r3", "consultant_DS", "activeThreadId_$", "id", "\u0275\u0275repeaterCreate", "Con_Dashboard_Component_Conditional_8_For_1_Template", "_forTrack0", "\u0275\u0275repeater", "threadRowViews_$", "p_r5", "\u0275\u0275advance", "\u0275\u0275textInterpolate", "providerDisplayLabelsMap_$", "m_r6", "_r4", "handleCloseCreate", "i0", "stopPropagation", "newLabel_$", "set", "handleProviderChange", "Con_Dashboard_Component_Conditional_10_For_12_Template", "\u0275\u0275repeaterTrackByIdentity", "newModel_$", "Con_Dashboard_Component_Conditional_10_For_17_Template", "handleCreateThread", "newProvider_$", "providerOptions_$", "modelsForNewProvider_$", "isCreating_$", "trim", "_r7", "handleCloseCtxMenu", "handleCtxDelete", "\u0275\u0275styleProp", "ctxMenuPos_$", "x", "y", "Con_Dashboard_Component", "inject", "Consultant_DataService", "router", "Router", "modelRegistry_DS", "ModelRegistry_DataService", "isCreateOpen_$", "signal", "computed", "Con_PickerModel_Util", "collectSortedProviders", "pickerOptions_$", "collectSortedModelsForProvider", "config", "setupConfigForRegistry_$", "providers", "m", "p", "ProviderDisplayLabel_Util", "getProviderDisplayLabel", "threadProviderDisplayLabels_$", "ids", "Set", "t", "threads_$", "providerInstanceId", "length", "add", "map", "threadId", "label", "status", "statusColorClass", "isArchived", "lastActivityAt", "updatedAt", "isRunning", "ctxMenuThread_$", "ngOnInit", "loadThreads", "loadPickerOptions", "loadSetupConfigForRegistry", "navigate", "handleOpenCreate", "__async", "defaults", "defaults_$", "includes", "models", "model", "firstP", "fallbackModels", "value", "provider", "createThread", "undefined", "payload", "thread", "find", "event", "clientX", "clientY", "deleteThread", "selectors", "hostAttrs", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275template", "Con_Dashboard_Component_Conditional_7_Template", "Con_Dashboard_Component_Conditional_8_Template", "Con_Dashboard_Component_Conditional_9_Template", "Con_Dashboard_Component_Conditional_10_Template", "Con_Dashboard_Component_Conditional_11_Template", "\u0275\u0275conditional", "threadsLoading_$", "tmp_2_0", "Con_Shell_Component", "sidebarWidth_$", "signal", "SESSION_SHELL_SIDEBAR_DEFAULT_WIDTH_PX", "isSidebarOpen_$", "isResizing_$", "ngOnInit", "stored", "Con_InputStorage_Util", "loadPanelWidth", "set", "Math", "max", "SESSION_SHELL_SIDEBAR_MIN_WIDTH_PX", "min", "SESSION_SHELL_SIDEBAR_MAX_WIDTH_PX", "loadPanelOpen", "handleSidebarResizeStart", "event", "startX", "clientX", "startWidth", "SHR_DocumentPointerDrag_Util", "attachUntilPointerUp", "startEvent", "onMove", "e", "delta", "newWidth", "onEnd", "savePanelWidth", "handleToggleSidebar", "update", "v", "savePanelOpen", "selectors", "hostAttrs", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275elementStart", "\u0275\u0275listener", "\u0275\u0275element", "\u0275\u0275elementEnd", "\u0275\u0275text", "$event", "\u0275\u0275classProp", "\u0275\u0275advance", "\u0275\u0275property", "Con_MsgToBubbleView_Util", "fromMessage", "msg", "isUser", "role", "bodyText", "buildUserBodyText", "content", "listKey", "id", "kind", "CCAP_AgentConsoleBubbleKind_Type", "userPrompt", "assistant", "isUserAligned", "flags", "showCopy", "showRawInfo", "useEditDiffForExpandable", "raw", "rawUserText", "trim", "userParts", "length", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275property", "p_r3", "\u0275\u0275advance", "\u0275\u0275textInterpolate", "m_r4", "\u0275\u0275element", "\u0275\u0275classProp", "row_r5", "isUserAligned", "\u0275\u0275listener", "$event", "\u0275\u0275restoreView", "_r1", "ctx_r1", "\u0275\u0275nextContext", "\u0275\u0275resetView", "localLabel_$", "set", "handleProviderChange", "\u0275\u0275repeaterCreate", "Con_Detail_Component_Conditional_2_Conditional_0_For_12_Template", "\u0275\u0275repeaterTrackByIdentity", "localModel_$", "Con_Detail_Component_Conditional_2_Conditional_0_For_18_Template", "handleApplyConfig", "handleDeleteThread", "Con_Detail_Component_Conditional_2_Conditional_0_For_25_Template", "_forTrack0", "allowWebSearch_$", "composerText_$", "handleSend", "handleAttachmentsChanged", "handleVoiceSegment", "localProvider_$", "\u0275\u0275repeater", "providerOptions_$", "modelsForSelectedProvider_$", "consultantBubbleViews_$", "consultant_DS", "sending_$", "\u0275\u0275template", "Con_Detail_Component_Conditional_2_Conditional_0_Template", "Con_Detail_Component_Conditional_2_Conditional_1_Template", "\u0275\u0275conditional", "selectedThread_$", "Con_Detail_Component", "DyNX_SubscriptionControl", "inject", "Consultant_DataService", "route", "ActivatedRoute", "router", "Router", "voiceInputUi_DS", "VNP_InputUi_DataService", "sessionInputRef", "signal", "computed", "Con_PickerModel_Util", "collectSortedProviders", "pickerOptions_$", "collectSortedModelsForProvider", "t", "messages", "map", "m", "Con_MsgToBubbleView_Util", "fromMessage", "pendingAttachments", "constructor", "addSubscription", "paramMap", "pipe", "pm", "get", "subscribe", "threadId", "length", "loadThreadDetail", "activeThreadId_$", "effect", "label", "providerInstanceId", "model", "allowSignalWrites", "loadPickerOptions", "ngOnDestroy", "value", "models", "cur", "includes", "__async", "updateThreadConfig", "deleteThread", "navigate", "attachments", "event", "text", "trim", "current", "autoSendAfterVoice_$", "isFinal", "currentAttachments", "a", "kind", "isImage", "mimeType", "fileName", "dataBase64", "base64", "sendMessage", "allowWebSearch", "clearAttachments", "selectors", "viewQuery", "rf", "ctx", "S_SessionInput_Component", "Con_Detail_Component_Conditional_0_Template", "Con_Detail_Component_Conditional_1_Template", "Con_Detail_Component_Conditional_2_Template", "selectedThreadLoading_$", "consultantRoutes", "path", "component", "Con_Shell_Component", "children", "Con_Detail_Component", "Consultant_Module", "CommonModule", "FormsModule", "RouterModule", "forChild", "CCAP_ErrorDisplay_Component", "CCAP_VoiceRecordButton_Component", "Shared_Module"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as B}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=crd.module-
|
|
1
|
+
import{a as B}from"./chunk-2QKSYFBS.js";import"./chunk-UHRVQGRT.js";import"./chunk-HOPBJ2PM.js";import"./chunk-RZY5FFKY.js";import{$a as A,C as v,D as b,E as S,Fa as i,G as E,Ha as c,Ia as w,Kb as D,Ta as $,Z as r,aa as h,ab as I,da as p,ga as _,hb as T,k as f,la as s,mb as k,oa as y,pa as F,qa as o,ra as n,ub as u,va as x,wa as m,z as g}from"./chunk-TBMJSIBB.js";var R={respond:"bg-green-500/20 text-green-400","status-update":"bg-blue-500/20 text-blue-400",stop:"bg-neutral-500/20 text-neutral-400","request-user-interaction":"bg-yellow-500/20 text-yellow-400"},M="bg-neutral-700/20 text-neutral-500",P=(()=>{class e{transform(t){return t?R[t]??M:M}static \u0275fac=function(a){return new(a||e)};static \u0275pipe=E({name:"ccapCoordinatorActionBadge",type:e,pure:!0,standalone:!0})}return e})();var K=(e,l)=>l._id;function O(e,l){e&1&&(o(0,"div",13),i(1," Loading coordinators... "),n())}function z(e,l){e&1&&(o(0,"div",14),i(1," Nincs koordin\xE1tor session. "),n())}function G(e,l){if(e&1&&i(0),e&2){let t=m(2).$implicit;c(" \xB7 WF: ",t.workflowId," ")}}function q(e,l){if(e&1&&(o(0,"div",22),i(1),p(2,G,1,1),n()),e&2){let t=m().$implicit;r(),w(" ",t.providerName,":",t.model," "),r(),s(t.workflowId?2:-1)}}function V(e,l){if(e&1&&(o(0,"span",24),A(1,"ccapCoordinatorActionBadge"),i(2),n()),e&2){let t=m().$implicit;_("ngClass",I(1,2,t.decisions[t.decisions.length-1].action)),r(2),c(" ",t.decisions[t.decisions.length-1].action," ")}}function W(e,l){if(e&1&&(o(0,"div",25),i(1),n()),e&2){let t=m().$implicit;r(),c(" ",t.decisions[t.decisions.length-1].reasoning," ")}}function H(e,l){if(e&1&&(o(0,"div",26),i(1),n()),e&2){let t=m().$implicit;r(),c(" Pause reason: ",t.pauseReason," ")}}function J(e,l){if(e&1&&(o(0,"div",16)(1,"div",17)(2,"div",18)(3,"span",19),i(4),n(),o(5,"div",20)(6,"div",21),i(7),n(),p(8,q,3,3,"div",22),n()(),o(9,"div",23)(10,"span",6),i(11),n(),p(12,V,3,4,"span",24),n()(),p(13,W,2,1,"div",25)(14,H,2,1,"div",26),n()),e&2){let t=l.$implicit,a=m(2);r(3),_("ngClass",a.getStatusBadgeClass(t.status)),r(),c(" ",t.status," "),r(3),c(" Session: ",t.sessionId," "),r(),s(t.providerName||t.model?8:-1),r(3),c(" ",t.totalStepCount," steps "),r(),s(t.decisions&&t.decisions.length>0?12:-1),r(),s(t.decisions&&t.decisions.length>0?13:-1),r(),s(t.pauseReason?14:-1)}}function Q(e,l){if(e&1&&(o(0,"div",15),y(1,J,15,8,"div",16,K),n()),e&2){let t=m();r(),F(t.filteredCoordinators_$())}}var C=(()=>{class e{coordinator_DS=v(B);statusFilter_$=h("");filteredCoordinators_$=T(()=>{let t=this.statusFilter_$(),a=this.coordinator_DS.globalCoordinatorsList_$();return t?a.filter(d=>d.status===t):a});ngOnInit(){this.loadCoordinators()}loadCoordinators(){return f(this,null,function*(){yield this.coordinator_DS.loadAllCoordinatorsForManagementPage()})}handleFilterChange(t){let a=t.target;!a||!("value"in a)||this.statusFilter_$.set(String(a.value))}getStatusBadgeClass(t){switch(t){case"active":return"bg-green-500/20 text-green-400";case"paused":return"bg-yellow-500/20 text-yellow-400";case"completed":return"bg-neutral-500/20 text-neutral-400";case"failed":return"bg-red-500/20 text-red-400";default:return"bg-neutral-700/20 text-neutral-500"}}static \u0275fac=function(a){return new(a||e)};static \u0275cmp=b({type:e,selectors:[["app-ccap-coordinator"]],standalone:!0,features:[$],decls:28,vars:4,consts:[[1,"max-w-5xl","mx-auto","p-4","gt-xs:p-6","text-neutral-100"],[1,"flex","items-center","justify-between","mb-6"],[1,"text-2xl","font-bold"],[1,"text-neutral-400","text-sm","mt-1"],[1,"px-3","py-1.5","text-xs","border","border-neutral-600","text-neutral-300","rounded","hover:bg-neutral-800","transition-colors",3,"click"],[1,"flex","items-center","gap-3","mb-4"],[1,"text-xs","text-neutral-500"],[1,"bg-neutral-800","border","border-neutral-600","rounded","px-2","py-1","text-xs","text-neutral-200","outline-none","focus:border-neonDefault",3,"change"],["value",""],["value","active"],["value","paused"],["value","completed"],["value","failed"],[1,"text-center","py-8","text-neutral-500","text-sm"],[1,"rounded-lg","border","border-neutral-700","bg-ccapSurface/50","p-8","text-center","text-neutral-500","text-sm"],[1,"space-y-2"],[1,"rounded-lg","border","border-neutral-700","bg-ccapSurface/50","p-4","hover:border-neutral-600","transition-colors"],[1,"flex","items-center","justify-between","gap-4"],[1,"flex","items-center","gap-3","min-w-0"],[1,"text-xs","px-2","py-0.5","rounded","shrink-0",3,"ngClass"],[1,"min-w-0"],[1,"text-sm","text-neutral-200","truncate"],[1,"text-xs","text-neutral-500","mt-0.5"],[1,"flex","items-center","gap-3","shrink-0"],[1,"text-xs","px-1.5","py-0.5","rounded",3,"ngClass"],[1,"text-xs","text-neutral-400","mt-2","truncate"],[1,"text-xs","text-yellow-400/80","mt-1"]],template:function(a,d){a&1&&(o(0,"div",0)(1,"div",1)(2,"div")(3,"h1",2),i(4,"Koordin\xE1tor"),n(),o(5,"p",3),i(6," Koordin\xE1tor session-\xF6k kezel\xE9se \u2014 workflow-alap\xFA agent vez\xE9rl\xE9s. "),n()(),o(7,"button",4),x("click",function(){return d.loadCoordinators()}),i(8," Refresh "),n()(),o(9,"div",5)(10,"span",6),i(11,"Filter:"),n(),o(12,"select",7),x("change",function(j){return d.handleFilterChange(j)}),o(13,"option",8),i(14,"All"),n(),o(15,"option",9),i(16,"Active"),n(),o(17,"option",10),i(18,"Paused"),n(),o(19,"option",11),i(20,"Completed"),n(),o(21,"option",12),i(22,"Failed"),n()(),o(23,"span",6),i(24),n()(),p(25,O,2,0,"div",13)(26,z,2,0,"div",14)(27,Q,3,0,"div",15),n()),a&2&&(r(24),c(" ",d.filteredCoordinators_$().length," coordinator(s) "),r(),s(d.coordinator_DS.globalCoordinatorsListLoading_$()?25:-1),r(),s(!d.coordinator_DS.globalCoordinatorsListLoading_$()&&d.filteredCoordinators_$().length===0?26:-1),r(),s(!d.coordinator_DS.globalCoordinatorsListLoading_$()&&d.filteredCoordinators_$().length>0?27:-1))},dependencies:[u,k,P],encapsulation:2})}return e})();var U=[{path:"",pathMatch:"full",component:C}],st=(()=>{class e{static \u0275fac=function(a){return new(a||e)};static \u0275mod=S({type:e});static \u0275inj=g({imports:[u,D.forChild(U),C]})}return e})();export{st as Coordinator_Module};
|
|
2
|
+
//# sourceMappingURL=crd.module-XJ435KXN.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as V}from"./chunk-6NBGNC3H.js";import{a as x,b as f}from"./chunk-6Y7O2W4H.js";import{d as W}from"./chunk-W2SLMCXE.js";import"./chunk-QV3SDDFJ.js";import{a as O}from"./chunk-Q2NVIOCY.js";import{a as U}from"./chunk-J32YRK3S.js";import"./chunk-V3VQWJQL.js";import{k as b}from"./chunk-67F7P6KL.js";import"./chunk-5UPNU54P.js";import"./chunk-BB7FGQZ6.js";import{p as tt}from"./chunk-JUK4XI7S.js";import{C as S,D as N,E as R,Fa as o,Ga as c,Ha as p,Hb as B,J as D,K as y,Kb as G,Z as l,aa as h,da as d,ga as g,h as Z,hb as k,ia as I,k as F,la as s,na as z,oa as v,pa as E,qa as i,ra as n,sa as u,ua as T,ub as j,va as $,wa as _,y as P,z as M}from"./chunk-TBMJSIBB.js";var J=Z(tt());var K=(()=>{class t{status_$=h(null);statusLoading_$=h(!1);statusLoadError_$=h(null);serverStatus_AS=S(V);loadStatus(){return F(this,null,function*(){this.statusLoading_$.set(!0),this.statusLoadError_$.set(null);try{let e=yield this.serverStatus_AS.getStatus();return this.status_$.set(e),e}catch(e){return J.DyFM_Error.logSimple("CCAP_ServerStatusDS | Failed to load status",e),this.statusLoadError_$.set(e),null}finally{this.statusLoading_$.set(!1)}})}getCachedStatus(){return this.status_$()}static \u0275fac=function(r){return new(r||t)};static \u0275prov=P({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var et=(t,a)=>a.name,nt=(t,a)=>a._id,it=(t,a)=>a.sessionId;function ot(t,a){if(t&1){let e=T();i(0,"button",6),$("click",function(){D(e);let m=_();return y(m.loadStatus())}),o(1," Friss\xEDt\xE9s "),n()}}function at(t,a){t&1&&(i(0,"div",5)(1,"p",7),o(2,"Bet\xF6lt\xE9s\u2026"),n()())}function lt(t,a){if(t&1){let e=T();i(0,"div",8),u(1,"app-ccap-error-display",9),i(2,"div",10)(3,"button",11),$("click",function(){D(e);let m=_(2);return y(m.loadStatus())}),o(4," \xDAjrapr\xF3b\xE1l\xE1s "),n()()()}if(t&2){let e=_(2);l(),g("error",e.serverStatus_DS.statusLoadError_$())}}function rt(t,a){t&1&&(i(0,"p",15),o(1,"Nincs enged\xE9lyezett messaging provider (Setup \u2192 enged\xE9lyez\xE9s)."),n())}function _t(t,a){t&1&&(i(0,"span",29),o(1," working "),n())}function st(t,a){if(t&1&&(i(0,"span",31),o(1),n()),t&2){let e=_(2).$implicit;g("title",e.error),l(),c(e.error)}}function dt(t,a){if(t&1&&(i(0,"span",30),o(1," disconnected "),n(),d(2,st,2,2,"span",31)),t&2){let e=_().$implicit;l(2),s(e.error?2:-1)}}function mt(t,a){if(t&1&&(i(0,"li",27)(1,"span",28),o(2),n(),d(3,_t,2,0,"span",29)(4,dt,3,1),n()),t&2){let e=a.$implicit,r=_(5);l(2),c(r.MESSAGING_PROVIDER_NAMES[e.name]),l(),s(e.connected?3:4)}}function ct(t,a){if(t&1&&(i(0,"ul",16),v(1,mt,5,2,"li",27,et),n()),t&2){let e=_();l(),E(e.messagingProviders)}}function ut(t,a){t&1&&(i(0,"p",15),o(1,"Nincs enged\xE9lyezett LLM provider (Setup \u2192 enged\xE9lyez\xE9s)."),n())}function pt(t,a){if(t&1&&(i(0,"li",27)(1,"span",28),o(2),n(),i(3,"span",29),o(4," enged\xE9lyezve "),n()()),t&2){let e=a.$implicit,r=_(5);l(2),c(r.llmProviderDisplayLabelsMap_$()[e])}}function Ct(t,a){if(t&1&&(i(0,"ul",16),v(1,pt,5,1,"li",27,z),n()),t&2){let e=_();l(),E(e.llmProviders)}}function xt(t,a){if(t&1&&(i(0,"p",21)(1,"span",32),o(2),n(),o(3," akt\xEDv az elm\xFAlt 24 \xF3r\xE1ban "),n()),t&2){let e=_();l(2),c(e.sessionSummary.recentActivityCount)}}function ft(t,a){if(t&1&&(i(0,"p",22),u(1,"span",33),i(2,"span",34),o(3),n(),i(4,"span",7),o(5," r\xF6gz\xEDtett hiba a legut\xF3bbi 24 \xF3r\xE1ban "),n()()),t&2){let e=_();l(),I("bg-red-500",e.lastErrorCount>0)("bg-green-500",e.lastErrorCount===0),l(),I("text-red-300",e.lastErrorCount>0)("text-green-300",e.lastErrorCount===0),l(),p(" ",e.lastErrorCount," ")}}function St(t,a){t&1&&(i(0,"p",15),o(1,"Bet\xF6lt\xE9s\u2026"),n())}function vt(t,a){t&1&&(i(0,"p",15),o(1,"Nem siker\xFClt bet\xF6lteni az instance adatokat."),n())}function Et(t,a){if(t&1&&(i(0,"div",36),u(1,"span",45),i(2,"span",38),o(3),n(),i(4,"span",15),o(5,"inactive"),n()()),t&2){let e=_(5);l(3),c(e.instanceSummary_$().inactiveCount)}}function ht(t,a){if(t&1&&(i(0,"div",36),u(1,"span",46),i(2,"span",38),o(3),n(),i(4,"span",15),o(5,"maintenance"),n()()),t&2){let e=_(5);l(3),c(e.instanceSummary_$().maintenanceCount)}}function gt(t,a){if(t&1&&(i(0,"span",40),o(1),n()),t&2){let e=_(5);l(),p("",e.instanceSummary_$().workingSessionCount," working")}}function bt(t,a){if(t&1&&(i(0,"span",41),o(1),n()),t&2){let e=_(5);l(),p("",e.instanceSummary_$().idleSessionCount," idle")}}function Dt(t,a){if(t&1&&(i(0,"span",42),o(1),n()),t&2){let e=_(5);l(),p("",e.instanceSummary_$().offlineSessionCount," offline")}}function yt(t,a){t&1&&(i(0,"span",43),o(1,"nincs session adat"),n())}function It(t,a){t&1&&(i(0,"p",15),o(1,"Nincs regisztr\xE1lt instance."),n())}function Tt(t,a){t&1&&(i(0,"span",29),o(1,"Active"),n())}function $t(t,a){t&1&&(i(0,"span",50),o(1,"Inactive"),n())}function kt(t,a){t&1&&(i(0,"span",30),o(1,"Maintenance"),n())}function wt(t,a){t&1&&u(0,"span",55)}function Ht(t,a){t&1&&u(0,"span",56)}function Lt(t,a){t&1&&u(0,"span",57)}function At(t,a){if(t&1&&(i(0,"p",60),o(1),n()),t&2){let e=_().$implicit;l(),c(e.activitySummary)}}function Ft(t,a){if(t&1&&(i(0,"div",54),d(1,wt,1,0,"span",55)(2,Ht,1,0,"span",56)(3,Lt,1,0,"span",57),i(4,"span",58),o(5),n(),i(6,"span",59),o(7),n()(),d(8,At,2,1,"p",60)),t&2){let e,r=a.$implicit,m=_(8);l(),s((e=r.presence)==="working"?1:e==="idle"?2:3),l(4),p(" ",r.sessionName||r.sessionId," "),l(2),c(m.PRESENCE_LABELS[r.presence]),l(),s(r.activitySummary?8:-1)}}function Pt(t,a){if(t&1&&(i(0,"div",52),v(1,Ft,9,4,null,null,it),n()),t&2){let e=_().$implicit;l(),E(e.sessionStatuses)}}function Mt(t,a){t&1&&(i(0,"p",53),o(1,"Nincs session adat"),n())}function Nt(t,a){if(t&1&&(i(0,"div",47)(1,"div",48)(2,"span",49),o(3),n(),d(4,Tt,2,0,"span",29)(5,$t,2,0,"span",50)(6,kt,2,0,"span",30),n(),i(7,"span",51),o(8),n(),d(9,Pt,3,0,"div",52)(10,Mt,2,0,"p",53),n()),t&2){let e,r=a.$implicit;l(3),p(" ",r.name||r.ccapId," "),l(),s((e=r.status)==="active"?4:e==="inactive"?5:e==="maintenance"?6:-1),l(3),g("title",r.ccapId),l(),p(" ",r.ccapId," "),l(),s(r.sessionStatuses&&r.sessionStatuses.length>0?9:10)}}function Rt(t,a){if(t&1&&(i(0,"div",44),v(1,Nt,11,5,"div",47,nt),n()),t&2){let e=_(5);l(),E(e.runtimeInstances_DS.ccapInstanceList_$())}}function zt(t,a){if(t&1&&(i(0,"div",35)(1,"div",36)(2,"span",19),o(3),n(),i(4,"span",21),o(5,"instance"),n()(),i(6,"div",36),u(7,"span",37),i(8,"span",38),o(9),n(),i(10,"span",15),o(11,"active"),n()(),d(12,Et,6,1,"div",36)(13,ht,6,1,"div",36),i(14,"div",39)(15,"span",21),o(16,"Sessions:"),n(),d(17,gt,2,1,"span",40)(18,bt,2,1,"span",41)(19,Dt,2,1,"span",42)(20,yt,2,0,"span",43),n()(),d(21,It,2,0,"p",15)(22,Rt,3,0,"div",44)),t&2){let e=_(4);l(3),c(e.instanceSummary_$().totalCount),l(6),c(e.instanceSummary_$().activeCount),l(3),s(e.instanceSummary_$().inactiveCount?12:-1),l(),s(e.instanceSummary_$().maintenanceCount?13:-1),l(4),s(e.instanceSummary_$().workingSessionCount?17:-1),l(),s(e.instanceSummary_$().idleSessionCount?18:-1),l(),s(e.instanceSummary_$().offlineSessionCount?19:-1),l(),s(!e.instanceSummary_$().workingSessionCount&&!e.instanceSummary_$().idleSessionCount&&!e.instanceSummary_$().offlineSessionCount?20:-1),l(),s(e.runtimeInstances_DS.ccapInstanceList_$().length===0?21:22)}}function jt(t,a){if(t&1&&(i(0,"div",12)(1,"section",13)(2,"h2",14),o(3,"Messaging provider-ek"),n(),d(4,rt,2,0,"p",15)(5,ct,3,0,"ul",16),n(),i(6,"section",13)(7,"h2",14),o(8,"LLM provider-ek"),n(),d(9,ut,2,0,"p",15)(10,Ct,3,0,"ul",16),n(),i(11,"section",13)(12,"h2",14),o(13,"Session \xF6sszes\xEDt\u0151"),n(),i(14,"div",17)(15,"p",18)(16,"span",19),o(17),n(),i(18,"span",20),o(19,"session"),n()(),d(20,xt,4,1,"p",21)(21,ft,6,9,"p",22),n()(),i(22,"section",23)(23,"h2",14),o(24,"Instance \xE1ttekint\u0151"),n(),d(25,St,2,0,"p",15)(26,vt,2,0,"p",15)(27,zt,23,9),n(),i(28,"section",13)(29,"h2",14),o(30,"Gyors linkek"),n(),i(31,"div",24)(32,"a",25),o(33," Open Sessions "),n(),i(34,"a",26),o(35," Be\xE1ll\xEDt\xE1sok "),n()()()()),t&2){let e=a,r=_(3);l(4),s(e.messagingProviders.length===0?4:5),l(5),s(e.llmProviders.length===0?9:10),l(8),c(e.sessionSummary.totalCount),l(3),s(e.sessionSummary.recentActivityCount!==void 0?20:-1),l(),s(e.lastErrorCount!==void 0&&e.lastErrorCount!==null?21:-1),l(4),s(r.runtimeInstances_DS.ccapInstanceListLoading_$()?25:r.runtimeInstances_DS.ccapInstanceListError_$()?26:27)}}function Bt(t,a){if(t&1&&d(0,jt,36,6,"div",12),t&2){let e,r=_(2);s((e=r.serverStatus_DS.status_$())?0:-1,e)}}function Gt(t,a){if(t&1&&d(0,lt,5,1,"div",8)(1,Bt,1,1),t&2){let e=_();s(e.serverStatus_DS.statusLoadError_$()?0:1)}}var Vt={"ccap-client":"CCAP Client","ccap-cli":"CCAP CLI",discord:"Discord"},Ot={[x.active]:"Active",[x.inactive]:"Inactive",[x.maintenance]:"Maintenance"},Ut={[f.working]:"Working",[f.idle]:"Idle",[f.offline]:"Offline"},Q=(()=>{class t{title="CCAP Revisioned";serverStatus_DS=S(K);runtimeInstances_DS=S(W);MESSAGING_PROVIDER_NAMES=Vt;INSTANCE_STATUS_LABELS=Ot;PRESENCE_LABELS=Ut;instanceSummary_$=k(()=>{let e=this.runtimeInstances_DS.ccapInstanceList_$(),r=e.length,m=e.filter(C=>C.status===x.active).length,X=e.filter(C=>C.status===x.inactive).length,Y=e.filter(C=>C.status===x.maintenance).length,w=0,H=0,L=0;for(let C of e)for(let A of C.sessionStatuses??[])A.presence===f.working?w++:A.presence===f.idle?H++:L++;return{totalCount:r,activeCount:m,inactiveCount:X,maintenanceCount:Y,workingSessionCount:w,idleSessionCount:H,offlineSessionCount:L}});llmProviderDisplayLabelsMap_$=k(()=>{let e=this.serverStatus_DS.status_$();if(!e)return{};let r={};for(let m of e.llmProviders)r[m]=U.getProviderDisplayLabel(m,null);return r});ngOnInit(){this.serverStatus_DS.loadStatus(),this.runtimeInstances_DS.loadCcapInstanceList()}loadStatus(){this.serverStatus_DS.loadStatus(),this.runtimeInstances_DS.loadCcapInstanceList()}static \u0275fac=function(r){return new(r||t)};static \u0275cmp=N({type:t,selectors:[["app-ccap-home"]],decls:10,vars:3,consts:[[1,"flex","flex-col","min-h-full","text-neutral-100","p-4","gt-xs:p-6"],[1,"flex","flex-col","xs:flex-row","xs:items-center","xs:justify-between","gap-4","mb-6"],[1,"text-2xl","gt-xs:text-3xl","font-bold","text-neutral-100"],[1,"text-neutral-400","text-sm","gt-xs:text-base","mt-1"],["type","button",1,"shrink-0","px-4","py-2","border","border-neonCyan","rounded-lg","text-neutral-400","text-sm","font-medium","hover:bg-neutral-800","hover:text-neutral-200","hover:shadow-neon-glow-cyan","transition-colors"],[1,"flex","items-center","justify-center","py-16"],["type","button",1,"shrink-0","px-4","py-2","border","border-neonCyan","rounded-lg","text-neutral-400","text-sm","font-medium","hover:bg-neutral-800","hover:text-neutral-200","hover:shadow-neon-glow-cyan","transition-colors",3,"click"],[1,"text-neutral-400"],[1,"rounded-lg","bg-neutral-800/60","border","border-red-500/50","p-6","max-w-2xl"],["sourceLabelOverride","St\xE1tusz bet\xF6lt\xE9s",1,"mb-4","block",3,"error"],[1,"text-center"],["type","button",1,"px-4","py-2","border","border-neonCyan","rounded-lg","text-neutral-300","text-sm","font-medium","hover:bg-neutral-700","hover:shadow-neon-glow-cyan","transition-colors",3,"click"],[1,"grid","grid-cols-1","md:grid-cols-2","lg:grid-cols-3","gap-4","mb-8"],[1,"flex","flex-col","rounded-lg","bg-neutral-800/60","border","border-neonDefault","p-4","min-h-0"],[1,"text-lg","font-semibold","text-neutral-200","mb-3","shrink-0"],[1,"text-neutral-500","text-sm"],[1,"space-y-2","min-h-0"],[1,"flex","flex-col","gap-1","min-h-0"],[1,"text-neutral-300"],[1,"text-2xl","font-bold","text-neutral-100"],[1,"ml-1"],[1,"text-neutral-400","text-sm"],[1,"text-sm","mt-1","flex","items-center","gap-1.5"],[1,"flex","flex-col","rounded-lg","bg-neutral-800/60","border","border-neonDefault","p-4","min-h-0","md:col-span-2","lg:col-span-3"],[1,"flex","flex-wrap","gap-3"],["routerLink","/session",1,"inline-flex","items-center","px-5","py-2.5","border","border-ccapAccent","rounded-lg","text-ccapAccent","text-sm","font-semibold","transition-colors","duration-200","hover:bg-ccapAccent","hover:text-white","hover:shadow-neon-glow-accent"],["routerLink","/settings",1,"inline-flex","items-center","px-5","py-2.5","border","border-neonCyan","rounded-lg","text-neutral-300","text-sm","font-semibold","transition-colors","duration-200","hover:bg-neutral-700","hover:text-white","hover:shadow-neon-glow-cyan"],[1,"flex","items-center","gap-3","flex-wrap"],[1,"text-neutral-200","font-medium"],[1,"px-2","py-0.5","text-xs","font-medium","rounded","bg-green-900/50","text-green-300","border","border-neonGreen","shrink-0"],[1,"px-2","py-0.5","text-xs","font-medium","rounded","bg-amber-900/50","text-amber-300","border","border-neonAmber","shrink-0"],[1,"text-neutral-500","text-xs","truncate","max-w-full",3,"title"],[1,"font-medium","text-neutral-300"],["aria-hidden","true",1,"inline-block","w-2","h-2","rounded-full","shrink-0"],[1,"font-medium"],[1,"flex","flex-wrap","gap-4","mb-4"],[1,"flex","items-center","gap-2"],[1,"w-2","h-2","rounded-full","bg-green-500","shrink-0"],[1,"text-neutral-300","text-sm","font-medium"],[1,"border-l","border-neutral-700","pl-4","flex","items-center","gap-2"],[1,"px-2","py-0.5","text-xs","font-medium","rounded","bg-green-900/50","text-green-300","border","border-neonGreen"],[1,"px-2","py-0.5","text-xs","font-medium","rounded","bg-amber-900/50","text-amber-300","border","border-neonAmber"],[1,"px-2","py-0.5","text-xs","font-medium","rounded","bg-neutral-700/50","text-neutral-400","border","border-neutral-600"],[1,"text-neutral-500","text-xs"],[1,"grid","grid-cols-1","md:grid-cols-2","lg:grid-cols-3","gap-3"],[1,"w-2","h-2","rounded-full","bg-neutral-500","shrink-0"],[1,"w-2","h-2","rounded-full","bg-amber-500","shrink-0"],[1,"rounded-md","border","border-neutral-700","bg-neutral-800/40","p-3","flex","flex-col","gap-2"],[1,"flex","items-center","justify-between","gap-2"],[1,"text-neutral-100","font-medium","text-sm","truncate"],[1,"px-2","py-0.5","text-xs","font-medium","rounded","bg-neutral-700/50","text-neutral-400","border","border-neutral-600","shrink-0"],[1,"text-neutral-500","text-xs","font-mono","truncate",3,"title"],[1,"flex","flex-col","gap-1.5","mt-1","pt-2","border-t","border-neutral-700/50"],[1,"text-neutral-600","text-xs","mt-1"],[1,"flex","items-center","gap-2","text-xs"],[1,"w-1.5","h-1.5","rounded-full","bg-green-500","shrink-0"],[1,"w-1.5","h-1.5","rounded-full","bg-amber-500","shrink-0"],[1,"w-1.5","h-1.5","rounded-full","bg-neutral-500","shrink-0"],[1,"text-neutral-300","truncate"],[1,"text-neutral-500","shrink-0"],[1,"text-neutral-500","text-xs","pl-3.5","-mt-1","truncate"]],template:function(r,m){r&1&&(i(0,"div",0)(1,"header",1)(2,"div")(3,"h1",2),o(4),n(),i(5,"p",3),o(6,"Agentic AI System"),n()(),d(7,ot,2,0,"button",4),n(),d(8,at,3,0,"div",5)(9,Gt,2,1),n()),r&2&&(l(4),c(m.title),l(3),s(!m.serverStatus_DS.statusLoading_$()&&!m.serverStatus_DS.statusLoadError_$()&&m.serverStatus_DS.status_$()?7:-1),l(),s(m.serverStatus_DS.statusLoading_$()?8:9))},dependencies:[B,b],encapsulation:2})}return t})();var Wt=[{path:"",pathMatch:"full",component:Q}],ue=(()=>{class t{static \u0275fac=function(r){return new(r||t)};static \u0275mod=R({type:t});static \u0275inj=M({imports:[j,G.forChild(Wt),b,O]})}return t})();export{ue as Dashboard_Module};
|
|
2
|
-
//# sourceMappingURL=dashboard.module-
|
|
1
|
+
import{a as V}from"./chunk-3CSKYOXL.js";import{a as x,b as f}from"./chunk-6Y7O2W4H.js";import{d as W}from"./chunk-SREB74HR.js";import"./chunk-RCRXEUZM.js";import{a as O}from"./chunk-Q2NVIOCY.js";import{a as U}from"./chunk-J32YRK3S.js";import"./chunk-V3VQWJQL.js";import{k as b}from"./chunk-TLAPOIAO.js";import"./chunk-5UPNU54P.js";import"./chunk-HOPBJ2PM.js";import{p as tt}from"./chunk-RZY5FFKY.js";import{C as S,D as N,E as R,Fa as o,Ga as c,Ha as p,Hb as B,J as D,K as y,Kb as G,Z as l,aa as h,da as d,ga as g,h as Z,hb as k,ia as I,k as F,la as s,na as z,oa as v,pa as E,qa as i,ra as n,sa as u,ua as T,ub as j,va as $,wa as _,y as P,z as M}from"./chunk-TBMJSIBB.js";var J=Z(tt());var K=(()=>{class t{status_$=h(null);statusLoading_$=h(!1);statusLoadError_$=h(null);serverStatus_AS=S(V);loadStatus(){return F(this,null,function*(){this.statusLoading_$.set(!0),this.statusLoadError_$.set(null);try{let e=yield this.serverStatus_AS.getStatus();return this.status_$.set(e),e}catch(e){return J.DyFM_Error.logSimple("CCAP_ServerStatusDS | Failed to load status",e),this.statusLoadError_$.set(e),null}finally{this.statusLoading_$.set(!1)}})}getCachedStatus(){return this.status_$()}static \u0275fac=function(r){return new(r||t)};static \u0275prov=P({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var et=(t,a)=>a.name,nt=(t,a)=>a._id,it=(t,a)=>a.sessionId;function ot(t,a){if(t&1){let e=T();i(0,"button",6),$("click",function(){D(e);let m=_();return y(m.loadStatus())}),o(1," Friss\xEDt\xE9s "),n()}}function at(t,a){t&1&&(i(0,"div",5)(1,"p",7),o(2,"Bet\xF6lt\xE9s\u2026"),n()())}function lt(t,a){if(t&1){let e=T();i(0,"div",8),u(1,"app-ccap-error-display",9),i(2,"div",10)(3,"button",11),$("click",function(){D(e);let m=_(2);return y(m.loadStatus())}),o(4," \xDAjrapr\xF3b\xE1l\xE1s "),n()()()}if(t&2){let e=_(2);l(),g("error",e.serverStatus_DS.statusLoadError_$())}}function rt(t,a){t&1&&(i(0,"p",15),o(1,"Nincs enged\xE9lyezett messaging provider (Setup \u2192 enged\xE9lyez\xE9s)."),n())}function _t(t,a){t&1&&(i(0,"span",29),o(1," working "),n())}function st(t,a){if(t&1&&(i(0,"span",31),o(1),n()),t&2){let e=_(2).$implicit;g("title",e.error),l(),c(e.error)}}function dt(t,a){if(t&1&&(i(0,"span",30),o(1," disconnected "),n(),d(2,st,2,2,"span",31)),t&2){let e=_().$implicit;l(2),s(e.error?2:-1)}}function mt(t,a){if(t&1&&(i(0,"li",27)(1,"span",28),o(2),n(),d(3,_t,2,0,"span",29)(4,dt,3,1),n()),t&2){let e=a.$implicit,r=_(5);l(2),c(r.MESSAGING_PROVIDER_NAMES[e.name]),l(),s(e.connected?3:4)}}function ct(t,a){if(t&1&&(i(0,"ul",16),v(1,mt,5,2,"li",27,et),n()),t&2){let e=_();l(),E(e.messagingProviders)}}function ut(t,a){t&1&&(i(0,"p",15),o(1,"Nincs enged\xE9lyezett LLM provider (Setup \u2192 enged\xE9lyez\xE9s)."),n())}function pt(t,a){if(t&1&&(i(0,"li",27)(1,"span",28),o(2),n(),i(3,"span",29),o(4," enged\xE9lyezve "),n()()),t&2){let e=a.$implicit,r=_(5);l(2),c(r.llmProviderDisplayLabelsMap_$()[e])}}function Ct(t,a){if(t&1&&(i(0,"ul",16),v(1,pt,5,1,"li",27,z),n()),t&2){let e=_();l(),E(e.llmProviders)}}function xt(t,a){if(t&1&&(i(0,"p",21)(1,"span",32),o(2),n(),o(3," akt\xEDv az elm\xFAlt 24 \xF3r\xE1ban "),n()),t&2){let e=_();l(2),c(e.sessionSummary.recentActivityCount)}}function ft(t,a){if(t&1&&(i(0,"p",22),u(1,"span",33),i(2,"span",34),o(3),n(),i(4,"span",7),o(5," r\xF6gz\xEDtett hiba a legut\xF3bbi 24 \xF3r\xE1ban "),n()()),t&2){let e=_();l(),I("bg-red-500",e.lastErrorCount>0)("bg-green-500",e.lastErrorCount===0),l(),I("text-red-300",e.lastErrorCount>0)("text-green-300",e.lastErrorCount===0),l(),p(" ",e.lastErrorCount," ")}}function St(t,a){t&1&&(i(0,"p",15),o(1,"Bet\xF6lt\xE9s\u2026"),n())}function vt(t,a){t&1&&(i(0,"p",15),o(1,"Nem siker\xFClt bet\xF6lteni az instance adatokat."),n())}function Et(t,a){if(t&1&&(i(0,"div",36),u(1,"span",45),i(2,"span",38),o(3),n(),i(4,"span",15),o(5,"inactive"),n()()),t&2){let e=_(5);l(3),c(e.instanceSummary_$().inactiveCount)}}function ht(t,a){if(t&1&&(i(0,"div",36),u(1,"span",46),i(2,"span",38),o(3),n(),i(4,"span",15),o(5,"maintenance"),n()()),t&2){let e=_(5);l(3),c(e.instanceSummary_$().maintenanceCount)}}function gt(t,a){if(t&1&&(i(0,"span",40),o(1),n()),t&2){let e=_(5);l(),p("",e.instanceSummary_$().workingSessionCount," working")}}function bt(t,a){if(t&1&&(i(0,"span",41),o(1),n()),t&2){let e=_(5);l(),p("",e.instanceSummary_$().idleSessionCount," idle")}}function Dt(t,a){if(t&1&&(i(0,"span",42),o(1),n()),t&2){let e=_(5);l(),p("",e.instanceSummary_$().offlineSessionCount," offline")}}function yt(t,a){t&1&&(i(0,"span",43),o(1,"nincs session adat"),n())}function It(t,a){t&1&&(i(0,"p",15),o(1,"Nincs regisztr\xE1lt instance."),n())}function Tt(t,a){t&1&&(i(0,"span",29),o(1,"Active"),n())}function $t(t,a){t&1&&(i(0,"span",50),o(1,"Inactive"),n())}function kt(t,a){t&1&&(i(0,"span",30),o(1,"Maintenance"),n())}function wt(t,a){t&1&&u(0,"span",55)}function Ht(t,a){t&1&&u(0,"span",56)}function Lt(t,a){t&1&&u(0,"span",57)}function At(t,a){if(t&1&&(i(0,"p",60),o(1),n()),t&2){let e=_().$implicit;l(),c(e.activitySummary)}}function Ft(t,a){if(t&1&&(i(0,"div",54),d(1,wt,1,0,"span",55)(2,Ht,1,0,"span",56)(3,Lt,1,0,"span",57),i(4,"span",58),o(5),n(),i(6,"span",59),o(7),n()(),d(8,At,2,1,"p",60)),t&2){let e,r=a.$implicit,m=_(8);l(),s((e=r.presence)==="working"?1:e==="idle"?2:3),l(4),p(" ",r.sessionName||r.sessionId," "),l(2),c(m.PRESENCE_LABELS[r.presence]),l(),s(r.activitySummary?8:-1)}}function Pt(t,a){if(t&1&&(i(0,"div",52),v(1,Ft,9,4,null,null,it),n()),t&2){let e=_().$implicit;l(),E(e.sessionStatuses)}}function Mt(t,a){t&1&&(i(0,"p",53),o(1,"Nincs session adat"),n())}function Nt(t,a){if(t&1&&(i(0,"div",47)(1,"div",48)(2,"span",49),o(3),n(),d(4,Tt,2,0,"span",29)(5,$t,2,0,"span",50)(6,kt,2,0,"span",30),n(),i(7,"span",51),o(8),n(),d(9,Pt,3,0,"div",52)(10,Mt,2,0,"p",53),n()),t&2){let e,r=a.$implicit;l(3),p(" ",r.name||r.ccapId," "),l(),s((e=r.status)==="active"?4:e==="inactive"?5:e==="maintenance"?6:-1),l(3),g("title",r.ccapId),l(),p(" ",r.ccapId," "),l(),s(r.sessionStatuses&&r.sessionStatuses.length>0?9:10)}}function Rt(t,a){if(t&1&&(i(0,"div",44),v(1,Nt,11,5,"div",47,nt),n()),t&2){let e=_(5);l(),E(e.runtimeInstances_DS.ccapInstanceList_$())}}function zt(t,a){if(t&1&&(i(0,"div",35)(1,"div",36)(2,"span",19),o(3),n(),i(4,"span",21),o(5,"instance"),n()(),i(6,"div",36),u(7,"span",37),i(8,"span",38),o(9),n(),i(10,"span",15),o(11,"active"),n()(),d(12,Et,6,1,"div",36)(13,ht,6,1,"div",36),i(14,"div",39)(15,"span",21),o(16,"Sessions:"),n(),d(17,gt,2,1,"span",40)(18,bt,2,1,"span",41)(19,Dt,2,1,"span",42)(20,yt,2,0,"span",43),n()(),d(21,It,2,0,"p",15)(22,Rt,3,0,"div",44)),t&2){let e=_(4);l(3),c(e.instanceSummary_$().totalCount),l(6),c(e.instanceSummary_$().activeCount),l(3),s(e.instanceSummary_$().inactiveCount?12:-1),l(),s(e.instanceSummary_$().maintenanceCount?13:-1),l(4),s(e.instanceSummary_$().workingSessionCount?17:-1),l(),s(e.instanceSummary_$().idleSessionCount?18:-1),l(),s(e.instanceSummary_$().offlineSessionCount?19:-1),l(),s(!e.instanceSummary_$().workingSessionCount&&!e.instanceSummary_$().idleSessionCount&&!e.instanceSummary_$().offlineSessionCount?20:-1),l(),s(e.runtimeInstances_DS.ccapInstanceList_$().length===0?21:22)}}function jt(t,a){if(t&1&&(i(0,"div",12)(1,"section",13)(2,"h2",14),o(3,"Messaging provider-ek"),n(),d(4,rt,2,0,"p",15)(5,ct,3,0,"ul",16),n(),i(6,"section",13)(7,"h2",14),o(8,"LLM provider-ek"),n(),d(9,ut,2,0,"p",15)(10,Ct,3,0,"ul",16),n(),i(11,"section",13)(12,"h2",14),o(13,"Session \xF6sszes\xEDt\u0151"),n(),i(14,"div",17)(15,"p",18)(16,"span",19),o(17),n(),i(18,"span",20),o(19,"session"),n()(),d(20,xt,4,1,"p",21)(21,ft,6,9,"p",22),n()(),i(22,"section",23)(23,"h2",14),o(24,"Instance \xE1ttekint\u0151"),n(),d(25,St,2,0,"p",15)(26,vt,2,0,"p",15)(27,zt,23,9),n(),i(28,"section",13)(29,"h2",14),o(30,"Gyors linkek"),n(),i(31,"div",24)(32,"a",25),o(33," Open Sessions "),n(),i(34,"a",26),o(35," Be\xE1ll\xEDt\xE1sok "),n()()()()),t&2){let e=a,r=_(3);l(4),s(e.messagingProviders.length===0?4:5),l(5),s(e.llmProviders.length===0?9:10),l(8),c(e.sessionSummary.totalCount),l(3),s(e.sessionSummary.recentActivityCount!==void 0?20:-1),l(),s(e.lastErrorCount!==void 0&&e.lastErrorCount!==null?21:-1),l(4),s(r.runtimeInstances_DS.ccapInstanceListLoading_$()?25:r.runtimeInstances_DS.ccapInstanceListError_$()?26:27)}}function Bt(t,a){if(t&1&&d(0,jt,36,6,"div",12),t&2){let e,r=_(2);s((e=r.serverStatus_DS.status_$())?0:-1,e)}}function Gt(t,a){if(t&1&&d(0,lt,5,1,"div",8)(1,Bt,1,1),t&2){let e=_();s(e.serverStatus_DS.statusLoadError_$()?0:1)}}var Vt={"ccap-client":"CCAP Client","ccap-cli":"CCAP CLI",discord:"Discord"},Ot={[x.active]:"Active",[x.inactive]:"Inactive",[x.maintenance]:"Maintenance"},Ut={[f.working]:"Working",[f.idle]:"Idle",[f.offline]:"Offline"},Q=(()=>{class t{title="CCAP Revisioned";serverStatus_DS=S(K);runtimeInstances_DS=S(W);MESSAGING_PROVIDER_NAMES=Vt;INSTANCE_STATUS_LABELS=Ot;PRESENCE_LABELS=Ut;instanceSummary_$=k(()=>{let e=this.runtimeInstances_DS.ccapInstanceList_$(),r=e.length,m=e.filter(C=>C.status===x.active).length,X=e.filter(C=>C.status===x.inactive).length,Y=e.filter(C=>C.status===x.maintenance).length,w=0,H=0,L=0;for(let C of e)for(let A of C.sessionStatuses??[])A.presence===f.working?w++:A.presence===f.idle?H++:L++;return{totalCount:r,activeCount:m,inactiveCount:X,maintenanceCount:Y,workingSessionCount:w,idleSessionCount:H,offlineSessionCount:L}});llmProviderDisplayLabelsMap_$=k(()=>{let e=this.serverStatus_DS.status_$();if(!e)return{};let r={};for(let m of e.llmProviders)r[m]=U.getProviderDisplayLabel(m,null);return r});ngOnInit(){this.serverStatus_DS.loadStatus(),this.runtimeInstances_DS.loadCcapInstanceList()}loadStatus(){this.serverStatus_DS.loadStatus(),this.runtimeInstances_DS.loadCcapInstanceList()}static \u0275fac=function(r){return new(r||t)};static \u0275cmp=N({type:t,selectors:[["app-ccap-home"]],decls:10,vars:3,consts:[[1,"flex","flex-col","min-h-full","text-neutral-100","p-4","gt-xs:p-6"],[1,"flex","flex-col","xs:flex-row","xs:items-center","xs:justify-between","gap-4","mb-6"],[1,"text-2xl","gt-xs:text-3xl","font-bold","text-neutral-100"],[1,"text-neutral-400","text-sm","gt-xs:text-base","mt-1"],["type","button",1,"shrink-0","px-4","py-2","border","border-neonCyan","rounded-lg","text-neutral-400","text-sm","font-medium","hover:bg-neutral-800","hover:text-neutral-200","hover:shadow-neon-glow-cyan","transition-colors"],[1,"flex","items-center","justify-center","py-16"],["type","button",1,"shrink-0","px-4","py-2","border","border-neonCyan","rounded-lg","text-neutral-400","text-sm","font-medium","hover:bg-neutral-800","hover:text-neutral-200","hover:shadow-neon-glow-cyan","transition-colors",3,"click"],[1,"text-neutral-400"],[1,"rounded-lg","bg-neutral-800/60","border","border-red-500/50","p-6","max-w-2xl"],["sourceLabelOverride","St\xE1tusz bet\xF6lt\xE9s",1,"mb-4","block",3,"error"],[1,"text-center"],["type","button",1,"px-4","py-2","border","border-neonCyan","rounded-lg","text-neutral-300","text-sm","font-medium","hover:bg-neutral-700","hover:shadow-neon-glow-cyan","transition-colors",3,"click"],[1,"grid","grid-cols-1","md:grid-cols-2","lg:grid-cols-3","gap-4","mb-8"],[1,"flex","flex-col","rounded-lg","bg-neutral-800/60","border","border-neonDefault","p-4","min-h-0"],[1,"text-lg","font-semibold","text-neutral-200","mb-3","shrink-0"],[1,"text-neutral-500","text-sm"],[1,"space-y-2","min-h-0"],[1,"flex","flex-col","gap-1","min-h-0"],[1,"text-neutral-300"],[1,"text-2xl","font-bold","text-neutral-100"],[1,"ml-1"],[1,"text-neutral-400","text-sm"],[1,"text-sm","mt-1","flex","items-center","gap-1.5"],[1,"flex","flex-col","rounded-lg","bg-neutral-800/60","border","border-neonDefault","p-4","min-h-0","md:col-span-2","lg:col-span-3"],[1,"flex","flex-wrap","gap-3"],["routerLink","/session",1,"inline-flex","items-center","px-5","py-2.5","border","border-ccapAccent","rounded-lg","text-ccapAccent","text-sm","font-semibold","transition-colors","duration-200","hover:bg-ccapAccent","hover:text-white","hover:shadow-neon-glow-accent"],["routerLink","/settings",1,"inline-flex","items-center","px-5","py-2.5","border","border-neonCyan","rounded-lg","text-neutral-300","text-sm","font-semibold","transition-colors","duration-200","hover:bg-neutral-700","hover:text-white","hover:shadow-neon-glow-cyan"],[1,"flex","items-center","gap-3","flex-wrap"],[1,"text-neutral-200","font-medium"],[1,"px-2","py-0.5","text-xs","font-medium","rounded","bg-green-900/50","text-green-300","border","border-neonGreen","shrink-0"],[1,"px-2","py-0.5","text-xs","font-medium","rounded","bg-amber-900/50","text-amber-300","border","border-neonAmber","shrink-0"],[1,"text-neutral-500","text-xs","truncate","max-w-full",3,"title"],[1,"font-medium","text-neutral-300"],["aria-hidden","true",1,"inline-block","w-2","h-2","rounded-full","shrink-0"],[1,"font-medium"],[1,"flex","flex-wrap","gap-4","mb-4"],[1,"flex","items-center","gap-2"],[1,"w-2","h-2","rounded-full","bg-green-500","shrink-0"],[1,"text-neutral-300","text-sm","font-medium"],[1,"border-l","border-neutral-700","pl-4","flex","items-center","gap-2"],[1,"px-2","py-0.5","text-xs","font-medium","rounded","bg-green-900/50","text-green-300","border","border-neonGreen"],[1,"px-2","py-0.5","text-xs","font-medium","rounded","bg-amber-900/50","text-amber-300","border","border-neonAmber"],[1,"px-2","py-0.5","text-xs","font-medium","rounded","bg-neutral-700/50","text-neutral-400","border","border-neutral-600"],[1,"text-neutral-500","text-xs"],[1,"grid","grid-cols-1","md:grid-cols-2","lg:grid-cols-3","gap-3"],[1,"w-2","h-2","rounded-full","bg-neutral-500","shrink-0"],[1,"w-2","h-2","rounded-full","bg-amber-500","shrink-0"],[1,"rounded-md","border","border-neutral-700","bg-neutral-800/40","p-3","flex","flex-col","gap-2"],[1,"flex","items-center","justify-between","gap-2"],[1,"text-neutral-100","font-medium","text-sm","truncate"],[1,"px-2","py-0.5","text-xs","font-medium","rounded","bg-neutral-700/50","text-neutral-400","border","border-neutral-600","shrink-0"],[1,"text-neutral-500","text-xs","font-mono","truncate",3,"title"],[1,"flex","flex-col","gap-1.5","mt-1","pt-2","border-t","border-neutral-700/50"],[1,"text-neutral-600","text-xs","mt-1"],[1,"flex","items-center","gap-2","text-xs"],[1,"w-1.5","h-1.5","rounded-full","bg-green-500","shrink-0"],[1,"w-1.5","h-1.5","rounded-full","bg-amber-500","shrink-0"],[1,"w-1.5","h-1.5","rounded-full","bg-neutral-500","shrink-0"],[1,"text-neutral-300","truncate"],[1,"text-neutral-500","shrink-0"],[1,"text-neutral-500","text-xs","pl-3.5","-mt-1","truncate"]],template:function(r,m){r&1&&(i(0,"div",0)(1,"header",1)(2,"div")(3,"h1",2),o(4),n(),i(5,"p",3),o(6,"Agentic AI System"),n()(),d(7,ot,2,0,"button",4),n(),d(8,at,3,0,"div",5)(9,Gt,2,1),n()),r&2&&(l(4),c(m.title),l(3),s(!m.serverStatus_DS.statusLoading_$()&&!m.serverStatus_DS.statusLoadError_$()&&m.serverStatus_DS.status_$()?7:-1),l(),s(m.serverStatus_DS.statusLoading_$()?8:9))},dependencies:[B,b],encapsulation:2})}return t})();var Wt=[{path:"",pathMatch:"full",component:Q}],ue=(()=>{class t{static \u0275fac=function(r){return new(r||t)};static \u0275mod=R({type:t});static \u0275inj=M({imports:[j,G.forChild(Wt),b,O]})}return t})();export{ue as Dashboard_Module};
|
|
2
|
+
//# sourceMappingURL=dashboard.module-NUTWD5IC.js.map
|