@futdevpro/ccap 1.1.3034 → 1.1.3039
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-DNEQ4QES.js → agent-instances.module-63DMGKO2.js} +2 -2
- package/client-dist/{ca.module-RGPRFFQR.js → ca.module-T4GLGQMJ.js} +2 -2
- package/client-dist/ca.module-T4GLGQMJ.js.map +7 -0
- package/client-dist/{cc-usage-dashboard.component-PEZVSG7M.js → cc-usage-dashboard.component-WQFT75MV.js} +2 -2
- package/client-dist/{cc.module-JUQY7GCV.js → cc.module-PEJ6OV2U.js} +2 -2
- package/client-dist/cc.module-PEJ6OV2U.js.map +7 -0
- package/client-dist/{chunk-E4KDYJK2.js → chunk-2AGHFWEW.js} +2 -2
- package/client-dist/{chunk-ZGYR3BWU.js → chunk-2K7AS4TQ.js} +2 -2
- package/client-dist/{chunk-AZLDEUIZ.js → chunk-3GFRMENC.js} +2 -2
- package/client-dist/{chunk-AOKITOTZ.js → chunk-3ZIP6GFB.js} +2 -2
- package/client-dist/{chunk-B5D2O575.js → chunk-44PQAFEL.js} +2 -2
- package/client-dist/{chunk-6HT66YVK.js → chunk-4MMPDNPS.js} +2 -2
- package/client-dist/{chunk-YPZWNP5A.js → chunk-54YZZ7DI.js} +2 -2
- package/client-dist/{chunk-IIZH7NVD.js → chunk-56Q57BLF.js} +2 -2
- package/client-dist/{chunk-FV6SC2QU.js → chunk-5A22WYW7.js} +2 -2
- package/client-dist/{chunk-OMXNVPGE.js → chunk-5VMMYEMK.js} +2 -2
- package/client-dist/{chunk-Q5DHVZ7D.js → chunk-5Y3UBNHV.js} +2 -2
- package/client-dist/{chunk-P6FPD5OQ.js → chunk-6PIFC53E.js} +2 -2
- package/client-dist/{chunk-ZVQUYA4H.js → chunk-73W3SDF2.js} +2 -2
- package/client-dist/{chunk-YS7A2NP6.js → chunk-AD7RW3IE.js} +2 -2
- package/client-dist/{chunk-H3UBW75V.js → chunk-ATR4YAIL.js} +2 -2
- package/client-dist/{chunk-JWZ24GIQ.js → chunk-BJYELNNP.js} +2 -2
- package/client-dist/{chunk-P7KPEPO7.js → chunk-BNALWJUC.js} +2 -2
- package/client-dist/{chunk-JIYKLYYE.js → chunk-BPWY4SOQ.js} +2 -2
- package/client-dist/{chunk-HQMSP7F6.js → chunk-C4H7J567.js} +2 -2
- package/client-dist/{chunk-C77QVQH5.js → chunk-CUMUA2HP.js} +2 -2
- package/client-dist/{chunk-6H3YM2KP.js → chunk-EUMQRYBI.js} +2 -2
- package/client-dist/{chunk-SY5M3A3Q.js → chunk-GABPE7B3.js} +2 -2
- package/client-dist/{chunk-F4HSG3GQ.js → chunk-GBRJVJWI.js} +2 -2
- package/client-dist/{chunk-IEVAOKOF.js → chunk-H6OPOJX2.js} +2 -2
- package/client-dist/{chunk-ED2JP2SX.js → chunk-I3IKMSNZ.js} +2 -2
- package/client-dist/{chunk-AHBMUOS3.js → chunk-IOERVA2Z.js} +2 -2
- package/client-dist/{chunk-TS2SSYDS.js → chunk-JDBS6ZXD.js} +2 -2
- package/client-dist/{chunk-DOJVWJJ3.js → chunk-KD4JK4LC.js} +2 -2
- package/client-dist/{chunk-RJGC4CE7.js → chunk-M4CGCNOB.js} +2 -2
- package/client-dist/{chunk-E7UUENED.js → chunk-NNEFCEZZ.js} +2 -2
- package/client-dist/{chunk-Y2AUIGUM.js → chunk-NXBECCCW.js} +2 -2
- package/client-dist/{chunk-QE7LJZUK.js → chunk-OHI3J35R.js} +2 -2
- package/client-dist/{chunk-343QTRWG.js → chunk-OITOJMIX.js} +2 -2
- package/client-dist/{chunk-TBPY4N7X.js → chunk-PWGYG7KG.js} +2 -2
- package/client-dist/{chunk-KLIVF7NF.js → chunk-RIYSXVU2.js} +2 -2
- package/client-dist/{chunk-ZTPYZH3Z.js → chunk-RJX7O3DI.js} +2 -2
- package/client-dist/{chunk-CDFLZ523.js → chunk-RZPQNQWP.js} +2 -2
- package/client-dist/{chunk-AC6VDECU.js → chunk-S2FEPCDW.js} +2 -2
- package/client-dist/{chunk-B22GYBFL.js → chunk-SDS4IT63.js} +2 -2
- package/client-dist/{chunk-H62NDY3W.js → chunk-SNMSF3UC.js} +2 -2
- package/client-dist/{chunk-4F6OM6PQ.js → chunk-TKAV5X35.js} +2 -2
- package/client-dist/{chunk-BY7QOLIO.js → chunk-TXVACKLG.js} +2 -2
- package/client-dist/{chunk-OXGMGAWK.js → chunk-U3FLQ2MZ.js} +2 -2
- package/client-dist/{chunk-OXGMGAWK.js.map → chunk-U3FLQ2MZ.js.map} +2 -2
- package/client-dist/{chunk-TRPIAKRB.js → chunk-UOZVXYOQ.js} +2 -2
- package/client-dist/{chunk-MVAZ7JR5.js → chunk-UPREBG2C.js} +2 -2
- package/client-dist/{chunk-ZLKNTGRH.js → chunk-VA3QGKXE.js} +2 -2
- package/client-dist/{chunk-PS73GRXP.js → chunk-VILXJBM4.js} +2 -2
- package/client-dist/{chunk-5DVU3XRC.js → chunk-VRI47IVY.js} +2 -2
- package/client-dist/{chunk-5DVU3XRC.js.map → chunk-VRI47IVY.js.map} +1 -1
- package/client-dist/{chunk-3MSKVM2T.js → chunk-VS3F3LTC.js} +2 -2
- package/client-dist/{chunk-WKY6ZRDX.js → chunk-W3WV5NJ7.js} +2 -2
- package/client-dist/{chunk-Z2SVASLX.js → chunk-WL5L5AUS.js} +2 -2
- package/client-dist/{chunk-7R5IXHU5.js → chunk-WPT7HGB2.js} +2 -2
- package/client-dist/{chunk-CF6YGIKE.js → chunk-XSZRRELF.js} +2 -2
- package/client-dist/{chunk-XMFYG4OB.js → chunk-ZE4SBBQZ.js} +2 -2
- package/client-dist/{chunk-7SDU766A.js → chunk-ZELVI2B7.js} +2 -2
- package/client-dist/{chunk-CK5ZMGFL.js → chunk-ZKMLJXN4.js} +2 -2
- package/client-dist/{consultant.module-VDHVKNXB.js → consultant.module-H52V7TON.js} +2 -2
- package/client-dist/{consultant.module-VDHVKNXB.js.map → consultant.module-H52V7TON.js.map} +2 -2
- package/client-dist/{crd.module-746ZW6FL.js → crd.module-X5U6DQ3D.js} +2 -2
- package/client-dist/{dashboard.module-U2NE6P3E.js → dashboard.module-4LC4RSOF.js} +2 -2
- package/client-dist/{do.module-5V6Y3CDL.js → do.module-HWKFQZQK.js} +2 -2
- package/client-dist/{document-library.module-HXQGKT63.js → document-library.module-Z57ZOMUG.js} +2 -2
- package/client-dist/{embedding-eval.module-OENZYGQE.js → embedding-eval.module-ULD6Z5XA.js} +2 -2
- package/client-dist/{embedding-registry.module-RTS4TH4Q.js → embedding-registry.module-TGWG2VER.js} +2 -2
- package/client-dist/{err.module-E4JTGICP.js → err.module-V5HQPNPJ.js} +2 -2
- package/client-dist/{feedback.module-YFIHVIAZ.js → feedback.module-U2Z6XYBB.js} +2 -2
- package/client-dist/{host-runtime-mcp.module-N73MDNBO.js → host-runtime-mcp.module-ZZGAS7DP.js} +2 -2
- package/client-dist/index.html +1 -1
- package/client-dist/{live-dev-pipeline.module-IA4J3U76.js → live-dev-pipeline.module-TPPLFJXH.js} +2 -2
- package/client-dist/{logs.module-VRVZQ76G.js → logs.module-5ZT7XQ3Q.js} +2 -2
- package/client-dist/{main-AYZ66GKH.js → main-NSPSEMNL.js} +3 -3
- package/client-dist/{main-AYZ66GKH.js.map → main-NSPSEMNL.js.map} +2 -2
- package/client-dist/{master-control-remote-poc.module-ENMKL3BL.js → master-control-remote-poc.module-IK64YCVI.js} +2 -2
- package/client-dist/{mobile-app.module-25TPEFGS.js → mobile-app.module-GI44MNWC.js} +2 -2
- package/client-dist/{model-registry.module-DTJEN56N.js → model-registry.module-F7M4C7MR.js} +2 -2
- package/client-dist/{oc.module-2ZFRFAWW.js → oc.module-G4TGODLQ.js} +2 -2
- package/client-dist/oc.module-G4TGODLQ.js.map +7 -0
- package/client-dist/{orc.module-JLA5C7MW.js → orc.module-DOAWAEFJ.js} +2 -2
- package/client-dist/{project-management.module-NBKCZQ6Y.js → project-management.module-2SDSNJJL.js} +2 -2
- package/client-dist/project-source-routed.module-CQLNUDIR.js +2 -0
- package/client-dist/{scheduler.module-HFDAX5PZ.js → scheduler.module-25VUGCV3.js} +2 -2
- package/client-dist/{session.module-S5W7MI7Z.js → session.module-Q3KGKPUU.js} +2 -2
- package/client-dist/session.module-Q3KGKPUU.js.map +7 -0
- package/client-dist/{set.module-5NOTNWQ3.js → set.module-4NWORE5F.js} +2 -2
- package/client-dist/{setup.module-NBPWQBBC.js → setup.module-N3AYAAZ6.js} +2 -2
- package/client-dist/{terminals.module-2MRATCCN.js → terminals.module-3ELX7JV6.js} +2 -2
- package/client-dist/{voice-notes-poc.module-QRB77K3S.js → voice-notes-poc.module-ZHORCWRL.js} +2 -2
- package/client-dist/{wfs.module-ZWBQCUOA.js → wfs.module-EDYBZUSQ.js} +2 -2
- package/package.json +1 -1
- package/client-dist/ca.module-RGPRFFQR.js.map +0 -7
- package/client-dist/cc.module-JUQY7GCV.js.map +0 -7
- package/client-dist/oc.module-2ZFRFAWW.js.map +0 -7
- package/client-dist/project-source-routed.module-MDS232LH.js +0 -2
- package/client-dist/session.module-S5W7MI7Z.js.map +0 -7
- /package/client-dist/{agent-instances.module-DNEQ4QES.js.map → agent-instances.module-63DMGKO2.js.map} +0 -0
- /package/client-dist/{cc-usage-dashboard.component-PEZVSG7M.js.map → cc-usage-dashboard.component-WQFT75MV.js.map} +0 -0
- /package/client-dist/{chunk-E4KDYJK2.js.map → chunk-2AGHFWEW.js.map} +0 -0
- /package/client-dist/{chunk-ZGYR3BWU.js.map → chunk-2K7AS4TQ.js.map} +0 -0
- /package/client-dist/{chunk-AZLDEUIZ.js.map → chunk-3GFRMENC.js.map} +0 -0
- /package/client-dist/{chunk-AOKITOTZ.js.map → chunk-3ZIP6GFB.js.map} +0 -0
- /package/client-dist/{chunk-B5D2O575.js.map → chunk-44PQAFEL.js.map} +0 -0
- /package/client-dist/{chunk-6HT66YVK.js.map → chunk-4MMPDNPS.js.map} +0 -0
- /package/client-dist/{chunk-YPZWNP5A.js.map → chunk-54YZZ7DI.js.map} +0 -0
- /package/client-dist/{chunk-IIZH7NVD.js.map → chunk-56Q57BLF.js.map} +0 -0
- /package/client-dist/{chunk-FV6SC2QU.js.map → chunk-5A22WYW7.js.map} +0 -0
- /package/client-dist/{chunk-OMXNVPGE.js.map → chunk-5VMMYEMK.js.map} +0 -0
- /package/client-dist/{chunk-Q5DHVZ7D.js.map → chunk-5Y3UBNHV.js.map} +0 -0
- /package/client-dist/{chunk-P6FPD5OQ.js.map → chunk-6PIFC53E.js.map} +0 -0
- /package/client-dist/{chunk-ZVQUYA4H.js.map → chunk-73W3SDF2.js.map} +0 -0
- /package/client-dist/{chunk-YS7A2NP6.js.map → chunk-AD7RW3IE.js.map} +0 -0
- /package/client-dist/{chunk-H3UBW75V.js.map → chunk-ATR4YAIL.js.map} +0 -0
- /package/client-dist/{chunk-JWZ24GIQ.js.map → chunk-BJYELNNP.js.map} +0 -0
- /package/client-dist/{chunk-P7KPEPO7.js.map → chunk-BNALWJUC.js.map} +0 -0
- /package/client-dist/{chunk-JIYKLYYE.js.map → chunk-BPWY4SOQ.js.map} +0 -0
- /package/client-dist/{chunk-HQMSP7F6.js.map → chunk-C4H7J567.js.map} +0 -0
- /package/client-dist/{chunk-C77QVQH5.js.map → chunk-CUMUA2HP.js.map} +0 -0
- /package/client-dist/{chunk-6H3YM2KP.js.map → chunk-EUMQRYBI.js.map} +0 -0
- /package/client-dist/{chunk-SY5M3A3Q.js.map → chunk-GABPE7B3.js.map} +0 -0
- /package/client-dist/{chunk-F4HSG3GQ.js.map → chunk-GBRJVJWI.js.map} +0 -0
- /package/client-dist/{chunk-IEVAOKOF.js.map → chunk-H6OPOJX2.js.map} +0 -0
- /package/client-dist/{chunk-ED2JP2SX.js.map → chunk-I3IKMSNZ.js.map} +0 -0
- /package/client-dist/{chunk-AHBMUOS3.js.map → chunk-IOERVA2Z.js.map} +0 -0
- /package/client-dist/{chunk-TS2SSYDS.js.map → chunk-JDBS6ZXD.js.map} +0 -0
- /package/client-dist/{chunk-DOJVWJJ3.js.map → chunk-KD4JK4LC.js.map} +0 -0
- /package/client-dist/{chunk-RJGC4CE7.js.map → chunk-M4CGCNOB.js.map} +0 -0
- /package/client-dist/{chunk-E7UUENED.js.map → chunk-NNEFCEZZ.js.map} +0 -0
- /package/client-dist/{chunk-Y2AUIGUM.js.map → chunk-NXBECCCW.js.map} +0 -0
- /package/client-dist/{chunk-QE7LJZUK.js.map → chunk-OHI3J35R.js.map} +0 -0
- /package/client-dist/{chunk-343QTRWG.js.map → chunk-OITOJMIX.js.map} +0 -0
- /package/client-dist/{chunk-TBPY4N7X.js.map → chunk-PWGYG7KG.js.map} +0 -0
- /package/client-dist/{chunk-KLIVF7NF.js.map → chunk-RIYSXVU2.js.map} +0 -0
- /package/client-dist/{chunk-ZTPYZH3Z.js.map → chunk-RJX7O3DI.js.map} +0 -0
- /package/client-dist/{chunk-CDFLZ523.js.map → chunk-RZPQNQWP.js.map} +0 -0
- /package/client-dist/{chunk-AC6VDECU.js.map → chunk-S2FEPCDW.js.map} +0 -0
- /package/client-dist/{chunk-B22GYBFL.js.map → chunk-SDS4IT63.js.map} +0 -0
- /package/client-dist/{chunk-H62NDY3W.js.map → chunk-SNMSF3UC.js.map} +0 -0
- /package/client-dist/{chunk-4F6OM6PQ.js.map → chunk-TKAV5X35.js.map} +0 -0
- /package/client-dist/{chunk-BY7QOLIO.js.map → chunk-TXVACKLG.js.map} +0 -0
- /package/client-dist/{chunk-TRPIAKRB.js.map → chunk-UOZVXYOQ.js.map} +0 -0
- /package/client-dist/{chunk-MVAZ7JR5.js.map → chunk-UPREBG2C.js.map} +0 -0
- /package/client-dist/{chunk-ZLKNTGRH.js.map → chunk-VA3QGKXE.js.map} +0 -0
- /package/client-dist/{chunk-PS73GRXP.js.map → chunk-VILXJBM4.js.map} +0 -0
- /package/client-dist/{chunk-3MSKVM2T.js.map → chunk-VS3F3LTC.js.map} +0 -0
- /package/client-dist/{chunk-WKY6ZRDX.js.map → chunk-W3WV5NJ7.js.map} +0 -0
- /package/client-dist/{chunk-Z2SVASLX.js.map → chunk-WL5L5AUS.js.map} +0 -0
- /package/client-dist/{chunk-7R5IXHU5.js.map → chunk-WPT7HGB2.js.map} +0 -0
- /package/client-dist/{chunk-CF6YGIKE.js.map → chunk-XSZRRELF.js.map} +0 -0
- /package/client-dist/{chunk-XMFYG4OB.js.map → chunk-ZE4SBBQZ.js.map} +0 -0
- /package/client-dist/{chunk-7SDU766A.js.map → chunk-ZELVI2B7.js.map} +0 -0
- /package/client-dist/{chunk-CK5ZMGFL.js.map → chunk-ZKMLJXN4.js.map} +0 -0
- /package/client-dist/{crd.module-746ZW6FL.js.map → crd.module-X5U6DQ3D.js.map} +0 -0
- /package/client-dist/{dashboard.module-U2NE6P3E.js.map → dashboard.module-4LC4RSOF.js.map} +0 -0
- /package/client-dist/{do.module-5V6Y3CDL.js.map → do.module-HWKFQZQK.js.map} +0 -0
- /package/client-dist/{document-library.module-HXQGKT63.js.map → document-library.module-Z57ZOMUG.js.map} +0 -0
- /package/client-dist/{embedding-eval.module-OENZYGQE.js.map → embedding-eval.module-ULD6Z5XA.js.map} +0 -0
- /package/client-dist/{embedding-registry.module-RTS4TH4Q.js.map → embedding-registry.module-TGWG2VER.js.map} +0 -0
- /package/client-dist/{err.module-E4JTGICP.js.map → err.module-V5HQPNPJ.js.map} +0 -0
- /package/client-dist/{feedback.module-YFIHVIAZ.js.map → feedback.module-U2Z6XYBB.js.map} +0 -0
- /package/client-dist/{host-runtime-mcp.module-N73MDNBO.js.map → host-runtime-mcp.module-ZZGAS7DP.js.map} +0 -0
- /package/client-dist/{live-dev-pipeline.module-IA4J3U76.js.map → live-dev-pipeline.module-TPPLFJXH.js.map} +0 -0
- /package/client-dist/{logs.module-VRVZQ76G.js.map → logs.module-5ZT7XQ3Q.js.map} +0 -0
- /package/client-dist/{master-control-remote-poc.module-ENMKL3BL.js.map → master-control-remote-poc.module-IK64YCVI.js.map} +0 -0
- /package/client-dist/{mobile-app.module-25TPEFGS.js.map → mobile-app.module-GI44MNWC.js.map} +0 -0
- /package/client-dist/{model-registry.module-DTJEN56N.js.map → model-registry.module-F7M4C7MR.js.map} +0 -0
- /package/client-dist/{orc.module-JLA5C7MW.js.map → orc.module-DOAWAEFJ.js.map} +0 -0
- /package/client-dist/{project-management.module-NBKCZQ6Y.js.map → project-management.module-2SDSNJJL.js.map} +0 -0
- /package/client-dist/{project-source-routed.module-MDS232LH.js.map → project-source-routed.module-CQLNUDIR.js.map} +0 -0
- /package/client-dist/{scheduler.module-HFDAX5PZ.js.map → scheduler.module-25VUGCV3.js.map} +0 -0
- /package/client-dist/{set.module-5NOTNWQ3.js.map → set.module-4NWORE5F.js.map} +0 -0
- /package/client-dist/{setup.module-NBPWQBBC.js.map → setup.module-N3AYAAZ6.js.map} +0 -0
- /package/client-dist/{terminals.module-2MRATCCN.js.map → terminals.module-3ELX7JV6.js.map} +0 -0
- /package/client-dist/{voice-notes-poc.module-QRB77K3S.js.map → voice-notes-poc.module-ZHORCWRL.js.map} +0 -0
- /package/client-dist/{wfs.module-ZWBQCUOA.js.map → wfs.module-EDYBZUSQ.js.map} +0 -0
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["src/app/_modules/shared/_components/session-ui/agent-tool-widgets/s-agent-tool-plan-view/s-agent-tool-plan-view.component.ts", "src/app/_modules/shared/_components/session-ui/agent-tool-widgets/s-agent-tool-plan-view/s-agent-tool-plan-view.component.html", "src/app/_modules/shared/_components/session-ui/agent-tool-widgets/s-agent-tool-todo-list/s-agent-tool-todo-list.component.ts", "src/app/_modules/shared/_components/session-ui/agent-tool-widgets/s-agent-tool-todo-list/s-agent-tool-todo-list.component.html", "src/app/_modules/external-sessions/_modules/claude-code/_collections/cc-input-storage.util.ts", "src/app/_modules/external-sessions/_modules/claude-code/_services/cc-detail-ui.data-service.ts", "src/app/_modules/external-sessions/_modules/claude-code/_components/ccap-cc-dashboard/cc-dashboard.component.ts", "src/app/_modules/external-sessions/_modules/claude-code/_components/ccap-cc-dashboard/cc-dashboard.component.html", "src/app/_modules/external-sessions/_modules/claude-code/_pipes/cc-status-color.pipe.ts", "src/app/_modules/external-sessions/_modules/claude-code/_components/ccap-cc-shell/cc-shell.component.ts", "src/app/_modules/external-sessions/_modules/claude-code/_components/ccap-cc-shell/cc-shell.component.html", "src/app/_modules/external-sessions/_modules/claude-code/_components/ccap-cc-console/cc-console.component.ts", "src/app/_modules/external-sessions/_modules/claude-code/_components/ccap-cc-console/cc-console.component.html", "src/app/_modules/external-sessions/_modules/claude-code/_enums/cc-mode.enum.ts", "src/app/_modules/external-sessions/_modules/claude-code/_enums/cc-model.enum.ts", "src/app/_modules/external-sessions/_modules/claude-code/_collections/cc-console-to-bubble-view.util.ts", "src/app/_modules/external-sessions/_modules/claude-code/_pipes/cc-json-format.pipe.ts", "src/app/_modules/external-sessions/_modules/claude-code/_pipes/cc-event-type-color.pipe.ts", "src/app/_modules/external-sessions/_modules/claude-code/_components/ccap-cc-timeline/cc-timeline.component.ts", "src/app/_modules/external-sessions/_modules/claude-code/_components/ccap-cc-timeline/cc-timeline.component.html", "src/app/_modules/external-sessions/_modules/claude-code/_components/ccap-cc-metadata/cc-metadata.component.ts", "src/app/_modules/external-sessions/_modules/claude-code/_components/ccap-cc-metadata/cc-metadata.component.html", "src/app/_modules/external-sessions/_modules/claude-code/_components/ccap-cc-detail/cc-detail.component.ts", "src/app/_modules/external-sessions/_modules/claude-code/_components/ccap-cc-detail/cc-detail.component.html", "src/app/_modules/external-sessions/_modules/claude-code/cc.module.ts"],
|
|
4
|
-
"sourcesContent": ["import { Component, computed, inject, input, output, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\nimport { CCAP_AssistantMarkdownRender_Util } from '../../../../../../_collections/display/ccap-assistant-markdown-render.util';\nimport { CCAP_GlobalError_ControlService } from '../../../../../../_services/control-services/ccap-global-error.control-service';\n\n/**\n * ExitPlanMode tool megjelenítő: plan markdown renderelés + elfogadás gomb.\n * A rawData.input.plan szöveget markdown-ként rendereli, a user elfogadhatja a tervet.\n */\n@Component({\n selector: 'app-s-agent-tool-plan-view',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './s-agent-tool-plan-view.component.html',\n styleUrls: ['./s-agent-tool-plan-view.component.scss'],\n host: { class: 'block' },\n})\n/** S_AgentToolPlanView_Component class. */\nexport class S_AgentToolPlanView_Component {\n\n private readonly sanitizer: DomSanitizer = inject(DomSanitizer);\n /** REQ-UI-MD-CODE-COPY-001: clipboard helper a fenced code-block-ok copy gombjához. */\n private readonly globalError_CS: CCAP_GlobalError_ControlService = inject(CCAP_GlobalError_ControlService);\n\n /** Tool rawData — az ExitPlanMode event teljes raw adata. */\n readonly rawData = input<Record<string, unknown> | undefined>(undefined);\n\n /** Plan elfogadás event — a host kezeli (prompt küldés a session-nek). */\n readonly accepted = output<void>();\n\n /** Elfogadva állapot (vizuális visszajelzés, nem küld újra). */\n readonly isAccepted_$ = signal<boolean>(false);\n\n /** Plan szöveg kinyerése a rawData.input.plan-ból. */\n readonly planText_$ = computed((): string => {\n const data: Record<string, unknown> | undefined = this.rawData();\n if (!data) {\n return '';\n }\n const inputObj: unknown = data.input;\n if (!inputObj || typeof inputObj !== 'object') {\n return '';\n }\n const plan: unknown = (inputObj as Record<string, unknown>).plan;\n return typeof plan === 'string' ? plan : '';\n });\n\n /** Plan markdown → sanitizált HTML. */\n readonly planHtml_$ = computed((): SafeHtml | null => {\n const plan: string = this.planText_$();\n if (!plan) {\n return null;\n }\n const html: string = CCAP_AssistantMarkdownRender_Util.toSanitizedHtml(plan);\n return this.sanitizer.bypassSecurityTrustHtml(html);\n });\n\n /**\n * Elfogadás gomb kattintás.\n */\n handleAccept(): void {\n if (this.isAccepted_$()) {\n return;\n }\n this.isAccepted_$.set(true);\n this.accepted.emit();\n }\n\n /**\n * REQ-UI-MD-CODE-COPY-001: a `.ccap-assistant-md` container `(click)` handler-e —\n * a render-util által beillesztett `.ccap-md-copy-btn` gombokhoz adja a\n * vágólap-műveletet (event-delegation). Más click-célnál no-op.\n */\n async handleAssistantMdClick(event: MouseEvent): Promise<void> {\n await CCAP_AssistantMarkdownRender_Util.handleCodeCopyClick(\n event,\n (text: string): Promise<{ ok: boolean }> => this.globalError_CS.copyToClipboard(text),\n );\n }\n}\n", "@if (planHtml_$(); as planHtml) {\n <div class=\"px-2.5 py-2 space-y-2\">\n <!-- Plan tartalom (markdown renderelve).\n REQ-UI-MD-CODE-COPY-001: `(click)` event-delegation a fenced\n code-block-ok copy gombjához. -->\n <div\n class=\"ccap-assistant-md leading-snug sm:leading-normal break-words text-neutral-200 text-xs sm:text-sm min-w-0 max-h-[400px] overflow-y-auto overflow-x-auto pr-1\"\n [innerHTML]=\"planHtml\"\n (click)=\"handleAssistantMdClick($event)\">\n </div>\n <!-- Elfogadás gomb -->\n <div class=\"flex justify-end pt-1 border-t border-orange-500/10\">\n @if (isAccepted_$()) {\n <div class=\"inline-flex items-center gap-1.5 px-3 py-1 rounded-md bg-green-500/10 border border-green-500/25\">\n <svg class=\"w-3.5 h-3.5 text-green-400\" viewBox=\"0 0 16 16\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M3.5 8.5l3 3 6-6\"/>\n </svg>\n <span class=\"text-[11px] text-green-400 font-medium\">Plan accepted</span>\n </div>\n } @else {\n <button\n type=\"button\"\n class=\"inline-flex items-center gap-1.5 px-3 py-1 rounded-md bg-ccapAccent/10 border border-ccapAccent/30\n text-ccapAccent text-[11px] font-medium cursor-pointer\n hover:bg-ccapAccent/20 hover:border-ccapAccent/50 transition-colors\"\n (click)=\"handleAccept()\">\n <svg class=\"w-3.5 h-3.5\" viewBox=\"0 0 16 16\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M3.5 8.5l3 3 6-6\"/>\n </svg>\n Accept plan\n </button>\n }\n </div>\n </div>\n}\n", "import { Component, computed, input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n/**\n * Egy todo elem a TodoWrite tool kimenetéből.\n * rawData.input.todos tömb elemeinek típusa.\n */\ninterface TodoItem_Local {\n content: string;\n status: string;\n activeForm?: string;\n}\n\n/**\n * TodoWrite tool megjelenítő: todo checklist ikon + szöveg + státusz.\n * A rawData.input.todos tömbből kinyert elemeket jeleníti meg vizuálisan.\n */\n@Component({\n selector: 'app-s-agent-tool-todo-list',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './s-agent-tool-todo-list.component.html',\n host: { class: 'block' },\n})\n/** S_AgentToolTodoList_Component class. */\nexport class S_AgentToolTodoList_Component {\n\n /** Tool rawData — a TodoWrite event teljes raw adata. */\n readonly rawData = input<Record<string, unknown> | undefined>(undefined);\n\n /** Todo elemek kinyerése a rawData.input.todos-ból. */\n readonly todos_$ = computed((): TodoItem_Local[] => {\n const data: Record<string, unknown> | undefined = this.rawData();\n if (!data) {\n return [];\n }\n const inputObj: unknown = data.input;\n if (!inputObj || typeof inputObj !== 'object') {\n return [];\n }\n const todos: unknown = (inputObj as Record<string, unknown>)['todos'];\n if (!Array.isArray(todos)) {\n return [];\n }\n return todos.filter(\n (t: unknown): t is TodoItem_Local =>\n typeof t === 'object'\n && t !== null\n && typeof (t as Record<string, unknown>)['content'] === 'string',\n );\n });\n\n /** Befejezett todo-k száma. */\n readonly completedCount_$ = computed((): number =>\n this.todos_$().filter((t: TodoItem_Local): boolean => t.status === 'completed').length,\n );\n\n /** Összes todo szám. */\n readonly totalCount_$ = computed((): number => this.todos_$().length);\n}\n", "@if (todos_$().length) {\n <div class=\"px-2.5 py-1.5 space-y-0.5\">\n <!-- Összesítés fejléc -->\n <div class=\"flex items-center gap-1.5 mb-1\">\n <span class=\"text-[10px] text-neutral-500 uppercase tracking-wider font-medium\">Tasks</span>\n <span class=\"text-[10px] text-neutral-600\">{{ completedCount_$() }}/{{ totalCount_$() }}</span>\n </div>\n <!-- Todo lista -->\n @for (todo of todos_$(); track todo.content) {\n <div class=\"flex items-start gap-2 py-0.5\">\n <!-- Státusz ikon -->\n @switch (todo.status) {\n @case ('completed') {\n <svg class=\"w-4 h-4 text-green-400 shrink-0 mt-px\" viewBox=\"0 0 16 16\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M3.5 8.5l3 3 6-6\"/>\n </svg>\n }\n @case ('in_progress') {\n <span class=\"w-4 h-4 shrink-0 mt-px flex items-center justify-center\">\n <span class=\"w-3 h-3 rounded-full border-2 border-blue-400/40 border-t-blue-400 animate-spin\"></span>\n </span>\n }\n @default {\n <span class=\"w-4 h-4 shrink-0 mt-px flex items-center justify-center\">\n <span class=\"w-3 h-3 rounded-full border border-neutral-600\"></span>\n </span>\n }\n }\n <!-- Tartalom -->\n <div class=\"min-w-0\">\n <span\n class=\"text-[11px] leading-relaxed break-words\"\n [ngClass]=\"{\n 'text-neutral-500 line-through': todo.status === 'completed',\n 'text-blue-300': todo.status === 'in_progress',\n 'text-neutral-300': todo.status !== 'completed' && todo.status !== 'in_progress'\n }\">{{ todo.content }}</span>\n @if (todo.status === 'in_progress' && todo.activeForm) {\n <div class=\"text-[9px] text-blue-400/50 mt-px\">{{ todo.activeForm }}</div>\n }\n </div>\n </div>\n }\n </div>\n}\n", "import { Shr_LocalStoragePersistence_Util } from '../../../../shared/_collections/utils/storage/shr-local-storage-persistence.util';\nimport { SHR_PromptDraftStorage_Util } from '../../../../shared/_collections/utils/shr-prompt-draft-storage.util';\n\n/** localStorage prefix a CC Session input-ok mentéséhez. */\nconst STORAGE_PREFIX: string = 'ccap-ccSession';\n\n/**\n * CC Session felület inputjainak localStorage kezelése.\n * Dashboard szűrők és per-session prompt piszkozat mentése/betöltése.\n *\n * Cycle 217 follow-up: a 3 prompt-draft metódus a `SHR_PromptDraftStorage_Util`\n * shared util-ra delegálódik (a `Ses_InputStorage_Util` is ugyanezt használja).\n *\n * REQ-UI-MENU-STATE-001 cycle 445: a többi 14 metódus is mostantól a shared\n * `Shr_LocalStoragePersistence_Util`-ra delegál (string / boolean / number),\n * így a try/catch + getItem/setItem boilerplate egyszer él. A localStorage\n * kulcs-formátum változatlan — backward-compat (régi user-pref értékek\n * megmaradnak).\n */\nexport class CC_InputStorage_Util {\n\n /** Dashboard projekt szűrő mentése (projekt localPath vagy üres string = „minden projekt\"). */\n static saveProjectFilter(value: string): void {\n Shr_LocalStoragePersistence_Util.writeString(`${STORAGE_PREFIX}:projectFilter`, value);\n }\n\n /** Dashboard projekt szűrő betöltése. */\n static loadProjectFilter(): string {\n return Shr_LocalStoragePersistence_Util.readString(`${STORAGE_PREFIX}:projectFilter`) ?? '';\n }\n\n /** Utolsó használt workspace path mentése. */\n static saveLastWorkspacePath(value: string): void {\n Shr_LocalStoragePersistence_Util.writeString(`${STORAGE_PREFIX}:lastWorkspacePath`, value);\n }\n\n /** Utolsó használt workspace path betöltése. */\n static loadLastWorkspacePath(): string {\n return Shr_LocalStoragePersistence_Util.readString(`${STORAGE_PREFIX}:lastWorkspacePath`) ?? '';\n }\n\n /** Utolsó használt session label mentése. */\n static saveLastLabel(value: string): void {\n Shr_LocalStoragePersistence_Util.writeString(`${STORAGE_PREFIX}:lastLabel`, value);\n }\n\n /** Utolsó használt session label betöltése. */\n static loadLastLabel(): string {\n return Shr_LocalStoragePersistence_Util.readString(`${STORAGE_PREFIX}:lastLabel`) ?? '';\n }\n\n /** Per-session prompt piszkozat mentése. */\n static savePromptDraft(sessionId: string, content: string): void {\n SHR_PromptDraftStorage_Util.saveDraft(STORAGE_PREFIX, sessionId, content);\n }\n\n /** Per-session prompt piszkozat betöltése. */\n static loadPromptDraft(sessionId: string): string {\n return SHR_PromptDraftStorage_Util.loadDraft(STORAGE_PREFIX, sessionId);\n }\n\n /** Per-session prompt piszkozat törlése (sikeres küldés után). */\n static clearPromptDraft(sessionId: string): void {\n SHR_PromptDraftStorage_Util.clearDraft(STORAGE_PREFIX, sessionId);\n }\n\n /** REQ-UI-SES-LIST-DRAFT-INDICATOR-001 (cycle 902): igaz, ha el-nem-küldött piszkozat van. */\n static hasPromptDraft(sessionId: string): boolean {\n return SHR_PromptDraftStorage_Util.hasDraft(STORAGE_PREFIX, sessionId);\n }\n\n /** Panel nyitott/zárt állapot mentése. */\n static savePanelOpen(panelKey: string, isOpen: boolean): void {\n Shr_LocalStoragePersistence_Util.writeBoolean(`${STORAGE_PREFIX}:panelOpen:${panelKey}`, isOpen);\n }\n\n /** Panel nyitott/zárt állapot betöltése, fallback a megadott default értékre. */\n static loadPanelOpen(panelKey: string, defaultOpen: boolean): boolean {\n return Shr_LocalStoragePersistence_Util.readBoolean(\n `${STORAGE_PREFIX}:panelOpen:${panelKey}`,\n defaultOpen,\n );\n }\n\n /** Panel szélesség mentése (px). */\n static savePanelWidth(panelKey: string, width: number): void {\n Shr_LocalStoragePersistence_Util.writeNumber(`${STORAGE_PREFIX}:panelWidth:${panelKey}`, width);\n }\n\n /** Panel szélesség betöltése (px), fallback a megadott default értékre. */\n static loadPanelWidth(panelKey: string, defaultWidth: number): number {\n return Shr_LocalStoragePersistence_Util.readNumber(\n `${STORAGE_PREFIX}:panelWidth:${panelKey}`,\n defaultWidth,\n );\n }\n\n /** CC Session mód mentése (normal, plan). */\n static saveSessionMode(value: string): void {\n Shr_LocalStoragePersistence_Util.writeString(`${STORAGE_PREFIX}:sessionMode`, value);\n }\n\n /** CC Session mód betöltése. */\n static loadSessionMode(): string {\n return Shr_LocalStoragePersistence_Util.readString(`${STORAGE_PREFIX}:sessionMode`) ?? 'normal';\n }\n\n /** CC Session effort (reasoning level) mentése. */\n static saveSessionEffort(value: string): void {\n Shr_LocalStoragePersistence_Util.writeString(`${STORAGE_PREFIX}:sessionEffort`, value);\n }\n\n /** CC Session effort betöltése. */\n static loadSessionEffort(): string {\n return Shr_LocalStoragePersistence_Util.readString(`${STORAGE_PREFIX}:sessionEffort`) ?? 'high';\n }\n\n /** CC Session model mentése. */\n static saveSessionModel(value: string): void {\n Shr_LocalStoragePersistence_Util.writeString(`${STORAGE_PREFIX}:sessionModel`, value);\n }\n\n /** CC Session model betöltése. */\n static loadSessionModel(): string {\n return Shr_LocalStoragePersistence_Util.readString(`${STORAGE_PREFIX}:sessionModel`) ?? 'sonnet';\n }\n\n /** Státusz hisztori megjelenítés mentése. */\n static saveStatusHistory(value: boolean): void {\n Shr_LocalStoragePersistence_Util.writeBoolean(`${STORAGE_PREFIX}:statusHistory`, value);\n }\n\n /** Státusz hisztori megjelenítés betöltése (alapértelmezés: kikapcsolva). */\n static loadStatusHistory(): boolean {\n return Shr_LocalStoragePersistence_Util.readBoolean(`${STORAGE_PREFIX}:statusHistory`, false);\n }\n\n /** Utolsó megnyitott session ID mentése. */\n static saveLastSessionId(sessionId: string): void {\n Shr_LocalStoragePersistence_Util.writeString(`${STORAGE_PREFIX}:lastSessionId`, sessionId);\n }\n\n /** Utolsó megnyitott session ID betöltése. */\n static loadLastSessionId(): string {\n return Shr_LocalStoragePersistence_Util.readString(`${STORAGE_PREFIX}:lastSessionId`) ?? '';\n }\n\n /**\n * Cycle 785 (REQ-INST-SES-URL-001): utolsó megnyitott session-hez tartozó\n * ccapId mentése. Az empty-route fallback ezt használja, hogy a refresh\n * után a megfelelő instance session-jét nyissa meg, ne csak a current\n * lokálist.\n */\n static saveLastCcapId(ccapId: string): void {\n Shr_LocalStoragePersistence_Util.writeString(`${STORAGE_PREFIX}:lastCcapId`, ccapId);\n }\n\n /**\n * Cycle 785: utolsó megnyitott session ccapId-jának betöltése. Üres ha\n * pre-cycle-785 build-ből került mentésre (csak sessionId).\n */\n static loadLastCcapId(): string {\n return Shr_LocalStoragePersistence_Util.readString(`${STORAGE_PREFIX}:lastCcapId`) ?? '';\n }\n\n /** Status update (CLI system event) megjelenítés mentése. */\n static saveShowStatusUpdates(value: boolean): void {\n Shr_LocalStoragePersistence_Util.writeBoolean(`${STORAGE_PREFIX}:showStatusUpdates`, value);\n }\n\n /** Status update megjelenítés betöltése (alapértelmezés: bekapcsolva). */\n static loadShowStatusUpdates(): boolean {\n return Shr_LocalStoragePersistence_Util.readBoolean(`${STORAGE_PREFIX}:showStatusUpdates`, true);\n }\n\n /** Archivált session-ök megjelenítés állapot mentése. */\n static saveShowArchived(value: boolean): void {\n Shr_LocalStoragePersistence_Util.writeBoolean(`${STORAGE_PREFIX}:showArchived`, value);\n }\n\n /** Archivált session-ök megjelenítés állapot betöltése (alapértelmezés: kikapcsolva). */\n static loadShowArchived(): boolean {\n return Shr_LocalStoragePersistence_Util.readBoolean(`${STORAGE_PREFIX}:showArchived`, false);\n }\n}\n", "import { inject, Injectable, signal } from '@angular/core';\n\nimport { ClaudeCode_DataService } from './claude-code.data-service';\nimport { CC_InputStorage_Util } from '../_collections/cc-input-storage.util';\n\n/**\n * CC Session detail chrome állapot és akciók (SSOT).\n * A shell top bar és a detail layout ugyanazokat a panel-toggle és resume/terminate signal-okat használja.\n */\n@Injectable({ providedIn: 'root' })\nexport class CC_DetailUi_DataService {\n\n private readonly ccSession_DS: ClaudeCode_DataService =\n inject(ClaudeCode_DataService);\n\n /**\n * Timeline panel nyitva/zárva (localStorage-ból betöltve).\n * REQ-CC-PANELS-DEFAULT-CLOSED-001 (cycle 435): a default `false` (zárva) —\n * a user kérése. localStorage user-pref overwrite-olja, csak az első\n * megjelenítéskor (no-stored-value) érvényes a default.\n */\n readonly isTimelinePanelOpen_$ = signal<boolean>(\n CC_InputStorage_Util.loadPanelOpen('timeline', false),\n );\n\n /**\n * Metadata panel nyitva/zárva (localStorage-ból betöltve).\n * REQ-CC-PANELS-DEFAULT-CLOSED-001 (cycle 435): a default `false` (zárva).\n */\n readonly isMetadataPanelOpen_$ = signal<boolean>(\n CC_InputStorage_Util.loadPanelOpen('metadata', false),\n );\n\n /** Resume folyamatban. */\n readonly isResuming_$ = signal<boolean>(false);\n\n /** Terminate folyamatban. */\n readonly isTerminating_$ = signal<boolean>(false);\n\n /** Stop execution folyamatban. */\n readonly isStopping_$ = signal<boolean>(false);\n\n /** Fork folyamatban. */\n readonly isForking_$ = signal<boolean>(false);\n\n /** Session status hisztori megjelenítés (lifecycle status változások). */\n readonly isShowSessionStatus_$ = signal<boolean>(\n CC_InputStorage_Util.loadStatusHistory(),\n );\n\n /** Agent update (CLI system event: task_progress, stb.) megjelenítés. */\n readonly isShowAgentUpdates_$ = signal<boolean>(\n CC_InputStorage_Util.loadShowStatusUpdates(),\n );\n\n /** Timeline panel toggle — állapot mentése localStorage-ba. */\n handleToggleTimeline(): void {\n const newValue: boolean = !this.isTimelinePanelOpen_$();\n this.isTimelinePanelOpen_$.set(newValue);\n CC_InputStorage_Util.savePanelOpen('timeline', newValue);\n }\n\n /** Metadata panel toggle — állapot mentése localStorage-ba. */\n handleToggleMetadata(): void {\n const newValue: boolean = !this.isMetadataPanelOpen_$();\n this.isMetadataPanelOpen_$.set(newValue);\n CC_InputStorage_Util.savePanelOpen('metadata', newValue);\n }\n\n /** Session status hisztori toggle. */\n handleToggleSessionStatus(): void {\n const newValue: boolean = !this.isShowSessionStatus_$();\n this.isShowSessionStatus_$.set(newValue);\n CC_InputStorage_Util.saveStatusHistory(newValue);\n }\n\n /** Agent update megjelenítés toggle. */\n handleToggleAgentUpdates(): void {\n const newValue: boolean = !this.isShowAgentUpdates_$();\n this.isShowAgentUpdates_$.set(newValue);\n CC_InputStorage_Util.saveShowStatusUpdates(newValue);\n }\n\n /**\n * Session resume az aktuálisan kiválasztott detail session-re.\n * Hiba esetén a data service console error message-t küld — itt csak a loading state-et kezeljük.\n */\n async handleResume(): Promise<void> {\n const selected = this.ccSession_DS.selectedSession_$();\n if (!selected || this.isResuming_$()) {\n return;\n }\n const sessionId: string = selected.session.sessionId;\n if (!sessionId) {\n return;\n }\n\n this.isResuming_$.set(true);\n try {\n await this.ccSession_DS.resumeSession({\n sessionId: sessionId,\n });\n } catch {\n // Hiba már a data service-ben kezelve (console error message)\n } finally {\n this.isResuming_$.set(false);\n }\n }\n\n /**\n * Futó prompt execution leállítása az aktuális session-re (stop gomb).\n * A session megmarad, újra promptolható.\n */\n async handleStopExecution(): Promise<void> {\n const selected = this.ccSession_DS.selectedSession_$();\n if (!selected || this.isStopping_$()) {\n return;\n }\n const sessionId: string = selected.session.sessionId;\n if (!sessionId) {\n return;\n }\n\n this.isStopping_$.set(true);\n try {\n await this.ccSession_DS.stopExecution({\n sessionId: sessionId,\n });\n } catch {\n // Hiba már a data service-ben kezelve (console error message)\n } finally {\n this.isStopping_$.set(false);\n }\n }\n\n /**\n * Session fork: a kiválasztott session conversation history-jának duplikálása új session-be.\n * Visszaadja az új session ID-t — a caller navigál oda.\n */\n async handleFork(): Promise<string | null> {\n const selected = this.ccSession_DS.selectedSession_$();\n if (!selected || this.isForking_$()) {\n return null;\n }\n const sessionId: string = selected.session.sessionId;\n if (!sessionId || !selected.session.claudeSessionId) {\n return null;\n }\n\n this.isForking_$.set(true);\n try {\n const newSessionId: string = await this.ccSession_DS.forkSession({\n sessionId: sessionId,\n });\n return newSessionId;\n } catch {\n // Hiba már a data service-ben kezelve (console error message)\n return null;\n } finally {\n this.isForking_$.set(false);\n }\n }\n\n /**\n * Session terminate az aktuálisan kiválasztott detail session-re.\n * Hiba esetén a data service console error message-t küld — itt csak a loading state-et kezeljük.\n */\n async handleTerminate(): Promise<void> {\n const selected = this.ccSession_DS.selectedSession_$();\n if (!selected || this.isTerminating_$()) {\n return;\n }\n const sessionId: string = selected.session.sessionId;\n if (!sessionId) {\n return;\n }\n\n this.isTerminating_$.set(true);\n try {\n await this.ccSession_DS.terminateSession({\n sessionId: sessionId,\n });\n } catch {\n // Hiba már a data service-ben kezelve (console error message)\n } finally {\n this.isTerminating_$.set(false);\n }\n }\n}\n", "import { Component, computed, effect, inject, OnInit, output, Signal, signal, untracked } from '@angular/core';\nimport { Router } from '@angular/router';\n\nimport { CCAP_GlobalError_ControlService } from '../../../../../../_services/control-services/ccap-global-error.control-service';\nimport { ClaudeCode_DataService } from '../../_services/claude-code.data-service';\nimport { ExS_NewAgentWorkspace_DataService } from '../../../../_services/exs-new-agent-workspace.data-service';\nimport { ProjectManagement_DataService } from '../../../../../project-management/_services/data-services/project-management.data-service';\nimport { ExS_InstanceContext_DataService } from '../../../../_services/exs-instance-context.data-service';\nimport { S_SessionStatusColor_Util } from '../../../../../shared/_collections/utils/s-session-status-color.util';\nimport { S_SessionListRowView_Interface } from '../../../../../shared/_models/interfaces/s-session-list-row-view.interface';\nimport { CC_ListItem_Interface } from '../../_models/interfaces/cc-list-item.interface';\nimport { CCAP_WorkspacePathPickerOption_Interface } from '../../../../../../_models/interfaces/shared/ccap-workspace-path-picker-option.interface';\nimport { CC_InputStorage_Util } from '../../_collections/cc-input-storage.util';\nimport { SCH_ScheduledJobs_DataService } from '../../../../../scheduler/_services/data-services/sch-scheduled-jobs.data-service';\nimport { Coordinator_DataService } from '../../../../../coordinator/_services/coordinator.data-service';\n\n/**\n * Claude Code Session dashboard / lista komponens.\n * Session lista grid, szűrők, keresés, quick actions.\n */\n@Component({\n selector: 'app-ccap-cc-dashboard',\n templateUrl: './cc-dashboard.component.html',\n host: { class: 'flex flex-col flex-1 min-h-0 overflow-hidden' },\n})\n/** CC_Dashboard_Component class. */\nexport class CC_Dashboard_Component implements OnInit {\n\n readonly ccSession_DS: ClaudeCode_DataService =\n inject(ClaudeCode_DataService);\n\n readonly newAgentSessionWorkspace_DS: ExS_NewAgentWorkspace_DataService =\n inject(ExS_NewAgentWorkspace_DataService);\n\n readonly pm_DS: ProjectManagement_DataService =\n inject(ProjectManagement_DataService);\n\n readonly peiContext_DS: ExS_InstanceContext_DataService =\n inject(ExS_InstanceContext_DataService);\n\n /** REQ-SES-SCH-IND-001: schedule-indikátor a session row-on (calendar ikon). */\n readonly scheduledJobs_DS: SCH_ScheduledJobs_DataService =\n inject(SCH_ScheduledJobs_DataService);\n\n /** REQ-SES-CRD-IND-001 slice 2 (cycle 191): coordinator-indikátor a session row-on (compass ikon). */\n readonly coordinator_DS: Coordinator_DataService =\n inject(Coordinator_DataService);\n\n private readonly router: Router = inject(Router);\n\n /** REQ-SES-CTX-COPY-LINK-001: Copy link feedback (clipboard write a globalError-CS-en keresztül). */\n private readonly globalError_CS: CCAP_GlobalError_ControlService = inject(CCAP_GlobalError_ControlService);\n\n /**\n * Instance-szelektor változásra automatikus session lista újratöltés (REQ-PEI-016).\n * Az effect figyeli az activeCcapId_$-t — ha változik, újratölti a listát.\n */\n private readonly instanceChangeEffect = effect((): void => {\n // Signal olvasás az effect-dependency regisztráláshoz\n const ccapId: string = this.peiContext_DS.activeCcapId_$();\n const includeArchived: boolean = this.showArchived_$();\n if (ccapId) {\n // untracked: loadSessions belsőleg signal-okat ír (.set), ami effect-ben NG0600-at okozna\n untracked((): void => {\n this.ccSession_DS.loadSessions({\n includeArchived: includeArchived || undefined,\n });\n });\n }\n });\n\n /** Szűrő: projekt localPath (üres string = „minden projekt\"). */\n readonly projectFilter_$ = signal<string>('');\n\n /**\n * Projekt szűrőhöz a session listát normalizált path alapján szűrjük —\n * a `s-project-badge` komponenssel azonos normalizációval (lowercase,\n * backslash → slash, trailing slash trim), hogy a Windows/Linux\n * eltéréseket is kezelje.\n */\n readonly filteredSessions_$: Signal<CC_ListItem_Interface[]> = computed(\n (): CC_ListItem_Interface[] => {\n const sessions: CC_ListItem_Interface[] = this.ccSession_DS.sessions_$();\n const filter: string = this.projectFilter_$();\n if (!filter) {\n return sessions;\n }\n const normFilter: string = CC_Dashboard_Component.normalizePath(filter);\n return sessions.filter((s: CC_ListItem_Interface): boolean =>\n !!s.workspacePath &&\n CC_Dashboard_Component.normalizePath(s.workspacePath) === normFilter,\n );\n },\n );\n\n /** Szűrt session lista → shared list row view model mapping.\n REQ-SES-SCH-IND-001: hasSchedule flag a `scheduledJobs_DS.scheduledSessionIds_$` set-ből.\n REQ-SES-CRD-IND-001 slice 2: hasCoordinator flag a `coordinator_DS.coordinatedSessionIds_$`-ből. */\n readonly sessionRowViews_$: Signal<S_SessionListRowView_Interface[]> = computed(\n (): S_SessionListRowView_Interface[] => {\n const scheduledIds: Set<string> = this.scheduledJobs_DS.scheduledSessionIds_$();\n const coordinatedIds: Set<string> = this.coordinator_DS.coordinatedSessionIds_$();\n return this.filteredSessions_$().map((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 workspacePath: s.workspacePath,\n isArchived: !!s.isArchived,\n lastActivityAt: s.lastActivityAt,\n promptCount: s.promptCount,\n isRunning: S_SessionStatusColor_Util.isRunning(s.status),\n hasSchedule: scheduledIds.has(s.sessionId),\n hasCoordinator: coordinatedIds.has(s.sessionId),\n // REQ-UI-SES-LIST-DRAFT-INDICATOR-001 (cycle 902).\n hasDraft: CC_InputStorage_Util.hasPromptDraft(s.sessionId),\n }));\n },\n );\n\n /** Új session létrehozás dialog megnyitva. */\n readonly isCreateDialogOpen_$ = signal<boolean>(false);\n\n /**\n * REQ-SCH-IND-CLICK-001 (cycle 201): a Schedule popup-on megjelenített sessionId.\n * `null` esetén a popup zárva. A row schedule-indicator gombja állítja be.\n */\n readonly schedulePopupSessionId_$ = signal<string | null>(null);\n\n /**\n * REQ-SES-CRD-IND-001 Slice 3 (cycle 202): a Coordinator popup-on megjelenített sessionId.\n * `null` esetén a popup zárva.\n */\n readonly coordinatorPopupSessionId_$ = signal<string | null>(null);\n\n /** Új session workspace path. */\n readonly newSessionWorkspacePath_$ = signal<string>('');\n\n /** Új session label. */\n readonly newSessionLabel_$ = signal<string>('');\n\n /** Session létrehozás folyamatban. */\n readonly isCreating_$ = signal<boolean>(false);\n\n /** Archivált session-ök megjelenítése. */\n readonly showArchived_$ = signal<boolean>(false);\n\n /** Kiválasztott path selector érték ('custom' ha kézi bevitel). */\n readonly selectedPathOption_$ = signal<string>('');\n\n /** Kiadja, amikor a user egy session-re kattint — a shell mobil nézeten bezárja a sidebar-t. */\n readonly sessionSelected = output<void>();\n\n // ── Context menu state ──────────────────────────────────────\n\n /** Kontextmenü megnyitott session-je (null = zárt). */\n readonly ctxMenuSession_$ = signal<CC_ListItem_Interface | null>(null);\n\n /** Kontextmenü pozíció (viewport pixel). */\n readonly ctxMenuPos_$ = signal<{ x: number; y: number }>({ x: 0, y: 0 });\n\n /** Rename mód: inline input megjelenítése a kontextmenü helyett. */\n readonly isRenaming_$ = signal<boolean>(false);\n\n /** Rename input értéke. */\n readonly renameValue_$ = signal<string>('');\n\n /** REQ-SES-CTX-COPY-LINK-001: Copy link gomb feedback állapot. */\n readonly linkCopyState_$ = signal<'idle' | 'copied' | 'failed'>('idle');\n\n ngOnInit(): void {\n // Mentett projectFilter és showArchived visszatöltése localStorage-ból\n const savedProjectFilter: string = CC_InputStorage_Util.loadProjectFilter();\n if (savedProjectFilter) {\n this.projectFilter_$.set(savedProjectFilter);\n }\n const savedShowArchived: boolean = CC_InputStorage_Util.loadShowArchived();\n this.showArchived_$.set(savedShowArchived);\n\n // Projekt lista betöltése a szűrő dropdownhoz\n if (!this.pm_DS.projectsLoadedOnce_$() && !this.pm_DS.projectsLoading_$()) {\n void this.pm_DS.loadProjects();\n }\n\n // BUG-INST-SES-REFRESH-001 (cycle 433): loadSessions a peiContext activeCcapId_$\n // értékét HTTP query string-ként hozzáfűzi — ha az init még nem futott le\n // (sessionStorage restore), a remote-instance kiválasztás elvész, és a lista\n // a lokális instance-ról jön (üres egy másik instance felhasználójánál). Az\n // ensureInitialized() await-tel garantáljuk a helyes ccapId-t.\n void this.peiContext_DS.ensureInitialized().then((): void => {\n this.ccSession_DS.loadSessions({\n includeArchived: savedShowArchived || undefined,\n });\n });\n\n // REQ-SES-SCH-IND-001: schedule-job-lista lekérése a session-row calendar-ikonjához.\n // Best-effort, hibája nem blokkolja a session listát.\n void this.scheduledJobs_DS.loadAll();\n // REQ-SES-CRD-IND-001 slice 2: koordinátor-lista lekérése a session-row compass-ikonjához.\n void this.coordinator_DS.loadAllCoordinatorsForManagementPage();\n }\n\n /**\n * Session kiválasztása (navigálás a detail nézetre).\n * Kiadja a `sessionSelected` event-et, hogy a shell mobil nézeten bezárja a sidebar-t.\n */\n handleSelectSession(sessionId: string): void {\n // Cycle 785 (REQ-INST-SES-URL-001): instance kontextus a route-ban.\n const ccapId: string = this.peiContext_DS.activeCcapId_$();\n const target: string[] = ccapId\n ? ['/cc-session', ccapId, sessionId]\n : ['/cc-session', sessionId];\n this.router.navigate(target);\n this.sessionSelected.emit();\n }\n\n /**\n * Új session létrehozás dialog megnyitása.\n * Betölti a path opciókat (default workspace + projektek localPath-jai).\n * A workspace path-et az utolsó használt értékre vagy a default-ra állítja.\n */\n async handleOpenCreateDialog(): Promise<void> {\n this.isCreateDialogOpen_$.set(true);\n await this.newAgentSessionWorkspace_DS.refreshWorkspacePathPickerOptions();\n\n if (!this.newSessionWorkspacePath_$()) {\n const fallback: string = this.newAgentSessionWorkspace_DS.resolveInitialWorkspacePath({\n lastWorkspacePath: CC_InputStorage_Util.loadLastWorkspacePath(),\n });\n if (fallback) {\n this.newSessionWorkspacePath_$.set(fallback);\n // Ha a path szerepel a dropdown opcióiban → azt választjuk; ha custom path → 'custom' opció\n const isInOptions: boolean = this.newAgentSessionWorkspace_DS.workspacePathPickerOptions_$()\n .some((opt: CCAP_WorkspacePathPickerOption_Interface): boolean => opt.path === fallback);\n this.selectedPathOption_$.set(isInOptions ? fallback : 'custom');\n }\n }\n\n // Label előtöltés localStorage-ból\n const savedLabel: string = CC_InputStorage_Util.loadLastLabel();\n if (savedLabel) {\n this.newSessionLabel_$.set(savedLabel);\n }\n }\n\n /**\n * Path selector dropdown változás kezelése.\n * 'custom' esetén nem módosítjuk a workspace path-et, a user szabadon írhat.\n */\n handlePathOptionChange(value: string): void {\n this.selectedPathOption_$.set(value);\n if (value && value !== 'custom') {\n this.newSessionWorkspacePath_$.set(value);\n }\n }\n\n /**\n * Új session létrehozás dialog bezárása.\n */\n handleCloseCreateDialog(): void {\n this.isCreateDialogOpen_$.set(false);\n this.newSessionWorkspacePath_$.set('');\n this.newSessionLabel_$.set('');\n this.selectedPathOption_$.set('');\n }\n\n /**\n * Új session létrehozása.\n * Sikeres létrehozás után a workspace path-et elmenti localStorage-ba.\n * Hiba esetén globális hibajelzés + dialog bezárás.\n */\n async handleCreateSession(): Promise<void> {\n const workspacePath: string = this.newSessionWorkspacePath_$();\n if (!workspacePath || this.isCreating_$()) {\n return;\n }\n\n this.isCreating_$.set(true);\n\n try {\n CC_InputStorage_Util.saveLastWorkspacePath(workspacePath);\n CC_InputStorage_Util.saveLastLabel(this.newSessionLabel_$());\n\n // Mode és effort alapértelmezések betöltése localStorage-ból\n const savedMode: string = CC_InputStorage_Util.loadSessionMode();\n const savedEffort: string = CC_InputStorage_Util.loadSessionEffort();\n\n const sessionId: string = await this.ccSession_DS.createSession({\n workspacePath: workspacePath,\n label: this.newSessionLabel_$() || undefined,\n mode: savedMode || undefined,\n reasoningEffort: savedEffort || undefined,\n });\n\n this.handleCloseCreateDialog();\n\n // Automatikus navigálás az újonnan létrehozott session-re\n // Cycle 785 (REQ-INST-SES-URL-001): instance kontextus a route-ban.\n if (sessionId) {\n const ccapId: string = this.peiContext_DS.activeCcapId_$();\n const target: string[] = ccapId\n ? ['/cc-session', ccapId, sessionId]\n : ['/cc-session', sessionId];\n this.router.navigate(target);\n }\n } catch {\n // HTTP hibát az interceptor már megjeleníti a popup-ban a teljes szerver üzenettel;\n // a data service console message-t küld. Itt csak a dialog bezárás szükséges.\n this.handleCloseCreateDialog();\n } finally {\n this.isCreating_$.set(false);\n }\n }\n\n /**\n * Projekt szűrő változás kezelése — mentés localStorage-ba.\n * Nincs szerver-oldali szűrés, a `filteredSessions_$` computed signal\n * automatikusan újraértékelődik a signal változásra.\n */\n handleProjectFilterChange(value: string): void {\n this.projectFilter_$.set(value);\n CC_InputStorage_Util.saveProjectFilter(value);\n }\n\n /**\n * Archivált session-ök megjelenítés toggle kezelése.\n */\n handleToggleShowArchived(): void {\n const newValue: boolean = !this.showArchived_$();\n this.showArchived_$.set(newValue);\n CC_InputStorage_Util.saveShowArchived(newValue);\n this.handleRefresh();\n }\n\n /**\n * Session archiválás/visszaállítás kezelése.\n * A click event propagáció megállítása szükséges, mert a session card-on belül van.\n */\n async handleToggleArchive(event: Event, session: CC_ListItem_Interface): Promise<void> {\n event.stopPropagation();\n try {\n await this.ccSession_DS.setSessionArchived({\n sessionId: session.sessionId,\n isArchived: !session.isArchived,\n });\n // Lista újratöltése az aktuális szűrőkkel\n this.handleRefresh();\n } catch {\n // HTTP hibát az interceptor kezeli; data service console message-t küld.\n }\n }\n\n // ── Context menu handlers ────────────────────────────────────\n\n /**\n * Kontextmenü megnyitása a shared list row contextMenu output-jából.\n * A shared komponens már preventDefault + stopPropagation-t hívott.\n */\n handleRowContextMenu(payload: { event: MouseEvent; id: string }): void {\n this.isRenaming_$.set(false);\n const session: CC_ListItem_Interface | undefined =\n this.filteredSessions_$().find(\n (s: CC_ListItem_Interface): boolean => s.sessionId === payload.id,\n );\n if (!session) {\n return;\n }\n this.ctxMenuSession_$.set(session);\n this.ctxMenuPos_$.set({ x: payload.event.clientX, y: payload.event.clientY });\n }\n\n /**\n * REQ-SCH-IND-CLICK-001 (cycle 201): a row schedule-indicator gombján kattintás —\n * megnyitja a Schedule popup-ot a megadott sessionId-hoz.\n */\n handleScheduleIndicatorClick(sessionId: string): void {\n this.schedulePopupSessionId_$.set(sessionId);\n }\n\n /** Schedule popup bezárása. */\n handleCloseSchedulePopup(): void {\n this.schedulePopupSessionId_$.set(null);\n }\n\n /**\n * REQ-SES-CRD-IND-001 Slice 3 (cycle 202): coordinator-indicator gomb kattintás —\n * megnyitja a Coordinator popup-ot a megadott sessionId-hoz.\n */\n handleCoordinatorIndicatorClick(sessionId: string): void {\n this.coordinatorPopupSessionId_$.set(sessionId);\n }\n\n /** Coordinator popup bezárása. */\n handleCloseCoordinatorPopup(): void {\n this.coordinatorPopupSessionId_$.set(null);\n }\n\n /** Kontextmenü bezárása (rename és copy-link feedback állapot is törlődik). */\n handleCloseCtxMenu(): void {\n this.ctxMenuSession_$.set(null);\n this.isRenaming_$.set(false);\n this.renameValue_$.set('');\n this.linkCopyState_$.set('idle');\n }\n\n /**\n * REQ-SES-CTX-COPY-LINK-001: Copy link a CC Session-höz — `${origin}/cc-session[/<ccapId>]/<sessionId>`,\n * ami egy másik gépen / chat-üzenetben is azonosítja és megnyitja a session-t.\n */\n async handleCtxCopyLink(): Promise<void> {\n const session: CC_ListItem_Interface | null = this.ctxMenuSession_$();\n if (!session) {\n return;\n }\n const ccapId: string = this.peiContext_DS.activeCcapId_$();\n const path: string = ccapId\n ? `/cc-session/${ccapId}/${session.sessionId}`\n : `/cc-session/${session.sessionId}`;\n const url: string = `${window.location.origin}${path}`;\n const result: { ok: boolean } = await this.globalError_CS.copyToClipboard(url);\n this.linkCopyState_$.set(result.ok ? 'copied' : 'failed');\n setTimeout((): void => {\n this.handleCloseCtxMenu();\n }, 700);\n }\n\n /** Rename mód indítása a kontextmenüből. */\n handleCtxRenameStart(): void {\n const session: CC_ListItem_Interface | null = this.ctxMenuSession_$();\n if (!session) {\n return;\n }\n this.renameValue_$.set(session.label || '');\n this.isRenaming_$.set(true);\n // Fókusz a rename inputra a következő renderelési ciklusban\n setTimeout((): void => {\n const input: HTMLInputElement | null =\n document.querySelector<HTMLInputElement>('#ctxRenameInput');\n if (input) {\n input.focus();\n input.select();\n }\n }, 0);\n }\n\n /** Rename végrehajtása (Enter vagy blur). */\n async handleCtxRenameConfirm(): Promise<void> {\n const session: CC_ListItem_Interface | null = this.ctxMenuSession_$();\n if (!session) {\n return;\n }\n const newLabel: string = this.renameValue_$().trim();\n // Üres string is érvényes — törli a label-t (sessionId lesz a megjelenített név)\n if (newLabel !== (session.label || '')) {\n try {\n await this.ccSession_DS.updateSessionConfig({\n sessionId: session.sessionId,\n label: newLabel,\n });\n } catch {\n // HTTP hibát az interceptor kezeli\n }\n }\n this.handleCloseCtxMenu();\n }\n\n /** Archive/Unarchive a kontextmenüből. */\n async handleCtxToggleArchive(): Promise<void> {\n const session: CC_ListItem_Interface | null = this.ctxMenuSession_$();\n if (!session) {\n return;\n }\n this.handleCloseCtxMenu();\n try {\n await this.ccSession_DS.setSessionArchived({\n sessionId: session.sessionId,\n isArchived: !session.isArchived,\n });\n this.handleRefresh();\n } catch {\n // HTTP hibát az interceptor kezeli\n }\n }\n\n /** Terminate a kontextmenüből. */\n async handleCtxTerminate(): Promise<void> {\n const session: CC_ListItem_Interface | null = this.ctxMenuSession_$();\n if (!session) {\n return;\n }\n this.handleCloseCtxMenu();\n try {\n await this.ccSession_DS.terminateSession({\n sessionId: session.sessionId,\n });\n this.handleRefresh();\n } catch {\n // HTTP hibát az interceptor kezeli\n }\n }\n\n /** Resume a kontextmenüből. */\n async handleCtxResume(): Promise<void> {\n const session: CC_ListItem_Interface | null = this.ctxMenuSession_$();\n if (!session) {\n return;\n }\n this.handleCloseCtxMenu();\n try {\n await this.ccSession_DS.resumeSession({\n sessionId: session.sessionId,\n });\n this.handleRefresh();\n } catch {\n // HTTP hibát az interceptor kezeli\n }\n }\n\n /**\n * Session lista frissítése.\n */\n handleRefresh(): void {\n this.ccSession_DS.loadSessions({\n includeArchived: this.showArchived_$() || undefined,\n });\n }\n\n /**\n * Path normalizáció — `s-project-badge`-gel azonos logika:\n * lowercase (Windows case-insensitivity), backslash → slash, trailing slash trim.\n */\n private static normalizePath(path: string): string {\n let normalized: string = path.trim().toLowerCase().replace(/\\\\/g, '/');\n while (normalized.endsWith('/') && normalized.length > 1) {\n normalized = normalized.slice(0, -1);\n }\n return normalized;\n }\n\n}\n", "<!-- Instance-szelektor + info popup host (REQ-PEI-016, REQ-UI-INST-001 Slice 5) -->\n<div class=\"p-2 border-b border-neonDefault\">\n <app-s-instance-chip-row-with-info />\n</div>\n\n<!-- Header -->\n<div class=\"flex items-center justify-between p-3 border-b border-neonDefault\">\n <h2 class=\"text-sm font-semibold text-neutral-200\">CC Sessions</h2>\n <div class=\"flex gap-1\">\n <button\n class=\"px-2 py-1 text-xs border border-neonDefault text-neutral-300 hover:bg-neutral-700 rounded transition-colors\"\n (click)=\"handleRefresh()\"\n title=\"Refresh\">\n Refresh\n </button>\n <button\n class=\"px-2 py-1 text-xs border border-ccapAccent text-ccapAccent hover:bg-ccapAccent hover:text-white hover:shadow-neon-glow-accent rounded transition-colors\"\n (click)=\"handleOpenCreateDialog()\">\n + New\n </button>\n </div>\n</div>\n\n<!-- Project filter + archive toggle -->\n<div class=\"p-2 border-b border-neonDefault flex gap-2 items-center\">\n <select\n class=\"flex-1 bg-neutral-900 text-neutral-300 text-xs rounded px-2 py-1 border border-neonDefault\"\n [ngModel]=\"projectFilter_$()\"\n (ngModelChange)=\"handleProjectFilterChange($event)\">\n <option value=\"\">All projects</option>\n @for (project of pm_DS.projects_$(); track project._id) {\n @if (project.localPath) {\n <option [value]=\"project.localPath\">{{ project.name }}</option>\n }\n }\n </select>\n <button\n class=\"px-2 py-1 text-[10px] border rounded transition-colors whitespace-nowrap\"\n [class]=\"showArchived_$()\n ? 'border-amber-500/60 text-amber-400 bg-amber-500/10 hover:bg-amber-500/20'\n : 'border-neonDefault text-neutral-500 hover:text-neutral-300 hover:bg-neutral-700'\"\n (click)=\"handleToggleShowArchived()\"\n [title]=\"showArchived_$() ? 'Hide archived sessions' : 'Show archived sessions'\">\n {{ showArchived_$() ? 'Archived ON' : 'Archived' }}\n </button>\n</div>\n\n<!-- Session lista -->\n<div class=\"flex-1 overflow-y-auto\">\n @if (ccSession_DS.sessionsLoading_$()) {\n <div class=\"p-4 text-center text-neutral-500 text-sm\">Loading sessions...</div>\n }\n\n @if (ccSession_DS.sessionsLoadError_$()) {\n <div class=\"p-4 text-center text-red-400 text-sm\">Failed to load sessions</div>\n }\n\n <!-- REQ-UI-SSEL-001 Slice 3: közös S_SessionSelect_Component wrapper.\n A CC dashboard a project filter + archive toggle-t a felső sávban tartja,\n szöveges keresés nincs — ezért `hideSearch=true`. -->\n @if (sessionRowViews_$().length) {\n <app-s-session-select\n kind=\"cc\"\n [rows]=\"sessionRowViews_$()\"\n [activeId]=\"ccSession_DS.activeSessionId_$()\"\n [hideSearch]=\"true\"\n (selected)=\"handleSelectSession($event)\"\n (contextMenu)=\"handleRowContextMenu($event)\"\n (scheduleIndicatorClicked)=\"handleScheduleIndicatorClick($event)\"\n (coordinatorIndicatorClicked)=\"handleCoordinatorIndicatorClick($event)\" />\n }\n\n @if (!ccSession_DS.sessionsLoading_$() && !sessionRowViews_$().length) {\n <div class=\"p-4 text-center text-neutral-500 text-sm\">No sessions found</div>\n }\n</div>\n\n<!-- Create Session Dialog (s-modal) -->\n<app-s-modal [isOpen]=\"isCreateDialogOpen_$()\"\n [title]=\"'New CC Session'\"\n [maxWidth]=\"'sm'\"\n [closeOnBackdropClick]=\"false\"\n (closed)=\"isCreateDialogOpen_$.set(false)\">\n <div class=\"mb-2\">\n <label class=\"text-xs text-neutral-400 block mb-1\">Workspace Path *</label>\n @if (newAgentSessionWorkspace_DS.workspacePathPickerOptions_$().length) {\n <select\n class=\"w-full bg-neutral-900 text-neutral-300 text-xs rounded px-2 py-1.5 border border-neonDefault focus:border-neonCyan focus:outline-none mb-1.5\"\n [ngModel]=\"selectedPathOption_$()\"\n (ngModelChange)=\"handlePathOptionChange($event)\">\n <option value=\"\" disabled>Select a path...</option>\n @for (opt of newAgentSessionWorkspace_DS.workspacePathPickerOptions_$(); track opt.path) {\n <option [value]=\"opt.path\">{{ opt.label }} — {{ opt.path }}</option>\n }\n <option value=\"custom\">Custom path...</option>\n </select>\n }\n <input\n type=\"text\"\n class=\"w-full bg-neutral-900 text-neutral-200 text-sm rounded px-2 py-1.5 border border-neonDefault focus:border-neonCyan focus:outline-none\"\n placeholder=\"/path/to/workspace\"\n [ngModel]=\"newSessionWorkspacePath_$()\"\n (ngModelChange)=\"newSessionWorkspacePath_$.set($event)\" />\n </div>\n\n <div class=\"mb-3\">\n <label class=\"text-xs text-neutral-400 block mb-1\">Label (optional)</label>\n <input\n type=\"text\"\n class=\"w-full bg-neutral-900 text-neutral-200 text-sm rounded px-2 py-1.5 border border-neonDefault focus:border-neonCyan focus:outline-none\"\n placeholder=\"My session\"\n [ngModel]=\"newSessionLabel_$()\"\n (ngModelChange)=\"newSessionLabel_$.set($event)\" />\n </div>\n\n <div class=\"flex justify-end gap-2\">\n <button\n class=\"px-3 py-1.5 text-xs border border-neonDefault text-neutral-300 hover:bg-neutral-700 rounded transition-colors\"\n [disabled]=\"isCreating_$()\"\n (click)=\"handleCloseCreateDialog()\">\n Cancel\n </button>\n <button\n class=\"px-3 py-1.5 text-xs border border-ccapAccent text-ccapAccent hover:bg-ccapAccent hover:text-white disabled:opacity-50 rounded transition-colors\"\n [disabled]=\"isCreating_$() || !newSessionWorkspacePath_$()\"\n (click)=\"handleCreateSession()\">\n {{ isCreating_$() ? 'Creating...' : 'Create' }}\n </button>\n </div>\n</app-s-modal>\n\n<!-- REQ-SCH-IND-CLICK-001 (cycle 201): Schedule popup a row schedule-indicator gomb click-jén nyit. -->\n<app-sch-schedule-popup\n [sessionId]=\"schedulePopupSessionId_$()\"\n [isOpen]=\"schedulePopupSessionId_$() !== null\"\n (closed)=\"handleCloseSchedulePopup()\" />\n\n<!-- REQ-SES-CRD-IND-001 Slice 3 (cycle 202): Coordinator popup a row coordinator-indicator gomb click-jén nyit. -->\n<app-crd-info-popup\n [sessionId]=\"coordinatorPopupSessionId_$()\"\n [isOpen]=\"coordinatorPopupSessionId_$() !== null\"\n (closed)=\"handleCloseCoordinatorPopup()\" />\n\n<!-- Context menu overlay -->\n@if (ctxMenuSession_$(); as ctxSession) {\n <!-- Backdrop — kattintásra bezárja a menüt -->\n <div class=\"fixed inset-0 z-40\" (click)=\"handleCloseCtxMenu()\"></div>\n\n <div class=\"fixed z-50 min-w-[160px] bg-neutral-900 border border-neutral-700 rounded-lg shadow-xl py-1 text-xs\"\n [style.left.px]=\"ctxMenuPos_$().x\"\n [style.top.px]=\"ctxMenuPos_$().y\">\n\n @if (isRenaming_$()) {\n <!-- Rename inline input -->\n <div class=\"px-2 py-1.5\">\n <input\n #renameInput\n id=\"ctxRenameInput\"\n type=\"text\"\n class=\"w-full bg-neutral-800 text-neutral-200 text-xs rounded px-2 py-1 border border-neonDefault\n focus:border-neonCyan focus:outline-none\"\n [value]=\"renameValue_$()\"\n (input)=\"renameValue_$.set(renameInput.value)\"\n (keydown.enter)=\"handleCtxRenameConfirm()\"\n (keydown.escape)=\"handleCloseCtxMenu()\" />\n </div>\n } @else {\n <!-- REQ-SES-CTX-COPY-LINK-001: Copy link — session deep-link a clipboard-ra\n (`${origin}/cc-session[/<ccapId>]/<sessionId>`); másik gépen / chat-ben is megnyitható. -->\n <button\n class=\"w-full text-left px-3 py-1.5 text-neutral-300 hover:bg-neutral-800 transition-colors\"\n [disabled]=\"linkCopyState_$() !== 'idle'\"\n (click)=\"handleCtxCopyLink()\">\n @switch (linkCopyState_$()) {\n @case ('copied') { ✓ Link copied }\n @case ('failed') { Copy failed }\n @default { Copy link }\n }\n </button>\n\n <!-- Rename -->\n <button\n class=\"w-full text-left px-3 py-1.5 text-neutral-300 hover:bg-neutral-800 transition-colors\"\n (click)=\"handleCtxRenameStart()\">\n Rename\n </button>\n\n <!-- Archive / Unarchive -->\n <button\n class=\"w-full text-left px-3 py-1.5 text-neutral-300 hover:bg-neutral-800 transition-colors\"\n (click)=\"handleCtxToggleArchive()\">\n {{ ctxSession.isArchived ? 'Unarchive' : 'Archive' }}\n </button>\n\n <!-- Resume (completed / errored) -->\n @if (ctxSession.status === 'completed' || ctxSession.status === 'errored') {\n <button\n class=\"w-full text-left px-3 py-1.5 text-neutral-300 hover:bg-neutral-800 transition-colors\"\n (click)=\"handleCtxResume()\">\n Resume\n </button>\n }\n\n <!-- Terminate (running / starting / waiting-input) -->\n @if (ctxSession.status === 'running' || ctxSession.status === 'starting' || ctxSession.status === 'waiting-input') {\n <div class=\"border-t border-neutral-700 my-1\"></div>\n <button\n class=\"w-full text-left px-3 py-1.5 text-red-400 hover:bg-red-500/10 transition-colors\"\n (click)=\"handleCtxTerminate()\">\n Terminate\n </button>\n }\n }\n </div>\n}\n", "import { Pipe, PipeTransform } from '@angular/core';\n\n/**\n * Session status → Tailwind CSS badge szín osztály.\n */\n@Pipe({ name: 'ccSessionStatusColor' })\nexport class CC_StatusColor_Pipe implements PipeTransform {\n\n /** Status string → CSS osztály. */\n transform(status: string): string {\n switch (status) {\n case 'running': return 'bg-yellow-500';\n case 'waiting-input': return 'bg-green-500';\n case 'starting': return 'bg-yellow-500';\n case 'creating': return 'bg-yellow-400';\n case 'completed': return 'bg-blue-500';\n case 'errored': return 'bg-red-500';\n case 'terminated': return 'bg-red-700';\n // REQ-CC-STATUS-001: időalapú korrektor megállítottnak jelzett session.\n case 'stalled': return 'bg-orange-500';\n default: return 'bg-neutral-600';\n }\n }\n}\n", "import { Component, computed, inject, OnInit, signal, Signal } from '@angular/core';\nimport { Router } from '@angular/router';\n\nimport { ClaudeCode_DataService } from '../../_services/claude-code.data-service';\nimport { ExS_InstanceContext_DataService } from '../../../../_services/exs-instance-context.data-service';\nimport { CC_DetailUi_DataService } from '../../_services/cc-detail-ui.data-service';\nimport {\n CC_Detail_Response,\n CC_ListItem_Interface,\n} from '../../_models/interfaces/cc-list-item.interface';\nimport { CC_InputStorage_Util } from '../../_collections/cc-input-storage.util';\nimport {\n SESSION_SHELL_MOBILE_BREAKPOINT_PX,\n SESSION_SHELL_SIDEBAR_DEFAULT_WIDTH_PX,\n SESSION_SHELL_SIDEBAR_MAX_WIDTH_PX,\n SESSION_SHELL_SIDEBAR_MIN_WIDTH_PX,\n} from '../../../../../shared/_collections/consts/session-detail-panel-layout.const';\nimport { SHR_DocumentPointerDrag_Util } from '../../../../../shared/_collections/utils/shr-document-pointer-drag.util';\n\n/**\n * CC Session shell top bar — aktív session megjelenítés (név lista/detail-ből, action csak stabil detail-nél).\n */\ninterface CCAP_CcSessionShellTopBarContext_Interface {\n title: string;\n detail: CC_Detail_Response | null;\n showActions: boolean;\n isLoading: boolean;\n}\n\n/**\n * Claude Code Session shell layout.\n * Bal oldali session lista sidebar + jobb oldali detail area (router-outlet).\n * A sidebar szélessége drag handle-lel állítható, localStorage-ba mentődik.\n * A detail action bar (session név, panelek, resume) a top sorban, megosztva a lista felett is.\n */\n@Component({\n selector: 'app-ccap-cc-shell',\n templateUrl: './cc-shell.component.html',\n host: { class: 'flex min-h-0 w-full flex-1 flex-col overflow-hidden' },\n})\n/** CC_Shell_Component class. */\nexport class CC_Shell_Component implements OnInit {\n\n private readonly router: Router = inject(Router);\n\n /**\n * Cycle 785 (REQ-INST-SES-URL-001): a navigation-hez használt aktív\n * instance kontextus (URL `/cc-session/:ccapId/:sessionId`).\n */\n private readonly peiContext_DS: ExS_InstanceContext_DataService =\n inject(ExS_InstanceContext_DataService);\n\n /** Session lista + detail state — a template a selected session toolbar-hoz olvassa. */\n readonly ccSession_DS: ClaudeCode_DataService =\n inject(ClaudeCode_DataService);\n\n /** Detail chrome toggle-ok és resume/terminate — közös a detail layout-tal. */\n readonly detailUi_DS: CC_DetailUi_DataService =\n inject(CC_DetailUi_DataService);\n\n /** Sessions sidebar aktuális szélessége (px). */\n readonly sidebarWidth_$ = signal<number>(SESSION_SHELL_SIDEBAR_DEFAULT_WIDTH_PX);\n\n /** Sidebar nyitva/zárva. */\n readonly isSidebarOpen_$ = signal<boolean>(true);\n\n /** Resize aktív-e (drag közben a cursor override-hoz). */\n readonly isResizing_$ = signal<boolean>(false);\n\n /**\n * Top bar: épp megnyitott session neve (activeSessionId + lista/detail), betöltés alatt is.\n * Action gombok csak ha a selectedSession ugyanarra az ID-re vonatkozik és nincs load.\n */\n readonly ccTopBarContext_$: Signal<CCAP_CcSessionShellTopBarContext_Interface | null> = computed(\n (): CCAP_CcSessionShellTopBarContext_Interface | null => {\n const activeId: string = this.ccSession_DS.activeSessionId_$();\n if (!activeId) {\n return null;\n }\n const loading: boolean = this.ccSession_DS.selectedSessionLoading_$();\n const sel: CC_Detail_Response | null = this.ccSession_DS.selectedSession_$();\n const list: CC_ListItem_Interface[] = this.ccSession_DS.sessions_$();\n const fromList: CC_ListItem_Interface | undefined = list.find(\n (s: CC_ListItem_Interface): boolean => s.sessionId === activeId,\n );\n const detailMatches: boolean = sel?.session.sessionId === activeId;\n const titleFromSel: string | null = detailMatches\n ? (sel!.session.label || sel!.session.sessionId)\n : null;\n const title: string = titleFromSel ?? (fromList ? (fromList.label || fromList.sessionId) : activeId);\n const showActions: boolean = detailMatches && !loading;\n return {\n title: title,\n detail: detailMatches ? sel : null,\n showActions: showActions,\n isLoading: loading,\n };\n },\n );\n\n ngOnInit(): void {\n const stored: number = CC_InputStorage_Util.loadPanelWidth(\n 'sidebar',\n SESSION_SHELL_SIDEBAR_DEFAULT_WIDTH_PX,\n );\n this.sidebarWidth_$.set(\n Math.max(\n SESSION_SHELL_SIDEBAR_MIN_WIDTH_PX,\n Math.min(SESSION_SHELL_SIDEBAR_MAX_WIDTH_PX, stored),\n ),\n );\n this.isSidebarOpen_$.set(CC_InputStorage_Util.loadPanelOpen('sidebar', true));\n }\n\n /**\n * Sidebar resize drag indítása.\n * Pointerdown a drag handle-ön — pointer capture + pointermove/pointerup a document-en.\n */\n handleSidebarResizeStart(event: PointerEvent): void {\n const startX: number = event.clientX;\n const startWidth: number = this.sidebarWidth_$();\n this.isResizing_$.set(true);\n SHR_DocumentPointerDrag_Util.attachUntilPointerUp({\n startEvent: event,\n onMove: (e: PointerEvent): void => {\n const delta: number = e.clientX - startX;\n const newWidth: number = Math.max(\n SESSION_SHELL_SIDEBAR_MIN_WIDTH_PX,\n Math.min(SESSION_SHELL_SIDEBAR_MAX_WIDTH_PX, startWidth + delta),\n );\n this.sidebarWidth_$.set(newWidth);\n },\n onEnd: (): void => {\n this.isResizing_$.set(false);\n CC_InputStorage_Util.savePanelWidth('sidebar', this.sidebarWidth_$());\n },\n });\n }\n\n /** Sidebar toggle (ki/be nyitás), állapot mentése localStorage-ba. */\n handleToggleSidebar(): void {\n this.isSidebarOpen_$.update((v: boolean): boolean => !v);\n CC_InputStorage_Util.savePanelOpen('sidebar', this.isSidebarOpen_$());\n }\n\n /**\n * Session kiválasztás a dashboard-ból — mobil nézeten auto-close sidebar.\n * Nem mentjük localStorage-ba: a felhasználó preferenciáját (manuális toggle) nem írjuk felül,\n * csak a tartalom látótávba kerüljön kis képernyőn.\n */\n handleSessionSelectedFromDashboard(): void {\n if (window.innerWidth < SESSION_SHELL_MOBILE_BREAKPOINT_PX) {\n this.isSidebarOpen_$.set(false);\n }\n }\n\n /**\n * Session fork — a kiválasztott session conversation-jének duplikálása.\n * Sikeres fork után navigálás az új session detail nézetére.\n */\n async handleForkSession(): Promise<void> {\n const newSessionId: string | null = await this.detailUi_DS.handleFork();\n if (newSessionId) {\n // Cycle 785: instance kontextus a route-ban — ha a fork az aktív\n // instance-en történt, az URL is reflektálja.\n const ccapId: string = this.peiContext_DS.activeCcapId_$();\n const target: string[] = ccapId\n ? ['/cc-session', ccapId, newSessionId]\n : ['/cc-session', newSessionId];\n await this.router.navigate(target);\n }\n }\n}\n", "<div class=\"flex min-h-0 w-full flex-1 flex-col overflow-hidden\" [class.select-none]=\"isResizing_$()\">\n @let ccCtx = ccTopBarContext_$();\n <app-s-session-shell-toolbar>\n <div sSessionToolbarLeft class=\"flex items-center gap-1 min-w-0\">\n <button\n class=\"px-2 py-1 text-xs border border-neonDefault text-neutral-300 hover:bg-neutral-700 rounded transition-colors flex items-center gap-1 shrink-0\"\n (click)=\"handleToggleSidebar()\">\n <svg class=\"w-3 h-3 shrink-0 transition-transform duration-150\"\n [class.rotate-90]=\"isSidebarOpen_$()\"\n [class.-rotate-90]=\"!isSidebarOpen_$()\"\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n Sessions\n </button>\n @if (ccCtx) {\n <div class=\"w-px h-4 bg-neutral-700 shrink-0 self-center mx-0.5\"></div>\n }\n @if (ccCtx && ccCtx.showActions && ccCtx.detail) {\n <button\n type=\"button\"\n class=\"px-2 py-1 text-xs border rounded transition-colors shrink-0\"\n [class]=\"detailUi_DS.isMetadataPanelOpen_$()\n ? 'border-neonCyan/50 text-neonCyan bg-neonCyan/10'\n : 'border-neutral-700 text-neutral-500 hover:text-neutral-300 hover:border-neutral-600'\"\n (click)=\"detailUi_DS.handleToggleMetadata()\">\n Info\n </button>\n }\n </div>\n\n <div\n sSessionToolbarCenter\n class=\"flex flex-wrap items-center justify-center gap-2 min-w-0 max-w-[min(100vw-10rem,48rem)]\">\n @if (ccCtx) {\n <span class=\"text-sm font-semibold text-neutral-200 truncate text-center min-w-0 max-w-[min(240px,35vw)]\"\n [title]=\"ccCtx.title\">\n {{ ccCtx.title }}\n </span>\n @if (ccCtx.detail) {\n <span\n class=\"w-2 h-2 rounded-full shrink-0\"\n [ngClass]=\"ccCtx.detail.session.status | ccSessionStatusColor\"\n [title]=\"ccCtx.detail.session.status\">\n </span>\n @if (ccCtx.detail.runtime.isLive) {\n <span class=\"w-2 h-2 rounded-full bg-green-500 animate-pulse shrink-0\" title=\"Live\"></span>\n }\n }\n @if (ccCtx.isLoading && !ccCtx.showActions) {\n <span class=\"text-[10px] text-neutral-500 shrink-0\">Loading…</span>\n }\n }\n </div>\n\n <div sSessionToolbarRight class=\"flex items-center gap-1 min-w-0 flex-wrap justify-end\">\n @if (ccCtx && ccCtx.showActions && ccCtx.detail) {\n @let shellDetail = ccCtx.detail;\n <div class=\"flex gap-1 shrink-0 items-center flex-wrap justify-end\">\n <button\n class=\"px-2 py-1 text-xs border rounded transition-colors\"\n [class]=\"detailUi_DS.isTimelinePanelOpen_$()\n ? 'border-neonCyan/50 text-neonCyan bg-neonCyan/10'\n : 'border-neutral-700 text-neutral-500 hover:text-neutral-300 hover:border-neutral-600'\"\n (click)=\"detailUi_DS.handleToggleTimeline()\">\n Timeline\n </button>\n <button\n class=\"px-2 py-1 text-xs border border-neutral-700 text-neutral-500\n hover:text-neutral-300 hover:border-neutral-600\n disabled:opacity-40 rounded transition-colors\"\n [disabled]=\"detailUi_DS.isForking_$()\n || !shellDetail.session.claudeSessionId\"\n [title]=\"detailUi_DS.isForking_$()\n ? 'Fork in progress…'\n : !shellDetail.session.claudeSessionId\n ? 'Cannot fork: no conversation yet'\n : 'Fork conversation into new session'\"\n (click)=\"handleForkSession()\">\n {{ detailUi_DS.isForking_$() ? 'Forking…' : 'Fork' }}\n </button>\n <span class=\"w-px bg-neutral-700 mx-0.5 self-stretch min-h-[1.25rem]\"></span>\n @if (shellDetail.session.status === 'running') {\n <button\n class=\"px-2 py-1 text-xs border border-neonRed/50 text-red-300 hover:bg-red-950/40 disabled:opacity-40 rounded transition-colors\"\n [disabled]=\"detailUi_DS.isStopping_$()\"\n (click)=\"detailUi_DS.handleStopExecution()\">\n {{ detailUi_DS.isStopping_$() ? 'Stopping…' : 'Stop' }}\n </button>\n }\n </div>\n }\n </div>\n </app-s-session-shell-toolbar>\n\n <app-s-resizable-session-shell-layout\n [isSidebarOpen]=\"isSidebarOpen_$()\"\n [sidebarWidthPx]=\"sidebarWidth_$()\"\n [isResizing]=\"isResizing_$()\"\n (sidebarResizeStart)=\"handleSidebarResizeStart($event)\">\n <div sSessionShellSidebar class=\"flex flex-col overflow-hidden h-full\">\n <app-ccap-cc-dashboard (sessionSelected)=\"handleSessionSelectedFromDashboard()\" />\n </div>\n <div\n sSessionShellMain\n class=\"flex min-h-0 flex-1 flex-col overflow-hidden [&>router-outlet]:contents\">\n <router-outlet />\n </div>\n </app-s-resizable-session-shell-layout>\n</div>\n", "import {\n Component,\n computed,\n effect,\n inject,\n input,\n signal,\n Signal,\n WritableSignal,\n ElementRef,\n ViewChild,\n AfterViewChecked,\n OnDestroy,\n} from '@angular/core';\nimport { DyFM_Log } from '@futdevpro/fsm-dynamo';\n\nimport { ClaudeCode_DataService } from '../../_services/claude-code.data-service';\nimport {\n CcSessionConsoleMessage_Interface,\n CcSessionUsage_Interface,\n} from '../../_services/cc.data-service.interface';\nimport { CC_DetailUi_DataService } from '../../_services/cc-detail-ui.data-service';\nimport { VNP_InputUi_DataService } from '../../../../../dev/_modules/poc/_modules/voice-notes-poc/_services/vnp-input-ui.data-service';\nimport {\n CC_Detail_Response,\n} from '../../_models/interfaces/cc-list-item.interface';\nimport { CC_Mode_Type } from '../../_enums/cc-mode.enum';\nimport { CC_Model_Type } from '../../_enums/cc-model.enum';\nimport { Tls_ModelTestReasoningLevel_Type } from '../../../../../../_enums/ccap-model-test-reasoning-level.enum';\nimport { CC_InputStorage_Util } from '../../_collections/cc-input-storage.util';\nimport { CC_ConsoleDisplayItem_Interface } from '../../_models/interfaces/cc-console-display-item.interface';\nimport { CCAP_AgentConsoleRawOverlayBundle_Interface } from '../../../../../../_models/interfaces/shared/ccap-agent-console-raw-overlay-bundle.interface';\nimport { SHR_AgentConsoleRawOverlay_Util } from '../../../../../shared/_collections/utils/shr-agent-console-raw-overlay.util';\nimport { CC_CcConsoleToBubbleView_Util } from '../../_collections/cc-console-to-bubble-view.util';\nimport { SHR_ExtSessionMsgToBubbleView_Util } from '../../../../../shared/_collections/utils/shr-ext-message-to-bubble-view.util';\nimport { CCAP_AgentConsoleBubbleKind_Type } from '../../../../../../_enums/shared/ccap-agent-console-bubble-kind.enum';\nimport { CCAP_AgentConsoleBubbleView_Interface } from '../../../../../../_models/interfaces/shared/ccap-agent-console-bubble-view.interface';\nimport { CCAP_ExtSessionMessage_Response } from '../../../../../../_models/interfaces/shared/ccap-ext-message.interface';\nimport { ExS_Queue_DataService } from '../../../../_services/exs-queue.data-service';\nimport { S_SessionInput_Component } from '../../../../../shared/_components/session-ui/s-session-input/s-session-input.component';\nimport { CCAP_PendingAttachment_Interface } from '../../../../../../_models/interfaces/session/ccap-pending-attachment.interface';\n\n/**\n * Egy conversation turn: user prompt + az arra érkező assistant válaszok, tool brief-ek, status-ok.\n */\ninterface ChatTurn_Interface {\n /** User prompt szöveg (a turn eleje — sticky header is használja). */\n promptText: string;\n /** Turn track kulcs — a prompt üzenet listKey-je vagy szintetikus UUID. */\n promptListKey: string;\n /** User prompt shared bubble view (ha van prompt). */\n promptBubbleView?: CCAP_AgentConsoleBubbleView_Interface;\n /** Assistant és rendszer válaszok a prompt-ra. */\n items: CC_ConsoleDisplayItem_Interface[];\n}\n\n/**\n * CC Session chat felület komponens.\n * Chat-szerű prompt/response megjelenítés, sticky utolsó user üzenet,\n * brief event kártyák, auto-scroll, prompt input.\n * Az input alatt mode/effort választó és usage kijelzés.\n */\n@Component({\n selector: 'app-ccap-cc-console',\n templateUrl: './cc-console.component.html',\n host: { class: 'flex flex-col flex-1 min-h-0 overflow-hidden' },\n})\n/** CC_Console_Component class. */\nexport class CC_Console_Component implements AfterViewChecked, OnDestroy {\n\n /** Session ID input. */\n readonly sessionId = input<string>('');\n\n readonly ccSession_DS: ClaudeCode_DataService =\n inject(ClaudeCode_DataService);\n\n readonly detailUi_DS: CC_DetailUi_DataService =\n inject(CC_DetailUi_DataService);\n\n readonly sessionQueue_DS: ExS_Queue_DataService =\n inject(ExS_Queue_DataService);\n\n private readonly voiceInputUi_DS: VNP_InputUi_DataService =\n inject(VNP_InputUi_DataService);\n\n /** TTS cache: lejátszott üzenetek messageKey-jei. */\n readonly ttsCachedKeys_$ = signal<Set<string>>(new Set());\n\n /**\n * TTS cache jelzés a shared bubble-ből.\n */\n handleTtsCached(messageKey: string): void {\n this.ttsCachedKeys_$.update(\n (s: Set<string>): Set<string> => new Set([...s, messageKey]),\n );\n }\n\n /** Prompt input mező tartalma. */\n readonly promptInput_$ = signal<string>('');\n\n /** Auto-scroll engedélyezve. */\n readonly isAutoScroll_$ = signal<boolean>(true);\n\n /** Prompt küldés folyamatban. */\n readonly isSending_$ = signal<boolean>(false);\n\n /** Agent fut-e (running státusz → stop gomb a shared input-ban). */\n readonly isExecuting_$: Signal<boolean> = computed(\n (): boolean => this.ccSession_DS.selectedSession_$()?.session?.status === 'running',\n );\n\n /** Kiválasztott mód (normal / plan). */\n readonly selectedMode_$ = signal<string>(\n CC_InputStorage_Util.loadSessionMode()\n || CC_Mode_Type.normal,\n );\n\n /** Kiválasztott effort (reasoning level). */\n readonly selectedEffort_$ = signal<string>(\n CC_InputStorage_Util.loadSessionEffort()\n || Tls_ModelTestReasoningLevel_Type.high,\n );\n\n\n /** Kiválasztott model. */\n readonly selectedModel_$ = signal<string>(\n CC_InputStorage_Util.loadSessionModel()\n || CC_Model_Type.sonnet,\n );\n\n /** Elérhető mód opciók. */\n readonly modeOptions: CC_Mode_Type[] = [\n CC_Mode_Type.normal,\n CC_Mode_Type.plan,\n ];\n\n /** Elérhető effort opciók. */\n readonly effortOptions: Tls_ModelTestReasoningLevel_Type[] = [\n Tls_ModelTestReasoningLevel_Type.none,\n Tls_ModelTestReasoningLevel_Type.low,\n Tls_ModelTestReasoningLevel_Type.mid,\n Tls_ModelTestReasoningLevel_Type.high,\n ];\n\n /** Elérhető model opciók. */\n readonly modelOptions: CC_Model_Type[] = [\n CC_Model_Type.sonnet,\n CC_Model_Type.opus,\n CC_Model_Type.haiku,\n ];\n\n /**\n * Aktuális session model neve (read-only kijelzés).\n * Az activeModel-t preferálja (a Claude Code kimenetéből parsolt aktuális model),\n * fallback a konfigurált model-re.\n */\n readonly modelName_$: Signal<string> = computed((): string => {\n const detail: CC_Detail_Response | null = this.ccSession_DS.selectedSession_$();\n return detail?.session?.activeModel || detail?.session?.model || '';\n });\n\n /**\n * Usage kijelzés: kumulatív session token/cost adatok.\n */\n readonly usage_$: Signal<CcSessionUsage_Interface> = computed(\n (): CcSessionUsage_Interface => this.ccSession_DS.sessionUsage_$(),\n );\n\n /**\n * Formázott usage szöveg (tömör kijelzés).\n */\n readonly usageText_$: Signal<string> = computed((): string => {\n const u: CcSessionUsage_Interface = this.usage_$();\n if (!u.totalTokens) {\n return '';\n }\n const tokensFormatted: string = u.totalTokens > 1000\n ? `${(u.totalTokens / 1000).toFixed(1)}k`\n : String(u.totalTokens);\n const costFormatted: string = u.costUsd > 0\n ? ` · $${u.costUsd.toFixed(4)}`\n : '';\n return `${tokensFormatted} tokens${costFormatted}`;\n });\n\n /**\n * Chat turn-ök: conversation turn-ökbe csoportosított üzenetek.\n * Minden turn egy user prompt-tal kezdődik, amit az assistant válaszai követnek.\n * Státusz szűrés: ha a hisztori ki van kapcsolva, csak az utolsó státusz marad.\n */\n readonly chatTurns_$: Signal<ChatTurn_Interface[]> = computed(\n (): ChatTurn_Interface[] => {\n // Assembled messages SSOT path — ha vannak, azokból építünk turn-öket\n const assembled: CCAP_ExtSessionMessage_Response[] =\n this.ccSession_DS.assembledMessages_$();\n if (assembled.length > 0) {\n return this.buildTurnsFromAssembledMessages(assembled);\n }\n\n // BUG-CC-UI-STALE-001 (cycle 428 ghost-old fix): amíg az SSOT első fetch\n // nincs lezárva az aktuális sessionre, NE rajzoljunk a fallback console\n // path-ról. Különben a `loadSessionEvents` által betöltött historical\n // event-ekből épített turn-ök villannának be, majd lecserélődnének az\n // SSOT-ról jövő, esetleg eltérő grouping-gel rendezett turn-ökre.\n if (!this.ccSession_DS.assembledMessagesLoaded_$()) {\n return [];\n }\n\n // Fallback: kliens-oldali event pipeline (régi session-ökhöz, vagy ha az\n // assembled path üres marad — pl. fetch hiba vagy ténylegesen nincs message)\n const messages: CcSessionConsoleMessage_Interface[] = this.ccSession_DS.consoleMessages_$();\n const showStatusHistory: boolean = this.isShowSessionStatus();\n const showStatusUpdates: boolean = this.isShowAgentUpdates();\n const sid: string = this.sessionId();\n const cached: Set<string> = this.ttsCachedKeys_$();\n const turns: ChatTurn_Interface[] = [];\n let currentTurn: ChatTurn_Interface | null = null;\n\n for (const msg of messages) {\n // Status update szűrés (CLI system event-ek elrejtése ha kikapcsolva)\n if (msg.type === 'status-update' && !showStatusUpdates) {\n continue;\n }\n\n if (msg.type === 'prompt') {\n // Új turn indítása user prompt-tal\n currentTurn = {\n promptText: msg.text,\n promptListKey: msg.listKey,\n promptBubbleView: {\n listKey: msg.listKey,\n kind: CCAP_AgentConsoleBubbleKind_Type.userPrompt,\n bodyText: msg.text,\n timestampIso: msg.timestamp,\n isUserAligned: true,\n flags: {\n showCopy: true,\n showRawInfo: false,\n useEditDiffForExpandable: false,\n },\n tts: msg.text.trim().length > 0\n ? {\n messageKey: msg.listKey,\n sessionId: sid,\n role: 'user',\n content: msg.text,\n timestampIso: msg.timestamp,\n hasTtsAudio: cached.has(msg.listKey),\n }\n : undefined,\n imageDataUrls: msg.imageDataUrls,\n },\n items: [],\n };\n turns.push(currentTurn);\n } else {\n // Ha nincs még turn (prompt nélküli üzenetek), csinálunk egy üres prompt turn-t\n if (!currentTurn) {\n currentTurn = {\n promptText: '',\n promptListKey: `__no-prompt-${turns.length}`,\n items: [],\n };\n turns.push(currentTurn);\n }\n const item: CC_ConsoleDisplayItem_Interface = {\n listKey: msg.listKey,\n messageType: msg.type,\n text: msg.text,\n isStatus: msg.isStatus,\n expandableContent: msg.expandableContent,\n isLatestMessage: false,\n rawData: msg.rawData,\n timestamp: msg.timestamp,\n subtype: msg.subtype,\n parentAgentId: msg.parentAgentId,\n };\n\n // Tool név és leírás kinyerése (tool típusú item-ekhez)\n if (msg.type === 'tool') {\n item.toolName = this.extractToolNameFromMsg(msg);\n item.toolDescription = this.extractToolDescription(msg.rawData);\n }\n\n currentTurn.items.push(item);\n }\n }\n\n // Az utolsó item megjelölése (run-intent prefix logikához)\n if (turns.length) {\n const lastTurn: ChatTurn_Interface = turns[turns.length - 1];\n if (lastTurn.items.length) {\n lastTurn.items[lastTurn.items.length - 1].isLatestMessage = true;\n }\n }\n\n // Státusz szűrés: ha a hisztori ki van kapcsolva, csak az utolsó státusz marad a turn-ben\n if (!showStatusHistory) {\n for (const turn of turns) {\n let lastStatusIndex: number = -1;\n for (let i: number = turn.items.length - 1; i >= 0; i--) {\n if (turn.items[i].isStatus) {\n lastStatusIndex = i;\n break;\n }\n }\n // Csak az utolsó státuszt hagyjuk meg, a többit kiszűrjük\n if (lastStatusIndex >= 0) {\n turn.items = turn.items.filter(\n (item: CC_ConsoleDisplayItem_Interface, idx: number): boolean =>\n !item.isStatus || idx === lastStatusIndex,\n );\n }\n }\n }\n\n // Tool use ↔ tool result párosítás (id → tool_use_id alapján egy blokkba vonás)\n for (const turn of turns) {\n turn.items = this.pairToolCallsWithResults(turn.items);\n }\n\n // Sub-agent csoportosítás (Agent tool_use + utána jövő event-ek → sub-agent-group)\n for (const turn of turns) {\n turn.items = this.groupSubAgentItems(turn.items);\n }\n\n // Egymás után következő azonos tool hívások csoportosítása (fő szint + sub-agent belső)\n for (const turn of turns) {\n turn.items = this.groupConsecutiveToolItems(turn.items);\n }\n\n // Közös buborék: egyszerű típusok + TTS user/assistant-re.\n for (const turn of turns) {\n turn.items = turn.items.map(\n (it: CC_ConsoleDisplayItem_Interface): CC_ConsoleDisplayItem_Interface => {\n const useBubble: boolean =\n it.messageType === 'assistant'\n || it.messageType === 'error'\n || it.messageType === 'tool-result'\n || it.messageType === 'info';\n if (!useBubble) {\n return it;\n }\n const bv: CCAP_AgentConsoleBubbleView_Interface =\n CC_CcConsoleToBubbleView_Util.fromDisplayItem(it);\n if (it.messageType === 'assistant' && it.text.trim().length > 0) {\n bv.tts = {\n messageKey: it.listKey,\n sessionId: sid,\n role: 'assistant',\n content: it.text,\n timestampIso: it.timestamp ?? new Date().toISOString(),\n hasTtsAudio: cached.has(it.listKey),\n };\n }\n return { ...it, bubbleView: bv };\n },\n );\n }\n\n return turns;\n },\n );\n\n /**\n * Aktuálisan a sticky header-ben mutatott prompt (viewport felett az utolsó user prompt).\n * promptListKey: DOM azonosító a scroll-to-hoz; promptText: megjelenített szöveg.\n * null, ha nincs sticky prompt (pl. még nem görgettünk le, vagy nincs prompt).\n */\n readonly stickyPromptInfo_$ = signal<{ promptListKey: string; promptText: string } | null>(null);\n\n /**\n * Legutolsó user prompt szöveg (fallback — ha a dinamikus sticky még nem állt be).\n */\n readonly lastPromptText_$: Signal<string> = computed((): string => {\n const info: { promptListKey: string; promptText: string } | null = this.stickyPromptInfo_$();\n return info?.promptText ?? '';\n });\n\n /** Session status hisztori megjelenítés (parent-től kapott input). */\n readonly isShowSessionStatus = input<boolean>(false);\n\n /** Agent update (CLI system event) megjelenítés (parent-től kapott input). */\n readonly isShowAgentUpdates = input<boolean>(true);\n\n /** Sticky prompt mutatása (ha a chat aljánál vagyunk, nem kell). */\n readonly isShowStickyPrompt_$ = signal<boolean>(false);\n\n /** Info popup nyitva/zárva (raw event adat megjelenítéshez). */\n readonly isInfoPopupOpen_$ = signal<boolean>(false);\n\n /** Info popup — összesített raw (tool + párosított result + stream chunk-ok). */\n readonly infoPopupBundle_$ = signal<CCAP_AgentConsoleRawOverlayBundle_Interface | null>(null);\n\n /** Info popup címsor (az üzenet típusa). */\n readonly infoPopupTitle_$ = signal<string>('');\n\n /** Copy feedback (rövid ideig 'Copied!' megjelenítéshez). */\n readonly isInfoCopied_$ = signal<boolean>(false);\n\n /** Copy last 30 events feedback. */\n readonly isLast30Copied_$ = signal<boolean>(false);\n\n @ViewChild('chatScroll') chatScrollRef?: ElementRef<HTMLDivElement>;\n\n /** Session input komponens referencia (clearAttachments híváshoz küldés után). */\n @ViewChild('sessionInput') sessionInputRef?: S_SessionInput_Component;\n\n /** Pending attachment-ek — session input komponens attachmentsChanged event-jéből. */\n readonly pendingAttachments_$: WritableSignal<CCAP_PendingAttachment_Interface[]> =\n signal<CCAP_PendingAttachment_Interface[]>([]);\n\n private previousItemCount: number = 0;\n\n constructor() {\n // SessionId változásakor a mentett prompt piszkozat betöltése localStorage-ból\n effect((): void => {\n const id: string = this.sessionId();\n if (id) {\n const draft: string = CC_InputStorage_Util.loadPromptDraft(id);\n this.promptInput_$.set(draft);\n this.sessionQueue_DS.subscribeToSession({\n sessionId: id,\n baseRoute: 'cc-session',\n });\n }\n }, { allowSignalWrites: true });\n }\n\n /**\n * Komponens destroy: queue leiratkozás.\n * A sessionQueue_DS singleton — activeSessionId-t töröljük, hogy socket event-ek ne\n * kerüljenek feldolgozásra egy nem aktív session-re (filter: payloadSessionId !== activeSessionId).\n */\n ngOnDestroy(): void {\n this.sessionQueue_DS.unsubscribe();\n }\n\n ngAfterViewChecked(): void {\n // Auto-scroll ha engedélyezve és új tartalom érkezett.\n // A chat-ben vagy assembled path (assembledMessages_$), vagy fallback (consoleMessages_$) rajzol —\n // a scroll triggert mindkét forrás hossza befolyásolhatja, ezért összegezzük.\n const assembled: CCAP_ExtSessionMessage_Response[] = this.ccSession_DS.assembledMessages_$();\n const console: CcSessionConsoleMessage_Interface[] = this.ccSession_DS.consoleMessages_$();\n const currentCount: number = assembled.length + console.length;\n if (this.isAutoScroll_$() && currentCount > this.previousItemCount) {\n this.scrollToBottom();\n }\n this.previousItemCount = currentCount;\n }\n\n /**\n * Prompt küldése (szöveggel és/vagy csatolt képpel).\n *\n * REQ-CC-INPUT-CLEAR-001 (cycle 189): a localStorage piszkozat-törlés most a send\n * INDULÁSÁNÁL fut le, NEM a sikeres `await` után. Ezzel a user-flow:\n * 1. user üzenetet ír → savePromptDraft localStorage-ba (handlePromptInputChange)\n * 2. user nyom send-et → clearPromptDraft IMMEDIATELY + await sendPrompt indul\n * 3. user navigál máshol a wait alatt → komponens unmount; az in-memory\n * promptInput_$ a régi komponensben marad (detached, nem látszik)\n * 4. user visszanavigál → új komponens mount → effect olvas localStorage-ot\n * → üres draft → input mező üres ✅ (korábban itt látta a \"stuck\" üzenetet)\n *\n * Hiba esetén az in-memory `content`-ből visszaírjuk a localStorage-ot, hogy\n * a user retry-jánál ne vesszen el a draft (esetleg már új komponensen van).\n * Az `await` sikeres ágán a memóriabeli signal + attachments is törlődik.\n */\n async handleSendPrompt(): Promise<void> {\n const content: string = this.promptInput_$().trim();\n const attachments: CCAP_PendingAttachment_Interface[] = this.pendingAttachments_$();\n // Legalább szöveg vagy attachment szükséges a küldéshez\n if ((!content && !attachments.length) || this.isSending_$()) {\n return;\n }\n\n const sessionId: string = this.sessionId();\n if (!sessionId) {\n return;\n }\n\n this.isSending_$.set(true);\n // REQ-CC-INPUT-CLEAR-001: localStorage azonnal — kontextusváltás esetén\n // a visszanavigálásnál üres input mezőt látjon a user (ne stuck üzenetet).\n CC_InputStorage_Util.clearPromptDraft(sessionId);\n\n try {\n await this.ccSession_DS.sendPrompt({\n sessionId: sessionId,\n content: content,\n attachments: attachments.length > 0 ? attachments : undefined,\n });\n // Sikeres küldés → in-memory state is törölhető (a localStorage már üres)\n this.promptInput_$.set('');\n this.sessionInputRef?.clearAttachments();\n } catch {\n // Hiba — a draft-ot visszaírjuk localStorage-ba, hogy a retry-nál (akár új\n // komponensen, akár ugyanezen) megmaradjon a tartalom.\n // (A data service már console error message-et küld; az `isSending_$` a\n // finally-ben false-ra áll.)\n CC_InputStorage_Util.savePromptDraft(sessionId, content);\n } finally {\n this.isSending_$.set(false);\n }\n }\n\n /**\n * Attachment lista változás kezelése (session input komponenstől).\n */\n handleAttachmentsChanged(attachments: CCAP_PendingAttachment_Interface[]): void {\n this.pendingAttachments_$.set(attachments);\n }\n\n /**\n * Prompt input változás kezelése — mentés localStorage-ba.\n */\n handlePromptInputChange(value: string): void {\n this.promptInput_$.set(value);\n const sessionId: string = this.sessionId();\n if (sessionId) {\n CC_InputStorage_Util.savePromptDraft(sessionId, value);\n }\n }\n\n /**\n * QuickCast overlay akció: a választott szöveget azonnal a CC sessionbe küldjük\n * (sendPrompt) a piszkozat-mező felülírása nélkül. Hiba esetén a data-service\n * már naplózza a hibát; itt csak a busy/sending flag-et tartjuk konzisztensen.\n */\n async handleQuickCastAction(text: string): Promise<void> {\n const trimmed: string = text.trim();\n const sessionId: string = this.sessionId();\n if (!trimmed || !sessionId || this.isSending_$()) {\n return;\n }\n this.isSending_$.set(true);\n try {\n await this.ccSession_DS.sendPrompt({\n sessionId: sessionId,\n content: trimmed,\n });\n } finally {\n this.isSending_$.set(false);\n }\n }\n\n /**\n * Voice szegmens transcribe: akkumuláció + auto-send csak isFinal=true esetén.\n */\n handleVoiceSegment(event: { text: string; isFinal: boolean }): void {\n const t: string = event.text.trim();\n if (!t.length) {\n return;\n }\n const current: string = this.promptInput_$().trim();\n const next: string = current.length > 0 ? `${current} ${t}` : t;\n this.handlePromptInputChange(next);\n if (this.voiceInputUi_DS.autoSendAfterVoice_$() && event.isFinal) {\n void this.handleSendPrompt();\n }\n }\n\n /**\n * Cycle 815 — Restart Runner gomb klikk a Quick Settings overlay-ből.\n * Backend endpoint: cycle 784 (POST /cc-session/:id/runner-restart).\n * `claudeCode_DS.restartRunner` info / error chat-bubble-be írja az eredményt.\n */\n handleRestartRunnerClicked(): void {\n const sid: string = this.sessionId().trim();\n if (!sid) {\n return;\n }\n void this.ccSession_DS.restartRunner({ sessionId: sid });\n }\n\n /**\n * Plan elfogadás kezelése (ExitPlanMode tool event → explicit \"plan approved, proceed\"\n * prompt küldés a session-nek). REQ-CC-PLAN-APPROVE-MSG-001: a régi `\"yes\"` helyett\n * explicitebb, audit-logban + history-ben jól olvasható szöveg.\n */\n handlePlanAccepted(): void {\n const sessionId: string = this.sessionId();\n if (!sessionId) {\n return;\n }\n this.ccSession_DS.sendPrompt({\n sessionId: sessionId,\n content: 'plan approved, proceed',\n }).catch((err: unknown): void => {\n DyFM_Log.error('[CCAP] cc-console plan-accept send', err);\n });\n }\n\n /**\n * Enter billentyű kezelése a prompt input mezőben.\n */\n handleKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n this.handleSendPrompt();\n }\n }\n\n /**\n * Mód kiválasztása — mentés localStorage-ba + API hívás az aktív session-re + dropdown bezárás.\n */\n handleSelectMode(mode: string): void {\n this.selectedMode_$.set(mode);\n CC_InputStorage_Util.saveSessionMode(mode);\n\n const sessionId: string = this.sessionId();\n if (sessionId) {\n this.ccSession_DS.updateSessionConfig({\n sessionId: sessionId,\n mode: mode,\n }).catch((err: unknown): void => { DyFM_Log.error('[CCAP] cc-session-console config-update mode', err); });\n }\n }\n\n /**\n * Effort kiválasztása — mentés localStorage-ba + API hívás az aktív session-re.\n */\n handleSelectEffort(effort: string): void {\n this.selectedEffort_$.set(effort);\n CC_InputStorage_Util.saveSessionEffort(effort);\n\n const sessionId: string = this.sessionId();\n if (sessionId) {\n this.ccSession_DS.updateSessionConfig({\n sessionId: sessionId,\n reasoningEffort: effort,\n }).catch((err: unknown): void => { DyFM_Log.error('[CCAP] cc-session-console config-update effort', err); });\n }\n }\n\n /**\n * Model kiválasztása — mentés localStorage-ba + API hívás az aktív session-re.\n */\n handleSelectModel(model: string): void {\n this.selectedModel_$.set(model);\n CC_InputStorage_Util.saveSessionModel(model);\n\n const sessionId: string = this.sessionId();\n if (sessionId) {\n this.ccSession_DS.updateSessionConfig({\n sessionId: sessionId,\n model: model,\n }).catch((err: unknown): void => { DyFM_Log.error('[CCAP] cc-session-console config-update model', err); });\n }\n }\n\n /**\n * Chat scroll event kezelése — sticky prompt megjelenítés + auto-scroll állapot frissítése.\n * Ha a user az aljánál van (threshold: 60px), auto-scroll bekapcsol;\n * ha feljebb görgetett, auto-scroll kikapcsol, hogy ne ugráljon vissza.\n */\n handleChatScroll(): void {\n const el: HTMLDivElement | undefined = this.chatScrollRef?.nativeElement;\n if (!el) {\n return;\n }\n\n // Sticky prompt: a viewport teteje felett lévő utolsó user prompt meghatározása\n this.updateStickyPrompt(el);\n\n // Auto-scroll: ha a user az aljánál van, engedélyezzük; ha feljebb görgetett, kikapcsoljuk\n const isAtBottom: boolean = el.scrollHeight - el.scrollTop - el.clientHeight < 60;\n this.isAutoScroll_$.set(isAtBottom);\n\n // Scroll-top detection: régebbi üzenetek betöltése ha felgörgettek a tetejéig\n const isAtTop: boolean = el.scrollTop < 40;\n if (isAtTop && this.ccSession_DS.assembledMessagesHasMore_$()) {\n void this.loadOlderMessages(el);\n }\n }\n\n /**\n * Sticky prompt frissítése a scroll pozíció alapján.\n * Végigiterál a `[data-prompt-key]` DOM elemeken, és az utolsó olyat választja,\n * amelynek teteje a scroll konténer viewport-ja felett van (el-görgették).\n *\n * BUG-SES-LOCKED-MSG-VIBRATE-001 (cycle 441): hysteresis a show/hide\n * határvonal között — különben a sticky-render layout-shift-je oda-vissza\n * triggerelte a show/hide állapotot (vibration). Két threshold:\n * - Show: `rect.bottom < viewportTop - 8` (clearly out)\n * - Hide: `rect.bottom > viewportTop + 24` (clearly back in view)\n * Köztes „bizonytalansági\" zónában megőrizzük az aktuális állapotot —\n * a layout-shift okozta apró pixel-ingadozás már nem trigger-eli a flip-et.\n */\n private updateStickyPrompt(el: HTMLDivElement): void {\n const isScrolledDown: boolean = el.scrollTop > 80;\n if (!isScrolledDown) {\n this.isShowStickyPrompt_$.set(false);\n this.stickyPromptInfo_$.set(null);\n return;\n }\n\n // A konténer bounding rect-je a viewport-on belüli pozíciót adja\n const containerRect: DOMRect = el.getBoundingClientRect();\n // A viewport teteje: a konténer tetejéhez képest 50px-el lejjebb (sticky header magasság kompenzáció)\n const viewportTop: number = containerRect.top + 50;\n\n const promptEls: NodeListOf<HTMLElement> = el.querySelectorAll('[data-prompt-key]');\n const isCurrentlyShown: boolean = this.isShowStickyPrompt_$();\n // Hysteresis pufferek: 8px / 24px — a sticky-render 50px-es layout-shift-jén\n // belül stabil állapotot tart.\n const showThreshold: number = viewportTop - 8;\n const hideThreshold: number = viewportTop + 24;\n let found: { promptListKey: string; promptText: string } | null = null;\n\n // Visszafelé iterálunk: az utolsó elem, aminek az alja a viewport teteje felett van\n for (let i: number = promptEls.length - 1; i >= 0; i--) {\n const promptEl: HTMLElement = promptEls[i];\n const rect: DOMRect = promptEl.getBoundingClientRect();\n // Hysteresis: ha már shown, lazább threshold (hideThreshold); ha még hidden, szigorúbb (showThreshold).\n const threshold: number = isCurrentlyShown ? hideThreshold : showThreshold;\n if (rect.bottom < threshold) {\n const key: string = promptEl.getAttribute('data-prompt-key') ?? '';\n const text: string = promptEl.getAttribute('data-prompt-text') ?? '';\n if (key && text) {\n found = { promptListKey: key, promptText: text };\n }\n break;\n }\n }\n\n this.stickyPromptInfo_$.set(found);\n this.isShowStickyPrompt_$.set(!!found);\n }\n\n /**\n * Sticky prompt kattintás: görgetés a kiválasztott prompt pozíciójához.\n */\n handleStickyPromptClick(): void {\n const info: { promptListKey: string; promptText: string } | null = this.stickyPromptInfo_$();\n if (!info) {\n return;\n }\n const el: HTMLDivElement | undefined = this.chatScrollRef?.nativeElement;\n if (!el) {\n return;\n }\n const promptEl: HTMLElement | null = el.querySelector(`[data-prompt-key=\"${info.promptListKey}\"]`);\n if (!promptEl) {\n return;\n }\n // A prompt tetejét a sticky threshold (50px) alá pozícionáljuk + 8px padding,\n // hogy a prompt biztosan látható legyen és ne kerüljön a sticky detection zónába\n const containerRect: DOMRect = el.getBoundingClientRect();\n const promptRect: DOMRect = promptEl.getBoundingClientRect();\n const stickyThreshold: number = 58;\n el.scrollTop += promptRect.top - containerRect.top - stickyThreshold;\n }\n\n /**\n * Régebbi üzenetek betöltése és scroll pozíció megőrzés.\n * A betöltés előtti scrollHeight-et rögzítjük, és a prepend után a különbséggel\n * kompenzáljuk a scrollTop-ot, hogy a felhasználó ne ugorjon el.\n */\n private async loadOlderMessages(el: HTMLDivElement): Promise<void> {\n const sessionId: string = this.sessionId();\n if (!sessionId) {\n return;\n }\n\n const prevScrollHeight: number = el.scrollHeight;\n await this.ccSession_DS.loadOlderAssembledMessages({\n sessionId: sessionId,\n });\n\n // Scroll pozíció kompenzálás a prepend-elt tartalom magasságával\n requestAnimationFrame((): void => {\n const newScrollHeight: number = el.scrollHeight;\n el.scrollTop = newScrollHeight - prevScrollHeight;\n // Sticky prompt frissítése az újonnan renderelt prompt elemekkel\n requestAnimationFrame((): void => {\n this.updateStickyPrompt(el);\n });\n });\n }\n\n /**\n * Info popup megnyitása egy üzenet raw event adatával.\n */\n handleOpenInfoPopup(item: CC_ConsoleDisplayItem_Interface): void {\n if (!SHR_AgentConsoleRawOverlay_Util.ccItemHasAnyRaw(item)) {\n return;\n }\n this.infoPopupTitle_$.set(item.messageType);\n this.infoPopupBundle_$.set(SHR_AgentConsoleRawOverlay_Util.buildForCcConsoleItem(item));\n this.isInfoPopupOpen_$.set(true);\n }\n\n /**\n * Párosított tool-result ⓘ — ugyanaz a popup, mint a fő ⓘ: mindkét raw együtt.\n */\n handleOpenPairedResultInfo(item: CC_ConsoleDisplayItem_Interface): void {\n this.handleOpenInfoPopup(item);\n }\n\n /**\n * Info popup bezárása.\n */\n handleCloseInfoPopup(): void {\n this.isInfoPopupOpen_$.set(false);\n this.infoPopupBundle_$.set(null);\n this.isInfoCopied_$.set(false);\n this.isLast30Copied_$.set(false);\n }\n\n /**\n * Info popup tartalmának vágólapra másolása (JSON formázva).\n */\n handleCopyInfoPopup(): void {\n const bundle: CCAP_AgentConsoleRawOverlayBundle_Interface | null = this.infoPopupBundle_$();\n if (!bundle) {\n return;\n }\n navigator.clipboard.writeText(bundle.copyJsonString).then((): void => {\n this.isInfoCopied_$.set(true);\n setTimeout((): void => {\n this.isInfoCopied_$.set(false);\n }, 2000);\n }).catch((err: unknown): void => { DyFM_Log.error('[CCAP] cc-session-console clipboard-copy', err); });\n }\n\n /**\n * Utolsó 30 assembled event másolása a vágólapra (JSON formázva).\n * Az assembled messages SSOT listából az utolsó 30 elemet veszi,\n * sequence szerint rendezve, a teljes message payloaddal.\n */\n handleCopyLast30Events(): void {\n const assembled: CCAP_ExtSessionMessage_Response[] =\n this.ccSession_DS.assembledMessages_$();\n const last30: CCAP_ExtSessionMessage_Response[] = assembled.slice(-30);\n const jsonString: string = JSON.stringify(last30, null, 2);\n navigator.clipboard.writeText(jsonString).then((): void => {\n this.isLast30Copied_$.set(true);\n setTimeout((): void => {\n this.isLast30Copied_$.set(false);\n }, 2000);\n }).catch((err: unknown): void => { DyFM_Log.error('[CCAP] cc-session-console clipboard-copy-last30', err); });\n }\n\n /**\n * Tool use és tool result párosítása id ↔ tool_use_id alapján.\n * A párosított tool-result item-ek a tool item pairedResult mezőjébe kerülnek,\n * és önálló item-ként eltávolításra kerülnek a listából.\n */\n private pairToolCallsWithResults(items: CC_ConsoleDisplayItem_Interface[]): CC_ConsoleDisplayItem_Interface[] {\n // Pass 1: tool use ID → item index mapping\n const toolIdToIndex: Map<string, number> = new Map();\n for (let i: number = 0; i < items.length; i++) {\n const item: CC_ConsoleDisplayItem_Interface = items[i];\n if (item.messageType === 'tool' && item.rawData) {\n const toolId: string = typeof item.rawData.id === 'string'\n ? item.rawData.id\n : '';\n if (toolId) {\n toolIdToIndex.set(toolId, i);\n }\n }\n }\n\n if (!toolIdToIndex.size) {\n return items;\n }\n\n // Pass 2: tool-result párosítás\n const pairedIndices: Set<number> = new Set();\n for (let i: number = 0; i < items.length; i++) {\n const item: CC_ConsoleDisplayItem_Interface = items[i];\n if (item.messageType === 'tool-result' && item.rawData) {\n const toolUseId: string = typeof item.rawData.tool_use_id === 'string'\n ? item.rawData.tool_use_id\n : '';\n const toolIndex: number | undefined = toolUseId\n ? toolIdToIndex.get(toolUseId)\n : undefined;\n\n if (toolIndex !== undefined) {\n items[toolIndex].pairedResult = {\n text: item.text,\n expandableContent: item.expandableContent,\n rawData: item.rawData,\n };\n pairedIndices.add(i);\n }\n }\n }\n\n // Pass 3: párosított tool-result item-ek eltávolítása\n if (!pairedIndices.size) {\n return items;\n }\n return items.filter(\n (_: CC_ConsoleDisplayItem_Interface, idx: number): boolean => !pairedIndices.has(idx),\n );\n }\n\n /**\n * Tool név kinyerése egy console message-ből (rawData.name fallback: text ':' előtti rész).\n */\n private extractToolNameFromMsg(msg: CcSessionConsoleMessage_Interface): string {\n if (msg.rawData) {\n const name: unknown = msg.rawData.name ?? msg.rawData.tool_name ?? msg.rawData.last_tool_name;\n if (typeof name === 'string') {\n return name;\n }\n }\n const colonIdx: number = msg.text.indexOf(':');\n return colonIdx > 0 ? msg.text.substring(0, colonIdx).trim() : msg.text.trim();\n }\n\n /**\n * Tool description kinyerése rawData.input.description-ből.\n */\n private extractToolDescription(rawData: Record<string, unknown> | undefined): string | undefined {\n if (!rawData) {\n return undefined;\n }\n const inputObj: unknown = rawData['input'];\n if (!inputObj || typeof inputObj !== 'object') {\n return undefined;\n }\n const desc: unknown = (inputObj as Record<string, unknown>)['description'];\n return typeof desc === 'string' ? desc : undefined;\n }\n\n /**\n * Tool név kinyerése egy tool típusú item-ből.\n * Előbb item.toolName (ha már kiszámoltuk), majd rawData.name, fallback: text kettőspont előtti rész.\n */\n private extractToolName(item: CC_ConsoleDisplayItem_Interface): string {\n if (item.toolName) {\n return item.toolName;\n }\n if (item.rawData) {\n const name: unknown = item.rawData.name ?? item.rawData.tool_name ?? item.rawData.last_tool_name;\n if (typeof name === 'string') {\n return name;\n }\n }\n const colonIdx: number = item.text.indexOf(':');\n return colonIdx > 0 ? item.text.substring(0, colonIdx).trim() : item.text.trim();\n }\n\n /**\n * Sub-agent csoportosítás ID alapján: Agent tool_use item-ek + a parentAgentId-vel\n * megcímkézett event-ek → egyetlen sub-agent-group item.\n * Párhuzamos sub-agent-ek esetén is korrekt: parentAgentId alapján rendeli az event-eket.\n * A csoport belső item-jeire is lefut a tool gruppozás.\n */\n private groupSubAgentItems(items: CC_ConsoleDisplayItem_Interface[]): CC_ConsoleDisplayItem_Interface[] {\n // Pass 1: Agent tool item-ek azonosítása (id → item + index)\n const agentItems: Map<string, {\n item: CC_ConsoleDisplayItem_Interface;\n index: number;\n }> = new Map();\n\n for (let i: number = 0; i < items.length; i++) {\n const item: CC_ConsoleDisplayItem_Interface = items[i];\n if (item.messageType === 'tool' && item.toolName === 'Agent' && item.rawData) {\n const agentId: string = typeof item.rawData.id === 'string'\n ? item.rawData.id\n : '';\n if (agentId) {\n agentItems.set(agentId, { item: item, index: i });\n }\n }\n }\n\n if (!agentItems.size) {\n return items;\n }\n\n // Pass 2: event-ek begyűjtése agent-enként parentAgentId alapján.\n // REQ-CC-SUBAGENT-001: minden `parentAgentId`-vel rendelkező event consumedIndices-ba kerül\n // (akkor is, ha a parent agent nem volt felismerve Pass 1-ben) — így nem szivárog ki top-level\n // render-re. Felismert parent esetén a megfelelő sub-agent csoportba kerül; ismeretlen parent\n // orphan eseménye láthatatlan marad (user-request: subagent event-ek csak a blokkon belül).\n const agentChildren: Map<string, CC_ConsoleDisplayItem_Interface[]> = new Map();\n const consumedIndices: Set<number> = new Set();\n\n for (let i: number = 0; i < items.length; i++) {\n const item: CC_ConsoleDisplayItem_Interface = items[i];\n if (!item.parentAgentId) {\n continue;\n }\n consumedIndices.add(i);\n if (agentItems.has(item.parentAgentId)) {\n const children: CC_ConsoleDisplayItem_Interface[] =\n agentChildren.get(item.parentAgentId) ?? [];\n children.push(item);\n agentChildren.set(item.parentAgentId, children);\n }\n }\n\n // Pass 3: Agent tool item-ek + gyerekek → sub-agent-group\n const result: CC_ConsoleDisplayItem_Interface[] = [];\n for (let i: number = 0; i < items.length; i++) {\n if (consumedIndices.has(i)) {\n continue;\n }\n\n const item: CC_ConsoleDisplayItem_Interface = items[i];\n\n // Agent tool_use → csoportba vonás a gyerekeivel\n if (item.messageType === 'tool' && item.toolName === 'Agent' && item.rawData) {\n const agentId: string = typeof item.rawData.id === 'string'\n ? item.rawData.id\n : '';\n const children: CC_ConsoleDisplayItem_Interface[] = agentChildren.get(agentId) ?? [];\n const subItems: CC_ConsoleDisplayItem_Interface[] = [item, ...children];\n\n // Sub-agent leírás kinyerése\n const inputObj: unknown = item.rawData?.['input'];\n const subagentType: string = (inputObj && typeof inputObj === 'object')\n ? (typeof (inputObj as Record<string, unknown>)['subagent_type'] === 'string'\n ? (inputObj as Record<string, unknown>)['subagent_type'] as string\n : '')\n : '';\n const description: string = (inputObj && typeof inputObj === 'object')\n ? (typeof (inputObj as Record<string, unknown>)['description'] === 'string'\n ? (inputObj as Record<string, unknown>)['description'] as string\n : '')\n : '';\n const groupLabel: string = subagentType\n ? `${subagentType}: ${description || '...'}`\n : description || 'Sub-agent';\n\n // Belső tool csoportosítás\n const groupedSubItems: CC_ConsoleDisplayItem_Interface[] =\n this.groupConsecutiveToolItems(subItems);\n\n result.push({\n listKey: item.listKey,\n messageType: 'sub-agent-group',\n text: groupLabel,\n isStatus: false,\n isLatestMessage: false,\n groupItems: groupedSubItems,\n groupToolName: subagentType || 'Agent',\n });\n } else {\n result.push(item);\n }\n }\n\n return result;\n }\n\n /**\n * Assembled message-ekből turn-ök építése (SSOT path).\n * Tool pairing már szerveren megtörtént — `pairToolCallsWithResults` kihagyva.\n * Sub-agent és consecutive tool grouping továbbra is kliens-oldali (UI concern).\n */\n private buildTurnsFromAssembledMessages(\n assembled: CCAP_ExtSessionMessage_Response[],\n ): ChatTurn_Interface[] {\n const showStatusUpdates: boolean = this.isShowAgentUpdates();\n const showStatusHistory: boolean = this.isShowSessionStatus();\n const sid: string = this.sessionId();\n const cached: Set<string> = this.ttsCachedKeys_$();\n const turns: ChatTurn_Interface[] = [];\n let currentTurn: ChatTurn_Interface | null = null;\n\n for (const msg of assembled) {\n // Status update szűrés — task_progress tool event-ek nem szűrhetőek\n // (tool hívások mindig látszanak, ahogy a tool_use/tool_result event-ek is)\n const isTaskProgressToolMsg: boolean =\n msg.messageRole === 'status-update'\n && msg.subtype === 'task_progress'\n && !!msg.rawData?.last_tool_name;\n if (msg.messageRole === 'status-update' && !showStatusUpdates && !isTaskProgressToolMsg) {\n continue;\n }\n\n if (msg.messageRole === 'user' && msg.isUserAligned === true) {\n // Új turn indítása user prompt-tal\n currentTurn = {\n promptText: msg.bodyText,\n promptListKey: msg.messageKey,\n promptBubbleView: {\n listKey: msg.messageKey,\n kind: CCAP_AgentConsoleBubbleKind_Type.userPrompt,\n bodyText: msg.bodyText,\n timestampIso: msg.timestamp,\n isUserAligned: true,\n rawData: msg.rawData,\n flags: {\n showCopy: true,\n showRawInfo: !!msg.rawData,\n useEditDiffForExpandable: false,\n },\n tts: msg.bodyText.trim().length > 0\n ? {\n messageKey: msg.messageKey,\n sessionId: sid,\n role: 'user',\n content: msg.bodyText,\n timestampIso: msg.timestamp,\n hasTtsAudio: cached.has(msg.messageKey),\n }\n : undefined,\n },\n items: [],\n };\n turns.push(currentTurn);\n } else {\n if (!currentTurn) {\n currentTurn = {\n promptText: '',\n promptListKey: `__no-prompt-${turns.length}`,\n items: [],\n };\n turns.push(currentTurn);\n }\n\n // Assembled message → display item konverzió\n // task_progress + last_tool_name: régi assembled message-ek statusUpdate role-lal\n // érkezhetnek a DB-ből — kliensen tool-ként kell megjeleníteni (shared tool card)\n const lastToolName: string =\n msg.rawData && typeof msg.rawData.last_tool_name === 'string'\n ? msg.rawData.last_tool_name\n : '';\n const isTaskProgressTool: boolean =\n msg.messageRole === 'status-update'\n && msg.subtype === 'task_progress'\n && !!lastToolName;\n const effectiveRole: string = isTaskProgressTool\n ? 'tool'\n : msg.messageRole;\n const isStatus: boolean =\n effectiveRole === 'status'\n || effectiveRole === 'status-update';\n const messageType: CC_ConsoleDisplayItem_Interface['messageType'] =\n CC_Console_Component.mapAssembledRoleToMessageType(effectiveRole);\n const item: CC_ConsoleDisplayItem_Interface = {\n listKey: msg.messageKey,\n messageType: messageType,\n text: isTaskProgressTool\n ? `${lastToolName}: ${msg.bodyText}`\n : msg.bodyText,\n isStatus: isStatus,\n expandableContent: msg.expandableContent,\n isLatestMessage: false,\n rawData: msg.rawData,\n timestamp: msg.timestamp,\n subtype: msg.subtype,\n parentAgentId: msg.parentAgentId,\n toolName: msg.toolName || (isTaskProgressTool ? lastToolName : undefined),\n toolDescription: messageType === 'tool' ? this.extractToolDescription(msg.rawData) : undefined,\n };\n\n // Szerveren párosított tool result → display item pairedResult\n if (msg.toolResult) {\n item.pairedResult = {\n text: msg.toolResult.text,\n expandableContent: msg.toolResult.expandableContent,\n rawData: msg.toolResult.rawData,\n isError: msg.toolResult.isError,\n };\n }\n\n currentTurn.items.push(item);\n }\n }\n\n // Utolsó item jelölés\n if (turns.length) {\n const lastTurn: ChatTurn_Interface = turns[turns.length - 1];\n if (lastTurn.items.length) {\n lastTurn.items[lastTurn.items.length - 1].isLatestMessage = true;\n }\n }\n\n // Státusz szűrés\n if (!showStatusHistory) {\n for (const turn of turns) {\n let lastStatusIndex: number = -1;\n for (let i: number = turn.items.length - 1; i >= 0; i--) {\n if (turn.items[i].isStatus) {\n lastStatusIndex = i;\n break;\n }\n }\n if (lastStatusIndex >= 0) {\n turn.items = turn.items.filter(\n (it: CC_ConsoleDisplayItem_Interface, idx: number): boolean =>\n !it.isStatus || idx === lastStatusIndex,\n );\n }\n }\n }\n\n // Tool pairing KIHAGYVA — szerveren megtörtént (toolResult már a message-ben)\n\n // Sub-agent csoportosítás (parentAgentId alapján)\n for (const turn of turns) {\n turn.items = this.groupSubAgentItems(turn.items);\n }\n\n // Consecutive tool grouping\n for (const turn of turns) {\n turn.items = this.groupConsecutiveToolItems(turn.items);\n }\n\n // Bubble view mapping (egyszerű típusok) + TTS user/assistant-re\n for (const turn of turns) {\n turn.items = turn.items.map(\n (it: CC_ConsoleDisplayItem_Interface): CC_ConsoleDisplayItem_Interface => {\n const useBubble: boolean =\n it.messageType === 'assistant'\n || it.messageType === 'error'\n || it.messageType === 'tool-result'\n || it.messageType === 'info';\n if (!useBubble) {\n return it;\n }\n const bv: CCAP_AgentConsoleBubbleView_Interface =\n CC_CcConsoleToBubbleView_Util.fromDisplayItem(it);\n if (it.messageType === 'assistant' && it.text.trim().length > 0) {\n bv.tts = {\n messageKey: it.listKey,\n sessionId: sid,\n role: 'assistant',\n content: it.text,\n timestampIso: it.timestamp ?? new Date().toISOString(),\n hasTtsAudio: cached.has(it.listKey),\n };\n }\n return { ...it, bubbleView: bv };\n },\n );\n }\n\n return turns;\n }\n\n /**\n * Egymás után következő azonos típusú tool hívások csoportosítása.\n * Bármely tool típusra: 2+ egymást követő azonos nevű tool+tool-result pár\n * egyetlen összecsukható csoportba kerül.\n */\n private groupConsecutiveToolItems(items: CC_ConsoleDisplayItem_Interface[]): CC_ConsoleDisplayItem_Interface[] {\n const result: CC_ConsoleDisplayItem_Interface[] = [];\n let pendingGroup: CC_ConsoleDisplayItem_Interface[] = [];\n let pendingToolName: string = '';\n\n // Csoport lezárása: 2+ tool hívás → tool-group, egyébként egyedi elemek\n const flushGroup = (): void => {\n if (!pendingGroup.length) {\n return;\n }\n const toolCount: number = pendingGroup.filter(\n (i: CC_ConsoleDisplayItem_Interface): boolean => i.messageType === 'tool',\n ).length;\n\n if (toolCount >= 2) {\n result.push({\n listKey: pendingGroup[0].listKey,\n messageType: 'tool-group',\n text: `${pendingToolName} × ${toolCount}`,\n isStatus: false,\n isLatestMessage: false,\n groupItems: pendingGroup,\n groupToolName: pendingToolName,\n });\n } else {\n result.push(...pendingGroup);\n }\n pendingGroup = [];\n pendingToolName = '';\n };\n\n for (const item of items) {\n // Tool hívás → csoportba gyűjtés (bármely tool típus)\n if (item.messageType === 'tool') {\n const toolName: string = this.extractToolName(item);\n // Ha másik tool típus jön mint az aktuális csoport, lezárjuk az előzőt\n if (pendingToolName && pendingToolName !== toolName) {\n flushGroup();\n }\n pendingToolName = toolName;\n pendingGroup.push(item);\n continue;\n }\n\n // Tool result: ha nyitott csoport van, hozzáadjuk\n if (item.messageType === 'tool-result' && pendingGroup.length) {\n pendingGroup.push(item);\n continue;\n }\n\n // Minden más → csoport lezárása + egyedi elem\n flushGroup();\n result.push(item);\n }\n\n flushGroup();\n return result;\n }\n\n /**\n * Assembled message role → CC console display item messageType mapping.\n * Ismeretlen role-ok 'info'-ra fallback-olnak.\n */\n private static mapAssembledRoleToMessageType(\n role: string,\n ): CC_ConsoleDisplayItem_Interface['messageType'] {\n switch (role) {\n case 'user': return 'prompt';\n case 'assistant': return 'assistant';\n case 'tool': return 'tool';\n case 'tool-result': return 'tool-result';\n case 'status': return 'status';\n case 'error': return 'error';\n case 'info': return 'info';\n case 'result': return 'result';\n case 'thinking': return 'thinking';\n case 'status-update': return 'status-update';\n default: return 'info';\n }\n }\n\n /**\n * Chat output aljára görgetés.\n */\n private scrollToBottom(): void {\n const element: HTMLDivElement | undefined = this.chatScrollRef?.nativeElement;\n if (element) {\n element.scrollTop = element.scrollHeight;\n }\n }\n}\n", "<!-- Sticky user prompt (a viewport felett lévő utolsó prompt — kattintásra odagörget) -->\n@if (isShowStickyPrompt_$()) {\n <div class=\"sticky top-0 z-10 px-4 py-2 bg-ccapBg/95 backdrop-blur-sm border-b border-neonCyan/20 shrink-0\n cursor-pointer hover:bg-ccapBg/80 transition-colors group/sticky\"\n (click)=\"handleStickyPromptClick()\">\n <div class=\"flex items-start gap-2\">\n <span class=\"text-[10px] text-neonCyan/70 font-medium mt-0.5 shrink-0\">YOU</span>\n <span class=\"text-xs text-neonCyan/90 line-clamp-2 leading-relaxed group-hover/sticky:text-neonCyan\">{{ lastPromptText_$() }}</span>\n <svg class=\"w-3 h-3 text-neonCyan/40 shrink-0 mt-0.5 group-hover/sticky:text-neonCyan/70 transition-colors\" viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M6 9V3M3 5.5L6 3l3 2.5\"/>\n </svg>\n </div>\n </div>\n}\n\n<!-- Reusable item renderer template -->\n<ng-template #itemRenderer let-item>\n @switch (item.messageType) {\n <!-- Tool call brief kártya (párosított result-tal ha van) -->\n @case ('tool') {\n <div class=\"flex justify-start mb-1.5\">\n <div class=\"bg-orange-500/5 border border-orange-500/15 rounded-lg max-w-[90%] overflow-hidden\">\n @if (item.toolName === 'TodoWrite' || item.toolName === 'ExitPlanMode') {\n <!-- Speciális tool: fejléc + dedikált tartalom -->\n <div class=\"flex items-center gap-1.5 px-2.5 py-1 border-b border-orange-500/10\">\n <span class=\"text-orange-400 shrink-0 flex items-center\" [innerHTML]=\"(item.toolName ?? '') | sAgentToolIcon\"></span>\n <span class=\"text-[11px] text-orange-300/90 font-medium\">{{ item.toolName === 'ExitPlanMode' ? 'Plan' : item.toolName }}</span>\n @if (item.rawData) {\n <button\n class=\"ml-auto shrink-0 w-4 h-4 rounded-full bg-orange-500/20 border border-orange-500/30 flex items-center justify-center cursor-pointer hover:bg-orange-500/40\"\n (click)=\"handleOpenInfoPopup(item)\">\n <span class=\"text-[8px] text-orange-300 font-bold leading-none\">i</span>\n </button>\n }\n </div>\n @if (item.toolName === 'ExitPlanMode') {\n <app-s-agent-tool-plan-view [rawData]=\"item.rawData\" (accepted)=\"handlePlanAccepted()\" />\n } @else {\n <app-s-agent-tool-todo-list [rawData]=\"item.rawData\" />\n }\n } @else {\n <app-s-agent-tool-call-card\n [toolName]=\"item.toolName ?? ''\"\n [summaryText]=\"item.text\"\n [toolDescription]=\"item.toolDescription ?? ''\"\n [isPathRtl]=\"item.toolName === 'Read'\"\n [showToolRawInfo]=\"!!item.rawData || !!item.pairedResult?.rawData\"\n [expandableContent]=\"item.expandableContent ?? ''\"\n [pairedResult]=\"item.pairedResult ?? null\"\n layout=\"full\"\n density=\"comfortable\"\n (toolRawInfoClick)=\"handleOpenInfoPopup(item)\"\n (pairedRawInfoClick)=\"handleOpenPairedResultInfo(item)\">\n </app-s-agent-tool-call-card>\n }\n </div>\n </div>\n }\n\n <!-- Csoportosított tool hívások (pl. Read × 5) -->\n @case ('tool-group') {\n <div class=\"flex justify-start mb-1.5\">\n <details open class=\"bg-orange-500/5 border border-orange-500/15 rounded-lg max-w-[90%] overflow-hidden\"\n >\n <summary class=\"flex items-center gap-1.5 px-2.5 py-1 cursor-pointer select-none hover:bg-orange-500/8 transition-colors\">\n <span class=\"text-orange-400 shrink-0 flex items-center\" [innerHTML]=\"item.groupToolName | sAgentToolIcon\"></span>\n <span class=\"text-[11px] text-orange-300/90 font-medium\">{{ item.text }}</span>\n <svg class=\"w-3 h-3 text-orange-400/50 ml-1 transition-transform [details[open]>&]:rotate-90\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M4.5 2.5l4 3.5-4 3.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </summary>\n <div class=\"px-2 pb-1.5 pt-0.5 space-y-0.5\">\n @for (groupItem of item.groupItems; track groupItem.listKey) {\n @if (groupItem.messageType === 'tool') {\n <app-s-agent-tool-call-card\n [toolName]=\"groupItem.toolName ?? ''\"\n [summaryText]=\"groupItem.text\"\n [toolDescription]=\"groupItem.toolDescription ?? ''\"\n [isPathRtl]=\"groupItem.toolName === 'Read'\"\n [showToolRawInfo]=\"!!groupItem.rawData || !!groupItem.pairedResult?.rawData\"\n [expandableContent]=\"groupItem.expandableContent ?? ''\"\n [pairedResult]=\"groupItem.pairedResult ?? null\"\n layout=\"nested\"\n density=\"compact\"\n (toolRawInfoClick)=\"handleOpenInfoPopup(groupItem)\"\n (pairedRawInfoClick)=\"handleOpenPairedResultInfo(groupItem)\">\n </app-s-agent-tool-call-card>\n }\n @if (groupItem.messageType === 'tool-result') {\n <div class=\"pl-5 mb-0.5\">\n <span class=\"text-[10px] text-neutral-500 line-clamp-1\">{{ groupItem.text }}</span>\n </div>\n }\n }\n </div>\n </details>\n </div>\n }\n\n <!-- Sub-agent csoport -->\n @case ('sub-agent-group') {\n <div class=\"mb-2\">\n <details class=\"border border-indigo-500/20 rounded-lg overflow-hidden bg-indigo-500/3\">\n <!-- Header: Sub-agent név -->\n <summary class=\"flex items-center gap-1.5 px-2.5 py-1.5 cursor-pointer select-none hover:bg-indigo-500/8 transition-colors list-none [&::-webkit-details-marker]:hidden group/sah\">\n <svg class=\"w-3.5 h-3.5 text-indigo-400 shrink-0\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"3\" y=\"5\" width=\"10\" height=\"8\" rx=\"2\"/>\n <circle cx=\"6\" cy=\"9\" r=\"1\"/><circle cx=\"10\" cy=\"9\" r=\"1\"/>\n <path d=\"M8 2v3\"/><path d=\"M6 2h4\"/>\n </svg>\n <span class=\"text-[10px] text-indigo-400/60 font-medium uppercase tracking-wider shrink-0\">Sub-agent</span>\n <span class=\"text-[11px] text-indigo-300/90 font-medium truncate\">{{ item.text }}</span>\n <span class=\"text-[9px] text-indigo-400/40 shrink-0\">{{ (item.groupItems?.length ?? 0) > 1 ? (item.groupItems!.length - 1) : 0 }}</span>\n <!-- REQ-CC-SUBAGENT-001: in-progress jelzés — amíg az Agent tool-nak nincs pairedResult-ja -->\n @if (!item.groupItems?.[0]?.pairedResult) {\n <span class=\"flex items-center gap-1 text-[10px] text-amber-300/90 shrink-0\"\n title=\"Sub-agent in progress — még nincs eredmény\">\n <span class=\"inline-block w-2 h-2 animate-spin rounded-full border border-amber-400/60 border-t-amber-200\"\n aria-hidden=\"true\"></span>\n <span class=\"uppercase tracking-wider\">running</span>\n </span>\n }\n @if (item.groupItems?.[0]?.rawData) {\n <button\n class=\"shrink-0 w-4 h-4 rounded-full bg-indigo-500/20 border border-indigo-500/30 flex items-center justify-center cursor-pointer hover:bg-indigo-500/40\"\n (click)=\"handleOpenInfoPopup(item.groupItems[0]); $event.stopPropagation()\">\n <span class=\"text-[8px] text-indigo-300 font-bold leading-none\">i</span>\n </button>\n }\n <svg class=\"w-3 h-3 text-indigo-400/40 ml-auto shrink-0 transition-transform [[open]>&]:rotate-90\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M4.5 2.5l4 3.5-4 3.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </summary>\n <!-- Sub-agent prompt brief (nyitható/zárható, a summary és a body között) -->\n @if (item.groupItems?.[0]?.pairedResult) {\n <details class=\"border-t border-indigo-500/10\" (click)=\"$event.stopPropagation()\">\n <summary class=\"flex items-center gap-1 px-2.5 py-1 bg-indigo-500/5 cursor-pointer select-none hover:bg-indigo-500/8 transition-colors list-none [&::-webkit-details-marker]:hidden\">\n <svg class=\"w-2.5 h-2.5 text-indigo-400/40 shrink-0 transition-transform [[open]>&]:rotate-90\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M4.5 2.5l4 3.5-4 3.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"text-[10px] text-indigo-300/40 truncate leading-relaxed\">{{ item.groupItems[0].pairedResult.text }}</span>\n </summary>\n <div class=\"px-2.5 py-1.5 bg-indigo-500/5 border-t border-indigo-500/8\">\n <pre class=\"text-[10px] text-indigo-200/40 whitespace-pre-wrap break-words max-h-[200px] overflow-y-auto overflow-x-auto leading-relaxed\">{{ item.groupItems[0].pairedResult.expandableContent || item.groupItems[0].pairedResult.text }}</pre>\n </div>\n </details>\n }\n <!-- Body: gyerek event-ek (az Agent tool item kihagyásával) -->\n <div class=\"px-2 pb-2 pt-1 space-y-0.5 border-t border-indigo-500/10\">\n @for (subItem of item.groupItems; track subItem.listKey) {\n <!-- Az első elem (Agent tool item) kihagyása — adatai a header-ben vannak -->\n @if ($index > 0) {\n <ng-container [ngTemplateOutlet]=\"itemRenderer\" [ngTemplateOutletContext]=\"{ $implicit: subItem }\"></ng-container>\n }\n }\n </div>\n </details>\n </div>\n }\n\n <!-- Result (befejezés) -->\n @case ('result') {\n <div class=\"flex justify-start mb-2 group/msg\">\n <div class=\"inline-flex items-center gap-1.5 bg-green-500/8 border border-green-500/20 rounded-lg px-2.5 py-1\">\n <span class=\"w-1.5 h-1.5 rounded-full bg-green-400 shrink-0\"></span>\n <span class=\"text-[11px] text-green-300/90 break-words min-w-0\">{{ item.text }}</span>\n @if (item.rawData) {\n <button\n class=\"ml-1 w-4 h-4 rounded-full bg-green-500/20 border border-green-500/30 flex items-center justify-center cursor-pointer hover:bg-green-500/40\"\n (click)=\"handleOpenInfoPopup(item)\">\n <span class=\"text-[8px] text-green-300 font-bold leading-none\">i</span>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Run intent -->\n @case ('run-intent') {\n <div class=\"flex justify-start mb-2\">\n <div class=\"inline-flex items-start gap-1.5 bg-blue-500/8 border border-blue-500/20 rounded-lg px-2.5 py-1.5 max-w-[90%]\">\n <span class=\"w-1.5 h-1.5 rounded-full bg-blue-400 shrink-0 mt-0.5\"></span>\n <span class=\"text-[11px] text-blue-300/90 leading-relaxed min-w-0 break-words\">\n @if (!item.isLatestMessage) {\n <span class=\"text-blue-400/60 font-medium\">Run intent: </span>\n }\n {{ item.text }}\n </span>\n </div>\n </div>\n }\n\n <!-- Agentic loop iteráció -->\n @case ('iteration') {\n <div class=\"flex justify-start mb-1.5\">\n <div class=\"inline-flex items-center gap-1.5 bg-violet-500/8 border border-violet-500/20 rounded-lg px-2.5 py-1\">\n <span class=\"w-1.5 h-1.5 rounded-full bg-violet-400 shrink-0\"></span>\n <span class=\"text-[11px] text-violet-300/90 truncate max-w-[80%]\">{{ item.text }}</span>\n </div>\n </div>\n }\n\n <!-- Thinking blokk -->\n @case ('thinking') {\n <div class=\"flex justify-start mb-1.5 group/msg\">\n <details class=\"bg-sky-500/5 border border-sky-500/15 rounded-lg max-w-[90%] overflow-hidden\">\n <summary class=\"flex items-center gap-1.5 px-2.5 py-1 cursor-pointer select-none hover:bg-sky-500/8 transition-colors\">\n <svg class=\"w-3.5 h-3.5 text-sky-400 shrink-0\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"8\" cy=\"8\" r=\"6\"/>\n <path d=\"M6 6.5a2 2 0 0 1 3.5 1.5c0 1-1.5 1.5-1.5 1.5\"/><circle cx=\"8\" cy=\"12\" r=\"0.5\" fill=\"currentColor\"/>\n </svg>\n <span class=\"text-[11px] text-sky-300/80 font-medium\">Thinking</span>\n <span class=\"text-[10px] text-sky-400/40 ml-1 truncate min-w-0\">{{ item.text }}</span>\n @if (item.rawData) {\n <button\n class=\"ml-auto shrink-0 w-3.5 h-3.5 rounded-full bg-sky-500/15 flex items-center justify-center cursor-pointer hover:bg-sky-500/30\"\n (click)=\"handleOpenInfoPopup(item); $event.stopPropagation()\">\n <span class=\"text-[7px] text-sky-300/60 font-bold leading-none\">i</span>\n </button>\n }\n </summary>\n <div class=\"px-2.5 pb-2 pt-1\">\n <pre class=\"text-[10px] text-sky-200/60 whitespace-pre-wrap break-words max-h-[200px] overflow-y-auto overflow-x-auto leading-relaxed\">{{ item.text }}</pre>\n </div>\n </details>\n </div>\n }\n\n <!-- Status brief -->\n @case ('status') {\n <div class=\"flex justify-center mb-1.5\">\n <div class=\"inline-flex items-center gap-1.5 bg-neonPurple/8 border border-neonPurple/20 rounded-full px-3 py-0.5\">\n <span class=\"w-1 h-1 rounded-full bg-neonPurple animate-pulse shrink-0\"></span>\n <span class=\"text-[10px] text-neonPurple/80 truncate\">{{ item.text }}</span>\n @if (item.rawData) {\n <button\n class=\"shrink-0 w-3.5 h-3.5 rounded-full bg-neonPurple/15 flex items-center justify-center cursor-pointer hover:bg-neonPurple/30\"\n (click)=\"handleOpenInfoPopup(item)\">\n <span class=\"text-[7px] text-neonPurple/60 font-bold leading-none\">i</span>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Status Update (CLI system event) -->\n @case ('status-update') {\n <div class=\"flex justify-center mb-1 group/msg\">\n <div class=\"inline-flex items-center gap-1.5 bg-teal-500/6 border border-teal-500/15 rounded-full px-3 py-0.5 max-w-[85%]\">\n <svg class=\"w-3 h-3 text-teal-400/70 shrink-0 animate-spin\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M8 2a6 6 0 0 1 6 6\" stroke-linecap=\"round\"/>\n </svg>\n <span class=\"text-[10px] text-teal-300/70 truncate\">{{ item.text }}</span>\n @if (item.subtype) {\n <span class=\"text-[8px] text-teal-400/40 shrink-0\">{{ item.subtype }}</span>\n }\n @if (item.rawData) {\n <button\n class=\"shrink-0 w-3.5 h-3.5 rounded-full bg-teal-500/15 flex items-center justify-center cursor-pointer hover:bg-teal-500/30\"\n (click)=\"handleOpenInfoPopup(item)\">\n <span class=\"text-[7px] text-teal-300/60 font-bold leading-none\">i</span>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Raw event JSON fallback -->\n @case ('raw') {\n <div class=\"flex justify-start mb-1.5 group/msg\">\n <div class=\"bg-neutral-800/60 border border-amber-500/15 rounded-lg px-2.5 py-1.5 max-w-[85%]\">\n <div class=\"flex items-center gap-1.5 mb-1\">\n <span class=\"w-1.5 h-1.5 rounded-full bg-amber-400 shrink-0\"></span>\n <span class=\"text-[10px] text-neutral-400 font-medium uppercase tracking-wider\">{{ item.text }}</span>\n <span class=\"text-[8px] text-amber-500/60 italic ml-1\">needs brief</span>\n @if (item.rawData) {\n <button\n class=\"ml-auto w-4 h-4 rounded-full bg-neutral-700/80 border border-neutral-600/50 flex items-center justify-center cursor-pointer hover:bg-neutral-600\"\n (click)=\"handleOpenInfoPopup(item)\">\n <span class=\"text-[8px] text-neutral-300 font-bold leading-none\">i</span>\n </button>\n }\n </div>\n @if (item.rawData) {\n <pre class=\"text-[10px] text-neutral-500 whitespace-pre-wrap break-words max-h-[120px] overflow-y-auto overflow-x-auto leading-relaxed\"\n [innerHTML]=\"item.rawData | ccSessionJsonFormat\"></pre>\n }\n </div>\n </div>\n }\n\n }\n</ng-template>\n\n<!-- Session history zóna: scroll + overlay-ek (a composer FÖLÖTT). -->\n<div class=\"relative flex-1 flex flex-col min-h-0\">\n\n<!-- Chat tartalom -->\n<div\n #chatScroll\n class=\"flex-1 overflow-y-auto min-h-0 px-3 py-3\"\n (scroll)=\"handleChatScroll()\">\n\n <!-- Régebbi üzenetek betöltés indikátor -->\n @if (ccSession_DS.isLoadingOlderMessages_$()) {\n <div class=\"flex justify-center py-3\">\n <div class=\"inline-flex items-center gap-2 px-3 py-1.5 rounded-full bg-neutral-800/60 border border-neutral-700/50\">\n <svg class=\"w-3.5 h-3.5 text-neonCyan/70 animate-spin\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M8 2a6 6 0 0 1 6 6\" stroke-linecap=\"round\"/>\n </svg>\n <span class=\"text-[11px] text-neutral-400\">Loading older messages...</span>\n </div>\n </div>\n }\n\n @for (turn of chatTurns_$(); track turn.promptListKey) {\n <!-- User prompt buborék (shared bubble) — data attribútumok a sticky prompt DOM lookup-hoz -->\n @if (turn.promptBubbleView) {\n <div class=\"flex justify-end mb-3\"\n [attr.data-prompt-key]=\"turn.promptListKey\"\n [attr.data-prompt-text]=\"turn.promptText\">\n <div class=\"max-w-[85%] min-w-0\">\n <app-s-agent-console-message-bubble [view]=\"turn.promptBubbleView\" (ttsCached)=\"handleTtsCached($event)\" />\n </div>\n </div>\n }\n\n <!-- Turn event-ek (bezárható konténer) -->\n @if (turn.items.length) {\n <details open class=\"mb-3\">\n <summary class=\"flex items-center gap-1.5 mb-1.5 cursor-pointer select-none list-none [&::-webkit-details-marker]:hidden group/sum\">\n <svg class=\"w-3 h-3 text-neutral-600 shrink-0 transition-transform [[open]>&]:rotate-90\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M4.5 2.5l4 3.5-4 3.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"text-[10px] text-neutral-600 group-hover/sum:text-neutral-400 transition-colors\">{{ turn.items.length }} events</span>\n <div class=\"flex-1 h-px bg-neutral-800 ml-1\"></div>\n </summary>\n <div class=\"pl-1\">\n @for (item of turn.items; track item.listKey) {\n @if (item.bubbleView) {\n <div class=\"flex mb-2 w-full min-w-0\" [class.justify-end]=\"item.messageType === 'prompt'\">\n <div class=\"min-w-0\"\n [class]=\"item.messageType === 'prompt' ? 'w-[85%]'\n : (item.messageType === 'tool' || item.messageType === 'tool-result' ? 'w-[90%] ml-4' : 'w-[90%]')\">\n <app-s-agent-console-message-bubble [view]=\"item.bubbleView\" (ttsCached)=\"handleTtsCached($event)\" />\n </div>\n </div>\n } @else {\n <ng-container [ngTemplateOutlet]=\"itemRenderer\" [ngTemplateOutletContext]=\"{ $implicit: item }\"></ng-container>\n }\n }\n </div>\n </details>\n }\n }\n\n @if (!chatTurns_$().length) {\n <!--\n REQ-SES-HIST-LOADING-001 (cycle 442): a chat üres lehet (a) tényleg új\n session, vagy (b) az assembled fetch még zajlik (cycle 428 gating).\n Skeleton-loader csak a loading-window-ban — utána az \"üres beszélgetés\"\n hint látszik, ha tényleg nincs message.\n -->\n @if (!ccSession_DS.assembledMessagesLoaded_$()) {\n <div class=\"flex flex-col gap-3 px-2 py-4\" aria-label=\"Chat history betöltése folyamatban\">\n <!-- 3 placeholder bubble shimmer-rel (user prompt + assistant response váltakozva) -->\n <div class=\"flex justify-end\">\n <div class=\"w-[60%] max-w-[420px] h-12 rounded-lg bg-neutral-800/50 animate-pulse\"></div>\n </div>\n <div class=\"flex justify-start\">\n <div class=\"w-[75%] max-w-[520px] h-20 rounded-lg bg-neutral-800/50 animate-pulse\"></div>\n </div>\n <div class=\"flex justify-end\">\n <div class=\"w-[55%] max-w-[380px] h-10 rounded-lg bg-neutral-800/50 animate-pulse\"></div>\n </div>\n <div class=\"flex items-center justify-center gap-2 mt-2\">\n <svg class=\"w-3 h-3 text-neonCyan/70 animate-spin\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M8 2a6 6 0 0 1 6 6\" stroke-linecap=\"round\"/>\n </svg>\n <span class=\"text-[10px] text-neutral-500\">Loading chat history…</span>\n </div>\n </div>\n } @else {\n <div class=\"flex flex-col items-center justify-center h-full text-neutral-500 gap-2\">\n <span class=\"text-2xl\">💬</span>\n <span class=\"text-xs\">Send a prompt to start the conversation</span>\n </div>\n }\n }\n</div>\n\n <!-- Bal alul belógó schedule overlay — csak akkor látszik, ha van schedule a sessionhöz. -->\n <app-s-session-schedule-overlay [sessionId]=\"sessionId()\" />\n\n <!-- A schedule overlay fölött: QuickCast — gyors-akciógombok. -->\n <app-s-session-quickcast-overlay (actionSelected)=\"handleQuickCastAction($event)\" />\n\n <!-- QuickCast fölött: Coordinator — assigned info / assign UI. -->\n <app-s-session-coordinator-overlay [sessionId]=\"sessionId()\" />\n\n <!-- Coordinator fölött: Session Quick Settings (cycle 814 Auto-Read TTS bekötve,\n cycle 815 Restart Runner bekötve CC-only). -->\n <app-s-session-quick-settings-overlay\n [sessionId]=\"sessionId()\"\n [showRestartRunner]=\"true\"\n (restartRunnerClicked)=\"handleRestartRunnerClicked()\" />\n\n <!-- Voice record gomb a session history jobb-alsó sarkában. Az Auto-Read TTS toggle\n cycle 814 óta a Quick Settings overlay-be költözött (user explicit kérés). -->\n <div class=\"absolute bottom-4 right-4 z-30 pointer-events-auto\">\n <app-ccap-voice-record-button\n [compactLayout]=\"true\"\n (transcriptSegmentReady)=\"handleVoiceSegment($event)\">\n </app-ccap-voice-record-button>\n </div>\n\n</div>\n<!-- /session history zóna vége -->\n\n<!-- Prompt input (shared session input) -->\n<app-s-session-input\n #sessionInput\n [draftText]=\"promptInput_$()\"\n (draftTextChange)=\"handlePromptInputChange($event)\"\n [isExecuting]=\"isExecuting_$()\"\n [isSending]=\"isSending_$()\"\n [isStopping]=\"detailUi_DS.isStopping_$()\"\n [enableAttachments]=\"true\"\n (attachmentsChanged)=\"handleAttachmentsChanged($event)\"\n [modeOptions]=\"modeOptions\"\n [selectedMode]=\"selectedMode_$()\"\n [modelOptions]=\"modelOptions\"\n [selectedModel]=\"selectedModel_$()\"\n [effortOptions]=\"effortOptions\"\n [selectedEffort]=\"selectedEffort_$()\"\n [usageText]=\"usageText_$()\"\n placeholder=\"Type a message... (Enter to send)\"\n [textareaRows]=\"2\"\n (sendRequested)=\"handleSendPrompt()\"\n (queueRequested)=\"handleSendPrompt()\"\n (stopRequested)=\"detailUi_DS.handleStopExecution()\"\n (modeChanged)=\"handleSelectMode($event)\"\n (modelChanged)=\"handleSelectModel($event)\"\n (effortChanged)=\"handleSelectEffort($event)\"\n [queueItems]=\"sessionQueue_DS.items_$()\"\n [isQueueLocked]=\"sessionQueue_DS.isLocked_$()\"\n [editingQueueItemId]=\"sessionQueue_DS.editingItemId_$()\"\n [editingQueueText]=\"sessionQueue_DS.editingText_$()\"\n (queueEditStart)=\"sessionQueue_DS.startEditing($event)\"\n (queueEditTextChange)=\"sessionQueue_DS.editingText_$.set($event)\"\n (queueEditSave)=\"sessionQueue_DS.saveEdit()\"\n (queueEditCancel)=\"sessionQueue_DS.cancelEdit()\"\n (queueRemoveItem)=\"sessionQueue_DS.removeItem($event)\"\n (queueSendNow)=\"sessionQueue_DS.sendNow($event)\"\n (queueMoveUp)=\"sessionQueue_DS.reorderItem({ queueItemId: $event, direction: 'up' })\"\n (queueMoveDown)=\"sessionQueue_DS.reorderItem({ queueItemId: $event, direction: 'down' })\">\n</app-s-session-input>\n\n<!-- Info popup -->\n<app-s-modal\n [isOpen]=\"isInfoPopupOpen_$()\"\n [title]=\"'Event details — ' + infoPopupTitle_$()\"\n maxWidth=\"4xl\"\n headerBorderClass=\"border-neonCyan/30\"\n (closed)=\"handleCloseInfoPopup()\">\n @if (infoPopupBundle_$(); as rawBundle) {\n <div class=\"flex justify-end gap-2 mb-2\">\n <button\n class=\"inline-flex items-center gap-1.5 px-2.5 py-1 rounded-md text-[11px] transition-colors cursor-pointer\"\n [class]=\"isLast30Copied_$()\n ? 'bg-green-500/15 border border-green-500/30 text-green-300'\n : 'bg-neutral-800 border border-neutral-700 text-neutral-400 hover:text-neutral-200 hover:border-neutral-600'\"\n (click)=\"handleCopyLast30Events()\">\n @if (isLast30Copied_$()) {\n <svg class=\"w-3.5 h-3.5\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M3 8.5l3 3 7-7\"/>\n </svg>\n <span>Copied!</span>\n } @else {\n <svg class=\"w-3.5 h-3.5\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M2 4h12M2 8h12M2 12h8\"/>\n </svg>\n <span>Copy last 30 events</span>\n }\n </button>\n <button\n class=\"inline-flex items-center gap-1.5 px-2.5 py-1 rounded-md text-[11px] transition-colors cursor-pointer\"\n [class]=\"isInfoCopied_$()\n ? 'bg-green-500/15 border border-green-500/30 text-green-300'\n : 'bg-neutral-800 border border-neutral-700 text-neutral-400 hover:text-neutral-200 hover:border-neutral-600'\"\n (click)=\"handleCopyInfoPopup()\">\n @if (isInfoCopied_$()) {\n <svg class=\"w-3.5 h-3.5\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M3 8.5l3 3 7-7\"/>\n </svg>\n <span>Copied!</span>\n } @else {\n <svg class=\"w-3.5 h-3.5\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"5\" y=\"5\" width=\"9\" height=\"9\" rx=\"1.5\"/>\n <path d=\"M3 11V3a1.5 1.5 0 0 1 1.5-1.5H11\"/>\n </svg>\n <span>Copy JSON</span>\n }\n </button>\n </div>\n <div class=\"space-y-4 max-h-[60vh] overflow-y-auto p-1\">\n @if (rawBundle.primaryJson) {\n <section>\n <div class=\"text-[9px] text-neutral-500 uppercase tracking-wide mb-1\">Primary (message / tool call)</div>\n <pre\n class=\"text-xs leading-relaxed whitespace-pre-wrap break-words overflow-x-auto font-mono text-neutral-300\">{{ rawBundle.primaryJson }}</pre>\n </section>\n }\n @if (rawBundle.showStreamBreakdown) {\n <section>\n <div class=\"text-[9px] text-neutral-500 uppercase tracking-wide mb-1\">Stream mirror payloads (each chunk)</div>\n @for (part of rawBundle.streamParts; track part.trackKey) {\n <div class=\"mb-3 last:mb-0\">\n <div class=\"text-[8px] text-neutral-600 mb-0.5\">\n Part {{ part.index + 1 }} / {{ rawBundle.streamParts.length }}\n </div>\n <pre\n class=\"text-xs leading-relaxed whitespace-pre-wrap break-words overflow-x-auto font-mono text-neutral-300\">{{ part.json }}</pre>\n </div>\n }\n </section>\n }\n @if (rawBundle.pairedJson) {\n <section>\n <div class=\"text-[9px] text-neutral-500 uppercase tracking-wide mb-1\">Paired tool result</div>\n <pre\n class=\"text-xs leading-relaxed whitespace-pre-wrap break-words overflow-x-auto font-mono text-neutral-300\">{{ rawBundle.pairedJson }}</pre>\n </section>\n }\n </div>\n }\n</app-s-modal>\n", "/**\n * CC Session üzemmód (chat felületen választható).\n * Megfeleltethető a Claude Code CLI operációs módjainak.\n */\nexport enum CC_Mode_Type {\n normal = 'normal',\n plan = 'plan',\n}\n", "/**\n * CC Session modell választó opciók.\n * A Claude Code CLI --model paraméterének megfelelő rövid model nevek.\n */\nexport enum CC_Model_Type {\n sonnet = 'sonnet',\n opus = 'opus',\n haiku = 'haiku',\n}\n", "import { CCAP_AgentConsoleBubbleKind_Type } from '../../../../../_enums/shared/ccap-agent-console-bubble-kind.enum';\nimport { CCAP_AgentConsoleBubbleView_Interface } from '../../../../../_models/interfaces/shared/ccap-agent-console-bubble-view.interface';\nimport { CC_ConsoleDisplayItem_Interface } from '../_models/interfaces/cc-console-display-item.interface';\n\n/**\n * CC Session console display item → közös buborék view-model.\n */\nexport class CC_CcConsoleToBubbleView_Util {\n\n /**\n * Display item (egyszerű típusok) → buborék view.\n * tool-group / sub-agent-group: a szülő template maradhat helyi @switch ágon.\n */\n static fromDisplayItem(item: CC_ConsoleDisplayItem_Interface): CCAP_AgentConsoleBubbleView_Interface {\n const kind: CCAP_AgentConsoleBubbleKind_Type = CC_CcConsoleToBubbleView_Util.mapMessageTypeToKind(\n item.messageType,\n );\n const paired = item.pairedResult\n ? {\n text: item.pairedResult.text,\n expandableContent: item.pairedResult.expandableContent,\n rawData: item.pairedResult.rawData,\n isError: item.pairedResult.isError,\n }\n : undefined;\n const useEditDiffForExpandable: boolean =\n item.messageType === 'tool' && item.toolName === 'Edit' && !!item.expandableContent;\n return {\n listKey: item.listKey,\n kind: kind,\n bodyText: item.text,\n toolName: item.toolName,\n expandableContent: item.expandableContent,\n pairedResult: paired,\n rawData: item.rawData,\n subtype: item.subtype,\n isUserAligned: item.messageType === 'prompt',\n flags: {\n showCopy: true,\n showRawInfo: true,\n useEditDiffForExpandable: useEditDiffForExpandable,\n },\n };\n }\n\n private static mapMessageTypeToKind(\n messageType: CC_ConsoleDisplayItem_Interface['messageType'],\n ): CCAP_AgentConsoleBubbleKind_Type {\n switch (messageType) {\n case 'prompt':\n return CCAP_AgentConsoleBubbleKind_Type.userPrompt;\n case 'assistant':\n return CCAP_AgentConsoleBubbleKind_Type.assistant;\n case 'tool':\n return CCAP_AgentConsoleBubbleKind_Type.tool;\n case 'tool-result':\n return CCAP_AgentConsoleBubbleKind_Type.toolResult;\n case 'error':\n return CCAP_AgentConsoleBubbleKind_Type.error;\n case 'info':\n return CCAP_AgentConsoleBubbleKind_Type.info;\n case 'status':\n return CCAP_AgentConsoleBubbleKind_Type.status;\n case 'result':\n return CCAP_AgentConsoleBubbleKind_Type.result;\n case 'run-intent':\n return CCAP_AgentConsoleBubbleKind_Type.runIntent;\n case 'iteration':\n return CCAP_AgentConsoleBubbleKind_Type.iteration;\n case 'thinking':\n return CCAP_AgentConsoleBubbleKind_Type.thinking;\n case 'status-update':\n return CCAP_AgentConsoleBubbleKind_Type.statusUpdate;\n case 'raw':\n return CCAP_AgentConsoleBubbleKind_Type.raw;\n case 'tool-group':\n return CCAP_AgentConsoleBubbleKind_Type.toolGroup;\n case 'sub-agent-group':\n return CCAP_AgentConsoleBubbleKind_Type.subAgentGroup;\n default:\n return CCAP_AgentConsoleBubbleKind_Type.info;\n }\n }\n}\n", "import { Pipe, PipeTransform } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\n/**\n * Record/object → szintaxis-kiemelt formázott JSON HTML (2 space indent).\n * Kulcsok, string-ek, számok, boolean-ok és null eltérő színt kapnak.\n */\n@Pipe({ name: 'ccSessionJsonFormat' })\nexport class CC_JsonFormat_Pipe implements PipeTransform {\n\n constructor(private sanitizer: DomSanitizer) {}\n\n /** Object → syntax-highlighted JSON SafeHtml. */\n transform(data: Record<string, unknown> | null | undefined): SafeHtml {\n if (!data) {\n return this.sanitizer.bypassSecurityTrustHtml('<span class=\"text-neutral-500\">{}</span>');\n }\n\n try {\n const json: string = JSON.stringify(data, null, 2);\n // HTML-escape, majd syntax highlight span-ekkel\n const highlighted: string = this.highlightJson(json);\n return this.sanitizer.bypassSecurityTrustHtml(highlighted);\n } catch {\n return this.sanitizer.bypassSecurityTrustHtml('<span class=\"text-neutral-500\">{}</span>');\n }\n }\n\n /** Minimális string hossz, ami felett a többsoros kibontás aktiválódik. */\n private readonly MULTILINE_THRESHOLD: number = 150;\n\n /**\n * JSON string → HTML syntax highlight.\n * Regex-szel azonosítja a JSON tokeneket és span-ekbe csomagolja.\n * Hosszú, többsoros string értékek (forráskód, tool result content) kibontva jelennek meg.\n */\n private highlightJson(json: string): string {\n // HTML escape\n const escaped: string = json\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n\n // Token highlight: key, string, number, boolean, null\n return escaped.replace(\n /(\"(\\\\u[\\da-fA-F]{4}|\\\\[^u]|[^\\\\\"])*\"(\\s*:)?|\\b(true|false|null)\\b|-?\\d+(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)/g,\n (match: string): string => {\n // Típus meghatározás\n if (/^\"/.test(match)) {\n if (/:$/.test(match)) {\n // JSON kulcs\n return `<span style=\"color:#7dd3fc\">${match}</span>`;\n }\n // Hosszú, többsoros string → kibontott kód blokk\n if (match.length > this.MULTILINE_THRESHOLD && match.includes('\\\\n')) {\n return this.formatMultilineString(match);\n }\n // Rövid string érték\n return `<span style=\"color:#86efac\">${match}</span>`;\n }\n if (/true|false/.test(match)) {\n // Boolean\n return `<span style=\"color:#fbbf24\">${match}</span>`;\n }\n if (/null/.test(match)) {\n // Null\n return `<span style=\"color:#a78bfa\">${match}</span>`;\n }\n // Szám\n return `<span style=\"color:#fb923c\">${match}</span>`;\n },\n );\n }\n\n /**\n * Hosszú, escaped string token → kibontott, olvasható többsoros blokk.\n * Az escaped szekvenciákat (\\\\n, \\\\t, \\\\\", \\\\\\\\) valódi karakterekre cseréli\n * és bal oldali border-rel kiemelt kód blokkban jeleníti meg.\n */\n private formatMultilineString(match: string): string {\n // Idézőjelek eltávolítása és escape szekvenciák feloldása\n const inner: string = match\n .slice(1, -1)\n .replace(/\\\\n/g, '\\n')\n .replace(/\\\\t/g, ' ')\n .replace(/\\\\r/g, '')\n .replace(/\\\\\"/g, '\"')\n .replace(/\\\\\\\\/g, '\\\\');\n\n return '<span style=\"color:#86efac\">\"</span>'\n + '<span style=\"display:block;margin:2px 0;padding:4px 8px;border-left:2px solid rgba(134,239,172,0.25);'\n + 'background:rgba(134,239,172,0.04);border-radius:0 4px 4px 0;color:#86efac;opacity:0.85;'\n + 'white-space:pre-wrap;word-break:break-word;font-size:0.9em;line-height:1.5\">'\n + inner\n + '</span>'\n + '<span style=\"color:#86efac\">\"</span>';\n }\n}\n", "import { Pipe, PipeTransform } from '@angular/core';\n\n/**\n * Session event type → Tailwind CSS badge szín osztály.\n */\n@Pipe({ name: 'ccSessionEventTypeColor' })\nexport class CC_EventTypeColor_Pipe implements PipeTransform {\n\n /** Event type string → CSS osztály. */\n transform(eventType: string): string {\n switch (eventType) {\n case 'status-change': return 'bg-purple-600';\n case 'prompt-sent': return 'bg-blue-600';\n case 'response-chunk': return 'bg-green-600';\n case 'response-complete': return 'bg-green-500';\n case 'tool-call-start': return 'bg-orange-500';\n case 'tool-call-end': return 'bg-orange-400';\n case 'stdout-line': return 'bg-neutral-600';\n case 'stderr-line': return 'bg-red-500';\n case 'error': return 'bg-red-600';\n case 'file-operation': return 'bg-cyan-600';\n case 'shell-command': return 'bg-yellow-600';\n case 'session-init': return 'bg-blue-500';\n case 'config-mismatch': return 'bg-amber-600';\n case 'cli-args-record': return 'bg-slate-500';\n case 'usage-update': return 'bg-teal-600';\n case 'config-change': return 'bg-indigo-500';\n case 'runner-overflow': return 'bg-red-700';\n case 'interrupted-prompt': return 'bg-amber-500';\n case 'cli-chunk': return 'bg-neutral-500';\n default: return 'bg-neutral-600';\n }\n }\n}\n", "import {\n Component,\n inject,\n signal,\n ViewChild,\n ElementRef,\n AfterViewChecked,\n} from '@angular/core';\n\nimport { CCAP_GlobalError_ControlService } from '../../../../../../_services/control-services/ccap-global-error.control-service';\nimport { ClaudeCode_DataService } from '../../_services/claude-code.data-service';\nimport { CC_DetailUi_DataService } from '../../_services/cc-detail-ui.data-service';\nimport { CC_EventItem_Interface } from '../../_models/interfaces/cc-list-item.interface';\n\n/**\n * Claude Code Session event timeline komponens.\n * Kronológikus event lista, szín-kódolás, expandálható event részletek.\n * Display logikát pipe-okkal oldja meg (ccSessionEventTypeColor, sTimeAgo, ccSessionJsonFormat).\n * Auto-scroll új event-eknél.\n */\n@Component({\n selector: 'app-ccap-cc-timeline',\n templateUrl: './cc-timeline.component.html',\n host: { class: 'flex flex-col h-full overflow-hidden' },\n})\n/** CC_Timeline_Component class. */\nexport class CC_Timeline_Component implements AfterViewChecked {\n\n readonly ccSession_DS: ClaudeCode_DataService =\n inject(ClaudeCode_DataService);\n\n /** Console filter toggle-ok (session status / agent updates) — shell headerből ide költözve. */\n readonly detailUi_DS: CC_DetailUi_DataService =\n inject(CC_DetailUi_DataService);\n\n private readonly globalError_CS: CCAP_GlobalError_ControlService =\n inject(CCAP_GlobalError_ControlService);\n\n /** Expandált event szekvencia számok (signal). */\n readonly expandedSequences_$ = signal<Set<number>>(new Set());\n\n /** Auto-scroll engedélyezve az event listához. */\n readonly isAutoScroll_$ = signal<boolean>(true);\n\n /** Éppen másolt event sequence (vizuális visszajelzéshez, rövid időre beáll majd null-ra). */\n readonly copiedSequence_$ = signal<number | null>(null);\n\n @ViewChild('eventList') eventListRef?: ElementRef<HTMLDivElement>;\n\n /** Előző event szám a scroll detektáláshoz. */\n private previousEventCount: number = 0;\n\n ngAfterViewChecked(): void {\n // Auto-scroll ha engedélyezve és új event érkezett\n const currentCount: number = this.ccSession_DS.selectedSessionEvents_$().length;\n if (this.isAutoScroll_$() && currentCount > this.previousEventCount) {\n this.scrollToBottom();\n }\n this.previousEventCount = currentCount;\n }\n\n /**\n * Event részletek toggle (event handler).\n */\n handleToggleEvent(sequence: number): void {\n const current: Set<number> = this.expandedSequences_$();\n const next: Set<number> = new Set(current);\n\n if (next.has(sequence)) {\n next.delete(sequence);\n } else {\n next.add(sequence);\n }\n\n this.expandedSequences_$.set(next);\n }\n\n /**\n * Auto-scroll toggle.\n */\n handleToggleAutoScroll(): void {\n this.isAutoScroll_$.update((v: boolean): boolean => !v);\n }\n\n /**\n * Ellenőrzi hogy az event expandálva van-e.\n */\n isExpanded(sequence: number): boolean {\n return this.expandedSequences_$().has(sequence);\n }\n\n /**\n * Event data másolása a vágólapra (event handler).\n * JSON stringgé alakítja az event data tartalmát.\n */\n async handleCopyEvent(event: CC_EventItem_Interface, mouseEvent: MouseEvent): Promise<void> {\n // Megállítjuk a propagációt, nehogy az expand/collapse is triggerelődjön\n mouseEvent.stopPropagation();\n\n const text: string = JSON.stringify(event.data, null, 2);\n const result = await this.globalError_CS.copyToClipboard(text);\n\n if (result.ok) {\n // Rövid vizuális visszajelzés (pipa ikon megjelenítése)\n this.copiedSequence_$.set(event.sequence);\n setTimeout((): void => {\n this.copiedSequence_$.set(null);\n }, 1500);\n }\n }\n\n /**\n * Event lista aljára görgetés.\n */\n private scrollToBottom(): void {\n const element: HTMLDivElement | undefined = this.eventListRef?.nativeElement;\n if (element) {\n element.scrollTop = element.scrollHeight;\n }\n }\n}\n", "<!-- Timeline header -->\n<div class=\"flex items-center justify-between p-2 border-b border-neonDefault shrink-0\">\n <div class=\"flex items-center gap-1\">\n <span class=\"text-xs text-neutral-400 font-medium\">Event Timeline</span>\n <span class=\"text-xs text-neutral-500\">\n ({{ ccSession_DS.selectedSessionEvents_$().length }})\n </span>\n </div>\n <button\n class=\"text-[10px] px-1.5 py-0.5 border rounded transition-colors\"\n [class]=\"isAutoScroll_$() ? 'border-neonCyan text-neonCyan shadow-neon-glow-cyan' : 'border-neonDefault text-neutral-400'\"\n (click)=\"handleToggleAutoScroll()\">\n Auto-scroll\n </button>\n</div>\n\n<!-- Console filter toggles -->\n<div class=\"flex items-center gap-1 px-2 py-1.5 border-b border-neonDefault shrink-0\">\n <button\n class=\"px-2 py-0.5 text-[10px] border rounded transition-colors\"\n [class]=\"detailUi_DS.isShowSessionStatus_$()\n ? 'border-neonPurple/50 text-neonPurple bg-neonPurple/10'\n : 'border-neutral-700 text-neutral-500 hover:text-neutral-300 hover:border-neutral-600'\"\n (click)=\"detailUi_DS.handleToggleSessionStatus()\"\n title=\"Session lifecycle status changes (running, waiting, completed...)\">\n Session status\n </button>\n <button\n class=\"px-2 py-0.5 text-[10px] border rounded transition-colors\"\n [class]=\"detailUi_DS.isShowAgentUpdates_$()\n ? 'border-teal-500/50 text-teal-400 bg-teal-500/10'\n : 'border-neutral-700 text-neutral-500 hover:text-neutral-300 hover:border-neutral-600'\"\n (click)=\"detailUi_DS.handleToggleAgentUpdates()\"\n title=\"Agent progress updates (task_progress, tool status...)\">\n Agent updates\n </button>\n</div>\n\n<!-- Event list -->\n<div #eventList class=\"flex-1 overflow-y-auto min-h-0\">\n @for (event of ccSession_DS.selectedSessionEvents_$(); track event.sequence) {\n <div\n class=\"px-2 py-1 border-b border-neutral-700/30 cursor-pointer hover:bg-neutral-800/30 transition-colors\"\n (click)=\"handleToggleEvent(event.sequence)\">\n <!-- Compact single-row: badge + sequence + timestamp -->\n <div class=\"flex items-center gap-1.5\">\n <!--\n REQ-CC-EVT-SOURCE-FLAG-001 (cycle 438): forrás-jelzés.\n ccap-internal események (state-reconciliation, force-reset, recovery,\n manager) kapnak egy kis lila pontot — különböztet a Claude CLI native\n emitjeitől (cc-stream, default, no marker). A `eventSource` hiánya\n régi rekordnál → cc-stream-ként kezeljük (kompatibilis).\n -->\n @if (event.eventSource === 'ccap-internal') {\n <span\n class=\"text-[9px] px-1 py-0.5 rounded bg-purple-700 text-white whitespace-nowrap leading-none font-semibold\"\n title=\"CCAP-internal event (saját rendszer state-reconciliation / force-reset / recovery)\">\n CCAP\n </span>\n }\n <!-- Event type badge -->\n <span\n class=\"text-[9px] px-1 py-0.5 rounded text-white whitespace-nowrap leading-none\"\n [ngClass]=\"event.eventType | ccSessionEventTypeColor\">\n {{ event.eventType }}\n </span>\n\n <!-- Sequence number -->\n <span class=\"text-[10px] text-neutral-600 leading-none\">\n #{{ event.sequence }}\n </span>\n\n <!-- Timestamp — REQ-SES-EVT-TS-002 cycle 471: text-neutral-400 + [title] absolute ISO. -->\n <span class=\"text-[10px] text-neutral-400 ml-auto leading-none\" [title]=\"event.timestamp | sAbsoluteTime\">\n {{ event.timestamp | sTimeAgo }}\n </span>\n\n <!-- Copy gomb -->\n <button\n class=\"ml-1 p-0.5 rounded transition-colors text-neutral-500 hover:text-neonCyan shrink-0\"\n title=\"Copy event data\"\n (click)=\"handleCopyEvent(event, $event)\">\n @if (copiedSequence_$() === event.sequence) {\n <!-- Pipa ikon (sikeres másolás) -->\n <svg class=\"w-3 h-3 text-green-400\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M3 8.5L6.5 12L13 4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n } @else {\n <!-- Copy ikon -->\n <svg class=\"w-3 h-3\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">\n <rect x=\"5\" y=\"5\" width=\"8\" height=\"8\" rx=\"1\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3 11V3h8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n }\n </button>\n </div>\n\n <!-- Expandable details -->\n @if (isExpanded(event.sequence)) {\n <pre\n class=\"mt-1 p-2 bg-neutral-900 border border-neutral-700/50 rounded text-[10px] text-neonCyan/70 overflow-x-auto max-h-60 whitespace-pre-wrap break-words font-mono\"\n [innerHTML]=\"event.data | ccSessionJsonFormat\"></pre>\n }\n </div>\n }\n\n @if (!ccSession_DS.selectedSessionEvents_$().length) {\n <div class=\"p-3 text-center text-neutral-500 text-xs\">No events yet</div>\n }\n</div>\n", "import { Component, computed, inject, OnInit, Signal, signal } from '@angular/core';\n\nimport { DyFM_Log } from '@futdevpro/fsm-dynamo';\n\nimport { ClaudeCode_DataService } from '../../_services/claude-code.data-service';\nimport { CcSessionRateLimitInfo_Interface } from '../../_services/cc.data-service.interface';\nimport { CC_DetailUi_DataService } from '../../_services/cc-detail-ui.data-service';\nimport { CC_RateLimitDisplay_Util } from '../../_collections/cc-rate-limit-display.util';\nimport { CC_ListItem_Interface } from '../../_models/interfaces/cc-list-item.interface';\nimport { SCH_ScheduledJobs_DataService } from '../../../../../scheduler/_services/data-services/sch-scheduled-jobs.data-service';\nimport { Coordinator_DataService } from '../../../../../coordinator/_services/coordinator.data-service';\n\n/**\n * Claude Code Session metadata / state panel komponens.\n * Session állapot, workspace, actor, statistics, configuration megjelenítése.\n * Resume és rate limit UI a Session Info blokkban (shell toolbar-ból ide költözött).\n */\n@Component({\n selector: 'app-ccap-cc-metadata',\n templateUrl: './cc-metadata.component.html',\n host: { class: 'block h-full overflow-y-auto' },\n})\n/** CC_Metadata_Component class. */\nexport class CC_Metadata_Component implements OnInit {\n\n readonly ccSession_DS: ClaudeCode_DataService =\n inject(ClaudeCode_DataService);\n\n /** Resume és egyéb detail chrome akciók — SSOT a detail UI data service-ben. */\n readonly detailUi_DS: CC_DetailUi_DataService =\n inject(CC_DetailUi_DataService);\n\n /** Schedule-indicator forrás (REQ-SES-SCH-IND-001 detail-view follow-up). */\n readonly scheduledJobs_DS: SCH_ScheduledJobs_DataService =\n inject(SCH_ScheduledJobs_DataService);\n\n /** Coordinator-indicator forrás (REQ-SES-CRD-IND-001 slice 2, cycle 191). */\n readonly coordinator_DS: Coordinator_DataService =\n inject(Coordinator_DataService);\n\n /** Igaz, ha a megnyitott CC session-höz tartozik aktív schedule. */\n readonly hasSchedule_$: Signal<boolean> = computed((): boolean => {\n const sid: string = this.ccSession_DS.activeSessionId_$();\n if (!sid) {\n return false;\n }\n return this.scheduledJobs_DS.scheduledSessionIds_$().has(sid);\n });\n\n /** Igaz, ha a megnyitott CC session-höz tartozik aktív koordinátor. */\n readonly hasCoordinator_$: Signal<boolean> = computed((): boolean => {\n const sid: string = this.ccSession_DS.activeSessionId_$();\n if (!sid) {\n return false;\n }\n return this.coordinator_DS.coordinatedSessionIds_$().has(sid);\n });\n\n /** Rate limit popover nyitva/zárva (lokális UI state). */\n readonly isRateLimitOpen_$ = signal<boolean>(false);\n\n /** Archive megerősítő modal nyitva/zárva. */\n readonly isArchiveConfirmOpen_$ = signal<boolean>(false);\n\n /**\n * REQ-SCH-IND-CLICK-001 toolbar follow-up (cycle 203): a Schedule popup-on\n * megjelenített sessionId. `null` → popup zárva. A header schedule-badge állítja be.\n */\n readonly schedulePopupSessionId_$ = signal<string | null>(null);\n\n /**\n * REQ-SES-CRD-IND-001 Slice 3 toolbar follow-up (cycle 203): a Coordinator\n * popup-on megjelenített sessionId. `null` → popup zárva.\n */\n readonly coordinatorPopupSessionId_$ = signal<string | null>(null);\n\n /** Schedule-badge click handler — popup nyitása az aktuális CC sessionId-vel. */\n handleScheduleBadgeClick(): void {\n const sid: string = this.ccSession_DS.activeSessionId_$();\n if (sid) {\n this.schedulePopupSessionId_$.set(sid);\n }\n }\n\n /** Schedule popup bezárása. */\n handleCloseSchedulePopup(): void {\n this.schedulePopupSessionId_$.set(null);\n }\n\n /** Coordinator-badge click handler — popup nyitása az aktuális CC sessionId-vel. */\n handleCoordinatorBadgeClick(): void {\n const sid: string = this.ccSession_DS.activeSessionId_$();\n if (sid) {\n this.coordinatorPopupSessionId_$.set(sid);\n }\n }\n\n /** Coordinator popup bezárása. */\n handleCloseCoordinatorPopup(): void {\n this.coordinatorPopupSessionId_$.set(null);\n }\n\n /**\n * REQ-CC-DEBUG-STATUS-001 Part 1: Debug Mode flag toggle.\n * Aktuális állapot megfordítása (true ↔ false) PATCH /:sessionId/config-pal.\n * A következő spawn-on a CLI az új flag-állapottal indul (--debug a true-hoz).\n */\n handleToggleDebugMode(currentSessionId: string, currentValue: boolean): void {\n if (!currentSessionId) {\n return;\n }\n const next: boolean = !currentValue;\n this.ccSession_DS.updateSessionConfig({\n sessionId: currentSessionId,\n isDebugMode: next,\n }).catch((err: unknown): void => {\n DyFM_Log.error('[CCAP] cc-metadata config-update isDebugMode', err);\n });\n }\n\n /** Utolsó rate limit info — a CC session data service-ből. */\n readonly rateLimitInfo_$: Signal<CcSessionRateLimitInfo_Interface | null> = computed(\n (): CcSessionRateLimitInfo_Interface | null => this.ccSession_DS.rateLimitInfo_$(),\n );\n\n /** Rate limit reset idő formázott szöveg (relatív). */\n readonly rateLimitResetText_$: Signal<string> = computed((): string => {\n return CC_RateLimitDisplay_Util.formatResetText(this.rateLimitInfo_$());\n });\n\n /** Rate limit utilization százalék (a legfontosabb érték — rate_limit_event.utilization). */\n readonly rateLimitPercent_$: Signal<number> = computed((): number => {\n return CC_RateLimitDisplay_Util.computeUtilizationPercent(this.rateLimitInfo_$());\n });\n\n /** Warning threshold százalék (rate_limit_event.surpassedThreshold). */\n readonly rateLimitThresholdPercent_$: Signal<number> = computed((): number => {\n return CC_RateLimitDisplay_Util.computeThresholdPercent(this.rateLimitInfo_$());\n });\n\n /** Limit scope címke (\"Session\" / \"Weekly\" / raw). */\n readonly rateLimitScopeLabel_$: Signal<string> = computed((): string => {\n return CC_RateLimitDisplay_Util.formatLimitScopeLabel(this.rateLimitInfo_$());\n });\n\n /** Igaz, ha az utilization meghaladta a threshold-ot. */\n readonly isRateLimitOverThreshold_$: Signal<boolean> = computed((): boolean => {\n return CC_RateLimitDisplay_Util.isOverThreshold(this.rateLimitInfo_$());\n });\n\n /**\n * Deep-link fallback: ha a user közvetlenül a detail URL-re érkezik, a dashboard\n * `loadAll()`-ja nem futott le — itt töltjük be defenzíven (csak ha üres).\n */\n ngOnInit(): void {\n if (this.scheduledJobs_DS.jobs_$().length === 0) {\n void this.scheduledJobs_DS.loadAll();\n }\n if (this.coordinator_DS.globalCoordinatorsList_$().length === 0) {\n void this.coordinator_DS.loadAllCoordinatorsForManagementPage();\n }\n }\n\n /**\n * Rate limit popover toggle.\n */\n handleToggleRateLimit(): void {\n this.isRateLimitOpen_$.update((v: boolean): boolean => !v);\n }\n\n /**\n * Session archiválás/visszaállítás megerősítés után.\n */\n async handleConfirmToggleArchive(session: CC_ListItem_Interface): Promise<void> {\n this.isArchiveConfirmOpen_$.set(false);\n try {\n await this.ccSession_DS.setSessionArchived({\n sessionId: session.sessionId,\n isArchived: !session.isArchived,\n });\n } catch {\n // HTTP hibát az interceptor kezeli\n }\n }\n\n /**\n * Cycle 781e (REQ-SYS-INSTALL-VERSION-CHECK-001 Slice E): runner kill +\n * respawn trigger. A user UI-ról kattintja, ha a runner verzió-mismatch-es\n * vagy konzisztens no-ACK-fire-pattern-t mutat. A new terminál ablak a\n * friss npm-installed build-tel nyílik.\n */\n async handleRestartRunner(): Promise<void> {\n const sid: string = this.ccSession_DS.activeSessionId_$();\n if (!sid) {\n return;\n }\n try {\n await this.ccSession_DS.restartRunner({ sessionId: sid });\n } catch {\n // HTTP hibát az interceptor kezeli; ezenfelül a data-service\n // pushSystemAssembledMessage chat-bubble-ben is megjeleníti.\n }\n }\n\n /**\n * Token szám formázása (1000+ → \"1.2k\" formátum).\n */\n formatTokens(count: number | undefined): string {\n if (!count) {\n return '0';\n }\n return count > 1000\n ? `${(count / 1000).toFixed(1)}k`\n : String(count);\n }\n}\n", "@if (ccSession_DS.selectedSession_$(); as detail) {\n <div class=\"p-3\">\n <div class=\"flex items-center justify-between mb-3\">\n <div class=\"flex items-center gap-1.5\">\n <h3 class=\"text-xs font-semibold text-neutral-400 uppercase tracking-wider\">\n Session Info\n </h3>\n <!-- Schedule-indicator: REQ-SES-SCH-IND-001 detail-view follow-up.\n REQ-SCH-IND-CLICK-001 toolbar follow-up (cycle 203): kattintható → popup. -->\n @if (hasSchedule_$()) {\n <button type=\"button\"\n class=\"text-neonCyan/80 hover:text-neonCyan focus:outline-none focus:ring-1 focus:ring-neonCyan/60 rounded p-0.5\"\n title=\"Ehhez a session-höz tartozik schedule — kattints a részletekért\"\n aria-label=\"Schedule attached — open popup\"\n (click)=\"handleScheduleBadgeClick()\">\n <svg class=\"w-3 h-3\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\" />\n <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\" />\n <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\" />\n </svg>\n </button>\n }\n <!-- Coordinator-indicator: REQ-SES-CRD-IND-001 slice 2 (cycle 191).\n Slice 3 toolbar follow-up (cycle 203): kattintható → popup. -->\n @if (hasCoordinator_$()) {\n <button type=\"button\"\n class=\"text-neonAmber/80 hover:text-neonAmber focus:outline-none focus:ring-1 focus:ring-neonAmber/60 rounded p-0.5\"\n title=\"Ehhez a session-höz tartozik koordinátor — kattints a részletekért\"\n aria-label=\"Coordinator attached — open popup\"\n (click)=\"handleCoordinatorBadgeClick()\">\n <svg class=\"w-3 h-3\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polygon points=\"16.24 7.76 14.12 14.12 7.76 16.24 9.88 9.88 16.24 7.76\" />\n </svg>\n </button>\n }\n </div>\n <button\n class=\"text-[10px] px-1.5 py-0.5 rounded transition-colors\"\n [class]=\"detail.session.isArchived\n ? 'text-amber-400 border border-amber-500/60 bg-amber-500/10 hover:bg-amber-500/20'\n : 'text-neutral-500 border border-neutral-700 hover:text-neutral-300 hover:bg-neutral-700'\"\n (click)=\"isArchiveConfirmOpen_$.set(true)\"\n [title]=\"detail.session.isArchived ? 'Unarchive session' : 'Archive session'\">\n {{ detail.session.isArchived ? 'Unarchive' : 'Archive' }}\n </button>\n </div>\n\n <!-- Resume + rate limit (toolbar-ból ide, keskeny panel: popover left anchor) -->\n <div class=\"flex flex-col gap-2 mb-4\">\n @if (detail.session.status === 'completed' || detail.session.status === 'errored') {\n <button\n type=\"button\"\n class=\"w-full px-2 py-1.5 text-xs border border-ccapAccent text-ccapAccent hover:bg-ccapAccent hover:text-white disabled:opacity-50 rounded transition-colors\"\n [disabled]=\"detailUi_DS.isResuming_$()\"\n (click)=\"detailUi_DS.handleResume()\">\n {{ detailUi_DS.isResuming_$() ? 'Resuming...' : 'Resume' }}\n </button>\n }\n <!-- Cycle 781e (REQ-SYS-INSTALL-VERSION-CHECK-001 Slice E): runner kill +\n respawn — verzió-mismatch vagy no-ACK-fire-pattern esetén a user\n egy gombnyomással friss terminál ablakot indít. -->\n <button\n type=\"button\"\n class=\"w-full px-2 py-1.5 text-xs border border-amber-500/60 text-amber-300\n hover:bg-amber-500/10 disabled:opacity-50 rounded transition-colors\"\n (click)=\"handleRestartRunner()\"\n title=\"Runner kill + respawn (új CMD/terminál ablak; használd ha verzió-mismatch vagy no-ACK loop van)\">\n ↻ Restart runner\n </button>\n <div class=\"relative w-full shrink-0\" data-testid=\"cc-rate-limit-container\">\n <button\n type=\"button\"\n data-testid=\"cc-rate-limit-button\"\n [attr.data-rate-limit-state]=\"rateLimitInfo_$()\n ? (isRateLimitOverThreshold_$() ? 'reached' : 'allowed')\n : 'unknown'\"\n class=\"w-full px-2 py-1.5 text-xs border rounded transition-colors flex items-center justify-center gap-1.5\"\n [class]=\"rateLimitInfo_$()\n ? (isRateLimitOverThreshold_$()\n ? 'border-red-500/30 text-red-400/80 hover:bg-red-500/10'\n : 'border-green-500/30 text-green-400/80 hover:bg-green-500/10')\n : 'border-neutral-700 text-neutral-500'\"\n (click)=\"handleToggleRateLimit()\"\n title=\"Rate limit info\">\n <svg class=\"w-3.5 h-3.5 shrink-0\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"8\" cy=\"8\" r=\"6\"/>\n <path d=\"M8 5v3.5l2 1.5\"/>\n </svg>\n @if (rateLimitInfo_$()) {\n <span>{{ rateLimitScopeLabel_$() }} {{ rateLimitPercent_$() }}%</span>\n } @else {\n <span>Rate limit</span>\n }\n </button>\n\n @if (isRateLimitOpen_$()) {\n <div class=\"fixed inset-0 z-40\" (click)=\"handleToggleRateLimit()\"></div>\n <div\n data-testid=\"cc-rate-limit-popover\"\n class=\"absolute left-0 top-full mt-1 z-50 w-full min-w-[16rem] max-w-[min(100vw-2rem,18rem)] bg-neutral-900 border border-neutral-700 rounded-lg shadow-xl p-3 space-y-2.5\">\n <div class=\"text-xs font-semibold text-neutral-200 mb-2\">Rate Limit Info</div>\n\n @if (rateLimitInfo_$()) {\n @let rl = rateLimitInfo_$()!;\n <div class=\"flex items-center justify-between\">\n <span class=\"text-[10px] text-neutral-500\">Status</span>\n <span class=\"text-[11px] font-medium\"\n data-testid=\"cc-rate-limit-status\"\n [class]=\"isRateLimitOverThreshold_$() ? 'text-red-400' : 'text-green-400'\">\n {{ rl.status }}\n </span>\n </div>\n\n <div class=\"flex items-center justify-between\">\n <span class=\"text-[10px] text-neutral-500\">Scope</span>\n <span class=\"text-[11px] text-neutral-300\">\n {{ rateLimitScopeLabel_$() }}\n <span class=\"text-[9px] text-neutral-500\">({{ rl.rateLimitType }})</span>\n </span>\n </div>\n\n <div>\n <div class=\"flex items-center justify-between mb-1\">\n <span class=\"text-[10px] text-neutral-500\">Utilization</span>\n <span class=\"text-[10px] text-neutral-300 font-medium\">{{ rateLimitPercent_$() }}%</span>\n </div>\n <div class=\"w-full h-1.5 bg-neutral-800 rounded-full overflow-hidden\">\n <div class=\"h-full rounded-full transition-all\"\n data-testid=\"cc-rate-limit-utilization-bar\"\n [attr.data-utilization-color]=\"isRateLimitOverThreshold_$()\n ? 'red'\n : (rateLimitPercent_$() > 50 ? 'amber' : 'green')\"\n [class]=\"isRateLimitOverThreshold_$() ? 'bg-red-500' : (rateLimitPercent_$() > 50 ? 'bg-amber-500' : 'bg-green-500')\"\n [style.width.%]=\"rateLimitPercent_$()\">\n </div>\n </div>\n </div>\n\n <div class=\"flex items-center justify-between\">\n <span class=\"text-[10px] text-neutral-500\">Warning threshold</span>\n <span class=\"text-[11px] text-neutral-300\">{{ rateLimitThresholdPercent_$() }}%</span>\n </div>\n\n <div class=\"flex items-center justify-between\">\n <span class=\"text-[10px] text-neutral-500\">Resets in</span>\n <span class=\"text-[11px] text-neutral-300\">{{ rateLimitResetText_$() }}</span>\n </div>\n\n <div class=\"flex items-center justify-between\">\n <span class=\"text-[10px] text-neutral-500\">Overage</span>\n <span class=\"text-[11px]\"\n [class]=\"rl.isUsingOverage ? 'text-amber-400' : 'text-neutral-400'\">\n {{ rl.isUsingOverage ? 'active' : 'inactive' }}\n </span>\n </div>\n\n <div class=\"border-t border-neutral-800 pt-1.5 mt-1.5\">\n <span class=\"text-[9px] text-neutral-600\">Last updated: {{ rl.receivedAt | date:'HH:mm:ss' }}</span>\n </div>\n } @else {\n <div class=\"text-[11px] text-neutral-500 text-center py-2\">\n No rate limit data yet\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Status section -->\n <div class=\"mb-4\">\n <div class=\"text-[10px] text-neutral-500 uppercase tracking-wider mb-1\">Status</div>\n <div class=\"flex items-center gap-1.5\">\n <span\n class=\"text-[10px] px-1.5 py-0.5 rounded-full text-white\"\n [ngClass]=\"detail.session.status | ccSessionStatusColor\">\n {{ detail.session.status }}\n </span>\n @if (detail.runtime.isLive) {\n <span class=\"w-1.5 h-1.5 rounded-full bg-green-500 animate-pulse\"></span>\n }\n </div>\n @if (detail.session.statusMessage) {\n <div class=\"text-xs text-neutral-500 mt-0.5\">{{ detail.session.statusMessage }}</div>\n }\n </div>\n\n <!-- Session ID -->\n <div class=\"mb-3\">\n <div class=\"text-[10px] text-neutral-500 uppercase tracking-wider mb-1\">Session ID</div>\n <div class=\"text-xs text-neutral-400 font-mono break-all\">{{ detail.session.sessionId }}</div>\n </div>\n\n <!-- Workspace -->\n <div class=\"mb-3\">\n <div class=\"text-[10px] text-neutral-500 uppercase tracking-wider mb-1\">Workspace</div>\n <div class=\"text-xs text-neutral-400 break-all\">{{ detail.session.workspacePath }}</div>\n </div>\n\n <!-- Actor -->\n @if (detail.session.actorId || detail.session.actorLabel) {\n <div class=\"mb-3\">\n <div class=\"text-[10px] text-neutral-500 uppercase tracking-wider mb-1\">Actor</div>\n <div class=\"text-xs text-neutral-400\">\n {{ detail.session.actorLabel || detail.session.actorId }}\n </div>\n </div>\n }\n\n <!-- Process info -->\n @if (detail.session.processId) {\n <div class=\"mb-3\">\n <div class=\"text-[10px] text-neutral-500 uppercase tracking-wider mb-1\">Process ID</div>\n <div class=\"text-xs text-neutral-400 font-mono\">{{ detail.session.processId }}</div>\n </div>\n }\n\n @if (detail.session.claudeSessionId) {\n <div class=\"mb-3\">\n <div class=\"text-[10px] text-neutral-500 uppercase tracking-wider mb-1\">Claude Session</div>\n <div class=\"text-xs text-neutral-400 font-mono break-all\">{{ detail.session.claudeSessionId }}</div>\n </div>\n }\n\n <!-- Divider -->\n <hr class=\"border-neutral-700/50 my-3\">\n\n <!-- Statistics -->\n <h3 class=\"text-xs font-semibold text-neutral-400 uppercase tracking-wider mb-3\">\n Statistics\n </h3>\n\n <div class=\"grid grid-cols-2 gap-2 mb-4\">\n <div class=\"bg-neutral-800/60 border border-neonDefault rounded p-2 text-center\">\n <div class=\"text-lg font-bold text-neutral-100\">{{ detail.session.promptCount }}</div>\n <div class=\"text-[10px] text-neutral-500\">Prompts</div>\n </div>\n <div class=\"bg-neutral-800/60 border border-neonDefault rounded p-2 text-center\">\n <div class=\"text-lg font-bold text-neutral-100\">{{ detail.session.toolCallCount }}</div>\n <div class=\"text-[10px] text-neutral-500\">Tool Calls</div>\n </div>\n </div>\n\n @if (detail.session.lastPrompt) {\n <div class=\"mb-3\">\n <div class=\"text-[10px] text-neutral-500 uppercase tracking-wider mb-1\">Last Prompt</div>\n <div class=\"text-xs text-neutral-400 line-clamp-3\">{{ detail.session.lastPrompt }}</div>\n </div>\n }\n\n <!-- Divider -->\n <hr class=\"border-neutral-700/50 my-3\">\n\n <!-- Timestamps -->\n <h3 class=\"text-xs font-semibold text-neutral-400 uppercase tracking-wider mb-3\">\n Timestamps\n </h3>\n\n @if (detail.session.startedAt) {\n <div class=\"mb-2\">\n <div class=\"text-[10px] text-neutral-500 uppercase tracking-wider mb-0.5\">Started</div>\n <div class=\"text-xs text-neutral-400\" [title]=\"detail.session.startedAt | sAbsoluteTime\">{{ detail.session.startedAt | sTimeAgo }}</div>\n </div>\n }\n\n @if (detail.session.lastActivityAt) {\n <div class=\"mb-2\">\n <div class=\"text-[10px] text-neutral-500 uppercase tracking-wider mb-0.5\">Last Activity</div>\n <div class=\"text-xs text-neutral-400\" [title]=\"detail.session.lastActivityAt | sAbsoluteTime\">{{ detail.session.lastActivityAt | sTimeAgo }}</div>\n </div>\n }\n\n @if (detail.session.completedAt) {\n <div class=\"mb-2\">\n <div class=\"text-[10px] text-neutral-500 uppercase tracking-wider mb-0.5\">Completed</div>\n <div class=\"text-xs text-neutral-400\" [title]=\"detail.session.completedAt | sAbsoluteTime\">{{ detail.session.completedAt | sTimeAgo }}</div>\n </div>\n }\n\n <!-- Configuration -->\n <hr class=\"border-neutral-700/50 my-3\">\n\n <h3 class=\"text-xs font-semibold text-neutral-400 uppercase tracking-wider mb-3\">\n Configuration\n </h3>\n\n @if (detail.session.activeModel || detail.session.model) {\n <div class=\"mb-2\">\n <div class=\"text-[10px] text-neutral-500 uppercase tracking-wider mb-0.5\">Model</div>\n <div class=\"text-xs text-neutral-400\">{{ detail.session.activeModel || detail.session.model }}</div>\n </div>\n }\n\n @if (detail.session.mode) {\n <div class=\"mb-2\">\n <div class=\"text-[10px] text-neutral-500 uppercase tracking-wider mb-0.5\">Mode</div>\n <div class=\"text-xs text-neutral-400\">{{ detail.session.mode }}</div>\n </div>\n }\n\n @if (detail.session.permissionPolicy) {\n <div class=\"mb-2\">\n <div class=\"text-[10px] text-neutral-500 uppercase tracking-wider mb-0.5\">Permission</div>\n <div class=\"text-xs text-neutral-400\">{{ detail.session.permissionPolicy }}</div>\n </div>\n }\n\n @if (detail.session.reasoningEffort) {\n <div class=\"mb-2\">\n <div class=\"text-[10px] text-neutral-500 uppercase tracking-wider mb-0.5\">Effort</div>\n <div class=\"text-xs text-neutral-400\">{{ detail.session.reasoningEffort }}</div>\n </div>\n }\n\n @if (detail.session.maxTurns) {\n <div class=\"mb-2\">\n <div class=\"text-[10px] text-neutral-500 uppercase tracking-wider mb-0.5\">Max Turns</div>\n <div class=\"text-xs text-neutral-400\">{{ detail.session.maxTurns }}</div>\n </div>\n }\n\n <!-- REQ-CC-DEBUG-STATUS-001 Part 1: per-session debug-mode flag clickable toggle.\n Klikkre a PATCH /:sessionId/config endpoint-on flippeli a flag-et;\n a következő CLI spawn-on `--debug` flag-gel indul (true), vagy nélküle (false). -->\n <div class=\"mb-2\">\n <div class=\"text-[10px] text-neutral-500 uppercase tracking-wider mb-0.5\">Debug Mode</div>\n @if (detail.session.isDebugMode) {\n <button type=\"button\"\n class=\"text-xs px-2 py-0.5 rounded border border-amber-700 text-amber-400\n hover:border-amber-500 hover:text-amber-300 transition-colors duration-150\"\n (click)=\"handleToggleDebugMode(detail.session.sessionId, true)\"\n title=\"CLI --debug flag aktív — klikk a kikapcsoláshoz\">\n on (--debug)\n </button>\n } @else {\n <button type=\"button\"\n class=\"text-xs px-2 py-0.5 rounded border border-neutral-700 text-neutral-500\n hover:border-neutral-500 hover:text-neutral-300 transition-colors duration-150\"\n (click)=\"handleToggleDebugMode(detail.session.sessionId, false)\"\n title=\"CLI --debug flag inaktív — klikk a bekapcsoláshoz\">\n off\n </button>\n }\n </div>\n\n <!-- Usage -->\n @if (detail.session.inputTokensTotal || detail.session.outputTokensTotal || detail.session.costUsdTotal) {\n <hr class=\"border-neutral-700/50 my-3\">\n\n <h3 class=\"text-xs font-semibold text-neutral-400 uppercase tracking-wider mb-3\">\n Usage\n </h3>\n\n <div class=\"grid grid-cols-2 gap-2 mb-2\">\n <div class=\"bg-neutral-800/60 border border-neonDefault rounded p-2 text-center\">\n <div class=\"text-sm font-bold text-neutral-100\">{{ formatTokens(detail.session.inputTokensTotal) }}</div>\n <div class=\"text-[10px] text-neutral-500\">Input</div>\n </div>\n <div class=\"bg-neutral-800/60 border border-neonDefault rounded p-2 text-center\">\n <div class=\"text-sm font-bold text-neutral-100\">{{ formatTokens(detail.session.outputTokensTotal) }}</div>\n <div class=\"text-[10px] text-neutral-500\">Output</div>\n </div>\n </div>\n\n @if (detail.session.costUsdTotal) {\n <div class=\"mb-2\">\n <div class=\"text-[10px] text-neutral-500 uppercase tracking-wider mb-0.5\">Cost</div>\n <div class=\"text-xs text-neonGreen font-mono\">${{ detail.session.costUsdTotal.toFixed(4) }}</div>\n </div>\n }\n }\n\n <!-- Runtime info -->\n <hr class=\"border-neutral-700/50 my-3\">\n\n <h3 class=\"text-xs font-semibold text-neutral-400 uppercase tracking-wider mb-3\">\n Runtime\n </h3>\n\n <div class=\"mb-2\">\n <div class=\"text-[10px] text-neutral-500 uppercase tracking-wider mb-0.5\">Live</div>\n <div class=\"text-xs\" [class]=\"detail.runtime.isLive ? 'text-neonGreen' : 'text-neutral-500'\">\n {{ detail.runtime.isLive ? 'Yes' : 'No' }}\n </div>\n </div>\n\n @if (detail.runtime.runtimeStatus) {\n <div class=\"mb-2\">\n <div class=\"text-[10px] text-neutral-500 uppercase tracking-wider mb-0.5\">Runtime Status</div>\n <div class=\"text-xs text-neutral-400\">{{ detail.runtime.runtimeStatus }}</div>\n </div>\n }\n\n <div class=\"mb-2\">\n <div class=\"text-[10px] text-neutral-500 uppercase tracking-wider mb-0.5\">Output Buffer</div>\n <div class=\"text-xs text-neutral-400\">{{ detail.runtime.outputBufferLength }} lines</div>\n </div>\n\n <div class=\"mb-2\">\n <div class=\"text-[10px] text-neutral-500 uppercase tracking-wider mb-0.5\">Runner Mode</div>\n <div class=\"text-xs text-neutral-400\">\n {{ detail.runtime.isTerminalMode ? 'terminal' : 'direct' }}\n </div>\n </div>\n\n @if (detail.runtime.isTerminalMode) {\n <div class=\"mb-2\">\n <div class=\"text-[10px] text-neutral-500 uppercase tracking-wider mb-0.5\">Runner</div>\n <div class=\"text-xs\" [class]=\"detail.runtime.isTerminalRunnerConnected ? 'text-neonGreen' : 'text-amber-400'\">\n {{ detail.runtime.isTerminalRunnerConnected ? 'connected' : 'disconnected' }}\n </div>\n </div>\n }\n </div>\n\n <!-- Archive confirm modal -->\n <app-s-modal [isOpen]=\"isArchiveConfirmOpen_$()\"\n [title]=\"detail.session.isArchived ? 'Unarchive Session' : 'Archive Session'\"\n [maxWidth]=\"'sm'\"\n [closeOnBackdropClick]=\"true\"\n (closed)=\"isArchiveConfirmOpen_$.set(false)\">\n <p class=\"text-sm text-neutral-300 mb-4\">\n {{ detail.session.isArchived\n ? 'Are you sure you want to unarchive this session?'\n : 'Are you sure you want to archive this session?' }}\n </p>\n <div class=\"flex justify-end gap-2\">\n <button\n class=\"px-3 py-1.5 text-xs border border-neonDefault text-neutral-300 hover:bg-neutral-700 rounded transition-colors\"\n (click)=\"isArchiveConfirmOpen_$.set(false)\">\n Cancel\n </button>\n <button\n class=\"px-3 py-1.5 text-xs border border-amber-500 text-amber-400 hover:bg-amber-500 hover:text-white rounded transition-colors\"\n (click)=\"handleConfirmToggleArchive(detail.session)\">\n {{ detail.session.isArchived ? 'Unarchive' : 'Archive' }}\n </button>\n </div>\n </app-s-modal>\n}\n\n<!-- REQ-SCH-IND-CLICK-001 toolbar follow-up (cycle 203): Schedule popup. -->\n<app-sch-schedule-popup\n [sessionId]=\"schedulePopupSessionId_$()\"\n [isOpen]=\"schedulePopupSessionId_$() !== null\"\n (closed)=\"handleCloseSchedulePopup()\" />\n\n<!-- REQ-SES-CRD-IND-001 Slice 3 toolbar follow-up (cycle 203): Coordinator popup. -->\n<app-crd-info-popup\n [sessionId]=\"coordinatorPopupSessionId_$()\"\n [isOpen]=\"coordinatorPopupSessionId_$() !== null\"\n (closed)=\"handleCloseCoordinatorPopup()\" />\n", "import { Component, inject, OnDestroy, OnInit, signal } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\n\nimport { DyNX_SubscriptionControl } from '@futdevpro/ngx-dynamo';\n\nimport { ClaudeCode_DataService } from '../../_services/claude-code.data-service';\nimport { CC_DetailUi_DataService } from '../../_services/cc-detail-ui.data-service';\nimport { CC_InputStorage_Util } from '../../_collections/cc-input-storage.util';\nimport { ExS_InstanceContext_DataService } from '../../../../_services/exs-instance-context.data-service';\nimport {\n SESSION_DETAIL_METADATA_DEFAULT_WIDTH_PX,\n SESSION_DETAIL_METADATA_MAX_WIDTH_PX,\n SESSION_DETAIL_METADATA_MIN_WIDTH_PX,\n SESSION_DETAIL_TIMELINE_DEFAULT_WIDTH_PX,\n SESSION_DETAIL_TIMELINE_MAX_WIDTH_PX,\n SESSION_DETAIL_TIMELINE_MIN_WIDTH_PX,\n} from '../../../../../shared/_collections/consts/session-detail-panel-layout.const';\nimport { SHR_DocumentPointerDrag_Util } from '../../../../../shared/_collections/utils/shr-document-pointer-drag.util';\n\n/**\n * Claude Code Session detail view.\n * Három oszlop: metadata (bal), console, timeline (jobb) — közös layout komponens.\n * Top action bar: shell + CC_DetailUi_DataService.\n */\n@Component({\n selector: 'app-ccap-cc-detail',\n templateUrl: './cc-detail.component.html',\n host: { class: 'flex flex-col flex-1 min-h-0 overflow-hidden' },\n})\n/** CC_Detail_Component class. */\nexport class CC_Detail_Component extends DyNX_SubscriptionControl implements OnInit, OnDestroy {\n\n readonly ccSession_DS: ClaudeCode_DataService =\n inject(ClaudeCode_DataService);\n\n readonly detailUi_DS: CC_DetailUi_DataService =\n inject(CC_DetailUi_DataService);\n\n private readonly peiContext_DS: ExS_InstanceContext_DataService =\n inject(ExS_InstanceContext_DataService);\n\n private readonly route: ActivatedRoute = inject(ActivatedRoute);\n private readonly router: Router = inject(Router);\n\n readonly sessionId_$ = signal<string>('');\n\n readonly metadataWidth_$ = signal<number>(SESSION_DETAIL_METADATA_DEFAULT_WIDTH_PX);\n\n readonly timelineWidth_$ = signal<number>(SESSION_DETAIL_TIMELINE_DEFAULT_WIDTH_PX);\n\n readonly isResizing_$ = signal<boolean>(false);\n\n\n ngOnInit(): void {\n this.metadataWidth_$.set(\n Math.max(\n SESSION_DETAIL_METADATA_MIN_WIDTH_PX,\n Math.min(\n SESSION_DETAIL_METADATA_MAX_WIDTH_PX,\n CC_InputStorage_Util.loadPanelWidth('metadata', SESSION_DETAIL_METADATA_DEFAULT_WIDTH_PX),\n ),\n ),\n );\n this.timelineWidth_$.set(\n Math.max(\n SESSION_DETAIL_TIMELINE_MIN_WIDTH_PX,\n Math.min(\n SESSION_DETAIL_TIMELINE_MAX_WIDTH_PX,\n CC_InputStorage_Util.loadPanelWidth('timeline', SESSION_DETAIL_TIMELINE_DEFAULT_WIDTH_PX),\n ),\n ),\n );\n\n this.addSubscription(this.route.params.subscribe(\n (params: Record<string, string>): void => {\n const sessionId: string = params.sessionId ?? '';\n // Cycle 785 (REQ-INST-SES-URL-001): a `:ccapId/:sessionId` 2-param\n // route param-jából vesszük az instance kontextust, ha jelen van.\n // 1-param legacy route: ccapId üres marad → meglévő `peiContext_DS`\n // (sessionStorage / current local) határozza meg.\n const ccapIdFromUrl: string = params.ccapId ?? '';\n this.sessionId_$.set(sessionId);\n\n if (sessionId) {\n CC_InputStorage_Util.saveLastSessionId(sessionId);\n if (ccapIdFromUrl) {\n CC_InputStorage_Util.saveLastCcapId(ccapIdFromUrl);\n }\n // BUG-INST-SES-REFRESH-001 (cycle 433): cross-instance session direct\n // load (F5 / refresh / mély URL) esetén a peiContext sessionStorage\n // restore-ja még nem futott le → activeCcapId üres, fetch a lokálisra\n // megy és 404 jön egy remote session-en. `ensureInitialized()` await-tel\n // garantáljuk, hogy a registry + sessionStorage restore befejeződik az\n // első session fetch előtt.\n this.peiContext_DS.ensureInitialized().then((): void => {\n // Cycle 785: ha az URL-ben van ccapId, állítsuk be aktív instance-nek\n // a fetch-ek ELŐTT (selectInstance perzisztálja sessionStorage-be is).\n // Az `activeCcapId_$` azonnali hatállyal frissül, így a következő\n // load-hívások már a megfelelő instance-re mennek.\n if (ccapIdFromUrl && this.peiContext_DS.activeCcapId_$() !== ccapIdFromUrl) {\n this.peiContext_DS.selectInstance(ccapIdFromUrl);\n }\n\n // BUG-CC-SWITCH-FLICKER-001 #3 (cycle 771): clearLiveOutput ELŐTT\n // setActiveSessionId — eddigi sorrend (set→clear→load) race-window-ot\n // hagyott, amiben a setActiveSessionId által trigger-elt socket\n // SUBSCRIBE event-ei az új sessionId-ra a régi state-be merge-elődtek\n // mielőtt a clearLiveOutput nullázott. Új sorrend: clear (UI üres)\n // → set (subscribe, events az üres state-be jönnek) → load (REST,\n // stale-guard a data-service-ben).\n this.ccSession_DS.clearLiveOutput();\n this.ccSession_DS.setActiveSessionId(sessionId);\n this.ccSession_DS.loadSessionDetail({\n sessionId: sessionId,\n });\n this.ccSession_DS.loadSessionEvents({\n sessionId: sessionId,\n });\n // REQ-CC-RATE-001 Slice 3b — bootstrap: persisted per-instance\n // rate-limit state lekérése, hogy a header mutathassa a last-known\n // állapotot oldalfrissítés / új UI session után is, a socket-chunk\n // érkezése előtt. Fire-and-forget (data-service best-effort wrap).\n const ccapIdForRateLimit: string = this.peiContext_DS.activeCcapId_$();\n if (ccapIdForRateLimit) {\n this.ccSession_DS.loadPersistedRateLimitState({\n ccapId: ccapIdForRateLimit,\n }).catch((): void => {\n // Hiba esetén a data-service már DyFM_Log.warn-ba logol.\n });\n }\n });\n } else {\n // Cycle 785: empty route — a meglévő lastSessionId mellett a\n // lastCcapId-t is próbáljuk visszaállítani, hogy refresh után az\n // ugyanazon instance ugyanazon session-jét nyissuk vissza.\n const lastSessionId: string = CC_InputStorage_Util.loadLastSessionId();\n const lastCcapId: string = CC_InputStorage_Util.loadLastCcapId();\n if (lastSessionId) {\n const target: string[] = lastCcapId\n ? ['/cc-session', lastCcapId, lastSessionId]\n : ['/cc-session', lastSessionId];\n this.router.navigate(target, { replaceUrl: true });\n }\n }\n },\n ));\n }\n\n override ngOnDestroy(): void {\n // Aktív session leiratkozás — a setActiveSessionId('') triggereli a\n // cc-session:unsubscribe socket emit-et, így a szerver monitoring service\n // nem tart fenn watcher bejegyzést egy már nem létező komponenshez.\n // CA mintát követi: ca-detail.component.ts:149.\n this.ccSession_DS.setActiveSessionId('');\n super.ngOnDestroy();\n }\n\n handleMetadataResizeStart(event: PointerEvent): void {\n const startWidth: number = this.metadataWidth_$();\n const startX: number = event.clientX;\n this.isResizing_$.set(true);\n SHR_DocumentPointerDrag_Util.attachUntilPointerUp({\n startEvent: event,\n onMove: (e: PointerEvent): void => {\n const delta: number = e.clientX - startX;\n const newWidth: number = Math.max(\n SESSION_DETAIL_METADATA_MIN_WIDTH_PX,\n Math.min(SESSION_DETAIL_METADATA_MAX_WIDTH_PX, startWidth + delta),\n );\n this.metadataWidth_$.set(newWidth);\n },\n onEnd: (): void => {\n this.isResizing_$.set(false);\n CC_InputStorage_Util.savePanelWidth('metadata', this.metadataWidth_$());\n },\n });\n }\n\n handleTimelineResizeStart(event: PointerEvent): void {\n const startWidth: number = this.timelineWidth_$();\n const startX: number = event.clientX;\n this.isResizing_$.set(true);\n SHR_DocumentPointerDrag_Util.attachUntilPointerUp({\n startEvent: event,\n onMove: (e: PointerEvent): void => {\n const delta: number = startX - e.clientX;\n const newWidth: number = Math.max(\n SESSION_DETAIL_TIMELINE_MIN_WIDTH_PX,\n Math.min(SESSION_DETAIL_TIMELINE_MAX_WIDTH_PX, startWidth + delta),\n );\n this.timelineWidth_$.set(newWidth);\n },\n onEnd: (): void => {\n this.isResizing_$.set(false);\n CC_InputStorage_Util.savePanelWidth('timeline', this.timelineWidth_$());\n },\n });\n }\n}\n", "@if (ccSession_DS.selectedSessionLoading_$()) {\n <div class=\"flex items-center justify-center h-full text-neutral-500 text-sm\">\n Loading session...\n </div>\n} @else if (ccSession_DS.selectedSession_$()) {\n <app-s-session-detail-three-column-layout\n [isStartOpen]=\"detailUi_DS.isMetadataPanelOpen_$()\"\n [isEndOpen]=\"detailUi_DS.isTimelinePanelOpen_$()\"\n [startWidthPx]=\"metadataWidth_$()\"\n [endWidthPx]=\"timelineWidth_$()\"\n [isResizing]=\"isResizing_$()\"\n (startResizeStart)=\"handleMetadataResizeStart($event)\"\n (endResizeStart)=\"handleTimelineResizeStart($event)\">\n <div sDetailColumnStart>\n <app-ccap-cc-metadata />\n </div>\n <div sDetailColumnMain>\n <app-ccap-cc-console\n [sessionId]=\"sessionId_$()\"\n [isShowSessionStatus]=\"detailUi_DS.isShowSessionStatus_$()\"\n [isShowAgentUpdates]=\"detailUi_DS.isShowAgentUpdates_$()\" />\n </div>\n <div sDetailColumnEnd>\n <app-ccap-cc-timeline />\n </div>\n </app-s-session-detail-three-column-layout>\n} @else {\n <div class=\"flex items-center justify-center h-full text-neutral-500 text-sm\">\n Select a session to view details\n </div>\n}\n", "import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { RouterModule, Routes } from '@angular/router';\n\nimport { CCAP_VoiceRecordButton_Component } from '../../../../_components/ccap-voice-record-button/ccap-voice-record-button.component';\nimport { S_InstanceChipRowWithInfo_Component } from '../../../shared/_components/s-instance-chip-row-with-info/s-instance-chip-row-with-info.component';\nimport { S_Modal_Component } from '../../../shared/_components/s-modal/s-modal.component';\nimport { S_AgentToolPlanView_Component } from '../../../shared/_components/session-ui/agent-tool-widgets/s-agent-tool-plan-view/s-agent-tool-plan-view.component';\nimport { S_AgentToolTodoList_Component } from '../../../shared/_components/session-ui/agent-tool-widgets/s-agent-tool-todo-list/s-agent-tool-todo-list.component';\nimport { CRD_InfoPopup_Component } from '../../../coordinator/_components/crd-info-popup/crd-info-popup.component';\nimport { SCH_SchedulePopup_Component } from '../../../scheduler/_components/sch-schedule-popup/sch-schedule-popup.component';\nimport {\n S_SessionScheduleOverlay_Component,\n} from '../../../shared/_components/session-ui/s-session-schedule-overlay/s-session-schedule-overlay.component';\nimport {\n S_SessionQuickCast_Overlay_Component,\n} from '../../../shared/_components/session-ui/s-session-quickcast-overlay/s-session-quickcast-overlay.component';\nimport {\n S_SessionCoordinator_Overlay_Component,\n} from '../../../shared/_components/session-ui/s-session-coordinator-overlay/s-session-coordinator-overlay.component';\nimport {\n S_SessionQuickSettings_Overlay_Component,\n} from '../../../shared/_components/session-ui/s-session-quick-settings-overlay/s-session-quick-settings-overlay.component';\nimport { Shared_Module } from '../../../shared/shared.module';\nimport { CC_Shell_Component } from './_components/ccap-cc-shell/cc-shell.component';\nimport { CC_Dashboard_Component } from './_components/ccap-cc-dashboard/cc-dashboard.component';\nimport { CC_Detail_Component } from './_components/ccap-cc-detail/cc-detail.component';\nimport { CC_Console_Component } from './_components/ccap-cc-console/cc-console.component';\nimport { CC_Timeline_Component } from './_components/ccap-cc-timeline/cc-timeline.component';\nimport { CC_Metadata_Component } from './_components/ccap-cc-metadata/cc-metadata.component';\nimport { CC_StatusColor_Pipe } from './_pipes/cc-status-color.pipe';\nimport { CC_EventTypeColor_Pipe } from './_pipes/cc-event-type-color.pipe';\nimport { CC_JsonFormat_Pipe } from './_pipes/cc-json-format.pipe';\n\n/**\n * Claude Code Session module route-ok.\n * Shell layout: sidebar (dashboard) + detail area.\n */\nconst ccSessionRoutes: Routes = [\n {\n path: '',\n component: CC_Shell_Component,\n children: [\n {\n path: '',\n pathMatch: 'full',\n component: CC_Detail_Component,\n },\n // Cycle 785 (REQ-INST-SES-URL-001): a `:ccapId/:sessionId` 2-param route\n // a meglévő 1-param `:sessionId` ELŐTT regisztrálva (more specific first).\n // Refresh / cross-instance link megnyitásakor a UI tudja melyik instance\n // session-jét kell megnyitnia. Az 1-param legacy fallback-et továbbra is\n // támogatjuk (current ccapId scope), hogy a régebbi bookmark-ok ne\n // törjenek.\n {\n path: ':ccapId/:sessionId',\n component: CC_Detail_Component,\n },\n {\n path: ':sessionId',\n component: CC_Detail_Component,\n },\n ],\n },\n];\n\n/**\n * Claude Code Session Toolkit Angular module.\n * Session dashboard, detail, live console, event timeline, metadata panel.\n */\n@NgModule({\n declarations: [\n CC_Shell_Component,\n CC_Dashboard_Component,\n CC_Detail_Component,\n CC_Console_Component,\n CC_Timeline_Component,\n CC_Metadata_Component,\n CC_StatusColor_Pipe,\n CC_EventTypeColor_Pipe,\n CC_JsonFormat_Pipe,\n ],\n imports: [\n CommonModule,\n FormsModule,\n RouterModule.forChild(ccSessionRoutes),\n S_InstanceChipRowWithInfo_Component,\n S_Modal_Component,\n CCAP_VoiceRecordButton_Component,\n S_AgentToolPlanView_Component,\n S_AgentToolTodoList_Component,\n SCH_SchedulePopup_Component,\n S_SessionScheduleOverlay_Component,\n S_SessionQuickCast_Overlay_Component,\n S_SessionCoordinator_Overlay_Component,\n S_SessionQuickSettings_Overlay_Component,\n CRD_InfoPopup_Component,\n Shared_Module,\n ],\n})\n/** CcSession_Module class. */\nexport class CcSession_Module {}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["\u0275\u0275elementStart", "\u0275\u0275element", "\u0275\u0275elementEnd", "\u0275\u0275text", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r3", "ctx_r1", "\u0275\u0275nextContext", "\u0275\u0275resetView", "handleAccept", "$event", "_r1", "handleAssistantMdClick", "\u0275\u0275template", "S_AgentToolPlanView_Component_Conditional_0_Conditional_3_Template", "S_AgentToolPlanView_Component_Conditional_0_Conditional_4_Template", "\u0275\u0275advance", "\u0275\u0275property", "ctx", "\u0275\u0275sanitizeHtml", "\u0275\u0275conditional", "isAccepted_$", "S_AgentToolPlanView_Component", "sanitizer", "inject", "DomSanitizer", "globalError_CS", "CCAP_GlobalError_ControlService", "rawData", "input", "undefined", "accepted", "output", "signal", "planText_$", "computed", "data", "inputObj", "plan", "planHtml_$", "html", "CCAP_AssistantMarkdownRender_Util", "toSanitizedHtml", "bypassSecurityTrustHtml", "set", "emit", "event", "__async", "handleCodeCopyClick", "text", "copyToClipboard", "selectors", "hostAttrs", "inputs", "outputs", "standalone", "features", "\u0275\u0275StandaloneFeature", "decls", "vars", "consts", "template", "rf", "S_AgentToolPlanView_Component_Conditional_0_Template", "tmp_0_0", "CommonModule", "styles", "\u0275\u0275elementStart", "\u0275\u0275element", "\u0275\u0275elementEnd", "\u0275\u0275text", "\u0275\u0275advance", "\u0275\u0275textInterpolate", "todo_r1", "activeForm", "\u0275\u0275template", "S_AgentToolTodoList_Component_Conditional_0_For_7_Case_1_Template", "S_AgentToolTodoList_Component_Conditional_0_For_7_Case_2_Template", "S_AgentToolTodoList_Component_Conditional_0_For_7_Case_3_Template", "S_AgentToolTodoList_Component_Conditional_0_For_7_Conditional_7_Template", "\u0275\u0275conditional", "tmp_11_0", "status", "\u0275\u0275property", "\u0275\u0275pureFunction3", "_c0", "content", "\u0275\u0275repeaterCreate", "S_AgentToolTodoList_Component_Conditional_0_For_7_Template", "_forTrack0", "\u0275\u0275textInterpolate2", "ctx_r1", "completedCount_$", "totalCount_$", "\u0275\u0275repeater", "todos_$", "S_AgentToolTodoList_Component", "rawData", "input", "undefined", "computed", "data", "inputObj", "todos", "Array", "isArray", "filter", "t", "length", "selectors", "hostAttrs", "inputs", "standalone", "features", "\u0275\u0275StandaloneFeature", "decls", "vars", "consts", "template", "rf", "ctx", "S_AgentToolTodoList_Component_Conditional_0_Template", "CommonModule", "NgClass", "encapsulation", "STORAGE_PREFIX", "CC_InputStorage_Util", "saveProjectFilter", "value", "Shr_LocalStoragePersistence_Util", "writeString", "loadProjectFilter", "readString", "saveLastWorkspacePath", "loadLastWorkspacePath", "saveLastLabel", "loadLastLabel", "savePromptDraft", "sessionId", "content", "SHR_PromptDraftStorage_Util", "saveDraft", "loadPromptDraft", "loadDraft", "clearPromptDraft", "clearDraft", "hasPromptDraft", "hasDraft", "savePanelOpen", "panelKey", "isOpen", "writeBoolean", "loadPanelOpen", "defaultOpen", "readBoolean", "savePanelWidth", "width", "writeNumber", "loadPanelWidth", "defaultWidth", "readNumber", "saveSessionMode", "loadSessionMode", "saveSessionEffort", "loadSessionEffort", "saveSessionModel", "loadSessionModel", "saveStatusHistory", "loadStatusHistory", "saveLastSessionId", "loadLastSessionId", "saveLastCcapId", "ccapId", "loadLastCcapId", "saveShowStatusUpdates", "loadShowStatusUpdates", "saveShowArchived", "loadShowArchived", "CC_DetailUi_DataService", "ccSession_DS", "inject", "ClaudeCode_DataService", "isTimelinePanelOpen_$", "signal", "CC_InputStorage_Util", "loadPanelOpen", "isMetadataPanelOpen_$", "isResuming_$", "isTerminating_$", "isStopping_$", "isForking_$", "isShowSessionStatus_$", "loadStatusHistory", "isShowAgentUpdates_$", "loadShowStatusUpdates", "handleToggleTimeline", "newValue", "set", "savePanelOpen", "handleToggleMetadata", "handleToggleSessionStatus", "saveStatusHistory", "handleToggleAgentUpdates", "saveShowStatusUpdates", "handleResume", "__async", "selected", "selectedSession_$", "sessionId", "session", "resumeSession", "handleStopExecution", "stopExecution", "handleFork", "claudeSessionId", "forkSession", "handleTerminate", "terminateSession", "factory", "\u0275fac", "providedIn", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275property", "project_r1", "localPath", "\u0275\u0275advance", "\u0275\u0275textInterpolate", "name", "\u0275\u0275template", "CC_Dashboard_Component_For_15_Conditional_0_Template", "\u0275\u0275conditional", "\u0275\u0275listener", "$event", "\u0275\u0275restoreView", "_r2", "ctx_r2", "\u0275\u0275nextContext", "\u0275\u0275resetView", "handleSelectSession", "handleRowContextMenu", "handleScheduleIndicatorClick", "handleCoordinatorIndicatorClick", "sessionRowViews_$", "ccSession_DS", "activeSessionId_$", "opt_r5", "path", "\u0275\u0275textInterpolate2", "label", "_r4", "handlePathOptionChange", "\u0275\u0275repeaterCreate", "CC_Dashboard_Component_Conditional_27_For_4_Template", "_forTrack1", "selectedPathOption_$", "\u0275\u0275repeater", "newAgentSessionWorkspace_DS", "workspacePathPickerOptions_$", "_r7", "renameInput_r8", "\u0275\u0275reference", "renameValue_$", "set", "value", "handleCtxRenameConfirm", "handleCloseCtxMenu", "_r10", "handleCtxResume", "\u0275\u0275element", "_r11", "handleCtxTerminate", "_r9", "handleCtxCopyLink", "CC_Dashboard_Component_Conditional_40_Conditional_3_Case_1_Template", "CC_Dashboard_Component_Conditional_40_Conditional_3_Case_2_Template", "CC_Dashboard_Component_Conditional_40_Conditional_3_Case_3_Template", "handleCtxRenameStart", "handleCtxToggleArchive", "CC_Dashboard_Component_Conditional_40_Conditional_3_Conditional_8_Template", "CC_Dashboard_Component_Conditional_40_Conditional_3_Conditional_9_Template", "linkCopyState_$", "tmp_4_0", "\u0275\u0275textInterpolate1", "ctxSession_r12", "isArchived", "status", "_r6", "CC_Dashboard_Component_Conditional_40_Conditional_2_Template", "CC_Dashboard_Component_Conditional_40_Conditional_3_Template", "\u0275\u0275styleProp", "ctxMenuPos_$", "x", "y", "isRenaming_$", "CC_Dashboard_Component", "inject", "ClaudeCode_DataService", "ExS_NewAgentWorkspace_DataService", "pm_DS", "ProjectManagement_DataService", "peiContext_DS", "ExS_InstanceContext_DataService", "scheduledJobs_DS", "SCH_ScheduledJobs_DataService", "coordinator_DS", "Coordinator_DataService", "router", "Router", "globalError_CS", "CCAP_GlobalError_ControlService", "instanceChangeEffect", "effect", "ccapId", "activeCcapId_$", "includeArchived", "showArchived_$", "untracked", "loadSessions", "undefined", "projectFilter_$", "signal", "filteredSessions_$", "computed", "sessions", "sessions_$", "filter", "normFilter", "normalizePath", "s", "workspacePath", "scheduledIds", "scheduledSessionIds_$", "coordinatedIds", "coordinatedSessionIds_$", "map", "id", "sessionId", "statusColorClass", "S_SessionStatusColor_Util", "resolve", "lastActivityAt", "promptCount", "isRunning", "hasSchedule", "has", "hasCoordinator", "hasDraft", "CC_InputStorage_Util", "hasPromptDraft", "isCreateDialogOpen_$", "schedulePopupSessionId_$", "coordinatorPopupSessionId_$", "newSessionWorkspacePath_$", "newSessionLabel_$", "isCreating_$", "sessionSelected", "output", "ctxMenuSession_$", "ngOnInit", "savedProjectFilter", "loadProjectFilter", "savedShowArchived", "loadShowArchived", "projectsLoadedOnce_$", "projectsLoading_$", "loadProjects", "ensureInitialized", "then", "loadAll", "loadAllCoordinatorsForManagementPage", "target", "navigate", "emit", "handleOpenCreateDialog", "__async", "refreshWorkspacePathPickerOptions", "fallback", "resolveInitialWorkspacePath", "lastWorkspacePath", "loadLastWorkspacePath", "isInOptions", "some", "opt", "savedLabel", "loadLastLabel", "handleCloseCreateDialog", "handleCreateSession", "saveLastWorkspacePath", "saveLastLabel", "savedMode", "loadSessionMode", "savedEffort", "loadSessionEffort", "createSession", "mode", "reasoningEffort", "handleProjectFilterChange", "saveProjectFilter", "handleToggleShowArchived", "newValue", "saveShowArchived", "handleRefresh", "handleToggleArchive", "event", "session", "stopPropagation", "setSessionArchived", "payload", "find", "clientX", "clientY", "handleCloseSchedulePopup", "handleCloseCoordinatorPopup", "url", "window", "location", "origin", "result", "copyToClipboard", "ok", "setTimeout", "input", "document", "querySelector", "focus", "select", "newLabel", "trim", "updateSessionConfig", "terminateSession", "resumeSession", "normalized", "toLowerCase", "replace", "endsWith", "length", "slice", "selectors", "hostAttrs", "outputs", "decls", "vars", "consts", "template", "rf", "ctx", "CC_Dashboard_Component_For_15_Template", "_forTrack0", "CC_Dashboard_Component_Conditional_19_Template", "CC_Dashboard_Component_Conditional_20_Template", "CC_Dashboard_Component_Conditional_21_Template", "CC_Dashboard_Component_Conditional_22_Template", "CC_Dashboard_Component_Conditional_27_Template", "CC_Dashboard_Component_Conditional_40_Template", "projects_$", "\u0275\u0275classMap", "sessionsLoading_$", "sessionsLoadError_$", "tmp_23_0", "CC_StatusColor_Pipe", "transform", "status", "pure", "\u0275\u0275element", "\u0275\u0275elementStart", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r2", "ctx_r2", "\u0275\u0275nextContext", "\u0275\u0275resetView", "detailUi_DS", "handleToggleMetadata", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275classMap", "isMetadataPanelOpen_$", "\u0275\u0275template", "CC_Shell_Component_Conditional_11_Conditional_2_Conditional_2_Template", "\u0275\u0275property", "\u0275\u0275pipeBind1", "ccCtx_r4", "detail", "session", "status", "\u0275\u0275advance", "\u0275\u0275conditional", "runtime", "isLive", "CC_Shell_Component_Conditional_11_Conditional_2_Template", "CC_Shell_Component_Conditional_11_Conditional_3_Template", "title", "\u0275\u0275textInterpolate1", "isLoading", "showActions", "_r6", "handleStopExecution", "isStopping_$", "\u0275\u0275declareLet", "_r5", "handleToggleTimeline", "handleForkSession", "CC_Shell_Component_Conditional_13_Conditional_7_Template", "isTimelinePanelOpen_$", "isForking_$", "shellDetail_r7", "claudeSessionId", "CC_Shell_Component", "router", "inject", "Router", "peiContext_DS", "ExS_InstanceContext_DataService", "ccSession_DS", "ClaudeCode_DataService", "CC_DetailUi_DataService", "sidebarWidth_$", "signal", "SESSION_SHELL_SIDEBAR_DEFAULT_WIDTH_PX", "isSidebarOpen_$", "isResizing_$", "ccTopBarContext_$", "computed", "activeId", "activeSessionId_$", "loading", "selectedSessionLoading_$", "sel", "selectedSession_$", "fromList", "sessions_$", "find", "s", "sessionId", "detailMatches", "label", "ngOnInit", "stored", "CC_InputStorage_Util", "loadPanelWidth", "set", "Math", "max", "SESSION_SHELL_SIDEBAR_MIN_WIDTH_PX", "min", "SESSION_SHELL_SIDEBAR_MAX_WIDTH_PX", "loadPanelOpen", "handleSidebarResizeStart", "event", "startX", "clientX", "startWidth", "SHR_DocumentPointerDrag_Util", "attachUntilPointerUp", "startEvent", "onMove", "e", "delta", "newWidth", "onEnd", "savePanelWidth", "handleToggleSidebar", "update", "v", "savePanelOpen", "handleSessionSelectedFromDashboard", "window", "innerWidth", "SESSION_SHELL_MOBILE_BREAKPOINT_PX", "__async", "newSessionId", "handleFork", "ccapId", "activeCcapId_$", "target", "navigate", "selectors", "hostAttrs", "decls", "vars", "consts", "template", "rf", "ctx", "i0", "_r1", "CC_Shell_Component_Conditional_8_Template", "CC_Shell_Component_Conditional_9_Template", "CC_Shell_Component_Conditional_11_Template", "CC_Shell_Component_Conditional_13_Template", "$event", "\u0275\u0275classProp", "\u0275\u0275storeLet", "ccCtx_r8", "import_fsm_dynamo", "CC_Mode_Type", "CC_Model_Type", "CC_CcConsoleToBubbleView_Util", "fromDisplayItem", "item", "kind", "mapMessageTypeToKind", "messageType", "paired", "pairedResult", "text", "expandableContent", "rawData", "isError", "undefined", "useEditDiffForExpandable", "toolName", "listKey", "bodyText", "subtype", "isUserAligned", "flags", "showCopy", "showRawInfo", "CCAP_AgentConsoleBubbleKind_Type", "userPrompt", "assistant", "tool", "toolResult", "error", "info", "status", "result", "runIntent", "iteration", "thinking", "statusUpdate", "raw", "toolGroup", "subAgentGroup", "CC_JsonFormat_Pipe", "sanitizer", "constructor", "transform", "data", "bypassSecurityTrustHtml", "json", "JSON", "stringify", "highlighted", "highlightJson", "MULTILINE_THRESHOLD", "replace", "match", "test", "length", "includes", "formatMultilineString", "slice", "\u0275\u0275directiveInject", "DomSanitizer", "pure", "\u0275\u0275elementStart", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r2", "ctx_r2", "\u0275\u0275nextContext", "\u0275\u0275resetView", "handleStickyPromptClick", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275element", "\u0275\u0275advance", "\u0275\u0275textInterpolate", "lastPromptText_$", "_r4", "item_r5", "$implicit", "handleOpenInfoPopup", "_r6", "handlePlanAccepted", "\u0275\u0275property", "rawData", "\u0275\u0275template", "CC_Console_Component_ng_template_1_Case_0_Conditional_2_Conditional_5_Template", "CC_Console_Component_ng_template_1_Case_0_Conditional_2_Conditional_6_Template", "CC_Console_Component_ng_template_1_Case_0_Conditional_2_Conditional_7_Template", "\u0275\u0275pipeBind1", "tmp_7_0", "toolName", "undefined", "\u0275\u0275sanitizeHtml", "\u0275\u0275conditional", "_r7", "handleOpenPairedResultInfo", "text", "tmp_9_0", "toolDescription", "pairedResult", "tmp_12_0", "expandableContent", "tmp_13_0", "CC_Console_Component_ng_template_1_Case_0_Conditional_2_Template", "CC_Console_Component_ng_template_1_Case_0_Conditional_3_Template", "_r8", "groupItem_r9", "tmp_17_0", "tmp_19_0", "tmp_22_0", "tmp_23_0", "CC_Console_Component_ng_template_1_Case_1_For_11_Conditional_0_Template", "CC_Console_Component_ng_template_1_Case_1_For_11_Conditional_1_Template", "messageType", "\u0275\u0275repeaterCreate", "CC_Console_Component_ng_template_1_Case_1_For_11_Template", "_forTrack1", "groupToolName", "\u0275\u0275repeater", "groupItems", "$event", "_r10", "stopPropagation", "i0", "_r11", "\u0275\u0275elementContainer", "itemRenderer_r13", "\u0275\u0275pureFunction1", "_c2", "subItem_r12", "CC_Console_Component_ng_template_1_Case_2_For_22_Conditional_0_Template", "$index_r14", "CC_Console_Component_ng_template_1_Case_2_Conditional_15_Template", "CC_Console_Component_ng_template_1_Case_2_Conditional_16_Template", "CC_Console_Component_ng_template_1_Case_2_Conditional_19_Template", "CC_Console_Component_ng_template_1_Case_2_For_22_Template", "length", "_r15", "CC_Console_Component_ng_template_1_Case_3_Conditional_5_Template", "CC_Console_Component_ng_template_1_Case_4_Conditional_4_Template", "isLatestMessage", "\u0275\u0275textInterpolate1", "_r16", "CC_Console_Component_ng_template_1_Case_6_Conditional_11_Template", "_r17", "CC_Console_Component_ng_template_1_Case_7_Conditional_5_Template", "subtype", "_r18", "CC_Console_Component_ng_template_1_Case_8_Conditional_6_Template", "CC_Console_Component_ng_template_1_Case_8_Conditional_7_Template", "_r19", "CC_Console_Component_ng_template_1_Case_9_Conditional_8_Template", "CC_Console_Component_ng_template_1_Case_9_Conditional_9_Template", "CC_Console_Component_ng_template_1_Case_0_Template", "CC_Console_Component_ng_template_1_Case_1_Template", "CC_Console_Component_ng_template_1_Case_2_Template", "CC_Console_Component_ng_template_1_Case_3_Template", "CC_Console_Component_ng_template_1_Case_4_Template", "CC_Console_Component_ng_template_1_Case_5_Template", "CC_Console_Component_ng_template_1_Case_6_Template", "CC_Console_Component_ng_template_1_Case_7_Template", "CC_Console_Component_ng_template_1_Case_8_Template", "CC_Console_Component_ng_template_1_Case_9_Template", "tmp_5_0", "_r20", "handleTtsCached", "turn_r21", "promptBubbleView", "_r22", "\u0275\u0275classProp", "item_r23", "\u0275\u0275classMap", "bubbleView", "CC_Console_Component_For_8_Conditional_1_For_9_Conditional_0_Template", "CC_Console_Component_For_8_Conditional_1_For_9_Conditional_1_Template", "CC_Console_Component_For_8_Conditional_1_For_9_Template", "items", "CC_Console_Component_For_8_Conditional_0_Template", "CC_Console_Component_For_8_Conditional_1_Template", "CC_Console_Component_Conditional_9_Conditional_0_Template", "CC_Console_Component_Conditional_9_Conditional_1_Template", "ccSession_DS", "assembledMessagesLoaded_$", "rawBundle_r25", "primaryJson", "\u0275\u0275textInterpolate2", "part_r26", "index", "streamParts", "json", "CC_Console_Component_Conditional_19_Conditional_9_For_4_Template", "_forTrack2", "pairedJson", "_r24", "handleCopyLast30Events", "CC_Console_Component_Conditional_19_Conditional_2_Template", "CC_Console_Component_Conditional_19_Conditional_3_Template", "handleCopyInfoPopup", "CC_Console_Component_Conditional_19_Conditional_5_Template", "CC_Console_Component_Conditional_19_Conditional_6_Template", "CC_Console_Component_Conditional_19_Conditional_8_Template", "CC_Console_Component_Conditional_19_Conditional_9_Template", "CC_Console_Component_Conditional_19_Conditional_10_Template", "isLast30Copied_$", "isInfoCopied_$", "showStreamBreakdown", "CC_Console_Component", "sessionId", "input", "inject", "ClaudeCode_DataService", "detailUi_DS", "CC_DetailUi_DataService", "sessionQueue_DS", "ExS_Queue_DataService", "voiceInputUi_DS", "VNP_InputUi_DataService", "ttsCachedKeys_$", "signal", "Set", "messageKey", "update", "s", "promptInput_$", "isAutoScroll_$", "isSending_$", "isExecuting_$", "computed", "selectedSession_$", "session", "status", "selectedMode_$", "CC_InputStorage_Util", "loadSessionMode", "CC_Mode_Type", "normal", "selectedEffort_$", "loadSessionEffort", "Tls_ModelTestReasoningLevel_Type", "high", "selectedModel_$", "loadSessionModel", "CC_Model_Type", "sonnet", "modeOptions", "plan", "effortOptions", "none", "low", "mid", "modelOptions", "opus", "haiku", "modelName_$", "detail", "activeModel", "model", "usage_$", "sessionUsage_$", "usageText_$", "u", "totalTokens", "tokensFormatted", "toFixed", "String", "costFormatted", "costUsd", "chatTurns_$", "assembled", "assembledMessages_$", "buildTurnsFromAssembledMessages", "messages", "consoleMessages_$", "showStatusHistory", "isShowSessionStatus", "showStatusUpdates", "isShowAgentUpdates", "sid", "cached", "turns", "currentTurn", "msg", "type", "promptText", "promptListKey", "listKey", "kind", "CCAP_AgentConsoleBubbleKind_Type", "userPrompt", "bodyText", "timestampIso", "timestamp", "isUserAligned", "flags", "showCopy", "showRawInfo", "useEditDiffForExpandable", "tts", "trim", "role", "content", "hasTtsAudio", "has", "imageDataUrls", "push", "item", "isStatus", "parentAgentId", "extractToolNameFromMsg", "extractToolDescription", "lastTurn", "turn", "lastStatusIndex", "i", "filter", "idx", "pairToolCallsWithResults", "groupSubAgentItems", "groupConsecutiveToolItems", "map", "it", "bv", "CC_CcConsoleToBubbleView_Util", "fromDisplayItem", "Date", "toISOString", "__spreadProps", "__spreadValues", "stickyPromptInfo_$", "isShowStickyPrompt_$", "isInfoPopupOpen_$", "infoPopupBundle_$", "infoPopupTitle_$", "chatScrollRef", "sessionInputRef", "pendingAttachments_$", "previousItemCount", "constructor", "effect", "id", "draft", "loadPromptDraft", "set", "subscribeToSession", "baseRoute", "allowSignalWrites", "ngOnDestroy", "unsubscribe", "ngAfterViewChecked", "console", "currentCount", "scrollToBottom", "handleSendPrompt", "__async", "attachments", "clearPromptDraft", "sendPrompt", "clearAttachments", "savePromptDraft", "handleAttachmentsChanged", "handlePromptInputChange", "value", "handleQuickCastAction", "trimmed", "handleVoiceSegment", "event", "t", "current", "next", "autoSendAfterVoice_$", "isFinal", "handleRestartRunnerClicked", "restartRunner", "catch", "err", "DyFM_Log", "error", "handleKeydown", "key", "shiftKey", "preventDefault", "handleSelectMode", "mode", "saveSessionMode", "updateSessionConfig", "handleSelectEffort", "effort", "saveSessionEffort", "reasoningEffort", "handleSelectModel", "saveSessionModel", "handleChatScroll", "el", "nativeElement", "updateStickyPrompt", "isAtBottom", "scrollHeight", "scrollTop", "clientHeight", "assembledMessagesHasMore_$", "loadOlderMessages", "viewportTop", "getBoundingClientRect", "top", "promptEls", "querySelectorAll", "isCurrentlyShown", "showThreshold", "hideThreshold", "found", "promptEl", "rect", "threshold", "bottom", "getAttribute", "info", "querySelector", "containerRect", "promptRect", "stickyThreshold", "prevScrollHeight", "loadOlderAssembledMessages", "requestAnimationFrame", "newScrollHeight", "SHR_AgentConsoleRawOverlay_Util", "ccItemHasAnyRaw", "buildForCcConsoleItem", "handleCloseInfoPopup", "bundle", "navigator", "clipboard", "writeText", "copyJsonString", "then", "setTimeout", "last30", "slice", "jsonString", "JSON", "stringify", "toolIdToIndex", "Map", "toolId", "size", "pairedIndices", "toolUseId", "tool_use_id", "toolIndex", "get", "add", "_", "name", "tool_name", "last_tool_name", "colonIdx", "indexOf", "substring", "inputObj", "desc", "extractToolName", "agentItems", "agentId", "agentChildren", "consumedIndices", "children", "result", "subItems", "subagentType", "description", "groupLabel", "groupedSubItems", "isTaskProgressToolMsg", "messageRole", "lastToolName", "isTaskProgressTool", "effectiveRole", "mapAssembledRoleToMessageType", "toolResult", "isError", "pendingGroup", "pendingToolName", "flushGroup", "toolCount", "element", "selectors", "viewQuery", "rf", "ctx", "CC_Console_Component_Conditional_0_Template", "CC_Console_Component_ng_template_1_Template", "\u0275\u0275templateRefExtractor", "_r1", "CC_Console_Component_Conditional_6_Template", "CC_Console_Component_For_8_Template", "_forTrack0", "CC_Console_Component_Conditional_9_Template", "handleStopExecution", "startEditing", "editingText_$", "saveEdit", "cancelEdit", "removeItem", "sendNow", "reorderItem", "queueItemId", "direction", "CC_Console_Component_Conditional_19_Template", "isLoadingOlderMessages_$", "isStopping_$", "items_$", "isLocked_$", "editingItemId_$", "tmp_31_0", "CC_EventTypeColor_Pipe", "transform", "eventType", "pure", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275element", "\u0275\u0275property", "\u0275\u0275pipeBind1", "event_r3", "data", "\u0275\u0275sanitizeHtml", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r2", "$implicit", "ctx_r3", "\u0275\u0275nextContext", "\u0275\u0275resetView", "handleToggleEvent", "sequence", "\u0275\u0275template", "CC_Timeline_Component_For_16_Conditional_2_Template", "$event", "handleCopyEvent", "CC_Timeline_Component_For_16_Conditional_13_Template", "CC_Timeline_Component_For_16_Conditional_14_Template", "CC_Timeline_Component_For_16_Conditional_15_Template", "\u0275\u0275advance", "\u0275\u0275conditional", "eventSource", "eventType", "\u0275\u0275textInterpolate1", "timestamp", "copiedSequence_$", "isExpanded", "CC_Timeline_Component", "ccSession_DS", "inject", "ClaudeCode_DataService", "detailUi_DS", "CC_DetailUi_DataService", "globalError_CS", "CCAP_GlobalError_ControlService", "expandedSequences_$", "signal", "Set", "isAutoScroll_$", "eventListRef", "previousEventCount", "ngAfterViewChecked", "currentCount", "selectedSessionEvents_$", "length", "scrollToBottom", "current", "next", "has", "delete", "add", "set", "handleToggleAutoScroll", "update", "v", "event", "mouseEvent", "__async", "stopPropagation", "text", "JSON", "stringify", "copyToClipboard", "ok", "setTimeout", "element", "nativeElement", "scrollTop", "scrollHeight", "selectors", "viewQuery", "rf", "ctx", "i0", "_r1", "handleToggleSessionStatus", "handleToggleAgentUpdates", "\u0275\u0275repeaterCreate", "CC_Timeline_Component_For_16_Template", "_forTrack0", "CC_Timeline_Component_Conditional_17_Template", "\u0275\u0275classMap", "isShowSessionStatus_$", "isShowAgentUpdates_$", "\u0275\u0275repeater", "import_fsm_dynamo", "\u0275\u0275elementStart", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r2", "ctx_r2", "\u0275\u0275nextContext", "\u0275\u0275resetView", "handleScheduleBadgeClick", "\u0275\u0275element", "\u0275\u0275elementEnd", "_r4", "handleCoordinatorBadgeClick", "_r5", "detailUi_DS", "handleResume", "\u0275\u0275text", "\u0275\u0275property", "isResuming_$", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "\u0275\u0275textInterpolate2", "rateLimitScopeLabel_$", "rateLimitPercent_$", "\u0275\u0275declareLet", "rateLimitInfo_$", "\u0275\u0275classMap", "isRateLimitOverThreshold_$", "rl_r7", "status", "rateLimitType", "\u0275\u0275styleProp", "rateLimitThresholdPercent_$", "\u0275\u0275textInterpolate", "rateLimitResetText_$", "isUsingOverage", "\u0275\u0275pipeBind2", "receivedAt", "_r6", "handleToggleRateLimit", "\u0275\u0275template", "CC_Metadata_Component_Conditional_0_Conditional_20_Conditional_4_Template", "CC_Metadata_Component_Conditional_0_Conditional_20_Conditional_5_Template", "\u0275\u0275conditional", "detail_r8", "session", "statusMessage", "actorLabel", "actorId", "processId", "claudeSessionId", "lastPrompt", "\u0275\u0275pipeBind1", "startedAt", "lastActivityAt", "completedAt", "activeModel", "model", "mode", "permissionPolicy", "reasoningEffort", "maxTurns", "_r9", "handleToggleDebugMode", "sessionId", "_r10", "costUsdTotal", "toFixed", "CC_Metadata_Component_Conditional_0_Conditional_77_Conditional_14_Template", "formatTokens", "inputTokensTotal", "outputTokensTotal", "runtime", "runtimeStatus", "isTerminalRunnerConnected", "CC_Metadata_Component_Conditional_0_Conditional_5_Template", "CC_Metadata_Component_Conditional_0_Conditional_6_Template", "_r1", "isArchiveConfirmOpen_$", "set", "CC_Metadata_Component_Conditional_0_Conditional_10_Template", "handleRestartRunner", "CC_Metadata_Component_Conditional_0_Conditional_18_Template", "CC_Metadata_Component_Conditional_0_Conditional_19_Template", "CC_Metadata_Component_Conditional_0_Conditional_20_Template", "CC_Metadata_Component_Conditional_0_Conditional_28_Template", "CC_Metadata_Component_Conditional_0_Conditional_29_Template", "CC_Metadata_Component_Conditional_0_Conditional_40_Template", "CC_Metadata_Component_Conditional_0_Conditional_41_Template", "CC_Metadata_Component_Conditional_0_Conditional_42_Template", "CC_Metadata_Component_Conditional_0_Conditional_57_Template", "CC_Metadata_Component_Conditional_0_Conditional_61_Template", "CC_Metadata_Component_Conditional_0_Conditional_62_Template", "CC_Metadata_Component_Conditional_0_Conditional_63_Template", "CC_Metadata_Component_Conditional_0_Conditional_67_Template", "CC_Metadata_Component_Conditional_0_Conditional_68_Template", "CC_Metadata_Component_Conditional_0_Conditional_69_Template", "CC_Metadata_Component_Conditional_0_Conditional_70_Template", "CC_Metadata_Component_Conditional_0_Conditional_71_Template", "CC_Metadata_Component_Conditional_0_Conditional_75_Template", "CC_Metadata_Component_Conditional_0_Conditional_76_Template", "CC_Metadata_Component_Conditional_0_Conditional_77_Template", "CC_Metadata_Component_Conditional_0_Conditional_86_Template", "CC_Metadata_Component_Conditional_0_Conditional_97_Template", "handleConfirmToggleArchive", "hasSchedule_$", "hasCoordinator_$", "isArchived", "isRateLimitOpen_$", "isLive", "workspacePath", "promptCount", "toolCallCount", "isDebugMode", "outputBufferLength", "isTerminalMode", "CC_Metadata_Component", "ccSession_DS", "inject", "ClaudeCode_DataService", "CC_DetailUi_DataService", "scheduledJobs_DS", "SCH_ScheduledJobs_DataService", "coordinator_DS", "Coordinator_DataService", "computed", "sid", "activeSessionId_$", "scheduledSessionIds_$", "has", "coordinatedSessionIds_$", "signal", "schedulePopupSessionId_$", "coordinatorPopupSessionId_$", "handleCloseSchedulePopup", "handleCloseCoordinatorPopup", "currentSessionId", "currentValue", "next", "updateSessionConfig", "catch", "err", "DyFM_Log", "error", "CC_RateLimitDisplay_Util", "formatResetText", "computeUtilizationPercent", "computeThresholdPercent", "formatLimitScopeLabel", "isOverThreshold", "ngOnInit", "jobs_$", "length", "loadAll", "globalCoordinatorsList_$", "loadAllCoordinatorsForManagementPage", "update", "v", "__async", "setSessionArchived", "restartRunner", "count", "String", "selectors", "hostAttrs", "decls", "vars", "consts", "template", "rf", "ctx", "CC_Metadata_Component_Conditional_0_Template", "tmp_0_0", "selectedSession_$", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275listener", "$event", "\u0275\u0275restoreView", "_r1", "ctx_r1", "\u0275\u0275nextContext", "\u0275\u0275resetView", "handleMetadataResizeStart", "handleTimelineResizeStart", "\u0275\u0275element", "\u0275\u0275property", "detailUi_DS", "isMetadataPanelOpen_$", "isTimelinePanelOpen_$", "metadataWidth_$", "timelineWidth_$", "isResizing_$", "\u0275\u0275advance", "sessionId_$", "isShowSessionStatus_$", "isShowAgentUpdates_$", "CC_Detail_Component", "DyNX_SubscriptionControl", "ccSession_DS", "inject", "ClaudeCode_DataService", "CC_DetailUi_DataService", "peiContext_DS", "ExS_InstanceContext_DataService", "route", "ActivatedRoute", "router", "Router", "signal", "SESSION_DETAIL_METADATA_DEFAULT_WIDTH_PX", "SESSION_DETAIL_TIMELINE_DEFAULT_WIDTH_PX", "ngOnInit", "set", "Math", "max", "SESSION_DETAIL_METADATA_MIN_WIDTH_PX", "min", "SESSION_DETAIL_METADATA_MAX_WIDTH_PX", "CC_InputStorage_Util", "loadPanelWidth", "SESSION_DETAIL_TIMELINE_MIN_WIDTH_PX", "SESSION_DETAIL_TIMELINE_MAX_WIDTH_PX", "addSubscription", "params", "subscribe", "sessionId", "ccapIdFromUrl", "ccapId", "saveLastSessionId", "saveLastCcapId", "ensureInitialized", "then", "activeCcapId_$", "selectInstance", "clearLiveOutput", "setActiveSessionId", "loadSessionDetail", "loadSessionEvents", "ccapIdForRateLimit", "loadPersistedRateLimitState", "catch", "lastSessionId", "loadLastSessionId", "lastCcapId", "loadLastCcapId", "target", "navigate", "replaceUrl", "ngOnDestroy", "event", "startWidth", "startX", "clientX", "SHR_DocumentPointerDrag_Util", "attachUntilPointerUp", "startEvent", "onMove", "e", "delta", "newWidth", "onEnd", "savePanelWidth", "__ngFactoryType__", "selectors", "hostAttrs", "features", "\u0275\u0275InheritDefinitionFeature", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275template", "CC_Detail_Component_Conditional_0_Template", "CC_Detail_Component_Conditional_1_Template", "CC_Detail_Component_Conditional_2_Template", "\u0275\u0275conditional", "selectedSessionLoading_$", "selectedSession_$", "ccSessionRoutes", "path", "component", "CC_Shell_Component", "children", "pathMatch", "CC_Detail_Component", "CcSession_Module", "CommonModule", "FormsModule", "RouterModule", "forChild", "S_InstanceChipRowWithInfo_Component", "S_Modal_Component", "CCAP_VoiceRecordButton_Component", "S_AgentToolPlanView_Component", "S_AgentToolTodoList_Component", "SCH_SchedulePopup_Component", "S_SessionCoordinator_Overlay_Component", "CRD_InfoPopup_Component", "Shared_Module"]
|
|
7
|
-
}
|