@futdevpro/ccap 1.1.3209 → 1.1.3215
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-TOVF7OGE.js → agent-instances.module-CPUH35EZ.js} +2 -2
- package/client-dist/{ca.module-PELEUDRO.js → ca.module-U7YZDJ2S.js} +2 -2
- package/client-dist/{cc-usage-dashboard.component-3CLKBRWS.js → cc-usage-dashboard.component-A3NQVGUQ.js} +2 -2
- package/client-dist/cc.module-4FCJFHDX.js +4 -0
- package/client-dist/cc.module-4FCJFHDX.js.map +7 -0
- package/client-dist/{chunk-MKIF46NN.js → chunk-2PQXI7I7.js} +2 -2
- package/client-dist/{chunk-OHDXL37J.js → chunk-33VVBKU2.js} +2 -2
- package/client-dist/{chunk-WYRL3C73.js → chunk-4CLEKS5Z.js} +2 -2
- package/client-dist/{chunk-5UIJATAP.js → chunk-4LLJ2OWZ.js} +2 -2
- package/client-dist/{chunk-J5VSYIES.js → chunk-4ZFB25GK.js} +2 -2
- package/client-dist/{chunk-7NJCIURA.js → chunk-5ZJE7DIO.js} +2 -2
- package/client-dist/{chunk-7V4ZNBJF.js → chunk-6BFD2NWY.js} +2 -2
- package/client-dist/{chunk-QPZRMQWP.js → chunk-6C4DDRK2.js} +2 -2
- package/client-dist/{chunk-YLSYNVOV.js → chunk-6JOKYIHX.js} +2 -2
- package/client-dist/{chunk-IKK7M54T.js → chunk-7NMJB7CI.js} +2 -2
- package/client-dist/{chunk-3OBMQG46.js → chunk-AC2BVG34.js} +2 -2
- package/client-dist/{chunk-FF2QNCSF.js → chunk-AWXOKP4G.js} +2 -2
- package/client-dist/{chunk-HTKSLPAL.js → chunk-AYF66J6F.js} +2 -2
- package/client-dist/{chunk-76HYCYXW.js → chunk-BW23SNBJ.js} +2 -2
- package/client-dist/{chunk-IGG3GQLN.js → chunk-CFK7FARI.js} +2 -2
- package/client-dist/{chunk-IGG3GQLN.js.map → chunk-CFK7FARI.js.map} +1 -1
- package/client-dist/{chunk-FRUAWHFY.js → chunk-CRSKI2X4.js} +2 -2
- package/client-dist/{chunk-FXWFJQW5.js → chunk-EEPAM5ZQ.js} +2 -2
- package/client-dist/{chunk-AHFCJSKA.js → chunk-EVTV632M.js} +2 -2
- package/client-dist/{chunk-OCL5DFSX.js → chunk-FWTMQSVZ.js} +2 -2
- package/client-dist/{chunk-Y54UGA2E.js → chunk-GO5RFW3F.js} +2 -2
- package/client-dist/{chunk-CJJJKLPE.js → chunk-HL6WDI7B.js} +2 -2
- package/client-dist/{chunk-4ZVVJVIG.js → chunk-IAE5NGVM.js} +3 -3
- package/client-dist/chunk-IAE5NGVM.js.map +7 -0
- package/client-dist/{chunk-C7OCFO6L.js → chunk-IDUC3D4V.js} +2 -2
- package/client-dist/{chunk-R3YJQT2X.js → chunk-IZCGZPDO.js} +2 -2
- package/client-dist/{chunk-KMMPO5C2.js → chunk-JZY65LIL.js} +2 -2
- package/client-dist/{chunk-TT6C54SM.js → chunk-LHK7W77S.js} +2 -2
- package/client-dist/{chunk-VGT6DN5Y.js → chunk-LPDRQ6SN.js} +2 -2
- package/client-dist/{chunk-K2TBFQNN.js → chunk-MC4INR7S.js} +2 -2
- package/client-dist/{chunk-R3KCCU5X.js → chunk-MHKJKJVA.js} +2 -2
- package/client-dist/{chunk-R4UDOCIC.js → chunk-MHOWIGRN.js} +2 -2
- package/client-dist/{chunk-R63QKJPP.js → chunk-MVVOW5DK.js} +2 -2
- package/client-dist/{chunk-OF3S2PZG.js → chunk-MW4XS5NJ.js} +2 -2
- package/client-dist/{chunk-RYKXC4KW.js → chunk-O4Z7O66B.js} +2 -2
- package/client-dist/{chunk-XVHXFOA5.js → chunk-OG3BXORU.js} +2 -2
- package/client-dist/{chunk-L2AXDGKT.js → chunk-OHLE7T6H.js} +2 -2
- package/client-dist/{chunk-5UFNUASG.js → chunk-OKI5V6YQ.js} +2 -2
- package/client-dist/{chunk-3CF7O4AN.js → chunk-PIXU7VL6.js} +2 -2
- package/client-dist/{chunk-5243KW2A.js → chunk-PTO335OR.js} +2 -2
- package/client-dist/{chunk-XT2XKM3N.js → chunk-PVZP6QNW.js} +2 -2
- package/client-dist/{chunk-LCFZF5YU.js → chunk-Q4JCVLZX.js} +2 -2
- package/client-dist/{chunk-2HUT6Y5D.js → chunk-QHOO5EGB.js} +2 -2
- package/client-dist/{chunk-7T24ZCH6.js → chunk-QIGBGNDG.js} +2 -2
- package/client-dist/{chunk-HGPDPOEE.js → chunk-QRP3ANHZ.js} +2 -2
- package/client-dist/{chunk-GMCHKMIP.js → chunk-ROQIRXTO.js} +2 -2
- package/client-dist/{chunk-YSELPXUR.js → chunk-S72KII3A.js} +2 -2
- package/client-dist/{chunk-5VZUGORY.js → chunk-S7U2FMEE.js} +2 -2
- package/client-dist/{chunk-JO6AMYVX.js → chunk-SARZNHM5.js} +2 -2
- package/client-dist/{chunk-XTGG3P5E.js → chunk-SZ5YB5I5.js} +2 -2
- package/client-dist/{chunk-PBZX3SFR.js → chunk-TTTWIDBQ.js} +2 -2
- package/client-dist/{chunk-ILWMCTQJ.js → chunk-U6C6SLYE.js} +2 -2
- package/client-dist/{chunk-P35RYM56.js → chunk-UL3CZNH7.js} +2 -2
- package/client-dist/{chunk-ORV4WU55.js → chunk-VSFMGBJ5.js} +2 -2
- package/client-dist/{chunk-D5EESFD5.js → chunk-VYHAGBS4.js} +2 -2
- package/client-dist/{chunk-EAUKVLYQ.js → chunk-X3MZFTMO.js} +2 -2
- package/client-dist/{chunk-OC4ZYNE2.js → chunk-XGSTC65N.js} +2 -2
- package/client-dist/{chunk-ALX3ZY7O.js → chunk-YWMRQJRC.js} +2 -2
- package/client-dist/{consultant.module-FVVSC2BB.js → consultant.module-4Z3WDA2D.js} +2 -2
- package/client-dist/{crd.module-STMYW33Y.js → crd.module-EVPCDOWY.js} +2 -2
- package/client-dist/{dashboard.module-7VO3AEND.js → dashboard.module-XOGM4333.js} +2 -2
- package/client-dist/{do.module-7LENVNH3.js → do.module-2QODL2MZ.js} +2 -2
- package/client-dist/{document-library.module-LVCWDJES.js → document-library.module-6W5KJ6EM.js} +2 -2
- package/client-dist/{embedding-eval.module-2UUNWNSX.js → embedding-eval.module-VBH5UZ2A.js} +2 -2
- package/client-dist/{embedding-registry.module-4ACHVP5S.js → embedding-registry.module-4QXZMK6L.js} +2 -2
- package/client-dist/{err.module-DS4UXER2.js → err.module-4WYVCGZK.js} +2 -2
- package/client-dist/{feedback.module-JLUL4RMM.js → feedback.module-O32WDW4G.js} +2 -2
- package/client-dist/{host-runtime-mcp.module-CI37DAL5.js → host-runtime-mcp.module-JNYMDS2F.js} +2 -2
- package/client-dist/index.html +1 -1
- package/client-dist/{live-dev-pipeline.module-V5UBTZ6S.js → live-dev-pipeline.module-BAG7LJBJ.js} +2 -2
- package/client-dist/{logs.module-KVG4N625.js → logs.module-PZQTAXGV.js} +2 -2
- package/client-dist/{main-GDH2UE25.js → main-PYXFCW2K.js} +3 -3
- package/client-dist/{master-control-remote-poc.module-KBU5WYFP.js → master-control-remote-poc.module-K2PT5FB2.js} +2 -2
- package/client-dist/{mobile-app.module-JQHXVVTC.js → mobile-app.module-TUVMDOPA.js} +2 -2
- package/client-dist/{model-registry.module-G3PD62OY.js → model-registry.module-E7NAPF2Y.js} +2 -2
- package/client-dist/{oc.module-FOPPTPYU.js → oc.module-HFDDW2XD.js} +2 -2
- package/client-dist/{orc.module-TO45BX6C.js → orc.module-K277LTLC.js} +2 -2
- package/client-dist/{project-management.module-2LL2OYRL.js → project-management.module-JZVMTKGP.js} +2 -2
- package/client-dist/project-source-routed.module-MD2ZFK3N.js +2 -0
- package/client-dist/{scheduler.module-VGVWKH37.js → scheduler.module-6NC3BKNE.js} +2 -2
- package/client-dist/{session.module-QPNXVPCI.js → session.module-DG7H2GJT.js} +2 -2
- package/client-dist/{set.module-PCFKH2IZ.js → set.module-I3FJ3Q2M.js} +2 -2
- package/client-dist/{setup.module-4B5S2337.js → setup.module-JT7PN7FK.js} +2 -2
- package/client-dist/{terminals.module-N6ROSMA6.js → terminals.module-EDF4WYNX.js} +2 -2
- package/client-dist/{voice-notes-poc.module-RZQ26RE7.js → voice-notes-poc.module-CENJQVZI.js} +2 -2
- package/client-dist/{wfs.module-DTEGI4ND.js → wfs.module-XGMD3EUF.js} +2 -2
- package/package.json +1 -1
- package/client-dist/cc.module-CN3YLXNH.js +0 -4
- package/client-dist/cc.module-CN3YLXNH.js.map +0 -7
- package/client-dist/chunk-4ZVVJVIG.js.map +0 -7
- package/client-dist/project-source-routed.module-EKUKXTHV.js +0 -2
- /package/client-dist/{agent-instances.module-TOVF7OGE.js.map → agent-instances.module-CPUH35EZ.js.map} +0 -0
- /package/client-dist/{ca.module-PELEUDRO.js.map → ca.module-U7YZDJ2S.js.map} +0 -0
- /package/client-dist/{cc-usage-dashboard.component-3CLKBRWS.js.map → cc-usage-dashboard.component-A3NQVGUQ.js.map} +0 -0
- /package/client-dist/{chunk-MKIF46NN.js.map → chunk-2PQXI7I7.js.map} +0 -0
- /package/client-dist/{chunk-OHDXL37J.js.map → chunk-33VVBKU2.js.map} +0 -0
- /package/client-dist/{chunk-WYRL3C73.js.map → chunk-4CLEKS5Z.js.map} +0 -0
- /package/client-dist/{chunk-5UIJATAP.js.map → chunk-4LLJ2OWZ.js.map} +0 -0
- /package/client-dist/{chunk-J5VSYIES.js.map → chunk-4ZFB25GK.js.map} +0 -0
- /package/client-dist/{chunk-7NJCIURA.js.map → chunk-5ZJE7DIO.js.map} +0 -0
- /package/client-dist/{chunk-7V4ZNBJF.js.map → chunk-6BFD2NWY.js.map} +0 -0
- /package/client-dist/{chunk-QPZRMQWP.js.map → chunk-6C4DDRK2.js.map} +0 -0
- /package/client-dist/{chunk-YLSYNVOV.js.map → chunk-6JOKYIHX.js.map} +0 -0
- /package/client-dist/{chunk-IKK7M54T.js.map → chunk-7NMJB7CI.js.map} +0 -0
- /package/client-dist/{chunk-3OBMQG46.js.map → chunk-AC2BVG34.js.map} +0 -0
- /package/client-dist/{chunk-FF2QNCSF.js.map → chunk-AWXOKP4G.js.map} +0 -0
- /package/client-dist/{chunk-HTKSLPAL.js.map → chunk-AYF66J6F.js.map} +0 -0
- /package/client-dist/{chunk-76HYCYXW.js.map → chunk-BW23SNBJ.js.map} +0 -0
- /package/client-dist/{chunk-FRUAWHFY.js.map → chunk-CRSKI2X4.js.map} +0 -0
- /package/client-dist/{chunk-FXWFJQW5.js.map → chunk-EEPAM5ZQ.js.map} +0 -0
- /package/client-dist/{chunk-AHFCJSKA.js.map → chunk-EVTV632M.js.map} +0 -0
- /package/client-dist/{chunk-OCL5DFSX.js.map → chunk-FWTMQSVZ.js.map} +0 -0
- /package/client-dist/{chunk-Y54UGA2E.js.map → chunk-GO5RFW3F.js.map} +0 -0
- /package/client-dist/{chunk-CJJJKLPE.js.map → chunk-HL6WDI7B.js.map} +0 -0
- /package/client-dist/{chunk-C7OCFO6L.js.map → chunk-IDUC3D4V.js.map} +0 -0
- /package/client-dist/{chunk-R3YJQT2X.js.map → chunk-IZCGZPDO.js.map} +0 -0
- /package/client-dist/{chunk-KMMPO5C2.js.map → chunk-JZY65LIL.js.map} +0 -0
- /package/client-dist/{chunk-TT6C54SM.js.map → chunk-LHK7W77S.js.map} +0 -0
- /package/client-dist/{chunk-VGT6DN5Y.js.map → chunk-LPDRQ6SN.js.map} +0 -0
- /package/client-dist/{chunk-K2TBFQNN.js.map → chunk-MC4INR7S.js.map} +0 -0
- /package/client-dist/{chunk-R3KCCU5X.js.map → chunk-MHKJKJVA.js.map} +0 -0
- /package/client-dist/{chunk-R4UDOCIC.js.map → chunk-MHOWIGRN.js.map} +0 -0
- /package/client-dist/{chunk-R63QKJPP.js.map → chunk-MVVOW5DK.js.map} +0 -0
- /package/client-dist/{chunk-OF3S2PZG.js.map → chunk-MW4XS5NJ.js.map} +0 -0
- /package/client-dist/{chunk-RYKXC4KW.js.map → chunk-O4Z7O66B.js.map} +0 -0
- /package/client-dist/{chunk-XVHXFOA5.js.map → chunk-OG3BXORU.js.map} +0 -0
- /package/client-dist/{chunk-L2AXDGKT.js.map → chunk-OHLE7T6H.js.map} +0 -0
- /package/client-dist/{chunk-5UFNUASG.js.map → chunk-OKI5V6YQ.js.map} +0 -0
- /package/client-dist/{chunk-3CF7O4AN.js.map → chunk-PIXU7VL6.js.map} +0 -0
- /package/client-dist/{chunk-5243KW2A.js.map → chunk-PTO335OR.js.map} +0 -0
- /package/client-dist/{chunk-XT2XKM3N.js.map → chunk-PVZP6QNW.js.map} +0 -0
- /package/client-dist/{chunk-LCFZF5YU.js.map → chunk-Q4JCVLZX.js.map} +0 -0
- /package/client-dist/{chunk-2HUT6Y5D.js.map → chunk-QHOO5EGB.js.map} +0 -0
- /package/client-dist/{chunk-7T24ZCH6.js.map → chunk-QIGBGNDG.js.map} +0 -0
- /package/client-dist/{chunk-HGPDPOEE.js.map → chunk-QRP3ANHZ.js.map} +0 -0
- /package/client-dist/{chunk-GMCHKMIP.js.map → chunk-ROQIRXTO.js.map} +0 -0
- /package/client-dist/{chunk-YSELPXUR.js.map → chunk-S72KII3A.js.map} +0 -0
- /package/client-dist/{chunk-5VZUGORY.js.map → chunk-S7U2FMEE.js.map} +0 -0
- /package/client-dist/{chunk-JO6AMYVX.js.map → chunk-SARZNHM5.js.map} +0 -0
- /package/client-dist/{chunk-XTGG3P5E.js.map → chunk-SZ5YB5I5.js.map} +0 -0
- /package/client-dist/{chunk-PBZX3SFR.js.map → chunk-TTTWIDBQ.js.map} +0 -0
- /package/client-dist/{chunk-ILWMCTQJ.js.map → chunk-U6C6SLYE.js.map} +0 -0
- /package/client-dist/{chunk-P35RYM56.js.map → chunk-UL3CZNH7.js.map} +0 -0
- /package/client-dist/{chunk-ORV4WU55.js.map → chunk-VSFMGBJ5.js.map} +0 -0
- /package/client-dist/{chunk-D5EESFD5.js.map → chunk-VYHAGBS4.js.map} +0 -0
- /package/client-dist/{chunk-EAUKVLYQ.js.map → chunk-X3MZFTMO.js.map} +0 -0
- /package/client-dist/{chunk-OC4ZYNE2.js.map → chunk-XGSTC65N.js.map} +0 -0
- /package/client-dist/{chunk-ALX3ZY7O.js.map → chunk-YWMRQJRC.js.map} +0 -0
- /package/client-dist/{consultant.module-FVVSC2BB.js.map → consultant.module-4Z3WDA2D.js.map} +0 -0
- /package/client-dist/{crd.module-STMYW33Y.js.map → crd.module-EVPCDOWY.js.map} +0 -0
- /package/client-dist/{dashboard.module-7VO3AEND.js.map → dashboard.module-XOGM4333.js.map} +0 -0
- /package/client-dist/{do.module-7LENVNH3.js.map → do.module-2QODL2MZ.js.map} +0 -0
- /package/client-dist/{document-library.module-LVCWDJES.js.map → document-library.module-6W5KJ6EM.js.map} +0 -0
- /package/client-dist/{embedding-eval.module-2UUNWNSX.js.map → embedding-eval.module-VBH5UZ2A.js.map} +0 -0
- /package/client-dist/{embedding-registry.module-4ACHVP5S.js.map → embedding-registry.module-4QXZMK6L.js.map} +0 -0
- /package/client-dist/{err.module-DS4UXER2.js.map → err.module-4WYVCGZK.js.map} +0 -0
- /package/client-dist/{feedback.module-JLUL4RMM.js.map → feedback.module-O32WDW4G.js.map} +0 -0
- /package/client-dist/{host-runtime-mcp.module-CI37DAL5.js.map → host-runtime-mcp.module-JNYMDS2F.js.map} +0 -0
- /package/client-dist/{live-dev-pipeline.module-V5UBTZ6S.js.map → live-dev-pipeline.module-BAG7LJBJ.js.map} +0 -0
- /package/client-dist/{logs.module-KVG4N625.js.map → logs.module-PZQTAXGV.js.map} +0 -0
- /package/client-dist/{main-GDH2UE25.js.map → main-PYXFCW2K.js.map} +0 -0
- /package/client-dist/{master-control-remote-poc.module-KBU5WYFP.js.map → master-control-remote-poc.module-K2PT5FB2.js.map} +0 -0
- /package/client-dist/{mobile-app.module-JQHXVVTC.js.map → mobile-app.module-TUVMDOPA.js.map} +0 -0
- /package/client-dist/{model-registry.module-G3PD62OY.js.map → model-registry.module-E7NAPF2Y.js.map} +0 -0
- /package/client-dist/{oc.module-FOPPTPYU.js.map → oc.module-HFDDW2XD.js.map} +0 -0
- /package/client-dist/{orc.module-TO45BX6C.js.map → orc.module-K277LTLC.js.map} +0 -0
- /package/client-dist/{project-management.module-2LL2OYRL.js.map → project-management.module-JZVMTKGP.js.map} +0 -0
- /package/client-dist/{project-source-routed.module-EKUKXTHV.js.map → project-source-routed.module-MD2ZFK3N.js.map} +0 -0
- /package/client-dist/{scheduler.module-VGVWKH37.js.map → scheduler.module-6NC3BKNE.js.map} +0 -0
- /package/client-dist/{session.module-QPNXVPCI.js.map → session.module-DG7H2GJT.js.map} +0 -0
- /package/client-dist/{set.module-PCFKH2IZ.js.map → set.module-I3FJ3Q2M.js.map} +0 -0
- /package/client-dist/{setup.module-4B5S2337.js.map → setup.module-JT7PN7FK.js.map} +0 -0
- /package/client-dist/{terminals.module-N6ROSMA6.js.map → terminals.module-EDF4WYNX.js.map} +0 -0
- /package/client-dist/{voice-notes-poc.module-RZQ26RE7.js.map → voice-notes-poc.module-CENJQVZI.js.map} +0 -0
- /package/client-dist/{wfs.module-DTEGI4ND.js.map → wfs.module-XGMD3EUF.js.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["src/app/_modules/external-sessions/_modules/claude-code/_services/claude-code.data-service.ts", "src/app/_modules/shared/_collections/utils/shr-ext-message-chronological-sort.util.ts", "src/app/_modules/external-sessions/_modules/claude-code/_services/cc-socket-event-handler.control-service.ts"],
|
|
4
|
+
"sourcesContent": ["import { inject, Injectable, NgZone, OnDestroy, signal } from '@angular/core';\n\nimport { Subscription } from 'rxjs';\n\nimport { DyFM_Log, second } from '@futdevpro/fsm-dynamo';\n\nimport {\n CC_ListItem_Interface,\n CC_EventItem_Interface,\n CC_Detail_Response,\n} from '../_models/interfaces/cc-list-item.interface';\nimport { CCAP_ErrorDisplay_Util } from '../../../../../_collections/error/error-display.util';\nimport { CC_DiagnosticSnapshot_Response } from '../_models/interfaces/cc-diagnostic-snapshot.interface';\nimport { ClaudeCode_ApiService } from './claude-code.api-service';\nimport { ExS_Message_ApiService } from '../../../_services/exs-message.api-service';\nimport { CCAP_GlobalError_ControlService } from '../../../../../_services/control-services/ccap-global-error.control-service';\nimport { CCAP_Socket_ControlService } from '../../../../../_services/control-services/ccap-socket.control-service';\nimport { CCAP_ExtSessionMessage_Response } from '../../../../../_models/interfaces/shared/ccap-ext-message.interface';\nimport { Shr_ExtMessageChronologicalSort_Util } from '../../../../shared/_collections/utils/shr-ext-message-chronological-sort.util';\nimport {\n CC_DataServiceParent_Interface,\n CcSessionConsoleMessage_Interface,\n CcSessionUsage_Interface,\n CcSessionRateLimitInfo_Interface,\n} from './cc.data-service.interface';\nimport { CCAP_PendingAttachment_Interface } from '../../../../../_models/interfaces/session/ccap-pending-attachment.interface';\nimport { CC_RateLimitStateMapper_Util } from '../_collections/cc-rate-limit-state-mapper.util';\nimport { CC_RateLimitStateServerItem_Response } from '../_models/interfaces/cc-rate-limit-state-server-item.interface';\nimport { ExS_InstanceContext_DataService } from '../../../_services/exs-instance-context.data-service';\nimport { CC_SocketEventHandler_ControlService } from './cc-socket-event-handler.control-service';\n\n/**\n * Claude Code Session Toolkit data service (SSOT).\n * Reactive state management: session lista, detail, events, live output.\n * Socket.io event subscription a real-time push-hoz.\n *\n * Socket event feldolgozás delegálva: CC_SocketEventHandler_ControlService (Master–Slave).\n */\n@Injectable({ providedIn: 'root' })\nexport class ClaudeCode_DataService implements OnDestroy, CC_DataServiceParent_Interface {\n\n /** Session lista. */\n readonly sessions_$ = signal<CC_ListItem_Interface[]>([]);\n\n /** Session lista betöltés folyamatban. */\n readonly sessionsLoading_$ = signal<boolean>(false);\n\n /** Session lista hiba. */\n readonly sessionsLoadError_$ = signal<unknown | null>(null);\n\n /** Kiválasztott session részletek. */\n readonly selectedSession_$ = signal<CC_Detail_Response | null>(null);\n\n /** Kiválasztott session betöltés. */\n readonly selectedSessionLoading_$ = signal<boolean>(false);\n\n /** Kiválasztott session event log. */\n readonly selectedSessionEvents_$ = signal<CC_EventItem_Interface[]>([]);\n\n /** Live output buffer (streaming console content). */\n readonly liveOutput_$ = signal<string[]>([]);\n\n /** Live stderr output buffer (piros megkülönböztetéshez). */\n readonly liveStderrLines_$ = signal<Set<number>>(new Set());\n\n /** Console rendszer-üzenetek (prompt echo, status change, error feedback). */\n readonly consoleMessages_$ = signal<CcSessionConsoleMessage_Interface[]>([]);\n\n /** Szerver-oldali assembled messages (SSOT — tool pairing, stream merge szerveren). */\n readonly assembledMessages_$ = signal<CCAP_ExtSessionMessage_Response[]>([]);\n\n /** Van-e több régebbi assembled message betölthető (backward pagination). */\n readonly assembledMessagesHasMore_$ = signal<boolean>(false);\n\n /** Régebbi assembled message-ek betöltése folyamatban. */\n readonly isLoadingOlderMessages_$ = signal<boolean>(false);\n\n /**\n * BUG-CC-UI-STALE-001 (cycle 428 ghost-old fix): első `loadAssembledMessages`\n * lezárult-e az aktuális sessionre. Amíg `false`, a chatTurns_$ NEM rajzol\n * a fallback console path-ról — különben a navigation alatt épp betöltött\n * historical event-ekből rajzolt fallback view villan be, majd lecserélődik\n * az SSOT assembled view-ra (ghost-old → fresh-replace UX).\n */\n readonly assembledMessagesLoaded_$ = signal<boolean>(false);\n\n /** Utolsó status update a socket-ről. */\n readonly lastStatusUpdate_$ = signal<{\n sessionId: string;\n status: string;\n statusMessage?: string;\n } | null>(null);\n\n /** Kumulatív token usage az aktív session-höz. */\n readonly sessionUsage_$ = signal<CcSessionUsage_Interface>({\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n costUsd: 0,\n });\n\n /** Utolsó rate limit event (session-független, globális — silent, nem jelenik meg a chat-ben). */\n readonly rateLimitInfo_$ = signal<CcSessionRateLimitInfo_Interface | null>(null);\n\n /** Aktuálisan kiválasztott session ID (a detail nézet állítja be). */\n readonly activeSessionId_$ = signal<string>('');\n\n private readonly ccSession_AS: ClaudeCode_ApiService =\n inject(ClaudeCode_ApiService);\n\n private readonly extSessionMsg_AS: ExS_Message_ApiService =\n inject(ExS_Message_ApiService);\n\n private readonly globalError_CS: CCAP_GlobalError_ControlService =\n inject(CCAP_GlobalError_ControlService);\n\n private readonly socket_CS: CCAP_Socket_ControlService =\n inject(CCAP_Socket_ControlService);\n\n private readonly ngZone: NgZone = inject(NgZone);\n\n private readonly peiContext_DS: ExS_InstanceContext_DataService =\n inject(ExS_InstanceContext_DataService);\n\n private readonly socketEventHandler_CS: CC_SocketEventHandler_ControlService =\n inject(CC_SocketEventHandler_ControlService);\n\n private eventSubscription: Subscription | null = null;\n\n /** Socket reconnect subscription (backfill trigger). */\n private reconnectSubscription: Subscription | null = null;\n\n /** Legutolsó ismert event sequence szám (duplikáció elkerüléséhez). */\n private lastKnownEventSequence: number = -1;\n\n /** Session History incremental poll intervallum (socket push mellé fallback). */\n private static readonly SESSION_EVENTS_POLL_INTERVAL_MS: number = 5 * second;\n\n /** Session event poll timer handle. */\n private sessionEventsPollHandle: ReturnType<typeof setInterval> | null = null;\n\n /** Reentrancy guard — párhuzamos poll GET elkerülése. */\n private isSessionEventsPollInFlight: boolean = false;\n\n constructor() {\n // Slave service inicializálása (Master–Slave minta)\n this.socketEventHandler_CS.init(this);\n\n // Socket event-ek feliratkozása — delegálás a slave handler-nek\n this.eventSubscription = this.socket_CS.event$.subscribe(\n (envelope: { event: string; payload: Record<string, unknown> }): void => {\n this.ngZone.run((): void => {\n this.socketEventHandler_CS.handleSocketEvent(envelope, {\n selectedCcapId: this.peiContext_DS.activeCcapId_$(),\n globalErrorShowError: (err: unknown, source: string): void => {\n this.globalError_CS.showError(err, source);\n },\n });\n });\n },\n );\n\n // Socket reconnect → resubscribe + backfill + UI re-sync\n // BUG-CC-UI-STALE-001 (cycle 429 részfix #3): server-restart után a kliensen\n // a session-lista + active session detail is elavul, nemcsak az assembled\n // messages. A user explicit panaszolta, hogy \"újraindult a szerver közbe...\n // mintha történnének a dolgok, csak a CC Sessions felületen nem látnánk\" —\n // ezt itt fedjük le egy teljesebb re-sync-kel.\n this.reconnectSubscription = this.socket_CS.connected$.subscribe(\n (isConnected: boolean): void => {\n if (!isConnected) {\n return;\n }\n const activeId: string = this.activeSessionId_$();\n if (activeId) {\n this.socket_CS.emit('cc-session:subscribe', { sessionId: activeId });\n this.loadAssembledMessages({ sessionId: activeId }).catch((): void => {});\n // Active session detail (status, metadata) frissítés — különben a\n // header status mező a server-restart előtti állapotot mutathatja.\n this.loadSessionDetail({ sessionId: activeId }).catch((): void => {});\n }\n // Session-lista frissítés — pl. újabb session indult egy másik\n // ablakban / instance-on a disconnect alatt, vagy éppen status-váltás\n // történt a listában lévő bármelyik session-en.\n this.loadSessions().catch((): void => {});\n this.backfillMissedEvents();\n },\n );\n }\n\n ngOnDestroy(): void {\n this.stopSessionEventsPolling();\n if (this.eventSubscription) {\n this.eventSubscription.unsubscribe();\n this.eventSubscription = null;\n }\n if (this.reconnectSubscription) {\n this.reconnectSubscription.unsubscribe();\n this.reconnectSubscription = null;\n }\n }\n\n // ── Bridge methods (slave access) ──────────────────────────\n\n /**\n * Globális error megjelenítése (slave service hívja).\n */\n showGlobalError(err: unknown, source: string): void {\n this.globalError_CS.showError(err, source);\n }\n\n /**\n * Utolsó ismert event sequence lekérdezése (slave service hívja).\n */\n getLastKnownEventSequence(): number {\n return this.lastKnownEventSequence;\n }\n\n /**\n * Utolsó ismert event sequence beállítása (slave service hívja).\n */\n setLastKnownEventSequence(sequence: number): void {\n this.lastKnownEventSequence = sequence;\n }\n\n /**\n * Session History poll indítás / leállítás kiértékelése.\n * A slave service hívja státusz váltáskor.\n */\n evaluateSessionEventsPolling(): void {\n const activeId: string = this.activeSessionId_$();\n const status: string | null = this.resolveActiveSessionStatusForEventsPolling();\n const shouldPoll: boolean = Boolean(\n activeId\n && this.lastKnownEventSequence >= 0\n && status != null\n && CC_SocketEventHandler_ControlService.isLiveCcSessionStatus(status),\n );\n\n if (shouldPoll) {\n this.ensureSessionEventsPollingStarted();\n } else {\n this.stopSessionEventsPolling();\n }\n }\n\n // ── Session Lista ───────────────────────────────────────────\n\n /**\n * Session lista betöltése a szerverről.\n */\n async loadSessions(params?: {\n status?: string;\n workspacePath?: string;\n includeArchived?: boolean;\n }): Promise<void> {\n this.sessionsLoading_$.set(true);\n this.sessionsLoadError_$.set(null);\n\n try {\n const response = await this.ccSession_AS.listSessions({\n status: params?.status,\n workspacePath: params?.workspacePath,\n includeArchived: params?.includeArchived,\n });\n\n // Rendezés: legfrissebb session legfelül (lastActivityAt desc)\n const sorted: CC_ListItem_Interface[] = [...response.sessions].sort(\n (a: CC_ListItem_Interface, b: CC_ListItem_Interface): number => {\n const dateA: number = a.lastActivityAt ? new Date(a.lastActivityAt).getTime() : 0;\n const dateB: number = b.lastActivityAt ? new Date(b.lastActivityAt).getTime() : 0;\n return dateB - dateA;\n },\n );\n this.sessions_$.set(sorted);\n } catch (err: unknown) {\n this.sessionsLoadError_$.set(err);\n } finally {\n this.sessionsLoading_$.set(false);\n }\n }\n\n // ── Rate limit persisted state bootstrap (REQ-CC-RATE-001 Slice 3b) ─\n\n /**\n * Szerver-oldali persisted rate-limit state lekérése + merge a\n * `rateLimitInfo_$` signalba, ha a signal jelenleg null. Ha már van\n * élő socket-adat a signalban, NEM írjuk felül (a live frissebb).\n * Hibát silent nyel (nem-kritikus bootstrap path): `DyFM_Log.warn` +\n * signal változatlan (no-silent-failure kompatibilis).\n */\n async loadPersistedRateLimitState(params: { ccapId: string }): Promise<void> {\n const ccapId: string = params.ccapId?.trim() ?? '';\n if (!ccapId) {\n return;\n }\n try {\n const response: { items: CC_RateLimitStateServerItem_Response[] } =\n await this.ccSession_AS.getRateLimitState({ ccapId: ccapId });\n this.mergePersistedRateLimitState(response.items);\n } catch (err: unknown) {\n DyFM_Log.warn(\n `ClaudeCode_DS | loadPersistedRateLimitState failed (non-blocking) | ccapId: ${ccapId} | ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n }\n\n /**\n * Szerver `CC_RateLimitState[]` items → kliens signal merge.\n * A merge csak akkor ír a signalba, ha az jelenleg null (fresh UI / oldalfrissítés után).\n * Ha már érkezett socket-update (signal !== null), NEM írjuk felül — a live adat frissebb.\n */\n mergePersistedRateLimitState(items: CC_RateLimitStateServerItem_Response[]): void {\n if (this.rateLimitInfo_$() !== null) {\n return;\n }\n const mapped: CcSessionRateLimitInfo_Interface | null =\n CC_RateLimitStateMapper_Util.mapServerItemsToClientInfo(items);\n if (mapped !== null) {\n this.rateLimitInfo_$.set(mapped);\n }\n }\n\n // ── Session Detail ──────────────────────────────────────────\n\n /**\n * Session részletek betöltése.\n * Hiba esetén console error message-t küld (null state = hiba).\n *\n * Cycle 771 (BUG-CC-SWITCH-FLICKER-001 #3 fix): activeSessionId-guard a REST\n * response merge előtt — gyors A→B kattintáskor az A session response NE\n * írja felül a már aktív B session state-jét (stale-content silent overwrite\n * elimination).\n */\n async loadSessionDetail(params: { sessionId: string }): Promise<void> {\n this.selectedSessionLoading_$.set(true);\n\n try {\n const response: CC_Detail_Response =\n await this.ccSession_AS.getSession({\n sessionId: params.sessionId,\n });\n\n // BUG-CC-SWITCH-FLICKER-001 #3 (cycle 771): stale-response-guard.\n // Ha a user közben átnavigált egy másik session-re (activeSessionId\n // megváltozott), NEM merge-eljük a régi session response-ját.\n // Cycle 772 finomítás: üres activeSessionId esetén (initial load — még\n // nem futott le `setActiveSessionId`) NE discardoljunk; csak akkor, ha\n // van aktuális aktív és **eltér** a kért session-től (= user közben\n // átnavigált). Üres activeSessionId tipikus: első betöltés, vagy\n // unit-test stub.\n const currentActiveId: string = this.activeSessionId_$();\n if (currentActiveId && currentActiveId !== params.sessionId) {\n DyFM_Log.info(\n `CCAP_CcSession_DS | loadSessionDetail stale response — discarded`\n + ` | requestedSessionId: ${params.sessionId}`\n + ` | currentActiveSessionId: ${currentActiveId}`,\n );\n return;\n }\n\n this.selectedSession_$.set(response);\n } catch (err: unknown) {\n // Cycle 771/772: stale-error-guard (lásd a try-blokk magyarázatát).\n const currentActiveId: string = this.activeSessionId_$();\n if (currentActiveId && currentActiveId !== params.sessionId) {\n return;\n }\n this.selectedSession_$.set(null);\n const errorMessage: string = err instanceof Error\n ? err.message\n : 'Failed to load session details';\n this.pushConsoleMessage({\n type: 'error',\n text: `Load session failed: ${errorMessage}`,\n });\n } finally {\n this.selectedSessionLoading_$.set(false);\n // Detail státusz alapján session event poll indítása / leállítása\n this.evaluateSessionEventsPolling();\n }\n }\n\n /**\n * Session event log betöltése.\n */\n async loadSessionEvents(params: {\n sessionId: string;\n eventType?: string;\n limit?: number;\n }): Promise<void> {\n try {\n // Utolsó 500 event betöltése (latest mód: a legfrissebbek, nem a legrégebbiek)\n const response = await this.ccSession_AS.getSessionEvents({\n sessionId: params.sessionId,\n eventType: params.eventType,\n limit: params.limit ?? 500,\n latest: true,\n });\n\n // BUG-CC-SWITCH-FLICKER-001 #3 (cycle 771/772): stale-response-guard\n // (lásd `loadSessionDetail` try-blokk magyarázatát az activeSessionId\n // üres-eset finomításáról).\n const currentActiveId: string = this.activeSessionId_$();\n if (currentActiveId && currentActiveId !== params.sessionId) {\n DyFM_Log.info(\n `CCAP_CcSession_DS | loadSessionEvents stale response — discarded`\n + ` | requestedSessionId: ${params.sessionId}`\n + ` | currentActiveSessionId: ${currentActiveId}`,\n );\n return;\n }\n\n this.selectedSessionEvents_$.set(response.events);\n\n // Utolsó ismert sequence frissítése (duplikáció elkerüléséhez)\n this.updateLastKnownSequence(response.events);\n\n // Historikus event-ek konvertálása console üzenetekké (chat felület feltöltése)\n // isNewNotification=false: replay — error event-ek nem dobnak global popup-ot\n for (const event of response.events) {\n this.socketEventHandler_CS.pushConsoleMessageFromEvent(event, false, (err: unknown, source: string): void => {\n this.globalError_CS.showError(err, source);\n });\n }\n\n // Assembled messages betöltése (SSOT — fire-and-forget)\n this.loadAssembledMessages({ sessionId: params.sessionId })\n .catch((): void => {});\n } catch (err: unknown) {\n // Cycle 771/772: stale-error-guard.\n const currentActiveId: string = this.activeSessionId_$();\n if (currentActiveId && currentActiveId !== params.sessionId) {\n return;\n }\n this.selectedSessionEvents_$.set([]);\n } finally {\n // Events betöltés után (vagy hiba után) poll lifecycle újraértékelés\n this.evaluateSessionEventsPolling();\n }\n }\n\n // ── Actions ─────────────────────────────────────────────────\n\n /**\n * Új session létrehozása.\n * Hiba esetén console error message-t küld és továbbdobja a hibát.\n */\n async createSession(params: {\n workspacePath: string;\n label?: string;\n model?: string;\n initialPrompt?: string;\n mode?: string;\n permissionPolicy?: string;\n reasoningEffort?: string;\n }): Promise<string> {\n try {\n const result: { session: Record<string, unknown> } =\n await this.ccSession_AS.createSession(params);\n const sessionId: string = String(result.session.sessionId || '');\n await this.loadSessions();\n return sessionId;\n } catch (err: unknown) {\n this.pushConsoleMessage({\n type: 'error',\n text: `Create session failed: ${CCAP_ErrorDisplay_Util.getErrorMessageForDisplay(err)}`,\n });\n throw err;\n }\n }\n\n /**\n * Prompt küldése (szöveggel és/vagy csatolt képpel).\n * Prompt echo-t küld a console-ba, hiba esetén error üzenetet.\n */\n async sendPrompt(params: {\n sessionId: string;\n content: string;\n attachments?: CCAP_PendingAttachment_Interface[];\n }): Promise<void> {\n // Image data URL-ek előállítása a csatolt képekből (live session preview a buborékban)\n const imageDataUrls: string[] | undefined = params.attachments\n ?.filter((a: CCAP_PendingAttachment_Interface): boolean => a.isImage && !!a.base64)\n .map((a: CCAP_PendingAttachment_Interface): string => `data:${a.mimeType};base64,${a.base64}`);\n\n // Azonnali prompt echo a chat-be (a szerver prompt-sent event-je duplikáció-védelemmel kiszűrődik)\n this.pushConsoleMessage({\n type: 'prompt',\n text: params.content,\n imageDataUrls: imageDataUrls?.length ? imageDataUrls : undefined,\n });\n\n try {\n const promptResult = await this.ccSession_AS.sendPrompt(params);\n\n // Cross-instance relay: a prompt a távoli instance-nak lett átküldve PEI task-ként\n // BUG-CCI-CROSS-001: target offline esetén warning-szintű feedback (error-bubble),\n // nem csak diszkrét info — különben a user nem érzékeli, hogy az üzenet csak\n // queue-ban vár, és valójában nem ment el.\n if (promptResult.relayed) {\n if (promptResult.targetOnline) {\n this.pushConsoleMessage({\n type: 'info',\n text: `Prompt relayed to remote instance (task: ${promptResult.taskId?.substring(0, 8)}…)`,\n });\n } else {\n this.pushConsoleMessage({\n type: 'error',\n text: `⚠ A távoli instance jelenleg offline — a prompt queue-ban várakozik (task: ${promptResult.taskId?.substring(0, 8)}…) és csak akkor kézbesítődik, ha a target instance online lesz. Ellenőrizd, hogy mindkét instance fut, és a Settings → Cluster sharedSecret azonos.`,\n });\n }\n }\n\n // Státusz még nem frissült socket-re — poll indulhat ha live session\n this.evaluateSessionEventsPolling();\n } catch (err: unknown) {\n this.pushConsoleMessage({\n type: 'error',\n text: `Send failed: ${CCAP_ErrorDisplay_Util.getErrorMessageForDisplay(err)}`,\n });\n // Global error overlay — a console message egyedül nem mindig látható (pl. scroll, tab)\n this.globalError_CS.showError(err, 'CC Session sendPrompt');\n throw err;\n }\n }\n\n /**\n * Session fork: a forrás session conversation history-jának duplikálása új session-be.\n * Sikeres fork után a session listát frissíti és visszaadja az új session ID-t.\n */\n async forkSession(params: {\n sessionId: string;\n label?: string;\n }): Promise<string> {\n try {\n const result: { session: Record<string, unknown> } =\n await this.ccSession_AS.forkSession({\n sessionId: params.sessionId,\n label: params.label,\n });\n const newSessionId: string = String(result.session.sessionId || '');\n await this.loadSessions();\n return newSessionId;\n } catch (err: unknown) {\n this.pushConsoleMessage({\n type: 'error',\n text: `Fork session failed: ${CCAP_ErrorDisplay_Util.getErrorMessageForDisplay(err)}`,\n });\n throw err;\n }\n }\n\n /**\n * Session resume.\n * Hiba esetén console error message-t küld és továbbdobja a hibát.\n */\n async resumeSession(params: { sessionId: string }): Promise<void> {\n try {\n const result = await this.ccSession_AS.resumeSession(params);\n if (result.relayed) {\n this.pushConsoleMessage({\n type: 'info',\n text: result.targetOnline\n ? 'Resume relayed to remote instance'\n : 'Resume queued for offline remote instance',\n });\n }\n await this.loadSessions();\n } catch (err: unknown) {\n this.pushConsoleMessage({\n type: 'error',\n text: `Resume failed: ${CCAP_ErrorDisplay_Util.getErrorMessageForDisplay(err)}`,\n });\n throw err;\n }\n }\n\n /**\n * Futó prompt execution leállítása (session megmarad waitingInput-ban).\n * A szerver érdemi feedback-et ad vissza (action + message) — ezt console message-ként megjelenítjük.\n */\n async stopExecution(params: { sessionId: string }): Promise<void> {\n try {\n const result = await this.ccSession_AS.stopExecution(params);\n\n if (result.relayed) {\n this.pushSystemAssembledMessage({\n sessionId: params.sessionId,\n text: result.targetOnline\n ? 'Stop execution relayed to remote instance'\n : 'Stop execution queued for offline remote instance',\n role: 'info',\n });\n return;\n }\n\n // Feedback a usernek: a szerver válasza alapján rendszer üzenet a chatben.\n const feedbackText: string = result.message || 'Execution stopped';\n this.pushSystemAssembledMessage({\n sessionId: params.sessionId,\n text: feedbackText,\n role: 'info',\n });\n } catch (err: unknown) {\n this.pushSystemAssembledMessage({\n sessionId: params.sessionId,\n text: `Stop execution failed: ${CCAP_ErrorDisplay_Util.getErrorMessageForDisplay(err)}`,\n role: 'error',\n });\n throw err;\n }\n }\n\n /**\n * REQ-CC-LIFECYCLE-DIAG-001 Slice 2 (cycle 941) — diagnostic snapshot\n * delegáció az API service-re. Stuck/errored session debug.\n * Hiba esetén null (a UI-state visszaáll).\n */\n async loadDiagnostic(params: { sessionId: string }): Promise<CC_DiagnosticSnapshot_Response | null> {\n try {\n return await this.ccSession_AS.getDiagnostic({ sessionId: params.sessionId });\n } catch (err: unknown) {\n DyFM_Log.error(\n `CCAP_CcSession_DS | loadDiagnostic failed`\n + ` | sessionId: ${params.sessionId}`,\n err,\n );\n return null;\n }\n }\n\n /**\n * Session terminate.\n * Hiba esetén console error message-t küld és továbbdobja a hibát.\n */\n async terminateSession(params: { sessionId: string }): Promise<void> {\n try {\n const result = await this.ccSession_AS.terminateSession(params);\n if (result.relayed) {\n this.pushSystemAssembledMessage({\n sessionId: params.sessionId,\n text: result.targetOnline\n ? 'Terminate relayed to remote instance'\n : 'Terminate queued for offline remote instance',\n role: 'info',\n });\n } else {\n this.pushSystemAssembledMessage({\n sessionId: params.sessionId,\n text: 'Session terminated',\n role: 'status',\n });\n }\n await this.loadSessions();\n } catch (err: unknown) {\n this.pushSystemAssembledMessage({\n sessionId: params.sessionId,\n text: `Terminate failed: ${CCAP_ErrorDisplay_Util.getErrorMessageForDisplay(err)}`,\n role: 'error',\n });\n throw err;\n }\n }\n\n /**\n * Cycle 781e (REQ-SYS-INSTALL-VERSION-CHECK-001 Slice E) — runner kill +\n * respawn. A user UI-ról triggereli verzió-mismatch vagy konzisztens no-ACK\n * eseten. A new terminál ablak a friss npm-installed build-tel nyílik.\n * Hiba esetén console error message-t küld.\n */\n async restartRunner(params: { sessionId: string }): Promise<void> {\n try {\n const result: { success: boolean; sessionId: string; newTerminalId: string } =\n await this.ccSession_AS.restartRunner(params);\n this.pushSystemAssembledMessage({\n sessionId: params.sessionId,\n text: `Runner restarted (new terminalId: ${result.newTerminalId.slice(0, 8)}…). New terminal window should open shortly.`,\n role: 'info',\n });\n } catch (err: unknown) {\n this.pushSystemAssembledMessage({\n sessionId: params.sessionId,\n text: `Runner restart failed: ${CCAP_ErrorDisplay_Util.getErrorMessageForDisplay(err)}`,\n role: 'error',\n });\n throw err;\n }\n }\n\n /**\n * Session archiválás állapot beállítása.\n * Sikeres művelet után a session listát újratölti.\n */\n async setSessionArchived(params: {\n sessionId: string;\n isArchived: boolean;\n }): Promise<void> {\n try {\n await this.ccSession_AS.setSessionArchived(params);\n await this.loadSessions();\n } catch (err: unknown) {\n this.pushConsoleMessage({\n type: 'error',\n text: `Archive failed: ${CCAP_ErrorDisplay_Util.getErrorMessageForDisplay(err)}`,\n });\n throw err;\n }\n }\n\n /**\n * Session config frissítése (label, mode, permission policy, effort, model).\n * Hívja a PATCH API-t és frissíti a lokális session detail + lista state-et.\n */\n async updateSessionConfig(params: {\n sessionId: string;\n label?: string;\n mode?: string;\n permissionPolicy?: string;\n reasoningEffort?: string;\n model?: string;\n isDebugMode?: boolean;\n }): Promise<void> {\n try {\n await this.ccSession_AS.updateSessionConfig(params);\n\n // Lokális state frissítése (selectedSession detail-ban)\n const currentDetail: CC_Detail_Response | null =\n this.selectedSession_$();\n if (currentDetail?.session.sessionId === params.sessionId) {\n const updatedSession: CC_ListItem_Interface = {\n ...currentDetail.session,\n };\n if (params.label != null) {\n updatedSession.label = params.label;\n }\n if (params.mode != null) {\n updatedSession.mode = params.mode;\n }\n if (params.permissionPolicy != null) {\n updatedSession.permissionPolicy = params.permissionPolicy;\n }\n if (params.reasoningEffort != null) {\n updatedSession.reasoningEffort = params.reasoningEffort;\n }\n if (params.model != null) {\n updatedSession.model = params.model;\n }\n if (params.isDebugMode != null) {\n updatedSession.isDebugMode = params.isDebugMode;\n }\n this.selectedSession_$.set({\n ...currentDetail,\n session: updatedSession,\n });\n }\n\n // Lista state frissítése (label átnevezés azonnal látszódjon a sidebar-ban)\n if (params.label != null) {\n const sessions: CC_ListItem_Interface[] = this.sessions_$();\n const idx: number = sessions.findIndex(\n (s: CC_ListItem_Interface): boolean => s.sessionId === params.sessionId,\n );\n if (idx >= 0) {\n const updated: CC_ListItem_Interface[] = [...sessions];\n updated[idx] = { ...updated[idx], label: params.label };\n this.sessions_$.set(updated);\n }\n }\n } catch (err: unknown) {\n this.pushConsoleMessage({\n type: 'error',\n text: `Config update failed: ${CCAP_ErrorDisplay_Util.getErrorMessageForDisplay(err)}`,\n });\n throw err;\n }\n }\n\n // ── Session Management ──────────────────────────────────────\n\n /**\n * Aktív session ID beállítása (detail nézet hívja navigáláskor).\n * Az output + event szűrés erre az ID-re szűr.\n * Socket subscribe/unsubscribe: a monitoring service célzott push-hoz.\n */\n setActiveSessionId(sessionId: string): void {\n const previousId: string = this.activeSessionId_$();\n\n // Session váltás: poll leáll (új session-nél load után evaluate újraindíthatja)\n if (previousId !== sessionId) {\n this.stopSessionEventsPolling();\n }\n\n // Előző session-ről leiratkozás (ha volt és más mint az új)\n if (previousId && previousId !== sessionId) {\n this.socket_CS.emit('cc-session:unsubscribe', { sessionId: previousId });\n }\n\n this.activeSessionId_$.set(sessionId);\n\n // Új session-re feliratkozás\n if (sessionId) {\n this.socket_CS.emit('cc-session:subscribe', { sessionId: sessionId });\n }\n }\n\n /**\n * Live output buffer törlése (pl. új session-re navigáláskor).\n * Session váltáskor az előző session assembled message-ei is törlendők,\n * különben az új session detail-jén rövid ideig a régi chat maradna látható.\n */\n clearLiveOutput(): void {\n this.stopSessionEventsPolling();\n this.liveOutput_$.set([]);\n this.liveStderrLines_$.set(new Set());\n this.consoleMessages_$.set([]);\n this.assembledMessages_$.set([]);\n this.assembledMessagesHasMore_$.set(false);\n this.isLoadingOlderMessages_$.set(false);\n // BUG-CC-UI-STALE-001 (cycle 428): új sessionre váltáskor reset → chatTurns_$\n // NEM rajzol a fallback console path-ról amíg az új session assembled fetch\n // le nem zárul.\n this.assembledMessagesLoaded_$.set(false);\n // BUG-CC-UI-STALE-001 (cycle 675 SOS follow-up): a header / metadata /\n // timeline / status-pirula a `selectedSession_$`, `selectedSessionEvents_$`,\n // `lastStatusUpdate_$` jelekre köt — ha session váltáskor ezek nem\n // nullázódnak, a régi session header+státusz \"ghost-old\"-ként látszik,\n // amíg az új loadSessionDetail / loadSessionEvents fetch lezárul; ha a\n // fetch hibázik vagy késik, tartós marad. Új session indításakor a user\n // explicit jelezte: a felület a régit mutatja. Ezt a teljes reset zárja.\n this.selectedSession_$.set(null);\n this.selectedSessionEvents_$.set([]);\n this.lastStatusUpdate_$.set(null);\n this.sessionUsage_$.set({\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n costUsd: 0,\n });\n this.lastKnownEventSequence = -1;\n this.socketEventHandler_CS.resetTrackingState();\n }\n\n /**\n * Console rendszer-üzenet hozzáadása (prompt echo, status change, error).\n */\n pushConsoleMessage(params: {\n listKey?: string;\n type: CcSessionConsoleMessage_Interface['type'];\n text: string;\n timestamp?: string;\n isStatus?: boolean;\n expandableContent?: string;\n rawData?: Record<string, unknown>;\n subtype?: string;\n parentAgentId?: string;\n imageDataUrls?: string[];\n }): void {\n // Assistant és prompt üzenetek szövegének trimmelése\n const trimmedText: string = (params.type === 'assistant' || params.type === 'prompt')\n ? params.text.trim()\n : params.text;\n const message: CcSessionConsoleMessage_Interface = {\n listKey: params.listKey ?? this.allocateConsoleListKey(),\n type: params.type,\n text: trimmedText,\n timestamp: params.timestamp ?? new Date().toISOString(),\n isStatus: params.isStatus ?? false,\n expandableContent: params.expandableContent,\n rawData: params.rawData,\n subtype: params.subtype,\n parentAgentId: params.parentAgentId,\n imageDataUrls: params.imageDataUrls,\n };\n const current: CcSessionConsoleMessage_Interface[] = this.consoleMessages_$();\n this.consoleMessages_$.set([...current, message]);\n }\n\n // ── Assembled messages (SSOT) ──────────────────────────────\n\n /**\n * Assembled message-ek betöltése REST-en (session detail betöltésekor).\n */\n async loadAssembledMessages(params: {\n sessionId: string;\n }): Promise<void> {\n try {\n const result = await this.extSessionMsg_AS.getMessages({\n sessionId: params.sessionId,\n latest: true,\n });\n\n // BUG-CC-SWITCH-FLICKER-001 #4 (cycle 773): stale-load-guard.\n // A fetch a kezdéskori sessionId-vel indult; ha a user közben\n // átkattintott egy másik session-re, a régi session messages-jeit\n // NEM merge-eljük az új session view-jába. A `currentMessages`\n // ekkor már a B session push-event-jeit tartalmazza (vagy üres),\n // és a régi A messages-ek hozzáfűzése lenne a hijack a UI-ban.\n // User-panasz: „korábbi látható a session message history-ban …\n // session tartalom már sosem tölt be\".\n const currentActiveId: string = this.activeSessionId_$();\n if (currentActiveId && currentActiveId !== params.sessionId) {\n DyFM_Log.info(\n `CCAP_CcSession_DS | loadAssembledMessages stale — discarded`\n + ` | requestedSessionId: ${params.sessionId}`\n + ` | currentActiveSessionId: ${currentActiveId}`\n + ` | restMessageCount: ${result.messages.length}`,\n );\n return;\n }\n\n // BUG-CC-UI-STALE-001 cycle 443 — REST ↔ socket push race-condition merge:\n // a fetch await-je alatt push event-ek érkezhetnek a socket-en, amik\n // hozzáadódtak az `assembledMessages_$`-hoz. A `set(result.messages)`\n // korábbi viselkedés ezeket lecserélte volna → adatvesztés. Most merge:\n // a current (push event-ekkel) + REST result, dedup messageKey-en\n // (REST nyer azonos kulcsra mert ő a kanonikus DB-szerver állapot),\n // majd sortAsc.\n const currentMessages: CCAP_ExtSessionMessage_Response[] =\n this.assembledMessages_$();\n const restKeys: Set<string> = new Set<string>(\n result.messages\n .map((m: CCAP_ExtSessionMessage_Response): string => m.messageKey)\n .filter((k: string): boolean => typeof k === 'string' && k.length > 0),\n );\n const pushOnly: CCAP_ExtSessionMessage_Response[] = currentMessages.filter(\n (m: CCAP_ExtSessionMessage_Response): boolean =>\n !restKeys.has(m.messageKey),\n );\n this.assembledMessages_$.set(\n Shr_ExtMessageChronologicalSort_Util.sortAsc([...result.messages, ...pushOnly]),\n );\n this.assembledMessagesHasMore_$.set(result.hasMore);\n } catch (err: unknown) {\n DyFM_Log.error(\n `CCAP_CcSession_DS | loadAssembledMessages failed`\n + ` | sessionId: ${params.sessionId}`,\n err,\n );\n } finally {\n // BUG-CC-UI-STALE-001 (cycle 428): első load lezárult — chatTurns_$\n // mostantól rajzolhat fallback console path-ról is, ha az SSOT path üres\n // (régi session-ök / hibás fetch). Hiba esetén is engedjük a fallback-et.\n this.assembledMessagesLoaded_$.set(true);\n }\n }\n\n /**\n * Régebbi assembled message-ek betöltése (backward pagination).\n */\n async loadOlderAssembledMessages(params: {\n sessionId: string;\n limit?: number;\n }): Promise<void> {\n if (this.isLoadingOlderMessages_$() || !this.assembledMessagesHasMore_$()) {\n return;\n }\n const current: CCAP_ExtSessionMessage_Response[] = this.assembledMessages_$();\n if (!current.length) {\n return;\n }\n // Legkisebb sequence meghatározása a backward cursor-hoz\n const minSequence: number = current.reduce(\n (min: number, m: CCAP_ExtSessionMessage_Response): number =>\n (m.sequence ?? 0) < min ? (m.sequence ?? 0) : min,\n current[0].sequence ?? 0,\n );\n\n this.isLoadingOlderMessages_$.set(true);\n try {\n const result = await this.extSessionMsg_AS.getMessages({\n sessionId: params.sessionId,\n beforeSequence: minSequence,\n limit: params.limit ?? 50,\n });\n if (result.messages.length) {\n // BUG-CC-UI-STALE-001: backward pagination merge után sort, hogy a régi + új\n // sequence-ek deterministikusan rendezve legyenek.\n this.assembledMessages_$.set(\n Shr_ExtMessageChronologicalSort_Util.sortAsc([...result.messages, ...current]),\n );\n }\n this.assembledMessagesHasMore_$.set(result.hasMore);\n } catch (err: unknown) {\n DyFM_Log.error(\n `CCAP_CcSession_DS | loadOlderAssembledMessages failed`\n + ` | sessionId: ${params.sessionId}`,\n err,\n );\n } finally {\n this.isLoadingOlderMessages_$.set(false);\n }\n }\n\n /**\n * Szintetikus rendszer üzenet hozzáfűzése az assembled messages listához + a fallback console-hoz.\n */\n pushSystemAssembledMessage(params: {\n sessionId: string;\n text: string;\n role: 'status' | 'info' | 'error';\n }): void {\n const current: CCAP_ExtSessionMessage_Response[] = this.assembledMessages_$();\n const maxSequence: number = current.length\n ? current.reduce(\n (max: number, m: CCAP_ExtSessionMessage_Response): number =>\n (m.sequence ?? 0) > max ? (m.sequence ?? 0) : max,\n 0,\n )\n : 0;\n\n const syntheticMessage: CCAP_ExtSessionMessage_Response = {\n messageKey: `sys-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n sessionId: params.sessionId,\n sessionType: 'cc',\n messageRole: params.role,\n bodyText: params.text,\n timestamp: new Date().toISOString(),\n sequence: maxSequence + 1,\n };\n // BUG-CC-UI-STALE-001: synthetic message a maxSequence+1-en megy, de defensive sort\n // a konzisztens chronological view-hoz minden assembledMessages mutáció végén.\n this.assembledMessages_$.set(\n Shr_ExtMessageChronologicalSort_Util.sortAsc([...current, syntheticMessage]),\n );\n\n // Fallback console path-ra is push-olunk\n this.pushConsoleMessage({\n type: params.role === 'error' ? 'error' : (params.role === 'status' ? 'status' : 'info'),\n text: params.text,\n isStatus: params.role === 'status',\n });\n }\n\n // ── Private: Event polling ─────────────────────────────────\n\n /**\n * Egyedi console üzenet kulcs — @for track.\n */\n private allocateConsoleListKey(): string {\n return globalThis.crypto.randomUUID();\n }\n\n /**\n * Incremental event pull a lastKnownEventSequence után (socket reconnect + periodikus poll).\n */\n private async pullEventsSinceLastKnownSequence(context: 'backfill' | 'poll'): Promise<void> {\n const sessionId: string = this.activeSessionId_$();\n if (!sessionId || this.lastKnownEventSequence < 0) {\n return;\n }\n\n try {\n const response = await this.ccSession_AS.getSessionEvents({\n sessionId: sessionId,\n sinceSequence: this.lastKnownEventSequence,\n });\n\n const newEvents: CC_EventItem_Interface[] = response.events;\n\n if (!newEvents.length) {\n return;\n }\n\n this.ngZone.run((): void => {\n // BUG-CC-SWITCH-FLICKER-001 #4 (cycle 773): stale-pull-guard.\n // A pull a kezdéskori sessionId-vel indult; ha a user közben átkattintott\n // egy másik session-re, a beérkező events NEM merge-elhetőek a most\n // aktív session view-jába — különben a régi events „hijack-elnék\" a\n // friss session timeline-ját, és a UI sosem mutatja a B session\n // tartalmát (user-panasz: „korábbi látható a session message\n // history-ban de minden más már a friss-re utal … session tartalom\n // már sosem tölt be\"). A `selectedSessionEvents_$` mellett a\n // `pushConsoleMessageFromEvent` is appendálná a régi events-eket\n // a `consoleMessages_$` chat bufferbe — emiatt a teljes blokk\n // (set + console-loop + sequence-tracker) is a guard mögé kerül.\n const currentActiveId: string = this.activeSessionId_$();\n if (currentActiveId !== sessionId) {\n DyFM_Log.info(\n `CCAP_CcSession_DS | pull(${context}) stale — discarded`\n + ` | requestedSessionId: ${sessionId}`\n + ` | currentActiveSessionId: ${currentActiveId}`\n + ` | newEventCount: ${newEvents.length}`,\n );\n return;\n }\n\n const currentEvents: CC_EventItem_Interface[] =\n this.selectedSessionEvents_$();\n this.selectedSessionEvents_$.set([...currentEvents, ...newEvents]);\n\n // Incremental pull: új event-ek → notification-ként kezeljük\n for (const event of newEvents) {\n this.socketEventHandler_CS.pushConsoleMessageFromEvent(event, true, (err: unknown, source: string): void => {\n this.globalError_CS.showError(err, source);\n });\n }\n\n this.updateLastKnownSequence(newEvents);\n });\n } catch (err: unknown) {\n const label: string = context === 'poll'\n ? 'session events poll failed'\n : 'backfill failed';\n DyFM_Log.warn(`CCAP_CcSession_DS | ${label}`, err);\n }\n }\n\n /**\n * Socket reconnect utáni hiányzó event-ek pótlása.\n */\n private async backfillMissedEvents(): Promise<void> {\n await this.pullEventsSinceLastKnownSequence('backfill');\n }\n\n /**\n * LastKnownEventSequence frissítése az event lista legmagasabb sequence-éből.\n */\n private updateLastKnownSequence(events: CC_EventItem_Interface[]): void {\n for (const event of events) {\n if (event.sequence > this.lastKnownEventSequence) {\n this.lastKnownEventSequence = event.sequence;\n }\n }\n }\n\n /**\n * Aktív session státusz feloldása poll gate-hez (detail → last socket status → lista).\n */\n private resolveActiveSessionStatusForEventsPolling(): string | null {\n const activeId: string = this.activeSessionId_$();\n if (!activeId) {\n return null;\n }\n\n const detail: CC_Detail_Response | null = this.selectedSession_$();\n if (detail?.session.sessionId === activeId) {\n return detail.session.status;\n }\n\n const last: { sessionId: string; status: string; statusMessage?: string } | null =\n this.lastStatusUpdate_$();\n if (last?.sessionId === activeId) {\n return last.status;\n }\n\n const fromList: CC_ListItem_Interface | undefined =\n this.sessions_$().find((s: CC_ListItem_Interface): boolean => {\n return s.sessionId === activeId;\n });\n return fromList?.status ?? null;\n }\n\n /**\n * Periodikus event poll elindítása (ha még nincs timer).\n */\n private ensureSessionEventsPollingStarted(): void {\n if (this.sessionEventsPollHandle !== null) {\n return;\n }\n this.sessionEventsPollHandle = setInterval((): void => {\n void this.onSessionEventsPollTick();\n }, ClaudeCode_DataService.SESSION_EVENTS_POLL_INTERVAL_MS);\n }\n\n /**\n * Session event poll leállítása (session váltás, nem-live státusz, destroy).\n */\n private stopSessionEventsPolling(): void {\n if (this.sessionEventsPollHandle !== null) {\n clearInterval(this.sessionEventsPollHandle);\n this.sessionEventsPollHandle = null;\n }\n this.isSessionEventsPollInFlight = false;\n }\n\n /**\n * Egy poll tick: incremental GET + merge (reentrancy guard).\n */\n private async onSessionEventsPollTick(): Promise<void> {\n if (this.isSessionEventsPollInFlight) {\n return;\n }\n this.isSessionEventsPollInFlight = true;\n try {\n await this.pullEventsSinceLastKnownSequence('poll');\n\n // Assembled messages reload — a chatTurns_$ az assembled path-ot\n // priorizálja, ezért a poll-nak is frissítenie kell.\n const sessionId: string = this.activeSessionId_$();\n if (sessionId) {\n await this.loadAssembledMessages({ sessionId: sessionId });\n }\n } finally {\n this.isSessionEventsPollInFlight = false;\n }\n }\n}\n", "import { CCAP_ExtSessionMessage_Response } from '../../../../_models/interfaces/shared/ccap-ext-message.interface';\n\n/**\n * Shared chronological sort util az assembled messages-re (CC / OC, közös interface).\n * Sorrend: `sequence` ASC, tie-break `timestamp` (ISO string compare), végül `messageKey`\n * (deterministikus a duplikált sequence + timestamp esetére is).\n *\n * BUG-CC-UI-STALE-001 (cycle 427): a socket push handler korábban a végére appendelte\n * az új üzeneteket sort nélkül, így ha egy push event később érkezett mint egy másik,\n * a UI-on rossz sorrendben jelentek meg. Ez a sort a push / load / pagination paths-eken\n * mindig deterministikus chronological view-t garantál.\n */\nexport class Shr_ExtMessageChronologicalSort_Util {\n\n /**\n * Növekvő (legkorábbi → legfrissebb) — primary `sequence`, secondary `timestamp`,\n * tertiary `messageKey` (stabil rendezés azonos sequence + timestamp esetén).\n */\n static compareAsc(\n a: CCAP_ExtSessionMessage_Response,\n b: CCAP_ExtSessionMessage_Response,\n ): number {\n const dseq: number = (a.sequence ?? 0) - (b.sequence ?? 0);\n if (dseq !== 0) {\n return dseq;\n }\n const ta: string = typeof a.timestamp === 'string' ? a.timestamp : '';\n const tb: string = typeof b.timestamp === 'string' ? b.timestamp : '';\n const tcmp: number = ta.localeCompare(tb);\n if (tcmp !== 0) {\n return tcmp;\n }\n const ka: string = typeof a.messageKey === 'string' ? a.messageKey : '';\n const kb: string = typeof b.messageKey === 'string' ? b.messageKey : '';\n return ka.localeCompare(kb);\n }\n\n /**\n * Új sorrendezett másolat — nem mutál.\n */\n static sortAsc(\n messages: CCAP_ExtSessionMessage_Response[],\n ): CCAP_ExtSessionMessage_Response[] {\n return [...messages].sort(Shr_ExtMessageChronologicalSort_Util.compareAsc);\n }\n}\n", "import { Injectable } from '@angular/core';\n\nimport { DyFM_Log } from '@futdevpro/fsm-dynamo';\n\nimport {\n CC_ListItem_Interface,\n CC_EventItem_Interface,\n CC_Detail_Response,\n} from '../_models/interfaces/cc-list-item.interface';\nimport { CCAP_ExtSessionMessage_Response } from '../../../../../_models/interfaces/shared/ccap-ext-message.interface';\nimport { Shr_ExtMessageChronologicalSort_Util } from '../../../../shared/_collections/utils/shr-ext-message-chronological-sort.util';\nimport { AC_RunFlowPhase_Type } from '../../../../../_enums/run-session/ccap-run-flow-phase.enum';\nimport {\n CC_DataServiceParent_Interface,\n CcSessionConsoleMessage_Interface,\n CcSessionUsage_Interface,\n CcSessionRateLimitInfo_Interface,\n} from './cc.data-service.interface';\n\n/**\n * CC Session socket event handler (slave service).\n * A ClaudeCode_DataService-ból kiemelt socket event feldolgozó logika.\n * Master–Slave minta: a master (ClaudeCode_DataService) init()-tel adja át magát,\n * a slave a master signal-jait olvassa/írja és a pushConsoleMessage-t hívja.\n */\n@Injectable({ providedIn: 'root' })\nexport class CC_SocketEventHandler_ControlService {\n\n /** Referencia a master data service-re (init()-ben beállítva). */\n private parent!: CC_DataServiceParent_Interface;\n\n /** Ismert Agent tool_use ID-k (sub-agent indítások). */\n private agentToolUseIds: Set<string> = new Set();\n\n /** Aktuálisan aktív sub-agent kontextus (a status-update tool_use_id-ből). */\n private activeSubAgentId: string = '';\n\n /** Tool use ID → tool név mapping (cli-chunk tool_result párosításhoz). */\n private toolUseIdToName: Map<string, string> = new Map();\n\n /**\n * Inicializálás a master data service referenciájával.\n * A master konstruktor hívja.\n */\n init(parent: CC_DataServiceParent_Interface): void {\n this.parent = parent;\n }\n\n /**\n * Tracking state reset (session váltáskor a master hívja).\n */\n resetTrackingState(): void {\n this.toolUseIdToName.clear();\n this.agentToolUseIds.clear();\n this.activeSubAgentId = '';\n }\n\n // ── Socket event dispatch ──────────────────────────────────\n\n /**\n * Socket.io event feldolgozása.\n * cc-session:* event-ekre reagál.\n * Defenzív try/catch: hibás payload nem törheti el az egész event rendszert.\n */\n handleSocketEvent(\n envelope: { event: string; payload: Record<string, unknown> },\n context: {\n selectedCcapId: string;\n globalErrorShowError: (err: unknown, source: string) => void;\n },\n ): void {\n const eventName: string = envelope.event;\n const payload: Record<string, unknown> = envelope.payload;\n\n try {\n // Instance-szűrés: csak a kiválasztott ccapId-hoz tartozó session eventeket dolgozzuk fel (REQ-PEI-016 §15.5).\n // Kivétel: rate-limit broadcast és assembled-message event-ek — ezek instance-szintűek, nem session-specifikusak.\n const eventCcapId: string = typeof payload.ccapId === 'string' ? payload.ccapId : '';\n const isInstanceFiltered: boolean =\n eventName !== 'cc:rate-limit-update'\n && eventName !== 'ext-session-msg:message'\n && eventName !== 'ext-session-msg:update';\n if (isInstanceFiltered && eventCcapId && context.selectedCcapId && eventCcapId !== context.selectedCcapId) {\n // Diagnostic visibility a SOS-cycle 675 után: a csendes drop volt a fő ok,\n // hogy az új session / státusz-frissítés nem jelent meg a UI-on multi-instance\n // setup vagy instance-context drift esetén. Ne szennyezze a logot a normál\n // forgalom — info-szinten elég. (REQ-SYS-SILENT-001 mintájához igazodik a kliensen is.)\n DyFM_Log.info(\n `CCAP_CcSession_DS | socket event dropped by instance filter`\n + ` | event: ${eventName}`\n + ` | eventCcapId: ${eventCcapId}`\n + ` | selectedCcapId: ${context.selectedCcapId}`,\n );\n return;\n }\n\n switch (eventName) {\n case 'cc-session:status':\n this.handleStatusUpdate(payload);\n break;\n case 'cc-session:output':\n this.handleOutputChunk(payload);\n break;\n case 'cc-session:event':\n this.handleSessionEvent(payload);\n break;\n case 'cc-session:list-update':\n this.handleListUpdate(payload);\n break;\n case 'cc-session:session-update':\n this.handleSessionItemUpdate(payload);\n break;\n case 'agent-events':\n this.handleAgentEvent(payload);\n break;\n case 'ext-session-msg:message':\n this.handleAssembledMessage(payload);\n break;\n case 'ext-session-msg:update':\n this.handleAssembledMessageUpdate(payload);\n break;\n case 'cc:rate-limit-update':\n this.handleRateLimitBroadcast(payload);\n break;\n }\n } catch (err: unknown) {\n // Socket event feldolgozási hiba — a subscription-t nem szabad eltörni,\n // de a felületen jelezni kell, mert konzol-only error a usernek néma.\n const errMessage: string = err instanceof Error ? err.message : String(err);\n DyFM_Log.error(`CCAP_CcSession_DS | socket event error | event: ${eventName}`, err);\n context.globalErrorShowError(\n err instanceof Error\n ? err\n : new Error(`CC Session socket event processing failed: ${eventName} — ${errMessage}`),\n 'cc-session-socket-event',\n );\n }\n }\n\n // ── Event-to-console mapping ───────────────────────────────\n\n /**\n * Parsolt session event-ből olvasható console message generálás.\n * Az assistant szöveget, tool call-okat, result-ot stb. ember által olvasható formában jeleníti meg.\n * isNewNotification:\n * - true → élő értesítés (socket push, incremental poll, backfill) — error event-ek globális popup-ot dobnak\n * - false → historikus replay (pl. session újranyitás) — error event-ek csak a console bubble-be kerülnek\n */\n pushConsoleMessageFromEvent(\n event: CC_EventItem_Interface,\n isNewNotification: boolean,\n globalErrorShowError: (err: unknown, source: string) => void,\n ): void {\n const data: Record<string, unknown> = event.data;\n\n switch (event.eventType) {\n case 'response-chunk': {\n this.pushResponseChunkBlocks(data);\n break;\n }\n\n case 'tool-call-start': {\n // Tool call indulás: tool név + rövid leírás\n const toolName: string = (data.name as string)\n ?? (data.tool_name as string)\n ?? 'unknown';\n const toolId: string = typeof data.id === 'string' ? data.id : '';\n if (toolId) {\n this.toolUseIdToName.set(toolId, toolName);\n }\n // Agent tool_use → regisztrálás sub-agent kontextusként\n if (toolName === 'Agent' && toolId) {\n this.agentToolUseIds.add(toolId);\n }\n const toolInput: unknown = data.input;\n const inputSummary: string = toolInput\n ? CC_SocketEventHandler_ControlService.summarizeToolInput(toolInput)\n : '';\n const toolText: string = inputSummary\n ? `${toolName}: ${inputSummary}`\n : toolName;\n // Edit tool esetén old_string/new_string megjelenítése a brief-ben\n const editExpandable: string | undefined = toolName === 'Edit'\n ? CC_SocketEventHandler_ControlService.buildEditExpandableContent(toolInput)\n : undefined;\n // Agent tool-ok nem kapnak parentAgentId-t (ők a gyökér), belső tool-ok igen\n const toolParentId: string = toolName === 'Agent' ? '' : this.activeSubAgentId;\n this.parent.pushConsoleMessage({\n type: 'tool',\n text: toolText,\n expandableContent: editExpandable,\n rawData: data,\n parentAgentId: toolParentId || undefined,\n });\n break;\n }\n\n case 'tool-call-end': {\n // Tool result: rövid összefoglaló (expandálható részletes adattal)\n const resultContent: unknown = data.content ?? data.output;\n const fullResult: string = typeof resultContent === 'string' ? resultContent : '';\n const resultText: string = fullResult.length > 200\n ? fullResult.substring(0, 200) + '…'\n : fullResult;\n if (resultText) {\n const expandable: string | undefined = fullResult.length > 200\n ? fullResult\n : undefined;\n this.parent.pushConsoleMessage({\n type: 'tool-result',\n text: resultText,\n expandableContent: expandable,\n rawData: data,\n parentAgentId: this.activeSubAgentId || undefined,\n });\n }\n break;\n }\n\n case 'response-complete': {\n // Válasz kész — sub-agent kontextus törlése + usage kumulálás + model info.\n // REQ-CC-EVT-PATH-TRIM-001 sub-part (b) (cycle 220): a teljes response-complete\n // payload (cost_usd, model, usage tokens, duration, full result text stb.)\n // kibontható részletként — debugging, cost-audit, latency-elemzés célból.\n this.activeSubAgentId = '';\n const costRaw: unknown = data.cost_usd;\n const cost: string = typeof costRaw === 'number'\n ? ` ($${costRaw.toFixed(4)})`\n : '';\n const model: string = typeof data.model === 'string'\n ? ` · ${data.model}`\n : '';\n this.parent.pushConsoleMessage({\n type: 'result',\n text: `Response complete${model}${cost}`,\n rawData: data,\n expandableContent: JSON.stringify(data, null, 2),\n });\n this.accumulateUsage(data);\n break;\n }\n\n case 'prompt-sent': {\n // User prompt megjelenítése (historikus event-ekből).\n // Live session-ben a sendPrompt() már echo-t küldött → duplikáció elkerülése:\n // csak akkor jelenítjük meg, ha még nincs ilyen tartalmú prompt a console-ban.\n // REQ-CC-EVT-PATH-TRIM-001 sub-part (b) (cycle 219): a teljes prompt-sent\n // payload (timestamp, source, options, attachments stb.) kibontható részletként.\n const promptContent: string = typeof data.content === 'string'\n ? data.content\n : '';\n if (promptContent) {\n const existing: CcSessionConsoleMessage_Interface[] = this.parent.consoleMessages_$();\n const isDuplicate: boolean = existing.some(\n (m: CcSessionConsoleMessage_Interface): boolean =>\n m.type === 'prompt' && m.text === promptContent.trim(),\n );\n if (!isDuplicate) {\n this.parent.pushConsoleMessage({\n type: 'prompt',\n text: promptContent,\n rawData: data,\n expandableContent: JSON.stringify(data, null, 2),\n });\n }\n }\n break;\n }\n\n case 'status-change': {\n // Status változás megjelenítése (session szintű státusz).\n // REQ-CC-EVT-PATH-TRIM-001 sub-part (b) (cycle 219): a teljes status-change\n // payload (from / to / statusMessage / triggerSource stb.) kibontható részletként.\n const from: string = typeof data.from === 'string' ? data.from : '';\n const to: string = typeof data.to === 'string' ? data.to : '';\n if (to) {\n const statusMsg: string | undefined = typeof data.statusMessage === 'string'\n ? data.statusMessage\n : undefined;\n const statusText: string = from\n ? `${from} → ${to}`\n : to;\n const fullStatusText: string = statusMsg\n ? `${statusText} — ${statusMsg}`\n : statusText;\n this.parent.pushConsoleMessage({\n type: 'status',\n text: fullStatusText,\n isStatus: true,\n rawData: data,\n expandableContent: JSON.stringify(data, null, 2),\n });\n }\n break;\n }\n\n case 'config-change': {\n // Config módosítás megjelenítése.\n // REQ-CC-EVT-PATH-TRIM-001 sub-part (b) (cycle 216): a teljes update payload\n // a kibontható szekcióban (előtte/utáni mezők, debug-célú teljes átláthatóság).\n const update: unknown = data.update;\n const fields: string = update && typeof update === 'object'\n ? Object.keys(update as Record<string, unknown>).join(', ')\n : 'unknown';\n this.parent.pushConsoleMessage({\n type: 'info',\n text: `Config updated: ${fields}`,\n rawData: data,\n expandableContent: JSON.stringify(data, null, 2),\n });\n break;\n }\n\n case 'error': {\n // Hiba event megjelenítése a console-ban (mindig, replay-nél is).\n // REQ-CC-EVT-PATH-TRIM-001 sub-part (b) (cycle 216): error payload\n // (stack / source / additionalContent) kibontható részletként.\n const errorMsg: string = typeof data.message === 'string'\n ? data.message\n : 'Unknown error';\n this.parent.pushConsoleMessage({\n type: 'error',\n text: errorMsg,\n rawData: data,\n expandableContent: JSON.stringify(data, null, 2),\n });\n\n // Globális error popup CSAK új notification esetén — historikus replay-nél nem\n // (különben minden session újranyitás újradobná a régi hibákat Occuring Error-ként)\n if (isNewNotification) {\n globalErrorShowError(\n new Error(`CC Session error: ${errorMsg}`),\n 'cc-session-event',\n );\n }\n break;\n }\n\n case 'usage-update': {\n // Usage frissítés kumulálása (költség + token tracking)\n this.accumulateUsage(data);\n break;\n }\n\n case 'cli-chunk': {\n this.handleCliChunkEvent(data);\n break;\n }\n\n case 'runner-overflow': {\n // Runner buffer overflow (REQ-CCSESS-TR-006): a szerver disconnect alatt output sorok vesztek el.\n // REQ-CC-EVT-PATH-TRIM-001 sub-part (b) (cycle 216): kibontható részletek.\n const droppedCount: number = typeof data.droppedCount === 'number' ? data.droppedCount : 0;\n const overflowText: string = `Runner buffer overflow: ${droppedCount} output items lost during server disconnect`;\n this.parent.pushConsoleMessage({\n type: 'error',\n text: overflowText,\n rawData: data,\n expandableContent: JSON.stringify(data, null, 2),\n });\n break;\n }\n\n case 'interrupted-prompt': {\n // Futó prompt megszakadt (szerver restart, runner disconnect, lifecycle terminate).\n // REQ-CC-EVT-PATH-TRIM-001 sub-part (b) (cycle 216): a teljes lastPrompt + reason\n // kibontható részletként (a header csak első 80 char-t mutat).\n const reason: string = typeof data.reason === 'string' ? data.reason : '';\n const lastPrompt: string = typeof data.lastPrompt === 'string' ? data.lastPrompt : '';\n const briefPrompt: string = lastPrompt.length > 80\n ? lastPrompt.substring(0, 80) + '…'\n : lastPrompt;\n const interruptedText: string = briefPrompt\n ? `Prompt interrupted (${reason}): \"${briefPrompt}\"`\n : `Prompt interrupted${reason ? ' (' + reason + ')' : ''}`;\n this.parent.pushConsoleMessage({\n type: 'status',\n text: interruptedText,\n isStatus: true,\n rawData: data,\n expandableContent: JSON.stringify(data, null, 2),\n });\n break;\n }\n\n case 'session-init': {\n // CLI system/init event — a CLI tényleges konfigurációja session induláskor.\n const initModel: string = typeof data.model === 'string' ? data.model : '';\n const initVersion: string = typeof data.claudeCodeVersion === 'string'\n ? data.claudeCodeVersion : '';\n const initPermMode: string = typeof data.permissionMode === 'string'\n ? data.permissionMode : '';\n const initParts: string[] = [];\n if (initModel) { initParts.push(initModel); }\n if (initPermMode) { initParts.push(initPermMode); }\n if (initVersion) { initParts.push(`v${initVersion}`); }\n const initText: string = initParts.length > 0\n ? `CLI init: ${initParts.join(' · ')}`\n : 'CLI initialized';\n // REQ-CC-EVT-PATH-TRIM-001 sub-part (b) (cycle 215): a CLI init event teljes\n // adatmezőit JSON-ként a kibontható szekcióban — model / version / permission\n // mode + cwd + sessionId + bármilyen MCP server metaadat. Ez a kompakt header\n // (\"CLI init: …\") + részletes lenyitás-pattern; a többi event-típus\n // bővítése későbbi cycle-ben (kibontható details-coverage).\n const initExpandable: string = JSON.stringify(data, null, 2);\n this.parent.pushConsoleMessage({\n type: 'info',\n text: initText,\n rawData: data,\n expandableContent: initExpandable,\n });\n break;\n }\n\n case 'config-mismatch': {\n // Config mismatch — a CLI tényleges konfigurációja eltér a kérttől.\n // REQ-CC-EVT-PATH-TRIM-001 sub-part (b) (cycle 216): a teljes mismatches\n // tömb kibontható részletként.\n const mismatches: unknown = data.mismatches;\n const mismatchDetails: string = Array.isArray(mismatches)\n ? (mismatches as { field: string; requested: string; actual: string }[])\n .map((m: { field: string; requested: string; actual: string }): string =>\n `${m.field}: requested \"${m.requested}\" → actual \"${m.actual}\"`)\n .join(', ')\n : 'unknown mismatch';\n this.parent.pushConsoleMessage({\n type: 'error',\n text: `Config mismatch: ${mismatchDetails}`,\n rawData: data,\n expandableContent: JSON.stringify(data, null, 2),\n });\n break;\n }\n\n case 'cli-args-record': {\n // CLI args audit trail — a spawn-kor átadott tényleges beállítások rögzítése.\n // REQ-CC-EVT-PATH-TRIM-001 sub-part (b) (cycle 216): a teljes args record\n // (env, cwd, executable path stb.) kibontható részletként.\n const argModel: string = typeof data.model === 'string' ? data.model : 'default';\n const argEffort: string = typeof data.reasoningEffort === 'string'\n ? data.reasoningEffort : 'default';\n const argMode: string = typeof data.mode === 'string' ? data.mode : 'normal';\n const argPermission: string = typeof data.permissionPolicy === 'string'\n ? data.permissionPolicy : 'default';\n const argsText: string = `CLI spawn: model=${argModel}`\n + ` · effort=${argEffort}`\n + ` · mode=${argMode}`\n + ` · permission=${argPermission}`;\n this.parent.pushConsoleMessage({\n type: 'info',\n text: argsText,\n rawData: data,\n expandableContent: JSON.stringify(data, null, 2),\n });\n break;\n }\n\n case 'stdout-line':\n case 'stderr-line':\n // Nyers output → nem jelenítjük meg a chat-ben (külön live output buffer-be megy)\n break;\n\n default: {\n // Egyéb event típusok → JSON fallback brief (dedicált komponens nélkül)\n const briefText: string = event.eventType;\n this.parent.pushConsoleMessage({\n type: 'raw',\n text: briefText,\n rawData: data,\n });\n break;\n }\n }\n }\n\n // ── Socket handler: status ─────────────────────────────────\n\n /**\n * Status update feldolgozása.\n * Frissíti a session listát, az aktív session detail-t, és console üzenetet küld.\n */\n private handleStatusUpdate(payload: Record<string, unknown>): void {\n const sessionId: string = (payload.sessionId as string) ?? '';\n const status: string = (payload.status as string) ?? '';\n const statusMessage: string | undefined = payload.statusMessage as string | undefined;\n\n this.parent.lastStatusUpdate_$.set({\n sessionId: sessionId,\n status: status,\n statusMessage: statusMessage,\n });\n\n // Session lista frissítése (az adott session status-a)\n const currentSessions: CC_ListItem_Interface[] = this.parent.sessions_$();\n const updated: CC_ListItem_Interface[] = currentSessions.map(\n (s: CC_ListItem_Interface): CC_ListItem_Interface => {\n if (s.sessionId === sessionId) {\n return { ...s, status: status, statusMessage: statusMessage };\n }\n return s;\n },\n );\n this.parent.sessions_$.set(updated);\n\n // Kiválasztott session detail frissítése (ha az aktív session-t érinti)\n const currentDetail: CC_Detail_Response | null =\n this.parent.selectedSession_$();\n if (currentDetail?.session.sessionId === sessionId) {\n const isLive: boolean = CC_SocketEventHandler_ControlService.isLiveCcSessionStatus(status);\n this.parent.selectedSession_$.set({\n ...currentDetail,\n session: {\n ...currentDetail.session,\n status: status,\n statusMessage: statusMessage,\n },\n runtime: {\n ...currentDetail.runtime,\n isLive: isLive,\n runtimeStatus: status,\n },\n });\n }\n\n // Errored státusz → globális error kezelés (popup + hibalista report).\n // Cycle 775: Auto-recovery ghost-detect filter (server cycle 767 client-párdarabja).\n // Cycle 818: `Exit code: N` user-task-fail filter párja a server-oldali\n // cycle 758-nak — a kliens-oldalon throw-olt error eddig a /errors-be jutott\n // (l. handleStatusUpdate stack: chunk-FVJHSIII.js u.handleStatusUpdate).\n // Kétoldalú szimmetria: a server isUserTaskFailMessage(`Exit code:` prefix +\n // `Auto-recovery:` prefix) klienssel is azonos pattern-set.\n if (status === 'errored') {\n const trimmedStatusMessage: string = (statusMessage ?? '').trim();\n const isUserTaskFailNoise: boolean =\n trimmedStatusMessage.startsWith('Auto-recovery: terminal runner dropped silently')\n || trimmedStatusMessage.startsWith('Exit code:');\n if (isUserTaskFailNoise) {\n DyFM_Log.warn(\n `CCAP_CcSession | user-task-fail diagnostic (NOT recorded to /errors)`\n + ` | sessionId: ${sessionId}`\n + ` | statusMessage: ${trimmedStatusMessage}`,\n );\n } else {\n const errorMessage: string = statusMessage\n ? `CC Session error (${sessionId}): ${statusMessage}`\n : `CC Session error (${sessionId}): session entered errored state`;\n this.parent.showGlobalError(\n new Error(errorMessage),\n 'cc-session-status',\n );\n }\n }\n\n // Státusz váltás után poll indítás / leállítás (pl. running → completed)\n this.parent.evaluateSessionEventsPolling();\n }\n\n // ── Socket handler: output ─────────────────────────────────\n\n /**\n * Output chunk feldolgozása (live console-hoz).\n * Csak az aktív session output-ját fogadjuk.\n * Stderr sorok indexeit külön tároljuk a vizuális megkülönböztetéshez.\n */\n private handleOutputChunk(payload: Record<string, unknown>): void {\n const sessionId: string = (payload.sessionId as string) ?? '';\n\n // Csak az aktív session output-ját jelenítjük meg\n if (sessionId && sessionId !== this.parent.activeSessionId_$()) {\n return;\n }\n\n const content: string = (payload.content as string) ?? '';\n const outputType: string = (payload.type as string) ?? 'stdout';\n const currentOutput: string[] = this.parent.liveOutput_$();\n const newLines: string[] = content.split('\\n');\n const maxLines: number = 3000;\n\n // Stderr sorok index tracking\n const isStderr: boolean = outputType === 'stderr';\n if (isStderr) {\n const currentStderr: Set<number> = new Set(this.parent.liveStderrLines_$());\n const startIndex: number = currentOutput.length;\n for (let i: number = 0; i < newLines.length; i++) {\n currentStderr.add(startIndex + i);\n }\n this.parent.liveStderrLines_$.set(currentStderr);\n }\n\n // Buffer méret korlátozása (max 3000 sor)\n const combined: string[] = [...currentOutput, ...newLines];\n if (combined.length > maxLines) {\n const cutCount: number = combined.length - maxLines;\n const trimmed: string[] = combined.slice(cutCount);\n\n // Stderr index-ek újraszámolása a vágás után\n const oldStderr: Set<number> = this.parent.liveStderrLines_$();\n const newStderr: Set<number> = new Set<number>();\n for (const idx of oldStderr) {\n const shifted: number = idx - cutCount;\n if (shifted >= 0) {\n newStderr.add(shifted);\n }\n }\n this.parent.liveStderrLines_$.set(newStderr);\n this.parent.liveOutput_$.set(trimmed);\n } else {\n this.parent.liveOutput_$.set(combined);\n }\n }\n\n // ── Socket handler: session event ──────────────────────────\n\n /**\n * Session event feldolgozása (timeline-hoz + console-hoz).\n * Csak az aktív session event-jeit fogadjuk.\n */\n private handleSessionEvent(payload: Record<string, unknown>): void {\n const sessionId: string = (payload.sessionId as string) ?? '';\n\n // Csak az aktív session event-jeit jelenítjük meg\n if (sessionId && sessionId !== this.parent.activeSessionId_$()) {\n return;\n }\n\n const event: Record<string, unknown> =\n (payload.event as Record<string, unknown>) ?? {};\n\n const eventItem: CC_EventItem_Interface = {\n sessionId: sessionId,\n eventType: (event.eventType as string) ?? '',\n timestamp: (event.timestamp as string) ?? '',\n data: (event.data as Record<string, unknown>) ?? {},\n sequence: (event.sequence as number) ?? 0,\n // REQ-CC-EVT-SOURCE-FLAG-001 (cycle 438): forrás-flag a live socket\n // push payloadban — a UI badge a 'ccap-internal' eseményeket láthatóan\n // megkülönbözteti.\n eventSource: typeof event.eventSource === 'string' ? event.eventSource : undefined,\n };\n\n // Duplikáció védelem: ha a polling már feldolgozta ezt az event-et, kihagyjuk\n if (eventItem.sequence <= this.parent.getLastKnownEventSequence()) {\n return;\n }\n\n // Sequence tracker frissítése\n this.parent.setLastKnownEventSequence(eventItem.sequence);\n\n // Timeline-ba hozzáadás\n const currentEvents: CC_EventItem_Interface[] =\n this.parent.selectedSessionEvents_$();\n this.parent.selectedSessionEvents_$.set([...currentEvents, eventItem]);\n\n // Console-ba: parsolt event-ekből olvasható üzenetek\n // isNewNotification=true: live socket push — error event-ek dobhatnak global popup-ot\n this.pushConsoleMessageFromEvent(eventItem, true, (err: unknown, source: string): void => {\n this.parent.showGlobalError(err, source);\n });\n }\n\n // ── Socket handler: agent events ───────────────────────────\n\n /**\n * Agent event feldolgozása (run flow phase al-fázisok → console üzenetek).\n */\n private handleAgentEvent(payload: Record<string, unknown>): void {\n const phase: string | undefined = typeof payload.phase === 'string'\n ? payload.phase\n : undefined;\n\n if (!phase) {\n return;\n }\n\n switch (phase) {\n case AC_RunFlowPhase_Type.runInitialization:\n this.parent.pushConsoleMessage({ type: 'status', text: 'RUN initialization', isStatus: true });\n break;\n\n case AC_RunFlowPhase_Type.analyze:\n this.parent.pushConsoleMessage({ type: 'status', text: 'Analyzing incoming message', isStatus: true });\n break;\n\n case AC_RunFlowPhase_Type.analyzeResult: {\n const runIntent: string = typeof payload.runIntent === 'string'\n ? payload.runIntent\n : '';\n if (runIntent) {\n this.parent.pushConsoleMessage({ type: 'run-intent', text: runIntent, isStatus: false });\n }\n break;\n }\n\n case AC_RunFlowPhase_Type.assemble:\n this.parent.pushConsoleMessage({ type: 'status', text: 'Refreshing Context', isStatus: true });\n break;\n\n case AC_RunFlowPhase_Type.executionStart:\n this.parent.pushConsoleMessage({ type: 'status', text: 'Starting Agent', isStatus: true });\n break;\n\n case AC_RunFlowPhase_Type.llmAgenticLoop:\n this.parent.pushConsoleMessage({ type: 'status', text: 'Selecting next move', isStatus: true });\n break;\n\n case AC_RunFlowPhase_Type.agenticLoopIteration: {\n const action: string = typeof payload.action === 'string' ? payload.action : '';\n const tool: string = typeof payload.tool === 'string' ? payload.tool : '';\n const intent: string = typeof payload.intent === 'string' ? payload.intent : '';\n const parts: string[] = [];\n if (action) {\n parts.push(action);\n }\n if (tool) {\n parts.push(tool);\n }\n if (intent) {\n parts.push(intent);\n }\n const iterationText: string = parts.join(' · ');\n if (iterationText) {\n this.parent.pushConsoleMessage({ type: 'iteration', text: iterationText, isStatus: false });\n }\n break;\n }\n\n case AC_RunFlowPhase_Type.llmToolDescription:\n this.parent.pushConsoleMessage({ type: 'status', text: 'Assembling tool inputs', isStatus: true });\n break;\n\n case AC_RunFlowPhase_Type.llmToolErrorRetry:\n this.parent.pushConsoleMessage({ type: 'status', text: \"Figuring out what's wrong\", isStatus: true });\n break;\n\n case AC_RunFlowPhase_Type.toolErrorRetry:\n this.parent.pushConsoleMessage({ type: 'status', text: 'Trying to fix inputs', isStatus: true });\n break;\n\n case AC_RunFlowPhase_Type.executionEnd:\n this.parent.pushConsoleMessage({ type: 'status', text: 'Finishing run', isStatus: true });\n break;\n\n case AC_RunFlowPhase_Type.finalization:\n case AC_RunFlowPhase_Type.llmRunFinalization:\n this.parent.pushConsoleMessage({ type: 'status', text: \"Gathering what we've done\", isStatus: true });\n break;\n\n case AC_RunFlowPhase_Type.postFinalization:\n this.parent.pushConsoleMessage({ type: 'status', text: 'Memorizing stuff', isStatus: true });\n break;\n\n case AC_RunFlowPhase_Type.runFlowComplete:\n this.parent.pushConsoleMessage({ type: 'status', text: 'Getting back to user', isStatus: true });\n break;\n }\n }\n\n // ── Socket handler: rate limit broadcast ───────────────────\n\n /**\n * Rate limit broadcast feldolgozása (CCAP instance szintű SSOT).\n */\n private handleRateLimitBroadcast(payload: Record<string, unknown>): void {\n const rateLimitRaw: unknown = payload.rate_limit_info;\n if (!rateLimitRaw || typeof rateLimitRaw !== 'object') {\n return;\n }\n const rl: Record<string, unknown> = rateLimitRaw as Record<string, unknown>;\n const info: CcSessionRateLimitInfo_Interface = {\n status: typeof rl.status === 'string' ? rl.status : '',\n resetsAt: typeof rl.resetsAt === 'number' ? rl.resetsAt : 0,\n rateLimitType: typeof rl.rateLimitType === 'string' ? rl.rateLimitType : '',\n utilization: typeof rl.utilization === 'number' ? rl.utilization : 0,\n surpassedThreshold: typeof rl.surpassedThreshold === 'number' ? rl.surpassedThreshold : 0,\n isUsingOverage: rl.isUsingOverage === true,\n receivedAt: new Date().toISOString(),\n };\n this.parent.rateLimitInfo_$.set(info);\n }\n\n // ── Socket handler: list & session update ──────────────────\n\n /**\n * Lista frissítés feldolgozása (broadcast update — strukturális: create, archive).\n */\n private handleListUpdate(payload: Record<string, unknown>): void {\n const allSessions: CC_ListItem_Interface[] =\n (payload.sessions as CC_ListItem_Interface[]) ?? [];\n\n // A dashboard showArchived állapota: ha a meglévő listában NINCS egyetlen archivált elem sem,\n // a user nem akar archivált elemeket látni → szűrjük.\n const currentHasArchived: boolean = this.parent.sessions_$().some(\n (s: CC_ListItem_Interface): boolean => s.isArchived === true,\n );\n const filtered: CC_ListItem_Interface[] = currentHasArchived\n ? allSessions\n : allSessions.filter(\n (s: CC_ListItem_Interface): boolean => !s.isArchived,\n );\n\n // Sortolás `lastActivityAt desc` szerint — ugyanúgy mint a loadSessions REST fetch-ben.\n // Cycle 675 SOS-fix: a szerver-oldal által küldött lista sorrendje nem garantált;\n // sortolás nélkül egy újonnan létrehozott session a lista közepére kerülhetett és a\n // user nem látta meg, hogy létrejött (Bug #3: „új session helyett régit mutat\").\n const sorted: CC_ListItem_Interface[] = [...filtered].sort(\n (a: CC_ListItem_Interface, b: CC_ListItem_Interface): number => {\n const aTs: number = a.lastActivityAt ? new Date(a.lastActivityAt).getTime() : 0;\n const bTs: number = b.lastActivityAt ? new Date(b.lastActivityAt).getTime() : 0;\n return bTs - aTs;\n },\n );\n this.parent.sessions_$.set(sorted);\n\n // Aktív session detail.session merge\n this.mergeActiveSessionDetail(allSessions);\n }\n\n /**\n * Egyetlen session mező-szintű frissítés (cc-session:session-update).\n */\n private handleSessionItemUpdate(payload: Record<string, unknown>): void {\n const sessionId: string =\n typeof payload.sessionId === 'string' ? payload.sessionId : '';\n if (!sessionId) {\n return;\n }\n const update: Record<string, unknown> =\n typeof payload.update === 'object' && payload.update !== null\n ? payload.update as Record<string, unknown>\n : {};\n\n // sessions_$ lista in-place merge\n const currentSessions: CC_ListItem_Interface[] = this.parent.sessions_$();\n const updatedSessions: CC_ListItem_Interface[] = currentSessions.map(\n (s: CC_ListItem_Interface): CC_ListItem_Interface => {\n if (s.sessionId !== sessionId) {\n return s;\n }\n return CC_SocketEventHandler_ControlService.applySessionFieldUpdate(s, update);\n },\n );\n this.parent.sessions_$.set(updatedSessions);\n\n // selectedSession_$ detail merge (ha az aktív session-t érinti)\n const currentDetail: CC_Detail_Response | null = this.parent.selectedSession_$();\n if (currentDetail?.session.sessionId === sessionId) {\n this.parent.selectedSession_$.set({\n ...currentDetail,\n session: CC_SocketEventHandler_ControlService.applySessionFieldUpdate(\n currentDetail.session,\n update,\n ),\n });\n }\n }\n\n /**\n * Session-update mező alkalmazása egy list-item-re.\n * Kezeli az increment és abszolút mezőket is.\n */\n private static applySessionFieldUpdate(\n item: CC_ListItem_Interface,\n update: Record<string, unknown>,\n ): CC_ListItem_Interface {\n const merged: CC_ListItem_Interface = { ...item };\n\n // Increment mezők (delta hozzáadás a meglévő értékhez)\n if (typeof update.toolCallCountIncrement === 'number') {\n merged.toolCallCount = (merged.toolCallCount ?? 0) + update.toolCallCountIncrement;\n }\n if (typeof update.promptCountIncrement === 'number') {\n merged.promptCount = (merged.promptCount ?? 0) + update.promptCountIncrement;\n }\n if (typeof update.inputTokensIncrement === 'number') {\n merged.inputTokensTotal = (merged.inputTokensTotal ?? 0) + update.inputTokensIncrement;\n }\n if (typeof update.outputTokensIncrement === 'number') {\n merged.outputTokensTotal = (merged.outputTokensTotal ?? 0) + update.outputTokensIncrement;\n }\n if (typeof update.costUsdIncrement === 'number') {\n merged.costUsdTotal = (merged.costUsdTotal ?? 0) + update.costUsdIncrement;\n }\n\n // Abszolút mezők (felülírják a meglévőt)\n if (typeof update.status === 'string') {\n merged.status = update.status;\n }\n if (typeof update.statusMessage === 'string' || update.statusMessage === undefined) {\n merged.statusMessage = update.statusMessage as string | undefined;\n }\n if (typeof update.lastActivityAt === 'string') {\n merged.lastActivityAt = update.lastActivityAt;\n }\n if (typeof update.lastPrompt === 'string') {\n merged.lastPrompt = update.lastPrompt;\n }\n if (typeof update.activeModel === 'string') {\n merged.activeModel = update.activeModel;\n }\n\n return merged;\n }\n\n /**\n * Aktív session detail.session merge a friss lista-adatokból.\n */\n private mergeActiveSessionDetail(sessions: CC_ListItem_Interface[]): void {\n const activeId: string = this.parent.activeSessionId_$();\n if (!activeId) {\n return;\n }\n const currentDetail: CC_Detail_Response | null = this.parent.selectedSession_$();\n if (!currentDetail) {\n return;\n }\n const fresh: CC_ListItem_Interface | undefined = sessions.find(\n (s: CC_ListItem_Interface): boolean => s.sessionId === activeId,\n );\n if (!fresh) {\n return;\n }\n this.parent.selectedSession_$.set({\n ...currentDetail,\n session: {\n ...currentDetail.session,\n ...fresh,\n },\n });\n }\n\n // ── Socket handler: assembled messages ─────────────────────\n\n /**\n * Új assembled message érkezett socket-en — hozzáfűzés a listához.\n */\n private handleAssembledMessage(payload: Record<string, unknown>): void {\n const sessionId: string =\n typeof payload.sessionId === 'string'\n ? payload.sessionId\n : '';\n const activeId: string = this.parent.activeSessionId_$();\n if (!sessionId || sessionId !== activeId) {\n return;\n }\n const msgData: unknown = payload.message;\n if (!msgData || typeof msgData !== 'object') {\n DyFM_Log.warn(\n `CCAP_CcSession_DS | handleAssembledMessage dropped: invalid message payload`,\n { sessionId: sessionId, payloadKeys: Object.keys(payload) },\n );\n return;\n }\n const msg: CCAP_ExtSessionMessage_Response =\n msgData as CCAP_ExtSessionMessage_Response;\n // messageKey-alapú dedup\n const current: CCAP_ExtSessionMessage_Response[] =\n this.parent.assembledMessages_$();\n const messageKey: string = typeof msg.messageKey === 'string' ? msg.messageKey : '';\n if (messageKey && current.some(\n (m: CCAP_ExtSessionMessage_Response): boolean => m.messageKey === messageKey,\n )) {\n return;\n }\n // BUG-CC-UI-STALE-001: sort by sequence ASC — push event-ek érkezhetnek out-of-order,\n // a deterministikus chronological view-hoz minden mutáció után rendezünk.\n this.parent.assembledMessages_$.set(\n Shr_ExtMessageChronologicalSort_Util.sortAsc([...current, msg]),\n );\n }\n\n /**\n * Assembled message frissítés socket-en (stream text append, tool result upsert).\n */\n private handleAssembledMessageUpdate(payload: Record<string, unknown>): void {\n const sessionId: string =\n typeof payload.sessionId === 'string'\n ? payload.sessionId\n : '';\n if (!sessionId || sessionId !== this.parent.activeSessionId_$()) {\n return;\n }\n const messageKey: string =\n typeof payload.messageKey === 'string'\n ? payload.messageKey\n : '';\n if (!messageKey) {\n return;\n }\n const updateData: unknown = payload.update;\n if (!updateData || typeof updateData !== 'object') {\n return;\n }\n const updateRec: Record<string, unknown> =\n updateData as Record<string, unknown>;\n\n // Meglévő message keresése és frissítése\n const current: CCAP_ExtSessionMessage_Response[] =\n this.parent.assembledMessages_$();\n const idx: number = current.findIndex(\n (m: CCAP_ExtSessionMessage_Response): boolean =>\n m.messageKey === messageKey,\n );\n if (idx < 0) {\n return;\n }\n const updated: CCAP_ExtSessionMessage_Response = {\n ...current[idx],\n };\n // bodyText frissítés (stream append)\n if (typeof updateRec.bodyText === 'string') {\n updated.bodyText = updateRec.bodyText;\n }\n // toolResult frissítés (tool pairing)\n if (updateRec.toolResult !== undefined) {\n updated.toolResult =\n updateRec.toolResult as CCAP_ExtSessionMessage_Response['toolResult'];\n }\n // toolStatus frissítés\n if (typeof updateRec.toolStatus === 'string') {\n updated.toolStatus = updateRec.toolStatus;\n }\n // headerStatusDot frissítés\n if (updateRec.headerStatusDot !== undefined) {\n updated.headerStatusDot =\n typeof updateRec.headerStatusDot === 'string'\n ? updateRec.headerStatusDot\n : undefined;\n }\n const next: CCAP_ExtSessionMessage_Response[] = [...current];\n next[idx] = updated;\n this.parent.assembledMessages_$.set(next);\n }\n\n // ── Private helpers ────────────────────────────────────────\n\n /**\n * CLI chunk event (cli-chunk) feldolgozása.\n * Rate limit, system event, user message tool results, raw fallback.\n */\n private handleCliChunkEvent(data: Record<string, unknown>): void {\n const cliChunkType: string = typeof data.type === 'string' ? data.type : '';\n\n // Rate limit event → globális rateLimitInfo signal\n if (cliChunkType === 'rate_limit_event') {\n const rateLimitRaw: unknown = data.rate_limit_info;\n if (rateLimitRaw && typeof rateLimitRaw === 'object') {\n const rl: Record<string, unknown> = rateLimitRaw as Record<string, unknown>;\n const info: CcSessionRateLimitInfo_Interface = {\n status: typeof rl.status === 'string' ? rl.status : '',\n resetsAt: typeof rl.resetsAt === 'number' ? rl.resetsAt : 0,\n rateLimitType: typeof rl.rateLimitType === 'string' ? rl.rateLimitType : '',\n utilization: typeof rl.utilization === 'number' ? rl.utilization : 0,\n surpassedThreshold: typeof rl.surpassedThreshold === 'number' ? rl.surpassedThreshold : 0,\n isUsingOverage: rl.isUsingOverage === true,\n receivedAt: new Date().toISOString(),\n };\n this.parent.rateLimitInfo_$.set(info);\n }\n return;\n }\n\n // System event — task_progress + tool név → tool card, egyéb → status-update pirula\n if (cliChunkType === 'system') {\n this.handleCliChunkSystemEvent(data);\n return;\n }\n\n // User message → tool_result content párosítás tool_use_id alapján\n if (this.handleCliChunkToolResults(data)) {\n return;\n }\n\n // Ismeretlen cli-chunk → raw JSON fallback\n this.parent.pushConsoleMessage({\n type: 'raw',\n text: cliChunkType || 'cli-chunk',\n rawData: data,\n });\n }\n\n /**\n * CLI chunk system event feldolgozása (init, task_progress, compact_boundary, stb.).\n */\n private handleCliChunkSystemEvent(data: Record<string, unknown>): void {\n const subtype: string = typeof data.subtype === 'string'\n ? data.subtype\n : '';\n const description: string = typeof data.description === 'string'\n ? data.description\n : CC_SocketEventHandler_ControlService.buildSystemEventBrief({ subtype: subtype, data: data });\n // tool_use_id → aktív sub-agent kontextus frissítése\n const systemToolUseId: string = typeof data.tool_use_id === 'string'\n ? data.tool_use_id\n : '';\n if (systemToolUseId && this.agentToolUseIds.has(systemToolUseId)) {\n this.activeSubAgentId = systemToolUseId;\n }\n const parentAgentId: string | undefined =\n systemToolUseId && this.agentToolUseIds.has(systemToolUseId)\n ? systemToolUseId\n : (this.activeSubAgentId || undefined);\n\n // task_progress + last_tool_name → tool típusú üzenet (shared tool card render)\n const lastToolName: string = typeof data.last_tool_name === 'string'\n ? data.last_tool_name\n : '';\n if (subtype === 'task_progress' && lastToolName) {\n this.parent.pushConsoleMessage({\n type: 'tool',\n text: `${lastToolName}: ${description}`,\n isStatus: false,\n rawData: data,\n parentAgentId: parentAgentId,\n });\n return;\n }\n\n // Többi system event (init, compact_boundary, stb.) → status-update pirula\n this.parent.pushConsoleMessage({\n type: 'status-update',\n text: description,\n subtype: subtype,\n isStatus: false,\n rawData: data,\n parentAgentId: parentAgentId,\n });\n }\n\n /**\n * Response-chunk (assistant message) összes content block-jának feldolgozása.\n */\n private pushResponseChunkBlocks(data: Record<string, unknown>): void {\n const message: unknown = data.message;\n const contentSource: unknown = (message && typeof message === 'object')\n ? (message as Record<string, unknown>)['content']\n : data.content;\n\n // Content array: minden blokk típusra külön message\n if (Array.isArray(contentSource)) {\n for (const block of contentSource) {\n if (!block || typeof block !== 'object') {\n continue;\n }\n const blockObj: Record<string, unknown> = block as Record<string, unknown>;\n const blockType: string = typeof blockObj.type === 'string'\n ? blockObj.type\n : '';\n\n if (blockType === 'text') {\n const text: string = typeof blockObj.text === 'string'\n ? blockObj.text\n : '';\n if (text) {\n this.activeSubAgentId = '';\n this.parent.pushConsoleMessage({ type: 'assistant', text: text, rawData: data });\n }\n } else if (blockType === 'tool_use') {\n this.handleResponseChunkToolUse(blockObj, data);\n } else if (blockType === 'tool_result') {\n this.handleResponseChunkToolResult(blockObj);\n } else if (blockType === 'thinking') {\n const thinkingText: string = typeof blockObj.thinking === 'string'\n ? blockObj.thinking\n : '';\n if (thinkingText) {\n this.parent.pushConsoleMessage({\n type: 'thinking',\n text: thinkingText,\n rawData: blockObj as Record<string, unknown>,\n parentAgentId: this.activeSubAgentId || undefined,\n });\n }\n } else if (blockType) {\n this.parent.pushConsoleMessage({\n type: 'raw',\n text: blockType,\n rawData: blockObj as Record<string, unknown>,\n });\n }\n }\n return;\n }\n\n // String content (egyszerű szöveges válasz, régi formátum)\n if (typeof contentSource === 'string' && contentSource) {\n this.parent.pushConsoleMessage({ type: 'assistant', text: contentSource, rawData: data });\n return;\n }\n\n // Semmilyen ismert formátum nem illeszkedett → raw JSON fallback\n this.parent.pushConsoleMessage({\n type: 'raw',\n text: 'response-chunk',\n rawData: data,\n });\n }\n\n /**\n * Response-chunk tool_use blokk feldolgozása.\n */\n private handleResponseChunkToolUse(\n blockObj: Record<string, unknown>,\n data: Record<string, unknown>,\n ): void {\n const toolName: string = typeof blockObj.name === 'string'\n ? blockObj.name\n : 'unknown';\n const embeddedToolId: string = typeof blockObj.id === 'string'\n ? blockObj.id\n : '';\n if (embeddedToolId) {\n this.toolUseIdToName.set(embeddedToolId, toolName);\n }\n // Agent tool_use → regisztrálás sub-agent kontextusként\n if (toolName === 'Agent' && embeddedToolId) {\n this.agentToolUseIds.add(embeddedToolId);\n }\n const toolInput: unknown = blockObj.input;\n const inputSummary: string = toolInput\n ? CC_SocketEventHandler_ControlService.summarizeToolInput(toolInput)\n : '';\n const toolText: string = inputSummary\n ? `${toolName}: ${inputSummary}`\n : toolName;\n const embeddedEditExpandable: string | undefined = toolName === 'Edit'\n ? CC_SocketEventHandler_ControlService.buildEditExpandableContent(toolInput)\n : undefined;\n const embeddedParentId: string = toolName === 'Agent' ? '' : this.activeSubAgentId;\n this.parent.pushConsoleMessage({\n type: 'tool',\n text: toolText,\n expandableContent: embeddedEditExpandable,\n rawData: blockObj as Record<string, unknown>,\n parentAgentId: embeddedParentId || undefined,\n });\n }\n\n /**\n * Response-chunk tool_result blokk feldolgozása.\n */\n private handleResponseChunkToolResult(blockObj: Record<string, unknown>): void {\n const resultToolUseId: string = typeof blockObj.tool_use_id === 'string'\n ? blockObj.tool_use_id\n : '';\n const resultParentId: string = resultToolUseId && this.agentToolUseIds.has(resultToolUseId)\n ? resultToolUseId\n : (this.activeSubAgentId || '');\n const resultContent: unknown = blockObj.content ?? blockObj.output;\n const fullResult: string = typeof resultContent === 'string' ? resultContent : '';\n const resultText: string = fullResult.length > 200\n ? fullResult.substring(0, 200) + '…'\n : fullResult || 'tool_result';\n this.parent.pushConsoleMessage({\n type: 'tool-result',\n text: resultText,\n expandableContent: fullResult.length > 200 ? fullResult : undefined,\n rawData: blockObj as Record<string, unknown>,\n parentAgentId: resultParentId || undefined,\n });\n }\n\n /**\n * CLI chunk user message content blokkjainak kezelése (tool_result párosítás).\n * @returns true ha sikeresen feldolgozta, false ha raw fallback kell.\n */\n private handleCliChunkToolResults(data: Record<string, unknown>): boolean {\n const chunkType: string = typeof data.type === 'string' ? data.type : '';\n if (chunkType !== 'user') {\n return false;\n }\n\n const message: unknown = data.message;\n const contentSource: unknown = (message && typeof message === 'object')\n ? (message as Record<string, unknown>)['content']\n : null;\n\n if (!Array.isArray(contentSource)) {\n return false;\n }\n\n const parentToolUseId: string = typeof data.parent_tool_use_id === 'string'\n ? data.parent_tool_use_id\n : '';\n\n let hasHandled: boolean = false;\n\n for (const block of contentSource) {\n if (!block || typeof block !== 'object') {\n continue;\n }\n const blockObj: Record<string, unknown> = block as Record<string, unknown>;\n const blockType: string = typeof blockObj.type === 'string' ? blockObj.type : '';\n\n if (blockType === 'tool_result') {\n const toolUseId: string = typeof blockObj.tool_use_id === 'string'\n ? blockObj.tool_use_id\n : '';\n const pairedToolName: string = toolUseId\n ? (this.toolUseIdToName.get(toolUseId) ?? '')\n : '';\n\n const resultContent: unknown = blockObj.content;\n const fullResult: string = typeof resultContent === 'string' ? resultContent : '';\n const isError: boolean = blockObj.is_error === true;\n\n const prefix: string = pairedToolName ? `${pairedToolName}: ` : '';\n const truncatedResult: string = fullResult.length > 200\n ? fullResult.substring(0, 200) + '…'\n : fullResult || 'tool result';\n const resultText: string = isError\n ? `${prefix}ERROR — ${truncatedResult}`\n : `${prefix}${truncatedResult}`;\n\n this.parent.pushConsoleMessage({\n type: 'tool-result',\n text: resultText,\n expandableContent: fullResult.length > 200 ? fullResult : undefined,\n rawData: { ...blockObj, parent_tool_use_id: parentToolUseId || undefined },\n parentAgentId: parentToolUseId || undefined,\n });\n hasHandled = true;\n } else if (blockType === 'text' && parentToolUseId) {\n const textContent: string = typeof blockObj.text === 'string'\n ? blockObj.text\n : '';\n if (textContent) {\n const truncated: string = textContent.length > 200\n ? textContent.substring(0, 200) + '…'\n : textContent;\n this.parent.pushConsoleMessage({\n type: 'tool-result',\n text: truncated,\n expandableContent: textContent.length > 200 ? textContent : undefined,\n rawData: { tool_use_id: parentToolUseId, type: 'sub-agent-prompt', text: textContent },\n parentAgentId: parentToolUseId,\n });\n hasHandled = true;\n }\n }\n }\n\n return hasHandled;\n }\n\n // ── Static helpers ─────────────────────────────────────────\n\n /**\n * CC Session „live\" runtime státusz.\n */\n static isLiveCcSessionStatus(status: string): boolean {\n return status === 'running'\n || status === 'waiting-input'\n || status === 'starting';\n }\n\n /**\n * System event subtype → olvasható brief szöveg.\n */\n private static buildSystemEventBrief(params: {\n subtype: string;\n data: Record<string, unknown>;\n }): string {\n switch (params.subtype) {\n case 'init': {\n const cwd: string =\n typeof params.data.cwd === 'string' ? params.data.cwd : '';\n const model: string =\n typeof params.data.model === 'string' ? params.data.model : '';\n const parts: string[] = ['init'];\n if (cwd) {\n parts.push(cwd);\n }\n if (model) {\n parts.push(model);\n }\n return parts.join(' · ');\n }\n\n case 'task_updated': {\n const patch: unknown = params.data.patch;\n const status: string =\n patch && typeof patch === 'object'\n && typeof (patch as Record<string, unknown>).status === 'string'\n ? (patch as Record<string, unknown>).status as string\n : '';\n return status ? `task ${status}` : 'task updated';\n }\n\n case 'task_notification': {\n const status: string =\n typeof params.data.status === 'string' ? params.data.status : '';\n return status ? `task ${status}` : 'task notification';\n }\n\n default:\n return params.subtype || 'system';\n }\n }\n\n /**\n * Edit tool input-ból expandálható diff tartalom előállítása.\n */\n private static buildEditExpandableContent(input: unknown): string | undefined {\n if (!input || typeof input !== 'object') {\n return undefined;\n }\n const obj: Record<string, unknown> = input as Record<string, unknown>;\n const oldStr: unknown = obj.old_string;\n const newStr: unknown = obj.new_string;\n if (typeof oldStr !== 'string' || typeof newStr !== 'string') {\n return undefined;\n }\n const maxLen: number = 500;\n const oldTrunc: string = oldStr.length > maxLen ? oldStr.substring(0, maxLen) + '…' : oldStr;\n const newTrunc: string = newStr.length > maxLen ? newStr.substring(0, maxLen) + '…' : newStr;\n return JSON.stringify({ old: oldTrunc, new: newTrunc });\n }\n\n /**\n * Tool input rövid összefoglaló (file path, command, stb.).\n */\n private static summarizeToolInput(input: unknown): string {\n if (typeof input === 'string') {\n return input.length > 120 ? input.substring(0, 120) + '…' : input;\n }\n if (input && typeof input === 'object') {\n const obj: Record<string, unknown> = input as Record<string, unknown>;\n const filePath: unknown = obj.file_path ?? obj.path;\n const command: unknown = obj.command;\n const pattern: unknown = obj.pattern;\n if (typeof filePath === 'string') {\n return filePath;\n }\n if (typeof command === 'string') {\n return command.length > 120 ? command.substring(0, 120) + '…' : command;\n }\n if (typeof pattern === 'string') {\n return pattern;\n }\n }\n return '';\n }\n\n /**\n * Kumulatív usage frissítése response-complete event adataiból.\n */\n private accumulateUsage(data: Record<string, unknown>): void {\n const usage: unknown = data.usage;\n const costUsd: number = typeof data.cost_usd === 'number'\n ? data.cost_usd\n : 0;\n\n let promptTokens: number = 0;\n let completionTokens: number = 0;\n\n if (usage && typeof usage === 'object') {\n const usageObj: Record<string, unknown> = usage as Record<string, unknown>;\n promptTokens = typeof usageObj.input_tokens === 'number'\n ? usageObj.input_tokens\n : (typeof usageObj.promptTokens === 'number' ? usageObj.promptTokens : 0);\n completionTokens = typeof usageObj.output_tokens === 'number'\n ? usageObj.output_tokens\n : (typeof usageObj.completionTokens === 'number' ? usageObj.completionTokens : 0);\n }\n\n const current: CcSessionUsage_Interface = this.parent.sessionUsage_$();\n this.parent.sessionUsage_$.set({\n promptTokens: current.promptTokens + promptTokens,\n completionTokens: current.completionTokens + completionTokens,\n totalTokens: current.totalTokens + promptTokens + completionTokens,\n costUsd: current.costUsd + costUsd,\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_fsm_dynamo", "Shr_ExtMessageChronologicalSort_Util", "compareAsc", "a", "b", "dseq", "sequence", "ta", "timestamp", "tb", "tcmp", "localeCompare", "ka", "messageKey", "kb", "sortAsc", "messages", "sort", "import_fsm_dynamo", "CC_SocketEventHandler_ControlService", "parent", "agentToolUseIds", "Set", "activeSubAgentId", "toolUseIdToName", "Map", "init", "resetTrackingState", "clear", "handleSocketEvent", "envelope", "context", "eventName", "event", "payload", "eventCcapId", "ccapId", "selectedCcapId", "DyFM_Log", "info", "handleStatusUpdate", "handleOutputChunk", "handleSessionEvent", "handleListUpdate", "handleSessionItemUpdate", "handleAgentEvent", "handleAssembledMessage", "handleAssembledMessageUpdate", "handleRateLimitBroadcast", "err", "errMessage", "Error", "message", "String", "error", "globalErrorShowError", "pushConsoleMessageFromEvent", "isNewNotification", "data", "eventType", "pushResponseChunkBlocks", "toolName", "name", "tool_name", "toolId", "id", "set", "add", "toolInput", "input", "inputSummary", "summarizeToolInput", "toolText", "editExpandable", "buildEditExpandableContent", "undefined", "toolParentId", "pushConsoleMessage", "type", "text", "expandableContent", "rawData", "parentAgentId", "resultContent", "content", "output", "fullResult", "resultText", "length", "substring", "expandable", "costRaw", "cost_usd", "cost", "toFixed", "model", "JSON", "stringify", "accumulateUsage", "promptContent", "consoleMessages_$", "some", "m", "trim", "from", "to", "statusMsg", "statusMessage", "statusText", "fullStatusText", "isStatus", "update", "fields", "Object", "keys", "join", "errorMsg", "handleCliChunkEvent", "overflowText", "droppedCount", "reason", "lastPrompt", "briefPrompt", "interruptedText", "initModel", "initVersion", "claudeCodeVersion", "initPermMode", "permissionMode", "initParts", "push", "initText", "initExpandable", "mismatches", "mismatchDetails", "Array", "isArray", "map", "field", "requested", "actual", "argModel", "argEffort", "reasoningEffort", "argMode", "mode", "argPermission", "permissionPolicy", "argsText", "briefText", "sessionId", "status", "lastStatusUpdate_$", "updated", "sessions_$", "s", "__spreadProps", "__spreadValues", "currentDetail", "selectedSession_$", "session", "isLive", "isLiveCcSessionStatus", "runtime", "runtimeStatus", "trimmedStatusMessage", "startsWith", "warn", "errorMessage", "showGlobalError", "evaluateSessionEventsPolling", "activeSessionId_$", "outputType", "currentOutput", "liveOutput_$", "newLines", "split", "maxLines", "currentStderr", "liveStderrLines_$", "startIndex", "i", "combined", "cutCount", "trimmed", "slice", "oldStderr", "newStderr", "idx", "shifted", "eventItem", "timestamp", "sequence", "eventSource", "getLastKnownEventSequence", "setLastKnownEventSequence", "currentEvents", "selectedSessionEvents_$", "source", "phase", "AC_RunFlowPhase_Type", "runInitialization", "analyze", "analyzeResult", "runIntent", "assemble", "executionStart", "llmAgenticLoop", "agenticLoopIteration", "action", "tool", "intent", "parts", "iterationText", "llmToolDescription", "llmToolErrorRetry", "toolErrorRetry", "executionEnd", "finalization", "llmRunFinalization", "postFinalization", "runFlowComplete", "rateLimitRaw", "rate_limit_info", "rl", "resetsAt", "rateLimitType", "utilization", "surpassedThreshold", "isUsingOverage", "receivedAt", "Date", "toISOString", "rateLimitInfo_$", "allSessions", "sessions", "sorted", "isArchived", "filter", "sort", "a", "b", "aTs", "lastActivityAt", "getTime", "mergeActiveSessionDetail", "updatedSessions", "applySessionFieldUpdate", "item", "merged", "toolCallCountIncrement", "toolCallCount", "promptCountIncrement", "promptCount", "inputTokensIncrement", "inputTokensTotal", "outputTokensIncrement", "outputTokensTotal", "costUsdIncrement", "costUsdTotal", "activeModel", "activeId", "fresh", "find", "msgData", "payloadKeys", "msg", "current", "assembledMessages_$", "messageKey", "Shr_ExtMessageChronologicalSort_Util", "sortAsc", "updateData", "updateRec", "findIndex", "bodyText", "toolResult", "toolStatus", "headerStatusDot", "next", "cliChunkType", "handleCliChunkSystemEvent", "handleCliChunkToolResults", "subtype", "description", "buildSystemEventBrief", "systemToolUseId", "tool_use_id", "has", "lastToolName", "last_tool_name", "contentSource", "block", "blockObj", "blockType", "handleResponseChunkToolUse", "handleResponseChunkToolResult", "thinkingText", "thinking", "embeddedToolId", "embeddedEditExpandable", "embeddedParentId", "resultToolUseId", "resultParentId", "parentToolUseId", "parent_tool_use_id", "hasHandled", "toolUseId", "pairedToolName", "get", "isError", "is_error", "prefix", "truncatedResult", "textContent", "truncated", "params", "cwd", "patch", "obj", "oldStr", "old_string", "newStr", "new_string", "maxLen", "oldTrunc", "newTrunc", "old", "new", "filePath", "file_path", "path", "command", "pattern", "usage", "costUsd", "promptTokens", "completionTokens", "usageObj", "input_tokens", "output_tokens", "sessionUsage_$", "totalTokens", "factory", "\u0275fac", "providedIn", "ClaudeCode_DataService", "sessions_$", "signal", "sessionsLoading_$", "sessionsLoadError_$", "selectedSession_$", "selectedSessionLoading_$", "selectedSessionEvents_$", "liveOutput_$", "liveStderrLines_$", "Set", "consoleMessages_$", "assembledMessages_$", "assembledMessagesHasMore_$", "isLoadingOlderMessages_$", "assembledMessagesLoaded_$", "lastStatusUpdate_$", "sessionUsage_$", "promptTokens", "completionTokens", "totalTokens", "costUsd", "rateLimitInfo_$", "activeSessionId_$", "ccSession_AS", "inject", "ClaudeCode_ApiService", "extSessionMsg_AS", "ExS_Message_ApiService", "globalError_CS", "CCAP_GlobalError_ControlService", "socket_CS", "CCAP_Socket_ControlService", "ngZone", "NgZone", "peiContext_DS", "ExS_InstanceContext_DataService", "socketEventHandler_CS", "CC_SocketEventHandler_ControlService", "eventSubscription", "reconnectSubscription", "lastKnownEventSequence", "SESSION_EVENTS_POLL_INTERVAL_MS", "second", "sessionEventsPollHandle", "isSessionEventsPollInFlight", "constructor", "init", "event$", "subscribe", "envelope", "run", "handleSocketEvent", "selectedCcapId", "activeCcapId_$", "globalErrorShowError", "err", "source", "showError", "connected$", "isConnected", "activeId", "emit", "sessionId", "loadAssembledMessages", "catch", "loadSessionDetail", "loadSessions", "backfillMissedEvents", "ngOnDestroy", "stopSessionEventsPolling", "unsubscribe", "showGlobalError", "getLastKnownEventSequence", "setLastKnownEventSequence", "sequence", "evaluateSessionEventsPolling", "status", "resolveActiveSessionStatusForEventsPolling", "Boolean", "isLiveCcSessionStatus", "ensureSessionEventsPollingStarted", "params", "__async", "set", "sorted", "listSessions", "workspacePath", "includeArchived", "sessions", "sort", "a", "b", "dateA", "lastActivityAt", "Date", "getTime", "loadPersistedRateLimitState", "ccapId", "trim", "response", "getRateLimitState", "mergePersistedRateLimitState", "items", "DyFM_Log", "warn", "Error", "message", "String", "mapped", "CC_RateLimitStateMapper_Util", "mapServerItemsToClientInfo", "getSession", "currentActiveId", "info", "errorMessage", "pushConsoleMessage", "type", "text", "loadSessionEvents", "getSessionEvents", "eventType", "limit", "latest", "events", "updateLastKnownSequence", "event", "pushConsoleMessageFromEvent", "createSession", "result", "session", "CCAP_ErrorDisplay_Util", "getErrorMessageForDisplay", "sendPrompt", "imageDataUrls", "attachments", "filter", "isImage", "base64", "map", "mimeType", "content", "length", "undefined", "promptResult", "relayed", "targetOnline", "taskId", "substring", "forkSession", "label", "newSessionId", "resumeSession", "stopExecution", "pushSystemAssembledMessage", "role", "feedbackText", "loadDiagnostic", "getDiagnostic", "error", "terminateSession", "restartRunner", "newTerminalId", "slice", "setSessionArchived", "updateSessionConfig", "currentDetail", "updatedSession", "__spreadValues", "mode", "permissionPolicy", "reasoningEffort", "model", "isDebugMode", "__spreadProps", "idx", "findIndex", "s", "updated", "setActiveSessionId", "previousId", "clearLiveOutput", "resetTrackingState", "trimmedText", "listKey", "allocateConsoleListKey", "timestamp", "toISOString", "isStatus", "expandableContent", "rawData", "subtype", "parentAgentId", "current", "getMessages", "messages", "currentMessages", "restKeys", "m", "messageKey", "k", "pushOnly", "has", "Shr_ExtMessageChronologicalSort_Util", "sortAsc", "hasMore", "loadOlderAssembledMessages", "minSequence", "reduce", "min", "beforeSequence", "maxSequence", "max", "syntheticMessage", "now", "Math", "random", "toString", "sessionType", "messageRole", "bodyText", "globalThis", "crypto", "randomUUID", "pullEventsSinceLastKnownSequence", "context", "newEvents", "sinceSequence", "currentEvents", "detail", "last", "find", "setInterval", "onSessionEventsPollTick", "clearInterval", "factory", "\u0275fac", "providedIn"]
|
|
7
|
+
}
|