@futdevpro/ccap 1.1.3034 → 1.1.3039

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.
Files changed (181) hide show
  1. package/client-dist/{agent-instances.module-DNEQ4QES.js → agent-instances.module-63DMGKO2.js} +2 -2
  2. package/client-dist/{ca.module-RGPRFFQR.js → ca.module-T4GLGQMJ.js} +2 -2
  3. package/client-dist/ca.module-T4GLGQMJ.js.map +7 -0
  4. package/client-dist/{cc-usage-dashboard.component-PEZVSG7M.js → cc-usage-dashboard.component-WQFT75MV.js} +2 -2
  5. package/client-dist/{cc.module-JUQY7GCV.js → cc.module-PEJ6OV2U.js} +2 -2
  6. package/client-dist/cc.module-PEJ6OV2U.js.map +7 -0
  7. package/client-dist/{chunk-E4KDYJK2.js → chunk-2AGHFWEW.js} +2 -2
  8. package/client-dist/{chunk-ZGYR3BWU.js → chunk-2K7AS4TQ.js} +2 -2
  9. package/client-dist/{chunk-AZLDEUIZ.js → chunk-3GFRMENC.js} +2 -2
  10. package/client-dist/{chunk-AOKITOTZ.js → chunk-3ZIP6GFB.js} +2 -2
  11. package/client-dist/{chunk-B5D2O575.js → chunk-44PQAFEL.js} +2 -2
  12. package/client-dist/{chunk-6HT66YVK.js → chunk-4MMPDNPS.js} +2 -2
  13. package/client-dist/{chunk-YPZWNP5A.js → chunk-54YZZ7DI.js} +2 -2
  14. package/client-dist/{chunk-IIZH7NVD.js → chunk-56Q57BLF.js} +2 -2
  15. package/client-dist/{chunk-FV6SC2QU.js → chunk-5A22WYW7.js} +2 -2
  16. package/client-dist/{chunk-OMXNVPGE.js → chunk-5VMMYEMK.js} +2 -2
  17. package/client-dist/{chunk-Q5DHVZ7D.js → chunk-5Y3UBNHV.js} +2 -2
  18. package/client-dist/{chunk-P6FPD5OQ.js → chunk-6PIFC53E.js} +2 -2
  19. package/client-dist/{chunk-ZVQUYA4H.js → chunk-73W3SDF2.js} +2 -2
  20. package/client-dist/{chunk-YS7A2NP6.js → chunk-AD7RW3IE.js} +2 -2
  21. package/client-dist/{chunk-H3UBW75V.js → chunk-ATR4YAIL.js} +2 -2
  22. package/client-dist/{chunk-JWZ24GIQ.js → chunk-BJYELNNP.js} +2 -2
  23. package/client-dist/{chunk-P7KPEPO7.js → chunk-BNALWJUC.js} +2 -2
  24. package/client-dist/{chunk-JIYKLYYE.js → chunk-BPWY4SOQ.js} +2 -2
  25. package/client-dist/{chunk-HQMSP7F6.js → chunk-C4H7J567.js} +2 -2
  26. package/client-dist/{chunk-C77QVQH5.js → chunk-CUMUA2HP.js} +2 -2
  27. package/client-dist/{chunk-6H3YM2KP.js → chunk-EUMQRYBI.js} +2 -2
  28. package/client-dist/{chunk-SY5M3A3Q.js → chunk-GABPE7B3.js} +2 -2
  29. package/client-dist/{chunk-F4HSG3GQ.js → chunk-GBRJVJWI.js} +2 -2
  30. package/client-dist/{chunk-IEVAOKOF.js → chunk-H6OPOJX2.js} +2 -2
  31. package/client-dist/{chunk-ED2JP2SX.js → chunk-I3IKMSNZ.js} +2 -2
  32. package/client-dist/{chunk-AHBMUOS3.js → chunk-IOERVA2Z.js} +2 -2
  33. package/client-dist/{chunk-TS2SSYDS.js → chunk-JDBS6ZXD.js} +2 -2
  34. package/client-dist/{chunk-DOJVWJJ3.js → chunk-KD4JK4LC.js} +2 -2
  35. package/client-dist/{chunk-RJGC4CE7.js → chunk-M4CGCNOB.js} +2 -2
  36. package/client-dist/{chunk-E7UUENED.js → chunk-NNEFCEZZ.js} +2 -2
  37. package/client-dist/{chunk-Y2AUIGUM.js → chunk-NXBECCCW.js} +2 -2
  38. package/client-dist/{chunk-QE7LJZUK.js → chunk-OHI3J35R.js} +2 -2
  39. package/client-dist/{chunk-343QTRWG.js → chunk-OITOJMIX.js} +2 -2
  40. package/client-dist/{chunk-TBPY4N7X.js → chunk-PWGYG7KG.js} +2 -2
  41. package/client-dist/{chunk-KLIVF7NF.js → chunk-RIYSXVU2.js} +2 -2
  42. package/client-dist/{chunk-ZTPYZH3Z.js → chunk-RJX7O3DI.js} +2 -2
  43. package/client-dist/{chunk-CDFLZ523.js → chunk-RZPQNQWP.js} +2 -2
  44. package/client-dist/{chunk-AC6VDECU.js → chunk-S2FEPCDW.js} +2 -2
  45. package/client-dist/{chunk-B22GYBFL.js → chunk-SDS4IT63.js} +2 -2
  46. package/client-dist/{chunk-H62NDY3W.js → chunk-SNMSF3UC.js} +2 -2
  47. package/client-dist/{chunk-4F6OM6PQ.js → chunk-TKAV5X35.js} +2 -2
  48. package/client-dist/{chunk-BY7QOLIO.js → chunk-TXVACKLG.js} +2 -2
  49. package/client-dist/{chunk-OXGMGAWK.js → chunk-U3FLQ2MZ.js} +2 -2
  50. package/client-dist/{chunk-OXGMGAWK.js.map → chunk-U3FLQ2MZ.js.map} +2 -2
  51. package/client-dist/{chunk-TRPIAKRB.js → chunk-UOZVXYOQ.js} +2 -2
  52. package/client-dist/{chunk-MVAZ7JR5.js → chunk-UPREBG2C.js} +2 -2
  53. package/client-dist/{chunk-ZLKNTGRH.js → chunk-VA3QGKXE.js} +2 -2
  54. package/client-dist/{chunk-PS73GRXP.js → chunk-VILXJBM4.js} +2 -2
  55. package/client-dist/{chunk-5DVU3XRC.js → chunk-VRI47IVY.js} +2 -2
  56. package/client-dist/{chunk-5DVU3XRC.js.map → chunk-VRI47IVY.js.map} +1 -1
  57. package/client-dist/{chunk-3MSKVM2T.js → chunk-VS3F3LTC.js} +2 -2
  58. package/client-dist/{chunk-WKY6ZRDX.js → chunk-W3WV5NJ7.js} +2 -2
  59. package/client-dist/{chunk-Z2SVASLX.js → chunk-WL5L5AUS.js} +2 -2
  60. package/client-dist/{chunk-7R5IXHU5.js → chunk-WPT7HGB2.js} +2 -2
  61. package/client-dist/{chunk-CF6YGIKE.js → chunk-XSZRRELF.js} +2 -2
  62. package/client-dist/{chunk-XMFYG4OB.js → chunk-ZE4SBBQZ.js} +2 -2
  63. package/client-dist/{chunk-7SDU766A.js → chunk-ZELVI2B7.js} +2 -2
  64. package/client-dist/{chunk-CK5ZMGFL.js → chunk-ZKMLJXN4.js} +2 -2
  65. package/client-dist/{consultant.module-VDHVKNXB.js → consultant.module-H52V7TON.js} +2 -2
  66. package/client-dist/{consultant.module-VDHVKNXB.js.map → consultant.module-H52V7TON.js.map} +2 -2
  67. package/client-dist/{crd.module-746ZW6FL.js → crd.module-X5U6DQ3D.js} +2 -2
  68. package/client-dist/{dashboard.module-U2NE6P3E.js → dashboard.module-4LC4RSOF.js} +2 -2
  69. package/client-dist/{do.module-5V6Y3CDL.js → do.module-HWKFQZQK.js} +2 -2
  70. package/client-dist/{document-library.module-HXQGKT63.js → document-library.module-Z57ZOMUG.js} +2 -2
  71. package/client-dist/{embedding-eval.module-OENZYGQE.js → embedding-eval.module-ULD6Z5XA.js} +2 -2
  72. package/client-dist/{embedding-registry.module-RTS4TH4Q.js → embedding-registry.module-TGWG2VER.js} +2 -2
  73. package/client-dist/{err.module-E4JTGICP.js → err.module-V5HQPNPJ.js} +2 -2
  74. package/client-dist/{feedback.module-YFIHVIAZ.js → feedback.module-U2Z6XYBB.js} +2 -2
  75. package/client-dist/{host-runtime-mcp.module-N73MDNBO.js → host-runtime-mcp.module-ZZGAS7DP.js} +2 -2
  76. package/client-dist/index.html +1 -1
  77. package/client-dist/{live-dev-pipeline.module-IA4J3U76.js → live-dev-pipeline.module-TPPLFJXH.js} +2 -2
  78. package/client-dist/{logs.module-VRVZQ76G.js → logs.module-5ZT7XQ3Q.js} +2 -2
  79. package/client-dist/{main-AYZ66GKH.js → main-NSPSEMNL.js} +3 -3
  80. package/client-dist/{main-AYZ66GKH.js.map → main-NSPSEMNL.js.map} +2 -2
  81. package/client-dist/{master-control-remote-poc.module-ENMKL3BL.js → master-control-remote-poc.module-IK64YCVI.js} +2 -2
  82. package/client-dist/{mobile-app.module-25TPEFGS.js → mobile-app.module-GI44MNWC.js} +2 -2
  83. package/client-dist/{model-registry.module-DTJEN56N.js → model-registry.module-F7M4C7MR.js} +2 -2
  84. package/client-dist/{oc.module-2ZFRFAWW.js → oc.module-G4TGODLQ.js} +2 -2
  85. package/client-dist/oc.module-G4TGODLQ.js.map +7 -0
  86. package/client-dist/{orc.module-JLA5C7MW.js → orc.module-DOAWAEFJ.js} +2 -2
  87. package/client-dist/{project-management.module-NBKCZQ6Y.js → project-management.module-2SDSNJJL.js} +2 -2
  88. package/client-dist/project-source-routed.module-CQLNUDIR.js +2 -0
  89. package/client-dist/{scheduler.module-HFDAX5PZ.js → scheduler.module-25VUGCV3.js} +2 -2
  90. package/client-dist/{session.module-S5W7MI7Z.js → session.module-Q3KGKPUU.js} +2 -2
  91. package/client-dist/session.module-Q3KGKPUU.js.map +7 -0
  92. package/client-dist/{set.module-5NOTNWQ3.js → set.module-4NWORE5F.js} +2 -2
  93. package/client-dist/{setup.module-NBPWQBBC.js → setup.module-N3AYAAZ6.js} +2 -2
  94. package/client-dist/{terminals.module-2MRATCCN.js → terminals.module-3ELX7JV6.js} +2 -2
  95. package/client-dist/{voice-notes-poc.module-QRB77K3S.js → voice-notes-poc.module-ZHORCWRL.js} +2 -2
  96. package/client-dist/{wfs.module-ZWBQCUOA.js → wfs.module-EDYBZUSQ.js} +2 -2
  97. package/package.json +1 -1
  98. package/client-dist/ca.module-RGPRFFQR.js.map +0 -7
  99. package/client-dist/cc.module-JUQY7GCV.js.map +0 -7
  100. package/client-dist/oc.module-2ZFRFAWW.js.map +0 -7
  101. package/client-dist/project-source-routed.module-MDS232LH.js +0 -2
  102. package/client-dist/session.module-S5W7MI7Z.js.map +0 -7
  103. /package/client-dist/{agent-instances.module-DNEQ4QES.js.map → agent-instances.module-63DMGKO2.js.map} +0 -0
  104. /package/client-dist/{cc-usage-dashboard.component-PEZVSG7M.js.map → cc-usage-dashboard.component-WQFT75MV.js.map} +0 -0
  105. /package/client-dist/{chunk-E4KDYJK2.js.map → chunk-2AGHFWEW.js.map} +0 -0
  106. /package/client-dist/{chunk-ZGYR3BWU.js.map → chunk-2K7AS4TQ.js.map} +0 -0
  107. /package/client-dist/{chunk-AZLDEUIZ.js.map → chunk-3GFRMENC.js.map} +0 -0
  108. /package/client-dist/{chunk-AOKITOTZ.js.map → chunk-3ZIP6GFB.js.map} +0 -0
  109. /package/client-dist/{chunk-B5D2O575.js.map → chunk-44PQAFEL.js.map} +0 -0
  110. /package/client-dist/{chunk-6HT66YVK.js.map → chunk-4MMPDNPS.js.map} +0 -0
  111. /package/client-dist/{chunk-YPZWNP5A.js.map → chunk-54YZZ7DI.js.map} +0 -0
  112. /package/client-dist/{chunk-IIZH7NVD.js.map → chunk-56Q57BLF.js.map} +0 -0
  113. /package/client-dist/{chunk-FV6SC2QU.js.map → chunk-5A22WYW7.js.map} +0 -0
  114. /package/client-dist/{chunk-OMXNVPGE.js.map → chunk-5VMMYEMK.js.map} +0 -0
  115. /package/client-dist/{chunk-Q5DHVZ7D.js.map → chunk-5Y3UBNHV.js.map} +0 -0
  116. /package/client-dist/{chunk-P6FPD5OQ.js.map → chunk-6PIFC53E.js.map} +0 -0
  117. /package/client-dist/{chunk-ZVQUYA4H.js.map → chunk-73W3SDF2.js.map} +0 -0
  118. /package/client-dist/{chunk-YS7A2NP6.js.map → chunk-AD7RW3IE.js.map} +0 -0
  119. /package/client-dist/{chunk-H3UBW75V.js.map → chunk-ATR4YAIL.js.map} +0 -0
  120. /package/client-dist/{chunk-JWZ24GIQ.js.map → chunk-BJYELNNP.js.map} +0 -0
  121. /package/client-dist/{chunk-P7KPEPO7.js.map → chunk-BNALWJUC.js.map} +0 -0
  122. /package/client-dist/{chunk-JIYKLYYE.js.map → chunk-BPWY4SOQ.js.map} +0 -0
  123. /package/client-dist/{chunk-HQMSP7F6.js.map → chunk-C4H7J567.js.map} +0 -0
  124. /package/client-dist/{chunk-C77QVQH5.js.map → chunk-CUMUA2HP.js.map} +0 -0
  125. /package/client-dist/{chunk-6H3YM2KP.js.map → chunk-EUMQRYBI.js.map} +0 -0
  126. /package/client-dist/{chunk-SY5M3A3Q.js.map → chunk-GABPE7B3.js.map} +0 -0
  127. /package/client-dist/{chunk-F4HSG3GQ.js.map → chunk-GBRJVJWI.js.map} +0 -0
  128. /package/client-dist/{chunk-IEVAOKOF.js.map → chunk-H6OPOJX2.js.map} +0 -0
  129. /package/client-dist/{chunk-ED2JP2SX.js.map → chunk-I3IKMSNZ.js.map} +0 -0
  130. /package/client-dist/{chunk-AHBMUOS3.js.map → chunk-IOERVA2Z.js.map} +0 -0
  131. /package/client-dist/{chunk-TS2SSYDS.js.map → chunk-JDBS6ZXD.js.map} +0 -0
  132. /package/client-dist/{chunk-DOJVWJJ3.js.map → chunk-KD4JK4LC.js.map} +0 -0
  133. /package/client-dist/{chunk-RJGC4CE7.js.map → chunk-M4CGCNOB.js.map} +0 -0
  134. /package/client-dist/{chunk-E7UUENED.js.map → chunk-NNEFCEZZ.js.map} +0 -0
  135. /package/client-dist/{chunk-Y2AUIGUM.js.map → chunk-NXBECCCW.js.map} +0 -0
  136. /package/client-dist/{chunk-QE7LJZUK.js.map → chunk-OHI3J35R.js.map} +0 -0
  137. /package/client-dist/{chunk-343QTRWG.js.map → chunk-OITOJMIX.js.map} +0 -0
  138. /package/client-dist/{chunk-TBPY4N7X.js.map → chunk-PWGYG7KG.js.map} +0 -0
  139. /package/client-dist/{chunk-KLIVF7NF.js.map → chunk-RIYSXVU2.js.map} +0 -0
  140. /package/client-dist/{chunk-ZTPYZH3Z.js.map → chunk-RJX7O3DI.js.map} +0 -0
  141. /package/client-dist/{chunk-CDFLZ523.js.map → chunk-RZPQNQWP.js.map} +0 -0
  142. /package/client-dist/{chunk-AC6VDECU.js.map → chunk-S2FEPCDW.js.map} +0 -0
  143. /package/client-dist/{chunk-B22GYBFL.js.map → chunk-SDS4IT63.js.map} +0 -0
  144. /package/client-dist/{chunk-H62NDY3W.js.map → chunk-SNMSF3UC.js.map} +0 -0
  145. /package/client-dist/{chunk-4F6OM6PQ.js.map → chunk-TKAV5X35.js.map} +0 -0
  146. /package/client-dist/{chunk-BY7QOLIO.js.map → chunk-TXVACKLG.js.map} +0 -0
  147. /package/client-dist/{chunk-TRPIAKRB.js.map → chunk-UOZVXYOQ.js.map} +0 -0
  148. /package/client-dist/{chunk-MVAZ7JR5.js.map → chunk-UPREBG2C.js.map} +0 -0
  149. /package/client-dist/{chunk-ZLKNTGRH.js.map → chunk-VA3QGKXE.js.map} +0 -0
  150. /package/client-dist/{chunk-PS73GRXP.js.map → chunk-VILXJBM4.js.map} +0 -0
  151. /package/client-dist/{chunk-3MSKVM2T.js.map → chunk-VS3F3LTC.js.map} +0 -0
  152. /package/client-dist/{chunk-WKY6ZRDX.js.map → chunk-W3WV5NJ7.js.map} +0 -0
  153. /package/client-dist/{chunk-Z2SVASLX.js.map → chunk-WL5L5AUS.js.map} +0 -0
  154. /package/client-dist/{chunk-7R5IXHU5.js.map → chunk-WPT7HGB2.js.map} +0 -0
  155. /package/client-dist/{chunk-CF6YGIKE.js.map → chunk-XSZRRELF.js.map} +0 -0
  156. /package/client-dist/{chunk-XMFYG4OB.js.map → chunk-ZE4SBBQZ.js.map} +0 -0
  157. /package/client-dist/{chunk-7SDU766A.js.map → chunk-ZELVI2B7.js.map} +0 -0
  158. /package/client-dist/{chunk-CK5ZMGFL.js.map → chunk-ZKMLJXN4.js.map} +0 -0
  159. /package/client-dist/{crd.module-746ZW6FL.js.map → crd.module-X5U6DQ3D.js.map} +0 -0
  160. /package/client-dist/{dashboard.module-U2NE6P3E.js.map → dashboard.module-4LC4RSOF.js.map} +0 -0
  161. /package/client-dist/{do.module-5V6Y3CDL.js.map → do.module-HWKFQZQK.js.map} +0 -0
  162. /package/client-dist/{document-library.module-HXQGKT63.js.map → document-library.module-Z57ZOMUG.js.map} +0 -0
  163. /package/client-dist/{embedding-eval.module-OENZYGQE.js.map → embedding-eval.module-ULD6Z5XA.js.map} +0 -0
  164. /package/client-dist/{embedding-registry.module-RTS4TH4Q.js.map → embedding-registry.module-TGWG2VER.js.map} +0 -0
  165. /package/client-dist/{err.module-E4JTGICP.js.map → err.module-V5HQPNPJ.js.map} +0 -0
  166. /package/client-dist/{feedback.module-YFIHVIAZ.js.map → feedback.module-U2Z6XYBB.js.map} +0 -0
  167. /package/client-dist/{host-runtime-mcp.module-N73MDNBO.js.map → host-runtime-mcp.module-ZZGAS7DP.js.map} +0 -0
  168. /package/client-dist/{live-dev-pipeline.module-IA4J3U76.js.map → live-dev-pipeline.module-TPPLFJXH.js.map} +0 -0
  169. /package/client-dist/{logs.module-VRVZQ76G.js.map → logs.module-5ZT7XQ3Q.js.map} +0 -0
  170. /package/client-dist/{master-control-remote-poc.module-ENMKL3BL.js.map → master-control-remote-poc.module-IK64YCVI.js.map} +0 -0
  171. /package/client-dist/{mobile-app.module-25TPEFGS.js.map → mobile-app.module-GI44MNWC.js.map} +0 -0
  172. /package/client-dist/{model-registry.module-DTJEN56N.js.map → model-registry.module-F7M4C7MR.js.map} +0 -0
  173. /package/client-dist/{orc.module-JLA5C7MW.js.map → orc.module-DOAWAEFJ.js.map} +0 -0
  174. /package/client-dist/{project-management.module-NBKCZQ6Y.js.map → project-management.module-2SDSNJJL.js.map} +0 -0
  175. /package/client-dist/{project-source-routed.module-MDS232LH.js.map → project-source-routed.module-CQLNUDIR.js.map} +0 -0
  176. /package/client-dist/{scheduler.module-HFDAX5PZ.js.map → scheduler.module-25VUGCV3.js.map} +0 -0
  177. /package/client-dist/{set.module-5NOTNWQ3.js.map → set.module-4NWORE5F.js.map} +0 -0
  178. /package/client-dist/{setup.module-NBPWQBBC.js.map → setup.module-N3AYAAZ6.js.map} +0 -0
  179. /package/client-dist/{terminals.module-2MRATCCN.js.map → terminals.module-3ELX7JV6.js.map} +0 -0
  180. /package/client-dist/{voice-notes-poc.module-QRB77K3S.js.map → voice-notes-poc.module-ZHORCWRL.js.map} +0 -0
  181. /package/client-dist/{wfs.module-ZWBQCUOA.js.map → wfs.module-EDYBZUSQ.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["src/app/_modules/project-management/_collections/utils/pm-sha256-fingerprint.util.ts", "src/app/_modules/project-management/_services/data-services/project-management.data-service.ts", "src/app/_modules/shared/_components/s-project-badge/s-project-badge.component.ts", "src/app/_modules/shared/_components/s-project-badge/s-project-badge.component.html", "src/app/_modules/shared/_components/session-ui/s-session-info-card/s-session-info-card.component.ts", "src/app/_modules/shared/_components/session-ui/s-session-info-card/s-session-info-card.component.html", "src/app/_modules/shared/_components/session-ui/s-session-select/s-session-select.component.ts", "src/app/_modules/shared/_components/session-ui/s-session-select/s-session-select.component.html"],
4
- "sourcesContent": ["/**\n * PM entry-mutation: prior blokk SHA-256 fingerprint (UTF-8, LF normalizált) — szerver PM_ControlEntryMutation_Util egyeztetéshez.\n */\nexport class PM_Sha256Fingerprint_Util {\n\n /**\n * Sorvégek normalizálása LF-re (szerver `normalizeNewlines` egyezése).\n */\n static normalizeNewlines(text: string): string {\n return text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n }\n\n /**\n * SHA-256 hex digest UTF-8 byte-okra a normalizált szövegből.\n */\n static async sha256HexOfNormalized(text: string): Promise<string> {\n const normalized: string = PM_Sha256Fingerprint_Util.normalizeNewlines(text);\n const encoder: TextEncoder = new TextEncoder();\n const data: Uint8Array = encoder.encode(normalized);\n const digest: ArrayBuffer = await crypto.subtle.digest('SHA-256', data);\n const bytes: Uint8Array = new Uint8Array(digest);\n let hex: string = '';\n for (let i: number = 0; i < bytes.length; i += 1) {\n hex += bytes[i].toString(16).padStart(2, '0');\n }\n return hex;\n }\n}\n", "import { inject, Injectable, signal } from '@angular/core';\n\nimport { DT_DeveloperReviewMeta_Response } from '../../../../_models/server-index';\nimport { DT_DeveloperRun_Response } from '../../../../_models/server-index';\nimport { PM_AllFileContents_Response } from '../../../../_models/server-index';\nimport {\n PM_AppendBugsFromErrors_Request,\n PM_AppendBugsFromErrors_Response,\n PM_AppendSingleBugFromError_Response,\n PM_BugsPathResolution_Response,\n PM_CreateUserRequestHttpBody_Request,\n PM_ManualBugCreate_Request,\n PM_ManualBugCreate_Response,\n} from '../../../../_models/server-index';\nimport { PM_DiscoveredProject_Response } from '../../../../_models/server-index';\nimport {\n PM_AgentReport_Interface,\n PM_AgentReportContent_Response,\n} from '../../../../_models/server-index';\nimport {\n PM_GetProject_Response,\n PM_ListProjects_Response,\n} from '../../../../_models/server-index';\nimport { PM_ } from '../../../../_models/server-index';\nimport { PM_SyncResult_Response } from '../../../../_models/server-index';\nimport { PM_UserRequest } from '../../../../_models/server-index';\nimport { PM_Response } from '../../../../_models/server-index';\nimport { PM_UserRequest_Response } from '../../../../_models/server-index';\nimport {\n PM_ControlEntryMutation_Request,\n PM_ControlEntryMutation_Response,\n PM_UserInputFinalize_Request,\n PM_UserInputFinalize_Response,\n PM_UserInputSuggestFormat_Request,\n PM_UserInputSuggestFormat_Response,\n} from '../../../../_models/server-index';\nimport { PM_ControlFileType_Type } from '../../../../_models/server-index';\nimport { PM_Group_DataModel } from '../../../../_models/server-index';\nimport { PM_GroupFiles_Response } from '../../../../_models/server-index';\nimport { ProjectManagement_ApiService } from '../project-management.api-service';\nimport { PM_Sha256Fingerprint_Util } from '../../_collections/utils/pm-sha256-fingerprint.util';\n\n/**\n * Project Management data service (SSOT).\n * Projektek és user request-ek kliens-oldali állapotkezelése.\n */\n@Injectable({ providedIn: 'root' })\nexport class ProjectManagement_DataService {\n\n /** Projektek listája. */\n readonly projects_$ = signal<PM_[]>([]);\n\n /** Betöltés folyamatban (projekt lista). */\n readonly projectsLoading_$ = signal<boolean>(false);\n\n /** Projekt lista betöltési hiba (null = nincs). */\n readonly projectsError_$ = signal<unknown | null>(null);\n\n /**\n * Első sikeres projekt-lista betöltés megtörtént-e (lazy-load guard).\n * Olyan komponensek használják, amelyek opcionálisan tudnak projektekre hivatkozni\n * (pl. project-név badge session listákon), de nem akarnak minden újrarenderelésnél\n * újra fetch-elni, és nem akarják a \"0 projekt\" esetet folyamatosan újrapróbálni.\n */\n readonly projectsLoadedOnce_$ = signal<boolean>(false);\n\n /** Aktuálisan megnyitott projekt. */\n readonly activeProject_$ = signal<PM_ | null>(null);\n\n /**\n * Szerver által számolt flag: a projekt git/GitHub URL alapján CCAP Revisioned host-e\n * (error → BUGS.md bridge).\n */\n readonly activeProjectComputedCcapHost_$ = signal<boolean>(false);\n\n /** Aktív projekt betöltés folyamatban. */\n readonly activeProjectLoading_$ = signal<boolean>(false);\n\n /** Aktív projekt betöltési hiba (null = nincs). */\n readonly activeProjectError_$ = signal<unknown | null>(null);\n\n /** Aktív projekt user request-jeinek listája. */\n readonly userRequests_$ = signal<PM_UserRequest[]>([]);\n\n /** User request lista betöltés folyamatban. */\n readonly userRequestsLoading_$ = signal<boolean>(false);\n\n /** User request lista betöltési hiba (null = nincs). */\n readonly userRequestsError_$ = signal<unknown | null>(null);\n\n /** Felfedezett projektek listája (utolsó scan eredménye). */\n readonly discoveredProjects_$ = signal<PM_DiscoveredProject_Response[]>([]);\n\n /** Discovery scan folyamatban. */\n readonly discoveryLoading_$ = signal<boolean>(false);\n\n /** Discovery scan hiba (null = nincs). */\n readonly discoveryError_$ = signal<unknown | null>(null);\n\n /** Git status refresh folyamatban. */\n readonly gitStatusLoading_$ = signal<boolean>(false);\n\n /** Git status refresh hiba (null = nincs). */\n readonly gitStatusError_$ = signal<unknown | null>(null);\n\n /** Sync folyamatban (egy projektre vagy sync-all). */\n readonly syncLoading_$ = signal<boolean>(false);\n\n /** Sync hiba (null = nincs). */\n readonly syncError_$ = signal<unknown | null>(null);\n\n /** Utolsó sync eredménye (egy projektre). */\n readonly lastSyncResult_$ = signal<PM_SyncResult_Response | null>(null);\n\n /** Kontroll fájlok parse-olt tartalma (minden fájl egyben). */\n readonly fileContents_$ = signal<PM_AllFileContents_Response | null>(null);\n\n /** Kontroll fájl betöltés folyamatban. */\n readonly fileContentLoading_$ = signal<boolean>(false);\n\n /** Kontroll fájl betöltési hiba. */\n readonly fileContentError_$ = signal<unknown | null>(null);\n\n /** Test error reports fájl Clear művelet alatt. */\n readonly testErrorReportsClearing_$ = signal<boolean>(false);\n\n // ─── Agent Reports (REQ-PM-AGT-001 Slice 4) ────────────────────────\n\n /** `__agent/reports/**` lista-betöltés eredménye (descending dátum). */\n readonly agentReports_$ = signal<PM_AgentReport_Interface[]>([]);\n\n /** Agent reports lista-betöltés folyamatban. */\n readonly agentReportsLoading_$ = signal<boolean>(false);\n\n /** Agent reports lista-betöltési hiba. */\n readonly agentReportsError_$ = signal<unknown | null>(null);\n\n /** Aktuálisan megnyitott riport tartalma (detail). */\n readonly activeAgentReport_$ = signal<PM_AgentReportContent_Response | null>(null);\n\n /** Detail-betöltés folyamatban. */\n readonly activeAgentReportLoading_$ = signal<boolean>(false);\n\n /** Detail-betöltési hiba. */\n readonly activeAgentReportError_$ = signal<unknown | null>(null);\n\n /** Elérhető review-k metaadata. */\n readonly reviewsMeta_$ = signal<DT_DeveloperReviewMeta_Response[]>([]);\n\n /** Review meta betöltés folyamatban. */\n readonly reviewsMetaLoading_$ = signal<boolean>(false);\n\n /** Review meta betöltési hiba. */\n readonly reviewsMetaError_$ = signal<unknown | null>(null);\n\n /** Utolsó review futtatás eredménye. */\n readonly reviewResult_$ = signal<DT_DeveloperRun_Response | null>(null);\n\n /** Review futtatás folyamatban. */\n readonly reviewsRunning_$ = signal<boolean>(false);\n\n /** Review futtatási hiba. */\n readonly reviewsRunError_$ = signal<unknown | null>(null);\n\n /** USER-INPUT wizard suggest folyamatban. */\n readonly userInputWizardSuggestLoading_$ = signal<boolean>(false);\n\n /** USER-INPUT wizard suggest hiba. */\n readonly userInputWizardSuggestError_$ = signal<unknown | null>(null);\n\n /** USER-INPUT wizard finalize folyamatban. */\n readonly userInputWizardFinalizeLoading_$ = signal<boolean>(false);\n\n /** USER-INPUT wizard finalize hiba. */\n readonly userInputWizardFinalizeError_$ = signal<unknown | null>(null);\n\n /** Utolsó USER-INPUT suggest LLM system prompt (transzparencia). */\n readonly userInputWizardLastLlmSystemPrompt_$ = signal<string | null>(null);\n\n /** Utolsó USER-INPUT suggest LLM user message (transzparencia). */\n readonly userInputWizardLastLlmUserMessage_$ = signal<string | null>(null);\n\n // --- Project Groups ---\n\n /** Projekt csoportok listája. */\n readonly groups_$ = signal<PM_Group_DataModel[]>([]);\n\n /** Csoport lista betöltés folyamatban. */\n readonly groupsLoading_$ = signal<boolean>(false);\n\n /** Csoport lista betöltési hiba. */\n readonly groupsError_$ = signal<unknown | null>(null);\n\n /** Kiválasztott csoport (szűrőként működik a projekt listán). */\n readonly activeGroup_$ = signal<PM_Group_DataModel | null>(null);\n\n /** Group extra fájlok (live scan eredménye). */\n readonly groupFiles_$ = signal<PM_GroupFiles_Response | null>(null);\n\n /** Group file lista betöltés folyamatban. */\n readonly groupFilesLoading_$ = signal<boolean>(false);\n\n /** Group file lista betöltési hiba. */\n readonly groupFilesError_$ = signal<unknown | null>(null);\n\n // --- Cross-Instance ---\n\n /** Cross-instance: összes instanc összes projektje. */\n readonly crossInstanceProjects_$ = signal<PM_[]>([]);\n\n /** Cross-instance: betöltés folyamatban. */\n readonly crossInstanceLoading_$ = signal<boolean>(false);\n\n /** Cross-instance: hiba. */\n readonly crossInstanceError_$ = signal<unknown | null>(null);\n\n /** Cross-instance: saját instanc ccapId-ja. */\n readonly currentCcapId_$ = signal<string | null>(null);\n\n /** Cross-instance: klónozás folyamatban. */\n readonly cloneLoading_$ = signal<boolean>(false);\n\n /** Cross-instance: klónozási hiba. */\n readonly cloneError_$ = signal<unknown | null>(null);\n\n private readonly pm_AS: ProjectManagement_ApiService =\n inject(ProjectManagement_ApiService);\n\n /**\n * Projektek listájának betöltése a szerverről.\n */\n async loadProjects(): Promise<void> {\n this.projectsLoading_$.set(true);\n this.projectsError_$.set(null);\n try {\n const result: PM_ListProjects_Response = await this.pm_AS.listProjects();\n this.projects_$.set(result.projects);\n this.projectsLoadedOnce_$.set(true);\n } catch (err: unknown) {\n this.projectsError_$.set(err);\n } finally {\n this.projectsLoading_$.set(false);\n }\n }\n\n /**\n * Egy projekt betöltése ID alapján (aktív projekt).\n */\n async loadProject(projectId: string): Promise<void> {\n this.activeProjectLoading_$.set(true);\n this.activeProjectError_$.set(null);\n try {\n const result: PM_GetProject_Response = await this.pm_AS.getProject(projectId);\n this.activeProject_$.set(result.project);\n this.activeProjectComputedCcapHost_$.set(result.computedCcapRevisionedHost);\n } catch (err: unknown) {\n this.activeProjectError_$.set(err);\n } finally {\n this.activeProjectLoading_$.set(false);\n }\n }\n\n /**\n * Új projekt létrehozása, majd lista frissítése.\n */\n async createProject(payload: PM_Response): Promise<PM_> {\n const result: { project: PM_ } = await this.pm_AS.createProject(payload);\n await this.loadProjects();\n return result.project;\n }\n\n /**\n * Projekt frissítése, majd aktív projekt state frissítése.\n */\n async updateProject(projectId: string, payload: Partial<PM_Response>): Promise<void> {\n const result: PM_GetProject_Response = await this.pm_AS.updateProject(projectId, payload);\n this.activeProject_$.set(result.project);\n this.activeProjectComputedCcapHost_$.set(result.computedCcapRevisionedHost);\n this.projects_$.update(\n (list: PM_[]): PM_[] =>\n list.map(\n (p: PM_): PM_ =>\n p._id === projectId ? result.project : p,\n ),\n );\n }\n\n /**\n * Projekt archiválása, majd lista frissítése.\n */\n async archiveProject(projectId: string): Promise<void> {\n await this.pm_AS.archiveProject(projectId);\n await this.loadProjects();\n if (this.activeProject_$()?._id === projectId) {\n this.activeProject_$.set(null);\n this.activeProjectComputedCcapHost_$.set(false);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Project Groups\n // ---------------------------------------------------------------------------\n\n /** Projekt csoportok betöltése. */\n async loadGroups(): Promise<void> {\n this.groupsLoading_$.set(true);\n this.groupsError_$.set(null);\n try {\n const result: { groups: PM_Group_DataModel[] } = await this.pm_AS.listGroups();\n this.groups_$.set(result.groups);\n } catch (err: unknown) {\n this.groupsError_$.set(err);\n } finally {\n this.groupsLoading_$.set(false);\n }\n }\n\n /** Új csoport létrehozása, majd lista frissítése. */\n async createGroup(payload: { name: string; scanPath: string; description?: string }): Promise<void> {\n await this.pm_AS.createGroup(payload);\n await this.loadGroups();\n }\n\n /** Csoport archiválása, majd lista frissítése. */\n async archiveGroup(groupId: string): Promise<void> {\n await this.pm_AS.archiveGroup(groupId);\n if (this.activeGroup_$()?._id === groupId) {\n this.activeGroup_$.set(null);\n }\n await this.loadGroups();\n }\n\n /** Csoport kiválasztása (szűrőként működik a projekt listán) vagy szűrő törlése. */\n selectGroup(group: PM_Group_DataModel | null): void {\n this.activeGroup_$.set(group);\n }\n\n /** Group extra fájlok betöltése (live scan a szerveren). */\n async loadGroupFiles(groupId: string): Promise<void> {\n this.groupFilesLoading_$.set(true);\n this.groupFilesError_$.set(null);\n try {\n const result: PM_GroupFiles_Response = await this.pm_AS.getGroupFiles(groupId);\n this.groupFiles_$.set(result);\n } catch (err: unknown) {\n this.groupFilesError_$.set(err);\n } finally {\n this.groupFilesLoading_$.set(false);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Cross-Instance\n // ---------------------------------------------------------------------------\n\n /** Összes instanc összes projektjének betöltése. */\n async loadCrossInstanceProjects(): Promise<void> {\n this.crossInstanceLoading_$.set(true);\n this.crossInstanceError_$.set(null);\n try {\n const result: { projects: PM_[]; currentCcapId: string | null } =\n await this.pm_AS.listAllProjectsAcrossInstances();\n this.crossInstanceProjects_$.set(result.projects);\n this.currentCcapId_$.set(result.currentCcapId);\n } catch (err: unknown) {\n this.crossInstanceError_$.set(err);\n } finally {\n this.crossInstanceLoading_$.set(false);\n }\n }\n\n /** Projekt klónozása a saját instancra. */\n async cloneProject(params: {\n sourceProjectId: string;\n targetParentDir: string;\n repoName?: string;\n }): Promise<void> {\n this.cloneLoading_$.set(true);\n this.cloneError_$.set(null);\n try {\n await this.pm_AS.cloneProject({\n sourceProjectId: params.sourceProjectId,\n targetParentDir: params.targetParentDir,\n repoName: params.repoName,\n });\n // Frissítjük a saját projekt listát a klónozott projekt megjelenéséhez.\n await this.loadProjects();\n } catch (err: unknown) {\n this.cloneError_$.set(err);\n } finally {\n this.cloneLoading_$.set(false);\n }\n }\n\n /** Group klónozása a saját instancra. */\n async cloneGroup(params: {\n sourceGroupId: string;\n targetParentDir: string;\n }): Promise<void> {\n this.cloneLoading_$.set(true);\n this.cloneError_$.set(null);\n try {\n await this.pm_AS.cloneGroup({\n sourceGroupId: params.sourceGroupId,\n targetParentDir: params.targetParentDir,\n });\n // Frissítjük mind a projekt, mind a csoport listát.\n await this.loadProjects();\n await this.loadGroups();\n } catch (err: unknown) {\n this.cloneError_$.set(err);\n } finally {\n this.cloneLoading_$.set(false);\n }\n }\n\n /**\n * Workspace scan: projektek felfedezése a megadott útvonal alatt.\n */\n async discoverProjects(scanPath: string): Promise<void> {\n this.discoveryLoading_$.set(true);\n this.discoveryError_$.set(null);\n this.discoveredProjects_$.set([]);\n try {\n const result: { discoveredProjects: PM_DiscoveredProject_Response[] } =\n await this.pm_AS.discoverProjects(scanPath);\n this.discoveredProjects_$.set(result.discoveredProjects);\n } catch (err: unknown) {\n this.discoveryError_$.set(err);\n } finally {\n this.discoveryLoading_$.set(false);\n }\n }\n\n /**\n * Felfedezett projektek batch létrehozása (a wizard által kiválasztott projektek).\n * A létrehozás után újratölti a projekt listát.\n */\n async createDiscoveredProjects(\n projects: PM_DiscoveredProject_Response[],\n ): Promise<void> {\n for (const discovered of projects) {\n const payload: PM_Response = {\n name: discovered.name,\n localPath: discovered.localPath,\n description: discovered.description,\n githubRepoUrl: discovered.githubRepoUrl,\n isActive: true,\n };\n await this.pm_AS.createProject(payload);\n }\n await this.loadProjects();\n }\n\n /**\n * Discovery state törlése (wizard bezárásakor).\n */\n clearDiscovery(): void {\n this.discoveredProjects_$.set([]);\n this.discoveryError_$.set(null);\n this.discoveryLoading_$.set(false);\n }\n\n /**\n * Git állapot gyors frissítése (csak git, nem teljes sync).\n * Frissíti az aktív projektet és a projekt listát.\n */\n async refreshGitStatus(projectId: string): Promise<void> {\n this.gitStatusLoading_$.set(true);\n this.gitStatusError_$.set(null);\n try {\n const result: { project: PM_ } =\n await this.pm_AS.refreshGitStatus(projectId);\n this.activeProject_$.set(result.project);\n try {\n const hostDetail: PM_GetProject_Response = await this.pm_AS.getProject(projectId);\n this.activeProjectComputedCcapHost_$.set(hostDetail.computedCcapRevisionedHost);\n } catch {\n // Host flag változatlan marad, ha a detail GET hibázik.\n }\n // Frissítjük a projekt listában is.\n this.projects_$.update(\n (list: PM_[]): PM_[] =>\n list.map(\n (p: PM_): PM_ =>\n p._id === projectId ? result.project : p,\n ),\n );\n } catch (err: unknown) {\n this.gitStatusError_$.set(err);\n } finally {\n this.gitStatusLoading_$.set(false);\n }\n }\n\n /**\n * Lightweight sync egy projektre. Frissíti az aktív projektet és a projekt listát.\n */\n async syncProject(projectId: string): Promise<void> {\n this.syncLoading_$.set(true);\n this.syncError_$.set(null);\n this.lastSyncResult_$.set(null);\n try {\n const result: { project: PM_; syncResult: PM_SyncResult_Response } =\n await this.pm_AS.syncProject(projectId);\n this.lastSyncResult_$.set(result.syncResult);\n this.activeProject_$.set(result.project);\n try {\n const hostDetail: PM_GetProject_Response = await this.pm_AS.getProject(projectId);\n this.activeProjectComputedCcapHost_$.set(hostDetail.computedCcapRevisionedHost);\n } catch {\n // Host flag változatlan marad, ha a detail GET hibázik.\n }\n // Frissítjük a projekt listában is.\n this.projects_$.update(\n (list: PM_[]): PM_[] =>\n list.map(\n (p: PM_): PM_ =>\n p._id === projectId ? result.project : p,\n ),\n );\n } catch (err: unknown) {\n this.syncError_$.set(err);\n } finally {\n this.syncLoading_$.set(false);\n }\n }\n\n /**\n * Lightweight sync minden aktív projektre. Frissíti a teljes projekt listát.\n */\n async syncAllProjects(): Promise<void> {\n this.syncLoading_$.set(true);\n this.syncError_$.set(null);\n try {\n await this.pm_AS.syncAllProjects();\n await this.loadProjects();\n } catch (err: unknown) {\n this.syncError_$.set(err);\n } finally {\n this.syncLoading_$.set(false);\n }\n }\n\n /**\n * Minden kontroll fájl betöltése az aktív projekthez.\n */\n async loadAllFileContents(projectId: string): Promise<void> {\n this.fileContentLoading_$.set(true);\n this.fileContentError_$.set(null);\n try {\n const result: { files: PM_AllFileContents_Response } =\n await this.pm_AS.getAllFileContents(projectId);\n this.fileContents_$.set(result.files);\n } catch (err: unknown) {\n this.fileContentError_$.set(err);\n } finally {\n this.fileContentLoading_$.set(false);\n }\n }\n\n /**\n * TEST-ERROR-REPORTS.json ürítése a szerveren, majd file sync újratöltés.\n */\n async clearTestErrorReportsAndRefresh(projectId: string): Promise<void> {\n this.testErrorReportsClearing_$.set(true);\n try {\n await this.pm_AS.clearTestErrorReports(projectId);\n await this.loadAllFileContents(projectId);\n } finally {\n this.testErrorReportsClearing_$.set(false);\n }\n }\n\n /**\n * BUGS.md path feloldás (jelöltek, ambiguitás) — UI választáshoz.\n */\n async getBugsPathResolve(projectId: string): Promise<PM_BugsPathResolution_Response> {\n return this.pm_AS.getBugsPathResolve(projectId);\n }\n\n /**\n * Központi error tábla → BUGS.md append; siker után fájl tartalom frissítése.\n */\n async appendBugsFromErrorsAndRefreshFiles(\n projectId: string,\n body?: PM_AppendBugsFromErrors_Request,\n ): Promise<PM_AppendBugsFromErrors_Response> {\n const result: PM_AppendBugsFromErrors_Response =\n await this.pm_AS.appendBugsFromErrors(projectId, body);\n await this.loadAllFileContents(projectId);\n return result;\n }\n\n /**\n * Egy központi error → BUGS.md; utána fájl tartalom frissítése.\n */\n async appendSingleBugFromErrorAndRefreshFiles(\n projectId: string,\n ccapErrorId: string,\n body?: PM_AppendBugsFromErrors_Request,\n ): Promise<PM_AppendSingleBugFromError_Response> {\n const result: PM_AppendSingleBugFromError_Response =\n await this.pm_AS.appendSingleBugFromError(projectId, ccapErrorId, body);\n await this.loadAllFileContents(projectId);\n return result;\n }\n\n /**\n * Kézi bug: BUGS.md + user request; utána kontroll fájlok és user request lista frissítése.\n */\n async createManualBugAndRefresh(\n projectId: string,\n body: PM_ManualBugCreate_Request,\n ): Promise<PM_ManualBugCreate_Response> {\n const result: PM_ManualBugCreate_Response =\n await this.pm_AS.createManualBug(projectId, body);\n await this.loadAllFileContents(projectId);\n await this.loadUserRequests(projectId);\n return result;\n }\n\n /**\n * User request-ek betöltése az aktív projekthez.\n */\n async loadUserRequests(projectId: string): Promise<void> {\n this.userRequestsLoading_$.set(true);\n this.userRequestsError_$.set(null);\n try {\n const result: { userRequests: PM_UserRequest[] } =\n await this.pm_AS.listUserRequests(projectId);\n this.userRequests_$.set(result.userRequests);\n } catch (err: unknown) {\n this.userRequestsError_$.set(err);\n } finally {\n this.userRequestsLoading_$.set(false);\n }\n }\n\n /**\n * Új user request létrehozása, majd lista frissítése.\n */\n async createUserRequest(\n projectId: string,\n payload: PM_CreateUserRequestHttpBody_Request,\n ): Promise<void> {\n await this.pm_AS.createUserRequest(projectId, payload);\n await this.loadUserRequests(projectId);\n }\n\n /**\n * User request frissítése, majd lista frissítése.\n */\n async updateUserRequest(\n projectId: string,\n requestId: string,\n payload: Partial<PM_UserRequest_Response>,\n ): Promise<void> {\n const result: { userRequest: PM_UserRequest } =\n await this.pm_AS.updateUserRequest(projectId, requestId, payload);\n this.userRequests_$.update(\n (list: PM_UserRequest[]): PM_UserRequest[] =>\n list.map(\n (r: PM_UserRequest): PM_UserRequest =>\n r._id === requestId ? result.userRequest : r,\n ),\n );\n }\n\n /**\n * USER-INPUT wizard: LLM suggest (egyetlen hívás).\n */\n async suggestUserInputFormat(\n projectId: string,\n body: PM_UserInputSuggestFormat_Request,\n ): Promise<PM_UserInputSuggestFormat_Response> {\n this.userInputWizardSuggestLoading_$.set(true);\n this.userInputWizardSuggestError_$.set(null);\n this.userInputWizardLastLlmSystemPrompt_$.set(null);\n this.userInputWizardLastLlmUserMessage_$.set(null);\n try {\n const result: PM_UserInputSuggestFormat_Response =\n await this.pm_AS.suggestUserInputFormat(projectId, body);\n this.userInputWizardLastLlmSystemPrompt_$.set(result.llmSystemPrompt ?? null);\n this.userInputWizardLastLlmUserMessage_$.set(result.llmUserMessage ?? null);\n return result;\n } catch (err: unknown) {\n this.userInputWizardSuggestError_$.set(err);\n throw err;\n } finally {\n this.userInputWizardSuggestLoading_$.set(false);\n }\n }\n\n /**\n * Kontroll entry mutáció után teljes file sync újratöltés.\n * Ha `priorRawFingerprintSha256` hiányzik, a DS számolja LF-normalizált prior blokk SHA-256-ját.\n */\n async mutateControlFileEntryAndRefresh(\n projectId: string,\n fileType: PM_ControlFileType_Type,\n body: Omit<PM_ControlEntryMutation_Request, 'priorRawFingerprintSha256'> & {\n priorRawFingerprintSha256?: string;\n },\n ): Promise<PM_ControlEntryMutation_Response> {\n const trimmedFp: string | undefined = body.priorRawFingerprintSha256?.trim();\n const priorFingerprint: string =\n trimmedFp != null && trimmedFp.length > 0\n ? trimmedFp\n : await PM_Sha256Fingerprint_Util.sha256HexOfNormalized(body.priorRawBlock);\n const fullBody: PM_ControlEntryMutation_Request = {\n mode: body.mode,\n priorRawBlock: body.priorRawBlock,\n priorRawFingerprintSha256: priorFingerprint,\n newRawBlock: body.newRawBlock,\n bugsFileAbsolutePath: body.bugsFileAbsolutePath,\n };\n const result: PM_ControlEntryMutation_Response =\n await this.pm_AS.mutateControlFileEntry(projectId, fileType, fullBody);\n await this.loadAllFileContents(projectId);\n return result;\n }\n\n /**\n * USER-INPUT wizard: USER-INPUT.md + DB véglegesítés, majd lista és fájl frissítés.\n */\n async finalizeUserInputWizard(\n projectId: string,\n body: PM_UserInputFinalize_Request,\n ): Promise<PM_UserInputFinalize_Response> {\n this.userInputWizardFinalizeLoading_$.set(true);\n this.userInputWizardFinalizeError_$.set(null);\n try {\n const result: PM_UserInputFinalize_Response =\n await this.pm_AS.finalizeUserInput(projectId, body);\n await this.loadUserRequests(projectId);\n await this.loadAllFileContents(projectId);\n return result;\n } catch (err: unknown) {\n this.userInputWizardFinalizeError_$.set(err);\n throw err;\n } finally {\n this.userInputWizardFinalizeLoading_$.set(false);\n }\n }\n\n // ─── Reviews ───────────────────────────────────────────────────────────────\n\n /**\n * Developer review metaadatok betöltése.\n */\n async loadReviewsMeta(projectId: string): Promise<void> {\n this.reviewsMetaLoading_$.set(true);\n this.reviewsMetaError_$.set(null);\n try {\n const result: { reviewsMeta: DT_DeveloperReviewMeta_Response[] } =\n await this.pm_AS.getReviewsMeta(projectId);\n this.reviewsMeta_$.set(result.reviewsMeta);\n } catch (err: unknown) {\n this.reviewsMetaError_$.set(err);\n } finally {\n this.reviewsMetaLoading_$.set(false);\n }\n }\n\n /**\n * Developer review-ok futtatása a projekt localPath-ján.\n */\n async runProjectReviews(projectId: string, reviewIds?: string[]): Promise<void> {\n this.reviewsRunning_$.set(true);\n this.reviewsRunError_$.set(null);\n this.reviewResult_$.set(null);\n try {\n const result: { reviewResult: DT_DeveloperRun_Response } =\n await this.pm_AS.runProjectReviews(projectId, reviewIds);\n this.reviewResult_$.set(result.reviewResult);\n } catch (err: unknown) {\n this.reviewsRunError_$.set(err);\n } finally {\n this.reviewsRunning_$.set(false);\n }\n }\n\n // ─── Agent Reports (REQ-PM-AGT-001 Slice 4) ────────────────────────\n\n /**\n * Agent riportok listájának betöltése a projekthez.\n * A szerver descending dátum-rendben adja vissza a fájlokat; itt csak továbbítjuk.\n */\n async loadAgentReports(projectId: string): Promise<void> {\n this.agentReportsLoading_$.set(true);\n this.agentReportsError_$.set(null);\n try {\n const result = await this.pm_AS.listAgentReports(projectId);\n this.agentReports_$.set(result.reports);\n } catch (err: unknown) {\n this.agentReportsError_$.set(err);\n } finally {\n this.agentReportsLoading_$.set(false);\n }\n }\n\n /**\n * Egy riport teljes tartalmának betöltése relPath alapján (path-traversal védelem\n * szerver-oldalon). Sikertelenség esetén `activeAgentReport_$` kiürül, hiba a\n * `activeAgentReportError_$`-re kerül.\n */\n async loadAgentReport(projectId: string, relPath: string): Promise<void> {\n this.activeAgentReportLoading_$.set(true);\n this.activeAgentReportError_$.set(null);\n try {\n const result = await this.pm_AS.getAgentReportContent(projectId, relPath);\n this.activeAgentReport_$.set(result);\n } catch (err: unknown) {\n this.activeAgentReport_$.set(null);\n this.activeAgentReportError_$.set(err);\n } finally {\n this.activeAgentReportLoading_$.set(false);\n }\n }\n\n /** Aktív riport kiürítése (vissza-gomb a detailből). */\n clearActiveAgentReport(): void {\n this.activeAgentReport_$.set(null);\n this.activeAgentReportError_$.set(null);\n }\n}\n", "import { Component, computed, inject, input } from '@angular/core';\n\nimport { PM_ } from '../../../../_models/server-index';\nimport { ProjectManagement_DataService } from '../../../project-management/_services/data-services/project-management.data-service';\n\n/**\n * Projekt-név badge: ha a megadott workspace path alapján van találat\n * a betöltött projekt listában (`PM_.localPath`), akkor egy kis pilulát\n * rajzol a projekt nevével. Match nélkül a host elem `display: none`,\n * így a parent flex konténerben `gap` extra rés sem keletkezik.\n *\n * Path matching: normalizált — lowercase (Windows case-insensitivity),\n * backslash → slash egységesítés, trailing slash eltávolítása.\n *\n * Projekt lista lazy-load: első badge példány triggereli a `loadProjects()`-et,\n * ha a service-en még nem futott le sikeresen és nincs folyamatban / hiba.\n */\n@Component({\n selector: 'app-s-project-badge',\n standalone: true,\n templateUrl: './s-project-badge.component.html',\n host: {\n 'class': 'ml-auto',\n '[style.display]': 'projectName_$() ? \"inline-flex\" : \"none\"',\n },\n})\n/** S_ProjectBadge_Component class. */\nexport class S_ProjectBadge_Component {\n\n /** Session workspace path — ez alapján keressük a projektet. */\n readonly workspacePath = input<string | undefined>(undefined);\n\n private readonly pm_DS: ProjectManagement_DataService =\n inject(ProjectManagement_DataService);\n\n /** A workspace path-hez illeszkedő projekt neve — vagy null, ha nincs match. */\n readonly projectName_$ = computed((): string | null => {\n const wp: string | undefined = this.workspacePath();\n if (!wp) {\n return null;\n }\n const normWp: string = S_ProjectBadge_Component.normalizePath(wp);\n if (!normWp) {\n return null;\n }\n const list: PM_[] = this.pm_DS.projects_$();\n const match: PM_ | undefined = list.find(\n (p: PM_): boolean =>\n !!p.localPath &&\n S_ProjectBadge_Component.normalizePath(p.localPath) === normWp,\n );\n return match?.name ?? null;\n });\n\n constructor() {\n // Lazy-load: első felbukkanáskor indítjuk a projekt listát — csak akkor,\n // ha még sosem töltődött be sikeresen, nincs éppen folyamatban,\n // és az előző próbálkozás nem ért hibába (különben minden új badge példány\n // újraindítana egy olyan request-et ami úgyis hibázni fog).\n if (\n !this.pm_DS.projectsLoadedOnce_$() &&\n !this.pm_DS.projectsLoading_$() &&\n !this.pm_DS.projectsError_$()\n ) {\n void this.pm_DS.loadProjects();\n }\n }\n\n /**\n * Path normalizáció: trim, lowercase (Windows case-insensitivity),\n * backslash → slash, trailing slash eltávolítása.\n */\n private static normalizePath(path: string): string {\n let normalized: string = path.trim().toLowerCase().replace(/\\\\/g, '/');\n while (normalized.endsWith('/') && normalized.length > 1) {\n normalized = normalized.slice(0, -1);\n }\n return normalized;\n }\n}\n", "@if (projectName_$(); as name) {\n <span\n class=\"text-[9px] px-1 py-0.5 rounded bg-sky-500/20 text-sky-300 border border-sky-500/30 shrink-0 truncate max-w-[140px]\"\n [title]=\"name\">\n {{ name }}\n </span>\n}\n", "import { Component, input, InputSignal, output, OutputEmitterRef } from '@angular/core';\nimport { NgClass } from '@angular/common';\n\nimport { S_AbsoluteTime_Pipe } from '../../../_pipes/s-absolute-time.pipe';\nimport { S_TimeAgo_Pipe } from '../../../_pipes/s-time-ago.pipe';\nimport { S_ProjectBadge_Component } from '../../s-project-badge/s-project-badge.component';\nimport { S_SessionListRowView_Interface } from '../../../_models/interfaces/s-session-list-row-view.interface';\n\n/**\n * Shared external session lista sor komponens.\n * Egységes megjelenítés CC, OC, CA session listákhoz:\n * státusz dot (spinning ha futó), label, timestamp, projekt badge, archived badge.\n *\n * A context menu és a műveletek a parent dashboard-ban maradnak — ez a komponens\n * csak a `contextMenu` output-on keresztül jelzi a jobb klikk eseményt.\n *\n * REQ-UI-SHARED-SESSION-INFO-CARD-001 Slice 2a (cycle 906): bevezetve a `size:\n * 'compact' | 'full'` input. A `compact` (default) az eredeti, listához igazított\n * egysoros viselkedés. A `full` placeholder — egyelőre `compact`-ra esik, a\n * tényleges multi-row layout a Slice 3-ban érkezik.\n *\n * REQ-UI-SHARED-SESSION-INFO-CARD-001 Slice 2b (cycle 907): komponens-rename\n * `s-session-list-row` → `s-session-info-card` (mappa + fájlok + class +\n * selector). A `S_SessionListRowView_Interface` data-interface MARAD a Slice 4\n * cleanup-ig (backward-compat).\n */\n@Component({\n selector: 'app-s-session-info-card',\n standalone: true,\n imports: [NgClass, S_AbsoluteTime_Pipe, S_TimeAgo_Pipe, S_ProjectBadge_Component],\n templateUrl: './s-session-info-card.component.html',\n host: { class: 'block' },\n})\n/** S_SessionInfoCard_Component class. */\nexport class S_SessionInfoCard_Component {\n\n /** Normalizált session view adat. */\n readonly view: InputSignal<S_SessionListRowView_Interface> =\n input.required<S_SessionListRowView_Interface>();\n\n /** Kijelölt (aktív) sor. */\n readonly isActive: InputSignal<boolean> = input<boolean>(false);\n\n /** Workspace path sor megjelenítése (OC, CA használja). */\n readonly showWorkspacePath: InputSignal<boolean> = input<boolean>(false);\n\n /** Prompt count megjelenítése (OC, CA használja). */\n readonly showPromptCount: InputSignal<boolean> = input<boolean>(false);\n\n /**\n * REQ-UI-SHARED-SESSION-INFO-CARD-001 Slice 2 (cycle 906): méret-variant.\n * `compact` (default) — egysoros, listához igazított (eredeti viselkedés).\n * `full` — multi-row, dashboard / overlay-panel-header / detail-card mintára.\n * Slice 3-ig a `full` placeholder, `compact`-ra esik.\n */\n readonly size: InputSignal<'compact' | 'full'> = input<'compact' | 'full'>('compact');\n\n /** Session kiválasztás (kattintás). */\n readonly selected: OutputEmitterRef<string> = output<string>();\n\n /** Jobb klikk context menu — pozíció + session id átadása a parent-nek. */\n readonly contextMenu: OutputEmitterRef<{ event: MouseEvent; id: string }> =\n output<{ event: MouseEvent; id: string }>();\n\n /**\n * REQ-SCH-IND-CLICK-001 (cycle 201): a schedule-indicator badge kattintásakor\n * jelez a parent-nek (sessionId) — a parent dashboard nyitja meg a popup-ot.\n * Csak akkor emittál, ha a `view().hasSchedule` true (a badge látható).\n */\n readonly scheduleIndicatorClicked: OutputEmitterRef<string> = output<string>();\n\n /**\n * REQ-SES-CRD-IND-001 Slice 3 (cycle 202): a coordinator-indicator badge\n * kattintásakor jelez a parent-nek (sessionId) — a parent dashboard nyitja meg a popup-ot.\n * Csak akkor emittál, ha a `view().hasCoordinator` true (a badge látható).\n */\n readonly coordinatorIndicatorClicked: OutputEmitterRef<string> = output<string>();\n\n /** Kattintás kezelése — session kiválasztás. */\n handleSelect(): void {\n this.selected.emit(this.view().id);\n }\n\n /** Jobb klikk kezelése — context menu jelzés a parent-nek. */\n handleContextMenu(event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.contextMenu.emit({ event: event, id: this.view().id });\n }\n\n /**\n * Schedule-indicator kattintás — propagáció megállítása (ne válassza ki a sort),\n * majd sessionId emit a parent-nek.\n */\n handleScheduleIndicatorClick(event: MouseEvent): void {\n event.stopPropagation();\n this.scheduleIndicatorClicked.emit(this.view().id);\n }\n\n /**\n * Coordinator-indicator kattintás — propagáció megállítása + sessionId emit\n * (REQ-SES-CRD-IND-001 Slice 3).\n */\n handleCoordinatorIndicatorClick(event: MouseEvent): void {\n event.stopPropagation();\n this.coordinatorIndicatorClicked.emit(this.view().id);\n }\n}\n", "<!-- REQ-UI-SHARED-SESSION-INFO-CARD-001 Slice 3 (cycle 908): a `full` size variant\n nagyobb padding-gel, nagyobb label/status-dot fonttal, és egy `ng-content\n select=\"[footer-actions]\"` slot-tal a parent-driven action-button-okhoz\n (Pause/Resume, Trigger Now, Edit, Delete). A `compact` viselkedés változatlan. -->\n<div\n [class]=\"(size() === 'full' ? 'px-3 py-2.5 ' : 'px-2 py-1.5 ') + 'border-b cursor-pointer transition-colors '\n + (isActive()\n ? 'border-l-2 border-l-ccapAccent border-b-neutral-700/30 bg-neutral-800/80'\n : 'border-l-2 border-l-transparent border-b-neutral-700/30 hover:bg-neutral-800/60')\"\n [class.opacity-50]=\"view().isArchived\"\n (click)=\"handleSelect()\"\n (contextmenu)=\"handleContextMenu($event)\">\n\n <!-- Fő sor: status dot, label, timestamp, projekt badge, archived -->\n <div class=\"flex items-center gap-1.5\">\n <!-- Státusz dot + spinning indikátor (size === 'full' esetén nagyobb) -->\n <span class=\"relative shrink-0 flex items-center justify-center\"\n [class]=\"size() === 'full' ? 'w-4 h-4' : 'w-3.5 h-3.5'\"\n [title]=\"view().status\">\n <span class=\"rounded-full\"\n [class]=\"size() === 'full' ? 'w-2 h-2' : 'w-1.5 h-1.5'\"\n [ngClass]=\"view().statusColorClass\"></span>\n @if (view().isRunning) {\n <span class=\"absolute inset-0 rounded-full border border-transparent border-t-yellow-400 animate-spin\"></span>\n }\n </span>\n\n <!-- Label (size === 'full' esetén nagyobb font) -->\n <span class=\"text-neutral-200 font-medium truncate shrink-1 min-w-0\"\n [class]=\"size() === 'full' ? 'text-sm' : 'text-xs'\">\n {{ view().label }}\n </span>\n\n <!-- Last activity — REQ-SES-EVT-TS-002 cycle 473: text-neutral-400 + [title] absolute time. -->\n <span class=\"text-[10px] text-neutral-400 shrink-0\"\n [title]=\"(view().lastActivityAt ?? '') | sAbsoluteTime\">\n {{ view().lastActivityAt ? (view().lastActivityAt | sTimeAgo) : '—' }}\n </span>\n\n <!-- Projekt badge -->\n @if (view().workspacePath) {\n <app-s-project-badge [workspacePath]=\"view().workspacePath!\" />\n }\n\n <!-- Archived badge -->\n @if (view().isArchived) {\n <span class=\"text-[8px] px-0.5 rounded bg-amber-500/15 text-amber-500 shrink-0\">\n archived\n </span>\n }\n\n <!-- Schedule-indicator: REQ-SES-SCH-IND-001 (cycle 176-178) — calendar ikon, ha a session-höz aktív schedule.\n REQ-SCH-IND-CLICK-001 (cycle 201): kattintható → popup a job + execution infókkal a parent dashboardon.\n A button stopPropagation-t végez, így a sor select handler-e nem fut le.\n BUG-UI-SES-LIST-SCHED-ICON-LAYOUT-001 (cycle 900): `ml-auto` ha NINCS project-badge — különben\n az ikon rácsúszik a session-name-re, mert a project-badge `ml-auto`-ja adta eddig a space-between-et. -->\n @if (view().hasSchedule) {\n <button type=\"button\"\n class=\"shrink-0 text-neonCyan/80 hover:text-neonCyan focus:outline-none focus:ring-1 focus:ring-neonCyan/60 rounded p-0.5\"\n [class.ml-auto]=\"!view().workspacePath\"\n title=\"Ehhez a session-höz tartozik schedule — kattints a részletekért\"\n aria-label=\"Schedule attached — open popup\"\n (click)=\"handleScheduleIndicatorClick($event)\">\n <svg class=\"w-3 h-3\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\" />\n <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\" />\n <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\" />\n </svg>\n </button>\n }\n\n <!-- Draft-indicator: REQ-UI-SES-LIST-DRAFT-INDICATOR-001 (cycle 902) — toll-ikon ha a session-höz\n tartozik el-nem-küldött prompt-piszkozat a localStorage-ban. NEM kattintható (csak indikátor),\n tooltip a részleteket adja. `ml-auto` ha ő az első jobboldali indikátor (no project, no schedule, no coord). -->\n @if (view().hasDraft) {\n <span class=\"shrink-0 text-amber-400/80 inline-flex items-center justify-center p-0.5\"\n [class.ml-auto]=\"!view().workspacePath && !view().hasSchedule\"\n title=\"El-nem-küldött piszkozat van mentve ehhez a session-höz\"\n aria-label=\"Unsent draft input present\">\n <svg class=\"w-3 h-3\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M12 20h9\" />\n <path d=\"M16.5 3.5a2.121 2.121 0 1 1 3 3L7 19l-4 1 1-4 12.5-12.5z\" />\n </svg>\n </span>\n }\n\n <!-- Coordinator-indicator: REQ-SES-CRD-IND-001 (cycle 190) — compass ikon neonAmber.\n REQ-SES-CRD-IND-001 Slice 3 (cycle 202): kattintható → popup koordinátor infókkal.\n BUG-UI-SES-LIST-SCHED-ICON-LAYOUT-001 (cycle 900): `ml-auto` ha NINCS project-badge ÉS NINCS\n schedule-indicator ÉS NINCS draft-indikátor előtte (akkor ő az első indikátor a name után). -->\n @if (view().hasCoordinator) {\n <button type=\"button\"\n class=\"shrink-0 text-neonAmber/80 hover:text-neonAmber focus:outline-none focus:ring-1 focus:ring-neonAmber/60 rounded p-0.5\"\n [class.ml-auto]=\"!view().workspacePath && !view().hasSchedule && !view().hasDraft\"\n title=\"Ehhez a session-höz tartozik koordinátor — kattints a részletekért\"\n aria-label=\"Coordinator attached — open popup\"\n (click)=\"handleCoordinatorIndicatorClick($event)\">\n <svg class=\"w-3 h-3\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polygon points=\"16.24 7.76 14.12 14.12 7.76 16.24 9.88 9.88 16.24 7.76\" />\n </svg>\n </button>\n }\n </div>\n\n <!-- Workspace path sor (opcionális) -->\n @if (showWorkspacePath() && view().workspacePath) {\n <div class=\"text-[10px] text-neutral-500 truncate mt-0.5 ml-5\">\n {{ view().workspacePath }}\n </div>\n }\n\n <!-- Prompt count + stats sor (opcionális) -->\n @if (showPromptCount() && view().promptCount) {\n <div class=\"flex items-center gap-2 mt-0.5 ml-5\">\n <span class=\"text-[10px] text-neutral-600\">\n {{ view().promptCount }} prompts\n </span>\n </div>\n }\n\n <!-- REQ-UI-SHARED-SESSION-INFO-CARD-001 Slice 3 (cycle 908): full-size action-slot.\n A parent (scheduler-overlay, sch-job-list, dashboard-card) ide injektálja\n a saját action-button-jait egy `[footer-actions]` selectorú elemmel.\n Compact size-on rejtett. -->\n @if (size() === 'full') {\n <div class=\"flex items-center gap-1.5 mt-1.5 pt-1.5 border-t border-neutral-800/50 empty:hidden\">\n <ng-content select=\"[footer-actions]\" />\n </div>\n }\n</div>\n", "import {\n Component,\n computed,\n input,\n InputSignal,\n output,\n OutputEmitterRef,\n Signal,\n signal,\n WritableSignal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\n\nimport { CCAP_TextSearch_Util } from '../../../../../_collections/utils/ccap-text-search.util';\nimport { S_SessionListRowView_Interface }\n from '../../../_models/interfaces/s-session-list-row-view.interface';\nimport { S_SessionInfoCard_Component } from '../s-session-info-card/s-session-info-card.component';\n\n/**\n * REQ-UI-SSEL-001 Slice 1 — megosztott session-picker wrapper.\n *\n * Egyetlen SSOT komponens session-lista renderelésre: beépített accent-insensitive\n * keresővel (`CCAP_TextSearch_Util`), `S_SessionInfoCard_Component`-tel sor-render-re,\n * és event-alapú kiválasztás / context-menu handover a parent-nek.\n *\n * **Session-kind** input (`ccap` / `cc` / `ca` / `oc`) informatív — nem változtat a\n * render logikán, de a parent dashboardok és a Quick Input send-dropdown ugyanazt a\n * wrapper-t tudják használni, típus-szerinti külön dashboard-logika nélkül.\n *\n * **Scope**: ez a Slice csak a SKELETON-t adja — a kiegészítő szűrők (status filter,\n * project filter, archive toggle) a következő slice-okban kerülnek be flag-alapon.\n * Lásd: `__documentations/plans/2026-04-24/2026-04-24-req-ui-ssel-001-session-select-unification.plan.md`.\n */\n@Component({\n selector: 'app-s-session-select',\n standalone: true,\n imports: [CommonModule, FormsModule, S_SessionInfoCard_Component],\n templateUrl: './s-session-select.component.html',\n host: { class: 'block' },\n})\n/** S_SessionSelect_Component class. */\nexport class S_SessionSelect_Component {\n\n /** Session típus — parent-beli data source jelölés. Jelenleg render-logikát nem vezérel. */\n readonly kind: InputSignal<'ccap' | 'cc' | 'ca' | 'oc'> =\n input.required<'ccap' | 'cc' | 'ca' | 'oc'>();\n\n /** Megjelenítendő sorok (normalizált `S_SessionListRowView_Interface` alakban). */\n readonly rows: InputSignal<S_SessionListRowView_Interface[]> =\n input<S_SessionListRowView_Interface[]>([]);\n\n /** Aktívan kiválasztott session azonosítója (highlight-hoz). */\n readonly activeId: InputSignal<string> = input<string>('');\n\n /** Workspace path megjelenítése a soron (OC / CA használja). */\n readonly showWorkspacePath: InputSignal<boolean> = input<boolean>(false);\n\n /** Prompt count megjelenítése a soron (OC / CA használja). */\n readonly showPromptCount: InputSignal<boolean> = input<boolean>(false);\n\n /** Search input placeholder. */\n readonly searchPlaceholder: InputSignal<string> = input<string>('Keresés...');\n\n /**\n * Ha `true`: nincs belső keresősáv és a `filteredRows_$` a nyers `rows()`-t adja vissza —\n * a parent maga szűr (pl. ses-list, ami a name + goal + intent mezőkön keres, nem csak label-en).\n */\n readonly hideSearch: InputSignal<boolean> = input<boolean>(false);\n\n /** Session kiválasztás event (kattintás). */\n readonly selected: OutputEmitterRef<string> = output<string>();\n\n /** Jobb klikk context menu event — pozíció + session id. */\n readonly contextMenu: OutputEmitterRef<{ event: MouseEvent; id: string }> =\n output<{ event: MouseEvent; id: string }>();\n\n /** REQ-SCH-IND-CLICK-001 (cycle 201): schedule-indicator kattintás proxy a row-tól a parent-ig. */\n readonly scheduleIndicatorClicked: OutputEmitterRef<string> = output<string>();\n\n /** REQ-SES-CRD-IND-001 Slice 3 (cycle 202): coordinator-indicator kattintás proxy. */\n readonly coordinatorIndicatorClicked: OutputEmitterRef<string> = output<string>();\n\n /** Search query — accent-insensitive szűrés label-re. */\n readonly searchQuery_$: WritableSignal<string> = signal<string>('');\n\n /**\n * Szűrt sorok — accent/case-insensitive match a session label-re.\n * Üres query → minden sort átenged. `hideSearch=true` esetén nincs belső szűrés\n * (a parent maga szűri a listát, a wrapper csak renderelő).\n */\n readonly filteredRows_$: Signal<S_SessionListRowView_Interface[]> = computed(\n (): S_SessionListRowView_Interface[] => {\n const allRows: S_SessionListRowView_Interface[] = this.rows();\n if (this.hideSearch()) {\n return allRows;\n }\n const query: string = this.searchQuery_$();\n if (query.trim().length === 0) {\n return allRows;\n }\n return allRows.filter(\n (row: S_SessionListRowView_Interface): boolean =>\n CCAP_TextSearch_Util.includesText(row.label, query),\n );\n },\n );\n\n /** Select event továbbítása a parent-nek. */\n handleRowSelect(id: string): void {\n this.selected.emit(id);\n }\n\n /** Context-menu event továbbítása. */\n handleRowContextMenu(payload: { event: MouseEvent; id: string }): void {\n this.contextMenu.emit(payload);\n }\n\n /** Schedule-indicator click event továbbítása. */\n handleRowScheduleIndicatorClick(sessionId: string): void {\n this.scheduleIndicatorClicked.emit(sessionId);\n }\n\n /** Coordinator-indicator click event továbbítása (REQ-SES-CRD-IND-001 Slice 3). */\n handleRowCoordinatorIndicatorClick(sessionId: string): void {\n this.coordinatorIndicatorClicked.emit(sessionId);\n }\n}\n", "<!-- REQ-UI-SSEL-001 Slice 1: shared session picker — search bar + row list -->\n<div class=\"flex flex-col gap-2\">\n\n <!-- Search bar (csak ha `hideSearch` nem aktív — parent-driven szűrésnél a parent\n maga tart keresőmezőt, a wrapper csak renderelő). -->\n @if (!hideSearch()) {\n <div class=\"px-2 pt-2\">\n <input\n type=\"text\"\n class=\"w-full px-2 py-1 text-xs rounded border border-neonDefault bg-neutral-900 text-neutral-200 placeholder-neutral-500 focus:outline-none focus:border-ccapAccent\"\n [placeholder]=\"searchPlaceholder()\"\n [ngModel]=\"searchQuery_$()\"\n (ngModelChange)=\"searchQuery_$.set($event)\"\n data-testid=\"s-session-select-search\" />\n </div>\n }\n\n <!-- Row list -->\n <div class=\"flex flex-col gap-1 px-2 pb-2\">\n @for (row of filteredRows_$(); track row.id) {\n <app-s-session-info-card\n [view]=\"row\"\n [isActive]=\"row.id === activeId()\"\n [showWorkspacePath]=\"showWorkspacePath()\"\n [showPromptCount]=\"showPromptCount()\"\n (selected)=\"handleRowSelect($event)\"\n (contextMenu)=\"handleRowContextMenu($event)\"\n (scheduleIndicatorClicked)=\"handleRowScheduleIndicatorClick($event)\"\n (coordinatorIndicatorClicked)=\"handleRowCoordinatorIndicatorClick($event)\" />\n }\n\n @if (filteredRows_$().length === 0) {\n <span class=\"text-[11px] text-neutral-500 italic px-1 py-2\">\n @if (searchQuery_$().trim().length > 0) {\n Nincs találat.\n } @else {\n Üres lista.\n }\n </span>\n }\n </div>\n\n</div>\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * PM entry-mutation: prior blokk SHA-256 fingerprint (UTF-8, LF normalizált) — szerver PM_ControlEntryMutation_Util egyeztetéshez.\n */\nexport class PM_Sha256Fingerprint_Util {\n\n /**\n * Sorvégek normalizálása LF-re (szerver `normalizeNewlines` egyezése).\n */\n static normalizeNewlines(text: string): string {\n return text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n }\n\n /**\n * SHA-256 hex digest UTF-8 byte-okra a normalizált szövegből.\n */\n static async sha256HexOfNormalized(text: string): Promise<string> {\n const normalized: string = PM_Sha256Fingerprint_Util.normalizeNewlines(text);\n const encoder: TextEncoder = new TextEncoder();\n const data: Uint8Array = encoder.encode(normalized);\n const digest: ArrayBuffer = await crypto.subtle.digest('SHA-256', data);\n const bytes: Uint8Array = new Uint8Array(digest);\n let hex: string = '';\n for (let i: number = 0; i < bytes.length; i += 1) {\n hex += bytes[i].toString(16).padStart(2, '0');\n }\n return hex;\n }\n}\n", "import { inject, Injectable, signal } from '@angular/core';\n\nimport { DT_DeveloperReviewMeta_Response } from '../../../../_models/server-index';\nimport { DT_DeveloperRun_Response } from '../../../../_models/server-index';\nimport { PM_AllFileContents_Response } from '../../../../_models/server-index';\nimport {\n PM_AppendBugsFromErrors_Request,\n PM_AppendBugsFromErrors_Response,\n PM_AppendSingleBugFromError_Response,\n PM_BugsPathResolution_Response,\n PM_CreateUserRequestHttpBody_Request,\n PM_ManualBugCreate_Request,\n PM_ManualBugCreate_Response,\n} from '../../../../_models/server-index';\nimport { PM_DiscoveredProject_Response } from '../../../../_models/server-index';\nimport {\n PM_AgentReport_Interface,\n PM_AgentReportContent_Response,\n} from '../../../../_models/server-index';\nimport {\n PM_GetProject_Response,\n PM_ListProjects_Response,\n} from '../../../../_models/server-index';\nimport { PM_ } from '../../../../_models/server-index';\nimport { PM_SyncResult_Response } from '../../../../_models/server-index';\nimport { PM_UserRequest } from '../../../../_models/server-index';\nimport { PM_Response } from '../../../../_models/server-index';\nimport { PM_UserRequest_Response } from '../../../../_models/server-index';\nimport {\n PM_ControlEntryMutation_Request,\n PM_ControlEntryMutation_Response,\n PM_UserInputFinalize_Request,\n PM_UserInputFinalize_Response,\n PM_UserInputSuggestFormat_Request,\n PM_UserInputSuggestFormat_Response,\n} from '../../../../_models/server-index';\nimport { PM_ControlFileType_Type } from '../../../../_models/server-index';\nimport { PM_Group_DataModel } from '../../../../_models/server-index';\nimport { PM_GroupFiles_Response } from '../../../../_models/server-index';\nimport { ProjectManagement_ApiService } from '../project-management.api-service';\nimport { PM_Sha256Fingerprint_Util } from '../../_collections/utils/pm-sha256-fingerprint.util';\n\n/**\n * Project Management data service (SSOT).\n * Projektek és user request-ek kliens-oldali állapotkezelése.\n */\n@Injectable({ providedIn: 'root' })\nexport class ProjectManagement_DataService {\n\n /** Projektek listája. */\n readonly projects_$ = signal<PM_[]>([]);\n\n /** Betöltés folyamatban (projekt lista). */\n readonly projectsLoading_$ = signal<boolean>(false);\n\n /** Projekt lista betöltési hiba (null = nincs). */\n readonly projectsError_$ = signal<unknown | null>(null);\n\n /**\n * Első sikeres projekt-lista betöltés megtörtént-e (lazy-load guard).\n * Olyan komponensek használják, amelyek opcionálisan tudnak projektekre hivatkozni\n * (pl. project-név badge session listákon), de nem akarnak minden újrarenderelésnél\n * újra fetch-elni, és nem akarják a \"0 projekt\" esetet folyamatosan újrapróbálni.\n */\n readonly projectsLoadedOnce_$ = signal<boolean>(false);\n\n /** Aktuálisan megnyitott projekt. */\n readonly activeProject_$ = signal<PM_ | null>(null);\n\n /**\n * Szerver által számolt flag: a projekt git/GitHub URL alapján CCAP Revisioned host-e\n * (error → BUGS.md bridge).\n */\n readonly activeProjectComputedCcapHost_$ = signal<boolean>(false);\n\n /** Aktív projekt betöltés folyamatban. */\n readonly activeProjectLoading_$ = signal<boolean>(false);\n\n /** Aktív projekt betöltési hiba (null = nincs). */\n readonly activeProjectError_$ = signal<unknown | null>(null);\n\n /** Aktív projekt user request-jeinek listája. */\n readonly userRequests_$ = signal<PM_UserRequest[]>([]);\n\n /** User request lista betöltés folyamatban. */\n readonly userRequestsLoading_$ = signal<boolean>(false);\n\n /** User request lista betöltési hiba (null = nincs). */\n readonly userRequestsError_$ = signal<unknown | null>(null);\n\n /** Felfedezett projektek listája (utolsó scan eredménye). */\n readonly discoveredProjects_$ = signal<PM_DiscoveredProject_Response[]>([]);\n\n /** Discovery scan folyamatban. */\n readonly discoveryLoading_$ = signal<boolean>(false);\n\n /** Discovery scan hiba (null = nincs). */\n readonly discoveryError_$ = signal<unknown | null>(null);\n\n /** Git status refresh folyamatban. */\n readonly gitStatusLoading_$ = signal<boolean>(false);\n\n /** Git status refresh hiba (null = nincs). */\n readonly gitStatusError_$ = signal<unknown | null>(null);\n\n /** Sync folyamatban (egy projektre vagy sync-all). */\n readonly syncLoading_$ = signal<boolean>(false);\n\n /** Sync hiba (null = nincs). */\n readonly syncError_$ = signal<unknown | null>(null);\n\n /** Utolsó sync eredménye (egy projektre). */\n readonly lastSyncResult_$ = signal<PM_SyncResult_Response | null>(null);\n\n /** Kontroll fájlok parse-olt tartalma (minden fájl egyben). */\n readonly fileContents_$ = signal<PM_AllFileContents_Response | null>(null);\n\n /** Kontroll fájl betöltés folyamatban. */\n readonly fileContentLoading_$ = signal<boolean>(false);\n\n /** Kontroll fájl betöltési hiba. */\n readonly fileContentError_$ = signal<unknown | null>(null);\n\n /** Test error reports fájl Clear művelet alatt. */\n readonly testErrorReportsClearing_$ = signal<boolean>(false);\n\n // ─── Agent Reports (REQ-PM-AGT-001 Slice 4) ────────────────────────\n\n /** `__agent/reports/**` lista-betöltés eredménye (descending dátum). */\n readonly agentReports_$ = signal<PM_AgentReport_Interface[]>([]);\n\n /** Agent reports lista-betöltés folyamatban. */\n readonly agentReportsLoading_$ = signal<boolean>(false);\n\n /** Agent reports lista-betöltési hiba. */\n readonly agentReportsError_$ = signal<unknown | null>(null);\n\n /** Aktuálisan megnyitott riport tartalma (detail). */\n readonly activeAgentReport_$ = signal<PM_AgentReportContent_Response | null>(null);\n\n /** Detail-betöltés folyamatban. */\n readonly activeAgentReportLoading_$ = signal<boolean>(false);\n\n /** Detail-betöltési hiba. */\n readonly activeAgentReportError_$ = signal<unknown | null>(null);\n\n /** Elérhető review-k metaadata. */\n readonly reviewsMeta_$ = signal<DT_DeveloperReviewMeta_Response[]>([]);\n\n /** Review meta betöltés folyamatban. */\n readonly reviewsMetaLoading_$ = signal<boolean>(false);\n\n /** Review meta betöltési hiba. */\n readonly reviewsMetaError_$ = signal<unknown | null>(null);\n\n /** Utolsó review futtatás eredménye. */\n readonly reviewResult_$ = signal<DT_DeveloperRun_Response | null>(null);\n\n /** Review futtatás folyamatban. */\n readonly reviewsRunning_$ = signal<boolean>(false);\n\n /** Review futtatási hiba. */\n readonly reviewsRunError_$ = signal<unknown | null>(null);\n\n /** USER-INPUT wizard suggest folyamatban. */\n readonly userInputWizardSuggestLoading_$ = signal<boolean>(false);\n\n /** USER-INPUT wizard suggest hiba. */\n readonly userInputWizardSuggestError_$ = signal<unknown | null>(null);\n\n /** USER-INPUT wizard finalize folyamatban. */\n readonly userInputWizardFinalizeLoading_$ = signal<boolean>(false);\n\n /** USER-INPUT wizard finalize hiba. */\n readonly userInputWizardFinalizeError_$ = signal<unknown | null>(null);\n\n /** Utolsó USER-INPUT suggest LLM system prompt (transzparencia). */\n readonly userInputWizardLastLlmSystemPrompt_$ = signal<string | null>(null);\n\n /** Utolsó USER-INPUT suggest LLM user message (transzparencia). */\n readonly userInputWizardLastLlmUserMessage_$ = signal<string | null>(null);\n\n // --- Project Groups ---\n\n /** Projekt csoportok listája. */\n readonly groups_$ = signal<PM_Group_DataModel[]>([]);\n\n /** Csoport lista betöltés folyamatban. */\n readonly groupsLoading_$ = signal<boolean>(false);\n\n /** Csoport lista betöltési hiba. */\n readonly groupsError_$ = signal<unknown | null>(null);\n\n /** Kiválasztott csoport (szűrőként működik a projekt listán). */\n readonly activeGroup_$ = signal<PM_Group_DataModel | null>(null);\n\n /** Group extra fájlok (live scan eredménye). */\n readonly groupFiles_$ = signal<PM_GroupFiles_Response | null>(null);\n\n /** Group file lista betöltés folyamatban. */\n readonly groupFilesLoading_$ = signal<boolean>(false);\n\n /** Group file lista betöltési hiba. */\n readonly groupFilesError_$ = signal<unknown | null>(null);\n\n // --- Cross-Instance ---\n\n /** Cross-instance: összes instanc összes projektje. */\n readonly crossInstanceProjects_$ = signal<PM_[]>([]);\n\n /** Cross-instance: betöltés folyamatban. */\n readonly crossInstanceLoading_$ = signal<boolean>(false);\n\n /** Cross-instance: hiba. */\n readonly crossInstanceError_$ = signal<unknown | null>(null);\n\n /** Cross-instance: saját instanc ccapId-ja. */\n readonly currentCcapId_$ = signal<string | null>(null);\n\n /** Cross-instance: klónozás folyamatban. */\n readonly cloneLoading_$ = signal<boolean>(false);\n\n /** Cross-instance: klónozási hiba. */\n readonly cloneError_$ = signal<unknown | null>(null);\n\n private readonly pm_AS: ProjectManagement_ApiService =\n inject(ProjectManagement_ApiService);\n\n /**\n * Projektek listájának betöltése a szerverről.\n */\n async loadProjects(): Promise<void> {\n this.projectsLoading_$.set(true);\n this.projectsError_$.set(null);\n try {\n const result: PM_ListProjects_Response = await this.pm_AS.listProjects();\n this.projects_$.set(result.projects);\n this.projectsLoadedOnce_$.set(true);\n } catch (err: unknown) {\n this.projectsError_$.set(err);\n } finally {\n this.projectsLoading_$.set(false);\n }\n }\n\n /**\n * Egy projekt betöltése ID alapján (aktív projekt).\n */\n async loadProject(projectId: string): Promise<void> {\n this.activeProjectLoading_$.set(true);\n this.activeProjectError_$.set(null);\n try {\n const result: PM_GetProject_Response = await this.pm_AS.getProject(projectId);\n this.activeProject_$.set(result.project);\n this.activeProjectComputedCcapHost_$.set(result.computedCcapRevisionedHost);\n } catch (err: unknown) {\n this.activeProjectError_$.set(err);\n } finally {\n this.activeProjectLoading_$.set(false);\n }\n }\n\n /**\n * Új projekt létrehozása, majd lista frissítése.\n */\n async createProject(payload: PM_Response): Promise<PM_> {\n const result: { project: PM_ } = await this.pm_AS.createProject(payload);\n await this.loadProjects();\n return result.project;\n }\n\n /**\n * Projekt frissítése, majd aktív projekt state frissítése.\n */\n async updateProject(projectId: string, payload: Partial<PM_Response>): Promise<void> {\n const result: PM_GetProject_Response = await this.pm_AS.updateProject(projectId, payload);\n this.activeProject_$.set(result.project);\n this.activeProjectComputedCcapHost_$.set(result.computedCcapRevisionedHost);\n this.projects_$.update(\n (list: PM_[]): PM_[] =>\n list.map(\n (p: PM_): PM_ =>\n p._id === projectId ? result.project : p,\n ),\n );\n }\n\n /**\n * Projekt archiválása, majd lista frissítése.\n */\n async archiveProject(projectId: string): Promise<void> {\n await this.pm_AS.archiveProject(projectId);\n await this.loadProjects();\n if (this.activeProject_$()?._id === projectId) {\n this.activeProject_$.set(null);\n this.activeProjectComputedCcapHost_$.set(false);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Project Groups\n // ---------------------------------------------------------------------------\n\n /** Projekt csoportok betöltése. */\n async loadGroups(): Promise<void> {\n this.groupsLoading_$.set(true);\n this.groupsError_$.set(null);\n try {\n const result: { groups: PM_Group_DataModel[] } = await this.pm_AS.listGroups();\n this.groups_$.set(result.groups);\n } catch (err: unknown) {\n this.groupsError_$.set(err);\n } finally {\n this.groupsLoading_$.set(false);\n }\n }\n\n /** Új csoport létrehozása, majd lista frissítése. */\n async createGroup(payload: { name: string; scanPath: string; description?: string }): Promise<void> {\n await this.pm_AS.createGroup(payload);\n await this.loadGroups();\n }\n\n /** Csoport archiválása, majd lista frissítése. */\n async archiveGroup(groupId: string): Promise<void> {\n await this.pm_AS.archiveGroup(groupId);\n if (this.activeGroup_$()?._id === groupId) {\n this.activeGroup_$.set(null);\n }\n await this.loadGroups();\n }\n\n /** Csoport kiválasztása (szűrőként működik a projekt listán) vagy szűrő törlése. */\n selectGroup(group: PM_Group_DataModel | null): void {\n this.activeGroup_$.set(group);\n }\n\n /** Group extra fájlok betöltése (live scan a szerveren). */\n async loadGroupFiles(groupId: string): Promise<void> {\n this.groupFilesLoading_$.set(true);\n this.groupFilesError_$.set(null);\n try {\n const result: PM_GroupFiles_Response = await this.pm_AS.getGroupFiles(groupId);\n this.groupFiles_$.set(result);\n } catch (err: unknown) {\n this.groupFilesError_$.set(err);\n } finally {\n this.groupFilesLoading_$.set(false);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Cross-Instance\n // ---------------------------------------------------------------------------\n\n /** Összes instanc összes projektjének betöltése. */\n async loadCrossInstanceProjects(): Promise<void> {\n this.crossInstanceLoading_$.set(true);\n this.crossInstanceError_$.set(null);\n try {\n const result: { projects: PM_[]; currentCcapId: string | null } =\n await this.pm_AS.listAllProjectsAcrossInstances();\n this.crossInstanceProjects_$.set(result.projects);\n this.currentCcapId_$.set(result.currentCcapId);\n } catch (err: unknown) {\n this.crossInstanceError_$.set(err);\n } finally {\n this.crossInstanceLoading_$.set(false);\n }\n }\n\n /** Projekt klónozása a saját instancra. */\n async cloneProject(params: {\n sourceProjectId: string;\n targetParentDir: string;\n repoName?: string;\n }): Promise<void> {\n this.cloneLoading_$.set(true);\n this.cloneError_$.set(null);\n try {\n await this.pm_AS.cloneProject({\n sourceProjectId: params.sourceProjectId,\n targetParentDir: params.targetParentDir,\n repoName: params.repoName,\n });\n // Frissítjük a saját projekt listát a klónozott projekt megjelenéséhez.\n await this.loadProjects();\n } catch (err: unknown) {\n this.cloneError_$.set(err);\n } finally {\n this.cloneLoading_$.set(false);\n }\n }\n\n /** Group klónozása a saját instancra. */\n async cloneGroup(params: {\n sourceGroupId: string;\n targetParentDir: string;\n }): Promise<void> {\n this.cloneLoading_$.set(true);\n this.cloneError_$.set(null);\n try {\n await this.pm_AS.cloneGroup({\n sourceGroupId: params.sourceGroupId,\n targetParentDir: params.targetParentDir,\n });\n // Frissítjük mind a projekt, mind a csoport listát.\n await this.loadProjects();\n await this.loadGroups();\n } catch (err: unknown) {\n this.cloneError_$.set(err);\n } finally {\n this.cloneLoading_$.set(false);\n }\n }\n\n /**\n * Workspace scan: projektek felfedezése a megadott útvonal alatt.\n */\n async discoverProjects(scanPath: string): Promise<void> {\n this.discoveryLoading_$.set(true);\n this.discoveryError_$.set(null);\n this.discoveredProjects_$.set([]);\n try {\n const result: { discoveredProjects: PM_DiscoveredProject_Response[] } =\n await this.pm_AS.discoverProjects(scanPath);\n this.discoveredProjects_$.set(result.discoveredProjects);\n } catch (err: unknown) {\n this.discoveryError_$.set(err);\n } finally {\n this.discoveryLoading_$.set(false);\n }\n }\n\n /**\n * Felfedezett projektek batch létrehozása (a wizard által kiválasztott projektek).\n * A létrehozás után újratölti a projekt listát.\n */\n async createDiscoveredProjects(\n projects: PM_DiscoveredProject_Response[],\n ): Promise<void> {\n for (const discovered of projects) {\n const payload: PM_Response = {\n name: discovered.name,\n localPath: discovered.localPath,\n description: discovered.description,\n githubRepoUrl: discovered.githubRepoUrl,\n isActive: true,\n };\n await this.pm_AS.createProject(payload);\n }\n await this.loadProjects();\n }\n\n /**\n * Discovery state törlése (wizard bezárásakor).\n */\n clearDiscovery(): void {\n this.discoveredProjects_$.set([]);\n this.discoveryError_$.set(null);\n this.discoveryLoading_$.set(false);\n }\n\n /**\n * Git állapot gyors frissítése (csak git, nem teljes sync).\n * Frissíti az aktív projektet és a projekt listát.\n */\n async refreshGitStatus(projectId: string): Promise<void> {\n this.gitStatusLoading_$.set(true);\n this.gitStatusError_$.set(null);\n try {\n const result: { project: PM_ } =\n await this.pm_AS.refreshGitStatus(projectId);\n this.activeProject_$.set(result.project);\n try {\n const hostDetail: PM_GetProject_Response = await this.pm_AS.getProject(projectId);\n this.activeProjectComputedCcapHost_$.set(hostDetail.computedCcapRevisionedHost);\n } catch {\n // Host flag változatlan marad, ha a detail GET hibázik.\n }\n // Frissítjük a projekt listában is.\n this.projects_$.update(\n (list: PM_[]): PM_[] =>\n list.map(\n (p: PM_): PM_ =>\n p._id === projectId ? result.project : p,\n ),\n );\n } catch (err: unknown) {\n this.gitStatusError_$.set(err);\n } finally {\n this.gitStatusLoading_$.set(false);\n }\n }\n\n /**\n * Lightweight sync egy projektre. Frissíti az aktív projektet és a projekt listát.\n */\n async syncProject(projectId: string): Promise<void> {\n this.syncLoading_$.set(true);\n this.syncError_$.set(null);\n this.lastSyncResult_$.set(null);\n try {\n const result: { project: PM_; syncResult: PM_SyncResult_Response } =\n await this.pm_AS.syncProject(projectId);\n this.lastSyncResult_$.set(result.syncResult);\n this.activeProject_$.set(result.project);\n try {\n const hostDetail: PM_GetProject_Response = await this.pm_AS.getProject(projectId);\n this.activeProjectComputedCcapHost_$.set(hostDetail.computedCcapRevisionedHost);\n } catch {\n // Host flag változatlan marad, ha a detail GET hibázik.\n }\n // Frissítjük a projekt listában is.\n this.projects_$.update(\n (list: PM_[]): PM_[] =>\n list.map(\n (p: PM_): PM_ =>\n p._id === projectId ? result.project : p,\n ),\n );\n } catch (err: unknown) {\n this.syncError_$.set(err);\n } finally {\n this.syncLoading_$.set(false);\n }\n }\n\n /**\n * Lightweight sync minden aktív projektre. Frissíti a teljes projekt listát.\n */\n async syncAllProjects(): Promise<void> {\n this.syncLoading_$.set(true);\n this.syncError_$.set(null);\n try {\n await this.pm_AS.syncAllProjects();\n await this.loadProjects();\n } catch (err: unknown) {\n this.syncError_$.set(err);\n } finally {\n this.syncLoading_$.set(false);\n }\n }\n\n /**\n * Minden kontroll fájl betöltése az aktív projekthez.\n */\n async loadAllFileContents(projectId: string): Promise<void> {\n this.fileContentLoading_$.set(true);\n this.fileContentError_$.set(null);\n try {\n const result: { files: PM_AllFileContents_Response } =\n await this.pm_AS.getAllFileContents(projectId);\n this.fileContents_$.set(result.files);\n } catch (err: unknown) {\n this.fileContentError_$.set(err);\n } finally {\n this.fileContentLoading_$.set(false);\n }\n }\n\n /**\n * TEST-ERROR-REPORTS.json ürítése a szerveren, majd file sync újratöltés.\n */\n async clearTestErrorReportsAndRefresh(projectId: string): Promise<void> {\n this.testErrorReportsClearing_$.set(true);\n try {\n await this.pm_AS.clearTestErrorReports(projectId);\n await this.loadAllFileContents(projectId);\n } finally {\n this.testErrorReportsClearing_$.set(false);\n }\n }\n\n /**\n * BUGS.md path feloldás (jelöltek, ambiguitás) — UI választáshoz.\n */\n async getBugsPathResolve(projectId: string): Promise<PM_BugsPathResolution_Response> {\n return this.pm_AS.getBugsPathResolve(projectId);\n }\n\n /**\n * Központi error tábla → BUGS.md append; siker után fájl tartalom frissítése.\n */\n async appendBugsFromErrorsAndRefreshFiles(\n projectId: string,\n body?: PM_AppendBugsFromErrors_Request,\n ): Promise<PM_AppendBugsFromErrors_Response> {\n const result: PM_AppendBugsFromErrors_Response =\n await this.pm_AS.appendBugsFromErrors(projectId, body);\n await this.loadAllFileContents(projectId);\n return result;\n }\n\n /**\n * Egy központi error → BUGS.md; utána fájl tartalom frissítése.\n */\n async appendSingleBugFromErrorAndRefreshFiles(\n projectId: string,\n ccapErrorId: string,\n body?: PM_AppendBugsFromErrors_Request,\n ): Promise<PM_AppendSingleBugFromError_Response> {\n const result: PM_AppendSingleBugFromError_Response =\n await this.pm_AS.appendSingleBugFromError(projectId, ccapErrorId, body);\n await this.loadAllFileContents(projectId);\n return result;\n }\n\n /**\n * Kézi bug: BUGS.md + user request; utána kontroll fájlok és user request lista frissítése.\n */\n async createManualBugAndRefresh(\n projectId: string,\n body: PM_ManualBugCreate_Request,\n ): Promise<PM_ManualBugCreate_Response> {\n const result: PM_ManualBugCreate_Response =\n await this.pm_AS.createManualBug(projectId, body);\n await this.loadAllFileContents(projectId);\n await this.loadUserRequests(projectId);\n return result;\n }\n\n /**\n * User request-ek betöltése az aktív projekthez.\n */\n async loadUserRequests(projectId: string): Promise<void> {\n this.userRequestsLoading_$.set(true);\n this.userRequestsError_$.set(null);\n try {\n const result: { userRequests: PM_UserRequest[] } =\n await this.pm_AS.listUserRequests(projectId);\n this.userRequests_$.set(result.userRequests);\n } catch (err: unknown) {\n this.userRequestsError_$.set(err);\n } finally {\n this.userRequestsLoading_$.set(false);\n }\n }\n\n /**\n * Új user request létrehozása, majd lista frissítése.\n */\n async createUserRequest(\n projectId: string,\n payload: PM_CreateUserRequestHttpBody_Request,\n ): Promise<void> {\n await this.pm_AS.createUserRequest(projectId, payload);\n await this.loadUserRequests(projectId);\n }\n\n /**\n * User request frissítése, majd lista frissítése.\n */\n async updateUserRequest(\n projectId: string,\n requestId: string,\n payload: Partial<PM_UserRequest_Response>,\n ): Promise<void> {\n const result: { userRequest: PM_UserRequest } =\n await this.pm_AS.updateUserRequest(projectId, requestId, payload);\n this.userRequests_$.update(\n (list: PM_UserRequest[]): PM_UserRequest[] =>\n list.map(\n (r: PM_UserRequest): PM_UserRequest =>\n r._id === requestId ? result.userRequest : r,\n ),\n );\n }\n\n /**\n * USER-INPUT wizard: LLM suggest (egyetlen hívás).\n */\n async suggestUserInputFormat(\n projectId: string,\n body: PM_UserInputSuggestFormat_Request,\n ): Promise<PM_UserInputSuggestFormat_Response> {\n this.userInputWizardSuggestLoading_$.set(true);\n this.userInputWizardSuggestError_$.set(null);\n this.userInputWizardLastLlmSystemPrompt_$.set(null);\n this.userInputWizardLastLlmUserMessage_$.set(null);\n try {\n const result: PM_UserInputSuggestFormat_Response =\n await this.pm_AS.suggestUserInputFormat(projectId, body);\n this.userInputWizardLastLlmSystemPrompt_$.set(result.llmSystemPrompt ?? null);\n this.userInputWizardLastLlmUserMessage_$.set(result.llmUserMessage ?? null);\n return result;\n } catch (err: unknown) {\n this.userInputWizardSuggestError_$.set(err);\n throw err;\n } finally {\n this.userInputWizardSuggestLoading_$.set(false);\n }\n }\n\n /**\n * Kontroll entry mutáció után teljes file sync újratöltés.\n * Ha `priorRawFingerprintSha256` hiányzik, a DS számolja LF-normalizált prior blokk SHA-256-ját.\n */\n async mutateControlFileEntryAndRefresh(\n projectId: string,\n fileType: PM_ControlFileType_Type,\n body: Omit<PM_ControlEntryMutation_Request, 'priorRawFingerprintSha256'> & {\n priorRawFingerprintSha256?: string;\n },\n ): Promise<PM_ControlEntryMutation_Response> {\n const trimmedFp: string | undefined = body.priorRawFingerprintSha256?.trim();\n const priorFingerprint: string =\n trimmedFp != null && trimmedFp.length > 0\n ? trimmedFp\n : await PM_Sha256Fingerprint_Util.sha256HexOfNormalized(body.priorRawBlock);\n const fullBody: PM_ControlEntryMutation_Request = {\n mode: body.mode,\n priorRawBlock: body.priorRawBlock,\n priorRawFingerprintSha256: priorFingerprint,\n newRawBlock: body.newRawBlock,\n bugsFileAbsolutePath: body.bugsFileAbsolutePath,\n };\n const result: PM_ControlEntryMutation_Response =\n await this.pm_AS.mutateControlFileEntry(projectId, fileType, fullBody);\n await this.loadAllFileContents(projectId);\n return result;\n }\n\n /**\n * USER-INPUT wizard: USER-INPUT.md + DB véglegesítés, majd lista és fájl frissítés.\n */\n async finalizeUserInputWizard(\n projectId: string,\n body: PM_UserInputFinalize_Request,\n ): Promise<PM_UserInputFinalize_Response> {\n this.userInputWizardFinalizeLoading_$.set(true);\n this.userInputWizardFinalizeError_$.set(null);\n try {\n const result: PM_UserInputFinalize_Response =\n await this.pm_AS.finalizeUserInput(projectId, body);\n await this.loadUserRequests(projectId);\n await this.loadAllFileContents(projectId);\n return result;\n } catch (err: unknown) {\n this.userInputWizardFinalizeError_$.set(err);\n throw err;\n } finally {\n this.userInputWizardFinalizeLoading_$.set(false);\n }\n }\n\n // ─── Reviews ───────────────────────────────────────────────────────────────\n\n /**\n * Developer review metaadatok betöltése.\n */\n async loadReviewsMeta(projectId: string): Promise<void> {\n this.reviewsMetaLoading_$.set(true);\n this.reviewsMetaError_$.set(null);\n try {\n const result: { reviewsMeta: DT_DeveloperReviewMeta_Response[] } =\n await this.pm_AS.getReviewsMeta(projectId);\n this.reviewsMeta_$.set(result.reviewsMeta);\n } catch (err: unknown) {\n this.reviewsMetaError_$.set(err);\n } finally {\n this.reviewsMetaLoading_$.set(false);\n }\n }\n\n /**\n * Developer review-ok futtatása a projekt localPath-ján.\n */\n async runProjectReviews(projectId: string, reviewIds?: string[]): Promise<void> {\n this.reviewsRunning_$.set(true);\n this.reviewsRunError_$.set(null);\n this.reviewResult_$.set(null);\n try {\n const result: { reviewResult: DT_DeveloperRun_Response } =\n await this.pm_AS.runProjectReviews(projectId, reviewIds);\n this.reviewResult_$.set(result.reviewResult);\n } catch (err: unknown) {\n this.reviewsRunError_$.set(err);\n } finally {\n this.reviewsRunning_$.set(false);\n }\n }\n\n // ─── Agent Reports (REQ-PM-AGT-001 Slice 4) ────────────────────────\n\n /**\n * Agent riportok listájának betöltése a projekthez.\n * A szerver descending dátum-rendben adja vissza a fájlokat; itt csak továbbítjuk.\n */\n async loadAgentReports(projectId: string): Promise<void> {\n this.agentReportsLoading_$.set(true);\n this.agentReportsError_$.set(null);\n try {\n const result = await this.pm_AS.listAgentReports(projectId);\n this.agentReports_$.set(result.reports);\n } catch (err: unknown) {\n this.agentReportsError_$.set(err);\n } finally {\n this.agentReportsLoading_$.set(false);\n }\n }\n\n /**\n * Egy riport teljes tartalmának betöltése relPath alapján (path-traversal védelem\n * szerver-oldalon). Sikertelenség esetén `activeAgentReport_$` kiürül, hiba a\n * `activeAgentReportError_$`-re kerül.\n */\n async loadAgentReport(projectId: string, relPath: string): Promise<void> {\n this.activeAgentReportLoading_$.set(true);\n this.activeAgentReportError_$.set(null);\n try {\n const result = await this.pm_AS.getAgentReportContent(projectId, relPath);\n this.activeAgentReport_$.set(result);\n } catch (err: unknown) {\n this.activeAgentReport_$.set(null);\n this.activeAgentReportError_$.set(err);\n } finally {\n this.activeAgentReportLoading_$.set(false);\n }\n }\n\n /** Aktív riport kiürítése (vissza-gomb a detailből). */\n clearActiveAgentReport(): void {\n this.activeAgentReport_$.set(null);\n this.activeAgentReportError_$.set(null);\n }\n}\n", "import { Component, computed, inject, input } from '@angular/core';\n\nimport { PM_ } from '../../../../_models/server-index';\nimport { ProjectManagement_DataService } from '../../../project-management/_services/data-services/project-management.data-service';\n\n/**\n * Projekt-név badge: ha a megadott workspace path alapján van találat\n * a betöltött projekt listában (`PM_.localPath`), akkor egy kis pilulát\n * rajzol a projekt nevével. Match nélkül a host elem `display: none`,\n * így a parent flex konténerben `gap` extra rés sem keletkezik.\n *\n * Path matching: normalizált — lowercase (Windows case-insensitivity),\n * backslash → slash egységesítés, trailing slash eltávolítása.\n *\n * Projekt lista lazy-load: első badge példány triggereli a `loadProjects()`-et,\n * ha a service-en még nem futott le sikeresen és nincs folyamatban / hiba.\n */\n@Component({\n selector: 'app-s-project-badge',\n standalone: true,\n templateUrl: './s-project-badge.component.html',\n host: {\n 'class': 'ml-auto',\n '[style.display]': 'projectName_$() ? \"inline-flex\" : \"none\"',\n },\n})\n/** S_ProjectBadge_Component class. */\nexport class S_ProjectBadge_Component {\n\n /** Session workspace path — ez alapján keressük a projektet. */\n readonly workspacePath = input<string | undefined>(undefined);\n\n private readonly pm_DS: ProjectManagement_DataService =\n inject(ProjectManagement_DataService);\n\n /** A workspace path-hez illeszkedő projekt neve — vagy null, ha nincs match. */\n readonly projectName_$ = computed((): string | null => {\n const wp: string | undefined = this.workspacePath();\n if (!wp) {\n return null;\n }\n const normWp: string = S_ProjectBadge_Component.normalizePath(wp);\n if (!normWp) {\n return null;\n }\n const list: PM_[] = this.pm_DS.projects_$();\n const match: PM_ | undefined = list.find(\n (p: PM_): boolean =>\n !!p.localPath &&\n S_ProjectBadge_Component.normalizePath(p.localPath) === normWp,\n );\n return match?.name ?? null;\n });\n\n constructor() {\n // Lazy-load: első felbukkanáskor indítjuk a projekt listát — csak akkor,\n // ha még sosem töltődött be sikeresen, nincs éppen folyamatban,\n // és az előző próbálkozás nem ért hibába (különben minden új badge példány\n // újraindítana egy olyan request-et ami úgyis hibázni fog).\n if (\n !this.pm_DS.projectsLoadedOnce_$() &&\n !this.pm_DS.projectsLoading_$() &&\n !this.pm_DS.projectsError_$()\n ) {\n void this.pm_DS.loadProjects();\n }\n }\n\n /**\n * Path normalizáció: trim, lowercase (Windows case-insensitivity),\n * backslash → slash, trailing slash eltávolítása.\n */\n private static normalizePath(path: string): string {\n let normalized: string = path.trim().toLowerCase().replace(/\\\\/g, '/');\n while (normalized.endsWith('/') && normalized.length > 1) {\n normalized = normalized.slice(0, -1);\n }\n return normalized;\n }\n}\n", "@if (projectName_$(); as name) {\n <span\n class=\"text-[9px] px-1 py-0.5 rounded bg-sky-500/20 text-sky-300 border border-sky-500/30 shrink-0 truncate max-w-[140px]\"\n [title]=\"name\">\n {{ name }}\n </span>\n}\n", "import { Component, input, InputSignal, output, OutputEmitterRef } from '@angular/core';\nimport { NgClass } from '@angular/common';\n\nimport { S_AbsoluteTime_Pipe } from '../../../_pipes/s-absolute-time.pipe';\nimport { S_TimeAgo_Pipe } from '../../../_pipes/s-time-ago.pipe';\nimport { S_ProjectBadge_Component } from '../../s-project-badge/s-project-badge.component';\nimport { S_SessionInfoCardData_Interface } from '../../../_models/interfaces/s-session-info-card-data.interface';\n\n/**\n * Shared external session lista sor komponens.\n * Egységes megjelenítés CC, OC, CA session listákhoz:\n * státusz dot (spinning ha futó), label, timestamp, projekt badge, archived badge.\n *\n * A context menu és a műveletek a parent dashboard-ban maradnak — ez a komponens\n * csak a `contextMenu` output-on keresztül jelzi a jobb klikk eseményt.\n *\n * REQ-UI-SHARED-SESSION-INFO-CARD-001 Slice 2a (cycle 906): bevezetve a `size:\n * 'compact' | 'full'` input. A `compact` (default) az eredeti, listához igazított\n * egysoros viselkedés. A `full` placeholder — egyelőre `compact`-ra esik, a\n * tényleges multi-row layout a Slice 3-ban érkezik.\n *\n * REQ-UI-SHARED-SESSION-INFO-CARD-001 Slice 2b (cycle 907): komponens-rename\n * `s-session-list-row` → `s-session-info-card` (mappa + fájlok + class +\n * selector). A `S_SessionInfoCardData_Interface` data-interface MARAD a Slice 4\n * cleanup-ig (backward-compat).\n */\n@Component({\n selector: 'app-s-session-info-card',\n standalone: true,\n imports: [NgClass, S_AbsoluteTime_Pipe, S_TimeAgo_Pipe, S_ProjectBadge_Component],\n templateUrl: './s-session-info-card.component.html',\n host: { class: 'block' },\n})\n/** S_SessionInfoCard_Component class. */\nexport class S_SessionInfoCard_Component {\n\n /** Normalizált session view adat. */\n readonly view: InputSignal<S_SessionInfoCardData_Interface> =\n input.required<S_SessionInfoCardData_Interface>();\n\n /** Kijelölt (aktív) sor. */\n readonly isActive: InputSignal<boolean> = input<boolean>(false);\n\n /** Workspace path sor megjelenítése (OC, CA használja). */\n readonly showWorkspacePath: InputSignal<boolean> = input<boolean>(false);\n\n /** Prompt count megjelenítése (OC, CA használja). */\n readonly showPromptCount: InputSignal<boolean> = input<boolean>(false);\n\n /**\n * REQ-UI-SHARED-SESSION-INFO-CARD-001 Slice 2 (cycle 906): méret-variant.\n * `compact` (default) — egysoros, listához igazított (eredeti viselkedés).\n * `full` — multi-row, dashboard / overlay-panel-header / detail-card mintára.\n * Slice 3-ig a `full` placeholder, `compact`-ra esik.\n */\n readonly size: InputSignal<'compact' | 'full'> = input<'compact' | 'full'>('compact');\n\n /** Session kiválasztás (kattintás). */\n readonly selected: OutputEmitterRef<string> = output<string>();\n\n /** Jobb klikk context menu — pozíció + session id átadása a parent-nek. */\n readonly contextMenu: OutputEmitterRef<{ event: MouseEvent; id: string }> =\n output<{ event: MouseEvent; id: string }>();\n\n /**\n * REQ-SCH-IND-CLICK-001 (cycle 201): a schedule-indicator badge kattintásakor\n * jelez a parent-nek (sessionId) — a parent dashboard nyitja meg a popup-ot.\n * Csak akkor emittál, ha a `view().hasSchedule` true (a badge látható).\n */\n readonly scheduleIndicatorClicked: OutputEmitterRef<string> = output<string>();\n\n /**\n * REQ-SES-CRD-IND-001 Slice 3 (cycle 202): a coordinator-indicator badge\n * kattintásakor jelez a parent-nek (sessionId) — a parent dashboard nyitja meg a popup-ot.\n * Csak akkor emittál, ha a `view().hasCoordinator` true (a badge látható).\n */\n readonly coordinatorIndicatorClicked: OutputEmitterRef<string> = output<string>();\n\n /** Kattintás kezelése — session kiválasztás. */\n handleSelect(): void {\n this.selected.emit(this.view().id);\n }\n\n /** Jobb klikk kezelése — context menu jelzés a parent-nek. */\n handleContextMenu(event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.contextMenu.emit({ event: event, id: this.view().id });\n }\n\n /**\n * Schedule-indicator kattintás — propagáció megállítása (ne válassza ki a sort),\n * majd sessionId emit a parent-nek.\n */\n handleScheduleIndicatorClick(event: MouseEvent): void {\n event.stopPropagation();\n this.scheduleIndicatorClicked.emit(this.view().id);\n }\n\n /**\n * Coordinator-indicator kattintás — propagáció megállítása + sessionId emit\n * (REQ-SES-CRD-IND-001 Slice 3).\n */\n handleCoordinatorIndicatorClick(event: MouseEvent): void {\n event.stopPropagation();\n this.coordinatorIndicatorClicked.emit(this.view().id);\n }\n}\n", "<!-- REQ-UI-SHARED-SESSION-INFO-CARD-001 Slice 3 (cycle 908): a `full` size variant\n nagyobb padding-gel, nagyobb label/status-dot fonttal, és egy `ng-content\n select=\"[footer-actions]\"` slot-tal a parent-driven action-button-okhoz\n (Pause/Resume, Trigger Now, Edit, Delete). A `compact` viselkedés változatlan. -->\n<div\n [class]=\"(size() === 'full' ? 'px-3 py-2.5 ' : 'px-2 py-1.5 ') + 'border-b cursor-pointer transition-colors '\n + (isActive()\n ? 'border-l-2 border-l-ccapAccent border-b-neutral-700/30 bg-neutral-800/80'\n : 'border-l-2 border-l-transparent border-b-neutral-700/30 hover:bg-neutral-800/60')\"\n [class.opacity-50]=\"view().isArchived\"\n (click)=\"handleSelect()\"\n (contextmenu)=\"handleContextMenu($event)\">\n\n <!-- Fő sor: status dot, label, timestamp, projekt badge, archived -->\n <div class=\"flex items-center gap-1.5\">\n <!-- Státusz dot + spinning indikátor (size === 'full' esetén nagyobb) -->\n <span class=\"relative shrink-0 flex items-center justify-center\"\n [class]=\"size() === 'full' ? 'w-4 h-4' : 'w-3.5 h-3.5'\"\n [title]=\"view().status\">\n <span class=\"rounded-full\"\n [class]=\"size() === 'full' ? 'w-2 h-2' : 'w-1.5 h-1.5'\"\n [ngClass]=\"view().statusColorClass\"></span>\n @if (view().isRunning) {\n <span class=\"absolute inset-0 rounded-full border border-transparent border-t-yellow-400 animate-spin\"></span>\n }\n </span>\n\n <!-- Label (size === 'full' esetén nagyobb font) -->\n <span class=\"text-neutral-200 font-medium truncate shrink-1 min-w-0\"\n [class]=\"size() === 'full' ? 'text-sm' : 'text-xs'\">\n {{ view().label }}\n </span>\n\n <!-- Last activity — REQ-SES-EVT-TS-002 cycle 473: text-neutral-400 + [title] absolute time. -->\n <span class=\"text-[10px] text-neutral-400 shrink-0\"\n [title]=\"(view().lastActivityAt ?? '') | sAbsoluteTime\">\n {{ view().lastActivityAt ? (view().lastActivityAt | sTimeAgo) : '—' }}\n </span>\n\n <!-- Projekt badge -->\n @if (view().workspacePath) {\n <app-s-project-badge [workspacePath]=\"view().workspacePath!\" />\n }\n\n <!-- Archived badge -->\n @if (view().isArchived) {\n <span class=\"text-[8px] px-0.5 rounded bg-amber-500/15 text-amber-500 shrink-0\">\n archived\n </span>\n }\n\n <!-- Schedule-indicator: REQ-SES-SCH-IND-001 (cycle 176-178) — calendar ikon, ha a session-höz aktív schedule.\n REQ-SCH-IND-CLICK-001 (cycle 201): kattintható → popup a job + execution infókkal a parent dashboardon.\n A button stopPropagation-t végez, így a sor select handler-e nem fut le.\n BUG-UI-SES-LIST-SCHED-ICON-LAYOUT-001 (cycle 900): `ml-auto` ha NINCS project-badge — különben\n az ikon rácsúszik a session-name-re, mert a project-badge `ml-auto`-ja adta eddig a space-between-et. -->\n @if (view().hasSchedule) {\n <button type=\"button\"\n class=\"shrink-0 text-neonCyan/80 hover:text-neonCyan focus:outline-none focus:ring-1 focus:ring-neonCyan/60 rounded p-0.5\"\n [class.ml-auto]=\"!view().workspacePath\"\n title=\"Ehhez a session-höz tartozik schedule — kattints a részletekért\"\n aria-label=\"Schedule attached — open popup\"\n (click)=\"handleScheduleIndicatorClick($event)\">\n <svg class=\"w-3 h-3\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\" />\n <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\" />\n <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\" />\n </svg>\n </button>\n }\n\n <!-- Draft-indicator: REQ-UI-SES-LIST-DRAFT-INDICATOR-001 (cycle 902) — toll-ikon ha a session-höz\n tartozik el-nem-küldött prompt-piszkozat a localStorage-ban. NEM kattintható (csak indikátor),\n tooltip a részleteket adja. `ml-auto` ha ő az első jobboldali indikátor (no project, no schedule, no coord). -->\n @if (view().hasDraft) {\n <span class=\"shrink-0 text-amber-400/80 inline-flex items-center justify-center p-0.5\"\n [class.ml-auto]=\"!view().workspacePath && !view().hasSchedule\"\n title=\"El-nem-küldött piszkozat van mentve ehhez a session-höz\"\n aria-label=\"Unsent draft input present\">\n <svg class=\"w-3 h-3\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M12 20h9\" />\n <path d=\"M16.5 3.5a2.121 2.121 0 1 1 3 3L7 19l-4 1 1-4 12.5-12.5z\" />\n </svg>\n </span>\n }\n\n <!-- Coordinator-indicator: REQ-SES-CRD-IND-001 (cycle 190) — compass ikon neonAmber.\n REQ-SES-CRD-IND-001 Slice 3 (cycle 202): kattintható → popup koordinátor infókkal.\n BUG-UI-SES-LIST-SCHED-ICON-LAYOUT-001 (cycle 900): `ml-auto` ha NINCS project-badge ÉS NINCS\n schedule-indicator ÉS NINCS draft-indikátor előtte (akkor ő az első indikátor a name után). -->\n @if (view().hasCoordinator) {\n <button type=\"button\"\n class=\"shrink-0 text-neonAmber/80 hover:text-neonAmber focus:outline-none focus:ring-1 focus:ring-neonAmber/60 rounded p-0.5\"\n [class.ml-auto]=\"!view().workspacePath && !view().hasSchedule && !view().hasDraft\"\n title=\"Ehhez a session-höz tartozik koordinátor — kattints a részletekért\"\n aria-label=\"Coordinator attached — open popup\"\n (click)=\"handleCoordinatorIndicatorClick($event)\">\n <svg class=\"w-3 h-3\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polygon points=\"16.24 7.76 14.12 14.12 7.76 16.24 9.88 9.88 16.24 7.76\" />\n </svg>\n </button>\n }\n </div>\n\n <!-- Workspace path sor (opcionális) -->\n @if (showWorkspacePath() && view().workspacePath) {\n <div class=\"text-[10px] text-neutral-500 truncate mt-0.5 ml-5\">\n {{ view().workspacePath }}\n </div>\n }\n\n <!-- Prompt count + stats sor (opcionális) -->\n @if (showPromptCount() && view().promptCount) {\n <div class=\"flex items-center gap-2 mt-0.5 ml-5\">\n <span class=\"text-[10px] text-neutral-600\">\n {{ view().promptCount }} prompts\n </span>\n </div>\n }\n\n <!-- REQ-UI-SHARED-SESSION-INFO-CARD-001 Slice 3 (cycle 908): full-size action-slot.\n A parent (scheduler-overlay, sch-job-list, dashboard-card) ide injektálja\n a saját action-button-jait egy `[footer-actions]` selectorú elemmel.\n Compact size-on rejtett. -->\n @if (size() === 'full') {\n <div class=\"flex items-center gap-1.5 mt-1.5 pt-1.5 border-t border-neutral-800/50 empty:hidden\">\n <ng-content select=\"[footer-actions]\" />\n </div>\n }\n</div>\n", "import {\n Component,\n computed,\n input,\n InputSignal,\n output,\n OutputEmitterRef,\n Signal,\n signal,\n WritableSignal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\n\nimport { CCAP_TextSearch_Util } from '../../../../../_collections/utils/ccap-text-search.util';\nimport { S_SessionInfoCardData_Interface }\n from '../../../_models/interfaces/s-session-info-card-data.interface';\nimport { S_SessionInfoCard_Component } from '../s-session-info-card/s-session-info-card.component';\n\n/**\n * REQ-UI-SSEL-001 Slice 1 — megosztott session-picker wrapper.\n *\n * Egyetlen SSOT komponens session-lista renderelésre: beépített accent-insensitive\n * keresővel (`CCAP_TextSearch_Util`), `S_SessionInfoCard_Component`-tel sor-render-re,\n * és event-alapú kiválasztás / context-menu handover a parent-nek.\n *\n * **Session-kind** input (`ccap` / `cc` / `ca` / `oc`) informatív — nem változtat a\n * render logikán, de a parent dashboardok és a Quick Input send-dropdown ugyanazt a\n * wrapper-t tudják használni, típus-szerinti külön dashboard-logika nélkül.\n *\n * **Scope**: ez a Slice csak a SKELETON-t adja — a kiegészítő szűrők (status filter,\n * project filter, archive toggle) a következő slice-okban kerülnek be flag-alapon.\n * Lásd: `__documentations/plans/2026-04-24/2026-04-24-req-ui-ssel-001-session-select-unification.plan.md`.\n */\n@Component({\n selector: 'app-s-session-select',\n standalone: true,\n imports: [CommonModule, FormsModule, S_SessionInfoCard_Component],\n templateUrl: './s-session-select.component.html',\n host: { class: 'block' },\n})\n/** S_SessionSelect_Component class. */\nexport class S_SessionSelect_Component {\n\n /** Session típus — parent-beli data source jelölés. Jelenleg render-logikát nem vezérel. */\n readonly kind: InputSignal<'ccap' | 'cc' | 'ca' | 'oc'> =\n input.required<'ccap' | 'cc' | 'ca' | 'oc'>();\n\n /** Megjelenítendő sorok (normalizált `S_SessionInfoCardData_Interface` alakban). */\n readonly rows: InputSignal<S_SessionInfoCardData_Interface[]> =\n input<S_SessionInfoCardData_Interface[]>([]);\n\n /** Aktívan kiválasztott session azonosítója (highlight-hoz). */\n readonly activeId: InputSignal<string> = input<string>('');\n\n /** Workspace path megjelenítése a soron (OC / CA használja). */\n readonly showWorkspacePath: InputSignal<boolean> = input<boolean>(false);\n\n /** Prompt count megjelenítése a soron (OC / CA használja). */\n readonly showPromptCount: InputSignal<boolean> = input<boolean>(false);\n\n /** Search input placeholder. */\n readonly searchPlaceholder: InputSignal<string> = input<string>('Keresés...');\n\n /**\n * Ha `true`: nincs belső keresősáv és a `filteredRows_$` a nyers `rows()`-t adja vissza —\n * a parent maga szűr (pl. ses-list, ami a name + goal + intent mezőkön keres, nem csak label-en).\n */\n readonly hideSearch: InputSignal<boolean> = input<boolean>(false);\n\n /** Session kiválasztás event (kattintás). */\n readonly selected: OutputEmitterRef<string> = output<string>();\n\n /** Jobb klikk context menu event — pozíció + session id. */\n readonly contextMenu: OutputEmitterRef<{ event: MouseEvent; id: string }> =\n output<{ event: MouseEvent; id: string }>();\n\n /** REQ-SCH-IND-CLICK-001 (cycle 201): schedule-indicator kattintás proxy a row-tól a parent-ig. */\n readonly scheduleIndicatorClicked: OutputEmitterRef<string> = output<string>();\n\n /** REQ-SES-CRD-IND-001 Slice 3 (cycle 202): coordinator-indicator kattintás proxy. */\n readonly coordinatorIndicatorClicked: OutputEmitterRef<string> = output<string>();\n\n /** Search query — accent-insensitive szűrés label-re. */\n readonly searchQuery_$: WritableSignal<string> = signal<string>('');\n\n /**\n * Szűrt sorok — accent/case-insensitive match a session label-re.\n * Üres query → minden sort átenged. `hideSearch=true` esetén nincs belső szűrés\n * (a parent maga szűri a listát, a wrapper csak renderelő).\n */\n readonly filteredRows_$: Signal<S_SessionInfoCardData_Interface[]> = computed(\n (): S_SessionInfoCardData_Interface[] => {\n const allRows: S_SessionInfoCardData_Interface[] = this.rows();\n if (this.hideSearch()) {\n return allRows;\n }\n const query: string = this.searchQuery_$();\n if (query.trim().length === 0) {\n return allRows;\n }\n return allRows.filter(\n (row: S_SessionInfoCardData_Interface): boolean =>\n CCAP_TextSearch_Util.includesText(row.label, query),\n );\n },\n );\n\n /** Select event továbbítása a parent-nek. */\n handleRowSelect(id: string): void {\n this.selected.emit(id);\n }\n\n /** Context-menu event továbbítása. */\n handleRowContextMenu(payload: { event: MouseEvent; id: string }): void {\n this.contextMenu.emit(payload);\n }\n\n /** Schedule-indicator click event továbbítása. */\n handleRowScheduleIndicatorClick(sessionId: string): void {\n this.scheduleIndicatorClicked.emit(sessionId);\n }\n\n /** Coordinator-indicator click event továbbítása (REQ-SES-CRD-IND-001 Slice 3). */\n handleRowCoordinatorIndicatorClick(sessionId: string): void {\n this.coordinatorIndicatorClicked.emit(sessionId);\n }\n}\n", "<!-- REQ-UI-SSEL-001 Slice 1: shared session picker — search bar + row list -->\n<div class=\"flex flex-col gap-2\">\n\n <!-- Search bar (csak ha `hideSearch` nem aktív — parent-driven szűrésnél a parent\n maga tart keresőmezőt, a wrapper csak renderelő). -->\n @if (!hideSearch()) {\n <div class=\"px-2 pt-2\">\n <input\n type=\"text\"\n class=\"w-full px-2 py-1 text-xs rounded border border-neonDefault bg-neutral-900 text-neutral-200 placeholder-neutral-500 focus:outline-none focus:border-ccapAccent\"\n [placeholder]=\"searchPlaceholder()\"\n [ngModel]=\"searchQuery_$()\"\n (ngModelChange)=\"searchQuery_$.set($event)\"\n data-testid=\"s-session-select-search\" />\n </div>\n }\n\n <!-- Row list -->\n <div class=\"flex flex-col gap-1 px-2 pb-2\">\n @for (row of filteredRows_$(); track row.id) {\n <app-s-session-info-card\n [view]=\"row\"\n [isActive]=\"row.id === activeId()\"\n [showWorkspacePath]=\"showWorkspacePath()\"\n [showPromptCount]=\"showPromptCount()\"\n (selected)=\"handleRowSelect($event)\"\n (contextMenu)=\"handleRowContextMenu($event)\"\n (scheduleIndicatorClicked)=\"handleRowScheduleIndicatorClick($event)\"\n (coordinatorIndicatorClicked)=\"handleRowCoordinatorIndicatorClick($event)\" />\n }\n\n @if (filteredRows_$().length === 0) {\n <span class=\"text-[11px] text-neutral-500 italic px-1 py-2\">\n @if (searchQuery_$().trim().length > 0) {\n Nincs találat.\n } @else {\n Üres lista.\n }\n </span>\n }\n </div>\n\n</div>\n"],
5
+ "mappings": "qcAGM,IAAOA,EAAP,MAAOA,CAAyB,CAKpC,OAAOC,kBAAkBC,EAAY,CACnC,OAAOA,EAAKC,QAAQ,QAAS;CAAI,EAAEA,QAAQ,MAAO;CAAI,CACxD,CAKA,OAAaC,sBAAsBF,EAAY,QAAAG,EAAA,sBAC7C,IAAMC,EAAqBN,EAA0BC,kBAAkBC,CAAI,EAErEK,EADuB,IAAIC,YAAW,EACXC,OAAOH,CAAU,EAC5CI,EAAsB,MAAMC,OAAOC,OAAOF,OAAO,UAAWH,CAAI,EAChEM,EAAoB,IAAIC,WAAWJ,CAAM,EAC3CK,EAAc,GAClB,QAASC,EAAY,EAAGA,EAAIH,EAAMI,OAAQD,GAAK,EAC7CD,GAAOF,EAAMG,CAAC,EAAEE,SAAS,EAAE,EAAEC,SAAS,EAAG,GAAG,EAE9C,OAAOJ,CACT,KCqBF,IAAaK,IAA6B,IAAA,CAApC,MAAOA,CAA6B,CAG/BC,WAAaC,EAAc,CAAA,CAAE,EAG7BC,kBAAoBD,EAAgB,EAAK,EAGzCE,gBAAkBF,EAAuB,IAAI,EAQ7CG,qBAAuBH,EAAgB,EAAK,EAG5CI,gBAAkBJ,EAAmB,IAAI,EAMzCK,gCAAkCL,EAAgB,EAAK,EAGvDM,uBAAyBN,EAAgB,EAAK,EAG9CO,qBAAuBP,EAAuB,IAAI,EAGlDQ,eAAiBR,EAAyB,CAAA,CAAE,EAG5CS,sBAAwBT,EAAgB,EAAK,EAG7CU,oBAAsBV,EAAuB,IAAI,EAGjDW,qBAAuBX,EAAwC,CAAA,CAAE,EAGjEY,mBAAqBZ,EAAgB,EAAK,EAG1Ca,iBAAmBb,EAAuB,IAAI,EAG9Cc,mBAAqBd,EAAgB,EAAK,EAG1Ce,iBAAmBf,EAAuB,IAAI,EAG9CgB,cAAgBhB,EAAgB,EAAK,EAGrCiB,YAAcjB,EAAuB,IAAI,EAGzCkB,iBAAmBlB,EAAsC,IAAI,EAG7DmB,eAAiBnB,EAA2C,IAAI,EAGhEoB,qBAAuBpB,EAAgB,EAAK,EAG5CqB,mBAAqBrB,EAAuB,IAAI,EAGhDsB,2BAA6BtB,EAAgB,EAAK,EAKlDuB,eAAiBvB,EAAmC,CAAA,CAAE,EAGtDwB,sBAAwBxB,EAAgB,EAAK,EAG7CyB,oBAAsBzB,EAAuB,IAAI,EAGjD0B,oBAAsB1B,EAA8C,IAAI,EAGxE2B,2BAA6B3B,EAAgB,EAAK,EAGlD4B,yBAA2B5B,EAAuB,IAAI,EAGtD6B,cAAgB7B,EAA0C,CAAA,CAAE,EAG5D8B,qBAAuB9B,EAAgB,EAAK,EAG5C+B,mBAAqB/B,EAAuB,IAAI,EAGhDgC,eAAiBhC,EAAwC,IAAI,EAG7DiC,iBAAmBjC,EAAgB,EAAK,EAGxCkC,kBAAoBlC,EAAuB,IAAI,EAG/CmC,gCAAkCnC,EAAgB,EAAK,EAGvDoC,8BAAgCpC,EAAuB,IAAI,EAG3DqC,iCAAmCrC,EAAgB,EAAK,EAGxDsC,+BAAiCtC,EAAuB,IAAI,EAG5DuC,qCAAuCvC,EAAsB,IAAI,EAGjEwC,oCAAsCxC,EAAsB,IAAI,EAKhEyC,SAAWzC,EAA6B,CAAA,CAAE,EAG1C0C,gBAAkB1C,EAAgB,EAAK,EAGvC2C,cAAgB3C,EAAuB,IAAI,EAG3C4C,cAAgB5C,EAAkC,IAAI,EAGtD6C,aAAe7C,EAAsC,IAAI,EAGzD8C,oBAAsB9C,EAAgB,EAAK,EAG3C+C,kBAAoB/C,EAAuB,IAAI,EAK/CgD,wBAA0BhD,EAAc,CAAA,CAAE,EAG1CiD,uBAAyBjD,EAAgB,EAAK,EAG9CkD,qBAAuBlD,EAAuB,IAAI,EAGlDmD,gBAAkBnD,EAAsB,IAAI,EAG5CoD,eAAiBpD,EAAgB,EAAK,EAGtCqD,aAAerD,EAAuB,IAAI,EAElCsD,MACfC,EAAOC,CAA4B,EAK/BC,cAAY,QAAAC,EAAA,sBAChB,KAAKzD,kBAAkB0D,IAAI,EAAI,EAC/B,KAAKzD,gBAAgByD,IAAI,IAAI,EAC7B,GAAI,CACF,IAAMC,EAAmC,MAAM,KAAKN,MAAMO,aAAY,EACtE,KAAK9D,WAAW4D,IAAIC,EAAOE,QAAQ,EACnC,KAAK3D,qBAAqBwD,IAAI,EAAI,CACpC,OAASI,EAAc,CACrB,KAAK7D,gBAAgByD,IAAII,CAAG,CAC9B,QAAC,CACC,KAAK9D,kBAAkB0D,IAAI,EAAK,CAClC,CACF,GAKMK,YAAYC,EAAiB,QAAAP,EAAA,sBACjC,KAAKpD,uBAAuBqD,IAAI,EAAI,EACpC,KAAKpD,qBAAqBoD,IAAI,IAAI,EAClC,GAAI,CACF,IAAMC,EAAiC,MAAM,KAAKN,MAAMY,WAAWD,CAAS,EAC5E,KAAK7D,gBAAgBuD,IAAIC,EAAOO,OAAO,EACvC,KAAK9D,gCAAgCsD,IAAIC,EAAOQ,0BAA0B,CAC5E,OAASL,EAAc,CACrB,KAAKxD,qBAAqBoD,IAAII,CAAG,CACnC,QAAC,CACC,KAAKzD,uBAAuBqD,IAAI,EAAK,CACvC,CACF,GAKMU,cAAcC,EAAoB,QAAAZ,EAAA,sBACtC,IAAME,EAA2B,MAAM,KAAKN,MAAMe,cAAcC,CAAO,EACvE,aAAM,KAAKb,aAAY,EAChBG,EAAOO,OAChB,GAKMI,cAAcN,EAAmBK,EAA6B,QAAAZ,EAAA,sBAClE,IAAME,EAAiC,MAAM,KAAKN,MAAMiB,cAAcN,EAAWK,CAAO,EACxF,KAAKlE,gBAAgBuD,IAAIC,EAAOO,OAAO,EACvC,KAAK9D,gCAAgCsD,IAAIC,EAAOQ,0BAA0B,EAC1E,KAAKrE,WAAWyE,OACbC,GACCA,EAAKC,IACFC,GACCA,EAAEC,MAAQX,EAAYL,EAAOO,QAAUQ,CAAC,CAC3C,CAEP,GAKME,eAAeZ,EAAiB,QAAAP,EAAA,sBACpC,MAAM,KAAKJ,MAAMuB,eAAeZ,CAAS,EACzC,MAAM,KAAKR,aAAY,EACnB,KAAKrD,gBAAe,GAAIwE,MAAQX,IAClC,KAAK7D,gBAAgBuD,IAAI,IAAI,EAC7B,KAAKtD,gCAAgCsD,IAAI,EAAK,EAElD,GAOMmB,YAAU,QAAApB,EAAA,sBACd,KAAKhB,gBAAgBiB,IAAI,EAAI,EAC7B,KAAKhB,cAAcgB,IAAI,IAAI,EAC3B,GAAI,CACF,IAAMC,EAA2C,MAAM,KAAKN,MAAMyB,WAAU,EAC5E,KAAKtC,SAASkB,IAAIC,EAAOoB,MAAM,CACjC,OAASjB,EAAc,CACrB,KAAKpB,cAAcgB,IAAII,CAAG,CAC5B,QAAC,CACC,KAAKrB,gBAAgBiB,IAAI,EAAK,CAChC,CACF,GAGMsB,YAAYX,EAAiE,QAAAZ,EAAA,sBACjF,MAAM,KAAKJ,MAAM2B,YAAYX,CAAO,EACpC,MAAM,KAAKQ,WAAU,CACvB,GAGMI,aAAaC,EAAe,QAAAzB,EAAA,sBAChC,MAAM,KAAKJ,MAAM4B,aAAaC,CAAO,EACjC,KAAKvC,cAAa,GAAIgC,MAAQO,GAChC,KAAKvC,cAAce,IAAI,IAAI,EAE7B,MAAM,KAAKmB,WAAU,CACvB,GAGAM,YAAYC,EAAgC,CAC1C,KAAKzC,cAAce,IAAI0B,CAAK,CAC9B,CAGMC,eAAeH,EAAe,QAAAzB,EAAA,sBAClC,KAAKZ,oBAAoBa,IAAI,EAAI,EACjC,KAAKZ,kBAAkBY,IAAI,IAAI,EAC/B,GAAI,CACF,IAAMC,EAAiC,MAAM,KAAKN,MAAMiC,cAAcJ,CAAO,EAC7E,KAAKtC,aAAac,IAAIC,CAAM,CAC9B,OAASG,EAAc,CACrB,KAAKhB,kBAAkBY,IAAII,CAAG,CAChC,QAAC,CACC,KAAKjB,oBAAoBa,IAAI,EAAK,CACpC,CACF,GAOM6B,2BAAyB,QAAA9B,EAAA,sBAC7B,KAAKT,uBAAuBU,IAAI,EAAI,EACpC,KAAKT,qBAAqBS,IAAI,IAAI,EAClC,GAAI,CACF,IAAMC,EACJ,MAAM,KAAKN,MAAMmC,+BAA8B,EACjD,KAAKzC,wBAAwBW,IAAIC,EAAOE,QAAQ,EAChD,KAAKX,gBAAgBQ,IAAIC,EAAO8B,aAAa,CAC/C,OAAS3B,EAAc,CACrB,KAAKb,qBAAqBS,IAAII,CAAG,CACnC,QAAC,CACC,KAAKd,uBAAuBU,IAAI,EAAK,CACvC,CACF,GAGMgC,aAAaC,EAIlB,QAAAlC,EAAA,sBACC,KAAKN,eAAeO,IAAI,EAAI,EAC5B,KAAKN,aAAaM,IAAI,IAAI,EAC1B,GAAI,CACF,MAAM,KAAKL,MAAMqC,aAAa,CAC5BE,gBAAiBD,EAAOC,gBACxBC,gBAAiBF,EAAOE,gBACxBC,SAAUH,EAAOG,SAClB,EAED,MAAM,KAAKtC,aAAY,CACzB,OAASM,EAAc,CACrB,KAAKV,aAAaM,IAAII,CAAG,CAC3B,QAAC,CACC,KAAKX,eAAeO,IAAI,EAAK,CAC/B,CACF,GAGMqC,WAAWJ,EAGhB,QAAAlC,EAAA,sBACC,KAAKN,eAAeO,IAAI,EAAI,EAC5B,KAAKN,aAAaM,IAAI,IAAI,EAC1B,GAAI,CACF,MAAM,KAAKL,MAAM0C,WAAW,CAC1BC,cAAeL,EAAOK,cACtBH,gBAAiBF,EAAOE,gBACzB,EAED,MAAM,KAAKrC,aAAY,EACvB,MAAM,KAAKqB,WAAU,CACvB,OAASf,EAAc,CACrB,KAAKV,aAAaM,IAAII,CAAG,CAC3B,QAAC,CACC,KAAKX,eAAeO,IAAI,EAAK,CAC/B,CACF,GAKMuC,iBAAiBC,EAAgB,QAAAzC,EAAA,sBACrC,KAAK9C,mBAAmB+C,IAAI,EAAI,EAChC,KAAK9C,iBAAiB8C,IAAI,IAAI,EAC9B,KAAKhD,qBAAqBgD,IAAI,CAAA,CAAE,EAChC,GAAI,CACF,IAAMC,EACJ,MAAM,KAAKN,MAAM4C,iBAAiBC,CAAQ,EAC5C,KAAKxF,qBAAqBgD,IAAIC,EAAOwC,kBAAkB,CACzD,OAASrC,EAAc,CACrB,KAAKlD,iBAAiB8C,IAAII,CAAG,CAC/B,QAAC,CACC,KAAKnD,mBAAmB+C,IAAI,EAAK,CACnC,CACF,GAMM0C,yBACJvC,EAAyC,QAAAJ,EAAA,sBAEzC,QAAW4C,KAAcxC,EAAU,CACjC,IAAMQ,EAAuB,CAC3BiC,KAAMD,EAAWC,KACjBC,UAAWF,EAAWE,UACtBC,YAAaH,EAAWG,YACxBC,cAAeJ,EAAWI,cAC1BC,SAAU,IAEZ,MAAM,KAAKrD,MAAMe,cAAcC,CAAO,CACxC,CACA,MAAM,KAAKb,aAAY,CACzB,GAKAmD,gBAAc,CACZ,KAAKjG,qBAAqBgD,IAAI,CAAA,CAAE,EAChC,KAAK9C,iBAAiB8C,IAAI,IAAI,EAC9B,KAAK/C,mBAAmB+C,IAAI,EAAK,CACnC,CAMMkD,iBAAiB5C,EAAiB,QAAAP,EAAA,sBACtC,KAAK5C,mBAAmB6C,IAAI,EAAI,EAChC,KAAK5C,iBAAiB4C,IAAI,IAAI,EAC9B,GAAI,CACF,IAAMC,EACJ,MAAM,KAAKN,MAAMuD,iBAAiB5C,CAAS,EAC7C,KAAK7D,gBAAgBuD,IAAIC,EAAOO,OAAO,EACvC,GAAI,CACF,IAAM2C,EAAqC,MAAM,KAAKxD,MAAMY,WAAWD,CAAS,EAChF,KAAK5D,gCAAgCsD,IAAImD,EAAW1C,0BAA0B,CAChF,MAAQ,CACN,CAGF,KAAKrE,WAAWyE,OACbC,GACCA,EAAKC,IACFC,GACCA,EAAEC,MAAQX,EAAYL,EAAOO,QAAUQ,CAAC,CAC3C,CAEP,OAASZ,EAAc,CACrB,KAAKhD,iBAAiB4C,IAAII,CAAG,CAC/B,QAAC,CACC,KAAKjD,mBAAmB6C,IAAI,EAAK,CACnC,CACF,GAKMoD,YAAY9C,EAAiB,QAAAP,EAAA,sBACjC,KAAK1C,cAAc2C,IAAI,EAAI,EAC3B,KAAK1C,YAAY0C,IAAI,IAAI,EACzB,KAAKzC,iBAAiByC,IAAI,IAAI,EAC9B,GAAI,CACF,IAAMC,EACJ,MAAM,KAAKN,MAAMyD,YAAY9C,CAAS,EACxC,KAAK/C,iBAAiByC,IAAIC,EAAOoD,UAAU,EAC3C,KAAK5G,gBAAgBuD,IAAIC,EAAOO,OAAO,EACvC,GAAI,CACF,IAAM2C,EAAqC,MAAM,KAAKxD,MAAMY,WAAWD,CAAS,EAChF,KAAK5D,gCAAgCsD,IAAImD,EAAW1C,0BAA0B,CAChF,MAAQ,CACN,CAGF,KAAKrE,WAAWyE,OACbC,GACCA,EAAKC,IACFC,GACCA,EAAEC,MAAQX,EAAYL,EAAOO,QAAUQ,CAAC,CAC3C,CAEP,OAASZ,EAAc,CACrB,KAAK9C,YAAY0C,IAAII,CAAG,CAC1B,QAAC,CACC,KAAK/C,cAAc2C,IAAI,EAAK,CAC9B,CACF,GAKMsD,iBAAe,QAAAvD,EAAA,sBACnB,KAAK1C,cAAc2C,IAAI,EAAI,EAC3B,KAAK1C,YAAY0C,IAAI,IAAI,EACzB,GAAI,CACF,MAAM,KAAKL,MAAM2D,gBAAe,EAChC,MAAM,KAAKxD,aAAY,CACzB,OAASM,EAAc,CACrB,KAAK9C,YAAY0C,IAAII,CAAG,CAC1B,QAAC,CACC,KAAK/C,cAAc2C,IAAI,EAAK,CAC9B,CACF,GAKMuD,oBAAoBjD,EAAiB,QAAAP,EAAA,sBACzC,KAAKtC,qBAAqBuC,IAAI,EAAI,EAClC,KAAKtC,mBAAmBsC,IAAI,IAAI,EAChC,GAAI,CACF,IAAMC,EACJ,MAAM,KAAKN,MAAM6D,mBAAmBlD,CAAS,EAC/C,KAAK9C,eAAewC,IAAIC,EAAOwD,KAAK,CACtC,OAASrD,EAAc,CACrB,KAAK1C,mBAAmBsC,IAAII,CAAG,CACjC,QAAC,CACC,KAAK3C,qBAAqBuC,IAAI,EAAK,CACrC,CACF,GAKM0D,gCAAgCpD,EAAiB,QAAAP,EAAA,sBACrD,KAAKpC,2BAA2BqC,IAAI,EAAI,EACxC,GAAI,CACF,MAAM,KAAKL,MAAMgE,sBAAsBrD,CAAS,EAChD,MAAM,KAAKiD,oBAAoBjD,CAAS,CAC1C,QAAC,CACC,KAAK3C,2BAA2BqC,IAAI,EAAK,CAC3C,CACF,GAKM4D,mBAAmBtD,EAAiB,QAAAP,EAAA,sBACxC,OAAO,KAAKJ,MAAMiE,mBAAmBtD,CAAS,CAChD,GAKMuD,oCACJvD,EACAwD,EAAsC,QAAA/D,EAAA,sBAEtC,IAAME,EACJ,MAAM,KAAKN,MAAMoE,qBAAqBzD,EAAWwD,CAAI,EACvD,aAAM,KAAKP,oBAAoBjD,CAAS,EACjCL,CACT,GAKM+D,wCACJ1D,EACA2D,EACAH,EAAsC,QAAA/D,EAAA,sBAEtC,IAAME,EACJ,MAAM,KAAKN,MAAMuE,yBAAyB5D,EAAW2D,EAAaH,CAAI,EACxE,aAAM,KAAKP,oBAAoBjD,CAAS,EACjCL,CACT,GAKMkE,0BACJ7D,EACAwD,EAAgC,QAAA/D,EAAA,sBAEhC,IAAME,EACJ,MAAM,KAAKN,MAAMyE,gBAAgB9D,EAAWwD,CAAI,EAClD,aAAM,KAAKP,oBAAoBjD,CAAS,EACxC,MAAM,KAAK+D,iBAAiB/D,CAAS,EAC9BL,CACT,GAKMoE,iBAAiB/D,EAAiB,QAAAP,EAAA,sBACtC,KAAKjD,sBAAsBkD,IAAI,EAAI,EACnC,KAAKjD,oBAAoBiD,IAAI,IAAI,EACjC,GAAI,CACF,IAAMC,EACJ,MAAM,KAAKN,MAAM2E,iBAAiBhE,CAAS,EAC7C,KAAKzD,eAAemD,IAAIC,EAAOsE,YAAY,CAC7C,OAASnE,EAAc,CACrB,KAAKrD,oBAAoBiD,IAAII,CAAG,CAClC,QAAC,CACC,KAAKtD,sBAAsBkD,IAAI,EAAK,CACtC,CACF,GAKMwE,kBACJlE,EACAK,EAA6C,QAAAZ,EAAA,sBAE7C,MAAM,KAAKJ,MAAM6E,kBAAkBlE,EAAWK,CAAO,EACrD,MAAM,KAAK0D,iBAAiB/D,CAAS,CACvC,GAKMmE,kBACJnE,EACAoE,EACA/D,EAAyC,QAAAZ,EAAA,sBAEzC,IAAME,EACJ,MAAM,KAAKN,MAAM8E,kBAAkBnE,EAAWoE,EAAW/D,CAAO,EAClE,KAAK9D,eAAegE,OACjBC,GACCA,EAAKC,IACF4D,GACCA,EAAE1D,MAAQyD,EAAYzE,EAAO2E,YAAcD,CAAC,CAC/C,CAEP,GAKME,uBACJvE,EACAwD,EAAuC,QAAA/D,EAAA,sBAEvC,KAAKvB,gCAAgCwB,IAAI,EAAI,EAC7C,KAAKvB,8BAA8BuB,IAAI,IAAI,EAC3C,KAAKpB,qCAAqCoB,IAAI,IAAI,EAClD,KAAKnB,oCAAoCmB,IAAI,IAAI,EACjD,GAAI,CACF,IAAMC,EACJ,MAAM,KAAKN,MAAMkF,uBAAuBvE,EAAWwD,CAAI,EACzD,YAAKlF,qCAAqCoB,IAAIC,EAAO6E,iBAAmB,IAAI,EAC5E,KAAKjG,oCAAoCmB,IAAIC,EAAO8E,gBAAkB,IAAI,EACnE9E,CACT,OAASG,EAAc,CACrB,WAAK3B,8BAA8BuB,IAAII,CAAG,EACpCA,CACR,QAAC,CACC,KAAK5B,gCAAgCwB,IAAI,EAAK,CAChD,CACF,GAMMgF,iCACJ1E,EACA2E,EACAnB,EAEC,QAAA/D,EAAA,sBAED,IAAMmF,EAAgCpB,EAAKqB,2BAA2BC,KAAI,EACpEC,EACJH,GAAa,MAAQA,EAAUI,OAAS,EACpCJ,EACA,MAAMK,EAA0BC,sBAAsB1B,EAAK2B,aAAa,EACxEC,EAA4C,CAChDC,KAAM7B,EAAK6B,KACXF,cAAe3B,EAAK2B,cACpBN,0BAA2BE,EAC3BO,YAAa9B,EAAK8B,YAClBC,qBAAsB/B,EAAK+B,sBAEvB5F,EACJ,MAAM,KAAKN,MAAMmG,uBAAuBxF,EAAW2E,EAAUS,CAAQ,EACvE,aAAM,KAAKnC,oBAAoBjD,CAAS,EACjCL,CACT,GAKM8F,wBACJzF,EACAwD,EAAkC,QAAA/D,EAAA,sBAElC,KAAKrB,iCAAiCsB,IAAI,EAAI,EAC9C,KAAKrB,+BAA+BqB,IAAI,IAAI,EAC5C,GAAI,CACF,IAAMC,EACJ,MAAM,KAAKN,MAAMqG,kBAAkB1F,EAAWwD,CAAI,EACpD,aAAM,KAAKO,iBAAiB/D,CAAS,EACrC,MAAM,KAAKiD,oBAAoBjD,CAAS,EACjCL,CACT,OAASG,EAAc,CACrB,WAAKzB,+BAA+BqB,IAAII,CAAG,EACrCA,CACR,QAAC,CACC,KAAK1B,iCAAiCsB,IAAI,EAAK,CACjD,CACF,GAOMiG,gBAAgB3F,EAAiB,QAAAP,EAAA,sBACrC,KAAK5B,qBAAqB6B,IAAI,EAAI,EAClC,KAAK5B,mBAAmB4B,IAAI,IAAI,EAChC,GAAI,CACF,IAAMC,EACJ,MAAM,KAAKN,MAAMuG,eAAe5F,CAAS,EAC3C,KAAKpC,cAAc8B,IAAIC,EAAOkG,WAAW,CAC3C,OAAS/F,EAAc,CACrB,KAAKhC,mBAAmB4B,IAAII,CAAG,CACjC,QAAC,CACC,KAAKjC,qBAAqB6B,IAAI,EAAK,CACrC,CACF,GAKMoG,kBAAkB9F,EAAmB+F,EAAoB,QAAAtG,EAAA,sBAC7D,KAAKzB,iBAAiB0B,IAAI,EAAI,EAC9B,KAAKzB,kBAAkByB,IAAI,IAAI,EAC/B,KAAK3B,eAAe2B,IAAI,IAAI,EAC5B,GAAI,CACF,IAAMC,EACJ,MAAM,KAAKN,MAAMyG,kBAAkB9F,EAAW+F,CAAS,EACzD,KAAKhI,eAAe2B,IAAIC,EAAOqG,YAAY,CAC7C,OAASlG,EAAc,CACrB,KAAK7B,kBAAkByB,IAAII,CAAG,CAChC,QAAC,CACC,KAAK9B,iBAAiB0B,IAAI,EAAK,CACjC,CACF,GAQMuG,iBAAiBjG,EAAiB,QAAAP,EAAA,sBACtC,KAAKlC,sBAAsBmC,IAAI,EAAI,EACnC,KAAKlC,oBAAoBkC,IAAI,IAAI,EACjC,GAAI,CACF,IAAMC,EAAS,MAAM,KAAKN,MAAM6G,iBAAiBlG,CAAS,EAC1D,KAAK1C,eAAeoC,IAAIC,EAAOwG,OAAO,CACxC,OAASrG,EAAc,CACrB,KAAKtC,oBAAoBkC,IAAII,CAAG,CAClC,QAAC,CACC,KAAKvC,sBAAsBmC,IAAI,EAAK,CACtC,CACF,GAOM0G,gBAAgBpG,EAAmBqG,EAAe,QAAA5G,EAAA,sBACtD,KAAK/B,2BAA2BgC,IAAI,EAAI,EACxC,KAAK/B,yBAAyB+B,IAAI,IAAI,EACtC,GAAI,CACF,IAAMC,EAAS,MAAM,KAAKN,MAAMiH,sBAAsBtG,EAAWqG,CAAO,EACxE,KAAK5I,oBAAoBiC,IAAIC,CAAM,CACrC,OAASG,EAAc,CACrB,KAAKrC,oBAAoBiC,IAAI,IAAI,EACjC,KAAK/B,yBAAyB+B,IAAII,CAAG,CACvC,QAAC,CACC,KAAKpC,2BAA2BgC,IAAI,EAAK,CAC3C,CACF,GAGA6G,wBAAsB,CACpB,KAAK9I,oBAAoBiC,IAAI,IAAI,EACjC,KAAK/B,yBAAyB+B,IAAI,IAAI,CACxC,4CA1wBW7D,EAA6B,6BAA7BA,EAA6B2K,QAA7B3K,EAA6B4K,UAAAC,WADhB,MAAM,CAAA,SACnB7K,CAA6B,GAAA,4BE9CxC8K,EAAA,EAAA,OAAA,CAAA,EAGEC,EAAA,CAAA,EACFC,EAAA,gBAFEC,EAAA,QAAAC,CAAA,EACAC,EAAA,EAAAC,EAAA,IAAAF,EAAA,GAAA,GDuBJ,IAAaG,IAAwB,IAAA,CAA/B,MAAOA,CAAwB,CAG1BC,cAAgBC,EAA0BC,MAAS,EAE3CC,MACfC,EAAOC,EAA6B,EAG7BC,cAAgBC,EAAS,IAAoB,CACpD,IAAMC,EAAyB,KAAKR,cAAa,EACjD,GAAI,CAACQ,EACH,OAAO,KAET,IAAMC,EAAiBV,EAAyBW,cAAcF,CAAE,EAChE,OAAKC,EAGe,KAAKN,MAAMQ,WAAU,EACLC,KACjCC,GACC,CAAC,CAACA,EAAEC,WACJf,EAAyBW,cAAcG,EAAEC,SAAS,IAAML,CAAM,GAEpDM,MAAQ,KARb,IASX,CAAC,EAEDC,aAAA,CAMI,CAAC,KAAKb,MAAMc,qBAAoB,GAChC,CAAC,KAAKd,MAAMe,kBAAiB,GAC7B,CAAC,KAAKf,MAAMgB,gBAAe,GAEtB,KAAKhB,MAAMiB,aAAY,CAEhC,CAMQ,OAAOV,cAAcW,EAAY,CACvC,IAAIC,EAAqBD,EAAKE,KAAI,EAAGC,YAAW,EAAGC,QAAQ,MAAO,GAAG,EACrE,KAAOH,EAAWI,SAAS,GAAG,GAAKJ,EAAWK,OAAS,GACrDL,EAAaA,EAAWM,MAAM,EAAG,EAAE,EAErC,OAAON,CACT,4CAnDWvB,EAAwB,2BAAxBA,EAAwB8B,UAAA,CAAA,CAAA,qBAAA,CAAA,EAAAC,UAAA,CAAA,EAAA,SAAA,EAAAC,SAAA,EAAAC,aAAA,SAAAC,EAAAC,EAAA,CAAAD,EAAA,GAAxBE,EAAA,UAAAD,EAAA5B,cAAA,EAAkB,cAEzB,MAAM,uRC7BZ8B,EAAA,EAAAC,GAAA,EAAA,EAAA,OAAA,CAAA,aAAAC,GAAAC,EAAAL,EAAA5B,cAAA,GAAA,EAAA,GAAAiC,CAAA,6BD2BaxC,CAAwB,GAAA,oFGJ7ByC,EAAA,EAAA,OAAA,CAAA,2BAkBFA,EAAA,EAAA,sBAAA,CAAA,iBAAqBC,EAAA,gBAAAC,EAAAC,KAAA,EAAAC,aAAA,0BAKrBC,EAAA,EAAA,OAAA,CAAA,EACEC,EAAA,EAAA,YAAA,EACFC,EAAA,sCASAF,EAAA,EAAA,SAAA,EAAA,EAKQG,EAAA,QAAA,SAAAC,EAAA,CAAAC,EAAAC,CAAA,EAAA,IAAAT,EAAAU,EAAA,EAAA,OAAAC,EAASX,EAAAY,6BAAAL,CAAA,CAAoC,CAAA,CAAA,MACnDJ,EAAA,EAAA,MAAA,EAAA,EAEEL,EAAA,EAAA,OAAA,EAAA,EAAyD,EAAA,OAAA,EAAA,EACnB,EAAA,OAAA,EAAA,EACF,EAAA,OAAA,EAAA,EAEtCO,EAAA,EAAM,oBAVAQ,EAAA,UAAA,CAAAb,EAAAC,KAAA,EAAAC,aAAA,6BAkBRC,EAAA,EAAA,OAAA,EAAA,MAIEA,EAAA,EAAA,MAAA,EAAA,EAEEL,EAAA,EAAA,OAAA,EAAA,EAAqB,EAAA,OAAA,EAAA,EAEvBO,EAAA,EAAM,kBAPFQ,EAAA,UAAA,CAAAb,EAAAC,KAAA,EAAAC,eAAA,CAAAF,EAAAC,KAAA,EAAAa,WAAA,sCAgBNX,EAAA,EAAA,SAAA,EAAA,EAKQG,EAAA,QAAA,SAAAC,EAAA,CAAAC,EAAAO,CAAA,EAAA,IAAAf,EAAAU,EAAA,EAAA,OAAAC,EAASX,EAAAgB,gCAAAT,CAAA,CAAuC,CAAA,CAAA,MACtDJ,EAAA,EAAA,MAAA,EAAA,EAEEL,EAAA,EAAA,SAAA,EAAA,EAAiC,EAAA,UAAA,EAAA,EAEnCO,EAAA,EAAM,oBARAQ,EAAA,UAAA,CAAAb,EAAAC,KAAA,EAAAC,eAAA,CAAAF,EAAAC,KAAA,EAAAa,aAAA,CAAAd,EAAAC,KAAA,EAAAgB,QAAA,6BAeVd,EAAA,EAAA,MAAA,EAAA,EACEC,EAAA,CAAA,EACFC,EAAA,kBADEa,EAAA,EAAAC,EAAA,IAAAnB,EAAAC,KAAA,EAAAC,cAAA,GAAA,6BAMFC,EAAA,EAAA,MAAA,EAAA,EAAiD,EAAA,OAAA,EAAA,EAE7CC,EAAA,CAAA,EACFC,EAAA,EAAO,kBADLa,EAAA,CAAA,EAAAC,EAAA,IAAAnB,EAAAC,KAAA,EAAAmB,YAAA,WAAA,0BAUJjB,EAAA,EAAA,MAAA,EAAA,EACEkB,EAAA,CAAA,EACFhB,EAAA,GDlGJ,IAAaiB,IAA2B,IAAA,CAAlC,MAAOA,CAA2B,CAG7BrB,KACPsB,EAAMC,SAAQ,EAGPC,SAAiCF,EAAe,EAAK,EAGrDG,kBAA0CH,EAAe,EAAK,EAG9DI,gBAAwCJ,EAAe,EAAK,EAQ5DK,KAAwCL,EAA0B,SAAS,EAG3EM,SAAqCC,EAAM,EAG3CC,YACPD,EAAM,EAOCE,yBAAqDF,EAAM,EAO3DG,4BAAwDH,EAAM,EAGvEI,cAAY,CACV,KAAKL,SAASM,KAAK,KAAKlC,KAAI,EAAGmC,EAAE,CACnC,CAGAC,kBAAkBC,EAAiB,CACjCA,EAAMC,eAAc,EACpBD,EAAME,gBAAe,EACrB,KAAKT,YAAYI,KAAK,CAAEG,MAAOA,EAAOF,GAAI,KAAKnC,KAAI,EAAGmC,EAAE,CAAE,CAC5D,CAMAxB,6BAA6B0B,EAAiB,CAC5CA,EAAME,gBAAe,EACrB,KAAKR,yBAAyBG,KAAK,KAAKlC,KAAI,EAAGmC,EAAE,CACnD,CAMApB,gCAAgCsB,EAAiB,CAC/CA,EAAME,gBAAe,EACrB,KAAKP,4BAA4BE,KAAK,KAAKlC,KAAI,EAAGmC,EAAE,CACtD,4CAxEWd,EAA2B,2BAA3BA,EAA2BmB,UAAA,CAAA,CAAA,yBAAA,CAAA,EAAAC,UAAA,CAAA,EAAA,OAAA,EAAAC,OAAA,CAAA1C,KAAA,CAAA,EAAA,MAAA,EAAAwB,SAAA,CAAA,EAAA,UAAA,EAAAC,kBAAA,CAAA,EAAA,mBAAA,EAAAC,gBAAA,CAAA,EAAA,iBAAA,EAAAC,KAAA,CAAA,EAAA,MAAA,CAAA,EAAAgB,QAAA,CAAAf,SAAA,WAAAE,YAAA,cAAAC,yBAAA,2BAAAC,4BAAA,6BAAA,EAAAY,WAAA,GAAAC,SAAA,CAAAC,CAAA,EAAAC,mBAAAC,GAAAC,MAAA,GAAAC,KAAA,GAAAC,OAAA,CAAA,CAAA,EAAA,QAAA,aAAA,EAAA,CAAA,EAAA,OAAA,eAAA,SAAA,EAAA,CAAA,EAAA,WAAA,WAAA,OAAA,eAAA,iBAAA,EAAA,OAAA,EAAA,CAAA,EAAA,eAAA,EAAA,SAAA,EAAA,CAAA,EAAA,WAAA,UAAA,eAAA,SAAA,qBAAA,sBAAA,cAAA,EAAA,CAAA,EAAA,mBAAA,cAAA,WAAA,WAAA,SAAA,EAAA,CAAA,EAAA,cAAA,mBAAA,WAAA,EAAA,OAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,aAAA,SAAA,UAAA,kBAAA,iBAAA,UAAA,EAAA,CAAA,OAAA,SAAA,QAAA,gFAAA,aAAA,sCAAA,EAAA,WAAA,mBAAA,sBAAA,qBAAA,eAAA,yBAAA,UAAA,QAAA,EAAA,SAAA,EAAA,CAAA,QAAA,mEAAA,aAAA,6BAAA,EAAA,WAAA,oBAAA,cAAA,eAAA,iBAAA,QAAA,EAAA,SAAA,EAAA,CAAA,OAAA,SAAA,QAAA,sFAAA,aAAA,yCAAA,EAAA,WAAA,oBAAA,uBAAA,qBAAA,eAAA,0BAAA,UAAA,QAAA,EAAA,SAAA,EAAA,CAAA,EAAA,cAAA,mBAAA,WAAA,SAAA,MAAA,EAAA,CAAA,EAAA,OAAA,eAAA,QAAA,SAAA,MAAA,EAAA,CAAA,EAAA,OAAA,eAAA,UAAA,SAAA,SAAA,WAAA,wBAAA,cAAA,EAAA,CAAA,OAAA,SAAA,QAAA,gFAAA,aAAA,sCAAA,EAAA,WAAA,mBAAA,sBAAA,qBAAA,eAAA,yBAAA,UAAA,QAAA,EAAA,OAAA,EAAA,CAAA,UAAA,YAAA,OAAA,OAAA,SAAA,eAAA,eAAA,IAAA,iBAAA,QAAA,kBAAA,QAAA,cAAA,OAAA,EAAA,MAAA,KAAA,EAAA,CAAA,IAAA,IAAA,IAAA,IAAA,QAAA,KAAA,SAAA,KAAA,KAAA,IAAA,KAAA,GAAA,EAAA,CAAA,KAAA,KAAA,KAAA,IAAA,KAAA,KAAA,KAAA,GAAA,EAAA,CAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,GAAA,EAAA,CAAA,KAAA,IAAA,KAAA,KAAA,KAAA,KAAA,KAAA,IAAA,EAAA,CAAA,QAAA,mEAAA,aAAA,6BAAA,EAAA,WAAA,oBAAA,cAAA,eAAA,iBAAA,OAAA,EAAA,CAAA,IAAA,UAAA,EAAA,CAAA,IAAA,0DAAA,EAAA,CAAA,OAAA,SAAA,QAAA,sFAAA,aAAA,yCAAA,EAAA,WAAA,oBAAA,uBAAA,qBAAA,eAAA,0BAAA,UAAA,QAAA,EAAA,OAAA,EAAA,CAAA,KAAA,KAAA,KAAA,KAAA,IAAA,IAAA,EAAA,CAAA,SAAA,wDAAA,EAAA,CAAA,EAAA,cAAA,kBAAA,CAAA,EAAAC,SAAA,SAAAC,EAAAC,EAAA,IAAAD,EAAA,UC9BxCnD,EAAA,EAAA,MAAA,CAAA,EAMEG,EAAA,QAAA,UAAA,CAAA,OAASiD,EAAArB,aAAA,CAAc,CAAA,EAAC,cAAA,SAAA3B,EAAA,CAAA,OACTgD,EAAAlB,kBAAA9B,CAAA,CAAyB,CAAA,EAGxCJ,EAAA,EAAA,MAAA,CAAA,EAAuC,EAAA,OAAA,CAAA,EAKnCL,EAAA,EAAA,OAAA,CAAA,EAGA0D,EAAA,EAAAC,GAAA,EAAA,EAAA,OAAA,CAAA,EAGFpD,EAAA,EAGAF,EAAA,EAAA,OAAA,CAAA,EAEEC,EAAA,CAAA,EACFC,EAAA,EAGAF,EAAA,EAAA,OAAA,CAAA,uBAEEC,EAAA,CAAA,mBACFC,EAAA,EAGAmD,EAAA,GAAAE,GAAA,EAAA,EAAA,sBAAA,CAAA,EAA4B,GAAAC,GAAA,EAAA,EAAA,OAAA,CAAA,EAKH,GAAAC,GAAA,EAAA,EAAA,SAAA,CAAA,EAWC,GAAAC,GAAA,EAAA,EAAA,OAAA,EAAA,EAoBH,GAAAC,GAAA,EAAA,EAAA,SAAA,EAAA,EA+BzBzD,EAAA,EAGAmD,EAAA,GAAAO,GAAA,EAAA,EAAA,MAAA,EAAA,EAAmD,GAAAC,GAAA,EAAA,EAAA,MAAA,EAAA,EAOJ,GAAAC,GAAA,EAAA,EAAA,MAAA,EAAA,EAiBjD5D,EAAA,cAjIE6D,GAAAX,EAAA3B,KAAA,IAAA,OAAA,eAAA,gBAAA,8CAAA2B,EAAA9B,SAAA,EAAA,2EAAA,kFAAA,EAIAZ,EAAA,aAAA0C,EAAAtD,KAAA,EAAAkE,UAAA,EAQQjD,EAAA,CAAA,EAAAgD,EAAAX,EAAA3B,KAAA,IAAA,OAAA,UAAA,aAAA,EACA7B,EAAA,QAAAwD,EAAAtD,KAAA,EAAAmE,MAAA,EAEElD,EAAA,EAAAgD,EAAAX,EAAA3B,KAAA,IAAA,OAAA,UAAA,aAAA,EACA7B,EAAA,UAAAwD,EAAAtD,KAAA,EAAAoE,gBAAA,EACNnD,EAAA,EAAAoD,EAAAf,EAAAtD,KAAA,EAAAsE,UAAA,EAAA,EAAA,EAOIrD,EAAA,EAAAgD,EAAAX,EAAA3B,KAAA,IAAA,OAAA,UAAA,SAAA,EACJV,EAAA,EAAAC,EAAA,IAAAoC,EAAAtD,KAAA,EAAAuE,MAAA,GAAA,EAKItD,EAAA,EAAAnB,EAAA,QAAA0E,EAAA,EAAA,IAAAC,EAAAnB,EAAAtD,KAAA,EAAA0E,kBAAA,MAAAD,IAAAE,OAAAF,EAAA,EAAA,CAAA,EACJxD,EAAA,CAAA,EAAAC,EAAA,IAAAoC,EAAAtD,KAAA,EAAA0E,eAAAF,EAAA,GAAA,GAAAlB,EAAAtD,KAAA,EAAA0E,cAAA,EAAA,SAAA,GAAA,EAIFzD,EAAA,CAAA,EAAAoD,EAAAf,EAAAtD,KAAA,EAAAC,cAAA,GAAA,EAAA,EAKAgB,EAAA,EAAAoD,EAAAf,EAAAtD,KAAA,EAAAkE,WAAA,GAAA,EAAA,EAWAjD,EAAA,EAAAoD,EAAAf,EAAAtD,KAAA,EAAAa,YAAA,GAAA,EAAA,EAoBAI,EAAA,EAAAoD,EAAAf,EAAAtD,KAAA,EAAAgB,SAAA,GAAA,EAAA,EAiBAC,EAAA,EAAAoD,EAAAf,EAAAtD,KAAA,EAAA4E,eAAA,GAAA,EAAA,EAiBF3D,EAAA,EAAAoD,EAAAf,EAAA7B,kBAAA,GAAA6B,EAAAtD,KAAA,EAAAC,cAAA,GAAA,EAAA,EAOAgB,EAAA,EAAAoD,EAAAf,EAAA5B,gBAAA,GAAA4B,EAAAtD,KAAA,EAAAmB,YAAA,GAAA,EAAA,EAYAF,EAAA,EAAAoD,EAAAf,EAAA3B,KAAA,IAAA,OAAA,GAAA,EAAA,kBDpGUkD,EAASC,EAAqBC,EAAgBC,EAAwB,EAAAC,cAAA,CAAA,CAAA,SAKrE5D,CAA2B,GAAA,wDG5BpC6D,EAAA,EAAA,MAAA,CAAA,EAAuB,EAAA,QAAA,CAAA,EAMnBC,EAAA,gBAAA,SAAAC,EAAA,CAAAC,EAAAC,CAAA,EAAA,IAAAC,EAAAC,EAAA,EAAA,OAAAC,EAAiBF,EAAAG,cAAAC,IAAAP,CAAA,CAAyB,CAAA,CAAA,EAL5CQ,EAAA,EAM0C,oBAHxCC,EAAA,EAAAC,EAAA,cAAAP,EAAAQ,kBAAA,CAAA,EAAmC,UAAAR,EAAAG,cAAA,CAAA,sCAUrCR,EAAA,EAAA,0BAAA,CAAA,EAKEC,EAAA,WAAA,SAAAC,EAAA,CAAAC,EAAAW,CAAA,EAAA,IAAAT,EAAAC,EAAA,EAAA,OAAAC,EAAYF,EAAAU,gBAAAb,CAAA,CAAuB,CAAA,CAAA,EAAC,cAAA,SAAAA,EAAA,CAAAC,EAAAW,CAAA,EAAA,IAAAT,EAAAC,EAAA,EAAA,OAAAC,EACrBF,EAAAW,qBAAAd,CAAA,CAA4B,CAAA,CAAA,EAAC,2BAAA,SAAAA,EAAA,CAAAC,EAAAW,CAAA,EAAA,IAAAT,EAAAC,EAAA,EAAA,OAAAC,EAChBF,EAAAY,gCAAAf,CAAA,CAAuC,CAAA,CAAA,EAAC,8BAAA,SAAAA,EAAA,CAAAC,EAAAW,CAAA,EAAA,IAAAT,EAAAC,EAAA,EAAA,OAAAC,EACrCF,EAAAa,mCAAAhB,CAAA,CAA0C,CAAA,CAAA,EAR3EQ,EAAA,kCACEE,EAAA,OAAAO,CAAA,EAAY,WAAAA,EAAAC,KAAAf,EAAAgB,SAAA,CAAA,EACsB,oBAAAhB,EAAAiB,kBAAA,CAAA,EACO,kBAAAjB,EAAAkB,gBAAA,CAAA,yBAWvCC,EAAA,EAAA,qBAAA,wBAEAA,EAAA,EAAA,kBAAA,4BAJJxB,EAAA,EAAA,OAAA,CAAA,EACEyB,EAAA,EAAAC,GAAA,EAAA,CAAA,EAAyC,EAAAC,GAAA,EAAA,CAAA,EAK3CjB,EAAA,kBALEC,EAAA,EAAAiB,EAAAvB,EAAAG,cAAA,EAAAqB,KAAA,EAAAC,OAAA,EAAA,EAAA,CAAA,GDSR,IAAaC,IAAyB,IAAA,CAAhC,MAAOA,CAAyB,CAG3BC,KACPC,EAAMC,SAAQ,EAGPC,KACPF,EAAyC,CAAA,CAAE,EAGpCZ,SAAgCY,EAAc,EAAE,EAGhDX,kBAA0CW,EAAe,EAAK,EAG9DV,gBAAwCU,EAAe,EAAK,EAG5DpB,kBAAyCoB,EAAc,eAAY,EAMnEG,WAAmCH,EAAe,EAAK,EAGvDI,SAAqCC,EAAM,EAG3CC,YACPD,EAAM,EAGCE,yBAAqDF,EAAM,EAG3DG,4BAAwDH,EAAM,EAG9D9B,cAAwCkC,EAAe,EAAE,EAOzDC,eAA4DC,EACnE,IAAwC,CACtC,IAAMC,EAA6C,KAAKV,KAAI,EAC5D,GAAI,KAAKC,WAAU,EACjB,OAAOS,EAET,IAAMC,EAAgB,KAAKtC,cAAa,EACxC,OAAIsC,EAAMjB,KAAI,EAAGC,SAAW,EACnBe,EAEFA,EAAQE,OACZC,GACCC,EAAqBC,aAAaF,EAAIG,MAAOL,CAAK,CAAC,CAEzD,CAAC,EAIH/B,gBAAgBK,EAAU,CACxB,KAAKiB,SAASe,KAAKhC,CAAE,CACvB,CAGAJ,qBAAqBqC,EAA0C,CAC7D,KAAKd,YAAYa,KAAKC,CAAO,CAC/B,CAGApC,gCAAgCqC,EAAiB,CAC/C,KAAKd,yBAAyBY,KAAKE,CAAS,CAC9C,CAGApC,mCAAmCoC,EAAiB,CAClD,KAAKb,4BAA4BW,KAAKE,CAAS,CACjD,4CApFWvB,EAAyB,2BAAzBA,EAAyBwB,UAAA,CAAA,CAAA,sBAAA,CAAA,EAAAC,UAAA,CAAA,EAAA,OAAA,EAAAC,OAAA,CAAAzB,KAAA,CAAA,EAAA,MAAA,EAAAG,KAAA,CAAA,EAAA,MAAA,EAAAd,SAAA,CAAA,EAAA,UAAA,EAAAC,kBAAA,CAAA,EAAA,mBAAA,EAAAC,gBAAA,CAAA,EAAA,iBAAA,EAAAV,kBAAA,CAAA,EAAA,mBAAA,EAAAuB,WAAA,CAAA,EAAA,YAAA,CAAA,EAAAsB,QAAA,CAAArB,SAAA,WAAAE,YAAA,cAAAC,yBAAA,2BAAAC,4BAAA,6BAAA,EAAAkB,WAAA,GAAAC,SAAA,CAAAC,CAAA,EAAAC,MAAA,EAAAC,KAAA,EAAAC,OAAA,CAAA,CAAA,EAAA,OAAA,WAAA,OAAA,EAAA,CAAA,EAAA,OAAA,MAAA,EAAA,CAAA,EAAA,OAAA,WAAA,QAAA,OAAA,MAAA,EAAA,CAAA,EAAA,OAAA,WAAA,oBAAA,iBAAA,EAAA,CAAA,EAAA,cAAA,mBAAA,SAAA,OAAA,MAAA,EAAA,CAAA,OAAA,OAAA,cAAA,0BAAA,EAAA,SAAA,OAAA,OAAA,UAAA,UAAA,SAAA,qBAAA,iBAAA,mBAAA,0BAAA,qBAAA,0BAAA,EAAA,gBAAA,cAAA,SAAA,EAAA,CAAA,EAAA,WAAA,cAAA,2BAAA,8BAAA,OAAA,WAAA,oBAAA,iBAAA,CAAA,EAAAC,SAAA,SAAAC,EAAAC,EAAA,CAAAD,EAAA,ICzCtClE,EAAA,EAAA,MAAA,CAAA,EAIEyB,EAAA,EAAA2C,GAAA,EAAA,EAAA,MAAA,CAAA,EAaApE,EAAA,EAAA,MAAA,CAAA,EACEqE,EAAA,EAAAC,GAAA,EAAA,EAAA,0BAAA,EAAAC,EAAA,EAYA9C,EAAA,EAAA+C,GAAA,EAAA,EAAA,OAAA,CAAA,EASF9D,EAAA,EAAM,SAnCNC,EAAA,EAAAiB,EAAAuC,EAAA/B,WAAA,EAAA,GAAA,CAAA,EAcEzB,EAAA,CAAA,EAAA8D,EAAAN,EAAAxB,eAAA,CAAgB,EAYhBhC,EAAA,CAAA,EAAAiB,EAAAuC,EAAAxB,eAAA,EAAAb,SAAA,EAAA,EAAA,EAAA,kBDMQ4C,EAAcC,EAAWC,EAAAC,EAAAC,EAAEC,EAA2B,EAAAC,cAAA,CAAA,CAAA,SAKrDjD,CAAyB,GAAA",
6
6
  "names": ["PM_Sha256Fingerprint_Util", "normalizeNewlines", "text", "replace", "sha256HexOfNormalized", "__async", "normalized", "data", "TextEncoder", "encode", "digest", "crypto", "subtle", "bytes", "Uint8Array", "hex", "i", "length", "toString", "padStart", "ProjectManagement_DataService", "projects_$", "signal", "projectsLoading_$", "projectsError_$", "projectsLoadedOnce_$", "activeProject_$", "activeProjectComputedCcapHost_$", "activeProjectLoading_$", "activeProjectError_$", "userRequests_$", "userRequestsLoading_$", "userRequestsError_$", "discoveredProjects_$", "discoveryLoading_$", "discoveryError_$", "gitStatusLoading_$", "gitStatusError_$", "syncLoading_$", "syncError_$", "lastSyncResult_$", "fileContents_$", "fileContentLoading_$", "fileContentError_$", "testErrorReportsClearing_$", "agentReports_$", "agentReportsLoading_$", "agentReportsError_$", "activeAgentReport_$", "activeAgentReportLoading_$", "activeAgentReportError_$", "reviewsMeta_$", "reviewsMetaLoading_$", "reviewsMetaError_$", "reviewResult_$", "reviewsRunning_$", "reviewsRunError_$", "userInputWizardSuggestLoading_$", "userInputWizardSuggestError_$", "userInputWizardFinalizeLoading_$", "userInputWizardFinalizeError_$", "userInputWizardLastLlmSystemPrompt_$", "userInputWizardLastLlmUserMessage_$", "groups_$", "groupsLoading_$", "groupsError_$", "activeGroup_$", "groupFiles_$", "groupFilesLoading_$", "groupFilesError_$", "crossInstanceProjects_$", "crossInstanceLoading_$", "crossInstanceError_$", "currentCcapId_$", "cloneLoading_$", "cloneError_$", "pm_AS", "inject", "ProjectManagement_ApiService", "loadProjects", "__async", "set", "result", "listProjects", "projects", "err", "loadProject", "projectId", "getProject", "project", "computedCcapRevisionedHost", "createProject", "payload", "updateProject", "update", "list", "map", "p", "_id", "archiveProject", "loadGroups", "listGroups", "groups", "createGroup", "archiveGroup", "groupId", "selectGroup", "group", "loadGroupFiles", "getGroupFiles", "loadCrossInstanceProjects", "listAllProjectsAcrossInstances", "currentCcapId", "cloneProject", "params", "sourceProjectId", "targetParentDir", "repoName", "cloneGroup", "sourceGroupId", "discoverProjects", "scanPath", "discoveredProjects", "createDiscoveredProjects", "discovered", "name", "localPath", "description", "githubRepoUrl", "isActive", "clearDiscovery", "refreshGitStatus", "hostDetail", "syncProject", "syncResult", "syncAllProjects", "loadAllFileContents", "getAllFileContents", "files", "clearTestErrorReportsAndRefresh", "clearTestErrorReports", "getBugsPathResolve", "appendBugsFromErrorsAndRefreshFiles", "body", "appendBugsFromErrors", "appendSingleBugFromErrorAndRefreshFiles", "ccapErrorId", "appendSingleBugFromError", "createManualBugAndRefresh", "createManualBug", "loadUserRequests", "listUserRequests", "userRequests", "createUserRequest", "updateUserRequest", "requestId", "r", "userRequest", "suggestUserInputFormat", "llmSystemPrompt", "llmUserMessage", "mutateControlFileEntryAndRefresh", "fileType", "trimmedFp", "priorRawFingerprintSha256", "trim", "priorFingerprint", "length", "PM_Sha256Fingerprint_Util", "sha256HexOfNormalized", "priorRawBlock", "fullBody", "mode", "newRawBlock", "bugsFileAbsolutePath", "mutateControlFileEntry", "finalizeUserInputWizard", "finalizeUserInput", "loadReviewsMeta", "getReviewsMeta", "reviewsMeta", "runProjectReviews", "reviewIds", "reviewResult", "loadAgentReports", "listAgentReports", "reports", "loadAgentReport", "relPath", "getAgentReportContent", "clearActiveAgentReport", "factory", "\u0275fac", "providedIn", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275property", "name_r1", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "S_ProjectBadge_Component", "workspacePath", "input", "undefined", "pm_DS", "inject", "ProjectManagement_DataService", "projectName_$", "computed", "wp", "normWp", "normalizePath", "projects_$", "find", "p", "localPath", "name", "constructor", "projectsLoadedOnce_$", "projectsLoading_$", "projectsError_$", "loadProjects", "path", "normalized", "trim", "toLowerCase", "replace", "endsWith", "length", "slice", "selectors", "hostAttrs", "hostVars", "hostBindings", "rf", "ctx", "\u0275\u0275styleProp", "\u0275\u0275template", "S_ProjectBadge_Component_Conditional_0_Template", "\u0275\u0275conditional", "tmp_0_0", "\u0275\u0275element", "\u0275\u0275property", "ctx_r0", "view", "workspacePath", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275listener", "$event", "\u0275\u0275restoreView", "_r2", "\u0275\u0275nextContext", "\u0275\u0275resetView", "handleScheduleIndicatorClick", "\u0275\u0275classProp", "hasSchedule", "_r3", "handleCoordinatorIndicatorClick", "hasDraft", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "promptCount", "\u0275\u0275projection", "S_SessionInfoCard_Component", "input", "required", "isActive", "showWorkspacePath", "showPromptCount", "size", "selected", "output", "contextMenu", "scheduleIndicatorClicked", "coordinatorIndicatorClicked", "handleSelect", "emit", "id", "handleContextMenu", "event", "preventDefault", "stopPropagation", "selectors", "hostAttrs", "inputs", "outputs", "standalone", "features", "\u0275\u0275StandaloneFeature", "ngContentSelectors", "_c1", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275template", "S_SessionInfoCard_Component_Conditional_4_Template", "S_SessionInfoCard_Component_Conditional_11_Template", "S_SessionInfoCard_Component_Conditional_12_Template", "S_SessionInfoCard_Component_Conditional_13_Template", "S_SessionInfoCard_Component_Conditional_14_Template", "S_SessionInfoCard_Component_Conditional_15_Template", "S_SessionInfoCard_Component_Conditional_16_Template", "S_SessionInfoCard_Component_Conditional_17_Template", "S_SessionInfoCard_Component_Conditional_18_Template", "\u0275\u0275classMap", "isArchived", "status", "statusColorClass", "\u0275\u0275conditional", "isRunning", "label", "\u0275\u0275pipeBind1", "tmp_9_0", "lastActivityAt", "undefined", "hasCoordinator", "NgClass", "S_AbsoluteTime_Pipe", "S_TimeAgo_Pipe", "S_ProjectBadge_Component", "encapsulation", "\u0275\u0275elementStart", "\u0275\u0275listener", "$event", "\u0275\u0275restoreView", "_r1", "ctx_r1", "\u0275\u0275nextContext", "\u0275\u0275resetView", "searchQuery_$", "set", "\u0275\u0275elementEnd", "\u0275\u0275advance", "\u0275\u0275property", "searchPlaceholder", "_r3", "handleRowSelect", "handleRowContextMenu", "handleRowScheduleIndicatorClick", "handleRowCoordinatorIndicatorClick", "row_r4", "id", "activeId", "showWorkspacePath", "showPromptCount", "\u0275\u0275text", "\u0275\u0275template", "S_SessionSelect_Component_Conditional_5_Conditional_1_Template", "S_SessionSelect_Component_Conditional_5_Conditional_2_Template", "\u0275\u0275conditional", "trim", "length", "S_SessionSelect_Component", "kind", "input", "required", "rows", "hideSearch", "selected", "output", "contextMenu", "scheduleIndicatorClicked", "coordinatorIndicatorClicked", "signal", "filteredRows_$", "computed", "allRows", "query", "filter", "row", "CCAP_TextSearch_Util", "includesText", "label", "emit", "payload", "sessionId", "selectors", "hostAttrs", "inputs", "outputs", "standalone", "features", "\u0275\u0275StandaloneFeature", "decls", "vars", "consts", "template", "rf", "ctx", "S_SessionSelect_Component_Conditional_1_Template", "\u0275\u0275repeaterCreate", "S_SessionSelect_Component_For_4_Template", "_forTrack0", "S_SessionSelect_Component_Conditional_5_Template", "\u0275\u0275repeater", "CommonModule", "FormsModule", "DefaultValueAccessor", "NgControlStatus", "NgModel", "S_SessionInfoCard_Component", "encapsulation"]
7
7
  }
@@ -1,5 +1,5 @@
1
- import{a as S}from"./chunk-H62NDY3W.js";import{M as m,t as g}from"./chunk-5DVU3XRC.js";import{C as y,N as h,a as i,aa as u,b as c,k as d,y as f}from"./chunk-TBMJSIBB.js";function I(){return{instanceId:crypto.randomUUID(),label:"default",gatewayUrl:"ws://127.0.0.1:18789",authToken:void 0,isPrimary:!1,autoConnect:!1,testState:"idle"}}function p(o){let l=[],s=o.gatewayUrl??"",t=(o.message??"").toLowerCase(),e=o.failureType??"";return s.startsWith("wss://")&&(e==="ws-error"||e==="ws-close")&&l.push('A gateway wss:// (TLS) protokollt haszn\xE1l \u2014 ha self-signed certificate-et haszn\xE1l, enged\xE9lyezd az "Allow self-signed TLS" opci\xF3t.'),s.startsWith("ws://")&&!s.startsWith("wss://")&&(e==="ws-error"||e==="ws-close")&&l.push("Ha a gateway TLS-t (wss://) haszn\xE1l, cser\xE9ld az URL-t ws:// helyett wss://-re."),e==="timeout"&&l.push("A gateway nem v\xE1laszolt id\u0151ben. Ellen\u0151rizd, hogy fut-e a gateway process \xE9s el\xE9rhet\u0151-e a megadott c\xEDmen."),e==="ws-error"&&!l.length&&l.push("Nem siker\xFClt csatlakozni. Ellen\u0151rizd: 1) fut-e a gateway, 2) helyes-e az URL \xE9s port, 3) nincs-e t\u0171zfal az \xFAtban."),(t.includes("econnrefused")||t.includes("connection refused"))&&l.push("A kapcsolat visszautas\xEDtva \u2014 a gateway nem hallgat a megadott c\xEDmen/porton."),(t.includes("certificate")||t.includes("cert")||t.includes("ssl")||t.includes("tls"))&&l.push('TLS tan\xFAs\xEDtv\xE1ny hiba \u2014 self-signed certificate eset\xE9n enged\xE9lyezd az "Allow self-signed TLS" opci\xF3t.'),l.length?`
1
+ import{a as S}from"./chunk-SNMSF3UC.js";import{M as m,t as g}from"./chunk-VRI47IVY.js";import{C as y,N as h,a as i,aa as u,b as c,k as d,y as f}from"./chunk-TBMJSIBB.js";function I(){return{instanceId:crypto.randomUUID(),label:"default",gatewayUrl:"ws://127.0.0.1:18789",authToken:void 0,isPrimary:!1,autoConnect:!1,testState:"idle"}}function p(o){let l=[],s=o.gatewayUrl??"",t=(o.message??"").toLowerCase(),e=o.failureType??"";return s.startsWith("wss://")&&(e==="ws-error"||e==="ws-close")&&l.push('A gateway wss:// (TLS) protokollt haszn\xE1l \u2014 ha self-signed certificate-et haszn\xE1l, enged\xE9lyezd az "Allow self-signed TLS" opci\xF3t.'),s.startsWith("ws://")&&!s.startsWith("wss://")&&(e==="ws-error"||e==="ws-close")&&l.push("Ha a gateway TLS-t (wss://) haszn\xE1l, cser\xE9ld az URL-t ws:// helyett wss://-re."),e==="timeout"&&l.push("A gateway nem v\xE1laszolt id\u0151ben. Ellen\u0151rizd, hogy fut-e a gateway process \xE9s el\xE9rhet\u0151-e a megadott c\xEDmen."),e==="ws-error"&&!l.length&&l.push("Nem siker\xFClt csatlakozni. Ellen\u0151rizd: 1) fut-e a gateway, 2) helyes-e az URL \xE9s port, 3) nincs-e t\u0171zfal az \xFAtban."),(t.includes("econnrefused")||t.includes("connection refused"))&&l.push("A kapcsolat visszautas\xEDtva \u2014 a gateway nem hallgat a megadott c\xEDmen/porton."),(t.includes("certificate")||t.includes("cert")||t.includes("ssl")||t.includes("tls"))&&l.push('TLS tan\xFAs\xEDtv\xE1ny hiba \u2014 self-signed certificate eset\xE9n enged\xE9lyezd az "Allow self-signed TLS" opci\xF3t.'),l.length?`
2
2
 
3
3
  `+l.join(`
4
4
  `):""}var _=(()=>{class o extends m{ociData_AS=y(S);section_$=u({form:{instances:[]}});updateForm(s){this.section_$.update(t=>c(i({},t),{form:i(i({},t.form),s)}))}setSection(s){this.section_$.set(s)}getSectionId(){return g.openclawRegistry}getSection_$(){return this.section_$}doLoad(){return d(this,null,function*(){let s=new Map;for(let a of this.section_$().form.instances)s.set(a.instanceId,{testState:a.testState,testLatencyMs:a.testLatencyMs,testError:a.testError,testResultMessage:a.testResultMessage,authTokenEditMode:a.authTokenEditMode,pairState:a.pairState,pairError:a.pairError,pairMessage:a.pairMessage,pairResultMessage:a.pairResultMessage,connectionStatus:a.connectionStatus,lastConnectedAt:a.lastConnectedAt});let e=(yield this.settings_AS.getSection(g.openclawRegistry)).instances,n=Array.isArray(e)?e.map(a=>{let r=s.get(a.instanceId);return c(i({},a),{authToken:void 0,testState:r?.testState??"idle",testLatencyMs:r?.testLatencyMs,testError:r?.testError,testResultMessage:r?.testResultMessage,authTokenEditMode:r?.authTokenEditMode??!1,pairState:r?.pairState??"idle",pairError:r?.pairError,pairMessage:r?.pairMessage,pairResultMessage:r?.pairResultMessage,connectionStatus:r?.connectionStatus,lastConnectedAt:r?.lastConnectedAt})}):[];this.section_$.set({form:{instances:n}}),this.enrichWithOciStatus().catch(()=>{})})}enrichWithOciStatus(){return d(this,null,function*(){let s=yield this.ociData_AS.listInstances(),t=new Map;for(let e of s.list)t.set(e.instanceId,e);this.section_$.update(e=>c(i({},e),{form:{instances:e.form.instances.map(n=>{let a=t.get(n.instanceId);return a?c(i({},n),{connectionStatus:a.connectionStatus,lastConnectedAt:a.lastConnectedAt}):n})}}))})}buildSaveBody(){return{instances:this.section_$().form.instances.map(t=>({instanceId:t.instanceId,label:t.label,gatewayUrl:t.gatewayUrl,authToken:t.authToken,isPrimary:t.isPrimary,autoConnect:t.autoConnect,allowSelfSignedTls:t.allowSelfSignedTls}))}}savingInstanceId_$=u(null);buildSaveBodyForInstance(s){let t=this.section_$().form.instances.find(e=>e.instanceId===s);return t?{openclawRegistrySaveScope:"instance",targetInstanceId:s,instances:[{instanceId:t.instanceId,label:t.label,gatewayUrl:t.gatewayUrl,authToken:t.authToken,isPrimary:t.isPrimary,autoConnect:t.autoConnect,allowSelfSignedTls:t.allowSelfSignedTls}]}:{}}saveInstance(s){return d(this,null,function*(){this.savingInstanceId_$.set(s),this.saveError_$.set(null);try{let t=this.buildSaveBodyForInstance(s);yield this.doSave(t),yield this.load()}catch(t){this.saveError_$.set(o.getErrorMessage(t))}finally{this.savingInstanceId_$.set(null)}})}addInstance(){let s=I();this.section_$().form.instances.length||(s.isPrimary=!0),this.section_$.update(t=>c(i({},t),{form:{instances:[...t.form.instances,s]}}))}removeInstance(s){this.section_$.update(t=>{let e=t.form.instances.filter((a,r)=>r!==s);return(t.form.instances[s]?.isPrimary??!1)&&e.length>0&&(e[0]=c(i({},e[0]),{isPrimary:!0})),c(i({},t),{form:{instances:e}})})}updateInstance(s,t){this.section_$.update(e=>{let n=e.form.instances.map((a,r)=>r!==s?a:i(i({},a),t));return c(i({},e),{form:{instances:n}})})}setPrimary(s){this.section_$.update(t=>{let e=t.form.instances.map((n,a)=>c(i({},n),{isPrimary:a===s}));return c(i({},t),{form:{instances:e}})})}testConnection(s){return d(this,null,function*(){let t=this.section_$().form.instances[s];if(t){this.updateInstance(s,{testState:"testing",testLatencyMs:void 0,testError:void 0,testResultMessage:void 0});try{let e=yield this.settings_AS.testOpenclawConnection({gatewayUrl:t.gatewayUrl,authToken:t.authToken,allowSelfSignedTls:t.allowSelfSignedTls,instanceId:t.instanceId});if(e.success){let n=e.checks,a=n?" | WS: OK | v3 Handshake: OK | Sessions: OK"+(typeof n.sessionCount=="number"?` (${n.sessionCount} session)`:""):"";this.updateInstance(s,{testState:"ok",testLatencyMs:e.latencyMs,testError:void 0,testResultMessage:`Gateway el\xE9rhet\u0151 \u2014 v\xE1laszid\u0151: ${e.latencyMs}ms${a}`})}else{let n=e.error?.context?.failureType?String(e.error.context.failureType):"unknown",a=p({failureType:n,gatewayUrl:typeof e.error?.context?.gatewayUrl=="string"?e.error.context.gatewayUrl:t.gatewayUrl,message:e.error?.message});this.updateInstance(s,{testState:"error",testLatencyMs:void 0,testError:e.error??new Error("Connection failed"),testResultMessage:`Kapcsol\xF3d\xE1s sikertelen (${n}): ${e.error?.message??"ismeretlen hiba"}${a}`})}}catch(e){let n=e&&typeof e=="object"&&"error"in e?e.error:void 0,a=n?.message?String(n.message):e instanceof Error?e.message:String(e),r=p({gatewayUrl:t.gatewayUrl,message:a});this.updateInstance(s,{testState:"error",testError:n??e,testResultMessage:`Teszt hiba: ${a}${r}`})}}})}pairingInstanceId_$=u(null);pairInstance(s){return d(this,null,function*(){let t=this.section_$().form.instances[s];if(t){this.pairingInstanceId_$.set(t.instanceId),this.updateInstance(s,{pairState:"pairing",pairError:void 0,pairMessage:void 0});try{let e=yield this.settings_AS.pairOpenclawInstance({instanceId:t.instanceId});if(e.status==="paired")this.updateInstance(s,{pairState:"paired",pairingStatus:"paired",pairedAt:e.pairedAt,deviceTokenMasked:e.deviceTokenMasked,ccapDeviceId:e.ccapDeviceId,pairMessage:e.message,pairError:void 0,pairResultMessage:`Sikeresen p\xE1ros\xEDtva \u2014 device token megkapva${e.pairedAt?" ("+e.pairedAt+")":""}`});else if(e.status==="pending")this.updateInstance(s,{pairState:"pending",pairingStatus:"pending",ccapDeviceId:e.ccapDeviceId,pairingRequestId:e.pairingRequestId,pairMessage:e.message,pairError:void 0,pairResultMessage:`J\xF3v\xE1hagy\xE1sra v\xE1r a gateway-en \u2014 Device ID: ${e.ccapDeviceId??"N/A"}`});else if(e.status==="rejected")this.updateInstance(s,{pairState:"rejected",pairingStatus:"rejected",ccapDeviceId:e.ccapDeviceId,pairMessage:e.message,pairError:void 0,pairResultMessage:`A gateway elutas\xEDtotta a p\xE1ros\xEDt\xE1st: ${e.message??"ismeretlen ok"}`});else{let n=e.error?.context,a=p({failureType:typeof n?.failureType=="string"?n.failureType:void 0,gatewayUrl:typeof n?.gatewayUrl=="string"?n.gatewayUrl:t.gatewayUrl,message:e.message??e.error?.message});this.updateInstance(s,{pairState:"error",pairError:e.error??new Error(e.message??"Pairing failed"),pairMessage:e.message,pairResultMessage:`P\xE1ros\xEDt\xE1s hiba: ${e.message??e.error?.message??"ismeretlen hiba"}${a}`})}yield this.load()}catch(e){let n=e&&typeof e=="object"&&"error"in e?e.error:void 0,a=n?.message?String(n.message):e instanceof Error?e.message:String(e),r=n?.context,w=p({failureType:typeof r?.failureType=="string"?r.failureType:void 0,gatewayUrl:typeof r?.gatewayUrl=="string"?r.gatewayUrl:t.gatewayUrl,message:a});this.updateInstance(s,{pairState:"error",pairError:n??e,pairMessage:void 0,pairResultMessage:`P\xE1ros\xEDt\xE1s hiba: ${a}${w}`})}finally{this.pairingInstanceId_$.set(null)}}})}static \u0275fac=(()=>{let s;return function(e){return(s||(s=h(o)))(e||o)}})();static \u0275prov=f({token:o,factory:o.\u0275fac,providedIn:"root"})}return o})();export{_ as a};
5
- //# sourceMappingURL=chunk-TRPIAKRB.js.map
5
+ //# sourceMappingURL=chunk-UOZVXYOQ.js.map