@futdevpro/ccap 1.1.2647 → 1.1.2664
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/client-dist/{agent-instances.module-EGQYMBOE.js → agent-instances.module-5LMGBLHG.js} +2 -2
- package/client-dist/{ca.module-2OUXSIHQ.js → ca.module-QNXPMMLR.js} +2 -2
- package/client-dist/{cc.module-JCXO7FL6.js → cc.module-GSUEARLP.js} +2 -2
- package/client-dist/{chunk-SPM7FXGS.js → chunk-2B2DT7H4.js} +2 -2
- package/client-dist/{chunk-QZ2EDAB2.js → chunk-2LJ6P2AK.js} +2 -2
- package/client-dist/{chunk-PQW3OXU3.js → chunk-2TX25F5R.js} +2 -2
- package/client-dist/{chunk-HEHYSJ64.js → chunk-4CHICIRY.js} +2 -2
- package/client-dist/{chunk-HOZJPZQ7.js → chunk-5W2SNSR2.js} +2 -2
- package/client-dist/{chunk-5FKQ64SB.js → chunk-75ND5TDN.js} +2 -2
- package/client-dist/{chunk-CEGOU5G4.js → chunk-7766TXZC.js} +2 -2
- package/client-dist/{chunk-YVJUKZQF.js → chunk-BH533MQ7.js} +30 -30
- package/client-dist/{chunk-YVJUKZQF.js.map → chunk-BH533MQ7.js.map} +1 -1
- package/client-dist/{chunk-7FGFOXW6.js → chunk-C5BM6C25.js} +2 -2
- package/client-dist/{chunk-NFQGB6JS.js → chunk-DITUHWM3.js} +2 -2
- package/client-dist/{chunk-X7YW2QOP.js → chunk-EJGY2JJ3.js} +2 -2
- package/client-dist/{chunk-K2NXVUCK.js → chunk-EPXVJ4SI.js} +2 -2
- package/client-dist/{chunk-47FKCDJO.js → chunk-FRAVJOQH.js} +2 -2
- package/client-dist/{chunk-S53JH6BA.js → chunk-G6PIIKXR.js} +2 -2
- package/client-dist/{chunk-YK2OLA7Q.js → chunk-GGBLDITX.js} +2 -2
- package/client-dist/{chunk-OXV75CVW.js → chunk-GYPGNFXA.js} +2 -2
- package/client-dist/{chunk-IIHX3XEW.js → chunk-H7RIE7ZH.js} +2 -2
- package/client-dist/{chunk-4QLCH2TK.js → chunk-HIV5KAHS.js} +2 -2
- package/client-dist/{chunk-LGQZWF3R.js → chunk-HXIYS25S.js} +2 -2
- package/client-dist/{chunk-LGQZWF3R.js.map → chunk-HXIYS25S.js.map} +1 -1
- package/client-dist/{chunk-E64BNV5C.js → chunk-I7TKC7IM.js} +2 -2
- package/client-dist/{chunk-WUWBUDG5.js → chunk-IF3VAHEE.js} +2 -2
- package/client-dist/{chunk-KBWGQ3TY.js → chunk-J2VVV53B.js} +2 -2
- package/client-dist/{chunk-CJ75TYRV.js → chunk-JC7JAYRH.js} +2 -2
- package/client-dist/chunk-JC7JAYRH.js.map +7 -0
- package/client-dist/{chunk-4WWYKE5R.js → chunk-JTPE5RDY.js} +2 -2
- package/client-dist/{chunk-3DJAIZLW.js → chunk-JUE2TJJX.js} +2 -2
- package/client-dist/{chunk-IQVKKJYQ.js → chunk-K4ULXDTU.js} +2 -2
- package/client-dist/{chunk-PU2NH5SL.js → chunk-KTML2SKB.js} +2 -2
- package/client-dist/{chunk-WKS3TRBE.js → chunk-KUT6G2Y5.js} +2 -2
- package/client-dist/{chunk-2BUWIOZN.js → chunk-L2UQVU7R.js} +2 -2
- package/client-dist/{chunk-46ELDJSP.js → chunk-L3545XHT.js} +2 -2
- package/client-dist/{chunk-LAQCVFP2.js → chunk-L4GJGPJ4.js} +2 -2
- package/client-dist/{chunk-SLNDWLTH.js → chunk-LJMVKVPV.js} +2 -2
- package/client-dist/{chunk-WO3EMBOA.js → chunk-M3A6NBDV.js} +2 -2
- package/client-dist/{chunk-RKQF6PHI.js → chunk-M55U7NQJ.js} +2 -2
- package/client-dist/{chunk-JAAZ5KYU.js → chunk-MB2TSTPQ.js} +2 -2
- package/client-dist/{chunk-MYYTT234.js → chunk-MB5AQ7KN.js} +2 -2
- package/client-dist/{chunk-AJ3AZTZO.js → chunk-NXOUY2HD.js} +2 -2
- package/client-dist/{chunk-EED7EGQA.js → chunk-OYNMBASX.js} +2 -2
- package/client-dist/{chunk-XQBPX7OL.js → chunk-PHY5TBOC.js} +2 -2
- package/client-dist/{chunk-LEYVQLO2.js → chunk-Q6FBAX4H.js} +2 -2
- package/client-dist/{chunk-DCQBG3KX.js → chunk-RCM4LF75.js} +2 -2
- package/client-dist/{chunk-OLNOLUXB.js → chunk-SAPVYCII.js} +2 -2
- package/client-dist/{chunk-HN6ROE5O.js → chunk-SHLAMFEV.js} +2 -2
- package/client-dist/{chunk-6XQZFSF3.js → chunk-ST45PTSW.js} +2 -2
- package/client-dist/{chunk-PWYHLYRO.js → chunk-SZETQILG.js} +2 -2
- package/client-dist/{chunk-K5EOS2WQ.js → chunk-T7FJMECA.js} +2 -2
- package/client-dist/{chunk-HDG3MWCJ.js → chunk-TIWRSO7F.js} +2 -2
- package/client-dist/{chunk-UGVFPJLP.js → chunk-TNNCAKLB.js} +2 -2
- package/client-dist/{chunk-RJCIHLA6.js → chunk-TR6UAFKZ.js} +2 -2
- package/client-dist/{chunk-UAD2KWJZ.js → chunk-UVAR2CXV.js} +2 -2
- package/client-dist/{chunk-HARQKJRJ.js → chunk-WOEH6WZ4.js} +2 -2
- package/client-dist/{chunk-2G5ES6HE.js → chunk-XBSMG2PH.js} +2 -2
- package/client-dist/{chunk-7ZMLSK7Q.js → chunk-XNWK54SF.js} +2 -2
- package/client-dist/{chunk-55IXUSX3.js → chunk-XTPEUIXQ.js} +2 -2
- package/client-dist/{chunk-W7RIWFY4.js → chunk-Z3AVHATN.js} +2 -2
- package/client-dist/{chunk-UVHROEWI.js → chunk-ZV5GBLRZ.js} +2 -2
- package/client-dist/{consultant.module-3JM6XMZN.js → consultant.module-XKRH4HPW.js} +2 -2
- package/client-dist/{crd.module-ROSAJOCO.js → crd.module-Q45GQGSF.js} +2 -2
- package/client-dist/{dashboard.module-UT6C6BV4.js → dashboard.module-BZP52FGU.js} +2 -2
- package/client-dist/do.module-Z77FFEIL.js +18 -0
- package/client-dist/{do.module-5GGJB6MY.js.map → do.module-Z77FFEIL.js.map} +3 -3
- package/client-dist/{document-library.module-NSXQOMRZ.js → document-library.module-HTSIVG6C.js} +2 -2
- package/client-dist/{embedding-eval.module-52WRXUS2.js → embedding-eval.module-MFWA6YFZ.js} +2 -2
- package/client-dist/{embedding-registry.module-2BL3BC2W.js → embedding-registry.module-XXMDVGBW.js} +2 -2
- package/client-dist/{err.module-PPCGASEW.js → err.module-ID4VHP5U.js} +2 -2
- package/client-dist/{feedback.module-RLH7CMXG.js → feedback.module-HVPPSW4Q.js} +2 -2
- package/client-dist/{host-runtime-mcp.module-PLAGWRYP.js → host-runtime-mcp.module-NKFBTP5M.js} +2 -2
- package/client-dist/index.html +1 -1
- package/client-dist/{live-dev-pipeline.module-CUDGFH2Q.js → live-dev-pipeline.module-CEFMGZC7.js} +2 -2
- package/client-dist/{logs.module-IVX5YWRA.js → logs.module-KCFNIUTW.js} +2 -2
- package/client-dist/{main-Q66CUC37.js → main-YY4XANLB.js} +3 -3
- package/client-dist/{master-control-remote-poc.module-YWGPDUCR.js → master-control-remote-poc.module-7IYI22CZ.js} +2 -2
- package/client-dist/{mobile-app.module-VVEX6ROU.js → mobile-app.module-6IS75ZHZ.js} +2 -2
- package/client-dist/{model-registry.module-4YSB2ENL.js → model-registry.module-ZVFJS4MN.js} +2 -2
- package/client-dist/{oc.module-FYJ3RXAG.js → oc.module-V7IUAZAL.js} +2 -2
- package/client-dist/{orc.module-BBZ4G663.js → orc.module-74XB3A46.js} +2 -2
- package/client-dist/{project-management.module-TAMQ5ZJJ.js → project-management.module-MIBFP4RJ.js} +2 -2
- package/client-dist/project-source-routed.module-KPWJRSEP.js +2 -0
- package/client-dist/{scheduler.module-7DGAFOGG.js → scheduler.module-TYLSCGVI.js} +2 -2
- package/client-dist/{session.module-7F66V6EM.js → session.module-ZOLGV66Q.js} +2 -2
- package/client-dist/{set.module-25PQVMQ3.js → set.module-YWJIQ2QI.js} +2 -2
- package/client-dist/{setup.module-CSEXHUBH.js → setup.module-VWFCC6SN.js} +2 -2
- package/client-dist/{terminals.module-K2VQOIHU.js → terminals.module-BSQXFZLE.js} +2 -2
- package/client-dist/{voice-notes-poc.module-ODHPO46H.js → voice-notes-poc.module-7ULLZYEB.js} +2 -2
- package/client-dist/{wfs.module-BFV3U5HH.js → wfs.module-XWRAWS3G.js} +2 -2
- package/package.json +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_collections/utils/lifecycle/cc-process-exit.util.d.ts +36 -4
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_collections/utils/lifecycle/cc-process-exit.util.d.ts.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_collections/utils/lifecycle/cc-process-exit.util.js +64 -4
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_collections/utils/lifecycle/cc-process-exit.util.js.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_collections/utils/lifecycle/cc-process-exit.util.spec.js +102 -0
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_collections/utils/lifecycle/cc-process-exit.util.spec.js.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/cc-rate-limit-state.data-service.d.ts.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/cc-rate-limit-state.data-service.js +50 -0
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/cc-rate-limit-state.data-service.js.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/cc-route.control-service.d.ts.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/cc-route.control-service.js +22 -0
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/cc-route.control-service.js.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/status/cc-status-transition.control-service.d.ts.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/status/cc-status-transition.control-service.js +31 -0
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/status/cc-status-transition.control-service.js.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/terminal/cc-adapter-terminal.control-service.d.ts +14 -22
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/terminal/cc-adapter-terminal.control-service.d.ts.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/terminal/cc-adapter-terminal.control-service.js +212 -29
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/terminal/cc-adapter-terminal.control-service.js.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/terminal/cc-terminal-lifecycle.control-service.d.ts.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/terminal/cc-terminal-lifecycle.control-service.js +34 -0
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/terminal/cc-terminal-lifecycle.control-service.js.map +1 -1
- package/client-dist/chunk-CJ75TYRV.js.map +0 -7
- package/client-dist/do.module-5GGJB6MY.js +0 -18
- package/client-dist/project-source-routed.module-N6XCQ5BZ.js +0 -2
- /package/client-dist/{agent-instances.module-EGQYMBOE.js.map → agent-instances.module-5LMGBLHG.js.map} +0 -0
- /package/client-dist/{ca.module-2OUXSIHQ.js.map → ca.module-QNXPMMLR.js.map} +0 -0
- /package/client-dist/{cc.module-JCXO7FL6.js.map → cc.module-GSUEARLP.js.map} +0 -0
- /package/client-dist/{chunk-SPM7FXGS.js.map → chunk-2B2DT7H4.js.map} +0 -0
- /package/client-dist/{chunk-QZ2EDAB2.js.map → chunk-2LJ6P2AK.js.map} +0 -0
- /package/client-dist/{chunk-PQW3OXU3.js.map → chunk-2TX25F5R.js.map} +0 -0
- /package/client-dist/{chunk-HEHYSJ64.js.map → chunk-4CHICIRY.js.map} +0 -0
- /package/client-dist/{chunk-HOZJPZQ7.js.map → chunk-5W2SNSR2.js.map} +0 -0
- /package/client-dist/{chunk-5FKQ64SB.js.map → chunk-75ND5TDN.js.map} +0 -0
- /package/client-dist/{chunk-CEGOU5G4.js.map → chunk-7766TXZC.js.map} +0 -0
- /package/client-dist/{chunk-7FGFOXW6.js.map → chunk-C5BM6C25.js.map} +0 -0
- /package/client-dist/{chunk-NFQGB6JS.js.map → chunk-DITUHWM3.js.map} +0 -0
- /package/client-dist/{chunk-X7YW2QOP.js.map → chunk-EJGY2JJ3.js.map} +0 -0
- /package/client-dist/{chunk-K2NXVUCK.js.map → chunk-EPXVJ4SI.js.map} +0 -0
- /package/client-dist/{chunk-47FKCDJO.js.map → chunk-FRAVJOQH.js.map} +0 -0
- /package/client-dist/{chunk-S53JH6BA.js.map → chunk-G6PIIKXR.js.map} +0 -0
- /package/client-dist/{chunk-YK2OLA7Q.js.map → chunk-GGBLDITX.js.map} +0 -0
- /package/client-dist/{chunk-OXV75CVW.js.map → chunk-GYPGNFXA.js.map} +0 -0
- /package/client-dist/{chunk-IIHX3XEW.js.map → chunk-H7RIE7ZH.js.map} +0 -0
- /package/client-dist/{chunk-4QLCH2TK.js.map → chunk-HIV5KAHS.js.map} +0 -0
- /package/client-dist/{chunk-E64BNV5C.js.map → chunk-I7TKC7IM.js.map} +0 -0
- /package/client-dist/{chunk-WUWBUDG5.js.map → chunk-IF3VAHEE.js.map} +0 -0
- /package/client-dist/{chunk-KBWGQ3TY.js.map → chunk-J2VVV53B.js.map} +0 -0
- /package/client-dist/{chunk-4WWYKE5R.js.map → chunk-JTPE5RDY.js.map} +0 -0
- /package/client-dist/{chunk-3DJAIZLW.js.map → chunk-JUE2TJJX.js.map} +0 -0
- /package/client-dist/{chunk-IQVKKJYQ.js.map → chunk-K4ULXDTU.js.map} +0 -0
- /package/client-dist/{chunk-PU2NH5SL.js.map → chunk-KTML2SKB.js.map} +0 -0
- /package/client-dist/{chunk-WKS3TRBE.js.map → chunk-KUT6G2Y5.js.map} +0 -0
- /package/client-dist/{chunk-2BUWIOZN.js.map → chunk-L2UQVU7R.js.map} +0 -0
- /package/client-dist/{chunk-46ELDJSP.js.map → chunk-L3545XHT.js.map} +0 -0
- /package/client-dist/{chunk-LAQCVFP2.js.map → chunk-L4GJGPJ4.js.map} +0 -0
- /package/client-dist/{chunk-SLNDWLTH.js.map → chunk-LJMVKVPV.js.map} +0 -0
- /package/client-dist/{chunk-WO3EMBOA.js.map → chunk-M3A6NBDV.js.map} +0 -0
- /package/client-dist/{chunk-RKQF6PHI.js.map → chunk-M55U7NQJ.js.map} +0 -0
- /package/client-dist/{chunk-JAAZ5KYU.js.map → chunk-MB2TSTPQ.js.map} +0 -0
- /package/client-dist/{chunk-MYYTT234.js.map → chunk-MB5AQ7KN.js.map} +0 -0
- /package/client-dist/{chunk-AJ3AZTZO.js.map → chunk-NXOUY2HD.js.map} +0 -0
- /package/client-dist/{chunk-EED7EGQA.js.map → chunk-OYNMBASX.js.map} +0 -0
- /package/client-dist/{chunk-XQBPX7OL.js.map → chunk-PHY5TBOC.js.map} +0 -0
- /package/client-dist/{chunk-LEYVQLO2.js.map → chunk-Q6FBAX4H.js.map} +0 -0
- /package/client-dist/{chunk-DCQBG3KX.js.map → chunk-RCM4LF75.js.map} +0 -0
- /package/client-dist/{chunk-OLNOLUXB.js.map → chunk-SAPVYCII.js.map} +0 -0
- /package/client-dist/{chunk-HN6ROE5O.js.map → chunk-SHLAMFEV.js.map} +0 -0
- /package/client-dist/{chunk-6XQZFSF3.js.map → chunk-ST45PTSW.js.map} +0 -0
- /package/client-dist/{chunk-PWYHLYRO.js.map → chunk-SZETQILG.js.map} +0 -0
- /package/client-dist/{chunk-K5EOS2WQ.js.map → chunk-T7FJMECA.js.map} +0 -0
- /package/client-dist/{chunk-HDG3MWCJ.js.map → chunk-TIWRSO7F.js.map} +0 -0
- /package/client-dist/{chunk-UGVFPJLP.js.map → chunk-TNNCAKLB.js.map} +0 -0
- /package/client-dist/{chunk-RJCIHLA6.js.map → chunk-TR6UAFKZ.js.map} +0 -0
- /package/client-dist/{chunk-UAD2KWJZ.js.map → chunk-UVAR2CXV.js.map} +0 -0
- /package/client-dist/{chunk-HARQKJRJ.js.map → chunk-WOEH6WZ4.js.map} +0 -0
- /package/client-dist/{chunk-2G5ES6HE.js.map → chunk-XBSMG2PH.js.map} +0 -0
- /package/client-dist/{chunk-7ZMLSK7Q.js.map → chunk-XNWK54SF.js.map} +0 -0
- /package/client-dist/{chunk-55IXUSX3.js.map → chunk-XTPEUIXQ.js.map} +0 -0
- /package/client-dist/{chunk-W7RIWFY4.js.map → chunk-Z3AVHATN.js.map} +0 -0
- /package/client-dist/{chunk-UVHROEWI.js.map → chunk-ZV5GBLRZ.js.map} +0 -0
- /package/client-dist/{consultant.module-3JM6XMZN.js.map → consultant.module-XKRH4HPW.js.map} +0 -0
- /package/client-dist/{crd.module-ROSAJOCO.js.map → crd.module-Q45GQGSF.js.map} +0 -0
- /package/client-dist/{dashboard.module-UT6C6BV4.js.map → dashboard.module-BZP52FGU.js.map} +0 -0
- /package/client-dist/{document-library.module-NSXQOMRZ.js.map → document-library.module-HTSIVG6C.js.map} +0 -0
- /package/client-dist/{embedding-eval.module-52WRXUS2.js.map → embedding-eval.module-MFWA6YFZ.js.map} +0 -0
- /package/client-dist/{embedding-registry.module-2BL3BC2W.js.map → embedding-registry.module-XXMDVGBW.js.map} +0 -0
- /package/client-dist/{err.module-PPCGASEW.js.map → err.module-ID4VHP5U.js.map} +0 -0
- /package/client-dist/{feedback.module-RLH7CMXG.js.map → feedback.module-HVPPSW4Q.js.map} +0 -0
- /package/client-dist/{host-runtime-mcp.module-PLAGWRYP.js.map → host-runtime-mcp.module-NKFBTP5M.js.map} +0 -0
- /package/client-dist/{live-dev-pipeline.module-CUDGFH2Q.js.map → live-dev-pipeline.module-CEFMGZC7.js.map} +0 -0
- /package/client-dist/{logs.module-IVX5YWRA.js.map → logs.module-KCFNIUTW.js.map} +0 -0
- /package/client-dist/{main-Q66CUC37.js.map → main-YY4XANLB.js.map} +0 -0
- /package/client-dist/{master-control-remote-poc.module-YWGPDUCR.js.map → master-control-remote-poc.module-7IYI22CZ.js.map} +0 -0
- /package/client-dist/{mobile-app.module-VVEX6ROU.js.map → mobile-app.module-6IS75ZHZ.js.map} +0 -0
- /package/client-dist/{model-registry.module-4YSB2ENL.js.map → model-registry.module-ZVFJS4MN.js.map} +0 -0
- /package/client-dist/{oc.module-FYJ3RXAG.js.map → oc.module-V7IUAZAL.js.map} +0 -0
- /package/client-dist/{orc.module-BBZ4G663.js.map → orc.module-74XB3A46.js.map} +0 -0
- /package/client-dist/{project-management.module-TAMQ5ZJJ.js.map → project-management.module-MIBFP4RJ.js.map} +0 -0
- /package/client-dist/{project-source-routed.module-N6XCQ5BZ.js.map → project-source-routed.module-KPWJRSEP.js.map} +0 -0
- /package/client-dist/{scheduler.module-7DGAFOGG.js.map → scheduler.module-TYLSCGVI.js.map} +0 -0
- /package/client-dist/{session.module-7F66V6EM.js.map → session.module-ZOLGV66Q.js.map} +0 -0
- /package/client-dist/{set.module-25PQVMQ3.js.map → set.module-YWJIQ2QI.js.map} +0 -0
- /package/client-dist/{setup.module-CSEXHUBH.js.map → setup.module-VWFCC6SN.js.map} +0 -0
- /package/client-dist/{terminals.module-K2VQOIHU.js.map → terminals.module-BSQXFZLE.js.map} +0 -0
- /package/client-dist/{voice-notes-poc.module-ODHPO46H.js.map → voice-notes-poc.module-7ULLZYEB.js.map} +0 -0
- /package/client-dist/{wfs.module-BFV3U5HH.js.map → wfs.module-XWRAWS3G.js.map} +0 -0
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["src/app/_enums/dark-office/do-character-anim.enum.ts", "src/app/_enums/dark-office/do-character-scene-placement.enum.ts", "src/app/_enums/dark-office/do-character-type.enum.ts", "src/app/_enums/dark-office/do-body-type.enum.ts", "src/app/_enums/dark-office/do-clothing-style.enum.ts", "src/app/_enums/dark-office/do-hair-style.enum.ts", "src/app/_modules/dark-office/_collections/consts/do-character-defaults.const.ts", "src/app/_modules/dark-office/_collections/utils/do-cai-office-instance-id.util.ts", "src/app/_modules/dark-office/_collections/utils/do-cci-office-instance-id.util.ts", "src/app/_modules/dark-office/_collections/utils/do-office-layout/do-office-layout-geometry.util.ts", "src/app/_modules/dark-office/_services/do-layout.data-service.ts", "src/app/_modules/dark-office/_services/dark-office.data-service.ts", "src/app/_modules/external-sessions/_modules/openclaw/_enums/oc-oci-connection-status.enum.ts", "src/app/_modules/dark-office/_collections/instance-status/do-office-session-primary-pick.util.ts", "src/app/_modules/dark-office/_collections/instance-status/do-oci-session-primary-pick.util.ts", "src/app/_collections/dark-office/ccap-dark-office-agent-output-working-window.const.ts", "src/app/_modules/dark-office/_collections/instance-status/do-oci-gateway/do-oci-gateway-to-session-statuses.util.ts", "src/app/_modules/external-sessions/_modules/cursor-acp/_enums/ca-status.enum.ts", "src/app/_modules/dark-office/_collections/instance-status/utils/do-instance-status-detail/do-instance-tracker-session-statuses-prune.util.ts", "src/app/_modules/dark-office/_collections/instance-status/utils/do-instance-status-detail/do-instance-status-modal-session-source.util.ts", "src/app/_modules/dark-office/_collections/scene/do-panel-card/do-panel-card-projection.util.ts", "src/app/_modules/dark-office/_collections/scene/do-scene-session-eligibility.util.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Dark Office karakter animáció állapotok.\n */\nexport enum DO_CharacterAnim_Type {\n /** Álló alap póz (megérkezés után, mielőtt leülne). */\n standing = 'standing',\n /** Munkaállomásnál dolgozik (typing animáció). */\n working = 'working',\n /** Pihenőben ül (couch/sofa). */\n sitting = 'sitting',\n /** Bejáratón besétál (enter → slot irányba). */\n walkingIn = 'walking-in',\n /** Bejáratón kisétál (slot → door irányba). */\n walkingOut = 'walking-out',\n /** Slotok között sétál (idle↔working átmenet, nincs door pozíció). */\n walkingBetween = 'walking-between',\n /**\n * Idle-walking steady state (REQ-DO-CHAR-IDLE-WALK-001) — működő-után-idle session karakter,\n * folyamatos láb-/karkmozgás amíg a session a 15 perces idle-walk ablakban van; nincs setTimeout\n * tranzíció (a komponens nem megy át sitting-be), így a karakter „még itt vagyok, de nincs\n * feladat\" átmeneti fázisban látszik.\n */\n idleWalking = 'idle-walking',\n}\n", "/**\n * Dark Office scene: karakter elhelyezési zóna (slot tömb és SVG pozíció választás).\n */\nexport enum DO_CharacterScenePlacement_Type {\n /** Munkaállomás slotok (working presence). */\n workstation = 'workstation',\n /** Lounge / pihenő slotok (idle, fő iroda). */\n rest = 'rest',\n /** Meeting Room — bal alsó zóna (pl. working → idle átmenet után rövid ideig). */\n meeting = 'meeting',\n}\n", "/**\n * Dark Office karakter típus discriminator.\n *\n * A `DO_OfficeInstanceState_Interface` `characterType` mezőjében használjuk:\n * - `ccap` — rendszer saját CCAP instance (default vizuálok, nincs badge)\n * - `openclaw` — OpenClaw gateway instance (robot vizuál séma, „OC\" badge)\n * - `ccSession` — CC Session instance sor (Claude Code session tracker, „CC\" badge)\n * - `caSession` — CA Session instance sor (Cursor ACP mirror tracker, „CA\" badge)\n */\nexport enum DO_CharacterType_Type {\n /** CCAP instance karakter (default). */\n ccap = 'ccap',\n /** OpenClaw instance karakter (robot vizuál, „OC\" badge). */\n openclaw = 'openclaw',\n /** CC Session instance tracker karakter („CC\" badge). */\n ccSession = 'cc-session',\n /** CA Session instance tracker karakter („CA\" badge). */\n caSession = 'ca-session',\n}\n", "/**\n * Dark Office karakter testtípusok.\n */\nexport enum DO_BodyType_Type {\n average = 'average',\n slim = 'slim',\n stocky = 'stocky',\n athletic = 'athletic',\n}\n", "/**\n * Dark Office karakter ruha stílusok.\n */\nexport enum DO_ClothingStyle_Type {\n casual = 'casual',\n formal = 'formal',\n hoodie = 'hoodie',\n tshirt = 'tshirt',\n}\n", "/**\n * Dark Office karakter hajstílusok.\n */\nexport enum DO_HairStyle_Type {\n short = 'short',\n long = 'long',\n spiky = 'spiky',\n curly = 'curly',\n bald = 'bald',\n mohawk = 'mohawk',\n}\n", "import { DO_BodyType_Type } from '../../../../_enums/dark-office/do-body-type.enum';\nimport { DO_ClothingStyle_Type } from '../../../../_enums/dark-office/do-clothing-style.enum';\nimport { DO_HairStyle_Type } from '../../../../_enums/dark-office/do-hair-style.enum';\nimport { DO_CharacterVisuals_Response } from '../../../../_models/interfaces/dark-office/do-character-visuals.interface';\n\n/** Elérhető bőrszínek (7 árnyalat). */\nexport const DO_SKIN_COLORS: string[] = [\n '#f5c592', '#e8a96e', '#d4845a', '#c06a3c', '#9b5930', '#7a3d1c', '#4a2412',\n];\n\n/** Elérhető hajszínek (10 szín). */\nexport const DO_HAIR_COLORS: string[] = [\n '#1a1006', '#3b2505', '#6b3d11', '#9b6720', '#c9a227',\n '#e8d5a3', '#f0f0f0', '#a0a0a0', '#2a4080', '#8b1a2a',\n];\n\n/** Elérhető ingszínek (13 szín). */\nexport const DO_SHIRT_COLORS: string[] = [\n '#1e40af', '#166534', '#7f1d1d', '#4c1d95', '#134e4a',\n '#713f12', '#374151', '#6b21a8', '#0f766e', '#1e3a5f',\n '#b45309', '#be185d', '#475569',\n];\n\n/** Elérhető nadrágszínek (8 szín). */\nexport const DO_PANTS_COLORS: string[] = [\n '#1e293b', '#374151', '#292524', '#1e3a5f', '#1a2e05', '#2d1b69', '#3b1a08', '#1a1a2e',\n];\n\n/** Elérhető szemszínek (6 szín). */\nexport const DO_EYE_COLORS: string[] = [\n '#1a1a1a', '#3b5998', '#2d8a4e', '#8b4513', '#4b0082', '#5f9ea0',\n];\n\n/**\n * Alapértelmezett karakter vizuál beállítások.\n * Ha az instance-nak nincs mentett beállítása, ezt használja.\n */\nexport const DO_DEFAULT_CHARACTER_VISUALS: DO_CharacterVisuals_Response = {\n skinColor: '#e8a96e',\n hairColor: '#1a1006',\n hairStyle: DO_HairStyle_Type.short,\n shirtColor: '#1e40af',\n clothingStyle: DO_ClothingStyle_Type.casual,\n pantsColor: '#1e293b',\n eyeColor: '#1a1a1a',\n bodyType: DO_BodyType_Type.average,\n displayName: '',\n};\n\n/**\n * Alapértelmezett karakter vizuál beállítások OpenClaw instance-okhoz.\n * Robot/bot vizuál séma: fémes bőr, techno outfit, cián szemek.\n */\nexport const DO_OCI_DEFAULT_CHARACTER_VISUALS: DO_CharacterVisuals_Response = {\n skinColor: '#b0bec5',\n hairColor: '#37474f',\n hairStyle: DO_HairStyle_Type.short,\n shirtColor: '#0288d1',\n clothingStyle: DO_ClothingStyle_Type.tshirt,\n pantsColor: '#263238',\n eyeColor: '#00bcd4',\n bodyType: DO_BodyType_Type.average,\n displayName: '',\n};\n\n/**\n * Alapértelmezett vizuál CCI (CC Session instance) sorokhoz — megkülönböztethető az OC robot-stílustól.\n */\nexport const DO_CCI_DEFAULT_CHARACTER_VISUALS: DO_CharacterVisuals_Response = {\n skinColor: '#d4c4a8',\n hairColor: '#2d1b0e',\n hairStyle: DO_HairStyle_Type.short,\n shirtColor: '#5b21b6',\n clothingStyle: DO_ClothingStyle_Type.casual,\n pantsColor: '#312e81',\n eyeColor: '#4338ca',\n bodyType: DO_BodyType_Type.average,\n displayName: '',\n};\n\n/**\n * Alapértelmezett vizuál CAI (CA Session instance) sorokhoz — megkülönböztethető a CC és OC stílustól.\n */\nexport const DO_CAI_DEFAULT_CHARACTER_VISUALS: DO_CharacterVisuals_Response = {\n skinColor: '#e2e8f0',\n hairColor: '#0f172a',\n hairStyle: DO_HairStyle_Type.short,\n shirtColor: '#0d9488',\n clothingStyle: DO_ClothingStyle_Type.casual,\n pantsColor: '#134e4a',\n eyeColor: '#14b8a6',\n bodyType: DO_BodyType_Type.average,\n displayName: '',\n};\n\n/**\n * localStorage kulcs prefix karakter vizuál beállításokhoz.\n * Teljes kulcs: `${DO_VISUALS_STORAGE_KEY_PREFIX}${instanceId}`\n */\nexport const DO_VISUALS_STORAGE_KEY_PREFIX: string = 'do_char_visuals_';\n\n/**\n * Polling intervallum (másodpercben): ennyi ideig vár az animáció befejezéséig\n * mielőtt frissíti a presence-t.\n */\nexport const DO_WALK_ANIMATION_DURATION_MS: number = 2000;\n", "/**\n * Dark Office `instanceId` építés CAI (CA Session instance) sorokhoz — egyezik a szerver prefix-szel.\n */\nexport class DO_CaiOfficeInstanceId_Util {\n\n /** Prefix + `ccapId` = egyedi office kulcs (nem ütközik a nyers `ccapId` CCAP karakterrel). */\n static readonly officeInstanceIdPrefix: string = 'cai:';\n\n /**\n * Office instance azonosító számítása.\n */\n static build(params: { ccapId: string }): string {\n return `${DO_CaiOfficeInstanceId_Util.officeInstanceIdPrefix}${params.ccapId.trim()}`;\n }\n\n /**\n * `cai:…` kulcsból `ccapId` kinyerése; ha nem CAI kulcs, null.\n */\n static parseCcapId(officeInstanceId: string): string | null {\n const p: string = officeInstanceId.trim();\n if (!p.startsWith(DO_CaiOfficeInstanceId_Util.officeInstanceIdPrefix)) {\n return null;\n }\n const rest: string = p.slice(DO_CaiOfficeInstanceId_Util.officeInstanceIdPrefix.length).trim();\n\n return rest.length > 0 ? rest : null;\n }\n}\n", "/**\n * Dark Office `instanceId` építés CCI (CC Session instance) sorokhoz — egyezik a szerver prefix-szel.\n */\nexport class DO_CciOfficeInstanceId_Util {\n\n /** Prefix + `ccapId` = egyedi office kulcs (nem ütközik a nyers `ccapId` CCAP karakterrel). */\n static readonly officeInstanceIdPrefix: string = 'cci:';\n\n /**\n * Office instance azonosító számítása.\n */\n static build(params: { ccapId: string }): string {\n return `${DO_CciOfficeInstanceId_Util.officeInstanceIdPrefix}${params.ccapId.trim()}`;\n }\n\n /**\n * `cci:…` kulcsból `ccapId` kinyerése; ha nem CCI kulcs, null.\n */\n static parseCcapId(officeInstanceId: string): string | null {\n const p: string = officeInstanceId.trim();\n if (!p.startsWith(DO_CciOfficeInstanceId_Util.officeInstanceIdPrefix)) {\n return null;\n }\n const rest: string = p.slice(DO_CciOfficeInstanceId_Util.officeInstanceIdPrefix.length).trim();\n\n return rest.length > 0 ? rest : null;\n }\n}\n", "import { DO_SvgSlot_Interface } from '../../consts/do-svg-slots.const';\nimport {\n DO_OfficeConferenceChairDescriptor_Interface,\n DO_OfficeConferenceFurniture_Interface,\n DO_OfficeDeskDescriptor_Interface,\n DO_OfficeLayoutDerived_Interface,\n DO_OfficeLayoutRect_Interface,\n DO_OfficeSofaDescriptor_Interface,\n} from '../../do-office-layout/do-office-layout-derived.interface';\nimport { DO_OfficeLayoutGrid_Interface } from '../../do-office-layout/do-office-layout-grid.interface';\n\n/** Egy tile mérete — megegyezik a legacy `DO_TILE`-lal. */\nconst TILE: number = 32;\n\n/** Minimum / maximum rács (REQ-DO-LAYOUT-006). */\nconst GRID_MIN: number = 1;\nconst GRID_MAX: number = 12;\n\n/** Lobby vízszintes sáv workspace és lounge között (tile) — szélesebb, bejárat ide kerül. */\nconst LOBBY_W_TILES: number = 6;\n\n/**\n * Dark Office layout geometria — tiszta függvények a rácsból SVG deriváltak számításához.\n * A slot overflow pozíciókat a `do-svg-char` komponens továbbra is kiszámolhatja;\n * itt csak a „belátható” slot tömbök és a jelenet méretei készülnek.\n */\nexport class DO_OfficeLayoutGeometry_Util {\n\n /**\n * Rács paraméterek clamp-elése implementációs plafon szerint.\n */\n static clampGrid(grid: DO_OfficeLayoutGrid_Interface): DO_OfficeLayoutGrid_Interface {\n return {\n workstationCols: DO_OfficeLayoutGeometry_Util.clampDim(grid.workstationCols),\n workstationRows: DO_OfficeLayoutGeometry_Util.clampDim(grid.workstationRows),\n restCols: DO_OfficeLayoutGeometry_Util.clampDim(grid.restCols),\n restRows: DO_OfficeLayoutGeometry_Util.clampDim(grid.restRows),\n meetingCols: DO_OfficeLayoutGeometry_Util.clampDim(grid.meetingCols),\n meetingRows: DO_OfficeLayoutGeometry_Util.clampDim(grid.meetingRows),\n };\n }\n\n /**\n * Teljes derivált geometria a rácsból.\n */\n static computeDerived(grid: DO_OfficeLayoutGrid_Interface): DO_OfficeLayoutDerived_Interface {\n const g: DO_OfficeLayoutGrid_Interface = DO_OfficeLayoutGeometry_Util.clampGrid(grid);\n const floorLeft: number = 4 * TILE;\n const topFloorY: number = 3 * TILE;\n const workspaceW: number = DO_OfficeLayoutGeometry_Util.computeWorkspaceWidthPx(g.workstationCols);\n const loungeW: number = DO_OfficeLayoutGeometry_Util.computeLoungeWidthPx(g.restCols);\n const lobbyW: number = LOBBY_W_TILES * TILE;\n const innerFloorW: number = workspaceW + lobbyW + loungeW;\n const sideFramePx: number = 8 * TILE;\n const worldW: number = innerFloorW + sideFramePx;\n const topFloorH: number = g.workstationRows * 6 * TILE;\n const conferenceHFull: number = 3 * TILE + g.meetingRows * 5 * TILE + 3 * TILE;\n const conferenceH: number = Math.max(2 * TILE, Math.round(conferenceHFull / 2));\n const conferenceY: number = topFloorY + topFloorH;\n const buildingTopY: number = 2 * TILE;\n const buildingBottomY: number = conferenceY + conferenceH + TILE;\n const buildingOuterX: number = floorLeft - TILE;\n const buildingOuterY: number = buildingTopY;\n const buildingOuterW: number = innerFloorW + 2 * TILE;\n const buildingOuterH: number = buildingBottomY - buildingOuterY;\n const worldH: number = buildingBottomY + 3 * TILE;\n\n const floorWorkspace: DO_OfficeLayoutRect_Interface = {\n x: floorLeft,\n y: topFloorY,\n w: workspaceW,\n h: topFloorH,\n };\n const floorLobby: DO_OfficeLayoutRect_Interface = {\n x: floorLeft + workspaceW,\n y: topFloorY,\n w: lobbyW,\n h: buildingBottomY - topFloorY,\n };\n const floorLounge: DO_OfficeLayoutRect_Interface = {\n x: floorLeft + workspaceW + lobbyW,\n y: topFloorY,\n w: loungeW,\n h: buildingBottomY - topFloorY,\n };\n const floorConference: DO_OfficeLayoutRect_Interface = {\n x: floorLeft,\n y: conferenceY,\n w: workspaceW,\n h: conferenceH,\n };\n\n const zoneSplitX: number = floorLeft + workspaceW;\n const zoneSplitLobbyLoungeX: number = floorLeft + workspaceW + lobbyW;\n const topFloorBottomY: number = conferenceY;\n const door: DO_SvgSlot_Interface = {\n x: floorLobby.x + Math.round(floorLobby.w / 2),\n y: buildingBottomY - 2 * TILE,\n };\n\n const workstationSlots: DO_SvgSlot_Interface[] =\n DO_OfficeLayoutGeometry_Util.buildWorkstationSlots(g, floorWorkspace);\n const meetingSlots: DO_SvgSlot_Interface[] =\n DO_OfficeLayoutGeometry_Util.buildMeetingSlots(g, floorConference);\n\n const workstationDesks: DO_OfficeDeskDescriptor_Interface[] =\n DO_OfficeLayoutGeometry_Util.buildWorkstationDesks(g, floorWorkspace);\n const loungeSeating: {\n restSlots: DO_SvgSlot_Interface[];\n loungeSofas: DO_OfficeSofaDescriptor_Interface[];\n } = DO_OfficeLayoutGeometry_Util.buildLoungeSeatingLayout(g, floorLounge);\n const restSlots: DO_SvgSlot_Interface[] = loungeSeating.restSlots;\n const loungeSofas: DO_OfficeSofaDescriptor_Interface[] = loungeSeating.loungeSofas;\n const conference: DO_OfficeConferenceFurniture_Interface =\n DO_OfficeLayoutGeometry_Util.buildConferenceFurniture(floorConference, meetingSlots);\n\n const labelWorkspaceX: number = floorLeft + Math.round(workspaceW / 2);\n const labelLoungeX: number = zoneSplitLobbyLoungeX + Math.round(loungeW / 2);\n const labelConferenceX: number = floorLeft + Math.round(workspaceW / 2);\n const ceilingNeonY: number = topFloorY + TILE;\n const windowsNorthY: number = buildingTopY + TILE / 2;\n\n return {\n worldW: worldW,\n worldH: worldH,\n environmentOverflowPx: 3000,\n buildingOuter: { x: buildingOuterX, y: buildingOuterY, w: buildingOuterW, h: buildingOuterH },\n floorWorkspace: floorWorkspace,\n floorLobby: floorLobby,\n floorLounge: floorLounge,\n floorConference: floorConference,\n zoneSplitX: zoneSplitX,\n zoneSplitLobbyLoungeX: zoneSplitLobbyLoungeX,\n topFloorBottomY: topFloorBottomY,\n door: door,\n workstationSlots: workstationSlots,\n restSlots: restSlots,\n meetingSlots: meetingSlots,\n workstationDesks: workstationDesks,\n loungeSofas: loungeSofas,\n conference: conference,\n windowsNorthY: windowsNorthY,\n labelWorkspaceX: labelWorkspaceX,\n labelLoungeX: labelLoungeX,\n labelConferenceX: labelConferenceX,\n ceilingNeonY: ceilingNeonY,\n };\n }\n\n /**\n * Workstation + rest + meeting kapacitás összeszorzva.\n */\n static workstationCapacity(grid: DO_OfficeLayoutGrid_Interface): number {\n const g: DO_OfficeLayoutGrid_Interface = DO_OfficeLayoutGeometry_Util.clampGrid(grid);\n return g.workstationCols * g.workstationRows;\n }\n\n /**\n * Rest kapacitás (REQ-DO-004 — 2-fős kanapé): minden kanapé 2 ülőhellyel,\n * `restCols * restRows * 2`.\n */\n static restCapacity(grid: DO_OfficeLayoutGrid_Interface): number {\n const g: DO_OfficeLayoutGrid_Interface = DO_OfficeLayoutGeometry_Util.clampGrid(grid);\n return g.restCols * g.restRows * 2;\n }\n\n /**\n * Meeting kapacitás (REQ-DO-004 — perimetrum-székek): top + bottom edge `meetingCols`\n * szék + 2 end-szék = `2 * meetingCols + 2`. Az `meetingRows` paraméter a layout-spec-ben\n * megmaradt, de a perimetrum-szabály jelenleg csak a `meetingCols`-tól függ.\n */\n static meetingCapacity(grid: DO_OfficeLayoutGrid_Interface): number {\n const g: DO_OfficeLayoutGrid_Interface = DO_OfficeLayoutGeometry_Util.clampGrid(grid);\n return 2 * g.meetingCols + 2;\n }\n\n private static clampDim(value: number): number {\n if (!Number.isFinite(value)) {\n return GRID_MIN;\n }\n const n: number = Math.floor(value);\n if (n < GRID_MIN) {\n return GRID_MIN;\n }\n if (n > GRID_MAX) {\n return GRID_MAX;\n }\n return n;\n }\n\n private static computeWorkspaceWidthPx(workstationCols: number): number {\n const minLegacy: number = 896;\n const perCol: number = 256;\n const padded: number = 128 + workstationCols * perCol;\n return Math.max(minLegacy, padded);\n }\n\n private static computeLoungeWidthPx(restCols: number): number {\n const basePad: number = 140;\n const perCol: number = 170;\n return basePad + restCols * perCol;\n }\n\n private static buildWorkstationSlots(\n g: DO_OfficeLayoutGrid_Interface,\n floor: DO_OfficeLayoutRect_Interface,\n ): DO_SvgSlot_Interface[] {\n const slots: DO_SvgSlot_Interface[] = [];\n const pitchX: number = DO_OfficeLayoutGeometry_Util.workstationPitchX(g.workstationCols, floor.w);\n const startX: number = floor.x + 64;\n const rowYs: number[] = DO_OfficeLayoutGeometry_Util.workstationRowFeetY(g.workstationRows, floor);\n for (let row: number = 0; row < g.workstationRows; row++) {\n for (let col: number = 0; col < g.workstationCols; col++) {\n slots.push({\n x: Math.round(startX + col * pitchX),\n y: rowYs[row] as number,\n });\n }\n }\n return slots;\n }\n\n private static workstationPitchX(cols: number, workspaceW: number): number {\n if (cols <= 1) {\n return 0;\n }\n if (cols === 3 && workspaceW === 896) {\n return 96;\n }\n return Math.max(96, Math.round((workspaceW - 192) / (cols - 1)));\n }\n\n private static workstationRowFeetY(rows: number, floor: DO_OfficeLayoutRect_Interface): number[] {\n if (rows === 3) {\n return [\n floor.y + 112,\n floor.y + 250,\n floor.y + 452,\n ];\n }\n const out: number[] = [];\n const topPad: number = 48;\n const bottomPad: number = 48;\n const usable: number = floor.h - topPad - bottomPad;\n const step: number = rows <= 1 ? 0 : usable / (rows - 1);\n for (let r: number = 0; r < rows; r++) {\n out.push(Math.round(floor.y + topPad + r * step));\n }\n return out;\n }\n\n private static buildWorkstationDesks(\n g: DO_OfficeLayoutGrid_Interface,\n floor: DO_OfficeLayoutRect_Interface,\n ): DO_OfficeDeskDescriptor_Interface[] {\n const desks: DO_OfficeDeskDescriptor_Interface[] = [];\n const pitchX: number = DO_OfficeLayoutGeometry_Util.workstationPitchX(g.workstationCols, floor.w);\n const footStartX: number = floor.x + 64;\n const rowDeskY: number[] = DO_OfficeLayoutGeometry_Util.workstationDeskTopY(g.workstationRows, floor);\n for (let row: number = 0; row < g.workstationRows; row++) {\n for (let col: number = 0; col < g.workstationCols; col++) {\n const footX: number = Math.round(footStartX + col * pitchX);\n const deskX: number = footX - 32;\n const deskY: number = rowDeskY[row] as number;\n const monitorIsCyan: boolean = (row + col) % 2 === 0;\n desks.push({\n trackId: `ws-${row}-${col}`,\n x: deskX,\n y: deskY,\n monitorIsCyan: monitorIsCyan,\n });\n }\n }\n return desks;\n }\n\n private static workstationDeskTopY(rows: number, floor: DO_OfficeLayoutRect_Interface): number[] {\n if (rows === 3) {\n return [\n floor.y + 64,\n floor.y + 256,\n floor.y + 404,\n ];\n }\n const feet: number[] = DO_OfficeLayoutGeometry_Util.workstationRowFeetY(rows, floor);\n return feet.map((fy: number): number => fy - 48);\n }\n\n /**\n * Lounge kanapék + idle `restSlots` (REQ-DO-004).\n *\n * Minden kanapé **2 fős** — két `restSlot` egy kanapéhoz: balra (~33%) és jobbra (~67%) a\n * kanapé szélességén belül, a kanapé előtt „arc a szoba felé\". Korábban kanapénként 1 slot\n * volt középen; most a kapacitás megduplázódik (`restSlots.length = 2 * restCols * restRows`).\n *\n * A pihenő-jelenet kompaktabb (`padY`, `gapBetweenRows`, `sofaH` csökkentve) a user re-\n * emphasis szerint („túl nagyra van méretezve\").\n */\n private static buildLoungeSeatingLayout(\n g: DO_OfficeLayoutGrid_Interface,\n floor: DO_OfficeLayoutRect_Interface,\n ): {\n restSlots: DO_SvgSlot_Interface[];\n loungeSofas: DO_OfficeSofaDescriptor_Interface[];\n } {\n const sofas: DO_OfficeSofaDescriptor_Interface[] = [];\n const restSlots: DO_SvgSlot_Interface[] = [];\n /** Kompakt pihenő paraméterek (REQ-DO-004 user re-emphasis). */\n const padX: number = 16;\n const padY: number = 18;\n const gapX: number = 12;\n const gapBetweenRows: number = 14;\n const sofaH: number = 36;\n /** Ülő / álló karakter Y: a kanapé előtt, „arc a szoba felé\". */\n const seatAheadOfSofa: number = 14;\n /** 2-fős kanapén a két ülő-pozíció a kanapé szélességén belül (33%, 67%). */\n const seatLeftFraction: number = 0.33;\n const seatRightFraction: number = 0.67;\n const innerW: number = floor.w - 2 * padX;\n const innerH: number = floor.h - 2 * padY;\n const rowBandOuter: number = innerH / Math.max(1, g.restRows);\n\n for (let row: number = 0; row < g.restRows; row++) {\n const bandTop: number = floor.y + padY + row * rowBandOuter;\n const bandH: number = rowBandOuter - gapBetweenRows;\n\n if (g.restCols <= 1) {\n // 1 oszlop: szélesebb kanapé centrálva — 2 fős kapacitással is jól kitölti a sávot.\n const sofaW: number = Math.min(188, Math.max(120, floor.w - 2 * padX));\n const sx: number = floor.x + Math.round((floor.w - sofaW) / 2);\n const sy: number = Math.round(bandTop + bandH * 0.12);\n sofas.push({\n trackId: `lounge-${row}-0`,\n x: sx,\n y: sy,\n w: sofaW,\n h: sofaH,\n });\n const seatY: number = sy + sofaH + seatAheadOfSofa;\n restSlots.push({ x: sx + Math.round(sofaW * seatLeftFraction), y: seatY });\n restSlots.push({ x: sx + Math.round(sofaW * seatRightFraction), y: seatY });\n } else {\n const totalGapX: number = (g.restCols - 1) * gapX;\n // 2 fős kanapénak min 96px szélesség, hogy a két ülőhely látszódjon.\n const sofaW: number = Math.max(96, Math.round((innerW - totalGapX) / g.restCols));\n for (let col: number = 0; col < g.restCols; col++) {\n const sx: number = floor.x + padX + col * (sofaW + gapX);\n const sy: number = Math.round(bandTop + bandH * 0.12);\n sofas.push({\n trackId: `lounge-${row}-${col}`,\n x: sx,\n y: sy,\n w: sofaW,\n h: sofaH,\n });\n const seatY: number = sy + sofaH + seatAheadOfSofa;\n restSlots.push({ x: sx + Math.round(sofaW * seatLeftFraction), y: seatY });\n restSlots.push({ x: sx + Math.round(sofaW * seatRightFraction), y: seatY });\n }\n }\n }\n\n return {\n restSlots: restSlots,\n loungeSofas: sofas,\n };\n }\n\n /**\n * Meeting Room slot pozíciók (REQ-DO-004) — a tárgyalóasztal **perimetrumán** elhelyezett\n * székek (top edge + bottom edge + left/right ends), nem grid-osztásban a teljes meeting\n * floor-on. Ezzel a meglévő `meetingCols × meetingRows` rács paraméterét tovább használjuk\n * a felső/alsó székek számának meghatározására, és további 2 szék kerül a két végre — így\n * **lényegesen több szék** rendeződik az asztal köré.\n *\n * Szék-pozíció = ülő-pozíció (a karakter ide spawnol meeting placement-en). Az asztal és\n * a perimetrum-margók tableW/tableH-tól függnek (ld. `buildConferenceFurniture`).\n */\n private static buildMeetingSlots(\n g: DO_OfficeLayoutGrid_Interface,\n floor: DO_OfficeLayoutRect_Interface,\n ): DO_SvgSlot_Interface[] {\n return DO_OfficeLayoutGeometry_Util.computeConferenceChairPositions(g, floor);\n }\n\n /**\n * Tárgyaló-asztal körüli szék-pozíciók (REQ-DO-004).\n *\n * Geometria: tableW = min(420, floor.w - 80), tableH = 56, az asztal a meeting floor\n * közepén. A székek `chairOffset` távolságra a felső/alsó/jobb/bal asztal-él előtt:\n *\n * - **Top edge:** `g.meetingCols` szék evenly distributed a tableW mentén, kissé az\n * asztal felett.\n * - **Bottom edge:** `g.meetingCols` szék evenly distributed a tableW mentén, az asztal alatt.\n * - **Left end / Right end:** 1-1 szék az asztal két oldalán.\n *\n * **Szék-szám:** `2 * meetingCols + 2` — pl. 2 oszlopos rácsnál 6 szék (volt 4); 3-asnál\n * 8 szék (volt 6); 4-esnél 10 szék (volt 8). Tehát mindig +2 vagy több szék.\n */\n private static computeConferenceChairPositions(\n g: DO_OfficeLayoutGrid_Interface,\n floor: DO_OfficeLayoutRect_Interface,\n ): DO_SvgSlot_Interface[] {\n const slots: DO_SvgSlot_Interface[] = [];\n const tableW: number = Math.min(420, floor.w - 80);\n const tableH: number = 56;\n const tableX: number = floor.x + Math.round((floor.w - tableW) / 2);\n const tableY: number = floor.y + Math.round(floor.h / 2) - Math.round(tableH / 2);\n /** Szék az asztal-élfeltől ennyivel kintebb. */\n const chairOffset: number = 26;\n const cols: number = Math.max(1, g.meetingCols);\n\n // Top edge: cols + 1 osztásban evenly, közbülső pontok (slot 1..cols).\n for (let col: number = 0; col < cols; col++) {\n const x: number = tableX + Math.round(((col + 1) * tableW) / (cols + 1));\n slots.push({ x: x, y: tableY - chairOffset });\n }\n // Bottom edge: ugyanígy.\n for (let col: number = 0; col < cols; col++) {\n const x: number = tableX + Math.round(((col + 1) * tableW) / (cols + 1));\n slots.push({ x: x, y: tableY + tableH + chairOffset });\n }\n // Left end + right end (asztal két végén 1-1 szék).\n const sideY: number = tableY + Math.round(tableH / 2);\n slots.push({ x: tableX - chairOffset, y: sideY });\n slots.push({ x: tableX + tableW + chairOffset, y: sideY });\n\n return slots;\n }\n\n private static buildConferenceFurniture(\n floor: DO_OfficeLayoutRect_Interface,\n meetingSlots: DO_SvgSlot_Interface[],\n ): DO_OfficeConferenceFurniture_Interface {\n const tableW: number = Math.min(420, floor.w - 80);\n const tableH: number = 56;\n const table: DO_OfficeLayoutRect_Interface = {\n x: floor.x + Math.round((floor.w - tableW) / 2),\n y: floor.y + Math.round(floor.h / 2) - Math.round(tableH / 2),\n w: tableW,\n h: tableH,\n };\n // A székek pozíciója = meeting slot pozíciók (perimetrum-szabály a `buildMeetingSlots`-ban).\n const chairs: DO_OfficeConferenceChairDescriptor_Interface[] = meetingSlots.map(\n (slot: DO_SvgSlot_Interface, index: number): DO_OfficeConferenceChairDescriptor_Interface => ({\n trackId: `conf-chair-${index}`,\n x: slot.x,\n y: slot.y,\n }),\n );\n return {\n table: table,\n chairs: chairs,\n };\n }\n}\n", "import { computed, inject, Injectable, signal } from '@angular/core';\n\nimport { SC_SettingDarkOfficeLayout_Interface } from '@server/_modules/setup-config/_models/interfaces/sc-setting-dark-office-layout.interface';\n\nimport { SC_Type } from '@server-enums';\nimport { Settings_ApiService } from '../../config/_modules/settings/_services/settings.api-service';\nimport { DO_OfficeLayoutGeometry_Util } from '../_collections/utils/do-office-layout/do-office-layout-geometry.util';\nimport { DO_OfficeLayoutDerived_Interface } from '../_collections/do-office-layout/do-office-layout-derived.interface';\nimport { DO_OfficeLayoutGrid_Interface } from '../_collections/do-office-layout/do-office-layout-grid.interface';\nimport { DO_SvgSlot_Interface } from '../_collections/consts/do-svg-slots.const';\nimport { DO_OfficeInstanceState_Interface } from '../../../_models/interfaces/dark-office/do-office-instance-state.interface';\nimport { DO_Presence_Type } from '../../../_enums/dark-office/ccap-dark-office-presence.enum';\nimport { DO_CharacterScenePlacement_Type } from '../../../_enums/dark-office/do-character-scene-placement.enum';\n\n/** Default persistált layout — szerver `SC_SettingDarkOfficeLayout_Normalize_Util.defaultPayload` SSOT tükör. */\nconst DEFAULT_LAYOUT: SC_SettingDarkOfficeLayout_Interface = {\n workstationCols: 3,\n workstationRows: 3,\n restCols: 2,\n restRows: 3,\n meetingCols: 2,\n meetingRows: 2,\n maxEverWorkstationCols: 3,\n maxEverWorkstationRows: 3,\n maxEverRestCols: 2,\n maxEverRestRows: 3,\n maxEverMeetingCols: 2,\n maxEverMeetingRows: 2,\n};\n\n/**\n * Dark Office layout SSOT a kliensen — signalok, derivált geometria, settings persistencia.\n * Auto-bővítés: `ensureMinCapacitiesFromSceneCharacters` a `DarkOffice_DataService` effect-jéből.\n */\n@Injectable({ providedIn: 'root' })\nexport class DO_Layout_DataService {\n\n private readonly settings_AS: Settings_ApiService = inject(Settings_ApiService);\n\n /** Utolsó sikeres / default persistált állapot. */\n private readonly layoutPersisted_$ = signal<SC_SettingDarkOfficeLayout_Interface>(DEFAULT_LAYOUT);\n\n private saveTimerId: ReturnType<typeof setTimeout> | undefined;\n\n /** Aktuális rács a persistált mezőkből. */\n readonly grid_$ = computed((): DO_OfficeLayoutGrid_Interface => {\n const p: SC_SettingDarkOfficeLayout_Interface = this.layoutPersisted_$();\n return {\n workstationCols: p.workstationCols,\n workstationRows: p.workstationRows,\n restCols: p.restCols,\n restRows: p.restRows,\n meetingCols: p.meetingCols,\n meetingRows: p.meetingRows,\n };\n });\n\n /** Teljes derivált SVG geometria. */\n readonly derived_$ = computed((): DO_OfficeLayoutDerived_Interface =>\n DO_OfficeLayoutGeometry_Util.computeDerived(this.grid_$()),\n );\n\n readonly workstationCapacity_$ = computed((): number =>\n DO_OfficeLayoutGeometry_Util.workstationCapacity(this.grid_$()),\n );\n\n readonly restCapacity_$ = computed((): number =>\n DO_OfficeLayoutGeometry_Util.restCapacity(this.grid_$()),\n );\n\n readonly meetingCapacity_$ = computed((): number =>\n DO_OfficeLayoutGeometry_Util.meetingCapacity(this.grid_$()),\n );\n\n /** MaxEver értékek megjelenítéshez (read-only). */\n readonly maxEverDisplay_$ = computed((): SC_SettingDarkOfficeLayout_Interface => this.layoutPersisted_$());\n\n constructor() {\n void this.loadFromServer();\n }\n\n /**\n * GET /settings/get-section/dark-office-layout — üres válasz esetén default.\n */\n async loadFromServer(): Promise<void> {\n try {\n const raw: Record<string, unknown> = await this.settings_AS.getSection(\n SC_Type.darkOfficeLayout,\n );\n if (raw == null || Object.keys(raw).length === 0) {\n this.layoutPersisted_$.set(DEFAULT_LAYOUT);\n return;\n }\n const merged: SC_SettingDarkOfficeLayout_Interface = DO_Layout_DataService.parsePayload(raw);\n this.layoutPersisted_$.set(merged);\n } catch {\n this.layoutPersisted_$.set(DEFAULT_LAYOUT);\n }\n }\n\n /**\n * Scene karakterek alapján minimális kapacitás biztosítása + maxEver frissítés + debounced save.\n */\n ensureMinCapacitiesFromSceneCharacters(characters: DO_OfficeInstanceState_Interface[]): void {\n let needW: number = 0;\n let needR: number = 0;\n let needM: number = 0;\n for (const ch of characters) {\n if (ch.scenePlacement === DO_CharacterScenePlacement_Type.meeting) {\n needM++;\n } else if (ch.presence === DO_Presence_Type.working) {\n needW++;\n } else {\n needR++;\n }\n }\n const p: SC_SettingDarkOfficeLayout_Interface = this.layoutPersisted_$();\n let next: SC_SettingDarkOfficeLayout_Interface = { ...p };\n next = DO_Layout_DataService.expandGridToFit(next, needW, needR, needM);\n if (DO_Layout_DataService.isSamePersisted(p, next)) {\n return;\n }\n this.layoutPersisted_$.set(next);\n this.scheduleDebouncedSave();\n }\n\n /**\n * Felhasználói mentés (Settings) — teljes payload cseréje validáció után a hívó oldalról.\n */\n /**\n * Felhasználói mentés — await-olható (Settings UI spinner).\n */\n async applyPersistedFromUser(payload: SC_SettingDarkOfficeLayout_Interface): Promise<void> {\n this.layoutPersisted_$.set({ ...payload });\n await this.saveNow();\n }\n\n /**\n * Felhasználói rács-csökkentés validáció: a scene-en lévő karakterek száma nem haladhatja meg a kapacitást.\n * Visszaad English üzenetet a globális error UI-hoz, vagy null ha OK.\n */\n validateProposedGridAgainstSceneCharacters(params: {\n grid: DO_OfficeLayoutGrid_Interface;\n characters: DO_OfficeInstanceState_Interface[];\n }): string | null {\n const g: DO_OfficeLayoutGrid_Interface = DO_OfficeLayoutGeometry_Util.clampGrid(params.grid);\n let needW: number = 0;\n let needR: number = 0;\n let needM: number = 0;\n for (const ch of params.characters) {\n if (ch.scenePlacement === DO_CharacterScenePlacement_Type.meeting) {\n needM++;\n } else if (ch.presence === DO_Presence_Type.working) {\n needW++;\n } else {\n needR++;\n }\n }\n const capW: number = DO_OfficeLayoutGeometry_Util.workstationCapacity(g);\n const capR: number = DO_OfficeLayoutGeometry_Util.restCapacity(g);\n const capM: number = DO_OfficeLayoutGeometry_Util.meetingCapacity(g);\n if (needW <= capW && needR <= capR && needM <= capM) {\n return null;\n }\n return (\n 'Dark office layout rejected: scene occupancy exceeds proposed capacity. '\n + `workstation=${needW}/${capW}, rest=${needR}/${capR}, meeting=${needM}/${capM}.`\n );\n }\n\n /**\n * Workstation / rest / meeting slot tömbök a `do-svg-char` számára.\n */\n getWorkstationSlots(): DO_SvgSlot_Interface[] {\n return this.derived_$().workstationSlots;\n }\n\n getRestSlots(): DO_SvgSlot_Interface[] {\n return this.derived_$().restSlots;\n }\n\n getMeetingSlots(): DO_SvgSlot_Interface[] {\n return this.derived_$().meetingSlots;\n }\n\n getDoorPosition(): DO_SvgSlot_Interface {\n return this.derived_$().door;\n }\n\n private scheduleDebouncedSave(): void {\n if (this.saveTimerId !== undefined) {\n clearTimeout(this.saveTimerId);\n }\n this.saveTimerId = setTimeout((): void => {\n this.saveTimerId = undefined;\n void this.saveNow();\n }, 500);\n }\n\n private async saveNow(): Promise<void> {\n const body: Record<string, unknown> = {\n workstationCols: this.layoutPersisted_$().workstationCols,\n workstationRows: this.layoutPersisted_$().workstationRows,\n restCols: this.layoutPersisted_$().restCols,\n restRows: this.layoutPersisted_$().restRows,\n meetingCols: this.layoutPersisted_$().meetingCols,\n meetingRows: this.layoutPersisted_$().meetingRows,\n maxEverWorkstationCols: this.layoutPersisted_$().maxEverWorkstationCols,\n maxEverWorkstationRows: this.layoutPersisted_$().maxEverWorkstationRows,\n maxEverRestCols: this.layoutPersisted_$().maxEverRestCols,\n maxEverRestRows: this.layoutPersisted_$().maxEverRestRows,\n maxEverMeetingCols: this.layoutPersisted_$().maxEverMeetingCols,\n maxEverMeetingRows: this.layoutPersisted_$().maxEverMeetingRows,\n };\n try {\n await this.settings_AS.saveSection(SC_Type.darkOfficeLayout, body);\n } catch {\n // Network hiba — layout már memóriában; következő load felülírhatja\n }\n }\n\n private static parsePayload(raw: Record<string, unknown>): SC_SettingDarkOfficeLayout_Interface {\n const readN = (key: string, fallback: number): number => {\n const v: unknown = raw[key];\n if (typeof v === 'number' && Number.isFinite(v)) {\n return Math.floor(v);\n }\n return fallback;\n };\n const d: SC_SettingDarkOfficeLayout_Interface = DEFAULT_LAYOUT;\n const base: SC_SettingDarkOfficeLayout_Interface = {\n workstationCols: readN('workstationCols', d.workstationCols),\n workstationRows: readN('workstationRows', d.workstationRows),\n restCols: readN('restCols', d.restCols),\n restRows: readN('restRows', d.restRows),\n meetingCols: readN('meetingCols', d.meetingCols),\n meetingRows: readN('meetingRows', d.meetingRows),\n maxEverWorkstationCols: readN('maxEverWorkstationCols', d.maxEverWorkstationCols),\n maxEverWorkstationRows: readN('maxEverWorkstationRows', d.maxEverWorkstationRows),\n maxEverRestCols: readN('maxEverRestCols', d.maxEverRestCols),\n maxEverRestRows: readN('maxEverRestRows', d.maxEverRestRows),\n maxEverMeetingCols: readN('maxEverMeetingCols', d.maxEverMeetingCols),\n maxEverMeetingRows: readN('maxEverMeetingRows', d.maxEverMeetingRows),\n };\n return DO_Layout_DataService.clampPersisted(base);\n }\n\n private static clampPersisted(p: SC_SettingDarkOfficeLayout_Interface): SC_SettingDarkOfficeLayout_Interface {\n const c = (n: number): number => {\n if (!Number.isFinite(n)) {\n return 1;\n }\n const i: number = Math.floor(n);\n if (i < 1) {\n return 1;\n }\n if (i > 12) {\n return 12;\n }\n return i;\n };\n const out: SC_SettingDarkOfficeLayout_Interface = {\n workstationCols: c(p.workstationCols),\n workstationRows: c(p.workstationRows),\n restCols: c(p.restCols),\n restRows: c(p.restRows),\n meetingCols: c(p.meetingCols),\n meetingRows: c(p.meetingRows),\n maxEverWorkstationCols: c(p.maxEverWorkstationCols),\n maxEverWorkstationRows: c(p.maxEverWorkstationRows),\n maxEverRestCols: c(p.maxEverRestCols),\n maxEverRestRows: c(p.maxEverRestRows),\n maxEverMeetingCols: c(p.maxEverMeetingCols),\n maxEverMeetingRows: c(p.maxEverMeetingRows),\n };\n out.maxEverWorkstationCols = Math.max(out.maxEverWorkstationCols, out.workstationCols);\n out.maxEverWorkstationRows = Math.max(out.maxEverWorkstationRows, out.workstationRows);\n out.maxEverRestCols = Math.max(out.maxEverRestCols, out.restCols);\n out.maxEverRestRows = Math.max(out.maxEverRestRows, out.restRows);\n out.maxEverMeetingCols = Math.max(out.maxEverMeetingCols, out.meetingCols);\n out.maxEverMeetingRows = Math.max(out.maxEverMeetingRows, out.meetingRows);\n return out;\n }\n\n private static isSamePersisted(\n a: SC_SettingDarkOfficeLayout_Interface,\n b: SC_SettingDarkOfficeLayout_Interface,\n ): boolean {\n return (\n a.workstationCols === b.workstationCols\n && a.workstationRows === b.workstationRows\n && a.restCols === b.restCols\n && a.restRows === b.restRows\n && a.meetingCols === b.meetingCols\n && a.meetingRows === b.meetingRows\n && a.maxEverWorkstationCols === b.maxEverWorkstationCols\n && a.maxEverWorkstationRows === b.maxEverWorkstationRows\n && a.maxEverRestCols === b.maxEverRestCols\n && a.maxEverRestRows === b.maxEverRestRows\n && a.maxEverMeetingCols === b.maxEverMeetingCols\n && a.maxEverMeetingRows === b.maxEverMeetingRows\n );\n }\n\n /**\n * Kapacitás-bővítés: először oszlop, majd sor, amíg cols*rows >= need.\n */\n private static expandGridToFit(\n p: SC_SettingDarkOfficeLayout_Interface,\n needW: number,\n needR: number,\n needM: number,\n ): SC_SettingDarkOfficeLayout_Interface {\n let wCols: number = p.workstationCols;\n let wRows: number = p.workstationRows;\n let rCols: number = p.restCols;\n let rRows: number = p.restRows;\n let mCols: number = p.meetingCols;\n let mRows: number = p.meetingRows;\n\n while (wCols * wRows < needW && (wCols < 12 || wRows < 12)) {\n if (wCols <= wRows) {\n wCols = Math.min(12, wCols + 1);\n } else {\n wRows = Math.min(12, wRows + 1);\n }\n }\n while (rCols * rRows < needR && (rCols < 12 || rRows < 12)) {\n if (rCols <= rRows) {\n rCols = Math.min(12, rCols + 1);\n } else {\n rRows = Math.min(12, rRows + 1);\n }\n }\n while (mCols * mRows < needM && (mCols < 12 || mRows < 12)) {\n if (mCols <= mRows) {\n mCols = Math.min(12, mCols + 1);\n } else {\n mRows = Math.min(12, mRows + 1);\n }\n }\n\n const out: SC_SettingDarkOfficeLayout_Interface = {\n workstationCols: wCols,\n workstationRows: wRows,\n restCols: rCols,\n restRows: rRows,\n meetingCols: mCols,\n meetingRows: mRows,\n maxEverWorkstationCols: Math.max(p.maxEverWorkstationCols, wCols),\n maxEverWorkstationRows: Math.max(p.maxEverWorkstationRows, wRows),\n maxEverRestCols: Math.max(p.maxEverRestCols, rCols),\n maxEverRestRows: Math.max(p.maxEverRestRows, rRows),\n maxEverMeetingCols: Math.max(p.maxEverMeetingCols, mCols),\n maxEverMeetingRows: Math.max(p.maxEverMeetingRows, mRows),\n };\n return DO_Layout_DataService.clampPersisted(out);\n }\n}\n", "import { HttpErrorResponse } from '@angular/common/http';\nimport { computed, effect, inject, Injectable, signal } from '@angular/core';\n\nimport { DyFM_Error, minute } from '@futdevpro/fsm-dynamo';\n\nimport { DO_Presence_Type } from '../../../_enums/dark-office/ccap-dark-office-presence.enum';\nimport { DO_CharacterAnim_Type } from '../../../_enums/dark-office/do-character-anim.enum';\nimport { DO_CharacterScenePlacement_Type } from '../../../_enums/dark-office/do-character-scene-placement.enum';\nimport { DO_CharacterType_Type } from '../../../_enums/dark-office/do-character-type.enum';\nimport { ExS_InstanceDataStatus_Type } from '../../external-sessions/_enums/exs-instance-data-status.enum';\nimport { Oc_iConnectionStatus_Type } from '../../external-sessions/_modules/openclaw/_enums/oc-oci-connection-status.enum';\nimport {\n DO_CAI_DEFAULT_CHARACTER_VISUALS,\n DO_CCI_DEFAULT_CHARACTER_VISUALS,\n DO_DEFAULT_CHARACTER_VISUALS,\n DO_OCI_DEFAULT_CHARACTER_VISUALS,\n DO_WALK_ANIMATION_DURATION_MS,\n} from '../_collections/consts/do-character-defaults.const';\nimport { DO_CaiOfficeInstanceId_Util } from '../_collections/utils/do-cai-office-instance-id.util';\nimport { DO_CciOfficeInstanceId_Util } from '../_collections/utils/do-cci-office-instance-id.util';\nimport { DO_OfficeSessionPrimaryPick_Util } from '../_collections/instance-status/do-office-session-primary-pick.util';\nimport { DO_OciSessionPrimaryPick_Util } from '../_collections/instance-status/do-oci-session-primary-pick.util';\nimport { DO_OciGatewayToSessionStatuses_Util } from '../_collections/instance-status/do-oci-gateway/do-oci-gateway-to-session-statuses.util';\nimport { DO_InstanceStatusModalSessionSource_Util } from '../_collections/instance-status/utils/do-instance-status-detail/do-instance-status-modal-session-source.util';\nimport { DO_PanelCardProjection_Util } from '../_collections/scene/do-panel-card/do-panel-card-projection.util';\nimport { DO_SceneSessionEligibility_Util } from '../_collections/scene/do-scene-session-eligibility.util';\nimport { DO_Layout_DataService } from './do-layout.data-service';\nimport {\n DO_CharacterVisuals_Response,\n} from '../../../_models/interfaces/dark-office/do-character-visuals.interface';\nimport {\n DO_OfficeInstanceState_Interface,\n} from '../../../_models/interfaces/dark-office/do-office-instance-state.interface';\nimport { CA_IInstanceData_Response } from '../../external-sessions/_modules/cursor-acp/_models/interfaces/ca-cai-instance-data.interface';\nimport { CA_IInstanceData_SessionStatus_Interface } from '../../external-sessions/_modules/cursor-acp/_models/interfaces/ca-cai-instance-data-status.interface';\nimport { CC_CciInstanceData_Response } from '../../external-sessions/_modules/claude-code/_models/interfaces/cc-cci-instance-data.interface';\nimport { CC_CciInstanceData_SessionStatus_Interface } from '../../external-sessions/_modules/claude-code/_models/interfaces/cc-cci-instance-data-status.interface';\nimport { ExS_InstanceData_Response } from '../../external-sessions/_models/interfaces/exs-instance-data.interface';\nimport { ExS_InstanceData_SessionStatus_Interface } from '../../external-sessions/_models/interfaces/exs-instance-data-status.interface';\nimport {\n Oc_IInstanceData_Response,\n Oc_IInstanceData_SessionStatus_Interface,\n} from '../../external-sessions/_modules/openclaw/_models/interfaces/oc-oci-instance-data.interface';\nimport { Oc_GatewaySessionsFetch_Interface } from '../../external-sessions/_modules/openclaw/_models/interfaces/oc-list-item.interface';\nimport { CA_IInstanceData_ApiService } from '../../external-sessions/_modules/cursor-acp/_services/ca-i-instance-data.api-service';\nimport { CC_CciInstanceData_ApiService } from '../../external-sessions/_modules/claude-code/_services/cc-cci-instance-data.api-service';\nimport { ExS_InstanceData_ApiService } from '../../external-sessions/_services/exs-instance-data.api-service';\nimport { Oc_IInstanceData_ApiService } from '../../external-sessions/_modules/openclaw/_services/oc-i-instance-data.api-service';\nimport { ExS_RuntimeInstances_DataService } from '../../external-sessions/_services/data-services/exs-runtime-instances.data-service';\nimport { Openclaw_DataService } from '../../external-sessions/_modules/openclaw/_services/openclaw.data-service';\nimport { CCAP_Socket_ControlService } from '../../../_services/control-services/ccap-socket.control-service';\nimport { CCAP_SocketEventEnvelope_Interface } from '../../../_services/control-services/socket.control-service.interface';\n\n/** Instance data session status frissítés event neve (egyezik a szerver messaging.const-tal). */\nconst SOCKET_EVENT_INSTANCE_STATUS_UPDATED: string = 'instance-data:session-status-updated';\n\n/** OCI instance data státusz frissítés event neve (egyezik a szerver messaging.const-tal). */\nconst SOCKET_EVENT_OCI_INSTANCE_STATUS_UPDATED: string = 'openclaw-instance-data:status-updated';\n\n/** CCI instance data státusz frissítés event neve. */\nconst SOCKET_EVENT_CCI_INSTANCE_STATUS_UPDATED: string = 'cci-instance-data:status-updated';\n\n/** CAI instance data státusz frissítés event neve. */\nconst SOCKET_EVENT_CAI_INSTANCE_STATUS_UPDATED: string = 'cai-instance-data:status-updated';\n\n/**\n * Dark Office data-service (SSOT).\n *\n * ## Felelősség\n * Multi-instance iroda állapot kezelése:\n * - **Socket push:** `instance-data:session-status-updated` event → azonnali UI frissítés\n * - **Polling (fallback):** `loadInstanceData()` hívja a `GET /instance-data/list` endpointot\n * - **Vizuálok:** szerver-oldali `ccap_instance_data.darkOfficeVisuals` + `name` mezőkből\n * - **Presence:** CCAP/CCI/CAI: első session sor (üres CCAP lista → idle, nem offline); **OCI:** gateway + primary session\n * - **Animációk:** presence átmenetek → walk-in/out trigger\n * - **Instance státusz modal session sorok:** `resolveModal*SessionStatuses` — egy belépési pont; a belső util-t ne hívják komponensek közvetlenül\n * - **Office sor lookup:** `resolveOfficeInstanceById` — panel / scene / modal instanceId alapú keresés\n *\n * ## Adatforrás\n * Korábban: `GET /dark-office/snapshots` + localStorage vizuálok.\n * **Most:** `GET /instance-data/list` — vizuálok és session státuszok egyaránt a szerveren perzisztálva.\n * **OCI kiegészítés:** ha a tracker üres `sessionStatuses`-t ad, de a gateway online, `loadInstanceData` a\n * `Openclaw_DataService.fetchGatewaySessionsForInstance`-on keresztül kéri a gateway session listát —\n * Dark Office overlay summary SSOT a gateway-re igazodik.\n *\n * ## Vizuál mentés\n * A `saveVisuals()` optimistic local update-et csinál (azonnali UI feedback),\n * majd debounce-oltan PATCH-el a szerverre (300ms késleltetés a gyors kattintások összevonásához).\n */\n@Injectable({ providedIn: 'root' })\nexport class DarkOffice_DataService {\n\n /** Összes instance UI-állapota (per-instance — panel kártyákhoz). */\n readonly instances_$ = signal<DO_OfficeInstanceState_Interface[]>([]);\n\n /**\n * Per-session karakterek az office scene-hez.\n *\n * - Több session esetén: külön karakter csak **working** (vagy CCAP `hasActiveRun`) sorokra, ha\n * `lastActivityAt` az elmúlt **5 perc**ben van és nem offline.\n * - Ha nincs ilyen sor (mind idle vagy mind stale working): **egy** idle karakter a **legutóbbi**\n * `lastActivityAt` session adataival.\n * - `working` → `idle` átmenet: rövid ideig **Meeting Room** placement (`scenePlacement`).\n * Offline instance-ok nem jelennek meg. Slotok: `assignDistinctSlotsForScene`.\n */\n readonly characters_$ = computed((): DO_OfficeInstanceState_Interface[] => {\n const expanded: DO_OfficeInstanceState_Interface[] = this.expandInstancesToCharacters(\n this.instances_$(),\n );\n return this.assignDistinctSlotsForScene(expanded);\n });\n\n /** Betöltés folyamatban. */\n readonly loading_$ = signal<boolean>(false);\n\n /** Betöltési hiba (null = nincs). Csak nem-hálózati hibáknál állítódik be. */\n readonly loadError_$ = signal<unknown | null>(null);\n\n /** A szerver nem elérhető (hálózati hiba / status 0). Polling-nál nem dob nagy hibát, csak jelzi. */\n readonly isServerUnreachable_$ = signal<boolean>(false);\n\n /** Kiválasztott instance ID (vizuál editor megnyitáshoz). */\n readonly selectedInstanceId_$ = signal<string | null>(null);\n\n /** Chat popup session ID (null = zárt). */\n readonly chatPopupSessionId_$ = signal<string | null>(null);\n\n /**\n * Chat popup session típus (REQ-DO-BUBBLE-CLICK-POPUP-001) — null = zárt vagy ismeretlen.\n *\n * A bubble-kattintás flow-jából érkezik a karakter `characterType`-ja, hogy a popup\n * a megfelelő route-ra mutasson („Open full view\" link) és a session-típus-specifikus\n * detail komponenst rendelje (DO-C Slice 2b follow-up).\n */\n readonly chatPopupSessionType_$ = signal<DO_CharacterType_Type | null>(null);\n\n /**\n * Instance státusz részletező modal — melyik instance ID van kiválasztva (null = zárt).\n * A runtime lista snapshot csak az utolsó `loadInstanceData()` után garantált.\n */\n readonly instanceStatusDetailInstanceId_$ = signal<string | null>(null);\n\n private readonly instanceData_AS: ExS_InstanceData_ApiService =\n inject(ExS_InstanceData_ApiService);\n\n private readonly ociInstanceData_AS: Oc_IInstanceData_ApiService =\n inject(Oc_IInstanceData_ApiService);\n\n private readonly cciInstanceData_AS: CC_CciInstanceData_ApiService =\n inject(CC_CciInstanceData_ApiService);\n\n private readonly caiInstanceData_AS: CA_IInstanceData_ApiService =\n inject(CA_IInstanceData_ApiService);\n\n private readonly runtimeInstances_DS: ExS_RuntimeInstances_DataService =\n inject(ExS_RuntimeInstances_DataService);\n\n private readonly socket_CS: CCAP_Socket_ControlService =\n inject(CCAP_Socket_ControlService);\n\n private readonly ocSession_DS: Openclaw_DataService =\n inject(Openclaw_DataService);\n\n private readonly darkOfficeLayout_DS: DO_Layout_DataService =\n inject(DO_Layout_DataService);\n\n constructor() {\n effect((): void => {\n this.darkOfficeLayout_DS.ensureMinCapacitiesFromSceneCharacters(this.characters_$());\n }, { allowSignalWrites: true });\n\n // Socket subscription: real-time session status update-ek a szerverről\n this.socket_CS.event$.subscribe((envelope: CCAP_SocketEventEnvelope_Interface): void => {\n if (envelope.event === SOCKET_EVENT_INSTANCE_STATUS_UPDATED) {\n this.handleInstanceStatusUpdate(envelope.payload);\n } else if (envelope.event === SOCKET_EVENT_OCI_INSTANCE_STATUS_UPDATED) {\n this.handleOciInstanceStatusUpdate(envelope.payload);\n } else if (envelope.event === SOCKET_EVENT_CCI_INSTANCE_STATUS_UPDATED) {\n this.handleCciInstanceStatusUpdate(envelope.payload);\n } else if (envelope.event === SOCKET_EVENT_CAI_INSTANCE_STATUS_UPDATED) {\n this.handleCaiInstanceStatusUpdate(envelope.payload);\n }\n });\n }\n\n /** Slot kiosztás nyilvántartása: instanceId → slotIndex. */\n private workstationSlotMap: Map<string, number> = new Map();\n private restSlotMap: Map<string, number> = new Map();\n\n /** Debounce timer a vizuál PATCH híváshoz (instanceId → timerId). */\n private patchTimerMap: Map<string, ReturnType<typeof setTimeout>> = new Map();\n\n /**\n * Session `working` → `idle` után ennyi ideig a karakter a Meeting Room slotokra kerül (edge: „épp befejezett”).\n */\n private readonly meetingRoomLingerMs: number = 2 * minute;\n\n /** Meeting Room aktív `until` epoch ms — kulcs: `${baseInstanceId}::${sessionId}`. */\n private sessionMeetingRoomUntilByKey: Map<string, number> = new Map();\n\n /**\n * Instance data lista frissítése a szerverről.\n *\n * Hívja a `GET /instance-data/list` endpointot, szűri az aktív instance-okat,\n * majd az `applyInstanceData()` feldolgozza őket UI-állapotra.\n */\n async loadInstanceData(): Promise<void> {\n this.loading_$.set(true);\n this.loadError_$.set(null);\n try {\n await this.runtimeInstances_DS.loadCcapInstanceList();\n const ccapErr: unknown = this.runtimeInstances_DS.ccapInstanceListError_$();\n if (ccapErr) {\n if (ccapErr instanceof HttpErrorResponse && ccapErr.status === 0) {\n this.isServerUnreachable_$.set(true);\n } else {\n this.loadError_$.set(ccapErr);\n }\n return;\n }\n\n await this.runtimeInstances_DS.loadOciInstanceListAllowEmpty();\n await this.runtimeInstances_DS.loadCciInstanceListAllowEmpty();\n await this.runtimeInstances_DS.loadCaiInstanceListAllowEmpty();\n\n // Sikeres betöltés: szerver elérhető\n this.isServerUnreachable_$.set(false);\n\n const ccapList: ExS_InstanceData_Response[] = this.runtimeInstances_DS.ccapInstanceList_$();\n const activeInstances: ExS_InstanceData_Response[] = ccapList.filter(\n (d: ExS_InstanceData_Response): boolean =>\n d.status === ExS_InstanceDataStatus_Type.active,\n );\n\n const ociListRaw: Oc_IInstanceData_Response[] = this.runtimeInstances_DS.ociInstanceList_$();\n const ociList: Oc_IInstanceData_Response[] =\n await this.enrichOciListWithGatewaySessions({ list: ociListRaw });\n const cciList: CC_CciInstanceData_Response[] = this.runtimeInstances_DS.cciInstanceList_$();\n const activeCci: CC_CciInstanceData_Response[] = cciList.filter(\n (d: CC_CciInstanceData_Response): boolean =>\n d.status === ExS_InstanceDataStatus_Type.active,\n );\n const caiList: CA_IInstanceData_Response[] = this.runtimeInstances_DS.caiInstanceList_$();\n const activeCai: CA_IInstanceData_Response[] = caiList.filter(\n (d: CA_IInstanceData_Response): boolean =>\n d.status === ExS_InstanceDataStatus_Type.active,\n );\n this.applyAllInstanceData(activeInstances, ociList, activeCci, activeCai);\n } finally {\n this.loading_$.set(false);\n }\n }\n\n /**\n * OCI sorok kiegészítése gateway `sessions.list` adattal, ha a tracker üres `sessionStatuses`-t ad.\n *\n * A Dark Office overlay summary a `sessionStatuses` mezőből jön — így a gateway SSOT bekerül\n * minden teljes office reload / Refresh ciklusba anélkül, hogy a runtime OCI lista signal-t\n * felülírnánk.\n */\n private async enrichOciListWithGatewaySessions(params: {\n list: Oc_IInstanceData_Response[];\n }): Promise<Oc_IInstanceData_Response[]> {\n const enriched: Oc_IInstanceData_Response[] = await Promise.all(\n params.list.map(\n async (item: Oc_IInstanceData_Response): Promise<Oc_IInstanceData_Response> => {\n const existing: Oc_IInstanceData_SessionStatus_Interface[] = item.sessionStatuses ?? [];\n const isConnected: boolean = item.connectionStatus === Oc_iConnectionStatus_Type.connected;\n if (!isConnected || existing.length > 0) {\n return item;\n }\n try {\n const fetchResult: Oc_GatewaySessionsFetch_Interface =\n await this.ocSession_DS.fetchGatewaySessionsForInstance({\n instanceId: item.instanceId,\n });\n const merged: Oc_IInstanceData_SessionStatus_Interface[] =\n DO_OciGatewayToSessionStatuses_Util.mapGatewaySessionsResponse({\n sessions: fetchResult.rawSessions,\n });\n if (merged.length === 0) {\n return item;\n }\n return {\n ...item,\n sessionStatuses: merged,\n };\n } catch (error: unknown) {\n DyFM_Error.logSimple(\n 'CCAP_DarkOffice_DS | enrichOciListWithGatewaySessions failed',\n error,\n );\n return item;\n }\n },\n ),\n );\n return enriched;\n }\n\n /**\n * Vizuál beállítások mentése egy instance-hoz.\n *\n * 1. **Optimistic local update:** azonnali signal frissítés (UI feedback)\n * 2. **Debounced server PATCH:** 300ms után PATCH /instance-data/by-ccap/:ccapId\n * (gyors kattintások összevonása; utolsó állapot megy a szerverre)\n */\n saveVisuals(instanceId: string, visuals: DO_CharacterVisuals_Response): void {\n // Optimistic local update — azonnali UI feedback\n this.instances_$.update(\n (list: DO_OfficeInstanceState_Interface[]): DO_OfficeInstanceState_Interface[] =>\n list.map(\n (inst: DO_OfficeInstanceState_Interface): DO_OfficeInstanceState_Interface =>\n inst.instanceId === instanceId\n ? { ...inst, visuals: visuals }\n : inst,\n ),\n );\n\n // Debounced server PATCH (300ms)\n this.schedulePatch(instanceId, visuals);\n }\n\n /**\n * Betöltési hiba elvetése (overlay bezárás).\n */\n dismissError(): void {\n this.loadError_$.set(null);\n }\n\n /**\n * Chat popup megnyitása a megadott session ID-val + session típussal (REQ-DO-BUBBLE-CLICK-POPUP-001).\n *\n * A `sessionType` param a karakter `characterType`-jából jön — null lehet a baseline\n * karakteren (sessionId nélkül) ami amúgy se nyit popupot.\n */\n openChatPopup(sessionId: string, sessionType: DO_CharacterType_Type | null = null): void {\n this.chatPopupSessionId_$.set(sessionId);\n this.chatPopupSessionType_$.set(sessionType);\n }\n\n /**\n * Chat popup bezárása — sessionId + sessionType reset.\n */\n closeChatPopup(): void {\n this.chatPopupSessionId_$.set(null);\n this.chatPopupSessionType_$.set(null);\n }\n\n /**\n * Vizuál editor megnyitása / bezárása.\n */\n selectInstance(instanceId: string | null): void {\n this.selectedInstanceId_$.set(instanceId);\n }\n\n /**\n * Instance státusz részletező modal megnyitása (overlay panel kattintás).\n */\n openInstanceStatusDetail(instanceId: string): void {\n this.instanceStatusDetailInstanceId_$.set(instanceId);\n }\n\n /**\n * Instance státusz részletező modal bezárása.\n */\n closeInstanceStatusDetail(): void {\n this.instanceStatusDetailInstanceId_$.set(null);\n }\n\n /**\n * CCAP instance-data sor a runtime SSOT listából (utolsó sikeres lista betöltés).\n * Socket-only frissítés után lehet, hogy hiányzik — ekkor csak az office UI state látszik a modalban.\n */\n getCcapInstanceDataSnapshot(ccapId: string): ExS_InstanceData_Response | undefined {\n return this.runtimeInstances_DS\n .ccapInstanceList_$()\n .find((row: ExS_InstanceData_Response): boolean => row.ccapId === ccapId);\n }\n\n /**\n * OCI instance-data sor a runtime SSOT listából (utolsó sikeres lista betöltés).\n */\n getOciInstanceDataSnapshot(instanceId: string): Oc_IInstanceData_Response | undefined {\n return this.runtimeInstances_DS\n .ociInstanceList_$()\n .find((row: Oc_IInstanceData_Response): boolean => row.instanceId === instanceId);\n }\n\n /**\n * CCI instance-data sor a runtime listából (`ccapId` alapján).\n */\n getCciInstanceDataSnapshot(ccapId: string): CC_CciInstanceData_Response | undefined {\n return this.runtimeInstances_DS\n .cciInstanceList_$()\n .find((row: CC_CciInstanceData_Response): boolean => row.ccapId === ccapId);\n }\n\n /**\n * CAI instance-data sor a runtime SSOT listából (`ccapId`).\n */\n getCaiInstanceDataSnapshot(ccapId: string): CA_IInstanceData_Response | undefined {\n return this.runtimeInstances_DS\n .caiInstanceList_$()\n .find((row: CA_IInstanceData_Response): boolean => row.ccapId === ccapId);\n }\n\n /**\n * `instances_$` lista szerinti office sor (`instanceId` egyezés) — overlay panel, scene, modal SSOT lookup.\n */\n resolveOfficeInstanceById(instanceId: string | null): DO_OfficeInstanceState_Interface | null {\n if (!instanceId) {\n return null;\n }\n const list: DO_OfficeInstanceState_Interface[] = this.instances_$();\n const found: DO_OfficeInstanceState_Interface | undefined = list.find(\n (row: DO_OfficeInstanceState_Interface): boolean => row.instanceId === instanceId,\n );\n return found ?? null;\n }\n\n /**\n * Instance státusz modal — CCAP session táblázat sorai (office raw → runtime snapshot → 5 perc prune SSOT).\n */\n resolveModalCcapSessionStatuses(\n inst: DO_OfficeInstanceState_Interface,\n ): ExS_InstanceData_SessionStatus_Interface[] {\n return DO_InstanceStatusModalSessionSource_Util.resolveCcapSessionStatuses({\n inst: inst,\n darkOffice_DS: this,\n });\n }\n\n /**\n * Instance státusz modal — OCI session táblázat sorai (ugyanaz a forrás-szabály mint CCAP).\n */\n resolveModalOciSessionStatuses(\n inst: DO_OfficeInstanceState_Interface,\n ): Oc_IInstanceData_SessionStatus_Interface[] {\n return DO_InstanceStatusModalSessionSource_Util.resolveOciSessionStatuses({\n inst: inst,\n darkOffice_DS: this,\n });\n }\n\n /**\n * Instance státusz modal — CCI session táblázat sorai (ugyanaz a forrás-szabály mint CCAP).\n */\n resolveModalCciSessionStatuses(\n inst: DO_OfficeInstanceState_Interface,\n ): CC_CciInstanceData_SessionStatus_Interface[] {\n return DO_InstanceStatusModalSessionSource_Util.resolveCciSessionStatuses({\n inst: inst,\n darkOffice_DS: this,\n });\n }\n\n /**\n * Instance státusz modal — CAI session táblázat sorai (ugyanaz a forrás-szabály mint CCI).\n */\n resolveModalCaiSessionStatuses(\n inst: DO_OfficeInstanceState_Interface,\n ): CA_IInstanceData_SessionStatus_Interface[] {\n return DO_InstanceStatusModalSessionSource_Util.resolveCaiSessionStatuses({\n inst: inst,\n darkOffice_DS: this,\n });\n }\n\n /**\n * Modal „runtime snapshot hint”: üres session lista + hiányzó runtime sor magyarázata (egyetlen helyen).\n */\n buildInstanceStatusDetailRuntimeHint(inst: DO_OfficeInstanceState_Interface): string {\n const type: DO_CharacterType_Type = inst.characterType ?? DO_CharacterType_Type.ccap;\n\n if (type === DO_CharacterType_Type.openclaw) {\n const ociResolved: Oc_IInstanceData_SessionStatus_Interface[] =\n this.resolveModalOciSessionStatuses(inst);\n if (ociResolved.length > 0) {\n return '';\n }\n const ociRow: Oc_IInstanceData_Response | undefined =\n this.getOciInstanceDataSnapshot(inst.instanceId);\n if (ociRow) {\n return '';\n }\n return 'No matching OCI row in runtime list (last load only; socket updates may not refresh this list).';\n }\n\n if (type === DO_CharacterType_Type.ccSession) {\n const ccapId: string | null = DO_CciOfficeInstanceId_Util.parseCcapId(inst.instanceId);\n if (!ccapId) {\n return '';\n }\n const cciResolved: CC_CciInstanceData_SessionStatus_Interface[] =\n this.resolveModalCciSessionStatuses(inst);\n if (cciResolved.length > 0) {\n return '';\n }\n const cciRow: CC_CciInstanceData_Response | undefined = this.getCciInstanceDataSnapshot(ccapId);\n if (cciRow) {\n return '';\n }\n return 'No matching CCI row in runtime list (last load only; socket updates may not refresh this list).';\n }\n\n if (type === DO_CharacterType_Type.caSession) {\n const ccapId: string | null = DO_CaiOfficeInstanceId_Util.parseCcapId(inst.instanceId);\n if (!ccapId) {\n return '';\n }\n const caiResolved: CA_IInstanceData_SessionStatus_Interface[] =\n this.resolveModalCaiSessionStatuses(inst);\n if (caiResolved.length > 0) {\n return '';\n }\n const caiRow: CA_IInstanceData_Response | undefined = this.getCaiInstanceDataSnapshot(ccapId);\n if (caiRow) {\n return '';\n }\n return 'No matching CAI row in runtime list (last load only; socket updates may not refresh this list).';\n }\n\n const ccapResolved: ExS_InstanceData_SessionStatus_Interface[] =\n this.resolveModalCcapSessionStatuses(inst);\n if (ccapResolved.length > 0) {\n return '';\n }\n const ccapRow: ExS_InstanceData_Response | undefined =\n this.getCcapInstanceDataSnapshot(inst.instanceId);\n if (ccapRow) {\n return '';\n }\n return 'No matching CCAP row in runtime list (last load only; socket updates may not refresh this list).';\n }\n\n // ---------------------------------------------------------------------------\n // Private: Meeting Room (working → idle) + session diff\n // ---------------------------------------------------------------------------\n\n /**\n * Lejárt Meeting Room időzítők törlése.\n */\n private pruneExpiredMeetingRoomKeys(nowMs: number): void {\n for (const key of [...this.sessionMeetingRoomUntilByKey.keys()]) {\n const until: number | undefined = this.sessionMeetingRoomUntilByKey.get(key);\n if (until !== undefined && until <= nowMs) {\n this.sessionMeetingRoomUntilByKey.delete(key);\n }\n }\n }\n\n /**\n * Session sorok előző vs következő snapshot: `working` → `idle` → Meeting Room ablak indítása.\n */\n private applyMeetingRoomTransitionForSessionDiff(params: {\n baseInstanceId: string;\n previousRows:\n | readonly ExS_InstanceData_SessionStatus_Interface[]\n | readonly Oc_IInstanceData_SessionStatus_Interface[]\n | readonly CC_CciInstanceData_SessionStatus_Interface[]\n | readonly CA_IInstanceData_SessionStatus_Interface[]\n | undefined;\n nextRows:\n | readonly ExS_InstanceData_SessionStatus_Interface[]\n | readonly Oc_IInstanceData_SessionStatus_Interface[]\n | readonly CC_CciInstanceData_SessionStatus_Interface[]\n | readonly CA_IInstanceData_SessionStatus_Interface[]\n | undefined;\n }): void {\n const nowMs: number = Date.now();\n this.pruneExpiredMeetingRoomKeys(nowMs);\n const prevById: Map<string, DO_Presence_Type> = new Map<\n string,\n DO_Presence_Type\n >();\n for (const row of params.previousRows ?? []) {\n prevById.set(row.sessionId, row.presence);\n }\n for (const row of params.nextRows ?? []) {\n const prevPresence: DO_Presence_Type | undefined = prevById.get(row.sessionId);\n const key: string = `${params.baseInstanceId}::${row.sessionId}`;\n if (\n prevPresence === DO_Presence_Type.working\n && row.presence === DO_Presence_Type.idle\n ) {\n this.sessionMeetingRoomUntilByKey.set(key, nowMs + this.meetingRoomLingerMs);\n }\n }\n }\n\n /**\n * Meeting Room aktív-e a session kulcshoz (linger ablak).\n */\n private resolveScenePlacementForSessionKey(params: {\n baseInstanceId: string;\n sessionId: string;\n }): DO_CharacterScenePlacement_Type | undefined {\n const key: string = `${params.baseInstanceId}::${params.sessionId}`;\n const until: number | undefined = this.sessionMeetingRoomUntilByKey.get(key);\n if (until !== undefined && Date.now() < until) {\n return DO_CharacterScenePlacement_Type.meeting;\n }\n return undefined;\n }\n\n // ---------------------------------------------------------------------------\n // Private: socket event handling\n // ---------------------------------------------------------------------------\n\n /**\n * Socket event handler: instance session status real-time frissítés.\n *\n * A payload-ból kinyert `ccapId` + `sessionStatuses` alapján frissíti az\n * `instances_$` listában a megfelelő instance-t. Ha nincs ilyen instance\n * (új instance jelent meg), teljes reload-ot indít fallback-ként.\n */\n private handleInstanceStatusUpdate(payload: Record<string, unknown>): void {\n const ccapId: string | undefined =\n typeof payload.ccapId === 'string' ? payload.ccapId : undefined;\n const rawStatuses: unknown = payload.sessionStatuses;\n const sessionStatuses: ExS_InstanceData_SessionStatus_Interface[] | undefined =\n Array.isArray(rawStatuses) ? rawStatuses : undefined;\n\n if (!ccapId || !sessionStatuses) {\n return;\n }\n\n const current: DO_OfficeInstanceState_Interface[] = this.instances_$();\n const existingIndex: number = current.findIndex(\n (inst: DO_OfficeInstanceState_Interface): boolean => inst.instanceId === ccapId,\n );\n\n // Ha az instance nem szerepel a listában → teljes reload (új instance jelent meg)\n if (existingIndex < 0) {\n void this.loadInstanceData();\n return;\n }\n\n // Meglévő instance frissítése a friss sessionStatuses alapján\n const existing: DO_OfficeInstanceState_Interface = current[existingIndex];\n this.applyMeetingRoomTransitionForSessionDiff({\n baseInstanceId: ccapId,\n previousRows: existing.rawSessionStatuses,\n nextRows: sessionStatuses,\n });\n const sessionInfo: {\n presence: DO_Presence_Type;\n activitySummary: string;\n currentRunFlowPhase: string | null;\n latestSessionId: string | null;\n lastMessage: string;\n } = this.resolveSessionInfoFromStatuses(sessionStatuses);\n\n // Slot újraszámolás ha presence változott\n const slotIndex: number = this.assignSlot(\n ccapId,\n sessionInfo.presence,\n existing,\n );\n\n // Animáció állapot transition\n const animState: DO_CharacterAnim_Type = this.resolveAnimState(\n sessionInfo.presence,\n existing.presence,\n );\n\n const updated: DO_OfficeInstanceState_Interface = this.applyPanelCardProjection({\n ...existing,\n presence: sessionInfo.presence,\n activitySummary: sessionInfo.activitySummary,\n currentRunFlowPhase: sessionInfo.currentRunFlowPhase,\n latestSessionId: sessionInfo.latestSessionId,\n lastMessage: sessionInfo.lastMessage,\n animState: animState,\n previousPresence: existing.presence,\n assignedSlotIndex: slotIndex,\n rawSessionStatuses: sessionStatuses,\n });\n\n this.instances_$.update(\n (list: DO_OfficeInstanceState_Interface[]): DO_OfficeInstanceState_Interface[] =>\n list.map(\n (inst: DO_OfficeInstanceState_Interface): DO_OfficeInstanceState_Interface =>\n inst.instanceId === ccapId ? updated : inst,\n ),\n );\n }\n\n /**\n * Session statuses tömb alapján presence és activity info kinyerése.\n * Azonos logika mint `resolveSessionInfo()`, de direkt `sessionStatuses` tömböt kap.\n */\n private resolveSessionInfoFromStatuses(\n statuses: ExS_InstanceData_SessionStatus_Interface[],\n ): {\n presence: DO_Presence_Type;\n activitySummary: string;\n currentRunFlowPhase: string | null;\n latestSessionId: string | null;\n lastMessage: string;\n } {\n // Üres lista: nincs tracked CCAP Session sor — nem jelent process-down állapotot (bootstrap is []).\n // A sor az API-ból jön / socket frissítés érkezett → instance elérhető → idle (OCI connected+no sessions minta).\n if (statuses.length === 0) {\n return {\n presence: DO_Presence_Type.idle,\n activitySummary: 'No CCAP Session activity',\n currentRunFlowPhase: null,\n latestSessionId: null,\n lastMessage: '',\n };\n }\n\n const primary: ExS_InstanceData_SessionStatus_Interface | null =\n DO_OfficeSessionPrimaryPick_Util.pickCcapPrimary(statuses);\n const status: ExS_InstanceData_SessionStatus_Interface =\n primary ?? statuses[0];\n\n return {\n presence: status.presence,\n activitySummary: status.activitySummary,\n currentRunFlowPhase: status.activeRunPhase ?? null,\n latestSessionId: status.sessionId,\n lastMessage: status.lastMessage ?? '',\n };\n }\n\n // ---------------------------------------------------------------------------\n // Private: instance panel projection (last-message label + multi-active sessions)\n // ---------------------------------------------------------------------------\n\n /**\n * Instance panel kártya mezők újraszámolása — template-ben nincs formatter hívás.\n * A `lastMessageDerivedStatusLabel` / `panelActiveSessionRows` bejövő értékeit felülírja.\n */\n private applyPanelCardProjection(inst: DO_OfficeInstanceState_Interface): DO_OfficeInstanceState_Interface {\n // Session név kinyerése rawSessionStatuses-ból ha nincs explicit beállítva (instance-szintű karaktereknél)\n let resolvedSessionName: string = inst.sessionName ?? '';\n if (!resolvedSessionName && inst.latestSessionId && inst.rawSessionStatuses) {\n for (const row of inst.rawSessionStatuses) {\n if (row.sessionId === inst.latestSessionId) {\n resolvedSessionName = row.sessionName ?? '';\n break;\n }\n }\n }\n\n return {\n ...inst,\n sessionName: resolvedSessionName,\n lastMessageDerivedStatusLabel: DO_PanelCardProjection_Util.buildLastMessageDerivedStatusLabel(\n inst.lastMessage,\n ),\n panelActiveSessionRows: DO_PanelCardProjection_Util.buildPanelActiveSessionRows({\n characterType: inst.characterType,\n rawSessionStatuses: inst.rawSessionStatuses,\n }),\n };\n }\n\n // ---------------------------------------------------------------------------\n // Private: instance data feldolgozás\n // ---------------------------------------------------------------------------\n\n /**\n * CCAP, OCI, CCI és CAI instance data lista együttes alkalmazása.\n *\n * Mapping:\n * - CCAP: `characterType: ccap`, `instanceId = ccapId`\n * - OCI: `characterType: openclaw`, `instanceId = OpenClaw instanceId`\n * - CCI: `characterType: ccSession`, `instanceId = cci:` + ccapId\n * - CAI: `characterType: caSession`, `instanceId = cai:` + ccapId\n */\n private applyAllInstanceData(\n ccapList: ExS_InstanceData_Response[],\n ociList: Oc_IInstanceData_Response[],\n cciList: CC_CciInstanceData_Response[],\n caiList: CA_IInstanceData_Response[],\n ): void {\n const current: DO_OfficeInstanceState_Interface[] = this.instances_$();\n const currentMap = new Map<string, DO_OfficeInstanceState_Interface>(\n current.map(\n (inst: DO_OfficeInstanceState_Interface): [string, DO_OfficeInstanceState_Interface] =>\n [inst.instanceId, inst],\n ),\n );\n\n // CCAP instance-ok feldolgozása\n const ccapUpdated: DO_OfficeInstanceState_Interface[] = ccapList.map(\n (data: ExS_InstanceData_Response): DO_OfficeInstanceState_Interface => {\n const existing: DO_OfficeInstanceState_Interface | undefined =\n currentMap.get(data.ccapId);\n const visuals: DO_CharacterVisuals_Response =\n existing?.visuals ?? this.mapToVisuals(data);\n const sessionInfo = this.resolveSessionInfo(data);\n const slotIndex: number = this.assignSlot(data.ccapId, sessionInfo.presence, existing);\n const animState: DO_CharacterAnim_Type = this.resolveAnimState(\n sessionInfo.presence, existing?.presence ?? null,\n );\n\n return this.applyPanelCardProjection({\n instanceId: data.ccapId,\n presence: sessionInfo.presence,\n activitySummary: sessionInfo.activitySummary,\n currentRunFlowPhase: sessionInfo.currentRunFlowPhase,\n latestSessionId: sessionInfo.latestSessionId,\n lastMessage: sessionInfo.lastMessage,\n visuals: visuals,\n animState: animState,\n previousPresence: existing?.presence ?? null,\n assignedSlotIndex: slotIndex,\n characterType: DO_CharacterType_Type.ccap,\n connectionStatus: null,\n rawSessionStatuses: data.sessionStatuses ?? [],\n lastMessageDerivedStatusLabel: '',\n panelActiveSessionRows: [],\n });\n },\n );\n\n // OCI instance-ok feldolgozása: minden regisztrált instance megjelenik\n // A connectionStatus a presence-t befolyásolja (disconnected → offline), de az instance nem tűnik el\n const ociUpdated: DO_OfficeInstanceState_Interface[] = ociList.map(\n (data: Oc_IInstanceData_Response): DO_OfficeInstanceState_Interface => {\n const existing: DO_OfficeInstanceState_Interface | undefined =\n currentMap.get(data.instanceId);\n const visuals: DO_CharacterVisuals_Response =\n existing?.visuals ?? this.mapOciToVisuals(data);\n const sessionInfo = this.resolveOciSessionInfo(data);\n const slotIndex: number = this.assignSlot(data.instanceId, sessionInfo.presence, existing);\n const animState: DO_CharacterAnim_Type = this.resolveAnimState(\n sessionInfo.presence, existing?.presence ?? null,\n );\n\n return this.applyPanelCardProjection({\n instanceId: data.instanceId,\n presence: sessionInfo.presence,\n activitySummary: sessionInfo.activitySummary,\n currentRunFlowPhase: null,\n latestSessionId: sessionInfo.latestSessionId,\n lastMessage: sessionInfo.lastMessage,\n visuals: visuals,\n animState: animState,\n previousPresence: existing?.presence ?? null,\n assignedSlotIndex: slotIndex,\n characterType: DO_CharacterType_Type.openclaw,\n connectionStatus: data.connectionStatus ?? null,\n rawSessionStatuses: data.sessionStatuses ?? [],\n lastMessageDerivedStatusLabel: '',\n panelActiveSessionRows: [],\n });\n },\n );\n\n const cciUpdated: DO_OfficeInstanceState_Interface[] = cciList.map(\n (data: CC_CciInstanceData_Response): DO_OfficeInstanceState_Interface => {\n const officeId: string = DO_CciOfficeInstanceId_Util.build({ ccapId: data.ccapId });\n const existing: DO_OfficeInstanceState_Interface | undefined =\n currentMap.get(officeId);\n const visuals: DO_CharacterVisuals_Response =\n existing?.visuals ?? this.mapCciToVisuals(data);\n const sessionInfo = this.resolveCciSessionInfo(data);\n const slotIndex: number = this.assignSlot(officeId, sessionInfo.presence, existing);\n const animState: DO_CharacterAnim_Type = this.resolveAnimState(\n sessionInfo.presence, existing?.presence ?? null,\n );\n\n return this.applyPanelCardProjection({\n instanceId: officeId,\n presence: sessionInfo.presence,\n activitySummary: sessionInfo.activitySummary,\n currentRunFlowPhase: sessionInfo.currentRunFlowPhase,\n latestSessionId: sessionInfo.latestSessionId,\n lastMessage: sessionInfo.lastMessage,\n visuals: visuals,\n animState: animState,\n previousPresence: existing?.presence ?? null,\n assignedSlotIndex: slotIndex,\n characterType: DO_CharacterType_Type.ccSession,\n connectionStatus: null,\n rawSessionStatuses: data.sessionStatuses ?? [],\n lastMessageDerivedStatusLabel: '',\n panelActiveSessionRows: [],\n });\n },\n );\n\n const caiUpdated: DO_OfficeInstanceState_Interface[] = caiList.map(\n (data: CA_IInstanceData_Response): DO_OfficeInstanceState_Interface => {\n const officeId: string = DO_CaiOfficeInstanceId_Util.build({ ccapId: data.ccapId });\n const existing: DO_OfficeInstanceState_Interface | undefined =\n currentMap.get(officeId);\n const visuals: DO_CharacterVisuals_Response =\n existing?.visuals ?? this.mapCaiToVisuals(data);\n const sessionInfo = this.resolveCaiSessionInfo(data);\n const slotIndex: number = this.assignSlot(officeId, sessionInfo.presence, existing);\n const animState: DO_CharacterAnim_Type = this.resolveAnimState(\n sessionInfo.presence, existing?.presence ?? null,\n );\n\n return this.applyPanelCardProjection({\n instanceId: officeId,\n presence: sessionInfo.presence,\n activitySummary: sessionInfo.activitySummary,\n currentRunFlowPhase: sessionInfo.currentRunFlowPhase,\n latestSessionId: sessionInfo.latestSessionId,\n lastMessage: sessionInfo.lastMessage,\n visuals: visuals,\n animState: animState,\n previousPresence: existing?.presence ?? null,\n assignedSlotIndex: slotIndex,\n characterType: DO_CharacterType_Type.caSession,\n connectionStatus: null,\n rawSessionStatuses: data.sessionStatuses ?? [],\n lastMessageDerivedStatusLabel: '',\n panelActiveSessionRows: [],\n });\n },\n );\n\n const updated: DO_OfficeInstanceState_Interface[] = [\n ...ccapUpdated,\n ...ociUpdated,\n ...cciUpdated,\n ...caiUpdated,\n ];\n\n for (const inst of updated) {\n const prev: DO_OfficeInstanceState_Interface | undefined = currentMap.get(inst.instanceId);\n this.applyMeetingRoomTransitionForSessionDiff({\n baseInstanceId: inst.instanceId,\n previousRows: prev?.rawSessionStatuses,\n nextRows: inst.rawSessionStatuses,\n });\n }\n\n // Walk-out animáció az eltűnt instance-okhoz (rövid ideig maradnak).\n const updatedIds = new Set<string>(\n updated.map((i: DO_OfficeInstanceState_Interface): string => i.instanceId),\n );\n const walkingOut: DO_OfficeInstanceState_Interface[] = current\n .filter(\n (inst: DO_OfficeInstanceState_Interface): boolean =>\n !updatedIds.has(inst.instanceId) &&\n inst.animState !== DO_CharacterAnim_Type.walkingOut,\n )\n .map(\n (inst: DO_OfficeInstanceState_Interface): DO_OfficeInstanceState_Interface =>\n this.applyPanelCardProjection({\n ...inst,\n animState: DO_CharacterAnim_Type.walkingOut,\n }),\n );\n\n this.instances_$.set([...updated, ...walkingOut]);\n\n // Walk-out instance-ok eltávolítása az animáció után.\n if (walkingOut.length > 0) {\n setTimeout((): void => {\n this.instances_$.update(\n (list: DO_OfficeInstanceState_Interface[]): DO_OfficeInstanceState_Interface[] =>\n list.filter(\n (inst: DO_OfficeInstanceState_Interface): boolean =>\n updatedIds.has(inst.instanceId),\n ),\n );\n }, DO_WALK_ANIMATION_DURATION_MS + 200);\n }\n }\n\n /**\n * Instance data → DO_CharacterVisuals_Response konverzió.\n * A szerver-oldali `darkOfficeVisuals` mezőiből épít + `name` mint `displayName`.\n * Hiányzó mezőkhöz alapértelmezet ad.\n */\n private mapToVisuals(data: ExS_InstanceData_Response): DO_CharacterVisuals_Response {\n const v: DO_CharacterVisuals_Response | undefined = data.darkOfficeVisuals;\n\n return {\n skinColor: v?.skinColor ?? DO_DEFAULT_CHARACTER_VISUALS.skinColor,\n hairColor: v?.hairColor ?? DO_DEFAULT_CHARACTER_VISUALS.hairColor,\n hairStyle: v?.hairStyle ?? DO_DEFAULT_CHARACTER_VISUALS.hairStyle,\n shirtColor: v?.shirtColor ?? DO_DEFAULT_CHARACTER_VISUALS.shirtColor,\n clothingStyle: v?.clothingStyle ?? DO_DEFAULT_CHARACTER_VISUALS.clothingStyle,\n pantsColor: v?.pantsColor ?? DO_DEFAULT_CHARACTER_VISUALS.pantsColor,\n eyeColor: v?.eyeColor ?? DO_DEFAULT_CHARACTER_VISUALS.eyeColor,\n bodyType: v?.bodyType ?? DO_DEFAULT_CHARACTER_VISUALS.bodyType,\n displayName: data.name ?? '',\n };\n }\n\n /**\n * Session statuses-ből presence és activity info kinyerése.\n *\n * Primary sor: `DO_OfficeSessionPrimaryPick_Util.pickCcapPrimary` (REQ-SYS-INSTANCE-PRIMARY-SESSION).\n * Üres lista → idle — nincs tracked session, de az instance aktív (nem „offline” process).\n */\n private resolveSessionInfo(data: ExS_InstanceData_Response): {\n presence: DO_Presence_Type;\n activitySummary: string;\n currentRunFlowPhase: string | null;\n latestSessionId: string | null;\n lastMessage: string;\n } {\n const statuses: ExS_InstanceData_SessionStatus_Interface[] | undefined =\n data.sessionStatuses;\n\n if (!statuses || statuses.length === 0) {\n return {\n presence: DO_Presence_Type.idle,\n activitySummary: 'No CCAP Session activity',\n currentRunFlowPhase: null,\n latestSessionId: null,\n lastMessage: '',\n };\n }\n\n const primary: ExS_InstanceData_SessionStatus_Interface | null =\n DO_OfficeSessionPrimaryPick_Util.pickCcapPrimary(statuses);\n const status: ExS_InstanceData_SessionStatus_Interface =\n primary ?? statuses[0];\n\n return {\n presence: status.presence,\n activitySummary: status.activitySummary,\n currentRunFlowPhase: status.activeRunPhase ?? null,\n latestSessionId: status.sessionId,\n lastMessage: status.lastMessage ?? '',\n };\n }\n\n /**\n * OCI instance data → DO_CharacterVisuals_Response konverzió (robot/bot vizuál séma).\n */\n private mapOciToVisuals(data: Oc_IInstanceData_Response): DO_CharacterVisuals_Response {\n const v: DO_CharacterVisuals_Response | undefined = data.darkOfficeVisuals;\n\n return {\n skinColor: v?.skinColor ?? DO_OCI_DEFAULT_CHARACTER_VISUALS.skinColor,\n hairColor: v?.hairColor ?? DO_OCI_DEFAULT_CHARACTER_VISUALS.hairColor,\n hairStyle: v?.hairStyle ?? DO_OCI_DEFAULT_CHARACTER_VISUALS.hairStyle,\n shirtColor: v?.shirtColor ?? DO_OCI_DEFAULT_CHARACTER_VISUALS.shirtColor,\n clothingStyle: v?.clothingStyle ?? DO_OCI_DEFAULT_CHARACTER_VISUALS.clothingStyle,\n pantsColor: v?.pantsColor ?? DO_OCI_DEFAULT_CHARACTER_VISUALS.pantsColor,\n eyeColor: v?.eyeColor ?? DO_OCI_DEFAULT_CHARACTER_VISUALS.eyeColor,\n bodyType: v?.bodyType ?? DO_OCI_DEFAULT_CHARACTER_VISUALS.bodyType,\n displayName: data.label ?? '',\n };\n }\n\n /**\n * CCI instance data → karakter vizuálok.\n */\n /**\n * CAI instance data → karakter vizuálok.\n */\n private mapCaiToVisuals(data: CA_IInstanceData_Response): DO_CharacterVisuals_Response {\n const v = data.darkOfficeVisuals;\n\n return {\n skinColor: v?.skinColor ?? DO_CAI_DEFAULT_CHARACTER_VISUALS.skinColor,\n hairColor: v?.hairColor ?? DO_CAI_DEFAULT_CHARACTER_VISUALS.hairColor,\n hairStyle: v?.hairStyle ?? DO_CAI_DEFAULT_CHARACTER_VISUALS.hairStyle,\n shirtColor: v?.shirtColor ?? DO_CAI_DEFAULT_CHARACTER_VISUALS.shirtColor,\n clothingStyle: v?.clothingStyle ?? DO_CAI_DEFAULT_CHARACTER_VISUALS.clothingStyle,\n pantsColor: v?.pantsColor ?? DO_CAI_DEFAULT_CHARACTER_VISUALS.pantsColor,\n eyeColor: v?.eyeColor ?? DO_CAI_DEFAULT_CHARACTER_VISUALS.eyeColor,\n bodyType: v?.bodyType ?? DO_CAI_DEFAULT_CHARACTER_VISUALS.bodyType,\n displayName: data.name ?? '',\n };\n }\n\n /**\n * CAI session lista alapján presence / összefoglaló — primary pick (REQ-SYS-INSTANCE-PRIMARY-SESSION).\n */\n private resolveCaiSessionInfo(data: CA_IInstanceData_Response): {\n presence: DO_Presence_Type;\n activitySummary: string;\n currentRunFlowPhase: string | null;\n latestSessionId: string | null;\n lastMessage: string;\n } {\n const statuses: CA_IInstanceData_SessionStatus_Interface[] =\n data.sessionStatuses ?? [];\n\n if (statuses.length === 0) {\n return {\n presence: DO_Presence_Type.idle,\n activitySummary: 'No CA Session activity',\n currentRunFlowPhase: null,\n latestSessionId: null,\n lastMessage: '',\n };\n }\n\n const primary: CA_IInstanceData_SessionStatus_Interface | null =\n DO_OfficeSessionPrimaryPick_Util.pickCaiPrimary(statuses);\n const status: CA_IInstanceData_SessionStatus_Interface =\n primary ?? statuses[0];\n\n return {\n presence: status.presence,\n activitySummary: status.activitySummary,\n currentRunFlowPhase: status.currentCaSessionStatus ?? null,\n latestSessionId: status.sessionId,\n lastMessage: status.lastMessage ?? '',\n };\n }\n\n private mapCciToVisuals(data: CC_CciInstanceData_Response): DO_CharacterVisuals_Response {\n /** CCI payload `displayName` nélkül — a név a root `name` mezőből jön. */\n const v = data.darkOfficeVisuals;\n\n return {\n skinColor: v?.skinColor ?? DO_CCI_DEFAULT_CHARACTER_VISUALS.skinColor,\n hairColor: v?.hairColor ?? DO_CCI_DEFAULT_CHARACTER_VISUALS.hairColor,\n hairStyle: v?.hairStyle ?? DO_CCI_DEFAULT_CHARACTER_VISUALS.hairStyle,\n shirtColor: v?.shirtColor ?? DO_CCI_DEFAULT_CHARACTER_VISUALS.shirtColor,\n clothingStyle: v?.clothingStyle ?? DO_CCI_DEFAULT_CHARACTER_VISUALS.clothingStyle,\n pantsColor: v?.pantsColor ?? DO_CCI_DEFAULT_CHARACTER_VISUALS.pantsColor,\n eyeColor: v?.eyeColor ?? DO_CCI_DEFAULT_CHARACTER_VISUALS.eyeColor,\n bodyType: v?.bodyType ?? DO_CCI_DEFAULT_CHARACTER_VISUALS.bodyType,\n displayName: data.name ?? '',\n };\n }\n\n /**\n * CCI session lista alapján presence / összefoglaló — primary pick (REQ-SYS-INSTANCE-PRIMARY-SESSION).\n */\n private resolveCciSessionInfo(data: CC_CciInstanceData_Response): {\n presence: DO_Presence_Type;\n activitySummary: string;\n currentRunFlowPhase: string | null;\n latestSessionId: string | null;\n lastMessage: string;\n } {\n const statuses: CC_CciInstanceData_SessionStatus_Interface[] =\n data.sessionStatuses ?? [];\n\n if (statuses.length === 0) {\n return {\n presence: DO_Presence_Type.idle,\n activitySummary: 'No CC Session activity',\n currentRunFlowPhase: null,\n latestSessionId: null,\n lastMessage: '',\n };\n }\n\n const primary: CC_CciInstanceData_SessionStatus_Interface | null =\n DO_OfficeSessionPrimaryPick_Util.pickCciPrimary(statuses);\n const status: CC_CciInstanceData_SessionStatus_Interface =\n primary ?? statuses[0];\n\n return {\n presence: status.presence,\n activitySummary: status.activitySummary,\n currentRunFlowPhase: status.currentCcSessionStatus ?? null,\n latestSessionId: status.sessionId,\n lastMessage: status.lastMessage ?? '',\n };\n }\n\n /**\n * OCI session statuses-ből presence és activity info kinyerése.\n *\n * **Fontos:** ha a gateway connectionStatus nem `connected`, az instance offline\n * — session statuses-ban a presence nem mindig friss (DB polling stale adat).\n */\n private resolveOciSessionInfo(data: Oc_IInstanceData_Response): {\n presence: DO_Presence_Type;\n activitySummary: string;\n latestSessionId: string | null;\n lastMessage: string;\n } {\n // Gateway nem connected → instance offline\n const isGatewayOnline: boolean =\n data.connectionStatus === Oc_iConnectionStatus_Type.connected;\n\n if (!isGatewayOnline) {\n return {\n presence: DO_Presence_Type.offline,\n activitySummary: 'Gateway disconnected',\n latestSessionId: null,\n lastMessage: '',\n };\n }\n\n const statuses: Oc_IInstanceData_SessionStatus_Interface[] =\n data.sessionStatuses ?? [];\n\n // Connected gateway, de nincs session info → idle (nem offline!)\n // A karakter bent ül az irodában, buborékban \"Connected\" felirat\n if (statuses.length === 0) {\n return {\n presence: DO_Presence_Type.idle,\n activitySummary: 'Connected',\n latestSessionId: null,\n lastMessage: '',\n };\n }\n\n const primary: Oc_IInstanceData_SessionStatus_Interface | null =\n DO_OciSessionPrimaryPick_Util.pickPrimary(statuses);\n\n if (!primary) {\n return {\n presence: DO_Presence_Type.idle,\n activitySummary: 'Connected',\n latestSessionId: null,\n lastMessage: '',\n };\n }\n\n return {\n presence: primary.presence,\n activitySummary: primary.activitySummary,\n latestSessionId: primary.sessionId,\n lastMessage: primary.lastMessage ?? '',\n };\n }\n\n /**\n * Socket event handler: OCI instance státusz real-time frissítés.\n *\n * - **Gateway connected:** presence a session statuses alapján (working/idle/connected)\n * - **Gateway disconnected:** offline presence (karakter bent marad az irodában)\n */\n private handleOciInstanceStatusUpdate(payload: Record<string, unknown>): void {\n const instanceId: string | undefined =\n typeof payload.instanceId === 'string'\n ? payload.instanceId\n : undefined;\n const rawStatuses: unknown = payload.sessionStatuses;\n const sessionStatuses: Oc_IInstanceData_SessionStatus_Interface[] | undefined =\n Array.isArray(rawStatuses) ? rawStatuses : undefined;\n const connectionStatus: string | undefined =\n typeof payload.connectionStatus === 'string'\n ? payload.connectionStatus\n : undefined;\n\n if (!instanceId) {\n return;\n }\n\n const current: DO_OfficeInstanceState_Interface[] = this.instances_$();\n const existingIndex: number = current.findIndex(\n (inst: DO_OfficeInstanceState_Interface): boolean =>\n inst.instanceId === instanceId,\n );\n\n const isGatewayOnline: boolean =\n connectionStatus === Oc_iConnectionStatus_Type.connected;\n\n // Gateway disconnected → offline presence (karakter bent marad az irodában)\n if (!isGatewayOnline && existingIndex >= 0) {\n const existing: DO_OfficeInstanceState_Interface = current[existingIndex];\n const slotIndex: number = this.assignSlot(instanceId, DO_Presence_Type.offline, existing);\n const animState: DO_CharacterAnim_Type = this.resolveAnimState(\n DO_Presence_Type.offline, existing.presence,\n );\n\n this.instances_$.update(\n (list: DO_OfficeInstanceState_Interface[]): DO_OfficeInstanceState_Interface[] =>\n list.map(\n (inst: DO_OfficeInstanceState_Interface): DO_OfficeInstanceState_Interface =>\n inst.instanceId === instanceId\n ? this.applyPanelCardProjection({\n ...inst,\n presence: DO_Presence_Type.offline,\n activitySummary: 'Gateway disconnected',\n lastMessage: '',\n animState: animState,\n previousPresence: existing.presence,\n assignedSlotIndex: slotIndex,\n connectionStatus:\n (connectionStatus as Oc_iConnectionStatus_Type) ?? inst.connectionStatus,\n })\n : inst,\n ),\n );\n return;\n }\n\n // Ha nem szerepel a listában → teljes reload (új instance jelent meg)\n if (existingIndex < 0) {\n void this.loadInstanceData();\n return;\n }\n\n const existing: DO_OfficeInstanceState_Interface = current[existingIndex];\n\n // Presence logika: connected + session statuses alapján\n const statuses: Oc_IInstanceData_SessionStatus_Interface[] =\n sessionStatuses ?? [];\n\n this.applyMeetingRoomTransitionForSessionDiff({\n baseInstanceId: instanceId,\n previousRows: existing.rawSessionStatuses,\n nextRows: statuses,\n });\n\n let sessionInfo: {\n presence: DO_Presence_Type;\n activitySummary: string;\n latestSessionId: string | null;\n lastMessage: string;\n };\n\n if (statuses.length > 0) {\n const primary: Oc_IInstanceData_SessionStatus_Interface | null =\n DO_OciSessionPrimaryPick_Util.pickPrimary(statuses);\n if (primary) {\n sessionInfo = {\n presence: primary.presence,\n activitySummary: primary.activitySummary,\n latestSessionId: primary.sessionId,\n lastMessage: primary.lastMessage ?? '',\n };\n } else {\n sessionInfo = {\n presence: DO_Presence_Type.idle,\n activitySummary: 'Connected',\n latestSessionId: null,\n lastMessage: '',\n };\n }\n } else {\n // Connected gateway, nincs session info → idle (nem offline)\n sessionInfo = {\n presence: DO_Presence_Type.idle,\n activitySummary: 'Connected',\n latestSessionId: null,\n lastMessage: '',\n };\n }\n\n const slotIndex: number = this.assignSlot(\n instanceId,\n sessionInfo.presence,\n existing,\n );\n const animState: DO_CharacterAnim_Type = this.resolveAnimState(\n sessionInfo.presence,\n existing.presence,\n );\n\n const updated: DO_OfficeInstanceState_Interface = this.applyPanelCardProjection({\n ...existing,\n presence: sessionInfo.presence,\n activitySummary: sessionInfo.activitySummary,\n latestSessionId: sessionInfo.latestSessionId,\n lastMessage: sessionInfo.lastMessage,\n animState: animState,\n previousPresence: existing.presence,\n assignedSlotIndex: slotIndex,\n connectionStatus: (connectionStatus as Oc_iConnectionStatus_Type) ?? existing.connectionStatus,\n rawSessionStatuses: statuses,\n });\n\n this.instances_$.update(\n (list: DO_OfficeInstanceState_Interface[]): DO_OfficeInstanceState_Interface[] =>\n list.map(\n (inst: DO_OfficeInstanceState_Interface): DO_OfficeInstanceState_Interface =>\n inst.instanceId === instanceId ? updated : inst,\n ),\n );\n }\n\n /**\n * Socket: CCI instance státusz frissítés (`officeInstanceId` kulcs).\n */\n private handleCciInstanceStatusUpdate(payload: Record<string, unknown>): void {\n const officeInstanceId: string | undefined =\n typeof payload.officeInstanceId === 'string'\n ? payload.officeInstanceId\n : undefined;\n const rawStatuses: unknown = payload.sessionStatuses;\n const sessionStatuses: CC_CciInstanceData_SessionStatus_Interface[] | undefined =\n Array.isArray(rawStatuses) ? rawStatuses : undefined;\n\n if (!officeInstanceId) {\n return;\n }\n\n const current: DO_OfficeInstanceState_Interface[] = this.instances_$();\n const existingIndex: number = current.findIndex(\n (inst: DO_OfficeInstanceState_Interface): boolean =>\n inst.instanceId === officeInstanceId,\n );\n\n if (existingIndex < 0) {\n void this.loadInstanceData();\n return;\n }\n\n const existing: DO_OfficeInstanceState_Interface = current[existingIndex];\n const statuses: CC_CciInstanceData_SessionStatus_Interface[] =\n sessionStatuses ?? [];\n\n this.applyMeetingRoomTransitionForSessionDiff({\n baseInstanceId: officeInstanceId,\n previousRows: existing.rawSessionStatuses,\n nextRows: statuses,\n });\n\n const sessionInfo: {\n presence: DO_Presence_Type;\n activitySummary: string;\n currentRunFlowPhase: string | null;\n latestSessionId: string | null;\n lastMessage: string;\n } = this.resolveSessionInfoFromCciStatuses(statuses);\n\n const slotIndex: number = this.assignSlot(\n officeInstanceId,\n sessionInfo.presence,\n existing,\n );\n const animState: DO_CharacterAnim_Type = this.resolveAnimState(\n sessionInfo.presence,\n existing.presence,\n );\n\n const updated: DO_OfficeInstanceState_Interface = this.applyPanelCardProjection({\n ...existing,\n presence: sessionInfo.presence,\n activitySummary: sessionInfo.activitySummary,\n currentRunFlowPhase: sessionInfo.currentRunFlowPhase,\n latestSessionId: sessionInfo.latestSessionId,\n lastMessage: sessionInfo.lastMessage,\n animState: animState,\n previousPresence: existing.presence,\n assignedSlotIndex: slotIndex,\n rawSessionStatuses: statuses,\n });\n\n this.instances_$.update(\n (list: DO_OfficeInstanceState_Interface[]): DO_OfficeInstanceState_Interface[] =>\n list.map(\n (inst: DO_OfficeInstanceState_Interface): DO_OfficeInstanceState_Interface =>\n inst.instanceId === officeInstanceId ? updated : inst,\n ),\n );\n }\n\n /**\n * Socket: CAI instance státusz frissítés (`officeInstanceId` kulcs).\n */\n private handleCaiInstanceStatusUpdate(payload: Record<string, unknown>): void {\n const officeInstanceId: string | undefined =\n typeof payload.officeInstanceId === 'string'\n ? payload.officeInstanceId\n : undefined;\n const rawStatuses: unknown = payload.sessionStatuses;\n const sessionStatuses: CA_IInstanceData_SessionStatus_Interface[] | undefined =\n Array.isArray(rawStatuses) ? rawStatuses : undefined;\n\n if (!officeInstanceId) {\n return;\n }\n\n const current: DO_OfficeInstanceState_Interface[] = this.instances_$();\n const existingIndex: number = current.findIndex(\n (inst: DO_OfficeInstanceState_Interface): boolean =>\n inst.instanceId === officeInstanceId,\n );\n\n if (existingIndex < 0) {\n void this.loadInstanceData();\n return;\n }\n\n const existing: DO_OfficeInstanceState_Interface = current[existingIndex];\n const statuses: CA_IInstanceData_SessionStatus_Interface[] =\n sessionStatuses ?? [];\n\n this.applyMeetingRoomTransitionForSessionDiff({\n baseInstanceId: officeInstanceId,\n previousRows: existing.rawSessionStatuses,\n nextRows: statuses,\n });\n\n const sessionInfo: {\n presence: DO_Presence_Type;\n activitySummary: string;\n currentRunFlowPhase: string | null;\n latestSessionId: string | null;\n lastMessage: string;\n } = this.resolveSessionInfoFromCaiStatuses(statuses);\n\n const slotIndex: number = this.assignSlot(\n officeInstanceId,\n sessionInfo.presence,\n existing,\n );\n const animState: DO_CharacterAnim_Type = this.resolveAnimState(\n sessionInfo.presence,\n existing.presence,\n );\n\n const updated: DO_OfficeInstanceState_Interface = this.applyPanelCardProjection({\n ...existing,\n presence: sessionInfo.presence,\n activitySummary: sessionInfo.activitySummary,\n currentRunFlowPhase: sessionInfo.currentRunFlowPhase,\n latestSessionId: sessionInfo.latestSessionId,\n lastMessage: sessionInfo.lastMessage,\n animState: animState,\n previousPresence: existing.presence,\n assignedSlotIndex: slotIndex,\n rawSessionStatuses: statuses,\n });\n\n this.instances_$.update(\n (list: DO_OfficeInstanceState_Interface[]): DO_OfficeInstanceState_Interface[] =>\n list.map(\n (inst: DO_OfficeInstanceState_Interface): DO_OfficeInstanceState_Interface =>\n inst.instanceId === officeInstanceId ? updated : inst,\n ),\n );\n }\n\n /**\n * CCI session statuses tömb → presence info (socket push).\n */\n private resolveSessionInfoFromCciStatuses(\n statuses: CC_CciInstanceData_SessionStatus_Interface[],\n ): {\n presence: DO_Presence_Type;\n activitySummary: string;\n currentRunFlowPhase: string | null;\n latestSessionId: string | null;\n lastMessage: string;\n } {\n if (statuses.length === 0) {\n return {\n presence: DO_Presence_Type.idle,\n activitySummary: 'No CC Session activity',\n currentRunFlowPhase: null,\n latestSessionId: null,\n lastMessage: '',\n };\n }\n\n const primary: CC_CciInstanceData_SessionStatus_Interface | null =\n DO_OfficeSessionPrimaryPick_Util.pickCciPrimary(statuses);\n const status: CC_CciInstanceData_SessionStatus_Interface =\n primary ?? statuses[0];\n\n return {\n presence: status.presence,\n activitySummary: status.activitySummary,\n currentRunFlowPhase: status.currentCcSessionStatus ?? null,\n latestSessionId: status.sessionId,\n lastMessage: status.lastMessage ?? '',\n };\n }\n\n /**\n * CAI session statuses tömb → presence info (socket push).\n */\n private resolveSessionInfoFromCaiStatuses(\n statuses: CA_IInstanceData_SessionStatus_Interface[],\n ): {\n presence: DO_Presence_Type;\n activitySummary: string;\n currentRunFlowPhase: string | null;\n latestSessionId: string | null;\n lastMessage: string;\n } {\n if (statuses.length === 0) {\n return {\n presence: DO_Presence_Type.idle,\n activitySummary: 'No CA Session activity',\n currentRunFlowPhase: null,\n latestSessionId: null,\n lastMessage: '',\n };\n }\n\n const primary: CA_IInstanceData_SessionStatus_Interface | null =\n DO_OfficeSessionPrimaryPick_Util.pickCaiPrimary(statuses);\n const status: CA_IInstanceData_SessionStatus_Interface =\n primary ?? statuses[0];\n\n return {\n presence: status.presence,\n activitySummary: status.activitySummary,\n currentRunFlowPhase: status.currentCaSessionStatus ?? null,\n latestSessionId: status.sessionId,\n lastMessage: status.lastMessage ?? '',\n };\n }\n\n // ---------------------------------------------------------------------------\n // Private: debounced server PATCH\n // ---------------------------------------------------------------------------\n\n /**\n * Debounce-olt PATCH hívás ütemezése.\n * Az instanceId-nkénti timer biztosítja, hogy gyors kattintásoknál\n * csak az utolsó állapot megy a szerverre (300ms idle után).\n */\n private schedulePatch(\n instanceId: string,\n visuals: DO_CharacterVisuals_Response,\n ): void {\n // Előző timer törlése ehhez az instance-hoz\n const existingTimer: ReturnType<typeof setTimeout> | undefined =\n this.patchTimerMap.get(instanceId);\n if (existingTimer !== undefined) {\n clearTimeout(existingTimer);\n }\n\n // Új timer: 300ms után PATCH\n const timerId: ReturnType<typeof setTimeout> = setTimeout((): void => {\n this.patchTimerMap.delete(instanceId);\n\n const { displayName, ...darkOfficeVisuals } = visuals;\n\n // OCI vagy CCAP instance detektálás (characterType alapján)\n const instanceState: DO_OfficeInstanceState_Interface | undefined =\n this.instances_$().find(\n (i: DO_OfficeInstanceState_Interface): boolean => i.instanceId === instanceId,\n );\n\n const caiCcapId: string | null = DO_CaiOfficeInstanceId_Util.parseCcapId(instanceId);\n const cciCcapId: string | null = DO_CciOfficeInstanceId_Util.parseCcapId(instanceId);\n\n if (caiCcapId !== null) {\n void this.caiInstanceData_AS.patchByCcapId({\n ccapId: caiCcapId,\n name: displayName || undefined,\n darkOfficeVisuals: darkOfficeVisuals,\n });\n } else if (cciCcapId !== null) {\n void this.cciInstanceData_AS.patchByCcapId({\n ccapId: cciCcapId,\n name: displayName || undefined,\n darkOfficeVisuals: darkOfficeVisuals,\n });\n } else if (instanceState?.characterType === DO_CharacterType_Type.openclaw) {\n void this.ociInstanceData_AS.patchVisuals({\n instanceId: instanceId,\n label: displayName || undefined,\n darkOfficeVisuals: darkOfficeVisuals,\n });\n } else {\n // SSOT: displayName → name (gyökér mező), vizuál mezők → darkOfficeVisuals (displayName nélkül!)\n void this.instanceData_AS.patchByCcapId({\n ccapId: instanceId,\n name: displayName || undefined,\n darkOfficeVisuals: darkOfficeVisuals,\n });\n }\n }, 300);\n\n this.patchTimerMap.set(instanceId, timerId);\n }\n\n // ---------------------------------------------------------------------------\n // Private: slot kiosztás és animáció\n // ---------------------------------------------------------------------------\n\n /**\n * Slot kiosztás az instance presence-je alapján.\n * Working → workstation slot; idle/standing → rest slot.\n * Meglévő slot kiosztást megtartja ha lehetséges.\n */\n private assignSlot(\n instanceId: string,\n presence: DO_Presence_Type,\n existing: DO_OfficeInstanceState_Interface | undefined,\n ): number {\n const isWorking: boolean = presence === DO_Presence_Type.working;\n const slotMap: Map<string, number> = isWorking\n ? this.workstationSlotMap\n : this.restSlotMap;\n const maxSlots: number = isWorking\n ? this.darkOfficeLayout_DS.workstationCapacity_$()\n : this.darkOfficeLayout_DS.restCapacity_$();\n\n // Meglévő slot megtartása ha a típus nem változott.\n if (slotMap.has(instanceId)) {\n return slotMap.get(instanceId) as number;\n }\n\n // Régi slot felszabadítása ha presence típus váltott.\n this.workstationSlotMap.delete(instanceId);\n this.restSlotMap.delete(instanceId);\n\n // Szabad slot keresése.\n const usedSlots = new Set<number>(slotMap.values());\n for (let i: number = 0; i < maxSlots; i++) {\n if (!usedSlots.has(i)) {\n slotMap.set(instanceId, i);\n return i;\n }\n }\n\n // Nincs szabad definiált slot → túlcsordulás: egyedi index a slotokon túl.\n let overflow: number = maxSlots;\n while (usedSlots.has(overflow)) {\n overflow++;\n }\n slotMap.set(instanceId, overflow);\n return overflow;\n }\n\n /**\n * Animáció állapot meghatározása presence átmenet alapján (BUG-DO-CHAR-RESPAWN-JITTER-001 fix).\n *\n * **Tranzíciós állapotok (walk-in / walk-out / walk-between) csak EGYSZER tüzelnek**\n * a presence-flip detektálásakor. A komponens lokálisan 2s alatt átmegy a végleges pózba\n * (`syncAnimState` setTimeout); a következő status-update-re a data-service már a természetes\n * állapotot (working / sitting / standing) adja vissza, így a CSS animáció **nem indul újra**\n * minden tickre.\n *\n * Korábban a függvény `currentAnim === walkingIn|walkingBetween` esetén megőrizte a tranzíciós\n * állapotot, ami architectural gap-et hozott létre: a komponens lokálisan végzett a sétával,\n * de a data-service `animState`-je végtelenül walkingIn/walkingBetween maradt, és minden\n * socket-frissítésnél respawn-jittert okozott a karakter hirtelen újra-bejövetelével.\n */\n private resolveAnimState(\n presence: DO_Presence_Type,\n previousPresence: DO_Presence_Type | null,\n ): DO_CharacterAnim_Type {\n // Offline → bármilyen online: walk-in animáció (egyszer)\n if (\n previousPresence === DO_Presence_Type.offline &&\n presence !== DO_Presence_Type.offline\n ) {\n return DO_CharacterAnim_Type.walkingIn;\n }\n\n // Bármilyen online → offline: walk-out animáció (egyszer)\n if (\n previousPresence !== null &&\n previousPresence !== DO_Presence_Type.offline &&\n presence === DO_Presence_Type.offline\n ) {\n return DO_CharacterAnim_Type.walkingOut;\n }\n\n // Idle ↔ working átmenet: slotok közötti séta animáció (egyszer)\n if (\n previousPresence !== null &&\n previousPresence !== DO_Presence_Type.offline &&\n presence !== DO_Presence_Type.offline &&\n previousPresence !== presence\n ) {\n return DO_CharacterAnim_Type.walkingBetween;\n }\n\n // Presence alapján alap animáció (steady state — nincs respawn-jitter)\n if (presence === DO_Presence_Type.working) {\n return DO_CharacterAnim_Type.working;\n }\n if (presence === DO_Presence_Type.idle) {\n return DO_CharacterAnim_Type.sitting;\n }\n return DO_CharacterAnim_Type.standing;\n }\n\n // ---------------------------------------------------------------------------\n // Private: per-session karakter kibontás\n // ---------------------------------------------------------------------------\n\n /**\n * Scene-hez: egyedi `assignedSlotIndex` minden karakterre a presence-csoporton belül (globálisan a listában).\n *\n * Az `assignSlot` csak `instances_$`-nál instance-onként egy foglalást tart; a multi-session expand korábban\n * per-instance ordinal-t adott, ami ütközhetett más instance slotjával ugyanazon a workstation/rest téren.\n * Itt sorrendben kiosztjuk: `working` → 0..n−1, egyéb (idle) → külön 0..m−1 — a két csoport külön slot-tömböt\n * használ a `do-character` / `do-svg-char` resolve-ban, így nincs azonos pixel-pozíció.\n */\n private assignDistinctSlotsForScene(\n characters: DO_OfficeInstanceState_Interface[],\n ): DO_OfficeInstanceState_Interface[] {\n let workingNext: number = 0;\n let restNext: number = 0;\n let meetingNext: number = 0;\n\n return characters.map(\n (char: DO_OfficeInstanceState_Interface): DO_OfficeInstanceState_Interface => {\n let slotIndex: number;\n if (char.scenePlacement === DO_CharacterScenePlacement_Type.meeting) {\n slotIndex = meetingNext++;\n } else if (char.presence === DO_Presence_Type.working) {\n slotIndex = workingNext++;\n } else {\n slotIndex = restNext++;\n }\n\n return {\n ...char,\n assignedSlotIndex: slotIndex,\n };\n },\n );\n }\n\n /**\n * Instance lista kibontása karakterekre — additív kardinálás (REQ-DO-CHAR-CARDINALITY-001).\n *\n * **Szabály:** minden nem-offline instance-ra:\n * - **1 baseline karakter** az instance-szintű representation-höz (sessionId nélkül, idle póz),\n * ami akkor is megjelenik, ha nincs aktív session — az instance „itt van, fut\".\n * - **+1 karakter per aktív session** a `working` + utolsó 5 perc ablakon belüli sorokra\n * (`isWorkingSessionRecentAndOnline`).\n *\n * Inaktív / stale session-höz NEM tartozik scene karakter (panel-kártya változatlanul mutatja).\n * Offline instance esetén egyetlen karakter sincs.\n *\n * A végső slot indexeket a `characters_$` computed-ben az `assignDistinctSlotsForScene` állítja be.\n */\n private expandInstancesToCharacters(\n instances: DO_OfficeInstanceState_Interface[],\n ): DO_OfficeInstanceState_Interface[] {\n const result: DO_OfficeInstanceState_Interface[] = [];\n const nowMs: number = Date.now();\n const recentWindowMs: number = DO_SceneSessionEligibility_Util.sceneRecentActivityWindowMs;\n const idleWalkWindowMs: number = DO_SceneSessionEligibility_Util.sceneIdleWalkActivityWindowMs;\n\n for (const inst of instances) {\n // Offline instance → nincs karakter a scene-ben\n if (inst.presence === DO_Presence_Type.offline) {\n continue;\n }\n\n // 1) Instance baseline karakter (mindig — instance-szintű representation, sessionId nélkül).\n result.push(this.buildInstanceBaselineCharacter(inst));\n\n // 2) Per-session karakterek két ágon (REQ-DO-CHAR-CARDINALITY-001 + REQ-DO-CHAR-IDLE-WALK-001):\n // - working + 5 perces ablak → working session karakter (workstation slot, working pose)\n // - 5–15 perces idle-walk ablak → idle-walking karakter (rest slot, leg-swing animáció)\n // - 15 perc fölött → nincs scene karakter\n const sessions: (ExS_InstanceData_SessionStatus_Interface\n | Oc_IInstanceData_SessionStatus_Interface\n | CC_CciInstanceData_SessionStatus_Interface\n | CA_IInstanceData_SessionStatus_Interface)[] =\n inst.rawSessionStatuses ?? [];\n\n for (const session of sessions) {\n if (DO_SceneSessionEligibility_Util.isWorkingSessionRecentAndOnline({\n row: session,\n nowMs: nowMs,\n windowMs: recentWindowMs,\n })) {\n result.push(this.buildPerSessionOfficeCharacter(inst, session));\n continue;\n }\n if (DO_SceneSessionEligibility_Util.isSessionInIdleWalkWindow({\n row: session,\n nowMs: nowMs,\n recentWindowMs: recentWindowMs,\n idleWalkWindowMs: idleWalkWindowMs,\n })) {\n result.push(this.buildIdleWalkSessionCharacter(inst, session));\n }\n }\n }\n\n return result;\n }\n\n /**\n * Idle-walk per-session karakter (REQ-DO-CHAR-IDLE-WALK-001) — a session már nem dolgozik aktívan,\n * de a `lastActivityAt` még az idle-walk ablakban van. Pihenő slot pózba kerül leg-swing\n * animációval; a 15 perces ablak letelte után a karakter eltűnik (a `expandInstancesToCharacters`\n * eligibility ágain).\n */\n private buildIdleWalkSessionCharacter(\n inst: DO_OfficeInstanceState_Interface,\n session:\n | ExS_InstanceData_SessionStatus_Interface\n | Oc_IInstanceData_SessionStatus_Interface\n | CC_CciInstanceData_SessionStatus_Interface\n | CA_IInstanceData_SessionStatus_Interface,\n ): DO_OfficeInstanceState_Interface {\n const charKey: string = `${inst.instanceId}::${session.sessionId}`;\n return this.applyPanelCardProjection({\n ...inst,\n instanceId: charKey,\n sessionId: session.sessionId,\n sessionName: session.sessionName ?? '',\n presence: DO_Presence_Type.idle,\n activitySummary: session.activitySummary,\n lastMessage: session.lastMessage ?? '',\n latestSessionId: session.sessionId,\n currentRunFlowPhase: DarkOffice_DataService.resolveSessionRunFlowPhaseLabel(session),\n assignedSlotIndex: 0,\n animState: DO_CharacterAnim_Type.idleWalking,\n previousPresence: null,\n scenePlacement: undefined,\n rawSessionStatuses: undefined,\n lastMessageDerivedStatusLabel: '',\n panelActiveSessionRows: [],\n });\n }\n\n /**\n * Instance-szintű baseline karakter — sessionId nélkül, instance-ként rendereli a host-ot.\n *\n * Független a sessionöktől: akkor is megjelenik, ha 0 aktív session van. Az `instanceId` a tiszta\n * instance-azonosító (composite `${baseId}::${sessionId}` nélkül), így a per-session karakterektől\n * az Angular `@for track` is meg tudja különböztetni.\n */\n private buildInstanceBaselineCharacter(\n inst: DO_OfficeInstanceState_Interface,\n ): DO_OfficeInstanceState_Interface {\n return this.applyPanelCardProjection({\n ...inst,\n instanceId: inst.instanceId,\n sessionId: undefined,\n sessionName: '',\n // Baseline mindig idle pozícióban — a working presence-t a per-session karakterek képviselik.\n presence: DO_Presence_Type.idle,\n activitySummary: inst.activitySummary,\n lastMessage: '',\n latestSessionId: null,\n currentRunFlowPhase: null,\n assignedSlotIndex: 0,\n animState: DO_CharacterAnim_Type.sitting,\n previousPresence: null,\n scenePlacement: undefined,\n rawSessionStatuses: inst.rawSessionStatuses,\n lastMessageDerivedStatusLabel: '',\n panelActiveSessionRows: [],\n });\n }\n\n /**\n * Több session-ből egy scene-beli karakter sor — session-specifikus mezők + panel projection.\n */\n private buildPerSessionOfficeCharacter(\n inst: DO_OfficeInstanceState_Interface,\n session:\n | ExS_InstanceData_SessionStatus_Interface\n | Oc_IInstanceData_SessionStatus_Interface\n | CC_CciInstanceData_SessionStatus_Interface\n | CA_IInstanceData_SessionStatus_Interface,\n ): DO_OfficeInstanceState_Interface {\n const charKey: string = `${inst.instanceId}::${session.sessionId}`;\n const meetingPlacement: DO_CharacterScenePlacement_Type | undefined =\n session.presence === DO_Presence_Type.working\n ? undefined\n : this.resolveScenePlacementForSessionKey({\n baseInstanceId: inst.instanceId,\n sessionId: session.sessionId,\n });\n const scenePlacement: DO_CharacterScenePlacement_Type | undefined =\n meetingPlacement === DO_CharacterScenePlacement_Type.meeting\n ? DO_CharacterScenePlacement_Type.meeting\n : undefined;\n\n return this.applyPanelCardProjection({\n ...inst,\n instanceId: charKey,\n sessionId: session.sessionId,\n sessionName: session.sessionName ?? '',\n presence: session.presence,\n activitySummary: session.activitySummary,\n lastMessage: session.lastMessage ?? '',\n latestSessionId: session.sessionId,\n currentRunFlowPhase: DarkOffice_DataService.resolveSessionRunFlowPhaseLabel(session),\n assignedSlotIndex: 0,\n animState: session.presence === DO_Presence_Type.working\n ? DO_CharacterAnim_Type.working\n : DO_CharacterAnim_Type.sitting,\n previousPresence: null,\n scenePlacement: scenePlacement,\n rawSessionStatuses: undefined,\n lastMessageDerivedStatusLabel: '',\n panelActiveSessionRows: [],\n });\n }\n\n /**\n * Session státusz sorból run-flow / CC session fázis címke a scene bubble-hoz.\n */\n private static resolveSessionRunFlowPhaseLabel(\n session:\n | ExS_InstanceData_SessionStatus_Interface\n | Oc_IInstanceData_SessionStatus_Interface\n | CC_CciInstanceData_SessionStatus_Interface\n | CA_IInstanceData_SessionStatus_Interface,\n ): string | null {\n if ('activeRunPhase' in session) {\n return session.activeRunPhase ?? null;\n }\n if ('currentCcSessionStatus' in session) {\n const v: string | undefined = session.currentCcSessionStatus;\n\n return v ?? null;\n }\n if ('currentCaSessionStatus' in session) {\n const v: string | undefined = session.currentCaSessionStatus;\n\n return v ?? null;\n }\n\n return null;\n }\n}\n", "/**\n * OCI (OpenClaw Instance) kapcsolat állapot típus enum (kliens oldali).\n * Tükörképe a szerver-oldali `Oc_iConnectionStatus_Type`-nak.\n */\nexport enum Oc_iConnectionStatus_Type {\n /** Gateway elérhető és WS kapcsolat felépíthető. */\n connected = 'connected',\n /** Gateway manuálisan lekapcsolódott (graceful). */\n disconnected = 'disconnected',\n /** WS kapcsolódási hiba (pl. refused, protocol error). */\n error = 'error',\n /** Gateway nem válaszol a ping-re (timeout). */\n unreachable = 'unreachable',\n}\n", "import { DO_Presence_Type } from '../../../../_enums/dark-office/ccap-dark-office-presence.enum';\nimport { CA_IInstanceData_SessionStatus_Interface } from '../../../external-sessions/_modules/cursor-acp/_models/interfaces/ca-cai-instance-data-status.interface';\nimport { CC_CciInstanceData_SessionStatus_Interface } from '../../../external-sessions/_modules/claude-code/_models/interfaces/cc-cci-instance-data-status.interface';\nimport { ExS_InstanceData_SessionStatus_Interface } from '../../../external-sessions/_models/interfaces/exs-instance-data-status.interface';\n\n/**\n * CCAP és CCI `sessionStatuses` tömbből „primary” sor választása Dark Office-hoz (REQ-SYS-INSTANCE-PRIMARY-SESSION).\n * OCI: `DO_OciSessionPrimaryPick_Util` (do-oci-session-primary-pick.util-service.ts) — ugyanaz a szemantika.\n */\nexport class DO_OfficeSessionPrimaryPick_Util {\n\n /**\n * CCAP session sor: aktív = `hasActiveRun` vagy `presence === working`.\n */\n static pickCcapPrimary(\n statuses: ExS_InstanceData_SessionStatus_Interface[],\n ): ExS_InstanceData_SessionStatus_Interface | null {\n if (!statuses.length) {\n return null;\n }\n\n const byLastActivity = (\n a: ExS_InstanceData_SessionStatus_Interface,\n b: ExS_InstanceData_SessionStatus_Interface,\n ): number =>\n new Date(b.lastActivityAt).getTime() - new Date(a.lastActivityAt).getTime();\n\n const active: ExS_InstanceData_SessionStatus_Interface[] = statuses.filter(\n (s: ExS_InstanceData_SessionStatus_Interface): boolean =>\n s.hasActiveRun === true\n || s.presence === DO_Presence_Type.working,\n );\n\n if (active.length > 0) {\n const sortedActive: ExS_InstanceData_SessionStatus_Interface[] = [...active].sort(\n byLastActivity,\n );\n const first: ExS_InstanceData_SessionStatus_Interface | undefined = sortedActive[0];\n return first ?? null;\n }\n\n const sortedAll: ExS_InstanceData_SessionStatus_Interface[] = [...statuses].sort(\n byLastActivity,\n );\n const firstAll: ExS_InstanceData_SessionStatus_Interface | undefined = sortedAll[0];\n return firstAll ?? null;\n }\n\n /**\n * CCI session sor: aktív = `hasActiveSession` vagy `presence === working`.\n */\n static pickCciPrimary(\n statuses: CC_CciInstanceData_SessionStatus_Interface[],\n ): CC_CciInstanceData_SessionStatus_Interface | null {\n if (!statuses.length) {\n return null;\n }\n\n const byLastActivity = (\n a: CC_CciInstanceData_SessionStatus_Interface,\n b: CC_CciInstanceData_SessionStatus_Interface,\n ): number =>\n new Date(b.lastActivityAt).getTime() - new Date(a.lastActivityAt).getTime();\n\n const active: CC_CciInstanceData_SessionStatus_Interface[] = statuses.filter(\n (s: CC_CciInstanceData_SessionStatus_Interface): boolean =>\n s.hasActiveSession === true\n || s.presence === DO_Presence_Type.working,\n );\n\n if (active.length > 0) {\n const sortedActive: CC_CciInstanceData_SessionStatus_Interface[] = [...active].sort(\n byLastActivity,\n );\n const first: CC_CciInstanceData_SessionStatus_Interface | undefined = sortedActive[0];\n return first ?? null;\n }\n\n const sortedAll: CC_CciInstanceData_SessionStatus_Interface[] = [...statuses].sort(\n byLastActivity,\n );\n const firstAll: CC_CciInstanceData_SessionStatus_Interface | undefined = sortedAll[0];\n return firstAll ?? null;\n }\n\n /**\n * CAI session sor: aktív = `hasActiveSession` vagy `presence === working`.\n */\n static pickCaiPrimary(\n statuses: CA_IInstanceData_SessionStatus_Interface[],\n ): CA_IInstanceData_SessionStatus_Interface | null {\n if (!statuses.length) {\n return null;\n }\n\n const byLastActivity = (\n a: CA_IInstanceData_SessionStatus_Interface,\n b: CA_IInstanceData_SessionStatus_Interface,\n ): number =>\n new Date(b.lastActivityAt).getTime() - new Date(a.lastActivityAt).getTime();\n\n const active: CA_IInstanceData_SessionStatus_Interface[] = statuses.filter(\n (s: CA_IInstanceData_SessionStatus_Interface): boolean =>\n s.hasActiveSession === true\n || s.presence === DO_Presence_Type.working,\n );\n\n if (active.length > 0) {\n const sortedActive: CA_IInstanceData_SessionStatus_Interface[] = [...active].sort(\n byLastActivity,\n );\n const first: CA_IInstanceData_SessionStatus_Interface | undefined = sortedActive[0];\n return first ?? null;\n }\n\n const sortedAll: CA_IInstanceData_SessionStatus_Interface[] = [...statuses].sort(\n byLastActivity,\n );\n const firstAll: CA_IInstanceData_SessionStatus_Interface | undefined = sortedAll[0];\n return firstAll ?? null;\n }\n}\n", "import { Oc_IInstanceData_SessionStatus_Interface } from '../../../external-sessions/_modules/openclaw/_models/interfaces/oc-oci-instance-data.interface';\n\n/**\n * OCI `sessionStatuses` tömbből egy „primary” sor választása Dark Office summary / buborék-hoz.\n * Aktív sessionök közül a legfrissebb `lastActivityAt`; egyébként globálisan legfrissebb.\n */\nexport class DO_OciSessionPrimaryPick_Util {\n\n /**\n * Primary session sor vagy null, ha üres a lista.\n */\n static pickPrimary(\n statuses: Oc_IInstanceData_SessionStatus_Interface[],\n ): Oc_IInstanceData_SessionStatus_Interface | null {\n if (!statuses.length) {\n return null;\n }\n\n const byLastActivity = (\n a: Oc_IInstanceData_SessionStatus_Interface,\n b: Oc_IInstanceData_SessionStatus_Interface,\n ): number =>\n new Date(b.lastActivityAt).getTime() - new Date(a.lastActivityAt).getTime();\n\n const active: Oc_IInstanceData_SessionStatus_Interface[] = statuses.filter(\n (s: Oc_IInstanceData_SessionStatus_Interface): boolean => s.hasActiveSession,\n );\n\n if (active.length > 0) {\n const sortedActive: Oc_IInstanceData_SessionStatus_Interface[] = [...active].sort(\n byLastActivity,\n );\n const first: Oc_IInstanceData_SessionStatus_Interface | undefined = sortedActive[0];\n return first ?? null;\n }\n\n const sortedAll: Oc_IInstanceData_SessionStatus_Interface[] = [...statuses].sort(\n byLastActivity,\n );\n const firstAll: Oc_IInstanceData_SessionStatus_Interface | undefined = sortedAll[0];\n return firstAll ?? null;\n }\n}\n", "import { minute } from '@futdevpro/fsm-dynamo';\n\n/**\n * Dark Office `working` presence: gateway session lista esetén a streamelt output időbélyege legfeljebb\n * ennyi ideig számít „éppen dolgozik”-nak (szerver tracker-rel egyező ablak).\n */\nexport const DO_DARK_OFFICE_AGENT_OUTPUT_WORKING_WINDOW_MS: number = 2 * minute;\n", "import { DO_DARK_OFFICE_AGENT_OUTPUT_WORKING_WINDOW_MS } from '../../../../../_collections/dark-office/ccap-dark-office-agent-output-working-window.const';\nimport { CCAP_OcGatewayTimestamp_Util } from '../../../../../_collections/oc/ccap-oc-gateway-timestamp.util';\nimport { DO_Presence_Type } from '../../../../../_enums/dark-office/ccap-dark-office-presence.enum';\nimport { Oc_IInstanceData_SessionStatus_Interface } from '../../../../external-sessions/_modules/openclaw/_models/interfaces/oc-oci-instance-data.interface';\n\n/**\n * OpenClaw gateway `sessions.list` válasz → OCI `sessionStatuses` sorok Dark Office-hoz.\n *\n * Ha az `oci-instance-data` lista üres tracker sorokat ad, a gateway mégis visszaadhat élő session-öket —\n * ezzel a map-pel egyeztetjük a panel summary-t a gateway SSOT-tal.\n */\nexport class DO_OciGatewayToSessionStatuses_Util {\n\n /**\n * Gateway API `sessions` tömb mapelése instance-data session státusz sorokká.\n */\n static mapGatewaySessionsResponse(params: {\n sessions: Record<string, unknown>[];\n }): Oc_IInstanceData_SessionStatus_Interface[] {\n const out: Oc_IInstanceData_SessionStatus_Interface[] = [];\n for (const raw of params.sessions) {\n const row: Oc_IInstanceData_SessionStatus_Interface | null =\n DO_OciGatewayToSessionStatuses_Util.mapOneSession(raw);\n if (row !== null) {\n out.push(row);\n }\n }\n return out;\n }\n\n /**\n * Egy gateway session objektum feldolgozása; hibás / üres id esetén null.\n */\n private static mapOneSession(\n raw: Record<string, unknown>,\n ): Oc_IInstanceData_SessionStatus_Interface | null {\n const sessionId: string =\n typeof raw['key'] === 'string'\n ? raw['key']\n : typeof raw['sessionId'] === 'string'\n ? raw['sessionId']\n : typeof raw['id'] === 'string'\n ? raw['id']\n : '';\n if (!sessionId.trim()) {\n return null;\n }\n\n const statusRaw: string =\n typeof raw['status'] === 'string' ? raw['status'].trim().toLowerCase() : '';\n const presence: DO_Presence_Type =\n DO_OciGatewayToSessionStatuses_Util.resolvePresenceFromGatewaySession({\n statusLower: statusRaw,\n raw: raw,\n });\n const hasActiveSession: boolean = presence === DO_Presence_Type.working;\n\n const lastActivityAt: string =\n CCAP_OcGatewayTimestamp_Util.extractTimestamp(\n raw,\n CCAP_OcGatewayTimestamp_Util.GATEWAY_SESSION_LAST_ACTIVITY_FIELD_NAMES,\n ) ?? new Date().toISOString();\n\n const sessionName: string | undefined =\n typeof raw['label'] === 'string'\n ? raw['label']\n : typeof raw['name'] === 'string'\n ? raw['name']\n : typeof raw['title'] === 'string'\n ? raw['title']\n : undefined;\n\n const statusMessage: string | undefined =\n typeof raw['statusMessage'] === 'string' ? raw['statusMessage'] : undefined;\n const activitySummary: string =\n statusMessage?.trim() || (statusRaw.length > 0 ? statusRaw : 'OpenClaw session');\n\n const lastPrompt: string | undefined =\n typeof raw['lastPrompt'] === 'string' ? raw['lastPrompt'] : undefined;\n\n return {\n sessionId: sessionId,\n sessionName: sessionName,\n presence: presence,\n lastActivityAt: lastActivityAt,\n hasActiveSession: hasActiveSession,\n activitySummary: activitySummary,\n lastMessage: lastPrompt,\n };\n }\n\n /**\n * Gateway session raw + normalizált `status` → presence (szerver OCI tracker-rel összhangban).\n *\n * A `running` / `waiting-input` lifecycle **idle**; `working` = `connecting` bootstrap vagy friss output\n * időbélyeg (`lastMessageAt` / hasonló mezők), nem a státusz string önmagában.\n */\n private static resolvePresenceFromGatewaySession(params: {\n statusLower: string;\n raw: Record<string, unknown>;\n }): DO_Presence_Type {\n const statusLower: string = params.statusLower;\n\n if (statusLower === 'connecting') {\n return DO_Presence_Type.working;\n }\n\n if (DO_OciGatewayToSessionStatuses_Util.hasRecentGatewayOutputTimestamp(params.raw)) {\n return DO_Presence_Type.working;\n }\n\n if (!statusLower) {\n return DO_Presence_Type.idle;\n }\n\n return DO_Presence_Type.idle;\n }\n\n /**\n * Csak explicit üzenet/output időbélyeget nézünk — `lastActivityAt` / session lifecycle mezők nélkül,\n * hogy a `running` állapot ne legyen önmagában workstation.\n */\n private static hasRecentGatewayOutputTimestamp(raw: Record<string, unknown>): boolean {\n const iso: string | undefined = CCAP_OcGatewayTimestamp_Util.extractTimestamp(\n raw,\n CCAP_OcGatewayTimestamp_Util.GATEWAY_OUTPUT_ONLY_TIMESTAMP_FIELD_NAMES,\n );\n if (!iso?.length) {\n return false;\n }\n const parsedMs: number = Date.parse(iso);\n if (Number.isNaN(parsedMs)) {\n return false;\n }\n return Date.now() - parsedMs <= DO_DARK_OFFICE_AGENT_OUTPUT_WORKING_WINDOW_MS;\n }\n}\n\n", "/**\n * CA session lifecycle státusz — mirror állapotgép (kliens típus tükör a szerver enum-hoz).\n */\nexport enum CA_Status_Type {\n creating = 'creating',\n connecting = 'connecting',\n waitingInput = 'waiting-input',\n running = 'running',\n errored = 'errored',\n completed = 'completed',\n terminated = 'terminated',\n disconnected = 'disconnected',\n}\n", "import { minute } from '@futdevpro/fsm-dynamo';\n\nimport { DO_InstanceSessionRow_Prunable_Interface } from '../../do-instance-status-detail/do-instance-session-row-prunable.interface';\n\n/**\n * Dark Office modal / megjelenítés — session sorok szűrése a szerver tracker szabályával.\n *\n * ## Szabály (szerver SSOT tükör)\n * - Megmarad minden sor, amelyiknek `lastActivityAt`-ja az elmúlt `recentWindowMs`-on belül van.\n * - Ha nincs ilyen sor, megmarad a **globálisan legfrissebb** `lastActivityAt`-ú egyetlen sor\n * (tie-break: `sessionId` `localeCompare`).\n * - Az ablakban duplikált `sessionId` esetén a **frissebb** időbélyeg nyer.\n *\n * ## Cél\n * A `GET` / socket már vágott listát ad; a runtime snapshot fallback viszont elcsúszhat.\n * Ez a pass biztosítja, hogy az Instance státusz modalban csak az „érdekes” sorok maradjanak.\n */\nexport class DO_InstanceTrackerSessionStatuses_Prune_Util {\n\n /** Szerver `IDLE_TIMEOUT_MS` / tracker prune ablak — 5 * minute. */\n static readonly INTERESTING_SESSION_WINDOW_MS: number = 5 * minute;\n\n /**\n * Session sorok másolat nélküli szűrése; nem módosítja az input tömböt, új tömböt ad vissza.\n */\n static prune<T extends DO_InstanceSessionRow_Prunable_Interface>(\n rows: T[],\n params: { nowMs: number; recentWindowMs: number },\n ): T[] {\n if (rows.length === 0) {\n return [];\n }\n\n const nowMs: number = params.nowMs;\n const windowMs: number = params.recentWindowMs;\n\n type RowWithMs = { row: T; ms: number };\n\n const withValidDate: RowWithMs[] = [];\n\n for (const row of rows) {\n const ms: number = new Date(row.lastActivityAt).getTime();\n\n if (Number.isNaN(ms)) {\n continue;\n }\n\n withValidDate.push({ row: row, ms: ms });\n }\n\n if (withValidDate.length === 0) {\n return [];\n }\n\n const recent: RowWithMs[] = withValidDate.filter((e: RowWithMs): boolean => {\n return nowMs - e.ms <= windowMs;\n });\n\n const pickGlobalNewest = (list: RowWithMs[]): T => {\n const sorted: RowWithMs[] = [...list].sort((a: RowWithMs, b: RowWithMs): number => {\n const diff: number = b.ms - a.ms;\n\n if (diff !== 0) {\n return diff;\n }\n\n return a.row.sessionId.localeCompare(b.row.sessionId);\n });\n const first: RowWithMs | undefined = sorted[0];\n\n if (!first) {\n throw new Error('DO_InstanceTrackerSessionStatuses_Prune_Util | empty sort');\n }\n\n return first.row;\n };\n\n if (recent.length > 0) {\n const byId: Map<string, RowWithMs> = new Map<string, RowWithMs>();\n\n for (const entry of recent) {\n const prev: RowWithMs | undefined = byId.get(entry.row.sessionId);\n\n if (!prev || entry.ms >= prev.ms) {\n byId.set(entry.row.sessionId, entry);\n }\n }\n\n return [...byId.values()]\n .sort((a: RowWithMs, b: RowWithMs): number => b.ms - a.ms)\n .map((e: RowWithMs): T => e.row);\n }\n\n return [pickGlobalNewest(withValidDate)];\n }\n}\n", "import { DO_Presence_Type } from '../../../../../../_enums/dark-office/ccap-dark-office-presence.enum';\nimport { AC_RunFlowPhase_Type } from '../../../../../../_enums/run-session/ccap-run-flow-phase.enum';\nimport { CC_CciInstanceData_SessionStatus_Interface } from '../../../../../external-sessions/_modules/claude-code/_models/interfaces/cc-cci-instance-data-status.interface';\nimport { ExS_InstanceData_Response } from '../../../../../external-sessions/_models/interfaces/exs-instance-data.interface';\nimport { ExS_InstanceData_SessionStatus_Interface } from '../../../../../external-sessions/_models/interfaces/exs-instance-data-status.interface';\nimport { DO_OfficeInstanceState_Interface } from '../../../../../../_models/interfaces/dark-office/do-office-instance-state.interface';\nimport {\n Oc_IInstanceData_Response,\n Oc_IInstanceData_SessionStatus_Interface,\n} from '../../../../../external-sessions/_modules/openclaw/_models/interfaces/oc-oci-instance-data.interface';\nimport { CA_Status_Type } from '../../../../../external-sessions/_modules/cursor-acp/_enums/ca-status.enum';\nimport { DarkOffice_DataService } from '../../../../_services/dark-office.data-service';\nimport { CA_IInstanceData_SessionStatus_Interface } from '../../../../../external-sessions/_modules/cursor-acp/_models/interfaces/ca-cai-instance-data-status.interface';\nimport { DO_CaiOfficeInstanceId_Util } from '../../../utils/do-cai-office-instance-id.util';\nimport { DO_CciOfficeInstanceId_Util } from '../../../utils/do-cci-office-instance-id.util';\nimport { DO_InstanceSessionRow_Prunable_Interface } from '../../do-instance-status-detail/do-instance-session-row-prunable.interface';\nimport { DO_InstanceTrackerSessionStatuses_Prune_Util } from './do-instance-tracker-session-statuses-prune.util';\n\n/**\n * Instance státusz modal — session sorok forrása Dark Office SSOT szerint.\n *\n * ## Probléma\n * A `ExS_RuntimeInstances_DataService` lista csak `loadInstanceData()`-kor frissül; a socket\n * push csak az `instances_$` office state `rawSessionStatuses` mezőjét írja. A modal korábban\n * csak a runtime snapshot-ot olvasta → üres táblázat, miközben a panel / gateway nézet már lát\n * session-öket.\n *\n * ## Megoldás\n * Először a `rawSessionStatuses` (office SSOT), ha abból építhető nem üres lista; különben a\n * runtime `get*InstanceDataSnapshot` sessionStatuses tömbje.\n *\n * ## Érdekes session-ök (szerverrel egyező ablak)\n * A visszaadott lista mindig átmegy a `DO_InstanceTrackerSessionStatuses_Prune_Util`-on:\n * az elmúlt 5 percben aktivitást mutató **összes** sor (dedupe sessionId), vagy ha nincs ilyen,\n * csak a **globálisan legutóbb aktív** egyetlen sor — megegyezik a tracker / DB prune szabállyal.\n *\n * ## SSOT belépési pont\n * Komponensek **ne** hívják közvetlenül — használd a `DarkOffice_DataService.resolveModal*SessionStatuses`\n * metódusait (unit tesztben közvetlen hívás megengedett).\n */\nexport class DO_InstanceStatusModalSessionSource_Util {\n\n /**\n * CCAP Session sorok modalhoz — office raw előbb, majd CCAP instance-data snapshot.\n */\n static resolveCcapSessionStatuses(params: {\n inst: DO_OfficeInstanceState_Interface;\n darkOffice_DS: DarkOffice_DataService;\n }): ExS_InstanceData_SessionStatus_Interface[] {\n const fromOffice: ExS_InstanceData_SessionStatus_Interface[] =\n DO_InstanceStatusModalSessionSource_Util.mapRawToCcapSessionStatuses(params.inst.rawSessionStatuses);\n const base: ExS_InstanceData_SessionStatus_Interface[] =\n fromOffice.length > 0\n ? fromOffice\n : DO_InstanceStatusModalSessionSource_Util.snapshotCcapSessionStatuses({\n darkOffice_DS: params.darkOffice_DS,\n instanceId: params.inst.instanceId,\n });\n return DO_InstanceStatusModalSessionSource_Util.applyInterestingSessionWindow(base);\n }\n\n /**\n * OCI (OpenClaw) session sorok modalhoz — office raw előbb, majd OCI instance-data snapshot.\n */\n static resolveOciSessionStatuses(params: {\n inst: DO_OfficeInstanceState_Interface;\n darkOffice_DS: DarkOffice_DataService;\n }): Oc_IInstanceData_SessionStatus_Interface[] {\n const fromOffice: Oc_IInstanceData_SessionStatus_Interface[] =\n DO_InstanceStatusModalSessionSource_Util.mapRawToOciSessionStatuses(params.inst.rawSessionStatuses);\n const base: Oc_IInstanceData_SessionStatus_Interface[] =\n fromOffice.length > 0\n ? fromOffice\n : DO_InstanceStatusModalSessionSource_Util.snapshotOciSessionStatuses({\n darkOffice_DS: params.darkOffice_DS,\n instanceId: params.inst.instanceId,\n });\n return DO_InstanceStatusModalSessionSource_Util.applyInterestingSessionWindow(base);\n }\n\n /**\n * CCI session sorok modalhoz — office raw előbb, majd CCI instance-data snapshot.\n */\n static resolveCciSessionStatuses(params: {\n inst: DO_OfficeInstanceState_Interface;\n darkOffice_DS: DarkOffice_DataService;\n }): CC_CciInstanceData_SessionStatus_Interface[] {\n const ccapId: string | null = DO_CciOfficeInstanceId_Util.parseCcapId(params.inst.instanceId);\n if (!ccapId) {\n return [];\n }\n const fromOffice: CC_CciInstanceData_SessionStatus_Interface[] =\n DO_InstanceStatusModalSessionSource_Util.mapRawToCciSessionStatuses(params.inst.rawSessionStatuses);\n const base: CC_CciInstanceData_SessionStatus_Interface[] =\n fromOffice.length > 0\n ? fromOffice\n : DO_InstanceStatusModalSessionSource_Util.snapshotCciSessionStatuses({\n darkOffice_DS: params.darkOffice_DS,\n ccapId: ccapId,\n });\n return DO_InstanceStatusModalSessionSource_Util.applyInterestingSessionWindow(base);\n }\n\n /**\n * CAI session sorok modalhoz — office raw előbb, majd CAI instance-data snapshot.\n */\n static resolveCaiSessionStatuses(params: {\n inst: DO_OfficeInstanceState_Interface;\n darkOffice_DS: DarkOffice_DataService;\n }): CA_IInstanceData_SessionStatus_Interface[] {\n const ccapId: string | null = DO_CaiOfficeInstanceId_Util.parseCcapId(params.inst.instanceId);\n if (!ccapId) {\n return [];\n }\n const fromOffice: CA_IInstanceData_SessionStatus_Interface[] =\n DO_InstanceStatusModalSessionSource_Util.mapRawToCaiSessionStatuses(params.inst.rawSessionStatuses);\n const base: CA_IInstanceData_SessionStatus_Interface[] =\n fromOffice.length > 0\n ? fromOffice\n : DO_InstanceStatusModalSessionSource_Util.snapshotCaiSessionStatuses({\n darkOffice_DS: params.darkOffice_DS,\n ccapId: ccapId,\n });\n return DO_InstanceStatusModalSessionSource_Util.applyInterestingSessionWindow(base);\n }\n\n /**\n * Tracker-rel azonos 5 perces (vagy „csak legutóbbi egy”) szabály alkalmazása modal sorokra.\n */\n private static applyInterestingSessionWindow<T extends DO_InstanceSessionRow_Prunable_Interface>(\n rows: T[],\n ): T[] {\n return DO_InstanceTrackerSessionStatuses_Prune_Util.prune(rows, {\n nowMs: Date.now(),\n recentWindowMs: DO_InstanceTrackerSessionStatuses_Prune_Util.INTERESTING_SESSION_WINDOW_MS,\n });\n }\n\n /**\n * CCAP runtime snapshot session sorai (üres tömb ha nincs).\n */\n private static snapshotCcapSessionStatuses(params: {\n darkOffice_DS: DarkOffice_DataService;\n instanceId: string;\n }): ExS_InstanceData_SessionStatus_Interface[] {\n const snap: ExS_InstanceData_Response | undefined =\n params.darkOffice_DS.getCcapInstanceDataSnapshot(params.instanceId);\n const fromSnap: ExS_InstanceData_SessionStatus_Interface[] | undefined = snap?.sessionStatuses;\n\n return Array.isArray(fromSnap) ? fromSnap : [];\n }\n\n /**\n * OCI runtime snapshot session sorai (üres tömb ha nincs).\n */\n private static snapshotOciSessionStatuses(params: {\n darkOffice_DS: DarkOffice_DataService;\n instanceId: string;\n }): Oc_IInstanceData_SessionStatus_Interface[] {\n const snap: Oc_IInstanceData_Response | undefined =\n params.darkOffice_DS.getOciInstanceDataSnapshot(params.instanceId);\n const fromSnap: Oc_IInstanceData_SessionStatus_Interface[] | undefined = snap?.sessionStatuses;\n\n return Array.isArray(fromSnap) ? fromSnap : [];\n }\n\n /**\n * CCI runtime snapshot session sorai (üres tömb ha nincs).\n */\n private static snapshotCciSessionStatuses(params: {\n darkOffice_DS: DarkOffice_DataService;\n ccapId: string;\n }): CC_CciInstanceData_SessionStatus_Interface[] {\n const snap = params.darkOffice_DS.getCciInstanceDataSnapshot(params.ccapId);\n const fromSnap: CC_CciInstanceData_SessionStatus_Interface[] | undefined = snap?.sessionStatuses;\n\n return Array.isArray(fromSnap) ? fromSnap : [];\n }\n\n /**\n * CAI runtime snapshot session sorai (üres tömb ha nincs).\n */\n private static snapshotCaiSessionStatuses(params: {\n darkOffice_DS: DarkOffice_DataService;\n ccapId: string;\n }): CA_IInstanceData_SessionStatus_Interface[] {\n const snap = params.darkOffice_DS.getCaiInstanceDataSnapshot(params.ccapId);\n const fromSnap: CA_IInstanceData_SessionStatus_Interface[] | undefined = snap?.sessionStatuses;\n\n return Array.isArray(fromSnap) ? fromSnap : [];\n }\n\n /**\n * Nyers office union tömb → CCAP session sorok (strukturális szűrés, nincs cast).\n */\n private static mapRawToCcapSessionStatuses(\n raw: DO_OfficeInstanceState_Interface['rawSessionStatuses'],\n ): ExS_InstanceData_SessionStatus_Interface[] {\n if (!Array.isArray(raw) || raw.length === 0) {\n return [];\n }\n const out: ExS_InstanceData_SessionStatus_Interface[] = [];\n for (const item of raw) {\n if (!('hasActiveRun' in item)) {\n continue;\n }\n const hasActiveRunVal: unknown = item.hasActiveRun;\n if (typeof hasActiveRunVal !== 'boolean') {\n continue;\n }\n const sessionIdVal: unknown = item.sessionId;\n if (typeof sessionIdVal !== 'string') {\n continue;\n }\n const presenceVal: unknown = item.presence;\n if (!DO_InstanceStatusModalSessionSource_Util.isPresenceEnum(presenceVal)) {\n continue;\n }\n const lastAt: unknown = item.lastActivityAt;\n if (typeof lastAt !== 'string') {\n continue;\n }\n const summary: unknown = item.activitySummary;\n if (typeof summary !== 'string') {\n continue;\n }\n const nameRaw: unknown = item.sessionName;\n const msgRaw: unknown = item.lastMessage;\n let activeRunPhaseVal: ExS_InstanceData_SessionStatus_Interface['activeRunPhase'] = undefined;\n if ('activeRunPhase' in item) {\n const arp: unknown = item.activeRunPhase;\n if (arp === undefined || arp === null) {\n activeRunPhaseVal = undefined;\n } else if (DO_InstanceStatusModalSessionSource_Util.isRunFlowPhaseValue(arp)) {\n activeRunPhaseVal = arp;\n } else {\n continue;\n }\n }\n let activeRunIdVal: string | undefined = undefined;\n if ('activeRunId' in item) {\n const arid: unknown = item.activeRunId;\n if (typeof arid === 'string') {\n activeRunIdVal = arid;\n } else if (arid !== undefined && arid !== null) {\n continue;\n }\n }\n out.push({\n sessionId: sessionIdVal,\n sessionName: typeof nameRaw === 'string' ? nameRaw : undefined,\n presence: presenceVal,\n lastActivityAt: lastAt,\n hasActiveRun: hasActiveRunVal,\n activeRunId: activeRunIdVal,\n activeRunPhase: activeRunPhaseVal,\n activitySummary: summary,\n lastMessage: typeof msgRaw === 'string' ? msgRaw : undefined,\n });\n }\n return out;\n }\n\n /**\n * Nyers office union tömb → CAI session sorok (`currentCaSessionStatus` discriminator).\n * Csak `resolveCaiSessionStatuses` hívja — `characterType === caSession` office állapotnál.\n */\n private static mapRawToCaiSessionStatuses(\n raw: DO_OfficeInstanceState_Interface['rawSessionStatuses'],\n ): CA_IInstanceData_SessionStatus_Interface[] {\n if (!Array.isArray(raw) || raw.length === 0) {\n return [];\n }\n const out: CA_IInstanceData_SessionStatus_Interface[] = [];\n for (const item of raw) {\n if ('hasActiveRun' in item) {\n continue;\n }\n if (!('hasActiveSession' in item)) {\n continue;\n }\n if (!('currentCaSessionStatus' in item)) {\n continue;\n }\n const base: Oc_IInstanceData_SessionStatus_Interface | null =\n DO_InstanceStatusModalSessionSource_Util.tryMapToOciOrCciShape(item);\n if (base === null) {\n continue;\n }\n const caRaw: unknown = Reflect.get(item, 'currentCaSessionStatus');\n let currentCa: CA_Status_Type | undefined = undefined;\n if (DO_InstanceStatusModalSessionSource_Util.isCaSessionStatusValue(caRaw)) {\n currentCa = caRaw;\n }\n out.push({\n sessionId: base.sessionId,\n sessionName: base.sessionName,\n presence: base.presence,\n lastActivityAt: base.lastActivityAt,\n hasActiveSession: base.hasActiveSession,\n currentCaSessionStatus: currentCa,\n activitySummary: base.activitySummary,\n lastMessage: base.lastMessage,\n });\n }\n return out;\n }\n\n /**\n * Nyers office union tömb → OCI session sorok (`hasActiveRun` nélküli sorok).\n * Csak `resolveOciSessionStatuses` hívja — `characterType === openclaw` office állapotnál.\n */\n private static mapRawToOciSessionStatuses(\n raw: DO_OfficeInstanceState_Interface['rawSessionStatuses'],\n ): Oc_IInstanceData_SessionStatus_Interface[] {\n if (!Array.isArray(raw) || raw.length === 0) {\n return [];\n }\n const out: Oc_IInstanceData_SessionStatus_Interface[] = [];\n for (const item of raw) {\n if ('hasActiveRun' in item) {\n continue;\n }\n if (!('hasActiveSession' in item)) {\n continue;\n }\n const row: Oc_IInstanceData_SessionStatus_Interface | null =\n DO_InstanceStatusModalSessionSource_Util.tryMapToOciOrCciShape(item);\n if (row !== null) {\n out.push(row);\n }\n }\n return out;\n }\n\n /**\n * Nyers office union tömb → CCI session sorok.\n * Csak `resolveCciSessionStatuses` hívja — `characterType === ccSession` office állapotnál.\n */\n private static mapRawToCciSessionStatuses(\n raw: DO_OfficeInstanceState_Interface['rawSessionStatuses'],\n ): CC_CciInstanceData_SessionStatus_Interface[] {\n if (!Array.isArray(raw) || raw.length === 0) {\n return [];\n }\n const out: CC_CciInstanceData_SessionStatus_Interface[] = [];\n for (const item of raw) {\n if ('hasActiveRun' in item) {\n continue;\n }\n if (!('hasActiveSession' in item)) {\n continue;\n }\n const base: Oc_IInstanceData_SessionStatus_Interface | null =\n DO_InstanceStatusModalSessionSource_Util.tryMapToOciOrCciShape(item);\n if (base === null) {\n continue;\n }\n let currentCc: string | undefined = undefined;\n if ('currentCcSessionStatus' in item) {\n const ccRaw: unknown = item.currentCcSessionStatus;\n if (typeof ccRaw === 'string') {\n currentCc = ccRaw;\n }\n }\n out.push({\n sessionId: base.sessionId,\n sessionName: base.sessionName,\n presence: base.presence,\n lastActivityAt: base.lastActivityAt,\n hasActiveSession: base.hasActiveSession,\n currentCcSessionStatus: currentCc,\n activitySummary: base.activitySummary,\n lastMessage: base.lastMessage,\n });\n }\n return out;\n }\n\n /**\n * Közös OCI/CCI alapmezők (CCI discriminator a hívóban).\n */\n private static tryMapToOciOrCciShape(\n item:\n | ExS_InstanceData_SessionStatus_Interface\n | Oc_IInstanceData_SessionStatus_Interface\n | CC_CciInstanceData_SessionStatus_Interface,\n ): Oc_IInstanceData_SessionStatus_Interface | null {\n if (!('hasActiveSession' in item)) {\n return null;\n }\n const hasActiveSessionVal: unknown = Reflect.get(item, 'hasActiveSession');\n if (typeof hasActiveSessionVal !== 'boolean') {\n return null;\n }\n const sessionIdVal: unknown = item.sessionId;\n if (typeof sessionIdVal !== 'string') {\n return null;\n }\n const presenceVal: unknown = item.presence;\n if (!DO_InstanceStatusModalSessionSource_Util.isPresenceEnum(presenceVal)) {\n return null;\n }\n const lastAt: unknown = item.lastActivityAt;\n if (typeof lastAt !== 'string') {\n return null;\n }\n const summary: unknown = item.activitySummary;\n if (typeof summary !== 'string') {\n return null;\n }\n const nameRaw: unknown = item.sessionName;\n const msgRaw: unknown = item.lastMessage;\n return {\n sessionId: sessionIdVal,\n sessionName: typeof nameRaw === 'string' ? nameRaw : undefined,\n presence: presenceVal,\n lastActivityAt: lastAt,\n hasActiveSession: hasActiveSessionVal,\n activitySummary: summary,\n lastMessage: typeof msgRaw === 'string' ? msgRaw : undefined,\n };\n }\n\n /**\n * `DO_Presence_Type` enum ellenőrzés futásidejű értékre.\n */\n private static isPresenceEnum(value: unknown): value is DO_Presence_Type {\n if (typeof value !== 'string') {\n return false;\n }\n const values: string[] = Object.values(DO_Presence_Type);\n return values.includes(value);\n }\n\n /**\n * `AC_RunFlowPhase_Type` enum ellenőrzés futásidejű stringre.\n */\n private static isRunFlowPhaseValue(value: unknown): value is AC_RunFlowPhase_Type {\n if (typeof value !== 'string') {\n return false;\n }\n const allowed: AC_RunFlowPhase_Type[] = Object.values(AC_RunFlowPhase_Type);\n for (const p of allowed) {\n if (p === value) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * `CA_Status_Type` enum ellenőrzés futásidejű stringre.\n */\n private static isCaSessionStatusValue(value: unknown): value is CA_Status_Type {\n if (typeof value !== 'string') {\n return false;\n }\n const allowed: CA_Status_Type[] = Object.values(CA_Status_Type);\n for (const s of allowed) {\n if (s === value) {\n return true;\n }\n }\n return false;\n }\n}\n", "import { DO_Presence_Type } from '../../../../../_enums/dark-office/ccap-dark-office-presence.enum';\nimport { DO_CharacterType_Type } from '../../../../../_enums/dark-office/do-character-type.enum';\nimport { CA_IInstanceData_SessionStatus_Interface } from '../../../../external-sessions/_modules/cursor-acp/_models/interfaces/ca-cai-instance-data-status.interface';\nimport { CC_CciInstanceData_SessionStatus_Interface } from '../../../../external-sessions/_modules/claude-code/_models/interfaces/cc-cci-instance-data-status.interface';\nimport { ExS_InstanceData_SessionStatus_Interface } from '../../../../external-sessions/_models/interfaces/exs-instance-data-status.interface';\nimport { DO_PanelActiveSessionRow_Interface } from '../../../../../_models/interfaces/dark-office/do-panel-active-session-row.interface';\nimport { Oc_IInstanceData_SessionStatus_Interface } from '../../../../external-sessions/_modules/openclaw/_models/interfaces/oc-oci-instance-data.interface';\n\n/** Utolsó üzenet előnézet max hossza a panel active-session sorokban. */\nconst PANEL_LAST_MESSAGE_PREVIEW_MAX: number = 72;\n\n/**\n * Dark Office instance panel kártya — előre kiszámolt megjelenítési mezők.\n *\n * A template nem hív formattert; a `DarkOffice_DataService` tölti ki ezeket.\n */\nexport class DO_PanelCardProjection_Util {\n\n /**\n * Utolsó üzenet szövegéből rövid státusz címke (ismert flag-ek).\n */\n static buildLastMessageDerivedStatusLabel(lastMessage: string): string {\n const trimmed: string = lastMessage.trim();\n if (!trimmed) {\n return '';\n }\n if (trimmed.startsWith('[QUEUE]')) {\n return 'Message queued';\n }\n return '';\n }\n\n /**\n * Aktív session-ök listája a panel „több aktív session” blokkjához.\n *\n * A `rawSessionStatuses` a szerver tracker szerint már szűrt: az elmúlt 5 percben aktivitás\n * (vagy egyetlen legutóbbi sor). Ez a metódus **ennek a listának** azt a részhalmazát adja vissza,\n * ahol van futó run / working (`hasActiveRun` / `hasActiveSession` vagy working presence) —\n * több ilyen párhuzamos session esetén extra sorok a kártyán; egy aktívnál üres (nem duplikáljuk a fő sort).\n */\n static buildPanelActiveSessionRows(params: {\n characterType: DO_CharacterType_Type | undefined;\n rawSessionStatuses:\n | ExS_InstanceData_SessionStatus_Interface[]\n | Oc_IInstanceData_SessionStatus_Interface[]\n | CC_CciInstanceData_SessionStatus_Interface[]\n | CA_IInstanceData_SessionStatus_Interface[]\n | undefined;\n }): DO_PanelActiveSessionRow_Interface[] {\n const sessions:\n | ExS_InstanceData_SessionStatus_Interface[]\n | Oc_IInstanceData_SessionStatus_Interface[]\n | CC_CciInstanceData_SessionStatus_Interface[]\n | CA_IInstanceData_SessionStatus_Interface[]\n | undefined = params.rawSessionStatuses;\n\n if (!sessions || sessions.length === 0) {\n return [];\n }\n\n const charType: DO_CharacterType_Type | undefined = params.characterType;\n let activeRows: DO_PanelActiveSessionRow_Interface[];\n\n if (\n charType === DO_CharacterType_Type.openclaw ||\n charType === DO_CharacterType_Type.ccSession ||\n charType === DO_CharacterType_Type.caSession\n ) {\n activeRows = DO_PanelCardProjection_Util.collectActiveOciOrCciFromUnion(sessions);\n } else {\n activeRows = DO_PanelCardProjection_Util.collectActiveCcapFromUnion(sessions);\n }\n\n if (activeRows.length <= 1) {\n return [];\n }\n\n return activeRows;\n }\n\n /**\n * Megjelenítési címke: név vagy rövidített session id.\n */\n static buildSessionDisplayLabel(sessionId: string, sessionName: string | undefined): string {\n const name: string | undefined = sessionName?.trim();\n if (name) {\n return name;\n }\n return DO_PanelCardProjection_Util.shortenSessionId(sessionId);\n }\n\n /**\n * Utolsó üzenet előnézet levágása a panel sorokhoz.\n */\n static truncateLastMessagePreview(text: string): string {\n const t: string = text.trim();\n if (!t) {\n return '';\n }\n if (t.length <= PANEL_LAST_MESSAGE_PREVIEW_MAX) {\n return t;\n }\n return `${t.slice(0, PANEL_LAST_MESSAGE_PREVIEW_MAX - 1)}…`;\n }\n\n /**\n * Type guard: CCAP session sor (`hasActiveRun` discriminator).\n */\n private static isCcapSessionRow(\n row:\n | ExS_InstanceData_SessionStatus_Interface\n | Oc_IInstanceData_SessionStatus_Interface\n | CC_CciInstanceData_SessionStatus_Interface\n | CA_IInstanceData_SessionStatus_Interface,\n ): row is ExS_InstanceData_SessionStatus_Interface {\n return 'hasActiveRun' in row;\n }\n\n /**\n * Type guard: OCI vagy CCI session sor (`hasActiveSession` discriminator).\n */\n private static isOciOrCciSessionRow(\n row:\n | ExS_InstanceData_SessionStatus_Interface\n | Oc_IInstanceData_SessionStatus_Interface\n | CC_CciInstanceData_SessionStatus_Interface\n | CA_IInstanceData_SessionStatus_Interface,\n ): row is\n | Oc_IInstanceData_SessionStatus_Interface\n | CC_CciInstanceData_SessionStatus_Interface\n | CA_IInstanceData_SessionStatus_Interface {\n return 'hasActiveSession' in row;\n }\n\n /**\n * CCAP session aktív: futó run vagy working presence.\n */\n private static isCcapSessionActive(row: ExS_InstanceData_SessionStatus_Interface): boolean {\n if (row.hasActiveRun === true) {\n return true;\n }\n return row.presence === DO_Presence_Type.working;\n }\n\n /**\n * OCI / CCI session aktív: aktív session flag vagy working presence.\n */\n private static isOciOrCciSessionActive(\n row:\n | Oc_IInstanceData_SessionStatus_Interface\n | CC_CciInstanceData_SessionStatus_Interface\n | CA_IInstanceData_SessionStatus_Interface,\n ): boolean {\n if (row.hasActiveSession === true) {\n return true;\n }\n return row.presence === DO_Presence_Type.working;\n }\n\n /**\n * Panel / teszt type guard: „session sor aktív” a kártya blokkhoz.\n *\n * A **scene** `characters_$` kibontását a `DarkOffice_DataService` a\n * `DO_SceneSessionEligibility_Util` + **5 perc** `lastActivityAt` ablakkal végzi — nem ezt a flag-et.\n */\n static isSessionActiveForSceneDuplication(params: {\n characterType: DO_CharacterType_Type | undefined;\n row:\n | ExS_InstanceData_SessionStatus_Interface\n | Oc_IInstanceData_SessionStatus_Interface\n | CC_CciInstanceData_SessionStatus_Interface\n | CA_IInstanceData_SessionStatus_Interface;\n }): boolean {\n if (params.row.presence === DO_Presence_Type.offline) {\n return false;\n }\n\n const characterType: DO_CharacterType_Type | undefined = params.characterType;\n if (\n characterType === DO_CharacterType_Type.openclaw\n || characterType === DO_CharacterType_Type.ccSession\n || characterType === DO_CharacterType_Type.caSession\n ) {\n if (!DO_PanelCardProjection_Util.isOciOrCciSessionRow(params.row)) {\n return false;\n }\n return DO_PanelCardProjection_Util.isOciOrCciSessionActive(params.row);\n }\n\n if (!DO_PanelCardProjection_Util.isCcapSessionRow(params.row)) {\n return false;\n }\n return DO_PanelCardProjection_Util.isCcapSessionActive(params.row);\n }\n\n /**\n * Session id rövidítése hosszú Mongo id-khez.\n */\n private static shortenSessionId(sessionId: string): string {\n if (sessionId.length <= 10) {\n return sessionId;\n }\n return `${sessionId.slice(0, 8)}…`;\n }\n\n /**\n * Aktív CCAP session sorok uniós listából (nem-OCI sorok kihagyva).\n */\n private static collectActiveCcapFromUnion(\n sessions: (\n | ExS_InstanceData_SessionStatus_Interface\n | Oc_IInstanceData_SessionStatus_Interface\n | CC_CciInstanceData_SessionStatus_Interface\n | CA_IInstanceData_SessionStatus_Interface\n )[],\n ): DO_PanelActiveSessionRow_Interface[] {\n const result: DO_PanelActiveSessionRow_Interface[] = [];\n\n for (const row of sessions) {\n if (!DO_PanelCardProjection_Util.isCcapSessionRow(row)) {\n continue;\n }\n if (!DO_PanelCardProjection_Util.isCcapSessionActive(row)) {\n continue;\n }\n const preview: string = DO_PanelCardProjection_Util.truncateLastMessagePreview(\n row.lastMessage ?? '',\n );\n result.push({\n sessionId: row.sessionId,\n displayLabel: DO_PanelCardProjection_Util.buildSessionDisplayLabel(\n row.sessionId,\n row.sessionName,\n ),\n presence: row.presence,\n activitySummary: row.activitySummary,\n lastMessagePreview: preview,\n });\n }\n\n return result;\n }\n\n /**\n * Aktív OCI/CCI session sorok uniós listából.\n */\n private static collectActiveOciOrCciFromUnion(\n sessions: (\n | ExS_InstanceData_SessionStatus_Interface\n | Oc_IInstanceData_SessionStatus_Interface\n | CC_CciInstanceData_SessionStatus_Interface\n | CA_IInstanceData_SessionStatus_Interface\n )[],\n ): DO_PanelActiveSessionRow_Interface[] {\n const result: DO_PanelActiveSessionRow_Interface[] = [];\n\n for (const row of sessions) {\n if (!DO_PanelCardProjection_Util.isOciOrCciSessionRow(row)) {\n continue;\n }\n if (!DO_PanelCardProjection_Util.isOciOrCciSessionActive(row)) {\n continue;\n }\n const preview: string = DO_PanelCardProjection_Util.truncateLastMessagePreview(\n row.lastMessage ?? '',\n );\n result.push({\n sessionId: row.sessionId,\n displayLabel: DO_PanelCardProjection_Util.buildSessionDisplayLabel(\n row.sessionId,\n row.sessionName,\n ),\n presence: row.presence,\n activitySummary: row.activitySummary,\n lastMessagePreview: preview,\n });\n }\n\n return result;\n }\n}\n", "import { minute } from '@futdevpro/fsm-dynamo';\n\nimport { DO_Presence_Type } from '../../../../_enums/dark-office/ccap-dark-office-presence.enum';\nimport { CA_IInstanceData_SessionStatus_Interface } from '../../../external-sessions/_modules/cursor-acp/_models/interfaces/ca-cai-instance-data-status.interface';\nimport { CC_CciInstanceData_SessionStatus_Interface } from '../../../external-sessions/_modules/claude-code/_models/interfaces/cc-cci-instance-data-status.interface';\nimport { ExS_InstanceData_SessionStatus_Interface } from '../../../external-sessions/_models/interfaces/exs-instance-data-status.interface';\nimport { Oc_IInstanceData_SessionStatus_Interface } from '../../../external-sessions/_modules/openclaw/_models/interfaces/oc-oci-instance-data.interface';\n\n/**\n * Scene `characters_$` kibontás: mely session sorok kapjanak külön karaktert, illetve fallback idle pick.\n *\n * Szabály (termék):\n * - **Több karakter** csak **working** (vagy CCAP `hasActiveRun`) session-ökre, ha `lastActivityAt` az 5 perces ablakban.\n * - Ha **nincs** ilyen sor (mind idle / mind stale working) → **egy** idle karakter a legutóbbi `lastActivityAt` session adatával.\n */\nexport class DO_SceneSessionEligibility_Util {\n\n /**\n * Aktivitás ablak — megegyezik a tracker prune / idle timeout skálájával (5 perc).\n */\n static readonly sceneRecentActivityWindowMs: number = 5 * minute;\n\n /**\n * Idle-walk ablak (REQ-DO-CHAR-IDLE-WALK-001) — a session-karakter a `lastActivityAt` után\n * eddig az időablakig megjelenik a scene-en idle-walk pózban (légszerű leg-swing), mielőtt\n * teljesen lekerülne. A `sceneRecentActivityWindowMs` (5 perc) alatti rész working karakter,\n * 5–15 perc közötti rész idle-walk karakter, 15 perc fölött nincs scene karakter.\n */\n static readonly sceneIdleWalkActivityWindowMs: number = 15 * minute;\n\n /**\n * ISO `lastActivityAt` → epoch ms; hibás string esetén `NaN`.\n */\n static parseLastActivityMs(iso: string): number {\n const t: number = Date.parse(iso);\n return Number.isNaN(t) ? Number.NaN : t;\n }\n\n /**\n * Van-e a session soron friss (ablakon belüli) aktivitás jelzés és nem offline presence.\n */\n static isSessionRecentAndOnline(params: {\n lastActivityAtIso: string;\n presence: DO_Presence_Type;\n nowMs: number;\n windowMs: number;\n }): boolean {\n if (params.presence === DO_Presence_Type.offline) {\n return false;\n }\n const ms: number = DO_SceneSessionEligibility_Util.parseLastActivityMs(params.lastActivityAtIso);\n if (Number.isNaN(ms)) {\n return false;\n }\n return params.nowMs - ms <= params.windowMs;\n }\n\n /**\n * Uniós session sor — `lastActivityAt` + presence a scene szűréshez.\n */\n static rowLastActivityIso(\n row:\n | ExS_InstanceData_SessionStatus_Interface\n | Oc_IInstanceData_SessionStatus_Interface\n | CC_CciInstanceData_SessionStatus_Interface\n | CA_IInstanceData_SessionStatus_Interface,\n ): string {\n return row.lastActivityAt ?? '';\n }\n\n /**\n * Scene többkarakteres kibontás: „dolgozik” session — `working` presence, CCAP `hasActiveRun`,\n * vagy OCI/CCI `hasActiveSession`.\n */\n static isSessionWorkingForSceneCharacter(\n row:\n | ExS_InstanceData_SessionStatus_Interface\n | Oc_IInstanceData_SessionStatus_Interface\n | CC_CciInstanceData_SessionStatus_Interface\n | CA_IInstanceData_SessionStatus_Interface,\n ): boolean {\n if (row.presence === DO_Presence_Type.working) {\n return true;\n }\n if ('hasActiveRun' in row) {\n if (row.hasActiveRun === true) {\n return true;\n }\n }\n if ('hasActiveSession' in row) {\n if (row.hasActiveSession === true) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Working (vagy CCAP futó run) + nem offline + `lastActivityAt` az ablakban.\n */\n static isWorkingSessionRecentAndOnline(params: {\n row:\n | ExS_InstanceData_SessionStatus_Interface\n | Oc_IInstanceData_SessionStatus_Interface\n | CC_CciInstanceData_SessionStatus_Interface\n | CA_IInstanceData_SessionStatus_Interface;\n nowMs: number;\n windowMs: number;\n }): boolean {\n if (!DO_SceneSessionEligibility_Util.isSessionWorkingForSceneCharacter(params.row)) {\n return false;\n }\n return DO_SceneSessionEligibility_Util.isSessionRecentAndOnline({\n lastActivityAtIso: DO_SceneSessionEligibility_Util.rowLastActivityIso(params.row),\n presence: params.row.presence,\n nowMs: params.nowMs,\n windowMs: params.windowMs,\n });\n }\n\n /**\n * Idle-walking session predikátum (REQ-DO-CHAR-IDLE-WALK-001).\n *\n * Igaz, ha a session **NEM** illeszkedik a working+recent ablakra (5 perc), de\n * `lastActivityAt` még az idle-walk ablakban (15 perc) van — vagyis a karakter „nemrég\n * dolgozott, most idle-walking pózban vár, mielőtt teljesen lekerülne\". Az idle-walk\n * karakter `presence: idle`-t és `animState: idleWalking`-ot kap az emitterben.\n *\n * Offline session sosem idle-walking.\n */\n static isSessionInIdleWalkWindow(params: {\n row:\n | ExS_InstanceData_SessionStatus_Interface\n | Oc_IInstanceData_SessionStatus_Interface\n | CC_CciInstanceData_SessionStatus_Interface\n | CA_IInstanceData_SessionStatus_Interface;\n nowMs: number;\n recentWindowMs: number;\n idleWalkWindowMs: number;\n }): boolean {\n if (params.row.presence === DO_Presence_Type.offline) {\n return false;\n }\n // Working+recent → nem idle-walking, az a working karakter ágra megy.\n if (DO_SceneSessionEligibility_Util.isWorkingSessionRecentAndOnline({\n row: params.row,\n nowMs: params.nowMs,\n windowMs: params.recentWindowMs,\n })) {\n return false;\n }\n // lastActivityAt az idle-walk ablakban — beleértve a 0–recent szakaszt is olyan sorokra,\n // amelyek nem working (pl. presence-flip után friss idle row).\n const ms: number = DO_SceneSessionEligibility_Util.parseLastActivityMs(\n DO_SceneSessionEligibility_Util.rowLastActivityIso(params.row),\n );\n if (Number.isNaN(ms)) {\n return false;\n }\n return params.nowMs - ms <= params.idleWalkWindowMs;\n }\n\n /**\n * Legfrissebb `lastActivityAt`-ú session (tie-break: `sessionId` localeCompare); üres lista → null.\n */\n static pickNewestSessionByLastActivity(params: {\n sessions: (\n | ExS_InstanceData_SessionStatus_Interface\n | Oc_IInstanceData_SessionStatus_Interface\n | CC_CciInstanceData_SessionStatus_Interface\n | CA_IInstanceData_SessionStatus_Interface\n )[];\n }):\n | ExS_InstanceData_SessionStatus_Interface\n | Oc_IInstanceData_SessionStatus_Interface\n | CC_CciInstanceData_SessionStatus_Interface\n | CA_IInstanceData_SessionStatus_Interface\n | null {\n const list = params.sessions;\n if (list.length === 0) {\n return null;\n }\n const sorted: (\n | ExS_InstanceData_SessionStatus_Interface\n | Oc_IInstanceData_SessionStatus_Interface\n | CC_CciInstanceData_SessionStatus_Interface\n | CA_IInstanceData_SessionStatus_Interface\n )[] = [...list].sort(\n (\n a:\n | ExS_InstanceData_SessionStatus_Interface\n | Oc_IInstanceData_SessionStatus_Interface\n | CC_CciInstanceData_SessionStatus_Interface\n | CA_IInstanceData_SessionStatus_Interface,\n b:\n | ExS_InstanceData_SessionStatus_Interface\n | Oc_IInstanceData_SessionStatus_Interface\n | CC_CciInstanceData_SessionStatus_Interface\n | CA_IInstanceData_SessionStatus_Interface,\n ): number => {\n const ta: number = DO_SceneSessionEligibility_Util.parseLastActivityMs(\n DO_SceneSessionEligibility_Util.rowLastActivityIso(a),\n );\n const tb: number = DO_SceneSessionEligibility_Util.parseLastActivityMs(\n DO_SceneSessionEligibility_Util.rowLastActivityIso(b),\n );\n const aOk: boolean = !Number.isNaN(ta);\n const bOk: boolean = !Number.isNaN(tb);\n if (aOk && bOk && tb !== ta) {\n return tb - ta;\n }\n if (aOk !== bOk) {\n return aOk ? -1 : 1;\n }\n return a.sessionId.localeCompare(b.sessionId);\n },\n );\n const first:\n | ExS_InstanceData_SessionStatus_Interface\n | Oc_IInstanceData_SessionStatus_Interface\n | CC_CciInstanceData_SessionStatus_Interface\n | CA_IInstanceData_SessionStatus_Interface\n | undefined = sorted[0];\n return first ?? null;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["DO_CharacterAnim_Type", "DO_CharacterScenePlacement_Type", "DO_CharacterType_Type", "DO_BodyType_Type", "DO_ClothingStyle_Type", "DO_HairStyle_Type", "DO_SKIN_COLORS", "DO_HAIR_COLORS", "DO_SHIRT_COLORS", "DO_PANTS_COLORS", "DO_EYE_COLORS", "DO_DEFAULT_CHARACTER_VISUALS", "skinColor", "hairColor", "hairStyle", "DO_HairStyle_Type", "short", "shirtColor", "clothingStyle", "DO_ClothingStyle_Type", "casual", "pantsColor", "eyeColor", "bodyType", "DO_BodyType_Type", "average", "displayName", "DO_OCI_DEFAULT_CHARACTER_VISUALS", "tshirt", "DO_CCI_DEFAULT_CHARACTER_VISUALS", "DO_CAI_DEFAULT_CHARACTER_VISUALS", "DO_WALK_ANIMATION_DURATION_MS", "DO_CaiOfficeInstanceId_Util", "officeInstanceIdPrefix", "build", "params", "ccapId", "trim", "parseCcapId", "officeInstanceId", "p", "startsWith", "rest", "slice", "length", "DO_CciOfficeInstanceId_Util", "officeInstanceIdPrefix", "build", "params", "ccapId", "trim", "parseCcapId", "officeInstanceId", "p", "startsWith", "rest", "slice", "length", "DO_OfficeLayoutGeometry_Util", "clampGrid", "grid", "workstationCols", "clampDim", "workstationRows", "restCols", "restRows", "meetingCols", "meetingRows", "computeDerived", "g", "floorLeft", "TILE", "topFloorY", "workspaceW", "computeWorkspaceWidthPx", "loungeW", "computeLoungeWidthPx", "lobbyW", "LOBBY_W_TILES", "innerFloorW", "sideFramePx", "worldW", "topFloorH", "conferenceHFull", "conferenceH", "Math", "max", "round", "conferenceY", "buildingTopY", "buildingBottomY", "buildingOuterX", "buildingOuterY", "buildingOuterW", "buildingOuterH", "worldH", "floorWorkspace", "x", "y", "w", "h", "floorLobby", "floorLounge", "floorConference", "zoneSplitX", "zoneSplitLobbyLoungeX", "topFloorBottomY", "door", "workstationSlots", "buildWorkstationSlots", "meetingSlots", "buildMeetingSlots", "workstationDesks", "buildWorkstationDesks", "loungeSeating", "buildLoungeSeatingLayout", "restSlots", "loungeSofas", "conference", "buildConferenceFurniture", "labelWorkspaceX", "labelLoungeX", "labelConferenceX", "ceilingNeonY", "windowsNorthY", "environmentOverflowPx", "buildingOuter", "workstationCapacity", "restCapacity", "meetingCapacity", "value", "Number", "isFinite", "GRID_MIN", "n", "floor", "GRID_MAX", "padded", "perCol", "minLegacy", "basePad", "slots", "pitchX", "workstationPitchX", "startX", "rowYs", "workstationRowFeetY", "row", "col", "push", "cols", "rows", "out", "topPad", "usable", "step", "r", "desks", "footStartX", "rowDeskY", "workstationDeskTopY", "deskX", "deskY", "monitorIsCyan", "trackId", "map", "fy", "sofas", "innerW", "rowBandOuter", "padY", "bandTop", "bandH", "gapBetweenRows", "sofaW", "min", "sx", "sy", "sofaH", "seatY", "seatAheadOfSofa", "seatLeftFraction", "seatRightFraction", "totalGapX", "gapX", "padX", "computeConferenceChairPositions", "tableW", "tableH", "tableX", "tableY", "chairOffset", "sideY", "table", "chairs", "slot", "index", "DEFAULT_LAYOUT", "workstationCols", "workstationRows", "restCols", "restRows", "meetingCols", "meetingRows", "maxEverWorkstationCols", "maxEverWorkstationRows", "maxEverRestCols", "maxEverRestRows", "maxEverMeetingCols", "maxEverMeetingRows", "DO_Layout_DataService", "settings_AS", "inject", "Settings_ApiService", "layoutPersisted_$", "signal", "saveTimerId", "grid_$", "computed", "p", "derived_$", "DO_OfficeLayoutGeometry_Util", "computeDerived", "workstationCapacity_$", "workstationCapacity", "restCapacity_$", "restCapacity", "meetingCapacity_$", "meetingCapacity", "maxEverDisplay_$", "constructor", "loadFromServer", "__async", "raw", "getSection", "SC_Type", "darkOfficeLayout", "Object", "keys", "length", "set", "merged", "parsePayload", "ensureMinCapacitiesFromSceneCharacters", "characters", "needW", "needR", "needM", "ch", "scenePlacement", "DO_CharacterScenePlacement_Type", "meeting", "presence", "DO_Presence_Type", "working", "next", "__spreadValues", "expandGridToFit", "isSamePersisted", "scheduleDebouncedSave", "applyPersistedFromUser", "payload", "saveNow", "validateProposedGridAgainstSceneCharacters", "params", "g", "clampGrid", "grid", "capW", "capR", "capM", "getWorkstationSlots", "workstationSlots", "getRestSlots", "restSlots", "getMeetingSlots", "meetingSlots", "getDoorPosition", "door", "undefined", "clearTimeout", "setTimeout", "body", "saveSection", "readN", "key", "fallback", "v", "Number", "isFinite", "Math", "floor", "d", "base", "clampPersisted", "c", "n", "i", "out", "max", "a", "b", "wCols", "wRows", "rCols", "rRows", "mCols", "mRows", "min", "factory", "\u0275fac", "providedIn", "import_fsm_dynamo", "Oc_iConnectionStatus_Type", "DO_OfficeSessionPrimaryPick_Util", "pickCcapPrimary", "statuses", "length", "byLastActivity", "a", "b", "Date", "lastActivityAt", "getTime", "active", "filter", "s", "hasActiveRun", "presence", "DO_Presence_Type", "working", "sort", "pickCciPrimary", "hasActiveSession", "pickCaiPrimary", "DO_OciSessionPrimaryPick_Util", "pickPrimary", "statuses", "length", "byLastActivity", "a", "b", "Date", "lastActivityAt", "getTime", "active", "filter", "s", "hasActiveSession", "sort", "import_fsm_dynamo", "DO_DARK_OFFICE_AGENT_OUTPUT_WORKING_WINDOW_MS", "minute", "DO_OciGatewayToSessionStatuses_Util", "mapGatewaySessionsResponse", "params", "out", "raw", "sessions", "row", "mapOneSession", "push", "sessionId", "trim", "statusRaw", "toLowerCase", "presence", "resolvePresenceFromGatewaySession", "statusLower", "hasActiveSession", "DO_Presence_Type", "working", "lastActivityAt", "CCAP_OcGatewayTimestamp_Util", "extractTimestamp", "GATEWAY_SESSION_LAST_ACTIVITY_FIELD_NAMES", "Date", "toISOString", "sessionName", "undefined", "activitySummary", "length", "lastPrompt", "lastMessage", "hasRecentGatewayOutputTimestamp", "idle", "iso", "GATEWAY_OUTPUT_ONLY_TIMESTAMP_FIELD_NAMES", "parsedMs", "parse", "Number", "isNaN", "now", "DO_DARK_OFFICE_AGENT_OUTPUT_WORKING_WINDOW_MS", "CA_Status_Type", "import_fsm_dynamo", "DO_InstanceTrackerSessionStatuses_Prune_Util", "INTERESTING_SESSION_WINDOW_MS", "minute", "prune", "rows", "params", "length", "nowMs", "windowMs", "recentWindowMs", "withValidDate", "row", "ms", "Date", "lastActivityAt", "getTime", "Number", "isNaN", "push", "recent", "filter", "e", "pickGlobalNewest", "list", "first", "sort", "a", "b", "diff", "sessionId", "localeCompare", "Error", "byId", "Map", "entry", "prev", "get", "set", "values", "map", "DO_InstanceStatusModalSessionSource_Util", "resolveCcapSessionStatuses", "params", "fromOffice", "mapRawToCcapSessionStatuses", "inst", "rawSessionStatuses", "base", "length", "snapshotCcapSessionStatuses", "darkOffice_DS", "instanceId", "applyInterestingSessionWindow", "resolveOciSessionStatuses", "mapRawToOciSessionStatuses", "snapshotOciSessionStatuses", "resolveCciSessionStatuses", "ccapId", "DO_CciOfficeInstanceId_Util", "parseCcapId", "mapRawToCciSessionStatuses", "snapshotCciSessionStatuses", "resolveCaiSessionStatuses", "DO_CaiOfficeInstanceId_Util", "mapRawToCaiSessionStatuses", "snapshotCaiSessionStatuses", "rows", "DO_InstanceTrackerSessionStatuses_Prune_Util", "prune", "nowMs", "Date", "now", "recentWindowMs", "INTERESTING_SESSION_WINDOW_MS", "fromSnap", "getCcapInstanceDataSnapshot", "sessionStatuses", "Array", "isArray", "getOciInstanceDataSnapshot", "getCciInstanceDataSnapshot", "getCaiInstanceDataSnapshot", "raw", "out", "item", "hasActiveRunVal", "hasActiveRun", "sessionIdVal", "sessionId", "presenceVal", "presence", "isPresenceEnum", "lastAt", "lastActivityAt", "summary", "activitySummary", "nameRaw", "sessionName", "msgRaw", "lastMessage", "activeRunPhaseVal", "arp", "activeRunPhase", "undefined", "isRunFlowPhaseValue", "activeRunIdVal", "arid", "activeRunId", "push", "tryMapToOciOrCciShape", "caRaw", "Reflect", "get", "currentCa", "isCaSessionStatusValue", "hasActiveSession", "currentCaSessionStatus", "row", "currentCc", "ccRaw", "currentCcSessionStatus", "hasActiveSessionVal", "value", "Object", "values", "DO_Presence_Type", "includes", "allowed", "AC_RunFlowPhase_Type", "p", "CA_Status_Type", "s", "PANEL_LAST_MESSAGE_PREVIEW_MAX", "DO_PanelCardProjection_Util", "buildLastMessageDerivedStatusLabel", "lastMessage", "trimmed", "trim", "startsWith", "buildPanelActiveSessionRows", "params", "sessions", "rawSessionStatuses", "length", "charType", "characterType", "activeRows", "DO_CharacterType_Type", "openclaw", "ccSession", "caSession", "collectActiveOciOrCciFromUnion", "collectActiveCcapFromUnion", "buildSessionDisplayLabel", "sessionId", "sessionName", "name", "shortenSessionId", "truncateLastMessagePreview", "text", "t", "slice", "isCcapSessionRow", "row", "isOciOrCciSessionRow", "isCcapSessionActive", "hasActiveRun", "presence", "DO_Presence_Type", "working", "isOciOrCciSessionActive", "hasActiveSession", "isSessionActiveForSceneDuplication", "offline", "result", "preview", "push", "displayLabel", "activitySummary", "lastMessagePreview", "import_fsm_dynamo", "DO_SceneSessionEligibility_Util", "sceneRecentActivityWindowMs", "minute", "sceneIdleWalkActivityWindowMs", "parseLastActivityMs", "iso", "t", "Date", "parse", "Number", "isNaN", "NaN", "isSessionRecentAndOnline", "params", "presence", "DO_Presence_Type", "offline", "ms", "lastActivityAtIso", "nowMs", "windowMs", "rowLastActivityIso", "row", "lastActivityAt", "isSessionWorkingForSceneCharacter", "working", "hasActiveRun", "hasActiveSession", "isWorkingSessionRecentAndOnline", "isSessionInIdleWalkWindow", "recentWindowMs", "idleWalkWindowMs", "pickNewestSessionByLastActivity", "list", "sessions", "length", "sort", "a", "b", "ta", "tb", "aOk", "bOk", "sessionId", "localeCompare", "SOCKET_EVENT_INSTANCE_STATUS_UPDATED", "SOCKET_EVENT_OCI_INSTANCE_STATUS_UPDATED", "SOCKET_EVENT_CCI_INSTANCE_STATUS_UPDATED", "SOCKET_EVENT_CAI_INSTANCE_STATUS_UPDATED", "DarkOffice_DataService", "instances_$", "signal", "characters_$", "computed", "expanded", "expandInstancesToCharacters", "assignDistinctSlotsForScene", "loading_$", "loadError_$", "isServerUnreachable_$", "selectedInstanceId_$", "chatPopupSessionId_$", "chatPopupSessionType_$", "instanceStatusDetailInstanceId_$", "instanceData_AS", "inject", "ExS_InstanceData_ApiService", "ociInstanceData_AS", "Oc_IInstanceData_ApiService", "cciInstanceData_AS", "CC_CciInstanceData_ApiService", "caiInstanceData_AS", "CA_IInstanceData_ApiService", "runtimeInstances_DS", "ExS_RuntimeInstances_DataService", "socket_CS", "CCAP_Socket_ControlService", "ocSession_DS", "Openclaw_DataService", "darkOfficeLayout_DS", "DO_Layout_DataService", "constructor", "effect", "ensureMinCapacitiesFromSceneCharacters", "allowSignalWrites", "event$", "subscribe", "envelope", "event", "handleInstanceStatusUpdate", "payload", "handleOciInstanceStatusUpdate", "handleCciInstanceStatusUpdate", "handleCaiInstanceStatusUpdate", "workstationSlotMap", "Map", "restSlotMap", "patchTimerMap", "meetingRoomLingerMs", "minute", "sessionMeetingRoomUntilByKey", "loadInstanceData", "__async", "set", "loadCcapInstanceList", "ccapErr", "ccapInstanceListError_$", "HttpErrorResponse", "status", "loadOciInstanceListAllowEmpty", "loadCciInstanceListAllowEmpty", "loadCaiInstanceListAllowEmpty", "activeInstances", "ccapInstanceList_$", "filter", "d", "ExS_InstanceDataStatus_Type", "active", "ociListRaw", "ociInstanceList_$", "ociList", "enrichOciListWithGatewaySessions", "list", "activeCci", "cciInstanceList_$", "activeCai", "caiInstanceList_$", "applyAllInstanceData", "params", "Promise", "all", "map", "item", "existing", "sessionStatuses", "connectionStatus", "Oc_iConnectionStatus_Type", "connected", "length", "fetchResult", "fetchGatewaySessionsForInstance", "instanceId", "merged", "DO_OciGatewayToSessionStatuses_Util", "mapGatewaySessionsResponse", "sessions", "rawSessions", "__spreadProps", "__spreadValues", "error", "DyFM_Error", "logSimple", "saveVisuals", "visuals", "update", "inst", "schedulePatch", "dismissError", "openChatPopup", "sessionId", "sessionType", "closeChatPopup", "selectInstance", "openInstanceStatusDetail", "closeInstanceStatusDetail", "getCcapInstanceDataSnapshot", "ccapId", "find", "row", "getOciInstanceDataSnapshot", "getCciInstanceDataSnapshot", "getCaiInstanceDataSnapshot", "resolveOfficeInstanceById", "resolveModalCcapSessionStatuses", "DO_InstanceStatusModalSessionSource_Util", "resolveCcapSessionStatuses", "darkOffice_DS", "resolveModalOciSessionStatuses", "resolveOciSessionStatuses", "resolveModalCciSessionStatuses", "resolveCciSessionStatuses", "resolveModalCaiSessionStatuses", "resolveCaiSessionStatuses", "buildInstanceStatusDetailRuntimeHint", "type", "characterType", "DO_CharacterType_Type", "ccap", "openclaw", "ccSession", "DO_CciOfficeInstanceId_Util", "parseCcapId", "caSession", "DO_CaiOfficeInstanceId_Util", "pruneExpiredMeetingRoomKeys", "nowMs", "key", "keys", "until", "get", "undefined", "delete", "applyMeetingRoomTransitionForSessionDiff", "Date", "now", "prevById", "previousRows", "presence", "nextRows", "prevPresence", "baseInstanceId", "DO_Presence_Type", "working", "idle", "resolveScenePlacementForSessionKey", "DO_CharacterScenePlacement_Type", "meeting", "rawStatuses", "Array", "isArray", "current", "existingIndex", "findIndex", "rawSessionStatuses", "sessionInfo", "resolveSessionInfoFromStatuses", "slotIndex", "assignSlot", "animState", "resolveAnimState", "updated", "applyPanelCardProjection", "activitySummary", "currentRunFlowPhase", "latestSessionId", "lastMessage", "previousPresence", "assignedSlotIndex", "statuses", "DO_OfficeSessionPrimaryPick_Util", "pickCcapPrimary", "activeRunPhase", "resolvedSessionName", "sessionName", "lastMessageDerivedStatusLabel", "DO_PanelCardProjection_Util", "buildLastMessageDerivedStatusLabel", "panelActiveSessionRows", "buildPanelActiveSessionRows", "ccapList", "cciList", "caiList", "currentMap", "ccapUpdated", "data", "mapToVisuals", "resolveSessionInfo", "ociUpdated", "mapOciToVisuals", "resolveOciSessionInfo", "cciUpdated", "officeId", "build", "mapCciToVisuals", "resolveCciSessionInfo", "caiUpdated", "mapCaiToVisuals", "resolveCaiSessionInfo", "prev", "updatedIds", "Set", "i", "walkingOut", "has", "DO_CharacterAnim_Type", "setTimeout", "DO_WALK_ANIMATION_DURATION_MS", "v", "darkOfficeVisuals", "skinColor", "DO_DEFAULT_CHARACTER_VISUALS", "hairColor", "hairStyle", "shirtColor", "clothingStyle", "pantsColor", "eyeColor", "bodyType", "displayName", "name", "DO_OCI_DEFAULT_CHARACTER_VISUALS", "label", "DO_CAI_DEFAULT_CHARACTER_VISUALS", "pickCaiPrimary", "currentCaSessionStatus", "DO_CCI_DEFAULT_CHARACTER_VISUALS", "pickCciPrimary", "currentCcSessionStatus", "offline", "primary", "DO_OciSessionPrimaryPick_Util", "pickPrimary", "officeInstanceId", "resolveSessionInfoFromCciStatuses", "resolveSessionInfoFromCaiStatuses", "existingTimer", "clearTimeout", "timerId", "instanceState", "caiCcapId", "cciCcapId", "patchByCcapId", "patchVisuals", "isWorking", "slotMap", "maxSlots", "workstationCapacity_$", "restCapacity_$", "usedSlots", "values", "overflow", "walkingIn", "walkingBetween", "sitting", "standing", "characters", "workingNext", "restNext", "meetingNext", "char", "scenePlacement", "instances", "result", "recentWindowMs", "DO_SceneSessionEligibility_Util", "sceneRecentActivityWindowMs", "idleWalkWindowMs", "sceneIdleWalkActivityWindowMs", "push", "buildInstanceBaselineCharacter", "session", "isWorkingSessionRecentAndOnline", "windowMs", "buildPerSessionOfficeCharacter", "isSessionInIdleWalkWindow", "buildIdleWalkSessionCharacter", "charKey", "resolveSessionRunFlowPhaseLabel", "idleWalking", "factory", "\u0275fac", "providedIn"]
|
|
7
|
-
}
|