@futdevpro/ccap 1.1.2968 → 1.1.2972
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-LFM3J2LA.js → agent-instances.module-7JIOUWBV.js} +2 -2
- package/client-dist/{ca.module-6IKKBFCV.js → ca.module-6RTUEF6F.js} +2 -2
- package/client-dist/{cc-usage-dashboard.component-MAJTREX5.js → cc-usage-dashboard.component-MUE3JFHY.js} +2 -2
- package/client-dist/{cc.module-WIBOFFFC.js → cc.module-MNX3GMAU.js} +2 -2
- package/client-dist/{chunk-GZNAXQSR.js → chunk-4WYWBPHC.js} +2 -2
- package/client-dist/{chunk-C6BPLTAT.js → chunk-4XIUSDLS.js} +2 -2
- package/client-dist/{chunk-M6XVA3F3.js → chunk-65KI3GR5.js} +2 -2
- package/client-dist/{chunk-GZJSMF4W.js → chunk-AAFXSEZA.js} +2 -2
- package/client-dist/{chunk-OHXBMPQN.js → chunk-AX73SZY3.js} +2 -2
- package/client-dist/{chunk-XC6OGCBT.js → chunk-BEGOF2N7.js} +2 -2
- package/client-dist/{chunk-SBTVSUCF.js → chunk-BM4UEP47.js} +2 -2
- package/client-dist/{chunk-ZO42CPIZ.js → chunk-D4MN4WBX.js} +2 -2
- package/client-dist/{chunk-334PU4V5.js → chunk-E4TY6O3W.js} +2 -2
- package/client-dist/{chunk-P4E77IA5.js → chunk-ECVTQRJ7.js} +2 -2
- package/client-dist/{chunk-ZTO2WC4L.js → chunk-F5SAKHCX.js} +2 -2
- package/client-dist/{chunk-SOA6UZHW.js → chunk-GAQBLHO3.js} +2 -2
- package/client-dist/{chunk-7QXWTKTQ.js → chunk-GAS7HMJI.js} +2 -2
- package/client-dist/{chunk-4O5PJT2Q.js → chunk-GK3RSZLZ.js} +2 -2
- package/client-dist/{chunk-KS3E56FC.js → chunk-IOXSJK5R.js} +2 -2
- package/client-dist/{chunk-GXVFIYGG.js → chunk-IPLQJBDL.js} +2 -2
- package/client-dist/{chunk-GOHAZ3UP.js → chunk-J6ZXTCHI.js} +2 -2
- package/client-dist/{chunk-PZ3A7XIC.js → chunk-K35DOQT7.js} +2 -2
- package/client-dist/{chunk-OAZA6CLB.js → chunk-K4GGODV4.js} +2 -2
- package/client-dist/{chunk-KYXVXZA4.js → chunk-K4ZQ4DD5.js} +2 -2
- package/client-dist/{chunk-5SYCIFC7.js → chunk-KVUL77OV.js} +2 -2
- package/client-dist/{chunk-Y4WOX5ZT.js → chunk-LZ2PMXWH.js} +2 -2
- package/client-dist/{chunk-BBQR7THP.js → chunk-MBE24QTZ.js} +2 -2
- package/client-dist/{chunk-TKJC6WIX.js → chunk-MEDDAUB3.js} +2 -2
- package/client-dist/{chunk-B5C3VRNW.js → chunk-MUV3H7Z7.js} +2 -2
- package/client-dist/{chunk-AFNG5IFQ.js → chunk-N3AR5TZI.js} +2 -2
- package/client-dist/{chunk-5JBJMD26.js → chunk-N3TQEDBL.js} +2 -2
- package/client-dist/{chunk-OAYVBZZD.js → chunk-NEZJG3XV.js} +2 -2
- package/client-dist/{chunk-BP6PERGA.js → chunk-OSJXI65X.js} +2 -2
- package/client-dist/{chunk-SLYF4BZT.js → chunk-P3UG3XEN.js} +2 -2
- package/client-dist/{chunk-2XU2LIK5.js → chunk-PQVFWHXC.js} +2 -2
- package/client-dist/{chunk-375SGREC.js → chunk-QB2UH3OX.js} +2 -2
- package/client-dist/{chunk-BNZAUTHL.js → chunk-QEMJBYC2.js} +2 -2
- package/client-dist/{chunk-AOZH5KZ5.js → chunk-QFCHFWGA.js} +2 -2
- package/client-dist/{chunk-K2BXFMAZ.js → chunk-QJKK7MN2.js} +2 -2
- package/client-dist/{chunk-MDOELCBX.js → chunk-QSOEXUHP.js} +2 -2
- package/client-dist/{chunk-3XP3ALCH.js → chunk-RL2M6DJN.js} +2 -2
- package/client-dist/{chunk-5L255H5C.js → chunk-RXRE3G4K.js} +2 -2
- package/client-dist/{chunk-5L255H5C.js.map → chunk-RXRE3G4K.js.map} +1 -1
- package/client-dist/{chunk-YV7GEWMV.js → chunk-SE7LVQMB.js} +2 -2
- package/client-dist/{chunk-UZWYHQU5.js → chunk-STIDSZ7I.js} +2 -2
- package/client-dist/{chunk-CSJOCUB5.js → chunk-T2722QP4.js} +2 -2
- package/client-dist/{chunk-WSRT2AXO.js → chunk-TKONBOQQ.js} +2 -2
- package/client-dist/{chunk-YFGRQVYN.js → chunk-U2WBKQML.js} +2 -2
- package/client-dist/{chunk-ZRLRJNW4.js → chunk-UE4NDJOE.js} +2 -2
- package/client-dist/{chunk-VER7DLPS.js → chunk-UNNGLS4Y.js} +2 -2
- package/client-dist/{chunk-PIN4VFXO.js → chunk-UYLV7WAB.js} +2 -2
- package/client-dist/chunk-UYNSNX4F.js +2 -0
- package/client-dist/chunk-UYNSNX4F.js.map +7 -0
- package/client-dist/{chunk-7DXWR6DX.js → chunk-VJEPWZGD.js} +2 -2
- package/client-dist/{chunk-DZ4365RI.js → chunk-VOITLR7O.js} +2 -2
- package/client-dist/{chunk-HIUVSLF2.js → chunk-VY4R2KTU.js} +2 -2
- package/client-dist/{chunk-F5OKFSMW.js → chunk-WDV7MFNU.js} +2 -2
- package/client-dist/{chunk-OUBAPK5Q.js → chunk-WKAKYIU5.js} +2 -2
- package/client-dist/{chunk-62O4YXH2.js → chunk-XYNIZC5J.js} +2 -2
- package/client-dist/{chunk-536ONGRA.js → chunk-ZO5UJXHI.js} +2 -2
- package/client-dist/{chunk-XS5NRBFX.js → chunk-ZOWPV7TY.js} +2 -2
- package/client-dist/{chunk-GLISSBW6.js → chunk-ZQT44XRN.js} +2 -2
- package/client-dist/{consultant.module-XYGMFIBX.js → consultant.module-DMGMZCMM.js} +2 -2
- package/client-dist/{crd.module-2TUYARHJ.js → crd.module-UY2I7Q6C.js} +2 -2
- package/client-dist/{dashboard.module-G47SY7RR.js → dashboard.module-YAB6AARF.js} +2 -2
- package/client-dist/{do.module-WWLJVEM2.js → do.module-BQ4IIBCS.js} +2 -2
- package/client-dist/{document-library.module-EKVYKBGO.js → document-library.module-DDFSHADI.js} +2 -2
- package/client-dist/{embedding-eval.module-ZXMLZHML.js → embedding-eval.module-FJTNYACK.js} +2 -2
- package/client-dist/{embedding-registry.module-EE5OFQVA.js → embedding-registry.module-Q7H4MSJI.js} +2 -2
- package/client-dist/{err.module-AQ7S3MIX.js → err.module-TEYGZOAQ.js} +2 -2
- package/client-dist/{feedback.module-PS2TJILH.js → feedback.module-46D4VD2U.js} +2 -2
- package/client-dist/{host-runtime-mcp.module-XHWB3K2U.js → host-runtime-mcp.module-MOMBWPOG.js} +2 -2
- package/client-dist/index.html +2 -2
- package/client-dist/{live-dev-pipeline.module-HVIUS654.js → live-dev-pipeline.module-3ZZC7EDM.js} +2 -2
- package/client-dist/{logs.module-RZOFXUFO.js → logs.module-CFTLPVNZ.js} +2 -2
- package/client-dist/main-4A2EJGC7.js +7 -0
- package/client-dist/main-4A2EJGC7.js.map +7 -0
- package/client-dist/{master-control-remote-poc.module-Z44FHFP3.js → master-control-remote-poc.module-4NVA4X32.js} +2 -2
- package/client-dist/{mobile-app.module-7EN7TBHL.js → mobile-app.module-46TKS6V5.js} +2 -2
- package/client-dist/{model-registry.module-3GLXXUHT.js → model-registry.module-L56ALPDT.js} +2 -2
- package/client-dist/{oc.module-XJXWDHRE.js → oc.module-OTDAUU73.js} +2 -2
- package/client-dist/{orc.module-TGXVMQLI.js → orc.module-L6G3GB6S.js} +2 -2
- package/client-dist/{project-management.module-24CUEUF5.js → project-management.module-U75UPDGP.js} +2 -2
- package/client-dist/project-source-routed.module-I4WHFL6T.js +2 -0
- package/client-dist/{scheduler.module-I4VI7QU7.js → scheduler.module-V7JUED6T.js} +2 -2
- package/client-dist/{session.module-MQKLXSPJ.js → session.module-CZCDYPUM.js} +2 -2
- package/client-dist/{set.module-EBOPU2SQ.js → set.module-XQ6TPATG.js} +5 -5
- package/client-dist/{set.module-EBOPU2SQ.js.map → set.module-XQ6TPATG.js.map} +3 -3
- package/client-dist/{setup.module-LOYXPT7O.js → setup.module-M5RVUX4A.js} +2 -2
- package/client-dist/styles-XKQ3MDLE.css +2 -0
- package/client-dist/styles-XKQ3MDLE.css.map +7 -0
- package/client-dist/{terminals.module-45PXK7MW.js → terminals.module-LPJ4TLM7.js} +2 -2
- package/client-dist/{voice-notes-poc.module-UIV4RQN3.js → voice-notes-poc.module-UXJM32VE.js} +2 -2
- package/client-dist/{wfs.module-BNMGWII3.js → wfs.module-UIBLZ4KZ.js} +2 -2
- package/package.json +1 -1
- package/server/build/src/_modules/setup-config/_routes/sc-server-status.controller.d.ts.map +1 -1
- package/server/build/src/_modules/setup-config/_routes/sc-server-status.controller.js +13 -0
- package/server/build/src/_modules/setup-config/_routes/sc-server-status.controller.js.map +1 -1
- package/server/build/src/_modules/setup-config/_services/control-services/sc-server-status.control-service.d.ts +28 -0
- package/server/build/src/_modules/setup-config/_services/control-services/sc-server-status.control-service.d.ts.map +1 -1
- package/server/build/src/_modules/setup-config/_services/control-services/sc-server-status.control-service.js +106 -0
- package/server/build/src/_modules/setup-config/_services/control-services/sc-server-status.control-service.js.map +1 -1
- package/client-dist/chunk-EIJM7YZZ.js +0 -2
- package/client-dist/chunk-EIJM7YZZ.js.map +0 -7
- package/client-dist/main-N4T3LPFJ.js +0 -7
- package/client-dist/main-N4T3LPFJ.js.map +0 -7
- package/client-dist/project-source-routed.module-DNGOB2JX.js +0 -2
- package/client-dist/styles-YBSH3JQY.css +0 -2
- package/client-dist/styles-YBSH3JQY.css.map +0 -7
- /package/client-dist/{agent-instances.module-LFM3J2LA.js.map → agent-instances.module-7JIOUWBV.js.map} +0 -0
- /package/client-dist/{ca.module-6IKKBFCV.js.map → ca.module-6RTUEF6F.js.map} +0 -0
- /package/client-dist/{cc-usage-dashboard.component-MAJTREX5.js.map → cc-usage-dashboard.component-MUE3JFHY.js.map} +0 -0
- /package/client-dist/{cc.module-WIBOFFFC.js.map → cc.module-MNX3GMAU.js.map} +0 -0
- /package/client-dist/{chunk-GZNAXQSR.js.map → chunk-4WYWBPHC.js.map} +0 -0
- /package/client-dist/{chunk-C6BPLTAT.js.map → chunk-4XIUSDLS.js.map} +0 -0
- /package/client-dist/{chunk-M6XVA3F3.js.map → chunk-65KI3GR5.js.map} +0 -0
- /package/client-dist/{chunk-GZJSMF4W.js.map → chunk-AAFXSEZA.js.map} +0 -0
- /package/client-dist/{chunk-OHXBMPQN.js.map → chunk-AX73SZY3.js.map} +0 -0
- /package/client-dist/{chunk-XC6OGCBT.js.map → chunk-BEGOF2N7.js.map} +0 -0
- /package/client-dist/{chunk-SBTVSUCF.js.map → chunk-BM4UEP47.js.map} +0 -0
- /package/client-dist/{chunk-ZO42CPIZ.js.map → chunk-D4MN4WBX.js.map} +0 -0
- /package/client-dist/{chunk-334PU4V5.js.map → chunk-E4TY6O3W.js.map} +0 -0
- /package/client-dist/{chunk-P4E77IA5.js.map → chunk-ECVTQRJ7.js.map} +0 -0
- /package/client-dist/{chunk-ZTO2WC4L.js.map → chunk-F5SAKHCX.js.map} +0 -0
- /package/client-dist/{chunk-SOA6UZHW.js.map → chunk-GAQBLHO3.js.map} +0 -0
- /package/client-dist/{chunk-7QXWTKTQ.js.map → chunk-GAS7HMJI.js.map} +0 -0
- /package/client-dist/{chunk-4O5PJT2Q.js.map → chunk-GK3RSZLZ.js.map} +0 -0
- /package/client-dist/{chunk-KS3E56FC.js.map → chunk-IOXSJK5R.js.map} +0 -0
- /package/client-dist/{chunk-GXVFIYGG.js.map → chunk-IPLQJBDL.js.map} +0 -0
- /package/client-dist/{chunk-GOHAZ3UP.js.map → chunk-J6ZXTCHI.js.map} +0 -0
- /package/client-dist/{chunk-PZ3A7XIC.js.map → chunk-K35DOQT7.js.map} +0 -0
- /package/client-dist/{chunk-OAZA6CLB.js.map → chunk-K4GGODV4.js.map} +0 -0
- /package/client-dist/{chunk-KYXVXZA4.js.map → chunk-K4ZQ4DD5.js.map} +0 -0
- /package/client-dist/{chunk-5SYCIFC7.js.map → chunk-KVUL77OV.js.map} +0 -0
- /package/client-dist/{chunk-Y4WOX5ZT.js.map → chunk-LZ2PMXWH.js.map} +0 -0
- /package/client-dist/{chunk-BBQR7THP.js.map → chunk-MBE24QTZ.js.map} +0 -0
- /package/client-dist/{chunk-TKJC6WIX.js.map → chunk-MEDDAUB3.js.map} +0 -0
- /package/client-dist/{chunk-B5C3VRNW.js.map → chunk-MUV3H7Z7.js.map} +0 -0
- /package/client-dist/{chunk-AFNG5IFQ.js.map → chunk-N3AR5TZI.js.map} +0 -0
- /package/client-dist/{chunk-5JBJMD26.js.map → chunk-N3TQEDBL.js.map} +0 -0
- /package/client-dist/{chunk-OAYVBZZD.js.map → chunk-NEZJG3XV.js.map} +0 -0
- /package/client-dist/{chunk-BP6PERGA.js.map → chunk-OSJXI65X.js.map} +0 -0
- /package/client-dist/{chunk-SLYF4BZT.js.map → chunk-P3UG3XEN.js.map} +0 -0
- /package/client-dist/{chunk-2XU2LIK5.js.map → chunk-PQVFWHXC.js.map} +0 -0
- /package/client-dist/{chunk-375SGREC.js.map → chunk-QB2UH3OX.js.map} +0 -0
- /package/client-dist/{chunk-BNZAUTHL.js.map → chunk-QEMJBYC2.js.map} +0 -0
- /package/client-dist/{chunk-AOZH5KZ5.js.map → chunk-QFCHFWGA.js.map} +0 -0
- /package/client-dist/{chunk-K2BXFMAZ.js.map → chunk-QJKK7MN2.js.map} +0 -0
- /package/client-dist/{chunk-MDOELCBX.js.map → chunk-QSOEXUHP.js.map} +0 -0
- /package/client-dist/{chunk-3XP3ALCH.js.map → chunk-RL2M6DJN.js.map} +0 -0
- /package/client-dist/{chunk-YV7GEWMV.js.map → chunk-SE7LVQMB.js.map} +0 -0
- /package/client-dist/{chunk-UZWYHQU5.js.map → chunk-STIDSZ7I.js.map} +0 -0
- /package/client-dist/{chunk-CSJOCUB5.js.map → chunk-T2722QP4.js.map} +0 -0
- /package/client-dist/{chunk-WSRT2AXO.js.map → chunk-TKONBOQQ.js.map} +0 -0
- /package/client-dist/{chunk-YFGRQVYN.js.map → chunk-U2WBKQML.js.map} +0 -0
- /package/client-dist/{chunk-ZRLRJNW4.js.map → chunk-UE4NDJOE.js.map} +0 -0
- /package/client-dist/{chunk-VER7DLPS.js.map → chunk-UNNGLS4Y.js.map} +0 -0
- /package/client-dist/{chunk-PIN4VFXO.js.map → chunk-UYLV7WAB.js.map} +0 -0
- /package/client-dist/{chunk-7DXWR6DX.js.map → chunk-VJEPWZGD.js.map} +0 -0
- /package/client-dist/{chunk-DZ4365RI.js.map → chunk-VOITLR7O.js.map} +0 -0
- /package/client-dist/{chunk-HIUVSLF2.js.map → chunk-VY4R2KTU.js.map} +0 -0
- /package/client-dist/{chunk-F5OKFSMW.js.map → chunk-WDV7MFNU.js.map} +0 -0
- /package/client-dist/{chunk-OUBAPK5Q.js.map → chunk-WKAKYIU5.js.map} +0 -0
- /package/client-dist/{chunk-62O4YXH2.js.map → chunk-XYNIZC5J.js.map} +0 -0
- /package/client-dist/{chunk-536ONGRA.js.map → chunk-ZO5UJXHI.js.map} +0 -0
- /package/client-dist/{chunk-XS5NRBFX.js.map → chunk-ZOWPV7TY.js.map} +0 -0
- /package/client-dist/{chunk-GLISSBW6.js.map → chunk-ZQT44XRN.js.map} +0 -0
- /package/client-dist/{consultant.module-XYGMFIBX.js.map → consultant.module-DMGMZCMM.js.map} +0 -0
- /package/client-dist/{crd.module-2TUYARHJ.js.map → crd.module-UY2I7Q6C.js.map} +0 -0
- /package/client-dist/{dashboard.module-G47SY7RR.js.map → dashboard.module-YAB6AARF.js.map} +0 -0
- /package/client-dist/{do.module-WWLJVEM2.js.map → do.module-BQ4IIBCS.js.map} +0 -0
- /package/client-dist/{document-library.module-EKVYKBGO.js.map → document-library.module-DDFSHADI.js.map} +0 -0
- /package/client-dist/{embedding-eval.module-ZXMLZHML.js.map → embedding-eval.module-FJTNYACK.js.map} +0 -0
- /package/client-dist/{embedding-registry.module-EE5OFQVA.js.map → embedding-registry.module-Q7H4MSJI.js.map} +0 -0
- /package/client-dist/{err.module-AQ7S3MIX.js.map → err.module-TEYGZOAQ.js.map} +0 -0
- /package/client-dist/{feedback.module-PS2TJILH.js.map → feedback.module-46D4VD2U.js.map} +0 -0
- /package/client-dist/{host-runtime-mcp.module-XHWB3K2U.js.map → host-runtime-mcp.module-MOMBWPOG.js.map} +0 -0
- /package/client-dist/{live-dev-pipeline.module-HVIUS654.js.map → live-dev-pipeline.module-3ZZC7EDM.js.map} +0 -0
- /package/client-dist/{logs.module-RZOFXUFO.js.map → logs.module-CFTLPVNZ.js.map} +0 -0
- /package/client-dist/{master-control-remote-poc.module-Z44FHFP3.js.map → master-control-remote-poc.module-4NVA4X32.js.map} +0 -0
- /package/client-dist/{mobile-app.module-7EN7TBHL.js.map → mobile-app.module-46TKS6V5.js.map} +0 -0
- /package/client-dist/{model-registry.module-3GLXXUHT.js.map → model-registry.module-L56ALPDT.js.map} +0 -0
- /package/client-dist/{oc.module-XJXWDHRE.js.map → oc.module-OTDAUU73.js.map} +0 -0
- /package/client-dist/{orc.module-TGXVMQLI.js.map → orc.module-L6G3GB6S.js.map} +0 -0
- /package/client-dist/{project-management.module-24CUEUF5.js.map → project-management.module-U75UPDGP.js.map} +0 -0
- /package/client-dist/{project-source-routed.module-DNGOB2JX.js.map → project-source-routed.module-I4WHFL6T.js.map} +0 -0
- /package/client-dist/{scheduler.module-I4VI7QU7.js.map → scheduler.module-V7JUED6T.js.map} +0 -0
- /package/client-dist/{session.module-MQKLXSPJ.js.map → session.module-CZCDYPUM.js.map} +0 -0
- /package/client-dist/{setup.module-LOYXPT7O.js.map → setup.module-M5RVUX4A.js.map} +0 -0
- /package/client-dist/{terminals.module-45PXK7MW.js.map → terminals.module-LPJ4TLM7.js.map} +0 -0
- /package/client-dist/{voice-notes-poc.module-UIV4RQN3.js.map → voice-notes-poc.module-UXJM32VE.js.map} +0 -0
- /package/client-dist/{wfs.module-BNMGWII3.js.map → wfs.module-UIBLZ4KZ.js.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["src/main.ts", "src/app/_modules/external-sessions/_services/control-services/exs-instance-presence-subscriber.control-service.ts", "src/app/_components/ccap-app-update-banner/ccap-app-update-banner.component.ts", "src/app/_components/ccap-app-update-banner/ccap-app-update-banner.component.html", "src/app/_components/ccap-server-update-banner/ccap-server-update-banner.component.ts", "src/app/_components/ccap-server-update-banner/ccap-server-update-banner.component.html", "src/app/_components/ccap-error-popup/ccap-error-popup.component.ts", "src/app/_components/ccap-error-popup/ccap-error-popup.component.html", "src/app/_collections/network-diagnostic/ccap-network-diagnostic.util.ts", "src/app/_components/ccap-mobile-server-setup/ccap-mobile-server-setup.component.ts", "src/app/_components/ccap-mobile-server-setup/ccap-mobile-server-setup.component.html", "src/app/_services/control-services/ccap-layout-overlay.control-service.ts", "src/app/_services/control-services/ccap-mobile-notification.control-service.ts", "src/app/_modules/system/_modules/notification/_services/ntf.api-service.ts", "src/app/_modules/system/_modules/notification/_collections/consts/ntf.const.ts", "src/app/_modules/system/_modules/notification/_services/ntf.data-service.ts", "src/app/_modules/system/_modules/notification/_components/ccap-notification-response-controls/ntf-response-controls.component.ts", "src/app/_modules/system/_modules/notification/_components/ccap-notification-response-controls/ntf-response-controls.component.html", "src/app/_modules/system/_modules/notification/_components/ccap-notification-item/ntf-item.component.ts", "src/app/_modules/system/_modules/notification/_components/ccap-notification-item/ntf-item.component.html", "src/app/_modules/system/_modules/notification/_components/ccap-notification-tray/ntf-tray.component.ts", "src/app/_modules/system/_modules/notification/_components/ccap-notification-tray/ntf-tray.component.html", "src/app/_components/ccap-main-frame/ccap-main-frame.component.ts", "src/app/_components/ccap-main-frame/ccap-main-frame.component.html", "src/app/_components/ccap-server-unavailable-overlay/_collections/ccap-circuit-path.util.ts", "src/app/_components/ccap-server-unavailable-overlay/ccap-server-unavailable-overlay.component.ts", "src/app/_components/ccap-server-unavailable-overlay/ccap-server-unavailable-overlay.component.html", "src/app/_modules/user-input/_components/ccap-user-input-fab/uin-fab.component.ts", "src/app/_modules/user-input/_components/ccap-user-input-fab/uin-fab.component.html", "src/app/_modules/user-input/_collections/consts/quick-input/uin-quick-input-area-custom-select.const.ts", "src/app/_modules/user-input/_enums/uin-quick-input-panel-placement.enum.ts", "src/app/_modules/user-input/_enums/uin-quick-input-panel-vertical-anchor.type-enum.ts", "src/app/_modules/user-input/_collections/uin-panel-anchor.util.ts", "src/app/_modules/user-input/_components/ccap-user-input-panel/uin-panel.component.ts", "src/app/_modules/user-input/_components/ccap-user-input-panel/uin-panel.component.html", "src/app/_modules/user-input/_components/ccap-quick-input-actions-modal/uin-quick-actions-modal.component.ts", "src/app/_modules/user-input/_components/ccap-quick-input-actions-modal/uin-quick-input-actions-modal.component.html", "src/app/_modules/user-input/_collections/consts/quick-input/uin-quick-input-overlay-z-index.const.ts", "src/app/_modules/user-input/_collections/utils/quick-input/uin-quick-input-new-session-name.util.ts", "src/app/_modules/user-input/_enums/uin-quick-input-modal-pane.enum.ts", "src/app/_modules/user-input/_enums/uin-quick-input-send-session-target.enum.ts", "src/app/_modules/user-input/_collections/utils/quick-input/uin-quick-input-dom-pick.util.ts", "src/app/_modules/user-input/_components/ccap-quick-input-dom-picker-overlay/uin-quick-dom-picker-overlay.component.ts", "src/app/_modules/user-input/_components/ccap-quick-input-dom-picker-overlay/uin-quick-input-dom-picker-overlay.component.html", "src/app/app.component.ts", "src/app/app.component.html", "src/app/app.routing-module.ts", "src/app/_services/interceptors/error.interceptor.ts", "src/app/_services/global-error.handler.ts", "src/app/app.module.ts"],
|
|
4
|
+
"sourcesContent": ["import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n\nimport { DyFM_Log } from '@futdevpro/fsm-dynamo';\n\nimport { SocketUrl_Util } from './app/_collections/utils/socket-url.util';\nimport { App_Module } from './app/app.module';\nimport { environment } from './environments/environment';\n\n/**\n * Capacitor platform-detekció: true ha natív mobil appban futunk (Android/iOS WebView).\n * Web böngészőben mindig false.\n */\nfunction isCapacitorNative(): boolean {\n return typeof (window as any).Capacitor !== 'undefined'\n && (window as any).Capacitor.isNativePlatform?.() === true;\n}\n\nconst url: URL = new URL(window.location.href);\n\nif (isCapacitorNative()) {\n // Mobil app: a szerver címét localStorage-ból vesszük (Settings-ben konfigurálható).\n const savedServerUrl: string | null = localStorage.getItem('ccap-server-url');\n // Default HTTP — self-signed cert-tel a WebView network stack nem trust-olja,\n // HTTPS-re opt-in-tel váltható a mobile setup overlay-en.\n environment.baseUrl = savedServerUrl ?? 'http://localhost:39050';\n} else {\n // Web: same-origin (meglévő logika, változatlan).\n environment.baseUrl = url.origin;\n}\nenvironment.api.baseUrl = environment.baseUrl + '/api';\n\n/**\n * Ha a server status httpPort/socketPort-ot ad vissza, socketUrl-t állítunk:\n * Web: same-origin (url.origin) — a szerver-URL maga a page origin.\n * Capacitor natív: `environment.baseUrl` (user-configured server URL) — a WebView saját\n * `https://localhost` origin-je NEM a szerver, tehát `url.origin`-t NEM használhatjuk.\n * Retry: npm start-nál a szerver késhet; 3 próba 800 ms késleltetéssel.\n */\nconst STATUS_FETCH_RETRIES: number = 3;\nconst STATUS_FETCH_DELAY_MS: number = 800;\n\nfunction fetchStatus(statusUrl: string): Promise<{ httpPort?: number; socketPort?: number }> {\n return fetch(statusUrl).then(\n (res: Response): Promise<{ httpPort?: number; socketPort?: number }> => res.json(),\n );\n}\n\nfunction bootstrap(): void {\n platformBrowserDynamic()\n .bootstrapModule(App_Module)\n .then((): void => {\n scheduleBootSplashHide();\n })\n .catch((err: unknown): void => {\n DyFM_Log.H_error('CCAP Revisioned client init error\\n', err);\n // Safety net: bootstrap hiba esetén is el kell tűnnie a splash-nek, különben a user\n // egy forgó körrel marad — akkor sem lát semmit, ha az error UI már renderelődött volna.\n scheduleBootSplashHide();\n });\n}\n\n/** Inline splash CSS fade duration (ms) — index.html `.ccap-splash--fade-out` transition. */\nconst CCAP_BOOT_SPLASH_FADE_OUT_MS: number = 300;\n/** Fade-out teljes puffer, ami után DOM-ból remove-oljuk az inline splash-t. */\nconst CCAP_BOOT_SPLASH_REMOVE_AFTER_MS: number = 320;\n\n/**\n * Boot splash eltűntetés Angular bootstrap után.\n * - Double-RAF: első Angular paint kivárása, hogy a fade-out alatt már a végleges UI legyen mögötte.\n * - Inline splash (`#ccap-splash` a index.html-ben): CSS opacity fade → 320 ms után DOM remove.\n * - Capacitor natív splash (Android 12 SplashScreen API): egyidejű `hide({ fadeOutDuration })`.\n * - Web (nem Capacitor): az inline splash `data-ccap-splash=\"hidden\"` miatt `display: none`;\n * a Capacitor plugin nem elérhető → optional chaining noop. Nincs runtime hiba.\n */\nfunction scheduleBootSplashHide(): void {\n requestAnimationFrame((): void => {\n requestAnimationFrame((): void => {\n const splashEl: HTMLElement | null = document.getElementById('ccap-splash');\n if (splashEl) {\n splashEl.classList.add('ccap-splash--fade-out');\n setTimeout((): void => {\n splashEl.remove();\n }, CCAP_BOOT_SPLASH_REMOVE_AFTER_MS);\n }\n // Capacitor natív splash hide — csak mobil natív context-ben elérhető. Fire-and-forget Promise.\n const capSplash: { hide?: (opts: { fadeOutDuration: number }) => unknown } | undefined =\n (window as any).Capacitor?.Plugins?.SplashScreen;\n capSplash?.hide?.({ fadeOutDuration: CCAP_BOOT_SPLASH_FADE_OUT_MS });\n });\n });\n}\n\n/** localStorage kulcs a legutóbbi status fetch hibához — az overlay / diagnosztika olvassa. */\nconst CCAP_BOOT_STATUS_ERROR_STORAGE_KEY: string = 'ccap-boot-status-error';\n\nfunction attemptStatusThenBootstrap(attempt: number): void {\n // SSOT a szerver-URL-re: `environment.baseUrl`. Web-en ez `url.origin`,\n // Capacitor natíven a localStorage-ba mentett felhasználói szerver-cím.\n const serverBaseUrl: string = environment.baseUrl;\n const statusUrl: string = serverBaseUrl + '/api/server/status';\n\n fetchStatus(statusUrl)\n .then((data: { httpPort?: number; socketPort?: number }): void => {\n const httpPort: number | undefined =\n typeof data.httpPort === 'number' && data.httpPort > 0 ? data.httpPort : undefined;\n const socketPort: number | undefined =\n typeof data.socketPort === 'number' && data.socketPort > 0 ? data.socketPort : undefined;\n\n environment.socketUrl = SocketUrl_Util.computeSocketUrlFromStatus(\n { httpPort: data.httpPort, socketPort: data.socketPort },\n serverBaseUrl,\n );\n // Siker — töröljük a korábbi error snapshot-ot.\n try {\n localStorage.removeItem(CCAP_BOOT_STATUS_ERROR_STORAGE_KEY);\n } catch {\n // localStorage nem érhető el — no-op.\n }\n DyFM_Log.info('CCAP_Socket | status ok, socketUrl set to', environment.socketUrl);\n })\n .catch((err: unknown): void => {\n if (attempt >= STATUS_FETCH_RETRIES) {\n environment.socketUrl = serverBaseUrl;\n // Maradt utolsó hiba — mentsük localStorage-ba, hogy a server-unavailable overlay kiolvashassa.\n const errorSnapshot: Record<string, string | number> = {\n targetUrl: statusUrl,\n errorName: err instanceof Error ? err.name : 'unknown',\n errorMessage: err instanceof Error ? err.message : String(err),\n attempts: STATUS_FETCH_RETRIES,\n timestamp: new Date().toISOString(),\n };\n try {\n localStorage.setItem(CCAP_BOOT_STATUS_ERROR_STORAGE_KEY, JSON.stringify(errorSnapshot));\n } catch {\n // localStorage nem érhető el — no-op.\n }\n DyFM_Log.warn(\n 'CCAP_Socket | status fetch failed after retries, socketUrl fallback to',\n serverBaseUrl,\n errorSnapshot,\n );\n } else {\n setTimeout((): void => attemptStatusThenBootstrap(attempt + 1), STATUS_FETCH_DELAY_MS);\n return;\n }\n })\n .finally((): void => {\n if (environment.socketUrl !== undefined || attempt >= STATUS_FETCH_RETRIES) {\n bootstrap();\n }\n });\n}\n\nfunction initSocketUrlThenBootstrap(): void {\n attemptStatusThenBootstrap(0);\n}\n\ninitSocketUrlThenBootstrap();\n", "import { inject, Injectable, OnDestroy } from '@angular/core';\n\nimport { DyFM_Log } from '@futdevpro/fsm-dynamo';\nimport { Subscription } from 'rxjs';\n\nimport { CCAP_Socket_ControlService } from '../../../../_services/control-services/ccap-socket.control-service';\nimport { ExS_InstancePresence_DataService } from '../data-services/exs-instance-presence.data-service';\n\n/**\n * REQ-INST-STATE-001 Slice 6 (cycle 702) — instance:presence-update\n * socket event subscriber. Real-time presence transition: amikor a server\n * `PEI_WsServer` peer connect/disconnect-et detektál (cycle 701), a kliens\n * itt fogja le az eventet és `presence_DS.refreshNow()`-t hív — így a UI\n * 1s-en belül frissül, nem 60s polling-ot kell várni.\n *\n * Külön service (nem a presence_DS-en belül) hogy a presence_DS spec-jei\n * NE igényeljenek socket dependency-t. A subscriber csak akkor instantiated,\n * ha valaki injektálja (`providedIn: 'root'` lazy). Az `initialize()`\n * metódust az app-szintű komponens (CCAP_App_Component) hívja a boot-on.\n */\n@Injectable({ providedIn: 'root' })\nexport class ExS_InstancePresenceSubscriber_ControlService implements OnDestroy {\n\n private readonly socket_CS: CCAP_Socket_ControlService =\n inject(CCAP_Socket_ControlService);\n\n private readonly presence_DS: ExS_InstancePresence_DataService =\n inject(ExS_InstancePresence_DataService);\n\n private subscription: Subscription | null = null;\n\n /**\n * Subscribe a socket event stream-re. Idempotens — multi-call esetén\n * csak 1 aktív subscription. App-szintű boot komponens hívja meg.\n */\n initialize(): void {\n if (this.subscription) {\n return;\n }\n this.subscription = this.socket_CS.event$.subscribe(\n (envelope: { event: string; payload: Record<string, unknown> }): void => {\n if (envelope.event !== 'instance:presence-update') {\n return;\n }\n // Real-time refresh: a server-broadcast tájékoztatott a peer state\n // változásról, tehát friss server-side presence-info-ra van szükség.\n // Best-effort: hibákat warn-ban, nem dob.\n this.presence_DS.refreshNow().catch((err: unknown): void => {\n DyFM_Log.warn(\n `[CCAP] ExS_InstancePresenceSubscriber_CS: refreshNow failed (non-fatal): ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n });\n },\n );\n }\n\n /**\n * Unsubscribe — app-shutdown vagy test-teardown.\n */\n ngOnDestroy(): void {\n if (this.subscription) {\n this.subscription.unsubscribe();\n this.subscription = null;\n }\n }\n}\n", "import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\n\nimport { environment } from '../../../environments/environment';\nimport { CCAP_AppVersionCheck_ControlService } from '../../_services/control-services/app-update/ccap-app-version-check.control-service';\nimport { CCAP_MobileAppUpdaterPhase_Type } from '../../_services/control-services/app-update/ccap-mobile-app-updater-phase.type-enum';\nimport { CCAP_MobileAppUpdater_ControlService } from '../../_services/control-services/app-update/ccap-mobile-app-updater.control-service';\n\n/**\n * Mobil app frissítés banner: akkor jelenik meg, ha a version-check SSOT új verziót jelez\n * és az `updateAvailable_$` true. Nem blokkoló; a user elindíthatja a telepítést\n * az Install gombbal (natív AppUpdater plugin → Android system prompt).\n *\n * Az auto-update setting (SSOT szerver) csak az auto-trigger viselkedését befolyásolja;\n * a banner mindig látszik, ha van új verzió, hogy a user manuálisan is telepíthessen.\n */\n@Component({\n selector: 'app-ccap-app-update-banner',\n standalone: true,\n imports: [],\n templateUrl: './ccap-app-update-banner.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n/** CCAP_AppUpdateBanner_Component class. */\nexport class CCAP_AppUpdateBanner_Component {\n\n readonly versionCheck_CS: CCAP_AppVersionCheck_ControlService =\n inject(CCAP_AppVersionCheck_ControlService);\n\n readonly updater_CS: CCAP_MobileAppUpdater_ControlService =\n inject(CCAP_MobileAppUpdater_ControlService);\n\n /** Jelenlegi kliens verzió (megjelenítéshez). */\n readonly currentVersion: string = environment.version;\n\n /** Install gomb címke a fázis szerint. */\n readonly installButtonLabel_$ = computed<string>((): string => {\n const phase: CCAP_MobileAppUpdaterPhase_Type = this.updater_CS.phase_$();\n if (phase === CCAP_MobileAppUpdaterPhase_Type.downloading) {\n return 'Letöltés…';\n }\n if (phase === CCAP_MobileAppUpdaterPhase_Type.installing) {\n return 'Telepítés…';\n }\n if (phase === CCAP_MobileAppUpdaterPhase_Type.failed) {\n return 'Újra próbálás';\n }\n return 'Telepítés';\n });\n\n /** Install gomb disabled state (futás közben). */\n readonly isInstallDisabled_$ = computed<boolean>((): boolean => {\n const phase: CCAP_MobileAppUpdaterPhase_Type = this.updater_CS.phase_$();\n return phase === CCAP_MobileAppUpdaterPhase_Type.downloading\n || phase === CCAP_MobileAppUpdaterPhase_Type.installing;\n });\n\n /**\n * Install gomb kattintás — updater service indítja a natív plugin-t vagy fallback-et.\n */\n handleInstall(): void {\n void this.updater_CS.startUpdate();\n }\n}\n", "@if (versionCheck_CS.updateAvailable_$()) {\n <div class=\"shrink-0 border-b border-ccapAccent/40 bg-ccapAccent/10 px-3 py-2 text-sm text-neutral-200\n flex flex-wrap items-center justify-between gap-2\">\n <div class=\"flex items-center gap-2 min-w-0\">\n <span class=\"inline-block w-2 h-2 rounded-full bg-ccapAccent animate-pulse shrink-0\" aria-hidden=\"true\"></span>\n <span class=\"truncate\">\n Új app verzió elérhető: <span class=\"font-mono\">v{{ versionCheck_CS.latestPackageVersion_$() }}</span>\n <span class=\"text-neutral-400\"> (jelenleg v{{ currentVersion }})</span>\n </span>\n </div>\n <div class=\"flex items-center gap-2 shrink-0\">\n @if (updater_CS.lastError_$()) {\n <span class=\"text-xs text-red-400 max-w-[200px] truncate\" [title]=\"updater_CS.lastError_$()\">\n {{ updater_CS.lastError_$() }}\n </span>\n }\n <button type=\"button\"\n [disabled]=\"isInstallDisabled_$()\"\n (click)=\"handleInstall()\"\n class=\"rounded-md border border-ccapAccent/60 bg-ccapAccent/15 px-3 py-1 text-xs font-medium\n text-ccapAccent hover:bg-ccapAccent/25 disabled:opacity-40 disabled:cursor-not-allowed\n transition-colors\">\n {{ installButtonLabel_$() }}\n </button>\n </div>\n </div>\n}\n", "import { Component, inject, OnInit, signal } from '@angular/core';\nimport { RouterLink } from '@angular/router';\n\nimport { Set_VersionInfo_DataService } from '../../_modules/config/_modules/settings/_services/data-services/global-settings/version-info/set-version-info.data-service';\n\n/**\n * Cycle 781c (REQ-SYS-INSTALL-VERSION-CHECK-001 Slice C) — globális server\n * update banner. Megjelenik az app shell tetején, ha a server verzió elavult\n * (npm-latest > server) VAGY ha aktív CC runner-ek verziója eltér a server-étől.\n *\n * Egyszer fetch-eli a `/api/server/health/version-info` endpoint-ot az ngOnInit-ben.\n * A user dismissable a session erejéig (signal flag — nem kerül localStorage-be,\n * a következő app-restart újra mutatja).\n */\n@Component({\n selector: 'app-ccap-server-update-banner',\n standalone: true,\n imports: [RouterLink],\n templateUrl: './ccap-server-update-banner.component.html',\n})\n/** CCAP_ServerUpdateBanner_Component class. */\nexport class CCAP_ServerUpdateBanner_Component implements OnInit {\n\n readonly versionInfo_DS: Set_VersionInfo_DataService =\n inject(Set_VersionInfo_DataService);\n\n /** Session-szintű dismiss flag — egy app-mount-ig elrejti a banner-t. */\n readonly dismissed_$ = signal<boolean>(false);\n\n ngOnInit(): void {\n // Fire-and-forget — a banner csak akkor jelenik meg, ha a fetch sikeres és\n // outdated/mismatch állapot van. A `npm view` 10s timeout-ig futhat,\n // async-ot indítjuk a háttérben.\n void this.versionInfo_DS.loadVersionInfo();\n }\n\n /** Banner elrejtése a következő app-restartig. */\n handleDismiss(): void {\n this.dismissed_$.set(true);\n }\n\n /**\n * REQ-SYS-UPDATE-TRIGGER-001 — „Frissítés most\" gomb. POST a server\n * trigger-update endpoint-jára; a server 202-tel válaszol, majd ~30-90s\n * múlva újraindul. A signal-state vezérli a UI feedback-et (spinner,\n * eredmény-üzenet).\n */\n async handleTriggerUpdate(): Promise<void> {\n await this.versionInfo_DS.triggerUpdate();\n }\n}\n", "@if (versionInfo_DS.versionInfo_$(); as info) {\n <!-- Cycle 785 UX fix: trigger CSAK `serverIsOutdated`-en (npm-latest > server).\n A runner-mismatch ESETÉN nem mutatjuk a globál banner-t, mert per-runner\n gomb (`↻ Restart runner` a CC Session metadata panelben) + Settings\n Version-info szekció a megfelelő hely arra. + Pozícionálás `relative`-re\n (nem fixed) — a normál layout flow tolja a fő header-t lejjebb, nem\n takarja el.\n\n REQ-SYS-UPDATE-TRIGGER-001: a copy-paste `npm i -g` snippet helyett\n valódi „Frissítés most\" gomb hívja a POST /server/health/trigger-update\n endpoint-ot. Trigger eredmény (started / already-latest / error) inline\n megjelenítve a banner-ben. -->\n @if (!dismissed_$() && info.serverIsOutdated) {\n <div class=\"relative w-full px-3 py-2 gt-xs:px-4 gt-xs:py-3\n bg-amber-950/95 border-b border-amber-700 text-amber-100 shadow-lg\n flex flex-wrap items-center gap-2 gt-xs:gap-3 text-xs gt-xs:text-sm\">\n <span class=\"px-1.5 py-0.5 text-[10px] uppercase font-mono tracking-wider\n bg-amber-600 text-amber-950 rounded shrink-0\">\n UPDATE\n </span>\n <span class=\"font-medium\">\n Server elavult: v{{ info.serverVersion }} → v{{ info.npmLatestVersion }}.\n </span>\n\n <!-- REQ-SYS-UPDATE-TRIGGER-001: trigger-gomb. Csak akkor enabled, ha\n nincs folyamatban trigger ÉS még nem futott le sikeresen (`started`\n után a server újraindul, fölösleges újra kattintani). -->\n <button type=\"button\"\n (click)=\"handleTriggerUpdate()\"\n [disabled]=\"versionInfo_DS.triggering_$() || versionInfo_DS.triggerResult_$()?.status === 'started'\"\n class=\"px-3 py-1.5 rounded border border-amber-400 bg-amber-700/40 text-amber-50\n hover:bg-amber-600/60 hover:shadow-neon-glow-amber transition-colors duration-200\n disabled:opacity-50 disabled:cursor-not-allowed font-medium shrink-0\">\n @if (versionInfo_DS.triggering_$()) {\n <span class=\"inline-block w-3 h-3 mr-2 align-middle border-2 border-amber-200/40\n border-t-amber-100 rounded-full animate-spin\"></span>\n Frissítés indítása…\n } @else if (versionInfo_DS.triggerResult_$()?.status === 'started') {\n ⏳ Server újraindul…\n } @else {\n 🔄 Frissítés most\n }\n </button>\n\n <a routerLink=\"/settings\"\n class=\"ml-auto px-2 py-1 text-amber-200 hover:bg-amber-900/40 rounded\n transition-colors shrink-0\">\n Settings\n </a>\n <button type=\"button\"\n (click)=\"handleDismiss()\"\n aria-label=\"Banner elrejtése\"\n class=\"px-2 py-1 text-amber-300 hover:bg-amber-900/40 rounded\n transition-colors shrink-0\">\n ✕\n </button>\n\n <!-- Trigger eredmény / hiba inline (új sor). Az `@else if (... as r)` szintaxis\n tilos az Angular template-ben (NG5002) — nested @if a megoldás. -->\n @if (versionInfo_DS.triggerError_$(); as err) {\n <p class=\"basis-full text-rose-300 text-xs mt-1\">\n ⚠ Frissítés hiba: <span class=\"font-mono\">{{ err }}</span>\n </p>\n } @else {\n @if (versionInfo_DS.triggerResult_$(); as r) {\n <p class=\"basis-full text-amber-200 text-xs mt-1\">\n @if (r.status === 'started') {\n ✓ {{ r.message }}\n } @else if (r.status === 'already-latest') {\n ℹ {{ r.message }}\n } @else {\n ⚠ {{ r.message }}\n }\n </p>\n }\n }\n\n <!-- REQ-SYS-UPDATE-POLL-001: post-update polling progress (5s × 18 = 90s). -->\n @if (versionInfo_DS.pollingPostUpdate_$()) {\n <p class=\"basis-full text-amber-300 text-xs mt-1 italic\">\n <span class=\"inline-block w-3 h-3 mr-1 align-middle border-2 border-amber-300/40\n border-t-amber-200 rounded-full animate-spin\"></span>\n Várakozás a server visszajövetelére (max 90s)…\n </p>\n }\n\n <!-- REQ-SYS-UPDATE-POLL-001: sikeres detekció — verzió-változás. -->\n @if (versionInfo_DS.triggerSucceeded_$(); as ok) {\n <p class=\"basis-full text-emerald-300 text-xs mt-1 font-semibold\">\n ✅ Frissítve <span class=\"font-mono\">v{{ ok.oldVersion }}</span>\n → <span class=\"font-mono\">v{{ ok.newVersion }}</span>\n — oldal újratöltése 5s múlva…\n </p>\n }\n\n <!-- REQ-SYS-UPDATE-POLL-001: 90s timeout — server nem jött vissza új verzióval. -->\n @if (versionInfo_DS.triggerTimedOut_$()) {\n <p class=\"basis-full text-rose-300 text-xs mt-1\">\n ⚠ A frissítés 90s alatt nem fejeződött be. Ellenőrizd a server logot\n (<span class=\"font-mono\">~/.ccap/server.log</span>) vagy futtasd\n manuálisan: <span class=\"font-mono select-all\">ccap --version</span>.\n </p>\n }\n </div>\n }\n}\n", "import { Component, effect, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { UIn_QuickInputOverlayAreaId_Type } from '../../_modules/user-input/_enums/uin-quick-input-overlay-area-id.enum';\nimport { S_Modal_Component } from '../../_modules/shared/_components/s-modal/s-modal.component';\nimport { CCAP_ErrorDisplay_Component } from '../ccap-error-display/ccap-error-display.component';\nimport { CCAP_GlobalError_ControlService } from '../../_services/control-services/ccap-global-error.control-service';\nimport { UserInput_DataService } from '../../_modules/user-input/_services/user-input.data-service';\n\n/**\n * Globális hiba overlay: notification bubble-ök a bal felső sarokban + részletes modál kattintásra.\n * Több hiba egymás alatt jelenik meg; kattintás a bubble-re megnyitja a modált a teljes hiba részletekkel.\n * X gombbal az egyes notification-ök külön bezárhatók.\n */\n@Component({\n selector: 'app-ccap-error-popup',\n standalone: true,\n imports: [CommonModule, CCAP_ErrorDisplay_Component, S_Modal_Component],\n templateUrl: './ccap-error-popup.component.html',\n})\n/** CCAP_ErrorPopup_Component class. */\nexport class CCAP_ErrorPopup_Component {\n\n readonly globalError_CS: CCAP_GlobalError_ControlService =\n inject(CCAP_GlobalError_ControlService);\n\n private readonly userInput_DS: UserInput_DataService = inject(UserInput_DataService);\n\n constructor() {\n /** Részletes hiba modal nyitva → Quick Input area overlay verem (autofollow + CCAP host). */\n effect(\n (): void => {\n const hasModal: boolean = this.globalError_CS.selectedNotificationForModal_$() !== null;\n if (hasModal) {\n this.userInput_DS.pushQuickInputOverlayAreaContextByOverlayId(\n UIn_QuickInputOverlayAreaId_Type.globalErrorDetailModal,\n );\n } else {\n this.userInput_DS.popQuickInputOverlayAreaContext(\n UIn_QuickInputOverlayAreaId_Type.globalErrorDetailModal,\n );\n }\n },\n { allowSignalWrites: true },\n );\n }\n\n /** Notification bubble kattintás: megnyitja a részletes modált. */\n selectError(id: number): void {\n this.globalError_CS.selectError(id);\n }\n\n /** Notification bubble X gomb: eltávolítja a bubble-t (a modált nem nyitja meg). */\n dismissNotification(event: MouseEvent, id: number): void {\n event.stopPropagation();\n this.globalError_CS.dismissNotification(id);\n }\n\n /** Részletes modál bezárása. */\n dismissSelected(): void {\n this.globalError_CS.dismissSelected();\n }\n}\n", "<!-- Notification bubble-ök: egymás alatt, max-w korláttal, bal felső overlay. -->\n@if (globalError_CS.errors_$().length > 0) {\n <div class=\"absolute top-3 left-3 z-50 flex flex-col gap-2 max-w-md sm:max-w-lg pointer-events-auto\">\n @for (entry of globalError_CS.errors_$(); track entry.id) {\n <div class=\"flex items-center gap-2 pl-3 pr-1.5 py-2 rounded-lg border border-neonRed/60\n bg-neutral-800/95 shadow-lg cursor-pointer hover:border-neonRed hover:bg-neutral-700/95\n transition-colors duration-150 backdrop-blur-sm\"\n [class.animate-slide-in-left]=\"!entry.isDismissing\"\n [class.animate-slide-out-left]=\"entry.isDismissing\"\n (click)=\"selectError(entry.id)\"\n title=\"Kattintás a részletekért\">\n <span class=\"w-2 h-2 rounded-full bg-red-500 shrink-0 animate-pulse\" aria-hidden=\"true\"></span>\n <span class=\"text-sm text-red-300 flex-1 select-none line-clamp-4 break-words leading-snug text-left\">{{\n entry.displayMessage\n }}</span>\n <button type=\"button\"\n class=\"p-1 rounded text-neutral-500 hover:text-white hover:bg-neutral-600\n transition-colors duration-150 shrink-0\"\n (click)=\"dismissNotification($event, entry.id)\"\n title=\"Bezárás\"\n aria-label=\"Értesítés bezárása\">\n <svg class=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\"/>\n </svg>\n </button>\n </div>\n }\n </div>\n}\n\n<!-- Részletes hiba modál: kattintásra nyílik, a kiválasztott hibát mutatja.\n REQ-UI-ERR-002 (cycle 185): bodyFlexColumn=true — a `app-ccap-error-display`\n komponens már saját scroll-region-t épít a content area-ra (line 45-ös div\n `overflow-y-auto`), így a modal body wrapper-ben fölösleges a default\n `overflow-y-auto`. A két overflow-y-auto egymás alatt dupla scrollbart\n produkált a részletes hiba modálon. -->\n<app-s-modal [isOpen]=\"!!globalError_CS.selectedNotificationForModal_$()\"\n [maxWidth]=\"'3xl'\"\n [zIndex]=\"'9999'\"\n [backdropOpacity]=\"'70'\"\n [headerBorderClass]=\"'border-neonRed/50'\"\n [closeOnBackdropClick]=\"false\"\n [bodyFlexColumn]=\"true\"\n (closed)=\"dismissSelected()\">\n <app-ccap-error-display\n [error]=\"globalError_CS.selectedNotificationForModal_$()?.error ?? null\"\n [errorClientSource]=\"globalError_CS.selectedNotificationForModal_$()?.clientSource\"\n [ng0600Diagnostics]=\"globalError_CS.selectedNotificationForModal_$()?.ng0600Diagnostics ?? null\"\n [ng0203Diagnostics]=\"globalError_CS.selectedNotificationForModal_$()?.ng0203Diagnostics ?? null\" />\n</app-s-modal>\n", "/**\n * Részletes hálózati diagnosztika egy szerver URL-hez.\n * A `fetch` API minimális hibaüzeneteit (`TypeError: Failed to fetch`) kibontja konkrét okokra:\n * - DNS fail / invalid URL → \"invalid URL\" vagy \"name not resolved\"\n * - Connection refused / no listen → \"connection refused\" / \"cannot connect\"\n * - Timeout → \"timeout\"\n * - SSL cert reject → \"SSL / cert error\"\n * - CORS → \"blocked by CORS\"\n * - HTTP status → konkrét status + body preview\n * - Capacitor WebView native network stack reject → eredeti error.name + error.message\n *\n * Használat: setup wizard / server-unavailable overlay.\n */\n\nimport {\n CCAP_NetworkDiagnosticError_Interface,\n CCAP_NetworkDiagnosticResult_Interface,\n} from './ccap-network-diagnostic.interface';\n\n/** Fetch timeout — a mobil WebView alapértelmezetten végtelenül vár, ezért explicit abort kell. */\nconst CCAP_NETWORK_DIAGNOSTIC_TIMEOUT_MS: number = 8000;\n\n/**\n * Egy szerver URL elérhetőségének diagnosztikai tesztje.\n * A `baseUrl`-hez `/api/server/status`-t fűz, GET-tel lekéri, és részletes eredményt ad vissza.\n */\nexport class CCAP_NetworkDiagnostic_Util {\n static async probeServer(baseUrl: string): Promise<CCAP_NetworkDiagnosticResult_Interface> {\n const targetUrl: string = baseUrl.replace(/\\/$/, '') + '/api/server/status';\n const startMs: number = Date.now();\n const timestamp: string = new Date().toISOString();\n const controller: AbortController = new AbortController();\n const timeoutId: ReturnType<typeof setTimeout> = setTimeout((): void => {\n controller.abort();\n }, CCAP_NETWORK_DIAGNOSTIC_TIMEOUT_MS);\n\n try {\n const response: Response = await fetch(targetUrl, {\n method: 'GET',\n signal: controller.signal,\n // Explicit cache: no-store — ne adjon vissza stale response-t a WebView.\n cache: 'no-store',\n });\n clearTimeout(timeoutId);\n const durationMs: number = Date.now() - startMs;\n\n // Body preview (max 500 char) — JSON vagy text.\n let bodyPreview: string = '';\n try {\n const text: string = await response.text();\n bodyPreview = text.length > 500 ? text.slice(0, 500) + '…' : text;\n } catch {\n bodyPreview = '(could not read body)';\n }\n\n const isSuccess: boolean = response.ok;\n const errorCategory: string | undefined = isSuccess\n ? undefined\n : `HTTP ${response.status} — server responded but not OK`;\n const result: CCAP_NetworkDiagnosticResult_Interface = {\n targetUrl: targetUrl,\n isSuccess: isSuccess,\n httpStatus: response.status,\n httpStatusText: response.statusText,\n responseBodyPreview: bodyPreview,\n errorCategory: errorCategory,\n durationMs: durationMs,\n timestamp: timestamp,\n };\n if (!isSuccess) {\n result.errorForDisplay = this.buildErrorForDisplay(result);\n }\n return result;\n } catch (err: unknown) {\n clearTimeout(timeoutId);\n const durationMs: number = Date.now() - startMs;\n const errorName: string = err instanceof Error ? err.name : 'unknown';\n const errorMessage: string = err instanceof Error ? err.message : String(err);\n\n const result: CCAP_NetworkDiagnosticResult_Interface = {\n targetUrl: targetUrl,\n isSuccess: false,\n errorName: errorName,\n errorMessage: errorMessage,\n errorCategory: this.categorizeError(errorName, errorMessage),\n durationMs: durationMs,\n timestamp: timestamp,\n };\n result.errorForDisplay = this.buildErrorForDisplay(result);\n return result;\n }\n }\n\n /**\n * Error-szerű objektum építése a diagnosztika eredményből — `app-ccap-error-display` renderelné.\n */\n private static buildErrorForDisplay(\n result: CCAP_NetworkDiagnosticResult_Interface,\n ): CCAP_NetworkDiagnosticError_Interface {\n const message: string = result.errorCategory\n ?? result.errorMessage\n ?? `HTTP ${result.httpStatus ?? '?'}`;\n const errorCode: string = this.pickErrorCode(result);\n const additionalContent: Record<string, unknown> = {\n targetUrl: result.targetUrl,\n durationMs: result.durationMs,\n timestamp: result.timestamp,\n };\n if (result.httpStatus !== undefined) {\n additionalContent.httpStatus = result.httpStatus;\n }\n if (result.httpStatusText) {\n additionalContent.httpStatusText = result.httpStatusText;\n }\n if (result.responseBodyPreview) {\n additionalContent.responseBodyPreview = result.responseBodyPreview;\n }\n if (result.errorName) {\n additionalContent.errorName = result.errorName;\n }\n if (result.errorMessage) {\n additionalContent.errorMessage = result.errorMessage;\n }\n return { message: message, errorCode: errorCode, additionalContent: additionalContent };\n }\n\n /**\n * Stabil errorCode kiválasztás a probe eredmény alapján — grep-elhető diagnosztika.\n */\n private static pickErrorCode(result: CCAP_NetworkDiagnosticResult_Interface): string {\n if (result.errorName === 'AbortError') {\n return 'CCAP-NET-FETCH-TIMEOUT';\n }\n if (result.errorName === 'TypeError') {\n return 'CCAP-NET-FETCH-FAILED';\n }\n if (result.errorName === 'SyntaxError') {\n return 'CCAP-NET-RESPONSE-NOT-JSON';\n }\n if (result.httpStatus !== undefined) {\n return `CCAP-NET-HTTP-${result.httpStatus}`;\n }\n return 'CCAP-NET-UNKNOWN';\n }\n\n /**\n * Human-readable kategorizálás: a böngésző `TypeError: Failed to fetch` üzenetét\n * kibontja a gyakori root cause-ra (timeout / DNS / refused / SSL / CORS / parse / egyéb).\n * Ez heurisztika — a böngészők szándékosan homályosan hibáznak biztonsági okokból,\n * de a mintázatokból lehet következtetni.\n */\n private static categorizeError(errorName: string, errorMessage: string): string {\n const lower: string = errorMessage.toLowerCase();\n if (errorName === 'AbortError') {\n return `Timeout (>${CCAP_NETWORK_DIAGNOSTIC_TIMEOUT_MS}ms) — szerver nem válaszolt időben. Gyakori ok: firewall, blokkolt port, rossz IP.`;\n }\n if (errorName === 'TypeError' && lower.includes('failed to fetch')) {\n return 'Network failure — a böngésző nem tud csatlakozni a szerverhez. Lehetséges okok: szerver nem fut a megadott IP-n, tűzfal blokkolja a portot, WiFi router client-isolation, vagy mobile data-n vagy (nem LAN-on).';\n }\n if (lower.includes('ssl') || lower.includes('certificate') || lower.includes('cert')) {\n return 'SSL / TLS cert error — self-signed cert-et nem fogad el az Android network stack. Kapcsold ki a HTTPS-t (HTTP-re válts), vagy telepítsd a cert-et a device trust store-ba.';\n }\n if (lower.includes('cors')) {\n return 'CORS policy blokkolja a kérést. Szerveren kell engedélyezni az origin-t. (CCAP szerver `origin: true`-val engedi — ez furcsa, ha mégis CORS hibát kapsz.)';\n }\n if (lower.includes('refused') || lower.includes('econnrefused')) {\n return 'Connection refused — az IP válaszol, de a port nem fut (szerver nincs, vagy más port).';\n }\n if (lower.includes('unreachable') || lower.includes('ehostunreach')) {\n return 'Host unreachable — az IP cím nem érhető el a hálózatról (rossz hálózat, routing hiba, vagy offline).';\n }\n if (lower.includes('dns') || lower.includes('name') || lower.includes('resolve')) {\n return 'DNS / name resolution fail — az IP/hostname nem feloldható.';\n }\n if (errorName === 'SyntaxError') {\n return 'A válasz nem JSON — lehet, hogy HTTP-n egy HTTPS-only szervert hívtunk (redirect / HTML error page), vagy a szerver nem a várt tartalmat adja.';\n }\n return `Unknown error (${errorName}) — lásd az error üzenetet.`;\n }\n}\n", "import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, signal, WritableSignal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport { CCAP_NetworkDiagnosticResult_Interface } from '../../_collections/network-diagnostic/ccap-network-diagnostic.interface';\nimport { CCAP_NetworkDiagnostic_Util } from '../../_collections/network-diagnostic/ccap-network-diagnostic.util';\nimport { Shr_LocalStoragePersistence_Util } from '../../_modules/shared/_collections/utils/storage/shr-local-storage-persistence.util';\nimport { CCAP_ErrorDisplay_Component } from '../ccap-error-display/ccap-error-display.component';\n\n/** localStorage kulcs — megegyezik a main.ts-ben használttal. */\nconst CCAP_SERVER_URL_STORAGE_KEY: string = 'ccap-server-url';\n\n/** Alapértelmezett HTTP port a CCAP szerverre. */\nconst CCAP_DEFAULT_HTTP_PORT: number = 39050;\n\n/** Alapértelmezett HTTPS port a CCAP szerverre. */\nconst CCAP_DEFAULT_HTTPS_PORT: number = 39051;\n\n/**\n * Capacitor natív platform detekció (Android/iOS WebView).\n * Azonos logika, mint a main.ts-ben.\n */\nfunction isCapacitorNative(): boolean {\n return typeof (window as any).Capacitor !== 'undefined'\n && (window as any).Capacitor.isNativePlatform?.() === true;\n}\n\n/**\n * Mobil szerver-cím bekérő overlay: Capacitor natív app-ban jelenik meg,\n * ha még nincs mentett szerver URL a localStorage-ban.\n * A felhasználó megadja az IP-címet, az alkalmazás HTTPS protokollal és az alapértelmezett porttal\n * összeállítja a szerver URL-t, majd localStorage-ba menti és újratölti az alkalmazást.\n */\n@Component({\n selector: 'app-ccap-mobile-server-setup',\n standalone: true,\n imports: [CommonModule, FormsModule, CCAP_ErrorDisplay_Component],\n templateUrl: './ccap-mobile-server-setup.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n/** CCAP_MobileServerSetup_Component class. */\nexport class CCAP_MobileServerSetup_Component {\n\n /**\n * Overlay láthatóság: csak Capacitor natív + nincs mentett URL.\n *\n * REQ-UI-MENU-STATE-001 (cycle 460): a localStorage check a shared\n * `Shr_LocalStoragePersistence_Util.readString`-en megy. `null` ha nincs\n * tárolt érték / private mode → `!null` = true → overlay látszik\n * Capacitor-native környezetben.\n */\n readonly isVisible_$ = signal<boolean>(\n isCapacitorNative() && !Shr_LocalStoragePersistence_Util.readString(CCAP_SERVER_URL_STORAGE_KEY),\n );\n\n /** Felhasználó által megadott IP-cím (kétirányú kötés). */\n readonly ipAddress_$ = signal<string>('');\n\n /** Port szám (alapértelmezetten HTTP: 39050, felhasználó módosíthatja). */\n readonly port_$ = signal<number>(CCAP_DEFAULT_HTTP_PORT);\n\n /**\n * HTTPS használata — default: false.\n * Self-signed cert-tel a Capacitor WebView `fetch`/`WebSocket` API-k a network_security_config\n * trust anchors listájára támaszkodnak; a self-signed cert-et csak akkor trust-olják, ha a user\n * a device-ra installálta (Settings → Security → Install cert from storage).\n * Ezért default HTTP — a user opt-in-tel kapcsolhat HTTPS-re, ha a szerver cert-je érvényes\n * (Let's Encrypt, mkcert lokál CA, vagy manuálisan installált cert).\n */\n readonly isHttps_$ = signal<boolean>(false);\n\n /**\n * HTTPS toggle kezelése: átváltáskor a port is váltson az új protokoll default-jára,\n * ha a felhasználó a másik protokoll default portján állt (nem módosította kézzel).\n */\n handleHttpsToggle(isHttps: boolean): void {\n const currentPort: number = this.port_$();\n this.isHttps_$.set(isHttps);\n if (isHttps && currentPort === CCAP_DEFAULT_HTTP_PORT) {\n this.port_$.set(CCAP_DEFAULT_HTTPS_PORT);\n } else if (!isHttps && currentPort === CCAP_DEFAULT_HTTPS_PORT) {\n this.port_$.set(CCAP_DEFAULT_HTTP_PORT);\n }\n }\n\n /** Összeállított szerver URL előnézet. */\n readonly previewUrl_$ = computed((): string => {\n const protocol: string = this.isHttps_$() ? 'https' : 'http';\n const ip: string = this.ipAddress_$().trim();\n const port: number = this.port_$();\n if (!ip) {\n return '';\n }\n return `${protocol}://${ip}:${port}`;\n });\n\n /** Mentés gomb állapota: IP-cím kötelező. */\n readonly isSaveDisabled_$ = computed((): boolean => {\n return !this.ipAddress_$().trim();\n });\n\n /** Diagnosztika folyamatban van-e. */\n readonly isTestingConnection_$: WritableSignal<boolean> = signal<boolean>(false);\n\n /** Legutóbbi diagnosztika eredménye — a template mutatja a user-nek. */\n readonly diagnosticResult_$: WritableSignal<CCAP_NetworkDiagnosticResult_Interface | null> =\n signal<CCAP_NetworkDiagnosticResult_Interface | null>(null);\n\n /**\n * Teszt kapcsolat: próbálja elérni a {previewUrl}/api/server/status-t, részletes hibát ad vissza.\n * Nem blokkolja a Save / Connect gombot, csak diagnosztika a user-nek.\n */\n async handleTestConnection(): Promise<void> {\n const url: string = this.previewUrl_$();\n if (!url || this.isTestingConnection_$()) {\n return;\n }\n this.isTestingConnection_$.set(true);\n this.diagnosticResult_$.set(null);\n try {\n const result: CCAP_NetworkDiagnosticResult_Interface =\n await CCAP_NetworkDiagnostic_Util.probeServer(url);\n this.diagnosticResult_$.set(result);\n } finally {\n this.isTestingConnection_$.set(false);\n }\n }\n\n /**\n * Szerver URL mentése localStorage-ba, majd az alkalmazás újratöltése,\n * hogy a main.ts a friss URL-t vegye fel a bootstrap-ben.\n *\n * REQ-UI-MENU-STATE-001 (cycle 460): a write a shared\n * `Shr_LocalStoragePersistence_Util.writeString`-en megy. A return-érték\n * `false`-ra (private mode / quota-exceeded) early-return → NEM reload-olunk\n * fail-es mentés esetén (eredeti viselkedés megőrizve).\n */\n handleSave(): void {\n const url: string = this.previewUrl_$();\n if (!url) {\n return;\n }\n const ok: boolean = Shr_LocalStoragePersistence_Util.writeString(CCAP_SERVER_URL_STORAGE_KEY, url);\n if (!ok) {\n // localStorage tele vagy private mode — nem tudunk menteni.\n return;\n }\n // Újratöltés: main.ts a friss localStorage értéket olvassa be.\n this.reloadApplication();\n }\n\n /**\n * Alkalmazás újratöltése — protected wrapper tesztelhetőségért (karma/jasmine-ban spy-olható).\n */\n protected reloadApplication(): void {\n window.location.reload();\n }\n}\n", "@if (isVisible_$()) {\n <div class=\"fixed inset-0 z-[9999] flex items-center justify-center bg-black/80 p-4\">\n <div class=\"relative w-[95vw] max-w-md rounded-lg border-2 border-neonCyan/40 bg-neutral-900 shadow-xl\n flex flex-col overflow-hidden\"\n role=\"dialog\"\n aria-labelledby=\"mobile-setup-title\">\n <!-- Header -->\n <div class=\"flex items-center px-4 py-3 border-b border-neonCyan/40 shrink-0\">\n <h2 id=\"mobile-setup-title\" class=\"text-sm font-semibold text-neutral-200\">\n Server connection setup\n </h2>\n </div>\n <!-- Body -->\n <div class=\"flex-1 min-h-0 overflow-y-auto p-4 flex flex-col gap-4\">\n <p class=\"text-sm text-neutral-400\">\n Enter the IP address of the CCAP server to connect.\n </p>\n <!-- IP cim input -->\n <div class=\"flex flex-col gap-1\">\n <label for=\"mobile-setup-ip\" class=\"text-xs font-medium text-neutral-300\">\n Server IP address\n </label>\n <input id=\"mobile-setup-ip\"\n type=\"text\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n placeholder=\"192.168.1.100\"\n [ngModel]=\"ipAddress_$()\"\n (ngModelChange)=\"ipAddress_$.set($event)\"\n class=\"w-full rounded-md border border-neutral-600 bg-neutral-800 px-3 py-2 text-sm text-neutral-100\n placeholder:text-neutral-500 focus:border-neonCyan focus:outline-none focus:ring-1\n focus:ring-neonCyan\" />\n </div>\n <!-- Port input -->\n <div class=\"flex flex-col gap-1\">\n <label for=\"mobile-setup-port\" class=\"text-xs font-medium text-neutral-300\">\n Port\n </label>\n <input id=\"mobile-setup-port\"\n type=\"number\"\n min=\"1\"\n max=\"65535\"\n [ngModel]=\"port_$()\"\n (ngModelChange)=\"port_$.set($event)\"\n class=\"w-full rounded-md border border-neutral-600 bg-neutral-800 px-3 py-2 text-sm text-neutral-100\n focus:border-neonCyan focus:outline-none focus:ring-1 focus:ring-neonCyan\" />\n </div>\n <!-- HTTPS toggle -->\n <div class=\"flex items-center gap-2\">\n <input id=\"mobile-setup-https\"\n type=\"checkbox\"\n [ngModel]=\"isHttps_$()\"\n (ngModelChange)=\"handleHttpsToggle($event)\"\n class=\"h-4 w-4 rounded border-neutral-600 bg-neutral-800 text-neonCyan\n focus:ring-neonCyan focus:ring-offset-neutral-900\" />\n <label for=\"mobile-setup-https\" class=\"text-sm text-neutral-300\">\n Use HTTPS\n </label>\n </div>\n @if (isHttps_$()) {\n <div class=\"rounded-md border border-amber-500/50 bg-amber-500/10 px-3 py-2 text-xs text-amber-200\">\n <strong class=\"font-semibold\">HTTPS figyelmeztetés:</strong> self-signed cert-et a rendszer\n nem trust-olja automatikusan. HTTPS-sel csak akkor működik, ha a szerver cert-je:\n <ul class=\"list-disc list-inside mt-1 space-y-0.5 text-amber-200/80\">\n <li>érvényes publikus CA-tól (pl. Let's Encrypt), VAGY</li>\n <li>manuálisan telepítve van a device trust store-jába (Settings → Security → Install cert from storage)</li>\n </ul>\n Ha nem biztos, hagyd kikapcsolva (HTTP) — a LAN-on HTTP alapértelmezetten működik.\n </div>\n }\n <!-- URL preview -->\n @if (previewUrl_$()) {\n <div class=\"rounded-md border border-neutral-700 bg-neutral-800/60 px-3 py-2\">\n <span class=\"text-xs text-neutral-500\">Connection URL:</span>\n <p class=\"text-sm text-neonCyan font-mono break-all mt-0.5\">\n {{ previewUrl_$() }}\n </p>\n </div>\n }\n </div>\n <!-- Diagnosztika eredmény -->\n @if (diagnosticResult_$(); as result) {\n @if (result.isSuccess) {\n <div class=\"mx-4 mb-2 rounded-md border border-emerald-500/60 bg-emerald-500/10 px-3 py-2 text-xs\n text-emerald-200\">\n <div class=\"font-semibold mb-1\">✓ Szerver elérhető</div>\n <div class=\"font-mono text-[10px] text-neutral-400 break-all\">\n GET {{ result.targetUrl }} — {{ result.durationMs }}ms\n </div>\n </div>\n } @else if (result.errorForDisplay) {\n <div class=\"mx-4 mb-2\">\n <app-ccap-error-display\n [error]=\"result.errorForDisplay\"\n sourceLabelOverride=\"Kapcsolat teszt\" />\n </div>\n }\n }\n <!-- Footer -->\n <div class=\"flex justify-between gap-2 px-4 py-3 border-t border-neutral-700 shrink-0\">\n <button type=\"button\"\n [disabled]=\"isSaveDisabled_$() || isTestingConnection_$()\"\n (click)=\"handleTestConnection()\"\n class=\"rounded-md border border-neutral-600 bg-neutral-800 px-3 py-2 text-sm font-medium\n text-neutral-200 hover:bg-neutral-700 disabled:opacity-40 disabled:cursor-not-allowed\n transition-colors\">\n @if (isTestingConnection_$()) {\n Teszt…\n } @else {\n Kapcsolat teszt\n }\n </button>\n <button type=\"button\"\n [disabled]=\"isSaveDisabled_$()\"\n (click)=\"handleSave()\"\n class=\"rounded-md border border-neonCyan/60 bg-neonCyan/15 px-4 py-2 text-sm font-medium\n text-neonCyan hover:bg-neonCyan/25 disabled:opacity-40 disabled:cursor-not-allowed\n transition-colors\">\n Connect\n </button>\n </div>\n </div>\n </div>\n}\n", "import { Injectable, computed, signal } from '@angular/core';\n\nimport {\n CCAP_LayoutOverlayClosedPanel_Interface,\n} from '../../_models/interfaces/layout/ccap-layout-overlay-closed-panel.interface';\nimport { CCAP_LayoutOverlayPanelRegister_Interface } from '../../_models/interfaces/layout/ccap-layout-overlay-panel-register.interface';\n\n/** Egy belső panel bejegyzés isOpen és side mezővel. */\ninterface CCAP_LayoutOverlayPanelEntry_Internal {\n id: string;\n label: string;\n icon?: string;\n side: 'left' | 'right';\n isOpen: boolean;\n open: () => void;\n}\n\n/**\n * Layout overlay control service: bezárt panelek regisztrálása,\n * az overlay ezekre jelenít gombot (navbar, session bar, info panel).\n */\n@Injectable({\n providedIn: 'root',\n})\n/** CCAP_LayoutOverlay_ControlService class. */\nexport class CCAP_LayoutOverlay_ControlService {\n\n private readonly panels_$ = signal<CCAP_LayoutOverlayPanelEntry_Internal[]>([]);\n\n /**\n * Bezárt panelek listája (isOpen === false); az overlay ezt jeleníti meg.\n */\n readonly closedPanels_$ = computed<CCAP_LayoutOverlayClosedPanel_Interface[]>(() => {\n const panels = this.panels_$();\n return panels\n .filter((p: CCAP_LayoutOverlayPanelEntry_Internal) => !p.isOpen)\n .map((p: CCAP_LayoutOverlayPanelEntry_Internal) => ({\n id: p.id,\n label: p.label,\n icon: p.icon,\n open: p.open,\n }));\n });\n\n /**\n * Bezárt panelek bal oldali striphez (navbar, sessions panel).\n */\n readonly closedPanelsLeft_$ = computed<CCAP_LayoutOverlayClosedPanel_Interface[]>(() =>\n this.closedPanels_$().filter(\n (p: CCAP_LayoutOverlayClosedPanel_Interface) => this.getPanelSide(p.id) === 'left',\n ),\n );\n\n /**\n * Bezárt panelek jobb oldali striphez (info panel).\n */\n readonly closedPanelsRight_$ = computed<CCAP_LayoutOverlayClosedPanel_Interface[]>(() =>\n this.closedPanels_$().filter(\n (p: CCAP_LayoutOverlayClosedPanel_Interface) => this.getPanelSide(p.id) === 'right',\n ),\n );\n\n /**\n * Panel regisztrálása (navbar, sessions panel, info panel).\n */\n register(params: CCAP_LayoutOverlayPanelRegister_Interface): void {\n const entry: CCAP_LayoutOverlayPanelEntry_Internal = {\n id: params.id,\n label: params.label,\n icon: params.icon,\n side: params.side ?? 'left',\n isOpen: params.isOpen,\n open: params.open,\n };\n this.panels_$.update((list: CCAP_LayoutOverlayPanelEntry_Internal[]) => {\n const next = list.filter((p: CCAP_LayoutOverlayPanelEntry_Internal) => p.id !== params.id);\n next.push(entry);\n return next;\n });\n }\n\n /**\n * Panel side lekérdezése id alapján (closedPanelsLeft_$ / closedPanelsRight_$ filterhez).\n */\n private getPanelSide(id: string): 'left' | 'right' {\n const panel = this.panels_$().find((p: CCAP_LayoutOverlayPanelEntry_Internal) => p.id === id);\n return panel?.side ?? 'left';\n }\n\n /**\n * Panel kivétele (pl. session route elhagyásakor).\n */\n unregister(id: string): void {\n this.panels_$.update((list: CCAP_LayoutOverlayPanelEntry_Internal[]) =>\n list.filter((p: CCAP_LayoutOverlayPanelEntry_Internal) => p.id !== id),\n );\n }\n\n /**\n * Panel nyitott/bezárt állapotának frissítése (a komponens hívja toggle után).\n */\n updatePanelState(id: string, isOpen: boolean): void {\n this.panels_$.update((list: CCAP_LayoutOverlayPanelEntry_Internal[]) =>\n list.map((p: CCAP_LayoutOverlayPanelEntry_Internal) =>\n p.id === id ? { ...p, isOpen: isOpen } : p,\n ),\n );\n }\n}\n", "import { inject, Injectable } from '@angular/core';\n\nimport { NTF_DataService } from '../../_modules/system/_modules/notification/_services/ntf.data-service';\nimport { NTF_Notification_Interface } from '../../_modules/system/_modules/notification/_models/interfaces/ntf-notification.interface';\n\n/**\n * Capacitor LocalNotifications plugin interface (tipizált felület a dinamikus importhoz).\n */\ninterface CapacitorLocalNotificationsPlugin_Interface {\n /** Permission kérés. */\n requestPermissions(): Promise<{ display: string }>;\n /** Local notification ütemezés. */\n schedule(options: {\n notifications: {\n id: number;\n title: string;\n body: string;\n extra?: Record<string, unknown>;\n smallIcon?: string;\n largeIcon?: string;\n }[];\n }): Promise<{ notifications: { id: number }[] }>;\n /** Event listener regisztráció. */\n addListener(\n eventName: string,\n callback: (event: { notification: { extra?: Record<string, unknown> } }) => void,\n ): Promise<{ remove: () => void }>;\n}\n\n/**\n * Capacitor global window interface (natív platform detekció).\n */\ninterface CapacitorWindow_Interface {\n Capacitor?: {\n isNativePlatform?: () => boolean;\n Plugins?: Record<string, unknown>;\n };\n}\n\n/**\n * Capacitor natív platform detekció.\n */\nfunction isCapacitorNative(): boolean {\n const win: CapacitorWindow_Interface = window as unknown as CapacitorWindow_Interface;\n return win.Capacitor !== undefined\n && win.Capacitor.isNativePlatform?.() === true;\n}\n\n/**\n * UUID string → stabil 32-bites egész szám (Android local notification id-hez).\n * A Java String.hashCode() algoritmus egyszerűsített változata.\n */\nfunction hashStringToInt32(str: string): number {\n let hash: number = 0;\n for (let i: number = 0; i < str.length; i++) {\n const char: number = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash | 0;\n }\n return Math.abs(hash);\n}\n\n/**\n * CCAP Mobile Notification Control Service.\n * Capacitor natív platformon local notification-öket triggerel, amikor NTF_ notification érkezik\n * és az app háttérben van (document.hidden). Foreground-ban a tray badge elegendő.\n *\n * Ha nem natív platform (web böngésző), a service nem csinál semmit.\n */\n@Injectable({ providedIn: 'root' })\nexport class CCAP_MobileNotification_ControlService {\n\n private readonly notification_DS: NTF_DataService = inject(NTF_DataService);\n\n /** Inicializálás megtörtént-e. */\n private isInitialized: boolean = false;\n\n /** LocalNotifications plugin referencia (null ha nem natív vagy nem elérhető). */\n private localNotificationsPlugin: CapacitorLocalNotificationsPlugin_Interface | null = null;\n\n /**\n * Inicializálás: permission kérés és tap handler regisztráció.\n * Csak Capacitor natív platformon fut le; web-en no-op.\n */\n async initialize(): Promise<void> {\n if (this.isInitialized || !isCapacitorNative()) {\n return;\n }\n this.isInitialized = true;\n\n try {\n // Dinamikus import: @capacitor/local-notifications csak a mobile build-ben elérhető\n // ccap-review-disable no-dynamic-imports\n const module: { LocalNotifications: CapacitorLocalNotificationsPlugin_Interface } =\n await import('@capacitor/local-notifications') as { LocalNotifications: CapacitorLocalNotificationsPlugin_Interface };\n const localNotifications: CapacitorLocalNotificationsPlugin_Interface = module.LocalNotifications;\n this.localNotificationsPlugin = localNotifications;\n\n // Permission kérés\n const permResult: { display: string } = await localNotifications.requestPermissions();\n if (permResult.display !== 'granted') {\n // Permission megtagadva; a service nem fog notification-öket mutatni, de nem dobunk hibát\n return;\n }\n\n // Notification tap handler: notification koppintásra a tray megnyílik\n await localNotifications.addListener(\n 'localNotificationActionPerformed',\n (event: { notification: { extra?: Record<string, unknown> } }): void => {\n const extra: Record<string, unknown> | undefined = event.notification.extra;\n const notificationId: string = typeof extra?.notificationId === 'string'\n ? extra.notificationId : '';\n // Tray megnyitása\n this.notification_DS.isTrayOpen_$.set(true);\n // Mark as read\n if (notificationId) {\n this.notification_DS.markAsRead(notificationId);\n }\n },\n );\n } catch {\n // Plugin nem elérhető (web build, plugin hiányzik); silent fail\n this.localNotificationsPlugin = null;\n }\n }\n\n /**\n * Local notification triggerelés egy NTF_ notification-hoz.\n * Csak háttérben (document.hidden) és natív platformon aktív.\n */\n async showLocalNotification(notification: NTF_Notification_Interface): Promise<void> {\n // Guard: csak natív platformon és ha a plugin inicializálva van\n if (!this.localNotificationsPlugin) {\n return;\n }\n\n // Foreground-ban nem mutatunk local notification-t (a tray badge elegendő)\n if (!document.hidden) {\n return;\n }\n\n try {\n const numericId: number = hashStringToInt32(notification.notificationId);\n const title: string = notification.title;\n const body: string = notification.description ?? this.buildBodyFromType(notification);\n\n await this.localNotificationsPlugin.schedule({\n notifications: [\n {\n id: numericId,\n title: title,\n body: body,\n extra: { notificationId: notification.notificationId },\n smallIcon: 'ic_notification',\n largeIcon: 'ic_launcher',\n },\n ],\n });\n } catch {\n // Local notification scheduling sikertelen; silent fail (ne akassza meg az app-ot)\n }\n }\n\n /**\n * Body szöveg generálás a notification típusa alapján (ha nincs description).\n */\n private buildBodyFromType(notification: NTF_Notification_Interface): string {\n switch (notification.type) {\n case 'confirm':\n return notification.confirmMessage ?? 'Eldöntendő kérdés érkezett.';\n case 'option-select':\n return 'Választási lehetőség érkezett.';\n case 'question':\n return 'Kérdés érkezett — válasz szükséges.';\n default:\n return 'Új értesítés érkezett.';\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';\nimport {\n NTF_Notification_Interface,\n NTF_Notification_Response,\n NTF_NotificationResponse_ClientInterface,\n} from '../_models/interfaces/ntf-notification.interface';\n\n/**\n * NTF Notification API Service.\n * HTTP hívások a szerver /api/notification endpoint-jaira.\n */\n@Injectable({ providedIn: 'root' })\nexport class NTF_ApiService {\n\n private readonly baseUrl: string = `${environment.api.baseUrl}/notification`;\n private readonly http: HttpClient = inject(HttpClient);\n\n /**\n * Notification-ök listázása.\n */\n listNotifications(params?: {\n sessionId?: string;\n status?: string;\n limit?: number;\n }): Promise<NTF_Notification_Response[]> {\n const queryParts: string[] = [];\n if (params?.sessionId) {\n queryParts.push(`sessionId=${encodeURIComponent(params.sessionId)}`);\n }\n if (params?.status) {\n queryParts.push(`status=${encodeURIComponent(params.status)}`);\n }\n if (params?.limit) {\n queryParts.push(`limit=${params.limit}`);\n }\n const query: string = queryParts.length ? `?${queryParts.join('&')}` : '';\n return firstValueFrom(\n this.http.get<NTF_Notification_Response[]>(`${this.baseUrl}${query}`),\n );\n }\n\n /**\n * Válasz küldése egy notification-re.\n */\n respondToNotification(notificationId: string, response: NTF_NotificationResponse_ClientInterface): Promise<{ success: boolean }> {\n return firstValueFrom(\n this.http.post<{ success: boolean }>(\n `${this.baseUrl}/${encodeURIComponent(notificationId)}/respond`,\n { ...response, respondedVia: 'ui' },\n ),\n );\n }\n\n /**\n * Notification elutasítása (dismiss).\n */\n dismissNotification(notificationId: string): Promise<{ success: boolean }> {\n return firstValueFrom(\n this.http.post<{ success: boolean }>(\n `${this.baseUrl}/${encodeURIComponent(notificationId)}/dismiss`,\n {},\n ),\n );\n }\n\n /**\n * Notification megjelölése olvasottként.\n */\n markAsRead(notificationId: string): Promise<{ success: boolean }> {\n return firstValueFrom(\n this.http.post<{ success: boolean }>(\n `${this.baseUrl}/${encodeURIComponent(notificationId)}/read`,\n {},\n ),\n );\n }\n\n /**\n * Összes notification megjelölése olvasottként.\n */\n markAllAsRead(): Promise<{ success: boolean; count: number }> {\n return firstValueFrom(\n this.http.post<{ success: boolean; count: number }>(\n `${this.baseUrl}/read-all`,\n {},\n ),\n );\n }\n}\n", "/**\n * NTF_ kliens oldali konstansok – socket event nevek.\n */\n\n/** Server → client: új notification érkezett. */\nexport const NTF_SOCKET_EVENT_CREATED: string = 'notification:created';\n\n/** Server → client: notification státusz változott. */\nexport const NTF_SOCKET_EVENT_UPDATED: string = 'notification:updated';\n\n/** Client → server: user válaszolt egy notification-re. */\nexport const NTF_SOCKET_EVENT_RESPOND: string = 'notification:respond';\n\n/** Client → server: user elutasította a notification-t. */\nexport const NTF_SOCKET_EVENT_DISMISS: string = 'notification:dismiss';\n\n/** Client → server: user elolvasta a notification-t. */\nexport const NTF_SOCKET_EVENT_READ: string = 'notification:read';\n\n/** Notification fixed tool ID — agent-events toolId felismeréshez (szerver FIXED_TOOL_ID_NOTIFICATION tükre). */\nexport const NTF_TOOL_ID: string = 'ccap_notification';\n\n/** Agent-events phase: notification elküldve (message típus, fire-and-forget). */\nexport const NTF_PHASE_SENT: string = 'notification-sent';\n\n/** Agent-events phase: notification interaktív válaszra vár (confirm/option-select/question). */\nexport const NTF_PHASE_WAITING: string = 'waiting-for-user';\n", "import { computed, inject, Injectable, Injector, OnDestroy, signal, WritableSignal, Signal } from '@angular/core';\n\nimport { Subscription } from 'rxjs';\n\nimport { CCAP_Socket_ControlService } from '../../../../../_services/control-services/ccap-socket.control-service';\nimport { CCAP_SocketEventEnvelope_Interface } from '../../../../../_services/control-services/socket.control-service.interface';\nimport { CCAP_MobileNotification_ControlService } from '../../../../../_services/control-services/ccap-mobile-notification.control-service';\nimport { NTF_ApiService } from './ntf.api-service';\nimport {\n NTF_Notification_Interface,\n NTF_NotificationResponse_ClientInterface,\n} from '../_models/interfaces/ntf-notification.interface';\nimport {\n NTF_SOCKET_EVENT_RESPOND,\n NTF_SOCKET_EVENT_DISMISS,\n NTF_SOCKET_EVENT_READ,\n} from '../_collections/consts/ntf.const';\n\n/**\n * NTF Notification Data Service.\n * Signal-alapú állapotkezelés a notification tray-hez, socket.io real-time frissítéssel.\n */\n@Injectable({ providedIn: 'root' })\nexport class NTF_DataService implements OnDestroy {\n\n private readonly socket_CS: CCAP_Socket_ControlService = inject(CCAP_Socket_ControlService);\n private readonly notification_AS: NTF_ApiService = inject(NTF_ApiService);\n private readonly injector: Injector = inject(Injector);\n\n /** Lazy-resolved referencia a cirkuláris dependency elkerüléséhez. */\n private mobileNotification_CS: CCAP_MobileNotification_ControlService | null = null;\n\n /** Notification lista (legújabb elöl). */\n readonly notifications_$: WritableSignal<NTF_Notification_Interface[]> = signal<NTF_Notification_Interface[]>([]);\n\n /** Olvasatlan notification-ök száma. */\n readonly unreadCount_$: Signal<number> = computed((): number => {\n return this.notifications_$().filter(\n (n: NTF_Notification_Interface): boolean => !n.isRead,\n ).length;\n });\n\n /** Betöltés alatt. */\n readonly isLoading_$: WritableSignal<boolean> = signal<boolean>(false);\n\n /** Tray nyitva/zárva. */\n readonly isTrayOpen_$: WritableSignal<boolean> = signal<boolean>(false);\n\n /** Socket subscription. */\n private eventSubscription: Subscription | null = null;\n\n constructor() {\n // Socket event-ek hallgatása\n this.eventSubscription = this.socket_CS.event$.subscribe(\n (envelope: CCAP_SocketEventEnvelope_Interface): void => {\n this.handleSocketEvent(envelope);\n },\n );\n\n // Kezdeti betöltés\n void this.loadNotifications();\n }\n\n ngOnDestroy(): void {\n this.eventSubscription?.unsubscribe();\n }\n\n /**\n * Notification-ök betöltése a szerverről.\n */\n async loadNotifications(): Promise<void> {\n this.isLoading_$.set(true);\n try {\n const notifications: NTF_Notification_Interface[] = await this.notification_AS.listNotifications({\n limit: 50,\n });\n this.notifications_$.set(notifications);\n } catch {\n // Hiba esetén üres lista marad, nem dobjuk tovább\n } finally {\n this.isLoading_$.set(false);\n }\n }\n\n /**\n * Válasz küldése egy notification-re (socket emit).\n */\n respondToNotification(notificationId: string, response: NTF_NotificationResponse_ClientInterface): void {\n this.socket_CS.emit(NTF_SOCKET_EVENT_RESPOND, {\n notificationId: notificationId,\n response: response,\n });\n // Optimistic UI update: status → responded\n this.updateNotificationInList(notificationId, {\n status: 'responded',\n response: response,\n respondedAt: new Date().toISOString(),\n });\n }\n\n /**\n * Notification elutasítása (socket emit).\n */\n dismissNotification(notificationId: string): void {\n this.socket_CS.emit(NTF_SOCKET_EVENT_DISMISS, {\n notificationId: notificationId,\n });\n // Optimistic UI update: status → dismissed\n this.updateNotificationInList(notificationId, {\n status: 'dismissed',\n response: { isDismissed: true },\n });\n }\n\n /**\n * Notification megjelölése olvasottként (socket emit).\n */\n markAsRead(notificationId: string): void {\n this.socket_CS.emit(NTF_SOCKET_EVENT_READ, {\n notificationId: notificationId,\n });\n // Optimistic UI update\n this.updateNotificationInList(notificationId, { isRead: true });\n }\n\n /**\n * Összes notification megjelölése olvasottként.\n */\n async markAllAsRead(): Promise<void> {\n try {\n await this.notification_AS.markAllAsRead();\n this.notifications_$.update(\n (list: NTF_Notification_Interface[]): NTF_Notification_Interface[] =>\n list.map((n: NTF_Notification_Interface): NTF_Notification_Interface => ({\n ...n,\n isRead: true,\n })),\n );\n } catch {\n // Silent fail\n }\n }\n\n /**\n * Tray nyitása/zárása.\n */\n toggleTray(): void {\n this.isTrayOpen_$.update((open: boolean): boolean => !open);\n }\n\n /**\n * Tray bezárása.\n */\n closeTray(): void {\n this.isTrayOpen_$.set(false);\n }\n\n // --- Private ---\n\n /**\n * Socket event handler: notification:created és user-notification (NTF-specific) feldolgozás.\n */\n private handleSocketEvent(envelope: CCAP_SocketEventEnvelope_Interface): void {\n const event: string = envelope.event;\n const payload: Record<string, unknown> = envelope.payload;\n\n // A szerver user-notification event-ként küldi, type mezőben a tényleges event név\n if (event === 'user-notification') {\n const type: string = typeof payload.type === 'string' ? payload.type : '';\n const notification: NTF_Notification_Interface | undefined =\n payload.notification as NTF_Notification_Interface | undefined;\n\n if (type === 'notification:created' && notification) {\n // Új notification hozzáadása a lista elejére\n this.notifications_$.update(\n (list: NTF_Notification_Interface[]): NTF_Notification_Interface[] =>\n [notification, ...list],\n );\n // Mobil local notification triggerelés (háttérben lévő natív app-nál)\n // Lazy resolve a cirkuláris DI dependency elkerüléséhez (CCAP_MobileNotification_ControlService ↔ NTF_DataService)\n const mobileCS: CCAP_MobileNotification_ControlService = this.mobileNotification_CS\n ?? (this.mobileNotification_CS = this.injector.get(CCAP_MobileNotification_ControlService));\n void mobileCS.showLocalNotification(notification);\n }\n\n if (type === 'notification:updated' && notification) {\n // Meglévő notification frissítése\n this.updateNotificationInList(notification.notificationId, notification);\n }\n }\n }\n\n /**\n * Notification frissítése a listában notificationId alapján.\n */\n private updateNotificationInList(notificationId: string, update: Partial<NTF_Notification_Interface>): void {\n this.notifications_$.update(\n (list: NTF_Notification_Interface[]): NTF_Notification_Interface[] =>\n list.map((n: NTF_Notification_Interface): NTF_Notification_Interface =>\n n.notificationId === notificationId ? { ...n, ...update } : n,\n ),\n );\n }\n}\n", "import { Component, EventEmitter, Input, Output, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\n\nimport {\n NTF_Notification_Interface,\n NTF_NotificationResponse_ClientInterface,\n} from '../../_models/interfaces/ntf-notification.interface';\n\n/**\n * NTF Response Controls Component.\n * Inline response vezérlők a notification item-ben: confirm gombok, option lista, textarea.\n * Minden típusnál elérhető opcionális szöveges mező (allowTextResponse).\n */\n@Component({\n selector: 'app-ntf-response-controls',\n standalone: true,\n imports: [CommonModule, FormsModule],\n templateUrl: './ntf-response-controls.component.html',\n})\n/** NTF Response Controls Component — inline válasz vezérlők a notification item-ben. */\nexport class NTF_ResponseControls_Component {\n\n @Input() notification: NTF_Notification_Interface | null = null;\n @Output() responded: EventEmitter<NTF_NotificationResponse_ClientInterface> = new EventEmitter();\n @Output() dismissed: EventEmitter<void> = new EventEmitter();\n\n /** Kiválasztott opció ID (option-select). */\n readonly selectedOptionId_$ = signal<string>('');\n\n /** Szöveges válasz (plain string — ngModel binding kompatibilis). */\n textResponse: string = '';\n\n /** Submit flag (double submit védelem). */\n readonly isSubmitted_$ = signal<boolean>(false);\n\n /**\n * Confirm: igen/nem gomb.\n */\n handleConfirm(confirmed: boolean): void {\n if (this.isSubmitted_$()) {\n return;\n }\n this.isSubmitted_$.set(true);\n const response: NTF_NotificationResponse_ClientInterface = {\n confirmed: confirmed,\n };\n if (this.notification?.allowTextResponse && this.textResponse.trim()) {\n response.textResponse = this.textResponse.trim();\n }\n this.responded.emit(response);\n }\n\n /**\n * Option-select: kiválasztás megerősítése.\n */\n handleOptionSelect(): void {\n if (this.isSubmitted_$()) {\n return;\n }\n const optionId: string = this.selectedOptionId_$();\n if (!optionId) {\n return;\n }\n this.isSubmitted_$.set(true);\n const response: NTF_NotificationResponse_ClientInterface = {\n selectedOptionId: optionId,\n };\n if (this.notification?.allowTextResponse && this.textResponse.trim()) {\n response.textResponse = this.textResponse.trim();\n }\n this.responded.emit(response);\n }\n\n /**\n * Question: szöveges válasz küldése.\n */\n handleQuestionSubmit(): void {\n if (this.isSubmitted_$()) {\n return;\n }\n const text: string = this.textResponse.trim();\n if (!text) {\n return;\n }\n this.isSubmitted_$.set(true);\n this.responded.emit({ textResponse: text });\n }\n\n /**\n * Message: opcionális szöveges válasz küldése (ha allowTextResponse).\n */\n handleMessageTextSubmit(): void {\n if (this.isSubmitted_$()) {\n return;\n }\n const text: string = this.textResponse.trim();\n if (!text) {\n return;\n }\n this.isSubmitted_$.set(true);\n this.responded.emit({ textResponse: text });\n }\n\n /**\n * Dismiss gomb.\n */\n handleDismiss(): void {\n if (this.isSubmitted_$()) {\n return;\n }\n this.isSubmitted_$.set(true);\n this.dismissed.emit();\n }\n\n /**\n * Opció kiválasztása.\n */\n selectOption(optionId: string): void {\n this.selectedOptionId_$.set(optionId);\n }\n}\n", "@if (notification) {\n <div class=\"flex flex-col gap-2 mt-2\">\n <!-- Confirm típus: Igen / Nem gombok -->\n @if (notification.type === 'confirm') {\n @if (notification.confirmMessage) {\n <p class=\"text-sm text-neutral-300\">{{ notification.confirmMessage }}</p>\n }\n <div class=\"flex gap-2\">\n <button type=\"button\"\n (click)=\"handleConfirm(true)\"\n [disabled]=\"isSubmitted_$()\"\n class=\"px-3 py-1.5 text-sm font-medium rounded bg-green-600/20 border border-green-500/50\n text-green-400 hover:bg-green-600/30 disabled:opacity-50 transition-colors\">\n Igen\n </button>\n <button type=\"button\"\n (click)=\"handleConfirm(false)\"\n [disabled]=\"isSubmitted_$()\"\n class=\"px-3 py-1.5 text-sm font-medium rounded bg-red-600/20 border border-red-500/50\n text-red-400 hover:bg-red-600/30 disabled:opacity-50 transition-colors\">\n Nem\n </button>\n </div>\n }\n\n <!-- Option-select típus: opció lista + submit -->\n @if (notification.type === 'option-select' && notification.options) {\n <div class=\"flex flex-col gap-1\">\n @for (option of notification.options; track option.id) {\n <button type=\"button\"\n (click)=\"selectOption(option.id)\"\n [disabled]=\"isSubmitted_$()\"\n class=\"px-3 py-2 text-sm rounded border text-left transition-colors\"\n [class.border-neonCyan]=\"selectedOptionId_$() === option.id\"\n [ngClass]=\"{'bg-neonCyan/10': selectedOptionId_$() === option.id}\"\n [class.text-neonCyan]=\"selectedOptionId_$() === option.id\"\n [class.border-neutral-600]=\"selectedOptionId_$() !== option.id\"\n [class.text-neutral-300]=\"selectedOptionId_$() !== option.id\"\n [class.hover:border-neutral-500]=\"selectedOptionId_$() !== option.id\">\n <span class=\"font-medium\">{{ option.label }}</span>\n @if (option.description) {\n <span class=\"block text-xs text-neutral-400 mt-0.5\">{{ option.description }}</span>\n }\n </button>\n }\n </div>\n @if (selectedOptionId_$()) {\n <button type=\"button\"\n (click)=\"handleOptionSelect()\"\n [disabled]=\"isSubmitted_$()\"\n class=\"px-3 py-1.5 text-sm font-medium rounded bg-neonCyan/15 border border-neonCyan/50\n text-neonCyan hover:bg-neonCyan/25 disabled:opacity-50 transition-colors self-start\">\n Kiválasztás\n </button>\n }\n }\n\n <!-- Question típus: textarea + submit -->\n @if (notification.type === 'question') {\n <textarea [(ngModel)]=\"textResponse\"\n [placeholder]=\"notification.textPlaceholder ?? 'Válasz...'\"\n [disabled]=\"isSubmitted_$()\"\n rows=\"2\"\n class=\"w-full px-3 py-2 text-sm rounded border border-neutral-600 bg-neutral-800/50\n text-neutral-200 placeholder:text-neutral-500 focus:border-neonCyan focus:outline-none\n disabled:opacity-50 resize-none\"></textarea>\n <button type=\"button\"\n (click)=\"handleQuestionSubmit()\"\n [disabled]=\"isSubmitted_$() || !textResponse\"\n class=\"px-3 py-1.5 text-sm font-medium rounded bg-neonCyan/15 border border-neonCyan/50\n text-neonCyan hover:bg-neonCyan/25 disabled:opacity-50 transition-colors self-start\">\n Küldés\n </button>\n }\n\n <!-- Message típus + allowTextResponse: opcionális szöveges válasz -->\n @if (notification.type === 'message' && notification.allowTextResponse) {\n <textarea [(ngModel)]=\"textResponse\"\n [placeholder]=\"notification.textPlaceholder ?? 'Opcionális válasz...'\"\n [disabled]=\"isSubmitted_$()\"\n rows=\"2\"\n class=\"w-full px-3 py-2 text-sm rounded border border-neutral-600 bg-neutral-800/50\n text-neutral-200 placeholder:text-neutral-500 focus:border-neonCyan focus:outline-none\n disabled:opacity-50 resize-none\"></textarea>\n @if (textResponse) {\n <button type=\"button\"\n (click)=\"handleMessageTextSubmit()\"\n [disabled]=\"isSubmitted_$()\"\n class=\"px-3 py-1.5 text-sm font-medium rounded bg-neonCyan/15 border border-neonCyan/50\n text-neonCyan hover:bg-neonCyan/25 disabled:opacity-50 transition-colors self-start\">\n Küldés\n </button>\n }\n }\n\n <!-- Opcionális szöveges mező (confirm/option-select + allowTextResponse) -->\n @if ((notification.type === 'confirm' || notification.type === 'option-select') && notification.allowTextResponse) {\n <textarea [(ngModel)]=\"textResponse\"\n [placeholder]=\"notification.textPlaceholder ?? 'Opcionális megjegyzés...'\"\n [disabled]=\"isSubmitted_$()\"\n rows=\"1\"\n class=\"w-full px-3 py-1.5 text-xs rounded border border-neutral-600 bg-neutral-800/50\n text-neutral-200 placeholder:text-neutral-500 focus:border-neonCyan focus:outline-none\n disabled:opacity-50 resize-none\"></textarea>\n }\n\n <!-- Dismiss gomb (mindig elérhető) -->\n <button type=\"button\"\n (click)=\"handleDismiss()\"\n [disabled]=\"isSubmitted_$()\"\n class=\"px-2 py-1 text-xs text-neutral-500 hover:text-neutral-300 transition-colors self-start\">\n Kihagyás\n </button>\n </div>\n}\n", "import { Component, computed, EventEmitter, input, Output, Signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport {\n NTF_Notification_Interface,\n NTF_NotificationResponse_ClientInterface,\n} from '../../_models/interfaces/ntf-notification.interface';\nimport { NTF_ResponseControls_Component } from '../ccap-notification-response-controls/ntf-response-controls.component';\n\n/**\n * NTF Notification Item Component.\n * Egy notification kártya megjelenítése a tray listában.\n * Típus ikon, prioritás szín, tartalom, státusz, és inline response controls (ha interaktív + pending).\n */\n@Component({\n selector: 'app-ntf-item',\n standalone: true,\n imports: [CommonModule, NTF_ResponseControls_Component],\n templateUrl: './ntf-item.component.html',\n})\n/** NTF Item Component — notification kártya a tray listában. */\nexport class NTF_Item_Component {\n\n /** Notification input (signal-based). */\n readonly notification = input<NTF_Notification_Interface | null>(null);\n\n @Output() responded: EventEmitter<{ notificationId: string; response: NTF_NotificationResponse_ClientInterface }> =\n new EventEmitter();\n @Output() dismissed: EventEmitter<string> = new EventEmitter();\n @Output() markedAsRead: EventEmitter<string> = new EventEmitter();\n\n /** Prioritás szín osztály (border + ikon szín). */\n readonly priorityColorClass_$: Signal<string> = computed((): string => {\n const n: NTF_Notification_Interface | null = this.notification();\n switch (n?.priority) {\n case 'error': return 'border-red-500/50 text-red-400';\n case 'warning': return 'border-amber-500/50 text-amber-400';\n case 'success': return 'border-green-500/50 text-green-400';\n default: return 'border-neonCyan/50 text-neonCyan';\n }\n });\n\n /** Relatív idő formázás (computed — a template-ben signal-ként olvasható). */\n readonly relativeTime_$: Signal<string> = computed((): string => {\n const n: NTF_Notification_Interface | null = this.notification();\n if (!n?.__created) {\n return '';\n }\n const now: number = Date.now();\n const created: number = new Date(n.__created).getTime();\n const diff: number = now - created;\n const seconds: number = Math.floor(diff / 1000);\n if (seconds < 60) {\n return 'most';\n }\n const minutes: number = Math.floor(seconds / 60);\n if (minutes < 60) {\n return `${minutes} perce`;\n }\n const hours: number = Math.floor(minutes / 60);\n if (hours < 24) {\n return `${hours} órája`;\n }\n const days: number = Math.floor(hours / 24);\n return `${days} napja`;\n });\n\n /** Összekapcsolt user interaction (companion notification). */\n readonly isLinkedInteraction_$: Signal<boolean> = computed((): boolean => {\n const n: NTF_Notification_Interface | null = this.notification();\n return !!n?.linkedInteractionId;\n });\n\n /** Interaktív notification-e (nem message típus) és még pending/delivered. */\n readonly isInteractiveAndPending_$: Signal<boolean> = computed((): boolean => {\n const n: NTF_Notification_Interface | null = this.notification();\n if (!n) {\n return false;\n }\n return n.type !== 'message'\n && (n.status === 'pending' || n.status === 'delivered');\n });\n\n /** Message típus és pending/delivered (dismiss megengedett). */\n readonly isMessageAndActive_$: Signal<boolean> = computed((): boolean => {\n const n: NTF_Notification_Interface | null = this.notification();\n if (!n) {\n return false;\n }\n return n.type === 'message'\n && (n.status === 'pending' || n.status === 'delivered');\n });\n\n /**\n * Response controls → válasz továbbítása a szülő felé.\n */\n handleResponded(response: NTF_NotificationResponse_ClientInterface): void {\n const n: NTF_Notification_Interface | null = this.notification();\n if (!n) {\n return;\n }\n this.responded.emit({\n notificationId: n.notificationId,\n response: response,\n });\n }\n\n /**\n * Response controls → dismiss továbbítása.\n */\n handleDismissed(): void {\n const n: NTF_Notification_Interface | null = this.notification();\n if (!n) {\n return;\n }\n this.dismissed.emit(n.notificationId);\n }\n\n /**\n * Kattintás a notification-re: mark as read.\n */\n handleClick(): void {\n const n: NTF_Notification_Interface | null = this.notification();\n if (n && !n.isRead) {\n this.markedAsRead.emit(n.notificationId);\n }\n }\n}\n", "@if (notification(); as n) {\n <div class=\"px-3 py-2.5 border-b border-neutral-700/50 transition-colors cursor-pointer\"\n [ngClass]=\"{'bg-neutral-800/30': !n.isRead, 'hover:bg-neutral-800/50': true}\"\n (click)=\"handleClick()\">\n <!-- Header: ikon + title + idő -->\n <div class=\"flex items-start gap-2\">\n <!-- Típus ikon + prioritás szín -->\n <div class=\"shrink-0 mt-0.5\" [ngClass]=\"priorityColorClass_$()\">\n @switch (n.type) {\n @case ('message') {\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"/>\n </svg>\n }\n @case ('confirm') {\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M8.228 9c.549-1.165 2.03-2 3.772-2 2.21 0 4 1.343 4 3 0 1.4-1.278 2.575-3.006 2.907-.542.104-.994.54-.994 1.093m0 3h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"/>\n </svg>\n }\n @case ('option-select') {\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M4 6h16M4 10h16M4 14h16M4 18h16\"/>\n </svg>\n }\n @case ('question') {\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z\"/>\n </svg>\n }\n }\n </div>\n\n <div class=\"flex-1 min-w-0\">\n <!-- Title + idő -->\n <div class=\"flex items-center justify-between gap-2\">\n <span class=\"text-sm font-medium text-neutral-200 truncate\"\n [class.font-semibold]=\"!n.isRead\">\n {{ n.title }}\n </span>\n <span class=\"text-[11px] text-neutral-500 shrink-0\">{{ relativeTime_$() }}</span>\n </div>\n\n <!-- Description -->\n @if (n.description) {\n <p class=\"text-xs text-neutral-400 mt-0.5 line-clamp-2\">{{ n.description }}</p>\n }\n\n <!-- Source label + linked interaction badge -->\n @if (n.sourceLabel) {\n <span class=\"text-[10px] text-neutral-500 mt-0.5 inline-block\">{{ n.sourceLabel }}</span>\n }\n @if (isLinkedInteraction_$()) {\n <span class=\"inline-block mt-0.5 ml-1 px-1.5 py-0.5 rounded text-[10px] font-medium\n bg-neonCyan/10 text-neonCyan border border-neonCyan/20\">\n Session\n </span>\n }\n\n <!-- Status badge -->\n @if (n.status === 'responded') {\n <span class=\"inline-block mt-1 px-1.5 py-0.5 rounded text-[10px] font-medium bg-green-900/30\n text-green-400 border border-green-700/30\">\n Megválaszolva\n </span>\n }\n @if (n.status === 'expired') {\n <span class=\"inline-block mt-1 px-1.5 py-0.5 rounded text-[10px] font-medium bg-amber-900/30\n text-amber-400 border border-amber-700/30\">\n Lejárt\n </span>\n }\n @if (n.status === 'dismissed') {\n <span class=\"inline-block mt-1 px-1.5 py-0.5 rounded text-[10px] font-medium bg-neutral-700/30\n text-neutral-400 border border-neutral-600/30\">\n Kihagyva\n </span>\n }\n\n <!-- Response megjelenítés (ha megválaszolva) -->\n @if (n.status === 'responded' && n.response) {\n <div class=\"mt-1.5 px-2 py-1.5 rounded bg-neutral-800/50 border border-neutral-700/50 text-xs text-neutral-300\">\n @if (n.response.confirmed !== undefined) {\n <span>{{ n.response.confirmed ? 'Igen' : 'Nem' }}</span>\n }\n @if (n.response.selectedOptionId) {\n <span>Kiválasztva: {{ n.response.selectedOptionId }}</span>\n }\n @if (n.response.textResponse) {\n <p class=\"mt-0.5 text-neutral-400\">{{ n.response.textResponse }}</p>\n }\n </div>\n }\n\n <!-- Inline response controls (interaktív + pending) -->\n @if (isInteractiveAndPending_$()) {\n <app-ntf-response-controls\n [notification]=\"n\"\n (responded)=\"handleResponded($event)\"\n (dismissed)=\"handleDismissed()\" />\n }\n\n <!-- Message + active: dismiss gomb és opcionális text response -->\n @if (isMessageAndActive_$()) {\n @if (n.allowTextResponse) {\n <app-ntf-response-controls\n [notification]=\"n\"\n (responded)=\"handleResponded($event)\"\n (dismissed)=\"handleDismissed()\" />\n } @else {\n <button type=\"button\"\n (click)=\"handleDismissed(); $event.stopPropagation()\"\n class=\"mt-1.5 px-2 py-1 text-xs text-neutral-500 hover:text-neutral-300 transition-colors\">\n Elvetés\n </button>\n }\n }\n </div>\n\n <!-- Unread indicator -->\n @if (!n.isRead) {\n <span class=\"w-2 h-2 rounded-full bg-neonCyan shrink-0 mt-1.5\" aria-hidden=\"true\"></span>\n }\n </div>\n </div>\n}\n", "import { Component, ElementRef, HostListener, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { NTF_DataService } from '../../_services/ntf.data-service';\nimport {\n NTF_NotificationResponse_ClientInterface,\n} from '../../_models/interfaces/ntf-notification.interface';\nimport { NTF_Item_Component } from '../ccap-notification-item/ntf-item.component';\n\n/**\n * NTF Tray Component.\n * Header bell ikon badge-dzsel, kattintásra dropdown panel a notification listával.\n */\n@Component({\n selector: 'app-ntf-tray',\n standalone: true,\n imports: [CommonModule, NTF_Item_Component],\n templateUrl: './ntf-tray.component.html',\n})\n/** NTF Tray Component — header bell ikon badge-dzsel és dropdown notification panel. */\nexport class NTF_Tray_Component {\n\n readonly notification_DS: NTF_DataService = inject(NTF_DataService);\n private readonly elementRef: ElementRef<HTMLElement> = inject(ElementRef);\n\n /**\n * Klikk a dokumentumon: tray bezárása ha a klikk kívülre esett.\n */\n @HostListener('document:click', ['$event'])\n handleDocumentClick(event: MouseEvent): void {\n if (!this.notification_DS.isTrayOpen_$()) {\n return;\n }\n const target: EventTarget | null = event.target;\n if (target instanceof Node && !this.elementRef.nativeElement.contains(target)) {\n this.notification_DS.closeTray();\n }\n }\n\n /**\n * Bell ikon kattintás: tray toggle.\n */\n handleToggleTray(event: MouseEvent): void {\n event.stopPropagation();\n this.notification_DS.toggleTray();\n }\n\n /**\n * Mark all as read gomb.\n */\n handleMarkAllAsRead(): void {\n void this.notification_DS.markAllAsRead();\n }\n\n /**\n * Notification item → response.\n */\n handleNotificationResponded(event: { notificationId: string; response: NTF_NotificationResponse_ClientInterface }): void {\n this.notification_DS.respondToNotification(event.notificationId, event.response);\n }\n\n /**\n * Notification item → dismiss.\n */\n handleNotificationDismissed(notificationId: string): void {\n this.notification_DS.dismissNotification(notificationId);\n }\n\n /**\n * Notification item → mark as read.\n */\n handleNotificationMarkedAsRead(notificationId: string): void {\n this.notification_DS.markAsRead(notificationId);\n }\n}\n", "<div class=\"relative flex items-center justify-center\">\n <!-- Bell ikon + badge -->\n <button type=\"button\"\n class=\"flex items-center justify-center p-1 rounded-md text-neutral-400\n hover:text-neutral-200 hover:bg-neutral-800 transition-colors duration-200 relative\"\n (click)=\"handleToggleTray($event)\"\n [attr.aria-label]=\"notification_DS.unreadCount_$() > 0\n ? ('Értesítések: ' + notification_DS.unreadCount_$() + ' olvasatlan')\n : 'Értesítések'\"\n title=\"Értesítések\">\n <svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9\"/>\n </svg>\n <!-- Unread badge -->\n @if (notification_DS.unreadCount_$() > 0) {\n <span class=\"absolute -top-0.5 -right-0.5 min-w-[1rem] h-4 px-1 flex items-center justify-center\n rounded-full text-[10px] font-bold text-neutral-950 bg-neonCyan animate-pulse\n leading-none\">\n {{ notification_DS.unreadCount_$() > 99 ? '99+' : notification_DS.unreadCount_$() }}\n </span>\n }\n </button>\n\n <!-- Dropdown panel -->\n @if (notification_DS.isTrayOpen_$()) {\n <div class=\"absolute top-full right-0 mt-2 z-50\n w-[min(400px,calc(100vw-2rem))] max-h-[60vh]\n rounded-lg border border-neonDefault bg-ccapSurface shadow-xl\n flex flex-col overflow-hidden\"\n (click)=\"$event.stopPropagation()\">\n <!-- Panel header -->\n <div class=\"flex items-center justify-between px-3 py-2.5 border-b border-neutral-700/50 shrink-0\">\n <span class=\"text-sm font-semibold text-neutral-200\">Notifications</span>\n <div class=\"flex items-center gap-2\">\n @if (notification_DS.unreadCount_$() > 0) {\n <button type=\"button\"\n (click)=\"handleMarkAllAsRead()\"\n class=\"text-xs text-neonCyan hover:underline\">\n Mind olvasott\n </button>\n }\n </div>\n </div>\n\n <!-- Notification lista (scrollable) -->\n <div class=\"flex-1 overflow-y-auto min-h-0\">\n @if (notification_DS.isLoading_$()) {\n <div class=\"flex items-center justify-center py-8 text-neutral-500 text-sm\">\n Betöltés...\n </div>\n } @else if (notification_DS.notifications_$().length) {\n @for (n of notification_DS.notifications_$(); track n.notificationId) {\n <app-ntf-item\n [notification]=\"n\"\n (responded)=\"handleNotificationResponded($event)\"\n (dismissed)=\"handleNotificationDismissed($event)\"\n (markedAsRead)=\"handleNotificationMarkedAsRead($event)\" />\n }\n } @else {\n <div class=\"flex items-center justify-center py-8 text-neutral-500 text-sm\">\n Nincs értesítés\n </div>\n }\n </div>\n </div>\n }\n</div>\n", "import {\n AfterViewInit,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n OnDestroy,\n OnInit,\n Signal,\n signal,\n ViewChild,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Router, RouterModule, NavigationEnd } from '@angular/router';\n\nimport { filter } from 'rxjs';\n\nimport { DyNX_SubscriptionControl } from '@futdevpro/ngx-dynamo';\n\nimport { environment } from '../../../environments/environment';\nimport { Setup_DataService } from '../../_modules/config/_modules/setup/_services/setup.data-service';\nimport { CCAP_AppUpdateBanner_Component } from '../ccap-app-update-banner/ccap-app-update-banner.component';\nimport { CCAP_ErrorDisplay_Component } from '../ccap-error-display/ccap-error-display.component';\nimport { CCAP_ServerUpdateBanner_Component } from '../ccap-server-update-banner/ccap-server-update-banner.component';\nimport { CCAP_ErrorPopup_Component } from '../ccap-error-popup/ccap-error-popup.component';\nimport { CCAP_MobileServerSetup_Component } from '../ccap-mobile-server-setup/ccap-mobile-server-setup.component';\nimport { CCAP_MobileAppUpdater_ControlService } from '../../_services/control-services/app-update/ccap-mobile-app-updater.control-service';\nimport { CCAP_SocketStatus_Type } from '../../_enums/ccap-socket-status.enum';\nimport { CCAP_LayoutOverlayClosedPanel_Interface } from '../../_models/interfaces/layout/ccap-layout-overlay-closed-panel.interface';\nimport { CCAP_LayoutOverlay_ControlService } from '../../_services/control-services/ccap-layout-overlay.control-service';\nimport { CCAP_LayoutBreakpoint_ControlService } from '../../_services/control-services/ccap-layout-breakpoint.control-service';\nimport { Set_SETTINGS_AREA_NAV_LINKS } from '../../_modules/config/_modules/settings/_collections/consts/ui-state/set-area-nav-links.const';\nimport { Set_AreaNavLink_Interface } from '../../_modules/config/_modules/settings/_models/interfaces/shared/set-area-nav-link.interface';\nimport { Set_General_DataService } from '../../_modules/config/_modules/settings/_services/data-services/global-settings/set-general.data-service';\nimport { Shr_LocalStoragePersistence_Util } from '../../_modules/shared/_collections/utils/storage/shr-local-storage-persistence.util';\nimport { Errors_DataService } from '../../_modules/system/_modules/errors/_services/errors.data-service';\nimport { Session_DataService } from '../../_modules/session/_services/data-services/session.data-service';\nimport { CCAP_SessionListItem_Response } from '../../_models/interfaces/session/ccap-session-list-item.interface';\nimport { Ses_Feedback_DataService } from '../../_modules/session/_services/data-services/ses-feedback.data-service';\nimport { UserInput_DataService } from '../../_modules/user-input/_services/user-input.data-service';\nimport { ModelRegistry_DataService } from '../../_modules/ai-systems/_modules/model-registry/_services/model-registry.data-service';\nimport { ClaudeCode_DataService } from '../../_modules/external-sessions/_modules/claude-code/_services/claude-code.data-service';\nimport { CC_ListItem_Interface } from '../../_modules/external-sessions/_modules/claude-code/_models/interfaces/cc-list-item.interface';\nimport { S_SessionStatusColor_Util } from '../../_modules/shared/_collections/utils/s-session-status-color.util';\nimport { Tls_ModelTestRunStatus_Status } from '@server-enums';\nimport { NTF_Tray_Component } from '../../_modules/system/_modules/notification/_components/ccap-notification-tray/ntf-tray.component';\nimport { CCAP_MobileNotification_ControlService } from '../../_services/control-services/ccap-mobile-notification.control-service';\n\n/** localStorage kulcs a side nav nyitott/bezárt állapotához. */\nconst CCAP_SIDE_NAV_OPEN_STORAGE_KEY = 'ccap-sideNavOpen';\n\n/** localStorage kulcs a NAV Beállítások szekció nyitott állapotához. */\nconst CCAP_NAV_SETTINGS_SUBMENU_OPEN_STORAGE_KEY = 'ccap-nav-settingsSubmenuOpen';\n\n/** localStorage kulcs a NAV Maintenance szekció nyitott állapotához. */\nconst CCAP_NAV_MAINTENANCE_SUBMENU_OPEN_STORAGE_KEY = 'ccap-nav-maintenanceSubmenuOpen';\n\n/** localStorage kulcs a NAV POC szekció nyitott állapotához. */\nconst CCAP_NAV_POC_SUBMENU_OPEN_STORAGE_KEY = 'ccap-nav-pocSubmenuOpen';\n\n/**\n * Main frame komponens: top bar és side nav mindig látható, a client UI-t frameli.\n * A tartalom a router-outlet-ben jelenik meg.\n * Side nav bezárható a nav tetején lévő gombbal; bezárva semmi nem jelenik meg (az overlay gomb nyitja).\n * Az állapot localStorage-ba kerül.\n */\n@Component({\n selector: 'app-ccap-main-frame',\n standalone: true,\n imports: [\n CommonModule, RouterModule,\n CCAP_ErrorDisplay_Component, CCAP_ErrorPopup_Component, CCAP_MobileServerSetup_Component,\n CCAP_AppUpdateBanner_Component, CCAP_ServerUpdateBanner_Component, NTF_Tray_Component,\n ],\n templateUrl: './ccap-main-frame.component.html',\n})\n/** CCAP_MainFrame_Component class. */\nexport class CCAP_MainFrame_Component extends DyNX_SubscriptionControl implements OnInit, OnDestroy, AfterViewInit {\n\n /** Setup status ellenőrzés: friss installnál a setup wizard automatikus megnyitásához. */\n private readonly setup_DS: Setup_DataService = inject(Setup_DataService);\n\n /** Session data service. */\n readonly session_DS: Session_DataService = inject(Session_DataService);\n\n /**\n * Szerveren rögzített hibák listája (Hibák oldal SSOT); navbar badge-hez és korai betöltéshez.\n */\n readonly errors_DS: Errors_DataService = inject(Errors_DataService);\n\n /**\n * Rögzített rendszer-hibák darabszáma (szerver lista); 0 ha üres vagy még nem töltött.\n * BUG-ERR-COUNT-CAP-001 (cycle 436): a teljes szervert szám (paged.total)\n * — eddig a `errors_$().length` csak a lekért lap méretét mutatta (cap 100).\n */\n readonly recordedSystemErrorsCount_$ = computed((): number => this.errors_DS.errorsTotalCount_$());\n\n /**\n * Agent feedback lista SSOT; navbar „Feedback” badge és korai betöltés.\n */\n readonly agentFeedback_DS: Ses_Feedback_DataService = inject(Ses_Feedback_DataService);\n\n /**\n * Szerveren rögzített feedback-ek összesített darabszáma (szűrő nélküli / total signal); navbar badge.\n */\n readonly recordedAgentFeedbackCount_$ = computed((): number => this.agentFeedback_DS.feedbackTotalCount_$());\n\n /** Quick Input DS: composer sync + `<main>` layout anchor a root-shell ResizeObserver-hez. */\n readonly userInput_DS: UserInput_DataService = inject(UserInput_DataService);\n\n /**\n * `<main>` DOM referencia — Quick Input app-root fixed host követi a téglalapot (`getBoundingClientRect`).\n */\n @ViewChild('quickInputAnchorMain', { read: ElementRef })\n private quickInputAnchorMainRef: ElementRef<HTMLElement> | undefined;\n\n /** `<main>` méret/pozíció változás — FAB clamp + bounds signal. */\n private quickInputMainResizeObs: ResizeObserver | undefined;\n\n /** Modellteszt run globális sáv (nem model-registry route-on). */\n readonly modelRegistry_DS: ModelRegistry_DataService = inject(ModelRegistry_DataService);\n\n /** CC Session DS — navbar \"CC Sessions\" item mellett running indikátor (REQ-UI-NAV-001). */\n readonly claudeCode_DS: ClaudeCode_DataService = inject(ClaudeCode_DataService);\n\n /**\n * Igaz, ha van legalább egy aktívan futó CC Session a cache-ben (REQ-UI-NAV-001).\n * Best-effort: a `sessions_$` signal akkor populált, ha a user már járt a CC Dashboard-on,\n * illetve socket event-ek folyamatosan frissítik. A navbar sárga spinning dot-ot renderel,\n * amikor ez true.\n */\n readonly hasRunningCcSession_$ = computed((): boolean =>\n this.claudeCode_DS.sessions_$().some(\n (s: CC_ListItem_Interface): boolean => S_SessionStatusColor_Util.isRunning(s.status),\n ),\n );\n\n /**\n * Igaz, ha van legalább egy aktívan futó CCAP Session a cache-ben (REQ-NAV-CCAP-DOT-001).\n * A `Session_DataService.sessions_$` signal akkor populált, ha a user már járt a CCAP\n * Sessions oldalon, illetve socket event-ek folyamatosan frissítik. A navbar sárga\n * spinning dot-ot renderel, amikor ez true — analóg viselkedés a CC Sessions\n * indikátorral (`hasRunningCcSession_$`).\n */\n readonly hasRunningCcapSession_$ = computed((): boolean =>\n this.session_DS.sessions_$().some(\n (s: CCAP_SessionListItem_Response): boolean => S_SessionStatusColor_Util.isRunning(s.status),\n ),\n );\n\n private readonly settingsGeneral_DS: Set_General_DataService = inject(\n Set_General_DataService,\n );\n\n private readonly mobileAppUpdater_CS: CCAP_MobileAppUpdater_ControlService = inject(\n CCAP_MobileAppUpdater_ControlService,\n );\n\n private readonly mobileNotification_CS: CCAP_MobileNotification_ControlService = inject(\n CCAP_MobileNotification_ControlService,\n );\n\n private readonly router: Router = inject(Router);\n\n /** Router events subscription (submenu auto-expand); leiratkozás DyNX_SubscriptionControl-on át. */\n\n /** Aktuális URL (globális modellteszt banner láthatóság). */\n readonly routerUrl_$ = signal<string>('');\n\n /** Client verzió (environment-ből, top bar-ban megjelenik). */\n readonly version: string = environment.version;\n\n /** Beállítások submenu linkek (path + label SSOT a settings shell tabokkal). */\n readonly settingsSubmenuNavLinks: readonly Set_AreaNavLink_Interface[] = Set_SETTINGS_AREA_NAV_LINKS;\n\n /** Aktív session ID (session data service-ből; WebSocket indikátor). */\n readonly activeSessionId_$ = this.session_DS.activeSessionId_$;\n\n /** WebSocket státusz (session data service-ből: connecting | connected | error). */\n readonly socketStatus_$ = this.session_DS.socketStatus_$;\n\n /** Utolsó socket hiba (tooltip: app-ccap-error-display input). */\n readonly lastSocketError_$ = this.session_DS.lastSocketError_$;\n\n /** Csatlakozási kísérletek száma (error tooltip-ben). */\n readonly connectAttemptCount_$ = this.session_DS.connectAttemptCount_$;\n\n /** Diagnosztika fut-e éppen (gomb loading state). */\n readonly isDiagnosing_$ = signal<boolean>(false);\n\n /**\n * Tooltip rövid szöveg (nem error esetén); error-nál a tooltip a hiba részleteket mutatja.\n */\n /**\n * Modellteszt fut — diszkrét sáv más oldalakon; Model Registry nézetben a helyi UI dominál.\n */\n readonly modelTestRunGlobalBannerVisible_$ = computed((): boolean => {\n const url: string = this.routerUrl_$();\n if (url.startsWith('/model-registry')) {\n return false;\n }\n const runId: string = this.modelRegistry_DS.testRunId_$();\n const st = this.modelRegistry_DS.testRunStatus_$();\n if (!runId || st == null) {\n return false;\n }\n return st.status === Tls_ModelTestRunStatus_Status.running\n || st.status === Tls_ModelTestRunStatus_Status.pending;\n });\n\n readonly socketStatusLabel_$ = computed<string>(() => {\n const status: CCAP_SocketStatus_Type = this.socketStatus_$();\n const attemptCount: number = this.connectAttemptCount_$();\n if (status === CCAP_SocketStatus_Type.connected) {\n return 'WebSocket csatlakozva – kattintás: újracsatlakozás';\n }\n if (status === CCAP_SocketStatus_Type.error) {\n const countInfo: string = attemptCount > 0 ? ` (${attemptCount}x)` : '';\n return `WebSocket hiba${countInfo} – kattintás: újracsatlakozás`;\n }\n return 'Csatlakozás… – kattintás: újracsatlakozás';\n });\n\n /** Oldalsó menü nyitva (true) vagy bezárva (false); kezdő érték localStorage-ból. */\n readonly sideNavOpen_$ = signal<boolean>(CCAP_MainFrame_Component.readSideNavOpenFromStorage());\n\n /** Beállítások submenu (Setup + Beállítások) nyitva; kezdő érték localStorage-ból. */\n readonly settingsSubmenuOpen_$ = signal<boolean>(\n CCAP_MainFrame_Component.readNavSubmenuOpenFromStorage(CCAP_NAV_SETTINGS_SUBMENU_OPEN_STORAGE_KEY),\n );\n\n /** Maintenance submenu (registrik, hibák, MCP, feedback, log, workflow) nyitva; kezdő érték localStorage-ból. */\n readonly maintenanceSubmenuOpen_$ = signal<boolean>(\n CCAP_MainFrame_Component.readNavSubmenuOpenFromStorage(CCAP_NAV_MAINTENANCE_SUBMENU_OPEN_STORAGE_KEY),\n );\n\n /** POC submenu (Voice Notes, POC Remote, Claude Enforcer) nyitva; kezdő érték localStorage-ból. */\n readonly pocSubmenuOpen_$ = signal<boolean>(\n CCAP_MainFrame_Component.readNavSubmenuOpenFromStorage(CCAP_NAV_POC_SUBMENU_OPEN_STORAGE_KEY),\n );\n\n /**\n * Bal oldali striphez csak azok a panelek, amiket a stripban mutatunk.\n * Desktopon (gt-xs) a navbar nincs a stripban, mert a headerben van a menügomb.\n */\n readonly closedPanelsLeftStrip_$ = computed<CCAP_LayoutOverlayClosedPanel_Interface[]>(() => {\n const left = this.layoutOverlay_CS.closedPanelsLeft_$();\n return this.layoutBreakpoint_CS.isMobile_$()\n ? left\n : left.filter((p: CCAP_LayoutOverlayClosedPanel_Interface) => p.id !== 'navbar');\n });\n\n readonly layoutOverlay_CS: CCAP_LayoutOverlay_ControlService =\n inject(CCAP_LayoutOverlay_ControlService);\n private readonly layoutBreakpoint_CS: CCAP_LayoutBreakpoint_ControlService =\n inject(CCAP_LayoutBreakpoint_ControlService);\n\n constructor() {\n super();\n // Mobile (xs) nézetben kezdeti állapot: nav bezárva, hogy a tartalom teljes szélességben látszódjon.\n if (this.layoutBreakpoint_CS.isMobile_$()) {\n this.sideNavOpen_$.set(false);\n }\n // Navbar panel regisztrálása az overlay szolgáltatásban.\n this.layoutOverlay_CS.register({\n id: 'navbar',\n label: 'Menü',\n icon: 'menu',\n isOpen: this.sideNavOpen_$(),\n open: (): void => this.toggleSideNav(),\n });\n // Minden állapotváltozásnál mentjük a böngészőbe és szinkronizáljuk az overlay-t.\n // REQ-UI-MENU-STATE-001 (cycle 462): a localStorage I/O a shared util-on megy\n // (writeString a régi `localStorage.setItem` + try/catch helyett).\n effect(() => {\n const open = this.sideNavOpen_$();\n Shr_LocalStoragePersistence_Util.writeString(CCAP_SIDE_NAV_OPEN_STORAGE_KEY, String(open));\n this.layoutOverlay_CS.updatePanelState('navbar', open);\n }, { allowSignalWrites: true });\n // Nav szekciók (Beállítások, Maintenance, POC) nyitott állapotának mentése böngészőbe.\n effect(() => {\n const settingsOpen = this.settingsSubmenuOpen_$();\n const maintenanceOpen = this.maintenanceSubmenuOpen_$();\n const pocOpen = this.pocSubmenuOpen_$();\n Shr_LocalStoragePersistence_Util.writeString(CCAP_NAV_SETTINGS_SUBMENU_OPEN_STORAGE_KEY, String(settingsOpen));\n Shr_LocalStoragePersistence_Util.writeString(CCAP_NAV_MAINTENANCE_SUBMENU_OPEN_STORAGE_KEY, String(maintenanceOpen));\n Shr_LocalStoragePersistence_Util.writeString(CCAP_NAV_POC_SUBMENU_OPEN_STORAGE_KEY, String(pocOpen));\n });\n }\n\n ngOnInit(): void {\n // Setup status ellenőrzés: ha a rendszer nincs konfigurálva, automatikusan a setup wizard-ra navigálunk.\n // Csak ha nem vagyunk már a /setup oldalon (dupla redirect elkerülése).\n if (!this.router.url.startsWith('/setup')) {\n void this.checkSetupAndRedirect();\n }\n\n // General szekció korai betöltése: socket error-report flag a hibalistához a settings megnyitása nélkül is érvényesül.\n // Auto-update trigger ezután fut, mert a setting (mobileAutoUpdateEnabled) ebből a szekcióból olvasódik (SSOT).\n void this.settingsGeneral_DS.load().then((): void => {\n const isAutoUpdateEnabled: boolean =\n this.settingsGeneral_DS.section_$().form.mobileAutoUpdateEnabled;\n if (isAutoUpdateEnabled) {\n void this.mobileAppUpdater_CS.autoUpdateIfAvailable();\n }\n });\n // Hibalista korai betöltése: navbar „Hibák” menüponton a darabszám a /errors megnyitása nélkül is látszik.\n void this.errors_DS.loadErrors();\n // Feedback lista korai betöltése: navbar „Feedback” menüponton a darabszám a /feedback megnyitása nélkül is látszik.\n void this.agentFeedback_DS.loadFeedback();\n // Mobil local notification inicializálás (permission kérés + tap handler regisztráció; web-en no-op).\n void this.mobileNotification_CS.initialize();\n\n // Submenu-k auto-nyitása, ha a jelenlegi route a csoport alá tartozik.\n this.routerUrl_$.set(this.router.url ?? '');\n\n this.addSubscription(this.router.events.pipe(\n filter((e): e is NavigationEnd => e instanceof NavigationEnd),\n ).subscribe((e: NavigationEnd): void => {\n const url: string = e.urlAfterRedirects ?? e.url ?? '';\n this.routerUrl_$.set(url);\n // Quick Input area-autofollow: route → composer area SSOT (data service).\n this.userInput_DS.syncComposerAreaFromNavigation(url);\n // Mobil nézetben navigáció után automatikusan bezárjuk a side nav-ot.\n if (this.layoutBreakpoint_CS.isMobile_$()) {\n this.sideNavOpen_$.set(false);\n }\n if (url.startsWith('/setup') || url.startsWith('/settings')) {\n this.settingsSubmenuOpen_$.set(true);\n }\n if (this.isMaintenanceRoute(url)) {\n this.maintenanceSubmenuOpen_$.set(true);\n }\n if (url.includes('voice-notes-poc') || url.includes('master-control-remote-poc')\n || url.includes('oc-session') || url.includes('ca-session')\n || url.includes('consultant')) {\n this.pocSubmenuOpen_$.set(true);\n }\n }));\n // Kezdő route alapján is nyissuk ki a megfelelő submenu-t.\n const initialUrl: string = this.router.url ?? '';\n if (initialUrl.startsWith('/setup') || initialUrl.startsWith('/settings')) {\n this.settingsSubmenuOpen_$.set(true);\n }\n if (this.isMaintenanceRoute(initialUrl)) {\n this.maintenanceSubmenuOpen_$.set(true);\n }\n if (initialUrl.includes('voice-notes-poc') || initialUrl.includes('master-control-remote-poc')\n || initialUrl.includes('oc-session') || initialUrl.includes('ca-session')\n || initialUrl.includes('consultant')) {\n this.pocSubmenuOpen_$.set(true);\n }\n this.userInput_DS.syncComposerAreaFromNavigation(this.router.url ?? '');\n }\n\n ngAfterViewInit(): void {\n const host: HTMLElement | undefined = this.quickInputAnchorMainRef?.nativeElement;\n if (host === undefined) {\n return;\n }\n const syncQuickInputMainLayout = (): void => {\n this.userInput_DS.syncQuickInputMainBoundsFromMainElement(host);\n this.userInput_DS.clampFabOffsetsToMain(host);\n };\n syncQuickInputMainLayout();\n this.quickInputMainResizeObs = new ResizeObserver(syncQuickInputMainLayout);\n this.quickInputMainResizeObs.observe(host);\n }\n\n override ngOnDestroy(): void {\n super.ngOnDestroy();\n this.quickInputMainResizeObs?.disconnect();\n }\n\n /**\n * Setup status ellenőrzés: ha setupCompleted === false, átnavigálunk a /setup wizard-ra.\n * Friss installon a user így azonnal a konfigurációt látja, nem egy üres dashboard-ot.\n */\n private async checkSetupAndRedirect(): Promise<void> {\n try {\n const status: { setupCompleted: boolean } = await this.setup_DS.getSetupStatus();\n\n if (!status.setupCompleted) {\n void this.router.navigate(['/setup']);\n }\n } catch {\n // Ha a setup status endpoint nem elérhető (pl. vault nincs kész), nem navigálunk —\n // a felhasználó manuálisan tud /setup-ra menni.\n }\n }\n\n /**\n * Oldalsó menü nyitása/bezárása (toggle).\n */\n toggleSideNav(): void {\n this.sideNavOpen_$.update((open: boolean) => !open);\n }\n\n /** Beállítások submenu nyitása/bezárása. */\n toggleSettingsSubmenu(): void {\n this.settingsSubmenuOpen_$.update((open: boolean) => !open);\n }\n\n /** Maintenance submenu nyitása/bezárása. */\n toggleMaintenanceSubmenu(): void {\n this.maintenanceSubmenuOpen_$.update((open: boolean) => !open);\n }\n\n /** POC submenu nyitása/bezárása. */\n togglePocSubmenu(): void {\n this.pocSubmenuOpen_$.update((open: boolean) => !open);\n }\n\n /**\n * Ellenőrzi, hogy az adott URL a Maintenance csoport alá tartozik-e.\n */\n private isMaintenanceRoute(url: string): boolean {\n // REQ-UI-MENU-REORG-001 (cycle 439): a /scheduler kikerült a Maintenance\n // csoportból (Orchestrator mellé sibling-ként), ezért nem trigger-eli\n // a Maintenance submenü auto-nyitását.\n return url.startsWith('/model-registry') || url.startsWith('/cost-tracking') || url.startsWith('/costs') || url.startsWith('/embedding-registry')\n || url.startsWith('/document-library') || url.startsWith('/project-source')\n || url.startsWith('/errors') || url.startsWith('/host-runtime-mcp')\n || url.startsWith('/feedback') || url.startsWith('/logs')\n || url.startsWith('/workflow-settings') || url.startsWith('/mobile-app')\n || url.startsWith('/agent-instances') || url.startsWith('/terminals')\n || url.startsWith('/live-development-pipeline')\n || url.startsWith('/system-status');\n }\n\n /**\n * WebSocket újracsatlakozás (top nav indikátor kattintás).\n */\n reconnectSocket(): void {\n this.session_DS.reconnectSocket();\n }\n\n /**\n * Aktív diagnosztika futtatása: probe-olja a szerver API-t és socket.io endpointot.\n * Az eredményt a lastError_$ objektumba merge-öli (diagnosis mező), így a copy tartalmazza.\n */\n handleRunDiagnosis(): void {\n if (this.isDiagnosing_$()) {\n return;\n }\n this.isDiagnosing_$.set(true);\n this.session_DS.diagnoseConnection().then((result: Record<string, unknown>): void => {\n this.mergeDiagnosisIntoLastError(result);\n this.isDiagnosing_$.set(false);\n }).catch((err: unknown): void => {\n this.mergeDiagnosisIntoLastError({\n diagnosisError: err instanceof Error ? err.message : String(err),\n });\n this.isDiagnosing_$.set(false);\n });\n }\n\n /**\n * Diagnosztika eredmény beírása a lastError_$ signal-ba (diagnosis kulcs alá).\n * Az error-display és a copy gomb így automatikusan tartalmazza.\n * A lastSocketError_$ getter a socket_CS.lastError_$ WritableSignal-t adja vissza — közvetlenül set-elhető.\n */\n private mergeDiagnosisIntoLastError(diagnosis: Record<string, unknown>): void {\n const current: unknown = this.lastSocketError_$();\n if (current !== null && typeof current === 'object') {\n const updated: Record<string, unknown> = { ...(current as Record<string, unknown>) };\n updated.diagnosis = diagnosis;\n this.lastSocketError_$.set(updated);\n }\n }\n\n /**\n * Böngészőből kiolvassa a side nav állapotát (default: true).\n *\n * REQ-UI-MENU-STATE-001 (cycle 462): a top-level function declaration most\n * private static method (CLAUDE.md no-top-level-function rule). A\n * `stored !== 'false'` default-szabály változatlan: nincs tárolt érték\n * (null), `'true'`, `'1'` → true; csak az explicit `'false'` → false.\n */\n private static readSideNavOpenFromStorage(): boolean {\n return Shr_LocalStoragePersistence_Util.readString(CCAP_SIDE_NAV_OPEN_STORAGE_KEY) !== 'false';\n }\n\n /**\n * Böngészőből kiolvassa egy nav szekció (submenu) nyitott állapotát.\n *\n * REQ-UI-MENU-STATE-001 (cycle 462): private static method (CLAUDE.md\n * compliance). A `stored === 'true'` default-szabály változatlan: csak\n * explicit `'true'` → true; minden egyéb (nincs / `'false'` / hibás) → false.\n */\n private static readNavSubmenuOpenFromStorage(storageKey: string): boolean {\n return Shr_LocalStoragePersistence_Util.readString(storageKey) === 'true';\n }\n}\n", "<div class=\"flex flex-col h-dvh overflow-hidden\">\n <header class=\"shrink-0 h-14 min-h-[44px] border-b border-neonDefault bg-ccapSurface flex items-center justify-between px-4 gap-2 overflow-visible pt-[var(--sat)]\">\n <div class=\"flex items-center gap-2 min-w-0 flex-1\">\n <!-- Navigációs sáv ki-becsukó toggle gomb -->\n <button type=\"button\"\n class=\"p-2 -ml-2 rounded-md text-neutral-400 hover:text-neutral-200\n hover:bg-neutral-800 transition-colors duration-200 flex-shrink-0\"\n (click)=\"toggleSideNav()\"\n [title]=\"sideNavOpen_$() ? 'Menü bezárása' : 'Menü megnyitása'\"\n [attr.aria-label]=\"sideNavOpen_$() ? 'Menü bezárása' : 'Menü megnyitása'\">\n @if (sideNavOpen_$()) {\n <svg class=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 19l-7-7 7-7\"/>\n </svg>\n } @else {\n <svg class=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M4 6h16M4 12h16M4 18h16\"/>\n </svg>\n }\n </button>\n <div class=\"min-w-0\">\n <span class=\"text-lg font-semibold text-neutral-100\">CCAP</span>\n <span class=\"ml-2 text-sm text-neutral-400 gt-xs:inline xs:hidden\">Agentic AI System</span>\n </div>\n </div>\n <!-- REQ-UI-MOB-HDR-001: a középső \"Command Center\" felirat mobil nézetben elrejtve, hogy ne\n csússzon össze a navigátor toggle / cím + jobb oldali tálca közt. -->\n <span class=\"text-sm font-medium tracking-widest text-neutral-400 uppercase select-none gt-xs:inline xs:hidden\">Command Center</span>\n <div class=\"flex items-center gap-2 flex-1 justify-end\">\n <!-- Notification tray: bell ikon + badge + dropdown panel -->\n <app-ntf-tray />\n <!-- WebSocket status: tooltip az indikátor alatt, balra (jobb felső sarok az indikátornál ankorolva). -->\n <div class=\"relative flex items-center justify-center group\">\n <div class=\"absolute top-full right-0 pt-2 z-50\n opacity-0 group-hover:opacity-100 transition-opacity duration-150\n pointer-events-none [&.tooltip-error]:group-hover:pointer-events-auto\n w-max max-w-[min(420px,calc(100vw-5rem))]\"\n [class.tooltip-error]=\"socketStatus_$() === 'error' && lastSocketError_$()\">\n @if (socketStatus_$() === 'error' && lastSocketError_$()) {\n <div class=\"rounded px-1 py-1 text-xs text-neutral-100 bg-neutral-700 shadow-md border\n border-red-500/70 w-full max-w-[min(420px,calc(100vw-5rem))]\"\n (click)=\"$event.stopPropagation()\">\n <button type=\"button\"\n (click)=\"handleRunDiagnosis()\"\n [disabled]=\"isDiagnosing_$()\"\n class=\"w-full mb-1 px-2 py-1.5 text-xs font-medium rounded\n bg-neonCyan/15 border border-neonCyan/50 text-neonCyan\n hover:bg-neonCyan/25 disabled:opacity-50 transition-colors\">\n {{ isDiagnosing_$() ? 'Diagnosztika fut…' : 'Kapcsolat diagnózis' }}\n </button>\n <div class=\"max-h-72 overflow-y-auto overflow-x-hidden [&_h2]:text-sm [&_h2]:mb-0\">\n <app-ccap-error-display [error]=\"lastSocketError_$()\"\n sourceLabelOverride=\"WebSocket\" />\n </div>\n <p class=\"text-neutral-500 text-[11px] mt-1 px-1\">Kattintás az indikátorra: újracsatlakozás</p>\n </div>\n } @else {\n <span class=\"whitespace-nowrap rounded px-2 py-1 text-xs text-neutral-100 bg-neutral-700\n shadow-md border border-neonDefault\">\n {{ socketStatusLabel_$() }}\n </span>\n }\n </div>\n <button type=\"button\"\n class=\"flex items-center justify-center p-0.5 rounded-full text-neutral-400\n hover:text-neutral-200 transition-colors duration-200 cursor-pointer\"\n (click)=\"reconnectSocket()\"\n [attr.aria-label]=\"socketStatusLabel_$()\">\n @switch (socketStatus_$()) {\n @case ('connected') {\n <span class=\"w-2 h-2 rounded-full bg-green-500 shrink-0\" aria-hidden=\"true\"></span>\n }\n @case ('connecting') {\n <span class=\"inline-block w-3 h-3 shrink-0 animate-spin rounded-full border-2 border-neonCyan/50\n border-t-neonCyan\"\n aria-hidden=\"true\"></span>\n }\n @case ('error') {\n <span class=\"w-2 h-2 rounded-full bg-red-500 shrink-0\" aria-hidden=\"true\"></span>\n }\n @default {\n <span class=\"w-2 h-2 rounded-full bg-neutral-500 shrink-0\" aria-hidden=\"true\"></span>\n }\n }\n </button>\n </div>\n <span class=\"text-sm text-neutral-300\" title=\"Client version\">\n <span class=\"text-neutral-500 font-normal xs:hidden gt-xs:inline\">Version</span> v{{ version }}\n </span>\n </div>\n </header>\n <!-- Backdrop on xs when nav open; click closes drawer -->\n @if (sideNavOpen_$()) {\n <div class=\"fixed inset-0 z-30 bg-black/50 xs:block gt-xs:hidden\"\n (click)=\"toggleSideNav()\"\n aria-hidden=\"true\"></div>\n }\n <div class=\"flex flex-1 min-h-0\">\n <aside [class.w-64]=\"sideNavOpen_$()\"\n [class.w-0]=\"!sideNavOpen_$()\"\n [class.border-r-0]=\"!sideNavOpen_$()\"\n class=\"shrink-0 border-r border-neonDefault bg-ccapSurface overflow-y-auto flex flex-col\n xs:fixed xs:inset-y-0 xs:left-0 xs:z-40 xs:w-64 xs:max-w-[85vw] xs:top-14 xs:bottom-0 xs:transition-transform xs:duration-200 xs:ease-out\n gt-xs:!translate-x-0 overflow-hidden transition-[width] duration-200 ease-out\"\n [ngClass]=\"{\n 'xs:-translate-x-full': !sideNavOpen_$(),\n 'xs:translate-x-0': sideNavOpen_$()\n }\">\n @if (sideNavOpen_$()) {\n <nav class=\"flex flex-col flex-1 min-h-0 p-2\">\n <div class=\"flex flex-col gap-0.5 flex-1 overflow-y-auto\">\n <a routerLink=\"/\"\n routerLinkActive=\"text-ccapAccent !border-ccapAccent shadow-neon-glow-accent\"\n [routerLinkActiveOptions]=\"{ exact: true }\"\nclass=\"px-4 py-2.5 rounded-md text-neutral-200 text-sm font-medium border border-transparent\n hover:bg-neutral-800 transition-colors duration-200 flex items-center gap-3\">\n <svg class=\"w-5 h-5 shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6zM14 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zM14 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z\"/>\n </svg>\n Dashboard\n </a>\n <a routerLink=\"/dark-office\"\n routerLinkActive=\"text-ccapAccent !border-ccapAccent shadow-neon-glow-accent\"\nclass=\"px-4 py-2.5 rounded-md text-neutral-200 text-sm font-medium border border-transparent\n hover:bg-neutral-800 transition-colors duration-200 flex items-center gap-3\">\n <svg class=\"w-5 h-5 shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4\"/>\n </svg>\n Dark Office\n </a>\n <a routerLink=\"/project-management\"\n routerLinkActive=\"text-ccapAccent !border-ccapAccent shadow-neon-glow-accent\"\nclass=\"px-4 py-2.5 rounded-md text-neutral-200 text-sm font-medium border border-transparent\n hover:bg-neutral-800 transition-colors duration-200 flex items-center gap-3\">\n <svg class=\"w-5 h-5 shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-3 7h3m-3 4h3m-6-4h.01M9 16h.01\"/>\n </svg>\n Project Management\n </a>\n <a routerLink=\"/session\"\n routerLinkActive=\"text-ccapAccent !border-ccapAccent shadow-neon-glow-accent\"\nclass=\"px-4 py-2.5 rounded-md text-neutral-200 text-sm font-medium border border-transparent\n hover:bg-neutral-800 transition-colors duration-200 flex items-center gap-3\">\n <svg class=\"w-5 h-5 shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z\"/>\n </svg>\n <span>CCAP Sessions</span>\n @if (hasRunningCcapSession_$()) {\n <!-- REQ-NAV-CCAP-DOT-001: sárga spinning dot, ha legalább egy CCAP Session fut. -->\n <span class=\"inline-block w-2 h-2 rounded-full bg-yellow-400 animate-pulse shrink-0\"\n title=\"Legalább egy CCAP Session fut\"\n aria-label=\"Legalább egy CCAP Session fut\"></span>\n }\n </a>\n <a routerLink=\"/cc-session\"\n routerLinkActive=\"text-ccapAccent !border-ccapAccent shadow-neon-glow-accent\"\nclass=\"px-4 py-2.5 rounded-md text-neutral-200 text-sm font-medium border border-transparent\n hover:bg-neutral-800 transition-colors duration-200 flex items-center gap-3\">\n <svg class=\"w-5 h-5 shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M9 3v2m6-2v2M9 19v2m6-2v2M5 9H3m2 6H3m18-6h-2m2 6h-2M7 19h10a2 2 0 002-2V7a2 2 0 00-2-2H7a2 2 0 00-2 2v10a2 2 0 002 2zM9 9h6v6H9V9z\"/>\n </svg>\n <span>CC Sessions</span>\n @if (hasRunningCcSession_$()) {\n <!-- REQ-UI-NAV-001: sárga spinning dot, ha legalább egy CC Session fut. -->\n <span class=\"inline-block w-2 h-2 rounded-full bg-yellow-400 animate-pulse shrink-0\"\n title=\"Legalább egy CC Session fut\"\n aria-label=\"Legalább egy CC Session fut\"></span>\n }\n </a>\n <!--\n REQ-CC-USAGE-DASHBOARD-001: a /cc-usage entry user-prio (cycle 872)\n átkerült a Maintenance submenu-be a Cost Tracking sor után,\n mert tematikusan a cost/usage-tracking-hez tartozik.\n -->\n <!--\n A Scheduler top-level menüpont (cycle 439 REQ-UI-MENU-REORG-001\n óta), stratégiai meta-funkció. A Koordinátor és az Orchestrator\n user-prio kérésre a POC submenu-be kerültek; a Scheduler\n maradt itt önálló top-level entry-ként mint független ütemező\n eszköz (nem Orchestrator-függő).\n -->\n <a routerLink=\"/scheduler\"\n routerLinkActive=\"text-ccapAccent !border-ccapAccent shadow-neon-glow-accent\"\n class=\"px-4 py-2.5 rounded-md text-neutral-200 text-sm font-medium border border-transparent\n hover:bg-neutral-800 transition-colors duration-200 flex items-center gap-3\">\n <svg class=\"w-5 h-5 shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\"/>\n </svg>\n Scheduler\n </a>\n <!-- POC submenu: Koordinátor, Orchestrator, Voice Notes, CA / OC Sessions, Consultant, POC Remote (legalul) -->\n <div class=\"flex flex-col gap-0.5\">\n <button type=\"button\"\n (click)=\"togglePocSubmenu()\"\n class=\"px-4 py-2.5 rounded-md text-neutral-200 text-sm font-medium border border-transparent\n hover:bg-neutral-800 transition-colors duration-200 flex items-center gap-3 w-full\n text-left\"\n [class.text-ccapAccent]=\"pocSubmenuOpen_$()\"\n [class.border-ccapAccent]=\"pocSubmenuOpen_$()\">\n <svg class=\"w-5 h-5 shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z\"/>\n </svg>\n POC\n <span class=\"ml-auto shrink-0 transition-transform duration-200\"\n [class.rotate-90]=\"pocSubmenuOpen_$()\">\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\"/>\n </svg>\n </span>\n </button>\n @if (pocSubmenuOpen_$()) {\n <div class=\"flex flex-col gap-0.5 pl-4 ml-5 border-l border-neutral-600\">\n <a routerLink=\"/coordinator\"\n routerLinkActive=\"text-ccapAccent !border-ccapAccent shadow-neon-glow-accent\"\n class=\"px-3 py-2 rounded-md text-neutral-300 text-sm border border-transparent\n hover:bg-neutral-800 transition-colors duration-200 flex items-center gap-2\">\n <svg class=\"w-4 h-4 shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z\"/>\n </svg>\n Koordinátor\n </a>\n <a routerLink=\"/orchestrator\"\n routerLinkActive=\"text-ccapAccent !border-ccapAccent shadow-neon-glow-accent\"\n class=\"px-3 py-2 rounded-md text-neutral-300 text-sm border border-transparent\n hover:bg-neutral-800 transition-colors duration-200 flex items-center gap-2\">\n <svg class=\"w-4 h-4 shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M13 10V3L4 14h7v7l9-11h-7z\"/>\n </svg>\n Orchestrator\n </a>\n <a routerLink=\"/voice-notes-poc\"\n routerLinkActive=\"text-ccapAccent !border-ccapAccent shadow-neon-glow-accent\"\n class=\"px-3 py-2 rounded-md text-neutral-300 text-sm border border-transparent\n hover:bg-neutral-800 transition-colors duration-200 flex items-center gap-2\">\n <svg class=\"w-4 h-4 shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M19 11a7 7 0 01-7 7m0 0a7 7 0 01-7-7m7 7v4m-4 0h8m-4-16a3 3 0 00-3 3v4a3 3 0 006 0V7a3 3 0 00-3-3z\"/>\n </svg>\n Voice Notes POC\n </a>\n <a routerLink=\"/ca-session\"\n routerLinkActive=\"text-ccapAccent !border-ccapAccent shadow-neon-glow-accent\"\n class=\"px-3 py-2 rounded-md text-neutral-300 text-sm border border-transparent\n hover:bg-neutral-800 transition-colors duration-200 flex items-center gap-2\">\n <svg class=\"w-4 h-4 shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\"/>\n </svg>\n CA Sessions\n </a>\n <a routerLink=\"/oc-session\"\n routerLinkActive=\"text-ccapAccent !border-ccapAccent shadow-neon-glow-accent\"\n class=\"px-3 py-2 rounded-md text-neutral-300 text-sm border border-transparent\n hover:bg-neutral-800 transition-colors duration-200 flex items-center gap-2\">\n <svg class=\"w-4 h-4 shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9\"/>\n </svg>\n OC Sessions\n </a>\n <a routerLink=\"/consultant\"\n routerLinkActive=\"text-ccapAccent !border-ccapAccent shadow-neon-glow-accent\"\n class=\"px-3 py-2 rounded-md text-neutral-300 text-sm border border-transparent\n hover:bg-neutral-800 transition-colors duration-200 flex items-center gap-2\">\n <svg class=\"w-4 h-4 shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z\"/>\n </svg>\n Consultant\n </a>\n <a routerLink=\"/master-control-remote-poc\"\n routerLinkActive=\"text-ccapAccent !border-ccapAccent shadow-neon-glow-accent\"\n class=\"px-3 py-2 rounded-md text-neutral-300 text-sm border border-transparent\n hover:bg-neutral-800 transition-colors duration-200 flex items-center gap-2\">\n <svg class=\"w-4 h-4 shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M5.636 18.364a9 9 0 010-12.728m12.728 0a9 9 0 010 12.728m-9.9-2.829a5 5 0 010-7.07m7.072 0a5 5 0 010 7.07M13 12a1 1 0 11-2 0 1 1 0 012 0z\"/>\n </svg>\n POC Remote\n </a>\n </div>\n }\n </div>\n <!-- Beállítások submenu: Setup + Beállítások -->\n <div class=\"flex flex-col gap-0.5\">\n <button type=\"button\"\n (click)=\"toggleSettingsSubmenu()\"\n class=\"px-4 py-2.5 rounded-md text-neutral-200 text-sm font-medium border border-transparent\n hover:bg-neutral-800 transition-colors duration-200 flex items-center gap-3 w-full\n text-left\"\n [class.text-ccapAccent]=\"settingsSubmenuOpen_$()\"\n [class.border-ccapAccent]=\"settingsSubmenuOpen_$()\">\n <svg class=\"w-5 h-5 shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z\"/>\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\"/>\n </svg>\n Beállítások\n <span class=\"ml-auto shrink-0 transition-transform duration-200\"\n [class.rotate-90]=\"settingsSubmenuOpen_$()\">\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\"/>\n </svg>\n </span>\n </button>\n @if (settingsSubmenuOpen_$()) {\n <div class=\"flex flex-col gap-0.5 pl-4 ml-5 border-l border-neutral-600\">\n @for (link of settingsSubmenuNavLinks; track link.routerLink) {\n <a [routerLink]=\"link.routerLink\"\n routerLinkActive=\"text-ccapAccent !border-ccapAccent shadow-neon-glow-accent\"\n [routerLinkActiveOptions]=\"{ exact: link.isRouterLinkActiveExactInSideNav }\"\n class=\"px-3 py-2 rounded-md text-neutral-300 text-sm border border-transparent\n hover:bg-neutral-800 transition-colors duration-200 flex items-center gap-2\">\n @if (link.iconSvgPath) {\n <svg class=\"w-4 h-4 shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\n aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n [attr.d]=\"link.iconSvgPath\"/>\n </svg>\n }\n {{ link.label }}\n </a>\n }\n </div>\n }\n </div>\n <!-- Maintenance submenu: registrik, hibák, MCP, feedback, log, workflow -->\n <div class=\"flex flex-col gap-0.5\">\n <button type=\"button\"\n (click)=\"toggleMaintenanceSubmenu()\"\n class=\"px-4 py-2.5 rounded-md text-neutral-200 text-sm font-medium border border-transparent\n hover:bg-neutral-800 transition-colors duration-200 flex items-center gap-3 w-full\n text-left\"\n [class.text-ccapAccent]=\"maintenanceSubmenuOpen_$()\"\n [class.border-ccapAccent]=\"maintenanceSubmenuOpen_$()\">\n <svg class=\"w-5 h-5 shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M11.42 15.17L17.25 21A2.652 2.652 0 0021 17.25l-5.877-5.877M11.42 15.17l2.496-3.03c.317-.384.74-.626 1.208-.766M11.42 15.17l-4.655 5.653a2.548 2.548 0 11-3.586-3.586l6.837-5.63m5.108-.233c.55-.164 1.163-.188 1.743-.14a4.5 4.5 0 004.486-6.336l-3.276 3.277a3.004 3.004 0 01-2.25-2.25l3.276-3.276a4.5 4.5 0 00-6.336 4.486c.049.58.025 1.193-.14 1.743\"/>\n </svg>\n Maintenance\n <span class=\"ml-auto shrink-0 transition-transform duration-200\"\n [class.rotate-90]=\"maintenanceSubmenuOpen_$()\">\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\"/>\n </svg>\n </span>\n </button>\n @if (maintenanceSubmenuOpen_$()) {\n <div class=\"flex flex-col gap-0.5 pl-4 ml-5 border-l border-neutral-600\">\n <!--\n REQ-UI-MENU-REORG-001 (cycle 439): a Scheduler kikerült innen\n az Orchestrator mellé (sibling, fent a top-level menüben),\n mert stratégiai meta-funkció — közelebb áll az Orchestrator-hoz\n mint a karbantartási eszközökhöz.\n -->\n <a routerLink=\"/live-development-pipeline\"\n routerLinkActive=\"text-ccapAccent !border-ccapAccent shadow-neon-glow-accent\"\n class=\"px-3 py-2 rounded-md text-neutral-300 text-sm border border-transparent\n hover:bg-neutral-800 transition-colors duration-200 flex items-center gap-2\">\n <svg class=\"w-4 h-4 shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M22 12h-4l-3 9L9 3l-3 9H2\"/>\n </svg>\n Live Development Pipeline\n </a>\n <a routerLink=\"/model-registry\"\n routerLinkActive=\"text-ccapAccent !border-ccapAccent shadow-neon-glow-accent\"\n class=\"px-3 py-2 rounded-md text-neutral-300 text-sm border border-transparent\n hover:bg-neutral-800 transition-colors duration-200 flex items-center gap-2\">\n <svg class=\"w-4 h-4 shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M21 7.5l-9-5.25L3 7.5m18 0l-9 5.25m9-5.25v9l-9 5.25M3 7.5l9 5.25M3 7.5v9l9 5.25m0-9v9\"/>\n </svg>\n Model Registry\n </a>\n <a routerLink=\"/cost-tracking\"\n routerLinkActive=\"text-ccapAccent !border-ccapAccent shadow-neon-glow-accent\"\n class=\"px-3 py-2 rounded-md text-neutral-300 text-sm border border-transparent\n hover:bg-neutral-800 transition-colors duration-200 flex items-center gap-2\">\n <svg class=\"w-4 h-4 shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M13 7h8m0 0v8m0-8l-8 8-4-4-6 6\"/>\n </svg>\n Cost Tracking\n </a>\n <!--\n REQ-CC-USAGE-DASHBOARD-001 cycle 872 — CC Usage Dashboard\n áthelyezve a Maintenance submenu alá (top-level → submenu),\n user explicit kérés. Tematikusan a Cost Tracking-hez tartozik.\n -->\n <a routerLink=\"/cc-usage\"\n routerLinkActive=\"text-ccapAccent !border-ccapAccent shadow-neon-glow-accent\"\n class=\"px-3 py-2 rounded-md text-neutral-300 text-sm border border-transparent\n hover:bg-neutral-800 transition-colors duration-200 flex items-center gap-2\">\n <svg class=\"w-4 h-4 shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M9 19V6l3-3 3 3v13M5 21h14a2 2 0 002-2v-7l-7-7-7 7v7a2 2 0 002 2z\"/>\n </svg>\n CC Usage\n </a>\n <a routerLink=\"/costs\"\n routerLinkActive=\"text-ccapAccent !border-ccapAccent shadow-neon-glow-accent\"\n class=\"px-3 py-2 rounded-md text-neutral-300 text-sm border border-transparent\n hover:bg-neutral-800 transition-colors duration-200 flex items-center gap-2\">\n Costs\n </a>\n <a routerLink=\"/embedding-registry\"\n routerLinkActive=\"text-ccapAccent !border-ccapAccent shadow-neon-glow-accent\"\n class=\"px-3 py-2 rounded-md text-neutral-300 text-sm border border-transparent\n hover:bg-neutral-800 transition-colors duration-200 flex items-center gap-2\">\n <svg class=\"w-4 h-4 shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5\"/>\n </svg>\n Embedding registry\n </a>\n <a routerLink=\"/document-library\"\n routerLinkActive=\"text-ccapAccent !border-ccapAccent shadow-neon-glow-accent\"\n class=\"px-3 py-2 rounded-md text-neutral-300 text-sm border border-transparent\n hover:bg-neutral-800 transition-colors duration-200 flex items-center gap-2\">\n <svg class=\"w-4 h-4 shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253\"/>\n </svg>\n Document Library\n </a>\n <a routerLink=\"/project-source\"\n routerLinkActive=\"text-ccapAccent !border-ccapAccent shadow-neon-glow-accent\"\n class=\"px-3 py-2 rounded-md text-neutral-300 text-sm border border-transparent\n hover:bg-neutral-800 transition-colors duration-200 flex items-center gap-2\">\n <svg class=\"w-4 h-4 shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z\"/>\n </svg>\n Project Source\n </a>\n <a routerLink=\"/errors\"\n routerLinkActive=\"text-ccapAccent !border-ccapAccent shadow-neon-glow-accent\"\n [attr.aria-label]=\"recordedSystemErrorsCount_$() > 0\n ? ('Hibák, ' + recordedSystemErrorsCount_$() + ' rögzített bejegyzés a listában')\n : null\"\n [attr.title]=\"recordedSystemErrorsCount_$() > 0\n ? ('Rendszer hibák száma: ' + recordedSystemErrorsCount_$())\n : null\"\n class=\"px-3 py-2 rounded-md text-neutral-300 text-sm border border-transparent\n hover:bg-neutral-800 transition-colors duration-200 flex items-center gap-2\">\n <svg class=\"w-4 h-4 shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"/>\n </svg>\n <span>Hibák</span>\n @if (recordedSystemErrorsCount_$() > 0) {\n <span class=\"ml-auto shrink-0 min-w-[1.25rem] px-1.5 py-0.5 rounded-full text-xs font-semibold\n text-neutral-950 bg-amber-400 border border-amber-500/80 text-center leading-none\">\n {{ recordedSystemErrorsCount_$() }}\n </span>\n }\n </a>\n <a routerLink=\"/host-runtime-mcp\"\n routerLinkActive=\"text-ccapAccent !border-ccapAccent shadow-neon-glow-accent\"\n class=\"px-3 py-2 rounded-md text-neutral-300 text-sm border border-transparent\n hover:bg-neutral-800 transition-colors duration-200 flex items-center gap-2\">\n <svg class=\"w-4 h-4 shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2m-2-4h.01M17 16h.01\"/>\n </svg>\n Host Runtime MCP\n </a>\n <a routerLink=\"/feedback\"\n routerLinkActive=\"text-ccapAccent !border-ccapAccent shadow-neon-glow-accent\"\n [attr.aria-label]=\"recordedAgentFeedbackCount_$() > 0\n ? ('Feedback, ' + recordedAgentFeedbackCount_$() + ' rögzített bejegyzés a listában')\n : null\"\n [attr.title]=\"recordedAgentFeedbackCount_$() > 0\n ? ('Feedback bejegyzések száma: ' + recordedAgentFeedbackCount_$())\n : null\"\n class=\"px-3 py-2 rounded-md text-neutral-300 text-sm border border-transparent\n hover:bg-neutral-800 transition-colors duration-200 flex items-center gap-2\">\n <svg class=\"w-4 h-4 shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z\"/>\n </svg>\n <span>Feedback</span>\n @if (recordedAgentFeedbackCount_$() > 0) {\n <span class=\"ml-auto shrink-0 min-w-[1.25rem] px-1.5 py-0.5 rounded-full text-xs font-semibold\n text-neutral-950 bg-amber-400 border border-amber-500/80 text-center leading-none\">\n {{ recordedAgentFeedbackCount_$() }}\n </span>\n }\n </a>\n <a routerLink=\"/logs\"\n routerLinkActive=\"text-ccapAccent !border-ccapAccent shadow-neon-glow-accent\"\n class=\"px-3 py-2 rounded-md text-neutral-300 text-sm border border-transparent\n hover:bg-neutral-800 transition-colors duration-200 flex items-center gap-2\">\n <svg class=\"w-4 h-4 shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"/>\n </svg>\n LLM Debug Log\n </a>\n <a routerLink=\"/workflow-settings\"\n routerLinkActive=\"text-ccapAccent !border-ccapAccent shadow-neon-glow-accent\"\n class=\"px-3 py-2 rounded-md text-neutral-300 text-sm border border-transparent\n hover:bg-neutral-800 transition-colors duration-200 flex items-center gap-2\">\n <svg class=\"w-4 h-4 shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4\"/>\n </svg>\n Workflow beállítások\n </a>\n <a routerLink=\"/terminals\"\n routerLinkActive=\"text-ccapAccent !border-ccapAccent shadow-neon-glow-accent\"\n class=\"px-3 py-2 rounded-md text-neutral-300 text-sm border border-transparent\n hover:bg-neutral-800 transition-colors duration-200 flex items-center gap-2\">\n <svg class=\"w-4 h-4 shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\"/>\n </svg>\n Terminals\n </a>\n <a routerLink=\"/agent-instances\"\n routerLinkActive=\"text-ccapAccent !border-ccapAccent shadow-neon-glow-accent\"\n class=\"px-3 py-2 rounded-md text-neutral-300 text-sm border border-transparent\n hover:bg-neutral-800 transition-colors duration-200 flex items-center gap-2\">\n <svg class=\"w-4 h-4 shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z\"/>\n </svg>\n Agent Instances\n </a>\n <a routerLink=\"/mobile-app\"\n routerLinkActive=\"text-ccapAccent !border-ccapAccent shadow-neon-glow-accent\"\n class=\"px-3 py-2 rounded-md text-neutral-300 text-sm border border-transparent\n hover:bg-neutral-800 transition-colors duration-200 flex items-center gap-2\">\n <svg class=\"w-4 h-4 shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M12 18h.01M8 21h8a2 2 0 002-2V5a2 2 0 00-2-2H8a2 2 0 00-2 2v14a2 2 0 002 2z\"/>\n </svg>\n Mobile App\n </a>\n </div>\n }\n </div>\n </div>\n </nav>\n }\n </aside>\n <main #quickInputAnchorMain class=\"flex flex-col flex-1 min-h-0 min-w-0 relative pb-[var(--sab)]\">\n <!-- Mobil app frissítés banner: Capacitor natív app-ban, új verzió elérhetőségénél. -->\n <app-ccap-app-update-banner />\n <!-- Cycle 781c (REQ-SYS-INSTALL-VERSION-CHECK-001 Slice C): server +\n runner verzió-mismatch banner. Megjelenik az app shell tetején,\n ha a server elavult (npm-latest > server) VAGY ha aktív CC runner\n verzió-mismatch van. -->\n <app-ccap-server-update-banner></app-ccap-server-update-banner>\n <!-- Globális hiba notification overlay (bal felső sarok, bubble-ök egymás alatt; NEM scrollozódik). -->\n <app-ccap-error-popup></app-ccap-error-popup>\n <!-- Bal oldali closed-panels strip: session lista stb. (navbar desktopon a headerben van, xs-en nincs strip). -->\n @if (closedPanelsLeftStrip_$().length > 0) {\n <div class=\"absolute top-0 left-0 z-10 flex gap-1 p-2 rounded-br-md border-b border-r border-neonDefault\n bg-ccapSurface/95 shadow-sm xs:hidden\">\n @for (panel of closedPanelsLeftStrip_$(); track panel.id) {\n <button type=\"button\"\n (click)=\"panel.open()\"\n [title]=\"panel.label\"\n class=\"p-2 rounded-md text-neutral-400 hover:text-neutral-200 hover:bg-neutral-800\n transition-colors duration-200 flex items-center justify-center\">\n @switch (panel.icon) {\n @case ('menu') {\n <svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M4 6h16M4 12h16M4 18h16\"/>\n </svg>\n }\n @case ('list') {\n <svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M4 6h16M4 10h16M4 14h16M4 18h16\"/>\n </svg>\n }\n @case ('info') {\n <svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"/>\n </svg>\n }\n @default {\n <span class=\"text-lg\">›</span>\n }\n }\n </button>\n }\n </div>\n }\n <!-- Jobb oldali closed-panels strip: info panel (csak desktop, gt-xs). Bezárva teljesen eltűnik, nyitás a jobb szélen. -->\n @if (layoutOverlay_CS.closedPanelsRight_$().length > 0) {\n <div class=\"absolute top-0 right-0 z-10 flex gap-1 p-2 rounded-bl-md border-b border-l border-neonDefault\n bg-ccapSurface/95 shadow-sm\">\n @for (panel of layoutOverlay_CS.closedPanelsRight_$(); track panel.id) {\n <button type=\"button\"\n (click)=\"panel.open()\"\n [title]=\"panel.label\"\n class=\"p-2 rounded-md text-neutral-400 hover:text-neutral-200 hover:bg-neutral-800\n transition-colors duration-200 flex items-center justify-center\">\n @switch (panel.icon) {\n @case ('menu') {\n <svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M4 6h16M4 12h16M4 18h16\"/>\n </svg>\n }\n @case ('list') {\n <svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M4 6h16M4 10h16M4 14h16M4 18h16\"/>\n </svg>\n }\n @case ('info') {\n <svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"/>\n </svg>\n }\n @default {\n <span class=\"text-lg\">‹</span>\n }\n }\n </button>\n }\n </div>\n }\n <!-- Tartalom: flex-1 + min-h-0 — full-height route-ok (session shell) belül görgetnek; hosszú oldalak (pl. home) itt kapnak vertikális scrollt. -->\n <div class=\"flex flex-col flex-1 min-h-0 overflow-x-hidden overflow-y-auto\">\n @if (modelTestRunGlobalBannerVisible_$()) {\n <div class=\"shrink-0 px-3 py-2 border-b border-ccapAccent/40 bg-ccapAccent/10 text-sm text-neutral-200\n flex flex-wrap items-center justify-between gap-2\">\n <span class=\"flex items-center gap-2 min-w-0\">\n <span class=\"w-2 h-2 rounded-full bg-ccapAccent animate-pulse shrink-0\" aria-hidden=\"true\"></span>\n <span class=\"truncate\">\n Modellteszt fut a háttérben\n @if (modelRegistry_DS.modelTestRunProgressCurrentTask_$(); as ct) {\n <span class=\"text-neutral-400\"> — {{ ct.promptId }}</span>\n }\n </span>\n </span>\n <a routerLink=\"/model-registry\"\n class=\"shrink-0 text-ccapAccent hover:underline font-medium text-xs uppercase tracking-wide\">\n Model Registry\n </a>\n </div>\n }\n <router-outlet></router-outlet>\n </div>\n </main>\n </div>\n <!-- Mobil szerver-cím bekérő overlay: Capacitor natív app-ban, ha nincs mentett szerver URL. -->\n <app-ccap-mobile-server-setup />\n</div>\n", "import {\n CCAP_CircuitPolylinePoint_Interface,\n CCAP_CircuitTraceGeometry_Interface,\n} from './ccap-circuit-overlay-paths.interface';\n\n/**\n * Egy polyline pontja (viewBox 0 0 100 100) — csak jobbra növekvő x, vízszintes vagy 45°-os szakaszok.\n */\ninterface CircuitPoint_Interface {\n x: number;\n y: number;\n}\n\n/**\n * Bal közép indulás (LTR): path `M 0 50` — user x=0 a viewBox bal széle; a template SVG `slice`/`meet` váltással\n * tájképben a viewport teljes szélességére nyúlik (xMin + slice).\n */\nconst CCAP_CIRCUIT_VIEWBOX_START_X: number = 0;\n\n/** ViewBox vízszintes közép vonala — start Y (LTR „bal közép\"). */\nconst CCAP_CIRCUIT_VIEWBOX_MID_Y: number = 50;\n\n/** Főút Y-sáv: nagyobb véletlen lépésekhez tágabb sáv. */\nconst CCAP_CIRCUIT_Y_TRACK_LO: number = 30;\n\nconst CCAP_CIRCUIT_Y_TRACK_HI: number = 70;\n\n/**\n * ViewBox Y: a középre igazított státusz kártya körüli „lágy\" sáv — nem tiltott zóna, csak nudge célpont.\n */\nconst CCAP_CIRCUIT_STATUS_AVOID_Y_LO: number = 40;\n\nconst CCAP_CIRCUIT_STATUS_AVOID_Y_HI: number = 60;\n\n/**\n * Ha az Y ebbe a sávba esik, ennyi százalék eséllyel finoman eltoljuk felfelé/lefelé (marad ~45% változatlan).\n */\nconst CCAP_CIRCUIT_SOFT_NUDGE_FROM_CENTER_CHANCE_PERCENT: number = 55;\n\n/**\n * Két olyan szakasz között, ahol Y is változik (ferde lépés), kötelező min. vízszintes hossz (user unit) —\n * ne legyen „instant\" föl-le irányváltás egymás után.\n */\nconst CCAP_CIRCUIT_MIN_FLAT_BETWEEN_DY_STEPS_USER: number = 3;\n\n/**\n * Ugyanitt: vízszintes „lélegzet\" max. hossza (user unit); a tényleges hossz [min, max] között random.\n */\nconst CCAP_CIRCUIT_MAX_FLAT_BETWEEN_DY_STEPS_USER: number = 12;\n\n/**\n * Pulse + trace index → seed (determinisztikus, külön áramkör / geometria).\n */\nfunction createTraceSeed(pulse: number, traceIndex: number): number {\n const p: number = pulse >>> 0;\n const t: number = traceIndex >>> 0;\n const mixed: number = p * 2654435761 + t * 1597334677 + 1013904223;\n return mixed >>> 0 || 1;\n}\n\n/**\n * Seed-ből LCG state.\n */\nfunction createRngState(seed: number): number {\n return seed >>> 0 || 1;\n}\n\n/**\n * LCG lépés: következő uint32 a stateRef-ben.\n */\nfunction nextUint32(stateRef: { value: number }): number {\n stateRef.value = (stateRef.value * 1664525 + 1013904223) >>> 0;\n return stateRef.value;\n}\n\n/**\n * Inkluzív egész [min, max] az LCG stream-ből.\n */\nfunction nextInt(stateRef: { value: number }, min: number, max: number): number {\n const range: number = max - min + 1;\n const u: number = nextUint32(stateRef);\n return min + (u % range);\n}\n\n/**\n * Y a [lo, hi] tartományba szorítva.\n */\nfunction clampY(y: number, lo: number, hi: number): number {\n if (y < lo) {\n return lo;\n }\n if (y > hi) {\n return hi;\n }\n return y;\n}\n\n/**\n * Véletlen ΔY: több skála — nagyon kicsi „zaj\", közepes, nagyobb és nagy irányváltás (determinisztikus stream).\n * REQ-UI-008: nagyobb eséllyel kisebb amplitúdójú fel-le mozgás — a tier-eloszlás 0–99 bucket-re\n * súlyozva úgy, hogy a kis (tier 0 + tier 1) összesen 70%-ot tegyen ki, a közepes big up/down 10-10%,\n * a „very big\" 5-5%. Régi 7-elemű egyenletes sorsolás ezzel kiváltva.\n */\nfunction nextVerticalStepDyVaried(stateRef: { value: number }): number {\n const bucket: number = nextInt(stateRef, 0, 99);\n if (bucket < 40) {\n // 40% — very small noise.\n return nextInt(stateRef, -3, 3);\n }\n if (bucket < 70) {\n // 30% — small-medium.\n return nextInt(stateRef, -6, 6);\n }\n if (bucket < 80) {\n // 10% — medium upward.\n return nextInt(stateRef, -11, -5);\n }\n if (bucket < 90) {\n // 10% — medium downward.\n return nextInt(stateRef, 5, 11);\n }\n if (bucket < 95) {\n // 5% — very big upward.\n return nextInt(stateRef, -20, -12);\n }\n // 5% — very big downward.\n return nextInt(stateRef, 12, 20);\n}\n\n/**\n * Lágy terelés: ha `y` a középső státusz-sávban van, nagy eséllyel kicsit kijebb toljuk (fent/lenn) — nem kötelező.\n */\nfunction nudgeYSoftAwayFromStatusCenter(\n stateRef: { value: number },\n y: number,\n lo: number,\n hi: number,\n): number {\n const yClamped: number = clampY(y, lo, hi);\n if (yClamped < CCAP_CIRCUIT_STATUS_AVOID_Y_LO || yClamped > CCAP_CIRCUIT_STATUS_AVOID_Y_HI) {\n return yClamped;\n }\n if (nextInt(stateRef, 1, 100) > CCAP_CIRCUIT_SOFT_NUDGE_FROM_CENTER_CHANCE_PERCENT) {\n return yClamped;\n }\n const towardUpper: boolean = nextInt(stateRef, 0, 1) === 0;\n const magnitude: number = nextInt(stateRef, 5, 13);\n const primary: number = clampY(towardUpper ? yClamped - magnitude : yClamped + magnitude, lo, hi);\n if (primary < CCAP_CIRCUIT_STATUS_AVOID_Y_LO || primary > CCAP_CIRCUIT_STATUS_AVOID_Y_HI) {\n return primary;\n }\n /** Első irány még középen maradt — ellenkező irány egy próba. */\n return clampY(towardUpper ? yClamped + magnitude : yClamped - magnitude, lo, hi);\n}\n\n/**\n * Egymás utáni azonos pontok kiszűrése (0 hosszú szegmens nélkül).\n */\nfunction dedupeConsecutivePoints(points: CircuitPoint_Interface[]): CircuitPoint_Interface[] {\n const out: CircuitPoint_Interface[] = [];\n for (let i: number = 0; i < points.length; i++) {\n const p: CircuitPoint_Interface = points[i];\n const prev: CircuitPoint_Interface | undefined = out[out.length - 1];\n if (prev?.x === p.x && prev.y === p.y) {\n continue;\n }\n out.push(p);\n }\n return out;\n}\n\n/**\n * Pontlista → SVG path `d` (M + L).\n */\nfunction pointsToPathD(points: CircuitPoint_Interface[]): string {\n const cleaned: CircuitPoint_Interface[] = dedupeConsecutivePoints(points);\n if (cleaned.length === 0) {\n return 'M 0 0 L 0 0';\n }\n let d: string = `M ${cleaned[0].x} ${cleaned[0].y}`;\n for (let i: number = 1; i < cleaned.length; i++) {\n d += ` L ${cleaned[i].x} ${cleaned[i].y}`;\n }\n return d;\n}\n\n/**\n * Nyers pontokból kumulatív távolságos polyline — canvas animáció `getPointAtDistance` lookuphoz.\n */\nfunction computeCumulativeLengths(points: CircuitPoint_Interface[]): CCAP_CircuitPolylinePoint_Interface[] {\n if (points.length === 0) {\n return [];\n }\n const result: CCAP_CircuitPolylinePoint_Interface[] = [\n { x: points[0].x, y: points[0].y, cumLen: 0 },\n ];\n let cumLen: number = 0;\n for (let i: number = 1; i < points.length; i++) {\n const dx: number = points[i].x - points[i - 1].x;\n const dy: number = points[i].y - points[i - 1].y;\n cumLen += Math.hypot(dx, dy);\n result.push({ x: points[i].x, y: points[i].y, cumLen: cumLen });\n }\n return result;\n}\n\n/**\n * Egy trace geometriája: bal középről induló LTR főút, 45°-s Y-váltások; **minden** ilyen ferde lépés után\n * kötelező rövid vízszintes a következő Y-váltás előtt; fal: vízszintes záró szegmens.\n */\nfunction buildTraceGeometryForStateRef(stateRef: { value: number }): CCAP_CircuitTraceGeometry_Interface {\n const x0: number = CCAP_CIRCUIT_VIEWBOX_START_X;\n /** Indulási Y: viewBox közép ±5 (determinisztikus RNG-ből) — lane-enként eltérő magasságról indul. */\n const y0: number = CCAP_CIRCUIT_VIEWBOX_MID_Y + nextInt(stateRef, -5, 5);\n /** Virtuális fal X: jobb széltől 10–30% (viewBox 70–90) — lane-enként eltérő falütközési pont. */\n const xSplit: number = nextInt(stateRef, 70, 90);\n /** Első vízszintes szakasz végpontja: x0-tól jobbra, még a zigzag előtt. */\n const x1: number = nextInt(stateRef, 14, 26);\n const xMargin: number = nextInt(stateRef, 4, 11);\n const maxXBeforeWall: number = xSplit - xMargin;\n\n const mainPoints: CircuitPoint_Interface[] = [{ x: x0, y: y0 }, { x: x1, y: y0 }];\n let curX: number = x1;\n let curY: number = y0;\n\n let stepGuard: number = 0;\n while (curX < maxXBeforeWall - 1 && stepGuard < 56) {\n stepGuard += 1;\n let dyRaw: number = nextVerticalStepDyVaried(stateRef);\n let newY: number = clampY(curY + dyRaw, CCAP_CIRCUIT_Y_TRACK_LO, CCAP_CIRCUIT_Y_TRACK_HI);\n if (newY === curY) {\n const bump: number = nextInt(stateRef, 1, 3);\n newY = clampY(curY + (nextInt(stateRef, 0, 1) === 0 ? -bump : bump), CCAP_CIRCUIT_Y_TRACK_LO, CCAP_CIRCUIT_Y_TRACK_HI);\n }\n newY = nudgeYSoftAwayFromStatusCenter(stateRef, newY, CCAP_CIRCUIT_Y_TRACK_LO, CCAP_CIRCUIT_Y_TRACK_HI);\n let ddy: number = newY - curY;\n let legDx: number = Math.abs(ddy);\n let nextX: number = curX + legDx;\n if (nextX > maxXBeforeWall) {\n const room: number = maxXBeforeWall - curX;\n if (room < 1.5) {\n break;\n }\n legDx = Math.floor(room);\n const signY: number = ddy >= 0 ? 1 : -1;\n newY = clampY(curY + signY * legDx, CCAP_CIRCUIT_Y_TRACK_LO, CCAP_CIRCUIT_Y_TRACK_HI);\n ddy = newY - curY;\n nextX = curX + Math.abs(ddy);\n }\n if (Math.abs(ddy) < 0.0001) {\n continue;\n }\n mainPoints.push({ x: nextX, y: newY });\n curX = nextX;\n curY = newY;\n\n /**\n * Kötelező vízszintes a következő ferde / Y-váltás előtt — a föl-le váltás nem következhet azonnal újabb ferde\n * lépésben; fal előtt, ha kevés a hely, ami belefér, azt kitekerjük.\n */\n const roomAfterDy: number = maxXBeforeWall - curX;\n if (roomAfterDy > 0.0001) {\n const minFlat: number = CCAP_CIRCUIT_MIN_FLAT_BETWEEN_DY_STEPS_USER;\n const maxFlatCap: number = Math.min(\n CCAP_CIRCUIT_MAX_FLAT_BETWEEN_DY_STEPS_USER,\n Math.floor(roomAfterDy),\n );\n if (maxFlatCap >= minFlat) {\n const flatRun: number = nextInt(stateRef, minFlat, maxFlatCap);\n curX = Math.min(curX + flatRun, maxXBeforeWall);\n mainPoints.push({ x: curX, y: curY });\n } else if (maxFlatCap >= 1) {\n curX = Math.min(curX + maxFlatCap, maxXBeforeWall);\n mainPoints.push({ x: curX, y: curY });\n }\n }\n }\n\n const rippleUpLen: number = nextInt(stateRef, 4, 8);\n const rippleDownLen: number = nextInt(stateRef, 4, 8);\n\n /**\n * Fal-kontakt: **mindig vízszintes** záró szegmens — utolsó belső pont Y-ja = fal Y, nincs ferde „becsapódás\".\n */\n const lastInterior: CircuitPoint_Interface = mainPoints[mainPoints.length - 1];\n mainPoints.push({ x: xSplit, y: lastInterior.y });\n const yWall: number = lastInterior.y;\n\n const wallX: number = xSplit;\n const yRippleUpEnd: number = clampY(yWall - rippleUpLen, 8, yWall - 1);\n const yRippleDownEnd: number = clampY(yWall + rippleDownLen, yWall + 1, 92);\n const wallRippleUp: string = `M ${wallX} ${yWall} L ${wallX} ${yRippleUpEnd}`;\n const wallRippleDown: string = `M ${wallX} ${yWall} L ${wallX} ${yRippleDownEnd}`;\n\n /** Kumulatív hossz számítás a deduped pontokra. */\n const cleanedPoints: CircuitPoint_Interface[] = dedupeConsecutivePoints(mainPoints);\n const polyPoints: CCAP_CircuitPolylinePoint_Interface[] = computeCumulativeLengths(cleanedPoints);\n const totalLen: number = polyPoints.length > 0 ? polyPoints[polyPoints.length - 1].cumLen : 0;\n\n return {\n main: pointsToPathD(mainPoints),\n wallRippleUp: wallRippleUp,\n wallRippleDown: wallRippleDown,\n mainPoints: polyPoints,\n totalLength: totalLen,\n wallX: wallX,\n wallY: yWall,\n wallRippleUpEndY: yRippleUpEnd,\n wallRippleDownEndY: yRippleDownEnd,\n };\n}\n\n/**\n * Server-unavailable overlay: spawn-id szerinti egyedi trace (külön seed / életút).\n * Több véletlen ΔY-skála + kötelező vízszintes minden Y-váltó ferde lépés után; Y-nál lágy terelés a státusz-sávtól.\n */\nexport class CCAP_CircuitPath_Util {\n\n /**\n * Egy spawn-hoz egy path-készlet: `spawnId` monoton (1, 2, 3, …) — determinisztikus seed / életút.\n */\n static buildTraceForSpawnId(spawnId: number): CCAP_CircuitTraceGeometry_Interface {\n if (spawnId < 1) {\n return {\n main: 'M 0 0 L 0 0',\n wallRippleUp: 'M 0 0 L 0 0',\n wallRippleDown: 'M 0 0 L 0 0',\n mainPoints: [{ x: 0, y: 0, cumLen: 0 }],\n totalLength: 0,\n wallX: 0,\n wallY: 0,\n wallRippleUpEndY: 0,\n wallRippleDownEndY: 0,\n };\n }\n const seed: number = createTraceSeed(spawnId, 0);\n const stateRef: { value: number } = { value: createRngState(seed) };\n return buildTraceGeometryForStateRef(stateRef);\n }\n\n /**\n * Polyline pozíció keresés adott távolságnál — bináris keresés + lineáris interpoláció.\n * Egyenes szegmensekből álló polyline-ra pontos; O(log n).\n */\n static getPointAtDistance(\n points: CCAP_CircuitPolylinePoint_Interface[],\n distance: number,\n ): { x: number; y: number } {\n if (points.length === 0) {\n return { x: 0, y: 0 };\n }\n if (distance <= 0) {\n return { x: points[0].x, y: points[0].y };\n }\n const last: CCAP_CircuitPolylinePoint_Interface = points[points.length - 1];\n if (distance >= last.cumLen) {\n return { x: last.x, y: last.y };\n }\n /** Bináris keresés: a szegmens, ahol `cumLen[lo] <= distance < cumLen[hi]`. */\n let lo: number = 0;\n let hi: number = points.length - 1;\n while (hi - lo > 1) {\n const mid: number = Math.floor((lo + hi) / 2);\n if (points[mid].cumLen <= distance) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n const p0: CCAP_CircuitPolylinePoint_Interface = points[lo];\n const p1: CCAP_CircuitPolylinePoint_Interface = points[hi];\n const segLen: number = p1.cumLen - p0.cumLen;\n if (segLen < 1e-9) {\n return { x: p0.x, y: p0.y };\n }\n const t: number = (distance - p0.cumLen) / segLen;\n return {\n x: p0.x + t * (p1.x - p0.x),\n y: p0.y + t * (p1.y - p0.y),\n };\n }\n}\n", "import { CommonModule } from '@angular/common';\nimport {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n Injector,\n signal,\n WritableSignal,\n} from '@angular/core';\n\nimport { CCAP_NetworkDiagnosticResult_Interface } from '../../_collections/network-diagnostic/ccap-network-diagnostic.interface';\nimport { CCAP_NetworkDiagnostic_Util } from '../../_collections/network-diagnostic/ccap-network-diagnostic.util';\nimport { environment } from '../../../environments/environment';\nimport { CCAP_SocketStatus_Type } from '../../_enums/ccap-socket-status.enum';\nimport { CCAP_ErrorDisplay_Component } from '../ccap-error-display/ccap-error-display.component';\nimport { Shr_LocalStoragePersistence_Util } from '../../_modules/shared/_collections/utils/storage/shr-local-storage-persistence.util';\nimport { Session_DataService } from '../../_modules/session/_services/data-services/session.data-service';\nimport { CCAP_SOCKET_IO_RECONNECTION_DELAY_MS } from '../../_services/control-services/socket.control-service.const';\nimport {\n CCAP_CIRCUIT_OVERLAY_HEAD_HIDE_BEFORE_RIPPLE_MS,\n CCAP_CIRCUIT_OVERLAY_MAIN_MS,\n CCAP_CIRCUIT_OVERLAY_MAX_CONCURRENT_LANES,\n CCAP_CIRCUIT_OVERLAY_RAF_MIN_INTERVAL_MS_REDUCED_MOTION,\n CCAP_CIRCUIT_OVERLAY_SPAWN_LIFETIME_TAIL_MS,\n CCAP_CIRCUIT_OVERLAY_TRAIL_TAIL_TARGET_CM,\n CCAP_CIRCUIT_OVERLAY_TRAIL_WALL_ABSORB_MS,\n CCAP_CIRCUIT_OVERLAY_WALL_HIT_MS,\n} from './_collections/ccap-circuit-overlay.anim.const';\nimport {\n CCAP_CircuitCanvasLane_Interface,\n CCAP_CircuitPolylinePoint_Interface,\n CCAP_CircuitTraceGeometry_Interface,\n} from './_collections/ccap-circuit-overlay-paths.interface';\nimport { CCAP_CircuitPath_Util } from './_collections/ccap-circuit-path.util';\n\n/** ViewBox szélesség a koordináta-rendszerben (0-100). */\nconst VIEWBOX_W: number = 100;\n\n/** cm → CSS px konverziós szorzó (96 DPI szabvány). */\nconst CM_TO_CSS_PX: number = 96 / 2.54;\n\n/**\n * Teljes viewport overlay: WebSocket error állapotnál sötétítés, spinner és rövid üzenet.\n * A `lastSocketError` **nem** jelenik meg itt — az overlay maga az error UX; részletek a header / globális error úton.\n *\n * **Canvas rendering:** az animáció `<canvas>` elemre rajzolódik, nem SVG DOM-ra.\n * Ennek köszönhetően:\n * - 0 DOM mutáció / frame (nem triggerel Angular CD-t)\n * - Glow: egyetlen `shadowBlur` (GPU-composited) a korábbi 6× `drop-shadow` filter helyett\n * - Trail/fej pozíció: JS polyline lookup (bináris keresés), nem `getPointAtLength` DOM API\n * - Subdued mód: `ctx.globalAlpha` — szinte nulla extra költség az opacity layer-hez képest\n */\n@Component({\n selector: 'app-ccap-server-unavailable-overlay',\n standalone: true,\n imports: [CommonModule, CCAP_ErrorDisplay_Component],\n templateUrl: './ccap-server-unavailable-overlay.component.html',\n styleUrls: ['./ccap-server-unavailable-overlay.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n/** CCAP_ServerUnavailableOverlay_Component class. */\nexport class CCAP_ServerUnavailableOverlay_Component {\n\n /** Session / socket állapot SSOT a main frame-mel megegyezően. */\n readonly session_DS: Session_DataService = inject(Session_DataService);\n\n private readonly _injector: Injector = inject(Injector);\n private readonly _hostRef: ElementRef<HTMLElement> = inject(ElementRef);\n\n readonly isOverlaySubdued_$ = signal<boolean>(false);\n\n /**\n * Capacitor natív környezet detekció (Android/iOS WebView).\n * Csak ebben a kontextusban van értelme a \"Szerver újrakonfigurálása\" gombnak,\n * mert a localStorage-ba mentett szerver URL-t töröljük; webes context-ben\n * a `environment.baseUrl` same-origin (nincs mit reseteln).\n */\n readonly isCapacitorNative_$ = signal<boolean>(\n typeof (window as any).Capacitor !== 'undefined'\n && (window as any).Capacitor.isNativePlatform?.() === true,\n );\n\n readonly showOverlay_$ = computed<boolean>(() => {\n const status: CCAP_SocketStatus_Type = this.session_DS.socketStatus_$();\n return status === CCAP_SocketStatus_Type.error;\n });\n\n /**\n * Aktív lane-ek — signal a tesztelhetőséghez; canvas rendering közvetlenül `_lanes`-ből dolgozik.\n * Lane hozzáadás/eltávolítás frissíti; per-frame animáció nem (0 CD trigger / frame).\n */\n readonly circuitTravelLanes_$ = signal<CCAP_CircuitCanvasLane_Interface[]>([]);\n\n /**\n * OS / böngésző „csökkentett mozgás\" — spinner CSS + RAF throttle.\n */\n readonly circuitReducedMotion_$ = signal<boolean>(false);\n\n private _laneSeq: number = 0;\n private _lanes: CCAP_CircuitCanvasLane_Interface[] = [];\n private _rafId: number | null = null;\n private _lastRafApplyMs: number | null = null;\n private _laneTeardownTimeouts: Map<string, ReturnType<typeof setTimeout>> = new Map();\n private _canvasCtx: CanvasRenderingContext2D | null = null;\n private _canvasEl: HTMLCanvasElement | null = null;\n\n /** Cached canvas méretek — resize-kor frissül; drawFrame nem olvas layout-ot. */\n private _cachedDpr: number = 1;\n private _cachedCssW: number = 1;\n private _cachedCssH: number = 1;\n\n /** Trail farok max hossz user unit-ban — resize-kor újraszámolódik. */\n private _trailMaxUserUnits: number = 50;\n\n handleToggleOverlaySubdued(): void {\n this.isOverlaySubdued_$.update((previous: boolean): boolean => {\n return !previous;\n });\n }\n\n /** Diagnosztika folyamatban van-e. */\n readonly isTestingConnection_$: WritableSignal<boolean> = signal<boolean>(false);\n\n /** Legutóbbi diagnosztika eredménye — a user inline lekérheti, anélkül hogy reset-elné a konfigot. */\n readonly diagnosticResult_$: WritableSignal<CCAP_NetworkDiagnosticResult_Interface | null> =\n signal<CCAP_NetworkDiagnosticResult_Interface | null>(null);\n\n /**\n * Kapcsolat teszt: az aktuálisan konfigurált szerver URL-re küld GET `/api/server/status`-t\n * és részletes hibát mutat (DNS / refused / timeout / SSL / CORS / HTTP status).\n * A user az overlay-ről tudja futtatni, anélkül hogy reset-elné a mentett szerver URL-t.\n */\n async handleTestConnection(): Promise<void> {\n if (this.isTestingConnection_$()) {\n return;\n }\n this.isTestingConnection_$.set(true);\n this.diagnosticResult_$.set(null);\n try {\n const result: CCAP_NetworkDiagnosticResult_Interface =\n await CCAP_NetworkDiagnostic_Util.probeServer(environment.baseUrl);\n this.diagnosticResult_$.set(result);\n } finally {\n this.isTestingConnection_$.set(false);\n }\n }\n\n /**\n * Aktuálisan konfigurált szerver URL (environment-ből) — a diagnosztika UI mutatja.\n */\n readonly configuredServerUrl_$ = signal<string>(environment.baseUrl);\n\n /**\n * Boot-idejű status fetch hiba (main.ts mentette localStorage-ba), error-display-kompatibilis\n * formátumban: `message` + `errorCode` + `additionalContent`. A shared `app-ccap-error-display`\n * rendereli (copy gomb + details, konzisztens minden más hibával).\n */\n readonly bootStatusError_$ = signal<{\n message: string;\n errorCode: string;\n additionalContent: Record<string, unknown>;\n } | null>(this.readBootStatusError());\n\n /**\n * Boot-status error olvasása localStorage-ból (main.ts a bootstrap-fázisban\n * ide ír, ha a kezdeti szerver-elérés meghiúsult).\n *\n * REQ-UI-MENU-STATE-001 (cycle 461): a `localStorage.getItem` + `JSON.parse`\n * + try/catch most a shared `Shr_LocalStoragePersistence_Util.readJson<unknown>`-en\n * megy. A shape-validation (targetUrl + errorName mezők kötelezőek) változatlan.\n */\n private readBootStatusError(): {\n message: string;\n errorCode: string;\n additionalContent: Record<string, unknown>;\n } | null {\n const parsed: unknown = Shr_LocalStoragePersistence_Util.readJson<unknown>('ccap-boot-status-error', null);\n if (\n parsed == null\n || typeof parsed !== 'object'\n || !('targetUrl' in parsed)\n || !('errorName' in parsed)\n ) {\n return null;\n }\n const p: Record<string, unknown> = parsed as Record<string, unknown>;\n const errorMessage: string = typeof p.errorMessage === 'string' ? p.errorMessage : '';\n const errorName: string = typeof p.errorName === 'string' ? p.errorName : 'unknown';\n const message: string = errorMessage\n ? `Induláskor a szerver nem válaszolt (${errorName}): ${errorMessage}`\n : `Induláskor a szerver nem válaszolt (${errorName})`;\n return {\n message: message,\n errorCode: `CCAP-NET-BOOT-${errorName.toUpperCase()}`,\n additionalContent: p,\n };\n }\n\n /**\n * Szerver URL reset: törli a localStorage-ba mentett `ccap-server-url` kulcsot,\n * majd újratölti az appot — a `main.ts` bootstrap-je újra megjeleníti a setup overlay-t,\n * és a user új IP-t / protokollt adhat meg.\n * Csak Capacitor natív context-ben van jelentése (webes same-origin nem reseteli semmit).\n *\n * REQ-UI-MENU-STATE-001 (cycle 461): a `localStorage.removeItem` + try/catch\n * most a `Shr_LocalStoragePersistence_Util.remove`-on megy. A reload mindig\n * lefut (akkor is, ha a remove silent-failel privát módban) — eredeti\n * viselkedés megőrizve.\n */\n handleResetServerUrl(): void {\n Shr_LocalStoragePersistence_Util.remove('ccap-server-url');\n this.reloadApplication();\n }\n\n /**\n * Alkalmazás újratöltése — protected wrapper tesztelhetőségért (karma spy-olható).\n */\n protected reloadApplication(): void {\n window.location.reload();\n }\n\n constructor() {\n /** Reduced-motion media query figyelés. */\n effect(\n (onCleanup): void => {\n const win: Window & typeof globalThis | undefined = globalThis.window;\n if (typeof win !== 'undefined' && typeof win.matchMedia === 'function') {\n const mq: MediaQueryList = win.matchMedia('(prefers-reduced-motion: reduce)');\n const onMqChange = (): void => {\n this.circuitReducedMotion_$.set(mq.matches);\n };\n onMqChange();\n mq.addEventListener('change', onMqChange);\n onCleanup((): void => {\n mq.removeEventListener('change', onMqChange);\n });\n }\n },\n { allowSignalWrites: true },\n );\n\n /** Overlay megjelenés → lane spawn + canvas init + RAF; eltűnés → cleanup. */\n effect(\n (onCleanup): void => {\n const isShown: boolean = this.showOverlay_$();\n if (!isShown) {\n this.stopAllAnimation();\n this.isOverlaySubdued_$.set(false);\n return;\n }\n\n const doc: Document | undefined = globalThis.document;\n const onVisibilityChange = (): void => {\n if (!doc || !doc.hidden) {\n if (this._lanes.length > 0) {\n this.ensureRafLoop();\n }\n return;\n }\n this.stopRafOnly();\n };\n if (doc) {\n doc.addEventListener('visibilitychange', onVisibilityChange);\n }\n\n /** Első lane azonnal (geometria JS-only, nincs DOM dependency). */\n this.spawnLane();\n\n /** Canvas elem DOM-ban lesz az @if renderelés után — afterNextRender megvárja. */\n afterNextRender(\n (): void => {\n if (!this.showOverlay_$()) {\n return;\n }\n this.initCanvas();\n this.ensureRafLoop();\n },\n { injector: this._injector },\n );\n\n const pollMs: number = CCAP_SOCKET_IO_RECONNECTION_DELAY_MS;\n const intervalId: ReturnType<typeof setInterval> = setInterval((): void => {\n this.spawnLane();\n }, pollMs);\n\n onCleanup((): void => {\n if (doc) {\n doc.removeEventListener('visibilitychange', onVisibilityChange);\n }\n clearInterval(intervalId);\n this.stopAllAnimation();\n });\n },\n { allowSignalWrites: true },\n );\n\n /** Resize → canvas méret + trail scale frissítés. */\n effect(\n (onCleanup): void => {\n const isShown: boolean = this.showOverlay_$();\n if (!isShown) {\n return;\n }\n const onResize = (): void => {\n this.handleResize();\n };\n globalThis.window.addEventListener('resize', onResize);\n onCleanup((): void => {\n globalThis.window.removeEventListener('resize', onResize);\n });\n },\n { allowSignalWrites: true },\n );\n }\n\n // ---------------------------------------------------------------------------\n // Lane management\n // ---------------------------------------------------------------------------\n\n /**\n * Új lane: egyedi path geometria a JS polyline generátorból, DOM-mérés nélkül.\n */\n private spawnLane(): void {\n if (!this.showOverlay_$()) {\n return;\n }\n const doc: Document | undefined = globalThis.document;\n if (doc?.hidden) {\n return;\n }\n this._laneSeq += 1;\n const seedId: number = this._laneSeq;\n const trackId: string = `lane-${seedId}`;\n const geom: CCAP_CircuitTraceGeometry_Interface = CCAP_CircuitPath_Util.buildTraceForSpawnId(seedId);\n\n const lane: CCAP_CircuitCanvasLane_Interface = {\n trackId: trackId,\n pathSeedId: seedId,\n main: geom.main,\n points: geom.mainPoints,\n totalLength: geom.totalLength,\n wallX: geom.wallX,\n wallY: geom.wallY,\n wallRippleUpEndY: geom.wallRippleUpEndY,\n wallRippleDownEndY: geom.wallRippleDownEndY,\n startTimeMs: 0,\n wallRippleActive: false,\n didScheduleRippleAndTeardown: false,\n };\n\n this._lanes.push(lane);\n const maxLanes: number = CCAP_CIRCUIT_OVERLAY_MAX_CONCURRENT_LANES;\n while (this._lanes.length > maxLanes) {\n const dropped: CCAP_CircuitCanvasLane_Interface | undefined = this._lanes.shift();\n if (dropped) {\n this.clearLaneTeardownTimer(dropped.trackId);\n }\n }\n /** Sync signal tesztelhetőséghez (lane add/remove alkalmával, nem per-frame). */\n this.circuitTravelLanes_$.set([...this._lanes]);\n this.ensureRafLoop();\n }\n\n /**\n * Ripple + buffer után lane eltávolítása.\n */\n private enqueueLaneTeardown(trackId: string): void {\n if (this._laneTeardownTimeouts.has(trackId)) {\n return;\n }\n const pauseMs: number =\n CCAP_CIRCUIT_OVERLAY_WALL_HIT_MS + CCAP_CIRCUIT_OVERLAY_SPAWN_LIFETIME_TAIL_MS;\n const timeoutId: ReturnType<typeof setTimeout> = setTimeout((): void => {\n this._laneTeardownTimeouts.delete(trackId);\n if (!this.showOverlay_$()) {\n return;\n }\n this._lanes = this._lanes.filter((l: CCAP_CircuitCanvasLane_Interface): boolean => {\n return l.trackId !== trackId;\n });\n this.circuitTravelLanes_$.set([...this._lanes]);\n }, pauseMs);\n this._laneTeardownTimeouts.set(trackId, timeoutId);\n }\n\n private clearLaneTeardownTimer(trackId: string): void {\n const existing: ReturnType<typeof setTimeout> | undefined =\n this._laneTeardownTimeouts.get(trackId);\n if (existing !== undefined) {\n clearTimeout(existing);\n this._laneTeardownTimeouts.delete(trackId);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Canvas management\n // ---------------------------------------------------------------------------\n\n /**\n * Canvas elem referencia + 2D context; resize + trail scale init.\n */\n private initCanvas(): void {\n const host: HTMLElement = this._hostRef.nativeElement;\n const canvas: HTMLCanvasElement | null = host.querySelector('canvas');\n if (!canvas) {\n return;\n }\n this._canvasEl = canvas;\n this._canvasCtx = canvas.getContext('2d');\n this.handleResize();\n }\n\n /**\n * Canvas pixel-méret frissítés (DPR-aware) + trail farok skála.\n */\n private handleResize(): void {\n const canvas: HTMLCanvasElement | null = this._canvasEl;\n if (!canvas) {\n return;\n }\n const dpr: number = globalThis.devicePixelRatio || 1;\n const cssW: number = Math.max(canvas.clientWidth, 1);\n const cssH: number = Math.max(canvas.clientHeight, 1);\n canvas.width = Math.round(cssW * dpr);\n canvas.height = Math.round(cssH * dpr);\n this._cachedDpr = dpr;\n this._cachedCssW = cssW;\n this._cachedCssH = cssH;\n // REQ-UI-007: portrait módban a path a cssH-hoz van skálázva (rotate-90 után), tehát\n // a trail-hossz számításhoz a nagyobb dimenziót használjuk, hogy a viewbox-user-unit\n // arány visszamenjen portrait-ban is.\n this.updateTrailMaxUserUnits(Math.max(cssW, cssH));\n }\n\n /**\n * Trail farok max hossz user unit-ban (cm → px → viewBox unit konverzió).\n */\n private updateTrailMaxUserUnits(cssW: number): void {\n const widthPx: number = Math.max(cssW, 1);\n const tailTargetPx: number = CCAP_CIRCUIT_OVERLAY_TRAIL_TAIL_TARGET_CM * CM_TO_CSS_PX;\n this._trailMaxUserUnits = (tailTargetPx / widthPx) * VIEWBOX_W;\n }\n\n // ---------------------------------------------------------------------------\n // RAF loop\n // ---------------------------------------------------------------------------\n\n /**\n * Globális RAF loop: lane állapot frissítés + canvas rajzolás.\n * Lane state update canvas context nélkül is fut (tesztelhetőség).\n */\n private ensureRafLoop(): void {\n if (this._rafId !== null) {\n return;\n }\n const doc: Document | undefined = globalThis.document;\n if (doc?.hidden) {\n return;\n }\n\n const step = (rafTimestamp: number): void => {\n const docRef: Document | undefined = globalThis.document;\n if (docRef?.hidden) {\n this.stopRafOnly();\n return;\n }\n if (!this.showOverlay_$()) {\n this.stopRafOnly();\n return;\n }\n if (this._lanes.length === 0) {\n this.stopRafOnly();\n return;\n }\n /** Reduced-motion RAF ritkítás (~30 Hz). */\n if (this.circuitReducedMotion_$()) {\n const minIv: number = CCAP_CIRCUIT_OVERLAY_RAF_MIN_INTERVAL_MS_REDUCED_MOTION;\n if (this._lastRafApplyMs !== null && rafTimestamp - this._lastRafApplyMs < minIv) {\n this._rafId = requestAnimationFrame(step);\n return;\n }\n }\n this._lastRafApplyMs = rafTimestamp;\n\n /** Lane arming: `startTimeMs === 0` → ebben a keretben indít (RAF timestamp szinkron). */\n for (const lane of this._lanes) {\n if (lane.startTimeMs === 0) {\n lane.startTimeMs = rafTimestamp;\n }\n }\n\n /** Lane állapot frissítés: ripple + teardown ütemezés. */\n for (const lane of this._lanes) {\n if (lane.startTimeMs === 0) {\n continue;\n }\n const elapsed: number = rafTimestamp - lane.startTimeMs;\n if (!lane.didScheduleRippleAndTeardown) {\n const rippleThreshold: number =\n CCAP_CIRCUIT_OVERLAY_MAIN_MS + CCAP_CIRCUIT_OVERLAY_HEAD_HIDE_BEFORE_RIPPLE_MS;\n if (elapsed >= rippleThreshold) {\n lane.wallRippleActive = true;\n lane.didScheduleRippleAndTeardown = true;\n this.enqueueLaneTeardown(lane.trackId);\n }\n }\n }\n\n /** Canvas frame rajzolás (opcionális — teszt környezetben lehet null). */\n this.drawFrame(rafTimestamp);\n\n /** Továbbfutás: bármely lane még animál? */\n const idleThresholdMs: number =\n CCAP_CIRCUIT_OVERLAY_MAIN_MS + CCAP_CIRCUIT_OVERLAY_TRAIL_WALL_ABSORB_MS + 48;\n const anyAnimating: boolean = this._lanes.some(\n (lane: CCAP_CircuitCanvasLane_Interface): boolean => {\n if (lane.startTimeMs === 0) {\n return false;\n }\n return rafTimestamp - lane.startTimeMs < idleThresholdMs;\n },\n );\n if (anyAnimating) {\n this._rafId = requestAnimationFrame(step);\n } else {\n this._rafId = null;\n }\n };\n\n this._rafId = requestAnimationFrame(step);\n }\n\n private stopRafOnly(): void {\n if (this._rafId !== null) {\n cancelAnimationFrame(this._rafId);\n this._rafId = null;\n }\n this._lastRafApplyMs = null;\n }\n\n private stopAllAnimation(): void {\n this.stopRafOnly();\n this._laneTeardownTimeouts.forEach((tid: ReturnType<typeof setTimeout>): void => {\n clearTimeout(tid);\n });\n this._laneTeardownTimeouts.clear();\n this._lanes = [];\n this.circuitTravelLanes_$.set([]);\n this._laneSeq = 0;\n this._canvasCtx = null;\n this._canvasEl = null;\n }\n\n // ---------------------------------------------------------------------------\n // Canvas drawing\n // ---------------------------------------------------------------------------\n\n /**\n * Teljes frame rajzolás: clear → lane-ek → subdued alpha.\n * REQ-UI-007: portrait módban (cssH > cssW) a canvas-t -90°-kal forgatjuk és a nagyobb\n * dimenzióhoz igazítjuk a scale-t, így a pöttyök LTR helyett **lentről fölfelé** haladnak.\n */\n private drawFrame(now: number): void {\n const ctx: CanvasRenderingContext2D | null = this._canvasCtx;\n if (!ctx) {\n return;\n }\n /** Cached méretek — nincs layout query a hot path-on. */\n const dpr: number = this._cachedDpr;\n const cssW: number = this._cachedCssW;\n const cssH: number = this._cachedCssH;\n\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, cssW, cssH);\n\n const isPortrait: boolean = cssH > cssW;\n\n let scale: number;\n let offsetY: number;\n if (isPortrait) {\n // Rotate -90° CCW so input +X becomes output +Y(up). Origin shift (0, cssH) places\n // the rotated frame's left edge at the bottom of the viewport.\n ctx.translate(0, cssH);\n ctx.rotate(-Math.PI / 2);\n // Post-rotation: effective drawing area is cssH × cssW. Scale to the larger side.\n scale = cssH / VIEWBOX_W;\n offsetY = (cssW - VIEWBOX_W * scale) / 2;\n } else {\n /** ViewBox 0-100 → canvas CSS pixel: uniform scale + Y center offset. */\n scale = cssW / VIEWBOX_W;\n offsetY = (cssH - VIEWBOX_W * scale) / 2;\n }\n\n ctx.save();\n if (this.isOverlaySubdued_$()) {\n ctx.globalAlpha = 0.38;\n }\n\n for (const lane of this._lanes) {\n if (lane.startTimeMs === 0) {\n continue;\n }\n this.drawLane(ctx, lane, now, scale, offsetY);\n }\n\n ctx.restore();\n }\n\n /**\n * Egy lane teljes vizuális állapota: trail + fej + wall ripple.\n */\n private drawLane(\n ctx: CanvasRenderingContext2D,\n lane: CCAP_CircuitCanvasLane_Interface,\n now: number,\n scale: number,\n offsetY: number,\n ): void {\n const elapsed: number = now - lane.startTimeMs;\n const mainMs: number = CCAP_CIRCUIT_OVERLAY_MAIN_MS;\n\n let headDist: number;\n let isHeadVisible: boolean;\n let tailMaxScale: number;\n\n if (elapsed < mainMs) {\n isHeadVisible = true;\n /** Uniform screen speed: uniform scale → user-space lineáris = pixel-lineáris. */\n headDist = (elapsed / mainMs) * lane.totalLength;\n tailMaxScale = 1;\n } else {\n isHeadVisible = false;\n headDist = lane.totalLength;\n const absorbElapsed: number = elapsed - mainMs;\n if (absorbElapsed < CCAP_CIRCUIT_OVERLAY_TRAIL_WALL_ABSORB_MS) {\n const uAbs: number = absorbElapsed / CCAP_CIRCUIT_OVERLAY_TRAIL_WALL_ABSORB_MS;\n /** ease-in zsugorodás (gyorsuló). */\n tailMaxScale = Math.max(0, 1 - uAbs * uAbs);\n } else {\n tailMaxScale = 0;\n }\n }\n\n /** Trail rajzolás — absorb fázisban a zsugorodással együtt halványul. */\n if (tailMaxScale > 0 && lane.points.length >= 2) {\n const tailLen: number = this._trailMaxUserUnits * tailMaxScale;\n const trailStart: number = Math.max(0, headDist - tailLen);\n this.drawTrail(ctx, lane.points, trailStart, headDist, scale, offsetY, tailMaxScale);\n }\n\n /** Fej rajzolás. */\n if (isHeadVisible) {\n const headPt: { x: number; y: number } = CCAP_CircuitPath_Util.getPointAtDistance(\n lane.points,\n headDist,\n );\n this.drawHead(ctx, headPt.x, headPt.y, scale, offsetY);\n }\n\n /** Wall ripple rajzolás. */\n if (lane.wallRippleActive) {\n const rippleStartMs: number = mainMs + CCAP_CIRCUIT_OVERLAY_HEAD_HIDE_BEFORE_RIPPLE_MS;\n const rippleElapsed: number = elapsed - rippleStartMs;\n if (rippleElapsed >= 0 && rippleElapsed <= CCAP_CIRCUIT_OVERLAY_WALL_HIT_MS) {\n this.drawWallRipple(ctx, lane, rippleElapsed, scale, offsetY);\n }\n }\n }\n\n /**\n * Trail: polyline szegmens [startDist, endDist] gradienssel (farok halvány → fej erős).\n * `opacity`: 1 = teljes fényerő (főút közben); absorb fázisban 1→0 a zsugorodással együtt.\n */\n private drawTrail(\n ctx: CanvasRenderingContext2D,\n points: CCAP_CircuitPolylinePoint_Interface[],\n startDist: number,\n endDist: number,\n scale: number,\n offsetY: number,\n opacity: number,\n ): void {\n if (endDist - startDist < 0.01 || points.length < 2) {\n return;\n }\n const startPt: { x: number; y: number } = CCAP_CircuitPath_Util.getPointAtDistance(\n points,\n startDist,\n );\n const endPt: { x: number; y: number } = CCAP_CircuitPath_Util.getPointAtDistance(\n points,\n endDist,\n );\n\n const sx: number = startPt.x * scale;\n const sy: number = startPt.y * scale + offsetY;\n const ex: number = endPt.x * scale;\n const ey: number = endPt.y * scale + offsetY;\n\n /** Linear gradient: faroktól (halvány) a fejig (erős) — azonos paletta, mint a korábbi SVG linearGradient. */\n const grad: CanvasGradient = ctx.createLinearGradient(sx, sy, ex, ey);\n grad.addColorStop(0, 'rgba(34, 211, 238, 0.1)');\n grad.addColorStop(0.48, 'rgba(56, 189, 248, 0.52)');\n grad.addColorStop(1, 'rgba(165, 243, 252, 0.98)');\n\n ctx.save();\n ctx.globalAlpha = ctx.globalAlpha * opacity;\n ctx.strokeStyle = grad;\n ctx.lineWidth = 0.26 * scale;\n ctx.lineCap = 'butt';\n ctx.lineJoin = 'round';\n\n ctx.beginPath();\n ctx.moveTo(sx, sy);\n\n /** Köztes polyline pontok a [startDist, endDist] tartományban. */\n for (let i: number = 0; i < points.length; i++) {\n if (points[i].cumLen <= startDist) {\n continue;\n }\n if (points[i].cumLen >= endDist) {\n break;\n }\n ctx.lineTo(points[i].x * scale, points[i].y * scale + offsetY);\n }\n\n ctx.lineTo(ex, ey);\n ctx.stroke();\n ctx.restore();\n }\n\n /**\n * Travel fej: kör + radial gradient + `shadowBlur` glow (egyetlen GPU-composited réteg).\n */\n private drawHead(\n ctx: CanvasRenderingContext2D,\n vx: number,\n vy: number,\n scale: number,\n offsetY: number,\n ): void {\n const px: number = vx * scale;\n const py: number = vy * scale + offsetY;\n const radius: number = Math.max(0.38 * scale, 0.5);\n\n ctx.save();\n /** Egyetlen `shadowBlur` réteg — GPU-composited; nem 6× drop-shadow. */\n ctx.shadowBlur = Math.max(1.2 * scale, 2);\n ctx.shadowColor = 'rgba(34, 211, 238, 0.7)';\n\n /** Radial gradient: fehér core → cyan rim (eredeti SVG paletta). */\n const headGrad: CanvasGradient = ctx.createRadialGradient(px, py, 0, px, py, radius);\n headGrad.addColorStop(0, 'rgba(255, 255, 255, 1)');\n headGrad.addColorStop(0.42, 'rgba(186, 230, 254, 1)');\n headGrad.addColorStop(1, 'rgba(56, 189, 248, 1)');\n\n ctx.fillStyle = headGrad;\n ctx.beginPath();\n ctx.arc(px, py, radius, 0, Math.PI * 2);\n ctx.fill();\n ctx.restore();\n }\n\n /**\n * Wall ripple: két rövid függőleges vonal (fel + le) draw-in animáció + opacity fade.\n * CSS `ease-out` ≈ `1 − (1−t)²`; keyframe opacity: 0→0.85→0.5→0.\n */\n private drawWallRipple(\n ctx: CanvasRenderingContext2D,\n lane: CCAP_CircuitCanvasLane_Interface,\n rippleElapsed: number,\n scale: number,\n offsetY: number,\n ): void {\n const wallHitMs: number = CCAP_CIRCUIT_OVERLAY_WALL_HIT_MS;\n const t: number = Math.min(rippleElapsed / wallHitMs, 1);\n /** CSS ease-out approximáció: gyorsan indul, lassan ér véget. */\n const p: number = 1 - (1 - t) * (1 - t);\n\n /** Keyframe interpolált opacity (progress `p` mentén): 0%→0, 10%→0.85, 30%→0.5, 100%→0. */\n let opacity: number;\n if (p < 0.1) {\n opacity = (p / 0.1) * 0.85;\n } else if (p < 0.3) {\n opacity = 0.85 + ((p - 0.1) / (0.3 - 0.1)) * (0.5 - 0.85);\n } else {\n opacity = 0.5 * (1 - (p - 0.3) / (1 - 0.3));\n }\n if (opacity < 0.005) {\n return;\n }\n\n const wx: number = lane.wallX * scale;\n const wy: number = lane.wallY * scale + offsetY;\n const upEndY: number = lane.wallRippleUpEndY * scale + offsetY;\n const downEndY: number = lane.wallRippleDownEndY * scale + offsetY;\n\n ctx.save();\n ctx.globalAlpha = ctx.globalAlpha * opacity;\n ctx.lineWidth = 0.36 * scale;\n ctx.lineCap = 'butt';\n\n /** Ripple glow — a trail fejéhez illeszkedő erősségű. */\n ctx.shadowBlur = Math.max(0.8 * scale, 2);\n ctx.shadowColor = 'rgba(34, 211, 238, 0.6)';\n\n /** Fel + le ripple: azonos logika, eltérő szín és irány. */\n const ripples: { endY: number; color: string }[] = [\n { endY: upEndY, color: 'rgb(56, 189, 248)' },\n { endY: downEndY, color: 'rgb(34, 211, 238)' },\n ];\n for (const ripple of ripples) {\n ctx.strokeStyle = ripple.color;\n ctx.beginPath();\n ctx.moveTo(wx, wy);\n ctx.lineTo(wx, wy + (ripple.endY - wy) * p);\n ctx.stroke();\n }\n\n ctx.restore();\n }\n}\n", "@if (showOverlay_$()) {\n <div class=\"absolute inset-0 flex items-center justify-center pointer-events-none\">\n <div class=\"ccap-server-unavailable-dim-stack absolute inset-0 z-0 flex flex-col items-center justify-center\"\n [class.ccap-server-unavailable-dim-stack--subdued]=\"isOverlaySubdued_$()\"\n [class.ccap-circuit--reduced-motion]=\"circuitReducedMotion_$()\">\n <div class=\"ccap-server-unavailable-scrim absolute inset-0 z-0\"\n [class.ccap-server-unavailable-scrim--subdued]=\"isOverlaySubdued_$()\"\n aria-hidden=\"true\"></div>\n <canvas class=\"ccap-circuit-canvas absolute inset-0 z-0 pointer-events-none\"\n aria-hidden=\"true\"></canvas>\n @if (!isOverlaySubdued_$()) {\n <div class=\"relative z-[2] px-4 max-w-[min(520px,calc(100vw-2rem))] w-full flex justify-center isolation isolate\"\n role=\"status\"\n aria-live=\"polite\">\n <div class=\"ccap-server-unavailable-status pointer-events-auto flex flex-col items-center gap-4 rounded-xl\n border border-neonCyan/30 bg-neutral-950/86 px-6 py-5 shadow-xl w-full sm:w-auto backdrop-blur-md\">\n <span class=\"inline-block w-10 h-10 shrink-0 animate-spin rounded-full border-2 border-neonCyan/50\n border-t-neonCyan\"\n aria-hidden=\"true\"></span>\n <div class=\"text-center max-w-[min(480px,calc(100vw-4rem))]\">\n <p class=\"text-lg font-semibold text-neutral-100\">Server unavailable</p>\n <p class=\"text-sm text-neutral-400 mt-1\">\n Use the status control in the header to reconnect.\n </p>\n @if (isCapacitorNative_$()) {\n <p class=\"text-[11px] font-mono text-neutral-500 mt-2 break-all\">\n {{ configuredServerUrl_$() }}\n </p>\n @if (bootStatusError_$(); as bootErr) {\n <div class=\"mt-2 text-left pointer-events-auto\">\n <app-ccap-error-display\n [error]=\"bootErr\"\n sourceLabelOverride=\"Indulási szerver probe\" />\n </div>\n }\n <div class=\"flex flex-wrap justify-center gap-2 mt-3\">\n <button type=\"button\"\n [disabled]=\"isTestingConnection_$()\"\n class=\"rounded-md border border-neonCyan/60 bg-neonCyan/15 px-3 py-1.5 text-xs font-medium\n text-neonCyan hover:bg-neonCyan/25 transition-colors pointer-events-auto\n disabled:opacity-40 disabled:cursor-not-allowed\"\n (click)=\"handleTestConnection()\">\n @if (isTestingConnection_$()) {\n Teszt…\n } @else {\n Kapcsolat teszt\n }\n </button>\n <button type=\"button\"\n class=\"rounded-md border border-neonCyan/60 bg-neonCyan/15 px-3 py-1.5 text-xs font-medium\n text-neonCyan hover:bg-neonCyan/25 transition-colors pointer-events-auto\"\n (click)=\"handleResetServerUrl()\">\n Szerver újrakonfigurálása\n </button>\n </div>\n @if (diagnosticResult_$(); as result) {\n @if (result.isSuccess) {\n <div class=\"mt-3 rounded-md border border-emerald-500/60 bg-emerald-500/10 px-3 py-2 text-[11px]\n text-emerald-200 text-left pointer-events-auto\">\n <div class=\"font-semibold mb-1\">✓ Szerver elérhető</div>\n <div class=\"font-mono text-[10px] text-neutral-400 break-all\">\n GET {{ result.targetUrl }} — {{ result.durationMs }}ms\n </div>\n </div>\n } @else if (result.errorForDisplay) {\n <div class=\"mt-3 text-left pointer-events-auto\">\n <app-ccap-error-display\n [error]=\"result.errorForDisplay\"\n sourceLabelOverride=\"Kapcsolat teszt\" />\n </div>\n }\n }\n }\n </div>\n <button type=\"button\"\n class=\"ccap-server-unavailable-overlay-dim-toggle pointer-events-auto shrink-0 rounded-md border\n border-neonCyan/60 bg-neutral-900/85 px-3 py-1.5 text-xs font-medium text-neutral-200 shadow-md\n hover:border-neonCyan hover:bg-neutral-900 hover:text-neutral-50\n focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2\n focus-visible:outline-neonCyan backdrop-blur-sm\"\n aria-label=\"Toggle dimming of the server unavailable overlay\"\n (click)=\"handleToggleOverlaySubdued()\">\n Dim overlay\n </button>\n </div>\n </div>\n } @else {\n <button type=\"button\"\n class=\"ccap-server-unavailable-overlay-dim-toggle ccap-server-unavailable-overlay-dim-toggle--subdued\n pointer-events-auto absolute top-3 left-3 z-[2] shrink-0 rounded-md border\n border-neonCyan/60 bg-neutral-900/85 px-3 py-1.5 text-xs font-medium text-neutral-200 shadow-md\n hover:border-neonCyan hover:bg-neutral-900 hover:text-neutral-50\n focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2\n focus-visible:outline-neonCyan\"\n aria-label=\"Toggle dimming of the server unavailable overlay\"\n (click)=\"handleToggleOverlaySubdued()\">\n Full overlay\n </button>\n }\n </div>\n </div>\n}\n", "import { afterNextRender, Component, computed, inject, signal } from '@angular/core';\n\nimport { UserInput_DataService } from '../../_services/user-input.data-service';\n\n/**\n * Ennyi px elmozdulás pointerdown után indul a FAB drag (long-press nélkül);\n * capture miatt a kurzor mehet a gombon kívülre is.\n */\nconst CCAP_USER_INPUT_FAB_DRAG_START_THRESHOLD_PX: number = 8;\n\n/**\n * Quick Input FAB (Floating Action Button) komponens.\n * Lenyomás + kis elmozdulás → drag a main területen belül (localStorage); rövid katt → panel toggle.\n */\n@Component({\n selector: 'app-ccap-user-input-fab',\n standalone: true,\n templateUrl: './uin-fab.component.html',\n styles: [`\n :host {\n display: contents;\n }\n `],\n})\n/** UIn_Fab_Component class. */\nexport class UIn_Fab_Component {\n\n readonly userInput_DS: UserInput_DataService = inject(UserInput_DataService);\n\n /** User request-ek száma a badge-hez (jelenleg nincs feldolgozás, 0-t mutatunk). */\n readonly activeCount_$ = computed((): number => 0);\n\n /**\n * Aktív pointer drag: vizuális visszajelzéshez (cursor, scale).\n * A `touch-action: none` mindig aktív a gombon (böngésző a pointerdown pillanatában értékeli).\n */\n readonly isDraggingFab_$ = signal<boolean>(false);\n\n private pointerDownClientX: number = 0;\n\n private pointerDownClientY: number = 0;\n\n private dragStartRightPx: number = 0;\n\n private dragStartBottomPx: number = 0;\n\n private dragStartClientX: number = 0;\n\n private dragStartClientY: number = 0;\n\n private isPointerDragging: boolean = false;\n\n /**\n * true a primary button pointerdown és pointerup között — nélküle a pointermove hoveren\n * (0,0) referenciával tévesen indítana drag-et.\n */\n private isPrimaryButtonDownOnFab: boolean = false;\n\n /** Drag után a szintetizált click elnyelése. */\n private suppressNextFabClick: boolean = false; // ccap-review-disable-line boolean-is-prefix\n\n private activePointerId: number | null = null;\n\n /** Pointer capture és release a gomb DOM elemén. */\n private fabButtonElement: HTMLElement | null = null;\n\n constructor() {\n afterNextRender((): void => {\n const mainEl: HTMLElement | null = this.getMainElement();\n if (mainEl !== null) {\n this.userInput_DS.clampFabOffsetsToMain(mainEl);\n }\n });\n }\n\n /**\n * FAB kattintás: toggle, kivéve drag utáni suppress esetén.\n */\n handleFabClick(event: Event): void {\n if (this.suppressNextFabClick) {\n event.preventDefault();\n event.stopPropagation();\n this.suppressNextFabClick = false;\n return;\n }\n this.userInput_DS.togglePanel();\n }\n\n /**\n * Pointer down: kezdőpont drag küszöbhöz.\n */\n handleFabPointerDown(event: PointerEvent): void {\n if (event.button !== 0) {\n return;\n }\n this.fabButtonElement = event.currentTarget instanceof HTMLElement ? event.currentTarget : null;\n this.isPrimaryButtonDownOnFab = true;\n this.pointerDownClientX = event.clientX;\n this.pointerDownClientY = event.clientY;\n this.isPointerDragging = false;\n }\n\n /**\n * Pointer move: küszöb felett drag indul + capture; aktív drag alatt offset frissítés.\n */\n handleFabPointerMove(event: PointerEvent): void {\n if (this.isPointerDragging) {\n this.applyFabPointerDragMove(event);\n return;\n }\n // Hover / gomb nélküli move: ne hasonlítsuk (0,0)-hoz — csak lenyomott primary után indulhat drag.\n if (!this.isPrimaryButtonDownOnFab) {\n return;\n }\n // Egér: ha a gomb már nincs lenyomva (elveszett up), ne induljon drag.\n if (event.pointerType === 'mouse' && (event.buttons & 1) !== 1) {\n return;\n }\n const moveDx: number = event.clientX - this.pointerDownClientX;\n const moveDy: number = event.clientY - this.pointerDownClientY;\n const moveDist: number = Math.hypot(moveDx, moveDy);\n if (moveDist > CCAP_USER_INPUT_FAB_DRAG_START_THRESHOLD_PX) {\n this.beginFabPointerDrag(event);\n }\n if (!this.isPointerDragging) {\n return;\n }\n this.applyFabPointerDragMove(event);\n }\n\n /**\n * Aktív drag: offset frissítés a main-hez képest.\n */\n private applyFabPointerDragMove(event: PointerEvent): void {\n if (!this.isPointerDragging) {\n return;\n }\n const deltaX: number = event.clientX - this.dragStartClientX;\n const deltaY: number = event.clientY - this.dragStartClientY;\n const nextRightPx: number = this.dragStartRightPx - deltaX;\n const nextBottomPx: number = this.dragStartBottomPx - deltaY;\n const mainEl: HTMLElement | null = this.getMainElement();\n if (mainEl === null) {\n return;\n }\n this.userInput_DS.setFabOffsetsClampedToMain({\n mainEl: mainEl,\n rightPx: nextRightPx,\n bottomPx: nextBottomPx,\n });\n }\n\n /**\n * Pointer up / cancel: drag lezárás (snap + persist) vagy semmi.\n */\n handleFabPointerUp(event: PointerEvent): void {\n if (this.isPointerDragging) {\n this.endFabPointerDrag(event);\n return;\n }\n this.isPrimaryButtonDownOnFab = false;\n this.fabButtonElement = null;\n }\n\n /**\n * Pointer cancel ugyanaz mint up a cleanup-hoz.\n */\n handleFabPointerCancel(event: PointerEvent): void {\n this.handleFabPointerUp(event);\n }\n\n private beginFabPointerDrag(event: PointerEvent): void {\n const mainEl: HTMLElement | null = this.getMainElement();\n if (mainEl === null) {\n return;\n }\n this.isPointerDragging = true;\n this.isDraggingFab_$.set(true);\n this.dragStartRightPx = this.userInput_DS.fabOffsetRightPx_$();\n this.dragStartBottomPx = this.userInput_DS.fabOffsetBottomPx_$();\n this.dragStartClientX = event.clientX;\n this.dragStartClientY = event.clientY;\n this.activePointerId = event.pointerId;\n if (this.fabButtonElement !== null) {\n this.fabButtonElement.setPointerCapture(event.pointerId);\n }\n }\n\n private endFabPointerDrag(_event: PointerEvent): void {\n const mainEl: HTMLElement | null = this.getMainElement();\n if (this.activePointerId !== null && this.fabButtonElement !== null) {\n try {\n this.fabButtonElement.releasePointerCapture(this.activePointerId);\n } catch {\n // capture már elengedve — ignoráljuk.\n }\n }\n this.activePointerId = null;\n this.isPointerDragging = false;\n this.isDraggingFab_$.set(false);\n this.suppressNextFabClick = true;\n if (mainEl !== null) {\n this.userInput_DS.finalizeFabDragPosition(mainEl);\n }\n this.isPrimaryButtonDownOnFab = false;\n this.fabButtonElement = null;\n }\n\n /**\n * Quick Input anchor `<main>` — app-root shell-ben nincs `main` ős; SSOT: `document.querySelector('main')`\n * (ugyanaz a modell, mint a `UserInput_DataService` window resize handler).\n */\n private getMainElement(): HTMLElement | null {\n if (typeof document === 'undefined') {\n return null;\n }\n return document.querySelector('main');\n }\n}\n", "<!-- Quick Input FAB: wrapper pozíció a DS offset-jeivel; long-press + drag a gombon -->\n<div class=\"absolute z-[10050] pointer-events-auto\"\n [style.right.px]=\"userInput_DS.fabOffsetRightPx_$()\"\n [style.bottom.px]=\"userInput_DS.fabOffsetBottomPx_$()\">\n <button type=\"button\"\n class=\"relative w-12 h-12 flex items-center justify-center\n rounded-full bg-ccapAccent text-neutral-900 shadow-lg\n hover:bg-ccapAccent/80 hover:shadow-xl transition-all duration-200\n focus:outline-none focus:ring-2 focus:ring-ccapAccent/50\n touch-none\"\n (click)=\"handleFabClick($event)\"\n (pointerdown)=\"handleFabPointerDown($event)\"\n (pointermove)=\"handleFabPointerMove($event)\"\n (pointerup)=\"handleFabPointerUp($event)\"\n (pointercancel)=\"handleFabPointerCancel($event)\"\n [title]=\"userInput_DS.isPanelOpen_$() ? 'Quick Input panel bezárása' : 'Quick Input megnyitása; húzás: mozdítsd el a gombot lenyomva'\"\n aria-label=\"Quick Input panel megnyitása vagy bezárása\">\n <!-- Chat ikon SVG -->\n <svg class=\"w-6 h-6 pointer-events-none\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z\"/>\n </svg>\n\n <!-- Badge: aktív feldolgozások száma -->\n @if (activeCount_$() > 0) {\n <span class=\"absolute -top-1 -right-1 w-5 h-5 flex items-center justify-center\n rounded-full bg-neonCyan text-neutral-900 text-xs font-bold\n animate-pulse pointer-events-none\">\n {{ activeCount_$() }}\n </span>\n }\n </button>\n</div>\n", "/**\n * Area `<select>` „Egyéni…” opció értéke — nem lehet üres string, hogy megkülönböztessük a „nincs area”-tól.\n */\nexport const UIn_QUICK_INPUT_AREA_CUSTOM_SELECT_VALUE: string = '__ccap-quick-input-area-custom__';\n", "/**\n * Quick Input panel vízszintes igazítása a FAB-hoz képest (gt-xs).\n */\nexport enum UIn_QuickInputPanelHorizontalAnchor_Type {\n alignPanelRightEdgeToFabRight = 'align-panel-right-edge-to-fab-right',\n openPanelToRightOfFab = 'open-panel-to-right-of-fab',\n}\n", "/**\n * Quick Input panel függőleges igazítása a FAB-hoz képest.\n */\nexport enum UIn_QuickInputPanelVerticalAnchor_Type {\n panelAboveFab = 'panel-above-fab',\n panelBelowFab = 'panel-below-fab',\n}\n", "import { UIn_FabPosition_Util } from './uin-fab-position.util';\nimport { UIn_QuickInputPanelHorizontalAnchor_Type } from '../_enums/uin-quick-input-panel-placement.enum';\nimport { UIn_QuickInputPanelVerticalAnchor_Type } from '../_enums/uin-quick-input-panel-vertical-anchor.type-enum';\n\n/**\n * Quick Input overlay panel abszolút pozíciója a main-ben: FAB quadrant + xs gt-xs viselkedés.\n */\nexport class UIn_PanelAnchor_Util {\n\n /**\n * Vízszintes anchor: FAB a main bal felén → panel jobbra nyílik; egyébként jobb szél egyeztetés.\n */\n static resolveHorizontalAnchorType(input: {\n mainWidthPx: number;\n fabOffsetRightPx: number;\n }): UIn_QuickInputPanelHorizontalAnchor_Type {\n const mainW: number = input.mainWidthPx;\n const fabSize: number = UIn_FabPosition_Util.fabSizePx;\n const fabLeftPx: number = mainW - input.fabOffsetRightPx - fabSize;\n const fabCenterX: number = fabLeftPx + fabSize / 2;\n if (fabCenterX < mainW / 2) {\n return UIn_QuickInputPanelHorizontalAnchor_Type.openPanelToRightOfFab;\n }\n return UIn_QuickInputPanelHorizontalAnchor_Type.alignPanelRightEdgeToFabRight;\n }\n\n /**\n * Függőleges anchor: FAB a main felső felén → panel alatta; egyébként a FAB felett.\n */\n static resolveVerticalAnchorType(input: {\n mainHeightPx: number;\n fabOffsetBottomPx: number;\n }): UIn_QuickInputPanelVerticalAnchor_Type {\n const mainH: number = input.mainHeightPx;\n const fabSize: number = UIn_FabPosition_Util.fabSizePx;\n const fabTopFromTopPx: number = mainH - input.fabOffsetBottomPx - fabSize;\n const fabCenterYFromTopPx: number = fabTopFromTopPx + fabSize / 2;\n if (fabCenterYFromTopPx < mainH / 2) {\n return UIn_QuickInputPanelVerticalAnchor_Type.panelBelowFab;\n }\n return UIn_QuickInputPanelVerticalAnchor_Type.panelAboveFab;\n }\n\n /** Panel szélétől ennyi px margó a container széléig (top/bottom irányban). */\n private static readonly panelEdgeMarginPx: number = 8;\n\n /**\n * `ngStyle` / inline style objektum a panel root div-hez.\n * **Mindkét** irány (top + bottom) mindig beállított — a panel kitölti a FAB és a container széle\n * közötti teret, biztosítva hogy a textarea mindig látható és a lista scrollozható.\n */\n static buildPanelOverlayStyles(input: {\n mainWidthPx: number;\n mainHeightPx: number;\n fabOffsetRightPx: number;\n fabOffsetBottomPx: number;\n isMobileXs: boolean;\n }): Record<string, string> {\n const mainW: number = input.mainWidthPx;\n const mainH: number = input.mainHeightPx;\n const fabSize: number = UIn_FabPosition_Util.fabSizePx;\n const gap: number = UIn_FabPosition_Util.fabPanelGapPx;\n const rightOff: number = input.fabOffsetRightPx;\n const bottomOff: number = input.fabOffsetBottomPx;\n const edgeM: number = UIn_PanelAnchor_Util.panelEdgeMarginPx;\n\n // Első frame / hiányzó main méret: korábbi default.\n if (mainW <= 0 || mainH <= 0) {\n const fallback: Record<string, string> = {\n bottom: `${bottomOff + fabSize + gap}px`,\n top: `${edgeM}px`,\n };\n if (!input.isMobileXs) {\n fallback.right = `${rightOff}px`;\n fallback.left = 'auto';\n }\n return fallback;\n }\n\n const vertical: UIn_QuickInputPanelVerticalAnchor_Type =\n UIn_PanelAnchor_Util.resolveVerticalAnchorType({\n mainHeightPx: mainH,\n fabOffsetBottomPx: bottomOff,\n });\n\n const styles: Record<string, string> = {};\n\n // Mindkét irány beállított: panel kitölti a FAB és a container széle közötti teret.\n if (vertical === UIn_QuickInputPanelVerticalAnchor_Type.panelBelowFab) {\n const fabTopFromTopPx: number = mainH - bottomOff - fabSize;\n styles.top = `${fabTopFromTopPx + fabSize + gap}px`;\n styles.bottom = `${edgeM}px`;\n } else {\n styles.bottom = `${bottomOff + fabSize + gap}px`;\n styles.top = `${edgeM}px`;\n }\n\n if (input.isMobileXs) {\n return styles;\n }\n\n // Desktop: horizontális pozíció is beállított.\n const horizontal: UIn_QuickInputPanelHorizontalAnchor_Type =\n UIn_PanelAnchor_Util.resolveHorizontalAnchorType({\n mainWidthPx: mainW,\n fabOffsetRightPx: rightOff,\n });\n if (horizontal === UIn_QuickInputPanelHorizontalAnchor_Type.openPanelToRightOfFab) {\n const fabLeftPx: number = mainW - rightOff - fabSize;\n styles.left = `${fabLeftPx + fabSize + gap}px`;\n styles.right = 'auto';\n } else {\n styles.right = `${rightOff}px`;\n styles.left = 'auto';\n }\n\n return styles;\n }\n}\n", "import { Component, computed, effect, ElementRef, inject, OnInit, signal, ViewChild } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\n\nimport {\n PM_QuickInputPredictedType_Type,\n PM_QuickInputStatus_Type,\n PM_Priority_Type,\n} from '@server-enums';\nimport { CCAP_VoiceRecordButton_Component } from '../../../../_components/ccap-voice-record-button/ccap-voice-record-button.component';\nimport { ClaudeCode_DataService } from '../../../external-sessions/_modules/claude-code/_services/claude-code.data-service';\nimport { CC_ListItem_Interface } from '../../../external-sessions/_modules/claude-code/_models/interfaces/cc-list-item.interface';\nimport { ExS_NewAgentWorkspace_DataService } from '../../../external-sessions/_services/exs-new-agent-workspace.data-service';\nimport { S_Modal_Component } from '../../../shared/_components/s-modal/s-modal.component';\nimport { CCAP_RelativeTime_Pipe } from '../../../../_pipes/ccap-relative-time.pipe';\nimport { CCAP_GlobalError_ControlService } from '../../../../_services/control-services/ccap-global-error.control-service';\nimport { UIn_QuickInputAreaCatalog_Util } from '../../_collections/utils/quick-input/uin-quick-input-area-catalog.util';\nimport { UIn_QUICK_INPUT_AREA_CUSTOM_SELECT_VALUE } from '../../_collections/consts/quick-input/uin-quick-input-area-custom-select.const';\nimport { UIn_QuickInputComposerDraft_Util } from '../../_collections/utils/quick-input/uin-quick-input-composer-draft.util';\nimport { UIn_PanelAnchor_Util } from '../../_collections/uin-panel-anchor.util';\nimport { Shr_LocalStoragePersistence_Util } from '../../../shared/_collections/utils/storage/shr-local-storage-persistence.util';\nimport { UIn_QuickInputAreaCatalogEntry_Interface } from '../../_models/interfaces/uin-quick-input-area-catalog-entry.interface';\nimport { CCAP_UserInputListItem_Interface } from '../../../../_models/interfaces/user-input/ccap-user-input-list-item.interface';\nimport { CCAP_LayoutBreakpoint_ControlService } from '../../../../_services/control-services/ccap-layout-breakpoint.control-service';\nimport {\n UIn_QUICK_INPUT_ALL_PROJECTS_FILTER,\n UIn_QUICK_INPUT_COMPOSER_PLACEHOLDER,\n UserInput_DataService,\n} from '../../_services/user-input.data-service';\n\n/**\n * REQ-QI-WSPER-001 (cycle 180): localStorage kulcs a Bulk Send All workspace\n * választás persistáláshoz, hogy a felhasználónak ne kelljen minden alkalommal\n * újra kiválasztania a workspace-t.\n */\nconst QI_BULK_SEND_WORKSPACE_STORAGE_KEY = 'ccap-qi-bulk-send-workspace';\n\n/**\n * REQ-QI-COLLAP-001 (cycle 329): localStorage kulcs a Quick Input panel\n * header-controls (projekt + area + elem + szűrés blokkok) collapsed-állapotának\n * perzisztálásához. A user a chevron-button-tal állítja a panel-fejlécen.\n */\nconst QI_HEADER_COLLAPSED_STORAGE_KEY = 'ccap-qi-header-collapsed';\n\n\n/**\n * Quick Input panel komponens (globális overlay).\n * Lista + composer; elemre kattintás → akció modal (main frame).\n */\n@Component({\n selector: 'app-ccap-user-input-panel',\n standalone: true,\n imports: [CommonModule, FormsModule, CCAP_VoiceRecordButton_Component, S_Modal_Component, CCAP_RelativeTime_Pipe],\n templateUrl: './uin-panel.component.html',\n})\n/** UIn_Panel_Component class. */\nexport class UIn_Panel_Component implements OnInit {\n\n readonly userInput_DS: UserInput_DataService = inject(UserInput_DataService);\n\n private readonly ccSession_DS: ClaudeCode_DataService = inject(ClaudeCode_DataService);\n\n readonly newAgentSessionWorkspace_DS: ExS_NewAgentWorkspace_DataService = inject(\n ExS_NewAgentWorkspace_DataService,\n );\n\n private readonly globalError_CS: CCAP_GlobalError_ControlService = inject(\n CCAP_GlobalError_ControlService,\n );\n\n readonly layoutBreakpoint_CS: CCAP_LayoutBreakpoint_ControlService = inject(\n CCAP_LayoutBreakpoint_ControlService,\n );\n\n /** Template @switch-hoz: státusz enum referencia (nincs logika a track-ben). */\n readonly QiStatus: typeof PM_QuickInputStatus_Type = PM_QuickInputStatus_Type;\n\n /** Lista chip: predicted type. */\n readonly QiPredType: typeof PM_QuickInputPredictedType_Type = PM_QuickInputPredictedType_Type;\n\n /** Lista chip: staging prioritás (`PM_Priority_Type`). */\n readonly QiPriority: typeof PM_Priority_Type = PM_Priority_Type;\n\n /** Composer placeholder (signal / const — template-ben nem metódus). */\n readonly composerPlaceholder: string = UIn_QUICK_INPUT_COMPOSER_PLACEHOLDER;\n\n /** Dropdown „Mind\" sentinel (template referencia). */\n readonly allProjectsFilterValue: string = UIn_QUICK_INPUT_ALL_PROJECTS_FILTER;\n\n /**\n * Area preset lista (dropdown) — katalógus SSOT; `@for` track: stabil `areaValue`.\n */\n readonly quickInputAreaCatalogOptions: UIn_QuickInputAreaCatalogEntry_Interface[] =\n UIn_QuickInputAreaCatalog_Util.catalogOptionsForDisplay();\n\n /** `<select>` „Egyéni…” sentinel (template referencia). */\n readonly customAreaSelectValue: string = UIn_QUICK_INPUT_AREA_CUSTOM_SELECT_VALUE;\n\n /**\n * Area `<select>` kötött érték: üres / katalógus `areaValue` / custom sentinel.\n */\n readonly areaSelectBoundValue_$ = computed((): string => {\n const current: string = this.userInput_DS.quickInputComposerArea_$().trim();\n if (!current.length) {\n return '';\n }\n const inCatalog: boolean = this.quickInputAreaCatalogOptions.some(\n (o: UIn_QuickInputAreaCatalogEntry_Interface): boolean => o.areaValue === current,\n );\n if (inCatalog) {\n return current;\n }\n return UIn_QUICK_INPUT_AREA_CUSTOM_SELECT_VALUE;\n });\n\n /**\n * Autofollow módban megjelenő címke a feloldott area-hoz.\n */\n readonly autofollowAreaDisplayLabel_$ = computed((): string => {\n return UIn_QuickInputAreaCatalog_Util.getDisplayLabelForAreaValue({\n areaValue: this.userInput_DS.quickInputComposerArea_$(),\n });\n });\n\n /**\n * Panel stílus: grid layout + abszolút pozíció (top/bottom + left/right).\n * A grid `auto 1fr auto` garantálja, hogy a header és composer fix, a közép scrollozható.\n */\n readonly panelOverlayStyle_$ = computed((): Record<string, string> => {\n const bounds = this.userInput_DS.quickInputMainBoundsPx_$();\n const positionStyles: Record<string, string> = UIn_PanelAnchor_Util.buildPanelOverlayStyles({\n mainWidthPx: bounds.widthPx,\n mainHeightPx: bounds.heightPx,\n fabOffsetRightPx: this.userInput_DS.fabOffsetRightPx_$(),\n fabOffsetBottomPx: this.userInput_DS.fabOffsetBottomPx_$(),\n isMobileXs: this.layoutBreakpoint_CS.isMobile_$(),\n });\n return {\n display: 'grid',\n 'grid-template-rows': 'auto 1fr auto',\n overflow: 'hidden',\n ...positionStyles,\n };\n });\n\n /** Új input szöveg (composer). */\n readonly newInputText_$ = signal<string>('');\n\n /** Új `elements` sor bevitele mielőtt a listához adjuk (CCAP host). */\n readonly newComposerElementId_$ = signal<string>('');\n\n /**\n * Quick Input lista szűrő query — kliens-oldali tartalom-szűréshez (nem perzisztált).\n */\n readonly quickInputListSearchQuery_$ = signal<string>('');\n\n /**\n * REQ-QI-COLLAP-001 (cycle 329): a Quick Input panel header-controls (projekt + area + elem +\n * szűrés blokkok) collapsed-állapota. A user a panel-fejléc chevron-button-jával állítja;\n * az érték localStorage-ba perzisztálódik (panel-újranyitásnál visszaáll).\n */\n readonly headerControlsCollapsed_$ = signal<boolean>(UIn_Panel_Component.readQiHeaderCollapsed());\n\n /**\n * Szűrt Quick Input lista: case-insensitive részleges egyezés a rawContent, predictedCleanDescription,\n * area és elements mezőkön (üres query → teljes lista másolat).\n *\n * REQ-QI-ORDER-001: chat-style rendezés — a `userInput_DS.inputs_$()` newest-first\n * sorrendet ad (új elemek `[item, ...list]` prepend-eléssel), itt megfordítjuk, hogy\n * a UI-ban a frissek alulra kerüljenek és a régiek felfelé sorrendben jelenjenek meg.\n */\n readonly filteredQuickInputs_$ = computed((): CCAP_UserInputListItem_Interface[] => {\n const items: CCAP_UserInputListItem_Interface[] = this.userInput_DS.inputs_$();\n const qRaw: string = this.quickInputListSearchQuery_$().trim().toLowerCase();\n const matched: CCAP_UserInputListItem_Interface[] = qRaw.length === 0\n ? [...items]\n : items.filter((item: CCAP_UserInputListItem_Interface): boolean =>\n UIn_Panel_Component.quickInputItemMatchesNormalizedQuery(item, qRaw),\n );\n return matched.reverse();\n });\n\n /**\n * REQ-QI-SCROLL-001 — Quick Input lista auto-scroll-to-bottom.\n * `#quickInputListScrollContainer` a görgetett konténer (overflow-y-auto div),\n * `#quickInputListAnchor` egy sentinel a lista végén — scrollIntoView hívással.\n */\n @ViewChild('quickInputListScrollContainer')\n private quickInputListScrollContainerRef: ElementRef<HTMLElement> | null = null;\n @ViewChild('quickInputListAnchor')\n private quickInputListAnchorRef: ElementRef<HTMLElement> | null = null;\n\n /**\n * REQ-QI-SCROLL-001 — \"user a lista alján van\" flag. Kezdeti érték `true`,\n * mert a chat-style sort newest-bottom miatt panel-nyitáskor a lista végén\n * akarunk lenni. Scroll-handler frissíti.\n */\n private isQuickInputListAtBottom: boolean = true;\n\n /**\n * REQ-QI-SCROLL-001 — előző `filteredQuickInputs_$` hossz. Az effect a növekedést\n * detektálja (új elem érkezett a listába); ha igen + `isQuickInputListAtBottom`\n * → auto-scroll-to-bottom.\n */\n private quickInputListPrevLength: number = 0;\n\n constructor() {\n /**\n * Panel megnyitás / projekt váltás: composer visszatöltése localStorage-ból (voice + kézi draft).\n */\n effect(\n (): void => {\n const isOpen: boolean = this.userInput_DS.isPanelOpen_$();\n const projectId: string = this.userInput_DS.selectedProjectId_$();\n // selectedProjectIsCcapRevisionedHost_$() már olvassa a computedCcapRevisionedHostByProjectId_$-t,\n // ezért a direkt olvasás itt redundáns volt — eltávolítva (duplikált subscription + felesleges effect-futás).\n if (!isOpen) {\n return;\n }\n const draft: { text: string; area: string; elements: string[] } =\n UIn_QuickInputComposerDraft_Util.loadPayload(projectId);\n this.newInputText_$.set(draft.text);\n if (this.userInput_DS.selectedProjectIsCcapRevisionedHost_$()) {\n this.userInput_DS.setQuickInputComposerElementsForUser(draft.elements);\n if (this.userInput_DS.quickInputAreaAutofollow_$()) {\n this.userInput_DS.syncComposerAreaFromCurrentNavigation();\n } else {\n this.userInput_DS.applyComposerAreaFromDraftWhenManual(draft.area);\n }\n } else {\n this.userInput_DS.setQuickInputComposerElementsForUser([]);\n }\n },\n { allowSignalWrites: true },\n );\n\n /**\n * DOM pick append / bump után composer draft mentés — SSOT bump a data service-ben.\n */\n effect(\n (): void => {\n const n: number = this.userInput_DS.quickInputComposerDraftPersistBump_$();\n if (n === 0) {\n return;\n }\n if (!this.userInput_DS.isPanelOpen_$()) {\n return;\n }\n this.persistQuickInputComposerDraft();\n },\n { allowSignalWrites: true },\n );\n\n /**\n * REQ-QI-SCROLL-001 — auto-scroll-to-bottom: ha a `filteredQuickInputs_$` hossza\n * nőtt (új elem érkezett) ÉS a user a lista alján volt → scroll-to-bottom.\n * Ha a user feljebb scrollolt → ne ránts le, megőrizzük a pozícióját.\n * setTimeout(0): a DOM frissülése után fusson.\n */\n effect(\n (): void => {\n const items: CCAP_UserInputListItem_Interface[] = this.filteredQuickInputs_$();\n const prev: number = this.quickInputListPrevLength;\n this.quickInputListPrevLength = items.length;\n if (items.length > prev && this.isQuickInputListAtBottom) {\n setTimeout((): void => {\n this.quickInputListAnchorRef?.nativeElement?.scrollIntoView({ behavior: 'instant' });\n }, 0);\n }\n },\n );\n }\n\n /**\n * REQ-QI-SCROLL-001 — scroll esemény handler a Quick Input lista konténerén.\n * Frissíti a `isQuickInputListAtBottom` flag-et: ~50px tűréssel a bottom-tól.\n */\n handleQuickInputListScroll(): void {\n const el: HTMLElement | null | undefined =\n this.quickInputListScrollContainerRef?.nativeElement;\n if (!el) {\n return;\n }\n const distanceFromBottom: number = el.scrollHeight - el.scrollTop - el.clientHeight;\n this.isQuickInputListAtBottom = distanceFromBottom <= 50;\n }\n\n /**\n * Elem.track toggle — egy gomb; ON állapotban DOM ID picker (DS validál host + nyitott panel).\n */\n handleDomPickToggleClick(): void {\n const next: boolean = !this.userInput_DS.quickInputDomPickActive_$();\n this.userInput_DS.setQuickInputDomPickActive(next);\n }\n\n /**\n * Composer változás — signal + böngésző draft (újratöltésig megmarad, amíg nincs sikeres küldés).\n */\n handleComposerTextChange(value: string): void {\n this.newInputText_$.set(value);\n this.persistQuickInputComposerDraft();\n }\n\n /**\n * Aktuális projekthez kötött composer draft mentése localStorage-ba.\n */\n private persistQuickInputComposerDraft(): void {\n const projectId: string = this.userInput_DS.selectedProjectId_$();\n const text: string = this.newInputText_$();\n if (this.userInput_DS.selectedProjectIsCcapRevisionedHost_$()) {\n const elements: string[] = [...this.userInput_DS.quickInputComposerElements_$()];\n if (this.userInput_DS.quickInputAreaAutofollow_$()) {\n UIn_QuickInputComposerDraft_Util.save(projectId, text, { elements: elements });\n return;\n }\n UIn_QuickInputComposerDraft_Util.save(projectId, text, {\n area: this.userInput_DS.quickInputComposerArea_$(),\n elements: elements,\n });\n return;\n }\n UIn_QuickInputComposerDraft_Util.save(projectId, text);\n }\n\n /**\n * Composer: új azonosító sor hozzáadása a listához (üres / duplikátum elvetve).\n */\n handleComposerElementAdd(raw: string): void {\n this.userInput_DS.appendQuickInputComposerElement(raw);\n this.persistQuickInputComposerDraft();\n }\n\n /**\n * Composer: azonosító törlése index szerint.\n */\n handleComposerElementRemoveAt(index: number): void {\n this.userInput_DS.removeQuickInputComposerElementAt(index);\n this.persistQuickInputComposerDraft();\n }\n\n /**\n * Mezőből azonosító hozzáadása, majd mező ürítése.\n */\n handleComposerElementSubmitFromField(): void {\n const raw: string = this.newComposerElementId_$().trim();\n if (!raw.length) {\n return;\n }\n this.handleComposerElementAdd(raw);\n this.newComposerElementId_$.set('');\n }\n\n /**\n * REQ-QI-OFFLINE-001 (cycle 221) — panel mount-jakor egy fire-and-forget drain\n * a localStorage offline queue-n: ha a felhasználónak voltak korábban fail-elt\n * Quick Input-jai (pl. szerver-restart vagy network hibakor mentett tételek),\n * automatikusan újra megpróbáljuk elküldeni őket. Best-effort — hibára\n * a util belül csendes return.\n */\n ngOnInit(): void {\n void this.userInput_DS.drainOfflineQueue();\n }\n\n /** Új Quick Input mentése (staging); siker után draft törlése. */\n async handleSubmitInput(): Promise<void> {\n const text: string = this.newInputText_$();\n if (!text.trim()) {\n return;\n }\n const projectId: string = this.userInput_DS.selectedProjectId_$();\n const ok: boolean = await this.userInput_DS.submitInput(text);\n if (ok) {\n UIn_QuickInputComposerDraft_Util.clear(projectId);\n this.newInputText_$.set('');\n }\n }\n\n /** Enter billentyű kezelés (Shift+Enter = új sor, Enter = küldés). */\n handleKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n this.handleSubmitInput();\n }\n }\n\n /**\n * STT / voice transcript hozzáfűzése a composer mezőhöz (új sorral, ha már van szöveg).\n */\n handleVoiceTranscript(text: string): void {\n const trimmed: string = text?.trim() ?? '';\n if (!trimmed.length) {\n return;\n }\n this.newInputText_$.update((prev: string): string => (prev ? `${prev}\\n${trimmed}` : trimmed));\n this.persistQuickInputComposerDraft();\n }\n\n /** Projekt kiválasztása. */\n handleProjectChange(projectId: string): void {\n this.quickInputListSearchQuery_$.set('');\n void this.userInput_DS.setProject(projectId);\n }\n\n /**\n * Lista keresőmező változás — signal frissítés.\n */\n handleQuickInputListSearchQueryChange(value: string): void {\n this.quickInputListSearchQuery_$.set(value);\n }\n\n /**\n * REQ-QI-COLLAP-001 (cycle 329): a panel header-controls (projekt + area + elem + szűrés)\n * collapsed-állapotának togglolása + localStorage-ba perzisztálás.\n */\n handleHeaderCollapseToggle(): void {\n const next: boolean = !this.headerControlsCollapsed_$();\n this.headerControlsCollapsed_$.set(next);\n UIn_Panel_Component.persistQiHeaderCollapsed(next);\n }\n\n /**\n * Egy listaelem illeszkedik-e a már normalizált (trim + lower) keresőszövegre.\n */\n private static quickInputItemMatchesNormalizedQuery(\n item: CCAP_UserInputListItem_Interface,\n normalizedQuery: string,\n ): boolean {\n const rawLc: string = String(item.rawContent ?? '').toLowerCase();\n if (rawLc.includes(normalizedQuery)) {\n return true;\n }\n const descLc: string = String(item.predictedCleanDescription ?? '').toLowerCase();\n if (descLc.includes(normalizedQuery)) {\n return true;\n }\n const areaLc: string = String(item.area ?? '').toLowerCase();\n if (areaLc.includes(normalizedQuery)) {\n return true;\n }\n const elements: string[] | undefined = item.elements;\n if (!elements?.length) {\n return false;\n }\n for (const el of elements) {\n const tokenLc: string = String(el ?? '').toLowerCase();\n if (tokenLc.includes(normalizedQuery)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Area preset váltás (üres / katalógus / egyéni sentinel).\n */\n handleAreaSelectChange(value: string): void {\n if (value === '') {\n this.userInput_DS.setQuickInputComposerAreaValueForUser('');\n this.persistQuickInputComposerDraft();\n return;\n }\n if (value === UIn_QUICK_INPUT_AREA_CUSTOM_SELECT_VALUE) {\n this.persistQuickInputComposerDraft();\n return;\n }\n this.userInput_DS.setQuickInputComposerAreaValueForUser(value);\n this.persistQuickInputComposerDraft();\n }\n\n /**\n * Egyéni area szöveg (csak ha a select „Egyéni…” vagy ismeretlen preset).\n */\n handleCustomAreaInputChange(value: string): void {\n this.userInput_DS.setQuickInputComposerAreaValueForUser(value);\n this.persistQuickInputComposerDraft();\n }\n\n /**\n * Area autofollow checkbox.\n */\n handleAreaAutofollowChange(isChecked: boolean): void {\n this.userInput_DS.setQuickInputAreaAutofollow(isChecked);\n this.persistQuickInputComposerDraft();\n }\n\n /** Lista elem → akció modal megnyitása (globális modal a main frame-ben). */\n handleOpenActionsModal(quickInputId: string): void {\n this.userInput_DS.openQuickInputActionsModal(quickInputId);\n }\n\n // ── Send All to CC Session ────────────────────────────────────\n\n /** Confirm modal nyitva állapota. */\n readonly sendAllConfirmOpen_$ = signal<boolean>(false);\n\n /** Session target: új vagy meglévő. */\n readonly sendAllTarget_$ = signal<'new' | 'existing'>('new');\n\n /** Meglévő session kiválasztott ID-ja (existing target esetén). */\n readonly sendAllExistingSessionId_$ = signal<string>('');\n\n /** Új session név. */\n readonly sendAllSessionName_$ = signal<string>('');\n\n /** Új session workspace path (dropdown választás). */\n readonly sendAllWorkspacePath_$ = signal<string>('');\n\n /** Prompt tartalom (szerkeszthető). */\n readonly sendAllPromptContent_$ = signal<string>('');\n\n /** Aktív session-ök a dropdown-hoz (nem archivált). */\n readonly sendAllActiveSessions_$ = computed((): CC_ListItem_Interface[] => {\n return this.ccSession_DS.sessions_$().filter(\n (s: CC_ListItem_Interface): boolean => !s.isArchived,\n );\n });\n\n /** Send All gomb tiltva — nincs elem a listában vagy folyamatban van. */\n readonly sendAllDisabled_$ = computed((): boolean => {\n if (this.userInput_DS.sendAllToCcSessionBusy_$()) {\n return true;\n }\n return this.userInput_DS.inputs_$().length === 0;\n });\n\n /**\n * REQ-QI-011: a Send All badge warning-jének küszöbe. 20+ aktív Quick Input esetén\n * a gomb warning jelzést kap + tooltip változik, hogy a user észrevegye a feldolgozási hátralékot.\n */\n readonly sendAllWarningThreshold: number = 20;\n\n /** REQ-QI-011: aktív (listán lévő) Quick Inputok száma — badge-hez. */\n readonly activeQuickInputCount_$ = computed((): number => this.userInput_DS.inputs_$().length);\n\n /** REQ-QI-011: true ha a Send All warning-zónában van (aktív darabszám ≥ threshold). */\n readonly sendAllWarningActive_$ = computed((): boolean =>\n this.activeQuickInputCount_$() >= this.sendAllWarningThreshold,\n );\n\n /** REQ-QI-011: Send All gomb title (warning esetén bővebb). */\n readonly sendAllButtonTitle_$ = computed((): string => {\n const count: number = this.activeQuickInputCount_$();\n if (this.sendAllWarningActive_$()) {\n return `${count} aktív Quick Input — itt az ideje feldolgozni ezeket. Send All: összes egy új CC Session-be, majd archiválás.`;\n }\n return `${count} aktív Quick Input. Send All: összes egy új CC Session-be, majd archiválás.`;\n });\n\n /**\n * REQ-UI-QI-DISABLED-TOOLTIP-001: a Quick Input mentés (Send) gomb tooltip — ha disabled,\n * pontosan megmondja a usernek MIÉRT. 4 disabled-ok ágon (priority sorrendben):\n * 1) \"All projects\" filter aktív → válasszon konkrét projektet\n * 2) Nincs projekt → projekt létrehozás kell\n * 3) Üres szövegmező → írjon be valamit\n * 4) Folyamatban lévő küldés → várjon\n * Ha enabled: rövid action-leírás.\n */\n readonly newInputSendButtonTitle_$ = computed((): string => {\n if (this.userInput_DS.selectedProjectId_$() === this.allProjectsFilterValue) {\n return 'Disabled — Válassz egy konkrét projektet a fenti listából (jelenleg \"All projects\" szűrő aktív).';\n }\n if (!this.userInput_DS.projects_$().length) {\n return 'Disabled — Nincs elérhető projekt. Hozz létre projektet a Project Management oldalon.';\n }\n if (!this.newInputText_$().trim()) {\n return 'Disabled — Írj be Quick Input szöveget a mentéshez.';\n }\n if (this.userInput_DS.isSending_$()) {\n return 'Disabled — Egy korábbi mentés még folyamatban van, várj egy pillanatot.';\n }\n return 'Quick Input mentés staging-ként';\n });\n\n /** Submit tiltva — validáció a modal mezőkön. */\n readonly sendAllSubmitDisabled_$ = computed((): boolean => {\n if (this.userInput_DS.sendAllToCcSessionBusy_$()) {\n return true;\n }\n if (!this.sendAllPromptContent_$().trim()) {\n return true;\n }\n if (this.sendAllTarget_$() === 'existing' && !this.sendAllExistingSessionId_$()) {\n return true;\n }\n return false;\n });\n\n /**\n * Confirm modal megnyitása — alapértékek beállítása + session lista betöltése.\n */\n handleOpenSendAllConfirm(): void {\n if (this.sendAllDisabled_$()) {\n return;\n }\n const items: CCAP_UserInputListItem_Interface[] = this.userInput_DS.inputs_$();\n this.sendAllTarget_$.set('new');\n this.sendAllExistingSessionId_$.set('');\n this.sendAllSessionName_$.set(`QI Bulk Import (${items.length} items)`);\n // REQ-QI-WSPER-001: tárolt workspace path visszatöltése — ha nincs vagy\n // már nem érvényes opció, a refresh() ágban első opcióra esik vissza.\n this.sendAllWorkspacePath_$.set(UIn_Panel_Component.readQiBulkSendWorkspace());\n this.sendAllPromptContent_$.set(UserInput_DataService.buildSendAllMessageContent(items));\n // Aktív session-ök + workspace opciók betöltése a dropdown-okhoz.\n this.ccSession_DS.loadSessions({ includeArchived: false });\n this.newAgentSessionWorkspace_DS.refreshWorkspacePathPickerOptions().then((): void => {\n const options = this.newAgentSessionWorkspace_DS.workspacePathPickerOptions_$();\n if (options.length === 0) {\n return;\n }\n const stored: string = this.sendAllWorkspacePath_$();\n const storedIsValid: boolean = stored !== ''\n && options.some((o: { path: string }): boolean => o.path === stored);\n if (!storedIsValid) {\n // Nem volt tárolt érték, vagy a tárolt path már nem szerepel az\n // opciók között (workspace törölve / át lett mozgatva). Első opció.\n this.sendAllWorkspacePath_$.set(options[0].path);\n }\n });\n this.sendAllConfirmOpen_$.set(true);\n }\n\n /** Confirm modal bezárás. */\n handleSendAllConfirmClosed(): void {\n if (this.userInput_DS.sendAllToCcSessionBusy_$()) {\n return;\n }\n this.sendAllConfirmOpen_$.set(false);\n }\n\n /** Target választás kezelése. */\n handleSendAllTargetChange(target: 'new' | 'existing'): void {\n this.sendAllTarget_$.set(target);\n }\n\n /**\n * REQ-QI-WSPER-001: workspace választás — signal-frissítés + localStorage\n * persistálás, hogy a következő modal-megnyitáskor a user előző választása\n * jöjjön vissza alapértelmezettnek.\n */\n handleSendAllWorkspacePathChange(path: string): void {\n this.sendAllWorkspacePath_$.set(path);\n UIn_Panel_Component.persistQiBulkSendWorkspace(path);\n }\n\n /**\n * Megerősített Send All: új vagy meglévő CC Session-be küldés, majd archiválás.\n */\n async handleConfirmSendAll(): Promise<void> {\n const items: CCAP_UserInputListItem_Interface[] = this.userInput_DS.inputs_$();\n if (!items.length) {\n return;\n }\n this.userInput_DS.sendAllToCcSessionBusy_$.set(true);\n try {\n let sessionId: string;\n\n if (this.sendAllTarget_$() === 'new') {\n sessionId = await this.ccSession_DS.createSession({\n workspacePath: this.sendAllWorkspacePath_$(),\n label: this.sendAllSessionName_$(),\n });\n if (!sessionId) {\n this.globalError_CS.showError(\n new Error('Failed to create CC Session for Quick Input bulk send'),\n 'ccap-quick-input-send-all-create',\n );\n return;\n }\n } else {\n sessionId = this.sendAllExistingSessionId_$();\n }\n\n // Prompt küldése (felhasználó által szerkesztett tartalom).\n const content: string = this.sendAllPromptContent_$();\n await this.ccSession_DS.sendPrompt({ sessionId: sessionId, content: content });\n\n // Archiválás — az összes elküldött Quick Input.\n const ids: string[] = items.map(\n (item: CCAP_UserInputListItem_Interface): string => item.quickInputId,\n );\n await this.userInput_DS.bulkArchiveQuickInputs(ids);\n\n this.sendAllConfirmOpen_$.set(false);\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'ccap-quick-input-send-all');\n } finally {\n this.userInput_DS.sendAllToCcSessionBusy_$.set(false);\n }\n }\n\n /** Panel bezárás. */\n handleClose(): void {\n this.userInput_DS.closePanel();\n }\n\n /**\n * Tárolt Bulk Send workspace path olvasása localStorage-ból. Üres string ha\n * nincs tárolt érték vagy a localStorage nem elérhető (private mode / SSR).\n *\n * REQ-UI-MENU-STATE-001 (cycle 469): top-level function → private static method\n * (CLAUDE.md compliance); a `localStorage.getItem ?? ''` minta most a shared\n * `Shr_LocalStoragePersistence_Util.readString ?? ''`-on megy.\n */\n private static readQiBulkSendWorkspace(): string {\n return Shr_LocalStoragePersistence_Util.readString(QI_BULK_SEND_WORKSPACE_STORAGE_KEY) ?? '';\n }\n\n /**\n * Bulk Send workspace path mentése localStorage-ba. Hibát csendben elnyel,\n * mert a feature opcionális (perzisztálás nem-blokkoló).\n *\n * REQ-UI-MENU-STATE-001 (cycle 469): top-level function → private static method;\n * `localStorage.setItem` → `Shr_LocalStoragePersistence_Util.writeString`.\n */\n private static persistQiBulkSendWorkspace(path: string): void {\n Shr_LocalStoragePersistence_Util.writeString(QI_BULK_SEND_WORKSPACE_STORAGE_KEY, path);\n }\n\n /**\n * Tárolt header-collapsed flag olvasása localStorage-ból. False ha nincs\n * tárolt érték vagy a localStorage nem elérhető (private mode / SSR) — alap\n * állapot: header controls **láthatóak** (a user nem akarja minden alkalommal\n * újra kibontani, ha rákattint a fab-ra).\n *\n * REQ-UI-MENU-STATE-001 (cycle 469): top-level function → private static method;\n * `localStorage.getItem === 'true'` → `Shr_LocalStoragePersistence_Util.readString === 'true'`.\n * Default false (`null === 'true'` → false) változatlan.\n */\n private static readQiHeaderCollapsed(): boolean {\n return Shr_LocalStoragePersistence_Util.readString(QI_HEADER_COLLAPSED_STORAGE_KEY) === 'true';\n }\n\n /**\n * Header-collapsed flag mentése localStorage-ba. Hibát csendben elnyel.\n *\n * REQ-UI-MENU-STATE-001 (cycle 469): szándékosan `writeString(value ? 'true' : 'false')`\n * és NEM `writeBoolean` — a meglévő on-disk format (`'true'`/`'false'`) +\n * read-side `=== 'true'` minta-konzisztencia megőrzéséhez.\n */\n private static persistQiHeaderCollapsed(collapsed: boolean): void {\n Shr_LocalStoragePersistence_Util.writeString(\n QI_HEADER_COLLAPSED_STORAGE_KEY,\n collapsed ? 'true' : 'false',\n );\n }\n}\n", "<!-- Quick Input overlay — grid layout: header [auto] + scrollable middle [1fr] + composer [auto] -->\n<div class=\"absolute z-[10050] pointer-events-auto rounded-lg border-2 border-neonDefault bg-neutral-900\n shadow-xl\n left-3 right-3 w-auto max-w-none\n gt-xs:left-auto gt-xs:w-[min(42rem,calc(100vw-5rem))] gt-xs:max-w-[42rem]\"\n [ngStyle]=\"panelOverlayStyle_$()\">\n\n <!-- Fejléc: Quick Input + akció gombok + bezárás (grid row: auto) -->\n <div class=\"border-b border-neonDefault\">\n <div class=\"flex items-center justify-between px-3 py-2 gap-2\">\n <span class=\"text-sm font-semibold text-neutral-100 truncate\">Quick Input</span>\n <div class=\"flex items-center gap-1 shrink-0\">\n <!-- Send All to CC Session gomb — REQ-QI-011: aktív darabszám + 20+ esetén warning -->\n @if (activeQuickInputCount_$() > 0) {\n <button type=\"button\"\n class=\"rounded px-2 py-1 text-[11px] font-semibold uppercase tracking-wide\n border transition-colors duration-150 flex items-center gap-1.5\n disabled:opacity-40 disabled:cursor-not-allowed\"\n [ngClass]=\"{\n 'border-neonCyan/50 text-neonCyan/90 hover:bg-neonCyan/10':\n !sendAllDisabled_$() && !sendAllWarningActive_$(),\n 'border-amber-500/70 text-amber-300 hover:bg-amber-500/10':\n !sendAllDisabled_$() && sendAllWarningActive_$(),\n 'border-neutral-700 text-neutral-500': sendAllDisabled_$()\n }\"\n [disabled]=\"sendAllDisabled_$()\"\n (click)=\"handleOpenSendAllConfirm()\"\n [title]=\"sendAllButtonTitle_$()\"\n aria-label=\"Send All to CC Session\">\n @if (userInput_DS.sendAllToCcSessionBusy_$()) {\n <span class=\"animate-spin inline-block w-3 h-3 border-2 border-neonCyan/50 border-t-neonCyan rounded-full\"></span>\n } @else {\n @if (sendAllWarningActive_$()) {\n <svg class=\"w-3 h-3 shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z\"\n clip-rule=\"evenodd\" />\n </svg>\n }\n Send All ({{ activeQuickInputCount_$() }})\n }\n </button>\n }\n <!-- REQ-QI-COLLAP-001 (cycle 329): chevron a header-controls (projekt + area + elem +\n szűrés blokkok) bezárásához / kibontásához. localStorage-ba perzisztálódik. -->\n <button type=\"button\"\n class=\"p-1 rounded text-neutral-400 hover:text-neutral-200 hover:bg-neutral-800\n transition-colors duration-150 shrink-0\"\n (click)=\"handleHeaderCollapseToggle()\"\n [title]=\"headerControlsCollapsed_$() ? 'Beállítások mutatása' : 'Beállítások bezárása'\"\n [attr.aria-label]=\"headerControlsCollapsed_$() ? 'Beállítások mutatása' : 'Beállítások bezárása'\"\n [attr.aria-expanded]=\"!headerControlsCollapsed_$()\">\n <svg class=\"w-4 h-4 transition-transform duration-150\"\n [class.rotate-180]=\"headerControlsCollapsed_$()\"\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 15l-7-7-7 7\"/>\n </svg>\n </button>\n <button type=\"button\"\n class=\"p-1 rounded text-neutral-400 hover:text-neutral-200 hover:bg-neutral-800\n transition-colors duration-150 shrink-0\"\n (click)=\"handleClose()\"\n title=\"Bezárás\"\n aria-label=\"Quick Input panel bezárás\">\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\"/>\n </svg>\n </button>\n </div>\n </div>\n </div>\n\n <!-- Scrollozható közép: projekt/area + lista (grid row: 1fr, mindig scrollozható) -->\n <!-- REQ-QI-SCROLL-001: scroll-listener a \"user a lista alján van\"-flag frissítéséhez. -->\n <div #quickInputListScrollContainer\n style=\"min-height: 0; overflow-y: auto;\"\n (scroll)=\"handleQuickInputListScroll()\">\n\n <!-- REQ-QI-COLLAP-001 (cycle 329): a header-controls (projekt + area + elem + szűrés)\n a chevron-toggle alapján rejthető. Collapsed állapotban közvetlenül a lista jelenik meg. -->\n @if (!headerControlsCollapsed_$()) {\n <!-- Projekt + Area (host): egy sor; egyéni area input alatta teljes szélesség -->\n <div class=\"px-3 py-2 border-b border-neutral-800\">\n <div class=\"flex flex-wrap items-start gap-2\">\n <select class=\"min-w-0 flex-1 basis-[min(100%,10rem)] rounded-md border border-neutral-700 bg-neutral-800 px-2 py-1.5\n text-sm text-neutral-200 focus:outline-none focus:border-neonCyan/60\n transition-colors duration-150\"\n title=\"Projekt\"\n [ngModel]=\"userInput_DS.selectedProjectId_$()\"\n (ngModelChange)=\"handleProjectChange($event)\">\n @if (!userInput_DS.selectedProjectId_$()) {\n <option value=\"\" disabled>Válassz projektet...</option>\n }\n <option [value]=\"allProjectsFilterValue\">Mind</option>\n @for (project of userInput_DS.projects_$(); track project._id) {\n <option [value]=\"project._id\">{{ project.name }}</option>\n }\n </select>\n @if (userInput_DS.selectedProjectIsCcapRevisionedHost_$()) {\n <div class=\"min-w-0 flex-1 basis-[min(100%,12rem)] flex flex-col gap-1 rounded-md border border-neutral-700/80\n bg-neutral-900/40 px-2 py-1.5\">\n <!-- Area autofollow checkbox — TEMPORARILY DISABLED: panel-nyitás bug javításig -->\n <!-- TODO: újraengedélyezni a root cause diagnózis után; DS is letiltja (setQuickInputAreaAutofollow guard) -->\n <div class=\"flex flex-wrap items-center gap-x-2 gap-y-1\">\n @if (false) {\n <label class=\"inline-flex shrink-0 cursor-pointer select-none rounded px-0.5 hover:bg-neutral-800/60\n transition-colors\"\n title=\"Area autofollow: a composer area a jelenlegi route alapján frissül.\"\n aria-label=\"Area autofollow: a composer area a jelenlegi route alapján frissül.\">\n <input type=\"checkbox\"\n class=\"rounded border-neutral-600 bg-neutral-800 text-neonCyan focus:ring-neonCyan/40\"\n [ngModel]=\"userInput_DS.quickInputAreaAutofollow_$()\"\n (ngModelChange)=\"handleAreaAutofollowChange($event)\" />\n </label>\n }\n @if (userInput_DS.quickInputAreaAutofollow_$()) {\n <div class=\"flex min-w-0 flex-1 items-center gap-1.5 text-xs text-neutral-300\">\n <span class=\"shrink-0 text-[10px] font-semibold uppercase tracking-wide text-neutral-500\">Area</span>\n @if (userInput_DS.quickInputComposerArea_$().trim().length) {\n <span class=\"min-w-0 truncate font-mono text-neonCyan/90\">{{ userInput_DS.quickInputComposerArea_$() }}</span>\n <span class=\"hidden min-w-0 truncate text-neutral-500 sm:inline\">({{ autofollowAreaDisplayLabel_$() }})</span>\n } @else {\n <span class=\"truncate text-neutral-500\">— nincs route area —</span>\n }\n </div>\n } @else {\n <select class=\"min-w-0 max-w-full flex-1 basis-[6rem] rounded-md border border-neutral-700 bg-neutral-800\n px-2 py-1 text-xs text-neutral-200 focus:outline-none focus:border-neonCyan/60\"\n title=\"Terület / preset\"\n [ngModel]=\"areaSelectBoundValue_$()\"\n (ngModelChange)=\"handleAreaSelectChange($event)\">\n <option value=\"\">— Nincs area —</option>\n @for (opt of quickInputAreaCatalogOptions; track opt.areaValue) {\n <option [value]=\"opt.areaValue\">{{ opt.displayLabel }}</option>\n }\n <option [value]=\"customAreaSelectValue\">Egyéni…</option>\n </select>\n }\n </div>\n </div>\n }\n </div>\n @if (userInput_DS.selectedProjectIsCcapRevisionedHost_$()\n && !userInput_DS.quickInputAreaAutofollow_$()\n && areaSelectBoundValue_$() === customAreaSelectValue) {\n <input type=\"text\"\n class=\"mt-1.5 w-full rounded-md border border-neutral-700 bg-neutral-800 px-2 py-1\n text-xs text-neutral-200 font-mono placeholder:text-neutral-600\n focus:outline-none focus:border-neonCyan/60\"\n placeholder=\"pl. frontend/session\"\n title=\"Egyéni area érték\"\n [ngModel]=\"userInput_DS.quickInputComposerArea_$()\"\n (ngModelChange)=\"handleCustomAreaInputChange($event)\" />\n }\n @if (userInput_DS.selectedProjectIsCcapRevisionedHost_$()) {\n <!-- Element tracker (DOM pick) — TEMPORARILY DISABLED: click-blokkolás bug javításig -->\n <!-- TODO: újraengedélyezni miután onClickCapture panel-elemeket kizár + togglePanel() resetel -->\n @if (false) {\n <div class=\"mt-2 border-t border-neutral-800/80 pt-2\">\n <button type=\"button\"\n class=\"rounded-md border px-2 py-1.5 text-[11px] font-semibold uppercase tracking-wide\n transition-colors duration-150 focus:outline-none focus:ring-2 focus:ring-neonCyan/40\n focus:ring-offset-2 focus:ring-offset-neutral-900\"\n [ngClass]=\"{\n 'border-neutral-600 bg-neutral-800/80 text-neutral-300 hover:border-neutral-500 hover:bg-neutral-800':\n !userInput_DS.quickInputDomPickActive_$(),\n 'border-neonCyan bg-neonCyan/15 text-neonCyan ring-1 ring-inset ring-neonCyan/35':\n userInput_DS.quickInputDomPickActive_$()\n }\"\n [attr.aria-pressed]=\"userInput_DS.quickInputDomPickActive_$()\"\n title=\"Elem.track: kurzor alatti ID-s DOM elem kiemelése; kattintás hozzáad az Elements listához. Esc: kilépés.\"\n aria-label=\"Elem.track: DOM ID picker. Bekapcsolva kurzor alatti elem kiemelése, kattintásra hozzáadás. Esc: kilépés.\"\n (click)=\"handleDomPickToggleClick()\">\n Elem.track\n </button>\n </div>\n }\n <!-- Kézi element adder — tracker alatt, külön sor (Elem. + mező + +) -->\n <div class=\"border-t border-b border-neutral-800/80 py-2\">\n <div class=\"flex flex-wrap items-center gap-x-2 gap-y-1\">\n <span class=\"shrink-0 text-[10px] font-semibold uppercase tracking-wide text-neutral-500\"\n title=\"LMID / azonosítók (elements) a Quick Input rekordhoz — kézi hozzáadás\">\n Elem.\n </span>\n <input type=\"text\"\n class=\"min-w-0 flex-1 basis-[6rem] rounded-md border border-neutral-700 bg-neutral-800 px-2 py-1\n text-xs text-neutral-200 font-mono placeholder:text-neutral-600\n focus:outline-none focus:border-neonCyan/60\"\n placeholder=\"id / token\"\n title=\"Kézi azonosító — Enter vagy +\"\n [ngModel]=\"newComposerElementId_$()\"\n (ngModelChange)=\"newComposerElementId_$.set($event)\"\n (keydown.enter)=\"handleComposerElementSubmitFromField(); $event.preventDefault()\" />\n <button type=\"button\"\n class=\"shrink-0 rounded-md border border-neutral-600 px-2 py-1 text-xs text-neutral-200\n hover:border-neonCyan/50 hover:text-neonCyan transition-colors\"\n title=\"Azonosító hozzáadása\"\n (click)=\"handleComposerElementSubmitFromField()\">\n +\n </button>\n </div>\n </div>\n @if (userInput_DS.quickInputComposerElements_$().length > 0) {\n <div class=\"mt-1.5 flex flex-wrap gap-1\">\n @for (el of userInput_DS.quickInputComposerElements_$(); track el; let i = $index) {\n <span class=\"inline-flex max-w-full items-center gap-1 rounded border border-neutral-600 bg-neutral-800/80\n py-0.5 pl-2 pr-1 font-mono text-[11px] text-neutral-300\">\n <span class=\"max-w-[14rem] truncate\">{{ el }}</span>\n <button type=\"button\"\n class=\"shrink-0 rounded p-0.5 text-neutral-500 hover:bg-neutral-900/80 hover:text-red-400\"\n (click)=\"handleComposerElementRemoveAt(i)\"\n title=\"Eltávolítás\"\n aria-label=\"Element eltávolítás\">\n <svg class=\"h-3 w-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\"/>\n </svg>\n </button>\n </span>\n }\n </div>\n }\n }\n </div>\n\n <!-- Lista: opcionális keresősáv + elemek -->\n @if (userInput_DS.selectedProjectId_$() && !userInput_DS.isLoading_$() && userInput_DS.inputs_$().length > 0) {\n <div class=\"px-3 py-2 border-b border-neutral-800\">\n <input type=\"text\"\n class=\"w-full rounded-md border border-neutral-700 bg-neutral-800 px-2 py-1.5\n text-xs text-neutral-200 placeholder:text-neutral-600 font-sans\n focus:outline-none focus:border-neonCyan/60\"\n placeholder=\"Szűrés tartalom szerint…\"\n title=\"Quick Input lista szűrése\"\n aria-label=\"Quick Input lista szűrése tartalom szerint\"\n [ngModel]=\"quickInputListSearchQuery_$()\"\n (ngModelChange)=\"handleQuickInputListSearchQueryChange($event)\" />\n </div>\n }\n } <!-- REQ-QI-COLLAP-001: vége header-controls @if -->\n @if (!userInput_DS.selectedProjectId_$()) {\n <div class=\"flex flex-col items-center justify-center py-8 px-4 text-neutral-500 text-sm text-center\">\n <p>Válassz egy projektet a fenti listából.</p>\n </div>\n } @else if (userInput_DS.isLoading_$()) {\n <div class=\"flex items-center justify-center py-8 text-neutral-500 text-sm\">\n <span class=\"animate-spin inline-block w-4 h-4 border-2 border-neonCyan/50 border-t-neonCyan rounded-full mr-2\"></span>\n Betöltés...\n </div>\n } @else if (userInput_DS.inputs_$().length === 0) {\n <div class=\"flex flex-col items-center justify-center py-8 px-4 text-neutral-500 text-sm text-center\">\n <p>Még nincs Quick Input ehhez a projekthez.</p>\n <p class=\"text-xs mt-1\">Írj egy jegyzetet lent — kattintásra megnyílnak az akciók (modal).</p>\n </div>\n } @else if (filteredQuickInputs_$().length === 0 && quickInputListSearchQuery_$().trim().length > 0) {\n <div class=\"flex flex-col items-center justify-center py-8 px-4 text-neutral-500 text-sm text-center\">\n <p>Nincs találat erre a szűrőre.</p>\n <p class=\"text-xs mt-1\">Módosítsd a keresőszöveget vagy töröld a mezőt.</p>\n </div>\n } @else {\n <div class=\"flex flex-col\">\n @for (item of filteredQuickInputs_$(); track item.quickInputId) {\n <!-- REQ-QI-COMPACT-001: kompaktabb list-item — kisebb vertikális padding\n (py-3 → py-2), rawContent legfeljebb 3 sor (truncate → line-clamp-3),\n title-tooltip a teljes tartalomhoz expand-on-click helyett. -->\n <button type=\"button\"\n class=\"flex items-start gap-2 px-4 py-2 text-left border-b border-neutral-800\n hover:bg-neutral-800/60 transition-colors duration-150 w-full\"\n (click)=\"handleOpenActionsModal(item.quickInputId)\">\n <span class=\"w-2 h-2 mt-1.5 rounded-full bg-neonCyan/60 shrink-0\"></span>\n <div class=\"flex-1 min-w-0\">\n <p class=\"text-sm text-neutral-200 line-clamp-3\"\n [title]=\"item.rawContent\">{{ item.rawContent }}</p>\n <div class=\"flex flex-wrap items-center gap-x-2 gap-y-0.5 mt-0.5\">\n <p class=\"text-xs text-neutral-500\"\n [title]=\"item.createdAt | date:'yyyy.MM.dd HH:mm'\">{{ item.createdAt | ccapRelativeTime }}</p>\n @if (item.projectName) {\n <span class=\"text-[10px] uppercase tracking-wide px-1.5 py-0.5 rounded border border-sky-700/60 text-sky-400/90\">\n {{ item.projectName }}\n </span>\n }\n @if (item.status !== QiStatus.draft) {\n <span class=\"text-[10px] uppercase tracking-wide px-1.5 py-0.5 rounded border border-neutral-600 text-neutral-400\">\n @switch (item.status) {\n @case (QiStatus.promotedUserInput) { USER-INPUT }\n @case (QiStatus.promotedBug) { BUG }\n @case (QiStatus.discarded) { discarded }\n }\n </span>\n }\n @if (item.priority) {\n <span class=\"text-[10px] uppercase tracking-wide px-1.5 py-0.5 rounded border border-amber-900/50\n text-amber-400/90\">\n @switch (item.priority) {\n @case (QiPriority.low) { pri: low }\n @case (QiPriority.medium) { pri: medium }\n @case (QiPriority.high) { pri: high }\n @case (QiPriority.urgent) { pri: urgent }\n }\n </span>\n }\n @if (item.predictedType) {\n <span class=\"text-[10px] uppercase tracking-wide px-1.5 py-0.5 rounded border border-neutral-700\n text-neutral-500\">\n @switch (item.predictedType) {\n @case (QiPredType.userInput) { pred: user-input }\n @case (QiPredType.bugReport) { pred: bug }\n @case (QiPredType.unspecified) { pred: ? }\n }\n </span>\n }\n </div>\n @if (item.predictedCleanDescription) {\n <p class=\"text-[11px] text-neutral-500 mt-0.5 line-clamp-2\">{{ item.predictedCleanDescription }}</p>\n }\n </div>\n </button>\n }\n <!-- REQ-QI-SCROLL-001: sentinel anchor a lista végén — scrollIntoView target. -->\n <div #quickInputListAnchor></div>\n </div>\n }\n\n </div>\n\n <!-- Új Quick Input composer — mindig látható (grid row: auto) -->\n <div class=\"px-3 py-2 border-t border-neonDefault\">\n <div class=\"flex items-end gap-3\">\n <!-- REQ-QI-RESIZE-001 (cycle 204): natívan resizable textarea (vertikális drag-handle a sarokban),\n parity a chat session input-tal — a user maga állíthatja a magasságot.\n A `resize-y` enged vertikális resize-t; max 40rem cap a panel-overflow elkerüléséhez.\n A button column (Voice + Send) `items-end` miatt a textarea aljához igazodik, így együtt\n \"nőnek\" a panel függőlegesen. -->\n <textarea class=\"flex-1 min-w-0 min-h-[5rem] gt-xs:min-h-[7rem] max-h-[40rem] resize-y rounded-md\n border border-neutral-700 bg-neutral-800 px-3 py-2 text-sm text-neutral-200\n placeholder-neutral-500 focus:outline-none focus:border-neonCyan/60\n transition-colors duration-150\"\n [placeholder]=\"composerPlaceholder\"\n rows=\"3\"\n [ngModel]=\"newInputText_$()\"\n (ngModelChange)=\"handleComposerTextChange($event)\"\n (keydown)=\"handleKeydown($event)\"></textarea>\n <!-- REQ-QI-VOICE-001: Voice Input gomb a Send gomb FÖLÖTT, vertikális stack a textarea jobb oldalán. -->\n <div class=\"shrink-0 self-end flex flex-col items-end gap-2\">\n <app-ccap-voice-record-button\n (transcriptReady)=\"handleVoiceTranscript($event)\">\n </app-ccap-voice-record-button>\n <button type=\"button\"\n class=\"shrink-0 p-2 rounded-md bg-ccapAccent text-neutral-900 hover:bg-ccapAccent/80\n disabled:opacity-40 disabled:cursor-not-allowed transition-colors duration-150\"\n [disabled]=\"!newInputText_$().trim() || userInput_DS.isSending_$() || !userInput_DS.projects_$().length || userInput_DS.selectedProjectId_$() === allProjectsFilterValue\"\n (click)=\"handleSubmitInput()\"\n [title]=\"newInputSendButtonTitle_$()\"\n aria-label=\"Quick Input mentés\">\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M12 19l9 2-9-18-9 18 9-2zm0 0v-8\"/>\n </svg>\n </button>\n </div>\n </div>\n </div>\n</div>\n\n<!-- Send All to CC Session: beállítás + megerősítő modal -->\n<!-- REQ-QI-SAALL-001: nagy képernyőn jobban használja a helyet (3xl ~768px ↔ alapértelmezett md ~448px). -->\n@if (sendAllConfirmOpen_$()) {\n <app-s-modal [isOpen]=\"sendAllConfirmOpen_$()\"\n [title]=\"'Send All to CC Session'\"\n [maxWidth]=\"'3xl'\"\n [zIndex]=\"'10060'\"\n (closed)=\"handleSendAllConfirmClosed()\">\n <div class=\"p-4 flex flex-col gap-4\">\n <p class=\"text-sm text-neutral-300\">\n {{ userInput_DS.inputs_$().length }} Quick Input elem kerül elküldésre.\n Sikeres küldés után az elemek archiválódnak.\n </p>\n\n <!-- Session target: új vagy meglévő -->\n <fieldset class=\"flex flex-col gap-2\">\n <legend class=\"text-xs font-semibold uppercase tracking-wide text-neutral-500 mb-1\">Session</legend>\n <label class=\"flex items-center gap-2 cursor-pointer text-sm text-neutral-200\">\n <input type=\"radio\" name=\"sendAllTarget\" value=\"new\"\n class=\"accent-neonCyan\"\n [checked]=\"sendAllTarget_$() === 'new'\"\n (change)=\"handleSendAllTargetChange('new')\" />\n Új session\n </label>\n @if (sendAllTarget_$() === 'new') {\n <input type=\"text\"\n class=\"ml-6 w-full rounded-md border border-neutral-700 bg-neutral-800 px-2 py-1.5\n text-sm text-neutral-200 placeholder:text-neutral-600\n focus:outline-none focus:border-neonCyan/60\"\n placeholder=\"Session név\"\n title=\"Új CC Session név\"\n [ngModel]=\"sendAllSessionName_$()\"\n (ngModelChange)=\"sendAllSessionName_$.set($event)\" />\n <select class=\"ml-6 w-full rounded-md border border-neutral-700 bg-neutral-800 px-2 py-1.5\n text-sm text-neutral-200 focus:outline-none focus:border-neonCyan/60\"\n title=\"Workspace path\"\n [ngModel]=\"sendAllWorkspacePath_$()\"\n (ngModelChange)=\"handleSendAllWorkspacePathChange($event)\">\n @for (opt of newAgentSessionWorkspace_DS.workspacePathPickerOptions_$(); track opt.path) {\n <option [value]=\"opt.path\">{{ opt.label }} — {{ opt.path }}</option>\n }\n </select>\n }\n <label class=\"flex items-center gap-2 cursor-pointer text-sm text-neutral-200\">\n <input type=\"radio\" name=\"sendAllTarget\" value=\"existing\"\n class=\"accent-neonCyan\"\n [checked]=\"sendAllTarget_$() === 'existing'\"\n (change)=\"handleSendAllTargetChange('existing')\" />\n Meglévő session\n </label>\n @if (sendAllTarget_$() === 'existing') {\n <select class=\"ml-6 w-full rounded-md border border-neutral-700 bg-neutral-800 px-2 py-1.5\n text-sm text-neutral-200 focus:outline-none focus:border-neonCyan/60\"\n title=\"Meglévő CC Session kiválasztása\"\n [ngModel]=\"sendAllExistingSessionId_$()\"\n (ngModelChange)=\"sendAllExistingSessionId_$.set($event)\">\n <option value=\"\" disabled>Válassz session-t...</option>\n @for (session of sendAllActiveSessions_$(); track session.sessionId) {\n <option [value]=\"session.sessionId\">\n {{ session.label || session.sessionId }} — {{ session.status }}\n </option>\n }\n </select>\n @if (sendAllActiveSessions_$().length === 0) {\n <p class=\"ml-6 text-xs text-neutral-500\">Nincs elérhető session.</p>\n }\n }\n </fieldset>\n\n <!-- Prompt tartalom -->\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-xs font-semibold uppercase tracking-wide text-neutral-500\">Prompt</label>\n <textarea class=\"w-full h-64 resize-y rounded-md border border-neutral-700 bg-neutral-800\n px-3 py-2 text-sm text-neutral-200 placeholder:text-neutral-600 font-mono\n focus:outline-none focus:border-neonCyan/60\"\n placeholder=\"Prompt tartalom...\"\n [ngModel]=\"sendAllPromptContent_$()\"\n (ngModelChange)=\"sendAllPromptContent_$.set($event)\"></textarea>\n </div>\n\n <!-- Akció gombok -->\n <div class=\"flex items-center justify-end gap-3 pt-2 border-t border-neutral-800\">\n <button type=\"button\"\n class=\"rounded-md px-3 py-1.5 text-sm text-neutral-400 hover:text-neutral-200\n transition-colors duration-150\"\n [disabled]=\"userInput_DS.sendAllToCcSessionBusy_$()\"\n (click)=\"handleSendAllConfirmClosed()\">\n Mégse\n </button>\n <button type=\"button\"\n class=\"rounded-md px-4 py-1.5 text-sm font-semibold bg-neonCyan/20 text-neonCyan\n border border-neonCyan/40 hover:bg-neonCyan/30\n disabled:opacity-40 disabled:cursor-not-allowed transition-colors duration-150\"\n [disabled]=\"sendAllSubmitDisabled_$()\"\n (click)=\"handleConfirmSendAll()\">\n @if (userInput_DS.sendAllToCcSessionBusy_$()) {\n <span class=\"animate-spin inline-block w-3.5 h-3.5 border-2 border-neonCyan/50 border-t-neonCyan rounded-full mr-1.5\"></span>\n Küldés...\n } @else {\n Send All\n }\n </button>\n </div>\n </div>\n </app-s-modal>\n}\n", "import { CommonModule } from '@angular/common';\nimport { Component, computed, effect, inject, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\n\nimport { second } from '@futdevpro/fsm-dynamo';\n\nimport {\n PM_QuickInputPredictedType_Type,\n PM_QuickInputStatus_Type,\n PM_QuickInputTaskDifficulty_Type,\n PM_Priority_Type,\n} from '@server-enums';\nimport { PM_ManualBugModal_Component } from '../../../project-management/_components/pm-project-detail/pm-bugs-tab/pm-manual-bug-modal.component';\nimport { PM_UserInputWizard_Component } from '../../../project-management/_components/pm-project-detail/pm-user-input-wizard/pm-user-input-wizard.component';\nimport { ProjectManagement_DataService } from '../../../project-management/_services/data-services/project-management.data-service';\nimport { S_Modal_Component } from '../../../shared/_components/s-modal/s-modal.component';\nimport { S_SessionSelect_Component } from '../../../shared/_components/session-ui/s-session-select/s-session-select.component';\nimport { S_SessionListRowView_Interface } from '../../../shared/_models/interfaces/s-session-list-row-view.interface';\nimport { S_SessionStatusColor_Util } from '../../../shared/_collections/utils/s-session-status-color.util';\nimport { CA_ListItem_Interface } from '../../../external-sessions/_modules/cursor-acp/_models/interfaces/ca-view.interface';\nimport { CC_ListItem_Interface } from '../../../external-sessions/_modules/claude-code/_models/interfaces/cc-list-item.interface';\nimport { CCAP_SessionListItem_Response } from '../../../../_models/interfaces/session/ccap-session-list-item.interface';\nimport { CCAP_GlobalError_ControlService } from '../../../../_services/control-services/ccap-global-error.control-service';\nimport { CursorAcp_DataService } from '../../../external-sessions/_modules/cursor-acp/_services/cursor-acp.data-service';\nimport { ClaudeCode_DataService } from '../../../external-sessions/_modules/claude-code/_services/claude-code.data-service';\nimport { ExS_NewAgentWorkspace_DataService } from '../../../external-sessions/_services/exs-new-agent-workspace.data-service';\nimport { Session_DataService } from '../../../session/_services/data-services/session.data-service';\nimport { UserInput_DataService } from '../../_services/user-input.data-service';\nimport { CCAP_UserInputListItem_Interface } from '../../../../_models/interfaces/user-input/ccap-user-input-list-item.interface';\nimport {\n PM_QuickInputPatchHttpBody_Request,\n PM_ManualBugCreate_Request,\n PM_ManualBugCreate_Response,\n PM_UserInputFinalize_Response,\n} from '../../../../_models/server-index';\nimport { UIn_QuickInputOverlayAreaId_Type } from '../../_enums/uin-quick-input-overlay-area-id.enum';\nimport { UIn_QuickInputOverlayModalZIndexNumeric_Value } from '../../_collections/consts/quick-input/uin-quick-input-overlay-z-index.const';\nimport { UIn_QuickInputNewSessionName_Util } from '../../_collections/utils/quick-input/uin-quick-input-new-session-name.util';\nimport { UIn_QuickInputModalPane_Type } from '../../_enums/uin-quick-input-modal-pane.enum';\nimport { UIn_QuickInputSendSessionTarget_Type } from '../../_enums/uin-quick-input-send-session-target.enum';\n\n/**\n * Quick Input Entity Details: S_Modal hub (property grid, raw content, copy, akció gombok) és al-panelek\n * (edit, USER-INPUT wizard, direct finalize, kézi bug).\n */\n@Component({\n selector: 'app-ccap-quick-input-actions-modal',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n S_Modal_Component,\n S_SessionSelect_Component,\n PM_UserInputWizard_Component,\n PM_ManualBugModal_Component,\n ],\n templateUrl: './uin-quick-input-actions-modal.component.html',\n})\n/** UIn_QuickActionsModal_Component class. */\nexport class UIn_QuickActionsModal_Component {\n\n /**\n * Quick Input s-modal-ok és nested manual-bug modal `zIndex` — minden más main-beli popup fölött\n * (lásd `uin-quick-input-overlay-z-index.const`).\n */\n readonly quickInputOverlayModalZIndex_Value: string = UIn_QuickInputOverlayModalZIndexNumeric_Value;\n\n readonly userInput_DS: UserInput_DataService = inject(UserInput_DataService);\n\n readonly pm_DS: ProjectManagement_DataService = inject(ProjectManagement_DataService);\n\n private readonly globalError_CS: CCAP_GlobalError_ControlService = inject(\n CCAP_GlobalError_ControlService,\n );\n\n readonly caSession_DS: CursorAcp_DataService = inject(CursorAcp_DataService);\n\n readonly ccSession_DS: ClaudeCode_DataService = inject(ClaudeCode_DataService);\n\n readonly session_DS: Session_DataService = inject(Session_DataService);\n\n /** Router — REQ-QI-001: \"Go to session\" navigáció a post-promotion cleanup popup-ból. */\n private readonly router: Router = inject(Router);\n\n private readonly newAgentSessionWorkspace_DS: ExS_NewAgentWorkspace_DataService = inject(\n ExS_NewAgentWorkspace_DataService,\n );\n\n\n /** Template @switch enum referencia. */\n readonly Pane: typeof UIn_QuickInputModalPane_Type = UIn_QuickInputModalPane_Type;\n\n readonly QiStatus: typeof PM_QuickInputStatus_Type = PM_QuickInputStatus_Type;\n\n /** Template: predicted type chip (@switch). */\n readonly QiPredType: typeof PM_QuickInputPredictedType_Type = PM_QuickInputPredictedType_Type;\n\n /** Template: task difficulty `<option [value]>` és összehasonlítás. */\n readonly QiTaskDiff: typeof PM_QuickInputTaskDifficulty_Type = PM_QuickInputTaskDifficulty_Type;\n\n /** Template: priority `<option [value]>` — `PM_Priority_Type`. */\n readonly QiPriority: typeof PM_Priority_Type = PM_Priority_Type;\n\n /** Template: send-to-session target típus enum referencia. */\n readonly SendTarget: typeof UIn_QuickInputSendSessionTarget_Type = UIn_QuickInputSendSessionTarget_Type;\n\n /** Aktív al-panel a fő modalban. */\n readonly pane_$ = signal<UIn_QuickInputModalPane_Type>(UIn_QuickInputModalPane_Type.hub);\n\n /**\n * Promóció / finalize célprojekt — a hub `<select>` és a wizard / bug API ehhez kötődik;\n * mentés nélkül eltérhet a rekord `projectId`-jától.\n */\n readonly targetProjectId_$ = signal<string>('');\n\n /** Utolsó sync-elt Quick Input _id — csak új elem választáskor töltjük újra a target projektet. */\n private lastSyncedQuickInputId: string = '';\n\n /** Célprojekt áthelyezés PATCH busy (hub). */\n readonly saveTargetProjectBusy_$ = signal<boolean>(false);\n\n /**\n * Task difficulty `<select>` értéke (üres string = nincs beállítva); új Quick Input kiválasztáskor a rekordból\n * töltjük.\n */\n readonly taskDifficulty_$ = signal<string>('');\n\n /** Task difficulty PATCH futás alatt — dupla submit elkerülése. */\n readonly taskDifficultyPatchBusy_$ = signal<boolean>(false);\n\n /**\n * Priority `<select>` értéke (üres string = nincs beállítva); új Quick Input kiválasztáskor a rekordból töltjük.\n */\n readonly priority_$ = signal<string>('');\n\n /** Priority PATCH futás alatt. */\n readonly priorityPatchBusy_$ = signal<boolean>(false);\n\n /**\n * Area (terület) szerkesztő mező — mentés gombig csak lokális; új Quick Input kiválasztáskor a rekordból töltjük.\n */\n readonly area_$ = signal<string>('');\n\n /** Area PATCH futás alatt. */\n readonly areaPatchBusy_$ = signal<boolean>(false);\n\n /** Hub: `elements` lista szerkesztő draft (mentés gombig). */\n readonly elementsDraft_$ = signal<string[]>([]);\n\n /** Új element sor a hub gridhez. */\n readonly newElementLine_$ = signal<string>('');\n\n /** Elements lista PATCH futás alatt. */\n readonly elementsPatchBusy_$ = signal<boolean>(false);\n\n /** Hub property grid: bármely meta PATCH (task / priority / area / elements) — kereszt-tiltás. */\n readonly hubGridPatchBusy_$ = computed((): boolean => {\n return (\n this.taskDifficultyPatchBusy_$()\n || this.priorityPatchBusy_$()\n || this.areaPatchBusy_$()\n || this.elementsPatchBusy_$()\n );\n });\n\n /** Hub: LLM classify (predictedType) futás alatt. */\n readonly classifyQuickInputBusy_$ = signal<boolean>(false);\n\n /** Nested manual bug modal. */\n readonly manualBugModalOpen_$ = signal<boolean>(false);\n\n /** Bug POST folyamatban. */\n readonly manualBugBusy_$ = signal<boolean>(false);\n\n /** Quick Input törlés megerősítő popup (S_Modal). */\n readonly quickInputDeleteConfirmOpen_$ = signal<boolean>(false);\n\n /** DELETE kérés folyamatban. */\n readonly deleteQuickInputBusy_$ = signal<boolean>(false);\n\n /** Szerkesztés mező (draft raw). */\n readonly editRaw_$ = signal<string>('');\n\n /**\n * Szerkesztés mező (draft title) — ha nem üres, a Quick Input-ból indított CCAP Session ezt kapja névnek.\n */\n readonly editTitle_$ = signal<string>('');\n\n /** Szerkesztés mentés busy. */\n readonly editSaveBusy_$ = signal<boolean>(false);\n\n /** Wizard / direct seed szöveg (Quick Input raw). */\n readonly wizardSeedRaw_$ = signal<string>('');\n\n /** Bug prefill: title (első sor vagy fallback). */\n readonly bugPrefillTitle_$ = signal<string>('');\n\n /** Bug prefill: details = teljes raw. */\n readonly bugPrefillDetails_$ = signal<string>('');\n\n /** Rövid visszajelzés a vágólap-másolás után (hub). */\n readonly copyFeedback_$ = signal<string>('');\n\n /** `copyFeedback_$` timeout törlése modal záráskor / új másoláskor. */\n private copyFeedbackClearHandle: ReturnType<typeof setTimeout> | undefined;\n\n // ── Generic confirm modal ──────────────────────────────────────────\n\n /** Generikus megerősítő popup nyitva állapota. */\n readonly genericConfirmOpen_$ = signal<boolean>(false);\n\n /** Generikus confirm popup cím. */\n readonly genericConfirmTitle_$ = signal<string>('');\n\n /** Generikus confirm popup leíró szöveg. */\n readonly genericConfirmBody_$ = signal<string>('');\n\n /** Generikus confirm folyamatban. */\n readonly genericConfirmBusy_$ = signal<boolean>(false);\n\n /** Generikus confirm gomb felirata (alapértelmezett: Confirm). */\n readonly genericConfirmButtonLabel_$ = signal<string>('Confirm');\n\n /** Confirm OK után végrehajtandó akció. */\n private pendingGenericConfirmAction_: (() => Promise<void>) | null = null;\n\n // ── Send to session modal ─────────────────────────────────────────\n\n /** Sentinel érték a dropdown-ban: „Create new session\" opció. */\n readonly SEND_NEW_SESSION_VALUE: string = '__new__';\n\n /** Send-to-session confirm modal nyitva állapota. */\n readonly sendToSessionOpen_$ = signal<boolean>(false);\n\n /** Aktuális cél session típus (CA / CC / CCAP). */\n readonly sendToSessionType_$ = signal<UIn_QuickInputSendSessionTarget_Type>(\n UIn_QuickInputSendSessionTarget_Type.caSession,\n );\n\n /** Kiválasztott cél session ID a dropdown-ban (vagy `__new__` ha új session). */\n readonly sendToSessionSelectedId_$ = signal<string>('__new__');\n\n /** Szerkeszthető üzenet tartalom — a raw content-ből inicializálva, de módosítható. */\n readonly sendToSessionContent_$ = signal<string>('');\n\n /**\n * REQ-UI-SSEL-001 Slice 4 — a send-to-session target sessionek row-view-i a közös\n * `S_SessionSelect_Component` számára. A lista első eleme a \"Create new session\"\n * sentinel (ID = `SEND_NEW_SESSION_VALUE`); utána a session-típusnak (CA / CC / CCAP)\n * megfelelő valós sessionek kerülnek.\n */\n readonly sendToSessionRowViews_$ = computed(\n (): S_SessionListRowView_Interface[] => {\n const createNewRow: S_SessionListRowView_Interface = {\n id: this.SEND_NEW_SESSION_VALUE,\n label: '+ Create new session',\n status: '',\n statusColorClass: 'bg-neonCyan',\n isArchived: false,\n isRunning: false,\n };\n const type: UIn_QuickInputSendSessionTarget_Type = this.sendToSessionType_$();\n let rows: S_SessionListRowView_Interface[] = [];\n if (type === UIn_QuickInputSendSessionTarget_Type.caSession) {\n rows = this.caSession_DS.sessions_$().map(\n (s: CA_ListItem_Interface): S_SessionListRowView_Interface => ({\n id: s.sessionId ?? '',\n label: s.label || s.sessionId || '',\n status: s.status ?? '',\n statusColorClass: S_SessionStatusColor_Util.resolve(s.status),\n isArchived: !!s.isArchived,\n isRunning: S_SessionStatusColor_Util.isRunning(s.status),\n }),\n );\n } else if (type === UIn_QuickInputSendSessionTarget_Type.ccSession) {\n rows = this.ccSession_DS.sessions_$().map(\n (s: CC_ListItem_Interface): S_SessionListRowView_Interface => ({\n id: s.sessionId ?? '',\n label: s.label || s.sessionId || '',\n status: s.status ?? '',\n statusColorClass: S_SessionStatusColor_Util.resolve(s.status),\n isArchived: !!s.isArchived,\n isRunning: S_SessionStatusColor_Util.isRunning(s.status),\n }),\n );\n } else {\n rows = this.session_DS.sessions_$().map(\n (s: CCAP_SessionListItem_Response): S_SessionListRowView_Interface => ({\n id: s._id ?? '',\n label: s.name || s._id || '',\n status: s.status ?? '',\n statusColorClass: S_SessionStatusColor_Util.resolve(s.status),\n isArchived: false,\n isRunning: S_SessionStatusColor_Util.isRunning(s.status),\n }),\n );\n }\n return [createNewRow, ...rows];\n },\n );\n\n /**\n * Session-kind informatív input a wrapper-nek (render-logikát nem vezérel, de a\n * `S_SessionSelect_Component.kind` kötelező input, és a későbbi slice-okban\n * a session-típusra hajlíthatja a viselkedést).\n */\n readonly sendToSessionSelectKind_$ = computed(\n (): 'ccap' | 'cc' | 'ca' => {\n const type: UIn_QuickInputSendSessionTarget_Type = this.sendToSessionType_$();\n if (type === UIn_QuickInputSendSessionTarget_Type.caSession) return 'ca';\n if (type === UIn_QuickInputSendSessionTarget_Type.ccSession) return 'cc';\n return 'ccap';\n },\n );\n\n // ── Post-promotion cleanup modal ────────────��──────────────────────\n\n /** Promóció utáni törlés-kérdés popup nyitva állapota. */\n readonly postPromotionCleanupOpen_$ = signal<boolean>(false);\n\n /** Promóció utáni törlés busy. */\n readonly postPromotionCleanupBusy_$ = signal<boolean>(false);\n\n /** Létrejött entitás leírása a popup üzenetben (pl. „USER-INPUT UIN-FE-001\" vagy „Bug BG-FE-001\"). */\n readonly postPromotionCleanupEntityLabel_$ = signal<string>('');\n\n /**\n * REQ-QI-001: opcionális \"Go to session\" navigáció a post-promotion cleanup popup-ból.\n * Null, ha nem session-promotion → gomb nem jelenik meg. Érték: router navigate command tömb.\n */\n readonly postPromotionCleanupRouteCmds_$ = signal<string[] | null>(null);\n\n // ── Send to session modal ─────────────────────────────────────────\n\n /** Send-to-session küldés folyamatban. */\n readonly sendToSessionBusy_$ = signal<boolean>(false);\n\n /** Send-to-session visszajelzés (rövid success üzenet). */\n readonly sendToSessionFeedback_$ = signal<string>('');\n\n /** Send-to-session feedback timeout handle. */\n private sendToSessionFeedbackClearHandle: ReturnType<typeof setTimeout> | undefined;\n\n /**\n * REQ-QI-010: Hub pane összecsukható blokkok állapota. Kulcsonként (blockId) `true` = collapsed.\n * A kevésbé gyakran használt akció-blokkok (target-project, send-to-session, project-related-promotion)\n * bezárhatóak; a content és metadata blokkok mindig látszanak.\n */\n readonly hubCollapsedBlocks_$ = signal<Record<string, boolean>>({});\n\n /** Togglezi egy hub-blokk collapsed állapotát (REQ-QI-010 — event-handler, template-ből (click)-re). */\n toggleHubBlock(blockId: string): void {\n const prev: Record<string, boolean> = this.hubCollapsedBlocks_$();\n const next: Record<string, boolean> = { ...prev, [blockId]: !prev[blockId] };\n this.hubCollapsedBlocks_$.set(next);\n }\n\n /**\n * Kiválasztott elem — reaktív olvasás a modal nyitva állapotához kötve.\n */\n readonly selectedItem_$ = computed((): CCAP_UserInputListItem_Interface | undefined => {\n if (!this.userInput_DS.quickInputActionsModalOpen_$()) {\n return undefined;\n }\n return this.userInput_DS.getSelectedQuickInputListItem();\n });\n\n /**\n * USER-INPUT wizard és manual bug: staging `priority` prefill — `PM_UserRequest` / bug create egyeztetés.\n */\n readonly wizardStagingPriority_$ = computed((): PM_Priority_Type | undefined => {\n const item: CCAP_UserInputListItem_Interface | undefined = this.selectedItem_$();\n return item?.priority;\n });\n\n /**\n * Csak draft státusznál engedünk promóciós akciókat (wizard / direct / bug).\n */\n readonly canPromote_$ = computed((): boolean => {\n const item: CCAP_UserInputListItem_Interface | undefined = this.selectedItem_$();\n if (!item) {\n return false;\n }\n return item.status === PM_QuickInputStatus_Type.draft;\n });\n\n /** Hub copy gomb: üres vagy whitespace-only raw esetén tiltva (template-ben nincs trim hívás). */\n readonly hubCopyDisabled_$ = computed((): boolean => {\n const item: CCAP_UserInputListItem_Interface | undefined = this.selectedItem_$();\n if (!item) {\n return true;\n }\n return !item.rawContent.trim();\n });\n\n /** Van érvényes célprojekt ID — wizard / direct / bug mount guard (modal target, nem a panel globál). */\n readonly hasSelectedProject_$ = computed((): boolean => {\n return this.targetProjectId_$().trim().length > 0;\n });\n\n /**\n * A hub `<select>` eltér a rekord kanonikus `projectId`-jától — promóció tiltva, amíg nincs mentés.\n */\n readonly isTargetProjectDirty_$ = computed((): boolean => {\n const item: CCAP_UserInputListItem_Interface | undefined = this.selectedItem_$();\n if (!item) {\n return false;\n }\n return String(item.projectId ?? '').trim() !== this.targetProjectId_$().trim();\n });\n\n /**\n * Promóciós gombok: draft + szinkron célprojekt (DB home egyezik a választott target-tel).\n */\n readonly canPromoteWithSyncedTarget_$ = computed((): boolean => {\n if (!this.canPromote_$()) {\n return false;\n }\n return !this.isTargetProjectDirty_$();\n });\n\n /**\n * Hub Delete: nincs tárolt home `projectId` — a DELETE path egyeztetés nélkül nem hívható.\n */\n readonly hubDeleteDisabled_$ = computed((): boolean => {\n const item: CCAP_UserInputListItem_Interface | undefined = this.selectedItem_$();\n if (!item) {\n return true;\n }\n return !String(item.projectId ?? '').trim().length;\n });\n\n /** Hub Delete gomb tiltásának oka. */\n readonly hubDeleteDisabledHint_$ = computed((): string | null => {\n if (!this.hubDeleteDisabled_$()) {\n return null;\n }\n return 'Delete is disabled: this quick input has no stored project id (cannot call DELETE path).';\n });\n\n /**\n * Hub Classify with LLM: ugyanaz a path projekt követelmény mint DELETE + nem üres raw.\n */\n readonly hubClassifyLlmDisabled_$ = computed((): boolean => {\n return this.hubDeleteDisabled_$() || this.hubCopyDisabled_$();\n });\n\n /** Hub Classify with LLM tiltás magyarázata (prioritás: hiányzó project id, majd üres raw). */\n readonly hubClassifyLlmDisabledHint_$ = computed((): string | null => {\n if (!this.hubClassifyLlmDisabled_$()) {\n return null;\n }\n if (this.hubDeleteDisabled_$()) {\n return this.hubDeleteDisabledHint_$();\n }\n return 'Classify with LLM is disabled: raw content is empty.';\n });\n\n /**\n * Hub: USER-INPUT wizard / direct finalize / report bug — miért tiltott (egy közös szöveg a csoporthoz).\n * Sorrend: draft → target projekt → dirty target.\n */\n readonly hubProjectPromotionActionsHint_$ = computed((): string | null => {\n if (this.canPromoteWithSyncedTarget_$()) {\n return null;\n }\n if (!this.canPromote_$()) {\n return (\n 'Wizard, direct finalize, and report bug need a draft quick input. This item is already promoted or discarded.'\n );\n }\n if (!this.hasSelectedProject_$()) {\n return (\n 'Choose a target project in Target project (promotion) above. These actions are unavailable until a ' +\n 'target project is selected.'\n );\n }\n if (this.isTargetProjectDirty_$()) {\n return (\n 'Save target project first so the stored home project matches the selection; promotion APIs use the ' +\n 'record project id.'\n );\n }\n return null;\n });\n\n /**\n * Hub Content copy: üres raw esetén magyarázó szöveg a disabled gomb mellé / alá.\n */\n readonly hubCopyDisabledHint_$ = computed((): string | null => {\n if (!this.hubCopyDisabled_$()) {\n return null;\n }\n return 'Copy is disabled because raw content is empty.';\n });\n\n /**\n * Hub Apply prediction gomb tiltva, ha nincs `predictedProjectId` a rekordon.\n */\n readonly hubApplyPredictionDisabled_$ = computed((): boolean => {\n const item: CCAP_UserInputListItem_Interface | undefined = this.selectedItem_$();\n if (!item) {\n return true;\n }\n return !String(item.predictedProjectId ?? '').trim().length;\n });\n\n /** Hub Apply prediction disabled oka — rövid üzenet. */\n readonly hubApplyPredictionDisabledHint_$ = computed((): string | null => {\n if (!this.hubApplyPredictionDisabled_$()) {\n return null;\n }\n return 'Apply prediction is disabled: this quick input has no predicted project id.';\n });\n\n /** Hub Save target project: nincs pending változás — miért disabled. */\n readonly hubSaveTargetProjectDisabledHint_$ = computed((): string | null => {\n if (this.saveTargetProjectBusy_$()) {\n return null;\n }\n if (this.isTargetProjectDirty_$()) {\n return null;\n }\n return 'Save target project is disabled: the selected target already matches the record.';\n });\n\n /**\n * Hub: area mező eltér a rekord `area`-jától (trim után).\n */\n readonly isAreaDirty_$ = computed((): boolean => {\n const item: CCAP_UserInputListItem_Interface | undefined = this.selectedItem_$();\n if (!item) {\n return false;\n }\n const saved: string = String(item.area ?? '').trim();\n const draft: string = this.area_$().trim();\n return saved !== draft;\n });\n\n /**\n * Hub: `elements` draft eltér a rekordtól (sorrend-érzékeny összehasonlítás).\n */\n readonly isElementsDirty_$ = computed((): boolean => {\n const item: CCAP_UserInputListItem_Interface | undefined = this.selectedItem_$();\n if (!item) {\n return false;\n }\n const saved: string[] = item.elements !== undefined ? [...item.elements] : [];\n const draft: string[] = [...this.elementsDraft_$()];\n return !UIn_QuickActionsModal_Component.quickInputElementListsEqual(saved, draft);\n });\n\n /** Edit pane: Save gomb tiltva (busy vagy üres raw) — template-ben nincs trim. */\n readonly editSaveSubmitDisabled_$ = computed((): boolean => {\n return this.editSaveBusy_$() || !this.editRaw_$().trim().length;\n });\n\n /** Edit pane: Save tiltás oka (üres raw), busy alatt a gomb szövege elég. */\n readonly editSaveDisabledHint_$ = computed((): string | null => {\n if (this.editSaveBusy_$()) {\n return null;\n }\n if (this.editRaw_$().trim().length > 0) {\n return null;\n }\n return 'Save is disabled: raw content is empty.';\n });\n\n /** S_Modal cím az aktuális panel szerint. */\n readonly mainModalTitle_$ = computed((): string => {\n const p: UIn_QuickInputModalPane_Type = this.pane_$();\n if (p === UIn_QuickInputModalPane_Type.edit) {\n return 'Quick Input — edit';\n }\n if (p === UIn_QuickInputModalPane_Type.wizard) {\n return 'Quick Input — USER-INPUT wizard';\n }\n if (p === UIn_QuickInputModalPane_Type.direct) {\n return 'Quick Input — direct finalize';\n }\n return 'Quick Input Entity Details';\n });\n\n /** Send-to-session modal cím a cél típus szerint. */\n readonly sendToSessionModalTitle_$ = computed((): string => {\n const t: UIn_QuickInputSendSessionTarget_Type = this.sendToSessionType_$();\n if (t === UIn_QuickInputSendSessionTarget_Type.caSession) {\n return 'Send to CA Session';\n }\n if (t === UIn_QuickInputSendSessionTarget_Type.ccSession) {\n return 'Send to CC Session';\n }\n return 'Send to CCAP Session';\n });\n\n /** Hub „Send to session\" gombok tiltva — üres raw content. */\n readonly hubSendToSessionDisabled_$ = computed((): boolean => {\n return this.hubCopyDisabled_$();\n });\n\n /** Send-to-session confirm gomb tiltva — nincs kiválasztott session, üres content, vagy busy. */\n readonly sendToSessionConfirmDisabled_$ = computed((): boolean => {\n if (this.sendToSessionBusy_$()) {\n return true;\n }\n if (!this.sendToSessionSelectedId_$().trim().length) {\n return true;\n }\n if (!this.sendToSessionContent_$().trim().length) {\n return true;\n }\n return false;\n });\n\n constructor() {\n effect(\n (): void => {\n if (!this.userInput_DS.quickInputActionsModalOpen_$()) {\n this.pane_$.set(UIn_QuickInputModalPane_Type.hub);\n this.manualBugModalOpen_$.set(false);\n this.editRaw_$.set('');\n this.editTitle_$.set('');\n this.wizardSeedRaw_$.set('');\n this.copyFeedback_$.set('');\n this.targetProjectId_$.set('');\n this.taskDifficulty_$.set('');\n this.taskDifficultyPatchBusy_$.set(false);\n this.priority_$.set('');\n this.priorityPatchBusy_$.set(false);\n this.area_$.set('');\n this.areaPatchBusy_$.set(false);\n this.elementsDraft_$.set([]);\n this.newElementLine_$.set('');\n this.elementsPatchBusy_$.set(false);\n this.lastSyncedQuickInputId = '';\n if (this.copyFeedbackClearHandle !== undefined) {\n clearTimeout(this.copyFeedbackClearHandle);\n this.copyFeedbackClearHandle = undefined;\n }\n this.quickInputDeleteConfirmOpen_$.set(false);\n this.deleteQuickInputBusy_$.set(false);\n this.classifyQuickInputBusy_$.set(false);\n this.genericConfirmOpen_$.set(false);\n this.genericConfirmBusy_$.set(false);\n this.pendingGenericConfirmAction_ = null;\n this.sendToSessionOpen_$.set(false);\n this.sendToSessionBusy_$.set(false);\n this.sendToSessionSelectedId_$.set('__new__');\n this.sendToSessionContent_$.set('');\n this.sendToSessionFeedback_$.set('');\n if (this.sendToSessionFeedbackClearHandle !== undefined) {\n clearTimeout(this.sendToSessionFeedbackClearHandle);\n this.sendToSessionFeedbackClearHandle = undefined;\n }\n this.postPromotionCleanupOpen_$.set(false);\n this.postPromotionCleanupBusy_$.set(false);\n this.postPromotionCleanupEntityLabel_$.set('');\n }\n },\n { allowSignalWrites: true },\n );\n\n /** Fő S_Modal nyitva — overlay area a Quick Input composer autofollow-hoz. */\n effect(\n (): void => {\n const open: boolean = this.userInput_DS.quickInputActionsModalOpen_$();\n if (open) {\n this.userInput_DS.pushQuickInputOverlayAreaContextByOverlayId(\n UIn_QuickInputOverlayAreaId_Type.quickInputActionsModal,\n );\n } else {\n this.userInput_DS.closeQuickInputActionsModalOverlayChain();\n }\n },\n { allowSignalWrites: true },\n );\n\n /** Új Quick Input kiválasztásakor a target projekt = rekord `projectId` (SSOT inicializálás). */\n effect(\n (): void => {\n if (!this.userInput_DS.quickInputActionsModalOpen_$()) {\n return;\n }\n const qid: string = this.userInput_DS.selectedQuickInputId_$().trim();\n if (!qid.length) {\n return;\n }\n if (qid === this.lastSyncedQuickInputId) {\n return;\n }\n this.lastSyncedQuickInputId = qid;\n const item: CCAP_UserInputListItem_Interface | undefined =\n this.userInput_DS.getSelectedQuickInputListItem();\n if (item) {\n this.targetProjectId_$.set(String(item.projectId ?? '').trim());\n this.taskDifficulty_$.set(\n item.taskDifficulty !== undefined ? item.taskDifficulty : '',\n );\n this.priority_$.set(item.priority !== undefined ? item.priority : '');\n this.area_$.set(item.area !== undefined ? item.area : '');\n this.elementsDraft_$.set(\n item.elements !== undefined && item.elements.length > 0 ? [...item.elements] : [],\n );\n this.newElementLine_$.set('');\n }\n },\n { allowSignalWrites: true },\n );\n }\n\n /**\n * Két azonosító lista egyezik-e (hossz + elem szerinti).\n */\n private static quickInputElementListsEqual(a: string[], b: string[]): boolean {\n if (a.length !== b.length) {\n return false;\n }\n for (let i: number = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Hub: feladat nehézség változás — azonnali PATCH; hiba esetén visszaállítjuk a select értékét.\n */\n async handleTaskDifficultySelectChange(raw: string): Promise<void> {\n const item: CCAP_UserInputListItem_Interface | undefined = this.selectedItem_$();\n const pathProjectId: string = String(item?.projectId ?? '').trim();\n if (!item || !pathProjectId.length) {\n return;\n }\n const nextEmpty: boolean = raw === '';\n const currentEmpty: boolean = item.taskDifficulty === undefined;\n if (nextEmpty && currentEmpty) {\n return;\n }\n if (!nextEmpty && raw === item.taskDifficulty) {\n return;\n }\n const allowed: PM_QuickInputTaskDifficulty_Type[] = [\n PM_QuickInputTaskDifficulty_Type.easy,\n PM_QuickInputTaskDifficulty_Type.medium,\n PM_QuickInputTaskDifficulty_Type.hard,\n PM_QuickInputTaskDifficulty_Type.komplex,\n ];\n let body: PM_QuickInputPatchHttpBody_Request;\n if (nextEmpty) {\n body = { taskDifficulty: null };\n } else {\n const nextDifficulty: PM_QuickInputTaskDifficulty_Type | undefined = allowed.find(\n (v: PM_QuickInputTaskDifficulty_Type): boolean => v === raw,\n );\n if (nextDifficulty === undefined) {\n return;\n }\n body = { taskDifficulty: nextDifficulty };\n }\n const previousSelect: string =\n item.taskDifficulty !== undefined ? item.taskDifficulty : '';\n this.taskDifficulty_$.set(raw);\n this.taskDifficultyPatchBusy_$.set(true);\n try {\n const updated = await this.userInput_DS.patchQuickInput({\n pathProjectId: pathProjectId,\n quickInputId: item.quickInputId,\n body: body,\n });\n if (updated === null) {\n this.taskDifficulty_$.set(previousSelect);\n this.globalError_CS.showError(\n new Error('Quick input task difficulty PATCH failed'),\n 'ccap-quick-input-task-difficulty',\n );\n }\n } finally {\n this.taskDifficultyPatchBusy_$.set(false);\n }\n }\n\n /**\n * Hub: prioritás változás — azonnali PATCH; hiba esetén visszaállítjuk a select értékét.\n */\n async handlePrioritySelectChange(raw: string): Promise<void> {\n const item: CCAP_UserInputListItem_Interface | undefined = this.selectedItem_$();\n const pathProjectId: string = String(item?.projectId ?? '').trim();\n if (!item || !pathProjectId.length) {\n return;\n }\n const nextEmpty: boolean = raw === '';\n const currentEmpty: boolean = item.priority === undefined;\n if (nextEmpty && currentEmpty) {\n return;\n }\n if (!nextEmpty && raw === item.priority) {\n return;\n }\n const allowed: PM_Priority_Type[] = [\n PM_Priority_Type.low,\n PM_Priority_Type.medium,\n PM_Priority_Type.high,\n PM_Priority_Type.urgent,\n ];\n let body: PM_QuickInputPatchHttpBody_Request;\n if (nextEmpty) {\n body = { priority: null };\n } else {\n const nextPriority: PM_Priority_Type | undefined = allowed.find(\n (v: PM_Priority_Type): boolean => v === raw,\n );\n if (nextPriority === undefined) {\n return;\n }\n body = { priority: nextPriority };\n }\n const previousSelect: string = item.priority !== undefined ? item.priority : '';\n this.priority_$.set(raw);\n this.priorityPatchBusy_$.set(true);\n try {\n const updated = await this.userInput_DS.patchQuickInput({\n pathProjectId: pathProjectId,\n quickInputId: item.quickInputId,\n body: body,\n });\n if (updated === null) {\n this.priority_$.set(previousSelect);\n this.globalError_CS.showError(\n new Error('Quick input priority PATCH failed'),\n 'ccap-quick-input-priority',\n );\n }\n } finally {\n this.priorityPatchBusy_$.set(false);\n }\n }\n\n /**\n * Hub: area mentése — üres draft → `area` törlése a rekordon (`null` PATCH).\n */\n async handleSaveArea(): Promise<void> {\n const item: CCAP_UserInputListItem_Interface | undefined = this.selectedItem_$();\n const pathProjectId: string = String(item?.projectId ?? '').trim();\n if (!item || !pathProjectId.length) {\n return;\n }\n if (!this.isAreaDirty_$()) {\n return;\n }\n const nextTrimmed: string = this.area_$().trim();\n const body: PM_QuickInputPatchHttpBody_Request = nextTrimmed.length\n ? { area: nextTrimmed }\n : { area: null };\n const previousDraft: string = item.area !== undefined ? item.area : '';\n this.areaPatchBusy_$.set(true);\n try {\n const updated = await this.userInput_DS.patchQuickInput({\n pathProjectId: pathProjectId,\n quickInputId: item.quickInputId,\n body: body,\n });\n if (updated === null) {\n this.area_$.set(previousDraft);\n this.globalError_CS.showError(\n new Error('Quick input area PATCH failed'),\n 'ccap-quick-input-area',\n );\n }\n } finally {\n this.areaPatchBusy_$.set(false);\n }\n }\n\n /**\n * Hub: új element hozzáadása a draft listához (üres / duplikátum nélkül).\n */\n handleHubAddElementLine(): void {\n const raw: string = this.newElementLine_$().trim();\n if (!raw.length) {\n return;\n }\n const next: string[] = [...this.elementsDraft_$()];\n if (next.includes(raw)) {\n this.newElementLine_$.set('');\n return;\n }\n next.push(raw);\n this.elementsDraft_$.set(next);\n this.newElementLine_$.set('');\n }\n\n /**\n * Hub: element törlése a draft listából index szerint.\n */\n handleHubRemoveElementAt(index: number): void {\n const next: string[] = [...this.elementsDraft_$()];\n if (index < 0 || index >= next.length) {\n return;\n }\n next.splice(index, 1);\n this.elementsDraft_$.set(next);\n }\n\n /**\n * Hub: `elements` mentése — üres draft → `null` PATCH (mező törlése).\n */\n async handleSaveElements(): Promise<void> {\n const item: CCAP_UserInputListItem_Interface | undefined = this.selectedItem_$();\n const pathProjectId: string = String(item?.projectId ?? '').trim();\n if (!item || !pathProjectId.length) {\n return;\n }\n if (!this.isElementsDirty_$()) {\n return;\n }\n const draft: string[] = [...this.elementsDraft_$()];\n const body: PM_QuickInputPatchHttpBody_Request = draft.length > 0\n ? { elements: draft }\n : { elements: null };\n const previousDraft: string[] =\n item.elements !== undefined && item.elements.length > 0 ? [...item.elements] : [];\n this.elementsPatchBusy_$.set(true);\n try {\n const patchOk: boolean =\n (await this.userInput_DS.patchQuickInput({\n pathProjectId: pathProjectId,\n quickInputId: item.quickInputId,\n body: body,\n })) !== null;\n if (!patchOk) {\n this.elementsDraft_$.set(previousDraft);\n this.globalError_CS.showError(\n new Error('Quick input elements PATCH failed'),\n 'ccap-quick-input-elements',\n );\n return;\n }\n const refreshed: CCAP_UserInputListItem_Interface | undefined =\n this.userInput_DS.getSelectedQuickInputListItem();\n this.elementsDraft_$.set(\n refreshed?.elements !== undefined && refreshed.elements.length > 0 ? [...refreshed.elements] : [],\n );\n } finally {\n this.elementsPatchBusy_$.set(false);\n }\n }\n\n /**\n * Hub: Copy confirm megnyitása.\n */\n handleOpenCopyConfirm(): void {\n if (this.hubCopyDisabled_$()) {\n return;\n }\n this.openGenericConfirm(\n 'Copy to clipboard?',\n 'The raw content of this Quick Input will be copied to the clipboard.',\n 'Copy',\n async (): Promise<void> => {\n await this.executeCopyRawContent();\n },\n );\n }\n\n /**\n * Hub: aktuális Quick Input raw tartalom másolása a vágólapra (Clipboard API + fallback).\n */\n async executeCopyRawContent(): Promise<void> {\n const item: CCAP_UserInputListItem_Interface | undefined = this.selectedItem_$();\n const text: string = item !== undefined ? String(item.rawContent ?? '') : '';\n if (!text.trim()) {\n return;\n }\n if (this.copyFeedbackClearHandle !== undefined) {\n clearTimeout(this.copyFeedbackClearHandle);\n this.copyFeedbackClearHandle = undefined;\n }\n const result = await this.globalError_CS.copyToClipboard(text);\n if (!result.ok) {\n this.globalError_CS.showError(result.error, 'ccap-quick-input-entity-details-copy');\n return;\n }\n this.copyFeedback_$.set('Copied.');\n this.copyFeedbackClearHandle = window.setTimeout((): void => {\n this.copyFeedback_$.set('');\n this.copyFeedbackClearHandle = undefined;\n }, 2 * second);\n }\n\n /**\n * Fő modal bezárás — data service állapot.\n */\n handleMainModalClosed(): void {\n this.userInput_DS.closeQuickInputActionsModal();\n }\n\n /** Vissza a hub-ra az al-panelekből. */\n handleBackToHub(): void {\n this.pane_$.set(UIn_QuickInputModalPane_Type.hub);\n }\n\n /**\n * Hub: Apply prediction confirm megnyitása.\n */\n handleOpenApplyPredictionConfirm(): void {\n if (this.hubApplyPredictionDisabled_$()) {\n return;\n }\n const item: CCAP_UserInputListItem_Interface | undefined = this.selectedItem_$();\n const predicted: string = String(item?.predictedProjectId ?? '').trim();\n this.openGenericConfirm(\n 'Apply prediction?',\n `Copy the LLM-predicted project ID (${predicted}) into the target project selector. This is a local change — no server request.`,\n 'Apply',\n async (): Promise<void> => {\n this.executeApplyPredictedProject();\n },\n );\n }\n\n /**\n * Hub: jósolt célprojekt másolása a target `<select>`-be (lokális, nincs PATCH).\n */\n executeApplyPredictedProject(): void {\n const item: CCAP_UserInputListItem_Interface | undefined = this.selectedItem_$();\n const predicted: string = String(item?.predictedProjectId ?? '').trim();\n if (!predicted.length) {\n return;\n }\n this.targetProjectId_$.set(predicted);\n }\n\n /**\n * Hub: Save target project confirm megnyitása.\n */\n handleOpenSaveTargetProjectConfirm(): void {\n if (!this.isTargetProjectDirty_$() || this.saveTargetProjectBusy_$()) {\n return;\n }\n this.openGenericConfirm(\n 'Save target project?',\n 'This will update the stored home project on the server. The Quick Input will be moved to the selected target project.',\n 'Save',\n async (): Promise<void> => {\n await this.executeSaveTargetProject();\n },\n );\n }\n\n /**\n * Hub: rekord `projectId` frissítése a szerveren (áthelyezés); path = régi home projekt.\n */\n async executeSaveTargetProject(): Promise<void> {\n const item: CCAP_UserInputListItem_Interface | undefined = this.selectedItem_$();\n if (!item) {\n return;\n }\n const pathProjectId: string = String(item.projectId ?? '').trim();\n const nextProjectId: string = this.targetProjectId_$().trim();\n if (!pathProjectId.length || !nextProjectId.length) {\n return;\n }\n if (pathProjectId === nextProjectId) {\n return;\n }\n this.saveTargetProjectBusy_$.set(true);\n try {\n const updated = await this.userInput_DS.patchQuickInput({\n pathProjectId: pathProjectId,\n quickInputId: item.quickInputId,\n body: { projectId: nextProjectId },\n });\n if (updated === null) {\n this.globalError_CS.showError(\n new Error('Quick input target project PATCH failed'),\n 'ccap-quick-input-save-target-project',\n );\n return;\n }\n if (nextProjectId !== this.userInput_DS.selectedProjectId_$().trim()) {\n this.userInput_DS.closeQuickInputActionsModal();\n }\n } finally {\n this.saveTargetProjectBusy_$.set(false);\n }\n }\n\n /**\n * Hub: Classify with LLM confirm megnyitása.\n */\n handleOpenClassifyConfirm(): void {\n if (this.hubClassifyLlmDisabled_$()) {\n return;\n }\n this.openGenericConfirm(\n 'Classify with LLM?',\n 'This will use the default LLM to set predicted type (USER-INPUT / bug-report / unspecified), and may suggest a target project and a clean description.',\n 'Classify',\n async (): Promise<void> => {\n await this.executeClassifyQuickInputWithLlm();\n },\n );\n }\n\n /**\n * Hub: default LLM — predictedType (user-input / bug-report / unspecified) + opcionális predicted projekt / összefoglaló.\n */\n async executeClassifyQuickInputWithLlm(): Promise<void> {\n const item: CCAP_UserInputListItem_Interface | undefined = this.selectedItem_$();\n const pathProjectId: string = String(item?.projectId ?? '').trim();\n if (!item || !pathProjectId.length || !item.rawContent.trim()) {\n return;\n }\n if (this.hubClassifyLlmDisabled_$()) {\n return;\n }\n this.classifyQuickInputBusy_$.set(true);\n try {\n const ok: boolean = await this.userInput_DS.classifyQuickInputWithLlm({\n pathProjectId: pathProjectId,\n quickInputId: item.quickInputId,\n });\n if (!ok) {\n this.globalError_CS.showError(\n new Error('Quick input LLM classify failed'),\n 'ccap-quick-input-llm-classify',\n );\n }\n } finally {\n this.classifyQuickInputBusy_$.set(false);\n }\n }\n\n /**\n * Hub: Edit confirm megnyitása.\n */\n handleOpenEditConfirm(): void {\n this.openGenericConfirm(\n 'Edit raw content?',\n 'This opens the text editor for the raw content of this Quick Input.',\n 'Open editor',\n async (): Promise<void> => {\n this.executeOpenEdit();\n },\n );\n }\n\n /** Hub: szerkesztés panel. */\n executeOpenEdit(): void {\n const item: CCAP_UserInputListItem_Interface | undefined = this.selectedItem_$();\n if (!item) {\n return;\n }\n this.editRaw_$.set(item.rawContent);\n this.editTitle_$.set(item.title ?? '');\n this.pane_$.set(UIn_QuickInputModalPane_Type.edit);\n }\n\n /**\n * Mentés: PATCH rawContent.\n */\n async handleSaveEdit(): Promise<void> {\n const item: CCAP_UserInputListItem_Interface | undefined = this.selectedItem_$();\n const pathProjectId: string = String(item?.projectId ?? '').trim();\n if (!item || !pathProjectId.length) {\n return;\n }\n const nextRaw: string = this.editRaw_$().trim();\n if (!nextRaw.length) {\n return;\n }\n const nextTitleRaw: string = this.editTitle_$().trim();\n const currentTitle: string = String(item.title ?? '').trim();\n const body: PM_QuickInputPatchHttpBody_Request = { rawContent: nextRaw };\n if (nextTitleRaw !== currentTitle) {\n body.title = nextTitleRaw.length > 0 ? nextTitleRaw : null;\n }\n this.editSaveBusy_$.set(true);\n try {\n const updated = await this.userInput_DS.patchQuickInput({\n pathProjectId: pathProjectId,\n quickInputId: item.quickInputId,\n body: body,\n });\n if (updated !== null) {\n this.pane_$.set(UIn_QuickInputModalPane_Type.hub);\n }\n } finally {\n this.editSaveBusy_$.set(false);\n }\n }\n\n /**\n * Hub: Wizard confirm megnyitása.\n */\n handleOpenWizardConfirm(): void {\n if (!this.canPromoteWithSyncedTarget_$()) {\n return;\n }\n this.openGenericConfirm(\n 'Start USER-INPUT wizard?',\n 'This starts the AI-assisted USER-INPUT wizard. The Quick Input raw content will be used as seed text.',\n 'Start wizard',\n async (): Promise<void> => {\n this.executeOpenWizard();\n },\n );\n }\n\n /** Hub: wizard (AI suggest). */\n executeOpenWizard(): void {\n const item: CCAP_UserInputListItem_Interface | undefined = this.selectedItem_$();\n if (!item || !this.canPromote_$()) {\n return;\n }\n this.wizardSeedRaw_$.set(item.rawContent);\n this.pane_$.set(UIn_QuickInputModalPane_Type.wizard);\n }\n\n /**\n * Hub: Direct finalize confirm megnyitása.\n */\n handleOpenDirectConfirm(): void {\n if (!this.canPromoteWithSyncedTarget_$()) {\n return;\n }\n this.openGenericConfirm(\n 'Start direct finalize?',\n 'This opens the direct finalization form (without AI suggestions). The Quick Input raw content will be used as seed text.',\n 'Start direct',\n async (): Promise<void> => {\n this.executeOpenDirect();\n },\n );\n }\n\n /** Hub: közvetlen meta + finalize. */\n executeOpenDirect(): void {\n const item: CCAP_UserInputListItem_Interface | undefined = this.selectedItem_$();\n if (!item || !this.canPromote_$()) {\n return;\n }\n this.wizardSeedRaw_$.set(item.rawContent);\n this.pane_$.set(UIn_QuickInputModalPane_Type.direct);\n }\n\n /**\n * USER-INPUT finalize siker — Quick Input promóció + modal zárás.\n */\n async handleWizardFinalizeSuccess(result: PM_UserInputFinalize_Response): Promise<void> {\n const item: CCAP_UserInputListItem_Interface | undefined = this.selectedItem_$();\n if (!item) {\n return;\n }\n const urId: string = String(result.userRequest._id ?? '');\n const pathProjectId: string = String(item.projectId ?? '').trim();\n const patched = await this.userInput_DS.patchQuickInput({\n pathProjectId: pathProjectId,\n quickInputId: item.quickInputId,\n body: {\n status: PM_QuickInputStatus_Type.promotedUserInput,\n promotedUserRequestId: urId,\n },\n });\n if (patched === null) {\n this.globalError_CS.showError(\n new Error('Quick input promotion PATCH failed after USER-INPUT finalize'),\n 'ccap-quick-input-promote-user-input',\n );\n return;\n }\n const code: string = String(result.userRequest.code ?? urId);\n this.postPromotionCleanupEntityLabel_$.set('USER-INPUT ' + code);\n this.postPromotionCleanupOpen_$.set(true);\n }\n\n /**\n * Hub: Bug report confirm megnyitása.\n */\n handleOpenBugConfirm(): void {\n if (!this.canPromoteWithSyncedTarget_$()) {\n return;\n }\n this.openGenericConfirm(\n 'Report bug?',\n 'This opens the bug report form pre-filled with the Quick Input raw content.',\n 'Open bug form',\n async (): Promise<void> => {\n this.executeOpenBugModal();\n },\n );\n }\n\n /** Hub: nested bug modal megnyitása prefill-lel. */\n executeOpenBugModal(): void {\n const item: CCAP_UserInputListItem_Interface | undefined = this.selectedItem_$();\n if (!item || !this.canPromote_$()) {\n return;\n }\n const raw: string = item.rawContent;\n const firstLine: string = raw.split('\\n')[0]?.trim() ?? '';\n const titleSeed: string = firstLine.length > 0 ? firstLine : 'Quick input';\n this.bugPrefillTitle_$.set(titleSeed);\n this.bugPrefillDetails_$.set(raw);\n this.manualBugModalOpen_$.set(true);\n }\n\n /** Nested bug modal bezárás. */\n handleBugModalClosed(): void {\n this.manualBugModalOpen_$.set(false);\n }\n\n /**\n * Manual bug POST + Quick Input promóció.\n */\n async handleBugSubmitted(body: PM_ManualBugCreate_Request): Promise<void> {\n const item: CCAP_UserInputListItem_Interface | undefined = this.selectedItem_$();\n const targetPid: string = this.targetProjectId_$().trim();\n const pathProjectId: string = String(item?.projectId ?? '').trim();\n if (!item || !targetPid.length || !pathProjectId.length) {\n return;\n }\n this.manualBugBusy_$.set(true);\n try {\n const result: PM_ManualBugCreate_Response =\n await this.pm_DS.createManualBugAndRefresh(targetPid, body);\n const patchedBug = await this.userInput_DS.patchQuickInput({\n pathProjectId: pathProjectId,\n quickInputId: item.quickInputId,\n body: {\n status: PM_QuickInputStatus_Type.promotedBug,\n promotedBugCode: result.createdCode,\n promotedUserRequestId: result.userRequestId,\n },\n });\n if (patchedBug === null) {\n this.globalError_CS.showError(\n new Error('Quick input promotion PATCH failed after manual bug create'),\n 'ccap-quick-input-promote-bug',\n );\n return;\n }\n this.manualBugModalOpen_$.set(false);\n this.postPromotionCleanupEntityLabel_$.set('Bug ' + String(result.createdCode ?? ''));\n this.postPromotionCleanupOpen_$.set(true);\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'ccap-quick-input-manual-bug');\n } finally {\n this.manualBugBusy_$.set(false);\n }\n }\n\n /** Hub: törlés megerősítő popup megnyitása. */\n handleOpenQuickInputDeleteConfirm(): void {\n if (this.hubDeleteDisabled_$()) {\n return;\n }\n this.quickInputDeleteConfirmOpen_$.set(true);\n }\n\n /** Törlés confirm bezárás — fő Entity Details modal nyitva marad. */\n handleQuickInputDeleteConfirmClosed(): void {\n this.quickInputDeleteConfirmOpen_$.set(false);\n }\n\n /**\n * Megerősített DELETE — siker esetén confirm + Entity Details zárás; hiba → globális error UI.\n */\n async handleConfirmDeleteQuickInput(): Promise<void> {\n const item: CCAP_UserInputListItem_Interface | undefined = this.selectedItem_$();\n const pathProjectId: string = String(item?.projectId ?? '').trim();\n if (!item || !pathProjectId.length) {\n return;\n }\n this.deleteQuickInputBusy_$.set(true);\n try {\n const ok: boolean = await this.userInput_DS.deleteQuickInput({\n pathProjectId: pathProjectId,\n quickInputId: item.quickInputId,\n });\n if (!ok) {\n this.globalError_CS.showError(\n new Error('Quick input DELETE failed'),\n 'ccap-quick-input-delete',\n );\n return;\n }\n this.quickInputDeleteConfirmOpen_$.set(false);\n this.userInput_DS.closeQuickInputActionsModal();\n } finally {\n this.deleteQuickInputBusy_$.set(false);\n }\n }\n\n // ── Generic confirm modal kezelők ─────────────────────────────────\n\n /**\n * Generikus confirm modal megnyitása — cím, leírás, gomb felirat és a megerősítés utáni akció.\n */\n openGenericConfirm(\n title: string,\n body: string,\n buttonLabel: string,\n action: () => Promise<void>,\n ): void {\n this.genericConfirmTitle_$.set(title);\n this.genericConfirmBody_$.set(body);\n this.genericConfirmButtonLabel_$.set(buttonLabel);\n this.pendingGenericConfirmAction_ = action;\n this.genericConfirmOpen_$.set(true);\n }\n\n /** Generikus confirm: megerősítés — futtatja a pending akciót, majd bezárja a popupot. */\n async handleGenericConfirm(): Promise<void> {\n if (!this.pendingGenericConfirmAction_) {\n return;\n }\n this.genericConfirmBusy_$.set(true);\n try {\n await this.pendingGenericConfirmAction_();\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'ccap-quick-input-generic-confirm');\n } finally {\n this.genericConfirmBusy_$.set(false);\n this.genericConfirmOpen_$.set(false);\n this.pendingGenericConfirmAction_ = null;\n }\n }\n\n /** Generikus confirm: bezárás / mégse. */\n handleGenericConfirmClosed(): void {\n this.genericConfirmOpen_$.set(false);\n this.pendingGenericConfirmAction_ = null;\n }\n\n // ── Post-promotion cleanup kezelők ─────────────────────────────────\n\n /**\n * Promóció utáni törlés: user jóváhagyta — törli a Quick Input-ot, majd zárja az összes modalt.\n */\n async handlePostPromotionDelete(): Promise<void> {\n const item: CCAP_UserInputListItem_Interface | undefined = this.selectedItem_$();\n const pathProjectId: string = String(item?.projectId ?? '').trim();\n if (!item || !pathProjectId.length) {\n this.postPromotionCleanupOpen_$.set(false);\n this.userInput_DS.closeQuickInputActionsModal();\n return;\n }\n this.postPromotionCleanupBusy_$.set(true);\n try {\n const ok: boolean = await this.userInput_DS.deleteQuickInput({\n pathProjectId: pathProjectId,\n quickInputId: item.quickInputId,\n });\n if (!ok) {\n this.globalError_CS.showError(\n new Error('Quick input DELETE failed during post-promotion cleanup'),\n 'ccap-quick-input-post-promotion-delete',\n );\n }\n } finally {\n this.postPromotionCleanupBusy_$.set(false);\n this.postPromotionCleanupOpen_$.set(false);\n this.postPromotionCleanupRouteCmds_$.set(null);\n this.userInput_DS.closeQuickInputActionsModal();\n }\n }\n\n /**\n * Promóció utáni megtartás: user nem kéri a törlést — a Quick Input promoted státuszban marad.\n */\n handlePostPromotionKeep(): void {\n this.postPromotionCleanupOpen_$.set(false);\n this.postPromotionCleanupRouteCmds_$.set(null);\n this.userInput_DS.closeQuickInputActionsModal();\n }\n\n /**\n * REQ-QI-001: session-promotion esetén \"Go to session\" — navigálunk a létrejött session-re.\n * A Quick Input intact marad (keep szemantika) — a user a session-ben folytatja, a QI törlése\n * később a listán vagy a panelen kézzel lehetséges.\n */\n handlePostPromotionGoToSession(): void {\n const cmds: string[] | null = this.postPromotionCleanupRouteCmds_$();\n this.postPromotionCleanupOpen_$.set(false);\n this.postPromotionCleanupRouteCmds_$.set(null);\n this.userInput_DS.closeQuickInputActionsModal();\n if (cmds) {\n void this.router.navigate(cmds);\n }\n }\n\n /** Promóció utáni cleanup popup bezárás (X vagy Escape) — megtartásként kezeljük. */\n handlePostPromotionCleanupClosed(): void {\n if (this.postPromotionCleanupBusy_$()) {\n return;\n }\n this.handlePostPromotionKeep();\n }\n\n // ── Send to session kezelők ───────────────────────────────────────\n\n /**\n * Hub: Send-to-session modal megnyitása a cél típussal; betölti az adott session lista frissítést.\n */\n async handleOpenSendToSession(target: UIn_QuickInputSendSessionTarget_Type): Promise<void> {\n if (this.hubSendToSessionDisabled_$()) {\n return;\n }\n const item: CCAP_UserInputListItem_Interface | undefined = this.selectedItem_$();\n this.sendToSessionType_$.set(target);\n this.sendToSessionSelectedId_$.set(this.SEND_NEW_SESSION_VALUE);\n this.sendToSessionContent_$.set(item?.rawContent ?? '');\n this.sendToSessionBusy_$.set(false);\n this.sendToSessionFeedback_$.set('');\n this.sendToSessionOpen_$.set(true);\n try {\n if (target === UIn_QuickInputSendSessionTarget_Type.caSession) {\n await Promise.all([\n this.caSession_DS.loadSessions(),\n this.newAgentSessionWorkspace_DS.refreshWorkspacePathPickerOptions(),\n ]);\n } else if (target === UIn_QuickInputSendSessionTarget_Type.ccSession) {\n await Promise.all([\n this.ccSession_DS.loadSessions(),\n this.newAgentSessionWorkspace_DS.refreshWorkspacePathPickerOptions(),\n ]);\n } else {\n await this.session_DS.loadSessions();\n }\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'ccap-quick-input-send-to-session-load');\n }\n }\n\n /** Send-to-session modal bezárás. */\n handleSendToSessionClosed(): void {\n this.sendToSessionOpen_$.set(false);\n this.sendToSessionSelectedId_$.set(this.SEND_NEW_SESSION_VALUE);\n this.sendToSessionContent_$.set('');\n if (this.sendToSessionFeedbackClearHandle !== undefined) {\n clearTimeout(this.sendToSessionFeedbackClearHandle);\n this.sendToSessionFeedbackClearHandle = undefined;\n }\n }\n\n /**\n * Send-to-session: megerősítés — ha `__new__`, új session-t hoz létre; tartalom elküldése a session-be.\n */\n async handleConfirmSendToSession(): Promise<void> {\n const content: string = this.sendToSessionContent_$().trim();\n if (!content.length) {\n return;\n }\n const selectedId: string = this.sendToSessionSelectedId_$().trim();\n if (!selectedId.length) {\n return;\n }\n this.sendToSessionBusy_$.set(true);\n try {\n const target: UIn_QuickInputSendSessionTarget_Type = this.sendToSessionType_$();\n const isNew: boolean = selectedId === this.SEND_NEW_SESSION_VALUE;\n let sessionId: string = isNew ? '' : selectedId;\n if (isNew) {\n // Ha a Quick Input-nak van explicit title-je, az lesz az új session neve; különben QI- + rawContent snippet.\n const currentItem: CCAP_UserInputListItem_Interface | undefined = this.selectedItem_$();\n const newSessionDisplayName: string =\n UIn_QuickInputNewSessionName_Util.buildDisplayNameFromQuickInput({\n rawContent: content,\n title: currentItem?.title,\n });\n sessionId = await this.createNewSessionForSend(target, {\n displayName: newSessionDisplayName,\n });\n }\n if (!sessionId.length) {\n this.globalError_CS.showError(\n new Error('Failed to resolve session id for send'),\n 'ccap-quick-input-send-to-session-resolve',\n );\n return;\n }\n if (target === UIn_QuickInputSendSessionTarget_Type.caSession) {\n await this.caSession_DS.sendPrompt({ sessionId: sessionId, content: content });\n } else if (target === UIn_QuickInputSendSessionTarget_Type.ccSession) {\n await this.ccSession_DS.sendPrompt({ sessionId: sessionId, content: content });\n } else {\n await this.session_DS.sendMessageToSession({ sessionId: sessionId, content: content });\n }\n this.sendToSessionFeedback_$.set('Sent.');\n if (this.sendToSessionFeedbackClearHandle !== undefined) {\n clearTimeout(this.sendToSessionFeedbackClearHandle);\n }\n this.sendToSessionFeedbackClearHandle = window.setTimeout((): void => {\n this.sendToSessionFeedback_$.set('');\n this.sendToSessionFeedbackClearHandle = undefined;\n }, 3 * second);\n this.sendToSessionOpen_$.set(false);\n // REQ-QI-009: új session létrejötte is entity-creation — cleanup popup a QI sorsáról.\n // Meglévő session-be küldésnél nincs új entity, ezért nem nyitjuk a popup-ot.\n if (isNew) {\n const sessionKind: string = target === UIn_QuickInputSendSessionTarget_Type.caSession\n ? 'CA Session'\n : target === UIn_QuickInputSendSessionTarget_Type.ccSession\n ? 'CC Session'\n : 'Session';\n this.postPromotionCleanupEntityLabel_$.set(sessionKind + ' ' + sessionId);\n // REQ-QI-001: opcionális \"Go to session\" nav — session-típusonként a megfelelő route.\n const routePrefix: string = target === UIn_QuickInputSendSessionTarget_Type.caSession\n ? '/ca-session'\n : target === UIn_QuickInputSendSessionTarget_Type.ccSession\n ? '/cc-session'\n : '/session';\n this.postPromotionCleanupRouteCmds_$.set([routePrefix, sessionId]);\n this.postPromotionCleanupOpen_$.set(true);\n }\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'ccap-quick-input-send-to-session');\n } finally {\n this.sendToSessionBusy_$.set(false);\n }\n }\n\n /**\n * Új session létrehozása a cél típusnak megfelelően (CA / CC: workspace path + label; CCAP: opcionális név).\n */\n private async createNewSessionForSend(\n target: UIn_QuickInputSendSessionTarget_Type,\n options: { displayName: string },\n ): Promise<string> {\n if (target === UIn_QuickInputSendSessionTarget_Type.caSession) {\n const workspacePath: string = this.resolveDefaultWorkspacePath();\n return await this.caSession_DS.createSession({\n workspacePath: workspacePath,\n label: options.displayName,\n });\n }\n if (target === UIn_QuickInputSendSessionTarget_Type.ccSession) {\n const workspacePath: string = this.resolveDefaultWorkspacePath();\n return await this.ccSession_DS.createSession({\n workspacePath: workspacePath,\n label: options.displayName,\n });\n }\n const ccapSession = await this.session_DS.createSession({ name: options.displayName });\n return String(ccapSession._id ?? '');\n }\n\n /**\n * Default workspace path feloldása az elérhető opciókból (első elem, ha van).\n */\n private resolveDefaultWorkspacePath(): string {\n const options = this.newAgentSessionWorkspace_DS.workspacePathPickerOptions_$();\n if (options.length > 0) {\n return options[0].path;\n }\n return '';\n }\n}\n", "<app-s-modal [isOpen]=\"userInput_DS.quickInputActionsModalOpen_$()\"\n [title]=\"mainModalTitle_$()\"\n maxWidth=\"5xl\"\n [zIndex]=\"quickInputOverlayModalZIndex_Value\"\n headerBorderClass=\"border-ccapAccent/30\"\n (closed)=\"handleMainModalClosed()\">\n @if (selectedItem_$(); as sel) {\n @switch (pane_$()) {\n @case (Pane.hub) {\n <div class=\"flex flex-col gap-4 text-sm text-neutral-200\">\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex flex-col gap-1\">\n <div class=\"flex items-center justify-between gap-2 min-h-8\">\n <span class=\"text-xs font-medium text-neutral-400\">User Quick Input Content</span>\n <div class=\"flex items-center gap-2 shrink-0\">\n @if (copyFeedback_$()) {\n <span class=\"text-xs text-neonCyan/90\">{{ copyFeedback_$() }}</span>\n }\n <button type=\"button\"\n class=\"p-1.5 rounded-md border border-neutral-600 text-neutral-300\n hover:border-ccapAccent/50 hover:text-ccapAccent hover:bg-neutral-800/80\n transition-colors duration-150 disabled:opacity-40 disabled:pointer-events-none\"\n [disabled]=\"hubCopyDisabled_$()\"\n (click)=\"handleOpenCopyConfirm()\"\n title=\"Copy raw content to clipboard\"\n aria-label=\"Copy Quick Input raw content to clipboard\">\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\"/>\n </svg>\n </button>\n <button type=\"button\"\n class=\"p-1.5 rounded-md border border-neutral-600 text-neutral-300\n hover:border-ccapAccent/50 hover:text-ccapAccent hover:bg-neutral-800/80\n transition-colors duration-150\"\n (click)=\"executeOpenEdit()\"\n title=\"Edit raw content\"\n aria-label=\"Edit Quick Input raw content\">\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\"/>\n </svg>\n </button>\n </div>\n </div>\n @if (hubCopyDisabledHint_$(); as copyHint) {\n <p class=\"text-xs text-neutral-500\">{{ copyHint }}</p>\n }\n </div>\n <div class=\"rounded-lg border border-ccapAccent/30 bg-neutral-950/70 px-3 py-2.5 max-h-[min(40dvh,18rem)]\n overflow-y-auto\">\n <p class=\"text-sm text-neutral-100 whitespace-pre-wrap break-words\">{{ sel.rawContent }}</p>\n </div>\n </div>\n <div class=\"grid grid-cols-[minmax(6rem,auto)_1fr] gap-x-3 gap-y-2 text-xs border border-neutral-700/80\n rounded-lg bg-neutral-950/50 px-3 py-2.5\">\n <span class=\"text-neutral-500 shrink-0\">ID</span>\n <span class=\"font-mono text-neutral-300 break-all\">{{ sel.quickInputId }}</span>\n <span class=\"text-neutral-500 shrink-0\">Project ID</span>\n <span class=\"font-mono text-neutral-300 break-all\">{{ sel.projectId }}</span>\n <span class=\"text-neutral-500 shrink-0\">Status</span>\n <span>\n <span class=\"text-[10px] uppercase tracking-wide px-1.5 py-0.5 rounded border border-neutral-600\n text-neutral-400\">\n @switch (sel.status) {\n @case (QiStatus.draft) { draft }\n @case (QiStatus.promotedUserInput) { USER-INPUT }\n @case (QiStatus.promotedBug) { BUG }\n @case (QiStatus.discarded) { discarded }\n }\n </span>\n </span>\n <span class=\"text-neutral-500 shrink-0\">Task difficulty</span>\n <span>\n <select class=\"w-full max-w-[14rem] rounded-md border border-neutral-600 bg-neutral-900 px-2 py-1\n text-xs text-neutral-200 focus:outline-none focus:border-ccapAccent/50\"\n [ngModel]=\"taskDifficulty_$()\"\n (ngModelChange)=\"handleTaskDifficultySelectChange($event)\"\n [disabled]=\"hubGridPatchBusy_$() || hubDeleteDisabled_$()\">\n <option value=\"\">—</option>\n <option [value]=\"QiTaskDiff.easy\">Easy</option>\n <option [value]=\"QiTaskDiff.medium\">Medium</option>\n <option [value]=\"QiTaskDiff.hard\">Hard</option>\n <option [value]=\"QiTaskDiff.komplex\">Komplex</option>\n </select>\n </span>\n <span class=\"text-neutral-500 shrink-0\">Priority</span>\n <span>\n <select class=\"w-full max-w-[14rem] rounded-md border border-neutral-600 bg-neutral-900 px-2 py-1\n text-xs text-neutral-200 focus:outline-none focus:border-ccapAccent/50\"\n [ngModel]=\"priority_$()\"\n (ngModelChange)=\"handlePrioritySelectChange($event)\"\n [disabled]=\"hubGridPatchBusy_$() || hubDeleteDisabled_$()\">\n <option value=\"\">—</option>\n <option [value]=\"QiPriority.low\">Low</option>\n <option [value]=\"QiPriority.medium\">Medium</option>\n <option [value]=\"QiPriority.high\">High</option>\n <option [value]=\"QiPriority.urgent\">Urgent</option>\n </select>\n </span>\n <span class=\"text-neutral-500 shrink-0 self-start pt-1.5\">Area</span>\n <span class=\"flex flex-col gap-1.5 min-w-0\">\n <input type=\"text\"\n class=\"w-full max-w-md rounded-md border border-neutral-600 bg-neutral-900 px-2 py-1 text-xs\n text-neutral-200 font-mono placeholder:text-neutral-600 focus:outline-none\n focus:border-ccapAccent/50\"\n placeholder=\"e.g. frontend/session\"\n [ngModel]=\"area_$()\"\n (ngModelChange)=\"area_$.set($event)\"\n [disabled]=\"hubGridPatchBusy_$() || hubDeleteDisabled_$()\" />\n <div class=\"flex flex-wrap items-center gap-2\">\n <button type=\"button\"\n (click)=\"handleSaveArea()\"\n [disabled]=\"!isAreaDirty_$() || hubGridPatchBusy_$() || hubDeleteDisabled_$()\"\n class=\"px-2 py-1 rounded border border-ccapAccent/50 text-ccapAccent text-xs font-medium\n hover:bg-ccapAccent/10 transition-colors disabled:opacity-40\n disabled:pointer-events-none\"\n title=\"Persist the edited Area tag (triage grouping) on this Quick Input.\">\n {{ areaPatchBusy_$() ? 'Saving…' : 'Save area' }}\n </button>\n </div>\n </span>\n <span class=\"text-neutral-500 shrink-0 self-start pt-1.5\">Elements</span>\n <span class=\"flex flex-col gap-1.5 min-w-0\">\n <div class=\"flex flex-wrap gap-2 items-center\">\n <input type=\"text\"\n class=\"flex-1 min-w-[10rem] max-w-md rounded-md border border-neutral-600 bg-neutral-900 px-2 py-1\n text-xs text-neutral-200 font-mono placeholder:text-neutral-600 focus:outline-none\n focus:border-ccapAccent/50\"\n placeholder=\"Add identifier\"\n [ngModel]=\"newElementLine_$()\"\n (ngModelChange)=\"newElementLine_$.set($event)\"\n (keydown.enter)=\"handleHubAddElementLine(); $event.preventDefault()\"\n [disabled]=\"hubGridPatchBusy_$() || hubDeleteDisabled_$()\" />\n <button type=\"button\"\n (click)=\"handleHubAddElementLine()\"\n [disabled]=\"hubGridPatchBusy_$() || hubDeleteDisabled_$()\"\n class=\"px-2 py-1 rounded border border-neutral-600 text-xs text-neutral-200\n hover:border-ccapAccent/50 shrink-0 disabled:opacity-40\"\n title=\"Append the typed identifier to the Elements draft list (Save elements to persist).\">\n Add\n </button>\n </div>\n @if (elementsDraft_$().length > 0) {\n <div class=\"flex flex-wrap gap-1.5\">\n @for (el of elementsDraft_$(); track el; let ei = $index) {\n <span class=\"inline-flex items-center gap-1 pl-2 pr-1 py-0.5 rounded border border-neutral-600\n bg-neutral-900/80 text-[11px] font-mono text-neutral-300 max-w-full\">\n <span class=\"truncate max-w-[12rem]\">{{ el }}</span>\n <button type=\"button\"\n class=\"p-0.5 rounded text-neutral-500 hover:text-red-400 shrink-0\"\n [disabled]=\"hubGridPatchBusy_$() || hubDeleteDisabled_$()\"\n (click)=\"handleHubRemoveElementAt(ei)\"\n title=\"Remove\"\n aria-label=\"Remove element\">\n <svg class=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M6 18L18 6M6 6l12 12\"/>\n </svg>\n </button>\n </span>\n }\n </div>\n }\n <button type=\"button\"\n (click)=\"handleSaveElements()\"\n [disabled]=\"!isElementsDirty_$() || hubGridPatchBusy_$() || hubDeleteDisabled_$()\"\n class=\"px-2 py-1 rounded border border-ccapAccent/50 text-ccapAccent text-xs font-medium\n hover:bg-ccapAccent/10 transition-colors disabled:opacity-40\n disabled:pointer-events-none w-fit\"\n title=\"Persist the edited Elements list (identifier tags) on this Quick Input.\">\n {{ elementsPatchBusy_$() ? 'Saving…' : 'Save elements' }}\n </button>\n </span>\n <span class=\"text-neutral-500 shrink-0\">Created</span>\n <span class=\"text-neutral-300\">\n @if (sel.createdAt) {\n {{ sel.createdAt | date:'yyyy.MM.dd HH:mm' }}\n } @else {\n —\n }\n </span>\n <span class=\"text-neutral-500 shrink-0\">Updated</span>\n <span class=\"text-neutral-300\">\n @if (sel.updatedAt) {\n {{ sel.updatedAt | date:'yyyy.MM.dd HH:mm' }}\n } @else {\n —\n }\n </span>\n @if (sel.promotedUserRequestId) {\n <span class=\"text-neutral-500 shrink-0\">User request ID</span>\n <span class=\"font-mono text-neutral-300 break-all\">{{ sel.promotedUserRequestId }}</span>\n }\n @if (sel.promotedBugCode) {\n <span class=\"text-neutral-500 shrink-0\">Bug code</span>\n <span class=\"font-mono text-neutral-300 break-all\">{{ sel.promotedBugCode }}</span>\n }\n @if (sel.predictedType) {\n <span class=\"text-neutral-500 shrink-0\">Predicted type</span>\n <span>\n <span class=\"text-[10px] uppercase tracking-wide px-1.5 py-0.5 rounded border border-neutral-600\n text-neutral-400\">\n @switch (sel.predictedType) {\n @case (QiPredType.userInput) { user-input }\n @case (QiPredType.bugReport) { bug-report }\n @case (QiPredType.unspecified) { unspecified }\n }\n </span>\n </span>\n }\n @if (sel.predictedProjectId) {\n <span class=\"text-neutral-500 shrink-0\">Predicted project ID</span>\n <span class=\"font-mono text-neutral-300 break-all\">{{ sel.predictedProjectId }}</span>\n }\n </div>\n @if (sel.predictedCleanDescription) {\n <div class=\"rounded-lg border border-neutral-700/60 bg-neutral-950/40 px-3 py-2\">\n <span class=\"text-[10px] uppercase tracking-wide text-neutral-500\">Predicted summary</span>\n <p class=\"text-xs text-neutral-400 mt-1 whitespace-pre-wrap break-words\">\n {{ sel.predictedCleanDescription }}\n </p>\n </div>\n }\n <div class=\"flex flex-col gap-2 rounded-lg border border-neutral-700/80 bg-neutral-950/30 px-3 py-2.5\">\n <!-- REQ-QI-010: bezárható blokk — Target project -->\n <button type=\"button\"\n class=\"flex items-center gap-2 text-left text-xs font-medium text-neutral-400\n hover:text-ccapAccent transition-colors\"\n (click)=\"toggleHubBlock('target-project')\"\n [attr.aria-expanded]=\"!hubCollapsedBlocks_$()['target-project']\"\n aria-label=\"Target project block összecsukása / kinyitása\">\n <svg class=\"w-3 h-3 shrink-0 transition-transform\"\n [class.-rotate-90]=\"hubCollapsedBlocks_$()['target-project']\"\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n <span>Target project (promotion)</span>\n </button>\n @if (!hubCollapsedBlocks_$()['target-project']) {\n <p class=\"text-xs text-neutral-500\">\n Classify with LLM sets predicted type (USER-INPUT vs bug-report vs unspecified) and may suggest a target\n project id from the registered list. Use Apply prediction to copy an LLM-suggested project into the\n select above.\n </p>\n <select class=\"w-full rounded-md border border-neutral-600 bg-neutral-900 px-2 py-1.5 text-sm text-neutral-200\n focus:outline-none focus:border-ccapAccent/50\"\n [ngModel]=\"targetProjectId_$()\"\n (ngModelChange)=\"targetProjectId_$.set($event)\">\n @for (project of userInput_DS.projects_$(); track project._id) {\n <option [value]=\"project._id\">{{ project.name }}</option>\n }\n </select>\n <div class=\"flex flex-wrap gap-2\">\n <button type=\"button\"\n (click)=\"handleOpenClassifyConfirm()\"\n [disabled]=\"hubClassifyLlmDisabled_$() || classifyQuickInputBusy_$()\"\n class=\"px-2 py-1 rounded border border-neonCyan/45 text-neonCyan/90 text-xs font-medium\n hover:bg-neonCyan/10 transition-colors disabled:opacity-40\n disabled:pointer-events-none\"\n title=\"Run an LLM classification on the raw content; fills predicted type, clean description, and staging priority.\">\n {{ classifyQuickInputBusy_$() ? 'Classifying…' : 'Classify with LLM' }}\n </button>\n <button type=\"button\"\n (click)=\"handleOpenApplyPredictionConfirm()\"\n [disabled]=\"hubApplyPredictionDisabled_$()\"\n class=\"px-2 py-1 rounded border border-neutral-600 text-neutral-200 text-xs font-medium\n hover:border-ccapAccent/50 transition-colors disabled:opacity-40\n disabled:pointer-events-none\"\n title=\"Copy the LLM prediction (task difficulty, priority, area) into the editable hub fields without persisting yet.\">\n Apply prediction\n </button>\n <button type=\"button\"\n (click)=\"handleOpenSaveTargetProjectConfirm()\"\n [disabled]=\"!isTargetProjectDirty_$() || saveTargetProjectBusy_$()\"\n class=\"px-2 py-1 rounded border border-ccapAccent/50 text-ccapAccent text-xs font-medium\n hover:bg-ccapAccent/10 transition-colors disabled:opacity-40\n disabled:pointer-events-none\"\n title=\"Persist the selected target project as this Quick Input's home project (required before promotion).\">\n {{ saveTargetProjectBusy_$() ? 'Saving…' : 'Save target project' }}\n </button>\n </div>\n @if (hubClassifyLlmDisabledHint_$(); as clfHint) {\n <p class=\"text-xs text-neutral-500\">{{ clfHint }}</p>\n }\n @if (hubApplyPredictionDisabledHint_$(); as apHint) {\n <p class=\"text-xs text-neutral-500\">{{ apHint }}</p>\n }\n @if (hubSaveTargetProjectDisabledHint_$(); as stHint) {\n <p class=\"text-xs text-neutral-500\">{{ stHint }}</p>\n }\n @if (isTargetProjectDirty_$()) {\n <p class=\"text-xs text-amber-400/90 border border-amber-900/30 rounded px-2 py-1\">\n Target project differs from the record. Save target project before promoting, or the promotion APIs\n would disagree with the stored home project.\n </p>\n }\n } <!-- end @if target-project not collapsed -->\n </div>\n <div class=\"rounded-lg border border-neutral-700/80 bg-neutral-950/30 px-3 py-2.5 flex flex-col gap-2\">\n <!-- REQ-QI-010: bezárható blokk — Send to session -->\n <button type=\"button\"\n class=\"flex items-center gap-2 text-left text-xs font-medium text-neutral-400\n hover:text-ccapAccent transition-colors\"\n (click)=\"toggleHubBlock('send-to-session')\"\n [attr.aria-expanded]=\"!hubCollapsedBlocks_$()['send-to-session']\"\n aria-label=\"Send to session block összecsukása / kinyitása\">\n <svg class=\"w-3 h-3 shrink-0 transition-transform\"\n [class.-rotate-90]=\"hubCollapsedBlocks_$()['send-to-session']\"\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n <span>Send to session</span>\n </button>\n @if (!hubCollapsedBlocks_$()['send-to-session']) {\n <p class=\"text-xs text-neutral-500\">\n Send the raw content of this Quick Input as a prompt to an active CA, CC, or CCAP session.\n </p>\n @if (sendToSessionFeedback_$(); as stsFeedback) {\n <p class=\"text-xs text-neonCyan/90\">{{ stsFeedback }}</p>\n }\n <div class=\"flex flex-wrap gap-2\">\n <button type=\"button\"\n (click)=\"handleOpenSendToSession(SendTarget.caSession)\"\n [disabled]=\"hubSendToSessionDisabled_$()\"\n class=\"px-2 py-1 rounded border border-neonCyan/45 text-neonCyan/90 text-xs font-medium\n hover:bg-neonCyan/10 transition-colors disabled:opacity-40\n disabled:pointer-events-none\"\n title=\"Send the raw content as a prompt to a CA (Cursor ACP) session you pick in the next step.\">\n Send to CA Session\n </button>\n <button type=\"button\"\n (click)=\"handleOpenSendToSession(SendTarget.ccSession)\"\n [disabled]=\"hubSendToSessionDisabled_$()\"\n class=\"px-2 py-1 rounded border border-neonCyan/45 text-neonCyan/90 text-xs font-medium\n hover:bg-neonCyan/10 transition-colors disabled:opacity-40\n disabled:pointer-events-none\"\n title=\"Send the raw content as a prompt to a CC (Claude Code) session you pick in the next step.\">\n Send to CC Session\n </button>\n <button type=\"button\"\n (click)=\"handleOpenSendToSession(SendTarget.ccapSession)\"\n [disabled]=\"hubSendToSessionDisabled_$()\"\n class=\"px-2 py-1 rounded border border-neonCyan/45 text-neonCyan/90 text-xs font-medium\n hover:bg-neonCyan/10 transition-colors disabled:opacity-40\n disabled:pointer-events-none\"\n title=\"Send the raw content as a user message to a CCAP Session (the internal agent) you pick in the next step.\">\n Send to CCAP Session\n </button>\n </div>\n @if (hubSendToSessionDisabled_$()) {\n <p class=\"text-xs text-neutral-500\">Send is disabled: raw content is empty.</p>\n }\n } <!-- end @if send-to-session not collapsed -->\n </div>\n @if (!canPromote_$()) {\n <p class=\"text-xs text-amber-400/90 border border-amber-900/40 rounded px-2 py-1.5\">\n This quick input is already promoted. You can still edit the staging text.\n </p>\n }\n <div class=\"flex flex-col gap-1.5\">\n <div class=\"flex flex-col gap-1 w-full sm:w-auto sm:self-start\">\n <button type=\"button\"\n (click)=\"handleOpenQuickInputDeleteConfirm()\"\n [disabled]=\"hubDeleteDisabled_$()\"\n class=\"px-2 py-1.5 rounded border border-neonRed/45 text-neonRed/90 text-xs font-medium\n hover:bg-neonRed/10 transition-colors text-left disabled:opacity-40\n disabled:pointer-events-none\"\n title=\"Permanently delete this Quick Input from the list. Requires confirm; disabled after promotion.\">\n Delete quick input\n </button>\n @if (hubDeleteDisabledHint_$(); as delHint) {\n <p class=\"text-xs text-neutral-500 max-w-md\">{{ delHint }}</p>\n }\n </div>\n <div class=\"rounded-lg border border-neutral-700/80 bg-neutral-950/25 px-3 py-2.5 flex flex-col gap-2\">\n <!-- REQ-QI-010: bezárható blokk — Project-related promotion -->\n <button type=\"button\"\n class=\"flex items-center gap-2 text-left text-xs font-medium text-neutral-300\n hover:text-ccapAccent transition-colors\"\n (click)=\"toggleHubBlock('project-promotion')\"\n [attr.aria-expanded]=\"!hubCollapsedBlocks_$()['project-promotion']\"\n aria-label=\"Project-related promotion block összecsukása / kinyitása\">\n <svg class=\"w-3 h-3 shrink-0 transition-transform\"\n [class.-rotate-90]=\"hubCollapsedBlocks_$()['project-promotion']\"\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n <span>Project-related promotion</span>\n </button>\n @if (!hubCollapsedBlocks_$()['project-promotion']) {\n <p class=\"text-xs text-neutral-500\">\n Wizard, direct finalize, and report bug use the target project above. They stay disabled until a\n target project is selected, the record matches it (save if you changed the select), and the item\n is still a draft.\n </p>\n @if (hubProjectPromotionActionsHint_$(); as promoHint) {\n <p class=\"text-xs text-amber-400/85 border border-amber-900/35 rounded px-2 py-1.5\">\n {{ promoHint }}\n </p>\n }\n <div class=\"grid grid-cols-1 sm:grid-cols-2 gap-1.5\">\n <button type=\"button\"\n (click)=\"handleOpenWizardConfirm()\"\n [disabled]=\"!canPromoteWithSyncedTarget_$()\"\n class=\"px-2 py-1.5 rounded border border-ccapAccent/50 text-ccapAccent text-xs font-medium\n hover:bg-ccapAccent/10 transition-colors text-left disabled:opacity-40\n disabled:pointer-events-none\"\n title=\"Open the multi-step AI-assisted USER-INPUT wizard; guides refinement before promotion.\">\n USER-INPUT wizard (AI)\n </button>\n <button type=\"button\"\n (click)=\"handleOpenDirectConfirm()\"\n [disabled]=\"!canPromoteWithSyncedTarget_$()\"\n class=\"px-2 py-1.5 rounded border border-neutral-500 text-neutral-200 text-xs font-medium\n hover:border-neonCyan/50 transition-colors text-left disabled:opacity-40\n disabled:pointer-events-none\"\n title=\"Directly finalize the promotion (skip the wizard): converts the draft into a USER-INPUT entry on the target project.\">\n Direct finalize\n </button>\n <button type=\"button\"\n (click)=\"handleOpenBugConfirm()\"\n [disabled]=\"!canPromoteWithSyncedTarget_$()\"\n class=\"px-2 py-1.5 rounded border border-neonRed/40 text-neonRed/90 text-xs font-medium\n hover:bg-neonRed/10 transition-colors text-left disabled:opacity-40\n sm:col-span-2 disabled:pointer-events-none\"\n title=\"Promote this Quick Input directly into a BUG entry on the target project.\">\n Report bug\n </button>\n </div>\n } <!-- end @if project-promotion not collapsed -->\n </div>\n </div>\n </div>\n }\n @case (Pane.edit) {\n <div class=\"flex flex-col gap-3\">\n <label class=\"text-xs text-neutral-400\">Title (optional — used as CCAP Session name)</label>\n <input type=\"text\"\n maxlength=\"200\"\n placeholder=\"Leave empty to fall back to QI- + raw content snippet\"\n class=\"w-full rounded border border-neutral-600 bg-neutral-900 px-3 py-2 text-sm text-neutral-100\"\n [ngModel]=\"editTitle_$()\"\n (ngModelChange)=\"editTitle_$.set($event)\" />\n <label class=\"text-xs text-neutral-400\">Raw content</label>\n <textarea rows=\"10\"\n class=\"w-full rounded border border-neutral-600 bg-neutral-900 px-3 py-2 text-sm text-neutral-100\n font-mono resize-y min-h-[160px]\"\n [ngModel]=\"editRaw_$()\"\n (ngModelChange)=\"editRaw_$.set($event)\"></textarea>\n <div class=\"flex flex-col gap-2 items-end\">\n @if (editSaveDisabledHint_$(); as esHint) {\n <p class=\"text-xs text-neutral-500 w-full text-left\">{{ esHint }}</p>\n }\n <div class=\"flex flex-wrap gap-2 justify-end w-full\">\n <button type=\"button\"\n (click)=\"handleBackToHub()\"\n class=\"px-3 py-1.5 text-xs rounded border border-neutral-600 text-neutral-300 hover:bg-neutral-800\">\n Back\n </button>\n <button type=\"button\"\n (click)=\"handleSaveEdit()\"\n [disabled]=\"editSaveSubmitDisabled_$()\"\n class=\"px-3 py-1.5 text-xs rounded border border-ccapAccent text-ccapAccent hover:bg-ccapAccent/10\n disabled:opacity-40\">\n {{ editSaveBusy_$() ? 'Saving…' : 'Save' }}\n </button>\n </div>\n </div>\n </div>\n }\n @case (Pane.wizard) {\n <div class=\"flex flex-col gap-2\">\n <button type=\"button\"\n (click)=\"handleBackToHub()\"\n class=\"self-start px-2 py-1 text-xs text-neutral-400 hover:text-neutral-200 border border-transparent\n hover:border-neutral-700 rounded mb-2\">\n ← Back\n </button>\n @if (hasSelectedProject_$()) {\n <app-pm-user-input-wizard\n [projectId]=\"targetProjectId_$()\"\n [isEmbeddedInModal]=\"true\"\n [quickInputDraftId]=\"userInput_DS.selectedQuickInputId_$()\"\n [initialRawContent]=\"wizardSeedRaw_$()\"\n [initialStagingPriority]=\"wizardStagingPriority_$()\"\n [skipSuggestMode]=\"false\"\n (wizardFinalizeSuccess)=\"handleWizardFinalizeSuccess($event)\">\n </app-pm-user-input-wizard>\n } @else {\n <p class=\"text-xs text-neutral-500 border border-neutral-700 rounded px-2 py-2\">\n No target project is set. Go back and choose a target project under Target project (promotion); those\n actions stay disabled until a target project is selected.\n </p>\n }\n </div>\n }\n @case (Pane.direct) {\n <div class=\"flex flex-col gap-2\">\n <button type=\"button\"\n (click)=\"handleBackToHub()\"\n class=\"self-start px-2 py-1 text-xs text-neutral-400 hover:text-neutral-200 border border-transparent\n hover:border-neutral-700 rounded mb-2\">\n ← Back\n </button>\n @if (hasSelectedProject_$()) {\n <app-pm-user-input-wizard\n [projectId]=\"targetProjectId_$()\"\n [isEmbeddedInModal]=\"true\"\n [quickInputDraftId]=\"userInput_DS.selectedQuickInputId_$()\"\n [initialRawContent]=\"wizardSeedRaw_$()\"\n [initialStagingPriority]=\"wizardStagingPriority_$()\"\n [skipSuggestMode]=\"true\"\n (wizardFinalizeSuccess)=\"handleWizardFinalizeSuccess($event)\">\n </app-pm-user-input-wizard>\n } @else {\n <p class=\"text-xs text-neutral-500 border border-neutral-700 rounded px-2 py-2\">\n No target project is set. Go back and choose a target project under Target project (promotion); those\n actions stay disabled until a target project is selected.\n </p>\n }\n </div>\n }\n }\n } @else {\n <p class=\"text-sm text-neutral-500\">No quick input selected.</p>\n }\n</app-s-modal>\n\n<app-pm-manual-bug-modal [isOpen]=\"manualBugModalOpen_$()\"\n [isBusy]=\"manualBugBusy_$()\"\n [modalZIndex]=\"quickInputOverlayModalZIndex_Value\"\n [prefillTitle]=\"bugPrefillTitle_$()\"\n [prefillDetails]=\"bugPrefillDetails_$()\"\n [prefillPriority]=\"wizardStagingPriority_$()\"\n (closed)=\"handleBugModalClosed()\"\n (submitted)=\"handleBugSubmitted($event)\">\n</app-pm-manual-bug-modal>\n\n<app-s-modal [isOpen]=\"quickInputDeleteConfirmOpen_$()\"\n [title]=\"'Delete quick input?'\"\n maxWidth=\"lg\"\n [zIndex]=\"quickInputOverlayModalZIndex_Value\"\n headerBorderClass=\"border-neonRed/40\"\n (closed)=\"handleQuickInputDeleteConfirmClosed()\">\n @if (selectedItem_$(); as delSel) {\n <p class=\"text-sm text-neutral-300 mb-2\">\n This permanently removes the quick input staging entity from the server. This cannot be undone.\n </p>\n <p class=\"text-xs text-neutral-500 mb-1\">Document id</p>\n <p class=\"text-xs font-mono text-neutral-400 break-all mb-4\">{{ delSel.quickInputId }}</p>\n }\n <div modal-footer class=\"flex flex-wrap gap-3 px-4 py-3 border-t border-neonRed/30\">\n <button type=\"button\"\n (click)=\"handleConfirmDeleteQuickInput()\"\n [disabled]=\"deleteQuickInputBusy_$() || hubDeleteDisabled_$()\"\n class=\"px-4 py-2 rounded bg-neonRed/90 text-neutral-950 text-sm font-medium hover:bg-neonRed\n disabled:opacity-40 disabled:pointer-events-none\">\n {{ deleteQuickInputBusy_$() ? 'Deleting…' : 'Delete' }}\n </button>\n <button type=\"button\"\n (click)=\"handleQuickInputDeleteConfirmClosed()\"\n [disabled]=\"deleteQuickInputBusy_$()\"\n class=\"px-4 py-2 rounded border border-neutral-600 text-neutral-200 text-sm hover:bg-neutral-800\n disabled:opacity-40 disabled:pointer-events-none\">\n Cancel\n </button>\n </div>\n</app-s-modal>\n\n<app-s-modal [isOpen]=\"genericConfirmOpen_$()\"\n [title]=\"genericConfirmTitle_$()\"\n maxWidth=\"lg\"\n [zIndex]=\"quickInputOverlayModalZIndex_Value\"\n headerBorderClass=\"border-ccapAccent/30\"\n (closed)=\"handleGenericConfirmClosed()\">\n <p class=\"text-sm text-neutral-300 mb-4\">{{ genericConfirmBody_$() }}</p>\n <div modal-footer class=\"flex flex-wrap gap-3 px-4 py-3 border-t border-neutral-700/60\">\n <button type=\"button\"\n (click)=\"handleGenericConfirm()\"\n [disabled]=\"genericConfirmBusy_$()\"\n class=\"px-4 py-2 rounded border border-ccapAccent text-ccapAccent text-sm font-medium\n hover:bg-ccapAccent/10 disabled:opacity-40 disabled:pointer-events-none\">\n {{ genericConfirmBusy_$() ? 'Working…' : genericConfirmButtonLabel_$() }}\n </button>\n <button type=\"button\"\n (click)=\"handleGenericConfirmClosed()\"\n [disabled]=\"genericConfirmBusy_$()\"\n class=\"px-4 py-2 rounded border border-neutral-600 text-neutral-200 text-sm hover:bg-neutral-800\n disabled:opacity-40 disabled:pointer-events-none\">\n Cancel\n </button>\n </div>\n</app-s-modal>\n\n<app-s-modal [isOpen]=\"sendToSessionOpen_$()\"\n [title]=\"sendToSessionModalTitle_$()\"\n maxWidth=\"lg\"\n [zIndex]=\"quickInputOverlayModalZIndex_Value\"\n headerBorderClass=\"border-neonCyan/30\"\n (closed)=\"handleSendToSessionClosed()\">\n @if (selectedItem_$(); as stsSel) {\n <div class=\"flex flex-col gap-3\">\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-xs text-neutral-400\">Target session</label>\n <!-- REQ-UI-SSEL-001 Slice 4: shared S_SessionSelect_Component — beépített\n keresővel (itt kapja meg először a quick-input send flow). A lista első\n sora a \"+ Create new session\" sentinel (id = SEND_NEW_SESSION_VALUE). -->\n <div class=\"rounded-md border border-neutral-600 bg-neutral-900 max-h-64 overflow-y-auto\">\n <app-s-session-select\n [kind]=\"sendToSessionSelectKind_$()\"\n [rows]=\"sendToSessionRowViews_$()\"\n [activeId]=\"sendToSessionSelectedId_$()\"\n searchPlaceholder=\"Keresés sessionre…\"\n (selected)=\"sendToSessionSelectedId_$.set($event)\" />\n </div>\n </div>\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-xs text-neutral-400\">Message content</label>\n <textarea rows=\"6\"\n class=\"w-full rounded border border-neutral-600 bg-neutral-900 px-3 py-2 text-sm text-neutral-100\n font-mono resize-y min-h-[100px]\"\n [ngModel]=\"sendToSessionContent_$()\"\n (ngModelChange)=\"sendToSessionContent_$.set($event)\"></textarea>\n </div>\n </div>\n }\n <div modal-footer class=\"flex flex-wrap gap-3 px-4 py-3 border-t border-neonCyan/30\">\n <button type=\"button\"\n (click)=\"handleConfirmSendToSession()\"\n [disabled]=\"sendToSessionConfirmDisabled_$()\"\n class=\"px-4 py-2 rounded border border-neonCyan/70 text-neonCyan text-sm font-medium\n hover:bg-neonCyan/10 disabled:opacity-40 disabled:pointer-events-none\">\n {{ sendToSessionBusy_$() ? 'Sending…' : 'Send' }}\n </button>\n <button type=\"button\"\n (click)=\"handleSendToSessionClosed()\"\n [disabled]=\"sendToSessionBusy_$()\"\n class=\"px-4 py-2 rounded border border-neutral-600 text-neutral-200 text-sm hover:bg-neutral-800\n disabled:opacity-40 disabled:pointer-events-none\">\n Cancel\n </button>\n </div>\n</app-s-modal>\n\n<app-s-modal [isOpen]=\"postPromotionCleanupOpen_$()\"\n [title]=\"'Quick Input cleanup'\"\n maxWidth=\"lg\"\n [zIndex]=\"quickInputOverlayModalZIndex_Value\"\n headerBorderClass=\"border-neonCyan/30\"\n [closeOnBackdropClick]=\"!postPromotionCleanupBusy_$()\"\n (closed)=\"handlePostPromotionCleanupClosed()\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm text-neonCyan/90 font-medium\">\n {{ postPromotionCleanupEntityLabel_$() }} successfully created.\n </p>\n <p class=\"text-sm text-neutral-300\">\n Would you like to delete this Quick Input now, or keep it for reference?\n </p>\n @if (selectedItem_$(); as cleanupSel) {\n <p class=\"text-xs text-neutral-500\">Document id:\n <span class=\"font-mono text-neutral-400\">{{ cleanupSel.quickInputId }}</span>\n </p>\n }\n </div>\n <div modal-footer class=\"flex flex-wrap gap-3 px-4 py-3 border-t border-neutral-700/60\">\n <!-- REQ-QI-001: session-promotion esetén \"Go to session\" — előbb a nyitás opció, aztán a QI sors -->\n @if (postPromotionCleanupRouteCmds_$()) {\n <button type=\"button\"\n (click)=\"handlePostPromotionGoToSession()\"\n [disabled]=\"postPromotionCleanupBusy_$()\"\n class=\"px-4 py-2 rounded border border-neonCyan/70 text-neonCyan text-sm font-medium\n hover:bg-neonCyan/10 disabled:opacity-40 disabled:pointer-events-none\">\n Go to session\n </button>\n }\n <button type=\"button\"\n (click)=\"handlePostPromotionDelete()\"\n [disabled]=\"postPromotionCleanupBusy_$()\"\n class=\"px-4 py-2 rounded bg-neonRed/90 text-neutral-950 text-sm font-medium hover:bg-neonRed\n disabled:opacity-40 disabled:pointer-events-none\">\n {{ postPromotionCleanupBusy_$() ? 'Deleting…' : 'Delete Quick Input' }}\n </button>\n <button type=\"button\"\n (click)=\"handlePostPromotionKeep()\"\n [disabled]=\"postPromotionCleanupBusy_$()\"\n class=\"px-4 py-2 rounded border border-ccapAccent text-ccapAccent text-sm font-medium\n hover:bg-ccapAccent/10 disabled:opacity-40 disabled:pointer-events-none\">\n Keep\n </button>\n </div>\n</app-s-modal>\n", "/**\n * Quick Input overlay z-index SSOT: FAB, lista panel és Entity Details (s-modal) minden más popup fölé\n * (session trace/event ~100, globális error / egyéb s-modal ~9999).\n *\n * A Quick Input shell az `app-root`-ban a Server Unavailable overlay **után** van, `z-[10050]` / modal `10060` —\n * így a szerver overlay (`z-index: 58`) **alatt** marad a Quick Input (user eléri offline állapotban is).\n */\n\n/** FAB és panel wrapper: a template-ben literál `z-[10050]` osztály (Tailwind JIT); érték egyeztetéshez. */\nexport const UIn_QuickInputOverlayFabPanelZIndexNumeric_Value: string = '10050';\n\n/** Entity Details és Quick Input-hoz kötött nested s-modal-ok `zIndex` input stringje. */\nexport const UIn_QuickInputOverlayModalZIndexNumeric_Value: string = '10060';\n\n/**\n * DOM element picker highlight — a FAB/panel alatt, a modal felett (`relative` wrapperen belül első réteg).\n */\nexport const UIn_QuickInputDomPickOverlayZIndexNumeric_Value: string = '10045';\n", "/**\n * Session lista-név max hossza — a szerver `Ses_NameFromGoal_Util` / persistált `name` limitjével egyezik.\n */\nconst SESSION_LIST_DISPLAY_NAME_MAX_LENGTH: number = 48;\n\n/** Quick Input-ból új session létrehozásakor használt név-prefix (Send to session → új session). */\nconst QUICK_INPUT_NEW_SESSION_NAME_PREFIX: string = 'QI-';\n\n/**\n * Send to session flow: új session megjelenítési név a Quick Input címből vagy nyers szövegének elejéből\n * (`QI-` + snippet).\n */\nexport class UIn_QuickInputNewSessionName_Util {\n\n /**\n * Session megjelenítési név a Quick Input-ból: ha van explicit `title`, azt használjuk (trim + max hossz,\n * prefix nélkül). Különben `QI-` + `rawContent` snippet (normalizált whitespace, word-boundary vágás).\n */\n static buildDisplayNameFromQuickInput(params: { rawContent: string; title?: string }): string {\n const normalizedTitle: string =\n UIn_QuickInputNewSessionName_Util.normalizeQuickInputSnippet(params.title ?? '');\n if (normalizedTitle.length > 0) {\n return UIn_QuickInputNewSessionName_Util.truncateSnippetToMaxLength(\n normalizedTitle,\n SESSION_LIST_DISPLAY_NAME_MAX_LENGTH,\n );\n }\n return UIn_QuickInputNewSessionName_Util.buildDisplayNameFromQuickInputRaw(params.rawContent);\n }\n\n /**\n * `QI-` + a user Quick Input szövegének normalizált eleje (whitespace összevonás, max hossz).\n */\n static buildDisplayNameFromQuickInputRaw(rawContent: string): string {\n const normalized: string = UIn_QuickInputNewSessionName_Util.normalizeQuickInputSnippet(rawContent);\n const prefix: string = QUICK_INPUT_NEW_SESSION_NAME_PREFIX;\n const maxSuffixLen: number = SESSION_LIST_DISPLAY_NAME_MAX_LENGTH - prefix.length;\n\n if (maxSuffixLen <= 0) {\n return prefix.slice(0, SESSION_LIST_DISPLAY_NAME_MAX_LENGTH);\n }\n\n if (!normalized.length) {\n return prefix;\n }\n\n const suffix: string = UIn_QuickInputNewSessionName_Util.truncateSnippetToMaxLength(\n normalized,\n maxSuffixLen,\n );\n return `${prefix}${suffix}`;\n }\n\n /**\n * Új sorok / többszörös whitespace egy szóközzé — lista-név egy sorból olvasható legyen.\n */\n private static normalizeQuickInputSnippet(raw: string): string {\n const collapsed: string = (raw ?? '')\n .replace(/\\s+/gu, ' ')\n .trim();\n return collapsed;\n }\n\n /**\n * Snippet vágása max karakterre; lehetőség szerint szóhatárnál (ugyanaz a minta, mint a goal-alapú névnél).\n */\n private static truncateSnippetToMaxLength(text: string, maxLen: number): string {\n if (text.length <= maxLen) {\n return text;\n }\n\n const cut: string = text.slice(0, maxLen);\n const lastSpace: number = cut.lastIndexOf(' ');\n\n if (lastSpace > maxLen / 2) {\n return cut.slice(0, lastSpace).trim();\n }\n\n return cut.trim();\n }\n}\n", "/**\n * Quick Input akció modal belső panel (hub / szerkesztés / wizard / közvetlen finalize).\n */\nexport enum UIn_QuickInputModalPane_Type {\n hub = 'hub',\n edit = 'edit',\n wizard = 'wizard',\n direct = 'direct',\n}\n", "/**\n * Quick Input „Send to session\" célválasztó — melyik session típusba küldünk.\n */\nexport enum UIn_QuickInputSendSessionTarget_Type {\n caSession = 'ca-session',\n ccSession = 'cc-session',\n ccapSession = 'ccap-session',\n}\n", "/**\n * Quick Input DOM element picker — `elementsFromPoint` szűrés és lista-token építés.\n */\nexport class UIn_QuickInputDomPick_Util {\n\n /** Picker overlay host — `closest` szűréshez (saját réteg kizárása). */\n static readonly PICKER_ROOT_ATTR: string = 'data-ccap-qi-dom-picker-root';\n\n /** Lista token max hossz (olvashatóság + egy sor). */\n private static readonly TOKEN_MAX_LENGTH: number = 120;\n\n /**\n * Az elem a Quick Input chrome alatt van-e (FAB, panel, actions modal, picker overlay).\n */\n static isUnderQuickInputChrome(element: Element | null): boolean {\n if (element === null) {\n return true;\n }\n return (\n element.closest('app-ccap-user-input-fab') !== null\n || element.closest('app-ccap-user-input-panel') !== null\n || element.closest('app-ccap-quick-input-actions-modal') !== null\n || element.closest(`[${UIn_QuickInputDomPick_Util.PICKER_ROOT_ATTR}]`) !== null\n );\n }\n\n /**\n * Kurzor alatti első `HTMLElement` nem üres `id`-val, chrome-on kívül.\n */\n static resolvePickTargetAtPoint(input: { clientX: number; clientY: number; doc: Document }): HTMLElement | null {\n const stack: Element[] = input.doc.elementsFromPoint(input.clientX, input.clientY);\n for (const node of stack) {\n if (!(node instanceof HTMLElement)) {\n continue;\n }\n if (UIn_QuickInputDomPick_Util.isUnderQuickInputChrome(node)) {\n continue;\n }\n const idTrimmed: string = String(node.id ?? '').trim();\n if (!idTrimmed.length) {\n continue;\n }\n const tagLower: string = node.localName.toLowerCase();\n if (tagLower === 'html' || tagLower === 'body') {\n continue;\n }\n return node;\n }\n return null;\n }\n\n /**\n * `elements` lista egy soros token: `dom:<tag>#<id>` + opcionális `.class.class` (első két class).\n */\n static buildElementsListTokenFromElement(element: HTMLElement): string {\n const tagLower: string = element.localName.toLowerCase();\n const idTrimmed: string = element.id.trim();\n let base: string = `dom:${tagLower}#${idTrimmed}`;\n const classList: DOMTokenList = element.classList;\n if (classList.length > 0) {\n const firstTwo: string[] = [];\n const maxClasses: number = 2;\n for (let i: number = 0; i < classList.length && firstTwo.length < maxClasses; i++) {\n const c: string = String(classList.item(i) ?? '').trim();\n if (c.length) {\n firstTwo.push(c);\n }\n }\n if (firstTwo.length > 0) {\n base = `${base}.${firstTwo.join('.')}`;\n }\n }\n if (base.length <= UIn_QuickInputDomPick_Util.TOKEN_MAX_LENGTH) {\n return base;\n }\n return base.slice(0, UIn_QuickInputDomPick_Util.TOKEN_MAX_LENGTH);\n }\n\n /**\n * Hover címke: ID kiemelve + tag (template overlay).\n */\n static buildHoverLabelForElement(element: HTMLElement): string {\n const idTrimmed: string = element.id.trim();\n const tagLower: string = element.localName.toLowerCase();\n return `#${idTrimmed} · ${tagLower}`;\n }\n}\n", "import { CommonModule } from '@angular/common';\nimport { Component, computed, DestroyRef, inject } from '@angular/core';\n\nimport { UIn_QuickInputDomPickOverlayZIndexNumeric_Value } from '../../_collections/consts/quick-input/uin-quick-input-overlay-z-index.const';\nimport { UIn_QuickInputDomPick_Util } from '../../_collections/utils/quick-input/uin-quick-input-dom-pick.util';\nimport { UserInput_DataService } from '../../_services/user-input.data-service';\n\n/**\n * DOM element picker: `mousemove` alatt `id`-s elem highlight + címke; `click` capture → `elements` lista.\n * Quick Input `relative` wrapperben, z-index a FAB alatt, modal felett.\n */\n@Component({\n selector: 'app-ccap-quick-input-dom-picker-overlay',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './uin-quick-input-dom-picker-overlay.component.html',\n})\n/** UIn_QuickDomPickerOverlay_Component class. */\nexport class UIn_QuickDomPickerOverlay_Component {\n\n readonly userInput_DS: UserInput_DataService = inject(UserInput_DataService);\n\n private readonly destroyRef: DestroyRef = inject(DestroyRef);\n\n /** `fixed` réteg z-index — SSOT const. */\n readonly domPickZIndexValue: string = UIn_QuickInputDomPickOverlayZIndexNumeric_Value;\n\n /** rAF throttle: legutolsó kurzor pozíció. */\n private pendingClientX: number = 0;\n\n private pendingClientY: number = 0;\n\n private isRafScheduled: boolean = false;\n\n /** Utolsó feloldott célpont — `click` capture-hez (nem signal). */\n private lastHoverTarget: HTMLElement | null = null;\n\n /**\n * Highlight doboz `ngStyle` — `null` ha nincs találat.\n */\n readonly domPickHighlightBoxStyle_$ = computed((): Record<string, string> | null => {\n const r = this.userInput_DS.quickInputDomPickHoverRect_$();\n if (r === null) {\n return null;\n }\n return {\n top: `${r.topPx}px`,\n left: `${r.leftPx}px`,\n width: `${r.widthPx}px`,\n height: `${r.heightPx}px`,\n };\n });\n\n /**\n * Címke pozíció a highlight fölött.\n */\n readonly domPickLabelStyle_$ = computed((): Record<string, string> | null => {\n const r = this.userInput_DS.quickInputDomPickHoverRect_$();\n if (r === null) {\n return null;\n }\n const labelGapPx: number = 4;\n const labelReservePx: number = 22;\n const topPx: number = Math.max(0, r.topPx - labelReservePx - labelGapPx);\n return {\n top: `${topPx}px`,\n left: `${r.leftPx}px`,\n maxWidth: 'min(24rem, calc(100vw - 1rem))',\n };\n });\n\n constructor() {\n if (typeof window === 'undefined') {\n return;\n }\n const onMouseMove = (event: MouseEvent): void => {\n this.pendingClientX = event.clientX;\n this.pendingClientY = event.clientY;\n if (this.isRafScheduled) {\n return;\n }\n this.isRafScheduled = true;\n window.requestAnimationFrame((): void => {\n this.isRafScheduled = false;\n this.applyHoverAtPoint(this.pendingClientX, this.pendingClientY);\n });\n };\n const onClickCapture = (event: MouseEvent): void => {\n if (!this.userInput_DS.quickInputDomPickActive_$()) {\n return;\n }\n if (!this.userInput_DS.isPanelOpen_$() || !this.userInput_DS.selectedProjectIsCcapRevisionedHost_$()) {\n return;\n }\n if (this.lastHoverTarget === null) {\n return;\n }\n event.preventDefault();\n event.stopImmediatePropagation();\n const token: string = UIn_QuickInputDomPick_Util.buildElementsListTokenFromElement(this.lastHoverTarget);\n this.userInput_DS.appendQuickInputComposerElement(token);\n this.userInput_DS.requestComposerDraftPersistBump();\n };\n const onKeyDown = (event: KeyboardEvent): void => {\n if (event.key !== 'Escape') {\n return;\n }\n if (!this.userInput_DS.quickInputDomPickActive_$()) {\n return;\n }\n this.userInput_DS.setQuickInputDomPickActive(false);\n };\n window.addEventListener('mousemove', onMouseMove, { passive: true });\n window.addEventListener('click', onClickCapture, true);\n window.addEventListener('keydown', onKeyDown);\n this.destroyRef.onDestroy((): void => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('click', onClickCapture, true);\n window.removeEventListener('keydown', onKeyDown);\n });\n }\n\n /**\n * Kurzor alatti `id`-s elem → DS preview + `lastHoverTarget`.\n */\n private applyHoverAtPoint(clientX: number, clientY: number): void {\n if (\n !this.userInput_DS.quickInputDomPickActive_$()\n || !this.userInput_DS.isPanelOpen_$()\n || !this.userInput_DS.selectedProjectIsCcapRevisionedHost_$()\n ) {\n this.lastHoverTarget = null;\n this.userInput_DS.setQuickInputDomPickHoverPreview({ rect: null, label: '' });\n return;\n }\n const el: HTMLElement | null = UIn_QuickInputDomPick_Util.resolvePickTargetAtPoint({\n clientX: clientX,\n clientY: clientY,\n doc: document,\n });\n this.lastHoverTarget = el;\n if (el === null) {\n this.userInput_DS.setQuickInputDomPickHoverPreview({ rect: null, label: '' });\n return;\n }\n const box: DOMRect = el.getBoundingClientRect();\n this.userInput_DS.setQuickInputDomPickHoverPreview({\n rect: {\n topPx: box.top,\n leftPx: box.left,\n widthPx: box.width,\n heightPx: box.height,\n },\n label: UIn_QuickInputDomPick_Util.buildHoverLabelForElement(el),\n });\n }\n}\n", "<!-- Picker root: `closest` kizárás a utilban — teljes viewport `fixed`, pointer események átmennek -->\n<div [attr.data-ccap-qi-dom-picker-root]=\"''\"\n class=\"pointer-events-none fixed inset-0 w-screen h-screen\"\n [style.z-index]=\"domPickZIndexValue\">\n @if (userInput_DS.quickInputDomPickActive_$() && domPickHighlightBoxStyle_$(); as boxStyle) {\n <div class=\"pointer-events-none fixed rounded border-2 border-neonCyan shadow-[0_0_0_1px_rgba(34,211,238,0.35)]\n bg-neonCyan/5\"\n [ngStyle]=\"boxStyle\"></div>\n @if (domPickLabelStyle_$(); as labelStyle) {\n <div class=\"pointer-events-none fixed z-[1] px-1.5 py-0.5 rounded border border-neonCyan/80\n bg-neutral-950/95 text-[11px] font-mono text-neonCyan shadow-md truncate\"\n [ngStyle]=\"labelStyle\">\n {{ userInput_DS.quickInputDomPickHoverLabel_$() }}\n </div>\n }\n }\n</div>\n", "import { Component, computed, inject } from '@angular/core';\n\nimport { UserInput_DataService } from './_modules/user-input/_services/user-input.data-service';\nimport {\n ExS_InstancePresenceSubscriber_ControlService,\n} from './_modules/external-sessions/_services/control-services/exs-instance-presence-subscriber.control-service';\n\n/**\n * CCAP Revisioned root komponens.\n * Quick Input shell: `app-root` szint, Server Unavailable után — a szerver overlay fölött marad a réteg.\n */\n@Component({\n selector: 'app-root',\n templateUrl: './app.component.html',\n})\n/** App_Component class. */\nexport class App_Component {\n\n readonly title: string = 'ccap-revisioned';\n\n readonly userInput_DS: UserInput_DataService = inject(UserInput_DataService);\n\n /**\n * REQ-INST-STATE-001 Slice 6 (cycle 702) — instance presence real-time\n * subscriber boot. A `providedIn: 'root'` service injection itt\n * instantiated először; az `initialize()` hívással subscribe-ol a\n * Socket.io `instance:presence-update` eventre és `presence_DS.refreshNow()`-t\n * hív a peer connect/disconnect-eken — UI <1s frissül.\n */\n private readonly presenceSubscriber_CS: ExS_InstancePresenceSubscriber_ControlService =\n inject(ExS_InstancePresenceSubscriber_ControlService);\n\n constructor() {\n this.presenceSubscriber_CS.initialize();\n }\n\n /**\n * Fixed host mérete/pozíciója — a `<main>` téglalapját követi (ResizeObserver a main-frame-ben).\n */\n readonly quickInputAppHostStyle_$ = computed((): Record<string, string> => {\n const b = this.userInput_DS.quickInputMainBoundsPx_$();\n return {\n top: `${b.topPx}px`,\n left: `${b.leftPx}px`,\n width: `${b.widthPx}px`,\n height: `${b.heightPx}px`,\n };\n });\n}\n", "<app-ccap-main-frame></app-ccap-main-frame>\n<!-- Server-unavailable overlay: app-root szint — teljes viewport; Quick Input a DOM sorrend + z-index miatt fölötte. -->\n<app-ccap-server-unavailable-overlay></app-ccap-server-unavailable-overlay>\n<!-- Quick Input: main téglalap követése (signal) — `z-[10050]` egyezik `ccap-quick-input-overlay-z-index.const` fab réteggel. -->\n<div class=\"fixed pointer-events-none z-[10050]\"\n [ngStyle]=\"quickInputAppHostStyle_$()\">\n <div class=\"relative w-full h-full pointer-events-none\">\n <app-ccap-quick-input-dom-picker-overlay></app-ccap-quick-input-dom-picker-overlay>\n <app-ccap-user-input-fab></app-ccap-user-input-fab>\n @if (userInput_DS.isPanelOpen_$()) {\n <app-ccap-user-input-panel></app-ccap-user-input-panel>\n }\n <app-ccap-quick-input-actions-modal></app-ccap-quick-input-actions-modal>\n </div>\n</div>\n", "// ccap-review-disable no-dynamic-imports\n// Indoklás: az Angular `loadChildren` route-ok kötelezően `import()`-tel\n// használandók a webpack/esbuild code-splittinghez (cycle 425 előtti\n// Promise.resolve trükk a teljes 3.6M-es main bundle-be húzta a feature\n// modulokat — most chunk-onként ~10-200K, initial 212K).\nimport { NgModule } from '@angular/core';\nimport { PreloadAllModules, RouterModule, Routes } from '@angular/router';\n\n/**\n * Angular lazy-loaded route-ok dynamic `import()`-tel — minden feature module\n * külön webpack chunk-ba kerül, így a kezdeti main bundle drasztikusan lecsökken.\n *\n * Megjegyzés: a CLAUDE.md általános tiltása a `import()` használatára a top-level\n * module loading-ra vonatkozik. Az Angular `loadChildren` viszont a hivatalos\n * code-splitting mechanizmus — itt KÖTELEZŐ ahhoz, hogy a router ténylegesen\n * lazy-load-oljon. A `PreloadAllModules` stratégia a kezdeti render után\n * háttérben behúzza az összes chunk-ot, így a navigáció továbbra is gyors.\n */\nconst routes: Routes = [\n { path: '', loadChildren: () => import('./_modules/dashboard/dashboard.module').then((m) => m.Dashboard_Module) },\n { path: 'setup', loadChildren: () => import('./_modules/config/_modules/setup/setup.module').then((m) => m.Setup_Module) },\n { path: 'settings', loadChildren: () => import('./_modules/config/_modules/settings/set.module').then((m) => m.Settings_Module) },\n { path: 'model-registry', loadChildren: () => import('./_modules/ai-systems/_modules/model-registry/model-registry.module').then((m) => m.ModelRegistry_Module) },\n { path: 'cost-tracking', loadChildren: () => import('./_modules/cost-tracking/ct.module').then((m) => m.CostTracking_Module) },\n { path: 'costs', loadChildren: () => import('./_modules/cost-tracking/ct-costs.module').then((m) => m.Costs_Module) },\n { path: 'embedding-registry', loadChildren: () => import('./_modules/ai-systems/_modules/embedding-registry/embedding-registry.module').then((m) => m.EmbeddingRegistry_Module) },\n { path: 'embedding-model-registry', redirectTo: 'embedding-registry', pathMatch: 'prefix' },\n { path: 'document-library', loadChildren: () => import('./_modules/project-management/_modules/document-library/document-library.module').then((m) => m.DocumentLibrary_Module) },\n { path: 'project-source', loadChildren: () => import('./_modules/project-management/_modules/project-source/project-source-routed.module').then((m) => m.ProjectSource_RoutedModule) },\n { path: 'embedding-eval', loadChildren: () => import('./_modules/ai-systems/_modules/embedding-eval/embedding-eval.module').then((m) => m.EmbeddingEval_Module) },\n { path: 'session', loadChildren: () => import('./_modules/session/session.module').then((m) => m.Session_Module) },\n { path: 'errors', loadChildren: () => import('./_modules/system/_modules/errors/err.module').then((m) => m.Errors_Module) },\n { path: 'feedback', loadChildren: () => import('./_modules/session/_modules/feedback/feedback.module').then((m) => m.Feedback_Module) },\n { path: 'logs', loadChildren: () => import('./_modules/dev/_modules/devtools/_modules/logs/logs.module').then((m) => m.Logs_Module) },\n { path: 'host-runtime-mcp', loadChildren: () => import('./_modules/dev/_modules/host-runtime-mcp/host-runtime-mcp.module').then((m) => m.HostRuntimeMcp_Module) },\n { path: 'voice-notes-poc', loadChildren: () => import('./_modules/dev/_modules/poc/_modules/voice-notes-poc/voice-notes-poc.module').then((m) => m.VoiceNotesPoc_Module) },\n {\n path: 'master-control-remote-poc',\n loadChildren: () => import('./_modules/dev/_modules/poc/_modules/master-control-remote-poc/master-control-remote-poc.module').then((m) => m.MasterControlRemotePoc_Module),\n },\n {\n path: 'workflow-settings',\n loadChildren: () => import('./_modules/config/_modules/workflow-settings/wfs.module').then((m) => m.WorkflowSettings_Module),\n },\n { path: 'coordinator', loadChildren: () => import('./_modules/coordinator/crd.module').then((m) => m.Coordinator_Module) },\n { path: 'scheduler', loadChildren: () => import('./_modules/scheduler/scheduler.module').then((m) => m.Scheduler_Module) },\n { path: 'orchestrator', loadChildren: () => import('./_modules/orchestrator/orc.module').then((m) => m.Orchestrator_Module) },\n { path: 'dark-office', loadChildren: () => import('./_modules/dark-office/do.module').then((m) => m.DarkOffice_Module) },\n { path: 'project-management', loadChildren: () => import('./_modules/project-management/project-management.module').then((m) => m.ProjectManagement_Module) },\n { path: 'cc-session', loadChildren: () => import('./_modules/external-sessions/_modules/claude-code/cc.module').then((m) => m.CcSession_Module) },\n { path: 'cc-usage', loadComponent: () => import('./_modules/external-sessions/_modules/claude-code/_components/cc-usage-dashboard/cc-usage-dashboard.component').then((m) => m.CC_UsageDashboard_Component) },\n { path: 'mobile-app', loadChildren: () => import('./_modules/dev/_modules/poc/_modules/mobile-app/mobile-app.module').then((m) => m.MobileApp_Module) },\n { path: 'oc-session', loadChildren: () => import('./_modules/external-sessions/_modules/openclaw/oc.module').then((m) => m.OcSession_Module) },\n { path: 'ca-session', loadChildren: () => import('./_modules/external-sessions/_modules/cursor-acp/ca.module').then((m) => m.CaSession_Module) },\n { path: 'consultant', loadChildren: () => import('./_modules/consultant/consultant.module').then((m) => m.Consultant_Module) },\n { path: 'agent-instances', loadChildren: () => import('./_modules/external-sessions/_modules/agent-instances/agent-instances.module').then((m) => m.AgentInstances_Module) },\n { path: 'terminals', loadChildren: () => import('./_modules/dev/_modules/devtools/_modules/terminals/terminals.module').then((m) => m.Terminals_Module) },\n {\n path: 'live-development-pipeline',\n loadChildren: () => import('./_modules/dev/_modules/devtools/_modules/live-dev-pipeline/live-dev-pipeline.module').then((m) => m.LiveDevPipeline_Module),\n },\n { path: 'system-status', redirectTo: 'live-development-pipeline', pathMatch: 'full' },\n { path: '**', redirectTo: '' },\n];\n\n@NgModule({\n imports: [RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules })],\n exports: [RouterModule],\n})\n/** App_RoutingModule class. */\nexport class App_RoutingModule {}\n", "import { inject } from '@angular/core';\nimport {\n HttpInterceptorFn,\n HttpErrorResponse,\n} from '@angular/common/http';\n\nimport { catchError, throwError } from 'rxjs';\n\nimport { DyFM_Error, DyFM_Log } from '@futdevpro/fsm-dynamo';\n\nimport { CCAP_GlobalError_ControlService } from '../control-services/ccap-global-error.control-service';\nimport { Errors_ApiService } from '../../_modules/system/_modules/errors/_services/errors.api-service';\n\n/** A kérés a /errors API-ra megy (report vagy list/delete); ilyenkor nem reportolunk, csak logolunk (loop elkerülés). */\nfunction isErrorsApiRequest(url: string): boolean {\n return url.includes('/errors');\n}\n\n/**\n * Error interceptor: HTTP hiba esetén popup-ban mutatja a hibát (nyers err), majd továbbdobja.\n * A megjelenítést az app-ccap-error-display intézi.\n * Kliens oldali hiba jelentése a szervernek (fire-and-forget).\n * /errors kérés hibája: csak log, nem showError és nem reportError (loop prevention).\n * Error path soha nem dob: try/catch + re-entrancy guard.\n */\nexport const CCAP_Error_Interceptor: HttpInterceptorFn = (req, next) => {\n const globalError_CS: CCAP_GlobalError_ControlService =\n inject(CCAP_GlobalError_ControlService);\n const errors_AS: Errors_ApiService = inject(Errors_ApiService);\n\n return next(req).pipe(\n catchError((err: unknown) => {\n if (err instanceof HttpErrorResponse) {\n const isErrorsApi: boolean = isErrorsApiRequest(req.url);\n const reentrant: boolean = globalError_CS.isErrorHandlingInProgress();\n\n if (reentrant) {\n DyFM_Error.logSimple(\n '[CCAP HTTP error] re-entrant, only log',\n err,\n );\n } else if (isErrorsApi) {\n DyFM_Error.logSimple(\n '[CCAP HTTP error] errors API failure, only log',\n err,\n );\n } else if (err.status === 0) {\n // Status 0: a kérés nem jutott el a szerverig (szerver restart, hálózati hiba, CORS).\n // Tranziens hiba, nem tároljuk a hibalistába és nem mutatunk notification-t.\n DyFM_Error.logSimple(\n '[CCAP HTTP error] status 0 (no response), only log',\n err,\n );\n } else {\n globalError_CS.beginErrorHandling();\n try {\n const payload = globalError_CS.buildReportPayloadFromError(err, 'client-http');\n globalError_CS.showError(err);\n errors_AS.reportError(payload).catch((): void => {});\n DyFM_Error.logSimple('[CCAP HTTP error] ' + payload.message, err);\n } catch (e: unknown) {\n DyFM_Log.error('CCAP error interceptor failed', e);\n } finally {\n globalError_CS.endErrorHandling();\n }\n }\n }\n return throwError((): unknown => err);\n }),\n );\n};\n", "import { ErrorHandler, inject, Injectable } from '@angular/core';\n\nimport { DyFM_Log } from '@futdevpro/fsm-dynamo';\n\nimport { CCAP_GlobalError_ControlService } from './control-services/ccap-global-error.control-service';\n\n/**\n * Globális Angular ErrorHandler: minden nem kezelt kivétel a popup-ban jelenik meg.\n * A global error service showError(source: 'client-global') intézi a megjelenítést és a hibalistába jelentést.\n * Error path soha nem dob: try/catch + re-entrancy guard; catch-ben csak console.error.\n */\n@Injectable({ providedIn: 'root' })\nexport class CCAP_GlobalError_Handler extends ErrorHandler {\n\n private readonly globalError_CS: CCAP_GlobalError_ControlService = inject(CCAP_GlobalError_ControlService);\n\n constructor() {\n super();\n }\n\n override handleError(err: unknown): void {\n try {\n if (this.globalError_CS.isErrorHandlingInProgress()) {\n DyFM_Log.error('CCAP GlobalError_Handler re-entrant, only log', err);\n super.handleError(err);\n return;\n }\n this.globalError_CS.beginErrorHandling();\n try {\n this.globalError_CS.showError(err, 'client-global');\n } finally {\n this.globalError_CS.endErrorHandling();\n }\n } catch (e: unknown) {\n DyFM_Log.error('CCAP GlobalError_Handler failed', e);\n }\n super.handleError(err);\n }\n}\n", "import { ErrorHandler, NgModule } from '@angular/core';\nimport { BrowserModule } from '@angular/platform-browser';\nimport { provideHttpClient, withInterceptors } from '@angular/common/http';\nimport { RouterModule } from '@angular/router';\nimport { FormsModule } from '@angular/forms';\n\nimport { App_Component } from './app.component';\nimport { App_RoutingModule } from './app.routing-module';\nimport { CCAP_ErrorDisplay_Component } from './_components/ccap-error-display/ccap-error-display.component';\nimport { CCAP_MainFrame_Component } from './_components/ccap-main-frame/ccap-main-frame.component';\nimport { CCAP_ServerUnavailableOverlay_Component } from './_components/ccap-server-unavailable-overlay/ccap-server-unavailable-overlay.component';\nimport { UIn_Fab_Component } from './_modules/user-input/_components/ccap-user-input-fab/uin-fab.component';\nimport { UIn_Panel_Component } from './_modules/user-input/_components/ccap-user-input-panel/uin-panel.component';\nimport { UIn_QuickActionsModal_Component } from './_modules/user-input/_components/ccap-quick-input-actions-modal/uin-quick-actions-modal.component';\nimport { UIn_QuickDomPickerOverlay_Component } from './_modules/user-input/_components/ccap-quick-input-dom-picker-overlay/uin-quick-dom-picker-overlay.component';\nimport { CCAP_Error_Interceptor } from './_services/interceptors/error.interceptor';\nimport { CCAP_GlobalError_Handler } from './_services/global-error.handler';\n\n/**\n * CCAP Revisioned fő modul.\n * HttpClient interceptor (hiba popup) + globális ErrorHandler + error popup komponens.\n * Socket: DyFM base connectel konstruktorban (main.ts status után bootstrap).\n */\n@NgModule({\n declarations: [\n App_Component,\n ],\n imports: [\n BrowserModule,\n FormsModule,\n RouterModule,\n App_RoutingModule,\n CCAP_ErrorDisplay_Component,\n CCAP_MainFrame_Component,\n CCAP_ServerUnavailableOverlay_Component,\n UIn_Fab_Component,\n UIn_Panel_Component,\n UIn_QuickActionsModal_Component,\n UIn_QuickDomPickerOverlay_Component,\n ],\n providers: [\n provideHttpClient(withInterceptors([CCAP_Error_Interceptor])),\n { provide: ErrorHandler, useClass: CCAP_GlobalError_Handler },\n ],\n bootstrap: [App_Component],\n})\n/** App_Module class. */\nexport class App_Module {}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_fsm_dynamo", "import_fsm_dynamo", "ExS_InstancePresenceSubscriber_ControlService", "socket_CS", "inject", "CCAP_Socket_ControlService", "presence_DS", "ExS_InstancePresence_DataService", "subscription", "initialize", "event$", "subscribe", "envelope", "event", "refreshNow", "catch", "err", "DyFM_Log", "warn", "Error", "message", "String", "ngOnDestroy", "unsubscribe", "factory", "\u0275fac", "providedIn", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275property", "ctx_r1", "updater_CS", "lastError_$", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "\u0275\u0275element", "\u0275\u0275template", "CCAP_AppUpdateBanner_Component_Conditional_0_Conditional_10_Template", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r1", "\u0275\u0275nextContext", "\u0275\u0275resetView", "handleInstall", "versionCheck_CS", "latestPackageVersion_$", "currentVersion", "\u0275\u0275conditional", "isInstallDisabled_$", "installButtonLabel_$", "CCAP_AppUpdateBanner_Component", "inject", "CCAP_AppVersionCheck_ControlService", "CCAP_MobileAppUpdater_ControlService", "environment", "version", "computed", "phase", "phase_$", "CCAP_MobileAppUpdaterPhase_Type", "downloading", "installing", "failed", "startUpdate", "selectors", "standalone", "features", "\u0275\u0275StandaloneFeature", "decls", "vars", "consts", "template", "rf", "ctx", "CCAP_AppUpdateBanner_Component_Conditional_0_Template", "updateAvailable_$", "\u0275\u0275element", "\u0275\u0275text", "\u0275\u0275elementStart", "\u0275\u0275elementEnd", "\u0275\u0275advance", "\u0275\u0275textInterpolate", "ctx", "\u0275\u0275textInterpolate1", "r_r3", "message", "\u0275\u0275template", "CCAP_ServerUpdateBanner_Component_Conditional_0_Conditional_0_Conditional_14_Conditional_0_Conditional_1_Template", "CCAP_ServerUpdateBanner_Component_Conditional_0_Conditional_0_Conditional_14_Conditional_0_Conditional_2_Template", "CCAP_ServerUpdateBanner_Component_Conditional_0_Conditional_0_Conditional_14_Conditional_0_Conditional_3_Template", "\u0275\u0275conditional", "status", "CCAP_ServerUpdateBanner_Component_Conditional_0_Conditional_0_Conditional_14_Conditional_0_Template", "tmp_4_0", "ctx_r1", "versionInfo_DS", "triggerResult_$", "ok_r4", "oldVersion", "newVersion", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r1", "\u0275\u0275nextContext", "\u0275\u0275resetView", "handleTriggerUpdate", "CCAP_ServerUpdateBanner_Component_Conditional_0_Conditional_0_Conditional_6_Template", "CCAP_ServerUpdateBanner_Component_Conditional_0_Conditional_0_Conditional_7_Template", "CCAP_ServerUpdateBanner_Component_Conditional_0_Conditional_0_Conditional_8_Template", "handleDismiss", "CCAP_ServerUpdateBanner_Component_Conditional_0_Conditional_0_Conditional_13_Template", "CCAP_ServerUpdateBanner_Component_Conditional_0_Conditional_0_Conditional_14_Template", "CCAP_ServerUpdateBanner_Component_Conditional_0_Conditional_0_Conditional_15_Template", "CCAP_ServerUpdateBanner_Component_Conditional_0_Conditional_0_Conditional_16_Template", "CCAP_ServerUpdateBanner_Component_Conditional_0_Conditional_0_Conditional_17_Template", "\u0275\u0275textInterpolate2", "info_r5", "serverVersion", "npmLatestVersion", "\u0275\u0275property", "triggering_$", "tmp_5_0", "tmp_6_0", "triggerError_$", "pollingPostUpdate_$", "tmp_8_0", "triggerSucceeded_$", "triggerTimedOut_$", "CCAP_ServerUpdateBanner_Component_Conditional_0_Conditional_0_Template", "dismissed_$", "serverIsOutdated", "CCAP_ServerUpdateBanner_Component", "inject", "Set_VersionInfo_DataService", "signal", "ngOnInit", "loadVersionInfo", "set", "__async", "triggerUpdate", "selectors", "standalone", "features", "\u0275\u0275StandaloneFeature", "decls", "vars", "consts", "template", "rf", "CCAP_ServerUpdateBanner_Component_Conditional_0_Template", "tmp_0_0", "versionInfo_$", "RouterLink", "encapsulation", "\u0275\u0275elementStart", "\u0275\u0275listener", "entry_r2", "\u0275\u0275restoreView", "_r1", "$implicit", "ctx_r2", "\u0275\u0275nextContext", "\u0275\u0275resetView", "selectError", "id", "\u0275\u0275element", "\u0275\u0275text", "\u0275\u0275elementEnd", "$event", "dismissNotification", "\u0275\u0275classProp", "isDismissing", "\u0275\u0275advance", "\u0275\u0275textInterpolate", "displayMessage", "\u0275\u0275repeaterCreate", "CCAP_ErrorPopup_Component_Conditional_0_For_2_Template", "_forTrack0", "\u0275\u0275repeater", "globalError_CS", "errors_$", "CCAP_ErrorPopup_Component", "inject", "CCAP_GlobalError_ControlService", "userInput_DS", "UserInput_DataService", "constructor", "effect", "selectedNotificationForModal_$", "pushQuickInputOverlayAreaContextByOverlayId", "UIn_QuickInputOverlayAreaId_Type", "globalErrorDetailModal", "popQuickInputOverlayAreaContext", "allowSignalWrites", "event", "stopPropagation", "dismissSelected", "selectors", "standalone", "features", "\u0275\u0275StandaloneFeature", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275template", "CCAP_ErrorPopup_Component_Conditional_0_Template", "\u0275\u0275conditional", "length", "\u0275\u0275property", "tmp_8_0", "error", "undefined", "tmp_9_0", "clientSource", "tmp_10_0", "ng0600Diagnostics", "tmp_11_0", "ng0203Diagnostics", "CommonModule", "CCAP_ErrorDisplay_Component", "S_Modal_Component", "encapsulation", "CCAP_NetworkDiagnostic_Util", "probeServer", "baseUrl", "__async", "targetUrl", "replace", "startMs", "Date", "now", "timestamp", "toISOString", "controller", "AbortController", "timeoutId", "setTimeout", "abort", "CCAP_NETWORK_DIAGNOSTIC_TIMEOUT_MS", "response", "fetch", "method", "signal", "cache", "clearTimeout", "durationMs", "bodyPreview", "text", "length", "slice", "isSuccess", "ok", "errorCategory", "undefined", "status", "result", "httpStatus", "httpStatusText", "statusText", "responseBodyPreview", "errorForDisplay", "buildErrorForDisplay", "err", "errorName", "Error", "name", "errorMessage", "message", "String", "categorizeError", "errorCode", "pickErrorCode", "additionalContent", "lower", "toLowerCase", "includes", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "ctx_r1", "previewUrl_$", "\u0275\u0275textInterpolate2", "result_r3", "targetUrl", "durationMs", "\u0275\u0275element", "\u0275\u0275property", "errorForDisplay", "\u0275\u0275template", "CCAP_MobileServerSetup_Component_Conditional_0_Conditional_22_Conditional_0_Template", "CCAP_MobileServerSetup_Component_Conditional_0_Conditional_22_Conditional_1_Template", "\u0275\u0275conditional", "isSuccess", "\u0275\u0275listener", "$event", "\u0275\u0275restoreView", "_r1", "\u0275\u0275nextContext", "\u0275\u0275resetView", "ipAddress_$", "set", "port_$", "handleHttpsToggle", "CCAP_MobileServerSetup_Component_Conditional_0_Conditional_20_Template", "CCAP_MobileServerSetup_Component_Conditional_0_Conditional_21_Template", "CCAP_MobileServerSetup_Component_Conditional_0_Conditional_22_Template", "handleTestConnection", "CCAP_MobileServerSetup_Component_Conditional_0_Conditional_25_Template", "CCAP_MobileServerSetup_Component_Conditional_0_Conditional_26_Template", "handleSave", "isHttps_$", "tmp_6_0", "diagnosticResult_$", "isSaveDisabled_$", "isTestingConnection_$", "CCAP_SERVER_URL_STORAGE_KEY", "CCAP_DEFAULT_HTTP_PORT", "CCAP_DEFAULT_HTTPS_PORT", "isCapacitorNative", "window", "Capacitor", "isNativePlatform", "CCAP_MobileServerSetup_Component", "isVisible_$", "signal", "Shr_LocalStoragePersistence_Util", "readString", "isHttps", "currentPort", "computed", "protocol", "ip", "trim", "port", "__async", "url", "result", "CCAP_NetworkDiagnostic_Util", "probeServer", "writeString", "reloadApplication", "location", "reload", "selectors", "standalone", "features", "\u0275\u0275StandaloneFeature", "decls", "vars", "consts", "template", "rf", "ctx", "CCAP_MobileServerSetup_Component_Conditional_0_Template", "CommonModule", "FormsModule", "DefaultValueAccessor", "NumberValueAccessor", "CheckboxControlValueAccessor", "NgControlStatus", "MinValidator", "MaxValidator", "NgModel", "CCAP_ErrorDisplay_Component", "encapsulation", "changeDetection", "CCAP_LayoutOverlay_ControlService", "panels_$", "signal", "closedPanels_$", "computed", "filter", "p", "isOpen", "map", "id", "label", "icon", "open", "closedPanelsLeft_$", "getPanelSide", "closedPanelsRight_$", "register", "params", "entry", "side", "update", "list", "next", "push", "find", "unregister", "updatePanelState", "__spreadProps", "__spreadValues", "factory", "\u0275fac", "providedIn", "isCapacitorNative", "win", "window", "Capacitor", "undefined", "isNativePlatform", "hashStringToInt32", "str", "hash", "i", "length", "char", "charCodeAt", "Math", "abs", "CCAP_MobileNotification_ControlService", "notification_DS", "inject", "NTF_DataService", "isInitialized", "localNotificationsPlugin", "initialize", "__async", "localNotifications", "LocalNotifications", "requestPermissions", "display", "addListener", "event", "extra", "notification", "notificationId", "isTrayOpen_$", "set", "markAsRead", "showLocalNotification", "document", "hidden", "numericId", "title", "body", "description", "buildBodyFromType", "schedule", "notifications", "id", "smallIcon", "largeIcon", "type", "confirmMessage", "factory", "\u0275fac", "providedIn", "NTF_ApiService", "baseUrl", "environment", "api", "http", "inject", "HttpClient", "listNotifications", "params", "queryParts", "sessionId", "push", "encodeURIComponent", "status", "limit", "query", "length", "join", "firstValueFrom", "get", "respondToNotification", "notificationId", "response", "post", "__spreadProps", "__spreadValues", "respondedVia", "dismissNotification", "markAsRead", "markAllAsRead", "factory", "\u0275fac", "providedIn", "NTF_SOCKET_EVENT_RESPOND", "NTF_SOCKET_EVENT_DISMISS", "NTF_SOCKET_EVENT_READ", "NTF_DataService", "socket_CS", "inject", "CCAP_Socket_ControlService", "notification_AS", "NTF_ApiService", "injector", "Injector", "mobileNotification_CS", "notifications_$", "signal", "unreadCount_$", "computed", "filter", "n", "isRead", "length", "isLoading_$", "isTrayOpen_$", "eventSubscription", "constructor", "event$", "subscribe", "envelope", "handleSocketEvent", "loadNotifications", "ngOnDestroy", "unsubscribe", "__async", "set", "notifications", "listNotifications", "limit", "respondToNotification", "notificationId", "response", "emit", "NTF_SOCKET_EVENT_RESPOND", "updateNotificationInList", "status", "respondedAt", "Date", "toISOString", "dismissNotification", "NTF_SOCKET_EVENT_DISMISS", "isDismissed", "markAsRead", "NTF_SOCKET_EVENT_READ", "markAllAsRead", "update", "list", "map", "__spreadProps", "__spreadValues", "toggleTray", "open", "closeTray", "event", "payload", "type", "notification", "get", "CCAP_MobileNotification_ControlService", "showLocalNotification", "factory", "\u0275fac", "providedIn", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275advance", "\u0275\u0275textInterpolate", "ctx_r2", "notification", "confirmMessage", "\u0275\u0275template", "NTF_ResponseControls_Component_Conditional_0_Conditional_1_Conditional_0_Template", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r2", "\u0275\u0275nextContext", "\u0275\u0275resetView", "handleConfirm", "\u0275\u0275conditional", "\u0275\u0275property", "isSubmitted_$", "option_r5", "description", "_r4", "$implicit", "selectOption", "id", "NTF_ResponseControls_Component_Conditional_0_Conditional_2_For_2_Conditional_3_Template", "\u0275\u0275classProp", "selectedOptionId_$", "\u0275\u0275pureFunction1", "_c0", "label", "_r6", "handleOptionSelect", "\u0275\u0275repeaterCreate", "NTF_ResponseControls_Component_Conditional_0_Conditional_2_For_2_Template", "_forTrack0", "NTF_ResponseControls_Component_Conditional_0_Conditional_2_Conditional_3_Template", "\u0275\u0275repeater", "options", "\u0275\u0275twoWayListener", "$event", "_r7", "i0", "\u0275\u0275twoWayBindingSet", "textResponse", "handleQuestionSubmit", "\u0275\u0275twoWayProperty", "tmp_3_0", "textPlaceholder", "undefined", "_r9", "handleMessageTextSubmit", "_r8", "NTF_ResponseControls_Component_Conditional_0_Conditional_4_Conditional_1_Template", "_r10", "NTF_ResponseControls_Component_Conditional_0_Conditional_1_Template", "NTF_ResponseControls_Component_Conditional_0_Conditional_2_Template", "NTF_ResponseControls_Component_Conditional_0_Conditional_3_Template", "NTF_ResponseControls_Component_Conditional_0_Conditional_4_Template", "NTF_ResponseControls_Component_Conditional_0_Conditional_5_Template", "_r1", "handleDismiss", "type", "allowTextResponse", "NTF_ResponseControls_Component", "responded", "EventEmitter", "dismissed", "signal", "confirmed", "set", "response", "trim", "emit", "optionId", "selectedOptionId", "text", "selectors", "inputs", "outputs", "standalone", "features", "\u0275\u0275StandaloneFeature", "decls", "vars", "consts", "template", "rf", "ctx", "NTF_ResponseControls_Component_Conditional_0_Template", "CommonModule", "NgClass", "FormsModule", "DefaultValueAccessor", "NgControlStatus", "NgModel", "encapsulation", "\u0275\u0275elementStart", "\u0275\u0275element", "\u0275\u0275elementEnd", "\u0275\u0275text", "\u0275\u0275advance", "\u0275\u0275textInterpolate", "n_r3", "description", "sourceLabel", "response", "confirmed", "\u0275\u0275textInterpolate1", "selectedOptionId", "textResponse", "\u0275\u0275template", "NTF_Item_Component_Conditional_0_Conditional_19_Conditional_1_Template", "NTF_Item_Component_Conditional_0_Conditional_19_Conditional_2_Template", "NTF_Item_Component_Conditional_0_Conditional_19_Conditional_3_Template", "\u0275\u0275conditional", "undefined", "\u0275\u0275listener", "$event", "\u0275\u0275restoreView", "_r4", "ctx_r1", "\u0275\u0275nextContext", "\u0275\u0275resetView", "handleResponded", "handleDismissed", "\u0275\u0275property", "_r5", "i0", "_r6", "stopPropagation", "NTF_Item_Component_Conditional_0_Conditional_21_Conditional_0_Template", "NTF_Item_Component_Conditional_0_Conditional_21_Conditional_1_Template", "allowTextResponse", "_r1", "handleClick", "NTF_Item_Component_Conditional_0_Case_3_Template", "NTF_Item_Component_Conditional_0_Case_4_Template", "NTF_Item_Component_Conditional_0_Case_5_Template", "NTF_Item_Component_Conditional_0_Case_6_Template", "NTF_Item_Component_Conditional_0_Conditional_13_Template", "NTF_Item_Component_Conditional_0_Conditional_14_Template", "NTF_Item_Component_Conditional_0_Conditional_15_Template", "NTF_Item_Component_Conditional_0_Conditional_16_Template", "NTF_Item_Component_Conditional_0_Conditional_17_Template", "NTF_Item_Component_Conditional_0_Conditional_18_Template", "NTF_Item_Component_Conditional_0_Conditional_19_Template", "NTF_Item_Component_Conditional_0_Conditional_20_Template", "NTF_Item_Component_Conditional_0_Conditional_21_Template", "NTF_Item_Component_Conditional_0_Conditional_22_Template", "\u0275\u0275pureFunction1", "_c0", "isRead", "priorityColorClass_$", "tmp_4_0", "type", "\u0275\u0275classProp", "title", "relativeTime_$", "isLinkedInteraction_$", "status", "isInteractiveAndPending_$", "isMessageAndActive_$", "NTF_Item_Component", "notification", "input", "responded", "EventEmitter", "dismissed", "markedAsRead", "computed", "priority", "n", "__created", "now", "Date", "created", "getTime", "diff", "seconds", "Math", "floor", "minutes", "hours", "linkedInteractionId", "emit", "notificationId", "selectors", "inputs", "outputs", "standalone", "features", "\u0275\u0275StandaloneFeature", "decls", "vars", "consts", "template", "rf", "ctx", "NTF_Item_Component_Conditional_0_Template", "tmp_0_0", "CommonModule", "NgClass", "NTF_ResponseControls_Component", "encapsulation", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "ctx_r0", "notification_DS", "unreadCount_$", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r3", "\u0275\u0275nextContext", "\u0275\u0275resetView", "handleMarkAllAsRead", "$event", "_r4", "handleNotificationResponded", "handleNotificationDismissed", "handleNotificationMarkedAsRead", "\u0275\u0275property", "n_r5", "\u0275\u0275repeaterCreate", "NTF_Tray_Component_Conditional_5_Conditional_8_For_1_Template", "_forTrack0", "\u0275\u0275repeater", "notifications_$", "i0", "_r2", "stopPropagation", "\u0275\u0275template", "NTF_Tray_Component_Conditional_5_Conditional_5_Template", "NTF_Tray_Component_Conditional_5_Conditional_7_Template", "NTF_Tray_Component_Conditional_5_Conditional_8_Template", "NTF_Tray_Component_Conditional_5_Conditional_9_Template", "\u0275\u0275conditional", "isLoading_$", "length", "NTF_Tray_Component", "inject", "NTF_DataService", "elementRef", "ElementRef", "handleDocumentClick", "event", "isTrayOpen_$", "target", "Node", "nativeElement", "contains", "closeTray", "handleToggleTray", "toggleTray", "markAllAsRead", "respondToNotification", "notificationId", "response", "dismissNotification", "markAsRead", "selectors", "hostBindings", "rf", "ctx", "\u0275\u0275resolveDocument", "\u0275\u0275element", "NTF_Tray_Component_Conditional_4_Template", "NTF_Tray_Component_Conditional_5_Template", "CommonModule", "NTF_Item_Component", "encapsulation", "\u0275\u0275elementStart", "\u0275\u0275element", "\u0275\u0275elementEnd", "\u0275\u0275listener", "$event", "i0", "\u0275\u0275restoreView", "_r2", "\u0275\u0275resetView", "stopPropagation", "ctx_r2", "\u0275\u0275nextContext", "handleRunDiagnosis", "\u0275\u0275text", "\u0275\u0275advance", "\u0275\u0275property", "isDiagnosing_$", "\u0275\u0275textInterpolate1", "lastSocketError_$", "socketStatusLabel_$", "_r4", "toggleSideNav", "\u0275\u0275template", "CCAP_MainFrame_Component_Conditional_31_Conditional_48_For_2_Conditional_1_Template", "link_r6", "routerLink", "\u0275\u0275pureFunction1", "_c3", "isRouterLinkActiveExactInSideNav", "\u0275\u0275conditional", "iconSvgPath", "label", "\u0275\u0275repeaterCreate", "CCAP_MainFrame_Component_Conditional_31_Conditional_48_For_2_Template", "_forTrack0", "\u0275\u0275repeater", "settingsSubmenuNavLinks", "recordedSystemErrorsCount_$", "recordedAgentFeedbackCount_$", "CCAP_MainFrame_Component_Conditional_31_Conditional_57_Conditional_36_Template", "CCAP_MainFrame_Component_Conditional_31_Conditional_57_Conditional_46_Template", "CCAP_MainFrame_Component_Conditional_31_Conditional_19_Template", "CCAP_MainFrame_Component_Conditional_31_Conditional_25_Template", "_r5", "togglePocSubmenu", "CCAP_MainFrame_Component_Conditional_31_Conditional_38_Template", "toggleSettingsSubmenu", "CCAP_MainFrame_Component_Conditional_31_Conditional_48_Template", "toggleMaintenanceSubmenu", "CCAP_MainFrame_Component_Conditional_31_Conditional_57_Template", "\u0275\u0275pureFunction0", "_c2", "hasRunningCcapSession_$", "hasRunningCcSession_$", "\u0275\u0275classProp", "pocSubmenuOpen_$", "settingsSubmenuOpen_$", "maintenanceSubmenuOpen_$", "panel_r8", "_r7", "$implicit", "open", "CCAP_MainFrame_Component_Conditional_37_For_2_Case_1_Template", "CCAP_MainFrame_Component_Conditional_37_For_2_Case_2_Template", "CCAP_MainFrame_Component_Conditional_37_For_2_Case_3_Template", "CCAP_MainFrame_Component_Conditional_37_For_2_Case_4_Template", "tmp_13_0", "icon", "CCAP_MainFrame_Component_Conditional_37_For_2_Template", "_forTrack1", "closedPanelsLeftStrip_$", "panel_r10", "_r9", "CCAP_MainFrame_Component_Conditional_38_For_2_Case_1_Template", "CCAP_MainFrame_Component_Conditional_38_For_2_Case_2_Template", "CCAP_MainFrame_Component_Conditional_38_For_2_Case_3_Template", "CCAP_MainFrame_Component_Conditional_38_For_2_Case_4_Template", "CCAP_MainFrame_Component_Conditional_38_For_2_Template", "layoutOverlay_CS", "closedPanelsRight_$", "ctx", "promptId", "CCAP_MainFrame_Component_Conditional_40_Conditional_5_Template", "tmp_2_0", "modelRegistry_DS", "modelTestRunProgressCurrentTask_$", "CCAP_SIDE_NAV_OPEN_STORAGE_KEY", "CCAP_NAV_SETTINGS_SUBMENU_OPEN_STORAGE_KEY", "CCAP_NAV_MAINTENANCE_SUBMENU_OPEN_STORAGE_KEY", "CCAP_NAV_POC_SUBMENU_OPEN_STORAGE_KEY", "CCAP_MainFrame_Component", "DyNX_SubscriptionControl", "setup_DS", "inject", "Setup_DataService", "session_DS", "Session_DataService", "errors_DS", "Errors_DataService", "computed", "errorsTotalCount_$", "agentFeedback_DS", "Ses_Feedback_DataService", "feedbackTotalCount_$", "userInput_DS", "UserInput_DataService", "quickInputAnchorMainRef", "quickInputMainResizeObs", "ModelRegistry_DataService", "claudeCode_DS", "ClaudeCode_DataService", "sessions_$", "some", "s", "S_SessionStatusColor_Util", "isRunning", "status", "settingsGeneral_DS", "Set_General_DataService", "mobileAppUpdater_CS", "CCAP_MobileAppUpdater_ControlService", "mobileNotification_CS", "CCAP_MobileNotification_ControlService", "router", "Router", "routerUrl_$", "signal", "version", "environment", "Set_SETTINGS_AREA_NAV_LINKS", "activeSessionId_$", "socketStatus_$", "connectAttemptCount_$", "modelTestRunGlobalBannerVisible_$", "startsWith", "runId", "testRunId_$", "st", "testRunStatus_$", "Tls_ModelTestRunStatus_Status", "running", "pending", "attemptCount", "CCAP_SocketStatus_Type", "connected", "error", "sideNavOpen_$", "readSideNavOpenFromStorage", "readNavSubmenuOpenFromStorage", "left", "closedPanelsLeft_$", "layoutBreakpoint_CS", "isMobile_$", "filter", "p", "id", "CCAP_LayoutOverlay_ControlService", "CCAP_LayoutBreakpoint_ControlService", "constructor", "set", "register", "isOpen", "effect", "Shr_LocalStoragePersistence_Util", "writeString", "String", "updatePanelState", "allowSignalWrites", "settingsOpen", "maintenanceOpen", "pocOpen", "ngOnInit", "url", "checkSetupAndRedirect", "load", "then", "section_$", "form", "mobileAutoUpdateEnabled", "autoUpdateIfAvailable", "loadErrors", "loadFeedback", "initialize", "addSubscription", "events", "pipe", "e", "NavigationEnd", "subscribe", "urlAfterRedirects", "syncComposerAreaFromNavigation", "isMaintenanceRoute", "includes", "initialUrl", "ngAfterViewInit", "host", "nativeElement", "undefined", "syncQuickInputMainLayout", "syncQuickInputMainBoundsFromMainElement", "clampFabOffsetsToMain", "ResizeObserver", "observe", "ngOnDestroy", "disconnect", "__async", "getSetupStatus", "setupCompleted", "navigate", "update", "reconnectSocket", "diagnoseConnection", "result", "mergeDiagnosisIntoLastError", "catch", "err", "diagnosisError", "Error", "message", "diagnosis", "current", "updated", "__spreadValues", "readString", "storageKey", "selectors", "viewQuery", "rf", "ElementRef", "_r1", "CCAP_MainFrame_Component_Conditional_4_Template", "CCAP_MainFrame_Component_Conditional_5_Template", "CCAP_MainFrame_Component_Conditional_17_Template", "CCAP_MainFrame_Component_Conditional_18_Template", "CCAP_MainFrame_Component_Case_20_Template", "CCAP_MainFrame_Component_Case_21_Template", "CCAP_MainFrame_Component_Case_22_Template", "CCAP_MainFrame_Component_Case_23_Template", "CCAP_MainFrame_Component_Conditional_28_Template", "CCAP_MainFrame_Component_Conditional_31_Template", "CCAP_MainFrame_Component_Conditional_37_Template", "CCAP_MainFrame_Component_Conditional_38_Template", "CCAP_MainFrame_Component_Conditional_40_Template", "tmp_7_0", "\u0275\u0275pureFunction2", "_c1", "length", "CommonModule", "NgClass", "RouterModule", "RouterOutlet", "RouterLink", "RouterLinkActive", "CCAP_ErrorDisplay_Component", "CCAP_ErrorPopup_Component", "CCAP_MobileServerSetup_Component", "CCAP_AppUpdateBanner_Component", "CCAP_ServerUpdateBanner_Component", "NTF_Tray_Component", "encapsulation", "createTraceSeed", "pulse", "traceIndex", "p", "t", "createRngState", "seed", "nextUint32", "stateRef", "value", "nextInt", "min", "max", "range", "u", "clampY", "y", "lo", "hi", "nextVerticalStepDyVaried", "bucket", "nudgeYSoftAwayFromStatusCenter", "yClamped", "CCAP_CIRCUIT_STATUS_AVOID_Y_LO", "CCAP_CIRCUIT_STATUS_AVOID_Y_HI", "CCAP_CIRCUIT_SOFT_NUDGE_FROM_CENTER_CHANCE_PERCENT", "towardUpper", "magnitude", "primary", "dedupeConsecutivePoints", "points", "out", "i", "length", "prev", "x", "push", "pointsToPathD", "cleaned", "d", "computeCumulativeLengths", "result", "cumLen", "dx", "dy", "Math", "hypot", "buildTraceGeometryForStateRef", "y0", "CCAP_CIRCUIT_VIEWBOX_MID_Y", "xSplit", "x1", "xMargin", "maxXBeforeWall", "mainPoints", "x0", "curX", "curY", "stepGuard", "dyRaw", "newY", "CCAP_CIRCUIT_Y_TRACK_LO", "CCAP_CIRCUIT_Y_TRACK_HI", "bump", "ddy", "legDx", "abs", "nextX", "room", "floor", "signY", "roomAfterDy", "maxFlatCap", "CCAP_CIRCUIT_MAX_FLAT_BETWEEN_DY_STEPS_USER", "minFlat", "flatRun", "rippleUpLen", "rippleDownLen", "lastInterior", "yWall", "wallX", "yRippleUpEnd", "yRippleDownEnd", "wallRippleUp", "wallRippleDown", "cleanedPoints", "polyPoints", "totalLen", "main", "totalLength", "wallY", "wallRippleUpEndY", "wallRippleDownEndY", "CCAP_CircuitPath_Util", "buildTraceForSpawnId", "spawnId", "getPointAtDistance", "distance", "last", "mid", "p0", "p1", "segLen", "\u0275\u0275elementStart", "\u0275\u0275element", "\u0275\u0275elementEnd", "\u0275\u0275advance", "\u0275\u0275property", "ctx", "\u0275\u0275text", "\u0275\u0275textInterpolate2", "result_r4", "targetUrl", "durationMs", "errorForDisplay", "\u0275\u0275template", "CCAP_ServerUnavailableOverlay_Component_Conditional_0_Conditional_4_Conditional_8_Conditional_9_Conditional_0_Template", "CCAP_ServerUnavailableOverlay_Component_Conditional_0_Conditional_4_Conditional_8_Conditional_9_Conditional_1_Template", "\u0275\u0275conditional", "isSuccess", "CCAP_ServerUnavailableOverlay_Component_Conditional_0_Conditional_4_Conditional_8_Conditional_2_Template", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r2", "ctx_r2", "\u0275\u0275nextContext", "\u0275\u0275resetView", "handleTestConnection", "CCAP_ServerUnavailableOverlay_Component_Conditional_0_Conditional_4_Conditional_8_Conditional_5_Template", "CCAP_ServerUnavailableOverlay_Component_Conditional_0_Conditional_4_Conditional_8_Conditional_6_Template", "handleResetServerUrl", "CCAP_ServerUnavailableOverlay_Component_Conditional_0_Conditional_4_Conditional_8_Conditional_9_Template", "\u0275\u0275textInterpolate1", "configuredServerUrl_$", "tmp_4_0", "bootStatusError_$", "isTestingConnection_$", "tmp_7_0", "diagnosticResult_$", "CCAP_ServerUnavailableOverlay_Component_Conditional_0_Conditional_4_Conditional_8_Template", "_r1", "handleToggleOverlaySubdued", "isCapacitorNative_$", "_r5", "CCAP_ServerUnavailableOverlay_Component_Conditional_0_Conditional_4_Template", "CCAP_ServerUnavailableOverlay_Component_Conditional_0_Conditional_5_Template", "\u0275\u0275classProp", "isOverlaySubdued_$", "circuitReducedMotion_$", "VIEWBOX_W", "CM_TO_CSS_PX", "CCAP_ServerUnavailableOverlay_Component", "session_DS", "inject", "Session_DataService", "_injector", "Injector", "_hostRef", "ElementRef", "signal", "window", "Capacitor", "isNativePlatform", "showOverlay_$", "computed", "socketStatus_$", "CCAP_SocketStatus_Type", "error", "circuitTravelLanes_$", "_laneSeq", "_lanes", "_rafId", "_lastRafApplyMs", "_laneTeardownTimeouts", "Map", "_canvasCtx", "_canvasEl", "_cachedDpr", "_cachedCssW", "_cachedCssH", "_trailMaxUserUnits", "update", "previous", "__async", "set", "result", "CCAP_NetworkDiagnostic_Util", "probeServer", "environment", "baseUrl", "readBootStatusError", "parsed", "Shr_LocalStoragePersistence_Util", "readJson", "p", "errorMessage", "errorName", "message", "errorCode", "toUpperCase", "additionalContent", "remove", "reloadApplication", "location", "reload", "constructor", "effect", "onCleanup", "win", "globalThis", "matchMedia", "mq", "onMqChange", "matches", "addEventListener", "removeEventListener", "allowSignalWrites", "stopAllAnimation", "doc", "document", "onVisibilityChange", "hidden", "length", "ensureRafLoop", "stopRafOnly", "spawnLane", "afterNextRender", "initCanvas", "injector", "intervalId", "setInterval", "CCAP_SOCKET_IO_RECONNECTION_DELAY_MS", "clearInterval", "onResize", "handleResize", "seedId", "trackId", "geom", "CCAP_CircuitPath_Util", "buildTraceForSpawnId", "lane", "pathSeedId", "main", "points", "mainPoints", "totalLength", "wallX", "wallY", "wallRippleUpEndY", "wallRippleDownEndY", "startTimeMs", "wallRippleActive", "didScheduleRippleAndTeardown", "push", "maxLanes", "CCAP_CIRCUIT_OVERLAY_MAX_CONCURRENT_LANES", "dropped", "shift", "clearLaneTeardownTimer", "enqueueLaneTeardown", "has", "pauseMs", "CCAP_CIRCUIT_OVERLAY_WALL_HIT_MS", "timeoutId", "setTimeout", "delete", "filter", "l", "existing", "get", "undefined", "clearTimeout", "canvas", "nativeElement", "querySelector", "getContext", "dpr", "devicePixelRatio", "cssW", "Math", "max", "clientWidth", "cssH", "clientHeight", "width", "round", "height", "updateTrailMaxUserUnits", "widthPx", "tailTargetPx", "CCAP_CIRCUIT_OVERLAY_TRAIL_TAIL_TARGET_CM", "step", "rafTimestamp", "minIv", "CCAP_CIRCUIT_OVERLAY_RAF_MIN_INTERVAL_MS_REDUCED_MOTION", "requestAnimationFrame", "elapsed", "rippleThreshold", "CCAP_CIRCUIT_OVERLAY_MAIN_MS", "drawFrame", "idleThresholdMs", "some", "cancelAnimationFrame", "forEach", "tid", "clear", "now", "setTransform", "clearRect", "isPortrait", "scale", "offsetY", "translate", "rotate", "PI", "save", "globalAlpha", "drawLane", "restore", "mainMs", "headDist", "isHeadVisible", "tailMaxScale", "absorbElapsed", "CCAP_CIRCUIT_OVERLAY_TRAIL_WALL_ABSORB_MS", "uAbs", "tailLen", "trailStart", "drawTrail", "headPt", "getPointAtDistance", "drawHead", "x", "y", "rippleStartMs", "CCAP_CIRCUIT_OVERLAY_HEAD_HIDE_BEFORE_RIPPLE_MS", "rippleElapsed", "drawWallRipple", "startDist", "endDist", "opacity", "startPt", "endPt", "sx", "sy", "ex", "ey", "grad", "createLinearGradient", "addColorStop", "strokeStyle", "lineWidth", "lineCap", "lineJoin", "beginPath", "moveTo", "i", "cumLen", "lineTo", "stroke", "vx", "vy", "px", "py", "radius", "shadowBlur", "shadowColor", "headGrad", "createRadialGradient", "fillStyle", "arc", "fill", "t", "min", "wx", "wy", "upEndY", "downEndY", "ripples", "endY", "color", "ripple", "selectors", "standalone", "features", "\u0275\u0275StandaloneFeature", "decls", "vars", "consts", "template", "rf", "CCAP_ServerUnavailableOverlay_Component_Conditional_0_Template", "CommonModule", "CCAP_ErrorDisplay_Component", "styles", "changeDetection", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "ctx_r0", "activeCount_$", "CCAP_USER_INPUT_FAB_DRAG_START_THRESHOLD_PX", "UIn_Fab_Component", "userInput_DS", "inject", "UserInput_DataService", "computed", "isDraggingFab_$", "signal", "pointerDownClientX", "pointerDownClientY", "dragStartRightPx", "dragStartBottomPx", "dragStartClientX", "dragStartClientY", "isPointerDragging", "isPrimaryButtonDownOnFab", "suppressNextFabClick", "activePointerId", "fabButtonElement", "constructor", "afterNextRender", "mainEl", "getMainElement", "clampFabOffsetsToMain", "handleFabClick", "event", "preventDefault", "stopPropagation", "togglePanel", "handleFabPointerDown", "button", "currentTarget", "HTMLElement", "clientX", "clientY", "handleFabPointerMove", "applyFabPointerDragMove", "pointerType", "buttons", "moveDx", "moveDy", "Math", "hypot", "beginFabPointerDrag", "deltaX", "deltaY", "nextRightPx", "nextBottomPx", "setFabOffsetsClampedToMain", "rightPx", "bottomPx", "handleFabPointerUp", "endFabPointerDrag", "handleFabPointerCancel", "set", "fabOffsetRightPx_$", "fabOffsetBottomPx_$", "pointerId", "setPointerCapture", "_event", "releasePointerCapture", "finalizeFabDragPosition", "document", "querySelector", "selectors", "standalone", "features", "\u0275\u0275StandaloneFeature", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275listener", "$event", "\u0275\u0275element", "\u0275\u0275template", "UIn_Fab_Component_Conditional_4_Template", "\u0275\u0275styleProp", "\u0275\u0275property", "isPanelOpen_$", "\u0275\u0275conditional", "UIn_QUICK_INPUT_AREA_CUSTOM_SELECT_VALUE", "UIn_QuickInputPanelHorizontalAnchor_Type", "UIn_QuickInputPanelVerticalAnchor_Type", "UIn_PanelAnchor_Util", "resolveHorizontalAnchorType", "input", "mainW", "mainWidthPx", "fabSize", "UIn_FabPosition_Util", "fabSizePx", "fabOffsetRightPx", "UIn_QuickInputPanelHorizontalAnchor_Type", "openPanelToRightOfFab", "alignPanelRightEdgeToFabRight", "resolveVerticalAnchorType", "mainH", "mainHeightPx", "fabOffsetBottomPx", "UIn_QuickInputPanelVerticalAnchor_Type", "panelBelowFab", "panelAboveFab", "panelEdgeMarginPx", "buildPanelOverlayStyles", "gap", "fabPanelGapPx", "rightOff", "bottomOff", "edgeM", "fallback", "bottom", "top", "isMobileXs", "right", "left", "vertical", "styles", "fabTopFromTopPx", "fabLeftPx", "\u0275\u0275element", "\u0275\u0275elementStart", "\u0275\u0275elementEnd", "\u0275\u0275template", "UIn_Panel_Component_Conditional_6_Conditional_2_Conditional_0_Template", "\u0275\u0275text", "\u0275\u0275conditional", "ctx_r2", "sendAllWarningActive_$", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "activeQuickInputCount_$", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r2", "\u0275\u0275nextContext", "\u0275\u0275resetView", "handleOpenSendAllConfirm", "UIn_Panel_Component_Conditional_6_Conditional_1_Template", "UIn_Panel_Component_Conditional_6_Conditional_2_Template", "\u0275\u0275property", "\u0275\u0275pureFunction3", "_c2", "sendAllDisabled_$", "sendAllButtonTitle_$", "userInput_DS", "sendAllToCcSessionBusy_$", "project_r5", "_id", "\u0275\u0275textInterpolate", "name", "$event", "_r6", "handleAreaAutofollowChange", "quickInputAreaAutofollow_$", "quickInputComposerArea_$", "autofollowAreaDisplayLabel_$", "UIn_Panel_Component_Conditional_15_Conditional_8_Conditional_3_Conditional_3_Template", "UIn_Panel_Component_Conditional_15_Conditional_8_Conditional_3_Conditional_4_Template", "trim", "length", "opt_r8", "areaValue", "displayLabel", "_r7", "handleAreaSelectChange", "\u0275\u0275repeaterCreate", "UIn_Panel_Component_Conditional_15_Conditional_8_Conditional_4_For_4_Template", "_forTrack1", "areaSelectBoundValue_$", "\u0275\u0275repeater", "quickInputAreaCatalogOptions", "customAreaSelectValue", "UIn_Panel_Component_Conditional_15_Conditional_8_Conditional_2_Template", "UIn_Panel_Component_Conditional_15_Conditional_8_Conditional_3_Template", "UIn_Panel_Component_Conditional_15_Conditional_8_Conditional_4_Template", "_r9", "handleCustomAreaInputChange", "_r11", "handleDomPickToggleClick", "\u0275\u0275pureFunction2", "_c3", "quickInputDomPickActive_$", "\u0275$index_122_r13", "_r12", "$index", "handleComposerElementRemoveAt", "el_r14", "UIn_Panel_Component_Conditional_15_Conditional_10_Conditional_8_For_2_Template", "\u0275\u0275repeaterTrackByIdentity", "quickInputComposerElements_$", "UIn_Panel_Component_Conditional_15_Conditional_10_Conditional_0_Template", "_r10", "newComposerElementId_$", "set", "i0", "handleComposerElementSubmitFromField", "preventDefault", "UIn_Panel_Component_Conditional_15_Conditional_10_Conditional_8_Template", "_r15", "handleQuickInputListSearchQueryChange", "quickInputListSearchQuery_$", "_r4", "handleProjectChange", "UIn_Panel_Component_Conditional_15_Conditional_3_Template", "UIn_Panel_Component_Conditional_15_For_7_Template", "_forTrack0", "UIn_Panel_Component_Conditional_15_Conditional_8_Template", "UIn_Panel_Component_Conditional_15_Conditional_9_Template", "UIn_Panel_Component_Conditional_15_Conditional_10_Template", "UIn_Panel_Component_Conditional_15_Conditional_11_Template", "selectedProjectId_$", "allProjectsFilterValue", "projects_$", "selectedProjectIsCcapRevisionedHost_$", "isLoading_$", "inputs_$", "item_r17", "projectName", "UIn_Panel_Component_Conditional_20_For_2_Conditional_11_Case_1_Template", "UIn_Panel_Component_Conditional_20_For_2_Conditional_11_Case_2_Template", "UIn_Panel_Component_Conditional_20_For_2_Conditional_11_Case_3_Template", "tmp_14_0", "status", "QiStatus", "promotedUserInput", "promotedBug", "discarded", "UIn_Panel_Component_Conditional_20_For_2_Conditional_12_Case_1_Template", "UIn_Panel_Component_Conditional_20_For_2_Conditional_12_Case_2_Template", "UIn_Panel_Component_Conditional_20_For_2_Conditional_12_Case_3_Template", "UIn_Panel_Component_Conditional_20_For_2_Conditional_12_Case_4_Template", "priority", "QiPriority", "low", "medium", "high", "urgent", "UIn_Panel_Component_Conditional_20_For_2_Conditional_13_Case_1_Template", "UIn_Panel_Component_Conditional_20_For_2_Conditional_13_Case_2_Template", "UIn_Panel_Component_Conditional_20_For_2_Conditional_13_Case_3_Template", "predictedType", "QiPredType", "userInput", "bugReport", "unspecified", "predictedCleanDescription", "_r16", "$implicit", "handleOpenActionsModal", "quickInputId", "UIn_Panel_Component_Conditional_20_For_2_Conditional_10_Template", "UIn_Panel_Component_Conditional_20_For_2_Conditional_11_Template", "UIn_Panel_Component_Conditional_20_For_2_Conditional_12_Template", "UIn_Panel_Component_Conditional_20_For_2_Conditional_13_Template", "UIn_Panel_Component_Conditional_20_For_2_Conditional_14_Template", "rawContent", "\u0275\u0275pipeBind2", "createdAt", "\u0275\u0275pipeBind1", "draft", "UIn_Panel_Component_Conditional_20_For_2_Template", "_forTrack2", "filteredQuickInputs_$", "opt_r20", "path", "\u0275\u0275textInterpolate2", "label", "_r19", "sendAllSessionName_$", "handleSendAllWorkspacePathChange", "UIn_Panel_Component_Conditional_29_Conditional_10_For_3_Template", "_forTrack3", "sendAllWorkspacePath_$", "newAgentSessionWorkspace_DS", "workspacePathPickerOptions_$", "session_r22", "sessionId", "_r21", "sendAllExistingSessionId_$", "UIn_Panel_Component_Conditional_29_Conditional_14_For_4_Template", "_forTrack4", "UIn_Panel_Component_Conditional_29_Conditional_14_Conditional_5_Template", "sendAllActiveSessions_$", "_r18", "handleSendAllConfirmClosed", "handleSendAllTargetChange", "UIn_Panel_Component_Conditional_29_Conditional_10_Template", "UIn_Panel_Component_Conditional_29_Conditional_14_Template", "sendAllPromptContent_$", "handleConfirmSendAll", "UIn_Panel_Component_Conditional_29_Conditional_23_Template", "UIn_Panel_Component_Conditional_29_Conditional_24_Template", "sendAllConfirmOpen_$", "sendAllTarget_$", "sendAllSubmitDisabled_$", "QI_BULK_SEND_WORKSPACE_STORAGE_KEY", "QI_HEADER_COLLAPSED_STORAGE_KEY", "UIn_Panel_Component", "inject", "UserInput_DataService", "ccSession_DS", "ClaudeCode_DataService", "ExS_NewAgentWorkspace_DataService", "globalError_CS", "CCAP_GlobalError_ControlService", "layoutBreakpoint_CS", "CCAP_LayoutBreakpoint_ControlService", "PM_QuickInputStatus_Type", "PM_QuickInputPredictedType_Type", "PM_Priority_Type", "composerPlaceholder", "UIn_QUICK_INPUT_COMPOSER_PLACEHOLDER", "UIn_QUICK_INPUT_ALL_PROJECTS_FILTER", "UIn_QuickInputAreaCatalog_Util", "catalogOptionsForDisplay", "UIn_QUICK_INPUT_AREA_CUSTOM_SELECT_VALUE", "computed", "current", "some", "o", "getDisplayLabelForAreaValue", "panelOverlayStyle_$", "bounds", "quickInputMainBoundsPx_$", "positionStyles", "UIn_PanelAnchor_Util", "buildPanelOverlayStyles", "mainWidthPx", "widthPx", "mainHeightPx", "heightPx", "fabOffsetRightPx", "fabOffsetRightPx_$", "fabOffsetBottomPx", "fabOffsetBottomPx_$", "isMobileXs", "isMobile_$", "__spreadValues", "display", "overflow", "newInputText_$", "signal", "headerControlsCollapsed_$", "readQiHeaderCollapsed", "items", "qRaw", "toLowerCase", "filter", "item", "quickInputItemMatchesNormalizedQuery", "reverse", "quickInputListScrollContainerRef", "quickInputListAnchorRef", "isQuickInputListAtBottom", "quickInputListPrevLength", "constructor", "effect", "isOpen", "isPanelOpen_$", "projectId", "UIn_QuickInputComposerDraft_Util", "loadPayload", "text", "setQuickInputComposerElementsForUser", "elements", "syncComposerAreaFromCurrentNavigation", "applyComposerAreaFromDraftWhenManual", "area", "allowSignalWrites", "quickInputComposerDraftPersistBump_$", "persistQuickInputComposerDraft", "prev", "setTimeout", "nativeElement", "scrollIntoView", "behavior", "handleQuickInputListScroll", "el", "distanceFromBottom", "scrollHeight", "scrollTop", "clientHeight", "next", "setQuickInputDomPickActive", "handleComposerTextChange", "value", "save", "handleComposerElementAdd", "raw", "appendQuickInputComposerElement", "index", "removeQuickInputComposerElementAt", "ngOnInit", "drainOfflineQueue", "handleSubmitInput", "__async", "submitInput", "clear", "handleKeydown", "event", "key", "shiftKey", "handleVoiceTranscript", "trimmed", "update", "setProject", "handleHeaderCollapseToggle", "persistQiHeaderCollapsed", "normalizedQuery", "String", "includes", "setQuickInputComposerAreaValueForUser", "isChecked", "setQuickInputAreaAutofollow", "openQuickInputActionsModal", "sessions_$", "s", "isArchived", "sendAllWarningThreshold", "count", "newInputSendButtonTitle_$", "isSending_$", "readQiBulkSendWorkspace", "buildSendAllMessageContent", "loadSessions", "includeArchived", "refreshWorkspacePathPickerOptions", "then", "options", "stored", "target", "persistQiBulkSendWorkspace", "createSession", "workspacePath", "showError", "Error", "content", "sendPrompt", "ids", "map", "bulkArchiveQuickInputs", "err", "handleClose", "closePanel", "Shr_LocalStoragePersistence_Util", "readString", "writeString", "collapsed", "selectors", "viewQuery", "rf", "ctx", "UIn_Panel_Component_Conditional_6_Template", "_r1", "UIn_Panel_Component_Conditional_15_Template", "UIn_Panel_Component_Conditional_16_Template", "UIn_Panel_Component_Conditional_17_Template", "UIn_Panel_Component_Conditional_18_Template", "UIn_Panel_Component_Conditional_19_Template", "UIn_Panel_Component_Conditional_20_Template", "UIn_Panel_Component_Conditional_29_Template", "\u0275\u0275classProp", "CommonModule", "NgClass", "NgStyle", "DatePipe", "FormsModule", "NgSelectOption", "\u0275NgSelectMultipleOption", "DefaultValueAccessor", "CheckboxControlValueAccessor", "SelectControlValueAccessor", "NgControlStatus", "NgModel", "CCAP_VoiceRecordButton_Component", "S_Modal_Component", "CCAP_RelativeTime_Pipe", "encapsulation", "import_fsm_dynamo", "UIn_QuickInputOverlayModalZIndexNumeric_Value", "UIn_QuickInputDomPickOverlayZIndexNumeric_Value", "QUICK_INPUT_NEW_SESSION_NAME_PREFIX", "UIn_QuickInputNewSessionName_Util", "buildDisplayNameFromQuickInput", "params", "normalizedTitle", "normalizeQuickInputSnippet", "title", "length", "truncateSnippetToMaxLength", "SESSION_LIST_DISPLAY_NAME_MAX_LENGTH", "buildDisplayNameFromQuickInputRaw", "rawContent", "normalized", "prefix", "maxSuffixLen", "slice", "suffix", "raw", "replace", "trim", "text", "maxLen", "cut", "lastSpace", "lastIndexOf", "UIn_QuickInputModalPane_Type", "UIn_QuickInputSendSessionTarget_Type", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275advance", "\u0275\u0275textInterpolate", "ctx_r1", "copyFeedback_$", "ctx", "\u0275\u0275listener", "\u0275$index_143_r4", "\u0275\u0275restoreView", "_r3", "$index", "\u0275\u0275nextContext", "\u0275\u0275resetView", "handleHubRemoveElementAt", "\u0275\u0275element", "el_r5", "\u0275\u0275property", "hubGridPatchBusy_$", "hubDeleteDisabled_$", "\u0275\u0275repeaterCreate", "UIn_QuickActionsModal_Component_Conditional_1_Case_0_Conditional_77_For_2_Template", "\u0275\u0275repeaterTrackByIdentity", "\u0275\u0275repeater", "elementsDraft_$", "\u0275\u0275textInterpolate1", "\u0275\u0275pipeBind2", "sel_r6", "createdAt", "updatedAt", "promotedUserRequestId", "promotedBugCode", "\u0275\u0275template", "UIn_QuickActionsModal_Component_Conditional_1_Case_0_Conditional_92_Case_4_Template", "UIn_QuickActionsModal_Component_Conditional_1_Case_0_Conditional_92_Case_5_Template", "UIn_QuickActionsModal_Component_Conditional_1_Case_0_Conditional_92_Case_6_Template", "\u0275\u0275conditional", "tmp_4_0", "predictedType", "QiPredType", "userInput", "bugReport", "unspecified", "predictedProjectId", "predictedCleanDescription", "project_r8", "_id", "name", "$event", "_r7", "targetProjectId_$", "set", "UIn_QuickActionsModal_Component_Conditional_1_Case_0_Conditional_101_For_4_Template", "_forTrack0", "handleOpenClassifyConfirm", "handleOpenApplyPredictionConfirm", "handleOpenSaveTargetProjectConfirm", "UIn_QuickActionsModal_Component_Conditional_1_Case_0_Conditional_101_Conditional_12_Template", "UIn_QuickActionsModal_Component_Conditional_1_Case_0_Conditional_101_Conditional_13_Template", "UIn_QuickActionsModal_Component_Conditional_1_Case_0_Conditional_101_Conditional_14_Template", "UIn_QuickActionsModal_Component_Conditional_1_Case_0_Conditional_101_Conditional_15_Template", "userInput_DS", "projects_$", "hubClassifyLlmDisabled_$", "classifyQuickInputBusy_$", "hubApplyPredictionDisabled_$", "isTargetProjectDirty_$", "saveTargetProjectBusy_$", "tmp_11_0", "hubClassifyLlmDisabledHint_$", "tmp_12_0", "hubApplyPredictionDisabledHint_$", "tmp_13_0", "hubSaveTargetProjectDisabledHint_$", "UIn_QuickActionsModal_Component_Conditional_1_Case_0_Conditional_108_Conditional_2_Template", "_r9", "handleOpenSendToSession", "SendTarget", "caSession", "ccSession", "ccapSession", "UIn_QuickActionsModal_Component_Conditional_1_Case_0_Conditional_108_Conditional_10_Template", "sendToSessionFeedback_$", "hubSendToSessionDisabled_$", "UIn_QuickActionsModal_Component_Conditional_1_Case_0_Conditional_121_Conditional_2_Template", "_r10", "handleOpenWizardConfirm", "handleOpenDirectConfirm", "handleOpenBugConfirm", "hubProjectPromotionActionsHint_$", "canPromoteWithSyncedTarget_$", "UIn_QuickActionsModal_Component_Conditional_1_Case_0_Conditional_7_Template", "_r1", "handleOpenCopyConfirm", "executeOpenEdit", "UIn_QuickActionsModal_Component_Conditional_1_Case_0_Conditional_14_Template", "UIn_QuickActionsModal_Component_Conditional_1_Case_0_Case_31_Template", "UIn_QuickActionsModal_Component_Conditional_1_Case_0_Case_32_Template", "UIn_QuickActionsModal_Component_Conditional_1_Case_0_Case_33_Template", "UIn_QuickActionsModal_Component_Conditional_1_Case_0_Case_34_Template", "handleTaskDifficultySelectChange", "handlePrioritySelectChange", "area_$", "handleSaveArea", "newElementLine_$", "i0", "handleHubAddElementLine", "preventDefault", "UIn_QuickActionsModal_Component_Conditional_1_Case_0_Conditional_77_Template", "handleSaveElements", "UIn_QuickActionsModal_Component_Conditional_1_Case_0_Conditional_83_Template", "UIn_QuickActionsModal_Component_Conditional_1_Case_0_Conditional_84_Template", "UIn_QuickActionsModal_Component_Conditional_1_Case_0_Conditional_88_Template", "UIn_QuickActionsModal_Component_Conditional_1_Case_0_Conditional_89_Template", "UIn_QuickActionsModal_Component_Conditional_1_Case_0_Conditional_90_Template", "UIn_QuickActionsModal_Component_Conditional_1_Case_0_Conditional_91_Template", "UIn_QuickActionsModal_Component_Conditional_1_Case_0_Conditional_92_Template", "UIn_QuickActionsModal_Component_Conditional_1_Case_0_Conditional_93_Template", "UIn_QuickActionsModal_Component_Conditional_1_Case_0_Conditional_94_Template", "toggleHubBlock", "UIn_QuickActionsModal_Component_Conditional_1_Case_0_Conditional_101_Template", "UIn_QuickActionsModal_Component_Conditional_1_Case_0_Conditional_108_Template", "UIn_QuickActionsModal_Component_Conditional_1_Case_0_Conditional_109_Template", "handleOpenQuickInputDeleteConfirm", "UIn_QuickActionsModal_Component_Conditional_1_Case_0_Conditional_114_Template", "UIn_QuickActionsModal_Component_Conditional_1_Case_0_Conditional_121_Template", "hubCopyDisabled_$", "tmp_5_0", "hubCopyDisabledHint_$", "rawContent", "quickInputId", "projectId", "tmp_9_0", "status", "QiStatus", "draft", "promotedUserInput", "promotedBug", "discarded", "taskDifficulty_$", "QiTaskDiff", "easy", "medium", "hard", "komplex", "priority_$", "QiPriority", "low", "high", "urgent", "isAreaDirty_$", "areaPatchBusy_$", "length", "isElementsDirty_$", "elementsPatchBusy_$", "\u0275\u0275classProp", "hubCollapsedBlocks_$", "canPromote_$", "tmp_47_0", "hubDeleteDisabledHint_$", "_r11", "editTitle_$", "editRaw_$", "UIn_QuickActionsModal_Component_Conditional_1_Case_1_Conditional_8_Template", "handleBackToHub", "handleSaveEdit", "editSaveDisabledHint_$", "editSaveSubmitDisabled_$", "editSaveBusy_$", "_r13", "handleWizardFinalizeSuccess", "selectedQuickInputId_$", "wizardSeedRaw_$", "wizardStagingPriority_$", "_r12", "UIn_QuickActionsModal_Component_Conditional_1_Case_2_Conditional_3_Template", "UIn_QuickActionsModal_Component_Conditional_1_Case_2_Conditional_4_Template", "hasSelectedProject_$", "_r15", "_r14", "UIn_QuickActionsModal_Component_Conditional_1_Case_3_Conditional_3_Template", "UIn_QuickActionsModal_Component_Conditional_1_Case_3_Conditional_4_Template", "UIn_QuickActionsModal_Component_Conditional_1_Case_0_Template", "UIn_QuickActionsModal_Component_Conditional_1_Case_1_Template", "UIn_QuickActionsModal_Component_Conditional_1_Case_2_Template", "UIn_QuickActionsModal_Component_Conditional_1_Case_3_Template", "tmp_2_0", "pane_$", "Pane", "hub", "edit", "wizard", "direct", "_r16", "sendToSessionSelectedId_$", "sendToSessionContent_$", "sendToSessionSelectKind_$", "sendToSessionRowViews_$", "_r17", "handlePostPromotionGoToSession", "postPromotionCleanupBusy_$", "UIn_QuickActionsModal_Component", "quickInputOverlayModalZIndex_Value", "UIn_QuickInputOverlayModalZIndexNumeric_Value", "inject", "UserInput_DataService", "pm_DS", "ProjectManagement_DataService", "globalError_CS", "CCAP_GlobalError_ControlService", "caSession_DS", "CursorAcp_DataService", "ccSession_DS", "ClaudeCode_DataService", "session_DS", "Session_DataService", "router", "Router", "newAgentSessionWorkspace_DS", "ExS_NewAgentWorkspace_DataService", "UIn_QuickInputModalPane_Type", "PM_QuickInputStatus_Type", "PM_QuickInputPredictedType_Type", "PM_QuickInputTaskDifficulty_Type", "PM_Priority_Type", "UIn_QuickInputSendSessionTarget_Type", "signal", "lastSyncedQuickInputId", "taskDifficultyPatchBusy_$", "priorityPatchBusy_$", "computed", "manualBugModalOpen_$", "manualBugBusy_$", "quickInputDeleteConfirmOpen_$", "deleteQuickInputBusy_$", "bugPrefillTitle_$", "bugPrefillDetails_$", "copyFeedbackClearHandle", "genericConfirmOpen_$", "genericConfirmTitle_$", "genericConfirmBody_$", "genericConfirmBusy_$", "genericConfirmButtonLabel_$", "pendingGenericConfirmAction_", "SEND_NEW_SESSION_VALUE", "sendToSessionOpen_$", "sendToSessionType_$", "createNewRow", "id", "label", "statusColorClass", "isArchived", "isRunning", "type", "rows", "sessions_$", "map", "s", "sessionId", "S_SessionStatusColor_Util", "resolve", "postPromotionCleanupOpen_$", "postPromotionCleanupEntityLabel_$", "postPromotionCleanupRouteCmds_$", "sendToSessionBusy_$", "sendToSessionFeedbackClearHandle", "blockId", "prev", "next", "__spreadProps", "__spreadValues", "selectedItem_$", "quickInputActionsModalOpen_$", "getSelectedQuickInputListItem", "priority", "item", "trim", "String", "saved", "area", "elements", "undefined", "quickInputElementListsEqual", "mainModalTitle_$", "p", "sendToSessionModalTitle_$", "t", "sendToSessionConfirmDisabled_$", "constructor", "effect", "clearTimeout", "allowSignalWrites", "pushQuickInputOverlayAreaContextByOverlayId", "UIn_QuickInputOverlayAreaId_Type", "quickInputActionsModal", "closeQuickInputActionsModalOverlayChain", "qid", "taskDifficulty", "a", "b", "i", "raw", "__async", "pathProjectId", "nextEmpty", "currentEmpty", "allowed", "body", "nextDifficulty", "find", "v", "previousSelect", "patchQuickInput", "showError", "Error", "nextPriority", "nextTrimmed", "previousDraft", "includes", "push", "index", "splice", "refreshed", "openGenericConfirm", "executeCopyRawContent", "text", "result", "copyToClipboard", "ok", "error", "window", "setTimeout", "second", "handleMainModalClosed", "closeQuickInputActionsModal", "predicted", "executeApplyPredictedProject", "executeSaveTargetProject", "nextProjectId", "selectedProjectId_$", "executeClassifyQuickInputWithLlm", "classifyQuickInputWithLlm", "handleOpenEditConfirm", "title", "nextRaw", "nextTitleRaw", "currentTitle", "executeOpenWizard", "executeOpenDirect", "urId", "userRequest", "code", "executeOpenBugModal", "firstLine", "split", "titleSeed", "handleBugModalClosed", "handleBugSubmitted", "targetPid", "createManualBugAndRefresh", "createdCode", "userRequestId", "err", "handleQuickInputDeleteConfirmClosed", "handleConfirmDeleteQuickInput", "deleteQuickInput", "buttonLabel", "action", "handleGenericConfirm", "handleGenericConfirmClosed", "handlePostPromotionDelete", "handlePostPromotionKeep", "cmds", "navigate", "handlePostPromotionCleanupClosed", "target", "Promise", "all", "loadSessions", "refreshWorkspacePathPickerOptions", "handleSendToSessionClosed", "handleConfirmSendToSession", "content", "selectedId", "isNew", "currentItem", "newSessionDisplayName", "UIn_QuickInputNewSessionName_Util", "buildDisplayNameFromQuickInput", "createNewSessionForSend", "displayName", "sendPrompt", "sendMessageToSession", "sessionKind", "routePrefix", "options", "workspacePath", "resolveDefaultWorkspacePath", "createSession", "workspacePathPickerOptions_$", "path", "selectors", "standalone", "features", "\u0275\u0275StandaloneFeature", "decls", "vars", "consts", "template", "rf", "UIn_QuickActionsModal_Component_Conditional_1_Template", "UIn_QuickActionsModal_Component_Conditional_2_Template", "UIn_QuickActionsModal_Component_Conditional_5_Template", "UIn_QuickActionsModal_Component_Conditional_20_Template", "UIn_QuickActionsModal_Component_Conditional_32_Template", "UIn_QuickActionsModal_Component_Conditional_34_Template", "tmp_3_0", "tmp_27_0", "tmp_36_0", "CommonModule", "DatePipe", "FormsModule", "NgSelectOption", "\u0275NgSelectMultipleOption", "DefaultValueAccessor", "SelectControlValueAccessor", "NgControlStatus", "MaxLengthValidator", "NgModel", "S_Modal_Component", "S_SessionSelect_Component", "PM_UserInputWizard_Component", "PM_ManualBugModal_Component", "encapsulation", "UIn_QuickInputDomPick_Util", "PICKER_ROOT_ATTR", "TOKEN_MAX_LENGTH", "isUnderQuickInputChrome", "element", "closest", "resolvePickTargetAtPoint", "input", "stack", "doc", "elementsFromPoint", "clientX", "clientY", "node", "HTMLElement", "String", "id", "trim", "length", "tagLower", "localName", "toLowerCase", "buildElementsListTokenFromElement", "idTrimmed", "base", "classList", "firstTwo", "i", "maxClasses", "c", "item", "push", "join", "slice", "buildHoverLabelForElement", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275property", "ctx", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "ctx_r0", "userInput_DS", "quickInputDomPickHoverLabel_$", "\u0275\u0275element", "\u0275\u0275template", "UIn_QuickDomPickerOverlay_Component_Conditional_1_Conditional_1_Template", "\u0275\u0275conditional", "tmp_3_0", "domPickLabelStyle_$", "UIn_QuickDomPickerOverlay_Component", "inject", "UserInput_DataService", "destroyRef", "DestroyRef", "domPickZIndexValue", "UIn_QuickInputDomPickOverlayZIndexNumeric_Value", "pendingClientX", "pendingClientY", "isRafScheduled", "lastHoverTarget", "domPickHighlightBoxStyle_$", "computed", "r", "quickInputDomPickHoverRect_$", "top", "topPx", "left", "leftPx", "width", "widthPx", "height", "heightPx", "Math", "max", "maxWidth", "constructor", "window", "onMouseMove", "event", "clientX", "clientY", "requestAnimationFrame", "applyHoverAtPoint", "onClickCapture", "quickInputDomPickActive_$", "isPanelOpen_$", "selectedProjectIsCcapRevisionedHost_$", "preventDefault", "stopImmediatePropagation", "token", "UIn_QuickInputDomPick_Util", "buildElementsListTokenFromElement", "appendQuickInputComposerElement", "requestComposerDraftPersistBump", "onKeyDown", "key", "setQuickInputDomPickActive", "addEventListener", "passive", "onDestroy", "removeEventListener", "setQuickInputDomPickHoverPreview", "rect", "label", "el", "resolvePickTargetAtPoint", "doc", "document", "box", "getBoundingClientRect", "buildHoverLabelForElement", "selectors", "standalone", "features", "\u0275\u0275StandaloneFeature", "decls", "vars", "consts", "template", "rf", "UIn_QuickDomPickerOverlay_Component_Conditional_1_Template", "\u0275\u0275styleProp", "tmp_2_0", "CommonModule", "NgStyle", "encapsulation", "\u0275\u0275element", "App_Component", "title", "userInput_DS", "inject", "UserInput_DataService", "presenceSubscriber_CS", "ExS_InstancePresenceSubscriber_ControlService", "constructor", "initialize", "quickInputAppHostStyle_$", "computed", "b", "quickInputMainBoundsPx_$", "top", "topPx", "left", "leftPx", "width", "widthPx", "height", "heightPx", "selectors", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275elementStart", "\u0275\u0275template", "App_Component_Conditional_6_Template", "\u0275\u0275elementEnd", "\u0275\u0275advance", "\u0275\u0275property", "\u0275\u0275conditional", "isPanelOpen_$", "routes", "path", "loadChildren", "then", "m", "Dashboard_Module", "Setup_Module", "Settings_Module", "ModelRegistry_Module", "CostTracking_Module", "Costs_Module", "EmbeddingRegistry_Module", "redirectTo", "pathMatch", "DocumentLibrary_Module", "ProjectSource_RoutedModule", "EmbeddingEval_Module", "Session_Module", "Errors_Module", "Feedback_Module", "Logs_Module", "HostRuntimeMcp_Module", "VoiceNotesPoc_Module", "MasterControlRemotePoc_Module", "WorkflowSettings_Module", "Coordinator_Module", "Scheduler_Module", "Orchestrator_Module", "DarkOffice_Module", "ProjectManagement_Module", "CcSession_Module", "loadComponent", "CC_UsageDashboard_Component", "MobileApp_Module", "OcSession_Module", "CaSession_Module", "Consultant_Module", "AgentInstances_Module", "Terminals_Module", "LiveDevPipeline_Module", "App_RoutingModule", "RouterModule", "forRoot", "preloadingStrategy", "PreloadAllModules", "import_fsm_dynamo", "isErrorsApiRequest", "url", "includes", "CCAP_Error_Interceptor", "req", "next", "globalError_CS", "inject", "CCAP_GlobalError_ControlService", "errors_AS", "Errors_ApiService", "pipe", "catchError", "err", "HttpErrorResponse", "isErrorsApi", "isErrorHandlingInProgress", "DyFM_Error", "logSimple", "status", "beginErrorHandling", "payload", "buildReportPayloadFromError", "showError", "reportError", "catch", "message", "e", "DyFM_Log", "error", "endErrorHandling", "throwError", "import_fsm_dynamo", "CCAP_GlobalError_Handler", "ErrorHandler", "globalError_CS", "inject", "CCAP_GlobalError_ControlService", "constructor", "handleError", "err", "isErrorHandlingInProgress", "DyFM_Log", "error", "beginErrorHandling", "showError", "endErrorHandling", "e", "factory", "\u0275fac", "providedIn", "App_Module", "bootstrap", "App_Component", "provideHttpClient", "withInterceptors", "CCAP_Error_Interceptor", "provide", "ErrorHandler", "useClass", "CCAP_GlobalError_Handler", "imports", "BrowserModule", "FormsModule", "RouterModule", "App_RoutingModule", "CCAP_ErrorDisplay_Component", "CCAP_MainFrame_Component", "CCAP_ServerUnavailableOverlay_Component", "UIn_Panel_Component", "UIn_QuickActionsModal_Component", "UIn_QuickDomPickerOverlay_Component", "isCapacitorNative", "window", "Capacitor", "isNativePlatform", "url", "URL", "location", "href", "savedServerUrl", "localStorage", "getItem", "environment", "baseUrl", "origin", "api", "STATUS_FETCH_RETRIES", "STATUS_FETCH_DELAY_MS", "fetchStatus", "statusUrl", "fetch", "then", "res", "json", "bootstrap", "platformBrowser", "bootstrapModule", "App_Module", "scheduleBootSplashHide", "catch", "err", "DyFM_Log", "H_error", "CCAP_BOOT_SPLASH_FADE_OUT_MS", "CCAP_BOOT_SPLASH_REMOVE_AFTER_MS", "requestAnimationFrame", "splashEl", "document", "getElementById", "classList", "add", "setTimeout", "remove", "Plugins", "SplashScreen", "hide", "fadeOutDuration", "CCAP_BOOT_STATUS_ERROR_STORAGE_KEY", "attemptStatusThenBootstrap", "attempt", "serverBaseUrl", "data", "httpPort", "undefined", "socketPort", "socketUrl", "SocketUrl_Util", "computeSocketUrlFromStatus", "removeItem", "info", "errorSnapshot", "targetUrl", "errorName", "Error", "name", "errorMessage", "message", "String", "attempts", "timestamp", "Date", "toISOString", "setItem", "JSON", "stringify", "warn", "finally", "initSocketUrlThenBootstrap"]
|
|
7
|
+
}
|