@futdevpro/ccap 1.1.3223 → 1.1.3371
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli/build/_collections/update/update-verify-install.interface.d.ts +23 -0
- package/cli/build/_collections/update/update-verify-install.interface.d.ts.map +1 -0
- package/cli/build/_collections/update/update-verify-install.interface.js +3 -0
- package/cli/build/_collections/update/update-verify-install.interface.js.map +1 -0
- package/cli/build/_collections/update/update-verify-install.util.d.ts +50 -0
- package/cli/build/_collections/update/update-verify-install.util.d.ts.map +1 -0
- package/cli/build/_collections/update/update-verify-install.util.js +179 -0
- package/cli/build/_collections/update/update-verify-install.util.js.map +1 -0
- package/cli/build/_collections/update/update-verify-install.util.spec.d.ts +6 -0
- package/cli/build/_collections/update/update-verify-install.util.spec.d.ts.map +1 -0
- package/cli/build/_collections/update/update-verify-install.util.spec.js +117 -0
- package/cli/build/_collections/update/update-verify-install.util.spec.js.map +1 -0
- package/cli/build/_commands/cc-inspect-options.interface.d.ts +11 -0
- package/cli/build/_commands/cc-inspect-options.interface.d.ts.map +1 -0
- package/cli/build/_commands/cc-inspect-options.interface.js +3 -0
- package/cli/build/_commands/cc-inspect-options.interface.js.map +1 -0
- package/cli/build/_commands/cc-inspect.d.ts +33 -0
- package/cli/build/_commands/cc-inspect.d.ts.map +1 -0
- package/cli/build/_commands/cc-inspect.js +228 -0
- package/cli/build/_commands/cc-inspect.js.map +1 -0
- package/cli/build/_commands/input.d.ts +55 -0
- package/cli/build/_commands/input.d.ts.map +1 -0
- package/cli/build/_commands/input.interface.d.ts +21 -0
- package/cli/build/_commands/input.interface.d.ts.map +1 -0
- package/cli/build/_commands/input.interface.js +3 -0
- package/cli/build/_commands/input.interface.js.map +1 -0
- package/cli/build/_commands/input.js +183 -0
- package/cli/build/_commands/input.js.map +1 -0
- package/cli/build/_commands/input.spec.d.ts +8 -0
- package/cli/build/_commands/input.spec.d.ts.map +1 -0
- package/cli/build/_commands/input.spec.js +63 -0
- package/cli/build/_commands/input.spec.js.map +1 -0
- package/cli/build/_commands/skill-doc.d.ts +63 -0
- package/cli/build/_commands/skill-doc.d.ts.map +1 -0
- package/cli/build/_commands/skill-doc.interface.d.ts +19 -0
- package/cli/build/_commands/skill-doc.interface.d.ts.map +1 -0
- package/cli/build/_commands/skill-doc.interface.js +3 -0
- package/cli/build/_commands/skill-doc.interface.js.map +1 -0
- package/cli/build/_commands/skill-doc.js +421 -0
- package/cli/build/_commands/skill-doc.js.map +1 -0
- package/cli/build/_commands/skill-doc.spec.d.ts +10 -0
- package/cli/build/_commands/skill-doc.spec.d.ts.map +1 -0
- package/cli/build/_commands/skill-doc.spec.js +112 -0
- package/cli/build/_commands/skill-doc.spec.js.map +1 -0
- package/cli/build/_commands/update.d.ts.map +1 -1
- package/cli/build/_commands/update.js +59 -0
- package/cli/build/_commands/update.js.map +1 -1
- package/cli/build/_commands/update.spec.js +12 -0
- package/cli/build/_commands/update.spec.js.map +1 -1
- package/cli/build/program.js +51 -0
- package/cli/build/program.js.map +1 -1
- package/client-dist/{agent-instances.module-V7DKSWVC.js → agent-instances.module-TPKOBI3N.js} +2 -2
- package/client-dist/ca.module-I5N6QWSU.js +5 -0
- package/client-dist/{ca.module-MVE3OLDD.js.map → ca.module-I5N6QWSU.js.map} +3 -3
- package/client-dist/cc-usage-dashboard.component-7SPVADUQ.js +2 -0
- package/client-dist/cc-usage-dashboard.component-7SPVADUQ.js.map +7 -0
- package/client-dist/cc.module-7IL3QO5Q.js +4 -0
- package/client-dist/cc.module-7IL3QO5Q.js.map +7 -0
- package/client-dist/{chunk-JZHYGU3K.js → chunk-25KTNALK.js} +2 -2
- package/client-dist/{chunk-6GSTJE3R.js → chunk-26YUXPZI.js} +2 -2
- package/client-dist/{chunk-4GPIIB3D.js → chunk-3AG5X2MY.js} +2 -2
- package/client-dist/{chunk-4GPIIB3D.js.map → chunk-3AG5X2MY.js.map} +3 -3
- package/client-dist/chunk-3G2ZGV66.js +2 -0
- package/client-dist/chunk-3G2ZGV66.js.map +7 -0
- package/client-dist/{chunk-4SFV57IQ.js → chunk-44TWBJUK.js} +2 -2
- package/client-dist/{chunk-DURLBTAJ.js → chunk-4EOSKDXN.js} +2 -2
- package/client-dist/{chunk-3TMVRWAB.js → chunk-4FK2D2PX.js} +2 -2
- package/client-dist/chunk-4JL2Q6FO.js +2 -0
- package/client-dist/chunk-4JL2Q6FO.js.map +7 -0
- package/client-dist/{chunk-MY75XBDH.js → chunk-4PBNHSRW.js} +2 -2
- package/client-dist/{chunk-3D32XY5M.js → chunk-5RLDT3NY.js} +2 -2
- package/client-dist/{chunk-VGTXKD6D.js → chunk-5YDHEFSD.js} +2 -2
- package/client-dist/{chunk-XTUQJ3W6.js → chunk-657E66YR.js} +2 -2
- package/client-dist/{chunk-CFHQS3UB.js → chunk-6BYNIFJY.js} +2 -2
- package/client-dist/{chunk-7HSUCNW5.js → chunk-77YTUUCR.js} +7 -3
- package/client-dist/{chunk-7HSUCNW5.js.map → chunk-77YTUUCR.js.map} +2 -2
- package/client-dist/{chunk-5C3KCWYF.js → chunk-7CMPZXAO.js} +2 -2
- package/client-dist/{chunk-TP2634XD.js → chunk-7VY64KMU.js} +2 -2
- package/client-dist/{chunk-7SAFEFWU.js → chunk-A33MCHYC.js} +2 -2
- package/client-dist/{chunk-KYVIZZWW.js → chunk-BH3GMEZZ.js} +19 -19
- package/client-dist/chunk-BH3GMEZZ.js.map +7 -0
- package/client-dist/{chunk-HLNT234H.js → chunk-BJ4I73WC.js} +2 -2
- package/client-dist/{chunk-AI7WKHRQ.js → chunk-C2BQQRVH.js} +2 -2
- package/client-dist/{chunk-IINV7GMO.js → chunk-C4FOSX27.js} +2 -2
- package/client-dist/chunk-C4FOSX27.js.map +7 -0
- package/client-dist/{chunk-JMZKJLUE.js → chunk-CAMM4S7P.js} +2 -2
- package/client-dist/{chunk-GZDOO5NB.js → chunk-CDNAFC73.js} +2 -2
- package/client-dist/{chunk-GADEZIXI.js → chunk-CU5YQ2M4.js} +2 -2
- package/client-dist/{chunk-2OAF6FCL.js → chunk-DXF2FJLD.js} +2 -2
- package/client-dist/{chunk-TOFOK5W7.js → chunk-E6WOJOGT.js} +2 -2
- package/client-dist/{chunk-OEEQNIJG.js → chunk-EDMLVG72.js} +2 -2
- package/client-dist/chunk-G5SK3OBM.js +2 -0
- package/client-dist/chunk-G5SK3OBM.js.map +7 -0
- package/client-dist/{chunk-D2UUXA6L.js → chunk-GG2WP2KM.js} +2 -2
- package/client-dist/{chunk-R5WCLLO5.js → chunk-IHNAAEA2.js} +2 -2
- package/client-dist/{chunk-SQWHJTFE.js → chunk-J5INQQ5M.js} +2 -2
- package/client-dist/{chunk-OUBNMT7L.js → chunk-KX2KGHQZ.js} +2 -2
- package/client-dist/{chunk-2EMFCVYO.js → chunk-L2XJGYW4.js} +2 -2
- package/client-dist/{chunk-LIQPVSH3.js → chunk-L42Z7YNK.js} +2 -2
- package/client-dist/{chunk-PTCJL62W.js → chunk-LCKABD2M.js} +2 -2
- package/client-dist/{chunk-OQW6FXRJ.js → chunk-LIGODF4I.js} +2 -2
- package/client-dist/{chunk-MS5OG7JD.js → chunk-LMK3IOKN.js} +2 -2
- package/client-dist/{chunk-BC7H7K5F.js → chunk-OCNDLQG5.js} +2 -2
- package/client-dist/{chunk-4JKJRGJX.js → chunk-OKUYYDGV.js} +2 -2
- package/client-dist/{chunk-U2EBQMSE.js → chunk-OLLHHMTV.js} +2 -2
- package/client-dist/{chunk-ILG5WENK.js → chunk-OS5KCUZD.js} +2 -2
- package/client-dist/{chunk-3PLWSRB4.js → chunk-PMJP2N4K.js} +2 -2
- package/client-dist/{chunk-JEHOIN7Y.js → chunk-PW5BAINL.js} +2 -2
- package/client-dist/{chunk-DJVWZQNB.js → chunk-QQ2GRU2N.js} +2 -2
- package/client-dist/{chunk-SLSTIBOT.js → chunk-RUSAMFGS.js} +2 -2
- package/client-dist/{chunk-SLSTIBOT.js.map → chunk-RUSAMFGS.js.map} +1 -1
- package/client-dist/{chunk-CRYF37M7.js → chunk-RYD462IO.js} +2 -2
- package/client-dist/{chunk-7X22BWF7.js → chunk-SK3XGSYF.js} +2 -2
- package/client-dist/{chunk-PG7CJVEP.js → chunk-TFB7ULAV.js} +2 -2
- package/client-dist/{chunk-SYCUR4MY.js → chunk-U3Y5GO6O.js} +2 -2
- package/client-dist/{chunk-OLK5MJ4J.js → chunk-U64N3LCA.js} +2 -2
- package/client-dist/{chunk-AX7QIINI.js → chunk-UD4PV7CD.js} +2 -2
- package/client-dist/{chunk-3PA6BJES.js → chunk-UM7AS2IW.js} +2 -2
- package/client-dist/{chunk-CLQC45GB.js → chunk-UVVGFHUG.js} +2 -2
- package/client-dist/{chunk-RSPVPEQ4.js → chunk-VOFDBT5T.js} +2 -2
- package/client-dist/{chunk-C4JDDOQR.js → chunk-VRG74DKK.js} +2 -2
- package/client-dist/{chunk-VO5ZLOZM.js → chunk-W7HIS2QA.js} +2 -2
- package/client-dist/{chunk-PFBJ7ZHP.js → chunk-XFXMWTQS.js} +2 -2
- package/client-dist/chunk-XWYXBY7S.js +2 -0
- package/client-dist/chunk-XWYXBY7S.js.map +7 -0
- package/client-dist/consultant.module-HHTHUWRL.js +3 -0
- package/client-dist/{consultant.module-WUUVSVHL.js.map → consultant.module-HHTHUWRL.js.map} +3 -3
- package/client-dist/{crd.module-IRGVOYD5.js → crd.module-ER6AHSX5.js} +2 -2
- package/client-dist/{dashboard.module-NPPSZHO6.js → dashboard.module-TSNGGBCI.js} +2 -2
- package/client-dist/{do.module-GKQTJOXR.js → do.module-NMZD5VSM.js} +2 -2
- package/client-dist/{document-library.module-JK3K7QNJ.js → document-library.module-GHDNXP3T.js} +2 -2
- package/client-dist/{embedding-eval.module-LVESAMPN.js → embedding-eval.module-XPXBOIP5.js} +2 -2
- package/client-dist/{embedding-registry.module-3ECACZZ3.js → embedding-registry.module-45TQGZI2.js} +2 -2
- package/client-dist/{err.module-B666YXQT.js → err.module-GCKYDYCK.js} +2 -2
- package/client-dist/{feedback.module-AHG7462C.js → feedback.module-TLKZ4B4N.js} +2 -2
- package/client-dist/{host-runtime-mcp.module-XFUI7B65.js → host-runtime-mcp.module-HVJZN5R5.js} +2 -2
- package/client-dist/index.html +2 -2
- package/client-dist/{live-dev-pipeline.module-OMK67DGM.js → live-dev-pipeline.module-5PE4ZFFW.js} +2 -2
- package/client-dist/{logs.module-FWACECVV.js → logs.module-335EXKCD.js} +2 -2
- package/client-dist/{main-H4AYPQ2E.js → main-FRD6VXVH.js} +4 -4
- package/client-dist/{main-H4AYPQ2E.js.map → main-FRD6VXVH.js.map} +3 -3
- package/client-dist/{master-control-remote-poc.module-GQ6RMPRB.js → master-control-remote-poc.module-ORHRUCZH.js} +2 -2
- package/client-dist/{mobile-app.module-YSARX6QC.js → mobile-app.module-BYYNVKQR.js} +2 -2
- package/client-dist/{model-registry.module-SJOUSDXZ.js → model-registry.module-KIHIJ2Z6.js} +2 -2
- package/client-dist/oc.module-DAGIRW3Z.js +3 -0
- package/client-dist/{oc.module-CDGBJ6I4.js.map → oc.module-DAGIRW3Z.js.map} +3 -3
- package/client-dist/{orc.module-5S7GBE4E.js → orc.module-KZELL6XR.js} +2 -2
- package/client-dist/{project-management.module-LWZLB6VU.js → project-management.module-IJNPSUQZ.js} +2 -2
- package/client-dist/project-source-routed.module-DP3RD454.js +2 -0
- package/client-dist/{scheduler.module-VH647PWD.js → scheduler.module-S3IKZCLL.js} +2 -2
- package/client-dist/session.module-FZC22UUN.js +12 -0
- package/client-dist/session.module-FZC22UUN.js.map +7 -0
- package/client-dist/{set.module-XHJR4XUD.js → set.module-Y2RHKW7A.js} +5 -5
- package/client-dist/{set.module-XHJR4XUD.js.map → set.module-Y2RHKW7A.js.map} +3 -3
- package/client-dist/{setup.module-RRQZ62B2.js → setup.module-VTI5EZ3Q.js} +2 -2
- package/client-dist/styles-MX7ZZMTH.css +2 -0
- package/client-dist/styles-MX7ZZMTH.css.map +7 -0
- package/client-dist/{terminals.module-QKIQS6FH.js → terminals.module-KHEDY6QN.js} +2 -2
- package/client-dist/{voice-notes-poc.module-K3FB6OIB.js → voice-notes-poc.module-EMDLJJIT.js} +2 -2
- package/client-dist/{wfs.module-JVR53PGJ.js → wfs.module-LUTFNQG5.js} +2 -2
- package/package.json +1 -1
- package/server/build/src/_collections/core/ccap-post-services-bootstrap.util.d.ts.map +1 -1
- package/server/build/src/_collections/core/ccap-post-services-bootstrap.util.js +5 -0
- package/server/build/src/_collections/core/ccap-post-services-bootstrap.util.js.map +1 -1
- package/server/build/src/_modules/ccap-agent/_modules/error-handling/_collections/error-handling-stats-range.const.d.ts +11 -0
- package/server/build/src/_modules/ccap-agent/_modules/error-handling/_collections/error-handling-stats-range.const.d.ts.map +1 -0
- package/server/build/src/_modules/ccap-agent/_modules/error-handling/_collections/error-handling-stats-range.const.js +20 -0
- package/server/build/src/_modules/ccap-agent/_modules/error-handling/_collections/error-handling-stats-range.const.js.map +1 -0
- package/server/build/src/_modules/ccap-agent/_modules/error-handling/_collections/utils/error-handling-stats.util.d.ts +65 -0
- package/server/build/src/_modules/ccap-agent/_modules/error-handling/_collections/utils/error-handling-stats.util.d.ts.map +1 -0
- package/server/build/src/_modules/ccap-agent/_modules/error-handling/_collections/utils/error-handling-stats.util.js +222 -0
- package/server/build/src/_modules/ccap-agent/_modules/error-handling/_collections/utils/error-handling-stats.util.js.map +1 -0
- package/server/build/src/_modules/ccap-agent/_modules/error-handling/_collections/utils/error-handling-stats.util.spec.d.ts +7 -0
- package/server/build/src/_modules/ccap-agent/_modules/error-handling/_collections/utils/error-handling-stats.util.spec.d.ts.map +1 -0
- package/server/build/src/_modules/ccap-agent/_modules/error-handling/_collections/utils/error-handling-stats.util.spec.js +213 -0
- package/server/build/src/_modules/ccap-agent/_modules/error-handling/_collections/utils/error-handling-stats.util.spec.js.map +1 -0
- package/server/build/src/_modules/ccap-agent/_modules/error-handling/_models/interfaces/error-handling-stats.interface.d.ts +58 -0
- package/server/build/src/_modules/ccap-agent/_modules/error-handling/_models/interfaces/error-handling-stats.interface.d.ts.map +1 -0
- package/server/build/src/_modules/ccap-agent/_modules/error-handling/_models/interfaces/error-handling-stats.interface.js +3 -0
- package/server/build/src/_modules/ccap-agent/_modules/error-handling/_models/interfaces/error-handling-stats.interface.js.map +1 -0
- package/server/build/src/_modules/ccap-agent/_modules/error-handling/_routes/error-handling.controller.d.ts.map +1 -1
- package/server/build/src/_modules/ccap-agent/_modules/error-handling/_routes/error-handling.controller.js +14 -0
- package/server/build/src/_modules/ccap-agent/_modules/error-handling/_routes/error-handling.controller.js.map +1 -1
- package/server/build/src/_modules/ccap-agent/_modules/error-handling/_services/errorhandling-stats.control-service.d.ts +35 -0
- package/server/build/src/_modules/ccap-agent/_modules/error-handling/_services/errorhandling-stats.control-service.d.ts.map +1 -0
- package/server/build/src/_modules/ccap-agent/_modules/error-handling/_services/errorhandling-stats.control-service.js +80 -0
- package/server/build/src/_modules/ccap-agent/_modules/error-handling/_services/errorhandling-stats.control-service.js.map +1 -0
- package/server/build/src/_modules/ccap-agent/_modules/integrations/_modules/voice/_services/control-services/stt/voc-transcribe.control-service.d.ts +2 -0
- package/server/build/src/_modules/ccap-agent/_modules/integrations/_modules/voice/_services/control-services/stt/voc-transcribe.control-service.d.ts.map +1 -1
- package/server/build/src/_modules/ccap-agent/_modules/integrations/_modules/voice/_services/control-services/stt/voc-transcribe.control-service.js +16 -0
- package/server/build/src/_modules/ccap-agent/_modules/integrations/_modules/voice/_services/control-services/stt/voc-transcribe.control-service.js.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_collections/consts/cc-kill-reasons.const.d.ts +58 -0
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_collections/consts/cc-kill-reasons.const.d.ts.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_collections/consts/cc-kill-reasons.const.js +64 -0
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_collections/consts/cc-kill-reasons.const.js.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_collections/utils/cc-list-item-serialize.util.d.ts.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_collections/utils/cc-list-item-serialize.util.js +3 -0
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_collections/utils/cc-list-item-serialize.util.js.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_collections/utils/lifecycle/cc-exit-diagnostics.util.d.ts +47 -0
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_collections/utils/lifecycle/cc-exit-diagnostics.util.d.ts.map +1 -0
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_collections/utils/lifecycle/cc-exit-diagnostics.util.js +71 -0
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_collections/utils/lifecycle/cc-exit-diagnostics.util.js.map +1 -0
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_collections/utils/lifecycle/cc-process-exit.util.d.ts +36 -0
- 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 +93 -6
- 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 +85 -21
- 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/_collections/utils/lifecycle/cc-recovery.util.d.ts.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_collections/utils/lifecycle/cc-recovery.util.js +81 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_collections/utils/lifecycle/cc-recovery.util.js.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_collections/utils/terminal/cc-terminal-session-closed-guard.util.d.ts.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_collections/utils/terminal/cc-terminal-session-closed-guard.util.js +14 -2
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_collections/utils/terminal/cc-terminal-session-closed-guard.util.js.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_routes/claude-code.controller.d.ts.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_routes/claude-code.controller.js +19 -0
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_routes/claude-code.controller.js.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/blocked-resume/cc-blocked-resume.control-service.d.ts +4 -0
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/blocked-resume/cc-blocked-resume.control-service.d.ts.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/blocked-resume/cc-blocked-resume.control-service.js +6 -0
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/blocked-resume/cc-blocked-resume.control-service.js.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/cc-adapter.control-service.d.ts +13 -0
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/cc-adapter.control-service.d.ts.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/cc-adapter.control-service.js +13 -0
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/cc-adapter.control-service.js.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/cc-adapter.interface.d.ts +23 -0
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/cc-adapter.interface.d.ts.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/cc-event.data-service.d.ts.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/cc-event.data-service.js +10 -3
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/cc-event.data-service.js.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/cc-manager.control-service.d.ts +15 -0
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/cc-manager.control-service.d.ts.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/cc-manager.control-service.js +75 -75
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/cc-manager.control-service.js.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/cc-monitoring.control-service.d.ts +6 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/cc-monitoring.control-service.d.ts.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/cc-monitoring.control-service.js +32 -9
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/cc-monitoring.control-service.js.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/cc-monitoring.control-service.spec.js +20 -2
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/cc-monitoring.control-service.spec.js.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/cc-route.control-service.d.ts +25 -0
- 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 +301 -1
- 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 +7 -3
- 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 +23 -7
- 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/status/cc-status-transition.control-service.spec.js +10 -0
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/status/cc-status-transition.control-service.spec.js.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/terminal/cc-adapter-terminal.control-service.d.ts +11 -18
- 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 +31 -48
- 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 +8 -0
- 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 +13 -2
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/terminal/cc-terminal-lifecycle.control-service.js.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/openclaw/_services/core/oc-event.data-service.d.ts.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/openclaw/_services/core/oc-event.data-service.js +8 -3
- package/server/build/src/_modules/external-sessions/_modules/openclaw/_services/core/oc-event.data-service.js.map +1 -1
- package/server/build/src/_modules/messaging/_services/control-services/providers/msg-client-socket-server.service.d.ts.map +1 -1
- package/server/build/src/_modules/messaging/_services/control-services/providers/msg-client-socket-server.service.js +12 -0
- package/server/build/src/_modules/messaging/_services/control-services/providers/msg-client-socket-server.service.js.map +1 -1
- package/server/build/src/_modules/peer-instance/_collections/utils/pei-error-recording.util.d.ts +42 -0
- package/server/build/src/_modules/peer-instance/_collections/utils/pei-error-recording.util.d.ts.map +1 -0
- package/server/build/src/_modules/peer-instance/_collections/utils/pei-error-recording.util.js +73 -0
- package/server/build/src/_modules/peer-instance/_collections/utils/pei-error-recording.util.js.map +1 -0
- package/server/build/src/_modules/peer-instance/_collections/utils/pei-error-recording.util.spec.d.ts +10 -0
- package/server/build/src/_modules/peer-instance/_collections/utils/pei-error-recording.util.spec.d.ts.map +1 -0
- package/server/build/src/_modules/peer-instance/_collections/utils/pei-error-recording.util.spec.js +89 -0
- package/server/build/src/_modules/peer-instance/_collections/utils/pei-error-recording.util.spec.js.map +1 -0
- package/server/build/src/_modules/peer-instance/_models/interfaces/pei-bootstrap-attempt.interface.d.ts +8 -1
- package/server/build/src/_modules/peer-instance/_models/interfaces/pei-bootstrap-attempt.interface.d.ts.map +1 -1
- package/server/build/src/_modules/peer-instance/_services/pei-bootstrap-watchdog.spec.d.ts +10 -0
- package/server/build/src/_modules/peer-instance/_services/pei-bootstrap-watchdog.spec.d.ts.map +1 -0
- package/server/build/src/_modules/peer-instance/_services/pei-bootstrap-watchdog.spec.js +74 -0
- package/server/build/src/_modules/peer-instance/_services/pei-bootstrap-watchdog.spec.js.map +1 -0
- package/server/build/src/_modules/peer-instance/_services/pei-bootstrap.control-service.d.ts +37 -0
- package/server/build/src/_modules/peer-instance/_services/pei-bootstrap.control-service.d.ts.map +1 -1
- package/server/build/src/_modules/peer-instance/_services/pei-bootstrap.control-service.js +117 -0
- package/server/build/src/_modules/peer-instance/_services/pei-bootstrap.control-service.js.map +1 -1
- package/server/build/src/_modules/peer-instance/_services/pei-dispatch.control-service.d.ts +11 -0
- package/server/build/src/_modules/peer-instance/_services/pei-dispatch.control-service.d.ts.map +1 -1
- package/server/build/src/_modules/peer-instance/_services/pei-dispatch.control-service.js +11 -1
- package/server/build/src/_modules/peer-instance/_services/pei-dispatch.control-service.js.map +1 -1
- package/server/build/src/_modules/peer-instance/_services/pei-dispatch.control-service.spec.js +65 -0
- package/server/build/src/_modules/peer-instance/_services/pei-dispatch.control-service.spec.js.map +1 -1
- package/server/build/src/_modules/peer-instance/_services/pei-heartbeat.control-service.d.ts.map +1 -1
- package/server/build/src/_modules/peer-instance/_services/pei-heartbeat.control-service.js +24 -0
- package/server/build/src/_modules/peer-instance/_services/pei-heartbeat.control-service.js.map +1 -1
- package/server/build/src/_modules/peer-instance/_services/pei-ws-client.control-service.d.ts +30 -0
- package/server/build/src/_modules/peer-instance/_services/pei-ws-client.control-service.d.ts.map +1 -1
- package/server/build/src/_modules/peer-instance/_services/pei-ws-client.control-service.js +91 -2
- package/server/build/src/_modules/peer-instance/_services/pei-ws-client.control-service.js.map +1 -1
- package/server/build/src/_modules/peer-instance/_services/pei-ws-server.control-service.d.ts.map +1 -1
- package/server/build/src/_modules/peer-instance/_services/pei-ws-server.control-service.js +10 -0
- package/server/build/src/_modules/peer-instance/_services/pei-ws-server.control-service.js.map +1 -1
- package/server/build/src/_modules/scheduler/_collections/utils/sch-jitter.util.spec.js +4 -2
- package/server/build/src/_modules/scheduler/_collections/utils/sch-jitter.util.spec.js.map +1 -1
- package/server/build/src/_modules/setup-config/_models/interfaces/cluster/sc-cluster-diagnostics-result.interface.d.ts +9 -0
- package/server/build/src/_modules/setup-config/_models/interfaces/cluster/sc-cluster-diagnostics-result.interface.d.ts.map +1 -1
- package/server/build/src/_modules/setup-config/_services/control-services/sc-cluster.control-service.d.ts.map +1 -1
- package/server/build/src/_modules/setup-config/_services/control-services/sc-cluster.control-service.js +1 -0
- package/server/build/src/_modules/setup-config/_services/control-services/sc-cluster.control-service.js.map +1 -1
- package/client-dist/ca.module-MVE3OLDD.js +0 -5
- package/client-dist/cc-usage-dashboard.component-F7S4MG67.js +0 -2
- package/client-dist/cc-usage-dashboard.component-F7S4MG67.js.map +0 -7
- package/client-dist/cc.module-GOXYWYW2.js +0 -4
- package/client-dist/cc.module-GOXYWYW2.js.map +0 -7
- package/client-dist/chunk-EGRHWZRV.js +0 -1
- package/client-dist/chunk-EGRHWZRV.js.map +0 -7
- package/client-dist/chunk-IINV7GMO.js.map +0 -7
- package/client-dist/chunk-KYVIZZWW.js.map +0 -7
- package/client-dist/chunk-MZLFEWAN.js +0 -2
- package/client-dist/chunk-MZLFEWAN.js.map +0 -7
- package/client-dist/chunk-QPEW5PI4.js +0 -2
- package/client-dist/chunk-QPEW5PI4.js.map +0 -7
- package/client-dist/consultant.module-WUUVSVHL.js +0 -3
- package/client-dist/oc.module-CDGBJ6I4.js +0 -3
- package/client-dist/project-source-routed.module-FDCQCUUB.js +0 -2
- package/client-dist/session.module-AKETH5O2.js +0 -12
- package/client-dist/session.module-AKETH5O2.js.map +0 -7
- package/client-dist/styles-KHQAHCL5.css +0 -2
- package/client-dist/styles-KHQAHCL5.css.map +0 -7
- /package/client-dist/{agent-instances.module-V7DKSWVC.js.map → agent-instances.module-TPKOBI3N.js.map} +0 -0
- /package/client-dist/{chunk-JZHYGU3K.js.map → chunk-25KTNALK.js.map} +0 -0
- /package/client-dist/{chunk-6GSTJE3R.js.map → chunk-26YUXPZI.js.map} +0 -0
- /package/client-dist/{chunk-4SFV57IQ.js.map → chunk-44TWBJUK.js.map} +0 -0
- /package/client-dist/{chunk-DURLBTAJ.js.map → chunk-4EOSKDXN.js.map} +0 -0
- /package/client-dist/{chunk-3TMVRWAB.js.map → chunk-4FK2D2PX.js.map} +0 -0
- /package/client-dist/{chunk-MY75XBDH.js.map → chunk-4PBNHSRW.js.map} +0 -0
- /package/client-dist/{chunk-3D32XY5M.js.map → chunk-5RLDT3NY.js.map} +0 -0
- /package/client-dist/{chunk-VGTXKD6D.js.map → chunk-5YDHEFSD.js.map} +0 -0
- /package/client-dist/{chunk-XTUQJ3W6.js.map → chunk-657E66YR.js.map} +0 -0
- /package/client-dist/{chunk-CFHQS3UB.js.map → chunk-6BYNIFJY.js.map} +0 -0
- /package/client-dist/{chunk-5C3KCWYF.js.map → chunk-7CMPZXAO.js.map} +0 -0
- /package/client-dist/{chunk-TP2634XD.js.map → chunk-7VY64KMU.js.map} +0 -0
- /package/client-dist/{chunk-7SAFEFWU.js.map → chunk-A33MCHYC.js.map} +0 -0
- /package/client-dist/{chunk-HLNT234H.js.map → chunk-BJ4I73WC.js.map} +0 -0
- /package/client-dist/{chunk-AI7WKHRQ.js.map → chunk-C2BQQRVH.js.map} +0 -0
- /package/client-dist/{chunk-JMZKJLUE.js.map → chunk-CAMM4S7P.js.map} +0 -0
- /package/client-dist/{chunk-GZDOO5NB.js.map → chunk-CDNAFC73.js.map} +0 -0
- /package/client-dist/{chunk-GADEZIXI.js.map → chunk-CU5YQ2M4.js.map} +0 -0
- /package/client-dist/{chunk-2OAF6FCL.js.map → chunk-DXF2FJLD.js.map} +0 -0
- /package/client-dist/{chunk-TOFOK5W7.js.map → chunk-E6WOJOGT.js.map} +0 -0
- /package/client-dist/{chunk-OEEQNIJG.js.map → chunk-EDMLVG72.js.map} +0 -0
- /package/client-dist/{chunk-D2UUXA6L.js.map → chunk-GG2WP2KM.js.map} +0 -0
- /package/client-dist/{chunk-R5WCLLO5.js.map → chunk-IHNAAEA2.js.map} +0 -0
- /package/client-dist/{chunk-SQWHJTFE.js.map → chunk-J5INQQ5M.js.map} +0 -0
- /package/client-dist/{chunk-OUBNMT7L.js.map → chunk-KX2KGHQZ.js.map} +0 -0
- /package/client-dist/{chunk-2EMFCVYO.js.map → chunk-L2XJGYW4.js.map} +0 -0
- /package/client-dist/{chunk-LIQPVSH3.js.map → chunk-L42Z7YNK.js.map} +0 -0
- /package/client-dist/{chunk-PTCJL62W.js.map → chunk-LCKABD2M.js.map} +0 -0
- /package/client-dist/{chunk-OQW6FXRJ.js.map → chunk-LIGODF4I.js.map} +0 -0
- /package/client-dist/{chunk-MS5OG7JD.js.map → chunk-LMK3IOKN.js.map} +0 -0
- /package/client-dist/{chunk-BC7H7K5F.js.map → chunk-OCNDLQG5.js.map} +0 -0
- /package/client-dist/{chunk-4JKJRGJX.js.map → chunk-OKUYYDGV.js.map} +0 -0
- /package/client-dist/{chunk-U2EBQMSE.js.map → chunk-OLLHHMTV.js.map} +0 -0
- /package/client-dist/{chunk-ILG5WENK.js.map → chunk-OS5KCUZD.js.map} +0 -0
- /package/client-dist/{chunk-3PLWSRB4.js.map → chunk-PMJP2N4K.js.map} +0 -0
- /package/client-dist/{chunk-JEHOIN7Y.js.map → chunk-PW5BAINL.js.map} +0 -0
- /package/client-dist/{chunk-DJVWZQNB.js.map → chunk-QQ2GRU2N.js.map} +0 -0
- /package/client-dist/{chunk-CRYF37M7.js.map → chunk-RYD462IO.js.map} +0 -0
- /package/client-dist/{chunk-7X22BWF7.js.map → chunk-SK3XGSYF.js.map} +0 -0
- /package/client-dist/{chunk-PG7CJVEP.js.map → chunk-TFB7ULAV.js.map} +0 -0
- /package/client-dist/{chunk-SYCUR4MY.js.map → chunk-U3Y5GO6O.js.map} +0 -0
- /package/client-dist/{chunk-OLK5MJ4J.js.map → chunk-U64N3LCA.js.map} +0 -0
- /package/client-dist/{chunk-AX7QIINI.js.map → chunk-UD4PV7CD.js.map} +0 -0
- /package/client-dist/{chunk-3PA6BJES.js.map → chunk-UM7AS2IW.js.map} +0 -0
- /package/client-dist/{chunk-CLQC45GB.js.map → chunk-UVVGFHUG.js.map} +0 -0
- /package/client-dist/{chunk-RSPVPEQ4.js.map → chunk-VOFDBT5T.js.map} +0 -0
- /package/client-dist/{chunk-C4JDDOQR.js.map → chunk-VRG74DKK.js.map} +0 -0
- /package/client-dist/{chunk-VO5ZLOZM.js.map → chunk-W7HIS2QA.js.map} +0 -0
- /package/client-dist/{chunk-PFBJ7ZHP.js.map → chunk-XFXMWTQS.js.map} +0 -0
- /package/client-dist/{crd.module-IRGVOYD5.js.map → crd.module-ER6AHSX5.js.map} +0 -0
- /package/client-dist/{dashboard.module-NPPSZHO6.js.map → dashboard.module-TSNGGBCI.js.map} +0 -0
- /package/client-dist/{do.module-GKQTJOXR.js.map → do.module-NMZD5VSM.js.map} +0 -0
- /package/client-dist/{document-library.module-JK3K7QNJ.js.map → document-library.module-GHDNXP3T.js.map} +0 -0
- /package/client-dist/{embedding-eval.module-LVESAMPN.js.map → embedding-eval.module-XPXBOIP5.js.map} +0 -0
- /package/client-dist/{embedding-registry.module-3ECACZZ3.js.map → embedding-registry.module-45TQGZI2.js.map} +0 -0
- /package/client-dist/{err.module-B666YXQT.js.map → err.module-GCKYDYCK.js.map} +0 -0
- /package/client-dist/{feedback.module-AHG7462C.js.map → feedback.module-TLKZ4B4N.js.map} +0 -0
- /package/client-dist/{host-runtime-mcp.module-XFUI7B65.js.map → host-runtime-mcp.module-HVJZN5R5.js.map} +0 -0
- /package/client-dist/{live-dev-pipeline.module-OMK67DGM.js.map → live-dev-pipeline.module-5PE4ZFFW.js.map} +0 -0
- /package/client-dist/{logs.module-FWACECVV.js.map → logs.module-335EXKCD.js.map} +0 -0
- /package/client-dist/{master-control-remote-poc.module-GQ6RMPRB.js.map → master-control-remote-poc.module-ORHRUCZH.js.map} +0 -0
- /package/client-dist/{mobile-app.module-YSARX6QC.js.map → mobile-app.module-BYYNVKQR.js.map} +0 -0
- /package/client-dist/{model-registry.module-SJOUSDXZ.js.map → model-registry.module-KIHIJ2Z6.js.map} +0 -0
- /package/client-dist/{orc.module-5S7GBE4E.js.map → orc.module-KZELL6XR.js.map} +0 -0
- /package/client-dist/{project-management.module-LWZLB6VU.js.map → project-management.module-IJNPSUQZ.js.map} +0 -0
- /package/client-dist/{project-source-routed.module-FDCQCUUB.js.map → project-source-routed.module-DP3RD454.js.map} +0 -0
- /package/client-dist/{scheduler.module-VH647PWD.js.map → scheduler.module-S3IKZCLL.js.map} +0 -0
- /package/client-dist/{setup.module-RRQZ62B2.js.map → setup.module-VTI5EZ3Q.js.map} +0 -0
- /package/client-dist/{terminals.module-QKIQS6FH.js.map → terminals.module-KHEDY6QN.js.map} +0 -0
- /package/client-dist/{voice-notes-poc.module-K3FB6OIB.js.map → voice-notes-poc.module-EMDLJJIT.js.map} +0 -0
- /package/client-dist/{wfs.module-JVR53PGJ.js.map → wfs.module-LUTFNQG5.js.map} +0 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{e as rt}from"./chunk-25KTNALK.js";import{I as st}from"./chunk-RUSAMFGS.js";import{$a as N,C as v,D as Z,Fa as u,Ga as V,Ha as T,J as L,K as R,L as S,M as q,Pa as W,Qa as K,R as J,Ra as U,Ta as tt,Ua as et,Z as o,aa as y,bb as B,da as C,fa as w,ga as H,ha as G,hb as nt,ia as b,ja as E,jb as j,k as h,la as x,na as Q,oa as D,p as g,pa as k,pb as it,qa as s,ra as a,sa as M,ua as P,ub as ot,va as F,wa as d,xb as at,y as I}from"./chunk-TBMJSIBB.js";var lt=(()=>{class n{baseUrl=`${st.api.baseUrl}/cc-account`;http=v(at);listAccounts(){return g(this.http.get(`${this.baseUrl}/list`))}refreshLocalAccounts(){return g(this.http.post(`${this.baseUrl}/refresh`,{}))}getInstanceMapping(){return g(this.http.get(`${this.baseUrl}/instance-mapping`))}getAccount(t){return g(this.http.get(`${this.baseUrl}/${t}`))}getAccountUsage(t){return g(this.http.get(`${this.baseUrl}/${t}/usage`))}getAccountUsageHistory(t){let e=[];t.windowType!=null&&t.windowType!==""&&e.push(`windowType=${encodeURIComponent(t.windowType)}`),t.fromMs!=null&&e.push(`fromMs=${t.fromMs}`),t.toMs!=null&&e.push(`toMs=${t.toMs}`);let i=e.length>0?`?${e.join("&")}`:"";return g(this.http.get(`${this.baseUrl}/${t.accountKey}/usage-history${i}`))}refreshAccountUsage(t){return g(this.http.post(`${this.baseUrl}/${t}/refresh-usage`,{}))}renameAccount(t){let e={};return t.displayName!==void 0&&(e.displayName=t.displayName),t.email!==void 0&&(e.email=t.email),g(this.http.patch(`${this.baseUrl}/${t.accountKey}`,e))}static \u0275fac=function(e){return new(e||n)};static \u0275prov=I({token:n,factory:n.\u0275fac,providedIn:"root"})}return n})();var pt="cc:account-usage-update",_t="cc:account-list-update",ut=(()=>{class n{account_AS=v(lt);socket_CS=v(rt);ngZone=v(J);socketSubscription=null;accounts_$=y([]);accountUsageMap_$=y(new Map);instanceMapping_$=y(null);usageHistoryMap_$=y(new Map);isLoading_$=y(!1);loadError_$=y(null);loadDashboardBootstrap(){return h(this,null,function*(){this.isLoading_$.set(!0),this.loadError_$.set(null);try{let[t,e]=yield Promise.all([this.account_AS.listAccounts(),this.account_AS.getInstanceMapping()]);this.accounts_$.set(t.items),this.instanceMapping_$.set(e);let i=t.items.map(p=>this.account_AS.getAccountUsage(p.accountKey)),c=yield Promise.all(i),_=new Map(this.accountUsageMap_$());for(let p=0;p<t.items.length;p++)_.set(t.items[p].accountKey,c[p].items);this.accountUsageMap_$.set(_)}catch(t){this.loadError_$.set(this.errorMessageOf(t))}finally{this.isLoading_$.set(!1)}})}loadAccounts(){return h(this,null,function*(){try{let t=yield this.account_AS.listAccounts();this.accounts_$.set(t.items)}catch(t){this.loadError_$.set(this.errorMessageOf(t))}})}loadAccountUsage(t){return h(this,null,function*(){try{let e=yield this.account_AS.getAccountUsage(t),i=new Map(this.accountUsageMap_$());i.set(t,e.items),this.accountUsageMap_$.set(i)}catch(e){this.loadError_$.set(this.errorMessageOf(e))}})}loadAccountUsageHistory(t){return h(this,null,function*(){try{let e=yield this.account_AS.getAccountUsageHistory(t),i=new Map(this.usageHistoryMap_$());i.set(t.accountKey,e.items),this.usageHistoryMap_$.set(i)}catch(e){this.loadError_$.set(this.errorMessageOf(e))}})}loadInstanceMapping(){return h(this,null,function*(){try{let t=yield this.account_AS.getInstanceMapping();this.instanceMapping_$.set(t)}catch(t){this.loadError_$.set(this.errorMessageOf(t))}})}refreshAccounts(){return h(this,null,function*(){this.isLoading_$.set(!0),this.loadError_$.set(null);try{let t=yield this.account_AS.refreshLocalAccounts();return yield this.loadAccounts(),t}catch(t){return this.loadError_$.set(this.errorMessageOf(t)),{refreshedKeys:[],scannedPaths:0}}finally{this.isLoading_$.set(!1)}})}refreshAccountUsage(t){return h(this,null,function*(){try{let e=yield this.account_AS.refreshAccountUsage(t);return yield this.loadAccountUsage(t),yield this.loadAccounts(),e}catch(e){return this.loadError_$.set(this.errorMessageOf(e)),{status:"error",windowsUpserted:0,email:null}}})}renameAccount(t){return h(this,null,function*(){try{let e=yield this.account_AS.renameAccount(t),i=this.accounts_$().map(c=>c.accountKey===t.accountKey?e:c);this.accounts_$.set(i)}catch(e){this.loadError_$.set(this.errorMessageOf(e))}})}startLiveUpdates(){this.socketSubscription==null&&(this.socketSubscription=this.socket_CS.event$.subscribe(t=>{this.ngZone.run(()=>{t.event===pt?this.handleAccountUsageUpdate(t.payload):t.event===_t&&this.handleAccountListUpdate(t.payload)})}))}stopLiveUpdates(){this.socketSubscription!=null&&(this.socketSubscription.unsubscribe(),this.socketSubscription=null)}ngOnDestroy(){this.stopLiveUpdates()}handleAccountUsageUpdate(t){let e=t.accountKey,i=t.windowType;if(typeof e!="string"||e===""||typeof i!="string")return;let c={accountKey:e,windowType:i,utilization:typeof t.utilization=="number"?t.utilization:void 0,resetsAtMs:typeof t.resetsAtMs=="number"?t.resetsAtMs:void 0,lastObservedStatus:typeof t.lastObservedStatus=="string"?t.lastObservedStatus:void 0,observedAt:typeof t.observedAt=="string"?t.observedAt:void 0,lastObservedByCcapId:typeof t.lastObservedByCcapId=="string"?t.lastObservedByCcapId:void 0,lastObservedBySessionId:typeof t.lastObservedBySessionId=="string"?t.lastObservedBySessionId:void 0},_=new Map(this.accountUsageMap_$()),l=(_.get(e)??[]).filter(f=>f.windowType!==i);l.push(c),_.set(e,l),this.accountUsageMap_$.set(_)}handleAccountListUpdate(t){this.loadAccounts()}errorMessageOf(t){if(t instanceof Error)return t.message;if(typeof t=="object"&&t!==null){let e=t;if(typeof e.message=="string")return e.message}return String(t)}static \u0275fac=function(e){return new(e||n)};static \u0275prov=I({token:n,factory:n.\u0275fac,providedIn:"root"})}return n})();var $=(()=>{class n{static CHART_WIDTH=100;static CHART_HEIGHT=40;static COLOR_MAP={five_hour:"#10b981",seven_day:"#06b6d4",seven_day_opus:"#a855f7",seven_day_sonnet:"#f59e0b",extra_usage:"#f43f5e"};static WINDOW_LABEL_MAP={five_hour:"5h",seven_day:"Weekly",seven_day_opus:"Opus",seven_day_sonnet:"Sonnet",extra_usage:"Extra"};static WINDOW_ORDER=["five_hour","seven_day","seven_day_opus","seven_day_sonnet","extra_usage"];static buildChart(t){let e=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY,c=0;for(let l of t){if(typeof l.observedAt!="string"||l.observedAt===""||typeof l.utilization!="number"||!isFinite(l.utilization))continue;let f=Date.parse(l.observedAt);isFinite(f)&&(f<e&&(e=f),f>i&&(i=f),c++)}if(c===0)return{lines:n.WINDOW_ORDER.map(l=>({windowType:l,label:n.WINDOW_LABEL_MAP[l]??l,colorHex:n.COLOR_MAP[l]??"#9ca3af",pathPoints:"",hasData:!1,pointCount:0,lastX:0,lastY:0})),hasAnyData:!1,minTimeMs:0,maxTimeMs:0};i-e<1&&(i=e+36e5);let _=i-e,p=n.WINDOW_ORDER.map(l=>{let f=[];for(let m of t){if(m.windowType!==l||typeof m.observedAt!="string"||m.observedAt===""||typeof m.utilization!="number"||!isFinite(m.utilization))continue;let A=Date.parse(m.observedAt);isFinite(A)&&f.push({t:A,u:Math.max(0,Math.min(1,m.utilization))})}f.sort((m,A)=>m.t-A.t);let O=[],z=0,Y=0;for(let m of f){let A=(m.t-e)/_*n.CHART_WIDTH,X=n.CHART_HEIGHT-m.u*n.CHART_HEIGHT;O.push(`${A.toFixed(2)},${X.toFixed(2)}`),z=A,Y=X}return{windowType:l,label:n.WINDOW_LABEL_MAP[l]??l,colorHex:n.COLOR_MAP[l]??"#9ca3af",pathPoints:O.join(" "),hasData:O.length>0,pointCount:O.length,lastX:z,lastY:Y}});return{lines:p,hasAnyData:p.some(l=>l.hasData),minTimeMs:e,maxTimeMs:i}}}return n})();var dt=(n,r)=>r.windowType,mt=()=>["five_hour","seven_day","seven_day_opus","seven_day_sonnet","extra_usage"];function ht(n,r){if(n&1&&M(0,"div"),n&2){d();let t=U(0),e=d();E("h-full transition-all "+e.utilizationBarColorClass(t.utilization)),G("width",e.utilizationPercent(t.utilization),"%")}}function ft(n,r){if(n&1&&(W(0),s(1,"div")(2,"div",4),u(3),a(),s(4,"div",5)(5,"div"),C(6,ht,1,4,"div",6),a(),s(7,"span",7),u(8),a()(),s(9,"div",8),u(10),a()()),n&2){let t,e=r.$implicit,i=d(),c=K(i.usageItemOfWindow(e));o(),E(i.compact?"grid grid-cols-[90px_1fr_56px] items-center gap-2 text-[10px]":"grid grid-cols-[110px_1fr_64px] items-center gap-2 text-[11px]"),b("opacity-50",!c),o(),H("title",e),o(),T(" ",i.windowLabelOf(e)," "),o(2),E(i.compact?"flex-1 h-1.5 bg-neutral-800 rounded-full overflow-hidden":"flex-1 h-2 bg-neutral-800 rounded-full overflow-hidden"),o(),x(c?6:-1),o(),E(i.compact?"w-8 text-[10px]":"w-9"),o(),T(" ",i.formatUtilization((t=c==null?null:c.utilization)!==null&&t!==void 0?t:null)," "),o(),H("title","Resets in "+i.formatResetCountdown(c==null?null:c.resetsAtMs)),o(),T(" ",i.formatResetCountdown(c==null?null:c.resetsAtMs)," ")}}function xt(n,r){n&1&&(s(0,"div",2),u(1," No data yet \u2014 click "),s(2,"strong",9),u(3,"Pull"),a(),u(4," or wait for the next rate-limit event. "),a())}function Ct(n,r){n&1&&(s(0,"div",14),u(1," No graph data yet \u2014 pull usage or wait for a CC session rate-limit event. "),a())}function gt(n,r){if(n&1&&(S(),M(0,"circle",25)),n&2){let t=d(2).$implicit;w("cx",t.lastX)("cy",t.lastY)("fill",t.colorHex)}}function yt(n,r){if(n&1&&(S(),M(0,"polyline",26)(1,"circle",27)),n&2){let t=d(2).$implicit;w("points",t.pathPoints)("stroke",t.colorHex),o(),w("cx",t.lastX)("cy",t.lastY)("fill",t.colorHex)}}function vt(n,r){if(n&1&&C(0,gt,1,3,":svg:circle",25)(1,yt,2,5),n&2){let t=d().$implicit;x(t.pointCount===1?0:1)}}function wt(n,r){if(n&1&&C(0,vt,2,1),n&2){let t=r.$implicit;x(t.hasData?0:-1)}}function At(n,r){if(n&1&&(s(0,"span",31),u(1,"\xB7"),a(),s(2,"span",32),u(3),a()),n&2){let t=d().$implicit,e=d(4);o(3),T(" ",((e.chartH-t.lastY)/e.chartH*100).toFixed(0),"% ")}}function bt(n,r){if(n&1&&(s(0,"div",28),M(1,"span",29),s(2,"span",30),u(3),a(),C(4,At,4,1),a()),n&2){let t=r.$implicit;b("opacity-40",!t.hasData),o(),G("background-color",t.colorHex),o(2),V(t.label),o(),x(t.hasData?4:-1)}}function Mt(n,r){if(n&1&&(s(0,"span"),u(1),N(2,"date"),a()),n&2){d(2);let t=U(0);o(),V(B(2,1,t.minTimeMs,"yyyy-MM-dd HH:mm"))}}function $t(n,r){n&1&&(s(0,"span"),u(1,"\u2014"),a())}function Tt(n,r){if(n&1&&(s(0,"span"),u(1),N(2,"date"),a()),n&2){d(2);let t=U(0);o(),V(B(2,1,t.maxTimeMs,"yyyy-MM-dd HH:mm"))}}function St(n,r){n&1&&(s(0,"span"),u(1,"\u2014"),a())}function Et(n,r){if(n&1){let t=P();s(0,"div",15),S(),s(1,"svg",16),M(2,"line",17)(3,"line",18)(4,"line",19),D(5,wt,1,1,null,null,dt),a(),q(),s(7,"div",20)(8,"span"),u(9,"100%"),a(),s(10,"span"),u(11,"50%"),a(),s(12,"span"),u(13,"0%"),a()()(),s(14,"div",21),D(15,bt,5,6,"div",22,dt),a(),s(17,"div",23),C(18,Mt,3,4,"span")(19,$t,2,0,"span"),s(20,"button",24),F("click",function(){L(t);let i=d(3);return R(i.handleRefreshGraph())}),u(21," \u21BB Refresh "),a(),C(22,Tt,3,4,"span")(23,St,2,0,"span"),a()}if(n&2){d();let t=U(0),e=d(2);o(),b("h-24",e.compact)("h-32",!e.compact),w("viewBox",e.chartViewBox),o(),w("y1",e.chartH)("x2",e.chartW)("y2",e.chartH),o(),w("y1",e.chartMidY)("x2",e.chartW)("y2",e.chartMidY),o(),w("x2",e.chartW),o(),k(t.lines),o(10),k(t.lines),o(3),x(t.minTimeMs?18:19),o(4),x(t.maxTimeMs?22:23)}}function Ut(n,r){if(n&1&&(W(0),s(1,"div",13),C(2,Ct,2,0,"div",14)(3,Et,24,14),a()),n&2){let t=K(d(2).chart_$());o(2),x(t.hasAnyData?3:2)}}function Ot(n,r){if(n&1){let t=P();s(0,"div",3)(1,"button",10),F("click",function(){L(t);let i=d();return R(i.handleToggleGraph())}),S(),s(2,"svg",11),M(3,"path",12),a(),u(4),a(),C(5,Ut,4,2,"div",13),a()}if(n&2){let t=d();o(),H("title",t.isGraphOpen_$()?"Hide usage graph":"Show usage graph (utilization over time per window)"),o(),b("rotate-90",t.isGraphOpen_$()),o(2),T(" \u{1F4C8} ",t.isGraphOpen_$()?"Hide":"Show"," graph "),o(),x(t.isGraphOpen_$()?5:-1)}}var Jt=(()=>{class n{account_DS=v(ut);accountKey="";compact=!1;showGraphToggle=!0;initiallyOpenGraph=!1;isGraphOpen_$=y(!1);chart_$=nt(()=>$.buildChart(this.account_DS.usageHistoryMap_$().get(this.accountKey)??[]));chartViewBox=`0 0 ${$.CHART_WIDTH} ${$.CHART_HEIGHT}`;chartW=$.CHART_WIDTH;chartH=$.CHART_HEIGHT;chartMidY=$.CHART_HEIGHT/2;usageEffect=j(()=>{let t=this.accountKey;t&&(this.account_DS.accountUsageMap_$().has(t)||this.account_DS.loadAccountUsage(t))});initialOpenEffect=j(()=>{this.initiallyOpenGraph&&this.isGraphOpen_$.set(!0)});handleToggleGraph(){return h(this,null,function*(){let t=!this.isGraphOpen_$();this.isGraphOpen_$.set(t),t&&!this.account_DS.usageHistoryMap_$().has(this.accountKey)&&(yield this.account_DS.loadAccountUsageHistory({accountKey:this.accountKey}))})}handleRefreshGraph(){return h(this,null,function*(){yield this.account_DS.loadAccountUsageHistory({accountKey:this.accountKey})})}usageItemOfWindow(t){let e=this.account_DS.accountUsageMap_$().get(this.accountKey)??[];for(let i of e)if(i.windowType===t)return i;return null}hasAnyUsageData(){return(this.account_DS.accountUsageMap_$().get(this.accountKey)??[]).length>0}windowLabelOf(t){switch(t){case"five_hour":return"5-hour session";case"seven_day":return"Weekly";case"seven_day_opus":return"Weekly \xB7 Opus";case"seven_day_sonnet":return"Weekly \xB7 Sonnet";case"extra_usage":return"Extra (pay-as-you-go)";default:return t}}utilizationPercent(t){return t==null||!isFinite(t)?0:Math.max(0,Math.min(100,Math.round(t*100)))}formatUtilization(t){return t==null?"\u2014":`${Math.round(t*100)}%`}utilizationBarColorClass(t){return t==null||!isFinite(t)?"bg-neutral-600":t>=.85?"bg-red-500":t>=.5?"bg-amber-500":"bg-emerald-500"}formatResetCountdown(t){if(t==null||!isFinite(t)||t<=0)return"\u2014";let e=t-Date.now();if(e<=0)return"expired";let i=Math.floor(e/6e4),c=Math.floor(i/(60*24)),_=Math.floor(i%(60*24)/60),p=i%60;return c>0?`${c}d ${_}h`:_>0?`${_}h ${p}m`:`${p}m`}static \u0275fac=function(e){return new(e||n)};static \u0275cmp=Z({type:n,selectors:[["app-cc-account-usage-view"]],inputs:{accountKey:"accountKey",compact:"compact",showGraphToggle:"showGraphToggle",initiallyOpenGraph:"initiallyOpenGraph"},standalone:!0,features:[tt],decls:6,vars:11,consts:[[1,"flex","flex-col"],[3,"class","opacity-50"],[1,"text-[10px]","text-neutral-500","italic","pt-1","border-t","border-neutral-800/40"],[1,"border-t","border-neutral-800/40","pt-2"],[1,"text-neutral-300","font-medium","truncate",3,"title"],[1,"flex","items-center","gap-2","min-w-0"],[3,"class","width"],[1,"font-mono","text-neutral-200","text-right","shrink-0"],[1,"font-mono","text-neutral-500","text-right","text-[10px]","truncate",3,"title"],[1,"text-neutral-400"],["type","button",1,"text-[11px]","text-neutral-400","hover:text-neonCyan","flex","items-center","gap-1","transition-colors",3,"click","title"],["fill","none","stroke","currentColor","viewBox","0 0 24 24","aria-hidden","true",1,"w-3","h-3","transition-transform"],["stroke-linecap","round","stroke-linejoin","round","stroke-width","2","d","M9 5l7 7-7 7"],[1,"mt-2","rounded-md","border","border-neutral-800","bg-neutral-950/40","p-2"],[1,"text-[11px]","text-neutral-500","italic","px-2","py-3","text-center"],[1,"relative","w-full"],["preserveAspectRatio","none",1,"w-full","block"],["x1","0","stroke","#3f3f46","stroke-width","0.3"],["x1","0","stroke","#3f3f46","stroke-width","0.2","stroke-dasharray","1,1"],["x1","0","y1","0","y2","0","stroke","#3f3f46","stroke-width","0.2","stroke-dasharray","1,1"],[1,"absolute","inset-y-0","left-0","flex","flex-col","justify-between","text-[8px]","text-neutral-600","font-mono","pointer-events-none"],[1,"mt-2","flex","flex-wrap","items-center","gap-2","text-[10px]"],[1,"flex","items-center","gap-1",3,"opacity-40"],[1,"mt-1","flex","items-center","justify-between","text-[9px]","text-neutral-600"],["type","button","title","Re-fetch usage event history for this graph.",1,"text-[10px]","text-neutral-400","hover:text-neonCyan","border","border-neutral-700","hover:border-neonCyan","rounded","px-1.5","py-0.5","transition-colors",3,"click"],["r","0.8"],["fill","none","stroke-width","0.6","stroke-linecap","round","stroke-linejoin","round","vector-effect","non-scaling-stroke"],["r","0.6"],[1,"flex","items-center","gap-1"],[1,"inline-block","w-2","h-2","rounded-sm"],[1,"text-neutral-300"],[1,"text-neutral-500"],[1,"font-mono","text-neutral-400"]],template:function(e,i){e&1&&(s(0,"div",0)(1,"div"),D(2,ft,11,15,"div",1,Q),a(),C(4,xt,5,0,"div",2)(5,Ot,6,5,"div",3),a()),e&2&&(b("gap-1",i.compact)("gap-2",!i.compact),o(),b("space-y-1",i.compact)("space-y-2",!i.compact),o(),k(et(10,mt)),o(2),x(i.hasAnyUsageData()?-1:4),o(),x(i.showGraphToggle?5:-1))},dependencies:[ot,it],encapsulation:2})}return n})();export{ut as a,Jt as b};
|
|
2
|
+
//# sourceMappingURL=chunk-3G2ZGV66.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["src/app/_modules/external-sessions/_modules/claude-code/_services/cc-account.api-service.ts", "src/app/_modules/external-sessions/_modules/claude-code/_services/cc-account.data-service.ts", "src/app/_modules/external-sessions/_modules/claude-code/_collections/cc-account-usage-chart.util.ts", "src/app/_modules/external-sessions/_modules/claude-code/_components/cc-account-usage-view/cc-account-usage-view.component.ts", "src/app/_modules/external-sessions/_modules/claude-code/_components/cc-account-usage-view/cc-account-usage-view.component.html"],
|
|
4
|
+
"sourcesContent": ["import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\n\nimport { firstValueFrom } from 'rxjs';\n\nimport { CC_Account_Response } from '../_models/interfaces/cc-account.interface';\nimport { CC_AccountUsageEvent_Response } from '../_models/interfaces/cc-account-usage-event.interface';\nimport {\n CC_AccountInstanceMapping_Response,\n CC_AccountUsageState_Response,\n} from '../_models/interfaces/cc-account-usage-state.interface';\nimport { environment } from '../../../../../../environments/environment';\n\n/**\n * CC Account REST API service (REQ-CC-USAGE-DASHBOARD-001 Slice 5 cycle 856).\n *\n * HTTP-bridge a server-oldali `CC_Account_Controller` endpoint-jaihoz\n * (`/cc-account/*`). Egyszerű thin api-service mintán a\n * `cc-cci-instance-data.api-service.ts`-hez hasonlóan: minden hívás\n * `firstValueFrom`-mal Promise-ra fordított `HttpClient` get/post/patch.\n *\n * A Slice 5+ Dashboard komponensek és a Slice 6 instance-mapping view\n * data-service-en keresztül használja.\n */\n@Injectable({ providedIn: 'root' })\nexport class CC_Account_ApiService {\n\n private readonly baseUrl: string = `${environment.api.baseUrl}/cc-account`;\n\n private readonly http: HttpClient = inject(HttpClient);\n\n /** GET /cc-account/list — cross-instance account-lista. */\n listAccounts(): Promise<{ items: CC_Account_Response[] }> {\n return firstValueFrom(\n this.http.get<{ items: CC_Account_Response[] }>(`${this.baseUrl}/list`),\n );\n }\n\n /** POST /cc-account/refresh — a hívó CCAP instance-en credential-discovery újrafutás. */\n refreshLocalAccounts(): Promise<{ refreshedKeys: string[]; scannedPaths: number }> {\n return firstValueFrom(\n this.http.post<{ refreshedKeys: string[]; scannedPaths: number }>(\n `${this.baseUrl}/refresh`,\n {},\n ),\n );\n }\n\n /**\n * GET /cc-account/instance-mapping — Slice 4 cross-instance aggregate.\n * Minden ismert CCAP instance group-by lastObservedByCcapId — melyik account-okat\n * látta utoljára.\n */\n getInstanceMapping(): Promise<CC_AccountInstanceMapping_Response> {\n return firstValueFrom(\n this.http.get<CC_AccountInstanceMapping_Response>(`${this.baseUrl}/instance-mapping`),\n );\n }\n\n /** GET /cc-account/:accountKey — egy account részletek. */\n getAccount(accountKey: string): Promise<CC_Account_Response> {\n return firstValueFrom(\n this.http.get<CC_Account_Response>(`${this.baseUrl}/${accountKey}`),\n );\n }\n\n /**\n * GET /cc-account/:accountKey/usage — Slice 3 per-account usage state-ek.\n * 0..5 rekord (egy windowType-onként).\n */\n getAccountUsage(accountKey: string): Promise<{ items: CC_AccountUsageState_Response[] }> {\n return firstValueFrom(\n this.http.get<{ items: CC_AccountUsageState_Response[] }>(\n `${this.baseUrl}/${accountKey}/usage`,\n ),\n );\n }\n\n /**\n * GET /cc-account/:accountKey/usage-history — történeti event-lista\n * (REQ-CC-USAGE-DASHBOARD-001 cycle 879). Append-only timeline; opcionális\n * windowType + idő-tartomány szűrők (`fromMs`, `toMs`).\n */\n getAccountUsageHistory(params: {\n accountKey: string;\n windowType?: string;\n fromMs?: number;\n toMs?: number;\n }): Promise<{ items: CC_AccountUsageEvent_Response[] }> {\n const query: string[] = [];\n if (params.windowType != null && params.windowType !== '') {\n query.push(`windowType=${encodeURIComponent(params.windowType)}`);\n }\n if (params.fromMs != null) {\n query.push(`fromMs=${params.fromMs}`);\n }\n if (params.toMs != null) {\n query.push(`toMs=${params.toMs}`);\n }\n const qs: string = query.length > 0 ? `?${query.join('&')}` : '';\n return firstValueFrom(\n this.http.get<{ items: CC_AccountUsageEvent_Response[] }>(\n `${this.baseUrl}/${params.accountKey}/usage-history${qs}`,\n ),\n );\n }\n\n /**\n * POST /cc-account/:accountKey/refresh-usage — aktív Anthropic usage-pull\n * (REQ-CC-USAGE-DASHBOARD-001 cycle 873). A server credential-fájl + Bearer-rel\n * hív, az 5 window state-et upsert-eli, profile-mezőket (email/orgId/planTier)\n * a CC_Account-ba updateli, socket-broadcast.\n */\n refreshAccountUsage(accountKey: string): Promise<{ status: string; windowsUpserted: number; email: string | null }> {\n return firstValueFrom(\n this.http.post<{ status: string; windowsUpserted: number; email: string | null }>(\n `${this.baseUrl}/${accountKey}/refresh-usage`,\n {},\n ),\n );\n }\n\n /**\n * PATCH /cc-account/:accountKey — user-editable mezők frissítése (cycle 876):\n * `displayName` és/vagy `email`. Mindkettő opcionális; legalább egy kell.\n * `email: null` (vagy üres string) → kitörli (clear). Server-side validáció:\n * displayName 200-char + control-char tiltás, email RFC alap-formátum + 320-char.\n */\n renameAccount(params: {\n accountKey: string;\n displayName?: string;\n email?: string | null;\n }): Promise<CC_Account_Response> {\n const body: Record<string, unknown> = {};\n if (params.displayName !== undefined) {\n body.displayName = params.displayName;\n }\n if (params.email !== undefined) {\n body.email = params.email;\n }\n return firstValueFrom(\n this.http.patch<CC_Account_Response>(\n `${this.baseUrl}/${params.accountKey}`,\n body,\n ),\n );\n }\n}\n", "import { inject, Injectable, NgZone, OnDestroy, signal } from '@angular/core';\nimport { Subscription } from 'rxjs';\n\nimport { CCAP_Socket_ControlService } from '../../../../../_services/control-services/ccap-socket.control-service';\nimport { CC_Account_ApiService } from './cc-account.api-service';\nimport { CC_Account_Response } from '../_models/interfaces/cc-account.interface';\nimport { CC_AccountUsageEvent_Response } from '../_models/interfaces/cc-account-usage-event.interface';\nimport {\n CC_AccountInstanceMapping_Response,\n CC_AccountUsageState_Response,\n} from '../_models/interfaces/cc-account-usage-state.interface';\n\n/** Socket envelope shape — `CCAP_Socket_ControlService.event$` Subject közvetíti. */\ninterface SocketEnvelope_Interface {\n event: string;\n payload: Record<string, unknown>;\n}\n\n/** REQ-CC-USAGE-DASHBOARD-001 Slice 6 second-half: socket event nevek. */\nconst SOCKET_EVENT_CC_ACCOUNT_USAGE_UPDATE: string = 'cc:account-usage-update';\nconst SOCKET_EVENT_CC_ACCOUNT_LIST_UPDATE: string = 'cc:account-list-update';\n\n/**\n * CC Account Dashboard data service (REQ-CC-USAGE-DASHBOARD-001 Slice 5 cycle 857).\n *\n * SSOT a Slice 5+ Dashboard kliens-oldali state-jéhez. Signal-ek a komponensek\n * change-detection-jéhez (`accounts_$`, `accountUsageMap_$`, `instanceMapping_$`,\n * `isLoading_$`, `loadError_$`); async metódusok REST hívásokhoz a\n * `CC_Account_ApiService`-en át (cycle 856).\n *\n * NEM perzisztál (a backend DBNT a SSOT) — a kliens csak cache-eli a fetch-eket\n * a komponens élettartam alatt. Refresh: explicit user-action (`refreshAccounts`)\n * vagy szocket-event (Slice 6).\n */\n@Injectable({ providedIn: 'root' })\nexport class CC_Account_DataService implements OnDestroy {\n\n private readonly account_AS: CC_Account_ApiService = inject(CC_Account_ApiService);\n private readonly socket_CS: CCAP_Socket_ControlService = inject(CCAP_Socket_ControlService);\n private readonly ngZone: NgZone = inject(NgZone);\n\n /** Socket envelope subscription élettartam-kezelése. */\n private socketSubscription: Subscription | null = null;\n\n /** Cross-instance account-lista (a `listAccounts` REST eredménye). */\n readonly accounts_$ = signal<CC_Account_Response[]>([]);\n\n /**\n * Per-account usage state cache: `accountKey → usage-state[]` (5 windowType-onként\n * egy rekord max). A Slice 5 Dashboard account-card-ok ebből rendernek.\n */\n readonly accountUsageMap_$ = signal<Map<string, CC_AccountUsageState_Response[]>>(\n new Map(),\n );\n\n /** Cross-instance aggregate (Slice 4 instance-mapping endpoint cache). */\n readonly instanceMapping_$ = signal<CC_AccountInstanceMapping_Response | null>(null);\n\n /**\n * Per-account usage-history cache: `accountKey → event[]` (REQ-CC-USAGE-DASHBOARD-001\n * cycle 879). Append-only timeline a `ccap_cc_account_usage_event` collection-ből;\n * lazy-loaded a Dashboard expand-panel megnyitásakor.\n */\n readonly usageHistoryMap_$ = signal<Map<string, CC_AccountUsageEvent_Response[]>>(\n new Map(),\n );\n\n /** Bármelyik load folyamatban-e (UI spinner-hez). */\n readonly isLoading_$ = signal<boolean>(false);\n\n /** Utolsó load hiba — null ha sikeres vagy nem futott. */\n readonly loadError_$ = signal<string | null>(null);\n\n /**\n * Bootstrap fetch: account-list + instance-mapping párhuzamosan, majd a\n * megismert account-okhoz az 5 windowType-os usage state-eket is lehúzzuk\n * (REQ-CC-USAGE-DASHBOARD-001 cycle 883). Ez biztosítja, hogy a Dashboard\n * megnyitásakor azonnal látszanak az utolsó perzisztált usage értékek —\n * nem kell auto-pull socket-eventre vagy manuális Pull-clickre várni.\n */\n async loadDashboardBootstrap(): Promise<void> {\n this.isLoading_$.set(true);\n this.loadError_$.set(null);\n try {\n const [accountsResp, mappingResp] = await Promise.all([\n this.account_AS.listAccounts(),\n this.account_AS.getInstanceMapping(),\n ]);\n this.accounts_$.set(accountsResp.items);\n this.instanceMapping_$.set(mappingResp);\n // Per-account usage state párhuzamos fetch — DBNT-ből visszaolvasott\n // legutolsó snapshot (5 windowType-onként egy rekord), NEM Anthropic-pull.\n const usagePromises: Promise<{ items: CC_AccountUsageState_Response[] }>[] =\n accountsResp.items.map((a: CC_Account_Response): Promise<{ items: CC_AccountUsageState_Response[] }> =>\n this.account_AS.getAccountUsage(a.accountKey),\n );\n const usageResults: { items: CC_AccountUsageState_Response[] }[] =\n await Promise.all(usagePromises);\n const nextMap: Map<string, CC_AccountUsageState_Response[]> = new Map(this.accountUsageMap_$());\n for (let i: number = 0; i < accountsResp.items.length; i++) {\n nextMap.set(accountsResp.items[i].accountKey, usageResults[i].items);\n }\n this.accountUsageMap_$.set(nextMap);\n } catch (err: unknown) {\n this.loadError_$.set(this.errorMessageOf(err));\n } finally {\n this.isLoading_$.set(false);\n }\n }\n\n /** Csak az account-listát tölti újra (kis fetch). */\n async loadAccounts(): Promise<void> {\n try {\n const resp = await this.account_AS.listAccounts();\n this.accounts_$.set(resp.items);\n } catch (err: unknown) {\n this.loadError_$.set(this.errorMessageOf(err));\n }\n }\n\n /**\n * Per-account usage-state fetch + cache-be írás. A Slice 5 account-card\n * komponens ezt hívja a saját accountKey-jére.\n */\n async loadAccountUsage(accountKey: string): Promise<void> {\n try {\n const resp = await this.account_AS.getAccountUsage(accountKey);\n const next: Map<string, CC_AccountUsageState_Response[]> = new Map(this.accountUsageMap_$());\n next.set(accountKey, resp.items);\n this.accountUsageMap_$.set(next);\n } catch (err: unknown) {\n this.loadError_$.set(this.errorMessageOf(err));\n }\n }\n\n /**\n * Per-account usage-history fetch + cache-be írás (REQ-CC-USAGE-DASHBOARD-001\n * cycle 879). Lazy: a Dashboard expand-panel megnyitásakor hívjuk. Opcionális\n * windowType + idő-tartomány szűrőkkel.\n */\n async loadAccountUsageHistory(params: {\n accountKey: string;\n windowType?: string;\n fromMs?: number;\n toMs?: number;\n }): Promise<void> {\n try {\n const resp = await this.account_AS.getAccountUsageHistory(params);\n const next: Map<string, CC_AccountUsageEvent_Response[]> = new Map(this.usageHistoryMap_$());\n next.set(params.accountKey, resp.items);\n this.usageHistoryMap_$.set(next);\n } catch (err: unknown) {\n this.loadError_$.set(this.errorMessageOf(err));\n }\n }\n\n /** Cross-instance aggregate refetch (Slice 4 — Slice 6 view bootstrap-jánál). */\n async loadInstanceMapping(): Promise<void> {\n try {\n const resp = await this.account_AS.getInstanceMapping();\n this.instanceMapping_$.set(resp);\n } catch (err: unknown) {\n this.loadError_$.set(this.errorMessageOf(err));\n }\n }\n\n /**\n * Explicit user-trigger: a hívó CCAP instance-en credential-discovery újrafutás\n * + account-lista refetch. POST /refresh után automatikusan listAccounts-szal frissít.\n */\n async refreshAccounts(): Promise<{ refreshedKeys: string[]; scannedPaths: number }> {\n this.isLoading_$.set(true);\n this.loadError_$.set(null);\n try {\n const refreshResult = await this.account_AS.refreshLocalAccounts();\n await this.loadAccounts();\n return refreshResult;\n } catch (err: unknown) {\n this.loadError_$.set(this.errorMessageOf(err));\n return { refreshedKeys: [], scannedPaths: 0 };\n } finally {\n this.isLoading_$.set(false);\n }\n }\n\n /**\n * Aktív usage-pull egy adott account-ra (REQ-CC-USAGE-DASHBOARD-001 cycle 873).\n * A server `POST /cc-account/:accountKey/refresh-usage`-t hívja, ami az\n * Anthropic `/api/oauth/usage` endpoint-ját triggeri Bearer-rel. A pull\n * eredménye automatikusan jön socket-eventként (`cc:account-usage-update`),\n * de a sikeres POST után explicit re-fetch-eljük is az adott account usage-ét\n * + a teljes account-listát (a profile-mezők is updatelődtek).\n */\n async refreshAccountUsage(accountKey: string): Promise<{ status: string; windowsUpserted: number; email: string | null }> {\n try {\n const result = await this.account_AS.refreshAccountUsage(accountKey);\n // Re-fetch a friss state-et — bár a socket-event is jön, a cache-frissítés\n // garantált a user-action végén.\n await this.loadAccountUsage(accountKey);\n await this.loadAccounts();\n return result;\n } catch (err: unknown) {\n this.loadError_$.set(this.errorMessageOf(err));\n return { status: 'error', windowsUpserted: 0, email: null };\n }\n }\n\n /**\n * Display-name átírása + a cache-elt account-lista frissítése (a megfelelő\n * elem displayName mezőjének felülírása, signal-update).\n */\n async renameAccount(params: {\n accountKey: string;\n displayName?: string;\n email?: string | null;\n }): Promise<void> {\n try {\n const updated = await this.account_AS.renameAccount(params);\n const next: CC_Account_Response[] = this.accounts_$().map(\n (a): CC_Account_Response => (a.accountKey === params.accountKey ? updated : a),\n );\n this.accounts_$.set(next);\n } catch (err: unknown) {\n this.loadError_$.set(this.errorMessageOf(err));\n }\n }\n\n /**\n * Socket subscription init (REQ-CC-USAGE-DASHBOARD-001 Slice 6 second-half cycle 871).\n * A `CCAP_Socket_ControlService.event$` Subject minden socket-event-et közvetít\n * envelope-formában (event-name + payload). Mi az `cc:account-usage-update`\n * és `cc:account-list-update` event-ekre szűrünk és a megfelelő signal-eket frissítjük.\n *\n * Late subscription: a Dashboard component `ngOnInit`-jéből hívjuk (vagy explicit\n * service-init-kor), hogy ne legyen subscription-overhead, ha a Dashboard sose\n * nyílik meg.\n */\n startLiveUpdates(): void {\n if (this.socketSubscription != null) {\n return;\n }\n this.socketSubscription = this.socket_CS.event$.subscribe(\n (envelope: SocketEnvelope_Interface): void => {\n this.ngZone.run((): void => {\n if (envelope.event === SOCKET_EVENT_CC_ACCOUNT_USAGE_UPDATE) {\n this.handleAccountUsageUpdate(envelope.payload);\n } else if (envelope.event === SOCKET_EVENT_CC_ACCOUNT_LIST_UPDATE) {\n this.handleAccountListUpdate(envelope.payload);\n }\n });\n },\n );\n }\n\n /** Socket subscription teardown (component destroy / explicit stop). */\n stopLiveUpdates(): void {\n if (this.socketSubscription != null) {\n this.socketSubscription.unsubscribe();\n this.socketSubscription = null;\n }\n }\n\n ngOnDestroy(): void {\n this.stopLiveUpdates();\n }\n\n /**\n * Per-account usage state real-time frissítés. A server `persistAccountUsageState`\n * upsert sikere után emit-elt event-ből építjük újra a `accountUsageMap_$`\n * megfelelő `accountKey` bejegyzését. Ha a windowType már szerepel, lecseréljük;\n * különben hozzáadjuk.\n */\n private handleAccountUsageUpdate(payload: Record<string, unknown>): void {\n const accountKey: unknown = payload.accountKey;\n const windowType: unknown = payload.windowType;\n if (typeof accountKey !== 'string' || accountKey === '' || typeof windowType !== 'string') {\n return;\n }\n const newItem: CC_AccountUsageState_Response = {\n accountKey: accountKey,\n windowType: windowType,\n utilization: typeof payload.utilization === 'number' ? payload.utilization : undefined,\n resetsAtMs: typeof payload.resetsAtMs === 'number' ? payload.resetsAtMs : undefined,\n lastObservedStatus: typeof payload.lastObservedStatus === 'string' ? payload.lastObservedStatus : undefined,\n observedAt: typeof payload.observedAt === 'string' ? payload.observedAt : undefined,\n lastObservedByCcapId: typeof payload.lastObservedByCcapId === 'string' ? payload.lastObservedByCcapId : undefined,\n lastObservedBySessionId: typeof payload.lastObservedBySessionId === 'string' ? payload.lastObservedBySessionId : undefined,\n };\n\n const next: Map<string, CC_AccountUsageState_Response[]> = new Map(this.accountUsageMap_$());\n const existing: CC_AccountUsageState_Response[] = next.get(accountKey) ?? [];\n const replaced: CC_AccountUsageState_Response[] = existing.filter(\n (item: CC_AccountUsageState_Response): boolean => item.windowType !== windowType,\n );\n replaced.push(newItem);\n next.set(accountKey, replaced);\n this.accountUsageMap_$.set(next);\n }\n\n /**\n * Account-pool változás (új account felfedezve, displayName-átírás): a\n * legegyszerűbb és legbiztonságosabb módon `loadAccounts()` re-fetch-csel\n * frissítjük a `accounts_$` signal-t. Cross-instance change-ek esetén is\n * ez a megközelítés robosztus (a DB SSOT-ből minden instance ugyanazt látja).\n */\n private handleAccountListUpdate(_payload: Record<string, unknown>): void {\n void this.loadAccounts();\n }\n\n /** Hibaüzenet kinyerés tipikus shape-ekből (HttpErrorResponse / Error / unknown). */\n private errorMessageOf(err: unknown): string {\n if (err instanceof Error) {\n return err.message;\n }\n if (typeof err === 'object' && err !== null) {\n const rec: Record<string, unknown> = err as Record<string, unknown>;\n if (typeof rec.message === 'string') {\n return rec.message;\n }\n }\n return String(err);\n }\n}\n", "import { CC_AccountUsageEvent_Response } from '../_models/interfaces/cc-account-usage-event.interface';\nimport {\n CC_AccountUsageChartLine_Interface,\n CC_AccountUsageChart_Result,\n} from '../_models/interfaces/cc-account-usage-chart.interface';\n\n/**\n * Account usage-history → SVG chart-line projektor (REQ-CC-USAGE-DASHBOARD-001\n * cycle 884). Az event-eket windowType-onként szétválogatja, observedAt szerint\n * növekvő sorrendbe rendezi, majd a `(t, utilization)` párokat egy 100×40 unit-os\n * viewBox-ba projektálja (x: 0..100 idő-tengely, y: 0=tele/100% .. 40=üres/0%).\n *\n * A 5 fix windowType-onkénti szín stabil (a Dashboard-kártyák és a Session-info\n * popover is ugyanezt használja, mint vizuális SSOT).\n */\nexport class CC_AccountUsageChart_Util {\n\n static readonly CHART_WIDTH: number = 100;\n static readonly CHART_HEIGHT: number = 40;\n\n /** Fix windowType-onkénti szín-paletta (stroke hex). */\n static readonly COLOR_MAP: Record<string, string> = {\n five_hour: '#10b981',\n seven_day: '#06b6d4',\n seven_day_opus: '#a855f7',\n seven_day_sonnet: '#f59e0b',\n extra_usage: '#f43f5e',\n };\n\n static readonly WINDOW_LABEL_MAP: Record<string, string> = {\n five_hour: '5h',\n seven_day: 'Weekly',\n seven_day_opus: 'Opus',\n seven_day_sonnet: 'Sonnet',\n extra_usage: 'Extra',\n };\n\n /** Fix windowType render-sorrend (stabil legend-sorrend). */\n static readonly WINDOW_ORDER: string[] = [\n 'five_hour',\n 'seven_day',\n 'seven_day_opus',\n 'seven_day_sonnet',\n 'extra_usage',\n ];\n\n /**\n * Account-history events → chart-line projektálás.\n * Üres input → üres result (`hasAnyData=false`); a hívó tudja kezelni az\n * \"no data yet\" placeholder render-t.\n */\n static buildChart(events: CC_AccountUsageEvent_Response[]): CC_AccountUsageChart_Result {\n // Idő-tartomány + érvényes pontok detektálása egy menetben.\n let minT: number = Number.POSITIVE_INFINITY;\n let maxT: number = Number.NEGATIVE_INFINITY;\n let validCount: number = 0;\n for (const e of events) {\n if (typeof e.observedAt !== 'string' || e.observedAt === '') {\n continue;\n }\n if (typeof e.utilization !== 'number' || !isFinite(e.utilization)) {\n continue;\n }\n const t: number = Date.parse(e.observedAt);\n if (!isFinite(t)) {\n continue;\n }\n if (t < minT) {\n minT = t;\n }\n if (t > maxT) {\n maxT = t;\n }\n validCount++;\n }\n\n if (validCount === 0) {\n return {\n lines: CC_AccountUsageChart_Util.WINDOW_ORDER.map(\n (wt: string): CC_AccountUsageChartLine_Interface => ({\n windowType: wt,\n label: CC_AccountUsageChart_Util.WINDOW_LABEL_MAP[wt] ?? wt,\n colorHex: CC_AccountUsageChart_Util.COLOR_MAP[wt] ?? '#9ca3af',\n pathPoints: '',\n hasData: false,\n pointCount: 0,\n lastX: 0,\n lastY: 0,\n }),\n ),\n hasAnyData: false,\n minTimeMs: 0,\n maxTimeMs: 0,\n };\n }\n\n // Degenerate eset: minden esemény ugyanabban a ms-ben — expand-eljük 1h-vel,\n // hogy a vízszintes vonalak ne 0-szélességűek legyenek.\n if (maxT - minT < 1) {\n maxT = minT + 3_600_000;\n }\n const range: number = maxT - minT;\n\n const lines: CC_AccountUsageChartLine_Interface[] =\n CC_AccountUsageChart_Util.WINDOW_ORDER.map((wt: string): CC_AccountUsageChartLine_Interface => {\n // windowType-onkénti gyűjtés + növekvő idő szerinti rendezés.\n const points: { t: number; u: number }[] = [];\n for (const e of events) {\n if (e.windowType !== wt) {\n continue;\n }\n if (typeof e.observedAt !== 'string' || e.observedAt === '') {\n continue;\n }\n if (typeof e.utilization !== 'number' || !isFinite(e.utilization)) {\n continue;\n }\n const t: number = Date.parse(e.observedAt);\n if (!isFinite(t)) {\n continue;\n }\n points.push({ t: t, u: Math.max(0, Math.min(1, e.utilization)) });\n }\n points.sort((a: { t: number; u: number }, b: { t: number; u: number }): number => a.t - b.t);\n\n const coords: string[] = [];\n let lastX: number = 0;\n let lastY: number = 0;\n for (const p of points) {\n const x: number = ((p.t - minT) / range) * CC_AccountUsageChart_Util.CHART_WIDTH;\n const y: number = CC_AccountUsageChart_Util.CHART_HEIGHT\n - (p.u * CC_AccountUsageChart_Util.CHART_HEIGHT);\n coords.push(`${x.toFixed(2)},${y.toFixed(2)}`);\n lastX = x;\n lastY = y;\n }\n\n return {\n windowType: wt,\n label: CC_AccountUsageChart_Util.WINDOW_LABEL_MAP[wt] ?? wt,\n colorHex: CC_AccountUsageChart_Util.COLOR_MAP[wt] ?? '#9ca3af',\n pathPoints: coords.join(' '),\n hasData: coords.length > 0,\n pointCount: coords.length,\n lastX: lastX,\n lastY: lastY,\n };\n });\n\n return {\n lines: lines,\n hasAnyData: lines.some((l: CC_AccountUsageChartLine_Interface): boolean => l.hasData),\n minTimeMs: minT,\n maxTimeMs: maxT,\n };\n }\n}\n", "import { CommonModule } from '@angular/common';\nimport { Component, computed, effect, inject, Input, signal, Signal } from '@angular/core';\n\nimport { CC_Account_DataService } from '../../_services/cc-account.data-service';\nimport { CC_AccountUsageState_Response } from '../../_models/interfaces/cc-account-usage-state.interface';\nimport { CC_AccountUsageChart_Result } from '../../_models/interfaces/cc-account-usage-chart.interface';\nimport { CC_AccountUsageChart_Util } from '../../_collections/cc-account-usage-chart.util';\n\n/**\n * CC Account Usage View — megosztott komponens (REQ-CC-USAGE-DASHBOARD-001 cycle 885).\n *\n * Egy account `accountKey`-éhez tartozó 5 windowType-os usage státusz + opcionális\n * időbeli SVG-graph render. Több helyen használt:\n * - CC Usage Dashboard (account-cards) — `compact=false`, graph elérhető\n * - CC Session info-panel popover — `compact=true` szűk popover-hez\n * - bárhol ahol egy accountKey-hez kell mutatni a usage-snapshot-ot\n *\n * SSOT: a `CC_Account_DataService.accountUsageMap_$` és `usageHistoryMap_$` signal-okat\n * olvassa. Lazy-fetch saját maga: ha a state cache-ben még nincs, indítja a\n * `loadAccountUsage`-t. A history-fetch csak akkor fut, ha a graph megnyílik.\n */\n@Component({\n selector: 'app-cc-account-usage-view',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './cc-account-usage-view.component.html',\n})\n/**\n * REQ-CC-USAGE-DASHBOARD-001 (cycle 885) — shared CC account-usage megjelenítő.\n * Egyetlen komponens a per-account utilization graph + status egységes renderéhez,\n * amit a Dashboard és a CC Session info-panel egyaránt használ (graph + status\n * SSOT). Csak Render-only: state-et a `CC_Account_DataService`-ből olvas.\n */\nexport class CC_AccountUsageView_Component {\n\n private readonly account_DS: CC_Account_DataService = inject(CC_Account_DataService);\n\n /** Account stable kulcs — kötelező input. */\n @Input({ required: true }) accountKey: string = '';\n\n /** Kompakt layout (kisebb fontok, szűkebb padding) — popover-be javasolt. */\n @Input() compact: boolean = false;\n\n /** Igaz → a graph toggle gomb meg fog jelenni (default: true). */\n @Input() showGraphToggle: boolean = true;\n\n /** Igaz → a graph-panel induláskor nyitva (default: false → lezárt). */\n @Input() initiallyOpenGraph: boolean = false;\n\n /** Lokális UI state: a graph-panel nyitva/zárva. */\n readonly isGraphOpen_$ = signal<boolean>(false);\n\n /** SVG chart-data builder az adott account-history cache-éből. */\n readonly chart_$: Signal<CC_AccountUsageChart_Result> = computed(\n (): CC_AccountUsageChart_Result => {\n return CC_AccountUsageChart_Util.buildChart(\n this.account_DS.usageHistoryMap_$().get(this.accountKey) ?? [],\n );\n },\n );\n\n /** SVG viewBox literal (a template használja). */\n readonly chartViewBox: string = `0 0 ${CC_AccountUsageChart_Util.CHART_WIDTH} ${CC_AccountUsageChart_Util.CHART_HEIGHT}`;\n readonly chartW: number = CC_AccountUsageChart_Util.CHART_WIDTH;\n readonly chartH: number = CC_AccountUsageChart_Util.CHART_HEIGHT;\n readonly chartMidY: number = CC_AccountUsageChart_Util.CHART_HEIGHT / 2;\n\n /**\n * Reaktív lazy-fetch: ha az accountKey változik vagy a cache üres, lekérjük\n * a perzisztált usage state-et. Ez azoknál a használati helyeknél kritikus\n * (popover, CC sessions dashboard), ahol a Dashboard-bootstrap NEM futott.\n */\n private readonly usageEffect = effect((): void => {\n const key: string = this.accountKey;\n if (!key) {\n return;\n }\n if (!this.account_DS.accountUsageMap_$().has(key)) {\n void this.account_DS.loadAccountUsage(key);\n }\n });\n\n /** initiallyOpenGraph input alkalmazása az isGraphOpen_$-ra. */\n private readonly initialOpenEffect = effect((): void => {\n if (this.initiallyOpenGraph) {\n this.isGraphOpen_$.set(true);\n }\n });\n\n /** Graph-toggle handler — első megnyitás-kor history-fetch. */\n async handleToggleGraph(): Promise<void> {\n const next: boolean = !this.isGraphOpen_$();\n this.isGraphOpen_$.set(next);\n if (next && !this.account_DS.usageHistoryMap_$().has(this.accountKey)) {\n await this.account_DS.loadAccountUsageHistory({ accountKey: this.accountKey });\n }\n }\n\n /** Explicit refresh — history-fetch reload. */\n async handleRefreshGraph(): Promise<void> {\n await this.account_DS.loadAccountUsageHistory({ accountKey: this.accountKey });\n }\n\n /** Egy adott windowType state-jét adja vissza, vagy null. */\n usageItemOfWindow(windowType: string): CC_AccountUsageState_Response | null {\n const items: CC_AccountUsageState_Response[] = this.account_DS.accountUsageMap_$().get(this.accountKey) ?? [];\n for (const item of items) {\n if (item.windowType === windowType) {\n return item;\n }\n }\n return null;\n }\n\n /** True ha legalább egy windowType-ra van adat. */\n hasAnyUsageData(): boolean {\n const items: CC_AccountUsageState_Response[] = this.account_DS.accountUsageMap_$().get(this.accountKey) ?? [];\n return items.length > 0;\n }\n\n /** Window-typeName → emberi label (pure mapping). */\n windowLabelOf(windowType: string): string {\n switch (windowType) {\n case 'five_hour': return '5-hour session';\n case 'seven_day': return 'Weekly';\n case 'seven_day_opus': return 'Weekly · Opus';\n case 'seven_day_sonnet': return 'Weekly · Sonnet';\n case 'extra_usage': return 'Extra (pay-as-you-go)';\n default: return windowType;\n }\n }\n\n /** Utilization → progress-bar width (0..100%, 0 ha null). */\n utilizationPercent(utilization: number | undefined): number {\n if (utilization == null || !isFinite(utilization)) {\n return 0;\n }\n return Math.max(0, Math.min(100, Math.round(utilization * 100)));\n }\n\n /** Utilization fraction (0..1) → percent string '42%'. null → '—'. */\n formatUtilization(utilization: number | null | undefined): string {\n if (utilization == null) {\n return '—';\n }\n return `${Math.round(utilization * 100)}%`;\n }\n\n /** Progress-bar szín-osztály utilization alapján (zöld/sárga/piros). */\n utilizationBarColorClass(utilization: number | undefined): string {\n if (utilization == null || !isFinite(utilization)) {\n return 'bg-neutral-600';\n }\n if (utilization >= 0.85) {\n return 'bg-red-500';\n }\n if (utilization >= 0.5) {\n return 'bg-amber-500';\n }\n return 'bg-emerald-500';\n }\n\n /** Reset countdown — emberi olvasható ('2h 34m', '5d 1h', 'expired', '—'). */\n formatResetCountdown(resetsAtMs: number | undefined): string {\n if (resetsAtMs == null || !isFinite(resetsAtMs) || resetsAtMs <= 0) {\n return '—';\n }\n const diffMs: number = resetsAtMs - Date.now();\n if (diffMs <= 0) {\n return 'expired';\n }\n const totalMinutes: number = Math.floor(diffMs / 60_000);\n const days: number = Math.floor(totalMinutes / (60 * 24));\n const hours: number = Math.floor((totalMinutes % (60 * 24)) / 60);\n const minutes: number = totalMinutes % 60;\n if (days > 0) {\n return `${days}d ${hours}h`;\n }\n if (hours > 0) {\n return `${hours}h ${minutes}m`;\n }\n return `${minutes}m`;\n }\n}\n", "<!-- CC Account Usage View — megosztott komponens (cycle 885).\n A 5 usage-sor mindig látszik (placeholder ha üres), a graph opcionális toggle-able. -->\n<div class=\"flex flex-col\" [class.gap-1]=\"compact\" [class.gap-2]=\"!compact\">\n <!-- 5 usage-sor: a mindig-látható status block. -->\n <div [class.space-y-1]=\"compact\" [class.space-y-2]=\"!compact\">\n @for (windowType of ['five_hour', 'seven_day', 'seven_day_opus', 'seven_day_sonnet', 'extra_usage']; track windowType) {\n @let item = usageItemOfWindow(windowType);\n <div [class]=\"compact ? 'grid grid-cols-[90px_1fr_56px] items-center gap-2 text-[10px]' : 'grid grid-cols-[110px_1fr_64px] items-center gap-2 text-[11px]'\"\n [class.opacity-50]=\"!item\">\n <div class=\"text-neutral-300 font-medium truncate\" [title]=\"windowType\">\n {{ windowLabelOf(windowType) }}\n </div>\n <div class=\"flex items-center gap-2 min-w-0\">\n <div [class]=\"compact ? 'flex-1 h-1.5 bg-neutral-800 rounded-full overflow-hidden' : 'flex-1 h-2 bg-neutral-800 rounded-full overflow-hidden'\">\n @if (item) {\n <div [class]=\"'h-full transition-all ' + utilizationBarColorClass(item.utilization)\"\n [style.width.%]=\"utilizationPercent(item.utilization)\"></div>\n }\n </div>\n <span class=\"font-mono text-neutral-200 text-right shrink-0\"\n [class]=\"compact ? 'w-8 text-[10px]' : 'w-9'\">\n {{ formatUtilization(item?.utilization ?? null) }}\n </span>\n </div>\n <div class=\"font-mono text-neutral-500 text-right text-[10px] truncate\"\n [title]=\"'Resets in ' + formatResetCountdown(item?.resetsAtMs)\">\n {{ formatResetCountdown(item?.resetsAtMs) }}\n </div>\n </div>\n }\n </div>\n\n @if (!hasAnyUsageData()) {\n <div class=\"text-[10px] text-neutral-500 italic pt-1 border-t border-neutral-800/40\">\n No data yet — click <strong class=\"text-neutral-400\">Pull</strong> or wait for the next rate-limit event.\n </div>\n }\n\n <!-- Graph toggle + SVG line-chart (cycle 884 portolva ide). -->\n @if (showGraphToggle) {\n <div class=\"border-t border-neutral-800/40 pt-2\">\n <button\n type=\"button\"\n class=\"text-[11px] text-neutral-400 hover:text-neonCyan flex items-center gap-1 transition-colors\"\n (click)=\"handleToggleGraph()\"\n [title]=\"isGraphOpen_$() ? 'Hide usage graph' : 'Show usage graph (utilization over time per window)'\"\n >\n <svg class=\"w-3 h-3 transition-transform\"\n [class.rotate-90]=\"isGraphOpen_$()\"\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\"/>\n </svg>\n 📈 {{ isGraphOpen_$() ? 'Hide' : 'Show' }} graph\n </button>\n\n @if (isGraphOpen_$()) {\n @let chart = chart_$();\n <div class=\"mt-2 rounded-md border border-neutral-800 bg-neutral-950/40 p-2\">\n @if (!chart.hasAnyData) {\n <div class=\"text-[11px] text-neutral-500 italic px-2 py-3 text-center\">\n No graph data yet — pull usage or wait for a CC session rate-limit event.\n </div>\n } @else {\n <div class=\"relative w-full\">\n <svg [attr.viewBox]=\"chartViewBox\" preserveAspectRatio=\"none\"\n class=\"w-full block\"\n [class.h-24]=\"compact\"\n [class.h-32]=\"!compact\">\n <!-- Háttér + 0%, 50%, 100% referencia-vonalak. -->\n <line x1=\"0\" [attr.y1]=\"chartH\" [attr.x2]=\"chartW\" [attr.y2]=\"chartH\"\n stroke=\"#3f3f46\" stroke-width=\"0.3\"/>\n <line x1=\"0\" [attr.y1]=\"chartMidY\" [attr.x2]=\"chartW\" [attr.y2]=\"chartMidY\"\n stroke=\"#3f3f46\" stroke-width=\"0.2\" stroke-dasharray=\"1,1\"/>\n <line x1=\"0\" y1=\"0\" [attr.x2]=\"chartW\" y2=\"0\"\n stroke=\"#3f3f46\" stroke-width=\"0.2\" stroke-dasharray=\"1,1\"/>\n @for (line of chart.lines; track line.windowType) {\n @if (line.hasData) {\n @if (line.pointCount === 1) {\n <circle [attr.cx]=\"line.lastX\" [attr.cy]=\"line.lastY\" r=\"0.8\" [attr.fill]=\"line.colorHex\"/>\n } @else {\n <polyline [attr.points]=\"line.pathPoints\"\n [attr.stroke]=\"line.colorHex\"\n fill=\"none\" stroke-width=\"0.6\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"\n vector-effect=\"non-scaling-stroke\"/>\n <circle [attr.cx]=\"line.lastX\" [attr.cy]=\"line.lastY\" r=\"0.6\" [attr.fill]=\"line.colorHex\"/>\n }\n }\n }\n </svg>\n <div class=\"absolute inset-y-0 left-0 flex flex-col justify-between text-[8px] text-neutral-600 font-mono pointer-events-none\">\n <span>100%</span>\n <span>50%</span>\n <span>0%</span>\n </div>\n </div>\n <div class=\"mt-2 flex flex-wrap items-center gap-2 text-[10px]\">\n @for (line of chart.lines; track line.windowType) {\n <div class=\"flex items-center gap-1\" [class.opacity-40]=\"!line.hasData\">\n <span class=\"inline-block w-2 h-2 rounded-sm\" [style.background-color]=\"line.colorHex\"></span>\n <span class=\"text-neutral-300\">{{ line.label }}</span>\n @if (line.hasData) {\n <span class=\"text-neutral-500\">·</span>\n <span class=\"font-mono text-neutral-400\">\n {{ ((chartH - line.lastY) / chartH * 100).toFixed(0) }}%\n </span>\n }\n </div>\n }\n </div>\n <div class=\"mt-1 flex items-center justify-between text-[9px] text-neutral-600\">\n @if (chart.minTimeMs) {\n <span>{{ chart.minTimeMs | date:'yyyy-MM-dd HH:mm' }}</span>\n } @else {\n <span>—</span>\n }\n <button\n type=\"button\"\n class=\"text-[10px] text-neutral-400 hover:text-neonCyan border border-neutral-700\n hover:border-neonCyan rounded px-1.5 py-0.5 transition-colors\"\n (click)=\"handleRefreshGraph()\"\n title=\"Re-fetch usage event history for this graph.\"\n >\n ↻ Refresh\n </button>\n @if (chart.maxTimeMs) {\n <span>{{ chart.maxTimeMs | date:'yyyy-MM-dd HH:mm' }}</span>\n } @else {\n <span>—</span>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n</div>\n"],
|
|
5
|
+
"mappings": "scAyBA,IAAaA,IAAqB,IAAA,CAA5B,MAAOA,CAAqB,CAEfC,QAAkB,GAAGC,GAAYC,IAAIF,OAAO,cAE5CG,KAAmBC,EAAOC,EAAU,EAGrDC,cAAY,CACV,OAAOC,EACL,KAAKJ,KAAKK,IAAsC,GAAG,KAAKR,OAAO,OAAO,CAAC,CAE3E,CAGAS,sBAAoB,CAClB,OAAOF,EACL,KAAKJ,KAAKO,KACR,GAAG,KAAKV,OAAO,WACf,CAAA,CAAE,CACH,CAEL,CAOAW,oBAAkB,CAChB,OAAOJ,EACL,KAAKJ,KAAKK,IAAwC,GAAG,KAAKR,OAAO,mBAAmB,CAAC,CAEzF,CAGAY,WAAWC,EAAkB,CAC3B,OAAON,EACL,KAAKJ,KAAKK,IAAyB,GAAG,KAAKR,OAAO,IAAIa,CAAU,EAAE,CAAC,CAEvE,CAMAC,gBAAgBD,EAAkB,CAChC,OAAON,EACL,KAAKJ,KAAKK,IACR,GAAG,KAAKR,OAAO,IAAIa,CAAU,QAAQ,CACtC,CAEL,CAOAE,uBAAuBC,EAKtB,CACC,IAAMC,EAAkB,CAAA,EACpBD,EAAOE,YAAc,MAAQF,EAAOE,aAAe,IACrDD,EAAME,KAAK,cAAcC,mBAAmBJ,EAAOE,UAAU,CAAC,EAAE,EAE9DF,EAAOK,QAAU,MACnBJ,EAAME,KAAK,UAAUH,EAAOK,MAAM,EAAE,EAElCL,EAAOM,MAAQ,MACjBL,EAAME,KAAK,QAAQH,EAAOM,IAAI,EAAE,EAElC,IAAMC,EAAaN,EAAMO,OAAS,EAAI,IAAIP,EAAMQ,KAAK,GAAG,CAAC,GAAK,GAC9D,OAAOlB,EACL,KAAKJ,KAAKK,IACR,GAAG,KAAKR,OAAO,IAAIgB,EAAOH,UAAU,iBAAiBU,CAAE,EAAE,CAC1D,CAEL,CAQAG,oBAAoBb,EAAkB,CACpC,OAAON,EACL,KAAKJ,KAAKO,KACR,GAAG,KAAKV,OAAO,IAAIa,CAAU,iBAC7B,CAAA,CAAE,CACH,CAEL,CAQAc,cAAcX,EAIb,CACC,IAAMY,EAAgC,CAAA,EACtC,OAAIZ,EAAOa,cAAgBC,SACzBF,EAAKC,YAAcb,EAAOa,aAExBb,EAAOe,QAAUD,SACnBF,EAAKG,MAAQf,EAAOe,OAEfxB,EACL,KAAKJ,KAAK6B,MACR,GAAG,KAAKhC,OAAO,IAAIgB,EAAOH,UAAU,GACpCe,CAAI,CACL,CAEL,4CAzHW7B,EAAqB,6BAArBA,EAAqBkC,QAArBlC,EAAqBmC,UAAAC,WADR,MAAM,CAAA,SACnBpC,CAAqB,GAAA,ECNlC,IAAMqC,GAA+C,0BAC/CC,GAA8C,yBAevCC,IAAsB,IAAA,CAA7B,MAAOA,CAAsB,CAEhBC,WAAoCC,EAAOC,EAAqB,EAChEC,UAAwCF,EAAOG,EAA0B,EACzEC,OAAiBJ,EAAOK,CAAM,EAGvCC,mBAA0C,KAGzCC,WAAaC,EAA8B,CAAA,CAAE,EAM7CC,kBAAoBD,EAC3B,IAAIE,GAAK,EAIFC,kBAAoBH,EAAkD,IAAI,EAO1EI,kBAAoBJ,EAC3B,IAAIE,GAAK,EAIFG,YAAcL,EAAgB,EAAK,EAGnCM,YAAcN,EAAsB,IAAI,EAS3CO,wBAAsB,QAAAC,EAAA,sBAC1B,KAAKH,YAAYI,IAAI,EAAI,EACzB,KAAKH,YAAYG,IAAI,IAAI,EACzB,GAAI,CACF,GAAM,CAACC,EAAcC,CAAW,EAAI,MAAMC,QAAQC,IAAI,CACpD,KAAKtB,WAAWuB,aAAY,EAC5B,KAAKvB,WAAWwB,mBAAkB,CAAE,CACrC,EACD,KAAKhB,WAAWU,IAAIC,EAAaM,KAAK,EACtC,KAAKb,kBAAkBM,IAAIE,CAAW,EAGtC,IAAMM,EACJP,EAAaM,MAAME,IAAKC,GACtB,KAAK5B,WAAW6B,gBAAgBD,EAAEE,UAAU,CAAC,EAE3CC,EACJ,MAAMV,QAAQC,IAAII,CAAa,EAC3BM,EAAwD,IAAIrB,IAAI,KAAKD,kBAAiB,CAAE,EAC9F,QAASuB,EAAY,EAAGA,EAAId,EAAaM,MAAMS,OAAQD,IACrDD,EAAQd,IAAIC,EAAaM,MAAMQ,CAAC,EAAEH,WAAYC,EAAaE,CAAC,EAAER,KAAK,EAErE,KAAKf,kBAAkBQ,IAAIc,CAAO,CACpC,OAASG,EAAc,CACrB,KAAKpB,YAAYG,IAAI,KAAKkB,eAAeD,CAAG,CAAC,CAC/C,QAAC,CACC,KAAKrB,YAAYI,IAAI,EAAK,CAC5B,CACF,GAGMmB,cAAY,QAAApB,EAAA,sBAChB,GAAI,CACF,IAAMqB,EAAO,MAAM,KAAKtC,WAAWuB,aAAY,EAC/C,KAAKf,WAAWU,IAAIoB,EAAKb,KAAK,CAChC,OAASU,EAAc,CACrB,KAAKpB,YAAYG,IAAI,KAAKkB,eAAeD,CAAG,CAAC,CAC/C,CACF,GAMMI,iBAAiBT,EAAkB,QAAAb,EAAA,sBACvC,GAAI,CACF,IAAMqB,EAAO,MAAM,KAAKtC,WAAW6B,gBAAgBC,CAAU,EACvDU,EAAqD,IAAI7B,IAAI,KAAKD,kBAAiB,CAAE,EAC3F8B,EAAKtB,IAAIY,EAAYQ,EAAKb,KAAK,EAC/B,KAAKf,kBAAkBQ,IAAIsB,CAAI,CACjC,OAASL,EAAc,CACrB,KAAKpB,YAAYG,IAAI,KAAKkB,eAAeD,CAAG,CAAC,CAC/C,CACF,GAOMM,wBAAwBC,EAK7B,QAAAzB,EAAA,sBACC,GAAI,CACF,IAAMqB,EAAO,MAAM,KAAKtC,WAAW2C,uBAAuBD,CAAM,EAC1DF,EAAqD,IAAI7B,IAAI,KAAKE,kBAAiB,CAAE,EAC3F2B,EAAKtB,IAAIwB,EAAOZ,WAAYQ,EAAKb,KAAK,EACtC,KAAKZ,kBAAkBK,IAAIsB,CAAI,CACjC,OAASL,EAAc,CACrB,KAAKpB,YAAYG,IAAI,KAAKkB,eAAeD,CAAG,CAAC,CAC/C,CACF,GAGMS,qBAAmB,QAAA3B,EAAA,sBACvB,GAAI,CACF,IAAMqB,EAAO,MAAM,KAAKtC,WAAWwB,mBAAkB,EACrD,KAAKZ,kBAAkBM,IAAIoB,CAAI,CACjC,OAASH,EAAc,CACrB,KAAKpB,YAAYG,IAAI,KAAKkB,eAAeD,CAAG,CAAC,CAC/C,CACF,GAMMU,iBAAe,QAAA5B,EAAA,sBACnB,KAAKH,YAAYI,IAAI,EAAI,EACzB,KAAKH,YAAYG,IAAI,IAAI,EACzB,GAAI,CACF,IAAM4B,EAAgB,MAAM,KAAK9C,WAAW+C,qBAAoB,EAChE,aAAM,KAAKV,aAAY,EAChBS,CACT,OAASX,EAAc,CACrB,YAAKpB,YAAYG,IAAI,KAAKkB,eAAeD,CAAG,CAAC,EACtC,CAAEa,cAAe,CAAA,EAAIC,aAAc,CAAC,CAC7C,QAAC,CACC,KAAKnC,YAAYI,IAAI,EAAK,CAC5B,CACF,GAUMgC,oBAAoBpB,EAAkB,QAAAb,EAAA,sBAC1C,GAAI,CACF,IAAMkC,EAAS,MAAM,KAAKnD,WAAWkD,oBAAoBpB,CAAU,EAGnE,aAAM,KAAKS,iBAAiBT,CAAU,EACtC,MAAM,KAAKO,aAAY,EAChBc,CACT,OAAShB,EAAc,CACrB,YAAKpB,YAAYG,IAAI,KAAKkB,eAAeD,CAAG,CAAC,EACtC,CAAEiB,OAAQ,QAASC,gBAAiB,EAAGC,MAAO,IAAI,CAC3D,CACF,GAMMC,cAAcb,EAInB,QAAAzB,EAAA,sBACC,GAAI,CACF,IAAMuC,EAAU,MAAM,KAAKxD,WAAWuD,cAAcb,CAAM,EACpDF,EAA8B,KAAKhC,WAAU,EAAGmB,IACnDC,GAA4BA,EAAEE,aAAeY,EAAOZ,WAAa0B,EAAU5B,CAAE,EAEhF,KAAKpB,WAAWU,IAAIsB,CAAI,CAC1B,OAASL,EAAc,CACrB,KAAKpB,YAAYG,IAAI,KAAKkB,eAAeD,CAAG,CAAC,CAC/C,CACF,GAYAsB,kBAAgB,CACV,KAAKlD,oBAAsB,OAG/B,KAAKA,mBAAqB,KAAKJ,UAAUuD,OAAOC,UAC7CC,GAA4C,CAC3C,KAAKvD,OAAOwD,IAAI,IAAW,CACrBD,EAASE,QAAUjE,GACrB,KAAKkE,yBAAyBH,EAASI,OAAO,EACrCJ,EAASE,QAAUhE,IAC5B,KAAKmE,wBAAwBL,EAASI,OAAO,CAEjD,CAAC,CACH,CAAC,EAEL,CAGAE,iBAAe,CACT,KAAK3D,oBAAsB,OAC7B,KAAKA,mBAAmB4D,YAAW,EACnC,KAAK5D,mBAAqB,KAE9B,CAEA6D,aAAW,CACT,KAAKF,gBAAe,CACtB,CAQQH,yBAAyBC,EAAgC,CAC/D,IAAMlC,EAAsBkC,EAAQlC,WAC9BuC,EAAsBL,EAAQK,WACpC,GAAI,OAAOvC,GAAe,UAAYA,IAAe,IAAM,OAAOuC,GAAe,SAC/E,OAEF,IAAMC,EAAyC,CAC7CxC,WAAYA,EACZuC,WAAYA,EACZE,YAAa,OAAOP,EAAQO,aAAgB,SAAWP,EAAQO,YAAcC,OAC7EC,WAAY,OAAOT,EAAQS,YAAe,SAAWT,EAAQS,WAAaD,OAC1EE,mBAAoB,OAAOV,EAAQU,oBAAuB,SAAWV,EAAQU,mBAAqBF,OAClGG,WAAY,OAAOX,EAAQW,YAAe,SAAWX,EAAQW,WAAaH,OAC1EI,qBAAsB,OAAOZ,EAAQY,sBAAyB,SAAWZ,EAAQY,qBAAuBJ,OACxGK,wBAAyB,OAAOb,EAAQa,yBAA4B,SAAWb,EAAQa,wBAA0BL,QAG7GhC,EAAqD,IAAI7B,IAAI,KAAKD,kBAAiB,CAAE,EAErFoE,GAD4CtC,EAAKuC,IAAIjD,CAAU,GAAK,CAAA,GACfkD,OACxDC,GAAiDA,EAAKZ,aAAeA,CAAU,EAElFS,EAASI,KAAKZ,CAAO,EACrB9B,EAAKtB,IAAIY,EAAYgD,CAAQ,EAC7B,KAAKpE,kBAAkBQ,IAAIsB,CAAI,CACjC,CAQQyB,wBAAwBkB,EAAiC,CAC1D,KAAK9C,aAAY,CACxB,CAGQD,eAAeD,EAAY,CACjC,GAAIA,aAAeiD,MACjB,OAAOjD,EAAIkD,QAEb,GAAI,OAAOlD,GAAQ,UAAYA,IAAQ,KAAM,CAC3C,IAAMmD,EAA+BnD,EACrC,GAAI,OAAOmD,EAAID,SAAY,SACzB,OAAOC,EAAID,OAEf,CACA,OAAOE,OAAOpD,CAAG,CACnB,4CA9RWpC,EAAsB,6BAAtBA,EAAsByF,QAAtBzF,EAAsB0F,UAAAC,WADT,MAAM,CAAA,SACnB3F,CAAsB,GAAA,ECpBnC,IAAa4F,GAAyB,IAAA,CAAhC,MAAOA,CAAyB,CAEpC,OAAgBC,YAAsB,IACtC,OAAgBC,aAAuB,GAGvC,OAAgBC,UAAoC,CAClDC,UAAW,UACXC,UAAW,UACXC,eAAgB,UAChBC,iBAAkB,UAClBC,YAAa,WAGf,OAAgBC,iBAA2C,CACzDL,UAAW,KACXC,UAAW,SACXC,eAAgB,OAChBC,iBAAkB,SAClBC,YAAa,SAIf,OAAgBE,aAAyB,CACvC,YACA,YACA,iBACA,mBACA,aAAa,EAQf,OAAOC,WAAWC,EAAuC,CAEvD,IAAIC,EAAeC,OAAOC,kBACtBC,EAAeF,OAAOG,kBACtBC,EAAqB,EACzB,QAAWC,KAAKP,EAAQ,CAItB,GAHI,OAAOO,EAAEC,YAAe,UAAYD,EAAEC,aAAe,IAGrD,OAAOD,EAAEE,aAAgB,UAAY,CAACC,SAASH,EAAEE,WAAW,EAC9D,SAEF,IAAME,EAAYC,KAAKC,MAAMN,EAAEC,UAAU,EACpCE,SAASC,CAAC,IAGXA,EAAIV,IACNA,EAAOU,GAELA,EAAIP,IACNA,EAAOO,GAETL,IACF,CAEA,GAAIA,IAAe,EACjB,MAAO,CACLQ,MAAO1B,EAA0BU,aAAaiB,IAC3CC,IAAoD,CACnDC,WAAYD,EACZE,MAAO9B,EAA0BS,iBAAiBmB,CAAE,GAAKA,EACzDG,SAAU/B,EAA0BG,UAAUyB,CAAE,GAAK,UACrDI,WAAY,GACZC,QAAS,GACTC,WAAY,EACZC,MAAO,EACPC,MAAO,GACP,EAEJC,WAAY,GACZC,UAAW,EACXC,UAAW,GAMXvB,EAAOH,EAAO,IAChBG,EAAOH,EAAO,MAEhB,IAAM2B,EAAgBxB,EAAOH,EAEvBa,EACJ1B,EAA0BU,aAAaiB,IAAKC,GAAkD,CAE5F,IAAMa,EAAqC,CAAA,EAC3C,QAAWtB,KAAKP,EAAQ,CAOtB,GANIO,EAAEU,aAAeD,GAGjB,OAAOT,EAAEC,YAAe,UAAYD,EAAEC,aAAe,IAGrD,OAAOD,EAAEE,aAAgB,UAAY,CAACC,SAASH,EAAEE,WAAW,EAC9D,SAEF,IAAME,EAAYC,KAAKC,MAAMN,EAAEC,UAAU,EACpCE,SAASC,CAAC,GAGfkB,EAAOC,KAAK,CAAEnB,EAAGA,EAAGoB,EAAGC,KAAKC,IAAI,EAAGD,KAAKE,IAAI,EAAG3B,EAAEE,WAAW,CAAC,CAAC,CAAE,CAClE,CACAoB,EAAOM,KAAK,CAACC,EAA6BC,IAAwCD,EAAEzB,EAAI0B,EAAE1B,CAAC,EAE3F,IAAM2B,EAAmB,CAAA,EACrBf,EAAgB,EAChBC,EAAgB,EACpB,QAAWe,KAAKV,EAAQ,CACtB,IAAMW,GAAcD,EAAE5B,EAAIV,GAAQ2B,EAASxC,EAA0BC,YAC/DoD,EAAYrD,EAA0BE,aACvCiD,EAAER,EAAI3C,EAA0BE,aACrCgD,EAAOR,KAAK,GAAGU,EAAEE,QAAQ,CAAC,CAAC,IAAID,EAAEC,QAAQ,CAAC,CAAC,EAAE,EAC7CnB,EAAQiB,EACRhB,EAAQiB,CACV,CAEA,MAAO,CACLxB,WAAYD,EACZE,MAAO9B,EAA0BS,iBAAiBmB,CAAE,GAAKA,EACzDG,SAAU/B,EAA0BG,UAAUyB,CAAE,GAAK,UACrDI,WAAYkB,EAAOK,KAAK,GAAG,EAC3BtB,QAASiB,EAAOM,OAAS,EACzBtB,WAAYgB,EAAOM,OACnBrB,MAAOA,EACPC,MAAOA,EAEX,CAAC,EAEH,MAAO,CACLV,MAAOA,EACPW,WAAYX,EAAM+B,KAAMC,GAAmDA,EAAEzB,OAAO,EACpFK,UAAWzB,EACX0B,UAAWvB,EAEf,SA5IWhB,CAAyB,GAAA,qCEVjC,YAAa,YAAa,iBAAkB,mBAAoB,aAAa,2BAUpE2D,EAAA,EAAA,KAAA,4BAAKC,EAAA,yBAAAC,EAAAC,yBAAAC,EAAAC,WAAA,CAAA,EACAC,EAAA,QAAAJ,EAAAK,mBAAAH,EAAAC,WAAA,EAAA,GAAA,6BAVbG,EAAA,CAAA,EACAC,EAAA,EAAA,KAAA,EACgC,EAAA,MAAA,CAAA,EAE5BC,EAAA,CAAA,EACFC,EAAA,EACAF,EAAA,EAAA,MAAA,CAAA,EAA6C,EAAA,KAAA,EAEzCG,EAAA,EAAAC,GAAA,EAAA,EAAA,MAAA,CAAA,EAIFF,EAAA,EACAF,EAAA,EAAA,OAAA,CAAA,EAEEC,EAAA,CAAA,EACFC,EAAA,EAAO,EAETF,EAAA,EAAA,MAAA,CAAA,EAEEC,EAAA,EAAA,EACFC,EAAA,EAAM,oCArBRG,EAAYZ,EAAAa,kBAAAC,CAAA,CAA6B,EACpCC,EAAA,EAAAhB,EAAAC,EAAAgB,QAAA,gEAAA,gEAAA,EACAC,EAAA,aAAA,CAAAC,CAAA,EACgDH,EAAA,EAAAI,EAAA,QAAAL,CAAA,EACjDC,EAAA,EAAAK,EAAA,IAAApB,EAAAqB,cAAAP,CAAA,EAAA,GAAA,EAGKC,EAAA,CAAA,EAAAhB,EAAAC,EAAAgB,QAAA,2DAAA,wDAAA,EACHD,EAAA,EAAAO,EAAAJ,EAAA,EAAA,EAAA,EAMIH,EAAA,EAAAhB,EAAAC,EAAAgB,QAAA,kBAAA,KAAA,EACJD,EAAA,EAAAK,EAAA,IAAApB,EAAAuB,mBAAAC,EAAAN,GAAA,KAAA,KAAAA,EAAAf,eAAA,MAAAqB,IAAAC,OAAAD,EAAA,IAAA,EAAA,GAAA,EAICT,EAAA,EAAAI,EAAA,QAAA,aAAAnB,EAAA0B,qBAAAR,GAAA,KAAA,KAAAA,EAAAS,UAAA,CAAA,EACHZ,EAAA,EAAAK,EAAA,IAAApB,EAAA0B,qBAAAR,GAAA,KAAA,KAAAA,EAAAS,UAAA,EAAA,GAAA,0BAONpB,EAAA,EAAA,MAAA,CAAA,EACEC,EAAA,EAAA,4BAAA,EAAoBD,EAAA,EAAA,SAAA,CAAA,EAAiCC,EAAA,EAAA,MAAA,EAAIC,EAAA,EAAUD,EAAA,EAAA,0CAAA,EACrEC,EAAA,0BAwBQF,EAAA,EAAA,MAAA,EAAA,EACEC,EAAA,EAAA,kFAAA,EACFC,EAAA,iCAiBUX,EAAA,EAAA,SAAA,EAAA,6GAEAA,EAAA,EAAA,WAAA,EAAA,EAI8C,EAAA,SAAA,EAAA,2EACtCiB,EAAA,6EARVL,EAAA,EAAAkB,GAAA,EAAA,EAAA,cAAA,EAAA,EAA6B,EAAAC,GAAA,EAAA,CAAA,2BAA7BP,EAAAQ,EAAAC,aAAA,EAAA,EAAA,CAAA,4BADFrB,EAAA,EAAAsB,GAAA,EAAA,CAAA,yBAAAV,EAAAQ,EAAAG,QAAA,EAAA,EAAA,6BA0BE1B,EAAA,EAAA,OAAA,EAAA,EAA+BC,EAAA,EAAA,MAAA,EAACC,EAAA,EAChCF,EAAA,EAAA,OAAA,EAAA,EACEC,EAAA,CAAA,EACFC,EAAA,mCADEM,EAAA,CAAA,EAAAK,EAAA,MAAApB,EAAAkC,OAAAC,EAAAC,OAAApC,EAAAkC,OAAA,KAAAG,QAAA,CAAA,EAAA,IAAA,6BANN9B,EAAA,EAAA,MAAA,EAAA,EACET,EAAA,EAAA,OAAA,EAAA,EACAS,EAAA,EAAA,OAAA,EAAA,EAA+BC,EAAA,CAAA,EAAgBC,EAAA,EAC/CC,EAAA,EAAA4B,GAAA,EAAA,CAAA,EAMF7B,EAAA,0BATqCQ,EAAA,aAAA,CAAAkB,EAAAF,OAAA,EACWlB,EAAA,EAAAX,EAAA,mBAAA+B,EAAAI,QAAA,EACfxB,EAAA,CAAA,EAAAyB,EAAAL,EAAAM,KAAA,EAC/B1B,EAAA,EAAAO,EAAAa,EAAAF,QAAA,EAAA,EAAA,6BAWF1B,EAAA,EAAA,MAAA,EAAMC,EAAA,CAAA,cAA+CC,EAAA,wBAA/CM,EAAA,EAAAyB,EAAAE,EAAA,EAAA,EAAAC,EAAAC,UAAA,kBAAA,CAAA,0BAENrC,EAAA,EAAA,MAAA,EAAMC,EAAA,EAAA,QAAA,EAACC,EAAA,6BAYPF,EAAA,EAAA,MAAA,EAAMC,EAAA,CAAA,cAA+CC,EAAA,wBAA/CM,EAAA,EAAAyB,EAAAE,EAAA,EAAA,EAAAC,EAAAE,UAAA,kBAAA,CAAA,0BAENtC,EAAA,EAAA,MAAA,EAAMC,EAAA,EAAA,QAAA,EAACC,EAAA,sCAjEXF,EAAA,EAAA,MAAA,EAAA,MACEA,EAAA,EAAA,MAAA,EAAA,EAKET,EAAA,EAAA,OAAA,EAAA,EAC2C,EAAA,OAAA,EAAA,EAEuB,EAAA,OAAA,EAAA,EAGlEgD,EAAA,EAAAC,GAAA,EAAA,EAAA,KAAA,KAAAC,EAAA,EAcFvC,EAAA,MACAF,EAAA,EAAA,MAAA,EAAA,EAA+H,EAAA,MAAA,EACvHC,EAAA,EAAA,MAAA,EAAIC,EAAA,EACVF,EAAA,GAAA,MAAA,EAAMC,EAAA,GAAA,KAAA,EAAGC,EAAA,EACTF,EAAA,GAAA,MAAA,EAAMC,EAAA,GAAA,IAAA,EAAEC,EAAA,EAAO,EACX,EAERF,EAAA,GAAA,MAAA,EAAA,EACEuC,EAAA,GAAAG,GAAA,EAAA,EAAA,MAAA,GAAAD,EAAA,EAYFvC,EAAA,EACAF,EAAA,GAAA,MAAA,EAAA,EACEG,EAAA,GAAAwC,GAAA,EAAA,EAAA,MAAA,EAAuB,GAAAC,GAAA,EAAA,EAAA,MAAA,EAKvB5C,EAAA,GAAA,SAAA,EAAA,EAIE6C,EAAA,QAAA,UAAA,CAAAC,EAAAC,CAAA,EAAA,IAAAtD,EAAAuD,EAAA,CAAA,EAAA,OAAAC,EAASxD,EAAAyD,mBAAA,CAAoB,CAAA,CAAA,EAG7BjD,EAAA,GAAA,kBAAA,EACFC,EAAA,EACAC,EAAA,GAAAgD,GAAA,EAAA,EAAA,MAAA,EAAuB,GAAAC,GAAA,EAAA,EAAA,MAAA,EAKzBlD,EAAA,gCAhEOM,EAAA,EAAAE,EAAA,OAAAjB,EAAAgB,OAAA,EAAsB,OAAA,CAAAhB,EAAAgB,OAAA,8BAGZD,EAAA,iDAEAA,EAAA,uDAEOA,EAAA,mBAEpBA,EAAA,EAAA6C,EAAAjB,EAAAkB,KAAA,EAsBF9C,EAAA,EAAA,EAAA6C,EAAAjB,EAAAkB,KAAA,EAcA9C,EAAA,CAAA,EAAAO,EAAAqB,EAAAC,UAAA,GAAA,EAAA,EAcA7B,EAAA,CAAA,EAAAO,EAAAqB,EAAAE,UAAA,GAAA,EAAA,6BArENvC,EAAA,CAAA,EACAC,EAAA,EAAA,MAAA,EAAA,EACEG,EAAA,EAAAoD,GAAA,EAAA,EAAA,MAAA,EAAA,EAAyB,EAAAC,GAAA,GAAA,EAAA,EA0E3BtD,EAAA,cA5EAG,EAAa2C,EAAA,CAAA,EAAAS,QAAA,CAAS,EAEpBjD,EAAA,CAAA,EAAAO,EAAA2C,EAAAC,WAAA,EAAA,CAAA,sCAlBN3D,EAAA,EAAA,MAAA,CAAA,EAAiD,EAAA,SAAA,EAAA,EAI7C6C,EAAA,QAAA,UAAA,CAAAC,EAAAc,CAAA,EAAA,IAAAnE,EAAAuD,EAAA,EAAA,OAAAC,EAASxD,EAAAoE,kBAAA,CAAmB,CAAA,CAAA,MAG5B7D,EAAA,EAAA,MAAA,EAAA,EAGET,EAAA,EAAA,OAAA,EAAA,EACFW,EAAA,EACAD,EAAA,CAAA,EACFC,EAAA,EAEAC,EAAA,EAAA2D,GAAA,EAAA,EAAA,MAAA,EAAA,EA+EF5D,EAAA,oBAzFIM,EAAA,EAAAI,EAAA,QAAAnB,EAAAsE,cAAA,EAAA,mBAAA,qDAAA,EAGKvD,EAAA,EAAAE,EAAA,YAAAjB,EAAAsE,cAAA,CAAA,EAILvD,EAAA,CAAA,EAAAK,EAAA,cAAApB,EAAAsE,cAAA,EAAA,OAAA,OAAA,SAAA,EAGFvD,EAAA,EAAAO,EAAAtB,EAAAsE,cAAA,EAAA,EAAA,EAAA,GDtBN,IAAaC,IAA6B,IAAA,CAApC,MAAOA,CAA6B,CAEvBC,WAAqCC,EAAOC,EAAsB,EAGxDC,WAAqB,GAGvC3D,QAAmB,GAGnB4D,gBAA2B,GAG3BC,mBAA8B,GAG9BP,cAAgBQ,EAAgB,EAAK,EAGrCd,QAA+Ce,GACtD,IACSC,EAA0BC,WAC/B,KAAKT,WAAWU,kBAAiB,EAAGC,IAAI,KAAKR,UAAU,GAAK,CAAA,CAAE,CAEjE,EAIMS,aAAuB,OAAOJ,EAA0BK,WAAW,IAAIL,EAA0BM,YAAY,GAC7GC,OAAiBP,EAA0BK,YAC3CnD,OAAiB8C,EAA0BM,aAC3CE,UAAoBR,EAA0BM,aAAe,EAOrDG,YAAcC,EAAO,IAAW,CAC/C,IAAMC,EAAc,KAAKhB,WACpBgB,IAGA,KAAKnB,WAAWoB,kBAAiB,EAAGC,IAAIF,CAAG,GACzC,KAAKnB,WAAWsB,iBAAiBH,CAAG,EAE7C,CAAC,EAGgBI,kBAAoBL,EAAO,IAAW,CACjD,KAAKb,oBACP,KAAKP,cAAc0B,IAAI,EAAI,CAE/B,CAAC,EAGK5B,mBAAiB,QAAA6B,EAAA,sBACrB,IAAMC,EAAgB,CAAC,KAAK5B,cAAa,EACzC,KAAKA,cAAc0B,IAAIE,CAAI,EACvBA,GAAQ,CAAC,KAAK1B,WAAWU,kBAAiB,EAAGW,IAAI,KAAKlB,UAAU,IAClE,MAAM,KAAKH,WAAW2B,wBAAwB,CAAExB,WAAY,KAAKA,UAAU,CAAE,EAEjF,GAGMlB,oBAAkB,QAAAwC,EAAA,sBACtB,MAAM,KAAKzB,WAAW2B,wBAAwB,CAAExB,WAAY,KAAKA,UAAU,CAAE,CAC/E,GAGA9D,kBAAkBuF,EAAkB,CAClC,IAAMC,EAAyC,KAAK7B,WAAWoB,kBAAiB,EAAGT,IAAI,KAAKR,UAAU,GAAK,CAAA,EAC3G,QAAW2B,KAAQD,EACjB,GAAIC,EAAKF,aAAeA,EACtB,OAAOE,EAGX,OAAO,IACT,CAGAC,iBAAe,CAEb,OAD+C,KAAK/B,WAAWoB,kBAAiB,EAAGT,IAAI,KAAKR,UAAU,GAAK,CAAA,GAC9F6B,OAAS,CACxB,CAGAnF,cAAc+E,EAAkB,CAC9B,OAAQA,EAAU,CAChB,IAAK,YAAa,MAAO,iBACzB,IAAK,YAAa,MAAO,SACzB,IAAK,iBAAkB,MAAO,mBAC9B,IAAK,mBAAoB,MAAO,qBAChC,IAAK,cAAe,MAAO,wBAC3B,QAAS,OAAOA,CAClB,CACF,CAGA/F,mBAAmBF,EAA+B,CAChD,OAAIA,GAAe,MAAQ,CAACsG,SAAStG,CAAW,EACvC,EAEFuG,KAAKC,IAAI,EAAGD,KAAKE,IAAI,IAAKF,KAAKG,MAAM1G,EAAc,GAAG,CAAC,CAAC,CACjE,CAGAoB,kBAAkBpB,EAAsC,CACtD,OAAIA,GAAe,KACV,SAEF,GAAGuG,KAAKG,MAAM1G,EAAc,GAAG,CAAC,GACzC,CAGAF,yBAAyBE,EAA+B,CACtD,OAAIA,GAAe,MAAQ,CAACsG,SAAStG,CAAW,EACvC,iBAELA,GAAe,IACV,aAELA,GAAe,GACV,eAEF,gBACT,CAGAuB,qBAAqBC,EAA8B,CACjD,GAAIA,GAAc,MAAQ,CAAC8E,SAAS9E,CAAU,GAAKA,GAAc,EAC/D,MAAO,SAET,IAAMmF,EAAiBnF,EAAaoF,KAAKC,IAAG,EAC5C,GAAIF,GAAU,EACZ,MAAO,UAET,IAAMG,EAAuBP,KAAKQ,MAAMJ,EAAS,GAAM,EACjDK,EAAeT,KAAKQ,MAAMD,GAAgB,GAAK,GAAG,EAClDG,EAAgBV,KAAKQ,MAAOD,GAAgB,GAAK,IAAO,EAAE,EAC1DI,EAAkBJ,EAAe,GACvC,OAAIE,EAAO,EACF,GAAGA,CAAI,KAAKC,CAAK,IAEtBA,EAAQ,EACH,GAAGA,CAAK,KAAKC,CAAO,IAEtB,GAAGA,CAAO,GACnB,4CArJW9C,EAA6B,2BAA7BA,EAA6B+C,UAAA,CAAA,CAAA,2BAAA,CAAA,EAAAC,OAAA,CAAA5C,WAAA,aAAA3D,QAAA,UAAA4D,gBAAA,kBAAAC,mBAAA,oBAAA,EAAA2C,WAAA,GAAAC,SAAA,CAAAC,EAAA,EAAAC,MAAA,EAAAC,KAAA,GAAAC,OAAA,CAAA,CAAA,EAAA,OAAA,UAAA,EAAA,CAAA,EAAA,QAAA,YAAA,EAAA,CAAA,EAAA,cAAA,mBAAA,SAAA,OAAA,WAAA,uBAAA,EAAA,CAAA,EAAA,WAAA,wBAAA,MAAA,EAAA,CAAA,EAAA,mBAAA,cAAA,WAAA,EAAA,OAAA,EAAA,CAAA,EAAA,OAAA,eAAA,QAAA,SAAA,EAAA,CAAA,EAAA,QAAA,OAAA,EAAA,CAAA,EAAA,YAAA,mBAAA,aAAA,UAAA,EAAA,CAAA,EAAA,YAAA,mBAAA,aAAA,cAAA,WAAA,EAAA,OAAA,EAAA,CAAA,EAAA,kBAAA,EAAA,CAAA,OAAA,SAAA,EAAA,cAAA,mBAAA,sBAAA,OAAA,eAAA,QAAA,oBAAA,EAAA,QAAA,OAAA,EAAA,CAAA,OAAA,OAAA,SAAA,eAAA,UAAA,YAAA,cAAA,OAAA,EAAA,MAAA,MAAA,sBAAA,EAAA,CAAA,iBAAA,QAAA,kBAAA,QAAA,eAAA,IAAA,IAAA,cAAA,EAAA,CAAA,EAAA,OAAA,aAAA,SAAA,qBAAA,oBAAA,KAAA,EAAA,CAAA,EAAA,cAAA,mBAAA,SAAA,OAAA,OAAA,aAAA,EAAA,CAAA,EAAA,WAAA,QAAA,EAAA,CAAA,sBAAA,OAAA,EAAA,SAAA,OAAA,EAAA,CAAA,KAAA,IAAA,SAAA,UAAA,eAAA,KAAA,EAAA,CAAA,KAAA,IAAA,SAAA,UAAA,eAAA,MAAA,mBAAA,KAAA,EAAA,CAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,SAAA,UAAA,eAAA,MAAA,mBAAA,KAAA,EAAA,CAAA,EAAA,WAAA,YAAA,SAAA,OAAA,WAAA,kBAAA,aAAA,mBAAA,YAAA,qBAAA,EAAA,CAAA,EAAA,OAAA,OAAA,YAAA,eAAA,QAAA,aAAA,EAAA,CAAA,EAAA,OAAA,eAAA,QAAA,EAAA,YAAA,EAAA,CAAA,EAAA,OAAA,OAAA,eAAA,kBAAA,aAAA,kBAAA,EAAA,CAAA,OAAA,SAAA,QAAA,+CAAA,EAAA,cAAA,mBAAA,sBAAA,SAAA,qBAAA,wBAAA,UAAA,SAAA,SAAA,oBAAA,EAAA,OAAA,EAAA,CAAA,IAAA,KAAA,EAAA,CAAA,OAAA,OAAA,eAAA,MAAA,iBAAA,QAAA,kBAAA,QAAA,gBAAA,oBAAA,EAAA,CAAA,IAAA,KAAA,EAAA,CAAA,EAAA,OAAA,eAAA,OAAA,EAAA,CAAA,EAAA,eAAA,MAAA,MAAA,YAAA,EAAA,CAAA,EAAA,kBAAA,EAAA,CAAA,EAAA,kBAAA,EAAA,CAAA,EAAA,YAAA,kBAAA,CAAA,EAAAC,SAAA,SAAAC,EAAAC,EAAA,CAAAD,EAAA,IC/B1CxH,EAAA,EAAA,MAAA,CAAA,EAA4E,EAAA,KAAA,EAGxEuC,EAAA,EAAAmF,GAAA,GAAA,GAAA,MAAA,EAAAC,CAAA,EAyBFzH,EAAA,EAEAC,EAAA,EAAAyH,GAAA,EAAA,EAAA,MAAA,CAAA,EAA0B,EAAAC,GAAA,EAAA,EAAA,MAAA,CAAA,EAwG5B3H,EAAA,SAtI2BQ,EAAA,QAAA+G,EAAAhH,OAAA,EAAuB,QAAA,CAAAgH,EAAAhH,OAAA,EAE3CD,EAAA,EAAAE,EAAA,YAAA+G,EAAAhH,OAAA,EAA2B,YAAA,CAAAgH,EAAAhH,OAAA,EAC9BD,EAAA,EAAA6C,EAAAyE,GAAA,GAAAC,EAAA,CAAA,EA2BFvH,EAAA,CAAA,EAAAO,EAAA0G,EAAAzB,gBAAA,EAAA,GAAA,CAAA,EAOAxF,EAAA,EAAAO,EAAA0G,EAAApD,gBAAA,EAAA,EAAA,kBDfU2D,GAAYC,EAAA,EAAAC,cAAA,CAAA,CAAA,SASXlE,CAA6B,GAAA",
|
|
6
|
+
"names": ["CC_Account_ApiService", "baseUrl", "environment", "api", "http", "inject", "HttpClient", "listAccounts", "firstValueFrom", "get", "refreshLocalAccounts", "post", "getInstanceMapping", "getAccount", "accountKey", "getAccountUsage", "getAccountUsageHistory", "params", "query", "windowType", "push", "encodeURIComponent", "fromMs", "toMs", "qs", "length", "join", "refreshAccountUsage", "renameAccount", "body", "displayName", "undefined", "email", "patch", "factory", "\u0275fac", "providedIn", "SOCKET_EVENT_CC_ACCOUNT_USAGE_UPDATE", "SOCKET_EVENT_CC_ACCOUNT_LIST_UPDATE", "CC_Account_DataService", "account_AS", "inject", "CC_Account_ApiService", "socket_CS", "CCAP_Socket_ControlService", "ngZone", "NgZone", "socketSubscription", "accounts_$", "signal", "accountUsageMap_$", "Map", "instanceMapping_$", "usageHistoryMap_$", "isLoading_$", "loadError_$", "loadDashboardBootstrap", "__async", "set", "accountsResp", "mappingResp", "Promise", "all", "listAccounts", "getInstanceMapping", "items", "usagePromises", "map", "a", "getAccountUsage", "accountKey", "usageResults", "nextMap", "i", "length", "err", "errorMessageOf", "loadAccounts", "resp", "loadAccountUsage", "next", "loadAccountUsageHistory", "params", "getAccountUsageHistory", "loadInstanceMapping", "refreshAccounts", "refreshResult", "refreshLocalAccounts", "refreshedKeys", "scannedPaths", "refreshAccountUsage", "result", "status", "windowsUpserted", "email", "renameAccount", "updated", "startLiveUpdates", "event$", "subscribe", "envelope", "run", "event", "handleAccountUsageUpdate", "payload", "handleAccountListUpdate", "stopLiveUpdates", "unsubscribe", "ngOnDestroy", "windowType", "newItem", "utilization", "undefined", "resetsAtMs", "lastObservedStatus", "observedAt", "lastObservedByCcapId", "lastObservedBySessionId", "replaced", "get", "filter", "item", "push", "_payload", "Error", "message", "rec", "String", "factory", "\u0275fac", "providedIn", "CC_AccountUsageChart_Util", "CHART_WIDTH", "CHART_HEIGHT", "COLOR_MAP", "five_hour", "seven_day", "seven_day_opus", "seven_day_sonnet", "extra_usage", "WINDOW_LABEL_MAP", "WINDOW_ORDER", "buildChart", "events", "minT", "Number", "POSITIVE_INFINITY", "maxT", "NEGATIVE_INFINITY", "validCount", "e", "observedAt", "utilization", "isFinite", "t", "Date", "parse", "lines", "map", "wt", "windowType", "label", "colorHex", "pathPoints", "hasData", "pointCount", "lastX", "lastY", "hasAnyData", "minTimeMs", "maxTimeMs", "range", "points", "push", "u", "Math", "max", "min", "sort", "a", "b", "coords", "p", "x", "y", "toFixed", "join", "length", "some", "l", "\u0275\u0275element", "\u0275\u0275classMap", "ctx_r1", "utilizationBarColorClass", "item_r1", "utilization", "\u0275\u0275styleProp", "utilizationPercent", "\u0275\u0275declareLet", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275template", "CC_AccountUsageView_Component_For_3_Conditional_6_Template", "\u0275\u0275storeLet", "usageItemOfWindow", "windowType_r3", "\u0275\u0275advance", "compact", "\u0275\u0275classProp", "item_r4", "\u0275\u0275property", "\u0275\u0275textInterpolate1", "windowLabelOf", "\u0275\u0275conditional", "formatUtilization", "tmp_18_0", "undefined", "formatResetCountdown", "resetsAtMs", "CC_AccountUsageView_Component_Conditional_5_Conditional_5_Conditional_3_For_6_Conditional_0_Conditional_0_Template", "CC_AccountUsageView_Component_Conditional_5_Conditional_5_Conditional_3_For_6_Conditional_0_Conditional_1_Template", "line_r7", "pointCount", "CC_AccountUsageView_Component_Conditional_5_Conditional_5_Conditional_3_For_6_Conditional_0_Template", "hasData", "chartH", "line_r8", "lastY", "toFixed", "CC_AccountUsageView_Component_Conditional_5_Conditional_5_Conditional_3_For_16_Conditional_4_Template", "colorHex", "\u0275\u0275textInterpolate", "label", "\u0275\u0275pipeBind2", "chart_r9", "minTimeMs", "maxTimeMs", "\u0275\u0275repeaterCreate", "CC_AccountUsageView_Component_Conditional_5_Conditional_5_Conditional_3_For_6_Template", "_forTrack0", "CC_AccountUsageView_Component_Conditional_5_Conditional_5_Conditional_3_For_16_Template", "CC_AccountUsageView_Component_Conditional_5_Conditional_5_Conditional_3_Conditional_18_Template", "CC_AccountUsageView_Component_Conditional_5_Conditional_5_Conditional_3_Conditional_19_Template", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r6", "\u0275\u0275nextContext", "\u0275\u0275resetView", "handleRefreshGraph", "CC_AccountUsageView_Component_Conditional_5_Conditional_5_Conditional_3_Conditional_22_Template", "CC_AccountUsageView_Component_Conditional_5_Conditional_5_Conditional_3_Conditional_23_Template", "\u0275\u0275repeater", "lines", "CC_AccountUsageView_Component_Conditional_5_Conditional_5_Conditional_2_Template", "CC_AccountUsageView_Component_Conditional_5_Conditional_5_Conditional_3_Template", "chart_$", "chart_r10", "hasAnyData", "_r5", "handleToggleGraph", "CC_AccountUsageView_Component_Conditional_5_Conditional_5_Template", "isGraphOpen_$", "CC_AccountUsageView_Component", "account_DS", "inject", "CC_Account_DataService", "accountKey", "showGraphToggle", "initiallyOpenGraph", "signal", "computed", "CC_AccountUsageChart_Util", "buildChart", "usageHistoryMap_$", "get", "chartViewBox", "CHART_WIDTH", "CHART_HEIGHT", "chartW", "chartMidY", "usageEffect", "effect", "key", "accountUsageMap_$", "has", "loadAccountUsage", "initialOpenEffect", "set", "__async", "next", "loadAccountUsageHistory", "windowType", "items", "item", "hasAnyUsageData", "length", "isFinite", "Math", "max", "min", "round", "diffMs", "Date", "now", "totalMinutes", "floor", "days", "hours", "minutes", "selectors", "inputs", "standalone", "features", "\u0275\u0275StandaloneFeature", "decls", "vars", "consts", "template", "rf", "ctx", "CC_AccountUsageView_Component_For_3_Template", "\u0275\u0275repeaterTrackByIdentity", "CC_AccountUsageView_Component_Conditional_4_Template", "CC_AccountUsageView_Component_Conditional_5_Template", "\u0275\u0275pureFunction0", "_c0", "CommonModule", "DatePipe", "encapsulation"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{p as o}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{p as o}from"./chunk-RUSAMFGS.js";import{h as r}from"./chunk-TBMJSIBB.js";var a=function(t){return t.created="created",t.alreadyLinked="already-linked",t.userMarked="user-marked",t.errorNotFound="error-not-found",t}(a||{});var m=function(t){return t.confirm="confirm",t.optionSelect="option-select",t.question="question",t}(m||{});var e=r(o());var d=new e.DyFM_DataModel_Params({dataName:"ccap_setting",properties:{ccapId:{type:"string"},sectionId:{type:"string",required:!0,index:!0},sectionProtectionFlag:{type:"string",required:!0,unique:!0},payload:{type:"object",required:!0}}});var p=r(o());var S=new p.DyFM_DataModel_Params({dataName:"pm_project",properties:{ccapId:{type:"string",index:!0},name:{type:"string",required:!0,index:!0},githubRepoUrl:{type:"string"},description:{type:"string"},localPath:{type:"string"},isActive:{type:"boolean"},preferredBugsMdRelativePath:{type:"string"},gitBranch:{type:"string"},gitStatus:{type:"string"},gitAheadBehind:{type:"string"},gitLastCommitDate:{type:"string"},gitLastCommitMessage:{type:"string"},gitLastCommitAuthor:{type:"string"},gitRemoteUrl:{type:"string"},gitInfo:{type:"object"},packageVersion:{type:"string"},packageScripts:{type:"array"},packageDependencyCount:{type:"number"},packageDevDependencyCount:{type:"number"},packageInfo:{type:"object"},artifacts:{type:"object"},lastSyncAt:{type:"string"},lastSyncStatus:{type:"string"},lastSyncSummary:{type:"string"},lastSyncDurationMs:{type:"number"},lastSyncErrors:{type:"array"},githubOwner:{type:"string"},githubRepo:{type:"string"},githubIssueSyncEnabled:{type:"boolean"},githubIssueSyncAt:{type:"string"},githubIssueSyncStatus:{type:"string"},githubIssueSyncSummary:{type:"string"},githubIssueSyncConfig:{type:"object"},githubPrSyncEnabled:{type:"boolean"},githubPrSyncAt:{type:"string"}}});var n=r(o());var P=new n.DyFM_DataModel_Params({dataName:"pm_user_request",properties:{projectId:{type:"string",required:!0,index:!0},content:{type:"string",required:!0},title:{type:"string"},type:{type:"string"},code:{type:"string"},priority:{type:"string"},area:{type:"string"},phase:{type:"string"},status:{type:"string"},specStatus:{type:"string"},implStatus:{type:"string"},testStatus:{type:"string"},completeStatus:{type:"string"},githubIssueNumber:{type:"number",index:!0},githubIssueUrl:{type:"string"},githubIssueId:{type:"number"},githubSyncedAt:{type:"string"},githubSyncDirection:{type:"string"}}});var s=r(o());var k=new s.DyFM_DataModel_Params({dataName:"ccap_quick_input",properties:{projectId:{type:"string",required:!0,index:!0},rawContent:{type:"string",required:!0},title:{type:"string"},status:{type:"string",required:!0,index:!0},promotedUserRequestId:{type:"string"},promotedBugCode:{type:"string"},predictedProjectId:{type:"string",index:!0},predictedType:{type:"string"},predictedCleanDescription:{type:"string"},taskDifficulty:{type:"string"},priority:{type:"string"},area:{type:"string"},createdAtVersion:{type:"string"}}});var x=r(o());var q=new x.DyFM_DataModel_Params({dataName:"pm_project_group",properties:{ccapId:{type:"string",index:!0},name:{type:"string",required:!0,index:!0},scanPath:{type:"string",required:!0},description:{type:"string"}}});var i=r(o());var A=new i.DyFM_DataModel_Params({dataName:"pm_project_group_file",properties:{groupId:{type:"string",required:!0,index:!0},ccapId:{type:"string",index:!0},relativePath:{type:"string",required:!0},sizeBytes:{type:"number"},lastModifiedAt:{type:"string"},fileHash:{type:"string"},isDirectory:{type:"boolean"}}});export{a,m as b};
|
|
2
|
+
//# sourceMappingURL=chunk-44TWBJUK.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{b as a}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{b as a}from"./chunk-CAMM4S7P.js";var f=class{static extract(t){if(t.toolName)return t.toolName;if(t.rawData){let s=t.rawData.name??t.rawData.tool_name??t.rawData.last_tool_name;if(typeof s=="string")return s}let o=t.bodyText.indexOf(":");return o>0?t.bodyText.substring(0,o).trim():t.bodyText.trim()}};var b=class e{static DEFAULT_GROUPABLE_TOOLS=new Set(["Read","Bash","Grep","Glob"]);static DEFAULT_MIN_GROUP_SIZE=2;static groupSubAgentItems(t,o){let s=new Map;for(let r=0;r<t.length;r++){let n=t[r];if(n.kind===a.tool&&n.toolName==="Agent"){let i=e.resolveAgentId(n);i&&s.set(i,{item:n,index:r})}}if(!s.size)return t;let c=new Map,d=new Set;for(let r=0;r<t.length;r++){let n=t[r];if(n.parentAgentId&&s.has(n.parentAgentId)){let i=c.get(n.parentAgentId)??[];i.push(n),c.set(n.parentAgentId,i),d.add(r)}}let l=[];for(let r=0;r<t.length;r++){if(d.has(r))continue;let n=t[r];if(n.kind===a.tool&&n.toolName==="Agent"){let i=e.resolveAgentId(n),p=c.get(i)??[],g=[n,...p],I=e.buildSubAgentLabel(n),A=e.extractSubagentType(n),y=e.groupConsecutiveToolItems(g,o);l.push({listKey:e.newListKey(),kind:a.subAgentGroup,bodyText:I,groupItems:y,groupToolName:A||"Agent",rawData:n.rawData})}else l.push(n)}return l}static groupConsecutiveToolItems(t,o){let s=o?.groupableTools??e.DEFAULT_GROUPABLE_TOOLS,c=o?.minGroupSize??e.DEFAULT_MIN_GROUP_SIZE,d=[],l=[],r="",n=()=>{if(!l.length)return;let i=l.filter(p=>p.kind===a.tool).length;i>=c?d.push({listKey:e.newListKey(),kind:a.toolGroup,bodyText:`${r} \xD7 ${i}`,groupItems:l,groupToolName:r}):d.push(...l),l=[],r=""};for(let i of t){if(i.kind===a.tool){let p=f.extract(i);if(s.has(p)){r&&r!==p&&n(),r=p,l.push(i);continue}}if(i.kind===a.toolResult&&l.length){l.push(i);continue}n(),d.push(i)}return n(),d}static resolveAgentId(t){return t.toolCallId?t.toolCallId:t.rawData&&typeof t.rawData.id=="string"?t.rawData.id:""}static extractSubagentType(t){let o=t.rawData?.input;if(!o||typeof o!="object")return"";let s=o.subagent_type;return typeof s=="string"?s:""}static extractDescription(t){let o=t.rawData?.input;if(!o||typeof o!="object")return"";let s=o.description;return typeof s=="string"?s:""}static buildSubAgentLabel(t){let o=e.extractSubagentType(t),s=e.extractDescription(t);return o?`${o}: ${s||"..."}`:s||"Sub-agent"}static newListKey(){return globalThis.crypto.randomUUID()}};var u=function(e){return e.user="user",e.assistant="assistant",e.tool="tool",e.toolResult="tool-result",e.status="status",e.error="error",e.info="info",e.result="result",e.thinking="thinking",e.statusUpdate="status-update",e}(u||{});var h=class e{static fromAssembledMessage(t,o){let s=e.mapRoleToKind(t.messageRole),c=t.toolResult?{text:t.toolResult.text,expandableContent:t.toolResult.expandableContent,rawData:t.toolResult.rawData,isError:t.toolResult.isError}:void 0,d=t.messageRole===u.tool&&t.toolName==="Edit"&&!!t.expandableContent;return{listKey:t.messageKey,kind:s,bodyText:t.bodyText,timestampIso:t.timestamp,toolName:t.toolName,expandableContent:t.expandableContent,pairedResult:c,rawData:t.rawData,subtype:t.subtype,isUserAligned:t.isUserAligned,headerStatusDot:t.headerStatusDot==="error"?"error":void 0,flags:{showCopy:!0,showRawInfo:!0,useEditDiffForExpandable:d},tts:e.buildTts(t,o),toolCallId:t.toolCallId,parentAgentId:t.parentAgentId}}static buildTts(t,o){if(!(!o||!(t.messageRole===u.user||t.messageRole===u.assistant)||!t.bodyText.trim().length))return{messageKey:t.messageKey,sessionId:o.sessionId,role:t.messageRole,content:t.bodyText,timestampIso:t.timestamp,hasTtsAudio:o.cachedKeys.has(t.messageKey)}}static mapRoleToKind(t){switch(t){case u.user:return a.userPrompt;case u.assistant:return a.assistant;case u.tool:return a.tool;case u.toolResult:return a.toolResult;case u.status:return a.status;case u.error:return a.error;case u.info:return a.info;case u.result:return a.result;case u.thinking:return a.thinking;case u.statusUpdate:return a.statusUpdate;default:return a.info}}};export{b as a,h as b};
|
|
2
|
+
//# sourceMappingURL=chunk-4EOSKDXN.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{b as c}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{b as c}from"./chunk-LIGODF4I.js";import{I as d,p as h}from"./chunk-RUSAMFGS.js";import{C as l,aa as o,h as u,k as r,y as s}from"./chunk-TBMJSIBB.js";var e=function(t){return t.idle="idle",t.downloading="downloading",t.installing="installing",t.completed="completed",t.failed="failed",t}(e||{});var p=u(h());function m(){return typeof window.Capacitor<"u"&&window.Capacitor.isNativePlatform?.()===!0}function w(){let a=window.Capacitor?.Plugins?.AppUpdater;return a||null}var y=(()=>{class t{versionCheck_CS=l(c);downloadUrl=d.api.baseUrl+"/mobile/download";phase_$=o(e.idle);lastError_$=o("");startUpdate(){return r(this,null,function*(){let n=this.phase_$();if(!(n===e.downloading||n===e.installing)){this.lastError_$.set(""),this.phase_$.set(e.downloading);try{let i=w();if(i){this.phase_$.set(e.installing),yield i.downloadAndInstall({downloadUrl:this.downloadUrl}),this.phase_$.set(e.completed);return}this.openInSystemBrowser(this.downloadUrl),this.phase_$.set(e.completed)}catch(i){let f=i instanceof Error?i.message:String(i);this.lastError_$.set(f),this.phase_$.set(e.failed),p.DyFM_Error.logSimple("CCAP_MobileAppUpdater | startUpdate failed",i)}}})}autoUpdateIfAvailable(){return r(this,null,function*(){m()&&(yield this.versionCheck_CS.checkNow(),this.versionCheck_CS.updateAvailable_$()&&(yield this.startUpdate()))})}openInSystemBrowser(n){window.open(n,"_system")}static \u0275fac=function(i){return new(i||t)};static \u0275prov=s({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();export{e as a,y as b};
|
|
2
|
+
//# sourceMappingURL=chunk-4FK2D2PX.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{p as v}from"./chunk-RUSAMFGS.js";import{aa as p,h as g,k as m,y as f}from"./chunk-TBMJSIBB.js";var n=function(l){return l.stopped="stopped",l.standby="standby",l.running="running",l}(n||{});var C={navigator_unavailable:"A hangfelv\xE9tel nem el\xE9rhet\u0151: a b\xF6ng\xE9sz\u0151 k\xF6rnyezet nem t\xE1mogatja a navigator API-t.",media_devices_unavailable:"A hangfelv\xE9tel nem el\xE9rhet\u0151: a b\xF6ng\xE9sz\u0151 ezen az oldalon nem ad hozz\xE1f\xE9r\xE9st a mikrofonhoz.",secure_context_required:"A hangfelv\xE9tel ezen az oldalon nem el\xE9rhet\u0151: a b\xF6ng\xE9sz\u0151 csak biztons\xE1gos kapcsolatban (HTTPS vagy localhost) enged\xE9lyezi a mikrofont."},M={media_devices_unavailable:"A mikrofonhoz haszn\xE1ld az alkalmaz\xE1st HTTPS c\xEDmen (pl. https://localhost:39051) vagy localhost-on.",secure_context_required:"A mikrofonhoz haszn\xE1ld az alkalmaz\xE1st HTTPS c\xEDmen (pl. https://localhost:39051) vagy localhost-on."},h=class{static wrapGetUserMediaError(r){if(r instanceof Error&&"code"in r&&typeof r.code=="string"&&r.code.startsWith("CCAP_"))return r;let e=r instanceof DOMException||r instanceof Error?r.name:"UnknownError",t,i;switch(e){case"NotAllowedError":t="CCAP_MIC_PERMISSION_DENIED",i="Microphone access denied by user or browser policy";break;case"NotFoundError":t="CCAP_MIC_NOT_FOUND",i="No microphone device found on this device";break;case"NotReadableError":t="CCAP_MIC_NOT_READABLE",i="Microphone hardware error or device already in use by another application";break;case"OverconstrainedError":t="CCAP_MIC_OVERCONSTRAINED",i="Microphone does not support the requested audio constraints";break;case"AbortError":t="CCAP_MIC_ABORTED",i="Microphone access request was aborted by the system";break;case"SecurityError":t="CCAP_MIC_SECURITY_ERROR",i="Microphone access blocked by document security policy (Permissions-Policy / iframe)";break;default:t="CCAP_MIC_UNKNOWN_ERROR",i=`getUserMedia failed with ${e}`;break}let s=new Error(i);return s.code=t,s.cause=r,s}static getGetUserMediaErrorMessage(r){switch(r instanceof DOMException||r instanceof Error?r.name:""){case"NotAllowedError":return"A mikrofon haszn\xE1lata nem enged\xE9lyezett: a b\xF6ng\xE9sz\u0151 vagy a felhaszn\xE1l\xF3 megtagadta a hozz\xE1f\xE9r\xE9st.";case"NotFoundError":return"Nem tal\xE1lhat\xF3 mikrofon ezen az eszk\xF6z\xF6n.";case"NotReadableError":return"A mikrofon nem olvashat\xF3: hardverhiba vagy egy m\xE1sik alkalmaz\xE1s haszn\xE1lja.";case"OverconstrainedError":return"A mikrofon nem t\xE1mogatja a k\xE9rt audio be\xE1ll\xEDt\xE1sokat.";case"AbortError":return"A mikrofon-hozz\xE1f\xE9r\xE9si k\xE9r\xE9s megszakadt.";case"SecurityError":return"A mikrofon-hozz\xE1f\xE9r\xE9st a biztons\xE1gi szab\xE1lyzat (Permissions-Policy / iframe) blokkolta.";default:return"A mikrofon el\xE9r\xE9se sikertelen (ismeretlen hiba)."}}static getGetUserMediaErrorHint(r){switch(r instanceof DOMException||r instanceof Error?r.name:""){case"NotAllowedError":return"Enged\xE9lyezd a mikrofont a b\xF6ng\xE9sz\u0151 c\xEDmsor\xE1ban (lakat ikon \u2192 Mikrofon \u2192 Enged\xE9lyez\xE9s), majd pr\xF3b\xE1ld \xFAjra. Androidon: Be\xE1ll\xEDt\xE1sok \u2192 Alkalmaz\xE1sok \u2192 Chrome \u2192 Enged\xE9lyek \u2192 Mikrofon.";case"NotReadableError":return"Z\xE1rd be a mikrofont haszn\xE1l\xF3 m\xE1sik alkalmaz\xE1st (pl. vide\xF3h\xEDv\xE1s, diktafon), majd pr\xF3b\xE1ld \xFAjra.";case"SecurityError":return'Ha az alkalmaz\xE1s iframe-ben fut, az iframe-nek "allow=microphone" attrib\xFAtumra van sz\xFCks\xE9ge.';default:return""}}static getMediaRecordingAvailability(){return typeof navigator>"u"?{supported:!1,reason:"navigator_unavailable"}:typeof window<"u"&&window.isSecureContext===!1?{supported:!1,reason:"secure_context_required"}:navigator.mediaDevices==null?{supported:!1,reason:"media_devices_unavailable"}:{supported:!0}}static getMediaUnavailableReportMessage(r){return`Media recording not available (reason: ${r}). Use HTTPS or localhost for microphone access.`}static getMediaUnavailableHint(r){return M[r]??""}static getMediaUnavailableMessage(r){return C[r]??"A hangfelv\xE9tel nem el\xE9rhet\u0151 ezen az oldalon."}};var o=g(v());var A=["audio/webm;codecs=opus","audio/webm","audio/ogg;codecs=opus","audio/ogg","audio/mp4"],z=(()=>{class l{volumeGate=.05;silenceTimeLimitMs=5*o.second;timesliceMs=5*o.second;segmentMaxChunks=6;segmentSoftFlushMinChunks=4;getUserMediaTimeoutMs=15*o.second;state_$=p(n.stopped);mediaStream=null;mediaRecorder=null;audioContext=null;analyser=null;audioSourceNode=null;volumeAnimationId=null;chunkIndex=0;chunks=[];isRestartingForFlush=!1;selectedMime="";onChunkCb=null;onVolumeCb=null;onErrorCb=null;deviceChangeHandler=null;silenceStartTime=null;pendingOverlapPrevMs=0;newRecorderStartAt=null;setOnChunk(e){this.onChunkCb=e}setOnVolume(e){this.onVolumeCb=e}setOnError(e){this.onErrorCb=e}selectMime(){for(let e of A)if(MediaRecorder.isTypeSupported(e))return e;return"audio/webm"}getExtension(){return this.selectedMime.startsWith("audio/webm")?"webm":this.selectedMime.startsWith("audio/ogg")?"ogg":this.selectedMime.startsWith("audio/mp4")?"mp4":"webm"}startListening(){return m(this,null,function*(){if(this.state_$()===n.stopped)try{let e=h.getMediaRecordingAvailability();if(!e.supported){let s=`Media recording not available (reason: ${e.reason??"unknown"})`,a=new Error(s);throw a.code="CCAP_MEDIA_NOT_AVAILABLE",a}let t=null;try{let s=navigator.mediaDevices.getUserMedia({audio:{echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0,channelCount:1}}),a=new Promise((d,u)=>{t=setTimeout(()=>{let c=new Error(`getUserMedia timed out after ${this.getUserMediaTimeoutMs}ms`);c.code="CCAP_MIC_TIMEOUT",u(c)},this.getUserMediaTimeoutMs)});this.mediaStream=yield Promise.race([s,a])}catch(s){throw h.wrapGetUserMediaError(s)}finally{t!==null&&clearTimeout(t)}let i=this.mediaStream.getAudioTracks()[0];i&&(o.DyFM_Log.info("[CCAP] mic track settings",i.getSettings()),i.onended=()=>{o.DyFM_Log.info("[CCAP] mic track ended unexpectedly"),this.stopListening(),this.onErrorCb?.(new Error("Microphone track ended unexpectedly (device disconnected?)"))}),this.registerDeviceChangeListener(),this.selectedMime=this.selectMime(),this.startVolumeLoop(),this.state_$.set(n.standby)}catch(e){throw this.state_$.set(n.stopped),e}})}stopListening(){let e=this.state_$()===n.running;e&&this.stopCapture(!0),this.stopVolumeLoop(),e||this.stopMediaRecorder(),this.silenceStartTime=null,this.unregisterDeviceChangeListener(),this.mediaStream&&(this.mediaStream.getTracks().forEach(t=>t.stop()),this.mediaStream=null),this.state_$.set(n.stopped)}startCapture(){return m(this,null,function*(){try{if(this.mediaStream==null&&(yield this.startListening()),this.mediaStream==null)return;this.silenceStartTime=null,this.chunks=[],this.pendingOverlapPrevMs=0,this.newRecorderStartAt=null,this.createAndStartRecorder(),this.state_$.set(n.running)}catch(e){this.stopVolumeLoop(),this.state_$.set(n.stopped),this.onErrorCb?.(e)}})}stopCapture(e=!1,t=!1){if(this.isRestartingForFlush=!1,!(this.mediaRecorder==null||this.state_$()!==n.running)){try{this.mediaRecorder.stop()}catch(i){o.DyFM_Log.info("[CCAP] mediaRecorder.stop() failed (likely already inactive)",i),this.mediaRecorder=null,this.flushChunksAsSegment(e),this.state_$.set(this.mediaStream?n.standby:n.stopped);return}if(t){this.mediaRecorder=null,this.flushChunksAsSegment(e),this.state_$.set(this.mediaStream?n.standby:n.stopped);return}this.mediaRecorder.onstop=()=>{this.mediaRecorder=null,this.flushChunksAsSegment(e),this.state_$.set(this.mediaStream?n.standby:n.stopped)}}}createRecorder(e){if(!this.mediaStream)return null;let t=new MediaRecorder(this.mediaStream,{mimeType:this.selectedMime,audioBitsPerSecond:128e3});return t.ondataavailable=i=>{if(i.data.size>0&&e.push(i.data),this.mediaRecorder!==t||this.state_$()!==n.running||this.isRestartingForFlush)return;let s=e.length>=this.segmentMaxChunks,a=e.length>=this.segmentSoftFlushMinChunks&&this.silenceStartTime!==null;(s||a)&&this.restartRecorderForFlush()},t}createAndStartRecorder(){let e=this.createRecorder(this.chunks);e&&(this.mediaRecorder=e,e.start(this.timesliceMs))}restartRecorderForFlush(){if(!this.mediaRecorder||this.mediaRecorder.state==="inactive"||!this.mediaStream)return;this.isRestartingForFlush=!0,this.silenceStartTime=null;let e=this.mediaRecorder,t=this.chunks,i=[],s=this.createRecorder(i);if(!s){this.isRestartingForFlush=!1;return}if(this.mediaRecorder=s,this.chunks=i,o.DyFM_Log.info("[CCAP] restartRecorderForFlush (dual): starting new recorder before stopping old"),s.start(this.timesliceMs),s.state==="recording"){this.newRecorderStartAt=Date.now(),this.finalizeFlushByStoppingOldRecorder(e,t);return}let a=!1,d=c=>{a||(a=!0,s.removeEventListener("start",u),this.newRecorderStartAt===null&&c!==null&&(this.newRecorderStartAt=c),this.finalizeFlushByStoppingOldRecorder(e,t))},u=()=>{this.newRecorderStartAt=Date.now(),d(null)};s.addEventListener("start",u),setTimeout(()=>{d(Date.now()-500)},500)}finalizeFlushByStoppingOldRecorder(e,t){let i=this.pendingOverlapPrevMs,s=this.newRecorderStartAt;e.onstop=()=>{let a=Date.now();this.pendingOverlapPrevMs=s!==null?Math.max(0,a-s):0;let d=t.length;this.flushChunksFromArray(t,!1,i),o.DyFM_Log.info(`[CCAP] restartRecorderForFlush (dual): flushed ${d} old chunks as segment, overlapPrevMs=${i}, nextOverlapPrevMs=${this.pendingOverlapPrevMs}`),this.isRestartingForFlush=!1};try{e.stop()}catch{let a=Date.now();this.pendingOverlapPrevMs=s!==null?Math.max(0,a-s):0,this.flushChunksFromArray(t,!1,i),this.isRestartingForFlush=!1}}flushChunksFromArray(e,t,i){if(e.length===0)return;let s=new Blob(e,{type:this.selectedMime}),a={mimeType:this.selectedMime,filename:`audio-${Date.now()}.${this.getExtension()}`,chunkIndex:this.chunkIndex++,isFinal:t,overlapPrevMs:i};this.onChunkCb?.(s,a)}flushChunksAsSegment(e){if(this.chunks.length===0)return;let t=this.pendingOverlapPrevMs;this.pendingOverlapPrevMs=0;let i=new Blob(this.chunks,{type:this.selectedMime}),s={mimeType:this.selectedMime,filename:`audio-${Date.now()}.${this.getExtension()}`,chunkIndex:this.chunkIndex++,isFinal:e,overlapPrevMs:t};this.chunks=[],this.onChunkCb?.(i,s)}startVolumeLoop(){if(this.mediaStream==null||this.onVolumeCb==null)return;this.audioContext=new AudioContext,this.audioContext.state==="suspended"&&this.audioContext.resume().catch(()=>{}),this.audioContext.onstatechange=()=>{let i=this.audioContext?.state??"unknown";o.DyFM_Log.info("[CCAP] AudioContext state changed:",i),i==="suspended"&&this.state_$()!==n.stopped&&this.audioContext?.resume().catch(()=>{})},this.audioSourceNode=this.audioContext.createMediaStreamSource(this.mediaStream),this.analyser=this.audioContext.createAnalyser(),this.analyser.fftSize=2048,this.analyser.smoothingTimeConstant=.8,this.audioSourceNode.connect(this.analyser);let e=new Float32Array(this.analyser.fftSize),t=()=>{if(this.analyser==null||this.onVolumeCb==null)return;this.analyser.getFloatTimeDomainData(e);let i=0;for(let d=0;d<e.length;d++)i+=Math.abs(e[d]);let s=i/e.length;this.onVolumeCb(s);let a=this.state_$();if(a===n.standby&&s>=this.volumeGate){this.startCapture(),this.volumeAnimationId=requestAnimationFrame(t);return}a===n.running&&!this.isRestartingForFlush&&(s<this.volumeGate?this.silenceStartTime===null?this.silenceStartTime=Date.now():Date.now()-this.silenceStartTime>=this.silenceTimeLimitMs&&(this.stopCapture(),this.silenceStartTime=null):this.silenceStartTime=null),this.volumeAnimationId=requestAnimationFrame(t)};t()}stopVolumeLoop(){this.volumeAnimationId!=null&&(cancelAnimationFrame(this.volumeAnimationId),this.volumeAnimationId=null),this.audioSourceNode=null,this.audioContext!=null&&(this.audioContext.onstatechange=null,this.audioContext.close().catch(()=>{}),this.audioContext=null),this.analyser=null}stopMediaRecorder(){if(this.mediaRecorder!=null&&this.mediaRecorder.state!=="inactive"){try{this.mediaRecorder.stop()}catch{}this.mediaRecorder=null}this.chunks=[],this.isRestartingForFlush=!1}registerDeviceChangeListener(){try{this.deviceChangeHandler=()=>{o.DyFM_Log.info("[CCAP] media device change detected")},navigator.mediaDevices.addEventListener("devicechange",this.deviceChangeHandler)}catch{this.deviceChangeHandler=null}}unregisterDeviceChangeListener(){if(this.deviceChangeHandler){try{navigator.mediaDevices.removeEventListener("devicechange",this.deviceChangeHandler)}catch{}this.deviceChangeHandler=null}}static \u0275fac=function(t){return new(t||l)};static \u0275prov=f({token:l,factory:l.\u0275fac,providedIn:"root"})}return l})();export{n as a,h as b,z as c};
|
|
2
|
+
//# sourceMappingURL=chunk-4JL2Q6FO.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["src/app/_enums/ccap-sound-recorder-state.enum.ts", "src/app/_collections/utils/media-recording/media-recording.util.ts", "src/app/_services/control-services/ccap-sound-recorder.control-service.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Hangfelvétel állapot típusok.\n * Felvételi állapot: stopped = inaktív, standby = figyelés (várakozás beszédre),\n * running = rögzítés aktív.\n */\nexport enum CCAP_SoundRecorderState_State {\n stopped = 'stopped',\n standby = 'standby',\n running = 'running',\n}\n", "import { CCAP_MediaRecordingAvailability_Interface } from './media-recording.util.interface';\n\n/** Reason → felhasználóbarát üzenet (UI inline / tooltip). */\nconst MEDIA_UNAVAILABLE_MESSAGE_MAP: Record<string, string> = {\n navigator_unavailable:\n 'A hangfelvétel nem elérhető: a böngésző környezet nem támogatja a navigator API-t.',\n media_devices_unavailable:\n 'A hangfelvétel nem elérhető: a böngésző ezen az oldalon nem ad hozzáférést a mikrofonhoz.',\n secure_context_required:\n 'A hangfelvétel ezen az oldalon nem elérhető: a böngésző csak biztonságos kapcsolatban ' +\n '(HTTPS vagy localhost) engedélyezi a mikrofont.',\n};\n\n/** Reason esetén megjeleníthető rövid megoldás (HTTPS/localhost), üres ha nincs ilyen. */\nconst MEDIA_UNAVAILABLE_HINT_MAP: Record<string, string> = {\n media_devices_unavailable:\n 'A mikrofonhoz használd az alkalmazást HTTPS címen (pl. https://localhost:39051) vagy localhost-on.',\n secure_context_required:\n 'A mikrofonhoz használd az alkalmazást HTTPS címen (pl. https://localhost:39051) vagy localhost-on.',\n};\n\n/**\n * Media recording util: mikrofon elérhetőség, hibaüzenetek, hint szövegek, getUserMedia hiba-wrapping.\n */\nexport class CCAP_MediaRecording_Util {\n\n/**\n * getUserMedia DOMException / Error → strukturált diagnosztikai Error wrapper-be csomagolás.\n * A böngésző getUserMedia hívása DOMException-t dob (NotAllowedError, NotFoundError stb.),\n * ami gyakran stack nélkül érkezik; ez a wrapper saját stack-et biztosít, egyedi error code-ot\n * ad (CCAP_MIC_*), és az eredetit cause-ként tartja meg a lánc számára.\n */\nstatic wrapGetUserMediaError(err: unknown): Error & { code: string } {\n // Ha az error már CCAP_ kóddal rendelkezik (pl. timeout), közvetlenül visszaadjuk (dupla wrap elkerülése).\n if (\n err instanceof Error\n && 'code' in err\n && typeof (err as Record<string, unknown>).code === 'string'\n && ((err as Record<string, unknown>).code as string).startsWith('CCAP_')\n ) {\n return err as Error & { code: string };\n }\n\n // DOMException.name azonosítja a hiba típusát (W3C MediaDevices spec).\n const name: string = (err instanceof DOMException || err instanceof Error)\n ? err.name\n : 'UnknownError';\n\n let code: string;\n let message: string;\n\n switch (name) {\n case 'NotAllowedError':\n code = 'CCAP_MIC_PERMISSION_DENIED';\n message = 'Microphone access denied by user or browser policy';\n break;\n case 'NotFoundError':\n code = 'CCAP_MIC_NOT_FOUND';\n message = 'No microphone device found on this device';\n break;\n case 'NotReadableError':\n code = 'CCAP_MIC_NOT_READABLE';\n message = 'Microphone hardware error or device already in use by another application';\n break;\n case 'OverconstrainedError':\n code = 'CCAP_MIC_OVERCONSTRAINED';\n message = 'Microphone does not support the requested audio constraints';\n break;\n case 'AbortError':\n code = 'CCAP_MIC_ABORTED';\n message = 'Microphone access request was aborted by the system';\n break;\n case 'SecurityError':\n code = 'CCAP_MIC_SECURITY_ERROR';\n message = 'Microphone access blocked by document security policy (Permissions-Policy / iframe)';\n break;\n default:\n code = 'CCAP_MIC_UNKNOWN_ERROR';\n message = `getUserMedia failed with ${name}`;\n break;\n }\n\n const wrapped: Error & { code: string } = new Error(message) as Error & { code: string };\n wrapped.code = code;\n wrapped.cause = err;\n return wrapped;\n}\n\n/**\n * getUserMedia error name → user-facing üzenet (Hunglish, notification / tooltip).\n * Nem tanácsot ad — leírja, mi történt; hint-et a getGetUserMediaErrorHint adja.\n */\nstatic getGetUserMediaErrorMessage(err: unknown): string {\n const name: string = (err instanceof DOMException || err instanceof Error)\n ? err.name\n : '';\n\n switch (name) {\n case 'NotAllowedError':\n return 'A mikrofon használata nem engedélyezett: a böngésző vagy a felhasználó megtagadta a hozzáférést.';\n case 'NotFoundError':\n return 'Nem található mikrofon ezen az eszközön.';\n case 'NotReadableError':\n return 'A mikrofon nem olvasható: hardverhiba vagy egy másik alkalmazás használja.';\n case 'OverconstrainedError':\n return 'A mikrofon nem támogatja a kért audio beállításokat.';\n case 'AbortError':\n return 'A mikrofon-hozzáférési kérés megszakadt.';\n case 'SecurityError':\n return 'A mikrofon-hozzáférést a biztonsági szabályzat (Permissions-Policy / iframe) blokkolta.';\n default:\n return 'A mikrofon elérése sikertelen (ismeretlen hiba).';\n }\n}\n\n/**\n * getUserMedia error name → hint szöveg, ha van releváns megoldás; egyébként üres string.\n */\nstatic getGetUserMediaErrorHint(err: unknown): string {\n const name: string = (err instanceof DOMException || err instanceof Error)\n ? err.name\n : '';\n\n switch (name) {\n case 'NotAllowedError':\n return 'Engedélyezd a mikrofont a böngésző címsorában (lakat ikon → Mikrofon → Engedélyezés), '\n + 'majd próbáld újra. Androidon: Beállítások → Alkalmazások → Chrome → Engedélyek → Mikrofon.';\n case 'NotReadableError':\n return 'Zárd be a mikrofont használó másik alkalmazást (pl. videóhívás, diktafon), majd próbáld újra.';\n case 'SecurityError':\n return 'Ha az alkalmazás iframe-ben fut, az iframe-nek \"allow=microphone\" attribútumra van szüksége.';\n default:\n return '';\n }\n}\n\n/**\n * Ellenőrzi, hogy a böngésző környezetben elérhető-e a hangfelvétel (navigator.mediaDevices).\n * Secure context (HTTPS vagy localhost) szükséges a mikrofonhoz; HTTP-n mobilon/desktopon undefined.\n * A reason értékek: navigator_unavailable | media_devices_unavailable | secure_context_required.\n */\nstatic getMediaRecordingAvailability(): CCAP_MediaRecordingAvailability_Interface {\n if (typeof navigator === 'undefined') {\n return { supported: false, reason: 'navigator_unavailable' };\n }\n // HTTP + LAN IP: a böngésző gyakran elrejti a mediaDevices-t; előbb secure context, hogy a reason pontos legyen.\n if (typeof window !== 'undefined' && window.isSecureContext === false) {\n return { supported: false, reason: 'secure_context_required' };\n }\n if (navigator.mediaDevices == null) {\n return { supported: false, reason: 'media_devices_unavailable' };\n }\n return { supported: true };\n}\n\n/**\n * Technikai üzenet a hibalistába (reportError): reason + rövid megoldás.\n */\nstatic getMediaUnavailableReportMessage(reason: string): string {\n return `Media recording not available (reason: ${reason}). Use HTTPS or localhost for microphone access.`;\n}\n\n/**\n * Megoldás-hint a felhasználónak (UI), ha a reason miatt HTTPS/localhost kell; egyébként üres string.\n */\nstatic getMediaUnavailableHint(reason: string): string {\n return MEDIA_UNAVAILABLE_HINT_MAP[reason] ?? '';\n}\n\n/**\n * Capability reason-ból user-facing üzenet (Hunglish).\n */\nstatic getMediaUnavailableMessage(reason: string): string {\n return MEDIA_UNAVAILABLE_MESSAGE_MAP[reason] ?? 'A hangfelvétel nem elérhető ezen az oldalon.';\n}\n\n}\n", "import { Injectable, signal } from '@angular/core';\n\nimport { DyFM_Log, second } from '@futdevpro/fsm-dynamo';\n\nimport { CCAP_SoundRecorderState_State } from '../../_enums/ccap-sound-recorder-state.enum';\nimport { CCAP_MediaRecording_Util } from '../../_collections/utils/media-recording/media-recording.util';\nimport { CCAP_SoundRecorderChunkMeta_Interface } from './ccap-sound-recorder-chunk-meta.interface';\n\n/** MIME típusok sorrendje (első támogatottat használjuk). */\nconst MIME_CANDIDATES: string[] = [\n 'audio/webm;codecs=opus',\n 'audio/webm',\n 'audio/ogg;codecs=opus',\n 'audio/ogg',\n 'audio/mp4',\n];\n\n/**\n * Sound recorder control service.\n * Mikrofon felvétel MediaRecorder-rel; chunk és volume callback.\n * Állapot: stopped | standby | running.\n * Android/mobile támogatás: explicit getUserMedia constraints, track.onended figyelés,\n * AudioContext state kezelés, devicechange listener, getUserMedia timeout.\n */\n@Injectable({ providedIn: 'root' })\nexport class CCAP_SoundRecorder_ControlService {\n\n /** VLA küszöb (time-domain átlag); ha volume >= gate, beszédnek tekintjük. */\n readonly volumeGate: number = 0.05;\n\n /** Csend időtartam (ms), után standby-ba váltunk running-ból. */\n readonly silenceTimeLimitMs: number = 5 * second;\n\n /** MediaRecorder timeslice: ondataavailable intervallum (ms). */\n private readonly timesliceMs: number = 5 * second;\n\n /** Max chunk szám szegmensenként; ha eléri, mid-recording flush (6 × 5s = 30s). */\n private readonly segmentMaxChunks: number = 6;\n\n /** Puha szegmens határ: min chunk szám ahonnan csend alapú flush érvényesül (4 × 5s = 20s). */\n private readonly segmentSoftFlushMinChunks: number = 4;\n\n /** getUserMedia timeout (ms); Samsung Knox és egyéb Android device-okon a hívás akadhat. */\n private readonly getUserMediaTimeoutMs: number = 15 * second;\n\n /** Jelenlegi állapot. */\n readonly state_$ = signal<CCAP_SoundRecorderState_State>(CCAP_SoundRecorderState_State.stopped);\n\n private mediaStream: MediaStream | null = null;\n private mediaRecorder: MediaRecorder | null = null;\n private audioContext: AudioContext | null = null;\n private analyser: AnalyserNode | null = null;\n /** AudioContext source node referencia: GC-védelem (lokálisként egyes WebView-kban eltávolítható). */\n private audioSourceNode: MediaStreamAudioSourceNode | null = null;\n private volumeAnimationId: number | null = null;\n private chunkIndex: number = 0;\n private chunks: Blob[] = [];\n /**\n * True amíg mid-recording flush (restartRecorderForFlush) zajlik: a stop() után az onstop\n * handler flush-olja a chunks-ot és új recorder-t indít. Eközben az ondataavailable nem\n * vizsgálja a flush feltételt.\n */\n private isRestartingForFlush: boolean = false;\n private selectedMime: string = '';\n private onChunkCb: ((blob: Blob, meta: CCAP_SoundRecorderChunkMeta_Interface) => void) | null = null;\n private onVolumeCb: ((value: number) => void) | null = null;\n /** Hiba esetén meghívandó callback (pl. voice-notes-poc → hibalista); aszinkron hibák (volume loop startCapture). */\n private onErrorCb: ((err: unknown) => void) | null = null;\n /** devicechange listener referencia a cleanup-hoz. */\n private deviceChangeHandler: (() => void) | null = null;\n\n /** Csend kezdete (ms); VLA running→standby időzítőhöz. */\n private silenceStartTime: number | null = null;\n\n /**\n * BUG-VOICE-INPUT-INTER-MESSAGE-GAP-001 Slice 2 (cycle 945): a dual-recorder swap-átfedés\n * ms-ben. A `restartRecorderForFlush` `finalizeFlushByStoppingOldRecorder.onstop`-ja\n * `Date.now() - newRecorderStartAt`-ra állítja, ekkor ez az érték az AKTUÁLISAN futó\n * (új) recorder eventuális szegmensének overlap-prev-ms-je. A következő szegmens-flush\n * (flushChunksFromArray következő swap-pel VAGY flushChunksAsSegment user-stoppal)\n * olvassa, és resetel 0-ra.\n */\n private pendingOverlapPrevMs: number = 0;\n\n /** Új recorder start-timestamp (ms); a swap finalize-jénél overlap-szám pause-jához. */\n private newRecorderStartAt: number | null = null;\n\n /**\n * Chunk callback beállítása (minden szegmens után hívódik).\n */\n setOnChunk(cb: (blob: Blob, meta: CCAP_SoundRecorderChunkMeta_Interface) => void): void {\n this.onChunkCb = cb;\n }\n\n /**\n * Volume callback beállítása (0..1; volume gate indikátorhoz).\n */\n setOnVolume(cb: (value: number) => void): void {\n this.onVolumeCb = cb;\n }\n\n /**\n * Hiba callback beállítása (pl. voice-notes-poc: showError → reportError a szerverre).\n * A volume loop-ból induló startCapture hibáinál hívódik, hogy a hiba a hibalistába kerüljön.\n */\n setOnError(cb: (err: unknown) => void): void {\n this.onErrorCb = cb;\n }\n\n /**\n * Támogatott MIME kiválasztása (első a listából, amit a böngésző támogat).\n */\n private selectMime(): string {\n for (const mime of MIME_CANDIDATES) {\n if (MediaRecorder.isTypeSupported(mime)) {\n return mime;\n }\n }\n return 'audio/webm';\n }\n\n /**\n * Fájlnév kiterjesztés MIME alapján.\n */\n private getExtension(): string {\n if (this.selectedMime.startsWith('audio/webm')) return 'webm';\n if (this.selectedMime.startsWith('audio/ogg')) return 'ogg';\n if (this.selectedMime.startsWith('audio/mp4')) return 'mp4';\n return 'webm';\n }\n\n /**\n * Figyelés indítása (standby): mikrofon stream, volume callback indul.\n * Rögzítés még nem indul; startCapture() indítja.\n * getUserMedia explicit audio constraints-szel hívódik (echoCancellation, noiseSuppression,\n * autoGainControl, channelCount) — Android/mobile eszközöknél fontos.\n * Timeout-tal védett (getUserMediaTimeoutMs) Samsung Knox és hasonló esetek ellen.\n * Track ended + devicechange listener-eket regisztrál; hiba esetén wrapGetUserMediaError.\n */\n async startListening(): Promise<void> {\n if (this.state_$() !== CCAP_SoundRecorderState_State.stopped) {\n return;\n }\n try {\n const availability = CCAP_MediaRecording_Util.getMediaRecordingAvailability();\n if (!availability.supported) {\n const msg: string =\n `Media recording not available (reason: ${availability.reason ?? 'unknown'})`;\n const err: Error & { code?: string } = new Error(msg);\n err.code = 'CCAP_MEDIA_NOT_AVAILABLE';\n throw err;\n }\n // getUserMedia explicit constraints-szel + timeout védelem.\n // A timeout-ot clearTimeout-tal takarítjuk, hogy ne maradjon orphaned reject a tesztben.\n let getUserMediaTimeoutId: ReturnType<typeof setTimeout> | null = null;\n try {\n const mediaPromise: Promise<MediaStream> = navigator.mediaDevices.getUserMedia({\n audio: {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n channelCount: 1,\n },\n });\n const timeoutPromise: Promise<never> = new Promise<never>(\n (_resolve: (value: never) => void, reject: (reason: unknown) => void): void => {\n getUserMediaTimeoutId = setTimeout((): void => {\n const err: Error & { code?: string } = new Error(\n `getUserMedia timed out after ${this.getUserMediaTimeoutMs}ms`,\n ) as Error & { code?: string };\n err.code = 'CCAP_MIC_TIMEOUT';\n reject(err);\n }, this.getUserMediaTimeoutMs);\n },\n );\n this.mediaStream = await Promise.race([mediaPromise, timeoutPromise]);\n } catch (mediaErr: unknown) {\n throw CCAP_MediaRecording_Util.wrapGetUserMediaError(mediaErr);\n } finally {\n if (getUserMediaTimeoutId !== null) {\n clearTimeout(getUserMediaTimeoutId);\n }\n }\n // Track settings diagnosztika (Android-on a tényleges settings eltérhet a kérttől).\n const audioTrack: MediaStreamTrack | undefined = this.mediaStream.getAudioTracks()[0];\n if (audioTrack) {\n DyFM_Log.info('[CCAP] mic track settings', audioTrack.getSettings());\n // Track ended figyelés: BT disconnect, hardver hiba, OS-szintű mikrofon visszavonás.\n audioTrack.onended = (): void => {\n DyFM_Log.info('[CCAP] mic track ended unexpectedly');\n this.stopListening();\n this.onErrorCb?.(new Error('Microphone track ended unexpectedly (device disconnected?)'));\n };\n }\n // Device change figyelés (BT device csatlakozás/lecsatlakozás diagnosztika).\n this.registerDeviceChangeListener();\n this.selectedMime = this.selectMime();\n this.startVolumeLoop();\n this.state_$.set(CCAP_SoundRecorderState_State.standby);\n } catch (err: unknown) {\n this.state_$.set(CCAP_SoundRecorderState_State.stopped);\n throw err;\n }\n }\n\n /**\n * Figyelés és rögzítés leállítása; stream felszabadítása.\n * Ha running állapotban vagyunk, stopCapture aszinkron módban (isFinalStop=true): a mediaRecorder.stop()\n * triggereli az utolsó ondataavailable-t (a bufferelt hang), majd az onstop flush-olja a chunks-ot.\n * A szinkron flush NEM használható itt, mert a mediaRecorder.stop() utáni utolsó ondataavailable\n * aszinkron jön — szinkron flush-sal a bufferelt hang elveszne.\n */\n stopListening(): void {\n const wasRunning: boolean = this.state_$() === CCAP_SoundRecorderState_State.running;\n if (wasRunning) {\n // isFinalStop=true: a user megállította a felvételt; synchronous=false (default): onstop flush.\n this.stopCapture(true);\n }\n this.stopVolumeLoop();\n if (!wasRunning) {\n this.stopMediaRecorder();\n }\n this.silenceStartTime = null;\n this.unregisterDeviceChangeListener();\n if (this.mediaStream) {\n this.mediaStream.getTracks().forEach((t: MediaStreamTrack): void => t.stop());\n this.mediaStream = null;\n }\n this.state_$.set(CCAP_SoundRecorderState_State.stopped);\n }\n\n /**\n * Rögzítés indítása (standby-ból VLA vagy manuálisan). Ha még nincs stream, startListening előbb.\n * Hiba esetén (pl. getUserMedia/MediaRecorder telefonon) onErrorCb hívása, állapot stopped,\n * és stopVolumeLoop (resource leak elkerülés ha startCapture hiba után state=stopped).\n */\n async startCapture(): Promise<void> {\n try {\n if (this.mediaStream == null) {\n await this.startListening();\n }\n if (this.mediaStream == null) {\n return;\n }\n this.silenceStartTime = null;\n this.chunks = [];\n // Slice 2: fresh capture-ciklus, nincs előző szegmens → nincs overlap.\n this.pendingOverlapPrevMs = 0;\n this.newRecorderStartAt = null;\n this.createAndStartRecorder();\n this.state_$.set(CCAP_SoundRecorderState_State.running);\n } catch (err: unknown) {\n // Resource leak elkerülés: volume loop leállítása ha startCapture hibázik.\n this.stopVolumeLoop();\n this.state_$.set(CCAP_SoundRecorderState_State.stopped);\n this.onErrorCb?.(err);\n }\n }\n\n /**\n * Rögzítés leállítása; chunk összeállítása és callback hívása.\n * isFinalStop: true ha a user explicit megállította a felvételt (stopListening) — a consumer\n * komponensek (auto-send) ezt használják az utolsó chunk küldéséhez.\n * synchronous: true esetén a flush szinkronban fut (nem async onstop-ban) — ngOnDestroy race fix.\n * try-catch a mediaRecorder.stop()-on: ha a recorder már inactive (race: silence + user stop egyszerre).\n */\n stopCapture(isFinalStop: boolean = false, synchronous: boolean = false): void {\n this.isRestartingForFlush = false;\n if (this.mediaRecorder == null || this.state_$() !== CCAP_SoundRecorderState_State.running) {\n return;\n }\n // mediaRecorder.stop() InvalidStateError-t dobhat ha a recorder már inactive (race condition).\n try {\n this.mediaRecorder.stop();\n } catch (stopErr: unknown) {\n DyFM_Log.info('[CCAP] mediaRecorder.stop() failed (likely already inactive)', stopErr);\n this.mediaRecorder = null;\n this.flushChunksAsSegment(isFinalStop);\n this.state_$.set(\n this.mediaStream\n ? CCAP_SoundRecorderState_State.standby\n : CCAP_SoundRecorderState_State.stopped,\n );\n return;\n }\n // Szinkron mód: flush most (stopListening-ből hívva), hogy az ngOnDestroy callback cseréje előtt megtörténjen.\n if (synchronous) {\n this.mediaRecorder = null;\n this.flushChunksAsSegment(isFinalStop);\n this.state_$.set(\n this.mediaStream\n ? CCAP_SoundRecorderState_State.standby\n : CCAP_SoundRecorderState_State.stopped,\n );\n return;\n }\n // Aszinkron mód (silence detection hívja): az onstop event flush-olja a chunks-ot.\n this.mediaRecorder.onstop = (): void => {\n this.mediaRecorder = null;\n this.flushChunksAsSegment(isFinalStop);\n this.state_$.set(\n this.mediaStream\n ? CCAP_SoundRecorderState_State.standby\n : CCAP_SoundRecorderState_State.stopped,\n );\n };\n }\n\n /**\n * MediaRecorder létrehozása + indítás a meglévő stream-mel.\n *\n * BUG-VOICE-INPUT-INTER-MESSAGE-GAP-001 Slice 1 (cycle 944): a recorder\n * `ondataavailable` callback-je `chunksTarget`-be ír (closure-capture). Így\n * a `restartRecorderForFlush` dual-recorder pattern-ben minden recorder\n * a SAJÁT chunks array-ébe gyűjt — nincs interferencia a régi és új között.\n */\n private createRecorder(chunksTarget: Blob[]): MediaRecorder | null {\n if (!this.mediaStream) {\n return null;\n }\n const recorder: MediaRecorder = new MediaRecorder(this.mediaStream, {\n mimeType: this.selectedMime,\n audioBitsPerSecond: 128000,\n });\n recorder.ondataavailable = (ev: BlobEvent): void => {\n if (ev.data.size > 0) {\n chunksTarget.push(ev.data);\n }\n // Stale recorder (post-stop, dual-recorder swap utáni régi) NE triggerelje a flush-t.\n if (this.mediaRecorder !== recorder) {\n return;\n }\n // Mid-flush restart közben vagy nem running állapotban: flush feltétel nem vizsgálandó.\n if (this.state_$() !== CCAP_SoundRecorderState_State.running || this.isRestartingForFlush) {\n return;\n }\n const reachedMax: boolean = chunksTarget.length >= this.segmentMaxChunks;\n const isSoftFlush: boolean = chunksTarget.length >= this.segmentSoftFlushMinChunks\n && this.silenceStartTime !== null;\n if (reachedMax || isSoftFlush) {\n this.restartRecorderForFlush();\n }\n };\n return recorder;\n }\n\n /**\n * Recorder létrehozás + indítás (startCapture init-path-ja).\n */\n private createAndStartRecorder(): void {\n const recorder: MediaRecorder | null = this.createRecorder(this.chunks);\n if (!recorder) {\n return;\n }\n this.mediaRecorder = recorder;\n recorder.start(this.timesliceMs);\n }\n\n /**\n * BUG-VOICE-INPUT-INTER-MESSAGE-GAP-001 Slice 1 (cycle 944) — dual-recorder\n * mid-recording flush. A régi `mediaRecorder.stop()` ELŐTT az új recorder\n * már létrejön + indul; `state === 'recording'` után jön a stop. Így a\n * korábbi ~20-60 ms gap-ablak (amikor semmilyen recorder nem volt aktív)\n * eltűnik.\n *\n * A régi `onstop` flush-olja a saját chunks-ot (closure-captured oldChunks);\n * az új recorder már `chunks_$`-be ír.\n */\n private restartRecorderForFlush(): void {\n if (!this.mediaRecorder || this.mediaRecorder.state === 'inactive') {\n return;\n }\n if (!this.mediaStream) {\n return;\n }\n this.isRestartingForFlush = true;\n // Silence timer reset: ne kelljen a 5s silence-detect-nek azonnal stopCapture-t hívnia.\n this.silenceStartTime = null;\n\n const oldRecorder: MediaRecorder = this.mediaRecorder;\n const oldChunks: Blob[] = this.chunks;\n const newChunks: Blob[] = [];\n const newRecorder: MediaRecorder | null = this.createRecorder(newChunks);\n if (!newRecorder) {\n this.isRestartingForFlush = false;\n return;\n }\n\n // Swap: ettől fogva az új recorder a 'this.mediaRecorder' — a régi ondataavailable\n // closure-ja továbbra is oldChunks-ba ír (capture), így nincs collision.\n this.mediaRecorder = newRecorder;\n this.chunks = newChunks;\n\n DyFM_Log.info('[CCAP] restartRecorderForFlush (dual): starting new recorder before stopping old');\n newRecorder.start(this.timesliceMs);\n\n // A spec szerint a state szinkron 'recording'-ra vált a start() után; gyakorlatban\n // ez a vezető böngészőkben (Chrome/Firefox/Safari) így viselkedik. Ha mégsem\n // (edge case), `onstart` event-tel várunk; safety timeout 500ms.\n if (newRecorder.state === 'recording') {\n // Slice 2: új recorder start-timestamp az overlap-szám alapja.\n this.newRecorderStartAt = Date.now();\n this.finalizeFlushByStoppingOldRecorder(oldRecorder, oldChunks);\n return;\n }\n // Dupla-tüzelés védelem: az onstart event ÉS a safety timeout is hívná a finalize-t —\n // de csak az első futhat le (a finalized lokál flag-gel zárolva).\n let finalized: boolean = false;\n const finalizeOnce = (estimatedStart: number | null): void => {\n if (finalized) {\n return;\n }\n finalized = true;\n newRecorder.removeEventListener('start', onNewRecorderStart);\n if (this.newRecorderStartAt === null && estimatedStart !== null) {\n this.newRecorderStartAt = estimatedStart;\n }\n this.finalizeFlushByStoppingOldRecorder(oldRecorder, oldChunks);\n };\n const onNewRecorderStart = (): void => {\n this.newRecorderStartAt = Date.now();\n finalizeOnce(null);\n };\n newRecorder.addEventListener('start', onNewRecorderStart);\n setTimeout((): void => {\n // Safety branch: ha az onstart timeout-on belül NEM tüzelt, akkor is finalize-elünk.\n // Az overlap konzervatívan timeout-ms (max), mert nincs pontos start-time → 500ms-szal becsülünk.\n finalizeOnce(Date.now() - 500);\n }, 500);\n }\n\n /**\n * Dual-recorder flush befejezése: a régi recorder onstop callback-jét beállítjuk\n * (flush oldChunks), majd stop() — az új már fut, zero-gap.\n *\n * Slice 2 (cycle 945): az `oldRecorder` által emittált szegmens `overlapPrevMs`-je\n * a megelőző swap-átfedés (`this.pendingOverlapPrevMs`, amit a PREVIOUS finalize állított);\n * az AKTUÁLIS swap végén kiszámolt új átfedés (`Date.now() - newRecorderStartAt`) viszont\n * a következő szegmensé — eltároljuk `this.pendingOverlapPrevMs`-be a következő flush-ig.\n */\n private finalizeFlushByStoppingOldRecorder(oldRecorder: MediaRecorder, oldChunks: Blob[]): void {\n const overlapForOldSegment: number = this.pendingOverlapPrevMs;\n const startedAt: number | null = this.newRecorderStartAt;\n oldRecorder.onstop = (): void => {\n const oldEndAt: number = Date.now();\n // A NEW recorder szegmense lesz az átfedést tartalmazó (overlap a tail-jén az oldnak,\n // illetve a head-jén az újnak). Ezt eltároljuk a következő flushig.\n this.pendingOverlapPrevMs = startedAt !== null ? Math.max(0, oldEndAt - startedAt) : 0;\n const count: number = oldChunks.length;\n this.flushChunksFromArray(oldChunks, false, overlapForOldSegment);\n DyFM_Log.info(\n `[CCAP] restartRecorderForFlush (dual): flushed ${count} old chunks as segment, `\n + `overlapPrevMs=${overlapForOldSegment}, nextOverlapPrevMs=${this.pendingOverlapPrevMs}`,\n );\n this.isRestartingForFlush = false;\n };\n try {\n oldRecorder.stop();\n } catch {\n // Már inactive — manuál flush; az átfedés-update szinkronban itt is megtörténik.\n const fallbackEndAt: number = Date.now();\n this.pendingOverlapPrevMs = startedAt !== null ? Math.max(0, fallbackEndAt - startedAt) : 0;\n this.flushChunksFromArray(oldChunks, false, overlapForOldSegment);\n this.isRestartingForFlush = false;\n }\n }\n\n /**\n * Adott chunks array blob-ba összeáll, onChunkCb hívás. Az array-t NEM ürítjük\n * (a hívó felelőssége; ehhez használja a `flushChunksAsSegment(isFinal)`-t).\n * Slice 2 (cycle 945): `overlapPrevMs` paraméter a swap-átfedés ms-e.\n */\n private flushChunksFromArray(arr: Blob[], isFinal: boolean, overlapPrevMs: number): void {\n if (arr.length === 0) {\n return;\n }\n const blob: Blob = new Blob(arr, { type: this.selectedMime });\n const meta: CCAP_SoundRecorderChunkMeta_Interface = {\n mimeType: this.selectedMime,\n filename: `audio-${Date.now()}.${this.getExtension()}`,\n chunkIndex: this.chunkIndex++,\n isFinal: isFinal,\n overlapPrevMs: overlapPrevMs,\n };\n this.onChunkCb?.(blob, meta);\n }\n\n /**\n * Aktuális chunks[] blob-ba összeáll, onChunkCb hívás, chunks ürítés.\n * isFinal: true ha a user megállította a felvételt; false mid-recording és silence flush esetén.\n * Slice 2 (cycle 945): a meta `overlapPrevMs`-jét a `pendingOverlapPrevMs`-ből olvassa\n * (az utolsó dual-swap végén kiszámolt érték), majd reseteli 0-ra.\n */\n private flushChunksAsSegment(isFinal: boolean): void {\n if (this.chunks.length === 0) {\n return;\n }\n const overlapPrevMs: number = this.pendingOverlapPrevMs;\n this.pendingOverlapPrevMs = 0;\n const blob: Blob = new Blob(this.chunks, { type: this.selectedMime });\n const meta: CCAP_SoundRecorderChunkMeta_Interface = {\n mimeType: this.selectedMime,\n filename: `audio-${Date.now()}.${this.getExtension()}`,\n chunkIndex: this.chunkIndex++,\n isFinal: isFinal,\n overlapPrevMs: overlapPrevMs,\n };\n this.chunks = [];\n this.onChunkCb?.(blob, meta);\n }\n\n /**\n * Volume loop indítása: AudioContext + AnalyserNode, requestAnimationFrame tick.\n * AudioContext onstatechange: suspended állapot kezelése (háttér tab, Android audio focus loss).\n * Explicit resume() hívás: Android WebView-ban a new AudioContext() suspended állapotba kerülhet\n * ha a user gesture context lejárt (pl. az await getUserMedia() után). Az onstatechange nem tüzel\n * ha már eleve suspended — ezért kell explicit resume().\n */\n private startVolumeLoop(): void {\n if (this.mediaStream == null || this.onVolumeCb == null) {\n return;\n }\n this.audioContext = new AudioContext();\n // Android WebView: AudioContext suspended-ként jöhet létre ha a user gesture context lejárt.\n // Explicit resume() szükséges — az onstatechange nem tüzel ha nincs állapotváltás.\n if (this.audioContext.state === 'suspended') {\n void this.audioContext.resume().catch((): void => {});\n }\n // AudioContext state változás figyelés (Android háttérbe rakás, audio focus loss).\n this.audioContext.onstatechange = (): void => {\n const ctxState: string = this.audioContext?.state ?? 'unknown';\n DyFM_Log.info('[CCAP] AudioContext state changed:', ctxState);\n if (ctxState === 'suspended' && this.state_$() !== CCAP_SoundRecorderState_State.stopped) {\n void this.audioContext?.resume().catch((): void => {});\n }\n };\n // Source node class field-ben tároljuk (nem lokális változóban): egyes Android WebView-kban\n // a lokális referencia GC-elődhet és az audio graph szakad.\n this.audioSourceNode =\n this.audioContext.createMediaStreamSource(this.mediaStream);\n this.analyser = this.audioContext.createAnalyser();\n this.analyser.fftSize = 2048;\n this.analyser.smoothingTimeConstant = 0.8;\n this.audioSourceNode.connect(this.analyser);\n const timeDomainArray: Float32Array = new Float32Array(this.analyser.fftSize);\n\n const tick = (): void => {\n if (this.analyser == null || this.onVolumeCb == null) {\n return;\n }\n this.analyser.getFloatTimeDomainData(timeDomainArray);\n let sum: number = 0;\n for (let i: number = 0; i < timeDomainArray.length; i++) {\n sum += Math.abs(timeDomainArray[i]);\n }\n const volume: number = sum / timeDomainArray.length;\n this.onVolumeCb(volume);\n\n const state = this.state_$();\n if (state === CCAP_SoundRecorderState_State.standby && volume >= this.volumeGate) {\n void this.startCapture();\n this.volumeAnimationId = requestAnimationFrame(tick);\n return;\n }\n if (state === CCAP_SoundRecorderState_State.running && !this.isRestartingForFlush) {\n if (volume < this.volumeGate) {\n if (this.silenceStartTime === null) {\n this.silenceStartTime = Date.now();\n } else if (Date.now() - this.silenceStartTime >= this.silenceTimeLimitMs) {\n // Silence detection: isFinalStop=false (nem user stop), synchronous=false (aszinkron onstop).\n this.stopCapture();\n this.silenceStartTime = null;\n }\n } else {\n this.silenceStartTime = null;\n }\n }\n\n this.volumeAnimationId = requestAnimationFrame(tick);\n };\n tick();\n }\n\n /**\n * Volume loop leállítása: cancelAnimationFrame, AudioContext close, analyser null.\n */\n private stopVolumeLoop(): void {\n if (this.volumeAnimationId != null) {\n cancelAnimationFrame(this.volumeAnimationId);\n this.volumeAnimationId = null;\n }\n this.audioSourceNode = null;\n if (this.audioContext != null) {\n this.audioContext.onstatechange = null;\n this.audioContext.close().catch((): void => {});\n this.audioContext = null;\n }\n this.analyser = null;\n }\n\n /**\n * MediaRecorder leállítása (standby/stopped állapotból hívva).\n * try-catch: ha a recorder state nem egyezik (defense in depth).\n */\n private stopMediaRecorder(): void {\n if (this.mediaRecorder != null && this.mediaRecorder.state !== 'inactive') {\n try {\n this.mediaRecorder.stop();\n } catch {\n // MediaRecorder már inactive — figyelmen kívül hagyjuk.\n }\n this.mediaRecorder = null;\n }\n this.chunks = [];\n this.isRestartingForFlush = false;\n }\n\n /**\n * Device change listener regisztrálása (BT device csatlakozás/lecsatlakozás diagnosztika).\n * try-catch: nem minden böngésző/teszt környezet támogatja az addEventListener-t a mediaDevices-en.\n */\n private registerDeviceChangeListener(): void {\n try {\n this.deviceChangeHandler = (): void => {\n DyFM_Log.info('[CCAP] media device change detected');\n };\n navigator.mediaDevices.addEventListener('devicechange', this.deviceChangeHandler);\n } catch {\n this.deviceChangeHandler = null;\n }\n }\n\n /**\n * Device change listener eltávolítása.\n */\n private unregisterDeviceChangeListener(): void {\n if (this.deviceChangeHandler) {\n try {\n navigator.mediaDevices.removeEventListener('devicechange', this.deviceChangeHandler);\n } catch {\n // Figyelmen kívül hagyjuk — nem minden környezetben elérhető.\n }\n this.deviceChangeHandler = null;\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["CCAP_SoundRecorderState_State", "MEDIA_UNAVAILABLE_MESSAGE_MAP", "navigator_unavailable", "media_devices_unavailable", "secure_context_required", "MEDIA_UNAVAILABLE_HINT_MAP", "CCAP_MediaRecording_Util", "wrapGetUserMediaError", "err", "Error", "code", "startsWith", "name", "DOMException", "message", "wrapped", "cause", "getGetUserMediaErrorMessage", "getGetUserMediaErrorHint", "getMediaRecordingAvailability", "navigator", "supported", "reason", "window", "isSecureContext", "mediaDevices", "getMediaUnavailableReportMessage", "getMediaUnavailableHint", "getMediaUnavailableMessage", "import_fsm_dynamo", "MIME_CANDIDATES", "CCAP_SoundRecorder_ControlService", "volumeGate", "silenceTimeLimitMs", "second", "timesliceMs", "segmentMaxChunks", "segmentSoftFlushMinChunks", "getUserMediaTimeoutMs", "state_$", "signal", "CCAP_SoundRecorderState_State", "stopped", "mediaStream", "mediaRecorder", "audioContext", "analyser", "audioSourceNode", "volumeAnimationId", "chunkIndex", "chunks", "isRestartingForFlush", "selectedMime", "onChunkCb", "onVolumeCb", "onErrorCb", "deviceChangeHandler", "silenceStartTime", "pendingOverlapPrevMs", "newRecorderStartAt", "setOnChunk", "cb", "setOnVolume", "setOnError", "selectMime", "mime", "MediaRecorder", "isTypeSupported", "getExtension", "startsWith", "startListening", "__async", "availability", "CCAP_MediaRecording_Util", "getMediaRecordingAvailability", "supported", "msg", "reason", "err", "Error", "code", "getUserMediaTimeoutId", "mediaPromise", "navigator", "mediaDevices", "getUserMedia", "audio", "echoCancellation", "noiseSuppression", "autoGainControl", "channelCount", "timeoutPromise", "Promise", "_resolve", "reject", "setTimeout", "race", "mediaErr", "wrapGetUserMediaError", "clearTimeout", "audioTrack", "getAudioTracks", "DyFM_Log", "info", "getSettings", "onended", "stopListening", "registerDeviceChangeListener", "startVolumeLoop", "set", "standby", "wasRunning", "running", "stopCapture", "stopVolumeLoop", "stopMediaRecorder", "unregisterDeviceChangeListener", "getTracks", "forEach", "t", "stop", "startCapture", "createAndStartRecorder", "isFinalStop", "synchronous", "stopErr", "flushChunksAsSegment", "onstop", "createRecorder", "chunksTarget", "recorder", "mimeType", "audioBitsPerSecond", "ondataavailable", "ev", "data", "size", "push", "reachedMax", "length", "isSoftFlush", "restartRecorderForFlush", "start", "state", "oldRecorder", "oldChunks", "newChunks", "newRecorder", "Date", "now", "finalizeFlushByStoppingOldRecorder", "finalized", "finalizeOnce", "estimatedStart", "removeEventListener", "onNewRecorderStart", "addEventListener", "overlapForOldSegment", "startedAt", "oldEndAt", "Math", "max", "count", "flushChunksFromArray", "fallbackEndAt", "arr", "isFinal", "overlapPrevMs", "blob", "Blob", "type", "meta", "filename", "AudioContext", "resume", "catch", "onstatechange", "ctxState", "createMediaStreamSource", "createAnalyser", "fftSize", "smoothingTimeConstant", "connect", "timeDomainArray", "Float32Array", "tick", "getFloatTimeDomainData", "sum", "i", "abs", "volume", "requestAnimationFrame", "cancelAnimationFrame", "close", "factory", "\u0275fac", "providedIn"]
|
|
7
|
+
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{a as R,b as O}from"./chunk-
|
|
1
|
+
import{a as R,b as O}from"./chunk-UM7AS2IW.js";import{a as q}from"./chunk-L2XJGYW4.js";import{a as g}from"./chunk-UFBTR2BG.js";import{a as U}from"./chunk-7CMPZXAO.js";import{e as P}from"./chunk-25KTNALK.js";import{h as y,j as L}from"./chunk-A33MCHYC.js";import{p as D}from"./chunk-RUSAMFGS.js";import{C as v,R as T,a as h,aa as p,b as S,h as E,k as d,y as A}from"./chunk-TBMJSIBB.js";var f=E(D());var _=class u{static compareAsc(C,e){let s=(C.sequence??0)-(e.sequence??0);if(s!==0)return s;let n=typeof C.timestamp=="string"?C.timestamp:"",t=typeof e.timestamp=="string"?e.timestamp:"",o=n.localeCompare(t);if(o!==0)return o;let i=typeof C.messageKey=="string"?C.messageKey:"",r=typeof e.messageKey=="string"?e.messageKey:"";return i.localeCompare(r)}static sortAsc(C){return[...C].sort(u.compareAsc)}};var M=E(D());var x=(()=>{class u{parent;agentToolUseIds=new Set;activeSubAgentId="";toolUseIdToName=new Map;init(e){this.parent=e}resetTrackingState(){this.toolUseIdToName.clear(),this.agentToolUseIds.clear(),this.activeSubAgentId=""}handleSocketEvent(e,s){let n=e.event,t=e.payload;try{let o=typeof t.ccapId=="string"?t.ccapId:"";if(n!=="cc:rate-limit-update"&&n!=="ext-session-msg:message"&&n!=="ext-session-msg:update"&&o&&s.selectedCcapId&&o!==s.selectedCcapId){M.DyFM_Log.info(`CCAP_CcSession_DS | socket event dropped by instance filter | event: ${n} | eventCcapId: ${o} | selectedCcapId: ${s.selectedCcapId}`);return}switch(n){case"cc-session:status":this.handleStatusUpdate(t);break;case"cc-session:output":this.handleOutputChunk(t);break;case"cc-session:event":this.handleSessionEvent(t);break;case"cc-session:list-update":this.handleListUpdate(t);break;case"cc-session:session-update":this.handleSessionItemUpdate(t);break;case"agent-events":this.handleAgentEvent(t);break;case"ext-session-msg:message":this.handleAssembledMessage(t);break;case"ext-session-msg:update":this.handleAssembledMessageUpdate(t);break;case"cc:rate-limit-update":this.handleRateLimitBroadcast(t);break}}catch(o){let i=o instanceof Error?o.message:String(o);M.DyFM_Log.error(`CCAP_CcSession_DS | socket event error | event: ${n}`,o),s.globalErrorShowError(o instanceof Error?o:new Error(`CC Session socket event processing failed: ${n} \u2014 ${i}`),"cc-session-socket-event")}}pushConsoleMessageFromEvent(e,s,n){let t=e.data;switch(e.eventType){case"response-chunk":{this.pushResponseChunkBlocks(t);break}case"tool-call-start":{let o=t.name??t.tool_name??"unknown",i=typeof t.id=="string"?t.id:"";i&&this.toolUseIdToName.set(i,o),o==="Agent"&&i&&this.agentToolUseIds.add(i);let r=t.input,a=r?u.summarizeToolInput(r):"",l=a?`${o}: ${a}`:o,c=o==="Edit"?u.buildEditExpandableContent(r):void 0,m=o==="Agent"?"":this.activeSubAgentId;this.parent.pushConsoleMessage({type:"tool",text:l,expandableContent:c,rawData:t,parentAgentId:m||void 0});break}case"tool-call-end":{let o=t.content??t.output,i=typeof o=="string"?o:"",r=i.length>200?i.substring(0,200)+"\u2026":i;if(r){let a=i.length>200?i:void 0;this.parent.pushConsoleMessage({type:"tool-result",text:r,expandableContent:a,rawData:t,parentAgentId:this.activeSubAgentId||void 0})}break}case"response-complete":{this.activeSubAgentId="";let o=t.cost_usd,i=typeof o=="number"?` ($${o.toFixed(4)})`:"",r=typeof t.model=="string"?` \xB7 ${t.model}`:"";this.parent.pushConsoleMessage({type:"result",text:`Response complete${r}${i}`,rawData:t,expandableContent:JSON.stringify(t,null,2)}),this.accumulateUsage(t);break}case"prompt-sent":{let o=typeof t.content=="string"?t.content:"";o&&(this.parent.consoleMessages_$().some(a=>a.type==="prompt"&&a.text===o.trim())||this.parent.pushConsoleMessage({type:"prompt",text:o,rawData:t,expandableContent:JSON.stringify(t,null,2)}));break}case"status-change":{let o=typeof t.from=="string"?t.from:"",i=typeof t.to=="string"?t.to:"";if(i){let r=typeof t.statusMessage=="string"?t.statusMessage:void 0,a=o?`${o} \u2192 ${i}`:i,l=r?`${a} \u2014 ${r}`:a;this.parent.pushConsoleMessage({type:"status",text:l,isStatus:!0,rawData:t,expandableContent:JSON.stringify(t,null,2)})}break}case"config-change":{let o=t.update,i=o&&typeof o=="object"?Object.keys(o).join(", "):"unknown";this.parent.pushConsoleMessage({type:"info",text:`Config updated: ${i}`,rawData:t,expandableContent:JSON.stringify(t,null,2)});break}case"error":{let o=typeof t.message=="string"?t.message:"Unknown error";this.parent.pushConsoleMessage({type:"error",text:o,rawData:t,expandableContent:JSON.stringify(t,null,2)}),s&&n(new Error(`CC Session error: ${o}`),"cc-session-event");break}case"usage-update":{this.accumulateUsage(t);break}case"cli-chunk":{this.handleCliChunkEvent(t);break}case"runner-overflow":{let i=`Runner buffer overflow: ${typeof t.droppedCount=="number"?t.droppedCount:0} output items lost during server disconnect`;this.parent.pushConsoleMessage({type:"error",text:i,rawData:t,expandableContent:JSON.stringify(t,null,2)});break}case"interrupted-prompt":{let o=typeof t.reason=="string"?t.reason:"",i=typeof t.lastPrompt=="string"?t.lastPrompt:"",r=i.length>80?i.substring(0,80)+"\u2026":i,a=r?`Prompt interrupted (${o}): "${r}"`:`Prompt interrupted${o?" ("+o+")":""}`;this.parent.pushConsoleMessage({type:"status",text:a,isStatus:!0,rawData:t,expandableContent:JSON.stringify(t,null,2)});break}case"session-init":{let o=typeof t.model=="string"?t.model:"",i=typeof t.claudeCodeVersion=="string"?t.claudeCodeVersion:"",r=typeof t.permissionMode=="string"?t.permissionMode:"",a=[];o&&a.push(o),r&&a.push(r),i&&a.push(`v${i}`);let l=a.length>0?`CLI init: ${a.join(" \xB7 ")}`:"CLI initialized",c=JSON.stringify(t,null,2);this.parent.pushConsoleMessage({type:"info",text:l,rawData:t,expandableContent:c});break}case"config-mismatch":{let o=t.mismatches,i=Array.isArray(o)?o.map(r=>`${r.field}: requested "${r.requested}" \u2192 actual "${r.actual}"`).join(", "):"unknown mismatch";this.parent.pushConsoleMessage({type:"error",text:`Config mismatch: ${i}`,rawData:t,expandableContent:JSON.stringify(t,null,2)});break}case"cli-args-record":{let o=typeof t.model=="string"?t.model:"default",i=typeof t.reasoningEffort=="string"?t.reasoningEffort:"default",r=typeof t.mode=="string"?t.mode:"normal",a=typeof t.permissionPolicy=="string"?t.permissionPolicy:"default",l=`CLI spawn: model=${o} \xB7 effort=${i} \xB7 mode=${r} \xB7 permission=${a}`;this.parent.pushConsoleMessage({type:"info",text:l,rawData:t,expandableContent:JSON.stringify(t,null,2)});break}case"stdout-line":case"stderr-line":break;default:{let o=e.eventType;this.parent.pushConsoleMessage({type:"raw",text:o,rawData:t});break}}}handleStatusUpdate(e){let s=e.sessionId??"",n=e.status??"",t=e.statusMessage;this.parent.lastStatusUpdate_$.set({sessionId:s,status:n,statusMessage:t});let i=this.parent.sessions_$().map(a=>a.sessionId===s?S(h({},a),{status:n,statusMessage:t}):a);this.parent.sessions_$.set(i);let r=this.parent.selectedSession_$();if(r?.session.sessionId===s){let a=u.isLiveCcSessionStatus(n);this.parent.selectedSession_$.set(S(h({},r),{session:S(h({},r.session),{status:n,statusMessage:t}),runtime:S(h({},r.runtime),{isLive:a,runtimeStatus:n})}))}if(n==="errored"){let a=(t??"").trim();if(a.startsWith("Auto-recovery: terminal runner dropped silently")||a.startsWith("Exit code:"))M.DyFM_Log.warn(`CCAP_CcSession | user-task-fail diagnostic (NOT recorded to /errors) | sessionId: ${s} | statusMessage: ${a}`);else{let c=t?`CC Session error (${s}): ${t}`:`CC Session error (${s}): session entered errored state`;this.parent.showGlobalError(new Error(c),"cc-session-status")}}this.parent.evaluateSessionEventsPolling()}handleOutputChunk(e){let s=e.sessionId??"";if(s&&s!==this.parent.activeSessionId_$())return;let n=e.content??"",t=e.type??"stdout",o=this.parent.liveOutput_$(),i=n.split(`
|
|
2
2
|
`),r=3e3;if(t==="stderr"){let c=new Set(this.parent.liveStderrLines_$()),m=o.length;for(let I=0;I<i.length;I++)c.add(m+I);this.parent.liveStderrLines_$.set(c)}let l=[...o,...i];if(l.length>r){let c=l.length-r,m=l.slice(c),I=this.parent.liveStderrLines_$(),b=new Set;for(let w of I){let $=w-c;$>=0&&b.add($)}this.parent.liveStderrLines_$.set(b),this.parent.liveOutput_$.set(m)}else this.parent.liveOutput_$.set(l)}handleSessionEvent(e){let s=e.sessionId??"";if(s&&s!==this.parent.activeSessionId_$())return;let n=e.event??{},t={sessionId:s,eventType:n.eventType??"",timestamp:n.timestamp??"",data:n.data??{},sequence:n.sequence??0,eventSource:typeof n.eventSource=="string"?n.eventSource:void 0};if(t.sequence<=this.parent.getLastKnownEventSequence())return;this.parent.setLastKnownEventSequence(t.sequence);let o=this.parent.selectedSessionEvents_$();this.parent.selectedSessionEvents_$.set([...o,t]),this.pushConsoleMessageFromEvent(t,!0,(i,r)=>{this.parent.showGlobalError(i,r)})}handleAgentEvent(e){let s=typeof e.phase=="string"?e.phase:void 0;if(s)switch(s){case g.runInitialization:this.parent.pushConsoleMessage({type:"status",text:"RUN initialization",isStatus:!0});break;case g.analyze:this.parent.pushConsoleMessage({type:"status",text:"Analyzing incoming message",isStatus:!0});break;case g.analyzeResult:{let n=typeof e.runIntent=="string"?e.runIntent:"";n&&this.parent.pushConsoleMessage({type:"run-intent",text:n,isStatus:!1});break}case g.assemble:this.parent.pushConsoleMessage({type:"status",text:"Refreshing Context",isStatus:!0});break;case g.executionStart:this.parent.pushConsoleMessage({type:"status",text:"Starting Agent",isStatus:!0});break;case g.llmAgenticLoop:this.parent.pushConsoleMessage({type:"status",text:"Selecting next move",isStatus:!0});break;case g.agenticLoopIteration:{let n=typeof e.action=="string"?e.action:"",t=typeof e.tool=="string"?e.tool:"",o=typeof e.intent=="string"?e.intent:"",i=[];n&&i.push(n),t&&i.push(t),o&&i.push(o);let r=i.join(" \xB7 ");r&&this.parent.pushConsoleMessage({type:"iteration",text:r,isStatus:!1});break}case g.llmToolDescription:this.parent.pushConsoleMessage({type:"status",text:"Assembling tool inputs",isStatus:!0});break;case g.llmToolErrorRetry:this.parent.pushConsoleMessage({type:"status",text:"Figuring out what's wrong",isStatus:!0});break;case g.toolErrorRetry:this.parent.pushConsoleMessage({type:"status",text:"Trying to fix inputs",isStatus:!0});break;case g.executionEnd:this.parent.pushConsoleMessage({type:"status",text:"Finishing run",isStatus:!0});break;case g.finalization:case g.llmRunFinalization:this.parent.pushConsoleMessage({type:"status",text:"Gathering what we've done",isStatus:!0});break;case g.postFinalization:this.parent.pushConsoleMessage({type:"status",text:"Memorizing stuff",isStatus:!0});break;case g.runFlowComplete:this.parent.pushConsoleMessage({type:"status",text:"Getting back to user",isStatus:!0});break}}handleRateLimitBroadcast(e){let s=e.rate_limit_info;if(!s||typeof s!="object")return;let n=s,t={status:typeof n.status=="string"?n.status:"",resetsAt:typeof n.resetsAt=="number"?n.resetsAt:0,rateLimitType:typeof n.rateLimitType=="string"?n.rateLimitType:"",utilization:typeof n.utilization=="number"?n.utilization:0,surpassedThreshold:typeof n.surpassedThreshold=="number"?n.surpassedThreshold:0,isUsingOverage:n.isUsingOverage===!0,receivedAt:new Date().toISOString()};this.parent.rateLimitInfo_$.set(t)}handleListUpdate(e){let s=e.sessions??[],o=[...this.parent.sessions_$().some(i=>i.isArchived===!0)?s:s.filter(i=>!i.isArchived)].sort((i,r)=>{let a=i.lastActivityAt?new Date(i.lastActivityAt).getTime():0;return(r.lastActivityAt?new Date(r.lastActivityAt).getTime():0)-a});this.parent.sessions_$.set(o),this.mergeActiveSessionDetail(s)}handleSessionItemUpdate(e){let s=typeof e.sessionId=="string"?e.sessionId:"";if(!s)return;let n=typeof e.update=="object"&&e.update!==null?e.update:{},o=this.parent.sessions_$().map(r=>r.sessionId!==s?r:u.applySessionFieldUpdate(r,n));this.parent.sessions_$.set(o);let i=this.parent.selectedSession_$();i?.session.sessionId===s&&this.parent.selectedSession_$.set(S(h({},i),{session:u.applySessionFieldUpdate(i.session,n)}))}static applySessionFieldUpdate(e,s){let n=h({},e);return typeof s.toolCallCountIncrement=="number"&&(n.toolCallCount=(n.toolCallCount??0)+s.toolCallCountIncrement),typeof s.promptCountIncrement=="number"&&(n.promptCount=(n.promptCount??0)+s.promptCountIncrement),typeof s.inputTokensIncrement=="number"&&(n.inputTokensTotal=(n.inputTokensTotal??0)+s.inputTokensIncrement),typeof s.outputTokensIncrement=="number"&&(n.outputTokensTotal=(n.outputTokensTotal??0)+s.outputTokensIncrement),typeof s.costUsdIncrement=="number"&&(n.costUsdTotal=(n.costUsdTotal??0)+s.costUsdIncrement),typeof s.status=="string"&&(n.status=s.status),(typeof s.statusMessage=="string"||s.statusMessage===void 0)&&(n.statusMessage=s.statusMessage),typeof s.lastActivityAt=="string"&&(n.lastActivityAt=s.lastActivityAt),typeof s.lastPrompt=="string"&&(n.lastPrompt=s.lastPrompt),typeof s.activeModel=="string"&&(n.activeModel=s.activeModel),n}mergeActiveSessionDetail(e){let s=this.parent.activeSessionId_$();if(!s)return;let n=this.parent.selectedSession_$();if(!n)return;let t=e.find(o=>o.sessionId===s);t&&this.parent.selectedSession_$.set(S(h({},n),{session:h(h({},n.session),t)}))}handleAssembledMessage(e){let s=typeof e.sessionId=="string"?e.sessionId:"",n=this.parent.activeSessionId_$();if(!s||s!==n)return;let t=e.message;if(!t||typeof t!="object"){M.DyFM_Log.warn("CCAP_CcSession_DS | handleAssembledMessage dropped: invalid message payload",{sessionId:s,payloadKeys:Object.keys(e)});return}let o=t,i=this.parent.assembledMessages_$(),r=typeof o.messageKey=="string"?o.messageKey:"";r&&i.some(a=>a.messageKey===r)||this.parent.assembledMessages_$.set(_.sortAsc([...i,o]))}handleAssembledMessageUpdate(e){let s=typeof e.sessionId=="string"?e.sessionId:"";if(!s||s!==this.parent.activeSessionId_$())return;let n=typeof e.messageKey=="string"?e.messageKey:"";if(!n)return;let t=e.update;if(!t||typeof t!="object")return;let o=t,i=this.parent.assembledMessages_$(),r=i.findIndex(c=>c.messageKey===n);if(r<0)return;let a=h({},i[r]);typeof o.bodyText=="string"&&(a.bodyText=o.bodyText),o.toolResult!==void 0&&(a.toolResult=o.toolResult),typeof o.toolStatus=="string"&&(a.toolStatus=o.toolStatus),o.headerStatusDot!==void 0&&(a.headerStatusDot=typeof o.headerStatusDot=="string"?o.headerStatusDot:void 0);let l=[...i];l[r]=a,this.parent.assembledMessages_$.set(l)}handleCliChunkEvent(e){let s=typeof e.type=="string"?e.type:"";if(s==="rate_limit_event"){let n=e.rate_limit_info;if(n&&typeof n=="object"){let t=n,o={status:typeof t.status=="string"?t.status:"",resetsAt:typeof t.resetsAt=="number"?t.resetsAt:0,rateLimitType:typeof t.rateLimitType=="string"?t.rateLimitType:"",utilization:typeof t.utilization=="number"?t.utilization:0,surpassedThreshold:typeof t.surpassedThreshold=="number"?t.surpassedThreshold:0,isUsingOverage:t.isUsingOverage===!0,receivedAt:new Date().toISOString()};this.parent.rateLimitInfo_$.set(o)}return}if(s==="system"){this.handleCliChunkSystemEvent(e);return}this.handleCliChunkToolResults(e)||this.parent.pushConsoleMessage({type:"raw",text:s||"cli-chunk",rawData:e})}handleCliChunkSystemEvent(e){let s=typeof e.subtype=="string"?e.subtype:"",n=typeof e.description=="string"?e.description:u.buildSystemEventBrief({subtype:s,data:e}),t=typeof e.tool_use_id=="string"?e.tool_use_id:"";t&&this.agentToolUseIds.has(t)&&(this.activeSubAgentId=t);let o=t&&this.agentToolUseIds.has(t)?t:this.activeSubAgentId||void 0,i=typeof e.last_tool_name=="string"?e.last_tool_name:"";if(s==="task_progress"&&i){this.parent.pushConsoleMessage({type:"tool",text:`${i}: ${n}`,isStatus:!1,rawData:e,parentAgentId:o});return}this.parent.pushConsoleMessage({type:"status-update",text:n,subtype:s,isStatus:!1,rawData:e,parentAgentId:o})}pushResponseChunkBlocks(e){let s=e.message,n=s&&typeof s=="object"?s.content:e.content;if(Array.isArray(n)){for(let t of n){if(!t||typeof t!="object")continue;let o=t,i=typeof o.type=="string"?o.type:"";if(i==="text"){let r=typeof o.text=="string"?o.text:"";r&&(this.activeSubAgentId="",this.parent.pushConsoleMessage({type:"assistant",text:r,rawData:e}))}else if(i==="tool_use")this.handleResponseChunkToolUse(o,e);else if(i==="tool_result")this.handleResponseChunkToolResult(o);else if(i==="thinking"){let r=typeof o.thinking=="string"?o.thinking:"";r&&this.parent.pushConsoleMessage({type:"thinking",text:r,rawData:o,parentAgentId:this.activeSubAgentId||void 0})}else i&&this.parent.pushConsoleMessage({type:"raw",text:i,rawData:o})}return}if(typeof n=="string"&&n){this.parent.pushConsoleMessage({type:"assistant",text:n,rawData:e});return}this.parent.pushConsoleMessage({type:"raw",text:"response-chunk",rawData:e})}handleResponseChunkToolUse(e,s){let n=typeof e.name=="string"?e.name:"unknown",t=typeof e.id=="string"?e.id:"";t&&this.toolUseIdToName.set(t,n),n==="Agent"&&t&&this.agentToolUseIds.add(t);let o=e.input,i=o?u.summarizeToolInput(o):"",r=i?`${n}: ${i}`:n,a=n==="Edit"?u.buildEditExpandableContent(o):void 0,l=n==="Agent"?"":this.activeSubAgentId;this.parent.pushConsoleMessage({type:"tool",text:r,expandableContent:a,rawData:e,parentAgentId:l||void 0})}handleResponseChunkToolResult(e){let s=typeof e.tool_use_id=="string"?e.tool_use_id:"",n=s&&this.agentToolUseIds.has(s)?s:this.activeSubAgentId||"",t=e.content??e.output,o=typeof t=="string"?t:"",i=o.length>200?o.substring(0,200)+"\u2026":o||"tool_result";this.parent.pushConsoleMessage({type:"tool-result",text:i,expandableContent:o.length>200?o:void 0,rawData:e,parentAgentId:n||void 0})}handleCliChunkToolResults(e){if((typeof e.type=="string"?e.type:"")!=="user")return!1;let n=e.message,t=n&&typeof n=="object"?n.content:null;if(!Array.isArray(t))return!1;let o=typeof e.parent_tool_use_id=="string"?e.parent_tool_use_id:"",i=!1;for(let r of t){if(!r||typeof r!="object")continue;let a=r,l=typeof a.type=="string"?a.type:"";if(l==="tool_result"){let c=typeof a.tool_use_id=="string"?a.tool_use_id:"",m=c?this.toolUseIdToName.get(c)??"":"",I=a.content,b=typeof I=="string"?I:"",w=a.is_error===!0,$=m?`${m}: `:"",k=b.length>200?b.substring(0,200)+"\u2026":b||"tool result",F=w?`${$}ERROR \u2014 ${k}`:`${$}${k}`;this.parent.pushConsoleMessage({type:"tool-result",text:F,expandableContent:b.length>200?b:void 0,rawData:S(h({},a),{parent_tool_use_id:o||void 0}),parentAgentId:o||void 0}),i=!0}else if(l==="text"&&o){let c=typeof a.text=="string"?a.text:"";if(c){let m=c.length>200?c.substring(0,200)+"\u2026":c;this.parent.pushConsoleMessage({type:"tool-result",text:m,expandableContent:c.length>200?c:void 0,rawData:{tool_use_id:o,type:"sub-agent-prompt",text:c},parentAgentId:o}),i=!0}}}return i}static isLiveCcSessionStatus(e){return e==="running"||e==="waiting-input"||e==="starting"}static buildSystemEventBrief(e){switch(e.subtype){case"init":{let s=typeof e.data.cwd=="string"?e.data.cwd:"",n=typeof e.data.model=="string"?e.data.model:"",t=["init"];return s&&t.push(s),n&&t.push(n),t.join(" \xB7 ")}case"task_updated":{let s=e.data.patch,n=s&&typeof s=="object"&&typeof s.status=="string"?s.status:"";return n?`task ${n}`:"task updated"}case"task_notification":{let s=typeof e.data.status=="string"?e.data.status:"";return s?`task ${s}`:"task notification"}default:return e.subtype||"system"}}static buildEditExpandableContent(e){if(!e||typeof e!="object")return;let s=e,n=s.old_string,t=s.new_string;if(typeof n!="string"||typeof t!="string")return;let o=500,i=n.length>o?n.substring(0,o)+"\u2026":n,r=t.length>o?t.substring(0,o)+"\u2026":t;return JSON.stringify({old:i,new:r})}static summarizeToolInput(e){if(typeof e=="string")return e.length>120?e.substring(0,120)+"\u2026":e;if(e&&typeof e=="object"){let s=e,n=s.file_path??s.path,t=s.command,o=s.pattern;if(typeof n=="string")return n;if(typeof t=="string")return t.length>120?t.substring(0,120)+"\u2026":t;if(typeof o=="string")return o}return""}accumulateUsage(e){let s=e.usage,n=typeof e.cost_usd=="number"?e.cost_usd:0,t=0,o=0;if(s&&typeof s=="object"){let r=s;t=typeof r.input_tokens=="number"?r.input_tokens:typeof r.promptTokens=="number"?r.promptTokens:0,o=typeof r.output_tokens=="number"?r.output_tokens:typeof r.completionTokens=="number"?r.completionTokens:0}let i=this.parent.sessionUsage_$();this.parent.sessionUsage_$.set({promptTokens:i.promptTokens+t,completionTokens:i.completionTokens+o,totalTokens:i.totalTokens+t+o,costUsd:i.costUsd+n})}static \u0275fac=function(s){return new(s||u)};static \u0275prov=A({token:u,factory:u.\u0275fac,providedIn:"root"})}return u})();var ne=(()=>{class u{sessions_$=p([]);sessionsLoading_$=p(!1);sessionsLoadError_$=p(null);selectedSession_$=p(null);selectedSessionLoading_$=p(!1);selectedSessionEvents_$=p([]);liveOutput_$=p([]);liveStderrLines_$=p(new Set);consoleMessages_$=p([]);assembledMessages_$=p([]);assembledMessagesHasMore_$=p(!1);isLoadingOlderMessages_$=p(!1);assembledMessagesLoaded_$=p(!1);lastStatusUpdate_$=p(null);sessionUsage_$=p({promptTokens:0,completionTokens:0,totalTokens:0,costUsd:0});rateLimitInfo_$=p(null);activeSessionId_$=p("");ccSession_AS=v(R);extSessionMsg_AS=v(q);globalError_CS=v(L);socket_CS=v(P);ngZone=v(T);peiContext_DS=v(U);socketEventHandler_CS=v(x);eventSubscription=null;reconnectSubscription=null;lastKnownEventSequence=-1;static SESSION_EVENTS_POLL_INTERVAL_MS=5*f.second;sessionEventsPollHandle=null;isSessionEventsPollInFlight=!1;constructor(){this.socketEventHandler_CS.init(this),this.eventSubscription=this.socket_CS.event$.subscribe(e=>{this.ngZone.run(()=>{this.socketEventHandler_CS.handleSocketEvent(e,{selectedCcapId:this.peiContext_DS.activeCcapId_$(),globalErrorShowError:(s,n)=>{this.globalError_CS.showError(s,n)}})})}),this.reconnectSubscription=this.socket_CS.connected$.subscribe(e=>{if(!e)return;let s=this.activeSessionId_$();s&&(this.socket_CS.emit("cc-session:subscribe",{sessionId:s}),this.loadAssembledMessages({sessionId:s}).catch(()=>{}),this.loadSessionDetail({sessionId:s}).catch(()=>{})),this.loadSessions().catch(()=>{}),this.backfillMissedEvents()})}ngOnDestroy(){this.stopSessionEventsPolling(),this.eventSubscription&&(this.eventSubscription.unsubscribe(),this.eventSubscription=null),this.reconnectSubscription&&(this.reconnectSubscription.unsubscribe(),this.reconnectSubscription=null)}showGlobalError(e,s){this.globalError_CS.showError(e,s)}getLastKnownEventSequence(){return this.lastKnownEventSequence}setLastKnownEventSequence(e){this.lastKnownEventSequence=e}evaluateSessionEventsPolling(){let e=this.activeSessionId_$(),s=this.resolveActiveSessionStatusForEventsPolling();!!(e&&this.lastKnownEventSequence>=0&&s!=null&&x.isLiveCcSessionStatus(s))?this.ensureSessionEventsPollingStarted():this.stopSessionEventsPolling()}loadSessions(e){return d(this,null,function*(){this.sessionsLoading_$.set(!0),this.sessionsLoadError_$.set(null);try{let n=[...(yield this.ccSession_AS.listSessions({status:e?.status,workspacePath:e?.workspacePath,includeArchived:e?.includeArchived})).sessions].sort((t,o)=>{let i=t.lastActivityAt?new Date(t.lastActivityAt).getTime():0;return(o.lastActivityAt?new Date(o.lastActivityAt).getTime():0)-i});this.sessions_$.set(n)}catch(s){this.sessionsLoadError_$.set(s)}finally{this.sessionsLoading_$.set(!1)}})}loadPersistedRateLimitState(e){return d(this,null,function*(){let s=e.ccapId?.trim()??"";if(s)try{let n=yield this.ccSession_AS.getRateLimitState({ccapId:s});this.mergePersistedRateLimitState(n.items)}catch(n){f.DyFM_Log.warn(`ClaudeCode_DS | loadPersistedRateLimitState failed (non-blocking) | ccapId: ${s} | ${n instanceof Error?n.message:String(n)}`)}})}mergePersistedRateLimitState(e){if(this.rateLimitInfo_$()!==null)return;let s=O.mapServerItemsToClientInfo(e);s!==null&&this.rateLimitInfo_$.set(s)}loadSessionDetail(e){return d(this,null,function*(){this.selectedSessionLoading_$.set(!0);try{let s=yield this.ccSession_AS.getSession({sessionId:e.sessionId}),n=this.activeSessionId_$();if(n&&n!==e.sessionId){f.DyFM_Log.info(`CCAP_CcSession_DS | loadSessionDetail stale response \u2014 discarded | requestedSessionId: ${e.sessionId} | currentActiveSessionId: ${n}`);return}this.selectedSession_$.set(s)}catch(s){let n=this.activeSessionId_$();if(n&&n!==e.sessionId)return;this.selectedSession_$.set(null);let t=s instanceof Error?s.message:"Failed to load session details";this.pushConsoleMessage({type:"error",text:`Load session failed: ${t}`})}finally{this.selectedSessionLoading_$.set(!1),this.evaluateSessionEventsPolling()}})}loadSessionEvents(e){return d(this,null,function*(){try{let s=yield this.ccSession_AS.getSessionEvents({sessionId:e.sessionId,eventType:e.eventType,limit:e.limit??500,latest:!0}),n=this.activeSessionId_$();if(n&&n!==e.sessionId){f.DyFM_Log.info(`CCAP_CcSession_DS | loadSessionEvents stale response \u2014 discarded | requestedSessionId: ${e.sessionId} | currentActiveSessionId: ${n}`);return}this.selectedSessionEvents_$.set(s.events),this.updateLastKnownSequence(s.events);for(let t of s.events)this.socketEventHandler_CS.pushConsoleMessageFromEvent(t,!1,(o,i)=>{this.globalError_CS.showError(o,i)});this.loadAssembledMessages({sessionId:e.sessionId}).catch(()=>{})}catch{let n=this.activeSessionId_$();if(n&&n!==e.sessionId)return;this.selectedSessionEvents_$.set([])}finally{this.evaluateSessionEventsPolling()}})}createSession(e){return d(this,null,function*(){try{let s=yield this.ccSession_AS.createSession(e),n=String(s.session.sessionId||"");return yield this.loadSessions(),n}catch(s){throw this.pushConsoleMessage({type:"error",text:`Create session failed: ${y.getErrorMessageForDisplay(s)}`}),s}})}sendPrompt(e){return d(this,null,function*(){let s=e.attachments?.filter(n=>n.isImage&&!!n.base64).map(n=>`data:${n.mimeType};base64,${n.base64}`);this.pushConsoleMessage({type:"prompt",text:e.content,imageDataUrls:s?.length?s:void 0});try{let n=yield this.ccSession_AS.sendPrompt(e);n.relayed&&(n.targetOnline?this.pushConsoleMessage({type:"info",text:`Prompt relayed to remote instance (task: ${n.taskId?.substring(0,8)}\u2026)`}):this.pushConsoleMessage({type:"error",text:`\u26A0 A t\xE1voli instance jelenleg offline \u2014 a prompt queue-ban v\xE1rakozik (task: ${n.taskId?.substring(0,8)}\u2026) \xE9s csak akkor k\xE9zbes\xEDt\u0151dik, ha a target instance online lesz. Ellen\u0151rizd, hogy mindk\xE9t instance fut, \xE9s a Settings \u2192 Cluster sharedSecret azonos.`})),this.evaluateSessionEventsPolling()}catch(n){throw this.pushConsoleMessage({type:"error",text:`Send failed: ${y.getErrorMessageForDisplay(n)}`}),this.globalError_CS.showError(n,"CC Session sendPrompt"),n}})}forkSession(e){return d(this,null,function*(){try{let s=yield this.ccSession_AS.forkSession({sessionId:e.sessionId,label:e.label}),n=String(s.session.sessionId||"");return yield this.loadSessions(),n}catch(s){throw this.pushConsoleMessage({type:"error",text:`Fork session failed: ${y.getErrorMessageForDisplay(s)}`}),s}})}resumeSession(e){return d(this,null,function*(){try{let s=yield this.ccSession_AS.resumeSession(e);s.relayed&&this.pushConsoleMessage({type:"info",text:s.targetOnline?"Resume relayed to remote instance":"Resume queued for offline remote instance"}),yield this.loadSessions()}catch(s){throw this.pushConsoleMessage({type:"error",text:`Resume failed: ${y.getErrorMessageForDisplay(s)}`}),s}})}stopExecution(e){return d(this,null,function*(){try{let s=yield this.ccSession_AS.stopExecution(e);if(s.relayed){this.pushSystemAssembledMessage({sessionId:e.sessionId,text:s.targetOnline?"Stop execution relayed to remote instance":"Stop execution queued for offline remote instance",role:"info"});return}let n=s.message||"Execution stopped";this.pushSystemAssembledMessage({sessionId:e.sessionId,text:n,role:"info"})}catch(s){throw this.pushSystemAssembledMessage({sessionId:e.sessionId,text:`Stop execution failed: ${y.getErrorMessageForDisplay(s)}`,role:"error"}),s}})}loadDiagnostic(e){return d(this,null,function*(){try{return yield this.ccSession_AS.getDiagnostic({sessionId:e.sessionId})}catch(s){return f.DyFM_Log.error(`CCAP_CcSession_DS | loadDiagnostic failed | sessionId: ${e.sessionId}`,s),null}})}terminateSession(e){return d(this,null,function*(){try{let s=yield this.ccSession_AS.terminateSession(e);s.relayed?this.pushSystemAssembledMessage({sessionId:e.sessionId,text:s.targetOnline?"Terminate relayed to remote instance":"Terminate queued for offline remote instance",role:"info"}):this.pushSystemAssembledMessage({sessionId:e.sessionId,text:"Session terminated",role:"status"}),yield this.loadSessions()}catch(s){throw this.pushSystemAssembledMessage({sessionId:e.sessionId,text:`Terminate failed: ${y.getErrorMessageForDisplay(s)}`,role:"error"}),s}})}restartRunner(e){return d(this,null,function*(){try{let s=yield this.ccSession_AS.restartRunner(e);this.pushSystemAssembledMessage({sessionId:e.sessionId,text:`Runner restarted (new terminalId: ${s.newTerminalId.slice(0,8)}\u2026). New terminal window should open shortly.`,role:"info"})}catch(s){throw this.pushSystemAssembledMessage({sessionId:e.sessionId,text:`Runner restart failed: ${y.getErrorMessageForDisplay(s)}`,role:"error"}),s}})}setSessionArchived(e){return d(this,null,function*(){try{yield this.ccSession_AS.setSessionArchived(e),yield this.loadSessions()}catch(s){throw this.pushConsoleMessage({type:"error",text:`Archive failed: ${y.getErrorMessageForDisplay(s)}`}),s}})}updateSessionConfig(e){return d(this,null,function*(){try{yield this.ccSession_AS.updateSessionConfig(e);let s=this.selectedSession_$();if(s?.session.sessionId===e.sessionId){let n=h({},s.session);e.label!=null&&(n.label=e.label),e.mode!=null&&(n.mode=e.mode),e.permissionPolicy!=null&&(n.permissionPolicy=e.permissionPolicy),e.reasoningEffort!=null&&(n.reasoningEffort=e.reasoningEffort),e.model!=null&&(n.model=e.model),e.isDebugMode!=null&&(n.isDebugMode=e.isDebugMode),this.selectedSession_$.set(S(h({},s),{session:n}))}if(e.label!=null){let n=this.sessions_$(),t=n.findIndex(o=>o.sessionId===e.sessionId);if(t>=0){let o=[...n];o[t]=S(h({},o[t]),{label:e.label}),this.sessions_$.set(o)}}}catch(s){throw this.pushConsoleMessage({type:"error",text:`Config update failed: ${y.getErrorMessageForDisplay(s)}`}),s}})}setActiveSessionId(e){let s=this.activeSessionId_$();s!==e&&this.stopSessionEventsPolling(),s&&s!==e&&this.socket_CS.emit("cc-session:unsubscribe",{sessionId:s}),this.activeSessionId_$.set(e),e&&this.socket_CS.emit("cc-session:subscribe",{sessionId:e})}clearLiveOutput(){this.stopSessionEventsPolling(),this.liveOutput_$.set([]),this.liveStderrLines_$.set(new Set),this.consoleMessages_$.set([]),this.assembledMessages_$.set([]),this.assembledMessagesHasMore_$.set(!1),this.isLoadingOlderMessages_$.set(!1),this.assembledMessagesLoaded_$.set(!1),this.selectedSession_$.set(null),this.selectedSessionEvents_$.set([]),this.lastStatusUpdate_$.set(null),this.sessionUsage_$.set({promptTokens:0,completionTokens:0,totalTokens:0,costUsd:0}),this.lastKnownEventSequence=-1,this.socketEventHandler_CS.resetTrackingState()}pushConsoleMessage(e){let s=e.type==="assistant"||e.type==="prompt"?e.text.trim():e.text,n={listKey:e.listKey??this.allocateConsoleListKey(),type:e.type,text:s,timestamp:e.timestamp??new Date().toISOString(),isStatus:e.isStatus??!1,expandableContent:e.expandableContent,rawData:e.rawData,subtype:e.subtype,parentAgentId:e.parentAgentId,imageDataUrls:e.imageDataUrls},t=this.consoleMessages_$();this.consoleMessages_$.set([...t,n])}loadAssembledMessages(e){return d(this,null,function*(){try{let s=yield this.extSessionMsg_AS.getMessages({sessionId:e.sessionId,latest:!0}),n=this.activeSessionId_$();if(n&&n!==e.sessionId){f.DyFM_Log.info(`CCAP_CcSession_DS | loadAssembledMessages stale \u2014 discarded | requestedSessionId: ${e.sessionId} | currentActiveSessionId: ${n} | restMessageCount: ${s.messages.length}`);return}let t=this.assembledMessages_$(),o=new Set(s.messages.map(r=>r.messageKey).filter(r=>typeof r=="string"&&r.length>0)),i=t.filter(r=>!o.has(r.messageKey));this.assembledMessages_$.set(_.sortAsc([...s.messages,...i])),this.assembledMessagesHasMore_$.set(s.hasMore)}catch(s){f.DyFM_Log.error(`CCAP_CcSession_DS | loadAssembledMessages failed | sessionId: ${e.sessionId}`,s)}finally{this.assembledMessagesLoaded_$.set(!0)}})}loadOlderAssembledMessages(e){return d(this,null,function*(){if(this.isLoadingOlderMessages_$()||!this.assembledMessagesHasMore_$())return;let s=this.assembledMessages_$();if(!s.length)return;let n=s.reduce((t,o)=>(o.sequence??0)<t?o.sequence??0:t,s[0].sequence??0);this.isLoadingOlderMessages_$.set(!0);try{let t=yield this.extSessionMsg_AS.getMessages({sessionId:e.sessionId,beforeSequence:n,limit:e.limit??50});t.messages.length&&this.assembledMessages_$.set(_.sortAsc([...t.messages,...s])),this.assembledMessagesHasMore_$.set(t.hasMore)}catch(t){f.DyFM_Log.error(`CCAP_CcSession_DS | loadOlderAssembledMessages failed | sessionId: ${e.sessionId}`,t)}finally{this.isLoadingOlderMessages_$.set(!1)}})}pushSystemAssembledMessage(e){let s=this.assembledMessages_$(),n=s.length?s.reduce((o,i)=>(i.sequence??0)>o?i.sequence??0:o,0):0,t={messageKey:`sys-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,sessionId:e.sessionId,sessionType:"cc",messageRole:e.role,bodyText:e.text,timestamp:new Date().toISOString(),sequence:n+1};this.assembledMessages_$.set(_.sortAsc([...s,t])),this.pushConsoleMessage({type:e.role==="error"?"error":e.role==="status"?"status":"info",text:e.text,isStatus:e.role==="status"})}allocateConsoleListKey(){return globalThis.crypto.randomUUID()}pullEventsSinceLastKnownSequence(e){return d(this,null,function*(){let s=this.activeSessionId_$();if(!(!s||this.lastKnownEventSequence<0))try{let t=(yield this.ccSession_AS.getSessionEvents({sessionId:s,sinceSequence:this.lastKnownEventSequence})).events;if(!t.length)return;this.ngZone.run(()=>{let o=this.activeSessionId_$();if(o!==s){f.DyFM_Log.info(`CCAP_CcSession_DS | pull(${e}) stale \u2014 discarded | requestedSessionId: ${s} | currentActiveSessionId: ${o} | newEventCount: ${t.length}`);return}let i=this.selectedSessionEvents_$();this.selectedSessionEvents_$.set([...i,...t]);for(let r of t)this.socketEventHandler_CS.pushConsoleMessageFromEvent(r,!0,(a,l)=>{this.globalError_CS.showError(a,l)});this.updateLastKnownSequence(t)})}catch(n){let t=e==="poll"?"session events poll failed":"backfill failed";f.DyFM_Log.warn(`CCAP_CcSession_DS | ${t}`,n)}})}backfillMissedEvents(){return d(this,null,function*(){yield this.pullEventsSinceLastKnownSequence("backfill")})}updateLastKnownSequence(e){for(let s of e)s.sequence>this.lastKnownEventSequence&&(this.lastKnownEventSequence=s.sequence)}resolveActiveSessionStatusForEventsPolling(){let e=this.activeSessionId_$();if(!e)return null;let s=this.selectedSession_$();if(s?.session.sessionId===e)return s.session.status;let n=this.lastStatusUpdate_$();return n?.sessionId===e?n.status:this.sessions_$().find(o=>o.sessionId===e)?.status??null}ensureSessionEventsPollingStarted(){this.sessionEventsPollHandle===null&&(this.sessionEventsPollHandle=setInterval(()=>{this.onSessionEventsPollTick()},u.SESSION_EVENTS_POLL_INTERVAL_MS))}stopSessionEventsPolling(){this.sessionEventsPollHandle!==null&&(clearInterval(this.sessionEventsPollHandle),this.sessionEventsPollHandle=null),this.isSessionEventsPollInFlight=!1}onSessionEventsPollTick(){return d(this,null,function*(){if(!this.isSessionEventsPollInFlight){this.isSessionEventsPollInFlight=!0;try{yield this.pullEventsSinceLastKnownSequence("poll");let e=this.activeSessionId_$();e&&(yield this.loadAssembledMessages({sessionId:e}))}finally{this.isSessionEventsPollInFlight=!1}}})}static \u0275fac=function(s){return new(s||u)};static \u0275prov=A({token:u,factory:u.\u0275fac,providedIn:"root"})}return u})();export{ne as a};
|
|
3
|
-
//# sourceMappingURL=chunk-
|
|
3
|
+
//# sourceMappingURL=chunk-4PBNHSRW.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{p as l}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{p as l}from"./chunk-RUSAMFGS.js";import{G as i,h as f}from"./chunk-TBMJSIBB.js";var o=f(l()),u=10*o.second,_=20*o.second,a=5,c=7;var n=class{static getDurationBand(r){if(r==null)return null;let e=typeof r=="number"?r:Number(r);return Number.isNaN(e)||e<0?null:e<=u?"green":e<=_?"yellow":"red"}static getScoreBand(r){return r<a?"red":r>=c?"green":"yellow"}};var m=(()=>{class t{transform(e){return e!=null?n.getScoreBand(Number(e)):"yellow"}static \u0275fac=function(p){return new(p||t)};static \u0275pipe=i({name:"ccapScoreBand",type:t,pure:!0,standalone:!0})}return t})();export{n as a,m as b};
|
|
2
|
+
//# sourceMappingURL=chunk-5RLDT3NY.js.map
|