@futdevpro/ccap 1.1.3215 → 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-CPUH35EZ.js → agent-instances.module-TPKOBI3N.js} +2 -2
- package/client-dist/ca.module-I5N6QWSU.js +5 -0
- package/client-dist/{ca.module-U7YZDJ2S.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-UL3CZNH7.js → chunk-25KTNALK.js} +2 -2
- package/client-dist/{chunk-OKI5V6YQ.js → chunk-26YUXPZI.js} +2 -2
- package/client-dist/{chunk-VYHAGBS4.js → chunk-3AG5X2MY.js} +2 -2
- package/client-dist/{chunk-VYHAGBS4.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-4ZFB25GK.js → chunk-44TWBJUK.js} +2 -2
- package/client-dist/{chunk-X3MZFTMO.js → chunk-4EOSKDXN.js} +2 -2
- package/client-dist/{chunk-4LLJ2OWZ.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-IAE5NGVM.js → chunk-4PBNHSRW.js} +2 -2
- package/client-dist/{chunk-MHOWIGRN.js → chunk-5RLDT3NY.js} +2 -2
- package/client-dist/{chunk-LHK7W77S.js → chunk-5YDHEFSD.js} +2 -2
- package/client-dist/{chunk-IZCGZPDO.js → chunk-657E66YR.js} +2 -2
- package/client-dist/{chunk-7NMJB7CI.js → chunk-6BYNIFJY.js} +2 -2
- package/client-dist/{chunk-4CLEKS5Z.js → chunk-77YTUUCR.js} +7 -3
- package/client-dist/{chunk-4CLEKS5Z.js.map → chunk-77YTUUCR.js.map} +2 -2
- package/client-dist/{chunk-CRSKI2X4.js → chunk-7CMPZXAO.js} +2 -2
- package/client-dist/{chunk-SARZNHM5.js → chunk-7VY64KMU.js} +2 -2
- package/client-dist/{chunk-QIGBGNDG.js → chunk-A33MCHYC.js} +2 -2
- package/client-dist/{chunk-U6C6SLYE.js → chunk-BH3GMEZZ.js} +19 -19
- package/client-dist/chunk-BH3GMEZZ.js.map +7 -0
- package/client-dist/{chunk-PIXU7VL6.js → chunk-BJ4I73WC.js} +2 -2
- package/client-dist/{chunk-SZ5YB5I5.js → chunk-C2BQQRVH.js} +2 -2
- package/client-dist/{chunk-2PQXI7I7.js → chunk-C4FOSX27.js} +2 -2
- package/client-dist/chunk-C4FOSX27.js.map +7 -0
- package/client-dist/{chunk-33VVBKU2.js → chunk-CAMM4S7P.js} +2 -2
- package/client-dist/{chunk-6BFD2NWY.js → chunk-CDNAFC73.js} +2 -2
- package/client-dist/{chunk-FWTMQSVZ.js → chunk-CU5YQ2M4.js} +2 -2
- package/client-dist/{chunk-ROQIRXTO.js → chunk-DXF2FJLD.js} +2 -2
- package/client-dist/{chunk-AYF66J6F.js → chunk-E6WOJOGT.js} +2 -2
- package/client-dist/{chunk-PTO335OR.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-TTTWIDBQ.js → chunk-GG2WP2KM.js} +2 -2
- package/client-dist/{chunk-VSFMGBJ5.js → chunk-IHNAAEA2.js} +2 -2
- package/client-dist/{chunk-MC4INR7S.js → chunk-J5INQQ5M.js} +2 -2
- package/client-dist/{chunk-OHLE7T6H.js → chunk-KX2KGHQZ.js} +2 -2
- package/client-dist/{chunk-QRP3ANHZ.js → chunk-L2XJGYW4.js} +2 -2
- package/client-dist/{chunk-AWXOKP4G.js → chunk-L42Z7YNK.js} +2 -2
- package/client-dist/{chunk-OG3BXORU.js → chunk-LCKABD2M.js} +2 -2
- package/client-dist/{chunk-MW4XS5NJ.js → chunk-LIGODF4I.js} +2 -2
- package/client-dist/{chunk-MVVOW5DK.js → chunk-LMK3IOKN.js} +2 -2
- package/client-dist/{chunk-IDUC3D4V.js → chunk-OCNDLQG5.js} +2 -2
- package/client-dist/{chunk-BW23SNBJ.js → chunk-OKUYYDGV.js} +2 -2
- package/client-dist/{chunk-Q4JCVLZX.js → chunk-OLLHHMTV.js} +2 -2
- package/client-dist/{chunk-HL6WDI7B.js → chunk-OS5KCUZD.js} +2 -2
- package/client-dist/{chunk-S72KII3A.js → chunk-PMJP2N4K.js} +2 -2
- package/client-dist/{chunk-MHKJKJVA.js → chunk-PW5BAINL.js} +2 -2
- package/client-dist/{chunk-JZY65LIL.js → chunk-QQ2GRU2N.js} +2 -2
- package/client-dist/{chunk-CFK7FARI.js → chunk-RUSAMFGS.js} +2 -2
- package/client-dist/{chunk-CFK7FARI.js.map → chunk-RUSAMFGS.js.map} +1 -1
- package/client-dist/{chunk-GO5RFW3F.js → chunk-RYD462IO.js} +2 -2
- package/client-dist/{chunk-EEPAM5ZQ.js → chunk-SK3XGSYF.js} +2 -2
- package/client-dist/{chunk-5ZJE7DIO.js → chunk-TFB7ULAV.js} +2 -2
- package/client-dist/{chunk-6JOKYIHX.js → chunk-U3Y5GO6O.js} +2 -2
- package/client-dist/{chunk-S7U2FMEE.js → chunk-U64N3LCA.js} +2 -2
- package/client-dist/{chunk-QHOO5EGB.js → chunk-UD4PV7CD.js} +2 -2
- package/client-dist/{chunk-6C4DDRK2.js → chunk-UM7AS2IW.js} +2 -2
- package/client-dist/{chunk-PVZP6QNW.js → chunk-UVVGFHUG.js} +2 -2
- package/client-dist/{chunk-O4Z7O66B.js → chunk-VOFDBT5T.js} +2 -2
- package/client-dist/{chunk-YWMRQJRC.js → chunk-VRG74DKK.js} +2 -2
- package/client-dist/{chunk-LPDRQ6SN.js → chunk-W7HIS2QA.js} +2 -2
- package/client-dist/{chunk-XGSTC65N.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-4Z3WDA2D.js.map → consultant.module-HHTHUWRL.js.map} +3 -3
- package/client-dist/{crd.module-EVPCDOWY.js → crd.module-ER6AHSX5.js} +2 -2
- package/client-dist/{dashboard.module-XOGM4333.js → dashboard.module-TSNGGBCI.js} +2 -2
- package/client-dist/{do.module-2QODL2MZ.js → do.module-NMZD5VSM.js} +2 -2
- package/client-dist/{document-library.module-6W5KJ6EM.js → document-library.module-GHDNXP3T.js} +2 -2
- package/client-dist/{embedding-eval.module-VBH5UZ2A.js → embedding-eval.module-XPXBOIP5.js} +2 -2
- package/client-dist/{embedding-registry.module-4QXZMK6L.js → embedding-registry.module-45TQGZI2.js} +2 -2
- package/client-dist/{err.module-4WYVCGZK.js → err.module-GCKYDYCK.js} +2 -2
- package/client-dist/{feedback.module-O32WDW4G.js → feedback.module-TLKZ4B4N.js} +2 -2
- package/client-dist/{host-runtime-mcp.module-JNYMDS2F.js → host-runtime-mcp.module-HVJZN5R5.js} +2 -2
- package/client-dist/index.html +2 -2
- package/client-dist/{live-dev-pipeline.module-BAG7LJBJ.js → live-dev-pipeline.module-5PE4ZFFW.js} +2 -2
- package/client-dist/{logs.module-PZQTAXGV.js → logs.module-335EXKCD.js} +2 -2
- package/client-dist/{main-PYXFCW2K.js → main-FRD6VXVH.js} +4 -4
- package/client-dist/{main-PYXFCW2K.js.map → main-FRD6VXVH.js.map} +3 -3
- package/client-dist/{master-control-remote-poc.module-K2PT5FB2.js → master-control-remote-poc.module-ORHRUCZH.js} +2 -2
- package/client-dist/{mobile-app.module-TUVMDOPA.js → mobile-app.module-BYYNVKQR.js} +2 -2
- package/client-dist/{model-registry.module-E7NAPF2Y.js → model-registry.module-KIHIJ2Z6.js} +2 -2
- package/client-dist/oc.module-DAGIRW3Z.js +3 -0
- package/client-dist/{oc.module-HFDDW2XD.js.map → oc.module-DAGIRW3Z.js.map} +3 -3
- package/client-dist/{orc.module-K277LTLC.js → orc.module-KZELL6XR.js} +2 -2
- package/client-dist/{project-management.module-JZVMTKGP.js → project-management.module-IJNPSUQZ.js} +2 -2
- package/client-dist/project-source-routed.module-DP3RD454.js +2 -0
- package/client-dist/{scheduler.module-6NC3BKNE.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-I3FJ3Q2M.js → set.module-Y2RHKW7A.js} +5 -5
- package/client-dist/{set.module-I3FJ3Q2M.js.map → set.module-Y2RHKW7A.js.map} +3 -3
- package/client-dist/{setup.module-JT7PN7FK.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-EDF4WYNX.js → terminals.module-KHEDY6QN.js} +2 -2
- package/client-dist/{voice-notes-poc.module-CENJQVZI.js → voice-notes-poc.module-EMDLJJIT.js} +2 -2
- package/client-dist/{wfs.module-XGMD3EUF.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-U7YZDJ2S.js +0 -5
- package/client-dist/cc-usage-dashboard.component-A3NQVGUQ.js +0 -2
- package/client-dist/cc-usage-dashboard.component-A3NQVGUQ.js.map +0 -7
- package/client-dist/cc.module-4FCJFHDX.js +0 -4
- package/client-dist/cc.module-4FCJFHDX.js.map +0 -7
- package/client-dist/chunk-2PQXI7I7.js.map +0 -7
- package/client-dist/chunk-AC2BVG34.js +0 -2
- package/client-dist/chunk-AC2BVG34.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-EVTV632M.js +0 -2
- package/client-dist/chunk-EVTV632M.js.map +0 -7
- package/client-dist/chunk-U6C6SLYE.js.map +0 -7
- package/client-dist/consultant.module-4Z3WDA2D.js +0 -3
- package/client-dist/oc.module-HFDDW2XD.js +0 -3
- package/client-dist/project-source-routed.module-MD2ZFK3N.js +0 -2
- package/client-dist/session.module-DG7H2GJT.js +0 -12
- package/client-dist/session.module-DG7H2GJT.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-CPUH35EZ.js.map → agent-instances.module-TPKOBI3N.js.map} +0 -0
- /package/client-dist/{chunk-UL3CZNH7.js.map → chunk-25KTNALK.js.map} +0 -0
- /package/client-dist/{chunk-OKI5V6YQ.js.map → chunk-26YUXPZI.js.map} +0 -0
- /package/client-dist/{chunk-4ZFB25GK.js.map → chunk-44TWBJUK.js.map} +0 -0
- /package/client-dist/{chunk-X3MZFTMO.js.map → chunk-4EOSKDXN.js.map} +0 -0
- /package/client-dist/{chunk-4LLJ2OWZ.js.map → chunk-4FK2D2PX.js.map} +0 -0
- /package/client-dist/{chunk-IAE5NGVM.js.map → chunk-4PBNHSRW.js.map} +0 -0
- /package/client-dist/{chunk-MHOWIGRN.js.map → chunk-5RLDT3NY.js.map} +0 -0
- /package/client-dist/{chunk-LHK7W77S.js.map → chunk-5YDHEFSD.js.map} +0 -0
- /package/client-dist/{chunk-IZCGZPDO.js.map → chunk-657E66YR.js.map} +0 -0
- /package/client-dist/{chunk-7NMJB7CI.js.map → chunk-6BYNIFJY.js.map} +0 -0
- /package/client-dist/{chunk-CRSKI2X4.js.map → chunk-7CMPZXAO.js.map} +0 -0
- /package/client-dist/{chunk-SARZNHM5.js.map → chunk-7VY64KMU.js.map} +0 -0
- /package/client-dist/{chunk-QIGBGNDG.js.map → chunk-A33MCHYC.js.map} +0 -0
- /package/client-dist/{chunk-PIXU7VL6.js.map → chunk-BJ4I73WC.js.map} +0 -0
- /package/client-dist/{chunk-SZ5YB5I5.js.map → chunk-C2BQQRVH.js.map} +0 -0
- /package/client-dist/{chunk-33VVBKU2.js.map → chunk-CAMM4S7P.js.map} +0 -0
- /package/client-dist/{chunk-6BFD2NWY.js.map → chunk-CDNAFC73.js.map} +0 -0
- /package/client-dist/{chunk-FWTMQSVZ.js.map → chunk-CU5YQ2M4.js.map} +0 -0
- /package/client-dist/{chunk-ROQIRXTO.js.map → chunk-DXF2FJLD.js.map} +0 -0
- /package/client-dist/{chunk-AYF66J6F.js.map → chunk-E6WOJOGT.js.map} +0 -0
- /package/client-dist/{chunk-PTO335OR.js.map → chunk-EDMLVG72.js.map} +0 -0
- /package/client-dist/{chunk-TTTWIDBQ.js.map → chunk-GG2WP2KM.js.map} +0 -0
- /package/client-dist/{chunk-VSFMGBJ5.js.map → chunk-IHNAAEA2.js.map} +0 -0
- /package/client-dist/{chunk-MC4INR7S.js.map → chunk-J5INQQ5M.js.map} +0 -0
- /package/client-dist/{chunk-OHLE7T6H.js.map → chunk-KX2KGHQZ.js.map} +0 -0
- /package/client-dist/{chunk-QRP3ANHZ.js.map → chunk-L2XJGYW4.js.map} +0 -0
- /package/client-dist/{chunk-AWXOKP4G.js.map → chunk-L42Z7YNK.js.map} +0 -0
- /package/client-dist/{chunk-OG3BXORU.js.map → chunk-LCKABD2M.js.map} +0 -0
- /package/client-dist/{chunk-MW4XS5NJ.js.map → chunk-LIGODF4I.js.map} +0 -0
- /package/client-dist/{chunk-MVVOW5DK.js.map → chunk-LMK3IOKN.js.map} +0 -0
- /package/client-dist/{chunk-IDUC3D4V.js.map → chunk-OCNDLQG5.js.map} +0 -0
- /package/client-dist/{chunk-BW23SNBJ.js.map → chunk-OKUYYDGV.js.map} +0 -0
- /package/client-dist/{chunk-Q4JCVLZX.js.map → chunk-OLLHHMTV.js.map} +0 -0
- /package/client-dist/{chunk-HL6WDI7B.js.map → chunk-OS5KCUZD.js.map} +0 -0
- /package/client-dist/{chunk-S72KII3A.js.map → chunk-PMJP2N4K.js.map} +0 -0
- /package/client-dist/{chunk-MHKJKJVA.js.map → chunk-PW5BAINL.js.map} +0 -0
- /package/client-dist/{chunk-JZY65LIL.js.map → chunk-QQ2GRU2N.js.map} +0 -0
- /package/client-dist/{chunk-GO5RFW3F.js.map → chunk-RYD462IO.js.map} +0 -0
- /package/client-dist/{chunk-EEPAM5ZQ.js.map → chunk-SK3XGSYF.js.map} +0 -0
- /package/client-dist/{chunk-5ZJE7DIO.js.map → chunk-TFB7ULAV.js.map} +0 -0
- /package/client-dist/{chunk-6JOKYIHX.js.map → chunk-U3Y5GO6O.js.map} +0 -0
- /package/client-dist/{chunk-S7U2FMEE.js.map → chunk-U64N3LCA.js.map} +0 -0
- /package/client-dist/{chunk-QHOO5EGB.js.map → chunk-UD4PV7CD.js.map} +0 -0
- /package/client-dist/{chunk-6C4DDRK2.js.map → chunk-UM7AS2IW.js.map} +0 -0
- /package/client-dist/{chunk-PVZP6QNW.js.map → chunk-UVVGFHUG.js.map} +0 -0
- /package/client-dist/{chunk-O4Z7O66B.js.map → chunk-VOFDBT5T.js.map} +0 -0
- /package/client-dist/{chunk-YWMRQJRC.js.map → chunk-VRG74DKK.js.map} +0 -0
- /package/client-dist/{chunk-LPDRQ6SN.js.map → chunk-W7HIS2QA.js.map} +0 -0
- /package/client-dist/{chunk-XGSTC65N.js.map → chunk-XFXMWTQS.js.map} +0 -0
- /package/client-dist/{crd.module-EVPCDOWY.js.map → crd.module-ER6AHSX5.js.map} +0 -0
- /package/client-dist/{dashboard.module-XOGM4333.js.map → dashboard.module-TSNGGBCI.js.map} +0 -0
- /package/client-dist/{do.module-2QODL2MZ.js.map → do.module-NMZD5VSM.js.map} +0 -0
- /package/client-dist/{document-library.module-6W5KJ6EM.js.map → document-library.module-GHDNXP3T.js.map} +0 -0
- /package/client-dist/{embedding-eval.module-VBH5UZ2A.js.map → embedding-eval.module-XPXBOIP5.js.map} +0 -0
- /package/client-dist/{embedding-registry.module-4QXZMK6L.js.map → embedding-registry.module-45TQGZI2.js.map} +0 -0
- /package/client-dist/{err.module-4WYVCGZK.js.map → err.module-GCKYDYCK.js.map} +0 -0
- /package/client-dist/{feedback.module-O32WDW4G.js.map → feedback.module-TLKZ4B4N.js.map} +0 -0
- /package/client-dist/{host-runtime-mcp.module-JNYMDS2F.js.map → host-runtime-mcp.module-HVJZN5R5.js.map} +0 -0
- /package/client-dist/{live-dev-pipeline.module-BAG7LJBJ.js.map → live-dev-pipeline.module-5PE4ZFFW.js.map} +0 -0
- /package/client-dist/{logs.module-PZQTAXGV.js.map → logs.module-335EXKCD.js.map} +0 -0
- /package/client-dist/{master-control-remote-poc.module-K2PT5FB2.js.map → master-control-remote-poc.module-ORHRUCZH.js.map} +0 -0
- /package/client-dist/{mobile-app.module-TUVMDOPA.js.map → mobile-app.module-BYYNVKQR.js.map} +0 -0
- /package/client-dist/{model-registry.module-E7NAPF2Y.js.map → model-registry.module-KIHIJ2Z6.js.map} +0 -0
- /package/client-dist/{orc.module-K277LTLC.js.map → orc.module-KZELL6XR.js.map} +0 -0
- /package/client-dist/{project-management.module-JZVMTKGP.js.map → project-management.module-IJNPSUQZ.js.map} +0 -0
- /package/client-dist/{project-source-routed.module-MD2ZFK3N.js.map → project-source-routed.module-DP3RD454.js.map} +0 -0
- /package/client-dist/{scheduler.module-6NC3BKNE.js.map → scheduler.module-S3IKZCLL.js.map} +0 -0
- /package/client-dist/{setup.module-JT7PN7FK.js.map → setup.module-VTI5EZ3Q.js.map} +0 -0
- /package/client-dist/{terminals.module-EDF4WYNX.js.map → terminals.module-KHEDY6QN.js.map} +0 -0
- /package/client-dist/{voice-notes-poc.module-CENJQVZI.js.map → voice-notes-poc.module-EMDLJJIT.js.map} +0 -0
- /package/client-dist/{wfs.module-XGMD3EUF.js.map → wfs.module-LUTFNQG5.js.map} +0 -0
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["src/app/_modules/dev/_modules/poc/_modules/voice-notes-poc/_services/vnp-input-ui.data-service.ts", "src/app/_enums/voice/ccap-stt-qa-word-diff-segment-kind.enum.ts", "src/app/_collections/utils/model-testing/ccap-stt-qa-text-diff.util.ts", "src/app/_components/ccap-voice-record-button/ccap-voice-record-button.component.ts", "src/app/_components/ccap-voice-record-button/ccap-voice-record-button.component.html"],
|
|
4
|
-
"sourcesContent": ["import { Injectable, signal, WritableSignal } from '@angular/core';\n\nimport { Shr_LocalStoragePersistence_Util } from '../../../../../../shared/_collections/utils/storage/shr-local-storage-persistence.util';\n\n/** localStorage kulcs — hang input után azonnali küldés (chat / külső konzolok). */\nconst CCAP_VOICE_INPUT_AUTO_SEND_AFTER_VOICE_KEY: string = 'ccap-voiceInput:autoSendAfterVoice';\n\n/**\n * Voice input composer globális UI állapot — a hang gomb beállítások paneljéből vezérelhető,\n * minden `app-ccap-voice-record-button` kontextusban ugyanaz a döntés érvényesül.\n *\n * REQ-UI-MENU-STATE-001 (cycle 459): a localStorage I/O most a shared\n * `Shr_LocalStoragePersistence_Util.readString / writeString` metódusokra\n * delegál. Az on-disk format (`'true'` / `'false'` literális string) változatlan\n * — szándékosan `writeString(String(value))` a `writeBoolean` (`'1'`/`'0'`)\n * helyett, hogy a meglévő spec round-trip elvárás (`getItem === 'true'`)\n * + a backward-compat felhasználói localStorage értékek konzisztensek\n * maradjanak. A best-effort try/catch most a shared util-ban van. A korábbi\n * top-level `function readAutoSendAfterVoiceFromStorage()` private static\n * methodként került be a class-ba (CLAUDE.md no-top-level-function).\n */\n@Injectable({ providedIn: 'root' })\nexport class VNP_InputUi_DataService {\n\n /** Ha true, a STT transcript után azonnal küldés fut (Mimik-minta); ha false, csak hozzáfűzés a mezőhöz. */\n readonly autoSendAfterVoice_$: WritableSignal<boolean> =\n signal<boolean>(VNP_InputUi_DataService.readAutoSendAfterVoiceFromStorage());\n\n /**\n * „Hang után azonnal\" toggle — signal + localStorage perzisztencia.\n */\n setAutoSendAfterVoice(value: boolean): void {\n this.autoSendAfterVoice_$.set(value);\n Shr_LocalStoragePersistence_Util.writeString(CCAP_VOICE_INPUT_AUTO_SEND_AFTER_VOICE_KEY, String(value));\n }\n\n /**\n * Böngészőből olvassa az „azonnal küldés hang után\" flag-et (default: false).\n */\n private static readAutoSendAfterVoiceFromStorage(): boolean {\n return Shr_LocalStoragePersistence_Util.readString(CCAP_VOICE_INPUT_AUTO_SEND_AFTER_VOICE_KEY) === 'true';\n }\n}\n", "/**\n * STT QA szöveg word-diff szegmens típusa (egyenlő / törölt / új).\n */\nexport enum CCAP_SttQaWordDiffSegmentKind_Type {\n equal = 'equal',\n removed = 'removed',\n added = 'added',\n}\n", "import { CCAP_SttQaWordDiffSegmentKind_Type } from '../../../_enums/voice/ccap-stt-qa-word-diff-segment-kind.enum';\nimport { CCAP_SttQaWordDiffSegment_Interface } from '../../../_models/interfaces/voice/transcribe/ccap-stt-qa-word-diff-segment.interface';\n\ntype CCAP_SttQaWordDiffRawSegment_Interface = {\n kind: CCAP_SttQaWordDiffSegmentKind_Type;\n text: string;\n};\n\n/**\n * STT QA eredeti vs javított szöveg word-token alapú diff (LCS) — modal összefoglaló highlight-hoz.\n */\nexport class CCAP_SttQaTextDiff_Util {\n /**\n * Whitespace-megtartó tokenizálás: szavak és whitespace külön token (LCS egy sorban tartja a szerkezetet).\n */\n private static tokenize(input: string): string[] {\n const trimmed: string = input;\n if (trimmed.length === 0) {\n return [];\n }\n const parts: string[] = trimmed.split(/(\\s+)/);\n const out: string[] = [];\n for (let i: number = 0; i < parts.length; i++) {\n const p: string = parts[i];\n if (p.length > 0) {\n out.push(p);\n }\n }\n return out;\n }\n\n /**\n * Egymás melletti azonos kind szegmensek összefűzése, majd id kiosztás.\n */\n private static mergeAndAssignIds(\n raw: CCAP_SttQaWordDiffRawSegment_Interface[],\n ): CCAP_SttQaWordDiffSegment_Interface[] {\n if (raw.length === 0) {\n return [];\n }\n const merged: CCAP_SttQaWordDiffRawSegment_Interface[] = [];\n for (let i: number = 0; i < raw.length; i++) {\n const cur: CCAP_SttQaWordDiffRawSegment_Interface = raw[i];\n const last: CCAP_SttQaWordDiffRawSegment_Interface | undefined = merged[merged.length - 1];\n if (last !== undefined && last.kind === cur.kind) {\n last.text = last.text + cur.text;\n } else {\n merged.push({ kind: cur.kind, text: cur.text });\n }\n }\n const withIds: CCAP_SttQaWordDiffSegment_Interface[] = [];\n for (let k: number = 0; k < merged.length; k++) {\n const m: CCAP_SttQaWordDiffRawSegment_Interface = merged[k];\n withIds.push({\n id: k,\n kind: m.kind,\n text: m.text,\n });\n }\n return withIds;\n }\n\n /**\n * Word-token LCS diff: unified sor — equal / removed / added szegmensek sorrendben (javított szöveg kontextusához).\n */\n static buildWordDiff(oldText: string, newText: string): CCAP_SttQaWordDiffSegment_Interface[] {\n const a: string[] = CCAP_SttQaTextDiff_Util.tokenize(oldText);\n const b: string[] = CCAP_SttQaTextDiff_Util.tokenize(newText);\n const n: number = a.length;\n const m: number = b.length;\n const dp: number[][] = [];\n for (let i: number = 0; i <= n; i++) {\n const row: number[] = [];\n for (let j: number = 0; j <= m; j++) {\n row.push(0);\n }\n dp.push(row);\n }\n for (let i: number = 1; i <= n; i++) {\n for (let j: number = 1; j <= m; j++) {\n if (a[i - 1] === b[j - 1]) {\n dp[i][j] = dp[i - 1][j - 1] + 1;\n } else {\n const up: number = dp[i - 1][j];\n const left: number = dp[i][j - 1];\n dp[i][j] = up > left ? up : left;\n }\n }\n }\n const rawBackwards: CCAP_SttQaWordDiffRawSegment_Interface[] = [];\n let i: number = n;\n let j: number = m;\n while (i > 0 || j > 0) {\n if (i > 0 && j > 0 && a[i - 1] === b[j - 1]) {\n rawBackwards.push({\n kind: CCAP_SttQaWordDiffSegmentKind_Type.equal,\n text: a[i - 1],\n });\n i -= 1;\n j -= 1;\n } else if (j > 0 && (i === 0 || dp[i][j - 1] >= dp[i - 1][j])) {\n rawBackwards.push({\n kind: CCAP_SttQaWordDiffSegmentKind_Type.added,\n text: b[j - 1],\n });\n j -= 1;\n } else if (i > 0) {\n rawBackwards.push({\n kind: CCAP_SttQaWordDiffSegmentKind_Type.removed,\n text: a[i - 1],\n });\n i -= 1;\n }\n }\n const rawForward: CCAP_SttQaWordDiffRawSegment_Interface[] = [];\n for (let k: number = rawBackwards.length - 1; k >= 0; k--) {\n rawForward.push(rawBackwards[k]);\n }\n return CCAP_SttQaTextDiff_Util.mergeAndAssignIds(rawForward);\n }\n}\n", "import {\n Component,\n OnInit,\n OnDestroy,\n input,\n InputSignal,\n Output,\n EventEmitter,\n inject,\n signal,\n computed,\n HostListener,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport type { CCAP_TranscribeSuccess_Response } from '../../_models/interfaces/voice/transcribe/ccap-transcribe-success-response.interface';\nimport type { CCAP_Transcribe_Response } from '../../_models/interfaces/voice/transcribe/ccap-transcribe-response.interface';\nimport type { CCAP_VoiceNotesQaSettings_Response as CCAP_VoiceNotesQaSettingsResponse_Interface } from '../../_models/interfaces/voice/voice-notes/ccap-voice-notes-qa-settings-response.interface';\nimport type { CCAP_LlmProviderSelectOption_Interface } from '../../_models/interfaces/settings/ccap-llm-provider-select-option.interface';\nimport type {\n Voc_SttQaConfusionMapEntry_Response,\n Voc_SttQaInput_Response,\n} from '../../_models/server-index';\nimport { CCAP_GlobalError_ControlService } from '../../_services/control-services/ccap-global-error.control-service';\nimport { CCAP_SoundRecorder_ControlService } from '../../_services/control-services/ccap-sound-recorder.control-service';\nimport { VNP_SttQaUi_DataService } from '../../_modules/dev/_modules/poc/_modules/voice-notes-poc/_services/vnp-stt-qa-ui.data-service';\nimport { VNP_InputUi_DataService } from '../../_modules/dev/_modules/poc/_modules/voice-notes-poc/_services/vnp-input-ui.data-service';\nimport { CCAP_SoundRecorderState_State } from '../../_enums/ccap-sound-recorder-state.enum';\nimport { CCAP_SoundRecorderChunkMeta_Interface } from '../../_services/control-services/ccap-sound-recorder-chunk-meta.interface';\nimport { CCAP_MediaRecording_Util } from '../../_collections/utils/media-recording/media-recording.util';\nimport { CCAP_SttQaTextDiff_Util } from '../../_collections/utils/model-testing/ccap-stt-qa-text-diff.util';\nimport { CCAP_SttQaWordDiffSegmentKind_Type } from '../../_enums/voice/ccap-stt-qa-word-diff-segment-kind.enum';\nimport { CCAP_SttQaWordDiffSegment_Interface } from '../../_models/interfaces/voice/transcribe/ccap-stt-qa-word-diff-segment.interface';\nimport { S_Modal_Component } from '../../_modules/shared/_components/s-modal/s-modal.component';\n\n/**\n * Beágyazható hangrögzítő gomb: rögzít → STT (és opcionális QA) → transcriptReady emit.\n * Inputokra rakható (pl. chat input felső border közepére).\n */\n@Component({\n selector: 'app-ccap-voice-record-button',\n standalone: true,\n imports: [FormsModule, S_Modal_Component],\n templateUrl: './ccap-voice-record-button.component.html',\n})\n/** CCAP_VoiceRecordButton_Component class. */\nexport class CCAP_VoiceRecordButton_Component implements OnInit, OnDestroy {\n\n private readonly globalError_CS: CCAP_GlobalError_ControlService =\n inject(CCAP_GlobalError_ControlService);\n private readonly soundRecorder_CS: CCAP_SoundRecorder_ControlService =\n inject(CCAP_SoundRecorder_ControlService);\n private readonly voiceSttQaUi_DS: VNP_SttQaUi_DataService =\n inject(VNP_SttQaUi_DataService);\n readonly voiceInputUi_DS: VNP_InputUi_DataService = inject(VNP_InputUi_DataService);\n\n /** STT QA bekapcsolva; ha nincs megadva, a mentett QA beállításból töltjük (GET qa-settings). */\n readonly qaEnabled: InputSignal<boolean | undefined> = input<boolean | undefined>(undefined);\n\n /** Compact layout: beállítás + infó gombok a rekordgomb fölé kerülnek (két oldal helyett). */\n readonly compactLayout: InputSignal<boolean> = input<boolean>(false);\n\n /** Sikeres transcribe után a végső szöveg (corrected vagy transcript). */\n @Output() transcriptReady = new EventEmitter<string>();\n\n /** Szegmens transcribe eredmény: szöveg + isFinal flag (auto-send akkumuláció a consumer-ben). */\n @Output() transcriptSegmentReady = new EventEmitter<{ text: string; isFinal: boolean }>();\n\n /** Felvétel / feldolgozás folyamatban (legalább egy transzkripció fut). */\n readonly busy_$ = signal<boolean>(false);\n /** Párhuzamos transzkripciók száma (mid-recording flush + final flush egyszerre futhat). */\n private pendingTranscriptionCount: number = 0;\n /**\n * Emit-sorrendesítő lánc: a transzkripciók párhuzamosan futnak (sebesség), de a\n * `transcriptReady` + `transcriptSegmentReady` emit-ek szigorúan chunkIndex-sorrendben\n * mennek ki. Enélkül ha egy rövidebb, `isFinal=true` szegmens előbb tér vissza a\n * hosszabb első szegmensnél, a consumer auto-send-je a teljes akkumulálás ELŐTT tüzelhet\n * (BUG-VO-001: 30s+ voice input elejének elvesztése).\n */\n private emitChain: Promise<void> = Promise.resolve();\n /** Hangerő 0..1 (volume gate indikátor). */\n readonly volume_$ = signal<number>(0);\n /** Betöltött QA beállítás qaEnabled (ha nem volt @Input). */\n private readonly isQaEnabledFromSettings_$ = signal<boolean>(false);\n /** Beállítások overlay nyitva. */\n readonly settingsOpen_$ = signal<boolean>(false);\n /** STT QA beállítások (betöltve); null ha még nincs. */\n readonly qaSettings_$ = signal<CCAP_VoiceNotesQaSettingsResponse_Interface | null>(null);\n /** Confusion map a beállításokban szerkesztve. */\n readonly confusionMapList_$ = signal<Voc_SttQaConfusionMapEntry_Response[]>([]);\n /** QA beállítások mentése folyamatban. */\n readonly qaSettingsSaving_$ = signal<boolean>(false);\n /** QA beállítások betöltése folyamatban. */\n readonly qaSettingsLoading_$ = signal<boolean>(false);\n /** STT QA toggle a beállításokban (szinkron isQaEnabledFromSettings-szel mentéskor). */\n settingsQaEnabled: boolean = false;\n /** STT QA provider és modell (beállítások form). */\n qaProviderName: string = '';\n qaModelName: string = '';\n /** LLM provider választó sorok (value + label), LLM settings-szel megegyező címkék. */\n readonly llmProviderSelectOptions_$ = signal<CCAP_LlmProviderSelectOption_Interface[]>([]);\n /** Kiválasztott QA provider modell listája. */\n readonly qaModelsForProvider_$ = signal<string[]>([]);\n /** list-llm-models hibaüzenet (üres = nincs); cloud provider / API hiba. */\n readonly qaModelsListFetchError_$ = signal<string>('');\n /** Utolsó STT QA javítás (eredeti → javított + opcionális magyarázat); null ha nem volt QA. */\n readonly lastQaTransformation_$ = signal<{\n original: string;\n corrected: string;\n explanation?: string;\n input?: Voc_SttQaInput_Response;\n } | null>(null);\n /** QA eredmény (infó) overlay nyitva. */\n readonly infoOpen_$ = signal<boolean>(false);\n /** Hangfelvétel nem elérhető (pl. nem secure context); null ha elérhető. User-facing message (title/aria). */\n readonly mediaUnavailable_$ = signal<string | null>(null);\n\n /** Globál alapértelmezett LLM provider (override jelzéshez). */\n readonly defaultLlmProvider_$ = signal<string>('');\n /** Globál alapértelmezett LLM modell (override jelzéshez). */\n readonly defaultLlmModel_$ = signal<string>('');\n\n /** Hangerő százalék (computed). */\n readonly volumePercent_$ = computed((): number => Math.min(100, this.volume_$() * 250));\n\n /** Modell választó: van lista a szerverről (vagy mentett modell merge). */\n readonly qaShowModelSelect_$ = computed((): boolean => this.qaModelsForProvider_$().length > 0);\n\n /**\n * Utolsó QA futás után a nyers STT és a corrected szöveg eltér — Info gomb vizuális kiemelése (még apró eltérés is).\n */\n readonly lastQaTextWasModified_$ = computed((): boolean => {\n const t: {\n original: string;\n corrected: string;\n explanation?: string;\n input?: Voc_SttQaInput_Response;\n } | null = this.lastQaTransformation_$();\n if (t === null) {\n return false;\n }\n return t.original !== t.corrected;\n });\n\n /**\n * Utolsó QA eredeti vs javított word-diff szegmensek — infó modal tetején highlighted összefoglaló.\n */\n readonly lastQaWordDiffSegments_$ = computed((): CCAP_SttQaWordDiffSegment_Interface[] => {\n const t: {\n original: string;\n corrected: string;\n explanation?: string;\n input?: Voc_SttQaInput_Response;\n } | null = this.lastQaTransformation_$();\n if (t === null || t.original === t.corrected) {\n return [];\n }\n return CCAP_SttQaTextDiff_Util.buildWordDiff(t.original, t.corrected);\n });\n\n /** Template: STT QA diff szegmens kind összehasonlítás. */\n readonly SttQaDiffKind: typeof CCAP_SttQaWordDiffSegmentKind_Type = CCAP_SttQaWordDiffSegmentKind_Type;\n\n /** Globál default provider megjelenített címke. */\n readonly defaultLlmProviderDisplayLabel_$ = computed((): string => {\n const opts: CCAP_LlmProviderSelectOption_Interface[] = this.llmProviderSelectOptions_$();\n const id: string = this.defaultLlmProvider_$().trim();\n if (!id.length) {\n return '';\n }\n const hit: CCAP_LlmProviderSelectOption_Interface | undefined = opts.find(\n (o: CCAP_LlmProviderSelectOption_Interface): boolean => o.value === id,\n );\n return hit?.label ?? id;\n });\n\n /** QA override provider címke (ha nincs az opciók között, nyers id). */\n readonly qaProviderDisplayLabel_$ = computed((): string => {\n const id: string = this.qaProviderName.trim();\n if (!id.length) {\n return '';\n }\n const opts: CCAP_LlmProviderSelectOption_Interface[] = this.llmProviderSelectOptions_$();\n const hit: CCAP_LlmProviderSelectOption_Interface | undefined = opts.find(\n (o: CCAP_LlmProviderSelectOption_Interface): boolean => o.value === id,\n );\n return hit?.label ?? id;\n });\n\n ngOnInit(): void {\n const availability = CCAP_MediaRecording_Util.getMediaRecordingAvailability();\n if (!availability.supported && availability.reason) {\n const reason: string = availability.reason;\n this.mediaUnavailable_$.set(CCAP_MediaRecording_Util.getMediaUnavailableMessage(reason));\n this.globalError_CS.reportErrorOnly({\n message: CCAP_MediaRecording_Util.getMediaUnavailableReportMessage(reason),\n source: 'ccap-voice-record-button',\n });\n }\n this.soundRecorder_CS.setOnChunk((blob: Blob, meta: CCAP_SoundRecorderChunkMeta_Interface): void => {\n void this.onChunk(blob, meta);\n });\n this.soundRecorder_CS.setOnVolume((value: number): void => {\n this.volume_$.set(value);\n });\n this.soundRecorder_CS.setOnError((err: unknown): void => {\n this.globalError_CS.showError(err, 'ccap-voice-record-button');\n });\n }\n\n ngOnDestroy(): void {\n this.soundRecorder_CS.stopListening();\n // Callback-eket NEM töröljük szándékosan:\n // 1. A stopListening aszinkron onstop handler-jének szüksége van az onChunkCb-re az utolsó chunk flush-jához.\n // 2. Ha navigáció történik és új voice-record-button jön létre, annak ngOnInit felülírja a callback-eket.\n // 3. setTimeout-os késleltetett törlés race condition-t okoz: ha az új component ngOnInit hamarabb fut\n // mint a setTimeout (mindig!), az új component callback-jeit is no-op-ra írja → volume indikátor\n // nem mozdul, chunk-ok elvesznek. A singleton service (providedIn: 'root') miatt ez 8 oldalon\n // minden navigáláskor reprodukálható bug.\n }\n\n /** Felvétel indítása vagy leállítása. */\n async toggleRecord(): Promise<void> {\n if (this.mediaUnavailable_$() !== null) {\n return;\n }\n const state: CCAP_SoundRecorderState_State = this.soundRecorder_CS.state_$();\n if (state === CCAP_SoundRecorderState_State.stopped) {\n if (this.qaEnabled() === undefined) {\n await this.loadQaEnabledOnce();\n }\n try {\n await this.soundRecorder_CS.startListening();\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'ccap-voice-record-button');\n }\n } else {\n this.soundRecorder_CS.stopListening();\n }\n }\n\n /** QA beállítás egyszeri betöltése (qaEnabled tárolására). */\n private async loadQaEnabledOnce(): Promise<void> {\n this.isQaEnabledFromSettings_$.set(await this.voiceSttQaUi_DS.fetchQaEnabledFlag());\n }\n\n /**\n * „Hang után azonnali küldés” — Voice Input beállítások panel; globál UI + localStorage.\n */\n handleAutoSendAfterVoiceChange(value: boolean): void {\n this.voiceInputUi_DS.setAutoSendAfterVoice(value);\n }\n\n /** Beállítások overlay megnyitása/bezárása. */\n toggleSettings(): void {\n this.settingsOpen_$.update((v: boolean): boolean => !v);\n if (!this.settingsOpen_$()) {\n return;\n }\n void this.loadQaSettings();\n }\n\n /** QA eredmény (infó) overlay megnyitása/bezárása. */\n toggleInfo(): void {\n this.infoOpen_$.update((v: boolean): boolean => !v);\n }\n\n /** STT QA beállítások betöltése (beállítások megnyitásakor). */\n async loadQaSettings(): Promise<void> {\n this.qaSettingsLoading_$.set(true);\n try {\n const state = await this.voiceSttQaUi_DS.loadSttQaSettingsPanelState();\n const res = state.qa;\n this.qaSettings_$.set(res);\n this.confusionMapList_$.set([...(res.confusionMap ?? [])]);\n this.settingsQaEnabled = res.qaEnabled === true;\n this.isQaEnabledFromSettings_$.set(res.qaEnabled === true);\n this.qaProviderName = res.providerName ?? '';\n this.qaModelName = res.modelName ?? '';\n this.llmProviderSelectOptions_$.set(state.llmProviderSelectOptions);\n this.defaultLlmProvider_$.set(state.defaultLlmProvider);\n this.defaultLlmModel_$.set(state.defaultLlmModel);\n this.qaModelsForProvider_$.set(state.qaModelsForProvider);\n this.qaModelsListFetchError_$.set(state.qaModelsListFetchError);\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'ccap-voice-record-button');\n this.qaSettings_$.set(null);\n this.confusionMapList_$.set([]);\n this.llmProviderSelectOptions_$.set([]);\n this.qaModelsListFetchError_$.set('');\n this.qaModelsForProvider_$.set([]);\n } finally {\n this.qaSettingsLoading_$.set(false);\n }\n }\n\n /** Kiválasztott QA provider modell listájának betöltése. */\n async loadQaModelsForProvider(providerId: string): Promise<void> {\n const out = await this.voiceSttQaUi_DS.fetchLlmModelsListForSttQa(providerId);\n this.qaModelsForProvider_$.set(out.models);\n this.qaModelsListFetchError_$.set(out.errorMessage);\n }\n\n /** QA provider megváltozott: modell lista újratöltése. */\n onQaProviderChange(): void {\n void this.loadQaModelsForProvider(this.qaProviderName);\n this.qaModelName = '';\n }\n\n /** Új confusion map sor hozzáadása. */\n addConfusionEntry(): void {\n this.confusionMapList_$.update(\n (list: Voc_SttQaConfusionMapEntry_Response[]): Voc_SttQaConfusionMapEntry_Response[] =>\n [...list, { from: '', to: '' }],\n );\n }\n\n /** Confusion map sor törlése. */\n removeConfusionEntry(index: number): void {\n this.confusionMapList_$.update(\n (list: Voc_SttQaConfusionMapEntry_Response[]): Voc_SttQaConfusionMapEntry_Response[] =>\n list.filter((_: Voc_SttQaConfusionMapEntry_Response, i: number): boolean => i !== index),\n );\n }\n\n /** Confusion map sor „from” mezőjének frissítése. */\n updateConfusionFrom(index: number, value: string): void {\n this.confusionMapList_$.update(\n (list: Voc_SttQaConfusionMapEntry_Response[]): Voc_SttQaConfusionMapEntry_Response[] => {\n const next: Voc_SttQaConfusionMapEntry_Response[] = [...list];\n if (next[index]) {\n next[index] = { from: value, to: next[index].to };\n }\n return next;\n },\n );\n }\n\n /** Confusion map sor „to” mezőjének frissítése. */\n updateConfusionTo(index: number, value: string): void {\n this.confusionMapList_$.update(\n (list: Voc_SttQaConfusionMapEntry_Response[]): Voc_SttQaConfusionMapEntry_Response[] => {\n const next: Voc_SttQaConfusionMapEntry_Response[] = [...list];\n if (next[index]) {\n next[index] = { from: next[index].from, to: value };\n }\n return next;\n },\n );\n }\n\n /** QA beállítások mentése a szerverre. */\n async saveQaSettings(): Promise<void> {\n this.qaSettingsSaving_$.set(true);\n try {\n const list: Voc_SttQaConfusionMapEntry_Response[] =\n this.voiceSttQaUi_DS.normalizeConfusionMapEntries(this.confusionMapList_$());\n\n await this.voiceSttQaUi_DS.saveVoiceNotesQaSettings({\n confusionMap: list,\n providerName: this.qaProviderName.trim() || undefined,\n modelName: this.qaModelName.trim() || undefined,\n qaEnabled: this.settingsQaEnabled,\n });\n this.confusionMapList_$.set([...list]);\n this.isQaEnabledFromSettings_$.set(this.settingsQaEnabled);\n const current = this.qaSettings_$();\n if (current !== null) {\n this.qaSettings_$.set({\n systemPrompt: current.systemPrompt,\n userPromptTemplate: current.userPromptTemplate,\n confusionMap: list,\n providerName: this.qaProviderName.trim() || '',\n modelName: this.qaModelName.trim() || '',\n qaEnabled: this.settingsQaEnabled,\n });\n }\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'ccap-voice-record-button');\n } finally {\n this.qaSettingsSaving_$.set(false);\n }\n }\n\n /** Escape: beállítások és QA eredmény overlay bezárása. */\n @HostListener('document:keydown.escape')\n onEscape(): void {\n if (this.settingsOpen_$()) {\n this.settingsOpen_$.set(false);\n }\n if (this.infoOpen_$()) {\n this.infoOpen_$.set(false);\n }\n }\n\n private readonly effectiveQaEnabled_$ = computed((): boolean => {\n if (this.qaEnabled() !== undefined) {\n return this.qaEnabled()!;\n }\n return this.isQaEnabledFromSettings_$();\n });\n\n /**\n * Chunk megérkezett: transcribe párhuzamosan, emit szigorúan chunkIndex-sorrendben.\n *\n * Sorrend-garancia: minden `onChunk` hívás captolja a korábbi `emitChain`-t, és a saját\n * új Promise-ét kiköti rá; a transzkripció azonnal indul (párhuzam megtartva), de az emit\n * csak a `prevEmitQueue` lejárta után történik. Ezzel az `isFinal=true` szegmens emit-je\n * mindig a korábbi (non-final) szegmensek emit-je UTÁN megy ki, akkor is, ha hamarabb\n * végez a transzkripcióval.\n */\n private async onChunk(\n blob: Blob,\n meta: CCAP_SoundRecorderChunkMeta_Interface,\n ): Promise<void> {\n this.pendingTranscriptionCount++;\n this.busy_$.set(true);\n // Emit-slot foglalás: captoljuk a korábbi láncot, és saját Promise-szal hosszabbítjuk.\n // A `releaseEmitSlot` a finally blokkban kell minden ágon lefusson, különben a következő\n // szegmens emit-je örökre blokkolódik.\n const prevEmitQueue: Promise<void> = this.emitChain;\n let releaseEmitSlot: () => void = () => {};\n this.emitChain = new Promise<void>((resolve: () => void) => {\n releaseEmitSlot = resolve;\n });\n try {\n const res: CCAP_Transcribe_Response = await this.voiceSttQaUi_DS.transcribeVoiceChunk({\n blob: blob,\n mimeType: meta.mimeType,\n filename: meta.filename,\n qaEnabled: this.effectiveQaEnabled_$(),\n noteContext: '',\n skipClassification: true,\n });\n // Várjunk a korábbi chunk-ok emit-jeinek befejeződésére, mielőtt mi emitelünk.\n // Transzkripció már megtörtént — csak az emit van sorrendesítve.\n await prevEmitQueue;\n if (res.ok === false) {\n // non_speech: a szegmensben nem volt felismerhető beszéd — nem hiba, de jelezzük a consumer-nek\n // hogy a szegmens feldolgozódott (isFinal propagálás a soron következő szegmensekhez).\n this.transcriptSegmentReady.emit({ text: '', isFinal: meta.isFinal });\n return;\n }\n const success: CCAP_TranscribeSuccess_Response = res;\n if (success.qaFailed === true) {\n const qfm: string = success.qaFailureMessage?.trim() ?? '';\n if (qfm.length > 0) {\n this.globalError_CS.showError(new Error(qfm), 'voice-stt-qa');\n }\n }\n const text: string =\n (success.correctedTranscript != null && success.correctedTranscript.trim().length > 0)\n ? success.correctedTranscript.trim()\n : (success.transcript ?? '').trim();\n // Csak usedQa=true eseten frissitjuk — parhuzamos chunk-oknal a QA nelkuli chunk ne torolje\n // az elozo chunk QA eredmenyet. \"Utolso QA eredmeny\" = utolso QA-t hasznalo chunk eredmenye.\n if (\n success.usedQa === true\n && (success.transcript ?? '').trim().length > 0\n && (success.correctedTranscript ?? '').trim().length > 0\n ) {\n this.lastQaTransformation_$.set({\n original: (success.transcript ?? '').trim(),\n corrected: (success.correctedTranscript ?? '').trim(),\n explanation: (success.qaExplanation ?? '').trim() || undefined,\n input: success.qaInput,\n });\n }\n if (text) {\n this.transcriptReady.emit(text);\n this.transcriptSegmentReady.emit({ text: text, isFinal: meta.isFinal });\n }\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'ccap-voice-record-button');\n } finally {\n // Emit-slot mindig fel kell oldani — különben a következő chunk emit-je blokkolódik.\n releaseEmitSlot();\n this.pendingTranscriptionCount--;\n if (this.pendingTranscriptionCount <= 0) {\n this.pendingTranscriptionCount = 0;\n this.busy_$.set(false);\n }\n }\n }\n\n /** Felvétel állapot (gomb szöveghez). */\n readonly recordStateLabel_$ = computed(\n (): string =>\n this.soundRecorder_CS.state_$() === CCAP_SoundRecorderState_State.stopped\n ? 'Felvétel'\n : 'Stop',\n );\n\n readonly isRecordActive_$ = computed((): boolean => {\n const s: CCAP_SoundRecorderState_State = this.soundRecorder_CS.state_$();\n return (\n s === CCAP_SoundRecorderState_State.standby\n || s === CCAP_SoundRecorderState_State.running\n );\n });\n\n readonly isRecording_$ = computed(\n (): boolean => this.soundRecorder_CS.state_$() === CCAP_SoundRecorderState_State.running,\n );\n\n /** Felvétel gomb aria-label: felvétel közben „Stop\"; feldolgozás alatt a gomb új felvételt indít (REQ-VO-002). */\n readonly recordButtonAriaLabel_$ = computed((): string => {\n const unavail: string | null = this.mediaUnavailable_$();\n if (unavail) return unavail;\n if (this.isRecordActive_$()) return 'Stop';\n return this.busy_$() ? 'Új felvétel (feldolgozás folyamatban)' : 'Felvétel';\n });\n\n /** Felvétel gomb title (tooltip): ugyanaz mint aria-label; feldolgozás alatt explicit utalás, hogy új felvétel indítható. */\n readonly recordButtonTitle_$ = computed((): string => {\n const unavail: string | null = this.mediaUnavailable_$();\n if (unavail) return unavail;\n if (this.isRecordActive_$()) return 'Stop';\n return this.busy_$() ? 'Új felvétel — előző feldolgozás folyamatban' : 'Felvétel';\n });\n}\n", "@if (compactLayout()) {\n <!-- Compact layout: beállítás + infó gombok a rekordgomb FÖLÉ -->\n <div class=\"flex flex-col items-center gap-1\">\n <div class=\"flex items-center gap-2\">\n <button type=\"button\"\n (click)=\"toggleSettings(); $event.stopPropagation()\"\n class=\"w-5 h-5 rounded-full flex items-center justify-center\n bg-neutral-900 border-2 border-neonDefault text-neonCyan\n hover:border-neonCyan hover:shadow-neon-glow-cyan transition-all duration-200\n focus:outline-none focus:ring-2 focus:ring-neonCyan focus:ring-offset-2 focus:ring-offset-neutral-900\"\n aria-label=\"Beállítások\"\n title=\"Beállítások\">\n <svg class=\"w-2.5 h-2.5 shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6Z\" />\n <path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z\" />\n </svg>\n </button>\n <button type=\"button\"\n (click)=\"toggleInfo(); $event.stopPropagation()\"\n class=\"w-5 h-5 rounded-full flex items-center justify-center\n bg-neutral-900 border-2 transition-all duration-200\n focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-neutral-900\"\n [class.border-neonDefault]=\"!lastQaTextWasModified_$()\"\n [class.text-neonCyan]=\"!lastQaTextWasModified_$()\"\n [class.hover:border-neonCyan]=\"!lastQaTextWasModified_$()\"\n [class.hover:shadow-neon-glow-cyan]=\"!lastQaTextWasModified_$()\"\n [class.focus:ring-neonCyan]=\"!lastQaTextWasModified_$()\"\n [class.border-neonAmber]=\"lastQaTextWasModified_$()\"\n [class.text-neonAmber]=\"lastQaTextWasModified_$()\"\n [class.shadow-neon-glow-orange]=\"lastQaTextWasModified_$()\"\n [class.hover:border-neonAmber]=\"lastQaTextWasModified_$()\"\n [class.hover:shadow-neon-glow-orange]=\"lastQaTextWasModified_$()\"\n [class.focus:ring-neonAmber]=\"lastQaTextWasModified_$()\"\n [attr.aria-label]=\"lastQaTextWasModified_$()\n ? 'Utolsó QA eredmény — a szöveg módosult'\n : 'Utolsó QA eredmény'\"\n [attr.title]=\"lastQaTextWasModified_$()\n ? 'Utolsó QA eredmény — a szöveg módosult (részletek)'\n : 'Utolsó QA eredmény'\">\n <svg class=\"w-2.5 h-2.5 shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 16v-4\" />\n <path d=\"M12 8h.01\" />\n </svg>\n </button>\n </div>\n <button type=\"button\"\n (click)=\"toggleRecord()\"\n [disabled]=\"mediaUnavailable_$() !== null\"\n class=\"flex items-center justify-center min-w-[44px] min-h-[44px] w-10 h-10 rounded-full shrink-0\n bg-neutral-900 border-2 text-white transition-all duration-200 disabled:opacity-50\n border-neonDefault hover:border-neonCyan hover:shadow-neon-glow-cyan\n focus:outline-none focus:ring-2 focus:ring-neonCyan focus:ring-offset-2 focus:ring-offset-neutral-900\"\n [class.border-neonCyan]=\"isRecordActive_$() || busy_$()\"\n [class.shadow-neon-glow-cyan]=\"isRecordActive_$() || busy_$()\"\n [class.animate-pulse]=\"isRecording_$()\"\n [attr.aria-label]=\"recordButtonAriaLabel_$()\"\n [attr.title]=\"recordButtonTitle_$()\">\n @if (busy_$() && !isRecordActive_$()) {\n <span class=\"inline-block w-5 h-5 shrink-0 animate-spin rounded-full border-2 border-neonCyan/40 border-t-neonCyan\"\n aria-hidden=\"true\"></span>\n } @else {\n <div class=\"flex flex-col items-center gap-0.5 shrink-0\">\n @if (isRecordActive_$()) {\n <div class=\"relative w-2 h-6 rounded-sm bg-neutral-800 overflow-hidden\"\n aria-hidden=\"true\">\n <div class=\"absolute inset-x-0 bottom-0 bg-neonCyan transition-[height] duration-75\"\n [style.height.%]=\"volumePercent_$()\"></div>\n <div class=\"absolute inset-x-0 h-0.5 bg-neonAmber rounded-sm z-10\"\n style=\"bottom: 5%;\"></div>\n </div>\n }\n <svg class=\"w-5 h-5 shrink-0 text-neonCyan\"\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M12 2a3 3 0 0 1 3 3v7a3 3 0 0 1-6 0V5a3 3 0 0 1 3-3Z\" />\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\" />\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"22\" />\n </svg>\n </div>\n }\n </button>\n @if (mediaUnavailable_$(); as reason) {\n <!-- REQ-UI-VHTTPS-001: látható warning-blokk, ha nincs secure context / nem elérhető a mikrofon. -->\n <p class=\"text-[11px] text-amber-300 leading-tight max-w-[180px] text-center\"\n [attr.aria-live]=\"'polite'\">\n <span aria-hidden=\"true\" class=\"mr-1\">⚠</span>{{ reason }}\n </p>\n }\n </div>\n} @else {\n <!-- Default layout: beállítás balra, rekordgomb középen, infó jobbra (absolute) -->\n <div class=\"relative inline-flex\">\n <button type=\"button\"\n (click)=\"toggleRecord()\"\n [disabled]=\"mediaUnavailable_$() !== null\"\n class=\"flex items-center justify-center min-w-[44px] min-h-[44px] w-10 h-10 rounded-full shrink-0\n bg-neutral-900 border-2 text-white transition-all duration-200 disabled:opacity-50\n border-neonDefault hover:border-neonCyan hover:shadow-neon-glow-cyan\n focus:outline-none focus:ring-2 focus:ring-neonCyan focus:ring-offset-2 focus:ring-offset-neutral-900\"\n [class.border-neonCyan]=\"isRecordActive_$() || busy_$()\"\n [class.shadow-neon-glow-cyan]=\"isRecordActive_$() || busy_$()\"\n [class.animate-pulse]=\"isRecording_$()\"\n [attr.aria-label]=\"recordButtonAriaLabel_$()\"\n [attr.title]=\"recordButtonTitle_$()\">\n @if (busy_$() && !isRecordActive_$()) {\n <span class=\"inline-block w-5 h-5 shrink-0 animate-spin rounded-full border-2 border-neonCyan/40 border-t-neonCyan\"\n aria-hidden=\"true\"></span>\n } @else {\n <div class=\"flex flex-col items-center gap-0.5 shrink-0\">\n @if (isRecordActive_$()) {\n <div class=\"relative w-2 h-6 rounded-sm bg-neutral-800 overflow-hidden\"\n aria-hidden=\"true\">\n <div class=\"absolute inset-x-0 bottom-0 bg-neonCyan transition-[height] duration-75\"\n [style.height.%]=\"volumePercent_$()\"></div>\n <div class=\"absolute inset-x-0 h-0.5 bg-neonAmber rounded-sm z-10\"\n style=\"bottom: 5%;\"></div>\n </div>\n }\n <svg class=\"w-5 h-5 shrink-0 text-neonCyan\"\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M12 2a3 3 0 0 1 3 3v7a3 3 0 0 1-6 0V5a3 3 0 0 1 3-3Z\" />\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\" />\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"22\" />\n </svg>\n </div>\n }\n </button>\n <button type=\"button\"\n (click)=\"toggleSettings(); $event.stopPropagation()\"\n class=\"absolute right-full mr-4 top-1/2 -translate-y-1/2 w-5 h-5 rounded-full flex items-center justify-center\n bg-neutral-900 border-2 border-neonDefault text-neonCyan\n hover:border-neonCyan hover:shadow-neon-glow-cyan transition-all duration-200\n focus:outline-none focus:ring-2 focus:ring-neonCyan focus:ring-offset-2 focus:ring-offset-neutral-900\"\n aria-label=\"Beállítások\"\n title=\"Beállítások\">\n <svg class=\"w-2.5 h-2.5 shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6Z\" />\n <path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z\" />\n </svg>\n </button>\n <button type=\"button\"\n (click)=\"toggleInfo(); $event.stopPropagation()\"\n class=\"absolute left-full ml-4 top-1/2 -translate-y-1/2 w-5 h-5 rounded-full flex items-center justify-center\n bg-neutral-900 border-2 transition-all duration-200\n focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-neutral-900\"\n [class.border-neonDefault]=\"!lastQaTextWasModified_$()\"\n [class.text-neonCyan]=\"!lastQaTextWasModified_$()\"\n [class.hover:border-neonCyan]=\"!lastQaTextWasModified_$()\"\n [class.hover:shadow-neon-glow-cyan]=\"!lastQaTextWasModified_$()\"\n [class.focus:ring-neonCyan]=\"!lastQaTextWasModified_$()\"\n [class.border-neonAmber]=\"lastQaTextWasModified_$()\"\n [class.text-neonAmber]=\"lastQaTextWasModified_$()\"\n [class.shadow-neon-glow-orange]=\"lastQaTextWasModified_$()\"\n [class.hover:border-neonAmber]=\"lastQaTextWasModified_$()\"\n [class.hover:shadow-neon-glow-orange]=\"lastQaTextWasModified_$()\"\n [class.focus:ring-neonAmber]=\"lastQaTextWasModified_$()\"\n [attr.aria-label]=\"lastQaTextWasModified_$()\n ? 'Utolsó QA eredmény — a szöveg módosult'\n : 'Utolsó QA eredmény'\"\n [attr.title]=\"lastQaTextWasModified_$()\n ? 'Utolsó QA eredmény — a szöveg módosult (részletek)'\n : 'Utolsó QA eredmény'\">\n <svg class=\"w-2.5 h-2.5 shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 16v-4\" />\n <path d=\"M12 8h.01\" />\n </svg>\n </button>\n </div>\n @if (mediaUnavailable_$(); as reason) {\n <!-- REQ-UI-VHTTPS-001: látható warning-blokk, ha nincs secure context / nem elérhető a mikrofon. -->\n <p class=\"text-[11px] text-amber-300 leading-tight max-w-[240px] mt-1\"\n [attr.aria-live]=\"'polite'\">\n <span aria-hidden=\"true\" class=\"mr-1\">⚠</span>{{ reason }}\n </p>\n }\n}\n\n<app-s-modal [isOpen]=\"settingsOpen_$()\"\n [title]=\"'Voice Input beállítások'\"\n [maxWidth]=\"'lg'\"\n [zIndex]=\"'40'\"\n [bodyFlexColumn]=\"true\"\n (closed)=\"settingsOpen_$.set(false)\">\n <!-- Teljes body egy scroll region: mobil-on a hosszú promptok nem lógnak ki a max-h-[90vh] panel alól. -->\n <div class=\"flex flex-col flex-1 min-h-0 w-full overflow-y-auto overflow-x-hidden overscroll-y-contain\">\n <div class=\"flex flex-col gap-2 shrink-0\">\n <label class=\"flex items-center gap-2 cursor-pointer select-none\">\n <input type=\"checkbox\" [(ngModel)]=\"settingsQaEnabled\" name=\"settingsQaEnabled\" />\n <span class=\"text-sm text-neutral-300\">STT QA</span>\n </label>\n <label class=\"flex items-center gap-2 cursor-pointer select-none\">\n <input type=\"checkbox\"\n name=\"autoSendAfterVoice\"\n [ngModel]=\"voiceInputUi_DS.autoSendAfterVoice_$()\"\n (ngModelChange)=\"handleAutoSendAfterVoiceChange($event)\" />\n <span class=\"text-sm text-neutral-300\">Send immediately after voice (Mimik-style)</span>\n </label>\n </div>\n\n @if (qaSettings_$(); as qaSettings) {\n <div class=\"mt-3 pt-3 border-t border-neonDefault flex flex-col gap-3 shrink-0\">\n <div class=\"shrink-0\">\n <p class=\"text-xs font-medium text-neutral-400 mb-1\">System prompt (LLM-nek)</p>\n <p class=\"text-xs text-neutral-300 whitespace-pre-wrap break-words\">{{ qaSettings.systemPrompt }}</p>\n </div>\n <div class=\"shrink-0\">\n <p class=\"text-xs font-medium text-neutral-400 mb-1\">\n User prompt sablon (ide fűződik be a felvétel adata)\n </p>\n <p class=\"text-xs text-neutral-300 whitespace-pre-wrap break-words font-mono\">\n {{ qaSettings.userPromptTemplate }}\n </p>\n <p class=\"text-[10px] text-neonAmber mt-1\">\n Placeholderek: {{ '{{TRANSCRIPT}}' }} = nyers szöveg, {{ '{{NOTE_CONTEXT}}' }} = jegyzet,\n {{ '{{CONFUSION_MAP}}' }} = az alábbi elírás lista JSON-ban.\n </p>\n </div>\n <div class=\"shrink-0\">\n <p class=\"text-xs font-medium text-neutral-400 mb-1\">STT QA provider és modell</p>\n @if (qaProviderName.trim()) {\n <p class=\"text-[10px] text-neutral-500 mb-1\">\n Override: {{ qaProviderDisplayLabel_$() }} / {{ qaModelName || '—' }}\n (globál: {{ defaultLlmProviderDisplayLabel_$() || '—' }} / {{ defaultLlmModel_$() || '—' }}).\n </p>\n } @else {\n <p class=\"text-[10px] text-neutral-500 mb-1\">\n Nincs beállítva – használt: {{ defaultLlmProviderDisplayLabel_$() || '—' }} /\n {{ defaultLlmModel_$() || '—' }} (globál).\n </p>\n }\n <div class=\"flex flex-wrap gap-2 items-center\">\n <select [(ngModel)]=\"qaProviderName\"\n (ngModelChange)=\"onQaProviderChange()\"\n name=\"qaProviderName\"\n class=\"px-2 py-1 text-xs bg-neutral-800 border border-neonDefault rounded text-neutral-200 min-w-[120px]\">\n <option value=\"\">— default —</option>\n @for (opt of llmProviderSelectOptions_$(); track opt.value) {\n <option [value]=\"opt.value\">{{ opt.label }}</option>\n }\n </select>\n @if (qaShowModelSelect_$()) {\n <select [(ngModel)]=\"qaModelName\"\n name=\"qaModelName\"\n class=\"px-2 py-1 text-xs bg-neutral-800 border border-neonDefault rounded text-neutral-200 min-w-[140px]\">\n <option value=\"\">— default —</option>\n @for (m of qaModelsForProvider_$(); track m) {\n <option [value]=\"m\">{{ m }}</option>\n }\n </select>\n } @else {\n <input type=\"text\"\n [(ngModel)]=\"qaModelName\"\n name=\"qaModelNameText\"\n placeholder=\"Modell id (lista nem elérhető ehhez a providerhez)\"\n class=\"px-2 py-1 text-xs bg-neutral-800 border border-neonDefault rounded text-neutral-200 min-w-[140px] font-mono\" />\n }\n </div>\n @if (qaModelsListFetchError_$().trim()) {\n <p class=\"text-[10px] text-amber-300/90 mt-1\">{{ qaModelsListFetchError_$() }}</p>\n }\n </div>\n <div class=\"flex flex-col shrink-0\">\n <p class=\"text-xs font-medium text-neutral-400 mb-1 shrink-0\">\n Tipikus elírások / tipók (confusion map) – ezekre javít a QA\n </p>\n <div class=\"space-y-1.5 rounded border border-neonDefault/50 bg-neutral-800/20 p-2\">\n @for (entry of confusionMapList_$(); track $index; let i = $index) {\n <div class=\"flex items-center gap-2\">\n <input type=\"text\"\n [value]=\"entry.from\"\n (input)=\"updateConfusionFrom(i, $any($event.target).value)\"\n placeholder=\"Elírás / félrehallás\"\n class=\"flex-1 min-w-0 px-2 py-1 text-xs bg-neutral-800 border border-neonDefault rounded\n text-neutral-200 placeholder-neutral-500\" />\n <span class=\"text-neutral-500 shrink-0\">→</span>\n <input type=\"text\"\n [value]=\"entry.to\"\n (input)=\"updateConfusionTo(i, $any($event.target).value)\"\n placeholder=\"Helyes forma\"\n class=\"flex-1 min-w-0 px-2 py-1 text-xs bg-neutral-800 border border-neonDefault rounded\n text-neutral-200 placeholder-neutral-500\" />\n <button type=\"button\"\n (click)=\"removeConfusionEntry(i)\"\n class=\"shrink-0 p-1 text-neutral-500 hover:text-neonRed transition-colors\"\n aria-label=\"Sor törlése\"\n title=\"Sor törlése\">\n <span class=\"sr-only\">Törlés</span>\n <svg class=\"w-3.5 h-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </svg>\n </button>\n </div>\n }\n </div>\n <div class=\"flex flex-wrap gap-2 items-center shrink-0 mt-2\">\n <button type=\"button\"\n (click)=\"addConfusionEntry()\"\n class=\"px-2 py-1 text-xs border border-neonDefault rounded text-neutral-400\n hover:border-neonCyan hover:text-neonCyan transition-colors\">\n + Sor hozzáadása\n </button>\n <button type=\"button\"\n (click)=\"saveQaSettings()\"\n [disabled]=\"qaSettingsSaving_$()\"\n class=\"px-2 py-1 text-xs border border-neonCyan rounded text-neonCyan\n hover:shadow-neon-glow-cyan disabled:opacity-50 transition-colors\">\n {{ qaSettingsSaving_$() ? 'Mentés…' : 'QA beállítások mentése' }}\n </button>\n </div>\n </div>\n </div>\n } @else if (qaSettingsLoading_$()) {\n <p class=\"mt-3 pt-3 border-t border-neonDefault text-xs text-neutral-400\">QA beállítások betöltése…</p>\n } @else {\n <p class=\"mt-3 pt-3 border-t border-neonDefault text-xs text-neutral-500\">\n A QA beállítások betöltése sikertelen.\n </p>\n <button type=\"button\"\n (click)=\"loadQaSettings()\"\n class=\"mt-1.5 px-2 py-1 text-xs border border-neonDefault rounded text-neutral-400\n hover:border-neonCyan hover:text-neonCyan transition-colors\">\n Újra betöltés\n </button>\n }\n </div>\n <div modal-footer class=\"shrink-0 px-4 py-3 border-t border-neonDefault\">\n <button type=\"button\"\n class=\"w-full px-3 py-1.5 text-sm border border-neonCyan rounded text-neutral-300\n hover:shadow-neon-glow-cyan transition-colors\"\n (click)=\"settingsOpen_$.set(false)\">\n Bezárás\n </button>\n </div>\n</app-s-modal>\n\n<app-s-modal [isOpen]=\"infoOpen_$()\"\n [title]=\"'Utolsó QA eredmény'\"\n [maxWidth]=\"'md'\"\n [zIndex]=\"'40'\"\n (closed)=\"infoOpen_$.set(false)\">\n @if (lastQaTransformation_$(); as qa) {\n <div class=\"space-y-2 text-sm\">\n @if (lastQaWordDiffSegments_$().length > 0) {\n <div class=\"rounded-md border border-neonAmber/45 bg-neutral-950/95 p-2.5 mb-1\">\n <p class=\"text-[10px] font-semibold uppercase tracking-wide text-neonAmber/90 mb-1.5\">\n Változások (kiemelve)\n </p>\n <p class=\"text-xs leading-relaxed whitespace-pre-wrap break-words\">\n @for (seg of lastQaWordDiffSegments_$(); track seg.id) {\n @if (seg.kind === SttQaDiffKind.equal) {\n <span class=\"text-neutral-300\">{{ seg.text }}</span>\n } @else if (seg.kind === SttQaDiffKind.removed) {\n <span class=\"mx-0.5 inline rounded px-0.5 text-red-300/95 line-through decoration-red-400/85\n bg-red-950/50 border border-red-900/45\">{{ seg.text }}</span>\n } @else {\n <span class=\"mx-0.5 inline rounded px-0.5 text-neonAmber bg-amber-950/55 border border-neonAmber/50\n shadow-[0_0_10px_rgb(251_191_36/0.28)]\">{{ seg.text }}</span>\n }\n }\n </p>\n <p class=\"text-[10px] text-neutral-500 mt-1.5 leading-snug\">\n Áthúzva: nyers STT; kiemelve: javított szöveg. Alább a teljes két változat.\n </p>\n </div>\n }\n <p class=\"font-medium text-neonAmber\">Volt módosítás: igen.</p>\n <p class=\"text-neutral-400 text-xs\">Eredeti (nyers STT):</p>\n <p class=\"text-neutral-200 break-words\">{{ qa.original }}</p>\n <p class=\"text-neutral-400 text-xs mt-2\">Javított:</p>\n <p class=\"text-neutral-200 break-words\">{{ qa.corrected }}</p>\n @if (qa.explanation) {\n <p class=\"text-neutral-400 text-xs mt-2\">Magyarázat:</p>\n <p class=\"text-neutral-300 break-words\">{{ qa.explanation }}</p>\n }\n </div>\n } @else {\n <p class=\"text-xs text-neutral-500\">\n Még nem volt STT QA javítás.\n </p>\n }\n <div modal-footer class=\"shrink-0 px-4 py-3 border-t border-neonDefault\">\n <button type=\"button\"\n class=\"w-full px-3 py-1.5 text-sm border border-neonCyan rounded text-neutral-300\n hover:shadow-neon-glow-cyan transition-colors\"\n (click)=\"infoOpen_$.set(false)\">\n Bezárás\n </button>\n </div>\n</app-s-modal>\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["CCAP_VOICE_INPUT_AUTO_SEND_AFTER_VOICE_KEY", "VNP_InputUi_DataService", "autoSendAfterVoice_$", "signal", "readAutoSendAfterVoiceFromStorage", "setAutoSendAfterVoice", "value", "set", "Shr_LocalStoragePersistence_Util", "writeString", "String", "readString", "factory", "\u0275fac", "providedIn", "CCAP_SttQaWordDiffSegmentKind_Type", "CCAP_SttQaTextDiff_Util", "tokenize", "input", "trimmed", "length", "parts", "split", "out", "i", "p", "push", "mergeAndAssignIds", "raw", "merged", "cur", "last", "undefined", "kind", "text", "withIds", "k", "m", "id", "buildWordDiff", "oldText", "newText", "a", "b", "n", "dp", "row", "j", "up", "left", "rawBackwards", "CCAP_SttQaWordDiffSegmentKind_Type", "equal", "added", "removed", "rawForward", "\u0275\u0275element", "\u0275\u0275elementStart", "\u0275\u0275elementEnd", "\u0275\u0275advance", "\u0275\u0275styleProp", "ctx_r1", "volumePercent_$", "\u0275\u0275template", "CCAP_VoiceRecordButton_Component_Conditional_0_Conditional_13_Conditional_1_Template", "\u0275\u0275conditional", "isRecordActive_$", "\u0275\u0275text", "\u0275\u0275textInterpolate1", "ctx", "\u0275\u0275listener", "$event", "i0", "\u0275\u0275restoreView", "_r1", "\u0275\u0275nextContext", "toggleSettings", "\u0275\u0275resetView", "stopPropagation", "toggleInfo", "toggleRecord", "CCAP_VoiceRecordButton_Component_Conditional_0_Conditional_12_Template", "CCAP_VoiceRecordButton_Component_Conditional_0_Conditional_13_Template", "CCAP_VoiceRecordButton_Component_Conditional_0_Conditional_14_Template", "\u0275\u0275classProp", "lastQaTextWasModified_$", "busy_$", "isRecording_$", "\u0275\u0275property", "mediaUnavailable_$", "tmp_21_0", "CCAP_VoiceRecordButton_Component_Conditional_1_Conditional_3_Conditional_1_Template", "_r3", "CCAP_VoiceRecordButton_Component_Conditional_1_Conditional_2_Template", "CCAP_VoiceRecordButton_Component_Conditional_1_Conditional_3_Template", "CCAP_VoiceRecordButton_Component_Conditional_1_Conditional_13_Template", "\u0275\u0275textInterpolate4", "qaProviderDisplayLabel_$", "qaModelName", "defaultLlmProviderDisplayLabel_$", "defaultLlmModel_$", "\u0275\u0275textInterpolate2", "opt_r5", "value", "\u0275\u0275textInterpolate", "label", "m_r7", "\u0275\u0275twoWayListener", "_r6", "\u0275\u0275twoWayBindingSet", "\u0275\u0275repeaterCreate", "CCAP_VoiceRecordButton_Component_Conditional_13_Conditional_24_For_4_Template", "\u0275\u0275repeaterTrackByIdentity", "\u0275\u0275twoWayProperty", "\u0275\u0275repeater", "qaModelsForProvider_$", "_r8", "qaModelsListFetchError_$", "\u0275$index_195_r10", "_r9", "$index", "updateConfusionFrom", "target", "updateConfusionTo", "removeConfusionEntry", "entry_r11", "from", "to", "CCAP_VoiceRecordButton_Component_Conditional_13_Conditional_16_Template", "CCAP_VoiceRecordButton_Component_Conditional_13_Conditional_17_Template", "_r4", "qaProviderName", "onQaProviderChange", "CCAP_VoiceRecordButton_Component_Conditional_13_For_23_Template", "_forTrack0", "CCAP_VoiceRecordButton_Component_Conditional_13_Conditional_24_Template", "CCAP_VoiceRecordButton_Component_Conditional_13_Conditional_25_Template", "CCAP_VoiceRecordButton_Component_Conditional_13_Conditional_26_Template", "CCAP_VoiceRecordButton_Component_Conditional_13_For_32_Template", "\u0275\u0275repeaterTrackByIndex", "addConfusionEntry", "saveQaSettings", "qaSettings_r12", "systemPrompt", "userPromptTemplate", "\u0275\u0275textInterpolate3", "trim", "llmProviderSelectOptions_$", "qaShowModelSelect_$", "confusionMapList_$", "qaSettingsSaving_$", "_r13", "loadQaSettings", "seg_r14", "text", "CCAP_VoiceRecordButton_Component_Conditional_20_Conditional_1_For_5_Conditional_0_Template", "CCAP_VoiceRecordButton_Component_Conditional_20_Conditional_1_For_5_Conditional_1_Template", "CCAP_VoiceRecordButton_Component_Conditional_20_Conditional_1_For_5_Conditional_2_Template", "kind", "SttQaDiffKind", "equal", "removed", "CCAP_VoiceRecordButton_Component_Conditional_20_Conditional_1_For_5_Template", "_forTrack1", "lastQaWordDiffSegments_$", "qa_r15", "explanation", "CCAP_VoiceRecordButton_Component_Conditional_20_Conditional_1_Template", "CCAP_VoiceRecordButton_Component_Conditional_20_Conditional_12_Template", "length", "original", "corrected", "CCAP_VoiceRecordButton_Component", "globalError_CS", "inject", "CCAP_GlobalError_ControlService", "soundRecorder_CS", "CCAP_SoundRecorder_ControlService", "voiceSttQaUi_DS", "VNP_SttQaUi_DataService", "voiceInputUi_DS", "VNP_InputUi_DataService", "qaEnabled", "input", "undefined", "compactLayout", "transcriptReady", "EventEmitter", "transcriptSegmentReady", "signal", "pendingTranscriptionCount", "emitChain", "Promise", "resolve", "volume_$", "isQaEnabledFromSettings_$", "settingsOpen_$", "qaSettings_$", "qaSettingsLoading_$", "settingsQaEnabled", "lastQaTransformation_$", "infoOpen_$", "defaultLlmProvider_$", "computed", "Math", "min", "t", "CCAP_SttQaTextDiff_Util", "buildWordDiff", "CCAP_SttQaWordDiffSegmentKind_Type", "opts", "id", "find", "o", "ngOnInit", "availability", "CCAP_MediaRecording_Util", "getMediaRecordingAvailability", "supported", "reason", "set", "getMediaUnavailableMessage", "reportErrorOnly", "message", "getMediaUnavailableReportMessage", "source", "setOnChunk", "blob", "meta", "onChunk", "setOnVolume", "setOnError", "err", "showError", "ngOnDestroy", "stopListening", "__async", "state_$", "CCAP_SoundRecorderState_State", "stopped", "loadQaEnabledOnce", "startListening", "fetchQaEnabledFlag", "handleAutoSendAfterVoiceChange", "setAutoSendAfterVoice", "update", "v", "state", "loadSttQaSettingsPanelState", "res", "qa", "confusionMap", "providerName", "modelName", "llmProviderSelectOptions", "defaultLlmProvider", "defaultLlmModel", "qaModelsForProvider", "qaModelsListFetchError", "loadQaModelsForProvider", "providerId", "out", "fetchLlmModelsListForSttQa", "models", "errorMessage", "list", "index", "filter", "_", "i", "next", "normalizeConfusionMapEntries", "saveVoiceNotesQaSettings", "current", "onEscape", "effectiveQaEnabled_$", "prevEmitQueue", "releaseEmitSlot", "transcribeVoiceChunk", "mimeType", "filename", "noteContext", "skipClassification", "ok", "emit", "isFinal", "success", "qaFailed", "qfm", "qaFailureMessage", "Error", "correctedTranscript", "transcript", "usedQa", "qaExplanation", "qaInput", "recordStateLabel_$", "s", "standby", "running", "recordButtonAriaLabel_$", "unavail", "recordButtonTitle_$", "selectors", "hostBindings", "rf", "\u0275\u0275resolveDocument", "CCAP_VoiceRecordButton_Component_Conditional_0_Template", "CCAP_VoiceRecordButton_Component_Conditional_1_Template", "CCAP_VoiceRecordButton_Component_Conditional_13_Template", "CCAP_VoiceRecordButton_Component_Conditional_14_Template", "CCAP_VoiceRecordButton_Component_Conditional_15_Template", "CCAP_VoiceRecordButton_Component_Conditional_20_Template", "CCAP_VoiceRecordButton_Component_Conditional_21_Template", "autoSendAfterVoice_$", "tmp_8_0", "tmp_13_0", "FormsModule", "NgSelectOption", "\u0275NgSelectMultipleOption", "DefaultValueAccessor", "CheckboxControlValueAccessor", "SelectControlValueAccessor", "NgControlStatus", "NgModel", "S_Modal_Component", "encapsulation"]
|
|
7
|
-
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as k}from"./chunk-VSFMGBJ5.js";import{a as C}from"./chunk-V3VQWJQL.js";import{I as U,L as P,t as A}from"./chunk-CFK7FARI.js";import{C as h,k as m,p as a,xb as M,y as b}from"./chunk-TBMJSIBB.js";var y=class{static readLlmCloudBucketsFromSectionResponse(n){return{anthropicLlm:v(n.anthropicSettings,{includeBaseUrl:!1}),googleLlm:v(n.googleSettings,{includeBaseUrl:!1}),deepseekLlm:v(n.deepseekSettings,{includeBaseUrl:!1}),fdpaiLlm:v(n.fdpaiSettings,{includeBaseUrl:!0})}}};function v(s,n){if(s==null||typeof s!="object"||Array.isArray(s))return{enabled:!1,defaultModel:"",baseUrl:"",apiKey:"",apiKeyMasked:""};let e=Reflect.get(s,"defaultModel"),o=Reflect.get(s,"apiKeyMasked"),i=Reflect.get(s,"baseUrl");return{enabled:Reflect.get(s,"enabled")===!0,defaultModel:typeof e=="string"?e:"",baseUrl:n.includeBaseUrl&&typeof i=="string"?i:"",apiKey:"",apiKeyMasked:typeof o=="string"?o:""}}var L=class{static parseLlmSettingsSectionForUi(n){let e=n.openAiSettings,o=!1,i="gpt-4o";if(e!=null&&typeof e=="object"&&!Array.isArray(e)){o=Reflect.get(e,"enabled")===!0;let t=Reflect.get(e,"defaultModel");typeof t=="string"&&(i=t)}let c=(Array.isArray(n.localAiSettings)?n.localAiSettings:[]).filter(t=>t!=null&&typeof t=="object"&&!Array.isArray(t)).map(t=>{let g=typeof t.key=="string"?t.key.trim():"";if(!g.length)return null;let S=typeof t.name=="string"?t.name:"",$=k.build({localAiKey:g}),T=S.trim().length>0?S.trim():"Local AI",_=t.enabled!==!1;return{id:$,baseUrl:(typeof t.baseUrl=="string"?t.baseUrl:"").trim(),model:(typeof t.defaultModel=="string"?t.defaultModel:"").trim(),label:T,enabled:_}}).filter(t=>t!=null),d=y.readLlmCloudBucketsFromSectionResponse(n),l=[];o&&l.push("open-ai"),d.anthropicLlm.enabled&&l.push("anthropic"),d.googleLlm.enabled&&l.push("google"),d.deepseekLlm.enabled&&l.push("deepseek"),d.fdpaiLlm.enabled&&l.push("fdp-ai");for(let t of c)t.enabled&&l.push(t.id);l.length===0&&l.push("open-ai");let F=c.map(t=>({id:t.id,label:t.label})),V=l.map(t=>({value:t,label:C.resolve(t,F)})),p=typeof n.defaultLlmProvider=="string"?n.defaultLlmProvider:"open-ai",u="";if(p==="open-ai")u=i;else if(p==="anthropic")u=d.anthropicLlm.defaultModel;else if(p==="google")u=d.googleLlm.defaultModel;else if(p==="deepseek")u=d.deepseekLlm.defaultModel;else if(p==="fdp-ai")u=d.fdpaiLlm.defaultModel;else{let t=c.find(g=>g.id===p);t&&(u=t.model)}return{enabledLlmProviderIds:l,llmProviderSelectOptions:V,defaultLlmProvider:p.trim(),defaultLlmModel:u.trim()}}};var I=(()=>{class s{baseUrl=`${U.api.baseUrl}/voice`;http=h(M);fetchVoiceNotesPoc(){return a(this.http.get(`${this.baseUrl}/poc/get-notes`))}fetchVoiceNotesQaSettings(){return a(this.http.get(`${this.baseUrl}/notes/qa-settings`))}saveVoiceNotesQaSettings(e){return a(this.http.put(`${this.baseUrl}/notes/qa-settings`,e,{headers:{"Content-Type":"application/json"}}))}saveVoiceNotesPoc(e){return a(this.http.put(`${this.baseUrl}/notes/poc`,e))}transcribeVoiceChunk(e){let o={qa:e.qaEnabled===!0?"1":"0",skip_classification:e.skipClassification!==!1?"true":"false"};e.confidenceThreshold!==void 0&&(o.confidence_threshold=String(e.confidenceThreshold)),e.noteContext!==void 0&&(o.note_context=e.noteContext);let i=Object.keys(o).map(c=>`${encodeURIComponent(c)}=${encodeURIComponent(o[c])}`).join("&"),f=`${this.baseUrl}/notes/transcribe${i?`?${i}`:""}`,r={"Content-Type":e.mimeType,Filename:e.filename};return a(this.http.post(f,e.blob,{headers:r}))}generateTtsSpeechBlob(e){return a(this.http.post(`${this.baseUrl}/tts/speech`,{input:e.text},{responseType:"blob"}))}getTtsMessageAudioUrl(e){let o=typeof e=="string"?e.trim():"";return o?`${this.baseUrl}/tts/message-audio/${encodeURIComponent(o)}`:""}getOrCreateTtsMessageAudio(e){return a(this.http.post(`${this.baseUrl}/tts/message-audio`,{sessionId:e.sessionId,role:e.role,content:e.content,timestamp:e.timestamp},{responseType:"blob",headers:{"Content-Type":"application/json"}}))}getVoiceSettings(){return a(this.http.get(`${this.baseUrl}/settings`))}saveTtsProvider(e){return a(this.http.post(`${this.baseUrl}/settings/tts-provider`,{provider:e}))}saveElevenLabsKey(e){return a(this.http.post(`${this.baseUrl}/settings/elevenlabs-key`,{apiKey:e}))}testElevenLabsApiKey(){return a(this.http.post(`${this.baseUrl}/settings/test-elevenlabs-key`,{}))}saveVoiceConfig(e){return a(this.http.post(`${this.baseUrl}/settings/voice-config`,{elevenLabsModelId:e.elevenLabsModelId,elevenLabsVoiceId:e.elevenLabsVoiceId}))}static \u0275fac=function(o){return new(o||s)};static \u0275prov=b({token:s,factory:s.\u0275fac,providedIn:"root"})}return s})();var Y=(()=>{class s{voice_AS=h(I);settings_AS=h(P);fetchQaEnabledFlag(){return m(this,null,function*(){try{return(yield this.voice_AS.fetchVoiceNotesQaSettings()).qaEnabled===!0}catch{return!1}})}loadSttQaSettingsPanelState(){return m(this,null,function*(){let e=yield this.voice_AS.fetchVoiceNotesQaSettings(),o=yield this.settings_AS.getSection(A.llmProviders),i=L.parseLlmSettingsSectionForUi(o),f=(e.providerName??"").trim(),r=[],c="";if(f.length>0){let d=yield this.fetchLlmModelsListForSttQa(f);r=[...d.models],c=d.errorMessage;let l=(e.modelName??"").trim();l.length>0&&!r.includes(l)&&(r=[l,...r])}return{qa:e,llmProviderSelectOptions:i.llmProviderSelectOptions,defaultLlmProvider:i.defaultLlmProvider,defaultLlmModel:i.defaultLlmModel,qaModelsForProvider:r,qaModelsListFetchError:c}})}fetchLlmModelsListForSttQa(e){return m(this,null,function*(){let o=e.trim();if(!o.length)return{models:[],errorMessage:""};try{let i=yield this.settings_AS.postListLlmModels({providerId:o}),f=i.models??[],r=typeof i.error=="string"?i.error.trim():"",c=i.success===!1;return f.length>0?{models:f,errorMessage:c?r.length>0?r:"Model list request failed.":""}:c?{models:[],errorMessage:r.length>0?r:"Model list request failed."}:{models:[],errorMessage:r}}catch(i){let f=i instanceof Error?i.message:String(i);return{models:[],errorMessage:f}}})}fetchLlmModelIdsForProvider(e){return m(this,null,function*(){return(yield this.fetchLlmModelsListForSttQa(e)).models})}normalizeConfusionMapEntries(e){return e.map(o=>({from:String(o.from).trim(),to:String(o.to).trim()})).filter(o=>o.from.length>0||o.to.length>0)}saveVoiceNotesQaSettings(e){return m(this,null,function*(){yield this.voice_AS.saveVoiceNotesQaSettings(e)})}fetchVoiceNotesPoc(){return this.voice_AS.fetchVoiceNotesPoc()}saveVoiceNotesPoc(e){return this.voice_AS.saveVoiceNotesPoc(e)}transcribeVoiceChunk(e){return this.voice_AS.transcribeVoiceChunk(e)}getTtsMessageAudioUrl(e){return this.voice_AS.getTtsMessageAudioUrl(e)}getOrCreateTtsMessageAudio(e){return this.voice_AS.getOrCreateTtsMessageAudio(e)}static \u0275fac=function(o){return new(o||s)};static \u0275prov=b({token:s,factory:s.\u0275fac,providedIn:"root"})}return s})();export{y as a,I as b,Y as c};
|
|
2
|
-
//# sourceMappingURL=chunk-AC2BVG34.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["src/app/_collections/settings/read-llm-cloud-buckets-from-section-response.util.ts", "src/app/_collections/settings/parse-llm-settings-section-for-ui.util.ts", "src/app/_modules/dev/_modules/poc/_modules/voice-notes-poc/_services/voice-notes-poc.api-service.ts", "src/app/_modules/dev/_modules/poc/_modules/voice-notes-poc/_services/vnp-stt-qa-ui.data-service.ts"],
|
|
4
|
-
"sourcesContent": ["import { Set_LlmCloudProviderBucketForm_Interface } from '../../_modules/config/_modules/settings/_models/interfaces/llm-providers/set-llm-cloud-provider-bucket-form.interface';\n\n/**\n * Cloud LLM bucket kiolvasó util – statikus metódusokkal.\n */\nexport class ReadLlmCloudBucketsFromSectionResponse_Util {\n /**\n * Cloud / FDPAI LLM bucket-ek kiolvasása a szerver get-section (llmProviders) válaszból.\n */\n static readLlmCloudBucketsFromSectionResponse(response: Record<string, unknown>): {\n anthropicLlm: Set_LlmCloudProviderBucketForm_Interface;\n googleLlm: Set_LlmCloudProviderBucketForm_Interface;\n deepseekLlm: Set_LlmCloudProviderBucketForm_Interface;\n fdpaiLlm: Set_LlmCloudProviderBucketForm_Interface;\n } {\n return {\n anthropicLlm: readLlmCloudBucketFromUnknown(response.anthropicSettings, { includeBaseUrl: false }),\n googleLlm: readLlmCloudBucketFromUnknown(response.googleSettings, { includeBaseUrl: false }),\n deepseekLlm: readLlmCloudBucketFromUnknown(response.deepseekSettings, { includeBaseUrl: false }),\n fdpaiLlm: readLlmCloudBucketFromUnknown(response.fdpaiSettings, { includeBaseUrl: true }),\n };\n }\n}\n\n/**\n * GET settings section válasz egy provider bucket-jének kiolvasása (cloud LLM, FDPAI baseUrl-lel).\n */\nfunction readLlmCloudBucketFromUnknown(\n raw: unknown,\n options: { includeBaseUrl: boolean },\n): Set_LlmCloudProviderBucketForm_Interface {\n if (raw == null || typeof raw !== 'object' || Array.isArray(raw)) {\n return {\n enabled: false,\n defaultModel: '',\n baseUrl: '',\n apiKey: '',\n apiKeyMasked: '',\n };\n }\n const defaultModel: unknown = Reflect.get(raw, 'defaultModel');\n const apiKeyMasked: unknown = Reflect.get(raw, 'apiKeyMasked');\n const baseUrlRaw: unknown = Reflect.get(raw, 'baseUrl');\n return {\n enabled: Reflect.get(raw, 'enabled') === true,\n defaultModel: typeof defaultModel === 'string' ? defaultModel : '',\n baseUrl: options.includeBaseUrl && typeof baseUrlRaw === 'string' ? baseUrlRaw : '',\n apiKey: '',\n apiKeyMasked: typeof apiKeyMasked === 'string' ? apiKeyMasked : '',\n };\n}\n", "import { CCAP_LlmProviderSelectOption_Interface } from '../../_models/interfaces/settings/ccap-llm-provider-select-option.interface';\nimport { CCAP_CustomLocalOpenAiLlmInstanceId_Util } from './ccap-custom-local-openai-llm-instance-id.util';\nimport { CCAP_LlmProviderDisplayLabelForUi_Util } from './llm-provider-display-label-for-ui.util';\nimport { ReadLlmCloudBucketsFromSectionResponse_Util } from './read-llm-cloud-buckets-from-section-response.util';\n\n/**\n * LLM settings section parse util – statikus metódusokkal.\n */\nexport class ParseLlmSettingsSectionForUi_Util {\n /**\n * LLM settings get-section válasz feldolgozása: engedélyezett provider id-k + globál default provider/modell.\n * Logika igazodik a Set_LlmProviders_DataService doLoad metódusához (voice overlay, voice-notes POC).\n */\n static parseLlmSettingsSectionForUi(response: Record<string, unknown>): {\n enabledLlmProviderIds: string[];\n llmProviderSelectOptions: CCAP_LlmProviderSelectOption_Interface[];\n defaultLlmProvider: string;\n defaultLlmModel: string;\n } {\n const oai: unknown = response.openAiSettings;\n let openAiEnabled: boolean = false;\n let openaiModel: string = 'gpt-4o';\n if (oai != null && typeof oai === 'object' && !Array.isArray(oai)) {\n openAiEnabled = Reflect.get(oai, 'enabled') === true;\n const dm: unknown = Reflect.get(oai, 'defaultModel');\n if (typeof dm === 'string') {\n openaiModel = dm;\n }\n }\n\n const localAiRaw: unknown[] = Array.isArray(response.localAiSettings)\n ? response.localAiSettings\n : [];\n type LocalEntry = { id: string; model: string; label: string; baseUrl: string; enabled: boolean };\n const localAiEntries: LocalEntry[] = localAiRaw\n .filter((item: unknown): item is Record<string, unknown> =>\n item != null && typeof item === 'object' && !Array.isArray(item),\n )\n .map((item: Record<string, unknown>): LocalEntry | null => {\n const key: string = typeof item.key === 'string' ? item.key.trim() : '';\n if (!key.length) {\n return null;\n }\n const name: string = typeof item.name === 'string' ? item.name : '';\n const id: string = CCAP_CustomLocalOpenAiLlmInstanceId_Util.build({ localAiKey: key });\n const label: string = name.trim().length > 0 ? name.trim() : 'Local AI';\n const rowEnabled: boolean = item.enabled !== false;\n return {\n id: id,\n baseUrl: (typeof item.baseUrl === 'string' ? item.baseUrl : '').trim(),\n model: (typeof item.defaultModel === 'string' ? item.defaultModel : '').trim(),\n label: label,\n enabled: rowEnabled,\n };\n })\n .filter((row: LocalEntry | null): row is LocalEntry => row != null);\n\n const finalLocalAi: LocalEntry[] = localAiEntries;\n\n const clouds = ReadLlmCloudBucketsFromSectionResponse_Util.readLlmCloudBucketsFromSectionResponse(response);\n\n const enabledLlmProviderIds: string[] = [];\n if (openAiEnabled) enabledLlmProviderIds.push('open-ai');\n if (clouds.anthropicLlm.enabled) enabledLlmProviderIds.push('anthropic');\n if (clouds.googleLlm.enabled) enabledLlmProviderIds.push('google');\n if (clouds.deepseekLlm.enabled) enabledLlmProviderIds.push('deepseek');\n if (clouds.fdpaiLlm.enabled) enabledLlmProviderIds.push('fdp-ai');\n for (const entry of finalLocalAi) {\n if (entry.enabled) enabledLlmProviderIds.push(entry.id);\n }\n if (enabledLlmProviderIds.length === 0) enabledLlmProviderIds.push('open-ai');\n\n const localRowsForLabel: { id: string; label: string }[] = finalLocalAi.map(\n (e: LocalEntry): { id: string; label: string } => ({ id: e.id, label: e.label }),\n );\n const llmProviderSelectOptions: CCAP_LlmProviderSelectOption_Interface[] = enabledLlmProviderIds.map(\n (pid: string): CCAP_LlmProviderSelectOption_Interface => ({\n value: pid,\n label: CCAP_LlmProviderDisplayLabelForUi_Util.resolve(pid, localRowsForLabel),\n }),\n );\n\n const defaultLlmProvider: string = typeof response.defaultLlmProvider === 'string'\n ? response.defaultLlmProvider\n : 'open-ai';\n\n let defaultLlmModel: string = '';\n if (defaultLlmProvider === 'open-ai') {\n defaultLlmModel = openaiModel;\n } else if (defaultLlmProvider === 'anthropic') {\n defaultLlmModel = clouds.anthropicLlm.defaultModel;\n } else if (defaultLlmProvider === 'google') {\n defaultLlmModel = clouds.googleLlm.defaultModel;\n } else if (defaultLlmProvider === 'deepseek') {\n defaultLlmModel = clouds.deepseekLlm.defaultModel;\n } else if (defaultLlmProvider === 'fdp-ai') {\n defaultLlmModel = clouds.fdpaiLlm.defaultModel;\n } else {\n const matchEntry: LocalEntry | undefined = finalLocalAi.find(\n (e: LocalEntry): boolean => e.id === defaultLlmProvider,\n );\n if (matchEntry) defaultLlmModel = matchEntry.model;\n }\n\n return {\n enabledLlmProviderIds: enabledLlmProviderIds,\n llmProviderSelectOptions: llmProviderSelectOptions,\n defaultLlmProvider: defaultLlmProvider.trim(),\n defaultLlmModel: defaultLlmModel.trim(),\n };\n }\n}\n", "import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\n\nimport { firstValueFrom } from 'rxjs';\n\nimport { environment } from '../../../../../../../../environments/environment';\nimport { CCAP_VoiceNotesPoc_Response } from '../../../../../../../_models/interfaces/voice/voice-notes/ccap-voice-notes-poc-response.interface';\nimport { CCAP_VoiceNotesPocSaveBody_Request } from '../../../../../../../_models/interfaces/voice/voice-notes/ccap-voice-notes-poc-save-body.interface';\nimport {\n CCAP_Transcribe_Response,\n CCAP_TranscribeSuccess_Response,\n CCAP_TranscribeNonSpeech_Response,\n} from '../../../../../../../_models/interfaces/voice/transcribe/ccap-transcribe-response.interface';\nimport {\n Voc_SttQaConfusionMapEntry_Response,\n Voc_SttQaInput_Response,\n} from '../../../../../../../_models/server-index';\nimport { CCAP_VoiceNotesQaSettings_Response } from '../../../../../../../_models/interfaces/voice/voice-notes/ccap-voice-notes-qa-settings-response.interface';\nimport { CCAP_VoiceNotesQaSettingsSaveBody_Request } from '../../../../../../../_models/interfaces/voice/voice-notes/ccap-voice-notes-qa-settings-save-body.interface';\nimport { CCAP_VoiceSettings_Response } from '../../../../../../../_models/interfaces/voice/ccap-voice-settings-response.interface';\nimport { CCAP_TestElevenLabsApiKey_Response } from '../../../../../../../_models/interfaces/voice/transcribe/ccap-test-elevenlabs-api-key-response.interface';\n\n/**\n * Voice API service.\n * GET/PUT POC note, POST transcribe, POST TTS speech, GET/POST voice settings.\n */\n@Injectable({ providedIn: 'root' })\nexport class VoiceNotesPoc_ApiService {\n\n private readonly baseUrl: string = `${environment.api.baseUrl}/voice`;\n\n private readonly http: HttpClient = inject(HttpClient);\n\n /**\n * POC jegyzet lekérése (GET /voice/poc/get-notes; a szerver voice.controller endpoint-ja).\n */\n fetchVoiceNotesPoc(): Promise<CCAP_VoiceNotesPoc_Response> {\n return firstValueFrom(\n this.http.get<CCAP_VoiceNotesPoc_Response>(`${this.baseUrl}/poc/get-notes`),\n );\n }\n\n /**\n * STT QA beállítások lekérése (GET /voice/notes/qa-settings): system prompt, user prompt sablon, confusion map.\n */\n fetchVoiceNotesQaSettings(): Promise<CCAP_VoiceNotesQaSettings_Response> {\n return firstValueFrom(\n this.http.get<CCAP_VoiceNotesQaSettings_Response>(`${this.baseUrl}/notes/qa-settings`),\n );\n }\n\n /**\n * STT QA beállítások mentése (PUT /voice/notes/qa-settings): confusion map + opcionális provider/modell.\n * Explicit JSON header, hogy a szerver mindig JSON-ként dolgozza a body-t.\n */\n saveVoiceNotesQaSettings(\n body: CCAP_VoiceNotesQaSettingsSaveBody_Request,\n ): Promise<{\n ok: boolean;\n confusionMap?: Voc_SttQaConfusionMapEntry_Response[];\n providerName?: string;\n modelName?: string;\n }> {\n return firstValueFrom(\n this.http.put<{\n ok: boolean;\n confusionMap?: Voc_SttQaConfusionMapEntry_Response[];\n providerName?: string;\n modelName?: string;\n }>(`${this.baseUrl}/notes/qa-settings`, body, {\n headers: { 'Content-Type': 'application/json' },\n }),\n );\n }\n\n /**\n * POC jegyzet mentése (PUT /voice/notes/poc).\n */\n saveVoiceNotesPoc(body: CCAP_VoiceNotesPocSaveBody_Request): Promise<{ ok?: boolean }> {\n return firstValueFrom(\n this.http.put<{ ok?: boolean }>(`${this.baseUrl}/notes/poc`, body),\n );\n }\n\n /**\n * Nyers audio feltöltése, STT + opcionális QA (POST /voice/notes/transcribe).\n * Raw body = blob; headers Content-Type, Filename (ASCII); query qa, skip_classification, note_context.\n * Megjegyzés: XMLHttpRequest header érték csak ISO-8859-1 — a jegyzet kontextus (UTF-8, pl. magyar)\n * query param `note_context`-ben megy (`encodeURIComponent`), nem headerben.\n */\n transcribeVoiceChunk(params: {\n blob: Blob;\n mimeType: string;\n filename: string;\n qaEnabled?: boolean;\n noteContext?: string;\n skipClassification?: boolean;\n confidenceThreshold?: number;\n }): Promise<CCAP_Transcribe_Response> {\n const queryParams: Record<string, string> = {\n qa: params.qaEnabled === true ? '1' : '0',\n skip_classification: params.skipClassification !== false ? 'true' : 'false',\n };\n if (params.confidenceThreshold !== undefined) {\n queryParams.confidence_threshold = String(params.confidenceThreshold);\n }\n if (params.noteContext !== undefined) {\n queryParams.note_context = params.noteContext;\n }\n const query: string = Object.keys(queryParams)\n .map((k: string): string => `${encodeURIComponent(k)}=${encodeURIComponent(queryParams[k])}`)\n .join('&');\n const url: string = `${this.baseUrl}/notes/transcribe${query ? `?${query}` : ''}`;\n const headers: Record<string, string> = {\n 'Content-Type': params.mimeType,\n 'Filename': params.filename,\n };\n return firstValueFrom(\n this.http.post<CCAP_Transcribe_Response>(url, params.blob, {\n headers: headers,\n }),\n );\n }\n\n /**\n * TTS speech generálás (POST /voice/tts/speech).\n * Jelenleg csak ElevenLabs sync (200 + blob); 202/task flow nincs.\n */\n generateTtsSpeechBlob(params: { text: string }): Promise<Blob> {\n return firstValueFrom(\n this.http.post(`${this.baseUrl}/tts/speech`, { input: params.text }, {\n responseType: 'blob',\n }),\n );\n }\n\n /**\n * TTS message audio URL (GET /voice/tts/message-audio/:messageKey).\n * A kliens ezt használja audio src-ként, ha hasTtsAudio true.\n * Üres messageKey esetén ne adjunk URL-t (ne hívjuk a szervert messageKey nélkül).\n */\n getTtsMessageAudioUrl(messageKey: string): string {\n const key: string = typeof messageKey === 'string' ? messageKey.trim() : '';\n if (!key) {\n return '';\n }\n return `${this.baseUrl}/tts/message-audio/${encodeURIComponent(key)}`;\n }\n\n /**\n * TTS message audio get-or-create (POST /voice/tts/message-audio).\n * Visszaadja a blob-ot (cache-ből vagy új generálásból); mindig 200 + blob.\n */\n getOrCreateTtsMessageAudio(params: {\n sessionId: string;\n role: string;\n content: string;\n timestamp: string;\n }): Promise<Blob> {\n return firstValueFrom(\n this.http.post(\n `${this.baseUrl}/tts/message-audio`,\n {\n sessionId: params.sessionId,\n role: params.role,\n content: params.content,\n timestamp: params.timestamp,\n },\n {\n responseType: 'blob',\n headers: { 'Content-Type': 'application/json' },\n },\n ),\n );\n }\n\n /**\n * Voice beállítások lekérése (GET /voice/settings).\n */\n getVoiceSettings(): Promise<CCAP_VoiceSettings_Response> {\n return firstValueFrom(\n this.http.get<CCAP_VoiceSettings_Response>(`${this.baseUrl}/settings`),\n );\n }\n\n /**\n * TTS provider mentése (POST /voice/settings/tts-provider).\n */\n saveTtsProvider(provider: 'fdpai' | 'elevenlabs'): Promise<{ ok: boolean; provider: string }> {\n return firstValueFrom(\n this.http.post<{ ok: boolean; provider: string }>(\n `${this.baseUrl}/settings/tts-provider`,\n { provider: provider },\n ),\n );\n }\n\n /**\n * ElevenLabs API kulcs mentése (POST /voice/settings/elevenlabs-key).\n */\n saveElevenLabsKey(apiKey: string): Promise<{ ok: boolean; maskedKey?: string }> {\n return firstValueFrom(\n this.http.post<{ ok: boolean; maskedKey?: string }>(\n `${this.baseUrl}/settings/elevenlabs-key`,\n { apiKey: apiKey },\n ),\n );\n }\n\n /**\n * ElevenLabs API kulcs tesztelése a tárolt kulccsal (POST /voice/settings/test-elevenlabs-key).\n * Nem küld body-t – a szerver a titkosítva mentett kulcsot használja.\n */\n testElevenLabsApiKey(): Promise<CCAP_TestElevenLabsApiKey_Response> {\n return firstValueFrom(\n this.http.post<CCAP_TestElevenLabsApiKey_Response>(\n `${this.baseUrl}/settings/test-elevenlabs-key`,\n {},\n ),\n );\n }\n\n /**\n * Voice config (ElevenLabs model/voice id) mentése (POST /voice/settings/voice-config).\n */\n saveVoiceConfig(params: {\n elevenLabsModelId?: string;\n elevenLabsVoiceId?: string;\n }): Promise<{\n ok: boolean;\n elevenLabsModelId?: string;\n elevenLabsVoiceId?: string;\n }> {\n return firstValueFrom(\n this.http.post<{\n ok: boolean;\n elevenLabsModelId?: string;\n elevenLabsVoiceId?: string;\n }>(`${this.baseUrl}/settings/voice-config`, {\n elevenLabsModelId: params.elevenLabsModelId,\n elevenLabsVoiceId: params.elevenLabsVoiceId,\n }),\n );\n }\n}\n", "import { inject, Injectable } from '@angular/core';\n\nimport { SC_Type } from '@server-enums';\nimport { ParseLlmSettingsSectionForUi_Util } from '../../../../../../../_collections/settings/parse-llm-settings-section-for-ui.util';\nimport { Voc_SttQaConfusionMapEntry_Response } from '../../../../../../../_models/server-index';\nimport { CCAP_VoiceNotesQaSettings_Response } from '../../../../../../../_models/interfaces/voice/voice-notes/ccap-voice-notes-qa-settings-response.interface';\nimport { CCAP_VoiceNotesQaSettingsSaveBody_Request } from '../../../../../../../_models/interfaces/voice/voice-notes/ccap-voice-notes-qa-settings-save-body.interface';\nimport { CCAP_VoiceNotesPoc_Response } from '../../../../../../../_models/interfaces/voice/voice-notes/ccap-voice-notes-poc-response.interface';\nimport { CCAP_VoiceNotesPocSaveBody_Request } from '../../../../../../../_models/interfaces/voice/voice-notes/ccap-voice-notes-poc-save-body.interface';\nimport { CCAP_ListAiModels_Response } from '../../../../../../../_models/interfaces/settings/response/ccap-list-ai-models-response.interface';\nimport { CCAP_Transcribe_Response } from '../../../../../../../_models/interfaces/voice/transcribe/ccap-transcribe-response.interface';\nimport { CCAP_VoiceSttQaUiLoadResult_Interface } from '../../../../../../../_models/interfaces/voice/ccap-voice-stt-qa-ui-load-result.interface';\nimport { Settings_ApiService } from '../../../../../../config/_modules/settings/_services/settings.api-service';\nimport { VoiceNotesPoc_ApiService } from './voice-notes-poc.api-service';\n\n/**\n * Voice kliens SSOT: STT chunk, QA panel állapot, TTS message audio URL/blob (komponensek nem hívják közvetlenül a Voice ApiService-t).\n */\n@Injectable({ providedIn: 'root' })\nexport class VNP_SttQaUi_DataService {\n\n private readonly voice_AS: VoiceNotesPoc_ApiService = inject(VoiceNotesPoc_ApiService);\n private readonly settings_AS: Settings_ApiService = inject(Settings_ApiService);\n\n /**\n * Szerverről: QA engedélyezett-e (egyszeri flag betöltéshez).\n */\n async fetchQaEnabledFlag(): Promise<boolean> {\n try {\n const res: CCAP_VoiceNotesQaSettings_Response =\n await this.voice_AS.fetchVoiceNotesQaSettings();\n return res.qaEnabled === true;\n } catch {\n return false;\n }\n }\n\n /**\n * QA beállítások panelhez: GET qa-settings + LLM szekció + opcionális modell lista.\n */\n async loadSttQaSettingsPanelState(): Promise<CCAP_VoiceSttQaUiLoadResult_Interface> {\n const qa: CCAP_VoiceNotesQaSettings_Response =\n await this.voice_AS.fetchVoiceNotesQaSettings();\n const llmSection: Record<string, unknown> = await this.settings_AS.getSection(\n SC_Type.llmProviders,\n );\n const snap = ParseLlmSettingsSectionForUi_Util.parseLlmSettingsSectionForUi(llmSection);\n const providerTrimmed: string = (qa.providerName ?? '').trim();\n let qaModelsForProvider: string[] = [];\n let qaModelsListFetchError: string = '';\n if (providerTrimmed.length > 0) {\n const fetchRes = await this.fetchLlmModelsListForSttQa(providerTrimmed);\n qaModelsForProvider = [...fetchRes.models];\n qaModelsListFetchError = fetchRes.errorMessage;\n const savedModel: string = (qa.modelName ?? '').trim();\n if (savedModel.length > 0 && !qaModelsForProvider.includes(savedModel)) {\n qaModelsForProvider = [savedModel, ...qaModelsForProvider];\n }\n }\n return {\n qa: qa,\n llmProviderSelectOptions: snap.llmProviderSelectOptions,\n defaultLlmProvider: snap.defaultLlmProvider,\n defaultLlmModel: snap.defaultLlmModel,\n qaModelsForProvider: qaModelsForProvider,\n qaModelsListFetchError: qaModelsListFetchError,\n };\n }\n\n /**\n * Egy providerhez modell lista + hiba szöveg (settings list-llm-models); cloud provider esetén üres lista és error.\n */\n async fetchLlmModelsListForSttQa(providerId: string): Promise<{\n models: string[];\n errorMessage: string;\n }> {\n const id: string = providerId.trim();\n if (!id.length) {\n return { models: [], errorMessage: '' };\n }\n try {\n const res: CCAP_ListAiModels_Response = await this.settings_AS.postListLlmModels({\n providerId: id,\n });\n const models: string[] = res.models ?? [];\n const errRaw: string = typeof res.error === 'string' ? res.error.trim() : '';\n const isExplicitFailure: boolean = res.success === false;\n if (models.length > 0) {\n return {\n models: models,\n errorMessage: isExplicitFailure ? (errRaw.length > 0 ? errRaw : 'Model list request failed.') : '',\n };\n }\n if (isExplicitFailure) {\n return {\n models: [],\n errorMessage: errRaw.length > 0 ? errRaw : 'Model list request failed.',\n };\n }\n return { models: [], errorMessage: errRaw };\n } catch (error: unknown) {\n const message: string = error instanceof Error ? error.message : String(error);\n return { models: [], errorMessage: message };\n }\n }\n\n /**\n * Csak a modell id-k (legacy hívók / egyszerű UI); hiba esetén üres tömb.\n */\n async fetchLlmModelIdsForProvider(providerId: string): Promise<string[]> {\n const out = await this.fetchLlmModelsListForSttQa(providerId);\n return out.models;\n }\n\n /**\n * Confusion map mentés előtti normalizálás (trim + üres sorok megtartása opcionálisan kiszűrve).\n */\n normalizeConfusionMapEntries(\n list: Voc_SttQaConfusionMapEntry_Response[],\n ): Voc_SttQaConfusionMapEntry_Response[] {\n return list\n .map((e: Voc_SttQaConfusionMapEntry_Response): Voc_SttQaConfusionMapEntry_Response => ({\n from: String(e.from).trim(),\n to: String(e.to).trim(),\n }))\n .filter((e: Voc_SttQaConfusionMapEntry_Response): boolean =>\n e.from.length > 0 || e.to.length > 0);\n }\n\n /**\n * PUT /voice/notes/qa-settings.\n */\n async saveVoiceNotesQaSettings(\n body: CCAP_VoiceNotesQaSettingsSaveBody_Request,\n ): Promise<void> {\n await this.voice_AS.saveVoiceNotesQaSettings(body);\n }\n\n /**\n * Voice Notes POC jegyzet GET.\n */\n fetchVoiceNotesPoc(): Promise<CCAP_VoiceNotesPoc_Response> {\n return this.voice_AS.fetchVoiceNotesPoc();\n }\n\n /**\n * Voice Notes POC jegyzet PUT.\n */\n saveVoiceNotesPoc(body: CCAP_VoiceNotesPocSaveBody_Request): Promise<{ ok?: boolean }> {\n return this.voice_AS.saveVoiceNotesPoc(body);\n }\n\n /**\n * Hang chunk STT (+ opcionális QA) — POST /voice/notes/transcribe.\n */\n transcribeVoiceChunk(params: {\n blob: Blob;\n mimeType: string;\n filename: string;\n qaEnabled?: boolean;\n noteContext?: string;\n skipClassification?: boolean;\n confidenceThreshold?: number;\n }): Promise<CCAP_Transcribe_Response> {\n return this.voice_AS.transcribeVoiceChunk(params);\n }\n\n /**\n * TTS message audio URL (üres key → üres string).\n */\n getTtsMessageAudioUrl(messageKey: string): string {\n return this.voice_AS.getTtsMessageAudioUrl(messageKey);\n }\n\n /**\n * TTS message audio get-or-create (blob).\n */\n getOrCreateTtsMessageAudio(params: {\n sessionId: string;\n role: string;\n content: string;\n timestamp: string;\n }): Promise<Blob> {\n return this.voice_AS.getOrCreateTtsMessageAudio(params);\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["ReadLlmCloudBucketsFromSectionResponse_Util", "readLlmCloudBucketsFromSectionResponse", "response", "anthropicLlm", "readLlmCloudBucketFromUnknown", "anthropicSettings", "includeBaseUrl", "googleLlm", "googleSettings", "deepseekLlm", "deepseekSettings", "fdpaiLlm", "fdpaiSettings", "raw", "options", "Array", "isArray", "enabled", "defaultModel", "baseUrl", "apiKey", "apiKeyMasked", "Reflect", "get", "baseUrlRaw", "ParseLlmSettingsSectionForUi_Util", "parseLlmSettingsSectionForUi", "response", "oai", "openAiSettings", "openAiEnabled", "openaiModel", "Array", "isArray", "Reflect", "get", "dm", "finalLocalAi", "localAiSettings", "filter", "item", "map", "key", "trim", "length", "name", "id", "CCAP_CustomLocalOpenAiLlmInstanceId_Util", "build", "localAiKey", "label", "rowEnabled", "enabled", "baseUrl", "model", "defaultModel", "row", "clouds", "ReadLlmCloudBucketsFromSectionResponse_Util", "readLlmCloudBucketsFromSectionResponse", "enabledLlmProviderIds", "push", "anthropicLlm", "googleLlm", "deepseekLlm", "fdpaiLlm", "entry", "localRowsForLabel", "e", "llmProviderSelectOptions", "pid", "value", "CCAP_LlmProviderDisplayLabelForUi_Util", "resolve", "defaultLlmProvider", "defaultLlmModel", "matchEntry", "find", "VoiceNotesPoc_ApiService", "baseUrl", "environment", "api", "http", "inject", "HttpClient", "fetchVoiceNotesPoc", "firstValueFrom", "get", "fetchVoiceNotesQaSettings", "saveVoiceNotesQaSettings", "body", "put", "headers", "saveVoiceNotesPoc", "transcribeVoiceChunk", "params", "queryParams", "qa", "qaEnabled", "skip_classification", "skipClassification", "confidenceThreshold", "undefined", "confidence_threshold", "String", "noteContext", "note_context", "query", "Object", "keys", "map", "k", "encodeURIComponent", "join", "url", "mimeType", "filename", "post", "blob", "generateTtsSpeechBlob", "input", "text", "responseType", "getTtsMessageAudioUrl", "messageKey", "key", "trim", "getOrCreateTtsMessageAudio", "sessionId", "role", "content", "timestamp", "getVoiceSettings", "saveTtsProvider", "provider", "saveElevenLabsKey", "apiKey", "testElevenLabsApiKey", "saveVoiceConfig", "elevenLabsModelId", "elevenLabsVoiceId", "factory", "\u0275fac", "providedIn", "VNP_SttQaUi_DataService", "voice_AS", "inject", "VoiceNotesPoc_ApiService", "settings_AS", "Settings_ApiService", "fetchQaEnabledFlag", "__async", "fetchVoiceNotesQaSettings", "qaEnabled", "loadSttQaSettingsPanelState", "qa", "llmSection", "getSection", "SC_Type", "llmProviders", "snap", "ParseLlmSettingsSectionForUi_Util", "parseLlmSettingsSectionForUi", "providerTrimmed", "providerName", "trim", "qaModelsForProvider", "qaModelsListFetchError", "length", "fetchRes", "fetchLlmModelsListForSttQa", "models", "errorMessage", "savedModel", "modelName", "includes", "llmProviderSelectOptions", "defaultLlmProvider", "defaultLlmModel", "providerId", "id", "res", "postListLlmModels", "errRaw", "error", "isExplicitFailure", "success", "message", "Error", "String", "fetchLlmModelIdsForProvider", "normalizeConfusionMapEntries", "list", "map", "e", "from", "to", "filter", "saveVoiceNotesQaSettings", "body", "fetchVoiceNotesPoc", "saveVoiceNotesPoc", "transcribeVoiceChunk", "params", "getTtsMessageAudioUrl", "messageKey", "getOrCreateTtsMessageAudio", "factory", "\u0275fac", "providedIn"]
|
|
7
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
//# sourceMappingURL=chunk-EGRHWZRV.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{p as C}from"./chunk-CFK7FARI.js";import{aa as f,h as p,k as h,y as m}from"./chunk-TBMJSIBB.js";var a=function(o){return o.stopped="stopped",o.standby="standby",o.running="running",o}(a||{});var k={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."},v={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."},d=class{static wrapGetUserMediaError(s){if(s instanceof Error&&"code"in s&&typeof s.code=="string"&&s.code.startsWith("CCAP_"))return s;let e=s instanceof DOMException||s instanceof Error?s.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 n=new Error(i);return n.code=t,n.cause=s,n}static getGetUserMediaErrorMessage(s){switch(s instanceof DOMException||s instanceof Error?s.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(s){switch(s instanceof DOMException||s instanceof Error?s.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(s){return`Media recording not available (reason: ${s}). Use HTTPS or localhost for microphone access.`}static getMediaUnavailableHint(s){return v[s]??""}static getMediaUnavailableMessage(s){return k[s]??"A hangfelv\xE9tel nem el\xE9rhet\u0151 ezen az oldalon."}};var r=p(C());var A=["audio/webm;codecs=opus","audio/webm","audio/ogg;codecs=opus","audio/ogg","audio/mp4"],z=(()=>{class o{volumeGate=.05;silenceTimeLimitMs=5*r.second;timesliceMs=5*r.second;segmentMaxChunks=6;segmentSoftFlushMinChunks=4;getUserMediaTimeoutMs=15*r.second;state_$=f(a.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;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 h(this,null,function*(){if(this.state_$()===a.stopped)try{let e=d.getMediaRecordingAvailability();if(!e.supported){let n=`Media recording not available (reason: ${e.reason??"unknown"})`,l=new Error(n);throw l.code="CCAP_MEDIA_NOT_AVAILABLE",l}let t=null;try{let n=navigator.mediaDevices.getUserMedia({audio:{echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0,channelCount:1}}),l=new Promise((c,g)=>{t=setTimeout(()=>{let u=new Error(`getUserMedia timed out after ${this.getUserMediaTimeoutMs}ms`);u.code="CCAP_MIC_TIMEOUT",g(u)},this.getUserMediaTimeoutMs)});this.mediaStream=yield Promise.race([n,l])}catch(n){throw d.wrapGetUserMediaError(n)}finally{t!==null&&clearTimeout(t)}let i=this.mediaStream.getAudioTracks()[0];i&&(r.DyFM_Log.info("[CCAP] mic track settings",i.getSettings()),i.onended=()=>{r.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(a.standby)}catch(e){throw this.state_$.set(a.stopped),e}})}stopListening(){let e=this.state_$()===a.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(a.stopped)}startCapture(){return h(this,null,function*(){try{if(this.mediaStream==null&&(yield this.startListening()),this.mediaStream==null)return;this.silenceStartTime=null,this.chunks=[],this.createAndStartRecorder(),this.state_$.set(a.running)}catch(e){this.stopVolumeLoop(),this.state_$.set(a.stopped),this.onErrorCb?.(e)}})}stopCapture(e=!1,t=!1){if(this.isRestartingForFlush=!1,!(this.mediaRecorder==null||this.state_$()!==a.running)){try{this.mediaRecorder.stop()}catch(i){r.DyFM_Log.info("[CCAP] mediaRecorder.stop() failed (likely already inactive)",i),this.mediaRecorder=null,this.flushChunksAsSegment(e),this.state_$.set(this.mediaStream?a.standby:a.stopped);return}if(t){this.mediaRecorder=null,this.flushChunksAsSegment(e),this.state_$.set(this.mediaStream?a.standby:a.stopped);return}this.mediaRecorder.onstop=()=>{this.mediaRecorder=null,this.flushChunksAsSegment(e),this.state_$.set(this.mediaStream?a.standby:a.stopped)}}}createAndStartRecorder(){this.mediaStream&&(this.mediaRecorder=new MediaRecorder(this.mediaStream,{mimeType:this.selectedMime,audioBitsPerSecond:128e3}),this.mediaRecorder.ondataavailable=e=>{if(e.data.size>0&&this.chunks.push(e.data),this.state_$()!==a.running||this.isRestartingForFlush)return;let t=this.chunks.length>=this.segmentMaxChunks,i=this.chunks.length>=this.segmentSoftFlushMinChunks&&this.silenceStartTime!==null;(t||i)&&this.restartRecorderForFlush()},this.mediaRecorder.start(this.timesliceMs))}restartRecorderForFlush(){if(!(!this.mediaRecorder||this.mediaRecorder.state==="inactive")){this.isRestartingForFlush=!0,this.silenceStartTime=null,r.DyFM_Log.info("[CCAP] restartRecorderForFlush: stopping current recorder for mid-recording flush"),this.mediaRecorder.onstop=()=>{this.isRestartingForFlush=!1,this.mediaRecorder=null;let e=this.chunks.length;if(this.flushChunksAsSegment(!1),r.DyFM_Log.info(`[CCAP] restartRecorderForFlush: flushed ${e} chunks as segment`),this.state_$()!==a.running||!this.mediaStream){r.DyFM_Log.info("[CCAP] restartRecorderForFlush: not restarting (state changed or no stream)");return}this.createAndStartRecorder(),r.DyFM_Log.info("[CCAP] restartRecorderForFlush: new recorder started for next segment")};try{this.mediaRecorder.stop()}catch{this.isRestartingForFlush=!1,this.mediaRecorder=null,this.flushChunksAsSegment(!1)}}}flushChunksAsSegment(e){if(this.chunks.length===0)return;let t=new Blob(this.chunks,{type:this.selectedMime}),i={mimeType:this.selectedMime,filename:`audio-${Date.now()}.${this.getExtension()}`,chunkIndex:this.chunkIndex++,isFinal:e};this.chunks=[],this.onChunkCb?.(t,i)}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";r.DyFM_Log.info("[CCAP] AudioContext state changed:",i),i==="suspended"&&this.state_$()!==a.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 c=0;c<e.length;c++)i+=Math.abs(e[c]);let n=i/e.length;this.onVolumeCb(n);let l=this.state_$();if(l===a.standby&&n>=this.volumeGate){this.startCapture(),this.volumeAnimationId=requestAnimationFrame(t);return}l===a.running&&!this.isRestartingForFlush&&(n<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=()=>{r.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||o)};static \u0275prov=m({token:o,factory:o.\u0275fac,providedIn:"root"})}return o})();export{a,d as b,z as c};
|
|
2
|
-
//# sourceMappingURL=chunk-EVTV632M.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
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 * 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 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 és indítása a meglévő stream-mel.\n * Közös logika startCapture és restartRecorderForFlush között.\n */\n private createAndStartRecorder(): void {\n if (!this.mediaStream) {\n return;\n }\n this.mediaRecorder = new MediaRecorder(this.mediaStream, {\n mimeType: this.selectedMime,\n audioBitsPerSecond: 128000,\n });\n this.mediaRecorder.ondataavailable = (ev: BlobEvent): void => {\n if (ev.data.size > 0) {\n this.chunks.push(ev.data);\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 // Hard szegmens határ (max chunks elérve) → flush.\n const reachedMax: boolean = this.chunks.length >= this.segmentMaxChunks;\n // Puha szegmens határ: elég chunk gyűlt és csend van → szóhatáron vágunk, nem szó közepén.\n const isSoftFlush: boolean = this.chunks.length >= this.segmentSoftFlushMinChunks\n && this.silenceStartTime !== null;\n if (reachedMax || isSoftFlush) {\n this.restartRecorderForFlush();\n }\n };\n this.mediaRecorder.start(this.timesliceMs);\n }\n\n /**\n * Mid-recording flush: MediaRecorder újraindítása a meglévő stream-mel.\n * A stop() triggereli az utolsó ondataavailable-t (bufferelt hang), majd onstop-ban flush + új\n * recorder indítás. Ez biztosítja, hogy minden szegmens saját WebM init szegmenst kap (EBML header +\n * Segment + Tracks) és a Cluster timestamp-ek 0-tól indulnak.\n */\n private restartRecorderForFlush(): void {\n if (!this.mediaRecorder || this.mediaRecorder.state === 'inactive') {\n return;\n }\n this.isRestartingForFlush = true;\n // Silence timer reset: a restart utáni új recorder friss csendidőzítőt kap.\n // Ha nem töröljük, a volume loop tick a régi silenceStartTime-mal azonnal stopCapture-t hívna,\n // mert Date.now() - silenceStartTime >= 5000ms már igaz a flush előtti csendből.\n this.silenceStartTime = null;\n DyFM_Log.info('[CCAP] restartRecorderForFlush: stopping current recorder for mid-recording flush');\n this.mediaRecorder.onstop = (): void => {\n this.isRestartingForFlush = false;\n this.mediaRecorder = null;\n const chunkCount: number = this.chunks.length;\n this.flushChunksAsSegment(false);\n DyFM_Log.info(`[CCAP] restartRecorderForFlush: flushed ${chunkCount} chunks as segment`);\n // Ha közben stopListening hívódott (state nem running), nem indítunk új recorder-t.\n if (this.state_$() !== CCAP_SoundRecorderState_State.running || !this.mediaStream) {\n DyFM_Log.info('[CCAP] restartRecorderForFlush: not restarting (state changed or no stream)');\n return;\n }\n this.createAndStartRecorder();\n DyFM_Log.info('[CCAP] restartRecorderForFlush: new recorder started for next segment');\n };\n try {\n this.mediaRecorder.stop();\n } catch {\n // MediaRecorder már inactive — kézi flush.\n this.isRestartingForFlush = false;\n this.mediaRecorder = null;\n this.flushChunksAsSegment(false);\n }\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 */\n private flushChunksAsSegment(isFinal: boolean): void {\n if (this.chunks.length === 0) {\n return;\n }\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 };\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", "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", "mimeType", "audioBitsPerSecond", "ondataavailable", "ev", "data", "size", "push", "reachedMax", "length", "isSoftFlush", "restartRecorderForFlush", "start", "state", "chunkCount", "isFinal", "blob", "Blob", "type", "meta", "filename", "Date", "now", "AudioContext", "resume", "catch", "onstatechange", "ctxState", "createMediaStreamSource", "createAnalyser", "fftSize", "smoothingTimeConstant", "connect", "timeDomainArray", "Float32Array", "tick", "getFloatTimeDomainData", "sum", "i", "Math", "abs", "volume", "requestAnimationFrame", "cancelAnimationFrame", "close", "addEventListener", "removeEventListener", "factory", "\u0275fac", "providedIn"]
|
|
7
|
-
}
|