@futdevpro/ccap 1.1.3107 → 1.1.3130
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/cli/build/_commands/update.spec.d.ts +17 -0
- package/cli/build/_commands/update.spec.d.ts.map +1 -0
- package/cli/build/_commands/update.spec.js +147 -0
- package/cli/build/_commands/update.spec.js.map +1 -0
- package/client-dist/{agent-instances.module-X7PTNXBZ.js → agent-instances.module-KE64PSK7.js} +2 -2
- package/client-dist/ca.module-JJZX5YKQ.js +5 -0
- package/client-dist/{ca.module-AHEFH36G.js.map → ca.module-JJZX5YKQ.js.map} +3 -3
- package/client-dist/{cc-usage-dashboard.component-SCGVU2CH.js → cc-usage-dashboard.component-ODAXHZHU.js} +2 -2
- package/client-dist/{cc.module-HRE2USKF.js → cc.module-4MS5M5XW.js} +2 -2
- package/client-dist/{chunk-EXMVCGPU.js → chunk-36BCBGXK.js} +2 -2
- package/client-dist/{chunk-F5YM4CH2.js → chunk-3HLEHUE4.js} +2 -2
- package/client-dist/{chunk-TAHRBJO4.js → chunk-4CLON3UX.js} +2 -2
- package/client-dist/{chunk-EDPWSLEJ.js → chunk-4O4UDIWG.js} +2 -2
- package/client-dist/{chunk-V2FE4UOS.js → chunk-5E5W3DFK.js} +2 -2
- package/client-dist/{chunk-5F7AZMBN.js → chunk-5KQZGU6O.js} +2 -2
- package/client-dist/{chunk-GNGMQVNJ.js → chunk-5XJR5EAR.js} +2 -2
- package/client-dist/chunk-7TYUDNTP.js +9 -0
- package/client-dist/chunk-7TYUDNTP.js.map +7 -0
- package/client-dist/{chunk-H4KPNX6Y.js → chunk-C2ZXKTHA.js} +2 -2
- package/client-dist/{chunk-44B4MFA2.js → chunk-CAUXU2ZC.js} +2 -2
- package/client-dist/{chunk-U5G7I3PM.js → chunk-CBMKN4SJ.js} +2 -2
- package/client-dist/{chunk-V3MC6IHV.js → chunk-CF3BLCVD.js} +2 -2
- package/client-dist/{chunk-BR2OEH55.js → chunk-CIO2T2KX.js} +2 -2
- package/client-dist/{chunk-VVP5QPE2.js → chunk-CUA2OS6E.js} +2 -2
- package/client-dist/{chunk-HVEG7TDX.js → chunk-DB33SOJ3.js} +2 -2
- package/client-dist/{chunk-3MGMSCZJ.js → chunk-EC4VBEIV.js} +2 -2
- package/client-dist/{chunk-VPICQREQ.js → chunk-EFH7L2PM.js} +2 -2
- package/client-dist/{chunk-M7XR4RHP.js → chunk-EG7MEKVY.js} +2 -2
- package/client-dist/{chunk-SNX7UMSC.js → chunk-EGWEYXZW.js} +2 -2
- package/client-dist/{chunk-TMZGSFBR.js → chunk-EVYE6YII.js} +2 -2
- package/client-dist/{chunk-M744VRDZ.js → chunk-FBF7RSNU.js} +2 -2
- package/client-dist/{chunk-I2YW2Q64.js → chunk-FBZDKQ4K.js} +2 -2
- package/client-dist/{chunk-LJ75BUDR.js → chunk-FQL5FQFW.js} +2 -2
- package/client-dist/{chunk-IJNLP24O.js → chunk-GOPRHQFC.js} +2 -2
- package/client-dist/{chunk-SNGOTGBU.js → chunk-HK2TYWE7.js} +2 -2
- package/client-dist/{chunk-6ZYILL36.js → chunk-HSO5WM67.js} +2 -2
- package/client-dist/{chunk-SIEB5UUT.js → chunk-ISPLVKBM.js} +2 -2
- package/client-dist/{chunk-GXH7TFVW.js → chunk-JWXM6QMF.js} +2 -2
- package/client-dist/{chunk-H4QUFYYO.js → chunk-KC7UN4VT.js} +2 -2
- package/client-dist/{chunk-ODUTF4DP.js → chunk-KNTOPF7C.js} +2 -2
- package/client-dist/{chunk-PCZCJ5US.js → chunk-L4CLV44N.js} +2 -2
- package/client-dist/{chunk-AIFKGWGZ.js → chunk-LBG3XMYU.js} +2 -2
- package/client-dist/{chunk-NV7A2WEG.js → chunk-NBH53JWT.js} +2 -2
- package/client-dist/{chunk-725PEGTE.js → chunk-NHKJYR4C.js} +2 -2
- package/client-dist/{chunk-IUYZZJPL.js → chunk-NIMLWXGM.js} +2 -2
- package/client-dist/{chunk-YKD7EBRH.js → chunk-O6KFG5LW.js} +2 -2
- package/client-dist/{chunk-7BGF556S.js → chunk-PR5VADUQ.js} +2 -2
- package/client-dist/{chunk-ADOCMVHI.js → chunk-QHZI4F2F.js} +2 -2
- package/client-dist/{chunk-HBLLM4VT.js → chunk-QNLMNKP4.js} +2 -2
- package/client-dist/{chunk-3VGB3L3K.js → chunk-R2C7U5TP.js} +2 -2
- package/client-dist/{chunk-QMSWKCFN.js → chunk-RLXJG6ZF.js} +2 -2
- package/client-dist/{chunk-276XBODW.js → chunk-RNXGBUU3.js} +7 -7
- package/client-dist/chunk-RNXGBUU3.js.map +7 -0
- package/client-dist/{chunk-SREAQBYG.js → chunk-S5PG5OUU.js} +2 -2
- package/client-dist/{chunk-772D5UCV.js → chunk-SWJLLCFC.js} +2 -2
- package/client-dist/{chunk-N5BAPGOD.js → chunk-TCDXJTTX.js} +2 -2
- package/client-dist/{chunk-HRRC3NLD.js → chunk-U6B7OBXY.js} +2 -2
- package/client-dist/{chunk-UT4EWNR6.js → chunk-URXIWUNP.js} +2 -2
- package/client-dist/{chunk-4Y3YU4VV.js → chunk-UTJQVE4E.js} +2 -2
- package/client-dist/{chunk-DBG24LL5.js → chunk-V6QEYU4X.js} +2 -2
- package/client-dist/{chunk-IJZYOGOA.js → chunk-VL2H6COO.js} +2 -2
- package/client-dist/{chunk-RQ6URMIS.js → chunk-VORYOEWH.js} +2 -2
- package/client-dist/{chunk-P5R6KXHA.js → chunk-VU76JPZM.js} +2 -2
- package/client-dist/{chunk-Q6LBW5ZA.js → chunk-X4IBG3WG.js} +2 -2
- package/client-dist/{chunk-ZWO7VQQ7.js → chunk-XZTQ4YC7.js} +2 -2
- package/client-dist/{chunk-QUNT2WPJ.js → chunk-Y3DARUXQ.js} +2 -2
- package/client-dist/{chunk-QUNT2WPJ.js.map → chunk-Y3DARUXQ.js.map} +1 -1
- package/client-dist/{chunk-2VC36Y3F.js → chunk-ZTB2RW6R.js} +2 -2
- package/client-dist/{consultant.module-VWZJPZLC.js → consultant.module-S4UQA3UJ.js} +2 -2
- package/client-dist/{crd.module-X4AZNBU3.js → crd.module-XHOTNUXY.js} +2 -2
- package/client-dist/{dashboard.module-D6GYQMRW.js → dashboard.module-YZMJUPDH.js} +2 -2
- package/client-dist/{do.module-NDH2JFRB.js → do.module-ESWOBSRO.js} +2 -2
- package/client-dist/{document-library.module-U4UF7O2G.js → document-library.module-S2IATB7C.js} +2 -2
- package/client-dist/{embedding-eval.module-WU52AOFQ.js → embedding-eval.module-OAUL3HRQ.js} +2 -2
- package/client-dist/{embedding-registry.module-HL4BYCBG.js → embedding-registry.module-T4Q57QWS.js} +2 -2
- package/client-dist/{err.module-MKHC7PNL.js → err.module-YM7F2DFM.js} +2 -2
- package/client-dist/{feedback.module-JVEP7FXN.js → feedback.module-4ZLA4O5I.js} +2 -2
- package/client-dist/{host-runtime-mcp.module-TAQMHWZY.js → host-runtime-mcp.module-OIK42CRE.js} +2 -2
- package/client-dist/index.html +1 -1
- package/client-dist/{live-dev-pipeline.module-PA6JFTVM.js → live-dev-pipeline.module-AFWGOCMO.js} +2 -2
- package/client-dist/{logs.module-DDCOUURP.js → logs.module-OSZVMRRI.js} +2 -2
- package/client-dist/{main-F237R7CH.js → main-3KSHNVCW.js} +3 -3
- package/client-dist/{master-control-remote-poc.module-OHIGJKXS.js → master-control-remote-poc.module-T5NK5KD7.js} +2 -2
- package/client-dist/{mobile-app.module-USJXPWGU.js → mobile-app.module-GPFLEVWR.js} +2 -2
- package/client-dist/{model-registry.module-GN625AEU.js → model-registry.module-SKRFHTWQ.js} +2 -2
- package/client-dist/{oc.module-T4NESJ3J.js → oc.module-562ZP6BM.js} +3 -3
- package/client-dist/{oc.module-T4NESJ3J.js.map → oc.module-562ZP6BM.js.map} +3 -3
- package/client-dist/{orc.module-7OMMUAVJ.js → orc.module-SCMVZ535.js} +2 -2
- package/client-dist/{project-management.module-BUQ4WMDF.js → project-management.module-LA7M6MXA.js} +2 -2
- package/client-dist/project-source-routed.module-QQBPIDUK.js +2 -0
- package/client-dist/{scheduler.module-426MNXRU.js → scheduler.module-QNWITVDV.js} +2 -2
- package/client-dist/{session.module-AOUHRRCF.js → session.module-LJNWNXN7.js} +2 -2
- package/client-dist/{set.module-WTQQZANN.js → set.module-FINVUQYD.js} +2 -2
- package/client-dist/{setup.module-BYCCCF4Q.js → setup.module-5FOSEQWI.js} +2 -2
- package/client-dist/{terminals.module-7X5GXSDY.js → terminals.module-LMW6DR3T.js} +2 -2
- package/client-dist/{voice-notes-poc.module-ZZD3NWJE.js → voice-notes-poc.module-R3ECC3V3.js} +2 -2
- package/client-dist/{wfs.module-VFUPP5VV.js → wfs.module-TAZFZ2BH.js} +2 -2
- package/package.json +1 -1
- package/client-dist/ca.module-AHEFH36G.js +0 -5
- package/client-dist/chunk-276XBODW.js.map +0 -7
- package/client-dist/chunk-UEPFY6HU.js +0 -9
- package/client-dist/chunk-UEPFY6HU.js.map +0 -7
- package/client-dist/project-source-routed.module-HBMJJWHZ.js +0 -2
- /package/client-dist/{agent-instances.module-X7PTNXBZ.js.map → agent-instances.module-KE64PSK7.js.map} +0 -0
- /package/client-dist/{cc-usage-dashboard.component-SCGVU2CH.js.map → cc-usage-dashboard.component-ODAXHZHU.js.map} +0 -0
- /package/client-dist/{cc.module-HRE2USKF.js.map → cc.module-4MS5M5XW.js.map} +0 -0
- /package/client-dist/{chunk-EXMVCGPU.js.map → chunk-36BCBGXK.js.map} +0 -0
- /package/client-dist/{chunk-F5YM4CH2.js.map → chunk-3HLEHUE4.js.map} +0 -0
- /package/client-dist/{chunk-TAHRBJO4.js.map → chunk-4CLON3UX.js.map} +0 -0
- /package/client-dist/{chunk-EDPWSLEJ.js.map → chunk-4O4UDIWG.js.map} +0 -0
- /package/client-dist/{chunk-V2FE4UOS.js.map → chunk-5E5W3DFK.js.map} +0 -0
- /package/client-dist/{chunk-5F7AZMBN.js.map → chunk-5KQZGU6O.js.map} +0 -0
- /package/client-dist/{chunk-GNGMQVNJ.js.map → chunk-5XJR5EAR.js.map} +0 -0
- /package/client-dist/{chunk-H4KPNX6Y.js.map → chunk-C2ZXKTHA.js.map} +0 -0
- /package/client-dist/{chunk-44B4MFA2.js.map → chunk-CAUXU2ZC.js.map} +0 -0
- /package/client-dist/{chunk-U5G7I3PM.js.map → chunk-CBMKN4SJ.js.map} +0 -0
- /package/client-dist/{chunk-V3MC6IHV.js.map → chunk-CF3BLCVD.js.map} +0 -0
- /package/client-dist/{chunk-BR2OEH55.js.map → chunk-CIO2T2KX.js.map} +0 -0
- /package/client-dist/{chunk-VVP5QPE2.js.map → chunk-CUA2OS6E.js.map} +0 -0
- /package/client-dist/{chunk-HVEG7TDX.js.map → chunk-DB33SOJ3.js.map} +0 -0
- /package/client-dist/{chunk-3MGMSCZJ.js.map → chunk-EC4VBEIV.js.map} +0 -0
- /package/client-dist/{chunk-VPICQREQ.js.map → chunk-EFH7L2PM.js.map} +0 -0
- /package/client-dist/{chunk-M7XR4RHP.js.map → chunk-EG7MEKVY.js.map} +0 -0
- /package/client-dist/{chunk-SNX7UMSC.js.map → chunk-EGWEYXZW.js.map} +0 -0
- /package/client-dist/{chunk-TMZGSFBR.js.map → chunk-EVYE6YII.js.map} +0 -0
- /package/client-dist/{chunk-M744VRDZ.js.map → chunk-FBF7RSNU.js.map} +0 -0
- /package/client-dist/{chunk-I2YW2Q64.js.map → chunk-FBZDKQ4K.js.map} +0 -0
- /package/client-dist/{chunk-LJ75BUDR.js.map → chunk-FQL5FQFW.js.map} +0 -0
- /package/client-dist/{chunk-IJNLP24O.js.map → chunk-GOPRHQFC.js.map} +0 -0
- /package/client-dist/{chunk-SNGOTGBU.js.map → chunk-HK2TYWE7.js.map} +0 -0
- /package/client-dist/{chunk-6ZYILL36.js.map → chunk-HSO5WM67.js.map} +0 -0
- /package/client-dist/{chunk-SIEB5UUT.js.map → chunk-ISPLVKBM.js.map} +0 -0
- /package/client-dist/{chunk-GXH7TFVW.js.map → chunk-JWXM6QMF.js.map} +0 -0
- /package/client-dist/{chunk-H4QUFYYO.js.map → chunk-KC7UN4VT.js.map} +0 -0
- /package/client-dist/{chunk-ODUTF4DP.js.map → chunk-KNTOPF7C.js.map} +0 -0
- /package/client-dist/{chunk-PCZCJ5US.js.map → chunk-L4CLV44N.js.map} +0 -0
- /package/client-dist/{chunk-AIFKGWGZ.js.map → chunk-LBG3XMYU.js.map} +0 -0
- /package/client-dist/{chunk-NV7A2WEG.js.map → chunk-NBH53JWT.js.map} +0 -0
- /package/client-dist/{chunk-725PEGTE.js.map → chunk-NHKJYR4C.js.map} +0 -0
- /package/client-dist/{chunk-IUYZZJPL.js.map → chunk-NIMLWXGM.js.map} +0 -0
- /package/client-dist/{chunk-YKD7EBRH.js.map → chunk-O6KFG5LW.js.map} +0 -0
- /package/client-dist/{chunk-7BGF556S.js.map → chunk-PR5VADUQ.js.map} +0 -0
- /package/client-dist/{chunk-ADOCMVHI.js.map → chunk-QHZI4F2F.js.map} +0 -0
- /package/client-dist/{chunk-HBLLM4VT.js.map → chunk-QNLMNKP4.js.map} +0 -0
- /package/client-dist/{chunk-3VGB3L3K.js.map → chunk-R2C7U5TP.js.map} +0 -0
- /package/client-dist/{chunk-QMSWKCFN.js.map → chunk-RLXJG6ZF.js.map} +0 -0
- /package/client-dist/{chunk-SREAQBYG.js.map → chunk-S5PG5OUU.js.map} +0 -0
- /package/client-dist/{chunk-772D5UCV.js.map → chunk-SWJLLCFC.js.map} +0 -0
- /package/client-dist/{chunk-N5BAPGOD.js.map → chunk-TCDXJTTX.js.map} +0 -0
- /package/client-dist/{chunk-HRRC3NLD.js.map → chunk-U6B7OBXY.js.map} +0 -0
- /package/client-dist/{chunk-UT4EWNR6.js.map → chunk-URXIWUNP.js.map} +0 -0
- /package/client-dist/{chunk-4Y3YU4VV.js.map → chunk-UTJQVE4E.js.map} +0 -0
- /package/client-dist/{chunk-DBG24LL5.js.map → chunk-V6QEYU4X.js.map} +0 -0
- /package/client-dist/{chunk-IJZYOGOA.js.map → chunk-VL2H6COO.js.map} +0 -0
- /package/client-dist/{chunk-RQ6URMIS.js.map → chunk-VORYOEWH.js.map} +0 -0
- /package/client-dist/{chunk-P5R6KXHA.js.map → chunk-VU76JPZM.js.map} +0 -0
- /package/client-dist/{chunk-Q6LBW5ZA.js.map → chunk-X4IBG3WG.js.map} +0 -0
- /package/client-dist/{chunk-ZWO7VQQ7.js.map → chunk-XZTQ4YC7.js.map} +0 -0
- /package/client-dist/{chunk-2VC36Y3F.js.map → chunk-ZTB2RW6R.js.map} +0 -0
- /package/client-dist/{consultant.module-VWZJPZLC.js.map → consultant.module-S4UQA3UJ.js.map} +0 -0
- /package/client-dist/{crd.module-X4AZNBU3.js.map → crd.module-XHOTNUXY.js.map} +0 -0
- /package/client-dist/{dashboard.module-D6GYQMRW.js.map → dashboard.module-YZMJUPDH.js.map} +0 -0
- /package/client-dist/{do.module-NDH2JFRB.js.map → do.module-ESWOBSRO.js.map} +0 -0
- /package/client-dist/{document-library.module-U4UF7O2G.js.map → document-library.module-S2IATB7C.js.map} +0 -0
- /package/client-dist/{embedding-eval.module-WU52AOFQ.js.map → embedding-eval.module-OAUL3HRQ.js.map} +0 -0
- /package/client-dist/{embedding-registry.module-HL4BYCBG.js.map → embedding-registry.module-T4Q57QWS.js.map} +0 -0
- /package/client-dist/{err.module-MKHC7PNL.js.map → err.module-YM7F2DFM.js.map} +0 -0
- /package/client-dist/{feedback.module-JVEP7FXN.js.map → feedback.module-4ZLA4O5I.js.map} +0 -0
- /package/client-dist/{host-runtime-mcp.module-TAQMHWZY.js.map → host-runtime-mcp.module-OIK42CRE.js.map} +0 -0
- /package/client-dist/{live-dev-pipeline.module-PA6JFTVM.js.map → live-dev-pipeline.module-AFWGOCMO.js.map} +0 -0
- /package/client-dist/{logs.module-DDCOUURP.js.map → logs.module-OSZVMRRI.js.map} +0 -0
- /package/client-dist/{main-F237R7CH.js.map → main-3KSHNVCW.js.map} +0 -0
- /package/client-dist/{master-control-remote-poc.module-OHIGJKXS.js.map → master-control-remote-poc.module-T5NK5KD7.js.map} +0 -0
- /package/client-dist/{mobile-app.module-USJXPWGU.js.map → mobile-app.module-GPFLEVWR.js.map} +0 -0
- /package/client-dist/{model-registry.module-GN625AEU.js.map → model-registry.module-SKRFHTWQ.js.map} +0 -0
- /package/client-dist/{orc.module-7OMMUAVJ.js.map → orc.module-SCMVZ535.js.map} +0 -0
- /package/client-dist/{project-management.module-BUQ4WMDF.js.map → project-management.module-LA7M6MXA.js.map} +0 -0
- /package/client-dist/{project-source-routed.module-HBMJJWHZ.js.map → project-source-routed.module-QQBPIDUK.js.map} +0 -0
- /package/client-dist/{scheduler.module-426MNXRU.js.map → scheduler.module-QNWITVDV.js.map} +0 -0
- /package/client-dist/{session.module-AOUHRRCF.js.map → session.module-LJNWNXN7.js.map} +0 -0
- /package/client-dist/{set.module-WTQQZANN.js.map → set.module-FINVUQYD.js.map} +0 -0
- /package/client-dist/{setup.module-BYCCCF4Q.js.map → setup.module-5FOSEQWI.js.map} +0 -0
- /package/client-dist/{terminals.module-7X5GXSDY.js.map → terminals.module-LMW6DR3T.js.map} +0 -0
- /package/client-dist/{voice-notes-poc.module-ZZD3NWJE.js.map → voice-notes-poc.module-R3ECC3V3.js.map} +0 -0
- /package/client-dist/{wfs.module-VFUPP5VV.js.map → wfs.module-TAZFZ2BH.js.map} +0 -0
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["src/app/_modules/external-sessions/_modules/cursor-acp/_collections/ca-event-chronological-sort.util.ts", "src/app/_modules/external-sessions/_modules/cursor-acp/_collections/utils/console-display/ca-mirror-stream-merge.util.ts", "src/app/_modules/external-sessions/_modules/cursor-acp/_services/cursor-acp.data-service.ts", "src/app/_modules/shared/_collections/utils/shr-unknown-value-pretty-json.util.ts", "src/app/_modules/external-sessions/_modules/cursor-acp/_collections/utils/console-display/ca-mirror-event-brief.util.ts", "src/app/_modules/external-sessions/_modules/cursor-acp/_collections/utils/console-display/ca-tool-call-mirror-parse.util.ts", "src/app/_modules/external-sessions/_modules/cursor-acp/_services/cursor-acp.api-service.ts"],
|
|
4
|
-
"sourcesContent": ["import { CA_EventItem_Interface } from '../_models/interfaces/ca-view.interface';\n\n/**\n * Mirror timeline / konzol — események sorrendje: `sequence` ASC, tie-break `timestamp` (azonos sequence DB hiba / régi adat).\n */\nexport class CA_EventChronologicalSort_Util {\n\n /**\n * Növekvő időrend — user prompt és assistant chunk helyes váltakozása duplikált sequence mellett is.\n */\n static compareMirrorEventsAsc(\n a: CA_EventItem_Interface,\n b: CA_EventItem_Interface,\n ): number {\n const dq: number = (a.sequence ?? 0) - (b.sequence ?? 0);\n if (dq !== 0) {\n return dq;\n }\n const ta: string = typeof a.timestamp === 'string' ? a.timestamp : '';\n const tb: string = typeof b.timestamp === 'string' ? b.timestamp : '';\n const tc: number = ta.localeCompare(tb);\n if (tc !== 0) {\n return tc;\n }\n const ea: string = typeof a.eventType === 'string' ? a.eventType : '';\n const eb: string = typeof b.eventType === 'string' ? b.eventType : '';\n return ea.localeCompare(eb);\n }\n}\n", "import {\n CA_ConsoleStreamTail_Interface,\n CA_EventItem_Interface,\n CA_MirrorStreamChunkParsed_Interface,\n CA_TimelineStreamRow_Interface,\n} from '../../../_models/interfaces/ca-view.interface';\n\n/**\n * ACP stream chunk-ok összefűzése — console buborék és timeline sor SSOT szabályok.\n */\nexport class CA_MirrorStreamMerge_Util {\n\n /**\n * Ugyanazon logikai üzenet chunk-jai: mindkét messageId kitöltve és különböző → külön stream.\n * Ha csak az egyik oldalon van id, az ACP gyakori mintája (későn érkező messageId) — még fűzünk.\n */\n private static messageIdsCompatibleForStreamMerge(\n prevMid: string | undefined,\n nextMid: string | undefined,\n ): boolean {\n const p: string = (prevMid ?? '').trim();\n const n: string = (nextMid ?? '').trim();\n if (p.length > 0 && n.length > 0) {\n return p === n;\n }\n return true;\n }\n\n /**\n * Mirror `data` (sessionId + update) → chunk parse vagy null.\n */\n static parseStreamChunkFromMirrorData(\n data: Record<string, unknown>,\n ): CA_MirrorStreamChunkParsed_Interface | null {\n const upd: unknown = data.update;\n if (upd === null || typeof upd !== 'object' || Array.isArray(upd)) {\n return null;\n }\n const rec: Record<string, unknown> = CA_MirrorStreamMerge_Util.toPlainRecord(upd);\n const kind: unknown = rec.sessionUpdate;\n let role: 'agent' | 'user' | 'thought' | null = null;\n if (kind === 'agent_message_chunk') {\n role = 'agent';\n }\n if (kind === 'user_message_chunk') {\n role = 'user';\n }\n if (kind === 'agent_thought_chunk') {\n role = 'thought';\n }\n if (role === null) {\n return null;\n }\n const content: unknown = rec.content;\n if (content === null || typeof content !== 'object' || Array.isArray(content)) {\n return null;\n }\n const crec: Record<string, unknown> = CA_MirrorStreamMerge_Util.toPlainRecord(content);\n const text: unknown = crec.text;\n if (typeof text !== 'string' || !text.length) {\n return null;\n }\n const midRaw: unknown = rec.messageId;\n const messageId: string | undefined =\n typeof midRaw === 'string' && midRaw.length > 0 ? midRaw : undefined;\n return { role: role, text: text, messageId: messageId };\n }\n\n /**\n * Console stream sor + új chunk — ugyanaz a stream: role egyezik, messageId kompatibilis,\n * sequence szigorúan növekvő (a szerver minden ACP notification-re léptet, közte lehet tool / info).\n */\n static canMergeConsoleTailWithChunk(params: {\n prev: CA_ConsoleStreamTail_Interface;\n ev: CA_EventItem_Interface;\n parsed: CA_MirrorStreamChunkParsed_Interface;\n }): boolean {\n const prev: CA_ConsoleStreamTail_Interface = params.prev;\n if (prev.streamTextRole === undefined || prev.streamTextRole !== params.parsed.role) {\n return false;\n }\n const prevMid: string | undefined = prev.streamMessageId;\n const nextMid: string | undefined = params.parsed.messageId;\n if (!CA_MirrorStreamMerge_Util.messageIdsCompatibleForStreamMerge(prevMid, nextMid)) {\n return false;\n }\n const nSeq: number = params.ev.sequence ?? 0;\n const pSeq: number = prev.streamLastSequence ?? 0;\n if (nSeq <= pSeq) {\n return false;\n }\n return true;\n }\n\n /**\n * Timeline: előző esemény + következő chunk ugyanabból a streamből.\n */\n static canMergeMirrorChunkEvents(\n prevEv: CA_EventItem_Interface,\n nextEv: CA_EventItem_Interface,\n nextParsed: CA_MirrorStreamChunkParsed_Interface,\n ): boolean {\n const prevParsed: CA_MirrorStreamChunkParsed_Interface | null =\n CA_MirrorStreamMerge_Util.parseStreamChunkFromMirrorData(prevEv.data ?? {});\n if (prevParsed === null) {\n return false;\n }\n if (prevParsed.role !== nextParsed.role) {\n return false;\n }\n const prevMid: string | undefined = prevParsed.messageId;\n const nextMid: string | undefined = nextParsed.messageId;\n if (!CA_MirrorStreamMerge_Util.messageIdsCompatibleForStreamMerge(prevMid, nextMid)) {\n return false;\n }\n const pSeq: number = prevEv.sequence ?? 0;\n const nSeq: number = nextEv.sequence ?? 0;\n if (nSeq <= pSeq) {\n return false;\n }\n return true;\n }\n\n /**\n * Növekvő sequence szerinti események → timeline sorok (chunk run összevonva).\n */\n static foldEventsToTimelineRows(\n sortedAsc: CA_EventItem_Interface[],\n ): CA_TimelineStreamRow_Interface[] {\n const rows: CA_TimelineStreamRow_Interface[] = [];\n for (const ev of sortedAsc) {\n const nextParsed: CA_MirrorStreamChunkParsed_Interface | null =\n CA_MirrorStreamMerge_Util.parseStreamChunkFromMirrorData(ev.data ?? {});\n if (nextParsed !== null) {\n const tail: CA_TimelineStreamRow_Interface | undefined =\n rows.length > 0 ? rows[rows.length - 1] : undefined;\n const tailLast: CA_EventItem_Interface | undefined =\n tail !== undefined && tail.events.length > 0 ? tail.events[tail.events.length - 1] : undefined;\n if (\n tail !== undefined\n && tailLast !== undefined\n && CA_MirrorStreamMerge_Util.canMergeMirrorChunkEvents(tailLast, ev, nextParsed)\n ) {\n const nextEvents: CA_EventItem_Interface[] = [...tail.events, ev];\n rows[rows.length - 1] = {\n rowKey: CA_MirrorStreamMerge_Util.mergedTimelineRowKey(nextEvents),\n events: nextEvents,\n };\n } else {\n rows.push({\n rowKey: `evt-${String(ev.sequence ?? 0)}`,\n events: [ev],\n });\n }\n } else {\n rows.push({\n rowKey: `evt-${String(ev.sequence ?? 0)}`,\n events: [ev],\n });\n }\n }\n return rows;\n }\n\n /**\n * Összevont chunk sor stabil track kulcsa.\n */\n static mergedTimelineRowKey(events: CA_EventItem_Interface[]): string {\n if (!events.length) {\n return 'evt-empty';\n }\n const first: number = events[0].sequence ?? 0;\n const last: number = events[events.length - 1].sequence ?? 0;\n return `merged-chunk-${String(first)}-${String(last)}`;\n }\n\n private static toPlainRecord(value: object): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(value)) {\n out[key] = Reflect.get(value, key);\n }\n return out;\n }\n}\n", "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 CA_EventItem_Interface,\n CA_ListItem_Interface,\n CA_MirrorRuntime_Interface,\n} from '../_models/interfaces/ca-view.interface';\nimport { CA_MirrorBrief_Result_Interface } from '../_models/interfaces/ca-mirror-brief-result.interface';\nimport { CCAP_ErrorDisplay_Util } from '../../../../../_collections/error/error-display.util';\nimport { CA_EventChronologicalSort_Util } from '../_collections/ca-event-chronological-sort.util';\nimport { CA_MirrorEventBrief_Util } from '../_collections/utils/console-display/ca-mirror-event-brief.util';\nimport { CA_MirrorStreamMerge_Util } from '../_collections/utils/console-display/ca-mirror-stream-merge.util';\nimport { CA_ToolCallMirrorParse_Util } from '../_collections/utils/console-display/ca-tool-call-mirror-parse.util';\nimport { CA_ToolCallMirrorParseResult_Interface } from '../_models/interfaces/ca-tool-call-mirror-parse-result.interface';\nimport { CursorAcp_ApiService } from './cursor-acp.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 { CaSessionConsoleMessage_Interface } from './ca.data-service.interface';\n\n/**\n * CA session kliens SSOT — mirror lista, részlet, események, socket push.\n */\n@Injectable({ providedIn: 'root' })\nexport class CursorAcp_DataService implements OnDestroy {\n\n readonly sessions_$ = signal<CA_ListItem_Interface[]>([]);\n readonly sessionsLoading_$ = signal<boolean>(false);\n readonly sessionsLoadError_$ = signal<unknown | null>(null);\n\n readonly selectedSession_$ = signal<CA_ListItem_Interface | null>(null);\n readonly selectedSessionLoading_$ = signal<boolean>(false);\n\n readonly selectedSessionEvents_$ = signal<CA_EventItem_Interface[]>([]);\n\n /** Timeline pagination — mirror GET /events `hasMore`. */\n readonly sessionEventsHasMore_$ = signal<boolean>(false);\n\n /** Lista API `mirrorRuntime` — dashboard ACP / loadSession badge. */\n readonly mirrorRuntime_$ = signal<CA_MirrorRuntime_Interface | null>(null);\n\n readonly consoleMessages_$ = signal<CaSessionConsoleMessage_Interface[]>([]);\n\n /** Szerver-oldali assembled messages (SSOT — tool pairing, stream merge szerveren). */\n readonly assembledMessages_$ = signal<CCAP_ExtSessionMessage_Response[]>([]);\n\n readonly lastStatusUpdate_$ = signal<{\n sessionId: string;\n status: string;\n statusMessage?: string;\n } | null>(null);\n\n readonly activeSessionId_$ = signal<string>('');\n\n /** GET session / events hiba — detail panel inline + globális error mellett. */\n readonly sessionDetailError_$ = signal<unknown | null>(null);\n\n private readonly caSession_AS: CursorAcp_ApiService = inject(CursorAcp_ApiService);\n private readonly extSessionMsg_AS: ExS_Message_ApiService =\n inject(ExS_Message_ApiService);\n private readonly globalError_CS: CCAP_GlobalError_ControlService =\n inject(CCAP_GlobalError_ControlService);\n private readonly socket_CS: CCAP_Socket_ControlService = inject(CCAP_Socket_ControlService);\n private readonly ngZone: NgZone = inject(NgZone);\n\n private eventSubscription: Subscription | null = null;\n private reconnectSubscription: Subscription | null = null;\n private lastKnownEventSequence: number = -1;\n\n private openSessionPollTimer: ReturnType<typeof setInterval> | null = null;\n\n private openSessionPollTargetId: string = '';\n\n /**\n * Optimista prompt buborék `listKey` + nyers szöveg — mirror `prompt-sent` érkezésekor egy buborék marad.\n */\n private readonly pendingOptimisticPrompts: { listKey: string; text: string }[] = [];\n\n /** Következő GET /events `sinceSequence` (exclusive) — utolsó betöltött sor `sequence`. */\n private sessionEventsNextSince: number | null = null;\n\n constructor() {\n this.eventSubscription = this.socket_CS.event$.subscribe(\n (envelope: { event: string; payload: Record<string, unknown> }): void => {\n this.handleSocketEvent(envelope);\n },\n );\n this.reconnectSubscription = this.socket_CS.connected$.subscribe(\n (isConnected: boolean): void => {\n if (isConnected) {\n const activeId: string = this.activeSessionId_$();\n if (activeId) {\n this.socket_CS.emit('ca-session:subscribe', { sessionId: activeId });\n // Assembled messages újratöltése — a disconnect alatt érkezett socket push-ok\n // (ext-session-msg:message/update) elvesztek; a REST reload pótolja őket.\n this.loadAssembledMessages({ sessionId: activeId }).catch((): void => {});\n }\n }\n },\n );\n }\n\n ngOnDestroy(): void {\n this.stopOpenSessionPolling();\n this.eventSubscription?.unsubscribe();\n this.reconnectSubscription?.unsubscribe();\n }\n\n /**\n * Mirror lista betöltése.\n */\n async loadSessions(params?: { includeArchived?: boolean }): Promise<void> {\n this.sessionsLoading_$.set(true);\n this.sessionsLoadError_$.set(null);\n try {\n const res = await this.caSession_AS.listSessions({\n includeArchived: params?.includeArchived,\n });\n const rawUnknown: unknown = res.sessions;\n const rawList: unknown[] = Array.isArray(rawUnknown) ? rawUnknown : [];\n const mapped: CA_ListItem_Interface[] = rawList.map(\n (s: unknown): CA_ListItem_Interface =>\n this.mapSessionRecord(this.toRecord(s)),\n );\n this.sessions_$.set(mapped);\n const rtUnknown: unknown = res.mirrorRuntime;\n const rtRec: Record<string, unknown> = this.toRecord(rtUnknown);\n const ic: unknown = rtRec.isAcpConnected;\n const ls: unknown = rtRec.loadSessionSupported;\n const tm: unknown = rtRec.isTerminalMode;\n const trc: unknown = rtRec.isTerminalRunnerConnected;\n if (typeof ic === 'boolean' && typeof ls === 'boolean') {\n this.mirrorRuntime_$.set({\n isAcpConnected: ic,\n loadSessionSupported: ls,\n isTerminalMode: tm === true,\n isTerminalRunnerConnected: trc === true,\n });\n } else {\n this.mirrorRuntime_$.set(null);\n }\n } catch (err: unknown) {\n this.sessionsLoadError_$.set(err);\n this.globalError_CS.showError(err, 'ca-session-list');\n } finally {\n this.sessionsLoading_$.set(false);\n }\n }\n\n /**\n * Agent session/list → mirror.\n */\n async syncFromAgent(params?: { cwd?: string }): Promise<void> {\n try {\n await this.caSession_AS.syncFromAgent({ cwd: params?.cwd });\n await this.loadSessions();\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'ca-session-sync');\n throw err;\n }\n }\n\n /**\n * Részlet + események. `false` = hiba (`sessionDetailError_$` + globális error); nem dob, hogy ne duplázzunk hydrate catch-ben.\n */\n async loadSessionDetail(params: { sessionId: string }): Promise<boolean> {\n this.sessionDetailError_$.set(null);\n this.selectedSessionLoading_$.set(true);\n try {\n const res = await this.caSession_AS.getSession(params.sessionId);\n const row: Record<string, unknown> = res.session;\n this.selectedSession_$.set(this.mapSessionRecord(row));\n this.sessionEventsNextSince = null;\n this.sessionEventsHasMore_$.set(false);\n const ev = await this.caSession_AS.getSessionEvents({\n sessionId: params.sessionId,\n limit: 200,\n });\n const mapped: CA_EventItem_Interface[] = ev.events.map(\n (e: Record<string, unknown>): CA_EventItem_Interface => ({\n sessionId: typeof e.sessionId === 'string' ? e.sessionId : params.sessionId,\n eventType: typeof e.eventType === 'string' ? e.eventType : '',\n timestamp: typeof e.timestamp === 'string' ? e.timestamp : '',\n data: this.asRecord(e.data),\n sequence: typeof e.sequence === 'number' ? e.sequence : 0,\n }),\n );\n this.selectedSessionEvents_$.set(mapped);\n this.sessionEventsHasMore_$.set(ev.hasMore === true);\n const ns: unknown = ev.nextSinceSequence;\n this.sessionEventsNextSince = typeof ns === 'number' ? ns : null;\n this.lastKnownEventSequence = Math.max(\n -1,\n ...this.selectedSessionEvents_$().map((x: CA_EventItem_Interface): number =>\n x.sequence ?? 0),\n );\n this.seedConsoleFromMirrorEvents(mapped);\n\n // Assembled messages betöltése (SSOT — fire-and-forget, nem blokkolja a detail load-ot)\n this.loadAssembledMessages({ sessionId: params.sessionId }).catch((): void => {});\n\n return true;\n } catch (err: unknown) {\n this.sessionDetailError_$.set(err);\n this.selectedSession_$.set(null);\n this.selectedSessionEvents_$.set([]);\n this.globalError_CS.showError(err, 'ca-session-detail');\n return false;\n } finally {\n this.selectedSessionLoading_$.set(false);\n }\n }\n\n /**\n * Mirror timeline következő oldal — `sinceSequence` lánc.\n */\n async loadMoreSessionEvents(params: { sessionId: string }): Promise<void> {\n const since: number | null = this.sessionEventsNextSince;\n if (since == null) {\n return;\n }\n try {\n const ev = await this.caSession_AS.getSessionEvents({\n sessionId: params.sessionId,\n sinceSequence: since,\n limit: 200,\n });\n const mapped: CA_EventItem_Interface[] = ev.events.map(\n (e: Record<string, unknown>): CA_EventItem_Interface => ({\n sessionId: typeof e.sessionId === 'string' ? e.sessionId : params.sessionId,\n eventType: typeof e.eventType === 'string' ? e.eventType : '',\n timestamp: typeof e.timestamp === 'string' ? e.timestamp : '',\n data: this.asRecord(e.data),\n sequence: typeof e.sequence === 'number' ? e.sequence : 0,\n }),\n );\n const merged: CA_EventItem_Interface[] = [\n ...this.selectedSessionEvents_$(),\n ...mapped,\n ];\n merged.sort(CA_EventChronologicalSort_Util.compareMirrorEventsAsc);\n this.selectedSessionEvents_$.set(merged);\n this.sessionEventsHasMore_$.set(ev.hasMore === true);\n const ns: unknown = ev.nextSinceSequence;\n this.sessionEventsNextSince = typeof ns === 'number' ? ns : null;\n this.lastKnownEventSequence = Math.max(\n this.lastKnownEventSequence,\n ...mapped.map((x: CA_EventItem_Interface): number => x.sequence ?? 0),\n );\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'ca-session-events-page');\n }\n }\n\n /**\n * ACP session/load → mirror hydrate (explicit gomb / tool).\n */\n async hydrateFromAgent(params: { sessionId: string; force?: boolean }): Promise<void> {\n try {\n await this.caSession_AS.hydrateSession({\n sessionId: params.sessionId,\n force: params.force,\n });\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'ca-session-hydrate');\n throw err;\n }\n const detailOk: boolean = await this.loadSessionDetail({ sessionId: params.sessionId });\n if (!detailOk) {\n const err: unknown = this.sessionDetailError_$();\n throw err instanceof Error ? err : new Error('CA session detail reload after hydrate failed');\n }\n }\n\n /**\n * Aktív session + socket subscribe.\n */\n setActiveSessionId(sessionId: string): void {\n const previousId: string = this.activeSessionId_$();\n if (previousId && previousId !== sessionId) {\n this.socket_CS.emit('ca-session:unsubscribe', { sessionId: previousId });\n }\n this.activeSessionId_$.set(sessionId);\n if (sessionId) {\n this.socket_CS.emit('ca-session:subscribe', { sessionId: sessionId });\n }\n }\n\n clearLiveOutput(): void {\n this.consoleMessages_$.set([]);\n this.lastKnownEventSequence = -1;\n this.pendingOptimisticPrompts.length = 0;\n }\n\n async createSession(params: {\n workspacePath: string;\n label?: string;\n }): Promise<string> {\n try {\n const res: { session: Record<string, unknown> } = await this.caSession_AS.createSession({\n workspacePath: params.workspacePath,\n label: params.label,\n });\n const row: Record<string, unknown> = this.toRecord(res.session);\n const newIdRaw: unknown = row.sessionId;\n const newId: string = typeof newIdRaw === 'string' ? newIdRaw : '';\n await this.loadSessions();\n return newId;\n } catch (err: unknown) {\n // HTTP hibát az error interceptor már showError + report; itt csak továbbdobjuk —\n // a CA dashboard modalban inline app-ccap-error-display (globális bubble a modal mögé kerülhet).\n throw err;\n }\n }\n\n async sendPrompt(params: { sessionId: string; content: string }): Promise<void> {\n const optimisticListKey: string = `optimistic-prompt-${globalThis.crypto.randomUUID()}`;\n this.pendingOptimisticPrompts.push({ listKey: optimisticListKey, text: params.content });\n this.pushConsoleMessage({\n listKey: optimisticListKey,\n type: 'prompt',\n text: params.content,\n });\n try {\n await this.caSession_AS.sendPrompt(params);\n } catch (err: unknown) {\n const pendingIdx: number = this.pendingOptimisticPrompts.findIndex(\n (p: { listKey: string; text: string }): boolean => p.listKey === optimisticListKey,\n );\n if (pendingIdx >= 0) {\n this.pendingOptimisticPrompts.splice(pendingIdx, 1);\n }\n this.pushConsoleMessage({\n type: 'error',\n text: CCAP_ErrorDisplay_Util.getErrorMessageForDisplay(err),\n });\n this.globalError_CS.showError(err, 'ca-session-prompt');\n throw err;\n }\n }\n\n /**\n * Futó execution leállítása (session megmarad, újra promptolható).\n */\n async stopExecution(sessionId: string): Promise<void> {\n try {\n await this.caSession_AS.stopExecution(sessionId);\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'ca-session-stop-execution');\n throw err;\n }\n }\n\n async terminateSession(sessionId: string): Promise<void> {\n try {\n await this.caSession_AS.terminateSession(sessionId);\n await this.loadSessions();\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'ca-session-terminate');\n throw err;\n }\n }\n\n async setSessionArchived(params: { sessionId: string; isArchived: boolean }): Promise<void> {\n try {\n const res: { success: boolean; session: Record<string, unknown> | null } =\n await this.caSession_AS.setSessionArchived(params);\n await this.loadSessions();\n const sel: CA_ListItem_Interface | null = this.selectedSession_$();\n if (\n sel?.sessionId === params.sessionId\n && res.session !== null\n && typeof res.session === 'object'\n ) {\n this.selectedSession_$.set(this.mapSessionRecord(this.toRecord(res.session)));\n }\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'ca-session-archive');\n throw err;\n }\n }\n\n /**\n * Nyitott session REST poll — socket kiesés ellen; detail lifecycle indítja / állítja.\n */\n startOpenSessionPolling(sessionId: string): void {\n this.stopOpenSessionPolling();\n if (!sessionId) {\n return;\n }\n this.openSessionPollTargetId = sessionId;\n const intervalMs: number = 10 * second;\n this.openSessionPollTimer = globalThis.setInterval((): void => {\n void this.runOpenSessionPollTick(sessionId);\n }, intervalMs);\n }\n\n /**\n * Poll timer leállítása (navigáció / destroy).\n */\n stopOpenSessionPolling(): void {\n if (this.openSessionPollTimer !== null) {\n globalThis.clearInterval(this.openSessionPollTimer);\n this.openSessionPollTimer = null;\n }\n this.openSessionPollTargetId = '';\n }\n\n pushConsoleMessage(params: {\n listKey?: string;\n type: CaSessionConsoleMessage_Interface['type'];\n text: string;\n timestamp?: string;\n rawData?: Record<string, unknown>;\n mirrorEventType?: string;\n briefSubtype?: string;\n useRawBubbleKind?: boolean;\n streamTextRole?: 'agent' | 'user' | 'thought';\n streamLastSequence?: number;\n streamMessageId?: string;\n streamPartData?: Record<string, unknown>[];\n toolDisplayName?: string;\n isToolCallFailedIndicator?: boolean;\n }): void {\n const message: CaSessionConsoleMessage_Interface = this.materializeConsoleLineFromPushParams({\n listKey: params.listKey,\n type: params.type,\n text: params.text,\n timestamp: params.timestamp ?? new Date().toISOString(),\n rawData: params.rawData,\n mirrorEventType: params.mirrorEventType,\n briefSubtype: params.briefSubtype,\n useRawBubbleKind: params.useRawBubbleKind,\n streamTextRole: params.streamTextRole,\n streamLastSequence: params.streamLastSequence,\n streamMessageId: params.streamMessageId,\n streamPartData: params.streamPartData,\n toolDisplayName: params.toolDisplayName,\n isToolCallFailedIndicator: params.isToolCallFailedIndicator,\n });\n const current: CaSessionConsoleMessage_Interface[] = this.consoleMessages_$();\n this.consoleMessages_$.set([...current, message]);\n }\n\n /**\n * Egy mirror esemény → konzol append (poll / inkrementális sync).\n */\n private appendConsoleMirrorEventOne(ev: CA_EventItem_Interface): void {\n if (ev.eventType === 'ca-session-update') {\n const toolParsed: CA_ToolCallMirrorParseResult_Interface | null =\n CA_ToolCallMirrorParse_Util.tryParseMirrorData(ev.data ?? {});\n if (toolParsed !== null) {\n const consumed: boolean = this.applyToolCallMirrorEventToLiveConsole({\n ev: ev,\n parsed: toolParsed,\n });\n if (consumed) {\n return;\n }\n }\n }\n\n const brief = CA_MirrorEventBrief_Util.buildFromMirrorEvent(ev);\n if (brief === null) {\n return;\n }\n if (ev.eventType === 'prompt-sent' && brief.consoleType === 'prompt') {\n this.removePendingOptimisticPromptBubbleIfTextMatchesMirror(brief.bodyText);\n }\n const alreadyHasLine: boolean = this.consoleMessages_$().some(\n (m: CaSessionConsoleMessage_Interface): boolean => m.listKey === brief.listKey,\n );\n if (alreadyHasLine) {\n return;\n }\n if (brief.isStreamingTextChunk === true) {\n const merged: boolean = this.tryMergeStreamingMirrorChunkIntoConsole({ ev: ev, brief: brief });\n if (merged) {\n return;\n }\n }\n const ts: string =\n typeof ev.timestamp === 'string' && ev.timestamp.length ? ev.timestamp : new Date().toISOString();\n this.pushConsoleMessage(this.buildConsolePushParamsFromBrief({ ev: ev, brief: brief, timestampIso: ts }));\n }\n\n /**\n * Utolsó stream-buborék szövegének bővítése — poll / mirror append.\n */\n private tryMergeStreamingMirrorChunkIntoConsole(params: {\n ev: CA_EventItem_Interface;\n brief: CA_MirrorBrief_Result_Interface;\n }): boolean {\n const current: CaSessionConsoleMessage_Interface[] = this.consoleMessages_$();\n if (current.length === 0) {\n return false;\n }\n const prev: CaSessionConsoleMessage_Interface = current[current.length - 1];\n const parsed = CA_MirrorStreamMerge_Util.parseStreamChunkFromMirrorData(params.ev.data ?? {});\n if (parsed === null) {\n return false;\n }\n if (\n !CA_MirrorStreamMerge_Util.canMergeConsoleTailWithChunk({\n prev: prev,\n ev: params.ev,\n parsed: parsed,\n })\n ) {\n return false;\n }\n const parts: Record<string, unknown>[] =\n prev.streamPartData !== undefined ? [...prev.streamPartData] : [];\n parts.push(params.ev.data ?? {});\n const nextMsgId: string | undefined = params.brief.streamMessageId;\n const mergedMsgId: string | undefined =\n nextMsgId !== undefined && nextMsgId.trim().length > 0\n ? nextMsgId.trim()\n : prev.streamMessageId;\n const updated: CaSessionConsoleMessage_Interface = {\n ...prev,\n text: prev.text + params.brief.bodyText,\n streamLastSequence: params.ev.sequence ?? prev.streamLastSequence,\n streamMessageId: mergedMsgId,\n streamPartData: parts,\n rawData: {\n streamMerged: true,\n partCount: parts.length,\n lastChunkSequence: params.ev.sequence,\n chunkSnapshots: parts,\n },\n };\n const next: CaSessionConsoleMessage_Interface[] = [...current];\n next[next.length - 1] = updated;\n this.consoleMessages_$.set(next);\n return true;\n }\n\n /**\n * Mirror brief → `pushConsoleMessage` paraméterek + stream meta.\n */\n private buildConsolePushParamsFromBrief(params: {\n ev: CA_EventItem_Interface;\n brief: CA_MirrorBrief_Result_Interface;\n timestampIso: string;\n }): {\n listKey: string;\n type: CaSessionConsoleMessage_Interface['type'];\n text: string;\n timestamp: string;\n rawData?: Record<string, unknown>;\n mirrorEventType?: string;\n briefSubtype?: string;\n useRawBubbleKind?: boolean;\n streamTextRole?: 'agent' | 'user' | 'thought';\n streamLastSequence?: number;\n streamMessageId?: string;\n streamPartData?: Record<string, unknown>[];\n } {\n const b: CA_MirrorBrief_Result_Interface = params.brief;\n if (b.isStreamingTextChunk === true) {\n return {\n listKey: b.listKey,\n type: b.consoleType,\n text: b.bodyText,\n timestamp: params.timestampIso,\n rawData: b.rawData,\n mirrorEventType: b.mirrorEventType,\n briefSubtype: b.briefSubtype,\n useRawBubbleKind: b.useRawBubbleKind,\n streamTextRole: b.streamTextRole,\n streamLastSequence: params.ev.sequence,\n streamMessageId: b.streamMessageId,\n streamPartData: [params.ev.data ?? {}],\n };\n }\n return {\n listKey: b.listKey,\n type: b.consoleType,\n text: b.bodyText,\n timestamp: params.timestampIso,\n rawData: b.rawData,\n mirrorEventType: b.mirrorEventType,\n briefSubtype: b.briefSubtype,\n useRawBubbleKind: b.useRawBubbleKind,\n };\n }\n\n /**\n * Mirror eseménylista (növekvő sequence) → összehajtott console sorok (stream chunk merge).\n */\n private buildFoldedConsoleMessagesFromMirrorEvents(\n sortedAsc: CA_EventItem_Interface[],\n ): CaSessionConsoleMessage_Interface[] {\n const out: CaSessionConsoleMessage_Interface[] = [];\n for (const ev of sortedAsc) {\n const foldedTool: boolean = this.tryFoldToolCallMirrorEventIntoOut(out, ev);\n if (foldedTool) {\n continue;\n }\n const brief: CA_MirrorBrief_Result_Interface | null =\n CA_MirrorEventBrief_Util.buildFromMirrorEvent(ev);\n if (brief === null) {\n continue;\n }\n const ts: string =\n typeof ev.timestamp === 'string' && ev.timestamp.length ? ev.timestamp : new Date().toISOString();\n if (brief.isStreamingTextChunk === true) {\n const parsed = CA_MirrorStreamMerge_Util.parseStreamChunkFromMirrorData(ev.data ?? {});\n if (parsed === null) {\n continue;\n }\n const last: CaSessionConsoleMessage_Interface | undefined =\n out.length > 0 ? out[out.length - 1] : undefined;\n if (\n last !== undefined\n && CA_MirrorStreamMerge_Util.canMergeConsoleTailWithChunk({\n prev: last,\n ev: ev,\n parsed: parsed,\n })\n ) {\n const parts: Record<string, unknown>[] =\n last.streamPartData !== undefined ? [...last.streamPartData] : [];\n parts.push(ev.data ?? {});\n const nextMsgId: string | undefined = brief.streamMessageId;\n const mergedMsgId: string | undefined =\n nextMsgId !== undefined && nextMsgId.trim().length > 0\n ? nextMsgId.trim()\n : last.streamMessageId;\n out[out.length - 1] = {\n ...last,\n text: last.text + brief.bodyText,\n streamLastSequence: ev.sequence ?? last.streamLastSequence,\n streamMessageId: mergedMsgId,\n streamPartData: parts,\n rawData: {\n streamMerged: true,\n partCount: parts.length,\n lastChunkSequence: ev.sequence,\n chunkSnapshots: parts,\n },\n };\n } else {\n out.push(\n this.materializeConsoleLineFromPushParams(\n this.buildConsolePushParamsFromBrief({ ev: ev, brief: brief, timestampIso: ts }),\n ),\n );\n }\n } else {\n out.push(\n this.materializeConsoleLineFromPushParams(\n this.buildConsolePushParamsFromBrief({ ev: ev, brief: brief, timestampIso: ts }),\n ),\n );\n }\n }\n return out;\n }\n\n /**\n * `pushConsoleMessage` paraméterek → stabil `CaSessionConsoleMessage_Interface` (listKey fallback).\n */\n private materializeConsoleLineFromPushParams(params: {\n listKey?: string;\n type: CaSessionConsoleMessage_Interface['type'];\n text: string;\n timestamp: string;\n rawData?: Record<string, unknown>;\n mirrorEventType?: string;\n briefSubtype?: string;\n useRawBubbleKind?: boolean;\n streamTextRole?: 'agent' | 'user' | 'thought';\n streamLastSequence?: number;\n streamMessageId?: string;\n streamPartData?: Record<string, unknown>[];\n toolDisplayName?: string;\n isToolCallFailedIndicator?: boolean;\n }): CaSessionConsoleMessage_Interface {\n return {\n listKey: params.listKey ?? globalThis.crypto.randomUUID(),\n type: params.type,\n text: params.text,\n timestamp: params.timestamp,\n rawData: params.rawData,\n mirrorEventType: params.mirrorEventType,\n briefSubtype: params.briefSubtype,\n useRawBubbleKind: params.useRawBubbleKind,\n streamTextRole: params.streamTextRole,\n streamLastSequence: params.streamLastSequence,\n streamMessageId: params.streamMessageId,\n streamPartData: params.streamPartData,\n toolDisplayName: params.toolDisplayName,\n isToolCallFailedIndicator: params.isToolCallFailedIndicator,\n };\n }\n\n /**\n * ACP tool_call / tool_call_update → élő `consoleMessages_$` (dedup, progress sor replace, error patch).\n * @returns true ha nem fut le utána a generic mirror brief ugyanerre az eseményre.\n */\n private applyToolCallMirrorEventToLiveConsole(params: {\n ev: CA_EventItem_Interface;\n parsed: CA_ToolCallMirrorParseResult_Interface;\n }): boolean {\n const p: CA_ToolCallMirrorParseResult_Interface = params.parsed;\n const id: string = p.toolCallId;\n const ts: string =\n typeof params.ev.timestamp === 'string' && params.ev.timestamp.length\n ? params.ev.timestamp\n : new Date().toISOString();\n const dataPayload: Record<string, unknown> = params.ev.data ?? {};\n\n if (p.sessionUpdate === 'tool_call') {\n const startKey: string = CA_ToolCallMirrorParse_Util.listKeyStart(id);\n const exists: boolean = this.consoleMessages_$().some(\n (m: CaSessionConsoleMessage_Interface): boolean => m.listKey === startKey,\n );\n if (exists) {\n return true;\n }\n const display: string = CursorAcp_DataService.toolCallDisplayName(p);\n const bodyText: string = CursorAcp_DataService.buildToolCallBodyText({\n displayName: display,\n parsed: p,\n });\n this.pushConsoleMessage({\n listKey: startKey,\n type: 'tool',\n text: bodyText,\n timestamp: ts,\n rawData: dataPayload,\n mirrorEventType: 'ca-session-update',\n briefSubtype: 'tool_call',\n toolDisplayName: display,\n });\n return true;\n }\n\n if (p.sessionUpdate === 'tool_call_update' && p.status === 'in_progress') {\n // Ha az update rawInput-ot hoz, patch-eljük a start bubble bodyText-jét.\n if (p.rawInput !== undefined) {\n this.patchLiveToolCallStartInput({ toolCallId: id, parsed: p });\n }\n const progressKey: string = CA_ToolCallMirrorParse_Util.listKeyProgress(id);\n const line: string = 'in_progress';\n const current: CaSessionConsoleMessage_Interface[] = this.consoleMessages_$();\n const idx: number = current.findIndex(\n (m: CaSessionConsoleMessage_Interface): boolean => m.listKey === progressKey,\n );\n const nextLine: CaSessionConsoleMessage_Interface = this.materializeConsoleLineFromPushParams({\n listKey: progressKey,\n type: 'status-update',\n text: line,\n timestamp: ts,\n rawData: dataPayload,\n mirrorEventType: 'ca-session-update',\n briefSubtype: 'tool_call_update',\n });\n if (idx >= 0) {\n const next: CaSessionConsoleMessage_Interface[] = [...current];\n next[idx] = nextLine;\n this.consoleMessages_$.set(next);\n } else {\n this.consoleMessages_$.set([...current, nextLine]);\n }\n return true;\n }\n\n if (p.sessionUpdate === 'tool_call_update' && p.status === 'completed') {\n const hasErr: boolean = CA_ToolCallMirrorParse_Util.hasRawOutputError(p.rawOutput);\n if (hasErr) {\n const errKey: string = CA_ToolCallMirrorParse_Util.listKeyError(id);\n const dupErr: boolean = this.consoleMessages_$().some(\n (m: CaSessionConsoleMessage_Interface): boolean => m.listKey === errKey,\n );\n if (!dupErr) {\n const errText: string = CA_ToolCallMirrorParse_Util.summarizeRawOutputError(\n p.rawOutput,\n );\n this.pushConsoleMessage({\n listKey: errKey,\n type: 'error',\n text: errText,\n timestamp: ts,\n rawData: dataPayload,\n mirrorEventType: 'ca-session-update',\n briefSubtype: 'tool_call_update',\n });\n this.patchLiveConsoleToolCallStartFailed({ toolCallId: id });\n }\n return true;\n }\n const resKey: string = CA_ToolCallMirrorParse_Util.listKeyResult(id);\n const dupRes: boolean = this.consoleMessages_$().some(\n (m: CaSessionConsoleMessage_Interface): boolean => m.listKey === resKey,\n );\n if (!dupRes) {\n const summary: string = CA_ToolCallMirrorParse_Util.summarizeRawOutputSuccess(\n p.rawOutput,\n );\n this.pushConsoleMessage({\n listKey: resKey,\n type: 'tool-result',\n text: summary,\n timestamp: ts,\n rawData: dataPayload,\n mirrorEventType: 'ca-session-update',\n briefSubtype: 'tool_call_update',\n });\n }\n return true;\n }\n\n return false;\n }\n\n /**\n * Historikus mirror lista fold — tool lifecycle sorok beillesztése / frissítése az `out` tömbbe.\n */\n private tryFoldToolCallMirrorEventIntoOut(\n out: CaSessionConsoleMessage_Interface[],\n ev: CA_EventItem_Interface,\n ): boolean {\n if (ev.eventType !== 'ca-session-update') {\n return false;\n }\n const p: CA_ToolCallMirrorParseResult_Interface | null =\n CA_ToolCallMirrorParse_Util.tryParseMirrorData(ev.data ?? {});\n if (p === null) {\n return false;\n }\n const ts: string =\n typeof ev.timestamp === 'string' && ev.timestamp.length ? ev.timestamp : new Date().toISOString();\n const dataPayload: Record<string, unknown> = ev.data ?? {};\n\n if (p.sessionUpdate === 'tool_call') {\n const startKey: string = CA_ToolCallMirrorParse_Util.listKeyStart(p.toolCallId);\n const exists: boolean = out.some(\n (m: CaSessionConsoleMessage_Interface): boolean => m.listKey === startKey,\n );\n if (!exists) {\n const display: string = CursorAcp_DataService.toolCallDisplayName(p);\n const bodyText: string = CursorAcp_DataService.buildToolCallBodyText({\n displayName: display,\n parsed: p,\n });\n out.push(\n this.materializeConsoleLineFromPushParams({\n listKey: startKey,\n type: 'tool',\n text: bodyText,\n timestamp: ts,\n rawData: dataPayload,\n mirrorEventType: 'ca-session-update',\n briefSubtype: 'tool_call',\n toolDisplayName: display,\n }),\n );\n }\n return true;\n }\n\n if (p.sessionUpdate === 'tool_call_update' && p.status === 'in_progress') {\n // Ha rawInput jön az update-ben, patch-eljük a start buborék bodyText-jét.\n if (p.rawInput !== undefined) {\n CursorAcp_DataService.patchOutArrayToolCallStartInput(out, p);\n }\n const progressKey: string = CA_ToolCallMirrorParse_Util.listKeyProgress(p.toolCallId);\n const nextLine: CaSessionConsoleMessage_Interface = this.materializeConsoleLineFromPushParams({\n listKey: progressKey,\n type: 'status-update',\n text: 'in_progress',\n timestamp: ts,\n rawData: dataPayload,\n mirrorEventType: 'ca-session-update',\n briefSubtype: 'tool_call_update',\n });\n const idx: number = out.findIndex(\n (m: CaSessionConsoleMessage_Interface): boolean => m.listKey === progressKey,\n );\n if (idx >= 0) {\n out[idx] = nextLine;\n } else {\n out.push(nextLine);\n }\n return true;\n }\n\n if (p.sessionUpdate === 'tool_call_update' && p.status === 'completed') {\n const hasErr: boolean = CA_ToolCallMirrorParse_Util.hasRawOutputError(p.rawOutput);\n if (hasErr) {\n const errKey: string = CA_ToolCallMirrorParse_Util.listKeyError(p.toolCallId);\n const dupErr: boolean = out.some(\n (m: CaSessionConsoleMessage_Interface): boolean => m.listKey === errKey,\n );\n if (!dupErr) {\n const errText: string = CA_ToolCallMirrorParse_Util.summarizeRawOutputError(\n p.rawOutput,\n );\n out.push(\n this.materializeConsoleLineFromPushParams({\n listKey: errKey,\n type: 'error',\n text: errText,\n timestamp: ts,\n rawData: dataPayload,\n mirrorEventType: 'ca-session-update',\n briefSubtype: 'tool_call_update',\n }),\n );\n CursorAcp_DataService.patchOutArrayToolCallStartFailed(out, p.toolCallId);\n }\n return true;\n }\n const resKey: string = CA_ToolCallMirrorParse_Util.listKeyResult(p.toolCallId);\n const dupRes: boolean = out.some(\n (m: CaSessionConsoleMessage_Interface): boolean => m.listKey === resKey,\n );\n if (!dupRes) {\n const summary: string = CA_ToolCallMirrorParse_Util.summarizeRawOutputSuccess(\n p.rawOutput,\n );\n out.push(\n this.materializeConsoleLineFromPushParams({\n listKey: resKey,\n type: 'tool-result',\n text: summary,\n timestamp: ts,\n rawData: dataPayload,\n mirrorEventType: 'ca-session-update',\n briefSubtype: 'tool_call_update',\n }),\n );\n }\n return true;\n }\n\n return false;\n }\n\n /**\n * In_progress update rawInput-ot hozott — frissítjük a start buborék bodyText-jét.\n * Ha a start bubble-nek eddig nem volt input, most megkapja.\n */\n private patchLiveToolCallStartInput(params: {\n toolCallId: string;\n parsed: CA_ToolCallMirrorParseResult_Interface;\n }): void {\n const startKey: string = CA_ToolCallMirrorParse_Util.listKeyStart(params.toolCallId);\n const cur: CaSessionConsoleMessage_Interface[] = this.consoleMessages_$();\n const idx: number = cur.findIndex(\n (m: CaSessionConsoleMessage_Interface): boolean => m.listKey === startKey,\n );\n if (idx < 0) {\n return;\n }\n const display: string = cur[idx].toolDisplayName ?? 'Tool call';\n const bodyText: string = CursorAcp_DataService.buildToolCallBodyText({\n displayName: display,\n parsed: params.parsed,\n });\n const next: CaSessionConsoleMessage_Interface[] = [...cur];\n next[idx] = {\n ...next[idx],\n text: bodyText,\n };\n this.consoleMessages_$.set(next);\n }\n\n /** Completed error után a megfelelő start sor `isToolCallFailedIndicator` beállítása. */\n private patchLiveConsoleToolCallStartFailed(params: { toolCallId: string }): void {\n const startKey: string = CA_ToolCallMirrorParse_Util.listKeyStart(params.toolCallId);\n const cur: CaSessionConsoleMessage_Interface[] = this.consoleMessages_$();\n const idx: number = cur.findIndex(\n (m: CaSessionConsoleMessage_Interface): boolean => m.listKey === startKey,\n );\n if (idx < 0) {\n return;\n }\n const next: CaSessionConsoleMessage_Interface[] = [...cur];\n next[idx] = {\n ...next[idx],\n isToolCallFailedIndicator: true,\n };\n this.consoleMessages_$.set(next);\n }\n\n /** Fold tömbben start sor failed flag — replay error path. */\n private static patchOutArrayToolCallStartFailed(\n out: CaSessionConsoleMessage_Interface[],\n toolCallId: string,\n ): void {\n const startKey: string = CA_ToolCallMirrorParse_Util.listKeyStart(toolCallId);\n const idx: number = out.findIndex(\n (m: CaSessionConsoleMessage_Interface): boolean => m.listKey === startKey,\n );\n if (idx < 0) {\n return;\n }\n out[idx] = {\n ...out[idx],\n isToolCallFailedIndicator: true,\n };\n }\n\n /** Fold tömbben start sor bodyText frissítése — in_progress rawInput patch. */\n private static patchOutArrayToolCallStartInput(\n out: CaSessionConsoleMessage_Interface[],\n parsed: CA_ToolCallMirrorParseResult_Interface,\n ): void {\n const startKey: string = CA_ToolCallMirrorParse_Util.listKeyStart(parsed.toolCallId);\n const idx: number = out.findIndex(\n (m: CaSessionConsoleMessage_Interface): boolean => m.listKey === startKey,\n );\n if (idx < 0) {\n return;\n }\n const display: string = out[idx].toolDisplayName ?? 'Tool call';\n const bodyText: string = CursorAcp_DataService.buildToolCallBodyText({\n displayName: display,\n parsed: parsed,\n });\n out[idx] = {\n ...out[idx],\n text: bodyText,\n };\n }\n\n /** Tool start buborék cím — `title`, majd `toolKind`, fallback. */\n private static toolCallDisplayName(p: CA_ToolCallMirrorParseResult_Interface): string {\n if (p.title !== undefined && p.title.length) {\n return p.title;\n }\n if (p.toolKind !== undefined && p.toolKind.length) {\n return p.toolKind;\n }\n return 'Tool call';\n }\n\n /**\n * Tool start buborék bodyText — display name első sor + rawInput + locations.\n * A bubble component `toolInputFormatted_$()` a 2+ sorból olvassa az inputot.\n */\n private static buildToolCallBodyText(params: {\n displayName: string;\n parsed: CA_ToolCallMirrorParseResult_Interface;\n }): string {\n const lines: string[] = [params.displayName];\n const inputStr: string = CA_ToolCallMirrorParse_Util.formatRawInput(params.parsed.rawInput);\n if (inputStr.length) {\n lines.push(inputStr);\n }\n const locStr: string = CA_ToolCallMirrorParse_Util.formatLocations(params.parsed.locations);\n if (locStr.length) {\n lines.push(`[locations]\\n${locStr}`);\n }\n return lines.join('\\n');\n }\n\n /**\n * REST poll tick — selected row + új események (sequence dedup).\n */\n private async runOpenSessionPollTick(sessionId: string): Promise<void> {\n if (\n sessionId !== this.activeSessionId_$()\n || sessionId !== this.openSessionPollTargetId\n ) {\n return;\n }\n try {\n const detail: { session: Record<string, unknown> } = await this.caSession_AS.getSession(sessionId);\n this.ngZone.run((): void => {\n if (sessionId !== this.activeSessionId_$()) {\n return;\n }\n this.selectedSession_$.set(this.mapSessionRecord(this.toRecord(detail.session)));\n });\n\n const prevMax: number = this.lastKnownEventSequence;\n const ev = await this.caSession_AS.getSessionEvents({\n sessionId: sessionId,\n sinceSequence: prevMax >= 0 ? prevMax : undefined,\n limit: 200,\n });\n const mapped: CA_EventItem_Interface[] = ev.events.map(\n (e: Record<string, unknown>): CA_EventItem_Interface => ({\n sessionId: typeof e.sessionId === 'string' ? e.sessionId : sessionId,\n eventType: typeof e.eventType === 'string' ? e.eventType : '',\n timestamp: typeof e.timestamp === 'string' ? e.timestamp : '',\n data: this.asRecord(e.data),\n sequence: typeof e.sequence === 'number' ? e.sequence : 0,\n }),\n );\n if (!mapped.length) {\n return;\n }\n this.ngZone.run((): void => {\n if (sessionId !== this.activeSessionId_$()) {\n return;\n }\n const bySeq: Map<number, CA_EventItem_Interface> = new Map();\n for (const item of this.selectedSessionEvents_$()) {\n bySeq.set(item.sequence ?? 0, item);\n }\n for (const item of mapped) {\n bySeq.set(item.sequence ?? 0, item);\n }\n const merged: CA_EventItem_Interface[] = [...bySeq.values()].sort(\n CA_EventChronologicalSort_Util.compareMirrorEventsAsc,\n );\n this.selectedSessionEvents_$.set(merged);\n for (const item of mapped) {\n if ((item.sequence ?? 0) > prevMax) {\n this.appendConsoleMirrorEventOne(item);\n }\n }\n this.lastKnownEventSequence = Math.max(\n prevMax,\n ...mapped.map((x: CA_EventItem_Interface): number => x.sequence ?? 0),\n );\n });\n } catch {\n // Poll hiba — nem spam-elünk globális errorral tick-enként.\n }\n }\n\n private handleSocketEvent(envelope: { event: string; payload: Record<string, unknown> }): void {\n const eventName: string = envelope.event;\n const payload: Record<string, unknown> = envelope.payload;\n try {\n this.ngZone.run((): void => {\n switch (eventName) {\n case 'ca-session:status':\n this.handleStatusUpdate(payload);\n break;\n case 'ca-session:output':\n this.handleOutputChunk(payload);\n break;\n case 'ca-session:event':\n this.handleSessionEvent(payload);\n break;\n case 'ca-session:list-update':\n this.loadSessions().catch((): void => {});\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 default:\n break;\n }\n });\n } catch (err: unknown) {\n DyFM_Log.error(`CCAP_CaSession_DS | socket error | ${eventName}`, err);\n }\n }\n\n private handleStatusUpdate(payload: Record<string, unknown>): void {\n const sessionId: string = typeof payload.sessionId === 'string' ? payload.sessionId : '';\n const status: string = typeof payload.status === 'string' ? payload.status : '';\n const statusMessage: string | undefined =\n typeof payload.statusMessage === 'string' ? payload.statusMessage : undefined;\n this.lastStatusUpdate_$.set({ sessionId: sessionId, status: status, statusMessage: statusMessage });\n\n const currentSessions: CA_ListItem_Interface[] = this.sessions_$();\n this.sessions_$.set(\n currentSessions.map(\n (s: CA_ListItem_Interface): CA_ListItem_Interface => {\n if (s.sessionId === sessionId) {\n return { ...s, status: status, statusMessage: statusMessage };\n }\n return s;\n },\n ),\n );\n\n const sel: CA_ListItem_Interface | null = this.selectedSession_$();\n if (sel?.sessionId === sessionId) {\n this.selectedSession_$.set({ ...sel, status: status, statusMessage: statusMessage });\n }\n\n if (status === 'errored') {\n this.globalError_CS.showError(\n new Error(statusMessage ? `CA session error: ${statusMessage}` : 'CA session errored'),\n 'ca-session-status',\n );\n }\n }\n\n private handleOutputChunk(payload: Record<string, unknown>): void {\n const sessionId: string = typeof payload.sessionId === 'string' ? payload.sessionId : '';\n if (sessionId && sessionId !== this.activeSessionId_$()) {\n return;\n }\n const content: string = typeof payload.content === 'string' ? payload.content : '';\n const outputType: string = typeof payload.type === 'string' ? payload.type : 'response';\n if (content) {\n const rawPayload: Record<string, unknown> = {};\n for (const key of Object.keys(payload)) {\n rawPayload[key] = Reflect.get(payload, key);\n }\n this.pushConsoleMessage({\n type: outputType === 'error' ? 'error' : 'assistant',\n text: content,\n rawData: rawPayload,\n mirrorEventType: 'ca-session:output',\n });\n }\n }\n\n private handleSessionEvent(payload: Record<string, unknown>): void {\n const sessionId: string = typeof payload.sessionId === 'string' ? payload.sessionId : '';\n if (sessionId && sessionId !== this.activeSessionId_$()) {\n return;\n }\n const event: Record<string, unknown> = this.asRecord(payload.event);\n const seq: number = typeof event.sequence === 'number' ? event.sequence : 0;\n if (seq <= this.lastKnownEventSequence) {\n return;\n }\n this.lastKnownEventSequence = seq;\n const tsFromEvent: unknown = event.timestamp;\n const item: CA_EventItem_Interface = {\n sessionId: sessionId,\n eventType: typeof event.eventType === 'string' ? event.eventType : '',\n timestamp: typeof tsFromEvent === 'string' && tsFromEvent.length ? tsFromEvent : new Date().toISOString(),\n data: this.asRecord(event.data),\n sequence: seq,\n };\n const evs: CA_EventItem_Interface[] = this.selectedSessionEvents_$();\n this.selectedSessionEvents_$.set([...evs, item]);\n this.appendConsoleMirrorEventOne(item);\n }\n\n /**\n * Oldal frissítés / részlet betöltés — konzol buborékok a Mongo mirror eseményekből (live socket mellett).\n */\n private seedConsoleFromMirrorEvents(events: CA_EventItem_Interface[]): void {\n this.pendingOptimisticPrompts.length = 0;\n const sorted: CA_EventItem_Interface[] = [...events].sort(\n CA_EventChronologicalSort_Util.compareMirrorEventsAsc,\n );\n this.consoleMessages_$.set(this.buildFoldedConsoleMessagesFromMirrorEvents(sorted));\n }\n\n /**\n * Poll / socket mirror `prompt-sent` előtt: ugyanazzal a szöveggel lévő optimista buborék törlése (ne legyen dupla user sor).\n */\n private removePendingOptimisticPromptBubbleIfTextMatchesMirror(mirrorContent: string): void {\n const pendingIndex: number = this.pendingOptimisticPrompts.findIndex(\n (p: { listKey: string; text: string }): boolean =>\n p.text === mirrorContent || p.text.trim() === mirrorContent.trim(),\n );\n if (pendingIndex < 0) {\n return;\n }\n const removed: { listKey: string; text: string } = this.pendingOptimisticPrompts[pendingIndex];\n this.pendingOptimisticPrompts.splice(pendingIndex, 1);\n const next: CaSessionConsoleMessage_Interface[] = this.consoleMessages_$().filter(\n (m: CaSessionConsoleMessage_Interface): boolean => m.listKey !== removed.listKey,\n );\n this.consoleMessages_$.set(next);\n }\n\n private mapSessionRecord(raw: Record<string, unknown>): CA_ListItem_Interface {\n return {\n sessionId: typeof raw['sessionId'] === 'string' ? raw['sessionId'] : undefined,\n acpSessionId: typeof raw['acpSessionId'] === 'string' ? raw['acpSessionId'] : undefined,\n label: typeof raw['label'] === 'string' ? raw['label'] : undefined,\n workspacePath: typeof raw['workspacePath'] === 'string' ? raw['workspacePath'] : undefined,\n status: typeof raw['status'] === 'string' ? raw['status'] : undefined,\n statusMessage: typeof raw['statusMessage'] === 'string' ? raw['statusMessage'] : undefined,\n promptCount: typeof raw['promptCount'] === 'number' ? raw['promptCount'] : undefined,\n lastPrompt: typeof raw['lastPrompt'] === 'string' ? raw['lastPrompt'] : undefined,\n lastActivityAt: typeof raw['lastActivityAt'] === 'string' ? raw['lastActivityAt'] : undefined,\n isArchived: raw['isArchived'] === true,\n parentSessionId: typeof raw['parentSessionId'] === 'string' ? raw['parentSessionId'] : undefined,\n lastSyncAt: typeof raw['lastSyncAt'] === 'string' ? raw['lastSyncAt'] : undefined,\n lastSyncError: typeof raw['lastSyncError'] === 'string' ? raw['lastSyncError'] : undefined,\n agentInfoName: typeof raw['agentInfoName'] === 'string' ? raw['agentInfoName'] : undefined,\n agentInfoVersion: typeof raw['agentInfoVersion'] === 'string' ? raw['agentInfoVersion'] : undefined,\n isAcpConnected: typeof raw['isAcpConnected'] === 'boolean' ? raw['isAcpConnected'] : undefined,\n loadSessionSupported:\n typeof raw['loadSessionSupported'] === 'boolean' ? raw['loadSessionSupported'] : undefined,\n isTerminalMode: typeof raw['isTerminalMode'] === 'boolean' ? raw['isTerminalMode'] : undefined,\n isTerminalRunnerConnected:\n typeof raw['isTerminalRunnerConnected'] === 'boolean' ? raw['isTerminalRunnerConnected'] : undefined,\n };\n }\n\n private asRecord(value: unknown): Record<string, unknown> {\n return this.toRecord(value);\n }\n\n private toRecord(value: unknown): Record<string, unknown> {\n if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(value)) {\n out[key] = Reflect.get(value, key);\n }\n return out;\n }\n return {};\n }\n\n // ── Assembled messages (SSOT) ──────────────────────────────\n\n /**\n * Assembled message-ek betöltése REST-en.\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 this.assembledMessages_$.set(result.messages);\n } catch (err: unknown) {\n DyFM_Log.error(\n `CCAP_CaSession_DS | loadAssembledMessages failed`\n + ` | sessionId: ${params.sessionId}`,\n err,\n );\n }\n }\n\n /**\n * Új assembled message socket-en — aktív session szűréssel.\n */\n private handleAssembledMessage(\n payload: Record<string, unknown>,\n ): void {\n const sessionId: string =\n typeof payload.sessionId === 'string'\n ? payload.sessionId\n : '';\n if (!sessionId || sessionId !== this.activeSessionId_$()) {\n return;\n }\n const msgData: unknown = payload.message;\n if (!msgData || typeof msgData !== 'object') {\n return;\n }\n const msg: CCAP_ExtSessionMessage_Response =\n msgData as CCAP_ExtSessionMessage_Response;\n const current: CCAP_ExtSessionMessage_Response[] =\n this.assembledMessages_$();\n this.assembledMessages_$.set([...current, msg]);\n }\n\n /**\n * Assembled message frissítés socket-en (stream append, tool result).\n */\n private handleAssembledMessageUpdate(\n payload: Record<string, unknown>,\n ): void {\n const sessionId: string =\n typeof payload.sessionId === 'string'\n ? payload.sessionId\n : '';\n if (!sessionId || sessionId !== this.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 const current: CCAP_ExtSessionMessage_Response[] =\n this.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 if (typeof updateRec.bodyText === 'string') {\n updated.bodyText = updateRec.bodyText;\n }\n if (updateRec.toolResult !== undefined) {\n updated.toolResult =\n updateRec.toolResult as CCAP_ExtSessionMessage_Response['toolResult'];\n }\n if (typeof updateRec.toolStatus === 'string') {\n updated.toolStatus = updateRec.toolStatus;\n }\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.assembledMessages_$.set(next);\n }\n}\n", "import { SHR_JsonSnippetFormat_Util } from './shr-json-snippet-format.util';\n\n/**\n * Ismeretlen / nested érték pretty-print — beágyazott JSON string mezők rekurzív kibontása, majd JSON.stringify indent.\n */\nexport class SHR_UnknownValuePrettyJson_Util {\n\n /**\n * `unknown` érték 2 space indent JSON szöveggé; beágyazott stringekben lévő JSON parse + beillesztés.\n */\n static prettyStringifyUnknown(value: unknown): string {\n try {\n const expanded: unknown = SHR_UnknownValuePrettyJson_Util.expandEmbeddedJsonStrings(value);\n return JSON.stringify(expanded, null, 2);\n } catch {\n if (value === null || value === undefined) {\n return String(value);\n }\n if (typeof value === 'object') {\n return '[Object stringify failed]';\n }\n return String(value);\n }\n }\n\n /**\n * String leaf-eknél: ha JSON-nak tűnik, parse és rekurzív expand; különben primitív / objektum / tömb rekurzió.\n */\n private static expandEmbeddedJsonStrings(value: unknown): unknown {\n if (value === null || value === undefined) {\n return value;\n }\n if (typeof value === 'string') {\n const s: string = value;\n if (!SHR_JsonSnippetFormat_Util.looksLikeJson(s)) {\n return s;\n }\n try {\n const parsed: unknown = JSON.parse(s.trim());\n return SHR_UnknownValuePrettyJson_Util.expandEmbeddedJsonStrings(parsed);\n } catch {\n return s;\n }\n }\n if (typeof value !== 'object') {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item: unknown): unknown =>\n SHR_UnknownValuePrettyJson_Util.expandEmbeddedJsonStrings(item),\n );\n }\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(value)) {\n const v: unknown = Reflect.get(value, key);\n out[key] = SHR_UnknownValuePrettyJson_Util.expandEmbeddedJsonStrings(v);\n }\n return out;\n }\n}\n", "import { CA_MirrorBrief_Result_Interface } from '../../../_models/interfaces/ca-mirror-brief-result.interface';\nimport { CA_EventItem_Interface } from '../../../_models/interfaces/ca-view.interface';\nimport { CA_MirrorStreamMerge_Util } from './ca-mirror-stream-merge.util';\nimport { SHR_UnknownValuePrettyJson_Util } from '../../../../../../shared/_collections/utils/shr-unknown-value-pretty-json.util';\n\n/**\n * CA mirror timeline esemény → console brief (known ágak + pretty JSON fallback).\n */\nexport class CA_MirrorEventBrief_Util {\n\n /**\n * Egy mirror sor → egy console buborék leírása; üres / érvénytelen prompt → null.\n */\n static buildFromMirrorEvent(item: CA_EventItem_Interface): CA_MirrorBrief_Result_Interface | null {\n const seq: number = item.sequence ?? 0;\n const data: Record<string, unknown> = item.data !== undefined ? item.data : {};\n const eventType: string = typeof item.eventType === 'string' ? item.eventType : '';\n\n if (eventType === 'prompt-sent') {\n return CA_MirrorEventBrief_Util.buildPromptSentBrief(seq, data);\n }\n if (eventType === 'ca-session-update') {\n return CA_MirrorEventBrief_Util.buildCaSessionUpdateBrief(seq, data);\n }\n return CA_MirrorEventBrief_Util.buildGenericBrief(eventType, seq, data);\n }\n\n /**\n * Belső `sessionUpdate` érték — opcionális subtype címkéhez.\n */\n static extractSessionUpdateKind(data: Record<string, unknown>): string | undefined {\n const upd: unknown = data.update;\n if (upd === null || typeof upd !== 'object' || Array.isArray(upd)) {\n return undefined;\n }\n const rec: Record<string, unknown> = CA_MirrorEventBrief_Util.toPlainRecord(upd);\n const kind: unknown = rec.sessionUpdate;\n return typeof kind === 'string' && kind.length ? kind : undefined;\n }\n\n private static buildPromptSentBrief(\n seq: number,\n data: Record<string, unknown>,\n ): CA_MirrorBrief_Result_Interface | null {\n const contentRaw: unknown = data.content;\n if (typeof contentRaw !== 'string' || !contentRaw.length) {\n return null;\n }\n return {\n listKey: `mirror-prompt-${String(seq)}`,\n consoleType: 'prompt',\n bodyText: contentRaw,\n mirrorEventType: 'prompt-sent',\n useRawBubbleKind: false,\n rawData: data,\n };\n }\n\n private static buildCaSessionUpdateBrief(\n seq: number,\n data: Record<string, unknown>,\n ): CA_MirrorBrief_Result_Interface | null {\n const parsed = CA_MirrorStreamMerge_Util.parseStreamChunkFromMirrorData(data);\n if (parsed !== null) {\n const sub: string | undefined = CA_MirrorEventBrief_Util.extractSessionUpdateKind(data);\n const isThoughtStream: boolean = parsed.role === 'thought';\n return {\n listKey: `mirror-chunk-${String(seq)}`,\n consoleType: isThoughtStream ? 'thinking' : 'assistant',\n bodyText: parsed.text,\n mirrorEventType: 'ca-session-update',\n briefSubtype: sub,\n useRawBubbleKind: false,\n rawData: data,\n isStreamingTextChunk: true,\n streamTextRole: parsed.role,\n streamMessageId: parsed.messageId,\n };\n }\n const pretty: string = SHR_UnknownValuePrettyJson_Util.prettyStringifyUnknown(data);\n return {\n listKey: `mirror-ca-session-update-${String(seq)}`,\n consoleType: 'info',\n bodyText: pretty,\n mirrorEventType: 'ca-session-update',\n useRawBubbleKind: true,\n rawData: data,\n };\n }\n\n private static buildGenericBrief(\n eventType: string,\n seq: number,\n data: Record<string, unknown>,\n ): CA_MirrorBrief_Result_Interface {\n const segment: string = CA_MirrorEventBrief_Util.safeListKeySegment(eventType);\n const payload: Record<string, unknown> = {\n eventType: eventType.length ? eventType : 'unknown',\n sequence: seq,\n data: data,\n };\n const pretty: string = SHR_UnknownValuePrettyJson_Util.prettyStringifyUnknown(payload);\n return {\n listKey: `mirror-${segment}-${String(seq)}`,\n consoleType: 'info',\n bodyText: pretty,\n mirrorEventType: eventType.length ? eventType : 'unknown',\n useRawBubbleKind: true,\n rawData: data,\n };\n }\n\n private static safeListKeySegment(eventType: string): string {\n const cleaned: string = eventType.replace(/[^a-zA-Z0-9_-]+/g, '_').replace(/^_+|_+$/g, '');\n return cleaned.length ? cleaned : 'event';\n }\n\n private static toPlainRecord(value: object): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(value)) {\n out[key] = Reflect.get(value, key);\n }\n return out;\n }\n}\n", "import { CA_ToolCallMirrorParseResult_Interface } from '../../../_models/interfaces/ca-tool-call-mirror-parse-result.interface';\n\n/**\n * CA mirror `ca-session-update` `data` objektumából tool_call / tool_call_update mezők kiolvasása (ACP).\n */\nexport class CA_ToolCallMirrorParse_Util {\n\n /**\n * Stabil listKey — tool indulás buborék + failed patch cél.\n */\n static listKeyStart(toolCallId: string): string {\n return `ca-tc-${toolCallId}-start`;\n }\n\n /**\n * Stabil listKey — in_progress agent update sor (replace).\n */\n static listKeyProgress(toolCallId: string): string {\n return `ca-tc-${toolCallId}-progress`;\n }\n\n /**\n * Stabil listKey — sikeres tool result.\n */\n static listKeyResult(toolCallId: string): string {\n return `ca-tc-${toolCallId}-result`;\n }\n\n /**\n * Stabil listKey — completed error buborék.\n */\n static listKeyError(toolCallId: string): string {\n return `ca-tc-${toolCallId}-error`;\n }\n\n /**\n * Stabil `listKey` → `toolCallId` + szerep (console pairing, dedup ellenőrzés).\n * `-progress` előbb, hogy ne legyen ütközés más suffix-szel.\n */\n static tryParseStableListKey(listKey: string): {\n toolCallId: string;\n role: 'start' | 'progress' | 'result' | 'error';\n } | null {\n const prefix: string = 'ca-tc-';\n if (!listKey.startsWith(prefix)) {\n return null;\n }\n const suffixSpecs: { suffix: string; role: 'start' | 'progress' | 'result' | 'error' }[] = [\n { suffix: '-progress', role: 'progress' },\n { suffix: '-start', role: 'start' },\n { suffix: '-result', role: 'result' },\n { suffix: '-error', role: 'error' },\n ];\n for (const spec of suffixSpecs) {\n if (!listKey.endsWith(spec.suffix)) {\n continue;\n }\n const id: string = listKey.slice(prefix.length, listKey.length - spec.suffix.length);\n if (!id.length) {\n return null;\n }\n return {\n toolCallId: id,\n role: spec.role,\n };\n }\n return null;\n }\n\n /**\n * Ha `data.update` tool_call vagy tool_call_update, visszaadja a mezőket; egyébként null.\n */\n static tryParseMirrorData(\n data: Record<string, unknown>,\n ): CA_ToolCallMirrorParseResult_Interface | null {\n const upd: unknown = data.update;\n if (upd === null || typeof upd !== 'object' || Array.isArray(upd)) {\n return null;\n }\n const rec: Record<string, unknown> = CA_ToolCallMirrorParse_Util.toPlainRecord(upd);\n const su: unknown = rec.sessionUpdate;\n if (su !== 'tool_call' && su !== 'tool_call_update') {\n return null;\n }\n const toolCallIdRaw: unknown = rec.toolCallId;\n if (typeof toolCallIdRaw !== 'string' || !toolCallIdRaw.trim().length) {\n return null;\n }\n const statusRaw: unknown = rec.status;\n const status: string = typeof statusRaw === 'string' ? statusRaw : '';\n const titleRaw: unknown = rec.title;\n const title: string | undefined =\n typeof titleRaw === 'string' && titleRaw.trim().length ? titleRaw.trim() : undefined;\n const kindRaw: unknown = rec.kind;\n const toolKind: string | undefined =\n typeof kindRaw === 'string' && kindRaw.trim().length ? kindRaw.trim() : undefined;\n const rawOut: unknown = rec.rawOutput;\n const rawIn: unknown = rec.rawInput;\n const contentRaw: unknown = rec.content;\n const locationsRaw: unknown = rec.locations;\n return {\n sessionUpdate: su,\n toolCallId: toolCallIdRaw.trim(),\n status: status,\n title: title,\n toolKind: toolKind,\n rawOutput: rawOut !== undefined ? rawOut : undefined,\n rawInput: rawIn !== undefined ? rawIn : undefined,\n content: Array.isArray(contentRaw) && contentRaw.length ? contentRaw : undefined,\n locations: Array.isArray(locationsRaw) && locationsRaw.length ? locationsRaw : undefined,\n };\n }\n\n /**\n * `rawOutput` tartalmaz-e értelmezhető error mezőt (completed error ág).\n */\n static hasRawOutputError(rawOutput: unknown): boolean {\n if (rawOutput === null || typeof rawOutput !== 'object' || Array.isArray(rawOutput)) {\n return false;\n }\n const rec: Record<string, unknown> = CA_ToolCallMirrorParse_Util.toPlainRecord(rawOutput);\n return Object.prototype.hasOwnProperty.call(rec, 'error');\n }\n\n /**\n * Error szöveg összefoglaló user buborékhoz.\n */\n static summarizeRawOutputError(rawOutput: unknown): string {\n if (rawOutput === null || typeof rawOutput !== 'object' || Array.isArray(rawOutput)) {\n return 'Tool call failed';\n }\n const rec: Record<string, unknown> = CA_ToolCallMirrorParse_Util.toPlainRecord(rawOutput);\n const err: unknown = rec.error;\n if (typeof err === 'string' && err.trim().length) {\n return err.trim();\n }\n try {\n return JSON.stringify(rawOutput);\n } catch {\n return 'Tool call failed';\n }\n }\n\n /**\n * Sikeres completed — rövid result szöveg (nem error ág).\n */\n static summarizeRawOutputSuccess(rawOutput: unknown): string {\n if (rawOutput === undefined) {\n return 'Completed';\n }\n try {\n const s: string = JSON.stringify(rawOutput);\n const max: number = 400;\n return s.length > max ? `${s.substring(0, max)}…` : s;\n } catch {\n return 'Completed';\n }\n }\n\n /**\n * `rawInput` → formázott body szöveg (tool name után).\n * Üres/undefined → üres string.\n */\n static formatRawInput(rawInput: unknown): string {\n if (rawInput === undefined || rawInput === null) {\n return '';\n }\n try {\n return JSON.stringify(rawInput, null, 2);\n } catch {\n return String(rawInput);\n }\n }\n\n /**\n * ACP `locations` → olvasható fájl-lokáció lista (pl. \"src/foo.ts:42\").\n */\n static formatLocations(locations: unknown[] | undefined): string {\n if (!locations?.length) {\n return '';\n }\n const lines: string[] = [];\n for (const loc of locations) {\n if (loc === null || typeof loc !== 'object' || Array.isArray(loc)) {\n continue;\n }\n const rec: Record<string, unknown> = CA_ToolCallMirrorParse_Util.toPlainRecord(loc);\n const path: unknown = rec.path;\n if (typeof path !== 'string' || !path.length) {\n continue;\n }\n const line: unknown = rec.line;\n const lineStr: string = typeof line === 'number' ? `:${line}` : '';\n lines.push(`${path}${lineStr}`);\n }\n return lines.join('\\n');\n }\n\n /**\n * ACP `content` (ToolCallContent[]) → szöveges összefoglaló (diffs, terminal, text).\n */\n static formatContent(content: unknown[] | undefined): string {\n if (!content?.length) {\n return '';\n }\n const parts: string[] = [];\n for (const item of content) {\n if (item === null || typeof item !== 'object' || Array.isArray(item)) {\n continue;\n }\n const rec: Record<string, unknown> = CA_ToolCallMirrorParse_Util.toPlainRecord(item);\n const type: unknown = rec.type;\n if (type === 'diff') {\n const path: unknown = rec.path;\n const oldText: unknown = rec.oldText;\n const newText: unknown = rec.newText;\n const pathStr: string = typeof path === 'string' ? path : '(unknown)';\n const parts2: string[] = [`--- ${pathStr}`];\n if (typeof oldText === 'string' && oldText.length) {\n parts2.push(`- ${oldText.substring(0, 500)}${oldText.length > 500 ? '…' : ''}`);\n }\n if (typeof newText === 'string' && newText.length) {\n parts2.push(`+ ${newText.substring(0, 500)}${newText.length > 500 ? '…' : ''}`);\n }\n parts.push(parts2.join('\\n'));\n } else if (type === 'terminal') {\n try {\n parts.push(`[terminal] ${JSON.stringify(rec, null, 2)}`);\n } catch {\n parts.push('[terminal output]');\n }\n } else if (type === 'content') {\n const innerParts: unknown = rec.parts;\n if (Array.isArray(innerParts)) {\n for (const part of innerParts) {\n if (part !== null && typeof part === 'object' && !Array.isArray(part)) {\n const pRec: Record<string, unknown> =\n CA_ToolCallMirrorParse_Util.toPlainRecord(part);\n if (typeof pRec.text === 'string') {\n parts.push(pRec.text as string);\n }\n }\n }\n }\n }\n }\n return parts.join('\\n\\n');\n }\n\n private static toPlainRecord(value: object): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(value)) {\n out[key] = Reflect.get(value, key);\n }\n return out;\n }\n}\n", "import { inject, Injectable } from '@angular/core';\nimport { HttpClient, HttpParams } from '@angular/common/http';\n\nimport { firstValueFrom } from 'rxjs';\n\nimport { environment } from '../../../../../../environments/environment';\nimport {\n CA_List_Response,\n} from '../_models/interfaces/ca-view.interface';\nimport { ExS_InstanceContext_DataService } from '../../../_services/exs-instance-context.data-service';\n\n/**\n * CA session REST API.\n * Minden hívás `?ccapId=<current>` paramot küld — a ccapId forrása\n * az instance-szelektor (`ExS_InstanceContext_DataService.activeCcapId_$`).\n */\n@Injectable({ providedIn: 'root' })\nexport class CursorAcp_ApiService {\n\n private readonly baseUrl: string = `${environment.api.baseUrl}/ca-session`;\n\n private readonly http: HttpClient = inject(HttpClient);\n\n private readonly peiContext_DS: ExS_InstanceContext_DataService =\n inject(ExS_InstanceContext_DataService);\n\n /**\n * ccapId hozzáfűzése egy meglévő HttpParams-hoz.\n */\n private withCcapId(params: HttpParams): HttpParams {\n const ccapId: string = this.peiContext_DS.activeCcapId_$();\n if (!ccapId) {\n return params;\n }\n return params.set('ccapId', ccapId);\n }\n\n createSession(params: {\n workspacePath: string;\n label?: string;\n parentSessionId?: string;\n actorId?: string;\n actorLabel?: string;\n }): Promise<{ session: Record<string, unknown> }> {\n const httpParams: HttpParams = this.withCcapId(new HttpParams());\n return firstValueFrom(\n this.http.post<{ session: Record<string, unknown> }>(this.baseUrl, params, { params: httpParams }),\n );\n }\n\n listSessions(params?: {\n status?: string;\n workspacePath?: string;\n includeArchived?: boolean;\n }): Promise<CA_List_Response> {\n let httpParams: HttpParams = this.withCcapId(new HttpParams());\n if (params?.status) {\n httpParams = httpParams.set('status', params.status);\n }\n if (params?.workspacePath) {\n httpParams = httpParams.set('workspacePath', params.workspacePath);\n }\n if (params?.includeArchived) {\n httpParams = httpParams.set('includeArchived', '1');\n }\n return firstValueFrom(\n this.http.get<CA_List_Response>(this.baseUrl, { params: httpParams }),\n );\n }\n\n syncFromAgent(params?: { cwd?: string }): Promise<{ success: boolean; mergedCount: number }> {\n const httpParams: HttpParams = this.withCcapId(new HttpParams());\n return firstValueFrom(\n this.http.post<{ success: boolean; mergedCount: number }>(`${this.baseUrl}/sync`, {\n cwd: params?.cwd,\n }, { params: httpParams }),\n );\n }\n\n getSession(sessionId: string): Promise<{ session: Record<string, unknown> }> {\n const httpParams: HttpParams = this.withCcapId(new HttpParams());\n return firstValueFrom(\n this.http.get<{ session: Record<string, unknown> }>(`${this.baseUrl}/${sessionId}`, { params: httpParams }),\n );\n }\n\n sendPrompt(params: { sessionId: string; content: string }): Promise<{\n success: boolean;\n stopReason?: string;\n raw?: Record<string, unknown>;\n }> {\n const httpParams: HttpParams = this.withCcapId(new HttpParams());\n return firstValueFrom(\n this.http.post<{ success: boolean; stopReason?: string; raw?: Record<string, unknown> }>(\n `${this.baseUrl}/${params.sessionId}/prompt`,\n { content: params.content },\n { params: httpParams },\n ),\n );\n }\n\n /**\n * Futó execution leállítása (stop gomb; session megmarad).\n */\n stopExecution(sessionId: string): Promise<{ success: boolean }> {\n const httpParams: HttpParams = this.withCcapId(new HttpParams());\n return firstValueFrom(\n this.http.post<{ success: boolean }>(`${this.baseUrl}/${sessionId}/stop-execution`, {}, { params: httpParams }),\n );\n }\n\n terminateSession(sessionId: string): Promise<{ success: boolean }> {\n const httpParams: HttpParams = this.withCcapId(new HttpParams());\n return firstValueFrom(\n this.http.post<{ success: boolean }>(`${this.baseUrl}/${sessionId}/terminate`, {}, { params: httpParams }),\n );\n }\n\n setSessionArchived(params: { sessionId: string; isArchived: boolean }): Promise<{\n success: boolean;\n session: Record<string, unknown> | null;\n }> {\n const httpParams: HttpParams = this.withCcapId(new HttpParams());\n return firstValueFrom(\n this.http.patch<{ success: boolean; session: Record<string, unknown> | null }>(\n `${this.baseUrl}/${params.sessionId}/archive`,\n { isArchived: params.isArchived },\n { params: httpParams },\n ),\n );\n }\n\n getSessionEvents(params: {\n sessionId: string;\n sinceSequence?: number;\n limit?: number;\n }): Promise<{\n events: Record<string, unknown>[];\n hasMore: boolean;\n nextSinceSequence: number | null;\n }> {\n let httpParams: HttpParams = this.withCcapId(new HttpParams());\n if (params.sinceSequence != null) {\n httpParams = httpParams.set('sinceSequence', String(params.sinceSequence));\n }\n if (params.limit != null) {\n httpParams = httpParams.set('limit', String(params.limit));\n }\n return firstValueFrom(\n this.http.get<{\n events: Record<string, unknown>[];\n hasMore: boolean;\n nextSinceSequence: number | null;\n }>(`${this.baseUrl}/${params.sessionId}/events`, { params: httpParams }),\n );\n }\n\n hydrateSession(params: { sessionId: string; force?: boolean }): Promise<{\n success: boolean;\n appended: boolean;\n skippedDuplicate: boolean;\n fingerprint: string;\n sequence: number;\n }> {\n return firstValueFrom(\n this.http.post<{\n success: boolean;\n appended: boolean;\n skippedDuplicate: boolean;\n fingerprint: string;\n sequence: number;\n }>(`${this.baseUrl}/${params.sessionId}/hydrate`, { force: params.force === true },\n { params: this.withCcapId(new HttpParams()) }),\n );\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["CA_EventChronologicalSort_Util", "compareMirrorEventsAsc", "a", "b", "dq", "sequence", "ta", "timestamp", "tb", "tc", "localeCompare", "ea", "eventType", "eb", "CA_MirrorStreamMerge_Util", "messageIdsCompatibleForStreamMerge", "prevMid", "nextMid", "p", "trim", "n", "length", "parseStreamChunkFromMirrorData", "data", "upd", "update", "Array", "isArray", "rec", "toPlainRecord", "kind", "sessionUpdate", "role", "content", "text", "midRaw", "messageId", "undefined", "canMergeConsoleTailWithChunk", "params", "prev", "streamTextRole", "parsed", "streamMessageId", "nSeq", "ev", "sequence", "pSeq", "streamLastSequence", "canMergeMirrorChunkEvents", "prevEv", "nextEv", "nextParsed", "prevParsed", "foldEventsToTimelineRows", "sortedAsc", "rows", "tail", "tailLast", "events", "nextEvents", "rowKey", "mergedTimelineRowKey", "push", "String", "first", "last", "value", "out", "key", "Object", "keys", "Reflect", "get", "import_fsm_dynamo", "SHR_UnknownValuePrettyJson_Util", "prettyStringifyUnknown", "value", "expanded", "expandEmbeddedJsonStrings", "JSON", "stringify", "String", "s", "SHR_JsonSnippetFormat_Util", "looksLikeJson", "parsed", "parse", "trim", "Array", "isArray", "map", "item", "out", "key", "Object", "keys", "v", "Reflect", "get", "CA_MirrorEventBrief_Util", "buildFromMirrorEvent", "item", "seq", "sequence", "data", "undefined", "eventType", "buildPromptSentBrief", "buildCaSessionUpdateBrief", "buildGenericBrief", "extractSessionUpdateKind", "upd", "update", "Array", "isArray", "kind", "toPlainRecord", "sessionUpdate", "length", "contentRaw", "content", "listKey", "String", "consoleType", "bodyText", "mirrorEventType", "useRawBubbleKind", "rawData", "parsed", "CA_MirrorStreamMerge_Util", "parseStreamChunkFromMirrorData", "sub", "isThoughtStream", "role", "text", "briefSubtype", "isStreamingTextChunk", "streamTextRole", "streamMessageId", "messageId", "pretty", "SHR_UnknownValuePrettyJson_Util", "prettyStringifyUnknown", "segment", "safeListKeySegment", "payload", "cleaned", "replace", "value", "out", "key", "Object", "keys", "Reflect", "get", "CA_ToolCallMirrorParse_Util", "listKeyStart", "toolCallId", "listKeyProgress", "listKeyResult", "listKeyError", "tryParseStableListKey", "listKey", "prefix", "startsWith", "suffixSpecs", "suffix", "role", "spec", "endsWith", "id", "slice", "length", "tryParseMirrorData", "data", "upd", "update", "Array", "isArray", "rec", "toPlainRecord", "su", "sessionUpdate", "toolCallIdRaw", "trim", "statusRaw", "status", "titleRaw", "title", "undefined", "kindRaw", "kind", "toolKind", "rawOut", "rawOutput", "rawIn", "rawInput", "contentRaw", "content", "locationsRaw", "locations", "hasRawOutputError", "Object", "prototype", "hasOwnProperty", "call", "summarizeRawOutputError", "err", "error", "JSON", "stringify", "summarizeRawOutputSuccess", "s", "max", "substring", "formatRawInput", "String", "formatLocations", "lines", "loc", "path", "line", "lineStr", "push", "join", "formatContent", "parts", "item", "type", "oldText", "newText", "parts2", "innerParts", "part", "pRec", "text", "value", "out", "key", "keys", "Reflect", "get", "CursorAcp_ApiService", "baseUrl", "environment", "api", "http", "inject", "HttpClient", "peiContext_DS", "ExS_InstanceContext_DataService", "withCcapId", "params", "ccapId", "activeCcapId_$", "set", "createSession", "httpParams", "HttpParams", "firstValueFrom", "post", "listSessions", "status", "workspacePath", "includeArchived", "get", "syncFromAgent", "cwd", "getSession", "sessionId", "sendPrompt", "content", "stopExecution", "terminateSession", "setSessionArchived", "patch", "isArchived", "getSessionEvents", "sinceSequence", "String", "limit", "hydrateSession", "force", "factory", "\u0275fac", "providedIn", "CursorAcp_DataService", "sessions_$", "signal", "sessionsLoading_$", "sessionsLoadError_$", "selectedSession_$", "selectedSessionLoading_$", "selectedSessionEvents_$", "sessionEventsHasMore_$", "mirrorRuntime_$", "consoleMessages_$", "assembledMessages_$", "lastStatusUpdate_$", "activeSessionId_$", "sessionDetailError_$", "caSession_AS", "inject", "CursorAcp_ApiService", "extSessionMsg_AS", "ExS_Message_ApiService", "globalError_CS", "CCAP_GlobalError_ControlService", "socket_CS", "CCAP_Socket_ControlService", "ngZone", "NgZone", "eventSubscription", "reconnectSubscription", "lastKnownEventSequence", "openSessionPollTimer", "openSessionPollTargetId", "pendingOptimisticPrompts", "sessionEventsNextSince", "constructor", "event$", "subscribe", "envelope", "handleSocketEvent", "connected$", "isConnected", "activeId", "emit", "sessionId", "loadAssembledMessages", "catch", "ngOnDestroy", "stopOpenSessionPolling", "unsubscribe", "loadSessions", "params", "__async", "set", "res", "listSessions", "includeArchived", "rawUnknown", "sessions", "mapped", "Array", "isArray", "map", "s", "mapSessionRecord", "toRecord", "rtUnknown", "mirrorRuntime", "rtRec", "ic", "isAcpConnected", "ls", "loadSessionSupported", "tm", "isTerminalMode", "trc", "isTerminalRunnerConnected", "err", "showError", "syncFromAgent", "cwd", "loadSessionDetail", "row", "getSession", "session", "ev", "getSessionEvents", "limit", "events", "e", "eventType", "timestamp", "data", "asRecord", "sequence", "hasMore", "ns", "nextSinceSequence", "Math", "max", "x", "seedConsoleFromMirrorEvents", "loadMoreSessionEvents", "since", "sinceSequence", "merged", "sort", "CA_EventChronologicalSort_Util", "compareMirrorEventsAsc", "hydrateFromAgent", "hydrateSession", "force", "Error", "setActiveSessionId", "previousId", "clearLiveOutput", "length", "createSession", "workspacePath", "label", "newIdRaw", "newId", "sendPrompt", "optimisticListKey", "globalThis", "crypto", "randomUUID", "push", "listKey", "text", "content", "pushConsoleMessage", "type", "pendingIdx", "findIndex", "p", "splice", "CCAP_ErrorDisplay_Util", "getErrorMessageForDisplay", "stopExecution", "terminateSession", "setSessionArchived", "startOpenSessionPolling", "intervalMs", "second", "setInterval", "runOpenSessionPollTick", "clearInterval", "message", "materializeConsoleLineFromPushParams", "Date", "toISOString", "rawData", "mirrorEventType", "briefSubtype", "useRawBubbleKind", "streamTextRole", "streamLastSequence", "streamMessageId", "streamPartData", "toolDisplayName", "isToolCallFailedIndicator", "current", "appendConsoleMirrorEventOne", "toolParsed", "CA_ToolCallMirrorParse_Util", "tryParseMirrorData", "applyToolCallMirrorEventToLiveConsole", "parsed", "brief", "CA_MirrorEventBrief_Util", "buildFromMirrorEvent", "consoleType", "removePendingOptimisticPromptBubbleIfTextMatchesMirror", "bodyText", "some", "m", "isStreamingTextChunk", "tryMergeStreamingMirrorChunkIntoConsole", "ts", "buildConsolePushParamsFromBrief", "timestampIso", "prev", "CA_MirrorStreamMerge_Util", "parseStreamChunkFromMirrorData", "canMergeConsoleTailWithChunk", "parts", "undefined", "nextMsgId", "mergedMsgId", "trim", "updated", "__spreadProps", "__spreadValues", "streamMerged", "partCount", "lastChunkSequence", "chunkSnapshots", "next", "b", "buildFoldedConsoleMessagesFromMirrorEvents", "sortedAsc", "out", "tryFoldToolCallMirrorEventIntoOut", "last", "id", "toolCallId", "dataPayload", "sessionUpdate", "startKey", "listKeyStart", "display", "toolCallDisplayName", "buildToolCallBodyText", "displayName", "status", "rawInput", "patchLiveToolCallStartInput", "progressKey", "listKeyProgress", "line", "idx", "nextLine", "hasRawOutputError", "rawOutput", "errKey", "listKeyError", "errText", "summarizeRawOutputError", "patchLiveConsoleToolCallStartFailed", "resKey", "listKeyResult", "summary", "summarizeRawOutputSuccess", "patchOutArrayToolCallStartInput", "patchOutArrayToolCallStartFailed", "cur", "title", "toolKind", "lines", "inputStr", "formatRawInput", "locStr", "formatLocations", "locations", "join", "detail", "run", "prevMax", "bySeq", "Map", "item", "values", "eventName", "event", "payload", "handleStatusUpdate", "handleOutputChunk", "handleSessionEvent", "handleAssembledMessage", "handleAssembledMessageUpdate", "DyFM_Log", "error", "statusMessage", "currentSessions", "sel", "outputType", "rawPayload", "key", "Object", "keys", "Reflect", "get", "seq", "tsFromEvent", "evs", "sorted", "mirrorContent", "pendingIndex", "removed", "filter", "raw", "acpSessionId", "promptCount", "lastPrompt", "lastActivityAt", "isArchived", "parentSessionId", "lastSyncAt", "lastSyncError", "agentInfoName", "agentInfoVersion", "value", "result", "getMessages", "latest", "messages", "msgData", "msg", "messageKey", "updateData", "update", "updateRec", "toolResult", "toolStatus", "headerStatusDot", "factory", "\u0275fac", "providedIn"]
|
|
7
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import{a as G}from"./chunk-6ZYILL36.js";import{a as K}from"./chunk-V3MC6IHV.js";import{e as F}from"./chunk-ADOCMVHI.js";import{h as f,j as U}from"./chunk-ODUTF4DP.js";import{I as D,p as H}from"./chunk-QUNT2WPJ.js";import{C as _,R as L,a as w,aa as p,b as $,d as k,h as O,k as h,p as d,vb as g,xb as P,y as M}from"./chunk-TBMJSIBB.js";var C=O(H());var I=(()=>{class l{static GATEWAY_CHAT_MESSAGE_TIMESTAMP_FIELD_NAMES=["timestamp","createdAt","updatedAt","ts","time","sentAt","messageTimestamp","created_at","updated_at","lastMessageAt","last_message_at","startedAt","started_at","lastActivityAt","last_activity_at"];static GATEWAY_SESSION_LAST_ACTIVITY_FIELD_NAMES=["lastActivityAt","updatedAt","lastMessageAt","updated_at","last_activity_at","last_message_at","startedAt","started_at","createdAt","created_at"];static GATEWAY_SESSION_STARTED_FIELD_NAMES=["startedAt","started_at","createdAt","created_at"];static GATEWAY_OUTPUT_ONLY_TIMESTAMP_FIELD_NAMES=["lastMessageAt","last_message_at","lastOutputAt","last_output_at"];static extractTimestamp(t,s){for(let e of s){let n=t[e];if(typeof n=="string"&&n)return n;if(typeof n=="number"&&n>0){let o=n<1e12?n*1e3:n;return new Date(o).toISOString()}}}}return l})();var E=class l{static buildGatewaySessionsFetch(y){let t=y.response._firstSessionKeys,s=Array.isArray(t)?t:[],e=Array.isArray(y.response.sessions)?y.response.sessions:[],n=e.map(i=>l.mapRawSessionToListItem({raw:i,gatewayUrl:y.response.gatewayUrl}));return{listItems:l.sortListItemsByLastActivityDesc({items:n}),rawSessions:e,gatewayUrl:y.response.gatewayUrl,source:y.response.source,instanceId:y.response.instanceId,firstSessionKeys:s}}static mapRawSessionToListItem(y){let t=y.raw;return{sessionId:typeof t.key=="string"?t.key:typeof t.sessionId=="string"?t.sessionId:typeof t.id=="string"?t.id:String(t.key??t.sessionId??t.id??""),label:typeof t.label=="string"?t.label:typeof t.name=="string"?t.name:typeof t.title=="string"?t.title:void 0,workspacePath:typeof t.workspacePath=="string"?t.workspacePath:typeof t.cwd=="string"?t.cwd:"",status:typeof t.status=="string"?t.status:"unknown",statusMessage:typeof t.statusMessage=="string"?t.statusMessage:void 0,gatewayUrl:y.gatewayUrl,openclawAgentName:typeof t.agentName=="string"?t.agentName:typeof t.agent=="string"?t.agent:void 0,promptCount:typeof t.promptCount=="number"?t.promptCount:typeof t.messageCount=="number"?t.messageCount:0,toolCallCount:typeof t.toolCallCount=="number"?t.toolCallCount:0,lastActivityAt:I.extractTimestamp(t,I.GATEWAY_SESSION_LAST_ACTIVITY_FIELD_NAMES),startedAt:I.extractTimestamp(t,I.GATEWAY_SESSION_STARTED_FIELD_NAMES),lastPrompt:typeof t.lastPrompt=="string"?t.lastPrompt:void 0,mode:typeof t.mode=="string"?t.mode:void 0,reasoningEffort:typeof t.reasoningEffort=="string"?t.reasoningEffort:typeof t.thinking=="string"?t.thinking:void 0,isArchived:typeof t.isArchived=="boolean"?t.isArchived:!1}}static sortListItemsByLastActivityDesc(y){return[...y.items].sort((t,s)=>{let e=t.lastActivityAt?new Date(t.lastActivityAt).getTime():0;return(s.lastActivityAt?new Date(s.lastActivityAt).getTime():0)-e})}};var N=(()=>{class l{baseUrl=`${D.api.baseUrl}/oc-session`;http=_(P);peiContext_DS=_(K);withCcapId(t){let s=this.peiContext_DS.activeCcapId_$();return s?t.set("ccapId",s):t}createSession(t){let s=this.withCcapId(new g);return d(this.http.post(this.baseUrl,t,{params:s}))}listSessions(t){let s=this.withCcapId(new g);return t?.status&&(s=s.set("status",t.status)),t?.workspacePath&&(s=s.set("workspacePath",t.workspacePath)),t?.gatewayUrl&&(s=s.set("gatewayUrl",t.gatewayUrl)),t?.includeArchived&&(s=s.set("includeArchived","1")),t?.limit!=null&&(s=s.set("limit",String(t.limit))),t?.offset!=null&&(s=s.set("offset",String(t.offset))),d(this.http.get(this.baseUrl,{params:s}))}listGatewaySessions(t){let s=new g().set("instanceId",t.instanceId);return d(this.http.get(`${this.baseUrl}/gateway-sessions`,{params:s}))}getGatewaySessionHistory(t){let s=new g().set("instanceId",t.instanceId);return d(this.http.get(`${this.baseUrl}/gateway-sessions/${t.sessionId}/history`,{params:s}))}sendGatewayPrompt(t){return d(this.http.post(`${this.baseUrl}/gateway-sessions/${t.sessionId}/send`,{instanceId:t.instanceId,content:t.content,agentName:t.agentName}))}abortGatewaySession(t){return d(this.http.post(`${this.baseUrl}/gateway-sessions/${t.sessionId}/abort`,{instanceId:t.instanceId}))}deleteGatewaySession(t){let s=new g().set("instanceId",t.instanceId);return d(this.http.delete(`${this.baseUrl}/gateway-sessions/${t.sessionId}`,{params:s}))}getSession(t){let s=this.withCcapId(new g);return d(this.http.get(`${this.baseUrl}/${t.sessionId}`,{params:s}))}sendPrompt(t){let s=this.withCcapId(new g);return d(this.http.post(`${this.baseUrl}/${t.sessionId}/prompt`,{content:t.content},{params:s}))}reconnectSession(t){let s=this.withCcapId(new g);return d(this.http.post(`${this.baseUrl}/${t.sessionId}/reconnect`,{},{params:s}))}stopExecution(t){let s=this.withCcapId(new g);return d(this.http.post(`${this.baseUrl}/${t.sessionId}/stop-execution`,{},{params:s}))}terminateSession(t){let s=this.withCcapId(new g);return d(this.http.post(`${this.baseUrl}/${t.sessionId}/terminate`,{},{params:s}))}updateSessionConfig(t){let o=t,{sessionId:s}=o,e=k(o,["sessionId"]),n=this.withCcapId(new g);return d(this.http.patch(`${this.baseUrl}/${s}/config`,e,{params:n}))}setSessionArchived(t){let s=this.withCcapId(new g);return d(this.http.patch(`${this.baseUrl}/${t.sessionId}/archive`,{isArchived:t.isArchived},{params:s}))}getSessionEvents(t){let s=this.withCcapId(new g);return t.eventType&&(s=s.set("eventType",t.eventType)),t.since&&(s=s.set("since",t.since)),t.sinceSequence!=null&&(s=s.set("sinceSequence",String(t.sinceSequence))),t.limit!=null&&(s=s.set("limit",String(t.limit))),t.offset!=null&&(s=s.set("offset",String(t.offset))),t.latest&&(s=s.set("latest","1")),d(this.http.get(`${this.baseUrl}/${t.sessionId}/events`,{params:s}))}getSessionEventStreamUrl(t){let s=`${this.baseUrl}/${t.sessionId}/events/stream`,e=this.peiContext_DS.activeCcapId_$();return e?`${s}?ccapId=${encodeURIComponent(e)}`:s}static \u0275fac=function(s){return new(s||l)};static \u0275prov=M({token:l,factory:l.\u0275fac,providedIn:"root"})}return l})();var lt=(()=>{class l{sessions_$=p([]);sessionsLoading_$=p(!1);sessionsLoadError_$=p(null);selectedSession_$=p(null);selectedSessionLoading_$=p(!1);selectedSessionEvents_$=p([]);consoleMessages_$=p([]);assembledMessages_$=p([]);lastStatusUpdate_$=p(null);sessionUsage_$=p({inputTokens:0,outputTokens:0,costUsd:0});activeSessionId_$=p("");activeInstanceId_$=p("");gatewayFilter_$=p(null);extSessionMsg_AS=_(G);ocSession_AS=_(N);globalError_CS=_(U);socket_CS=_(F);ngZone=_(L);eventSubscription=null;reconnectSubscription=null;lastKnownEventSequence=-1;chatPollHandle=null;detailPollHandle=null;lastPolledHistoryFingerprint="";constructor(){this.eventSubscription=this.socket_CS.event$.subscribe(t=>{this.handleSocketEvent(t)}),this.reconnectSubscription=this.socket_CS.connected$.subscribe(t=>{if(t){let s=this.activeSessionId_$();s&&(this.socket_CS.emit("oc-session:subscribe",{sessionId:s}),this.loadAssembledMessages({sessionId:s}).catch(()=>{})),this.backfillMissedEvents()}})}ngOnDestroy(){this.stopChatPolling(),this.eventSubscription&&(this.eventSubscription.unsubscribe(),this.eventSubscription=null),this.reconnectSubscription&&(this.reconnectSubscription.unsubscribe(),this.reconnectSubscription=null)}setGatewayFilter(t){this.gatewayFilter_$.set(t),this.loadSessions().catch(()=>{})}setGatewayFilterOnly(t){this.gatewayFilter_$.set(t)}loadSessions(t){return h(this,null,function*(){this.sessionsLoading_$.set(!0),this.sessionsLoadError_$.set(null);try{let e=[...(yield this.ocSession_AS.listSessions({status:t?.status,workspacePath:t?.workspacePath,gatewayUrl:this.gatewayFilter_$()??void 0,includeArchived:t?.includeArchived})).sessions].sort((n,o)=>{let i=n.lastActivityAt?new Date(n.lastActivityAt).getTime():0;return(o.lastActivityAt?new Date(o.lastActivityAt).getTime():0)-i});this.sessions_$.set(e)}catch(s){this.sessionsLoadError_$.set(s),this.pushConsoleMessage({type:"error",text:`Load sessions failed: ${f.getErrorMessageForDisplay(s)}`})}finally{this.sessionsLoading_$.set(!1)}})}fetchGatewaySessionsForInstance(t){return h(this,null,function*(){let s=yield this.ocSession_AS.listGatewaySessions({instanceId:t.instanceId});return E.buildGatewaySessionsFetch({response:s})})}loadGatewaySessions(t){return h(this,null,function*(){this.sessionsLoading_$.set(!0),this.sessionsLoadError_$.set(null);try{let s=yield this.fetchGatewaySessionsForInstance({instanceId:t.instanceId});!s.listItems.length&&s.rawSessions.length>0&&this.pushConsoleMessage({type:"error",text:`Gateway returned ${s.rawSessions.length} sessions but mapping produced 0.
|
|
2
|
-
First session keys: ${s.firstSessionKeys.join(", ")}`}),this.sessions_$.set(s.listItems)}catch(s){this.sessionsLoadError_$.set(s),this.pushConsoleMessage({type:"error",text:`Load gateway sessions failed: ${f.getErrorMessageForDisplay(s)}`})}finally{this.sessionsLoading_$.set(!1)}})}loadSessionDetail(t){return h(this,null,function*(){let s=t.isSilent===!0;s||this.selectedSessionLoading_$.set(!0);try{let e=yield this.ocSession_AS.getSession({sessionId:t.sessionId});this.selectedSession_$.set(e),this.loadAssembledMessages({sessionId:t.sessionId}).catch(()=>{})}catch(e){if(!s){this.selectedSession_$.set(null);let n=e instanceof Error?e.message:"Failed to load session details";this.pushConsoleMessage({type:"error",text:`Load session failed: ${n}`})}}finally{s||this.selectedSessionLoading_$.set(!1)}})}loadGatewaySessionHistory(t){return h(this,null,function*(){this.selectedSessionLoading_$.set(!0),this.consoleMessages_$.set([]);try{let s=yield this.ocSession_AS.getGatewaySessionHistory({sessionId:t.sessionId,instanceId:t.instanceId}),e=s,n=Array.isArray(e._rawKeys)?e._rawKeys:[],o=Array.isArray(s.history)?s.history:[],i=this.parseGatewayHistory(o),a=typeof e.messageCount=="number"?e.messageCount:0,r=Array.isArray(e._firstMessageKeys)?e._firstMessageKeys:[];i.length?this.consoleMessages_$.set(i):a>0?this.consoleMessages_$.set([{listKey:this.allocateConsoleListKey(),type:"error",text:`Gateway session has ${a} messages, but mapping failed.
|
|
3
|
-
Message keys: ${r.join(", ")||"unknown"}
|
|
4
|
-
Gateway response keys: ${n.join(", ")||"none"}`,timestamp:new Date().toISOString()}]):this.consoleMessages_$.set([{listKey:this.allocateConsoleListKey(),type:"info",text:"Gateway session loaded \u2014 session has no messages yet.",timestamp:new Date().toISOString()}]),this.selectedSession_$.set({session:{sessionId:t.sessionId,workspacePath:"",status:"unknown",promptCount:0,toolCallCount:0,isArchived:!1},runtime:{isLive:!1,runtimeStatus:null,outputBufferLength:0}}),this.lastPolledHistoryFingerprint=this.computeGatewayHistoryFingerprint(o),this.startChatPolling()}catch(s){this.selectedSession_$.set(null),this.pushConsoleMessage({type:"error",text:`Load gateway session history failed: ${f.getErrorMessageForDisplay(s)}`})}finally{this.selectedSessionLoading_$.set(!1)}})}loadSessionEvents(t){return h(this,null,function*(){try{let s=yield this.ocSession_AS.getSessionEvents({sessionId:t.sessionId,eventType:t.eventType,limit:t.limit??500,latest:!0});this.selectedSessionEvents_$.set(s.events),this.updateLastKnownSequence(s.events);for(let e of s.events)this.pushConsoleMessageFromEvent(e)}catch(s){this.selectedSessionEvents_$.set([]),this.pushConsoleMessage({type:"error",text:`Load events failed: ${f.getErrorMessageForDisplay(s)}`})}})}createSession(t){return h(this,null,function*(){try{let s=yield this.ocSession_AS.createSession(t),e=String(s.session.sessionId||"");return yield this.loadSessions(),e}catch(s){throw this.pushConsoleMessage({type:"error",text:`Create session failed: ${f.getErrorMessageForDisplay(s)}`}),s}})}sendPrompt(t){return h(this,null,function*(){this.pushConsoleMessage({type:"prompt",text:t.content});try{let s=this.activeInstanceId_$();s?yield this.ocSession_AS.sendGatewayPrompt({sessionId:t.sessionId,instanceId:s,content:t.content}):yield this.ocSession_AS.sendPrompt(t)}catch(s){throw this.pushConsoleMessage({type:"error",text:`Send failed: ${f.getErrorMessageForDisplay(s)}`}),s}})}reconnectSession(t){return h(this,null,function*(){try{yield this.ocSession_AS.reconnectSession(t),yield this.loadSessions()}catch(s){throw this.pushConsoleMessage({type:"error",text:`Reconnect failed: ${f.getErrorMessageForDisplay(s)}`}),s}})}stopExecution(t){return h(this,null,function*(){try{yield this.ocSession_AS.stopExecution(t)}catch(s){throw this.pushConsoleMessage({type:"error",text:`Stop execution failed: ${f.getErrorMessageForDisplay(s)}`}),s}})}terminateSession(t){return h(this,null,function*(){try{yield this.ocSession_AS.terminateSession(t),yield this.loadSessions()}catch(s){throw this.pushConsoleMessage({type:"error",text:`Terminate failed: ${f.getErrorMessageForDisplay(s)}`}),s}})}setSessionArchived(t){return h(this,null,function*(){try{yield this.ocSession_AS.setSessionArchived(t),yield this.loadSessions()}catch(s){throw this.pushConsoleMessage({type:"error",text:`Archive failed: ${f.getErrorMessageForDisplay(s)}`}),s}})}updateSessionConfig(t){return h(this,null,function*(){try{yield this.ocSession_AS.updateSessionConfig(t);let s=this.selectedSession_$();if(s?.session.sessionId===t.sessionId){let e=w({},s.session);t.mode!=null&&(e.mode=t.mode),t.reasoningEffort!=null&&(e.reasoningEffort=t.reasoningEffort),t.openclawAgentName!=null&&(e.openclawAgentName=t.openclawAgentName),this.selectedSession_$.set($(w({},s),{session:e}))}}catch(s){throw this.pushConsoleMessage({type:"error",text:`Config update failed: ${f.getErrorMessageForDisplay(s)}`}),s}})}setActiveSessionId(t){let s=this.activeSessionId_$();s&&s!==t&&this.socket_CS.emit("oc-session:unsubscribe",{sessionId:s}),this.activeSessionId_$.set(t),t&&this.socket_CS.emit("oc-session:subscribe",{sessionId:t})}clearLiveOutput(){this.stopChatPolling(),this.consoleMessages_$.set([]),this.sessionUsage_$.set({inputTokens:0,outputTokens:0,costUsd:0}),this.lastKnownEventSequence=-1}allocateConsoleListKey(){return globalThis.crypto.randomUUID()}pushConsoleMessage(t){let s=t.type==="assistant"||t.type==="prompt"?t.text.trim():t.text,e={listKey:t.listKey??this.allocateConsoleListKey(),type:t.type,text:s,timestamp:t.timestamp??new Date().toISOString(),expandableContent:t.expandableContent,rawData:t.rawData},n=this.consoleMessages_$();this.consoleMessages_$.set([...n,e])}static CHAT_POLL_INTERVAL_MS=5*C.second;static DETAIL_POLL_INTERVAL_MS=10*C.second;startChatPolling(){this.stopChatPolling(),this.chatPollHandle=setInterval(()=>{this.pollChatHistory()},l.CHAT_POLL_INTERVAL_MS),this.detailPollHandle=setInterval(()=>{let t=this.activeSessionId_$();t&&this.loadSessionDetail({sessionId:t,isSilent:!0})},l.DETAIL_POLL_INTERVAL_MS)}stopChatPolling(){this.chatPollHandle&&(clearInterval(this.chatPollHandle),this.chatPollHandle=null),this.detailPollHandle&&(clearInterval(this.detailPollHandle),this.detailPollHandle=null),this.lastPolledHistoryFingerprint=""}computeGatewayHistoryFingerprint(t){let s=t.length;if(!s)return"0";let e=t[s-1],n=typeof e.id=="string"?e.id:typeof e.messageId=="string"?e.messageId:"",o=l.extractGatewayChatMessageTimestamp(e),i=this.extractTextFromMessage(e),a=400,r=i.length>a?i.slice(0,a):i;return`${s}${n}${o}${r}`}pollChatHistory(){return h(this,null,function*(){let t=this.activeSessionId_$(),s=this.activeInstanceId_$();if(!(!t||!s))try{let e=yield this.ocSession_AS.getGatewaySessionHistory({sessionId:t,instanceId:s}),n=Array.isArray(e.history)?e.history:[],o=this.computeGatewayHistoryFingerprint(n);if(o===this.lastPolledHistoryFingerprint)return;this.lastPolledHistoryFingerprint=o;let i=this.parseGatewayHistory(n);this.ngZone.run(()=>{this.consoleMessages_$.set(i)})}catch{}})}parseGatewayHistory(t){let s=[],e=new Map,n=[];for(let i of t){let a=i.content;if(Array.isArray(a))for(let r of a){let u=typeof r.type=="string"?r.type:"";if(u==="tool_use"||u==="toolCall"){let S=typeof r.id=="string"?r.id:"";S&&n.push(S)}if(u==="tool_result"){let S=typeof r.tool_use_id=="string"?r.tool_use_id:"";S&&e.set(S,this.extractTextFromContentBlock(r))}}}let o=0;for(let i of t){let a=typeof i.role=="string"?i.role:"";if(a==="toolResult"||a==="tool_result"){let r=this.extractTextFromMessage(i);o<n.length&&(e.set(n[o],r),o++)}}for(let i of t){let a=typeof i.role=="string"?i.role:"unknown",r=i.content,u=l.extractGatewayChatMessageTimestamp(i);if(a==="toolResult"||a==="tool_result")continue;if(typeof r=="string"){s.push({listKey:this.allocateConsoleListKey(),type:a==="user"||a==="human"?"prompt":a==="assistant"?"assistant":"info",text:r,timestamp:u,rawData:i});continue}if(Array.isArray(r)){for(let c of r){let v=typeof c.type=="string"?c.type:"";if(v==="text")s.push({listKey:this.allocateConsoleListKey(),type:a==="user"||a==="human"?"prompt":"assistant",text:typeof c.text=="string"?c.text:"",timestamp:u,rawData:{_block:c,_message:{role:a,timestamp:u,contentBlockCount:r.length}}});else if(v==="tool_use"||v==="toolCall"){let b=typeof c.name=="string"?c.name:"unknown tool",T=typeof c.id=="string"?c.id:"",m=c.input??c.arguments,A=e.get(T);s.push({listKey:this.allocateConsoleListKey(),type:"tool",text:`${b}
|
|
5
|
-
${JSON.stringify(m,null,2)}`,timestamp:u,expandableContent:A,rawData:{_block:c,_pairedResultLength:A?.length??0}})}else if(v==="tool_result"){let b=typeof c.tool_use_id=="string"?c.tool_use_id:"";if(!(!!b&&[...s].some(m=>m.type==="tool"&&m.expandableContent===e.get(b)))){let m=c.content,A="";typeof m=="string"?A=m:Array.isArray(m)?A=m.map(x=>typeof x.text=="string"?x.text:JSON.stringify(x,null,2)).join(`
|
|
6
|
-
`):A=JSON.stringify(c,null,2),s.push({listKey:this.allocateConsoleListKey(),type:"tool-result",text:A,timestamp:u,rawData:{_block:c}})}}else v==="thinking"?s.push({listKey:this.allocateConsoleListKey(),type:"info",text:typeof c.thinking=="string"?c.thinking:JSON.stringify(c,null,2),timestamp:u,rawData:{_block:c}}):s.push({listKey:this.allocateConsoleListKey(),type:"info",text:JSON.stringify(c,null,2),timestamp:u,rawData:{_block:c}})}continue}let S=typeof i.text=="string"?i.text:typeof i.message=="string"?i.message:JSON.stringify(i,null,2);s.push({listKey:this.allocateConsoleListKey(),type:a==="user"||a==="human"?"prompt":a==="assistant"?"assistant":a==="tool"||a==="tool_result"||a==="tool_use"?"tool":"info",text:S,timestamp:u,rawData:i})}return s}backfillMissedEvents(){return h(this,null,function*(){let t=this.activeSessionId_$();if(!(!t||this.lastKnownEventSequence<0))try{let e=(yield this.ocSession_AS.getSessionEvents({sessionId:t,sinceSequence:this.lastKnownEventSequence})).events;if(!e.length)return;this.ngZone.run(()=>{let n=this.selectedSessionEvents_$();this.selectedSessionEvents_$.set([...n,...e]);for(let o of e)this.pushConsoleMessageFromEvent(o);this.updateLastKnownSequence(e)})}catch(s){C.DyFM_Log.warn("CCAP_OcSession_DS | backfill failed",s)}})}updateLastKnownSequence(t){for(let s of t)s.sequence>this.lastKnownEventSequence&&(this.lastKnownEventSequence=s.sequence)}handleSocketEvent(t){let s=t.event,e=t.payload;try{this.ngZone.run(()=>{switch(s){case"oc-session:status":this.handleStatusUpdate(e);break;case"oc-session:output":this.handleOutputChunk(e);break;case"oc-session:event":this.handleSessionEvent(e);break;case"oc-session:list-update":this.handleListUpdate(e);break;case"ext-session-msg:message":this.handleAssembledMessage(e);break;case"ext-session-msg:update":this.handleAssembledMessageUpdate(e);break}})}catch(n){C.DyFM_Log.error(`CCAP_OcSession_DS | socket event error | event: ${s}`,n)}}handleStatusUpdate(t){let s=t.sessionId??"",e=t.status??"",n=t.statusMessage;this.lastStatusUpdate_$.set({sessionId:s,status:e,statusMessage:n});let i=this.sessions_$().map(r=>r.sessionId===s?$(w({},r),{status:e,statusMessage:n}):r);this.sessions_$.set(i);let a=this.selectedSession_$();if(a?.session.sessionId===s){let r=e==="running"||e==="waiting-input";this.selectedSession_$.set($(w({},a),{session:$(w({},a.session),{status:e,statusMessage:n}),runtime:$(w({},a.runtime),{isLive:r,runtimeStatus:e})}))}if(e==="errored"){let r=n?`OC Session error (${s}): ${n}`:`OC Session error (${s}): session entered errored state`;this.globalError_CS.showError(new Error(r),"oc-session-status")}}handleOutputChunk(t){let s=t.sessionId??"";if(s&&s!==this.activeSessionId_$())return;let e=t.content??"",n=t.type??"response";e&&this.pushConsoleMessage({type:n==="error"?"error":"assistant",text:e})}handleSessionEvent(t){let s=t.sessionId??"";if(s&&s!==this.activeSessionId_$())return;let e=t.event??{},n={sessionId:s,eventType:e.eventType??"",timestamp:e.timestamp??"",data:e.data??{},sequence:e.sequence??0};if(n.sequence<=this.lastKnownEventSequence)return;this.lastKnownEventSequence=n.sequence;let o=this.selectedSessionEvents_$();this.selectedSessionEvents_$.set([...o,n]),this.pushConsoleMessageFromEvent(n)}handleListUpdate(t){this.loadSessions().catch(()=>{})}extractTextFromContentBlock(t){let s=t.content;return typeof s=="string"?s:Array.isArray(s)?s.map(e=>typeof e.text=="string"?e.text:JSON.stringify(e,null,2)).join(`
|
|
7
|
-
`):typeof t.text=="string"?t.text:JSON.stringify(t,null,2)}extractTextFromMessage(t){let s=t.content;return typeof s=="string"?s:Array.isArray(s)?s.map(e=>typeof e.text=="string"?e.text:JSON.stringify(e,null,2)).join(`
|
|
8
|
-
`):JSON.stringify(t,null,2)}pushConsoleMessageFromEvent(t){let s=t.data;switch(t.eventType){case"response-chunk":{let e=typeof s.content=="string"?s.content:"";e&&this.pushConsoleMessage({type:"assistant",text:e});break}case"response-complete":{let e=s.usage;if(e&&typeof e=="object"){let n=e,o=this.sessionUsage_$();this.sessionUsage_$.set({inputTokens:o.inputTokens+(typeof n.inputTokens=="number"?n.inputTokens:0),outputTokens:o.outputTokens+(typeof n.outputTokens=="number"?n.outputTokens:0),costUsd:o.costUsd+(typeof n.costUsd=="number"?n.costUsd:0)})}break}case"tool-call-start":{let e=typeof s.name=="string"?s.name:"unknown",n=s.input,o=n?this.summarizeToolInput(n):"",i=o?`${e}: ${o}`:e;this.pushConsoleMessage({type:"tool",text:i,rawData:s});break}case"tool-call-end":{let e=s.content??s.output,n=typeof e=="string"?e:JSON.stringify(e??{});this.pushConsoleMessage({type:"tool-result",text:n.length>200?n.substring(0,200)+"\u2026":n,expandableContent:n.length>200?n:void 0,rawData:s});break}case"error":{let e=s.message??s.content;typeof e=="string"&&e&&this.pushConsoleMessage({type:"error",text:e});break}case"connection-change":{let e=typeof s.state=="string"?s.state:"";e&&this.pushConsoleMessage({type:"info",text:`Gateway connection: ${e}`,rawData:s});break}default:break}}summarizeToolInput(t){if(typeof t=="string")return t.length>80?t.substring(0,80)+"\u2026":t;if(typeof t=="object"&&t!==null){let s=JSON.stringify(t);return s.length>80?s.substring(0,80)+"\u2026":s}return""}static extractGatewayChatMessageTimestamp(t){return I.extractTimestamp(t,I.GATEWAY_CHAT_MESSAGE_TIMESTAMP_FIELD_NAMES)??""}loadAssembledMessages(t){return h(this,null,function*(){try{let s=yield this.extSessionMsg_AS.getMessages({sessionId:t.sessionId,latest:!0});this.assembledMessages_$.set(s.messages)}catch(s){C.DyFM_Log.error(`CCAP_OcSession_DS | loadAssembledMessages failed | sessionId: ${t.sessionId}`,s)}})}handleAssembledMessage(t){let s=typeof t.sessionId=="string"?t.sessionId:"";if(!s||s!==this.activeSessionId_$())return;let e=t.message;if(!e||typeof e!="object")return;let n=e,o=this.assembledMessages_$();this.assembledMessages_$.set([...o,n])}handleAssembledMessageUpdate(t){let s=typeof t.sessionId=="string"?t.sessionId:"";if(!s||s!==this.activeSessionId_$())return;let e=typeof t.messageKey=="string"?t.messageKey:"";if(!e)return;let n=t.update;if(!n||typeof n!="object")return;let o=n,i=this.assembledMessages_$(),a=i.findIndex(S=>S.messageKey===e);if(a<0)return;let r=w({},i[a]);typeof o.bodyText=="string"&&(r.bodyText=o.bodyText),o.toolResult!==void 0&&(r.toolResult=o.toolResult),typeof o.toolStatus=="string"&&(r.toolStatus=o.toolStatus),o.headerStatusDot!==void 0&&(r.headerStatusDot=typeof o.headerStatusDot=="string"?o.headerStatusDot:void 0);let u=[...i];u[a]=r,this.assembledMessages_$.set(u)}static \u0275fac=function(s){return new(s||l)};static \u0275prov=M({token:l,factory:l.\u0275fac,providedIn:"root"})}return l})();export{I as a,lt as b};
|
|
9
|
-
//# sourceMappingURL=chunk-UEPFY6HU.js.map
|