@futdevpro/ccap 1.1.3107 → 1.1.3125

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 (185) hide show
  1. package/cli/build/_commands/update.spec.d.ts +17 -0
  2. package/cli/build/_commands/update.spec.d.ts.map +1 -0
  3. package/cli/build/_commands/update.spec.js +147 -0
  4. package/cli/build/_commands/update.spec.js.map +1 -0
  5. package/client-dist/{agent-instances.module-X7PTNXBZ.js → agent-instances.module-3N6ANN67.js} +2 -2
  6. package/client-dist/ca.module-VKQKP6JP.js +5 -0
  7. package/client-dist/{ca.module-AHEFH36G.js.map → ca.module-VKQKP6JP.js.map} +3 -3
  8. package/client-dist/{cc-usage-dashboard.component-SCGVU2CH.js → cc-usage-dashboard.component-65FF5SWE.js} +2 -2
  9. package/client-dist/{cc.module-HRE2USKF.js → cc.module-BKTAO4S7.js} +2 -2
  10. package/client-dist/{chunk-5F7AZMBN.js → chunk-34ASVWQQ.js} +2 -2
  11. package/client-dist/{chunk-Q6LBW5ZA.js → chunk-3BIY7XPG.js} +2 -2
  12. package/client-dist/{chunk-H4QUFYYO.js → chunk-3EWLYCQY.js} +2 -2
  13. package/client-dist/{chunk-3VGB3L3K.js → chunk-45RYGYWU.js} +2 -2
  14. package/client-dist/{chunk-AIFKGWGZ.js → chunk-46VCON6Y.js} +2 -2
  15. package/client-dist/{chunk-ADOCMVHI.js → chunk-4EPTK7TX.js} +2 -2
  16. package/client-dist/{chunk-725PEGTE.js → chunk-57RF5FWV.js} +2 -2
  17. package/client-dist/{chunk-4Y3YU4VV.js → chunk-6NAFJLV5.js} +2 -2
  18. package/client-dist/{chunk-7BGF556S.js → chunk-7ELFOHXT.js} +2 -2
  19. package/client-dist/{chunk-F5YM4CH2.js → chunk-7UGLDNS5.js} +2 -2
  20. package/client-dist/{chunk-PCZCJ5US.js → chunk-A7WV3WRL.js} +2 -2
  21. package/client-dist/{chunk-M744VRDZ.js → chunk-AELBVLTQ.js} +2 -2
  22. package/client-dist/{chunk-HVEG7TDX.js → chunk-ALT4GOBR.js} +2 -2
  23. package/client-dist/{chunk-IJNLP24O.js → chunk-BSZUQJTF.js} +2 -2
  24. package/client-dist/{chunk-VVP5QPE2.js → chunk-C5SDBZ5G.js} +2 -2
  25. package/client-dist/{chunk-V3MC6IHV.js → chunk-C5WLCPTP.js} +2 -2
  26. package/client-dist/{chunk-BR2OEH55.js → chunk-DBF3SSPS.js} +2 -2
  27. package/client-dist/{chunk-M7XR4RHP.js → chunk-EHNLVVAY.js} +2 -2
  28. package/client-dist/{chunk-44B4MFA2.js → chunk-ES7OKROB.js} +2 -2
  29. package/client-dist/{chunk-IJZYOGOA.js → chunk-EUAB5X46.js} +2 -2
  30. package/client-dist/{chunk-QMSWKCFN.js → chunk-FIPZN6Q5.js} +2 -2
  31. package/client-dist/{chunk-3MGMSCZJ.js → chunk-FXN33EYC.js} +2 -2
  32. package/client-dist/chunk-HTF2IFDS.js +9 -0
  33. package/client-dist/chunk-HTF2IFDS.js.map +7 -0
  34. package/client-dist/{chunk-EDPWSLEJ.js → chunk-IA2MKRM5.js} +2 -2
  35. package/client-dist/{chunk-YKD7EBRH.js → chunk-IRCYROGT.js} +2 -2
  36. package/client-dist/{chunk-ZWO7VQQ7.js → chunk-KBLPP6PQ.js} +2 -2
  37. package/client-dist/{chunk-TAHRBJO4.js → chunk-MANX3UTJ.js} +2 -2
  38. package/client-dist/{chunk-DBG24LL5.js → chunk-NAHXFBXE.js} +2 -2
  39. package/client-dist/{chunk-HRRC3NLD.js → chunk-NJPJYDH6.js} +2 -2
  40. package/client-dist/{chunk-UT4EWNR6.js → chunk-NK4RLW4D.js} +2 -2
  41. package/client-dist/{chunk-EXMVCGPU.js → chunk-OZHMTJQJ.js} +2 -2
  42. package/client-dist/{chunk-SIEB5UUT.js → chunk-PATTK77E.js} +2 -2
  43. package/client-dist/{chunk-P5R6KXHA.js → chunk-PN5J6JP2.js} +2 -2
  44. package/client-dist/{chunk-U5G7I3PM.js → chunk-Q4Z4WTJ3.js} +2 -2
  45. package/client-dist/{chunk-QUNT2WPJ.js → chunk-QXM45TNB.js} +2 -2
  46. package/client-dist/{chunk-QUNT2WPJ.js.map → chunk-QXM45TNB.js.map} +1 -1
  47. package/client-dist/{chunk-SNGOTGBU.js → chunk-R5DCGGN5.js} +2 -2
  48. package/client-dist/{chunk-VPICQREQ.js → chunk-RO7BDRAB.js} +2 -2
  49. package/client-dist/{chunk-772D5UCV.js → chunk-RVZXTBBM.js} +2 -2
  50. package/client-dist/{chunk-SNX7UMSC.js → chunk-SC33BNLI.js} +2 -2
  51. package/client-dist/{chunk-2VC36Y3F.js → chunk-TCJ6WHLQ.js} +2 -2
  52. package/client-dist/{chunk-IUYZZJPL.js → chunk-TDVYMNCA.js} +2 -2
  53. package/client-dist/{chunk-N5BAPGOD.js → chunk-TU3VH4LZ.js} +2 -2
  54. package/client-dist/{chunk-HBLLM4VT.js → chunk-TWWHZRZD.js} +2 -2
  55. package/client-dist/{chunk-I2YW2Q64.js → chunk-UCATC7Y7.js} +2 -2
  56. package/client-dist/{chunk-GNGMQVNJ.js → chunk-UOOILECA.js} +2 -2
  57. package/client-dist/{chunk-NV7A2WEG.js → chunk-V46EMM4L.js} +2 -2
  58. package/client-dist/{chunk-TMZGSFBR.js → chunk-VM6JI2LV.js} +2 -2
  59. package/client-dist/{chunk-V2FE4UOS.js → chunk-WJTUNKFF.js} +2 -2
  60. package/client-dist/{chunk-H4KPNX6Y.js → chunk-WV4WOPQF.js} +2 -2
  61. package/client-dist/{chunk-GXH7TFVW.js → chunk-WWJB3AHB.js} +2 -2
  62. package/client-dist/{chunk-ODUTF4DP.js → chunk-XEGOHOPX.js} +2 -2
  63. package/client-dist/{chunk-RQ6URMIS.js → chunk-XRPVTKIP.js} +2 -2
  64. package/client-dist/{chunk-SREAQBYG.js → chunk-YIVWQSH4.js} +2 -2
  65. package/client-dist/{chunk-276XBODW.js → chunk-YPFW4KUX.js} +7 -7
  66. package/client-dist/chunk-YPFW4KUX.js.map +7 -0
  67. package/client-dist/{chunk-6ZYILL36.js → chunk-ZGNVQEFP.js} +2 -2
  68. package/client-dist/{chunk-LJ75BUDR.js → chunk-ZLSL5N3C.js} +2 -2
  69. package/client-dist/{consultant.module-VWZJPZLC.js → consultant.module-5G73QF4O.js} +2 -2
  70. package/client-dist/{crd.module-X4AZNBU3.js → crd.module-PF5ZYSFN.js} +2 -2
  71. package/client-dist/{dashboard.module-D6GYQMRW.js → dashboard.module-QIH6EALQ.js} +2 -2
  72. package/client-dist/{do.module-NDH2JFRB.js → do.module-IZT2TG65.js} +2 -2
  73. package/client-dist/{document-library.module-U4UF7O2G.js → document-library.module-OC3PF44G.js} +2 -2
  74. package/client-dist/{embedding-eval.module-WU52AOFQ.js → embedding-eval.module-FXSI4XED.js} +2 -2
  75. package/client-dist/{embedding-registry.module-HL4BYCBG.js → embedding-registry.module-W65CI3YZ.js} +2 -2
  76. package/client-dist/{err.module-MKHC7PNL.js → err.module-34QTGFAO.js} +2 -2
  77. package/client-dist/{feedback.module-JVEP7FXN.js → feedback.module-LWOMLYP2.js} +2 -2
  78. package/client-dist/{host-runtime-mcp.module-TAQMHWZY.js → host-runtime-mcp.module-4GXDHVJV.js} +2 -2
  79. package/client-dist/index.html +1 -1
  80. package/client-dist/{live-dev-pipeline.module-PA6JFTVM.js → live-dev-pipeline.module-KB44IF3A.js} +2 -2
  81. package/client-dist/{logs.module-DDCOUURP.js → logs.module-S6JGYNTG.js} +2 -2
  82. package/client-dist/{main-F237R7CH.js → main-KV4C3EP5.js} +3 -3
  83. package/client-dist/{master-control-remote-poc.module-OHIGJKXS.js → master-control-remote-poc.module-HSWDJ7AR.js} +2 -2
  84. package/client-dist/{mobile-app.module-USJXPWGU.js → mobile-app.module-CPULBFKG.js} +2 -2
  85. package/client-dist/{model-registry.module-GN625AEU.js → model-registry.module-SCIPNUN7.js} +2 -2
  86. package/client-dist/{oc.module-T4NESJ3J.js → oc.module-7SUQHFMM.js} +3 -3
  87. package/client-dist/{oc.module-T4NESJ3J.js.map → oc.module-7SUQHFMM.js.map} +3 -3
  88. package/client-dist/{orc.module-7OMMUAVJ.js → orc.module-UOTIRJKH.js} +2 -2
  89. package/client-dist/{project-management.module-BUQ4WMDF.js → project-management.module-SXG557HP.js} +2 -2
  90. package/client-dist/project-source-routed.module-JLUP6FXQ.js +2 -0
  91. package/client-dist/{scheduler.module-426MNXRU.js → scheduler.module-EED4H4OV.js} +2 -2
  92. package/client-dist/{session.module-AOUHRRCF.js → session.module-R4NYRIWY.js} +2 -2
  93. package/client-dist/{set.module-WTQQZANN.js → set.module-ZWXJCTIC.js} +2 -2
  94. package/client-dist/{setup.module-BYCCCF4Q.js → setup.module-STH35LIH.js} +2 -2
  95. package/client-dist/{terminals.module-7X5GXSDY.js → terminals.module-SZPN4HFG.js} +2 -2
  96. package/client-dist/{voice-notes-poc.module-ZZD3NWJE.js → voice-notes-poc.module-DSCGKJMG.js} +2 -2
  97. package/client-dist/{wfs.module-VFUPP5VV.js → wfs.module-CNAZGEUO.js} +2 -2
  98. package/package.json +1 -1
  99. package/client-dist/ca.module-AHEFH36G.js +0 -5
  100. package/client-dist/chunk-276XBODW.js.map +0 -7
  101. package/client-dist/chunk-UEPFY6HU.js +0 -9
  102. package/client-dist/chunk-UEPFY6HU.js.map +0 -7
  103. package/client-dist/project-source-routed.module-HBMJJWHZ.js +0 -2
  104. /package/client-dist/{agent-instances.module-X7PTNXBZ.js.map → agent-instances.module-3N6ANN67.js.map} +0 -0
  105. /package/client-dist/{cc-usage-dashboard.component-SCGVU2CH.js.map → cc-usage-dashboard.component-65FF5SWE.js.map} +0 -0
  106. /package/client-dist/{cc.module-HRE2USKF.js.map → cc.module-BKTAO4S7.js.map} +0 -0
  107. /package/client-dist/{chunk-5F7AZMBN.js.map → chunk-34ASVWQQ.js.map} +0 -0
  108. /package/client-dist/{chunk-Q6LBW5ZA.js.map → chunk-3BIY7XPG.js.map} +0 -0
  109. /package/client-dist/{chunk-H4QUFYYO.js.map → chunk-3EWLYCQY.js.map} +0 -0
  110. /package/client-dist/{chunk-3VGB3L3K.js.map → chunk-45RYGYWU.js.map} +0 -0
  111. /package/client-dist/{chunk-AIFKGWGZ.js.map → chunk-46VCON6Y.js.map} +0 -0
  112. /package/client-dist/{chunk-ADOCMVHI.js.map → chunk-4EPTK7TX.js.map} +0 -0
  113. /package/client-dist/{chunk-725PEGTE.js.map → chunk-57RF5FWV.js.map} +0 -0
  114. /package/client-dist/{chunk-4Y3YU4VV.js.map → chunk-6NAFJLV5.js.map} +0 -0
  115. /package/client-dist/{chunk-7BGF556S.js.map → chunk-7ELFOHXT.js.map} +0 -0
  116. /package/client-dist/{chunk-F5YM4CH2.js.map → chunk-7UGLDNS5.js.map} +0 -0
  117. /package/client-dist/{chunk-PCZCJ5US.js.map → chunk-A7WV3WRL.js.map} +0 -0
  118. /package/client-dist/{chunk-M744VRDZ.js.map → chunk-AELBVLTQ.js.map} +0 -0
  119. /package/client-dist/{chunk-HVEG7TDX.js.map → chunk-ALT4GOBR.js.map} +0 -0
  120. /package/client-dist/{chunk-IJNLP24O.js.map → chunk-BSZUQJTF.js.map} +0 -0
  121. /package/client-dist/{chunk-VVP5QPE2.js.map → chunk-C5SDBZ5G.js.map} +0 -0
  122. /package/client-dist/{chunk-V3MC6IHV.js.map → chunk-C5WLCPTP.js.map} +0 -0
  123. /package/client-dist/{chunk-BR2OEH55.js.map → chunk-DBF3SSPS.js.map} +0 -0
  124. /package/client-dist/{chunk-M7XR4RHP.js.map → chunk-EHNLVVAY.js.map} +0 -0
  125. /package/client-dist/{chunk-44B4MFA2.js.map → chunk-ES7OKROB.js.map} +0 -0
  126. /package/client-dist/{chunk-IJZYOGOA.js.map → chunk-EUAB5X46.js.map} +0 -0
  127. /package/client-dist/{chunk-QMSWKCFN.js.map → chunk-FIPZN6Q5.js.map} +0 -0
  128. /package/client-dist/{chunk-3MGMSCZJ.js.map → chunk-FXN33EYC.js.map} +0 -0
  129. /package/client-dist/{chunk-EDPWSLEJ.js.map → chunk-IA2MKRM5.js.map} +0 -0
  130. /package/client-dist/{chunk-YKD7EBRH.js.map → chunk-IRCYROGT.js.map} +0 -0
  131. /package/client-dist/{chunk-ZWO7VQQ7.js.map → chunk-KBLPP6PQ.js.map} +0 -0
  132. /package/client-dist/{chunk-TAHRBJO4.js.map → chunk-MANX3UTJ.js.map} +0 -0
  133. /package/client-dist/{chunk-DBG24LL5.js.map → chunk-NAHXFBXE.js.map} +0 -0
  134. /package/client-dist/{chunk-HRRC3NLD.js.map → chunk-NJPJYDH6.js.map} +0 -0
  135. /package/client-dist/{chunk-UT4EWNR6.js.map → chunk-NK4RLW4D.js.map} +0 -0
  136. /package/client-dist/{chunk-EXMVCGPU.js.map → chunk-OZHMTJQJ.js.map} +0 -0
  137. /package/client-dist/{chunk-SIEB5UUT.js.map → chunk-PATTK77E.js.map} +0 -0
  138. /package/client-dist/{chunk-P5R6KXHA.js.map → chunk-PN5J6JP2.js.map} +0 -0
  139. /package/client-dist/{chunk-U5G7I3PM.js.map → chunk-Q4Z4WTJ3.js.map} +0 -0
  140. /package/client-dist/{chunk-SNGOTGBU.js.map → chunk-R5DCGGN5.js.map} +0 -0
  141. /package/client-dist/{chunk-VPICQREQ.js.map → chunk-RO7BDRAB.js.map} +0 -0
  142. /package/client-dist/{chunk-772D5UCV.js.map → chunk-RVZXTBBM.js.map} +0 -0
  143. /package/client-dist/{chunk-SNX7UMSC.js.map → chunk-SC33BNLI.js.map} +0 -0
  144. /package/client-dist/{chunk-2VC36Y3F.js.map → chunk-TCJ6WHLQ.js.map} +0 -0
  145. /package/client-dist/{chunk-IUYZZJPL.js.map → chunk-TDVYMNCA.js.map} +0 -0
  146. /package/client-dist/{chunk-N5BAPGOD.js.map → chunk-TU3VH4LZ.js.map} +0 -0
  147. /package/client-dist/{chunk-HBLLM4VT.js.map → chunk-TWWHZRZD.js.map} +0 -0
  148. /package/client-dist/{chunk-I2YW2Q64.js.map → chunk-UCATC7Y7.js.map} +0 -0
  149. /package/client-dist/{chunk-GNGMQVNJ.js.map → chunk-UOOILECA.js.map} +0 -0
  150. /package/client-dist/{chunk-NV7A2WEG.js.map → chunk-V46EMM4L.js.map} +0 -0
  151. /package/client-dist/{chunk-TMZGSFBR.js.map → chunk-VM6JI2LV.js.map} +0 -0
  152. /package/client-dist/{chunk-V2FE4UOS.js.map → chunk-WJTUNKFF.js.map} +0 -0
  153. /package/client-dist/{chunk-H4KPNX6Y.js.map → chunk-WV4WOPQF.js.map} +0 -0
  154. /package/client-dist/{chunk-GXH7TFVW.js.map → chunk-WWJB3AHB.js.map} +0 -0
  155. /package/client-dist/{chunk-ODUTF4DP.js.map → chunk-XEGOHOPX.js.map} +0 -0
  156. /package/client-dist/{chunk-RQ6URMIS.js.map → chunk-XRPVTKIP.js.map} +0 -0
  157. /package/client-dist/{chunk-SREAQBYG.js.map → chunk-YIVWQSH4.js.map} +0 -0
  158. /package/client-dist/{chunk-6ZYILL36.js.map → chunk-ZGNVQEFP.js.map} +0 -0
  159. /package/client-dist/{chunk-LJ75BUDR.js.map → chunk-ZLSL5N3C.js.map} +0 -0
  160. /package/client-dist/{consultant.module-VWZJPZLC.js.map → consultant.module-5G73QF4O.js.map} +0 -0
  161. /package/client-dist/{crd.module-X4AZNBU3.js.map → crd.module-PF5ZYSFN.js.map} +0 -0
  162. /package/client-dist/{dashboard.module-D6GYQMRW.js.map → dashboard.module-QIH6EALQ.js.map} +0 -0
  163. /package/client-dist/{do.module-NDH2JFRB.js.map → do.module-IZT2TG65.js.map} +0 -0
  164. /package/client-dist/{document-library.module-U4UF7O2G.js.map → document-library.module-OC3PF44G.js.map} +0 -0
  165. /package/client-dist/{embedding-eval.module-WU52AOFQ.js.map → embedding-eval.module-FXSI4XED.js.map} +0 -0
  166. /package/client-dist/{embedding-registry.module-HL4BYCBG.js.map → embedding-registry.module-W65CI3YZ.js.map} +0 -0
  167. /package/client-dist/{err.module-MKHC7PNL.js.map → err.module-34QTGFAO.js.map} +0 -0
  168. /package/client-dist/{feedback.module-JVEP7FXN.js.map → feedback.module-LWOMLYP2.js.map} +0 -0
  169. /package/client-dist/{host-runtime-mcp.module-TAQMHWZY.js.map → host-runtime-mcp.module-4GXDHVJV.js.map} +0 -0
  170. /package/client-dist/{live-dev-pipeline.module-PA6JFTVM.js.map → live-dev-pipeline.module-KB44IF3A.js.map} +0 -0
  171. /package/client-dist/{logs.module-DDCOUURP.js.map → logs.module-S6JGYNTG.js.map} +0 -0
  172. /package/client-dist/{main-F237R7CH.js.map → main-KV4C3EP5.js.map} +0 -0
  173. /package/client-dist/{master-control-remote-poc.module-OHIGJKXS.js.map → master-control-remote-poc.module-HSWDJ7AR.js.map} +0 -0
  174. /package/client-dist/{mobile-app.module-USJXPWGU.js.map → mobile-app.module-CPULBFKG.js.map} +0 -0
  175. /package/client-dist/{model-registry.module-GN625AEU.js.map → model-registry.module-SCIPNUN7.js.map} +0 -0
  176. /package/client-dist/{orc.module-7OMMUAVJ.js.map → orc.module-UOTIRJKH.js.map} +0 -0
  177. /package/client-dist/{project-management.module-BUQ4WMDF.js.map → project-management.module-SXG557HP.js.map} +0 -0
  178. /package/client-dist/{project-source-routed.module-HBMJJWHZ.js.map → project-source-routed.module-JLUP6FXQ.js.map} +0 -0
  179. /package/client-dist/{scheduler.module-426MNXRU.js.map → scheduler.module-EED4H4OV.js.map} +0 -0
  180. /package/client-dist/{session.module-AOUHRRCF.js.map → session.module-R4NYRIWY.js.map} +0 -0
  181. /package/client-dist/{set.module-WTQQZANN.js.map → set.module-ZWXJCTIC.js.map} +0 -0
  182. /package/client-dist/{setup.module-BYCCCF4Q.js.map → setup.module-STH35LIH.js.map} +0 -0
  183. /package/client-dist/{terminals.module-7X5GXSDY.js.map → terminals.module-SZPN4HFG.js.map} +0 -0
  184. /package/client-dist/{voice-notes-poc.module-ZZD3NWJE.js.map → voice-notes-poc.module-DSCGKJMG.js.map} +0 -0
  185. /package/client-dist/{wfs.module-VFUPP5VV.js.map → wfs.module-CNAZGEUO.js.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["src/app/_modules/external-sessions/_modules/cursor-acp/_collections/ca-event-chronological-sort.util.ts", "src/app/_modules/external-sessions/_modules/cursor-acp/_collections/utils/console-display/ca-mirror-stream-merge.util.ts", "src/app/_modules/external-sessions/_modules/cursor-acp/_services/cursor-acp.data-service.ts", "src/app/_modules/shared/_collections/utils/shr-unknown-value-pretty-json.util.ts", "src/app/_modules/external-sessions/_modules/cursor-acp/_collections/utils/console-display/ca-mirror-event-brief.util.ts", "src/app/_modules/external-sessions/_modules/cursor-acp/_collections/utils/console-display/ca-tool-call-mirror-parse.util.ts", "src/app/_modules/external-sessions/_modules/cursor-acp/_services/cursor-acp.api-service.ts"],
4
+ "sourcesContent": ["import { CA_EventItem_Interface } from '../_models/interfaces/ca-view.interface';\n\n/**\n * Mirror timeline / konzol — események sorrendje: `sequence` ASC, tie-break `timestamp` (azonos sequence DB hiba / régi adat).\n */\nexport class CA_EventChronologicalSort_Util {\n\n /**\n * Növekvő időrend — user prompt és assistant chunk helyes váltakozása duplikált sequence mellett is.\n */\n static compareMirrorEventsAsc(\n a: CA_EventItem_Interface,\n b: CA_EventItem_Interface,\n ): number {\n const dq: number = (a.sequence ?? 0) - (b.sequence ?? 0);\n if (dq !== 0) {\n return dq;\n }\n const ta: string = typeof a.timestamp === 'string' ? a.timestamp : '';\n const tb: string = typeof b.timestamp === 'string' ? b.timestamp : '';\n const tc: number = ta.localeCompare(tb);\n if (tc !== 0) {\n return tc;\n }\n const ea: string = typeof a.eventType === 'string' ? a.eventType : '';\n const eb: string = typeof b.eventType === 'string' ? b.eventType : '';\n return ea.localeCompare(eb);\n }\n}\n", "import {\n CA_ConsoleStreamTail_Interface,\n CA_EventItem_Interface,\n CA_MirrorStreamChunkParsed_Interface,\n CA_TimelineStreamRow_Interface,\n} from '../../../_models/interfaces/ca-view.interface';\n\n/**\n * ACP stream chunk-ok összefűzése — console buborék és timeline sor SSOT szabályok.\n */\nexport class CA_MirrorStreamMerge_Util {\n\n /**\n * Ugyanazon logikai üzenet chunk-jai: mindkét messageId kitöltve és különböző → külön stream.\n * Ha csak az egyik oldalon van id, az ACP gyakori mintája (későn érkező messageId) — még fűzünk.\n */\n private static messageIdsCompatibleForStreamMerge(\n prevMid: string | undefined,\n nextMid: string | undefined,\n ): boolean {\n const p: string = (prevMid ?? '').trim();\n const n: string = (nextMid ?? '').trim();\n if (p.length > 0 && n.length > 0) {\n return p === n;\n }\n return true;\n }\n\n /**\n * Mirror `data` (sessionId + update) → chunk parse vagy null.\n */\n static parseStreamChunkFromMirrorData(\n data: Record<string, unknown>,\n ): CA_MirrorStreamChunkParsed_Interface | null {\n const upd: unknown = data.update;\n if (upd === null || typeof upd !== 'object' || Array.isArray(upd)) {\n return null;\n }\n const rec: Record<string, unknown> = CA_MirrorStreamMerge_Util.toPlainRecord(upd);\n const kind: unknown = rec.sessionUpdate;\n let role: 'agent' | 'user' | 'thought' | null = null;\n if (kind === 'agent_message_chunk') {\n role = 'agent';\n }\n if (kind === 'user_message_chunk') {\n role = 'user';\n }\n if (kind === 'agent_thought_chunk') {\n role = 'thought';\n }\n if (role === null) {\n return null;\n }\n const content: unknown = rec.content;\n if (content === null || typeof content !== 'object' || Array.isArray(content)) {\n return null;\n }\n const crec: Record<string, unknown> = CA_MirrorStreamMerge_Util.toPlainRecord(content);\n const text: unknown = crec.text;\n if (typeof text !== 'string' || !text.length) {\n return null;\n }\n const midRaw: unknown = rec.messageId;\n const messageId: string | undefined =\n typeof midRaw === 'string' && midRaw.length > 0 ? midRaw : undefined;\n return { role: role, text: text, messageId: messageId };\n }\n\n /**\n * Console stream sor + új chunk — ugyanaz a stream: role egyezik, messageId kompatibilis,\n * sequence szigorúan növekvő (a szerver minden ACP notification-re léptet, közte lehet tool / info).\n */\n static canMergeConsoleTailWithChunk(params: {\n prev: CA_ConsoleStreamTail_Interface;\n ev: CA_EventItem_Interface;\n parsed: CA_MirrorStreamChunkParsed_Interface;\n }): boolean {\n const prev: CA_ConsoleStreamTail_Interface = params.prev;\n if (prev.streamTextRole === undefined || prev.streamTextRole !== params.parsed.role) {\n return false;\n }\n const prevMid: string | undefined = prev.streamMessageId;\n const nextMid: string | undefined = params.parsed.messageId;\n if (!CA_MirrorStreamMerge_Util.messageIdsCompatibleForStreamMerge(prevMid, nextMid)) {\n return false;\n }\n const nSeq: number = params.ev.sequence ?? 0;\n const pSeq: number = prev.streamLastSequence ?? 0;\n if (nSeq <= pSeq) {\n return false;\n }\n return true;\n }\n\n /**\n * Timeline: előző esemény + következő chunk ugyanabból a streamből.\n */\n static canMergeMirrorChunkEvents(\n prevEv: CA_EventItem_Interface,\n nextEv: CA_EventItem_Interface,\n nextParsed: CA_MirrorStreamChunkParsed_Interface,\n ): boolean {\n const prevParsed: CA_MirrorStreamChunkParsed_Interface | null =\n CA_MirrorStreamMerge_Util.parseStreamChunkFromMirrorData(prevEv.data ?? {});\n if (prevParsed === null) {\n return false;\n }\n if (prevParsed.role !== nextParsed.role) {\n return false;\n }\n const prevMid: string | undefined = prevParsed.messageId;\n const nextMid: string | undefined = nextParsed.messageId;\n if (!CA_MirrorStreamMerge_Util.messageIdsCompatibleForStreamMerge(prevMid, nextMid)) {\n return false;\n }\n const pSeq: number = prevEv.sequence ?? 0;\n const nSeq: number = nextEv.sequence ?? 0;\n if (nSeq <= pSeq) {\n return false;\n }\n return true;\n }\n\n /**\n * Növekvő sequence szerinti események → timeline sorok (chunk run összevonva).\n */\n static foldEventsToTimelineRows(\n sortedAsc: CA_EventItem_Interface[],\n ): CA_TimelineStreamRow_Interface[] {\n const rows: CA_TimelineStreamRow_Interface[] = [];\n for (const ev of sortedAsc) {\n const nextParsed: CA_MirrorStreamChunkParsed_Interface | null =\n CA_MirrorStreamMerge_Util.parseStreamChunkFromMirrorData(ev.data ?? {});\n if (nextParsed !== null) {\n const tail: CA_TimelineStreamRow_Interface | undefined =\n rows.length > 0 ? rows[rows.length - 1] : undefined;\n const tailLast: CA_EventItem_Interface | undefined =\n tail !== undefined && tail.events.length > 0 ? tail.events[tail.events.length - 1] : undefined;\n if (\n tail !== undefined\n && tailLast !== undefined\n && CA_MirrorStreamMerge_Util.canMergeMirrorChunkEvents(tailLast, ev, nextParsed)\n ) {\n const nextEvents: CA_EventItem_Interface[] = [...tail.events, ev];\n rows[rows.length - 1] = {\n rowKey: CA_MirrorStreamMerge_Util.mergedTimelineRowKey(nextEvents),\n events: nextEvents,\n };\n } else {\n rows.push({\n rowKey: `evt-${String(ev.sequence ?? 0)}`,\n events: [ev],\n });\n }\n } else {\n rows.push({\n rowKey: `evt-${String(ev.sequence ?? 0)}`,\n events: [ev],\n });\n }\n }\n return rows;\n }\n\n /**\n * Összevont chunk sor stabil track kulcsa.\n */\n static mergedTimelineRowKey(events: CA_EventItem_Interface[]): string {\n if (!events.length) {\n return 'evt-empty';\n }\n const first: number = events[0].sequence ?? 0;\n const last: number = events[events.length - 1].sequence ?? 0;\n return `merged-chunk-${String(first)}-${String(last)}`;\n }\n\n private static toPlainRecord(value: object): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(value)) {\n out[key] = Reflect.get(value, key);\n }\n return out;\n }\n}\n", "import { inject, Injectable, NgZone, OnDestroy, signal } from '@angular/core';\n\nimport { Subscription } from 'rxjs';\n\nimport { DyFM_Log, second } from '@futdevpro/fsm-dynamo';\n\nimport {\n CA_EventItem_Interface,\n CA_ListItem_Interface,\n CA_MirrorRuntime_Interface,\n} from '../_models/interfaces/ca-view.interface';\nimport { CA_MirrorBrief_Result_Interface } from '../_models/interfaces/ca-mirror-brief-result.interface';\nimport { CCAP_ErrorDisplay_Util } from '../../../../../_collections/error/error-display.util';\nimport { CA_EventChronologicalSort_Util } from '../_collections/ca-event-chronological-sort.util';\nimport { CA_MirrorEventBrief_Util } from '../_collections/utils/console-display/ca-mirror-event-brief.util';\nimport { CA_MirrorStreamMerge_Util } from '../_collections/utils/console-display/ca-mirror-stream-merge.util';\nimport { CA_ToolCallMirrorParse_Util } from '../_collections/utils/console-display/ca-tool-call-mirror-parse.util';\nimport { CA_ToolCallMirrorParseResult_Interface } from '../_models/interfaces/ca-tool-call-mirror-parse-result.interface';\nimport { CursorAcp_ApiService } from './cursor-acp.api-service';\nimport { ExS_Message_ApiService } from '../../../_services/exs-message.api-service';\nimport { CCAP_GlobalError_ControlService } from '../../../../../_services/control-services/ccap-global-error.control-service';\nimport { CCAP_Socket_ControlService } from '../../../../../_services/control-services/ccap-socket.control-service';\nimport { CCAP_ExtSessionMessage_Response } from '../../../../../_models/interfaces/shared/ccap-ext-message.interface';\nimport { CaSessionConsoleMessage_Interface } from './ca.data-service.interface';\n\n/**\n * CA session kliens SSOT — mirror lista, részlet, események, socket push.\n */\n@Injectable({ providedIn: 'root' })\nexport class CursorAcp_DataService implements OnDestroy {\n\n readonly sessions_$ = signal<CA_ListItem_Interface[]>([]);\n readonly sessionsLoading_$ = signal<boolean>(false);\n readonly sessionsLoadError_$ = signal<unknown | null>(null);\n\n readonly selectedSession_$ = signal<CA_ListItem_Interface | null>(null);\n readonly selectedSessionLoading_$ = signal<boolean>(false);\n\n readonly selectedSessionEvents_$ = signal<CA_EventItem_Interface[]>([]);\n\n /** Timeline pagination — mirror GET /events `hasMore`. */\n readonly sessionEventsHasMore_$ = signal<boolean>(false);\n\n /** Lista API `mirrorRuntime` — dashboard ACP / loadSession badge. */\n readonly mirrorRuntime_$ = signal<CA_MirrorRuntime_Interface | null>(null);\n\n readonly consoleMessages_$ = signal<CaSessionConsoleMessage_Interface[]>([]);\n\n /** Szerver-oldali assembled messages (SSOT — tool pairing, stream merge szerveren). */\n readonly assembledMessages_$ = signal<CCAP_ExtSessionMessage_Response[]>([]);\n\n /**\n * REQ-SES-CONTENT-CHUNK-LOAD-AND-ARCHIVE-001 — backward-prepend pagináció state.\n * `assembledMessagesHasMore_$`: van-e még régebbi szakasz a head felé;\n * `isLoadingOlderMessages_$`: true a backward-fetch alatt (UI top-spinner +\n * race-guard, hogy duplikált fetch ne induljon).\n */\n readonly assembledMessagesHasMore_$ = signal<boolean>(false);\n readonly isLoadingOlderMessages_$ = signal<boolean>(false);\n\n readonly lastStatusUpdate_$ = signal<{\n sessionId: string;\n status: string;\n statusMessage?: string;\n } | null>(null);\n\n readonly activeSessionId_$ = signal<string>('');\n\n /** GET session / events hiba — detail panel inline + globális error mellett. */\n readonly sessionDetailError_$ = signal<unknown | null>(null);\n\n private readonly caSession_AS: CursorAcp_ApiService = inject(CursorAcp_ApiService);\n private readonly extSessionMsg_AS: ExS_Message_ApiService =\n inject(ExS_Message_ApiService);\n private readonly globalError_CS: CCAP_GlobalError_ControlService =\n inject(CCAP_GlobalError_ControlService);\n private readonly socket_CS: CCAP_Socket_ControlService = inject(CCAP_Socket_ControlService);\n private readonly ngZone: NgZone = inject(NgZone);\n\n private eventSubscription: Subscription | null = null;\n private reconnectSubscription: Subscription | null = null;\n private lastKnownEventSequence: number = -1;\n\n private openSessionPollTimer: ReturnType<typeof setInterval> | null = null;\n\n private openSessionPollTargetId: string = '';\n\n /**\n * Optimista prompt buborék `listKey` + nyers szöveg — mirror `prompt-sent` érkezésekor egy buborék marad.\n */\n private readonly pendingOptimisticPrompts: { listKey: string; text: string }[] = [];\n\n /** Következő GET /events `sinceSequence` (exclusive) — utolsó betöltött sor `sequence`. */\n private sessionEventsNextSince: number | null = null;\n\n constructor() {\n this.eventSubscription = this.socket_CS.event$.subscribe(\n (envelope: { event: string; payload: Record<string, unknown> }): void => {\n this.handleSocketEvent(envelope);\n },\n );\n this.reconnectSubscription = this.socket_CS.connected$.subscribe(\n (isConnected: boolean): void => {\n if (isConnected) {\n const activeId: string = this.activeSessionId_$();\n if (activeId) {\n this.socket_CS.emit('ca-session:subscribe', { sessionId: activeId });\n // Assembled messages újratöltése — a disconnect alatt érkezett socket push-ok\n // (ext-session-msg:message/update) elvesztek; a REST reload pótolja őket.\n this.loadAssembledMessages({ sessionId: activeId }).catch((): void => {});\n }\n }\n },\n );\n }\n\n ngOnDestroy(): void {\n this.stopOpenSessionPolling();\n this.eventSubscription?.unsubscribe();\n this.reconnectSubscription?.unsubscribe();\n }\n\n /**\n * Mirror lista betöltése.\n */\n async loadSessions(params?: { includeArchived?: boolean }): Promise<void> {\n this.sessionsLoading_$.set(true);\n this.sessionsLoadError_$.set(null);\n try {\n const res = await this.caSession_AS.listSessions({\n includeArchived: params?.includeArchived,\n });\n const rawUnknown: unknown = res.sessions;\n const rawList: unknown[] = Array.isArray(rawUnknown) ? rawUnknown : [];\n const mapped: CA_ListItem_Interface[] = rawList.map(\n (s: unknown): CA_ListItem_Interface =>\n this.mapSessionRecord(this.toRecord(s)),\n );\n this.sessions_$.set(mapped);\n const rtUnknown: unknown = res.mirrorRuntime;\n const rtRec: Record<string, unknown> = this.toRecord(rtUnknown);\n const ic: unknown = rtRec.isAcpConnected;\n const ls: unknown = rtRec.loadSessionSupported;\n const tm: unknown = rtRec.isTerminalMode;\n const trc: unknown = rtRec.isTerminalRunnerConnected;\n if (typeof ic === 'boolean' && typeof ls === 'boolean') {\n this.mirrorRuntime_$.set({\n isAcpConnected: ic,\n loadSessionSupported: ls,\n isTerminalMode: tm === true,\n isTerminalRunnerConnected: trc === true,\n });\n } else {\n this.mirrorRuntime_$.set(null);\n }\n } catch (err: unknown) {\n this.sessionsLoadError_$.set(err);\n this.globalError_CS.showError(err, 'ca-session-list');\n } finally {\n this.sessionsLoading_$.set(false);\n }\n }\n\n /**\n * Agent session/list → mirror.\n */\n async syncFromAgent(params?: { cwd?: string }): Promise<void> {\n try {\n await this.caSession_AS.syncFromAgent({ cwd: params?.cwd });\n await this.loadSessions();\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'ca-session-sync');\n throw err;\n }\n }\n\n /**\n * Részlet + események. `false` = hiba (`sessionDetailError_$` + globális error); nem dob, hogy ne duplázzunk hydrate catch-ben.\n */\n async loadSessionDetail(params: { sessionId: string }): Promise<boolean> {\n this.sessionDetailError_$.set(null);\n this.selectedSessionLoading_$.set(true);\n try {\n const res = await this.caSession_AS.getSession(params.sessionId);\n const row: Record<string, unknown> = res.session;\n this.selectedSession_$.set(this.mapSessionRecord(row));\n this.sessionEventsNextSince = null;\n this.sessionEventsHasMore_$.set(false);\n const ev = await this.caSession_AS.getSessionEvents({\n sessionId: params.sessionId,\n limit: 200,\n });\n const mapped: CA_EventItem_Interface[] = ev.events.map(\n (e: Record<string, unknown>): CA_EventItem_Interface => ({\n sessionId: typeof e.sessionId === 'string' ? e.sessionId : params.sessionId,\n eventType: typeof e.eventType === 'string' ? e.eventType : '',\n timestamp: typeof e.timestamp === 'string' ? e.timestamp : '',\n data: this.asRecord(e.data),\n sequence: typeof e.sequence === 'number' ? e.sequence : 0,\n }),\n );\n this.selectedSessionEvents_$.set(mapped);\n this.sessionEventsHasMore_$.set(ev.hasMore === true);\n const ns: unknown = ev.nextSinceSequence;\n this.sessionEventsNextSince = typeof ns === 'number' ? ns : null;\n this.lastKnownEventSequence = Math.max(\n -1,\n ...this.selectedSessionEvents_$().map((x: CA_EventItem_Interface): number =>\n x.sequence ?? 0),\n );\n this.seedConsoleFromMirrorEvents(mapped);\n\n // Assembled messages betöltése (SSOT — fire-and-forget, nem blokkolja a detail load-ot)\n this.loadAssembledMessages({ sessionId: params.sessionId }).catch((): void => {});\n\n return true;\n } catch (err: unknown) {\n this.sessionDetailError_$.set(err);\n this.selectedSession_$.set(null);\n this.selectedSessionEvents_$.set([]);\n this.globalError_CS.showError(err, 'ca-session-detail');\n return false;\n } finally {\n this.selectedSessionLoading_$.set(false);\n }\n }\n\n /**\n * Mirror timeline következő oldal — `sinceSequence` lánc.\n */\n async loadMoreSessionEvents(params: { sessionId: string }): Promise<void> {\n const since: number | null = this.sessionEventsNextSince;\n if (since == null) {\n return;\n }\n try {\n const ev = await this.caSession_AS.getSessionEvents({\n sessionId: params.sessionId,\n sinceSequence: since,\n limit: 200,\n });\n const mapped: CA_EventItem_Interface[] = ev.events.map(\n (e: Record<string, unknown>): CA_EventItem_Interface => ({\n sessionId: typeof e.sessionId === 'string' ? e.sessionId : params.sessionId,\n eventType: typeof e.eventType === 'string' ? e.eventType : '',\n timestamp: typeof e.timestamp === 'string' ? e.timestamp : '',\n data: this.asRecord(e.data),\n sequence: typeof e.sequence === 'number' ? e.sequence : 0,\n }),\n );\n const merged: CA_EventItem_Interface[] = [\n ...this.selectedSessionEvents_$(),\n ...mapped,\n ];\n merged.sort(CA_EventChronologicalSort_Util.compareMirrorEventsAsc);\n this.selectedSessionEvents_$.set(merged);\n this.sessionEventsHasMore_$.set(ev.hasMore === true);\n const ns: unknown = ev.nextSinceSequence;\n this.sessionEventsNextSince = typeof ns === 'number' ? ns : null;\n this.lastKnownEventSequence = Math.max(\n this.lastKnownEventSequence,\n ...mapped.map((x: CA_EventItem_Interface): number => x.sequence ?? 0),\n );\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'ca-session-events-page');\n }\n }\n\n /**\n * ACP session/load → mirror hydrate (explicit gomb / tool).\n */\n async hydrateFromAgent(params: { sessionId: string; force?: boolean }): Promise<void> {\n try {\n await this.caSession_AS.hydrateSession({\n sessionId: params.sessionId,\n force: params.force,\n });\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'ca-session-hydrate');\n throw err;\n }\n const detailOk: boolean = await this.loadSessionDetail({ sessionId: params.sessionId });\n if (!detailOk) {\n const err: unknown = this.sessionDetailError_$();\n throw err instanceof Error ? err : new Error('CA session detail reload after hydrate failed');\n }\n }\n\n /**\n * Aktív session + socket subscribe.\n */\n setActiveSessionId(sessionId: string): void {\n const previousId: string = this.activeSessionId_$();\n if (previousId && previousId !== sessionId) {\n this.socket_CS.emit('ca-session:unsubscribe', { sessionId: previousId });\n }\n this.activeSessionId_$.set(sessionId);\n if (sessionId) {\n this.socket_CS.emit('ca-session:subscribe', { sessionId: sessionId });\n }\n }\n\n clearLiveOutput(): void {\n this.consoleMessages_$.set([]);\n this.lastKnownEventSequence = -1;\n this.pendingOptimisticPrompts.length = 0;\n }\n\n async createSession(params: {\n workspacePath: string;\n label?: string;\n }): Promise<string> {\n try {\n const res: { session: Record<string, unknown> } = await this.caSession_AS.createSession({\n workspacePath: params.workspacePath,\n label: params.label,\n });\n const row: Record<string, unknown> = this.toRecord(res.session);\n const newIdRaw: unknown = row.sessionId;\n const newId: string = typeof newIdRaw === 'string' ? newIdRaw : '';\n await this.loadSessions();\n return newId;\n } catch (err: unknown) {\n // HTTP hibát az error interceptor már showError + report; itt csak továbbdobjuk —\n // a CA dashboard modalban inline app-ccap-error-display (globális bubble a modal mögé kerülhet).\n throw err;\n }\n }\n\n async sendPrompt(params: { sessionId: string; content: string }): Promise<void> {\n const optimisticListKey: string = `optimistic-prompt-${globalThis.crypto.randomUUID()}`;\n this.pendingOptimisticPrompts.push({ listKey: optimisticListKey, text: params.content });\n this.pushConsoleMessage({\n listKey: optimisticListKey,\n type: 'prompt',\n text: params.content,\n });\n try {\n await this.caSession_AS.sendPrompt(params);\n } catch (err: unknown) {\n const pendingIdx: number = this.pendingOptimisticPrompts.findIndex(\n (p: { listKey: string; text: string }): boolean => p.listKey === optimisticListKey,\n );\n if (pendingIdx >= 0) {\n this.pendingOptimisticPrompts.splice(pendingIdx, 1);\n }\n this.pushConsoleMessage({\n type: 'error',\n text: CCAP_ErrorDisplay_Util.getErrorMessageForDisplay(err),\n });\n this.globalError_CS.showError(err, 'ca-session-prompt');\n throw err;\n }\n }\n\n /**\n * Futó execution leállítása (session megmarad, újra promptolható).\n */\n async stopExecution(sessionId: string): Promise<void> {\n try {\n await this.caSession_AS.stopExecution(sessionId);\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'ca-session-stop-execution');\n throw err;\n }\n }\n\n async terminateSession(sessionId: string): Promise<void> {\n try {\n await this.caSession_AS.terminateSession(sessionId);\n await this.loadSessions();\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'ca-session-terminate');\n throw err;\n }\n }\n\n async setSessionArchived(params: { sessionId: string; isArchived: boolean }): Promise<void> {\n try {\n const res: { success: boolean; session: Record<string, unknown> | null } =\n await this.caSession_AS.setSessionArchived(params);\n await this.loadSessions();\n const sel: CA_ListItem_Interface | null = this.selectedSession_$();\n if (\n sel?.sessionId === params.sessionId\n && res.session !== null\n && typeof res.session === 'object'\n ) {\n this.selectedSession_$.set(this.mapSessionRecord(this.toRecord(res.session)));\n }\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'ca-session-archive');\n throw err;\n }\n }\n\n /**\n * Nyitott session REST poll — socket kiesés ellen; detail lifecycle indítja / állítja.\n */\n startOpenSessionPolling(sessionId: string): void {\n this.stopOpenSessionPolling();\n if (!sessionId) {\n return;\n }\n this.openSessionPollTargetId = sessionId;\n const intervalMs: number = 10 * second;\n this.openSessionPollTimer = globalThis.setInterval((): void => {\n void this.runOpenSessionPollTick(sessionId);\n }, intervalMs);\n }\n\n /**\n * Poll timer leállítása (navigáció / destroy).\n */\n stopOpenSessionPolling(): void {\n if (this.openSessionPollTimer !== null) {\n globalThis.clearInterval(this.openSessionPollTimer);\n this.openSessionPollTimer = null;\n }\n this.openSessionPollTargetId = '';\n }\n\n pushConsoleMessage(params: {\n listKey?: string;\n type: CaSessionConsoleMessage_Interface['type'];\n text: string;\n timestamp?: string;\n rawData?: Record<string, unknown>;\n mirrorEventType?: string;\n briefSubtype?: string;\n useRawBubbleKind?: boolean;\n streamTextRole?: 'agent' | 'user' | 'thought';\n streamLastSequence?: number;\n streamMessageId?: string;\n streamPartData?: Record<string, unknown>[];\n toolDisplayName?: string;\n isToolCallFailedIndicator?: boolean;\n }): void {\n const message: CaSessionConsoleMessage_Interface = this.materializeConsoleLineFromPushParams({\n listKey: params.listKey,\n type: params.type,\n text: params.text,\n timestamp: params.timestamp ?? new Date().toISOString(),\n rawData: params.rawData,\n mirrorEventType: params.mirrorEventType,\n briefSubtype: params.briefSubtype,\n useRawBubbleKind: params.useRawBubbleKind,\n streamTextRole: params.streamTextRole,\n streamLastSequence: params.streamLastSequence,\n streamMessageId: params.streamMessageId,\n streamPartData: params.streamPartData,\n toolDisplayName: params.toolDisplayName,\n isToolCallFailedIndicator: params.isToolCallFailedIndicator,\n });\n const current: CaSessionConsoleMessage_Interface[] = this.consoleMessages_$();\n this.consoleMessages_$.set([...current, message]);\n }\n\n /**\n * Egy mirror esemény → konzol append (poll / inkrementális sync).\n */\n private appendConsoleMirrorEventOne(ev: CA_EventItem_Interface): void {\n if (ev.eventType === 'ca-session-update') {\n const toolParsed: CA_ToolCallMirrorParseResult_Interface | null =\n CA_ToolCallMirrorParse_Util.tryParseMirrorData(ev.data ?? {});\n if (toolParsed !== null) {\n const consumed: boolean = this.applyToolCallMirrorEventToLiveConsole({\n ev: ev,\n parsed: toolParsed,\n });\n if (consumed) {\n return;\n }\n }\n }\n\n const brief = CA_MirrorEventBrief_Util.buildFromMirrorEvent(ev);\n if (brief === null) {\n return;\n }\n if (ev.eventType === 'prompt-sent' && brief.consoleType === 'prompt') {\n this.removePendingOptimisticPromptBubbleIfTextMatchesMirror(brief.bodyText);\n }\n const alreadyHasLine: boolean = this.consoleMessages_$().some(\n (m: CaSessionConsoleMessage_Interface): boolean => m.listKey === brief.listKey,\n );\n if (alreadyHasLine) {\n return;\n }\n if (brief.isStreamingTextChunk === true) {\n const merged: boolean = this.tryMergeStreamingMirrorChunkIntoConsole({ ev: ev, brief: brief });\n if (merged) {\n return;\n }\n }\n const ts: string =\n typeof ev.timestamp === 'string' && ev.timestamp.length ? ev.timestamp : new Date().toISOString();\n this.pushConsoleMessage(this.buildConsolePushParamsFromBrief({ ev: ev, brief: brief, timestampIso: ts }));\n }\n\n /**\n * Utolsó stream-buborék szövegének bővítése — poll / mirror append.\n */\n private tryMergeStreamingMirrorChunkIntoConsole(params: {\n ev: CA_EventItem_Interface;\n brief: CA_MirrorBrief_Result_Interface;\n }): boolean {\n const current: CaSessionConsoleMessage_Interface[] = this.consoleMessages_$();\n if (current.length === 0) {\n return false;\n }\n const prev: CaSessionConsoleMessage_Interface = current[current.length - 1];\n const parsed = CA_MirrorStreamMerge_Util.parseStreamChunkFromMirrorData(params.ev.data ?? {});\n if (parsed === null) {\n return false;\n }\n if (\n !CA_MirrorStreamMerge_Util.canMergeConsoleTailWithChunk({\n prev: prev,\n ev: params.ev,\n parsed: parsed,\n })\n ) {\n return false;\n }\n const parts: Record<string, unknown>[] =\n prev.streamPartData !== undefined ? [...prev.streamPartData] : [];\n parts.push(params.ev.data ?? {});\n const nextMsgId: string | undefined = params.brief.streamMessageId;\n const mergedMsgId: string | undefined =\n nextMsgId !== undefined && nextMsgId.trim().length > 0\n ? nextMsgId.trim()\n : prev.streamMessageId;\n const updated: CaSessionConsoleMessage_Interface = {\n ...prev,\n text: prev.text + params.brief.bodyText,\n streamLastSequence: params.ev.sequence ?? prev.streamLastSequence,\n streamMessageId: mergedMsgId,\n streamPartData: parts,\n rawData: {\n streamMerged: true,\n partCount: parts.length,\n lastChunkSequence: params.ev.sequence,\n chunkSnapshots: parts,\n },\n };\n const next: CaSessionConsoleMessage_Interface[] = [...current];\n next[next.length - 1] = updated;\n this.consoleMessages_$.set(next);\n return true;\n }\n\n /**\n * Mirror brief → `pushConsoleMessage` paraméterek + stream meta.\n */\n private buildConsolePushParamsFromBrief(params: {\n ev: CA_EventItem_Interface;\n brief: CA_MirrorBrief_Result_Interface;\n timestampIso: string;\n }): {\n listKey: string;\n type: CaSessionConsoleMessage_Interface['type'];\n text: string;\n timestamp: string;\n rawData?: Record<string, unknown>;\n mirrorEventType?: string;\n briefSubtype?: string;\n useRawBubbleKind?: boolean;\n streamTextRole?: 'agent' | 'user' | 'thought';\n streamLastSequence?: number;\n streamMessageId?: string;\n streamPartData?: Record<string, unknown>[];\n } {\n const b: CA_MirrorBrief_Result_Interface = params.brief;\n if (b.isStreamingTextChunk === true) {\n return {\n listKey: b.listKey,\n type: b.consoleType,\n text: b.bodyText,\n timestamp: params.timestampIso,\n rawData: b.rawData,\n mirrorEventType: b.mirrorEventType,\n briefSubtype: b.briefSubtype,\n useRawBubbleKind: b.useRawBubbleKind,\n streamTextRole: b.streamTextRole,\n streamLastSequence: params.ev.sequence,\n streamMessageId: b.streamMessageId,\n streamPartData: [params.ev.data ?? {}],\n };\n }\n return {\n listKey: b.listKey,\n type: b.consoleType,\n text: b.bodyText,\n timestamp: params.timestampIso,\n rawData: b.rawData,\n mirrorEventType: b.mirrorEventType,\n briefSubtype: b.briefSubtype,\n useRawBubbleKind: b.useRawBubbleKind,\n };\n }\n\n /**\n * Mirror eseménylista (növekvő sequence) → összehajtott console sorok (stream chunk merge).\n */\n private buildFoldedConsoleMessagesFromMirrorEvents(\n sortedAsc: CA_EventItem_Interface[],\n ): CaSessionConsoleMessage_Interface[] {\n const out: CaSessionConsoleMessage_Interface[] = [];\n for (const ev of sortedAsc) {\n const foldedTool: boolean = this.tryFoldToolCallMirrorEventIntoOut(out, ev);\n if (foldedTool) {\n continue;\n }\n const brief: CA_MirrorBrief_Result_Interface | null =\n CA_MirrorEventBrief_Util.buildFromMirrorEvent(ev);\n if (brief === null) {\n continue;\n }\n const ts: string =\n typeof ev.timestamp === 'string' && ev.timestamp.length ? ev.timestamp : new Date().toISOString();\n if (brief.isStreamingTextChunk === true) {\n const parsed = CA_MirrorStreamMerge_Util.parseStreamChunkFromMirrorData(ev.data ?? {});\n if (parsed === null) {\n continue;\n }\n const last: CaSessionConsoleMessage_Interface | undefined =\n out.length > 0 ? out[out.length - 1] : undefined;\n if (\n last !== undefined\n && CA_MirrorStreamMerge_Util.canMergeConsoleTailWithChunk({\n prev: last,\n ev: ev,\n parsed: parsed,\n })\n ) {\n const parts: Record<string, unknown>[] =\n last.streamPartData !== undefined ? [...last.streamPartData] : [];\n parts.push(ev.data ?? {});\n const nextMsgId: string | undefined = brief.streamMessageId;\n const mergedMsgId: string | undefined =\n nextMsgId !== undefined && nextMsgId.trim().length > 0\n ? nextMsgId.trim()\n : last.streamMessageId;\n out[out.length - 1] = {\n ...last,\n text: last.text + brief.bodyText,\n streamLastSequence: ev.sequence ?? last.streamLastSequence,\n streamMessageId: mergedMsgId,\n streamPartData: parts,\n rawData: {\n streamMerged: true,\n partCount: parts.length,\n lastChunkSequence: ev.sequence,\n chunkSnapshots: parts,\n },\n };\n } else {\n out.push(\n this.materializeConsoleLineFromPushParams(\n this.buildConsolePushParamsFromBrief({ ev: ev, brief: brief, timestampIso: ts }),\n ),\n );\n }\n } else {\n out.push(\n this.materializeConsoleLineFromPushParams(\n this.buildConsolePushParamsFromBrief({ ev: ev, brief: brief, timestampIso: ts }),\n ),\n );\n }\n }\n return out;\n }\n\n /**\n * `pushConsoleMessage` paraméterek → stabil `CaSessionConsoleMessage_Interface` (listKey fallback).\n */\n private materializeConsoleLineFromPushParams(params: {\n listKey?: string;\n type: CaSessionConsoleMessage_Interface['type'];\n text: string;\n timestamp: string;\n rawData?: Record<string, unknown>;\n mirrorEventType?: string;\n briefSubtype?: string;\n useRawBubbleKind?: boolean;\n streamTextRole?: 'agent' | 'user' | 'thought';\n streamLastSequence?: number;\n streamMessageId?: string;\n streamPartData?: Record<string, unknown>[];\n toolDisplayName?: string;\n isToolCallFailedIndicator?: boolean;\n }): CaSessionConsoleMessage_Interface {\n return {\n listKey: params.listKey ?? globalThis.crypto.randomUUID(),\n type: params.type,\n text: params.text,\n timestamp: params.timestamp,\n rawData: params.rawData,\n mirrorEventType: params.mirrorEventType,\n briefSubtype: params.briefSubtype,\n useRawBubbleKind: params.useRawBubbleKind,\n streamTextRole: params.streamTextRole,\n streamLastSequence: params.streamLastSequence,\n streamMessageId: params.streamMessageId,\n streamPartData: params.streamPartData,\n toolDisplayName: params.toolDisplayName,\n isToolCallFailedIndicator: params.isToolCallFailedIndicator,\n };\n }\n\n /**\n * ACP tool_call / tool_call_update → élő `consoleMessages_$` (dedup, progress sor replace, error patch).\n * @returns true ha nem fut le utána a generic mirror brief ugyanerre az eseményre.\n */\n private applyToolCallMirrorEventToLiveConsole(params: {\n ev: CA_EventItem_Interface;\n parsed: CA_ToolCallMirrorParseResult_Interface;\n }): boolean {\n const p: CA_ToolCallMirrorParseResult_Interface = params.parsed;\n const id: string = p.toolCallId;\n const ts: string =\n typeof params.ev.timestamp === 'string' && params.ev.timestamp.length\n ? params.ev.timestamp\n : new Date().toISOString();\n const dataPayload: Record<string, unknown> = params.ev.data ?? {};\n\n if (p.sessionUpdate === 'tool_call') {\n const startKey: string = CA_ToolCallMirrorParse_Util.listKeyStart(id);\n const exists: boolean = this.consoleMessages_$().some(\n (m: CaSessionConsoleMessage_Interface): boolean => m.listKey === startKey,\n );\n if (exists) {\n return true;\n }\n const display: string = CursorAcp_DataService.toolCallDisplayName(p);\n const bodyText: string = CursorAcp_DataService.buildToolCallBodyText({\n displayName: display,\n parsed: p,\n });\n this.pushConsoleMessage({\n listKey: startKey,\n type: 'tool',\n text: bodyText,\n timestamp: ts,\n rawData: dataPayload,\n mirrorEventType: 'ca-session-update',\n briefSubtype: 'tool_call',\n toolDisplayName: display,\n });\n return true;\n }\n\n if (p.sessionUpdate === 'tool_call_update' && p.status === 'in_progress') {\n // Ha az update rawInput-ot hoz, patch-eljük a start bubble bodyText-jét.\n if (p.rawInput !== undefined) {\n this.patchLiveToolCallStartInput({ toolCallId: id, parsed: p });\n }\n const progressKey: string = CA_ToolCallMirrorParse_Util.listKeyProgress(id);\n const line: string = 'in_progress';\n const current: CaSessionConsoleMessage_Interface[] = this.consoleMessages_$();\n const idx: number = current.findIndex(\n (m: CaSessionConsoleMessage_Interface): boolean => m.listKey === progressKey,\n );\n const nextLine: CaSessionConsoleMessage_Interface = this.materializeConsoleLineFromPushParams({\n listKey: progressKey,\n type: 'status-update',\n text: line,\n timestamp: ts,\n rawData: dataPayload,\n mirrorEventType: 'ca-session-update',\n briefSubtype: 'tool_call_update',\n });\n if (idx >= 0) {\n const next: CaSessionConsoleMessage_Interface[] = [...current];\n next[idx] = nextLine;\n this.consoleMessages_$.set(next);\n } else {\n this.consoleMessages_$.set([...current, nextLine]);\n }\n return true;\n }\n\n if (p.sessionUpdate === 'tool_call_update' && p.status === 'completed') {\n const hasErr: boolean = CA_ToolCallMirrorParse_Util.hasRawOutputError(p.rawOutput);\n if (hasErr) {\n const errKey: string = CA_ToolCallMirrorParse_Util.listKeyError(id);\n const dupErr: boolean = this.consoleMessages_$().some(\n (m: CaSessionConsoleMessage_Interface): boolean => m.listKey === errKey,\n );\n if (!dupErr) {\n const errText: string = CA_ToolCallMirrorParse_Util.summarizeRawOutputError(\n p.rawOutput,\n );\n this.pushConsoleMessage({\n listKey: errKey,\n type: 'error',\n text: errText,\n timestamp: ts,\n rawData: dataPayload,\n mirrorEventType: 'ca-session-update',\n briefSubtype: 'tool_call_update',\n });\n this.patchLiveConsoleToolCallStartFailed({ toolCallId: id });\n }\n return true;\n }\n const resKey: string = CA_ToolCallMirrorParse_Util.listKeyResult(id);\n const dupRes: boolean = this.consoleMessages_$().some(\n (m: CaSessionConsoleMessage_Interface): boolean => m.listKey === resKey,\n );\n if (!dupRes) {\n const summary: string = CA_ToolCallMirrorParse_Util.summarizeRawOutputSuccess(\n p.rawOutput,\n );\n this.pushConsoleMessage({\n listKey: resKey,\n type: 'tool-result',\n text: summary,\n timestamp: ts,\n rawData: dataPayload,\n mirrorEventType: 'ca-session-update',\n briefSubtype: 'tool_call_update',\n });\n }\n return true;\n }\n\n return false;\n }\n\n /**\n * Historikus mirror lista fold — tool lifecycle sorok beillesztése / frissítése az `out` tömbbe.\n */\n private tryFoldToolCallMirrorEventIntoOut(\n out: CaSessionConsoleMessage_Interface[],\n ev: CA_EventItem_Interface,\n ): boolean {\n if (ev.eventType !== 'ca-session-update') {\n return false;\n }\n const p: CA_ToolCallMirrorParseResult_Interface | null =\n CA_ToolCallMirrorParse_Util.tryParseMirrorData(ev.data ?? {});\n if (p === null) {\n return false;\n }\n const ts: string =\n typeof ev.timestamp === 'string' && ev.timestamp.length ? ev.timestamp : new Date().toISOString();\n const dataPayload: Record<string, unknown> = ev.data ?? {};\n\n if (p.sessionUpdate === 'tool_call') {\n const startKey: string = CA_ToolCallMirrorParse_Util.listKeyStart(p.toolCallId);\n const exists: boolean = out.some(\n (m: CaSessionConsoleMessage_Interface): boolean => m.listKey === startKey,\n );\n if (!exists) {\n const display: string = CursorAcp_DataService.toolCallDisplayName(p);\n const bodyText: string = CursorAcp_DataService.buildToolCallBodyText({\n displayName: display,\n parsed: p,\n });\n out.push(\n this.materializeConsoleLineFromPushParams({\n listKey: startKey,\n type: 'tool',\n text: bodyText,\n timestamp: ts,\n rawData: dataPayload,\n mirrorEventType: 'ca-session-update',\n briefSubtype: 'tool_call',\n toolDisplayName: display,\n }),\n );\n }\n return true;\n }\n\n if (p.sessionUpdate === 'tool_call_update' && p.status === 'in_progress') {\n // Ha rawInput jön az update-ben, patch-eljük a start buborék bodyText-jét.\n if (p.rawInput !== undefined) {\n CursorAcp_DataService.patchOutArrayToolCallStartInput(out, p);\n }\n const progressKey: string = CA_ToolCallMirrorParse_Util.listKeyProgress(p.toolCallId);\n const nextLine: CaSessionConsoleMessage_Interface = this.materializeConsoleLineFromPushParams({\n listKey: progressKey,\n type: 'status-update',\n text: 'in_progress',\n timestamp: ts,\n rawData: dataPayload,\n mirrorEventType: 'ca-session-update',\n briefSubtype: 'tool_call_update',\n });\n const idx: number = out.findIndex(\n (m: CaSessionConsoleMessage_Interface): boolean => m.listKey === progressKey,\n );\n if (idx >= 0) {\n out[idx] = nextLine;\n } else {\n out.push(nextLine);\n }\n return true;\n }\n\n if (p.sessionUpdate === 'tool_call_update' && p.status === 'completed') {\n const hasErr: boolean = CA_ToolCallMirrorParse_Util.hasRawOutputError(p.rawOutput);\n if (hasErr) {\n const errKey: string = CA_ToolCallMirrorParse_Util.listKeyError(p.toolCallId);\n const dupErr: boolean = out.some(\n (m: CaSessionConsoleMessage_Interface): boolean => m.listKey === errKey,\n );\n if (!dupErr) {\n const errText: string = CA_ToolCallMirrorParse_Util.summarizeRawOutputError(\n p.rawOutput,\n );\n out.push(\n this.materializeConsoleLineFromPushParams({\n listKey: errKey,\n type: 'error',\n text: errText,\n timestamp: ts,\n rawData: dataPayload,\n mirrorEventType: 'ca-session-update',\n briefSubtype: 'tool_call_update',\n }),\n );\n CursorAcp_DataService.patchOutArrayToolCallStartFailed(out, p.toolCallId);\n }\n return true;\n }\n const resKey: string = CA_ToolCallMirrorParse_Util.listKeyResult(p.toolCallId);\n const dupRes: boolean = out.some(\n (m: CaSessionConsoleMessage_Interface): boolean => m.listKey === resKey,\n );\n if (!dupRes) {\n const summary: string = CA_ToolCallMirrorParse_Util.summarizeRawOutputSuccess(\n p.rawOutput,\n );\n out.push(\n this.materializeConsoleLineFromPushParams({\n listKey: resKey,\n type: 'tool-result',\n text: summary,\n timestamp: ts,\n rawData: dataPayload,\n mirrorEventType: 'ca-session-update',\n briefSubtype: 'tool_call_update',\n }),\n );\n }\n return true;\n }\n\n return false;\n }\n\n /**\n * In_progress update rawInput-ot hozott — frissítjük a start buborék bodyText-jét.\n * Ha a start bubble-nek eddig nem volt input, most megkapja.\n */\n private patchLiveToolCallStartInput(params: {\n toolCallId: string;\n parsed: CA_ToolCallMirrorParseResult_Interface;\n }): void {\n const startKey: string = CA_ToolCallMirrorParse_Util.listKeyStart(params.toolCallId);\n const cur: CaSessionConsoleMessage_Interface[] = this.consoleMessages_$();\n const idx: number = cur.findIndex(\n (m: CaSessionConsoleMessage_Interface): boolean => m.listKey === startKey,\n );\n if (idx < 0) {\n return;\n }\n const display: string = cur[idx].toolDisplayName ?? 'Tool call';\n const bodyText: string = CursorAcp_DataService.buildToolCallBodyText({\n displayName: display,\n parsed: params.parsed,\n });\n const next: CaSessionConsoleMessage_Interface[] = [...cur];\n next[idx] = {\n ...next[idx],\n text: bodyText,\n };\n this.consoleMessages_$.set(next);\n }\n\n /** Completed error után a megfelelő start sor `isToolCallFailedIndicator` beállítása. */\n private patchLiveConsoleToolCallStartFailed(params: { toolCallId: string }): void {\n const startKey: string = CA_ToolCallMirrorParse_Util.listKeyStart(params.toolCallId);\n const cur: CaSessionConsoleMessage_Interface[] = this.consoleMessages_$();\n const idx: number = cur.findIndex(\n (m: CaSessionConsoleMessage_Interface): boolean => m.listKey === startKey,\n );\n if (idx < 0) {\n return;\n }\n const next: CaSessionConsoleMessage_Interface[] = [...cur];\n next[idx] = {\n ...next[idx],\n isToolCallFailedIndicator: true,\n };\n this.consoleMessages_$.set(next);\n }\n\n /** Fold tömbben start sor failed flag — replay error path. */\n private static patchOutArrayToolCallStartFailed(\n out: CaSessionConsoleMessage_Interface[],\n toolCallId: string,\n ): void {\n const startKey: string = CA_ToolCallMirrorParse_Util.listKeyStart(toolCallId);\n const idx: number = out.findIndex(\n (m: CaSessionConsoleMessage_Interface): boolean => m.listKey === startKey,\n );\n if (idx < 0) {\n return;\n }\n out[idx] = {\n ...out[idx],\n isToolCallFailedIndicator: true,\n };\n }\n\n /** Fold tömbben start sor bodyText frissítése — in_progress rawInput patch. */\n private static patchOutArrayToolCallStartInput(\n out: CaSessionConsoleMessage_Interface[],\n parsed: CA_ToolCallMirrorParseResult_Interface,\n ): void {\n const startKey: string = CA_ToolCallMirrorParse_Util.listKeyStart(parsed.toolCallId);\n const idx: number = out.findIndex(\n (m: CaSessionConsoleMessage_Interface): boolean => m.listKey === startKey,\n );\n if (idx < 0) {\n return;\n }\n const display: string = out[idx].toolDisplayName ?? 'Tool call';\n const bodyText: string = CursorAcp_DataService.buildToolCallBodyText({\n displayName: display,\n parsed: parsed,\n });\n out[idx] = {\n ...out[idx],\n text: bodyText,\n };\n }\n\n /** Tool start buborék cím — `title`, majd `toolKind`, fallback. */\n private static toolCallDisplayName(p: CA_ToolCallMirrorParseResult_Interface): string {\n if (p.title !== undefined && p.title.length) {\n return p.title;\n }\n if (p.toolKind !== undefined && p.toolKind.length) {\n return p.toolKind;\n }\n return 'Tool call';\n }\n\n /**\n * Tool start buborék bodyText — display name első sor + rawInput + locations.\n * A bubble component `toolInputFormatted_$()` a 2+ sorból olvassa az inputot.\n */\n private static buildToolCallBodyText(params: {\n displayName: string;\n parsed: CA_ToolCallMirrorParseResult_Interface;\n }): string {\n const lines: string[] = [params.displayName];\n const inputStr: string = CA_ToolCallMirrorParse_Util.formatRawInput(params.parsed.rawInput);\n if (inputStr.length) {\n lines.push(inputStr);\n }\n const locStr: string = CA_ToolCallMirrorParse_Util.formatLocations(params.parsed.locations);\n if (locStr.length) {\n lines.push(`[locations]\\n${locStr}`);\n }\n return lines.join('\\n');\n }\n\n /**\n * REST poll tick — selected row + új események (sequence dedup).\n */\n private async runOpenSessionPollTick(sessionId: string): Promise<void> {\n if (\n sessionId !== this.activeSessionId_$()\n || sessionId !== this.openSessionPollTargetId\n ) {\n return;\n }\n try {\n const detail: { session: Record<string, unknown> } = await this.caSession_AS.getSession(sessionId);\n this.ngZone.run((): void => {\n if (sessionId !== this.activeSessionId_$()) {\n return;\n }\n this.selectedSession_$.set(this.mapSessionRecord(this.toRecord(detail.session)));\n });\n\n const prevMax: number = this.lastKnownEventSequence;\n const ev = await this.caSession_AS.getSessionEvents({\n sessionId: sessionId,\n sinceSequence: prevMax >= 0 ? prevMax : undefined,\n limit: 200,\n });\n const mapped: CA_EventItem_Interface[] = ev.events.map(\n (e: Record<string, unknown>): CA_EventItem_Interface => ({\n sessionId: typeof e.sessionId === 'string' ? e.sessionId : sessionId,\n eventType: typeof e.eventType === 'string' ? e.eventType : '',\n timestamp: typeof e.timestamp === 'string' ? e.timestamp : '',\n data: this.asRecord(e.data),\n sequence: typeof e.sequence === 'number' ? e.sequence : 0,\n }),\n );\n if (!mapped.length) {\n return;\n }\n this.ngZone.run((): void => {\n if (sessionId !== this.activeSessionId_$()) {\n return;\n }\n const bySeq: Map<number, CA_EventItem_Interface> = new Map();\n for (const item of this.selectedSessionEvents_$()) {\n bySeq.set(item.sequence ?? 0, item);\n }\n for (const item of mapped) {\n bySeq.set(item.sequence ?? 0, item);\n }\n const merged: CA_EventItem_Interface[] = [...bySeq.values()].sort(\n CA_EventChronologicalSort_Util.compareMirrorEventsAsc,\n );\n this.selectedSessionEvents_$.set(merged);\n for (const item of mapped) {\n if ((item.sequence ?? 0) > prevMax) {\n this.appendConsoleMirrorEventOne(item);\n }\n }\n this.lastKnownEventSequence = Math.max(\n prevMax,\n ...mapped.map((x: CA_EventItem_Interface): number => x.sequence ?? 0),\n );\n });\n } catch {\n // Poll hiba — nem spam-elünk globális errorral tick-enként.\n }\n }\n\n private handleSocketEvent(envelope: { event: string; payload: Record<string, unknown> }): void {\n const eventName: string = envelope.event;\n const payload: Record<string, unknown> = envelope.payload;\n try {\n this.ngZone.run((): void => {\n switch (eventName) {\n case 'ca-session:status':\n this.handleStatusUpdate(payload);\n break;\n case 'ca-session:output':\n this.handleOutputChunk(payload);\n break;\n case 'ca-session:event':\n this.handleSessionEvent(payload);\n break;\n case 'ca-session:list-update':\n this.loadSessions().catch((): void => {});\n break;\n case 'ext-session-msg:message':\n this.handleAssembledMessage(payload);\n break;\n case 'ext-session-msg:update':\n this.handleAssembledMessageUpdate(payload);\n break;\n default:\n break;\n }\n });\n } catch (err: unknown) {\n DyFM_Log.error(`CCAP_CaSession_DS | socket error | ${eventName}`, err);\n }\n }\n\n private handleStatusUpdate(payload: Record<string, unknown>): void {\n const sessionId: string = typeof payload.sessionId === 'string' ? payload.sessionId : '';\n const status: string = typeof payload.status === 'string' ? payload.status : '';\n const statusMessage: string | undefined =\n typeof payload.statusMessage === 'string' ? payload.statusMessage : undefined;\n this.lastStatusUpdate_$.set({ sessionId: sessionId, status: status, statusMessage: statusMessage });\n\n const currentSessions: CA_ListItem_Interface[] = this.sessions_$();\n this.sessions_$.set(\n currentSessions.map(\n (s: CA_ListItem_Interface): CA_ListItem_Interface => {\n if (s.sessionId === sessionId) {\n return { ...s, status: status, statusMessage: statusMessage };\n }\n return s;\n },\n ),\n );\n\n const sel: CA_ListItem_Interface | null = this.selectedSession_$();\n if (sel?.sessionId === sessionId) {\n this.selectedSession_$.set({ ...sel, status: status, statusMessage: statusMessage });\n }\n\n if (status === 'errored') {\n this.globalError_CS.showError(\n new Error(statusMessage ? `CA session error: ${statusMessage}` : 'CA session errored'),\n 'ca-session-status',\n );\n }\n }\n\n private handleOutputChunk(payload: Record<string, unknown>): void {\n const sessionId: string = typeof payload.sessionId === 'string' ? payload.sessionId : '';\n if (sessionId && sessionId !== this.activeSessionId_$()) {\n return;\n }\n const content: string = typeof payload.content === 'string' ? payload.content : '';\n const outputType: string = typeof payload.type === 'string' ? payload.type : 'response';\n if (content) {\n const rawPayload: Record<string, unknown> = {};\n for (const key of Object.keys(payload)) {\n rawPayload[key] = Reflect.get(payload, key);\n }\n this.pushConsoleMessage({\n type: outputType === 'error' ? 'error' : 'assistant',\n text: content,\n rawData: rawPayload,\n mirrorEventType: 'ca-session:output',\n });\n }\n }\n\n private handleSessionEvent(payload: Record<string, unknown>): void {\n const sessionId: string = typeof payload.sessionId === 'string' ? payload.sessionId : '';\n if (sessionId && sessionId !== this.activeSessionId_$()) {\n return;\n }\n const event: Record<string, unknown> = this.asRecord(payload.event);\n const seq: number = typeof event.sequence === 'number' ? event.sequence : 0;\n if (seq <= this.lastKnownEventSequence) {\n return;\n }\n this.lastKnownEventSequence = seq;\n const tsFromEvent: unknown = event.timestamp;\n const item: CA_EventItem_Interface = {\n sessionId: sessionId,\n eventType: typeof event.eventType === 'string' ? event.eventType : '',\n timestamp: typeof tsFromEvent === 'string' && tsFromEvent.length ? tsFromEvent : new Date().toISOString(),\n data: this.asRecord(event.data),\n sequence: seq,\n };\n const evs: CA_EventItem_Interface[] = this.selectedSessionEvents_$();\n this.selectedSessionEvents_$.set([...evs, item]);\n this.appendConsoleMirrorEventOne(item);\n }\n\n /**\n * Oldal frissítés / részlet betöltés — konzol buborékok a Mongo mirror eseményekből (live socket mellett).\n */\n private seedConsoleFromMirrorEvents(events: CA_EventItem_Interface[]): void {\n this.pendingOptimisticPrompts.length = 0;\n const sorted: CA_EventItem_Interface[] = [...events].sort(\n CA_EventChronologicalSort_Util.compareMirrorEventsAsc,\n );\n this.consoleMessages_$.set(this.buildFoldedConsoleMessagesFromMirrorEvents(sorted));\n }\n\n /**\n * Poll / socket mirror `prompt-sent` előtt: ugyanazzal a szöveggel lévő optimista buborék törlése (ne legyen dupla user sor).\n */\n private removePendingOptimisticPromptBubbleIfTextMatchesMirror(mirrorContent: string): void {\n const pendingIndex: number = this.pendingOptimisticPrompts.findIndex(\n (p: { listKey: string; text: string }): boolean =>\n p.text === mirrorContent || p.text.trim() === mirrorContent.trim(),\n );\n if (pendingIndex < 0) {\n return;\n }\n const removed: { listKey: string; text: string } = this.pendingOptimisticPrompts[pendingIndex];\n this.pendingOptimisticPrompts.splice(pendingIndex, 1);\n const next: CaSessionConsoleMessage_Interface[] = this.consoleMessages_$().filter(\n (m: CaSessionConsoleMessage_Interface): boolean => m.listKey !== removed.listKey,\n );\n this.consoleMessages_$.set(next);\n }\n\n private mapSessionRecord(raw: Record<string, unknown>): CA_ListItem_Interface {\n return {\n sessionId: typeof raw['sessionId'] === 'string' ? raw['sessionId'] : undefined,\n acpSessionId: typeof raw['acpSessionId'] === 'string' ? raw['acpSessionId'] : undefined,\n label: typeof raw['label'] === 'string' ? raw['label'] : undefined,\n workspacePath: typeof raw['workspacePath'] === 'string' ? raw['workspacePath'] : undefined,\n status: typeof raw['status'] === 'string' ? raw['status'] : undefined,\n statusMessage: typeof raw['statusMessage'] === 'string' ? raw['statusMessage'] : undefined,\n promptCount: typeof raw['promptCount'] === 'number' ? raw['promptCount'] : undefined,\n lastPrompt: typeof raw['lastPrompt'] === 'string' ? raw['lastPrompt'] : undefined,\n lastActivityAt: typeof raw['lastActivityAt'] === 'string' ? raw['lastActivityAt'] : undefined,\n isArchived: raw['isArchived'] === true,\n parentSessionId: typeof raw['parentSessionId'] === 'string' ? raw['parentSessionId'] : undefined,\n lastSyncAt: typeof raw['lastSyncAt'] === 'string' ? raw['lastSyncAt'] : undefined,\n lastSyncError: typeof raw['lastSyncError'] === 'string' ? raw['lastSyncError'] : undefined,\n agentInfoName: typeof raw['agentInfoName'] === 'string' ? raw['agentInfoName'] : undefined,\n agentInfoVersion: typeof raw['agentInfoVersion'] === 'string' ? raw['agentInfoVersion'] : undefined,\n isAcpConnected: typeof raw['isAcpConnected'] === 'boolean' ? raw['isAcpConnected'] : undefined,\n loadSessionSupported:\n typeof raw['loadSessionSupported'] === 'boolean' ? raw['loadSessionSupported'] : undefined,\n isTerminalMode: typeof raw['isTerminalMode'] === 'boolean' ? raw['isTerminalMode'] : undefined,\n isTerminalRunnerConnected:\n typeof raw['isTerminalRunnerConnected'] === 'boolean' ? raw['isTerminalRunnerConnected'] : undefined,\n };\n }\n\n private asRecord(value: unknown): Record<string, unknown> {\n return this.toRecord(value);\n }\n\n private toRecord(value: unknown): Record<string, unknown> {\n if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(value)) {\n out[key] = Reflect.get(value, key);\n }\n return out;\n }\n return {};\n }\n\n // ── Assembled messages (SSOT) ──────────────────────────────\n\n /**\n * Assembled message-ek betöltése REST-en (latest tail).\n * REQ-SES-CONTENT-CHUNK-LOAD-AND-ARCHIVE-001: a `hasMore` válasz-mezőt a\n * `assembledMessagesHasMore_$` signal-ben tükrözzük, a backward-prepend\n * scroll-up trigger ezt használja.\n */\n async loadAssembledMessages(params: {\n sessionId: string;\n }): Promise<void> {\n try {\n const result = await this.extSessionMsg_AS.getMessages({\n sessionId: params.sessionId,\n latest: true,\n });\n this.assembledMessages_$.set(result.messages);\n this.assembledMessagesHasMore_$.set(result.hasMore === true);\n } catch (err: unknown) {\n DyFM_Log.error(\n `CCAP_CaSession_DS | loadAssembledMessages failed`\n + ` | sessionId: ${params.sessionId}`,\n err,\n );\n }\n }\n\n /**\n * REQ-SES-CONTENT-CHUNK-LOAD-AND-ARCHIVE-001 — régebbi assembled message-ek\n * betöltése (backward pagination). A jelenlegi messages tömb legkisebb\n * `sequence`-ét használja `beforeSequence` cursor-ként; a result a meglévő\n * lista ELÉ kerül (prepend). Race-guard: no-op ha `isLoadingOlderMessages_$`\n * vagy `!assembledMessagesHasMore_$`.\n */\n async loadOlderAssembledMessages(params: {\n sessionId: string;\n limit?: number;\n }): Promise<void> {\n if (this.isLoadingOlderMessages_$() || !this.assembledMessagesHasMore_$()) {\n return;\n }\n const current: CCAP_ExtSessionMessage_Response[] = this.assembledMessages_$();\n if (!current.length) {\n return;\n }\n const minSequence: number = current.reduce(\n (min: number, m: CCAP_ExtSessionMessage_Response): number =>\n (m.sequence ?? 0) < min ? (m.sequence ?? 0) : min,\n current[0].sequence ?? 0,\n );\n\n this.isLoadingOlderMessages_$.set(true);\n try {\n const result = await this.extSessionMsg_AS.getMessages({\n sessionId: params.sessionId,\n beforeSequence: minSequence,\n limit: params.limit ?? 50,\n });\n if (result.messages.length) {\n this.assembledMessages_$.set([...result.messages, ...current]);\n }\n this.assembledMessagesHasMore_$.set(result.hasMore === true);\n } catch (err: unknown) {\n DyFM_Log.error(\n `CCAP_CaSession_DS | loadOlderAssembledMessages failed`\n + ` | sessionId: ${params.sessionId}`,\n err,\n );\n } finally {\n this.isLoadingOlderMessages_$.set(false);\n }\n }\n\n /**\n * Új assembled message socket-en — aktív session szűréssel.\n */\n private handleAssembledMessage(\n payload: Record<string, unknown>,\n ): void {\n const sessionId: string =\n typeof payload.sessionId === 'string'\n ? payload.sessionId\n : '';\n if (!sessionId || sessionId !== this.activeSessionId_$()) {\n return;\n }\n const msgData: unknown = payload.message;\n if (!msgData || typeof msgData !== 'object') {\n return;\n }\n const msg: CCAP_ExtSessionMessage_Response =\n msgData as CCAP_ExtSessionMessage_Response;\n const current: CCAP_ExtSessionMessage_Response[] =\n this.assembledMessages_$();\n this.assembledMessages_$.set([...current, msg]);\n }\n\n /**\n * Assembled message frissítés socket-en (stream append, tool result).\n */\n private handleAssembledMessageUpdate(\n payload: Record<string, unknown>,\n ): void {\n const sessionId: string =\n typeof payload.sessionId === 'string'\n ? payload.sessionId\n : '';\n if (!sessionId || sessionId !== this.activeSessionId_$()) {\n return;\n }\n const messageKey: string =\n typeof payload.messageKey === 'string'\n ? payload.messageKey\n : '';\n if (!messageKey) {\n return;\n }\n const updateData: unknown = payload.update;\n if (!updateData || typeof updateData !== 'object') {\n return;\n }\n const updateRec: Record<string, unknown> =\n updateData as Record<string, unknown>;\n const current: CCAP_ExtSessionMessage_Response[] =\n this.assembledMessages_$();\n const idx: number = current.findIndex(\n (m: CCAP_ExtSessionMessage_Response): boolean =>\n m.messageKey === messageKey,\n );\n if (idx < 0) {\n return;\n }\n const updated: CCAP_ExtSessionMessage_Response = {\n ...current[idx],\n };\n if (typeof updateRec.bodyText === 'string') {\n updated.bodyText = updateRec.bodyText;\n }\n if (updateRec.toolResult !== undefined) {\n updated.toolResult =\n updateRec.toolResult as CCAP_ExtSessionMessage_Response['toolResult'];\n }\n if (typeof updateRec.toolStatus === 'string') {\n updated.toolStatus = updateRec.toolStatus;\n }\n if (updateRec.headerStatusDot !== undefined) {\n updated.headerStatusDot =\n typeof updateRec.headerStatusDot === 'string'\n ? updateRec.headerStatusDot\n : undefined;\n }\n const next: CCAP_ExtSessionMessage_Response[] = [...current];\n next[idx] = updated;\n this.assembledMessages_$.set(next);\n }\n}\n", "import { SHR_JsonSnippetFormat_Util } from './shr-json-snippet-format.util';\n\n/**\n * Ismeretlen / nested érték pretty-print — beágyazott JSON string mezők rekurzív kibontása, majd JSON.stringify indent.\n */\nexport class SHR_UnknownValuePrettyJson_Util {\n\n /**\n * `unknown` érték 2 space indent JSON szöveggé; beágyazott stringekben lévő JSON parse + beillesztés.\n */\n static prettyStringifyUnknown(value: unknown): string {\n try {\n const expanded: unknown = SHR_UnknownValuePrettyJson_Util.expandEmbeddedJsonStrings(value);\n return JSON.stringify(expanded, null, 2);\n } catch {\n if (value === null || value === undefined) {\n return String(value);\n }\n if (typeof value === 'object') {\n return '[Object stringify failed]';\n }\n return String(value);\n }\n }\n\n /**\n * String leaf-eknél: ha JSON-nak tűnik, parse és rekurzív expand; különben primitív / objektum / tömb rekurzió.\n */\n private static expandEmbeddedJsonStrings(value: unknown): unknown {\n if (value === null || value === undefined) {\n return value;\n }\n if (typeof value === 'string') {\n const s: string = value;\n if (!SHR_JsonSnippetFormat_Util.looksLikeJson(s)) {\n return s;\n }\n try {\n const parsed: unknown = JSON.parse(s.trim());\n return SHR_UnknownValuePrettyJson_Util.expandEmbeddedJsonStrings(parsed);\n } catch {\n return s;\n }\n }\n if (typeof value !== 'object') {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item: unknown): unknown =>\n SHR_UnknownValuePrettyJson_Util.expandEmbeddedJsonStrings(item),\n );\n }\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(value)) {\n const v: unknown = Reflect.get(value, key);\n out[key] = SHR_UnknownValuePrettyJson_Util.expandEmbeddedJsonStrings(v);\n }\n return out;\n }\n}\n", "import { CA_MirrorBrief_Result_Interface } from '../../../_models/interfaces/ca-mirror-brief-result.interface';\nimport { CA_EventItem_Interface } from '../../../_models/interfaces/ca-view.interface';\nimport { CA_MirrorStreamMerge_Util } from './ca-mirror-stream-merge.util';\nimport { SHR_UnknownValuePrettyJson_Util } from '../../../../../../shared/_collections/utils/shr-unknown-value-pretty-json.util';\n\n/**\n * CA mirror timeline esemény → console brief (known ágak + pretty JSON fallback).\n */\nexport class CA_MirrorEventBrief_Util {\n\n /**\n * Egy mirror sor → egy console buborék leírása; üres / érvénytelen prompt → null.\n */\n static buildFromMirrorEvent(item: CA_EventItem_Interface): CA_MirrorBrief_Result_Interface | null {\n const seq: number = item.sequence ?? 0;\n const data: Record<string, unknown> = item.data !== undefined ? item.data : {};\n const eventType: string = typeof item.eventType === 'string' ? item.eventType : '';\n\n if (eventType === 'prompt-sent') {\n return CA_MirrorEventBrief_Util.buildPromptSentBrief(seq, data);\n }\n if (eventType === 'ca-session-update') {\n return CA_MirrorEventBrief_Util.buildCaSessionUpdateBrief(seq, data);\n }\n return CA_MirrorEventBrief_Util.buildGenericBrief(eventType, seq, data);\n }\n\n /**\n * Belső `sessionUpdate` érték — opcionális subtype címkéhez.\n */\n static extractSessionUpdateKind(data: Record<string, unknown>): string | undefined {\n const upd: unknown = data.update;\n if (upd === null || typeof upd !== 'object' || Array.isArray(upd)) {\n return undefined;\n }\n const rec: Record<string, unknown> = CA_MirrorEventBrief_Util.toPlainRecord(upd);\n const kind: unknown = rec.sessionUpdate;\n return typeof kind === 'string' && kind.length ? kind : undefined;\n }\n\n private static buildPromptSentBrief(\n seq: number,\n data: Record<string, unknown>,\n ): CA_MirrorBrief_Result_Interface | null {\n const contentRaw: unknown = data.content;\n if (typeof contentRaw !== 'string' || !contentRaw.length) {\n return null;\n }\n return {\n listKey: `mirror-prompt-${String(seq)}`,\n consoleType: 'prompt',\n bodyText: contentRaw,\n mirrorEventType: 'prompt-sent',\n useRawBubbleKind: false,\n rawData: data,\n };\n }\n\n private static buildCaSessionUpdateBrief(\n seq: number,\n data: Record<string, unknown>,\n ): CA_MirrorBrief_Result_Interface | null {\n const parsed = CA_MirrorStreamMerge_Util.parseStreamChunkFromMirrorData(data);\n if (parsed !== null) {\n const sub: string | undefined = CA_MirrorEventBrief_Util.extractSessionUpdateKind(data);\n const isThoughtStream: boolean = parsed.role === 'thought';\n return {\n listKey: `mirror-chunk-${String(seq)}`,\n consoleType: isThoughtStream ? 'thinking' : 'assistant',\n bodyText: parsed.text,\n mirrorEventType: 'ca-session-update',\n briefSubtype: sub,\n useRawBubbleKind: false,\n rawData: data,\n isStreamingTextChunk: true,\n streamTextRole: parsed.role,\n streamMessageId: parsed.messageId,\n };\n }\n const pretty: string = SHR_UnknownValuePrettyJson_Util.prettyStringifyUnknown(data);\n return {\n listKey: `mirror-ca-session-update-${String(seq)}`,\n consoleType: 'info',\n bodyText: pretty,\n mirrorEventType: 'ca-session-update',\n useRawBubbleKind: true,\n rawData: data,\n };\n }\n\n private static buildGenericBrief(\n eventType: string,\n seq: number,\n data: Record<string, unknown>,\n ): CA_MirrorBrief_Result_Interface {\n const segment: string = CA_MirrorEventBrief_Util.safeListKeySegment(eventType);\n const payload: Record<string, unknown> = {\n eventType: eventType.length ? eventType : 'unknown',\n sequence: seq,\n data: data,\n };\n const pretty: string = SHR_UnknownValuePrettyJson_Util.prettyStringifyUnknown(payload);\n return {\n listKey: `mirror-${segment}-${String(seq)}`,\n consoleType: 'info',\n bodyText: pretty,\n mirrorEventType: eventType.length ? eventType : 'unknown',\n useRawBubbleKind: true,\n rawData: data,\n };\n }\n\n private static safeListKeySegment(eventType: string): string {\n const cleaned: string = eventType.replace(/[^a-zA-Z0-9_-]+/g, '_').replace(/^_+|_+$/g, '');\n return cleaned.length ? cleaned : 'event';\n }\n\n private static toPlainRecord(value: object): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(value)) {\n out[key] = Reflect.get(value, key);\n }\n return out;\n }\n}\n", "import { CA_ToolCallMirrorParseResult_Interface } from '../../../_models/interfaces/ca-tool-call-mirror-parse-result.interface';\n\n/**\n * CA mirror `ca-session-update` `data` objektumából tool_call / tool_call_update mezők kiolvasása (ACP).\n */\nexport class CA_ToolCallMirrorParse_Util {\n\n /**\n * Stabil listKey — tool indulás buborék + failed patch cél.\n */\n static listKeyStart(toolCallId: string): string {\n return `ca-tc-${toolCallId}-start`;\n }\n\n /**\n * Stabil listKey — in_progress agent update sor (replace).\n */\n static listKeyProgress(toolCallId: string): string {\n return `ca-tc-${toolCallId}-progress`;\n }\n\n /**\n * Stabil listKey — sikeres tool result.\n */\n static listKeyResult(toolCallId: string): string {\n return `ca-tc-${toolCallId}-result`;\n }\n\n /**\n * Stabil listKey — completed error buborék.\n */\n static listKeyError(toolCallId: string): string {\n return `ca-tc-${toolCallId}-error`;\n }\n\n /**\n * Stabil `listKey` → `toolCallId` + szerep (console pairing, dedup ellenőrzés).\n * `-progress` előbb, hogy ne legyen ütközés más suffix-szel.\n */\n static tryParseStableListKey(listKey: string): {\n toolCallId: string;\n role: 'start' | 'progress' | 'result' | 'error';\n } | null {\n const prefix: string = 'ca-tc-';\n if (!listKey.startsWith(prefix)) {\n return null;\n }\n const suffixSpecs: { suffix: string; role: 'start' | 'progress' | 'result' | 'error' }[] = [\n { suffix: '-progress', role: 'progress' },\n { suffix: '-start', role: 'start' },\n { suffix: '-result', role: 'result' },\n { suffix: '-error', role: 'error' },\n ];\n for (const spec of suffixSpecs) {\n if (!listKey.endsWith(spec.suffix)) {\n continue;\n }\n const id: string = listKey.slice(prefix.length, listKey.length - spec.suffix.length);\n if (!id.length) {\n return null;\n }\n return {\n toolCallId: id,\n role: spec.role,\n };\n }\n return null;\n }\n\n /**\n * Ha `data.update` tool_call vagy tool_call_update, visszaadja a mezőket; egyébként null.\n */\n static tryParseMirrorData(\n data: Record<string, unknown>,\n ): CA_ToolCallMirrorParseResult_Interface | null {\n const upd: unknown = data.update;\n if (upd === null || typeof upd !== 'object' || Array.isArray(upd)) {\n return null;\n }\n const rec: Record<string, unknown> = CA_ToolCallMirrorParse_Util.toPlainRecord(upd);\n const su: unknown = rec.sessionUpdate;\n if (su !== 'tool_call' && su !== 'tool_call_update') {\n return null;\n }\n const toolCallIdRaw: unknown = rec.toolCallId;\n if (typeof toolCallIdRaw !== 'string' || !toolCallIdRaw.trim().length) {\n return null;\n }\n const statusRaw: unknown = rec.status;\n const status: string = typeof statusRaw === 'string' ? statusRaw : '';\n const titleRaw: unknown = rec.title;\n const title: string | undefined =\n typeof titleRaw === 'string' && titleRaw.trim().length ? titleRaw.trim() : undefined;\n const kindRaw: unknown = rec.kind;\n const toolKind: string | undefined =\n typeof kindRaw === 'string' && kindRaw.trim().length ? kindRaw.trim() : undefined;\n const rawOut: unknown = rec.rawOutput;\n const rawIn: unknown = rec.rawInput;\n const contentRaw: unknown = rec.content;\n const locationsRaw: unknown = rec.locations;\n return {\n sessionUpdate: su,\n toolCallId: toolCallIdRaw.trim(),\n status: status,\n title: title,\n toolKind: toolKind,\n rawOutput: rawOut !== undefined ? rawOut : undefined,\n rawInput: rawIn !== undefined ? rawIn : undefined,\n content: Array.isArray(contentRaw) && contentRaw.length ? contentRaw : undefined,\n locations: Array.isArray(locationsRaw) && locationsRaw.length ? locationsRaw : undefined,\n };\n }\n\n /**\n * `rawOutput` tartalmaz-e értelmezhető error mezőt (completed error ág).\n */\n static hasRawOutputError(rawOutput: unknown): boolean {\n if (rawOutput === null || typeof rawOutput !== 'object' || Array.isArray(rawOutput)) {\n return false;\n }\n const rec: Record<string, unknown> = CA_ToolCallMirrorParse_Util.toPlainRecord(rawOutput);\n return Object.prototype.hasOwnProperty.call(rec, 'error');\n }\n\n /**\n * Error szöveg összefoglaló user buborékhoz.\n */\n static summarizeRawOutputError(rawOutput: unknown): string {\n if (rawOutput === null || typeof rawOutput !== 'object' || Array.isArray(rawOutput)) {\n return 'Tool call failed';\n }\n const rec: Record<string, unknown> = CA_ToolCallMirrorParse_Util.toPlainRecord(rawOutput);\n const err: unknown = rec.error;\n if (typeof err === 'string' && err.trim().length) {\n return err.trim();\n }\n try {\n return JSON.stringify(rawOutput);\n } catch {\n return 'Tool call failed';\n }\n }\n\n /**\n * Sikeres completed — rövid result szöveg (nem error ág).\n */\n static summarizeRawOutputSuccess(rawOutput: unknown): string {\n if (rawOutput === undefined) {\n return 'Completed';\n }\n try {\n const s: string = JSON.stringify(rawOutput);\n const max: number = 400;\n return s.length > max ? `${s.substring(0, max)}…` : s;\n } catch {\n return 'Completed';\n }\n }\n\n /**\n * `rawInput` → formázott body szöveg (tool name után).\n * Üres/undefined → üres string.\n */\n static formatRawInput(rawInput: unknown): string {\n if (rawInput === undefined || rawInput === null) {\n return '';\n }\n try {\n return JSON.stringify(rawInput, null, 2);\n } catch {\n return String(rawInput);\n }\n }\n\n /**\n * ACP `locations` → olvasható fájl-lokáció lista (pl. \"src/foo.ts:42\").\n */\n static formatLocations(locations: unknown[] | undefined): string {\n if (!locations?.length) {\n return '';\n }\n const lines: string[] = [];\n for (const loc of locations) {\n if (loc === null || typeof loc !== 'object' || Array.isArray(loc)) {\n continue;\n }\n const rec: Record<string, unknown> = CA_ToolCallMirrorParse_Util.toPlainRecord(loc);\n const path: unknown = rec.path;\n if (typeof path !== 'string' || !path.length) {\n continue;\n }\n const line: unknown = rec.line;\n const lineStr: string = typeof line === 'number' ? `:${line}` : '';\n lines.push(`${path}${lineStr}`);\n }\n return lines.join('\\n');\n }\n\n /**\n * ACP `content` (ToolCallContent[]) → szöveges összefoglaló (diffs, terminal, text).\n */\n static formatContent(content: unknown[] | undefined): string {\n if (!content?.length) {\n return '';\n }\n const parts: string[] = [];\n for (const item of content) {\n if (item === null || typeof item !== 'object' || Array.isArray(item)) {\n continue;\n }\n const rec: Record<string, unknown> = CA_ToolCallMirrorParse_Util.toPlainRecord(item);\n const type: unknown = rec.type;\n if (type === 'diff') {\n const path: unknown = rec.path;\n const oldText: unknown = rec.oldText;\n const newText: unknown = rec.newText;\n const pathStr: string = typeof path === 'string' ? path : '(unknown)';\n const parts2: string[] = [`--- ${pathStr}`];\n if (typeof oldText === 'string' && oldText.length) {\n parts2.push(`- ${oldText.substring(0, 500)}${oldText.length > 500 ? '…' : ''}`);\n }\n if (typeof newText === 'string' && newText.length) {\n parts2.push(`+ ${newText.substring(0, 500)}${newText.length > 500 ? '…' : ''}`);\n }\n parts.push(parts2.join('\\n'));\n } else if (type === 'terminal') {\n try {\n parts.push(`[terminal] ${JSON.stringify(rec, null, 2)}`);\n } catch {\n parts.push('[terminal output]');\n }\n } else if (type === 'content') {\n const innerParts: unknown = rec.parts;\n if (Array.isArray(innerParts)) {\n for (const part of innerParts) {\n if (part !== null && typeof part === 'object' && !Array.isArray(part)) {\n const pRec: Record<string, unknown> =\n CA_ToolCallMirrorParse_Util.toPlainRecord(part);\n if (typeof pRec.text === 'string') {\n parts.push(pRec.text as string);\n }\n }\n }\n }\n }\n }\n return parts.join('\\n\\n');\n }\n\n private static toPlainRecord(value: object): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(value)) {\n out[key] = Reflect.get(value, key);\n }\n return out;\n }\n}\n", "import { inject, Injectable } from '@angular/core';\nimport { HttpClient, HttpParams } from '@angular/common/http';\n\nimport { firstValueFrom } from 'rxjs';\n\nimport { environment } from '../../../../../../environments/environment';\nimport {\n CA_List_Response,\n} from '../_models/interfaces/ca-view.interface';\nimport { ExS_InstanceContext_DataService } from '../../../_services/exs-instance-context.data-service';\n\n/**\n * CA session REST API.\n * Minden hívás `?ccapId=<current>` paramot küld — a ccapId forrása\n * az instance-szelektor (`ExS_InstanceContext_DataService.activeCcapId_$`).\n */\n@Injectable({ providedIn: 'root' })\nexport class CursorAcp_ApiService {\n\n private readonly baseUrl: string = `${environment.api.baseUrl}/ca-session`;\n\n private readonly http: HttpClient = inject(HttpClient);\n\n private readonly peiContext_DS: ExS_InstanceContext_DataService =\n inject(ExS_InstanceContext_DataService);\n\n /**\n * ccapId hozzáfűzése egy meglévő HttpParams-hoz.\n */\n private withCcapId(params: HttpParams): HttpParams {\n const ccapId: string = this.peiContext_DS.activeCcapId_$();\n if (!ccapId) {\n return params;\n }\n return params.set('ccapId', ccapId);\n }\n\n createSession(params: {\n workspacePath: string;\n label?: string;\n parentSessionId?: string;\n actorId?: string;\n actorLabel?: string;\n }): Promise<{ session: Record<string, unknown> }> {\n const httpParams: HttpParams = this.withCcapId(new HttpParams());\n return firstValueFrom(\n this.http.post<{ session: Record<string, unknown> }>(this.baseUrl, params, { params: httpParams }),\n );\n }\n\n listSessions(params?: {\n status?: string;\n workspacePath?: string;\n includeArchived?: boolean;\n }): Promise<CA_List_Response> {\n let httpParams: HttpParams = this.withCcapId(new HttpParams());\n if (params?.status) {\n httpParams = httpParams.set('status', params.status);\n }\n if (params?.workspacePath) {\n httpParams = httpParams.set('workspacePath', params.workspacePath);\n }\n if (params?.includeArchived) {\n httpParams = httpParams.set('includeArchived', '1');\n }\n return firstValueFrom(\n this.http.get<CA_List_Response>(this.baseUrl, { params: httpParams }),\n );\n }\n\n syncFromAgent(params?: { cwd?: string }): Promise<{ success: boolean; mergedCount: number }> {\n const httpParams: HttpParams = this.withCcapId(new HttpParams());\n return firstValueFrom(\n this.http.post<{ success: boolean; mergedCount: number }>(`${this.baseUrl}/sync`, {\n cwd: params?.cwd,\n }, { params: httpParams }),\n );\n }\n\n getSession(sessionId: string): Promise<{ session: Record<string, unknown> }> {\n const httpParams: HttpParams = this.withCcapId(new HttpParams());\n return firstValueFrom(\n this.http.get<{ session: Record<string, unknown> }>(`${this.baseUrl}/${sessionId}`, { params: httpParams }),\n );\n }\n\n sendPrompt(params: { sessionId: string; content: string }): Promise<{\n success: boolean;\n stopReason?: string;\n raw?: Record<string, unknown>;\n }> {\n const httpParams: HttpParams = this.withCcapId(new HttpParams());\n return firstValueFrom(\n this.http.post<{ success: boolean; stopReason?: string; raw?: Record<string, unknown> }>(\n `${this.baseUrl}/${params.sessionId}/prompt`,\n { content: params.content },\n { params: httpParams },\n ),\n );\n }\n\n /**\n * Futó execution leállítása (stop gomb; session megmarad).\n */\n stopExecution(sessionId: string): Promise<{ success: boolean }> {\n const httpParams: HttpParams = this.withCcapId(new HttpParams());\n return firstValueFrom(\n this.http.post<{ success: boolean }>(`${this.baseUrl}/${sessionId}/stop-execution`, {}, { params: httpParams }),\n );\n }\n\n terminateSession(sessionId: string): Promise<{ success: boolean }> {\n const httpParams: HttpParams = this.withCcapId(new HttpParams());\n return firstValueFrom(\n this.http.post<{ success: boolean }>(`${this.baseUrl}/${sessionId}/terminate`, {}, { params: httpParams }),\n );\n }\n\n setSessionArchived(params: { sessionId: string; isArchived: boolean }): Promise<{\n success: boolean;\n session: Record<string, unknown> | null;\n }> {\n const httpParams: HttpParams = this.withCcapId(new HttpParams());\n return firstValueFrom(\n this.http.patch<{ success: boolean; session: Record<string, unknown> | null }>(\n `${this.baseUrl}/${params.sessionId}/archive`,\n { isArchived: params.isArchived },\n { params: httpParams },\n ),\n );\n }\n\n getSessionEvents(params: {\n sessionId: string;\n sinceSequence?: number;\n limit?: number;\n }): Promise<{\n events: Record<string, unknown>[];\n hasMore: boolean;\n nextSinceSequence: number | null;\n }> {\n let httpParams: HttpParams = this.withCcapId(new HttpParams());\n if (params.sinceSequence != null) {\n httpParams = httpParams.set('sinceSequence', String(params.sinceSequence));\n }\n if (params.limit != null) {\n httpParams = httpParams.set('limit', String(params.limit));\n }\n return firstValueFrom(\n this.http.get<{\n events: Record<string, unknown>[];\n hasMore: boolean;\n nextSinceSequence: number | null;\n }>(`${this.baseUrl}/${params.sessionId}/events`, { params: httpParams }),\n );\n }\n\n hydrateSession(params: { sessionId: string; force?: boolean }): Promise<{\n success: boolean;\n appended: boolean;\n skippedDuplicate: boolean;\n fingerprint: string;\n sequence: number;\n }> {\n return firstValueFrom(\n this.http.post<{\n success: boolean;\n appended: boolean;\n skippedDuplicate: boolean;\n fingerprint: string;\n sequence: number;\n }>(`${this.baseUrl}/${params.sessionId}/hydrate`, { force: params.force === true },\n { params: this.withCcapId(new HttpParams()) }),\n );\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["CA_EventChronologicalSort_Util", "compareMirrorEventsAsc", "a", "b", "dq", "sequence", "ta", "timestamp", "tb", "tc", "localeCompare", "ea", "eventType", "eb", "CA_MirrorStreamMerge_Util", "messageIdsCompatibleForStreamMerge", "prevMid", "nextMid", "p", "trim", "n", "length", "parseStreamChunkFromMirrorData", "data", "upd", "update", "Array", "isArray", "rec", "toPlainRecord", "kind", "sessionUpdate", "role", "content", "text", "midRaw", "messageId", "undefined", "canMergeConsoleTailWithChunk", "params", "prev", "streamTextRole", "parsed", "streamMessageId", "nSeq", "ev", "sequence", "pSeq", "streamLastSequence", "canMergeMirrorChunkEvents", "prevEv", "nextEv", "nextParsed", "prevParsed", "foldEventsToTimelineRows", "sortedAsc", "rows", "tail", "tailLast", "events", "nextEvents", "rowKey", "mergedTimelineRowKey", "push", "String", "first", "last", "value", "out", "key", "Object", "keys", "Reflect", "get", "import_fsm_dynamo", "SHR_UnknownValuePrettyJson_Util", "prettyStringifyUnknown", "value", "expanded", "expandEmbeddedJsonStrings", "JSON", "stringify", "String", "s", "SHR_JsonSnippetFormat_Util", "looksLikeJson", "parsed", "parse", "trim", "Array", "isArray", "map", "item", "out", "key", "Object", "keys", "v", "Reflect", "get", "CA_MirrorEventBrief_Util", "buildFromMirrorEvent", "item", "seq", "sequence", "data", "undefined", "eventType", "buildPromptSentBrief", "buildCaSessionUpdateBrief", "buildGenericBrief", "extractSessionUpdateKind", "upd", "update", "Array", "isArray", "kind", "toPlainRecord", "sessionUpdate", "length", "contentRaw", "content", "listKey", "String", "consoleType", "bodyText", "mirrorEventType", "useRawBubbleKind", "rawData", "parsed", "CA_MirrorStreamMerge_Util", "parseStreamChunkFromMirrorData", "sub", "isThoughtStream", "role", "text", "briefSubtype", "isStreamingTextChunk", "streamTextRole", "streamMessageId", "messageId", "pretty", "SHR_UnknownValuePrettyJson_Util", "prettyStringifyUnknown", "segment", "safeListKeySegment", "payload", "cleaned", "replace", "value", "out", "key", "Object", "keys", "Reflect", "get", "CA_ToolCallMirrorParse_Util", "listKeyStart", "toolCallId", "listKeyProgress", "listKeyResult", "listKeyError", "tryParseStableListKey", "listKey", "prefix", "startsWith", "suffixSpecs", "suffix", "role", "spec", "endsWith", "id", "slice", "length", "tryParseMirrorData", "data", "upd", "update", "Array", "isArray", "rec", "toPlainRecord", "su", "sessionUpdate", "toolCallIdRaw", "trim", "statusRaw", "status", "titleRaw", "title", "undefined", "kindRaw", "kind", "toolKind", "rawOut", "rawOutput", "rawIn", "rawInput", "contentRaw", "content", "locationsRaw", "locations", "hasRawOutputError", "Object", "prototype", "hasOwnProperty", "call", "summarizeRawOutputError", "err", "error", "JSON", "stringify", "summarizeRawOutputSuccess", "s", "max", "substring", "formatRawInput", "String", "formatLocations", "lines", "loc", "path", "line", "lineStr", "push", "join", "formatContent", "parts", "item", "type", "oldText", "newText", "parts2", "innerParts", "part", "pRec", "text", "value", "out", "key", "keys", "Reflect", "get", "CursorAcp_ApiService", "baseUrl", "environment", "api", "http", "inject", "HttpClient", "peiContext_DS", "ExS_InstanceContext_DataService", "withCcapId", "params", "ccapId", "activeCcapId_$", "set", "createSession", "httpParams", "HttpParams", "firstValueFrom", "post", "listSessions", "status", "workspacePath", "includeArchived", "get", "syncFromAgent", "cwd", "getSession", "sessionId", "sendPrompt", "content", "stopExecution", "terminateSession", "setSessionArchived", "patch", "isArchived", "getSessionEvents", "sinceSequence", "String", "limit", "hydrateSession", "force", "factory", "\u0275fac", "providedIn", "CursorAcp_DataService", "sessions_$", "signal", "sessionsLoading_$", "sessionsLoadError_$", "selectedSession_$", "selectedSessionLoading_$", "selectedSessionEvents_$", "sessionEventsHasMore_$", "mirrorRuntime_$", "consoleMessages_$", "assembledMessages_$", "assembledMessagesHasMore_$", "isLoadingOlderMessages_$", "lastStatusUpdate_$", "activeSessionId_$", "sessionDetailError_$", "caSession_AS", "inject", "CursorAcp_ApiService", "extSessionMsg_AS", "ExS_Message_ApiService", "globalError_CS", "CCAP_GlobalError_ControlService", "socket_CS", "CCAP_Socket_ControlService", "ngZone", "NgZone", "eventSubscription", "reconnectSubscription", "lastKnownEventSequence", "openSessionPollTimer", "openSessionPollTargetId", "pendingOptimisticPrompts", "sessionEventsNextSince", "constructor", "event$", "subscribe", "envelope", "handleSocketEvent", "connected$", "isConnected", "activeId", "emit", "sessionId", "loadAssembledMessages", "catch", "ngOnDestroy", "stopOpenSessionPolling", "unsubscribe", "loadSessions", "params", "__async", "set", "res", "listSessions", "includeArchived", "rawUnknown", "sessions", "mapped", "Array", "isArray", "map", "s", "mapSessionRecord", "toRecord", "rtUnknown", "mirrorRuntime", "rtRec", "ic", "isAcpConnected", "ls", "loadSessionSupported", "tm", "isTerminalMode", "trc", "isTerminalRunnerConnected", "err", "showError", "syncFromAgent", "cwd", "loadSessionDetail", "row", "getSession", "session", "ev", "getSessionEvents", "limit", "events", "e", "eventType", "timestamp", "data", "asRecord", "sequence", "hasMore", "ns", "nextSinceSequence", "Math", "max", "x", "seedConsoleFromMirrorEvents", "loadMoreSessionEvents", "since", "sinceSequence", "merged", "sort", "CA_EventChronologicalSort_Util", "compareMirrorEventsAsc", "hydrateFromAgent", "hydrateSession", "force", "Error", "setActiveSessionId", "previousId", "clearLiveOutput", "length", "createSession", "workspacePath", "label", "newIdRaw", "newId", "sendPrompt", "optimisticListKey", "globalThis", "crypto", "randomUUID", "push", "listKey", "text", "content", "pushConsoleMessage", "type", "pendingIdx", "findIndex", "p", "splice", "CCAP_ErrorDisplay_Util", "getErrorMessageForDisplay", "stopExecution", "terminateSession", "setSessionArchived", "startOpenSessionPolling", "intervalMs", "second", "setInterval", "runOpenSessionPollTick", "clearInterval", "message", "materializeConsoleLineFromPushParams", "Date", "toISOString", "rawData", "mirrorEventType", "briefSubtype", "useRawBubbleKind", "streamTextRole", "streamLastSequence", "streamMessageId", "streamPartData", "toolDisplayName", "isToolCallFailedIndicator", "current", "appendConsoleMirrorEventOne", "toolParsed", "CA_ToolCallMirrorParse_Util", "tryParseMirrorData", "applyToolCallMirrorEventToLiveConsole", "parsed", "brief", "CA_MirrorEventBrief_Util", "buildFromMirrorEvent", "consoleType", "removePendingOptimisticPromptBubbleIfTextMatchesMirror", "bodyText", "some", "m", "isStreamingTextChunk", "tryMergeStreamingMirrorChunkIntoConsole", "ts", "buildConsolePushParamsFromBrief", "timestampIso", "prev", "CA_MirrorStreamMerge_Util", "parseStreamChunkFromMirrorData", "canMergeConsoleTailWithChunk", "parts", "undefined", "nextMsgId", "mergedMsgId", "trim", "updated", "__spreadProps", "__spreadValues", "streamMerged", "partCount", "lastChunkSequence", "chunkSnapshots", "next", "b", "buildFoldedConsoleMessagesFromMirrorEvents", "sortedAsc", "out", "tryFoldToolCallMirrorEventIntoOut", "last", "id", "toolCallId", "dataPayload", "sessionUpdate", "startKey", "listKeyStart", "display", "toolCallDisplayName", "buildToolCallBodyText", "displayName", "status", "rawInput", "patchLiveToolCallStartInput", "progressKey", "listKeyProgress", "line", "idx", "nextLine", "hasRawOutputError", "rawOutput", "errKey", "listKeyError", "errText", "summarizeRawOutputError", "patchLiveConsoleToolCallStartFailed", "resKey", "listKeyResult", "summary", "summarizeRawOutputSuccess", "patchOutArrayToolCallStartInput", "patchOutArrayToolCallStartFailed", "cur", "title", "toolKind", "lines", "inputStr", "formatRawInput", "locStr", "formatLocations", "locations", "join", "detail", "run", "prevMax", "bySeq", "Map", "item", "values", "eventName", "event", "payload", "handleStatusUpdate", "handleOutputChunk", "handleSessionEvent", "handleAssembledMessage", "handleAssembledMessageUpdate", "DyFM_Log", "error", "statusMessage", "currentSessions", "sel", "outputType", "rawPayload", "key", "Object", "keys", "Reflect", "get", "seq", "tsFromEvent", "evs", "sorted", "mirrorContent", "pendingIndex", "removed", "filter", "raw", "acpSessionId", "promptCount", "lastPrompt", "lastActivityAt", "isArchived", "parentSessionId", "lastSyncAt", "lastSyncError", "agentInfoName", "agentInfoVersion", "value", "result", "getMessages", "latest", "messages", "loadOlderAssembledMessages", "minSequence", "reduce", "min", "beforeSequence", "msgData", "msg", "messageKey", "updateData", "update", "updateRec", "toolResult", "toolStatus", "headerStatusDot", "factory", "\u0275fac", "providedIn"]
7
+ }
@@ -1,2 +1,2 @@
1
- import{I as c}from"./chunk-QUNT2WPJ.js";import{C as s,p as n,vb as o,xb as f,y as r}from"./chunk-TBMJSIBB.js";var b=(()=>{class i{baseUrl=`${c.api.baseUrl}/ext-session-message`;http=s(f);getMessages(t){let e=new o;return t.sinceSequence!==void 0&&(e=e.set("sinceSequence",String(t.sinceSequence))),t.beforeSequence!==void 0&&(e=e.set("beforeSequence",String(t.beforeSequence))),t.limit!==void 0&&(e=e.set("limit",String(t.limit))),t.latest&&(e=e.set("latest","1")),n(this.http.get(`${this.baseUrl}/${t.sessionId}/messages`,{params:e}))}static \u0275fac=function(e){return new(e||i)};static \u0275prov=r({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();export{b as a};
2
- //# sourceMappingURL=chunk-6ZYILL36.js.map
1
+ import{I as c}from"./chunk-QXM45TNB.js";import{C as s,p as n,vb as o,xb as f,y as r}from"./chunk-TBMJSIBB.js";var b=(()=>{class i{baseUrl=`${c.api.baseUrl}/ext-session-message`;http=s(f);getMessages(t){let e=new o;return t.sinceSequence!==void 0&&(e=e.set("sinceSequence",String(t.sinceSequence))),t.beforeSequence!==void 0&&(e=e.set("beforeSequence",String(t.beforeSequence))),t.limit!==void 0&&(e=e.set("limit",String(t.limit))),t.latest&&(e=e.set("latest","1")),n(this.http.get(`${this.baseUrl}/${t.sessionId}/messages`,{params:e}))}static \u0275fac=function(e){return new(e||i)};static \u0275prov=r({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();export{b as a};
2
+ //# sourceMappingURL=chunk-ZGNVQEFP.js.map
@@ -1,2 +1,2 @@
1
- import{I as l}from"./chunk-QUNT2WPJ.js";import{C as d,aa as r,k as c,p as o,xb as n,y as s}from"./chunk-TBMJSIBB.js";var f=(()=>{class i{baseUrl=`${l.api.baseUrl}/agent-feedback`;http=d(n);listFeedback(e){let t=[];e?.type!==void 0&&e.type!==""&&t.push(`type=${encodeURIComponent(e.type)}`),e?.limit!==void 0&&t.push(`limit=${e.limit}`),e?.skip!==void 0&&t.push(`skip=${e.skip}`);let a=`${this.baseUrl}/list`,b=t.length?`${a}?${t.join("&")}`:a;return o(this.http.get(b))}deleteFeedback(e){return o(this.http.delete(`${this.baseUrl}/delete/${encodeURIComponent(e)}`))}deleteAllFeedback(){return o(this.http.delete(`${this.baseUrl}/delete-all`))}static \u0275fac=function(t){return new(t||i)};static \u0275prov=s({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var A=(()=>{class i{feedback_$=r([]);feedbackLoading_$=r(!1);feedbackLoadError_$=r(null);filterType_$=r(void 0);feedbackTotalCount_$=r(0);feedback_AS=d(f);loadFeedback(){return c(this,null,function*(){this.feedbackLoading_$.set(!0),this.feedbackLoadError_$.set(null);try{let e=this.filterType_$(),a=(yield this.feedback_AS.listFeedback({type:e})).feedback??[];this.feedback_$.set(a),e===void 0&&this.feedbackTotalCount_$.set(a.length)}catch(e){this.feedbackLoadError_$.set(e),this.feedback_$.set([])}finally{this.feedbackLoading_$.set(!1)}})}setFilterType(e){this.filterType_$.set(e),this.loadFeedback()}clearAll(){return c(this,null,function*(){try{yield this.feedback_AS.deleteAllFeedback(),this.feedbackTotalCount_$.set(0),yield this.loadFeedback()}catch(e){this.feedbackLoadError_$.set(e)}})}clearOne(e){return c(this,null,function*(){try{yield this.feedback_AS.deleteFeedback(e),this.feedback_$.update(t=>t.filter(a=>a._id!==e)),this.feedbackTotalCount_$.update(t=>Math.max(0,t-1))}catch(t){this.feedbackLoadError_$.set(t)}})}static \u0275fac=function(t){return new(t||i)};static \u0275prov=s({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();export{A as a};
2
- //# sourceMappingURL=chunk-LJ75BUDR.js.map
1
+ import{I as l}from"./chunk-QXM45TNB.js";import{C as d,aa as r,k as c,p as o,xb as n,y as s}from"./chunk-TBMJSIBB.js";var f=(()=>{class i{baseUrl=`${l.api.baseUrl}/agent-feedback`;http=d(n);listFeedback(e){let t=[];e?.type!==void 0&&e.type!==""&&t.push(`type=${encodeURIComponent(e.type)}`),e?.limit!==void 0&&t.push(`limit=${e.limit}`),e?.skip!==void 0&&t.push(`skip=${e.skip}`);let a=`${this.baseUrl}/list`,b=t.length?`${a}?${t.join("&")}`:a;return o(this.http.get(b))}deleteFeedback(e){return o(this.http.delete(`${this.baseUrl}/delete/${encodeURIComponent(e)}`))}deleteAllFeedback(){return o(this.http.delete(`${this.baseUrl}/delete-all`))}static \u0275fac=function(t){return new(t||i)};static \u0275prov=s({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var A=(()=>{class i{feedback_$=r([]);feedbackLoading_$=r(!1);feedbackLoadError_$=r(null);filterType_$=r(void 0);feedbackTotalCount_$=r(0);feedback_AS=d(f);loadFeedback(){return c(this,null,function*(){this.feedbackLoading_$.set(!0),this.feedbackLoadError_$.set(null);try{let e=this.filterType_$(),a=(yield this.feedback_AS.listFeedback({type:e})).feedback??[];this.feedback_$.set(a),e===void 0&&this.feedbackTotalCount_$.set(a.length)}catch(e){this.feedbackLoadError_$.set(e),this.feedback_$.set([])}finally{this.feedbackLoading_$.set(!1)}})}setFilterType(e){this.filterType_$.set(e),this.loadFeedback()}clearAll(){return c(this,null,function*(){try{yield this.feedback_AS.deleteAllFeedback(),this.feedbackTotalCount_$.set(0),yield this.loadFeedback()}catch(e){this.feedbackLoadError_$.set(e)}})}clearOne(e){return c(this,null,function*(){try{yield this.feedback_AS.deleteFeedback(e),this.feedback_$.update(t=>t.filter(a=>a._id!==e)),this.feedbackTotalCount_$.update(t=>Math.max(0,t-1))}catch(t){this.feedbackLoadError_$.set(t)}})}static \u0275fac=function(t){return new(t||i)};static \u0275prov=s({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();export{A as a};
2
+ //# sourceMappingURL=chunk-ZLSL5N3C.js.map
@@ -1,3 +1,3 @@
1
- import"./chunk-EGRHWZRV.js";import{a as Ve}from"./chunk-Q2PKIGLB.js";import{a as we}from"./chunk-TAHRBJO4.js";import{a as Ie,b as X}from"./chunk-DBG24LL5.js";import"./chunk-GNGMQVNJ.js";import{g as Re}from"./chunk-UT4EWNR6.js";import"./chunk-U5G7I3PM.js";import"./chunk-7JUIBZEE.js";import{a as Pe,b as Ee,c as q}from"./chunk-C7XPBJTG.js";import{b as te,f as ke,g as Ae}from"./chunk-V2FE4UOS.js";import"./chunk-WPHEQXWB.js";import{b as Me}from"./chunk-GXH7TFVW.js";import"./chunk-IUYZZJPL.js";import"./chunk-5F7AZMBN.js";import"./chunk-H4QUFYYO.js";import"./chunk-Q2NVIOCY.js";import{a as De}from"./chunk-YKD7EBRH.js";import{a as ee}from"./chunk-J32YRK3S.js";import"./chunk-SNX7UMSC.js";import"./chunk-EXMVCGPU.js";import"./chunk-IJNLP24O.js";import"./chunk-V3VQWJQL.js";import"./chunk-I2YW2Q64.js";import"./chunk-ADOCMVHI.js";import"./chunk-ZBTWQZNB.js";import"./chunk-FLAJXIYW.js";import{b as ve,c as N,f as W,i as B,n as z,o as j,p as H,v as Se}from"./chunk-EO4DNTT4.js";import{k as Te}from"./chunk-2VC36Y3F.js";import{a as V}from"./chunk-5UPNU54P.js";import{j as ye}from"./chunk-ODUTF4DP.js";import{I as $e}from"./chunk-QUNT2WPJ.js";import{Aa as he,Ba as me,C as x,D as I,E as se,Eb as xe,Fa as _,Fb as ge,Ga as k,Gb as U,J as m,K as u,Kb as be,L as le,M as de,Z as d,aa as l,ca as ce,da as M,ga as f,ha as _e,hb as b,ia as R,jb as ue,k as C,la as y,na as P,oa as S,p as v,pa as $,q as re,qa as r,ra as s,sa as w,ua as E,ub as fe,va as h,wa as c,xb as Ce,y as F,z as ae,za as pe}from"./chunk-TBMJSIBB.js";var Q="ccap-consultant",T=class{static savePanelOpen(a,e){V.writeBoolean(`${Q}:panelOpen:${a}`,e)}static loadPanelOpen(a,e){return V.readBoolean(`${Q}:panelOpen:${a}`,e)}static savePanelWidth(a,e){V.writeNumber(`${Q}:panelWidth:${a}`,e)}static loadPanelWidth(a,e){return V.readNumber(`${Q}:panelWidth:${a}`,e)}};var Oe=(()=>{class i{baseUrl=`${$e.api.baseUrl}/consultant`;http=x(Ce);listThreads(){return v(this.http.get(this.baseUrl))}getPickerOptions(){return v(this.http.get(`${this.baseUrl}/picker-options`))}createThread(e){return v(this.http.post(this.baseUrl,e))}getThread(e){return v(this.http.get(`${this.baseUrl}/${encodeURIComponent(e)}`))}patchThread(e){let t={};return e.label!=null&&(t.label=e.label),e.providerInstanceId!=null&&(t.providerInstanceId=e.providerInstanceId),e.model!=null&&(t.model=e.model),v(this.http.patch(`${this.baseUrl}/${encodeURIComponent(e.threadId)}`,t))}deleteThread(e){return v(this.http.delete(`${this.baseUrl}/${encodeURIComponent(e)}`))}postMessage(e){return v(this.http.post(`${this.baseUrl}/${encodeURIComponent(e.threadId)}/messages`,{text:e.text,allowWebSearch:e.allowWebSearch,attachments:e.attachments}))}static \u0275fac=function(t){return new(t||i)};static \u0275prov=F({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var G=(()=>{class i{consultant_AS=x(Oe);globalError_CS=x(ye);threads_$=l([]);threadsLoading_$=l(!1);threadsError_$=l(null);selectedThread_$=l(null);selectedThreadLoading_$=l(!1);selectedThreadError_$=l(null);sending_$=l(!1);activeThreadId_$=l("");defaults_$=l({providerInstanceId:"",model:""});pickerOptions_$=l([]);pickerOptionsLoading_$=l(!1);loadPickerOptions(){return C(this,null,function*(){this.pickerOptionsLoading_$.set(!0);try{let e=yield this.consultant_AS.getPickerOptions(),t=Array.isArray(e.entries)?e.entries.map(i.parseRegistryEntry).filter(n=>n!==null):[];this.pickerOptions_$.set(t),this.defaults_$.set({providerInstanceId:typeof e.defaults?.providerInstanceId=="string"?e.defaults.providerInstanceId:"",model:typeof e.defaults?.model=="string"?e.defaults.model:""})}catch(e){this.globalError_CS.showError(e,"Consultant_DataService.loadPickerOptions")}finally{this.pickerOptionsLoading_$.set(!1)}})}loadThreads(){return C(this,null,function*(){this.threadsLoading_$.set(!0),this.threadsError_$.set(null);try{let e=yield this.consultant_AS.listThreads(),n=(Array.isArray(e.threads)?e.threads:[]).map(o=>({threadId:typeof o.threadId=="string"?o.threadId:"",label:typeof o.label=="string"?o.label:"",providerInstanceId:typeof o.providerInstanceId=="string"?o.providerInstanceId:"",model:typeof o.model=="string"?o.model:"",messageCount:typeof o.messageCount=="number"?o.messageCount:0,updatedAt:typeof o.updatedAt=="string"?o.updatedAt:""}));this.threads_$.set(n)}catch(e){this.threadsError_$.set(e),this.globalError_CS.showError(e,"Consultant_DataService.loadThreads")}finally{this.threadsLoading_$.set(!1)}})}loadThreadDetail(e){return C(this,null,function*(){this.activeThreadId_$.set(e),this.selectedThreadLoading_$.set(!0),this.selectedThreadError_$.set(null);try{let t=yield this.consultant_AS.getThread(e),n=i.parseThreadDetail(t.thread);this.selectedThread_$.set(n)}catch(t){this.selectedThreadError_$.set(t),this.globalError_CS.showError(t,"Consultant_DataService.loadThreadDetail")}finally{this.selectedThreadLoading_$.set(!1)}})}sendMessage(e){return C(this,null,function*(){this.sending_$.set(!0);try{let n=(yield this.consultant_AS.postMessage(e)).thread;if(i.isPlainRecord(n)){let o=i.parseThreadDetail(n);this.selectedThread_$.set(o)}yield this.loadThreads()}catch(t){throw this.globalError_CS.showError(t,"Consultant_DataService.sendMessage"),t}finally{this.sending_$.set(!1)}})}updateThreadConfig(e){return C(this,null,function*(){try{let t=yield this.consultant_AS.patchThread(e),n=i.parseThreadDetail(t.thread);this.selectedThread_$.set(n),yield this.loadThreads()}catch(t){throw this.globalError_CS.showError(t,"Consultant_DataService.updateThreadConfig"),t}})}createThread(e){return C(this,null,function*(){try{let n=(yield this.consultant_AS.createThread(e)).thread.threadId,o=typeof n=="string"?n:"";return yield this.loadThreads(),o}catch(t){throw this.globalError_CS.showError(t,"Consultant_DataService.createThread"),t}})}deleteThread(e){return C(this,null,function*(){try{yield this.consultant_AS.deleteThread(e),this.activeThreadId_$()===e&&(this.selectedThread_$.set(null),this.activeThreadId_$.set("")),yield this.loadThreads()}catch(t){throw this.globalError_CS.showError(t,"Consultant_DataService.deleteThread"),t}})}static parseThreadDetail(e){let t=typeof e.threadId=="string"?e.threadId:"";if(!t.length)return null;let n=e.messages,o=[];if(Array.isArray(n))for(let p of n){if(!i.isPlainRecord(p))continue;let A=typeof p.id=="string"?p.id:"",Y=p.role;if(Y!=="user"&&Y!=="assistant")continue;let L={id:A,role:Y};typeof p.rawUserText=="string"&&(L.rawUserText=p.rawUserText),typeof p.content=="string"&&(L.content=p.content);let ie=p.userParts;if(Array.isArray(ie)){let oe=[];for(let D of ie){if(!i.isPlainRecord(D))continue;let J=D.type;if(J!=="text"&&J!=="image_url")continue;let Z={type:J};typeof D.text=="string"&&(Z.text=D.text),typeof D.imageUrl=="string"&&(Z.imageUrl=D.imageUrl),oe.push(Z)}L.userParts=oe}o.push(L)}return{threadId:t,label:typeof e.label=="string"?e.label:"",providerInstanceId:typeof e.providerInstanceId=="string"?e.providerInstanceId:"",model:typeof e.model=="string"?e.model:"",messages:o,updatedAt:typeof e.updatedAt=="string"?e.updatedAt:""}}static isPlainRecord(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}static parseRegistryEntry(e){if(!i.isPlainRecord(e))return null;let t=typeof e.provider=="string"?e.provider:"",n=typeof e.modelName=="string"?e.modelName:"";if(!t.length||!n.length)return null;let o=e.capabilities,p=Array.isArray(o)?o.filter(A=>typeof A=="string"):void 0;return{id:typeof e.id=="string"?e.id:"",provider:t,modelName:n,enabled:e.enabled===!0,capabilities:p}}static \u0275fac=function(t){return new(t||i)};static \u0275prov=F({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var g=class{static collectSortedProviders(a){let e=new Set;for(let t of a){let n=t.provider.trim();n.length>0&&e.add(n)}return[...e].sort()}static collectSortedModelsForProvider(a,e){let t=e.trim();if(!t.length)return[];let n=[];for(let o of a){let p=o.modelName.trim();o.provider===t&&p.length>0&&n.push(p)}return[...new Set(n)].sort()}};var ze=(i,a)=>a.id;function je(i,a){i&1&&(r(0,"div",5),_(1,"Loading..."),s())}function He(i,a){if(i&1){let e=E();r(0,"app-s-session-info-card",9),h("selected",function(n){m(e);let o=c(2);return u(o.handleSelectThread(n))})("contextMenu",function(n){m(e);let o=c(2);return u(o.handleRowContextMenu(n))}),s()}if(i&2){let e=a.$implicit,t=c(2);f("view",e)("isActive",t.consultant_DS.activeThreadId_$()===e.id)}}function Xe(i,a){if(i&1&&S(0,He,1,2,"app-s-session-info-card",8,ze),i&2){let e=c();$(e.threadRowViews_$())}}function qe(i,a){i&1&&(r(0,"div",6),_(1,"No threads"),s())}function Qe(i,a){if(i&1&&(r(0,"option",16),_(1),s()),i&2){let e=a.$implicit,t=c(2);f("value",e),d(),k(t.providerDisplayLabelsMap_$()[e]||e)}}function Ge(i,a){if(i&1&&(r(0,"option",16),_(1),s()),i&2){let e=a.$implicit;f("value",e),d(),k(e)}}function Ke(i,a){if(i&1){let e=E();r(0,"div",10),h("click",function(){m(e);let n=c();return u(n.handleCloseCreate())}),r(1,"div",11),h("click",function(n){return m(e),u(n.stopPropagation())}),r(2,"h3",12),_(3,"New consultant thread"),s(),r(4,"div",13)(5,"label",14),_(6,"Label (optional)"),s(),r(7,"input",15),h("ngModelChange",function(n){m(e);let o=c();return u(o.newLabel_$.set(n))}),s(),r(8,"label",14),_(9,"Provider"),s(),r(10,"select",15),h("ngModelChange",function(n){m(e);let o=c();return u(o.handleProviderChange(n))}),S(11,Qe,2,2,"option",16,P),s(),r(13,"label",14),_(14,"Model"),s(),r(15,"select",15),h("ngModelChange",function(n){m(e);let o=c();return u(o.newModel_$.set(n))}),S(16,Ge,2,2,"option",16,P),s()(),r(18,"div",17)(19,"button",18),h("click",function(){m(e);let n=c();return u(n.handleCloseCreate())}),_(20," Cancel "),s(),r(21,"button",19),h("click",function(){m(e);let n=c();return u(n.handleCreateThread())}),_(22," Create "),s()()()()}if(i&2){let e=c();d(7),f("ngModel",e.newLabel_$()),d(3),f("ngModel",e.newProvider_$()),d(),$(e.providerOptions_$()),d(4),f("ngModel",e.newModel_$()),d(),$(e.modelsForNewProvider_$()),d(5),f("disabled",e.isCreating_$()||!e.newProvider_$().trim()||!e.newModel_$().trim())}}function Ye(i,a){if(i&1){let e=E();r(0,"div",20),h("click",function(){m(e);let n=c();return u(n.handleCloseCtxMenu())}),s(),r(1,"div",21)(2,"button",22),h("click",function(){m(e);let n=c();return u(n.handleCtxDelete())}),_(3," Delete "),s()()}if(i&2){let e=c();d(),_e("left",e.ctxMenuPos_$().x,"px")("top",e.ctxMenuPos_$().y,"px")}}var Le=(()=>{class i{consultant_DS=x(G);router=x(U);modelRegistry_DS=x(De);isCreateOpen_$=l(!1);newLabel_$=l("");newProvider_$=l("");newModel_$=l("");isCreating_$=l(!1);providerOptions_$=b(()=>g.collectSortedProviders(this.consultant_DS.pickerOptions_$()));modelsForNewProvider_$=b(()=>g.collectSortedModelsForProvider(this.consultant_DS.pickerOptions_$(),this.newProvider_$()));providerDisplayLabelsMap_$=b(()=>{let e=this.modelRegistry_DS.setupConfigForRegistry_$(),t=this.providerOptions_$(),n={};for(let o of t)n[o]==null&&(n[o]=ee.getProviderDisplayLabel(o,e));return n});threadProviderDisplayLabels_$=b(()=>{let e=this.modelRegistry_DS.setupConfigForRegistry_$(),t=new Set;for(let o of this.consultant_DS.threads_$()){let p=o.providerInstanceId.trim();p.length>0&&t.add(p)}for(let o of this.providerOptions_$())t.add(o);let n={};for(let o of t)n[o]=ee.getProviderDisplayLabel(o,e);return n});threadRowViews_$=b(()=>this.consultant_DS.threads_$().map(e=>({id:e.threadId,label:e.label||e.threadId,status:"",statusColorClass:"bg-neutral-600",isArchived:!1,lastActivityAt:e.updatedAt,isRunning:!1})));ctxMenuThread_$=l(null);ctxMenuPos_$=l({x:0,y:0});ngOnInit(){this.consultant_DS.loadThreads(),this.consultant_DS.loadPickerOptions(),this.modelRegistry_DS.loadSetupConfigForRegistry()}handleSelectThread(e){this.router.navigate(["/consultant",e])}handleOpenCreate(){return C(this,null,function*(){yield this.consultant_DS.loadPickerOptions();let e=this.consultant_DS.defaults_$(),t=this.providerOptions_$();if(e.providerInstanceId.length>0&&t.includes(e.providerInstanceId)){let n=g.collectSortedModelsForProvider(this.consultant_DS.pickerOptions_$(),e.providerInstanceId);e.model.length>0&&n.includes(e.model)?(this.newProvider_$.set(e.providerInstanceId),this.newModel_$.set(e.model)):(this.newProvider_$.set(e.providerInstanceId),this.newModel_$.set(n[0]??""))}else{let n=t[0]??"";this.newProvider_$.set(n);let o=g.collectSortedModelsForProvider(this.consultant_DS.pickerOptions_$(),n);this.newModel_$.set(o[0]??"")}this.newLabel_$.set(""),this.isCreateOpen_$.set(!0)})}handleCloseCreate(){this.isCreateOpen_$.set(!1)}handleProviderChange(e){this.newProvider_$.set(e);let t=g.collectSortedModelsForProvider(this.consultant_DS.pickerOptions_$(),e);this.newModel_$.set(t[0]??"")}handleCreateThread(){return C(this,null,function*(){let e=this.newProvider_$().trim(),t=this.newModel_$().trim();if(!(!e.length||!t.length)){this.isCreating_$.set(!0);try{let n=this.newLabel_$().trim(),o=yield this.consultant_DS.createThread({label:n.length>0?n:void 0,providerInstanceId:e,model:t});this.isCreateOpen_$.set(!1),o.length>0&&this.router.navigate(["/consultant",o])}finally{this.isCreating_$.set(!1)}}})}handleRowContextMenu(e){let t=this.consultant_DS.threads_$().find(n=>n.threadId===e.id);t&&(this.ctxMenuThread_$.set(t),this.ctxMenuPos_$.set({x:e.event.clientX,y:e.event.clientY}))}handleCloseCtxMenu(){this.ctxMenuThread_$.set(null)}handleCtxDelete(){return C(this,null,function*(){let e=this.ctxMenuThread_$();if(e){this.handleCloseCtxMenu();try{yield this.consultant_DS.deleteThread(e.threadId),this.router.navigate(["/consultant"])}catch{}}})}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=I({type:i,selectors:[["app-ccap-consultant-dashboard"]],hostAttrs:[1,"flex","flex-col","flex-1","min-h-0","overflow-hidden"],decls:12,vars:3,consts:[[1,"flex","flex-col","flex-1","min-h-0"],[1,"shrink-0","p-2","border-b","border-neonDefault","flex","items-center","gap-2"],[1,"text-xs","font-semibold","text-neutral-300","flex-1","truncate"],["type","button",1,"px-2","py-1","text-xs","border","border-neonDefault","text-neutral-300","hover:bg-neutral-700","rounded","transition-colors",3,"click"],[1,"flex-1","overflow-y-auto"],[1,"p-3","text-xs","text-neutral-500"],[1,"p-4","text-center","text-neutral-500","text-xs"],[1,"fixed","inset-0","z-40","flex","items-center","justify-center","bg-black/60","p-4"],[3,"view","isActive"],[3,"selected","contextMenu","view","isActive"],[1,"fixed","inset-0","z-40","flex","items-center","justify-center","bg-black/60","p-4",3,"click"],[1,"w-full","max-w-md","rounded-lg","border","border-neonDefault","bg-neutral-900","p-4","shadow-xl",3,"click"],[1,"text-sm","font-semibold","text-neutral-200","mb-3"],[1,"flex","flex-col","gap-2","text-xs"],[1,"text-neutral-400"],[1,"w-full","px-2","py-1","rounded","bg-neutral-800","border","border-neutral-600","text-neutral-200",3,"ngModelChange","ngModel"],[3,"value"],[1,"flex","justify-end","gap-2","mt-4"],["type","button",1,"px-2","py-1","text-xs","border","border-neutral-600","text-neutral-400","rounded",3,"click"],["type","button",1,"px-2","py-1","text-xs","border","border-neonDefault","text-neutral-200","rounded","disabled:opacity-40",3,"click","disabled"],[1,"fixed","inset-0","z-40",3,"click"],[1,"fixed","z-50","min-w-[140px]","bg-neutral-900","border","border-neutral-700","rounded-lg","shadow-xl","py-1","text-xs"],[1,"w-full","text-left","px-3","py-1.5","text-red-400","hover:bg-red-500/10","transition-colors",3,"click"]],template:function(t,n){if(t&1&&(r(0,"div",0)(1,"div",1)(2,"span",2),_(3,"Consultant"),s(),r(4,"button",3),h("click",function(){return n.handleOpenCreate()}),_(5," + New "),s()(),r(6,"div",4),M(7,je,2,0,"div",5)(8,Xe,2,0)(9,qe,2,0,"div",6),s()(),M(10,Ke,23,4,"div",7)(11,Ye,4,4)),t&2){let o;d(7),y(n.consultant_DS.threadsLoading_$()?7:n.threadRowViews_$().length?8:9),d(3),y(n.isCreateOpen_$()?10:-1),d(),y((o=n.ctxMenuThread_$())?11:-1,o)}},dependencies:[j,H,N,z,W,B,Me],encapsulation:2})}return i})();var We=(()=>{class i{sidebarWidth_$=l(320);isSidebarOpen_$=l(!0);isResizing_$=l(!1);ngOnInit(){let e=T.loadPanelWidth("sidebar",320);this.sidebarWidth_$.set(Math.max(200,Math.min(600,e))),this.isSidebarOpen_$.set(T.loadPanelOpen("sidebar",!0))}handleSidebarResizeStart(e){let t=e.clientX,n=this.sidebarWidth_$();this.isResizing_$.set(!0),Ve.attachUntilPointerUp({startEvent:e,onMove:o=>{let p=o.clientX-t,A=Math.max(200,Math.min(600,n+p));this.sidebarWidth_$.set(A)},onEnd:()=>{this.isResizing_$.set(!1),T.savePanelWidth("sidebar",this.sidebarWidth_$())}})}handleToggleSidebar(){this.isSidebarOpen_$.update(e=>!e),T.savePanelOpen("sidebar",this.isSidebarOpen_$())}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=I({type:i,selectors:[["app-ccap-consultant-shell"]],hostAttrs:[1,"flex","min-h-0","w-full","flex-1","flex-col","overflow-hidden"],decls:14,vars:9,consts:[[1,"flex","min-h-0","w-full","flex-1","flex-col","overflow-hidden"],["sSessionToolbarLeft","",1,"flex","items-center","gap-1","min-w-0"],["type","button",1,"px-2","py-1","text-xs","border","border-neonDefault","text-neutral-300","hover:bg-neutral-700","rounded","transition-colors","flex","items-center","gap-1","shrink-0",3,"click"],["viewBox","0 0 24 24","fill","none","stroke","currentColor","stroke-width","2","stroke-linecap","round","stroke-linejoin","round",1,"w-3","h-3","shrink-0","transition-transform","duration-150"],["points","6 9 12 15 18 9"],["sSessionToolbarCenter","",1,"min-w-0"],["sSessionToolbarRight","",1,"min-w-0"],[3,"sidebarResizeStart","isSidebarOpen","sidebarWidthPx","isResizing"],["sSessionShellSidebar","",1,"flex","flex-col","overflow-hidden","h-full"],["sSessionShellMain","",1,"flex","min-h-0","flex-1","flex-col","overflow-hidden","[&>router-outlet]:contents"]],template:function(t,n){t&1&&(r(0,"div",0)(1,"app-s-session-shell-toolbar")(2,"div",1)(3,"button",2),h("click",function(){return n.handleToggleSidebar()}),le(),r(4,"svg",3),w(5,"polyline",4),s(),_(6," Consultant "),s()(),de(),w(7,"div",5)(8,"div",6),s(),r(9,"app-s-resizable-session-shell-layout",7),h("sidebarResizeStart",function(p){return n.handleSidebarResizeStart(p)}),r(10,"div",8),w(11,"app-ccap-consultant-dashboard"),s(),r(12,"div",9),w(13,"router-outlet"),s()()()),t&2&&(R("select-none",n.isResizing_$()),d(4),R("rotate-90",n.isSidebarOpen_$())("-rotate-90",!n.isSidebarOpen_$()),d(5),f("isSidebarOpen",n.isSidebarOpen_$())("sidebarWidthPx",n.sidebarWidth_$())("isResizing",n.isResizing_$()))},dependencies:[ge,Pe,Ee,Le],encapsulation:2})}return i})();var K=class i{static fromMessage(a){let e=a.role==="user",t=e?i.buildUserBodyText(a):a.content??"";return{listKey:a.id,kind:e?te.userPrompt:te.assistant,bodyText:t,isUserAligned:e,flags:{showCopy:!0,showRawInfo:!1,useEditDiffForExpandable:!1}}}static buildUserBodyText(a){let e=(a.rawUserText??"").trim();return(a.userParts?.length??0)>1?e.length>0?`${e}
1
+ import"./chunk-EGRHWZRV.js";import{a as Ve}from"./chunk-Q2PKIGLB.js";import{a as we}from"./chunk-MANX3UTJ.js";import{a as Ie,b as X}from"./chunk-NAHXFBXE.js";import"./chunk-UOOILECA.js";import{g as Re}from"./chunk-NK4RLW4D.js";import"./chunk-Q4Z4WTJ3.js";import"./chunk-7JUIBZEE.js";import{a as Pe,b as Ee,c as q}from"./chunk-C7XPBJTG.js";import{b as te,f as ke,g as Ae}from"./chunk-WJTUNKFF.js";import"./chunk-WPHEQXWB.js";import{b as Me}from"./chunk-WWJB3AHB.js";import"./chunk-TDVYMNCA.js";import"./chunk-34ASVWQQ.js";import"./chunk-3EWLYCQY.js";import"./chunk-Q2NVIOCY.js";import{a as De}from"./chunk-IRCYROGT.js";import{a as ee}from"./chunk-J32YRK3S.js";import"./chunk-SC33BNLI.js";import"./chunk-OZHMTJQJ.js";import"./chunk-BSZUQJTF.js";import"./chunk-V3VQWJQL.js";import"./chunk-UCATC7Y7.js";import"./chunk-4EPTK7TX.js";import"./chunk-ZBTWQZNB.js";import"./chunk-FLAJXIYW.js";import{b as ve,c as N,f as W,i as B,n as z,o as j,p as H,v as Se}from"./chunk-EO4DNTT4.js";import{k as Te}from"./chunk-TCJ6WHLQ.js";import{a as V}from"./chunk-5UPNU54P.js";import{j as ye}from"./chunk-XEGOHOPX.js";import{I as $e}from"./chunk-QXM45TNB.js";import{Aa as he,Ba as me,C as x,D as I,E as se,Eb as xe,Fa as _,Fb as ge,Ga as k,Gb as U,J as m,K as u,Kb as be,L as le,M as de,Z as d,aa as l,ca as ce,da as M,ga as f,ha as _e,hb as b,ia as R,jb as ue,k as C,la as y,na as P,oa as S,p as v,pa as $,q as re,qa as r,ra as s,sa as w,ua as E,ub as fe,va as h,wa as c,xb as Ce,y as F,z as ae,za as pe}from"./chunk-TBMJSIBB.js";var Q="ccap-consultant",T=class{static savePanelOpen(a,e){V.writeBoolean(`${Q}:panelOpen:${a}`,e)}static loadPanelOpen(a,e){return V.readBoolean(`${Q}:panelOpen:${a}`,e)}static savePanelWidth(a,e){V.writeNumber(`${Q}:panelWidth:${a}`,e)}static loadPanelWidth(a,e){return V.readNumber(`${Q}:panelWidth:${a}`,e)}};var Oe=(()=>{class i{baseUrl=`${$e.api.baseUrl}/consultant`;http=x(Ce);listThreads(){return v(this.http.get(this.baseUrl))}getPickerOptions(){return v(this.http.get(`${this.baseUrl}/picker-options`))}createThread(e){return v(this.http.post(this.baseUrl,e))}getThread(e){return v(this.http.get(`${this.baseUrl}/${encodeURIComponent(e)}`))}patchThread(e){let t={};return e.label!=null&&(t.label=e.label),e.providerInstanceId!=null&&(t.providerInstanceId=e.providerInstanceId),e.model!=null&&(t.model=e.model),v(this.http.patch(`${this.baseUrl}/${encodeURIComponent(e.threadId)}`,t))}deleteThread(e){return v(this.http.delete(`${this.baseUrl}/${encodeURIComponent(e)}`))}postMessage(e){return v(this.http.post(`${this.baseUrl}/${encodeURIComponent(e.threadId)}/messages`,{text:e.text,allowWebSearch:e.allowWebSearch,attachments:e.attachments}))}static \u0275fac=function(t){return new(t||i)};static \u0275prov=F({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var G=(()=>{class i{consultant_AS=x(Oe);globalError_CS=x(ye);threads_$=l([]);threadsLoading_$=l(!1);threadsError_$=l(null);selectedThread_$=l(null);selectedThreadLoading_$=l(!1);selectedThreadError_$=l(null);sending_$=l(!1);activeThreadId_$=l("");defaults_$=l({providerInstanceId:"",model:""});pickerOptions_$=l([]);pickerOptionsLoading_$=l(!1);loadPickerOptions(){return C(this,null,function*(){this.pickerOptionsLoading_$.set(!0);try{let e=yield this.consultant_AS.getPickerOptions(),t=Array.isArray(e.entries)?e.entries.map(i.parseRegistryEntry).filter(n=>n!==null):[];this.pickerOptions_$.set(t),this.defaults_$.set({providerInstanceId:typeof e.defaults?.providerInstanceId=="string"?e.defaults.providerInstanceId:"",model:typeof e.defaults?.model=="string"?e.defaults.model:""})}catch(e){this.globalError_CS.showError(e,"Consultant_DataService.loadPickerOptions")}finally{this.pickerOptionsLoading_$.set(!1)}})}loadThreads(){return C(this,null,function*(){this.threadsLoading_$.set(!0),this.threadsError_$.set(null);try{let e=yield this.consultant_AS.listThreads(),n=(Array.isArray(e.threads)?e.threads:[]).map(o=>({threadId:typeof o.threadId=="string"?o.threadId:"",label:typeof o.label=="string"?o.label:"",providerInstanceId:typeof o.providerInstanceId=="string"?o.providerInstanceId:"",model:typeof o.model=="string"?o.model:"",messageCount:typeof o.messageCount=="number"?o.messageCount:0,updatedAt:typeof o.updatedAt=="string"?o.updatedAt:""}));this.threads_$.set(n)}catch(e){this.threadsError_$.set(e),this.globalError_CS.showError(e,"Consultant_DataService.loadThreads")}finally{this.threadsLoading_$.set(!1)}})}loadThreadDetail(e){return C(this,null,function*(){this.activeThreadId_$.set(e),this.selectedThreadLoading_$.set(!0),this.selectedThreadError_$.set(null);try{let t=yield this.consultant_AS.getThread(e),n=i.parseThreadDetail(t.thread);this.selectedThread_$.set(n)}catch(t){this.selectedThreadError_$.set(t),this.globalError_CS.showError(t,"Consultant_DataService.loadThreadDetail")}finally{this.selectedThreadLoading_$.set(!1)}})}sendMessage(e){return C(this,null,function*(){this.sending_$.set(!0);try{let n=(yield this.consultant_AS.postMessage(e)).thread;if(i.isPlainRecord(n)){let o=i.parseThreadDetail(n);this.selectedThread_$.set(o)}yield this.loadThreads()}catch(t){throw this.globalError_CS.showError(t,"Consultant_DataService.sendMessage"),t}finally{this.sending_$.set(!1)}})}updateThreadConfig(e){return C(this,null,function*(){try{let t=yield this.consultant_AS.patchThread(e),n=i.parseThreadDetail(t.thread);this.selectedThread_$.set(n),yield this.loadThreads()}catch(t){throw this.globalError_CS.showError(t,"Consultant_DataService.updateThreadConfig"),t}})}createThread(e){return C(this,null,function*(){try{let n=(yield this.consultant_AS.createThread(e)).thread.threadId,o=typeof n=="string"?n:"";return yield this.loadThreads(),o}catch(t){throw this.globalError_CS.showError(t,"Consultant_DataService.createThread"),t}})}deleteThread(e){return C(this,null,function*(){try{yield this.consultant_AS.deleteThread(e),this.activeThreadId_$()===e&&(this.selectedThread_$.set(null),this.activeThreadId_$.set("")),yield this.loadThreads()}catch(t){throw this.globalError_CS.showError(t,"Consultant_DataService.deleteThread"),t}})}static parseThreadDetail(e){let t=typeof e.threadId=="string"?e.threadId:"";if(!t.length)return null;let n=e.messages,o=[];if(Array.isArray(n))for(let p of n){if(!i.isPlainRecord(p))continue;let A=typeof p.id=="string"?p.id:"",Y=p.role;if(Y!=="user"&&Y!=="assistant")continue;let L={id:A,role:Y};typeof p.rawUserText=="string"&&(L.rawUserText=p.rawUserText),typeof p.content=="string"&&(L.content=p.content);let ie=p.userParts;if(Array.isArray(ie)){let oe=[];for(let D of ie){if(!i.isPlainRecord(D))continue;let J=D.type;if(J!=="text"&&J!=="image_url")continue;let Z={type:J};typeof D.text=="string"&&(Z.text=D.text),typeof D.imageUrl=="string"&&(Z.imageUrl=D.imageUrl),oe.push(Z)}L.userParts=oe}o.push(L)}return{threadId:t,label:typeof e.label=="string"?e.label:"",providerInstanceId:typeof e.providerInstanceId=="string"?e.providerInstanceId:"",model:typeof e.model=="string"?e.model:"",messages:o,updatedAt:typeof e.updatedAt=="string"?e.updatedAt:""}}static isPlainRecord(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}static parseRegistryEntry(e){if(!i.isPlainRecord(e))return null;let t=typeof e.provider=="string"?e.provider:"",n=typeof e.modelName=="string"?e.modelName:"";if(!t.length||!n.length)return null;let o=e.capabilities,p=Array.isArray(o)?o.filter(A=>typeof A=="string"):void 0;return{id:typeof e.id=="string"?e.id:"",provider:t,modelName:n,enabled:e.enabled===!0,capabilities:p}}static \u0275fac=function(t){return new(t||i)};static \u0275prov=F({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var g=class{static collectSortedProviders(a){let e=new Set;for(let t of a){let n=t.provider.trim();n.length>0&&e.add(n)}return[...e].sort()}static collectSortedModelsForProvider(a,e){let t=e.trim();if(!t.length)return[];let n=[];for(let o of a){let p=o.modelName.trim();o.provider===t&&p.length>0&&n.push(p)}return[...new Set(n)].sort()}};var ze=(i,a)=>a.id;function je(i,a){i&1&&(r(0,"div",5),_(1,"Loading..."),s())}function He(i,a){if(i&1){let e=E();r(0,"app-s-session-info-card",9),h("selected",function(n){m(e);let o=c(2);return u(o.handleSelectThread(n))})("contextMenu",function(n){m(e);let o=c(2);return u(o.handleRowContextMenu(n))}),s()}if(i&2){let e=a.$implicit,t=c(2);f("view",e)("isActive",t.consultant_DS.activeThreadId_$()===e.id)}}function Xe(i,a){if(i&1&&S(0,He,1,2,"app-s-session-info-card",8,ze),i&2){let e=c();$(e.threadRowViews_$())}}function qe(i,a){i&1&&(r(0,"div",6),_(1,"No threads"),s())}function Qe(i,a){if(i&1&&(r(0,"option",16),_(1),s()),i&2){let e=a.$implicit,t=c(2);f("value",e),d(),k(t.providerDisplayLabelsMap_$()[e]||e)}}function Ge(i,a){if(i&1&&(r(0,"option",16),_(1),s()),i&2){let e=a.$implicit;f("value",e),d(),k(e)}}function Ke(i,a){if(i&1){let e=E();r(0,"div",10),h("click",function(){m(e);let n=c();return u(n.handleCloseCreate())}),r(1,"div",11),h("click",function(n){return m(e),u(n.stopPropagation())}),r(2,"h3",12),_(3,"New consultant thread"),s(),r(4,"div",13)(5,"label",14),_(6,"Label (optional)"),s(),r(7,"input",15),h("ngModelChange",function(n){m(e);let o=c();return u(o.newLabel_$.set(n))}),s(),r(8,"label",14),_(9,"Provider"),s(),r(10,"select",15),h("ngModelChange",function(n){m(e);let o=c();return u(o.handleProviderChange(n))}),S(11,Qe,2,2,"option",16,P),s(),r(13,"label",14),_(14,"Model"),s(),r(15,"select",15),h("ngModelChange",function(n){m(e);let o=c();return u(o.newModel_$.set(n))}),S(16,Ge,2,2,"option",16,P),s()(),r(18,"div",17)(19,"button",18),h("click",function(){m(e);let n=c();return u(n.handleCloseCreate())}),_(20," Cancel "),s(),r(21,"button",19),h("click",function(){m(e);let n=c();return u(n.handleCreateThread())}),_(22," Create "),s()()()()}if(i&2){let e=c();d(7),f("ngModel",e.newLabel_$()),d(3),f("ngModel",e.newProvider_$()),d(),$(e.providerOptions_$()),d(4),f("ngModel",e.newModel_$()),d(),$(e.modelsForNewProvider_$()),d(5),f("disabled",e.isCreating_$()||!e.newProvider_$().trim()||!e.newModel_$().trim())}}function Ye(i,a){if(i&1){let e=E();r(0,"div",20),h("click",function(){m(e);let n=c();return u(n.handleCloseCtxMenu())}),s(),r(1,"div",21)(2,"button",22),h("click",function(){m(e);let n=c();return u(n.handleCtxDelete())}),_(3," Delete "),s()()}if(i&2){let e=c();d(),_e("left",e.ctxMenuPos_$().x,"px")("top",e.ctxMenuPos_$().y,"px")}}var Le=(()=>{class i{consultant_DS=x(G);router=x(U);modelRegistry_DS=x(De);isCreateOpen_$=l(!1);newLabel_$=l("");newProvider_$=l("");newModel_$=l("");isCreating_$=l(!1);providerOptions_$=b(()=>g.collectSortedProviders(this.consultant_DS.pickerOptions_$()));modelsForNewProvider_$=b(()=>g.collectSortedModelsForProvider(this.consultant_DS.pickerOptions_$(),this.newProvider_$()));providerDisplayLabelsMap_$=b(()=>{let e=this.modelRegistry_DS.setupConfigForRegistry_$(),t=this.providerOptions_$(),n={};for(let o of t)n[o]==null&&(n[o]=ee.getProviderDisplayLabel(o,e));return n});threadProviderDisplayLabels_$=b(()=>{let e=this.modelRegistry_DS.setupConfigForRegistry_$(),t=new Set;for(let o of this.consultant_DS.threads_$()){let p=o.providerInstanceId.trim();p.length>0&&t.add(p)}for(let o of this.providerOptions_$())t.add(o);let n={};for(let o of t)n[o]=ee.getProviderDisplayLabel(o,e);return n});threadRowViews_$=b(()=>this.consultant_DS.threads_$().map(e=>({id:e.threadId,label:e.label||e.threadId,status:"",statusColorClass:"bg-neutral-600",isArchived:!1,lastActivityAt:e.updatedAt,isRunning:!1})));ctxMenuThread_$=l(null);ctxMenuPos_$=l({x:0,y:0});ngOnInit(){this.consultant_DS.loadThreads(),this.consultant_DS.loadPickerOptions(),this.modelRegistry_DS.loadSetupConfigForRegistry()}handleSelectThread(e){this.router.navigate(["/consultant",e])}handleOpenCreate(){return C(this,null,function*(){yield this.consultant_DS.loadPickerOptions();let e=this.consultant_DS.defaults_$(),t=this.providerOptions_$();if(e.providerInstanceId.length>0&&t.includes(e.providerInstanceId)){let n=g.collectSortedModelsForProvider(this.consultant_DS.pickerOptions_$(),e.providerInstanceId);e.model.length>0&&n.includes(e.model)?(this.newProvider_$.set(e.providerInstanceId),this.newModel_$.set(e.model)):(this.newProvider_$.set(e.providerInstanceId),this.newModel_$.set(n[0]??""))}else{let n=t[0]??"";this.newProvider_$.set(n);let o=g.collectSortedModelsForProvider(this.consultant_DS.pickerOptions_$(),n);this.newModel_$.set(o[0]??"")}this.newLabel_$.set(""),this.isCreateOpen_$.set(!0)})}handleCloseCreate(){this.isCreateOpen_$.set(!1)}handleProviderChange(e){this.newProvider_$.set(e);let t=g.collectSortedModelsForProvider(this.consultant_DS.pickerOptions_$(),e);this.newModel_$.set(t[0]??"")}handleCreateThread(){return C(this,null,function*(){let e=this.newProvider_$().trim(),t=this.newModel_$().trim();if(!(!e.length||!t.length)){this.isCreating_$.set(!0);try{let n=this.newLabel_$().trim(),o=yield this.consultant_DS.createThread({label:n.length>0?n:void 0,providerInstanceId:e,model:t});this.isCreateOpen_$.set(!1),o.length>0&&this.router.navigate(["/consultant",o])}finally{this.isCreating_$.set(!1)}}})}handleRowContextMenu(e){let t=this.consultant_DS.threads_$().find(n=>n.threadId===e.id);t&&(this.ctxMenuThread_$.set(t),this.ctxMenuPos_$.set({x:e.event.clientX,y:e.event.clientY}))}handleCloseCtxMenu(){this.ctxMenuThread_$.set(null)}handleCtxDelete(){return C(this,null,function*(){let e=this.ctxMenuThread_$();if(e){this.handleCloseCtxMenu();try{yield this.consultant_DS.deleteThread(e.threadId),this.router.navigate(["/consultant"])}catch{}}})}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=I({type:i,selectors:[["app-ccap-consultant-dashboard"]],hostAttrs:[1,"flex","flex-col","flex-1","min-h-0","overflow-hidden"],decls:12,vars:3,consts:[[1,"flex","flex-col","flex-1","min-h-0"],[1,"shrink-0","p-2","border-b","border-neonDefault","flex","items-center","gap-2"],[1,"text-xs","font-semibold","text-neutral-300","flex-1","truncate"],["type","button",1,"px-2","py-1","text-xs","border","border-neonDefault","text-neutral-300","hover:bg-neutral-700","rounded","transition-colors",3,"click"],[1,"flex-1","overflow-y-auto"],[1,"p-3","text-xs","text-neutral-500"],[1,"p-4","text-center","text-neutral-500","text-xs"],[1,"fixed","inset-0","z-40","flex","items-center","justify-center","bg-black/60","p-4"],[3,"view","isActive"],[3,"selected","contextMenu","view","isActive"],[1,"fixed","inset-0","z-40","flex","items-center","justify-center","bg-black/60","p-4",3,"click"],[1,"w-full","max-w-md","rounded-lg","border","border-neonDefault","bg-neutral-900","p-4","shadow-xl",3,"click"],[1,"text-sm","font-semibold","text-neutral-200","mb-3"],[1,"flex","flex-col","gap-2","text-xs"],[1,"text-neutral-400"],[1,"w-full","px-2","py-1","rounded","bg-neutral-800","border","border-neutral-600","text-neutral-200",3,"ngModelChange","ngModel"],[3,"value"],[1,"flex","justify-end","gap-2","mt-4"],["type","button",1,"px-2","py-1","text-xs","border","border-neutral-600","text-neutral-400","rounded",3,"click"],["type","button",1,"px-2","py-1","text-xs","border","border-neonDefault","text-neutral-200","rounded","disabled:opacity-40",3,"click","disabled"],[1,"fixed","inset-0","z-40",3,"click"],[1,"fixed","z-50","min-w-[140px]","bg-neutral-900","border","border-neutral-700","rounded-lg","shadow-xl","py-1","text-xs"],[1,"w-full","text-left","px-3","py-1.5","text-red-400","hover:bg-red-500/10","transition-colors",3,"click"]],template:function(t,n){if(t&1&&(r(0,"div",0)(1,"div",1)(2,"span",2),_(3,"Consultant"),s(),r(4,"button",3),h("click",function(){return n.handleOpenCreate()}),_(5," + New "),s()(),r(6,"div",4),M(7,je,2,0,"div",5)(8,Xe,2,0)(9,qe,2,0,"div",6),s()(),M(10,Ke,23,4,"div",7)(11,Ye,4,4)),t&2){let o;d(7),y(n.consultant_DS.threadsLoading_$()?7:n.threadRowViews_$().length?8:9),d(3),y(n.isCreateOpen_$()?10:-1),d(),y((o=n.ctxMenuThread_$())?11:-1,o)}},dependencies:[j,H,N,z,W,B,Me],encapsulation:2})}return i})();var We=(()=>{class i{sidebarWidth_$=l(320);isSidebarOpen_$=l(!0);isResizing_$=l(!1);ngOnInit(){let e=T.loadPanelWidth("sidebar",320);this.sidebarWidth_$.set(Math.max(200,Math.min(600,e))),this.isSidebarOpen_$.set(T.loadPanelOpen("sidebar",!0))}handleSidebarResizeStart(e){let t=e.clientX,n=this.sidebarWidth_$();this.isResizing_$.set(!0),Ve.attachUntilPointerUp({startEvent:e,onMove:o=>{let p=o.clientX-t,A=Math.max(200,Math.min(600,n+p));this.sidebarWidth_$.set(A)},onEnd:()=>{this.isResizing_$.set(!1),T.savePanelWidth("sidebar",this.sidebarWidth_$())}})}handleToggleSidebar(){this.isSidebarOpen_$.update(e=>!e),T.savePanelOpen("sidebar",this.isSidebarOpen_$())}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=I({type:i,selectors:[["app-ccap-consultant-shell"]],hostAttrs:[1,"flex","min-h-0","w-full","flex-1","flex-col","overflow-hidden"],decls:14,vars:9,consts:[[1,"flex","min-h-0","w-full","flex-1","flex-col","overflow-hidden"],["sSessionToolbarLeft","",1,"flex","items-center","gap-1","min-w-0"],["type","button",1,"px-2","py-1","text-xs","border","border-neonDefault","text-neutral-300","hover:bg-neutral-700","rounded","transition-colors","flex","items-center","gap-1","shrink-0",3,"click"],["viewBox","0 0 24 24","fill","none","stroke","currentColor","stroke-width","2","stroke-linecap","round","stroke-linejoin","round",1,"w-3","h-3","shrink-0","transition-transform","duration-150"],["points","6 9 12 15 18 9"],["sSessionToolbarCenter","",1,"min-w-0"],["sSessionToolbarRight","",1,"min-w-0"],[3,"sidebarResizeStart","isSidebarOpen","sidebarWidthPx","isResizing"],["sSessionShellSidebar","",1,"flex","flex-col","overflow-hidden","h-full"],["sSessionShellMain","",1,"flex","min-h-0","flex-1","flex-col","overflow-hidden","[&>router-outlet]:contents"]],template:function(t,n){t&1&&(r(0,"div",0)(1,"app-s-session-shell-toolbar")(2,"div",1)(3,"button",2),h("click",function(){return n.handleToggleSidebar()}),le(),r(4,"svg",3),w(5,"polyline",4),s(),_(6," Consultant "),s()(),de(),w(7,"div",5)(8,"div",6),s(),r(9,"app-s-resizable-session-shell-layout",7),h("sidebarResizeStart",function(p){return n.handleSidebarResizeStart(p)}),r(10,"div",8),w(11,"app-ccap-consultant-dashboard"),s(),r(12,"div",9),w(13,"router-outlet"),s()()()),t&2&&(R("select-none",n.isResizing_$()),d(4),R("rotate-90",n.isSidebarOpen_$())("-rotate-90",!n.isSidebarOpen_$()),d(5),f("isSidebarOpen",n.isSidebarOpen_$())("sidebarWidthPx",n.sidebarWidth_$())("isResizing",n.isResizing_$()))},dependencies:[ge,Pe,Ee,Le],encapsulation:2})}return i})();var K=class i{static fromMessage(a){let e=a.role==="user",t=e?i.buildUserBodyText(a):a.content??"";return{listKey:a.id,kind:e?te.userPrompt:te.assistant,bodyText:t,isUserAligned:e,flags:{showCopy:!0,showRawInfo:!1,useEditDiffForExpandable:!1}}}static buildUserBodyText(a){let e=(a.rawUserText??"").trim();return(a.userParts?.length??0)>1?e.length>0?`${e}
2
2
  [attachments]`:"[attachments]":e.length>0?e:a.content??""}};var Ze=(i,a)=>a.listKey;function et(i,a){i&1&&(r(0,"div",0),_(1," Select a thread or create a new consultant chat. "),s())}function tt(i,a){i&1&&(r(0,"div",1),_(1,"Loading\u2026"),s())}function nt(i,a){if(i&1&&(r(0,"option",8),_(1),s()),i&2){let e=a.$implicit;f("value",e),d(),k(e)}}function it(i,a){if(i&1&&(r(0,"option",8),_(1),s()),i&2){let e=a.$implicit;f("value",e),d(),k(e)}}function ot(i,a){if(i&1&&(r(0,"div",18),w(1,"app-s-agent-console-message-bubble",19),s()),i&2){let e=a.$implicit;R("self-end",e.isUserAligned===!0)("self-start",e.isUserAligned!==!0),d(),f("view",e)}}function rt(i,a){if(i&1){let e=E();r(0,"app-s-session-chat-column-layout")(1,"div",2)(2,"div",3)(3,"div",4)(4,"span",5),_(5,"Label"),s(),r(6,"input",6),h("ngModelChange",function(n){m(e);let o=c(2);return u(o.localLabel_$.set(n))}),s()(),r(7,"div",4)(8,"span",5),_(9,"Provider"),s(),r(10,"select",7),h("ngModelChange",function(n){m(e);let o=c(2);return u(o.handleProviderChange(n))}),S(11,nt,2,2,"option",8,P),s()(),r(13,"div",4)(14,"span",5),_(15,"Model"),s(),r(16,"select",6),h("ngModelChange",function(n){m(e);let o=c(2);return u(o.localModel_$.set(n))}),S(17,it,2,2,"option",8,P),s()(),r(19,"button",9),h("click",function(){m(e);let n=c(2);return u(n.handleApplyConfig())}),_(20," Apply "),s(),r(21,"button",10),h("click",function(){m(e);let n=c(2);return u(n.handleDeleteThread())}),_(22," Delete "),s()()(),r(23,"div",11),S(24,ot,2,5,"div",12,Ze),s(),r(26,"div",13)(27,"label",14)(28,"input",15),h("ngModelChange",function(n){m(e);let o=c(2);return u(o.allowWebSearch_$.set(n))}),s(),_(29," Allow web search (Brave) "),s(),r(30,"app-s-session-input",16),h("draftTextChange",function(n){m(e);let o=c(2);return u(o.composerText_$.set(n))})("sendRequested",function(){m(e);let n=c(2);return u(n.handleSend())})("attachmentsChanged",function(n){m(e);let o=c(2);return u(o.handleAttachmentsChanged(n))}),r(31,"app-ccap-voice-record-button",17),h("transcriptSegmentReady",function(n){m(e);let o=c(2);return u(o.handleVoiceSegment(n))}),s()()()()}if(i&2){let e=c(2);d(6),f("ngModel",e.localLabel_$()),d(4),f("ngModel",e.localProvider_$()),d(),$(e.providerOptions_$()),d(5),f("ngModel",e.localModel_$()),d(),$(e.modelsForSelectedProvider_$()),d(7),$(e.consultantBubbleViews_$()),d(4),f("ngModel",e.allowWebSearch_$()),d(2),f("draftText",e.composerText_$())("isSending",e.consultant_DS.sending_$())("enableAttachments",!0)("textareaRows",3),d(),f("compactLayout",!0)}}function at(i,a){i&1&&(r(0,"div",0),_(1," Thread not loaded. "),s())}function st(i,a){if(i&1&&M(0,rt,32,9,"app-s-session-chat-column-layout")(1,at,2,0,"div",0),i&2){let e=c();y(e.consultant_DS.selectedThread_$()?0:1)}}var ne=(()=>{class i extends we{consultant_DS=x(G);route=x(xe);router=x(U);voiceInputUi_DS=x(Ie);sessionInputRef;composerText_$=l("");allowWebSearch_$=l(!1);localLabel_$=l("");localProvider_$=l("");localModel_$=l("");providerOptions_$=b(()=>g.collectSortedProviders(this.consultant_DS.pickerOptions_$()));modelsForSelectedProvider_$=b(()=>g.collectSortedModelsForProvider(this.consultant_DS.pickerOptions_$(),this.localProvider_$()));consultantBubbleViews_$=b(()=>{let e=this.consultant_DS.selectedThread_$();return e?e.messages.map(t=>K.fromMessage(t)):[]});pendingAttachments=[];constructor(){super(),this.addSubscription(this.route.paramMap.pipe(re(e=>e.get("threadId")??"")).subscribe(e=>{e.length>0?this.consultant_DS.loadThreadDetail(e):(this.consultant_DS.selectedThread_$.set(null),this.consultant_DS.activeThreadId_$.set(""))})),ue(()=>{let e=this.consultant_DS.selectedThread_$();e!=null&&(this.localLabel_$.set(e.label),this.localProvider_$.set(e.providerInstanceId),this.localModel_$.set(e.model))},{allowSignalWrites:!0}),this.consultant_DS.loadPickerOptions()}ngOnDestroy(){super.ngOnDestroy()}handleProviderChange(e){this.localProvider_$.set(e);let t=g.collectSortedModelsForProvider(this.consultant_DS.pickerOptions_$(),e),n=this.localModel_$();t.includes(n)||this.localModel_$.set(t[0]??"")}handleApplyConfig(){return C(this,null,function*(){let e=this.consultant_DS.activeThreadId_$();e.length&&(yield this.consultant_DS.updateThreadConfig({threadId:e,label:this.localLabel_$(),providerInstanceId:this.localProvider_$(),model:this.localModel_$()}))})}handleDeleteThread(){return C(this,null,function*(){let e=this.consultant_DS.activeThreadId_$();e.length&&(yield this.consultant_DS.deleteThread(e),this.router.navigate(["/consultant"]))})}handleAttachmentsChanged(e){this.pendingAttachments=e}handleVoiceSegment(e){let t=e.text.trim();if(!t.length)return;let n=this.composerText_$().trim();this.composerText_$.set(n.length>0?`${n} ${t}`:t),this.voiceInputUi_DS.autoSendAfterVoice_$()&&e.isFinal&&this.handleSend()}handleSend(){return C(this,null,function*(){let e=this.consultant_DS.activeThreadId_$();if(!e.length)return;let t=this.composerText_$().trim(),n=[...this.pendingAttachments];if(!t.length&&!n.length)return;let o=n.map(p=>({kind:p.isImage?"image":"textDocument",mimeType:p.mimeType,fileName:p.fileName,dataBase64:p.base64}));yield this.consultant_DS.sendMessage({threadId:e,text:t,allowWebSearch:this.allowWebSearch_$(),attachments:o}),this.composerText_$.set(""),this.pendingAttachments=[],this.sessionInputRef?.clearAttachments()})}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=I({type:i,selectors:[["app-ccap-consultant-detail"]],viewQuery:function(t,n){if(t&1&&pe(q,5),t&2){let o;he(o=me())&&(n.sessionInputRef=o.first)}},hostAttrs:[1,"flex","flex-col","flex-1","min-h-0","overflow-hidden"],features:[ce],decls:3,vars:1,consts:[[1,"flex","flex-1","items-center","justify-center","p-4","text-xs","text-neutral-500"],[1,"flex","flex-1","items-center","justify-center","text-xs","text-neutral-500"],["sChatColumnHeader","",1,"flex","shrink-0","flex-col","gap-2","border-b","border-neonDefault","bg-ccapSurface","p-2"],[1,"flex","flex-wrap","items-end","gap-2"],[1,"flex","flex-col","gap-0.5"],[1,"text-[10px]","text-neutral-500"],[1,"w-40","rounded","border","border-neutral-600","bg-neutral-800","px-2","py-1","text-xs","text-neutral-200",3,"ngModelChange","ngModel"],[1,"w-36","rounded","border","border-neutral-600","bg-neutral-800","px-2","py-1","text-xs","text-neutral-200",3,"ngModelChange","ngModel"],[3,"value"],["type","button",1,"rounded","border","border-neonDefault","px-2","py-1","text-xs","text-neutral-300",3,"click"],["type","button",1,"ml-auto","rounded","border","border-red-900","px-2","py-1","text-xs","text-red-300",3,"click"],["sChatColumnScroll","",1,"flex","flex-col","gap-3","p-3"],[1,"max-w-[85%]",3,"self-end","self-start"],["sChatColumnComposer","",1,"flex","flex-col"],[1,"flex","cursor-pointer","items-center","gap-2","px-2","pt-1","text-[10px]","text-neutral-400"],["type","checkbox",3,"ngModelChange","ngModel"],["acceptedFileTypes","image/png,image/jpeg,image/webp,image/gif,.txt,.md,text/plain,text/markdown","placeholder","Message\u2026",3,"draftTextChange","sendRequested","attachmentsChanged","draftText","isSending","enableAttachments","textareaRows"],["sInputTextareaAccessory","",3,"transcriptSegmentReady","compactLayout"],[1,"max-w-[85%]"],[3,"view"]],template:function(t,n){t&1&&M(0,et,2,0,"div",0)(1,tt,2,0,"div",1)(2,st,2,1),t&2&&y(n.consultant_DS.activeThreadId_$()?n.consultant_DS.selectedThreadLoading_$()?1:2:0)},dependencies:[j,H,N,ve,z,W,B,X,q,ke,Ae],encapsulation:2})}return i})();var lt=[{path:"",component:We,children:[{path:"",component:ne},{path:":threadId",component:ne}]}],xn=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=se({type:i});static \u0275inj=ae({imports:[fe,Se,be.forChild(lt),Te,X,Re]})}return i})();export{xn as Consultant_Module};
3
- //# sourceMappingURL=consultant.module-VWZJPZLC.js.map
3
+ //# sourceMappingURL=consultant.module-5G73QF4O.js.map
@@ -1,2 +1,2 @@
1
- import{a as B}from"./chunk-772D5UCV.js";import"./chunk-ADOCMVHI.js";import"./chunk-ODUTF4DP.js";import"./chunk-QUNT2WPJ.js";import{$a as A,C as v,D as b,E as S,Fa as i,G as E,Ha as c,Ia as w,Kb as D,Ta as $,Z as r,aa as h,ab as I,da as p,ga as _,hb as T,k as f,la as s,mb as k,oa as y,pa as F,qa as o,ra as n,ub as u,va as x,wa as m,z as g}from"./chunk-TBMJSIBB.js";var R={respond:"bg-green-500/20 text-green-400","status-update":"bg-blue-500/20 text-blue-400",stop:"bg-neutral-500/20 text-neutral-400","request-user-interaction":"bg-yellow-500/20 text-yellow-400"},M="bg-neutral-700/20 text-neutral-500",P=(()=>{class e{transform(t){return t?R[t]??M:M}static \u0275fac=function(a){return new(a||e)};static \u0275pipe=E({name:"ccapCoordinatorActionBadge",type:e,pure:!0,standalone:!0})}return e})();var K=(e,l)=>l._id;function O(e,l){e&1&&(o(0,"div",13),i(1," Loading coordinators... "),n())}function z(e,l){e&1&&(o(0,"div",14),i(1," Nincs koordin\xE1tor session. "),n())}function G(e,l){if(e&1&&i(0),e&2){let t=m(2).$implicit;c(" \xB7 WF: ",t.workflowId," ")}}function q(e,l){if(e&1&&(o(0,"div",22),i(1),p(2,G,1,1),n()),e&2){let t=m().$implicit;r(),w(" ",t.providerName,":",t.model," "),r(),s(t.workflowId?2:-1)}}function V(e,l){if(e&1&&(o(0,"span",24),A(1,"ccapCoordinatorActionBadge"),i(2),n()),e&2){let t=m().$implicit;_("ngClass",I(1,2,t.decisions[t.decisions.length-1].action)),r(2),c(" ",t.decisions[t.decisions.length-1].action," ")}}function W(e,l){if(e&1&&(o(0,"div",25),i(1),n()),e&2){let t=m().$implicit;r(),c(" ",t.decisions[t.decisions.length-1].reasoning," ")}}function H(e,l){if(e&1&&(o(0,"div",26),i(1),n()),e&2){let t=m().$implicit;r(),c(" Pause reason: ",t.pauseReason," ")}}function J(e,l){if(e&1&&(o(0,"div",16)(1,"div",17)(2,"div",18)(3,"span",19),i(4),n(),o(5,"div",20)(6,"div",21),i(7),n(),p(8,q,3,3,"div",22),n()(),o(9,"div",23)(10,"span",6),i(11),n(),p(12,V,3,4,"span",24),n()(),p(13,W,2,1,"div",25)(14,H,2,1,"div",26),n()),e&2){let t=l.$implicit,a=m(2);r(3),_("ngClass",a.getStatusBadgeClass(t.status)),r(),c(" ",t.status," "),r(3),c(" Session: ",t.sessionId," "),r(),s(t.providerName||t.model?8:-1),r(3),c(" ",t.totalStepCount," steps "),r(),s(t.decisions&&t.decisions.length>0?12:-1),r(),s(t.decisions&&t.decisions.length>0?13:-1),r(),s(t.pauseReason?14:-1)}}function Q(e,l){if(e&1&&(o(0,"div",15),y(1,J,15,8,"div",16,K),n()),e&2){let t=m();r(),F(t.filteredCoordinators_$())}}var C=(()=>{class e{coordinator_DS=v(B);statusFilter_$=h("");filteredCoordinators_$=T(()=>{let t=this.statusFilter_$(),a=this.coordinator_DS.globalCoordinatorsList_$();return t?a.filter(d=>d.status===t):a});ngOnInit(){this.loadCoordinators()}loadCoordinators(){return f(this,null,function*(){yield this.coordinator_DS.loadAllCoordinatorsForManagementPage()})}handleFilterChange(t){let a=t.target;!a||!("value"in a)||this.statusFilter_$.set(String(a.value))}getStatusBadgeClass(t){switch(t){case"active":return"bg-green-500/20 text-green-400";case"paused":return"bg-yellow-500/20 text-yellow-400";case"completed":return"bg-neutral-500/20 text-neutral-400";case"failed":return"bg-red-500/20 text-red-400";default:return"bg-neutral-700/20 text-neutral-500"}}static \u0275fac=function(a){return new(a||e)};static \u0275cmp=b({type:e,selectors:[["app-ccap-coordinator"]],standalone:!0,features:[$],decls:28,vars:4,consts:[[1,"max-w-5xl","mx-auto","p-4","gt-xs:p-6","text-neutral-100"],[1,"flex","items-center","justify-between","mb-6"],[1,"text-2xl","font-bold"],[1,"text-neutral-400","text-sm","mt-1"],[1,"px-3","py-1.5","text-xs","border","border-neutral-600","text-neutral-300","rounded","hover:bg-neutral-800","transition-colors",3,"click"],[1,"flex","items-center","gap-3","mb-4"],[1,"text-xs","text-neutral-500"],[1,"bg-neutral-800","border","border-neutral-600","rounded","px-2","py-1","text-xs","text-neutral-200","outline-none","focus:border-neonDefault",3,"change"],["value",""],["value","active"],["value","paused"],["value","completed"],["value","failed"],[1,"text-center","py-8","text-neutral-500","text-sm"],[1,"rounded-lg","border","border-neutral-700","bg-ccapSurface/50","p-8","text-center","text-neutral-500","text-sm"],[1,"space-y-2"],[1,"rounded-lg","border","border-neutral-700","bg-ccapSurface/50","p-4","hover:border-neutral-600","transition-colors"],[1,"flex","items-center","justify-between","gap-4"],[1,"flex","items-center","gap-3","min-w-0"],[1,"text-xs","px-2","py-0.5","rounded","shrink-0",3,"ngClass"],[1,"min-w-0"],[1,"text-sm","text-neutral-200","truncate"],[1,"text-xs","text-neutral-500","mt-0.5"],[1,"flex","items-center","gap-3","shrink-0"],[1,"text-xs","px-1.5","py-0.5","rounded",3,"ngClass"],[1,"text-xs","text-neutral-400","mt-2","truncate"],[1,"text-xs","text-yellow-400/80","mt-1"]],template:function(a,d){a&1&&(o(0,"div",0)(1,"div",1)(2,"div")(3,"h1",2),i(4,"Koordin\xE1tor"),n(),o(5,"p",3),i(6," Koordin\xE1tor session-\xF6k kezel\xE9se \u2014 workflow-alap\xFA agent vez\xE9rl\xE9s. "),n()(),o(7,"button",4),x("click",function(){return d.loadCoordinators()}),i(8," Refresh "),n()(),o(9,"div",5)(10,"span",6),i(11,"Filter:"),n(),o(12,"select",7),x("change",function(j){return d.handleFilterChange(j)}),o(13,"option",8),i(14,"All"),n(),o(15,"option",9),i(16,"Active"),n(),o(17,"option",10),i(18,"Paused"),n(),o(19,"option",11),i(20,"Completed"),n(),o(21,"option",12),i(22,"Failed"),n()(),o(23,"span",6),i(24),n()(),p(25,O,2,0,"div",13)(26,z,2,0,"div",14)(27,Q,3,0,"div",15),n()),a&2&&(r(24),c(" ",d.filteredCoordinators_$().length," coordinator(s) "),r(),s(d.coordinator_DS.globalCoordinatorsListLoading_$()?25:-1),r(),s(!d.coordinator_DS.globalCoordinatorsListLoading_$()&&d.filteredCoordinators_$().length===0?26:-1),r(),s(!d.coordinator_DS.globalCoordinatorsListLoading_$()&&d.filteredCoordinators_$().length>0?27:-1))},dependencies:[u,k,P],encapsulation:2})}return e})();var U=[{path:"",pathMatch:"full",component:C}],st=(()=>{class e{static \u0275fac=function(a){return new(a||e)};static \u0275mod=S({type:e});static \u0275inj=g({imports:[u,D.forChild(U),C]})}return e})();export{st as Coordinator_Module};
2
- //# sourceMappingURL=crd.module-X4AZNBU3.js.map
1
+ import{a as B}from"./chunk-RVZXTBBM.js";import"./chunk-4EPTK7TX.js";import"./chunk-XEGOHOPX.js";import"./chunk-QXM45TNB.js";import{$a as A,C as v,D as b,E as S,Fa as i,G as E,Ha as c,Ia as w,Kb as D,Ta as $,Z as r,aa as h,ab as I,da as p,ga as _,hb as T,k as f,la as s,mb as k,oa as y,pa as F,qa as o,ra as n,ub as u,va as x,wa as m,z as g}from"./chunk-TBMJSIBB.js";var R={respond:"bg-green-500/20 text-green-400","status-update":"bg-blue-500/20 text-blue-400",stop:"bg-neutral-500/20 text-neutral-400","request-user-interaction":"bg-yellow-500/20 text-yellow-400"},M="bg-neutral-700/20 text-neutral-500",P=(()=>{class e{transform(t){return t?R[t]??M:M}static \u0275fac=function(a){return new(a||e)};static \u0275pipe=E({name:"ccapCoordinatorActionBadge",type:e,pure:!0,standalone:!0})}return e})();var K=(e,l)=>l._id;function O(e,l){e&1&&(o(0,"div",13),i(1," Loading coordinators... "),n())}function z(e,l){e&1&&(o(0,"div",14),i(1," Nincs koordin\xE1tor session. "),n())}function G(e,l){if(e&1&&i(0),e&2){let t=m(2).$implicit;c(" \xB7 WF: ",t.workflowId," ")}}function q(e,l){if(e&1&&(o(0,"div",22),i(1),p(2,G,1,1),n()),e&2){let t=m().$implicit;r(),w(" ",t.providerName,":",t.model," "),r(),s(t.workflowId?2:-1)}}function V(e,l){if(e&1&&(o(0,"span",24),A(1,"ccapCoordinatorActionBadge"),i(2),n()),e&2){let t=m().$implicit;_("ngClass",I(1,2,t.decisions[t.decisions.length-1].action)),r(2),c(" ",t.decisions[t.decisions.length-1].action," ")}}function W(e,l){if(e&1&&(o(0,"div",25),i(1),n()),e&2){let t=m().$implicit;r(),c(" ",t.decisions[t.decisions.length-1].reasoning," ")}}function H(e,l){if(e&1&&(o(0,"div",26),i(1),n()),e&2){let t=m().$implicit;r(),c(" Pause reason: ",t.pauseReason," ")}}function J(e,l){if(e&1&&(o(0,"div",16)(1,"div",17)(2,"div",18)(3,"span",19),i(4),n(),o(5,"div",20)(6,"div",21),i(7),n(),p(8,q,3,3,"div",22),n()(),o(9,"div",23)(10,"span",6),i(11),n(),p(12,V,3,4,"span",24),n()(),p(13,W,2,1,"div",25)(14,H,2,1,"div",26),n()),e&2){let t=l.$implicit,a=m(2);r(3),_("ngClass",a.getStatusBadgeClass(t.status)),r(),c(" ",t.status," "),r(3),c(" Session: ",t.sessionId," "),r(),s(t.providerName||t.model?8:-1),r(3),c(" ",t.totalStepCount," steps "),r(),s(t.decisions&&t.decisions.length>0?12:-1),r(),s(t.decisions&&t.decisions.length>0?13:-1),r(),s(t.pauseReason?14:-1)}}function Q(e,l){if(e&1&&(o(0,"div",15),y(1,J,15,8,"div",16,K),n()),e&2){let t=m();r(),F(t.filteredCoordinators_$())}}var C=(()=>{class e{coordinator_DS=v(B);statusFilter_$=h("");filteredCoordinators_$=T(()=>{let t=this.statusFilter_$(),a=this.coordinator_DS.globalCoordinatorsList_$();return t?a.filter(d=>d.status===t):a});ngOnInit(){this.loadCoordinators()}loadCoordinators(){return f(this,null,function*(){yield this.coordinator_DS.loadAllCoordinatorsForManagementPage()})}handleFilterChange(t){let a=t.target;!a||!("value"in a)||this.statusFilter_$.set(String(a.value))}getStatusBadgeClass(t){switch(t){case"active":return"bg-green-500/20 text-green-400";case"paused":return"bg-yellow-500/20 text-yellow-400";case"completed":return"bg-neutral-500/20 text-neutral-400";case"failed":return"bg-red-500/20 text-red-400";default:return"bg-neutral-700/20 text-neutral-500"}}static \u0275fac=function(a){return new(a||e)};static \u0275cmp=b({type:e,selectors:[["app-ccap-coordinator"]],standalone:!0,features:[$],decls:28,vars:4,consts:[[1,"max-w-5xl","mx-auto","p-4","gt-xs:p-6","text-neutral-100"],[1,"flex","items-center","justify-between","mb-6"],[1,"text-2xl","font-bold"],[1,"text-neutral-400","text-sm","mt-1"],[1,"px-3","py-1.5","text-xs","border","border-neutral-600","text-neutral-300","rounded","hover:bg-neutral-800","transition-colors",3,"click"],[1,"flex","items-center","gap-3","mb-4"],[1,"text-xs","text-neutral-500"],[1,"bg-neutral-800","border","border-neutral-600","rounded","px-2","py-1","text-xs","text-neutral-200","outline-none","focus:border-neonDefault",3,"change"],["value",""],["value","active"],["value","paused"],["value","completed"],["value","failed"],[1,"text-center","py-8","text-neutral-500","text-sm"],[1,"rounded-lg","border","border-neutral-700","bg-ccapSurface/50","p-8","text-center","text-neutral-500","text-sm"],[1,"space-y-2"],[1,"rounded-lg","border","border-neutral-700","bg-ccapSurface/50","p-4","hover:border-neutral-600","transition-colors"],[1,"flex","items-center","justify-between","gap-4"],[1,"flex","items-center","gap-3","min-w-0"],[1,"text-xs","px-2","py-0.5","rounded","shrink-0",3,"ngClass"],[1,"min-w-0"],[1,"text-sm","text-neutral-200","truncate"],[1,"text-xs","text-neutral-500","mt-0.5"],[1,"flex","items-center","gap-3","shrink-0"],[1,"text-xs","px-1.5","py-0.5","rounded",3,"ngClass"],[1,"text-xs","text-neutral-400","mt-2","truncate"],[1,"text-xs","text-yellow-400/80","mt-1"]],template:function(a,d){a&1&&(o(0,"div",0)(1,"div",1)(2,"div")(3,"h1",2),i(4,"Koordin\xE1tor"),n(),o(5,"p",3),i(6," Koordin\xE1tor session-\xF6k kezel\xE9se \u2014 workflow-alap\xFA agent vez\xE9rl\xE9s. "),n()(),o(7,"button",4),x("click",function(){return d.loadCoordinators()}),i(8," Refresh "),n()(),o(9,"div",5)(10,"span",6),i(11,"Filter:"),n(),o(12,"select",7),x("change",function(j){return d.handleFilterChange(j)}),o(13,"option",8),i(14,"All"),n(),o(15,"option",9),i(16,"Active"),n(),o(17,"option",10),i(18,"Paused"),n(),o(19,"option",11),i(20,"Completed"),n(),o(21,"option",12),i(22,"Failed"),n()(),o(23,"span",6),i(24),n()(),p(25,O,2,0,"div",13)(26,z,2,0,"div",14)(27,Q,3,0,"div",15),n()),a&2&&(r(24),c(" ",d.filteredCoordinators_$().length," coordinator(s) "),r(),s(d.coordinator_DS.globalCoordinatorsListLoading_$()?25:-1),r(),s(!d.coordinator_DS.globalCoordinatorsListLoading_$()&&d.filteredCoordinators_$().length===0?26:-1),r(),s(!d.coordinator_DS.globalCoordinatorsListLoading_$()&&d.filteredCoordinators_$().length>0?27:-1))},dependencies:[u,k,P],encapsulation:2})}return e})();var U=[{path:"",pathMatch:"full",component:C}],st=(()=>{class e{static \u0275fac=function(a){return new(a||e)};static \u0275mod=S({type:e});static \u0275inj=g({imports:[u,D.forChild(U),C]})}return e})();export{st as Coordinator_Module};
2
+ //# sourceMappingURL=crd.module-PF5ZYSFN.js.map