@futdevpro/ccap 1.1.2403 → 1.1.2413

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 (201) hide show
  1. package/client-dist/{agent-instances.module-A2ZUQC4D.js → agent-instances.module-YQRJGTR4.js} +2 -2
  2. package/client-dist/{ca.module-LCOTOYZS.js → ca.module-MUMV7A2C.js} +2 -2
  3. package/client-dist/cc.module-ILITAOXA.js +4 -0
  4. package/client-dist/cc.module-ILITAOXA.js.map +7 -0
  5. package/client-dist/{chunk-Q2LOKNTG.js → chunk-2S5IB4QA.js} +2 -2
  6. package/client-dist/{chunk-L3PDYXCS.js → chunk-2WCP5YOD.js} +2 -2
  7. package/client-dist/{chunk-UPWIIVQ6.js → chunk-3PN6I6TV.js} +2 -2
  8. package/client-dist/{chunk-QR3HYUNS.js → chunk-4EX42M46.js} +2 -2
  9. package/client-dist/{chunk-VRJJFYHZ.js → chunk-5BRWVAXE.js} +2 -2
  10. package/client-dist/{chunk-VC2WZEJW.js → chunk-5CFFPWO2.js} +2 -2
  11. package/client-dist/{chunk-2ANUGZLV.js → chunk-5L4RCJNJ.js} +2 -2
  12. package/client-dist/{chunk-4QMG7L3K.js → chunk-6AOMQLRI.js} +22 -22
  13. package/client-dist/{chunk-4QMG7L3K.js.map → chunk-6AOMQLRI.js.map} +1 -1
  14. package/client-dist/chunk-6QERLAGJ.js +3 -0
  15. package/client-dist/{chunk-2WIMZNS4.js.map → chunk-6QERLAGJ.js.map} +4 -4
  16. package/client-dist/{chunk-7SKYHNYQ.js → chunk-6SOTIADM.js} +2 -2
  17. package/client-dist/{chunk-ULHGCRZF.js → chunk-7N5CG2ZE.js} +2 -2
  18. package/client-dist/{chunk-HGKIQDDN.js → chunk-AU324OLU.js} +2 -2
  19. package/client-dist/{chunk-6EYSPF43.js → chunk-C7XPBJTG.js} +2 -2
  20. package/client-dist/{chunk-6EYSPF43.js.map → chunk-C7XPBJTG.js.map} +2 -2
  21. package/client-dist/{chunk-6TQLCMPS.js → chunk-CHUAQGNK.js} +2 -2
  22. package/client-dist/{chunk-LXLZTYDV.js → chunk-D5X44E36.js} +2 -2
  23. package/client-dist/{chunk-ZTG2B752.js → chunk-DE4K2EAW.js} +2 -2
  24. package/client-dist/{chunk-VJR3HZ3G.js → chunk-E5EJS23Q.js} +2 -2
  25. package/client-dist/{chunk-3J24BPVB.js → chunk-EPYGDZY6.js} +2 -2
  26. package/client-dist/{chunk-MJHVFZNJ.js → chunk-ETVRRKCG.js} +2 -2
  27. package/client-dist/{chunk-T6DWWQQO.js → chunk-EVEAADTX.js} +2 -2
  28. package/client-dist/{chunk-ZPPMC73W.js → chunk-F22COZKI.js} +2 -2
  29. package/client-dist/{chunk-CXJU7YRU.js → chunk-G27M7NME.js} +2 -2
  30. package/client-dist/{chunk-7GGP7THR.js → chunk-GEKIGTIO.js} +2 -2
  31. package/client-dist/{chunk-4IU43FSF.js → chunk-HW6OU554.js} +2 -2
  32. package/client-dist/{chunk-XG3ULHDY.js → chunk-JDWJPZDR.js} +2 -2
  33. package/client-dist/{chunk-4FPJBDX3.js → chunk-JJY7WMZC.js} +2 -2
  34. package/client-dist/{chunk-GCBCHT45.js → chunk-JY4JXOKV.js} +2 -2
  35. package/client-dist/{chunk-NBYYHCJY.js → chunk-K2VUINMT.js} +2 -2
  36. package/client-dist/{chunk-2XTCHCAU.js → chunk-K7KBQUZW.js} +2 -2
  37. package/client-dist/{chunk-LYNJHJHR.js → chunk-LMU4ZKEX.js} +2 -2
  38. package/client-dist/{chunk-EJK7DYOT.js → chunk-M52V4EZF.js} +2 -2
  39. package/client-dist/{chunk-WWBFRXUC.js → chunk-MA6KRNHC.js} +2 -2
  40. package/client-dist/{chunk-6BO4RGTF.js → chunk-MML2K2XK.js} +2 -2
  41. package/client-dist/{chunk-R5JJ4NXA.js → chunk-MROTHM6K.js} +2 -2
  42. package/client-dist/{chunk-T3QPQMWE.js → chunk-MYOVGFG6.js} +2 -2
  43. package/client-dist/{chunk-USSOB2ST.js → chunk-NA5QSJDM.js} +2 -2
  44. package/client-dist/{chunk-KMZABECD.js → chunk-NWK6WEAF.js} +2 -2
  45. package/client-dist/{chunk-D2JXXPA3.js → chunk-NYGULTZO.js} +2 -2
  46. package/client-dist/{chunk-BWHF5I73.js → chunk-OWQLFZIF.js} +2 -2
  47. package/client-dist/{chunk-GLADIICK.js → chunk-P7QASRBG.js} +2 -2
  48. package/client-dist/{chunk-GLADIICK.js.map → chunk-P7QASRBG.js.map} +1 -1
  49. package/client-dist/{chunk-6PT2MZ74.js → chunk-POAGKZ5J.js} +2 -2
  50. package/client-dist/{chunk-KAS4KL5H.js → chunk-Q5LOC2YB.js} +2 -2
  51. package/client-dist/{chunk-HDQB2FFA.js → chunk-QMS2JX2O.js} +2 -2
  52. package/client-dist/{chunk-VUPHBESM.js → chunk-S2WTIGEZ.js} +2 -2
  53. package/client-dist/{chunk-BE63JRDK.js → chunk-SD2IYFWL.js} +2 -2
  54. package/client-dist/{chunk-LWUPRATP.js → chunk-SLWCZIOD.js} +2 -2
  55. package/client-dist/{chunk-N6HZQAGL.js → chunk-TTOO5THB.js} +2 -2
  56. package/client-dist/{chunk-3LJYOX46.js → chunk-TUEKZYSI.js} +2 -2
  57. package/client-dist/{chunk-XPUEDVEA.js → chunk-U4CWC5HD.js} +2 -2
  58. package/client-dist/{chunk-MISCMKZP.js → chunk-UM5OHOCG.js} +2 -2
  59. package/client-dist/{chunk-ISY352NI.js → chunk-WKFFHHVN.js} +2 -2
  60. package/client-dist/{chunk-TDTESSW2.js → chunk-WTHNZJTR.js} +2 -2
  61. package/client-dist/{chunk-4OROAMCK.js → chunk-WZRWVN75.js} +2 -2
  62. package/client-dist/{chunk-BS6NS62C.js → chunk-XBPBZNCD.js} +2 -2
  63. package/client-dist/{chunk-FX7QVSB2.js → chunk-YVSKIQO6.js} +2 -2
  64. package/client-dist/{chunk-URM2RHFX.js → chunk-Z4QHQKDL.js} +2 -2
  65. package/client-dist/{chunk-ICJ34KOC.js → chunk-Z7JJKQPF.js} +2 -2
  66. package/client-dist/{consultant.module-QZ2ZSGVT.js → consultant.module-H3VU5FVZ.js} +2 -2
  67. package/client-dist/{crd.module-QXWKVYQA.js → crd.module-EP7XTSJ6.js} +2 -2
  68. package/client-dist/{dashboard.module-VMO6DNGU.js → dashboard.module-N5SBIINI.js} +2 -2
  69. package/client-dist/{do.module-MEKI67XV.js → do.module-ETTDW2US.js} +2 -2
  70. package/client-dist/{document-library.module-WTVKD4YU.js → document-library.module-BVQQRHPG.js} +2 -2
  71. package/client-dist/{embedding-eval.module-PLYAYGF2.js → embedding-eval.module-N5DXPMKB.js} +2 -2
  72. package/client-dist/{embedding-registry.module-4HXKVG27.js → embedding-registry.module-NSNGFKNG.js} +2 -2
  73. package/client-dist/{err.module-3JS2XT7W.js → err.module-QKPQFJ3C.js} +2 -2
  74. package/client-dist/{feedback.module-SFHES7MB.js → feedback.module-GOUMFPA7.js} +2 -2
  75. package/client-dist/{host-runtime-mcp.module-SDW7ZVPN.js → host-runtime-mcp.module-EVY6KMIH.js} +2 -2
  76. package/client-dist/index.html +2 -2
  77. package/client-dist/{live-dev-pipeline.module-PZKHWCO7.js → live-dev-pipeline.module-VKJDUXBT.js} +2 -2
  78. package/client-dist/{logs.module-SGSLBVCW.js → logs.module-YEC65J7A.js} +2 -2
  79. package/client-dist/{main-LU2I2R35.js → main-TNSQOLNS.js} +3 -3
  80. package/client-dist/{master-control-remote-poc.module-6VPAKQUQ.js → master-control-remote-poc.module-5JRQ5P6U.js} +2 -2
  81. package/client-dist/{mobile-app.module-EREJO2WC.js → mobile-app.module-R7SUNQ5R.js} +2 -2
  82. package/client-dist/{model-registry.module-7IGKIWLN.js → model-registry.module-EIJG3NIU.js} +2 -2
  83. package/client-dist/{oc.module-CT4XLVCX.js → oc.module-AECCCX4K.js} +2 -2
  84. package/client-dist/{orc.module-WJBCFXB3.js → orc.module-FQDMQS2P.js} +2 -2
  85. package/client-dist/{project-management.module-UDRPUGVK.js → project-management.module-6WIQQ6QA.js} +2 -2
  86. package/client-dist/project-source-routed.module-ODQJIY2I.js +2 -0
  87. package/client-dist/{scheduler.module-LIOP3COI.js → scheduler.module-4RS6V6IT.js} +2 -2
  88. package/client-dist/session.module-IHYJAR5P.js +12 -0
  89. package/client-dist/session.module-IHYJAR5P.js.map +7 -0
  90. package/client-dist/{set.module-QYL53JEQ.js → set.module-E2N5N5ST.js} +2 -2
  91. package/client-dist/{setup.module-TGTJ6IZV.js → setup.module-MGHZKKD2.js} +2 -2
  92. package/client-dist/styles-IPQY7PNR.css +2 -0
  93. package/client-dist/styles-IPQY7PNR.css.map +7 -0
  94. package/client-dist/{terminals.module-CKXLHM76.js → terminals.module-2F544UZE.js} +2 -2
  95. package/client-dist/{voice-notes-poc.module-L4XPDMU3.js → voice-notes-poc.module-ESWLZBHU.js} +2 -2
  96. package/client-dist/{wfs.module-DGP3CKHF.js → wfs.module-XLHY3PP3.js} +2 -2
  97. package/package.json +1 -1
  98. package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/cc-adapter.control-service.d.ts.map +1 -1
  99. package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/cc-adapter.control-service.js +8 -17
  100. package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/cc-adapter.control-service.js.map +1 -1
  101. package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/cc-output.control-service.d.ts +4 -0
  102. package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/cc-output.control-service.d.ts.map +1 -1
  103. package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/cc-output.control-service.js +17 -3
  104. package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/cc-output.control-service.js.map +1 -1
  105. package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/status/cc-status-transition.control-service.d.ts +20 -0
  106. package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/status/cc-status-transition.control-service.d.ts.map +1 -1
  107. package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/status/cc-status-transition.control-service.js +44 -0
  108. package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/status/cc-status-transition.control-service.js.map +1 -1
  109. package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/status/cc-status-transition.control-service.spec.d.ts +8 -0
  110. package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/status/cc-status-transition.control-service.spec.d.ts.map +1 -0
  111. package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/status/cc-status-transition.control-service.spec.js +45 -0
  112. package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/status/cc-status-transition.control-service.spec.js.map +1 -0
  113. package/client-dist/cc.module-JNBWNLXT.js +0 -4
  114. package/client-dist/cc.module-JNBWNLXT.js.map +0 -7
  115. package/client-dist/chunk-2WIMZNS4.js +0 -2
  116. package/client-dist/project-source-routed.module-MPNN6Y7L.js +0 -2
  117. package/client-dist/session.module-IOUXNQQL.js +0 -13
  118. package/client-dist/session.module-IOUXNQQL.js.map +0 -7
  119. package/client-dist/styles-GRAX54DU.css +0 -2
  120. package/client-dist/styles-GRAX54DU.css.map +0 -7
  121. /package/client-dist/{agent-instances.module-A2ZUQC4D.js.map → agent-instances.module-YQRJGTR4.js.map} +0 -0
  122. /package/client-dist/{ca.module-LCOTOYZS.js.map → ca.module-MUMV7A2C.js.map} +0 -0
  123. /package/client-dist/{chunk-Q2LOKNTG.js.map → chunk-2S5IB4QA.js.map} +0 -0
  124. /package/client-dist/{chunk-L3PDYXCS.js.map → chunk-2WCP5YOD.js.map} +0 -0
  125. /package/client-dist/{chunk-UPWIIVQ6.js.map → chunk-3PN6I6TV.js.map} +0 -0
  126. /package/client-dist/{chunk-QR3HYUNS.js.map → chunk-4EX42M46.js.map} +0 -0
  127. /package/client-dist/{chunk-VRJJFYHZ.js.map → chunk-5BRWVAXE.js.map} +0 -0
  128. /package/client-dist/{chunk-VC2WZEJW.js.map → chunk-5CFFPWO2.js.map} +0 -0
  129. /package/client-dist/{chunk-2ANUGZLV.js.map → chunk-5L4RCJNJ.js.map} +0 -0
  130. /package/client-dist/{chunk-7SKYHNYQ.js.map → chunk-6SOTIADM.js.map} +0 -0
  131. /package/client-dist/{chunk-ULHGCRZF.js.map → chunk-7N5CG2ZE.js.map} +0 -0
  132. /package/client-dist/{chunk-HGKIQDDN.js.map → chunk-AU324OLU.js.map} +0 -0
  133. /package/client-dist/{chunk-6TQLCMPS.js.map → chunk-CHUAQGNK.js.map} +0 -0
  134. /package/client-dist/{chunk-LXLZTYDV.js.map → chunk-D5X44E36.js.map} +0 -0
  135. /package/client-dist/{chunk-ZTG2B752.js.map → chunk-DE4K2EAW.js.map} +0 -0
  136. /package/client-dist/{chunk-VJR3HZ3G.js.map → chunk-E5EJS23Q.js.map} +0 -0
  137. /package/client-dist/{chunk-3J24BPVB.js.map → chunk-EPYGDZY6.js.map} +0 -0
  138. /package/client-dist/{chunk-MJHVFZNJ.js.map → chunk-ETVRRKCG.js.map} +0 -0
  139. /package/client-dist/{chunk-T6DWWQQO.js.map → chunk-EVEAADTX.js.map} +0 -0
  140. /package/client-dist/{chunk-ZPPMC73W.js.map → chunk-F22COZKI.js.map} +0 -0
  141. /package/client-dist/{chunk-CXJU7YRU.js.map → chunk-G27M7NME.js.map} +0 -0
  142. /package/client-dist/{chunk-7GGP7THR.js.map → chunk-GEKIGTIO.js.map} +0 -0
  143. /package/client-dist/{chunk-4IU43FSF.js.map → chunk-HW6OU554.js.map} +0 -0
  144. /package/client-dist/{chunk-XG3ULHDY.js.map → chunk-JDWJPZDR.js.map} +0 -0
  145. /package/client-dist/{chunk-4FPJBDX3.js.map → chunk-JJY7WMZC.js.map} +0 -0
  146. /package/client-dist/{chunk-GCBCHT45.js.map → chunk-JY4JXOKV.js.map} +0 -0
  147. /package/client-dist/{chunk-NBYYHCJY.js.map → chunk-K2VUINMT.js.map} +0 -0
  148. /package/client-dist/{chunk-2XTCHCAU.js.map → chunk-K7KBQUZW.js.map} +0 -0
  149. /package/client-dist/{chunk-LYNJHJHR.js.map → chunk-LMU4ZKEX.js.map} +0 -0
  150. /package/client-dist/{chunk-EJK7DYOT.js.map → chunk-M52V4EZF.js.map} +0 -0
  151. /package/client-dist/{chunk-WWBFRXUC.js.map → chunk-MA6KRNHC.js.map} +0 -0
  152. /package/client-dist/{chunk-6BO4RGTF.js.map → chunk-MML2K2XK.js.map} +0 -0
  153. /package/client-dist/{chunk-R5JJ4NXA.js.map → chunk-MROTHM6K.js.map} +0 -0
  154. /package/client-dist/{chunk-T3QPQMWE.js.map → chunk-MYOVGFG6.js.map} +0 -0
  155. /package/client-dist/{chunk-USSOB2ST.js.map → chunk-NA5QSJDM.js.map} +0 -0
  156. /package/client-dist/{chunk-KMZABECD.js.map → chunk-NWK6WEAF.js.map} +0 -0
  157. /package/client-dist/{chunk-D2JXXPA3.js.map → chunk-NYGULTZO.js.map} +0 -0
  158. /package/client-dist/{chunk-BWHF5I73.js.map → chunk-OWQLFZIF.js.map} +0 -0
  159. /package/client-dist/{chunk-6PT2MZ74.js.map → chunk-POAGKZ5J.js.map} +0 -0
  160. /package/client-dist/{chunk-KAS4KL5H.js.map → chunk-Q5LOC2YB.js.map} +0 -0
  161. /package/client-dist/{chunk-HDQB2FFA.js.map → chunk-QMS2JX2O.js.map} +0 -0
  162. /package/client-dist/{chunk-VUPHBESM.js.map → chunk-S2WTIGEZ.js.map} +0 -0
  163. /package/client-dist/{chunk-BE63JRDK.js.map → chunk-SD2IYFWL.js.map} +0 -0
  164. /package/client-dist/{chunk-LWUPRATP.js.map → chunk-SLWCZIOD.js.map} +0 -0
  165. /package/client-dist/{chunk-N6HZQAGL.js.map → chunk-TTOO5THB.js.map} +0 -0
  166. /package/client-dist/{chunk-3LJYOX46.js.map → chunk-TUEKZYSI.js.map} +0 -0
  167. /package/client-dist/{chunk-XPUEDVEA.js.map → chunk-U4CWC5HD.js.map} +0 -0
  168. /package/client-dist/{chunk-MISCMKZP.js.map → chunk-UM5OHOCG.js.map} +0 -0
  169. /package/client-dist/{chunk-ISY352NI.js.map → chunk-WKFFHHVN.js.map} +0 -0
  170. /package/client-dist/{chunk-TDTESSW2.js.map → chunk-WTHNZJTR.js.map} +0 -0
  171. /package/client-dist/{chunk-4OROAMCK.js.map → chunk-WZRWVN75.js.map} +0 -0
  172. /package/client-dist/{chunk-BS6NS62C.js.map → chunk-XBPBZNCD.js.map} +0 -0
  173. /package/client-dist/{chunk-FX7QVSB2.js.map → chunk-YVSKIQO6.js.map} +0 -0
  174. /package/client-dist/{chunk-URM2RHFX.js.map → chunk-Z4QHQKDL.js.map} +0 -0
  175. /package/client-dist/{chunk-ICJ34KOC.js.map → chunk-Z7JJKQPF.js.map} +0 -0
  176. /package/client-dist/{consultant.module-QZ2ZSGVT.js.map → consultant.module-H3VU5FVZ.js.map} +0 -0
  177. /package/client-dist/{crd.module-QXWKVYQA.js.map → crd.module-EP7XTSJ6.js.map} +0 -0
  178. /package/client-dist/{dashboard.module-VMO6DNGU.js.map → dashboard.module-N5SBIINI.js.map} +0 -0
  179. /package/client-dist/{do.module-MEKI67XV.js.map → do.module-ETTDW2US.js.map} +0 -0
  180. /package/client-dist/{document-library.module-WTVKD4YU.js.map → document-library.module-BVQQRHPG.js.map} +0 -0
  181. /package/client-dist/{embedding-eval.module-PLYAYGF2.js.map → embedding-eval.module-N5DXPMKB.js.map} +0 -0
  182. /package/client-dist/{embedding-registry.module-4HXKVG27.js.map → embedding-registry.module-NSNGFKNG.js.map} +0 -0
  183. /package/client-dist/{err.module-3JS2XT7W.js.map → err.module-QKPQFJ3C.js.map} +0 -0
  184. /package/client-dist/{feedback.module-SFHES7MB.js.map → feedback.module-GOUMFPA7.js.map} +0 -0
  185. /package/client-dist/{host-runtime-mcp.module-SDW7ZVPN.js.map → host-runtime-mcp.module-EVY6KMIH.js.map} +0 -0
  186. /package/client-dist/{live-dev-pipeline.module-PZKHWCO7.js.map → live-dev-pipeline.module-VKJDUXBT.js.map} +0 -0
  187. /package/client-dist/{logs.module-SGSLBVCW.js.map → logs.module-YEC65J7A.js.map} +0 -0
  188. /package/client-dist/{main-LU2I2R35.js.map → main-TNSQOLNS.js.map} +0 -0
  189. /package/client-dist/{master-control-remote-poc.module-6VPAKQUQ.js.map → master-control-remote-poc.module-5JRQ5P6U.js.map} +0 -0
  190. /package/client-dist/{mobile-app.module-EREJO2WC.js.map → mobile-app.module-R7SUNQ5R.js.map} +0 -0
  191. /package/client-dist/{model-registry.module-7IGKIWLN.js.map → model-registry.module-EIJG3NIU.js.map} +0 -0
  192. /package/client-dist/{oc.module-CT4XLVCX.js.map → oc.module-AECCCX4K.js.map} +0 -0
  193. /package/client-dist/{orc.module-WJBCFXB3.js.map → orc.module-FQDMQS2P.js.map} +0 -0
  194. /package/client-dist/{project-management.module-UDRPUGVK.js.map → project-management.module-6WIQQ6QA.js.map} +0 -0
  195. /package/client-dist/{project-source-routed.module-MPNN6Y7L.js.map → project-source-routed.module-ODQJIY2I.js.map} +0 -0
  196. /package/client-dist/{scheduler.module-LIOP3COI.js.map → scheduler.module-4RS6V6IT.js.map} +0 -0
  197. /package/client-dist/{set.module-QYL53JEQ.js.map → set.module-E2N5N5ST.js.map} +0 -0
  198. /package/client-dist/{setup.module-TGTJ6IZV.js.map → setup.module-MGHZKKD2.js.map} +0 -0
  199. /package/client-dist/{terminals.module-CKXLHM76.js.map → terminals.module-2F544UZE.js.map} +0 -0
  200. /package/client-dist/{voice-notes-poc.module-L4XPDMU3.js.map → voice-notes-poc.module-ESWLZBHU.js.map} +0 -0
  201. /package/client-dist/{wfs.module-DGP3CKHF.js.map → wfs.module-XLHY3PP3.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["src/app/_modules/shared/_components/session-ui/s-session-shell-toolbar/s-session-shell-toolbar.component.ts", "src/app/_modules/shared/_components/session-ui/s-session-shell-toolbar/s-session-shell-toolbar.component.html", "src/app/_modules/shared/_components/session-ui/s-resizable-session-shell-layout/s-resizable-session-shell-layout.component.ts", "src/app/_modules/shared/_components/session-ui/s-resizable-session-shell-layout/s-resizable-session-shell-layout.component.html", "src/app/_modules/shared/_components/session-ui/s-session-input/s-session-input.component.ts", "src/app/_modules/shared/_components/session-ui/s-session-input/s-session-input.component.html"],
4
- "sourcesContent": ["import { Component } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n/**\n * Session shell felső toolbar: 1fr | auto | 1fr grid, három ng-content slot.\n * Domain-logika nélkül — csak elrendezés.\n */\n@Component({\n selector: 'app-s-session-shell-toolbar',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './s-session-shell-toolbar.component.html',\n host: { class: 'block shrink-0 w-full min-w-0' },\n})\n/** S_SessionShellToolbar_Component class. */\nexport class S_SessionShellToolbar_Component {}\n", "<div\n class=\"grid grid-cols-[1fr_auto_1fr] items-center gap-x-1 gap-y-1 p-1 border-b border-neonDefault bg-ccapSurface w-full min-w-0\">\n <div class=\"flex items-center gap-1 min-w-0 justify-self-start\">\n <ng-content select=\"[sSessionToolbarLeft]\"></ng-content>\n </div>\n <div\n class=\"flex items-center justify-center gap-2 min-w-0 max-w-[min(100vw-12rem,42rem)] justify-self-center\">\n <ng-content select=\"[sSessionToolbarCenter]\"></ng-content>\n </div>\n <div class=\"flex items-center gap-1 min-w-0 justify-self-end flex-wrap justify-end\">\n <ng-content select=\"[sSessionToolbarRight]\"></ng-content>\n </div>\n</div>\n", "import { Component, input, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n/**\n * Shell: opcionális bal sidebar fix px szélességgel + resize handle + fő tartalom + opcionális jobb panel.\n * A szélesség mentés és a drag matematika a szülőn marad — itt csak a handle esemény.\n * Opcionális mobil backdrop: sidebar nyitott állapotban xs nézetben overlay-t mutat.\n */\n@Component({\n selector: 'app-s-resizable-session-shell-layout',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './s-resizable-session-shell-layout.component.html',\n host: { class: 'block flex flex-1 min-h-0 w-full overflow-hidden' },\n})\n/** S_ResizableSessionShellLayout_Component class. */\nexport class S_ResizableSessionShellLayout_Component {\n\n /** Sidebar látható. */\n readonly isSidebarOpen = input<boolean>(true);\n\n /** Sidebar szélesség (px). */\n readonly sidebarWidthPx = input<number>(320);\n\n /** Resize aktív — host select-none-hoz. */\n readonly isResizing = input<boolean>(false);\n\n /** Sidebar resize kezdő esemény (pointerdown a handle-n). */\n readonly sidebarResizeStart = output<PointerEvent>();\n\n /**\n * Mobil backdrop aktív — ha true, xs nézetben fix overlay-t renderel a sidebar mögött.\n * A szülő feladata eldönteni, mikor aktív (általában: sidebar nyitott állapotban).\n * CSS-en keresztül (xs:block gt-xs:hidden) csak mobilon jelenik meg.\n */\n readonly isMobileBackdropActive = input<boolean>(false);\n\n /** Mobil backdrop kattintás esemény — a szülő kezeli (általában: sidebar bezárás). */\n readonly mobileBackdropClicked = output<void>();\n}\n", "@if (isMobileBackdropActive()) {\n <div class=\"fixed inset-0 z-30 bg-black/50 xs:block gt-xs:hidden\"\n (click)=\"mobileBackdropClicked.emit()\"\n aria-hidden=\"true\"></div>\n}\n@if (isSidebarOpen()) {\n <div\n class=\"border-r border-neonDefault bg-ccapSurface flex flex-col min-h-0 overflow-hidden shrink-0 self-stretch\"\n [style.width.px]=\"sidebarWidthPx()\">\n <ng-content select=\"[sSessionShellSidebar]\"></ng-content>\n </div>\n <div\n class=\"w-1 shrink-0 cursor-col-resize hover:bg-ccapAccent/40 active:bg-ccapAccent/60 transition-colors touch-none\"\n (pointerdown)=\"sidebarResizeStart.emit($event)\">\n </div>\n}\n<div class=\"flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden bg-ccapBg self-stretch\">\n <ng-content select=\"[sSessionShellMain]\"></ng-content>\n</div>\n<ng-content select=\"[sSessionShellRightPanel]\"></ng-content>\n", "import { Component, input, output, signal, OnDestroy, ViewChild, ElementRef, Renderer2, HostBinding, effect } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\n\nimport {\n CCAP_PendingAttachment_Interface,\n} from '../../../../../_models/interfaces/session/ccap-pending-attachment.interface';\nimport {\n SQ_SnapshotItem_Interface,\n} from '../../../../../_models/interfaces/session-queue/ccap-session-queue-snapshot.interface';\n\n/** Engedélyezett image MIME típusok (preview-hoz). */\nconst IMAGE_MIME_PREFIXES: string[] = ['image/png', 'image/jpeg', 'image/webp', 'image/gif'];\n\n/** Panel minimális magassága px-ben (resize alsó limit). */\nconst PANEL_MIN_HEIGHT: number = 120;\n\n/** Textarea auto-grow maximális magassága viewport arányában. */\nconst TEXTAREA_AUTO_MAX_VH: number = 0.4;\n\n/**\n * Közös session input komponens — textarea, send/stop, config dropdownok, fájl csatolás.\n * Feature flag input-okkal konfigurálható: ami üres / false, az nem jelenik meg.\n *\n * Content projection:\n * - `[sInputTextareaAccessory]` — absolute overlay a textarea-ra (pl. voice gomb)\n */\n@Component({\n selector: 'app-s-session-input',\n standalone: true,\n imports: [CommonModule, FormsModule],\n templateUrl: './s-session-input.component.html',\n styleUrls: ['./s-session-input.component.scss'],\n host: { class: 'flex flex-col shrink-0 border-t border-neonDefault bg-ccapSurface relative overflow-hidden' },\n})\n/** S_SessionInput_Component class. */\nexport class S_SessionInput_Component implements OnDestroy {\n\n // ── Szöveg ───────────────────────────────────────────────────────────\n\n /** Piszkozat szöveg (two-way a szülővel). */\n readonly draftText = input<string>('');\n\n /** Placeholder. */\n readonly placeholder = input<string>('Send a prompt…');\n\n /** Textarea sorok. */\n readonly textareaRows = input<number>(3);\n\n /** Piszkozat változás. */\n readonly draftTextChange = output<string>();\n\n // ── Állapot ──────────────────────────────────────────────────────────\n\n /** Agent dolgozik — ilyenkor Stop gomb jelenik meg Send helyett. */\n readonly isExecuting = input<boolean>(false);\n\n /** Küldés folyamatban. */\n readonly isSending = input<boolean>(false);\n\n /** Stop folyamatban. */\n readonly isStopping = input<boolean>(false);\n\n // ── Config feature flags ─────────────────────────────────────────────\n\n /** Mód opciók (üres = nem mutatjuk). */\n readonly modeOptions = input<string[]>([]);\n\n /** Kiválasztott mód. */\n readonly selectedMode = input<string>('');\n\n /** Model opciók (üres = nem mutatjuk). */\n readonly modelOptions = input<string[]>([]);\n\n /** Kiválasztott model. */\n readonly selectedModel = input<string>('');\n\n /** Effort opciók (üres = nem mutatjuk). */\n readonly effortOptions = input<string[]>([]);\n\n /** Kiválasztott effort. */\n readonly selectedEffort = input<string>('');\n\n /** Használat kijelzés (token szám / cost; üres = nem mutatjuk). */\n readonly usageText = input<string>('');\n\n // ── Queue ────────────────────────────────────────────────────────────\n\n /** Queue elemek (üres = nincs queue panel). */\n readonly queueItems = input<SQ_SnapshotItem_Interface[]>([]);\n\n /** Queue lock állapot (true = szerkesztés alatt, auto-delivery tiltott). */\n readonly isQueueLocked = input<boolean>(false);\n\n /** Szerkesztés alatt álló queue elem ID-ja (null = nincs szerkesztés). */\n readonly editingQueueItemId = input<string | null>(null);\n\n /** Szerkesztés alatti szöveg (two-way a szülővel). */\n readonly editingQueueText = input<string>('');\n\n /** Edit indítás (queueItemId). */\n readonly queueEditStart = output<string>();\n\n /** Szerkesztés közbeni text change. */\n readonly queueEditTextChange = output<string>();\n\n /** Edit mentés. */\n readonly queueEditSave = output<void>();\n\n /** Edit visszavonás. */\n readonly queueEditCancel = output<void>();\n\n /** Elem törlés (queueItemId). */\n readonly queueRemoveItem = output<string>();\n\n /** Azonnali küldés (queueItemId). */\n readonly queueSendNow = output<string>();\n\n /** Elem mozgatás felfelé (queueItemId). */\n readonly queueMoveUp = output<string>();\n\n /** Elem mozgatás lefelé (queueItemId). */\n readonly queueMoveDown = output<string>();\n\n // ── Attachment config ────────────────────────────────────────────────\n\n /** Fájl csatolás engedélyezése. */\n readonly enableAttachments = input<boolean>(false);\n\n /** Elfogadott fájl típusok (accept attribútum). */\n readonly acceptedFileTypes = input<string>(\n 'image/png,image/jpeg,image/webp,image/gif,.txt,.pdf,.md,.json,.csv,.xml,.yaml,.yml,.log',\n );\n\n /** Max csatolható fájlok száma. */\n readonly maxAttachmentCount = input<number>(6);\n\n // ── Outputok ─────────────────────────────────────────────────────────\n\n /** Küldés kérése (idle állapotban Enter / Send gomb). */\n readonly sendRequested = output<void>();\n\n /** Queue-ba küldés kérése (isExecuting alatt Enter / Queue gomb) — server oldalon auto-enqueue ugyanazon prompt endpointon keresztül. */\n readonly queueRequested = output<void>();\n\n /** Stop kérése. */\n readonly stopRequested = output<void>();\n\n /** Mód változás. */\n readonly modeChanged = output<string>();\n\n /** Model változás. */\n readonly modelChanged = output<string>();\n\n /** Effort változás. */\n readonly effortChanged = output<string>();\n\n /** Attachment lista változás. */\n readonly attachmentsChanged = output<CCAP_PendingAttachment_Interface[]>();\n\n // ── Belső state ──────────────────────────────────────────────────────\n\n /** Pending attachment-ek. */\n pendingAttachments: CCAP_PendingAttachment_Interface[] = [];\n\n /** Dropdown nyitott állapotok. */\n readonly isModeDropdownOpen_$ = signal<boolean>(false);\n readonly isModelDropdownOpen_$ = signal<boolean>(false);\n readonly isEffortDropdownOpen_$ = signal<boolean>(false);\n\n // ── Resize ───────────────────────────────────────────────────────────\n\n /** Manuális resize aktív (drag után; dblclick reset-eli). */\n readonly isManualResize_$ = signal<boolean>(false);\n\n /** Manuális panel magasság px-ben. */\n readonly manualPanelHeight_$ = signal<number>(300);\n\n /** Textarea DOM referencia (auto-grow számításhoz). */\n @ViewChild('textareaEl') textareaElRef: ElementRef<HTMLTextAreaElement> | undefined;\n\n /** Resize drag kiindulási Y pozíció. */\n private resizeStartY: number = 0;\n\n /** Resize drag kiindulási panel magasság. */\n private resizeStartHeight: number = 0;\n\n /** Document pointermove listener cleanup. */\n private resizeMoveCleanup: (() => void) | null = null;\n\n /** Document pointerup listener cleanup. */\n private resizeUpCleanup: (() => void) | null = null;\n\n /** Document pointercancel listener cleanup. */\n private resizeCancelCleanup: (() => void) | null = null;\n\n /** Host magasság — manual resize módban explicit, auto módban undefined (content-driven). */\n @HostBinding('style.height.px')\n get hostHeightPx(): number | undefined {\n return this.isManualResize_$() ? this.manualPanelHeight_$() : undefined;\n }\n\n constructor(\n private elementRef: ElementRef<HTMLElement>,\n private renderer: Renderer2,\n ) {\n /** Auto-grow effect — draftText változáskor (pl. küldés utáni törlés) textarea magasság újraszámolás. */\n effect(() => {\n this.draftText();\n if (!this.isManualResize_$()) {\n requestAnimationFrame(() => {\n if (this.textareaElRef?.nativeElement) {\n this.adjustTextareaAutoGrow(this.textareaElRef.nativeElement);\n }\n });\n }\n });\n }\n\n // ── Lifecycle ────────────────────────────────────────────────────────\n\n ngOnDestroy(): void {\n this.cleanupResizeListeners();\n for (const att of this.pendingAttachments) {\n if (att.previewUrl) {\n URL.revokeObjectURL(att.previewUrl);\n }\n }\n this.pendingAttachments = [];\n }\n\n // ── Keyboard ─────────────────────────────────────────────────────────\n\n /**\n * Enter küldés, Shift+Enter új sor.\n * Running alatt a default Enter a queueRequested-et emittálja (Stop külön gombbal).\n */\n handleKeyDown(event: KeyboardEvent): void {\n if (event.key !== 'Enter' || event.shiftKey) {\n return;\n }\n event.preventDefault();\n this.emitSendOrQueue();\n }\n\n // ── Send / Queue / Stop ──────────────────────────────────────────────\n\n /**\n * Send gomb kattintás (idle).\n */\n handleSendClick(): void {\n this.emitSendOrQueue();\n }\n\n /**\n * Queue gomb kattintás (running alatt látható, plusz input-send).\n */\n handleQueueClick(): void {\n this.emitSendOrQueue();\n }\n\n /**\n * Stop gomb kattintás.\n */\n handleStopClick(): void {\n if (this.isStopping()) {\n return;\n }\n this.stopRequested.emit();\n }\n\n // ── Textarea auto-grow ───────────────────────────────────────────────\n\n /**\n * Textarea input event — azonnali auto-grow (gyorsabb mint az effect + rAF).\n */\n handleTextareaInput(): void {\n if (this.isManualResize_$()) {\n return;\n }\n if (this.textareaElRef?.nativeElement) {\n this.adjustTextareaAutoGrow(this.textareaElRef.nativeElement);\n }\n }\n\n // ── Panel resize ─────────────────────────────────────────────────────\n\n /**\n * Resize handle pointerdown — drag indítás pointer capture-rel.\n */\n handleResizeStart(event: PointerEvent): void {\n event.preventDefault();\n const target: EventTarget | null = event.currentTarget;\n if (target instanceof HTMLElement) {\n target.setPointerCapture(event.pointerId);\n }\n this.resizeStartY = event.clientY;\n this.resizeStartHeight = this.elementRef.nativeElement.offsetHeight;\n\n this.resizeMoveCleanup = this.renderer.listen('document', 'pointermove', (e: PointerEvent): void => {\n this.handleResizeMove(e);\n });\n this.resizeUpCleanup = this.renderer.listen('document', 'pointerup', (): void => {\n if (target instanceof HTMLElement && target.hasPointerCapture(event.pointerId)) {\n target.releasePointerCapture(event.pointerId);\n }\n this.cleanupResizeListeners();\n });\n this.resizeCancelCleanup = this.renderer.listen('document', 'pointercancel', (): void => {\n if (target instanceof HTMLElement && target.hasPointerCapture(event.pointerId)) {\n target.releasePointerCapture(event.pointerId);\n }\n this.cleanupResizeListeners();\n });\n }\n\n /**\n * Resize handle duplakattintás — visszaállás auto módba.\n */\n handleResizeReset(): void {\n this.isManualResize_$.set(false);\n requestAnimationFrame(() => {\n if (this.textareaElRef?.nativeElement) {\n this.adjustTextareaAutoGrow(this.textareaElRef.nativeElement);\n }\n });\n }\n\n // ── Config dropdowns ─────────────────────────────────────────────────\n\n /** Mód dropdown toggle. */\n handleToggleModeDropdown(): void {\n this.closeAllDropdownsExcept('mode');\n this.isModeDropdownOpen_$.set(!this.isModeDropdownOpen_$());\n }\n\n /** Model dropdown toggle. */\n handleToggleModelDropdown(): void {\n this.closeAllDropdownsExcept('model');\n this.isModelDropdownOpen_$.set(!this.isModelDropdownOpen_$());\n }\n\n /** Effort dropdown toggle. */\n handleToggleEffortDropdown(): void {\n this.closeAllDropdownsExcept('effort');\n this.isEffortDropdownOpen_$.set(!this.isEffortDropdownOpen_$());\n }\n\n /** Mód kiválasztás. */\n handleSelectMode(mode: string): void {\n this.isModeDropdownOpen_$.set(false);\n this.modeChanged.emit(mode);\n }\n\n /** Model kiválasztás. */\n handleSelectModel(model: string): void {\n this.isModelDropdownOpen_$.set(false);\n this.modelChanged.emit(model);\n }\n\n /** Effort kiválasztás. */\n handleSelectEffort(effort: string): void {\n this.isEffortDropdownOpen_$.set(false);\n this.effortChanged.emit(effort);\n }\n\n // ── Attachments ──────────────────────────────────────────────────────\n\n /**\n * Fájl kiválasztás event kezelése (file input change).\n */\n async handleFilesSelected(event: Event): Promise<void> {\n const input: HTMLInputElement | null = event.target as HTMLInputElement | null;\n const list: FileList | null = input?.files ?? null;\n if (!list?.length) {\n return;\n }\n\n await this.addFiles(Array.from(list));\n\n if (input) {\n input.value = '';\n }\n }\n\n /**\n * Clipboard paste kezelése — ha kép van a vágólapon, csatolásként befogadjuk.\n */\n handlePaste(event: ClipboardEvent): void {\n if (!this.enableAttachments()) {\n return;\n }\n const items: DataTransferItemList | undefined = event.clipboardData?.items;\n if (!items?.length) {\n return;\n }\n\n const imageFiles: File[] = [];\n for (let i: number = 0; i < items.length; i++) {\n const item: DataTransferItem = items[i];\n if (item.kind === 'file' && IMAGE_MIME_PREFIXES.some(\n (prefix: string): boolean => item.type.toLowerCase().startsWith(prefix),\n )) {\n const file: File | null = item.getAsFile();\n if (file) {\n imageFiles.push(file);\n }\n }\n }\n\n if (imageFiles.length) {\n event.preventDefault();\n void this.addFiles(imageFiles);\n }\n }\n\n /**\n * Attachment eltávolítása.\n */\n handleRemoveAttachment(id: string): void {\n const found: CCAP_PendingAttachment_Interface | undefined =\n this.pendingAttachments.find(\n (a: CCAP_PendingAttachment_Interface): boolean => a.id === id,\n );\n if (found?.previewUrl) {\n URL.revokeObjectURL(found.previewUrl);\n }\n this.pendingAttachments = this.pendingAttachments.filter(\n (a: CCAP_PendingAttachment_Interface): boolean => a.id !== id,\n );\n this.attachmentsChanged.emit(this.pendingAttachments);\n }\n\n /**\n * Pending attachments törlése (szülő hívja küldés után).\n */\n clearAttachments(): void {\n for (const att of this.pendingAttachments) {\n if (att.previewUrl) {\n URL.revokeObjectURL(att.previewUrl);\n }\n }\n this.pendingAttachments = [];\n this.attachmentsChanged.emit(this.pendingAttachments);\n }\n\n // ── Privát ───────────────────────────────────────────────────────────\n\n /**\n * Küldés vagy queue-ba rakás — running alatt queueRequested, idle-ben sendRequested.\n * isSending közben nem engedjük (dupla request védelem); üres tartalom esetén sem.\n */\n private emitSendOrQueue(): void {\n if (this.isSending()) {\n return;\n }\n const hasText: boolean = (this.draftText() ?? '').trim().length > 0;\n const hasAttachments: boolean = this.pendingAttachments.length > 0;\n if (!hasText && !hasAttachments) {\n return;\n }\n if (this.isExecuting()) {\n this.queueRequested.emit();\n } else {\n this.sendRequested.emit();\n }\n }\n\n /**\n * Textarea magasság igazítása scrollHeight alapján (auto-grow mód).\n */\n private adjustTextareaAutoGrow(el: HTMLTextAreaElement): void {\n el.style.height = 'auto';\n const maxHeight: number = Math.round(window.innerHeight * TEXTAREA_AUTO_MAX_VH);\n const newHeight: number = Math.min(el.scrollHeight, maxHeight);\n el.style.height = newHeight + 'px';\n }\n\n /**\n * Resize drag mozgatás — panel magasság frissítés.\n */\n private handleResizeMove(event: PointerEvent): void {\n const wasManual: boolean = this.isManualResize_$();\n const delta: number = this.resizeStartY - event.clientY;\n const maxHeight: number = Math.round(window.innerHeight * 0.7);\n const newHeight: number = Math.max(PANEL_MIN_HEIGHT, Math.min(this.resizeStartHeight + delta, maxHeight));\n\n this.isManualResize_$.set(true);\n this.manualPanelHeight_$.set(newHeight);\n\n // Első resize mozgatás: inline auto-grow style törlés, hogy a h-full class érvényesüljön\n if (!wasManual && this.textareaElRef?.nativeElement) {\n this.textareaElRef.nativeElement.style.height = '';\n }\n }\n\n /**\n * Resize listener-ek eltávolítása (cleanup).\n */\n private cleanupResizeListeners(): void {\n if (this.resizeMoveCleanup) {\n this.resizeMoveCleanup();\n this.resizeMoveCleanup = null;\n }\n if (this.resizeUpCleanup) {\n this.resizeUpCleanup();\n this.resizeUpCleanup = null;\n }\n if (this.resizeCancelCleanup) {\n this.resizeCancelCleanup();\n this.resizeCancelCleanup = null;\n }\n }\n\n /**\n * Bezárja az összes dropdown-ot kivéve a megadottat.\n */\n private closeAllDropdownsExcept(except: string): void {\n if (except !== 'mode') {\n this.isModeDropdownOpen_$.set(false);\n }\n if (except !== 'model') {\n this.isModelDropdownOpen_$.set(false);\n }\n if (except !== 'effort') {\n this.isEffortDropdownOpen_$.set(false);\n }\n }\n\n /**\n * Fájlok hozzáadása a pending attachment listához (file input és clipboard paste közös logika).\n */\n private async addFiles(files: File[]): Promise<void> {\n const room: number = this.maxAttachmentCount() - this.pendingAttachments.length;\n if (room <= 0) {\n return;\n }\n\n const filesToProcess: File[] = files.slice(0, room);\n\n for (const file of filesToProcess) {\n try {\n const base64: string = await this.readFileToBase64(file);\n const isImage: boolean = IMAGE_MIME_PREFIXES.some(\n (prefix: string): boolean => file.type.toLowerCase().startsWith(prefix),\n );\n const id: string =\n typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function'\n ? crypto.randomUUID()\n : `att-${Date.now()}-${Math.random()}`;\n\n const attachment: CCAP_PendingAttachment_Interface = {\n id: id,\n fileName: file.name,\n mimeType: file.type || 'application/octet-stream',\n base64: base64,\n previewUrl: isImage ? URL.createObjectURL(file) : undefined,\n sizeBytes: file.size,\n isImage: isImage,\n };\n\n this.pendingAttachments = [...this.pendingAttachments, attachment];\n } catch {\n // FileReader hiba: kihagyjuk ezt a fájlt\n }\n }\n\n this.attachmentsChanged.emit(this.pendingAttachments);\n }\n\n /**\n * Fájl beolvasása base64-be.\n */\n private readFileToBase64(file: File): Promise<string> {\n return new Promise(\n (\n resolve: (v: string) => void,\n reject: (e: unknown) => void,\n ): void => {\n const reader: FileReader = new FileReader();\n reader.onload = (): void => {\n const dataUrl: string = String(reader.result ?? '');\n const commaIdx: number = dataUrl.indexOf(',');\n resolve(commaIdx >= 0 ? dataUrl.slice(commaIdx + 1) : dataUrl);\n };\n reader.onerror = (): void => {\n reject(reader.error);\n };\n reader.readAsDataURL(file);\n },\n );\n }\n}\n", "<!-- Resize handle — húzással méretezés; dupla kattintás = auto mód visszaállítás -->\n<div class=\"group flex items-center justify-center h-2.5 shrink-0 cursor-ns-resize select-none touch-none\"\n (pointerdown)=\"handleResizeStart($event)\"\n (dblclick)=\"handleResizeReset()\">\n <div class=\"w-8 h-0.5 rounded-full bg-neutral-600 transition-all\n group-hover:bg-neonCyan/50 group-hover:w-12\"></div>\n</div>\n\n<!-- Knight Rider scanner — agent futása közben a border-t vonalon sweepel -->\n@if (isExecuting()) {\n <div class=\"knight-rider-bar\"></div>\n}\n\n<div class=\"flex flex-col gap-2 p-2 flex-1 min-h-0\">\n <!-- Attachment preview sor -->\n @if (pendingAttachments.length) {\n <div class=\"flex flex-wrap gap-2\">\n @for (att of pendingAttachments; track att.id) {\n @if (att.isImage && att.previewUrl) {\n <div class=\"relative w-14 h-14 rounded border border-neonDefault overflow-hidden shrink-0\">\n <img [src]=\"att.previewUrl\" alt=\"\" class=\"w-full h-full object-cover\" />\n <button type=\"button\"\n class=\"absolute top-0 right-0 w-4 h-4 text-[10px] leading-4 bg-black/70 text-white border-0 cursor-pointer\"\n (click)=\"handleRemoveAttachment(att.id)\">\n ×\n </button>\n </div>\n } @else {\n <div class=\"relative flex items-center gap-1 px-2 py-1 rounded border border-neonDefault text-[10px] text-neutral-400 shrink-0 max-w-[140px]\">\n <svg class=\"w-3 h-3 shrink-0 opacity-60\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M7 1H3a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V4L7 1z\" stroke=\"currentColor\" stroke-width=\"1\"/>\n <polyline points=\"7 1 7 4 10 4\" stroke=\"currentColor\" stroke-width=\"1\"/>\n </svg>\n <span class=\"truncate\">{{ att.fileName }}</span>\n <button type=\"button\"\n class=\"ml-auto w-3 h-3 text-[10px] leading-3 text-neutral-500 hover:text-white cursor-pointer shrink-0\"\n (click)=\"handleRemoveAttachment(att.id)\">\n ×\n </button>\n </div>\n }\n }\n </div>\n }\n\n <!-- Queue panel (textarea fölött) -->\n @if (queueItems().length) {\n <div class=\"flex flex-col gap-1 rounded border border-neutral-700/50 bg-neutral-900/60 p-2 text-[11px]\">\n <div class=\"flex items-center gap-1.5 text-neutral-500 font-medium mb-0.5\">\n <svg class=\"w-3 h-3 opacity-60\" viewBox=\"0 0 12 12\" fill=\"none\">\n <rect x=\"1\" y=\"1\" width=\"10\" height=\"3\" rx=\"0.5\" stroke=\"currentColor\" stroke-width=\"0.8\"/>\n <rect x=\"1\" y=\"5\" width=\"10\" height=\"3\" rx=\"0.5\" stroke=\"currentColor\" stroke-width=\"0.8\" opacity=\"0.6\"/>\n <rect x=\"1\" y=\"9\" width=\"10\" height=\"3\" rx=\"0.5\" stroke=\"currentColor\" stroke-width=\"0.8\" opacity=\"0.3\"/>\n </svg>\n <span>Queued ({{ queueItems().length }})</span>\n @if (isQueueLocked()) {\n <span class=\"ml-1 rounded bg-neonAmber/15 px-1 py-px text-[9px] font-semibold text-neonAmber uppercase tracking-wider\">Editing</span>\n }\n </div>\n\n <!-- REQ-UI-QUEUE-001: a queue lista magassága korlátolt + görgethető, ha sok elem van. -->\n <div class=\"flex flex-col gap-1 max-h-[280px] overflow-y-auto overscroll-contain pr-1\">\n @for (item of queueItems(); track item.queueItemId) {\n <div class=\"flex items-start gap-1.5 rounded px-2 py-1.5 transition-colors\"\n [class]=\"editingQueueItemId() === item.queueItemId\n ? 'bg-neutral-800 border border-neonAmber/30'\n : 'bg-neutral-800/40 hover:bg-neutral-800/70'\">\n\n @if (editingQueueItemId() === item.queueItemId) {\n <!-- Edit mód -->\n <textarea\n class=\"flex-1 min-h-[36px] max-h-[100px] resize-none rounded border border-neutral-600 bg-neutral-900\n px-2 py-1 text-[11px] text-neutral-200 focus:border-neonAmber focus:outline-none\"\n rows=\"2\"\n [ngModel]=\"editingQueueText()\"\n (ngModelChange)=\"queueEditTextChange.emit($event)\">\n </textarea>\n <div class=\"flex flex-col gap-1 shrink-0\">\n <button type=\"button\"\n class=\"px-1.5 py-0.5 text-[10px] rounded bg-neonAmber/20 text-neonAmber hover:bg-neonAmber/30 transition-colors cursor-pointer\"\n (click)=\"queueEditSave.emit()\">\n Save\n </button>\n <button type=\"button\"\n class=\"px-1.5 py-0.5 text-[10px] rounded text-neutral-500 hover:text-neutral-300 hover:bg-neutral-700 transition-colors cursor-pointer\"\n (click)=\"queueEditCancel.emit()\">\n Cancel\n </button>\n </div>\n } @else {\n <!-- Read mód -->\n <span class=\"flex-1 text-neutral-300 break-words whitespace-pre-wrap leading-relaxed\">{{ item.text }}</span>\n <div class=\"flex items-center gap-1 shrink-0 opacity-0 group-hover:opacity-100 transition-opacity\"\n [class.opacity-100]=\"true\">\n <!-- Reorder gombok (fel/le) -->\n <button type=\"button\"\n class=\"px-1 py-0.5 text-[10px] rounded text-neutral-500 hover:text-neutral-200 hover:bg-neutral-700 transition-colors cursor-pointer disabled:opacity-30 disabled:cursor-not-allowed\"\n [disabled]=\"isQueueLocked() || $first\"\n (click)=\"queueMoveUp.emit(item.queueItemId)\"\n title=\"Move up\">\n <svg class=\"w-3 h-3\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M6 3L3 7h6L6 3z\" fill=\"currentColor\"/>\n </svg>\n </button>\n <button type=\"button\"\n class=\"px-1 py-0.5 text-[10px] rounded text-neutral-500 hover:text-neutral-200 hover:bg-neutral-700 transition-colors cursor-pointer disabled:opacity-30 disabled:cursor-not-allowed\"\n [disabled]=\"isQueueLocked() || $last\"\n (click)=\"queueMoveDown.emit(item.queueItemId)\"\n title=\"Move down\">\n <svg class=\"w-3 h-3\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M6 9L3 5h6L6 9z\" fill=\"currentColor\"/>\n </svg>\n </button>\n <button type=\"button\"\n class=\"px-1.5 py-0.5 text-[10px] rounded text-neutral-500 hover:text-neutral-200 hover:bg-neutral-700 transition-colors cursor-pointer disabled:opacity-30 disabled:cursor-not-allowed\"\n [disabled]=\"isQueueLocked()\"\n (click)=\"queueEditStart.emit(item.queueItemId)\">\n Edit\n </button>\n <button type=\"button\"\n class=\"px-1.5 py-0.5 text-[10px] rounded text-neutral-500 hover:text-red-400 hover:bg-red-950/30 transition-colors cursor-pointer disabled:opacity-30 disabled:cursor-not-allowed\"\n [disabled]=\"isQueueLocked()\"\n (click)=\"queueRemoveItem.emit(item.queueItemId)\">\n &times;\n </button>\n <button type=\"button\"\n class=\"px-1.5 py-0.5 text-[10px] rounded text-neutral-500 hover:text-neonCyan hover:bg-neonCyan/10 transition-colors cursor-pointer disabled:opacity-30 disabled:cursor-not-allowed\"\n [disabled]=\"isQueueLocked()\"\n (click)=\"queueSendNow.emit(item.queueItemId)\">\n Send Now\n </button>\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Textarea + send/stop gomb egymás mellett -->\n <div class=\"flex gap-2\"\n [class.flex-1]=\"isManualResize_$()\"\n [class.min-h-0]=\"isManualResize_$()\">\n <!-- Textarea -->\n <div class=\"relative min-w-0 flex-1\"\n [class.min-h-0]=\"isManualResize_$()\">\n <textarea\n #textareaEl\n class=\"min-h-[60px] w-full resize-none rounded border border-neutral-700 bg-neutral-800\n px-3 py-2 text-sm text-neutral-200 placeholder-neutral-600\n focus:border-ccapAccent focus:outline-none\"\n [class.h-full]=\"isManualResize_$()\"\n [attr.rows]=\"textareaRows()\"\n [placeholder]=\"placeholder()\"\n [ngModel]=\"draftText()\"\n (ngModelChange)=\"draftTextChange.emit($event)\"\n (input)=\"handleTextareaInput()\"\n (keydown)=\"handleKeyDown($event)\"\n (paste)=\"handlePaste($event)\">\n </textarea>\n </div>\n\n <!-- Voice (felül) + Send/Stop+Queue (alul) — textarea jobb oldalán, space-between; gap-2 minimum távolság, hogy alacsony panelnél se csúsztanak össze -->\n <div class=\"shrink-0 self-stretch flex flex-col items-center justify-between gap-2\">\n <ng-content select=\"[sInputTextareaAccessory]\"></ng-content>\n @if (isExecuting()) {\n <!-- Running: Queue (amber, felül — ez az új default Enter target) + Stop (piros, alul — execution leállítás) -->\n <div class=\"flex flex-col items-center gap-1.5\">\n <!-- Queue gomb: paper-plane + \"+\" badge a jobb-alsó sarokban; Enter is ezt hívja futás közben -->\n <button\n type=\"button\"\n class=\"flex items-center justify-center min-w-[44px] min-h-[44px] w-10 h-10 rounded-full shrink-0\n bg-neutral-900 border-2 border-neonAmber/60 text-neonAmber\n hover:border-neonAmber hover:shadow-neon-glow-amber hover:bg-neonAmber/10 transition-all duration-200 disabled:opacity-40\n focus:outline-none focus:ring-2 focus:ring-neonAmber focus:ring-offset-2 focus:ring-offset-neutral-900\"\n [disabled]=\"isSending()\"\n (click)=\"handleQueueClick()\"\n aria-label=\"Add to queue\"\n title=\"Add to queue (Enter)\">\n @if (isSending()) {\n <span class=\"inline-block w-5 h-5 shrink-0 animate-spin rounded-full border-2 border-neonAmber/40 border-t-neonAmber\"\n aria-hidden=\"true\"></span>\n } @else {\n <svg class=\"w-5 h-5 shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <!-- Paper-plane — kisebb, bal-felső orientációjú, hogy helyet adjon a plus badge-nek -->\n <polygon points=\"18 3 2 9 9 12 18 3\" />\n <polyline points=\"18 3 11 19 9 12\" />\n <!-- Plus jel — jobb-alsó sarokban, jelzi a „queue-hoz adás\" szemantikát -->\n <line x1=\"19\" y1=\"15\" x2=\"19\" y2=\"21\" />\n <line x1=\"16\" y1=\"18\" x2=\"22\" y2=\"18\" />\n </svg>\n }\n </button>\n <button\n type=\"button\"\n class=\"flex items-center justify-center min-w-[44px] min-h-[44px] w-10 h-10 rounded-full shrink-0\n bg-neutral-900 border-2 border-neonRed/50 text-red-300\n hover:border-neonRed hover:shadow-neon-glow-red transition-all duration-200 disabled:opacity-40\n focus:outline-none focus:ring-2 focus:ring-neonRed focus:ring-offset-2 focus:ring-offset-neutral-900\"\n [disabled]=\"isStopping()\"\n (click)=\"handleStopClick()\"\n [attr.aria-label]=\"isStopping() ? 'Stopping…' : 'Stop'\"\n [attr.title]=\"isStopping() ? 'Stopping…' : 'Stop'\">\n @if (isStopping()) {\n <span class=\"inline-block w-5 h-5 shrink-0 animate-spin rounded-full border-2 border-neonRed/40 border-t-neonRed\"\n aria-hidden=\"true\"></span>\n } @else {\n <svg class=\"w-5 h-5 shrink-0\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"2\" />\n </svg>\n }\n </button>\n </div>\n } @else {\n <!-- Idle: sima Send gomb -->\n <button\n type=\"button\"\n class=\"flex items-center justify-center min-w-[44px] min-h-[44px] w-10 h-10 rounded-full shrink-0\n bg-ccapAccent text-black transition-all duration-200 disabled:opacity-50\n hover:bg-ccapAccent/80 hover:shadow-neon-glow-cyan\n focus:outline-none focus:ring-2 focus:ring-ccapAccent focus:ring-offset-2 focus:ring-offset-neutral-900\"\n [disabled]=\"isSending()\"\n (click)=\"handleSendClick()\"\n aria-label=\"Send\"\n title=\"Send\">\n @if (isSending()) {\n <span class=\"inline-block w-5 h-5 shrink-0 animate-spin rounded-full border-2 border-black/40 border-t-black\"\n aria-hidden=\"true\"></span>\n } @else {\n <svg class=\"w-5 h-5 shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\" />\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\" />\n </svg>\n }\n </button>\n }\n </div>\n </div>\n\n <!-- Alsó sor: attach + config dropdownok -->\n <div class=\"flex flex-wrap items-center gap-2 text-[11px] shrink-0\">\n <!-- Attach gomb -->\n @if (enableAttachments()) {\n <label class=\"flex items-center gap-1 px-2 py-1 rounded border border-neutral-700\n text-neutral-400 hover:text-neutral-300 hover:border-neutral-600\n cursor-pointer transition-colors shrink-0\">\n <svg class=\"w-3 h-3 opacity-60\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M10.5 5.5l-4.3 4.3a2.5 2.5 0 0 1-3.5-3.5L7 2a1.7 1.7 0 0 1 2.4 2.4L5.1 8.7a.8.8 0 0 1-1.2-1.2L7.5 4\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\"/>\n </svg>\n Attach\n <input type=\"file\"\n class=\"sr-only\"\n [accept]=\"acceptedFileTypes()\"\n multiple\n (change)=\"handleFilesSelected($event)\" />\n </label>\n }\n\n <!-- Mode dropdown -->\n @if (modeOptions().length) {\n <div class=\"relative\">\n <button\n type=\"button\"\n class=\"flex items-center gap-1 px-2 py-0.5 rounded border transition-colors cursor-pointer\"\n [class]=\"isModeDropdownOpen_$()\n ? 'border-neonCyan/50 text-neonCyan bg-neonCyan/10'\n : 'border-neutral-700 text-neutral-400 hover:text-neutral-300 hover:border-neutral-600'\"\n (click)=\"handleToggleModeDropdown()\"\n [attr.aria-label]=\"'Mode: ' + selectedMode()\">\n <!-- REQ-MOBILE-INPUT-COMPACT-001 (cycle 440): label + ':' rejtve mobile-on, csak value. -->\n <span class=\"uppercase font-medium tracking-wide hidden gt-xs:inline\">Mode</span>\n <span class=\"text-neutral-500 mx-0.5 hidden gt-xs:inline\">:</span>\n <span class=\"capitalize\">{{ selectedMode() }}</span>\n <svg class=\"w-3 h-3 ml-0.5 opacity-50\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M3 5l3 3 3-3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </button>\n @if (isModeDropdownOpen_$()) {\n <div class=\"absolute bottom-full left-0 mb-1 bg-neutral-900 border border-neutral-700 rounded-lg shadow-lg overflow-hidden z-20 min-w-[100px]\">\n @for (mode of modeOptions(); track mode) {\n <button\n type=\"button\"\n class=\"w-full text-left px-3 py-1.5 text-[11px] capitalize transition-colors cursor-pointer\"\n [class]=\"mode === selectedMode()\n ? 'text-neonCyan bg-neonCyan/10'\n : 'text-neutral-400 hover:text-neutral-200 hover:bg-neutral-800'\"\n (click)=\"handleSelectMode(mode)\">\n {{ mode }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n <!-- Model dropdown -->\n @if (modelOptions().length) {\n <div class=\"relative\">\n <button\n type=\"button\"\n class=\"flex items-center gap-1 px-2 py-0.5 rounded border transition-colors cursor-pointer\"\n [class]=\"isModelDropdownOpen_$()\n ? 'border-neonAmber/50 text-neonAmber bg-neonAmber/10'\n : 'border-neutral-700 text-neutral-400 hover:text-neutral-300 hover:border-neutral-600'\"\n (click)=\"handleToggleModelDropdown()\"\n [attr.aria-label]=\"'Model: ' + selectedModel()\">\n <!-- REQ-MOBILE-INPUT-COMPACT-001 (cycle 440): label + ':' rejtve mobile-on, csak value. -->\n <span class=\"uppercase font-medium tracking-wide hidden gt-xs:inline\">Model</span>\n <span class=\"text-neutral-500 mx-0.5 hidden gt-xs:inline\">:</span>\n <span class=\"capitalize\">{{ selectedModel() }}</span>\n <svg class=\"w-3 h-3 ml-0.5 opacity-50\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M3 5l3 3 3-3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </button>\n @if (isModelDropdownOpen_$()) {\n <div class=\"absolute bottom-full left-0 mb-1 bg-neutral-900 border border-neutral-700 rounded-lg shadow-lg overflow-hidden z-20 min-w-[100px]\">\n @for (model of modelOptions(); track model) {\n <button\n type=\"button\"\n class=\"w-full text-left px-3 py-1.5 text-[11px] capitalize transition-colors cursor-pointer\"\n [class]=\"model === selectedModel()\n ? 'text-neonAmber bg-neonAmber/10'\n : 'text-neutral-400 hover:text-neutral-200 hover:bg-neutral-800'\"\n (click)=\"handleSelectModel(model)\">\n {{ model }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n <!-- Effort dropdown -->\n @if (effortOptions().length) {\n <div class=\"relative\">\n <button\n type=\"button\"\n class=\"flex items-center gap-1 px-2 py-0.5 rounded border transition-colors cursor-pointer\"\n [class]=\"isEffortDropdownOpen_$()\n ? 'border-neonPurple/50 text-neonPurple bg-neonPurple/10'\n : 'border-neutral-700 text-neutral-400 hover:text-neutral-300 hover:border-neutral-600'\"\n (click)=\"handleToggleEffortDropdown()\"\n [attr.aria-label]=\"'Effort: ' + selectedEffort()\">\n <!-- REQ-MOBILE-INPUT-COMPACT-001 (cycle 440): label + ':' rejtve mobile-on, csak value. -->\n <span class=\"uppercase font-medium tracking-wide hidden gt-xs:inline\">Effort</span>\n <span class=\"text-neutral-500 mx-0.5 hidden gt-xs:inline\">:</span>\n <span class=\"capitalize\">{{ selectedEffort() }}</span>\n <svg class=\"w-3 h-3 ml-0.5 opacity-50\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M3 5l3 3 3-3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </button>\n @if (isEffortDropdownOpen_$()) {\n <div class=\"absolute bottom-full left-0 mb-1 bg-neutral-900 border border-neutral-700 rounded-lg shadow-lg overflow-hidden z-20 min-w-[100px]\">\n @for (effort of effortOptions(); track effort) {\n <button\n type=\"button\"\n class=\"w-full text-left px-3 py-1.5 text-[11px] capitalize transition-colors cursor-pointer\"\n [class]=\"effort === selectedEffort()\n ? 'text-neonPurple bg-neonPurple/10'\n : 'text-neutral-400 hover:text-neutral-200 hover:bg-neutral-800'\"\n (click)=\"handleSelectEffort(effort)\">\n {{ effort }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n <div class=\"flex-1\"></div>\n\n <!-- Usage kijelzés (token szám / cost) -->\n @if (usageText()) {\n <div class=\"flex items-center gap-1.5 text-neutral-500 shrink-0\">\n <svg class=\"w-3 h-3 opacity-60\" viewBox=\"0 0 12 12\" fill=\"none\">\n <circle cx=\"6\" cy=\"6\" r=\"5\" stroke=\"currentColor\" stroke-width=\"1\"/>\n <path d=\"M6 3v3.5l2 1.5\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\"/>\n </svg>\n <span>{{ usageText() }}</span>\n </div>\n }\n </div>\n</div>\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Component } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n/**\n * Session shell felső toolbar: 1fr | auto | 1fr grid, három ng-content slot.\n * Domain-logika nélkül — csak elrendezés.\n */\n@Component({\n selector: 'app-s-session-shell-toolbar',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './s-session-shell-toolbar.component.html',\n host: { class: 'block shrink-0 w-full min-w-0' },\n})\n/** S_SessionShellToolbar_Component class. */\nexport class S_SessionShellToolbar_Component {}\n", "<div\n class=\"grid grid-cols-[1fr_auto_1fr] items-center gap-x-1 gap-y-1 p-1 border-b border-neonDefault bg-ccapSurface w-full min-w-0\">\n <div class=\"flex items-center gap-1 min-w-0 justify-self-start\">\n <ng-content select=\"[sSessionToolbarLeft]\"></ng-content>\n </div>\n <div\n class=\"flex items-center justify-center gap-2 min-w-0 max-w-[min(100vw-12rem,42rem)] justify-self-center\">\n <ng-content select=\"[sSessionToolbarCenter]\"></ng-content>\n </div>\n <div class=\"flex items-center gap-1 min-w-0 justify-self-end flex-wrap justify-end\">\n <ng-content select=\"[sSessionToolbarRight]\"></ng-content>\n </div>\n</div>\n", "import { Component, input, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n/**\n * Shell: opcionális bal sidebar fix px szélességgel + resize handle + fő tartalom + opcionális jobb panel.\n * A szélesség mentés és a drag matematika a szülőn marad — itt csak a handle esemény.\n * Opcionális mobil backdrop: sidebar nyitott állapotban xs nézetben overlay-t mutat.\n */\n@Component({\n selector: 'app-s-resizable-session-shell-layout',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './s-resizable-session-shell-layout.component.html',\n host: { class: 'block flex flex-1 min-h-0 w-full overflow-hidden' },\n})\n/** S_ResizableSessionShellLayout_Component class. */\nexport class S_ResizableSessionShellLayout_Component {\n\n /** Sidebar látható. */\n readonly isSidebarOpen = input<boolean>(true);\n\n /** Sidebar szélesség (px). */\n readonly sidebarWidthPx = input<number>(320);\n\n /** Resize aktív — host select-none-hoz. */\n readonly isResizing = input<boolean>(false);\n\n /** Sidebar resize kezdő esemény (pointerdown a handle-n). */\n readonly sidebarResizeStart = output<PointerEvent>();\n\n /**\n * Mobil backdrop aktív — ha true, xs nézetben fix overlay-t renderel a sidebar mögött.\n * A szülő feladata eldönteni, mikor aktív (általában: sidebar nyitott állapotban).\n * CSS-en keresztül (xs:block gt-xs:hidden) csak mobilon jelenik meg.\n */\n readonly isMobileBackdropActive = input<boolean>(false);\n\n /** Mobil backdrop kattintás esemény — a szülő kezeli (általában: sidebar bezárás). */\n readonly mobileBackdropClicked = output<void>();\n}\n", "@if (isMobileBackdropActive()) {\n <div class=\"fixed inset-0 z-30 bg-black/50 xs:block gt-xs:hidden\"\n (click)=\"mobileBackdropClicked.emit()\"\n aria-hidden=\"true\"></div>\n}\n@if (isSidebarOpen()) {\n <div\n class=\"border-r border-neonDefault bg-ccapSurface flex flex-col min-h-0 overflow-hidden shrink-0 self-stretch\"\n [style.width.px]=\"sidebarWidthPx()\">\n <ng-content select=\"[sSessionShellSidebar]\"></ng-content>\n </div>\n <div\n class=\"w-1 shrink-0 cursor-col-resize hover:bg-ccapAccent/40 active:bg-ccapAccent/60 transition-colors touch-none\"\n (pointerdown)=\"sidebarResizeStart.emit($event)\">\n </div>\n}\n<div class=\"flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden bg-ccapBg self-stretch\">\n <ng-content select=\"[sSessionShellMain]\"></ng-content>\n</div>\n<ng-content select=\"[sSessionShellRightPanel]\"></ng-content>\n", "import { Component, input, output, signal, OnDestroy, ViewChild, ElementRef, Renderer2, HostBinding, effect } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\n\nimport {\n CCAP_PendingAttachment_Interface,\n} from '../../../../../_models/interfaces/session/ccap-pending-attachment.interface';\nimport {\n SQ_SnapshotItem_Interface,\n} from '../../../../../_models/interfaces/session-queue/ccap-session-queue-snapshot.interface';\n\n/** Engedélyezett image MIME típusok (preview-hoz). */\nconst IMAGE_MIME_PREFIXES: string[] = ['image/png', 'image/jpeg', 'image/webp', 'image/gif'];\n\n/** Panel minimális magassága px-ben (resize alsó limit). */\nconst PANEL_MIN_HEIGHT: number = 120;\n\n/** Textarea auto-grow maximális magassága viewport arányában. */\nconst TEXTAREA_AUTO_MAX_VH: number = 0.4;\n\n/**\n * Közös session input komponens — textarea, send/stop, config dropdownok, fájl csatolás.\n * Feature flag input-okkal konfigurálható: ami üres / false, az nem jelenik meg.\n *\n * Content projection:\n * - `[sInputTextareaAccessory]` — absolute overlay a textarea-ra (pl. voice gomb)\n */\n@Component({\n selector: 'app-s-session-input',\n standalone: true,\n imports: [CommonModule, FormsModule],\n templateUrl: './s-session-input.component.html',\n styleUrls: ['./s-session-input.component.scss'],\n host: { class: 'flex flex-col shrink-0 border-t border-neonDefault bg-ccapSurface relative overflow-hidden' },\n})\n/** S_SessionInput_Component class. */\nexport class S_SessionInput_Component implements OnDestroy {\n\n // ── Szöveg ───────────────────────────────────────────────────────────\n\n /** Piszkozat szöveg (two-way a szülővel). */\n readonly draftText = input<string>('');\n\n /** Placeholder. */\n readonly placeholder = input<string>('Send a prompt…');\n\n /** Textarea sorok. */\n readonly textareaRows = input<number>(3);\n\n /** Piszkozat változás. */\n readonly draftTextChange = output<string>();\n\n // ── Állapot ──────────────────────────────────────────────────────────\n\n /** Agent dolgozik — ilyenkor Stop gomb jelenik meg Send helyett. */\n readonly isExecuting = input<boolean>(false);\n\n /** Küldés folyamatban. */\n readonly isSending = input<boolean>(false);\n\n /** Stop folyamatban. */\n readonly isStopping = input<boolean>(false);\n\n // ── Config feature flags ─────────────────────────────────────────────\n\n /** Mód opciók (üres = nem mutatjuk). */\n readonly modeOptions = input<string[]>([]);\n\n /** Kiválasztott mód. */\n readonly selectedMode = input<string>('');\n\n /** Model opciók (üres = nem mutatjuk). */\n readonly modelOptions = input<string[]>([]);\n\n /** Kiválasztott model. */\n readonly selectedModel = input<string>('');\n\n /** Effort opciók (üres = nem mutatjuk). */\n readonly effortOptions = input<string[]>([]);\n\n /** Kiválasztott effort. */\n readonly selectedEffort = input<string>('');\n\n /** Használat kijelzés (token szám / cost; üres = nem mutatjuk). */\n readonly usageText = input<string>('');\n\n // ── Queue ────────────────────────────────────────────────────────────\n\n /** Queue elemek (üres = nincs queue panel). */\n readonly queueItems = input<SQ_SnapshotItem_Interface[]>([]);\n\n /** Queue lock állapot (true = szerkesztés alatt, auto-delivery tiltott). */\n readonly isQueueLocked = input<boolean>(false);\n\n /** Szerkesztés alatt álló queue elem ID-ja (null = nincs szerkesztés). */\n readonly editingQueueItemId = input<string | null>(null);\n\n /** Szerkesztés alatti szöveg (two-way a szülővel). */\n readonly editingQueueText = input<string>('');\n\n /** Edit indítás (queueItemId). */\n readonly queueEditStart = output<string>();\n\n /** Szerkesztés közbeni text change. */\n readonly queueEditTextChange = output<string>();\n\n /** Edit mentés. */\n readonly queueEditSave = output<void>();\n\n /** Edit visszavonás. */\n readonly queueEditCancel = output<void>();\n\n /** Elem törlés (queueItemId). */\n readonly queueRemoveItem = output<string>();\n\n /** Azonnali küldés (queueItemId). */\n readonly queueSendNow = output<string>();\n\n /** Elem mozgatás felfelé (queueItemId). */\n readonly queueMoveUp = output<string>();\n\n /** Elem mozgatás lefelé (queueItemId). */\n readonly queueMoveDown = output<string>();\n\n // ── Attachment config ────────────────────────────────────────────────\n\n /** Fájl csatolás engedélyezése. */\n readonly enableAttachments = input<boolean>(false);\n\n /** Elfogadott fájl típusok (accept attribútum). */\n readonly acceptedFileTypes = input<string>(\n 'image/png,image/jpeg,image/webp,image/gif,.txt,.pdf,.md,.json,.csv,.xml,.yaml,.yml,.log',\n );\n\n /** Max csatolható fájlok száma. */\n readonly maxAttachmentCount = input<number>(6);\n\n // ── Outputok ─────────────────────────────────────────────────────────\n\n /** Küldés kérése (idle állapotban Enter / Send gomb). */\n readonly sendRequested = output<void>();\n\n /** Queue-ba küldés kérése (isExecuting alatt Enter / Queue gomb) — server oldalon auto-enqueue ugyanazon prompt endpointon keresztül. */\n readonly queueRequested = output<void>();\n\n /** Stop kérése. */\n readonly stopRequested = output<void>();\n\n /** Mód változás. */\n readonly modeChanged = output<string>();\n\n /** Model változás. */\n readonly modelChanged = output<string>();\n\n /** Effort változás. */\n readonly effortChanged = output<string>();\n\n /** Attachment lista változás. */\n readonly attachmentsChanged = output<CCAP_PendingAttachment_Interface[]>();\n\n // ── Belső state ──────────────────────────────────────────────────────\n\n /** Pending attachment-ek. */\n pendingAttachments: CCAP_PendingAttachment_Interface[] = [];\n\n /** Dropdown nyitott állapotok. */\n readonly isModeDropdownOpen_$ = signal<boolean>(false);\n readonly isModelDropdownOpen_$ = signal<boolean>(false);\n readonly isEffortDropdownOpen_$ = signal<boolean>(false);\n\n // ── Resize ───────────────────────────────────────────────────────────\n\n /** Manuális resize aktív (drag után; dblclick reset-eli). */\n readonly isManualResize_$ = signal<boolean>(false);\n\n /** Manuális panel magasság px-ben. */\n readonly manualPanelHeight_$ = signal<number>(300);\n\n /** Textarea DOM referencia (auto-grow számításhoz). */\n @ViewChild('textareaEl') textareaElRef: ElementRef<HTMLTextAreaElement> | undefined;\n\n /** Resize drag kiindulási Y pozíció. */\n private resizeStartY: number = 0;\n\n /** Resize drag kiindulási panel magasság. */\n private resizeStartHeight: number = 0;\n\n /** Document pointermove listener cleanup. */\n private resizeMoveCleanup: (() => void) | null = null;\n\n /** Document pointerup listener cleanup. */\n private resizeUpCleanup: (() => void) | null = null;\n\n /** Document pointercancel listener cleanup. */\n private resizeCancelCleanup: (() => void) | null = null;\n\n /** Host magasság — manual resize módban explicit, auto módban undefined (content-driven). */\n @HostBinding('style.height.px')\n get hostHeightPx(): number | undefined {\n return this.isManualResize_$() ? this.manualPanelHeight_$() : undefined;\n }\n\n constructor(\n private elementRef: ElementRef<HTMLElement>,\n private renderer: Renderer2,\n ) {\n /** Auto-grow effect — draftText változáskor (pl. küldés utáni törlés) textarea magasság újraszámolás. */\n effect(() => {\n this.draftText();\n if (!this.isManualResize_$()) {\n requestAnimationFrame(() => {\n if (this.textareaElRef?.nativeElement) {\n this.adjustTextareaAutoGrow(this.textareaElRef.nativeElement);\n }\n });\n }\n });\n }\n\n // ── Lifecycle ────────────────────────────────────────────────────────\n\n ngOnDestroy(): void {\n this.cleanupResizeListeners();\n for (const att of this.pendingAttachments) {\n if (att.previewUrl) {\n URL.revokeObjectURL(att.previewUrl);\n }\n }\n this.pendingAttachments = [];\n }\n\n // ── Keyboard ─────────────────────────────────────────────────────────\n\n /**\n * Enter küldés, Shift+Enter új sor.\n * Running alatt a default Enter a queueRequested-et emittálja (Stop külön gombbal).\n */\n handleKeyDown(event: KeyboardEvent): void {\n if (event.key !== 'Enter' || event.shiftKey) {\n return;\n }\n event.preventDefault();\n this.emitSendOrQueue();\n }\n\n // ── Send / Queue / Stop ──────────────────────────────────────────────\n\n /**\n * Send gomb kattintás (idle).\n */\n handleSendClick(): void {\n this.emitSendOrQueue();\n }\n\n /**\n * Queue gomb kattintás (running alatt látható, plusz input-send).\n */\n handleQueueClick(): void {\n this.emitSendOrQueue();\n }\n\n /**\n * Stop gomb kattintás.\n */\n handleStopClick(): void {\n if (this.isStopping()) {\n return;\n }\n this.stopRequested.emit();\n }\n\n // ── Textarea auto-grow ───────────────────────────────────────────────\n\n /**\n * Textarea input event — azonnali auto-grow (gyorsabb mint az effect + rAF).\n */\n handleTextareaInput(): void {\n if (this.isManualResize_$()) {\n return;\n }\n if (this.textareaElRef?.nativeElement) {\n this.adjustTextareaAutoGrow(this.textareaElRef.nativeElement);\n }\n }\n\n // ── Panel resize ─────────────────────────────────────────────────────\n\n /**\n * Resize handle pointerdown — drag indítás pointer capture-rel.\n */\n handleResizeStart(event: PointerEvent): void {\n event.preventDefault();\n const target: EventTarget | null = event.currentTarget;\n if (target instanceof HTMLElement) {\n target.setPointerCapture(event.pointerId);\n }\n this.resizeStartY = event.clientY;\n this.resizeStartHeight = this.elementRef.nativeElement.offsetHeight;\n\n this.resizeMoveCleanup = this.renderer.listen('document', 'pointermove', (e: PointerEvent): void => {\n this.handleResizeMove(e);\n });\n this.resizeUpCleanup = this.renderer.listen('document', 'pointerup', (): void => {\n if (target instanceof HTMLElement && target.hasPointerCapture(event.pointerId)) {\n target.releasePointerCapture(event.pointerId);\n }\n this.cleanupResizeListeners();\n });\n this.resizeCancelCleanup = this.renderer.listen('document', 'pointercancel', (): void => {\n if (target instanceof HTMLElement && target.hasPointerCapture(event.pointerId)) {\n target.releasePointerCapture(event.pointerId);\n }\n this.cleanupResizeListeners();\n });\n }\n\n /**\n * Resize handle duplakattintás — visszaállás auto módba.\n */\n handleResizeReset(): void {\n this.isManualResize_$.set(false);\n requestAnimationFrame(() => {\n if (this.textareaElRef?.nativeElement) {\n this.adjustTextareaAutoGrow(this.textareaElRef.nativeElement);\n }\n });\n }\n\n // ── Config dropdowns ─────────────────────────────────────────────────\n\n /** Mód dropdown toggle. */\n handleToggleModeDropdown(): void {\n this.closeAllDropdownsExcept('mode');\n this.isModeDropdownOpen_$.set(!this.isModeDropdownOpen_$());\n }\n\n /** Model dropdown toggle. */\n handleToggleModelDropdown(): void {\n this.closeAllDropdownsExcept('model');\n this.isModelDropdownOpen_$.set(!this.isModelDropdownOpen_$());\n }\n\n /** Effort dropdown toggle. */\n handleToggleEffortDropdown(): void {\n this.closeAllDropdownsExcept('effort');\n this.isEffortDropdownOpen_$.set(!this.isEffortDropdownOpen_$());\n }\n\n /** Mód kiválasztás. */\n handleSelectMode(mode: string): void {\n this.isModeDropdownOpen_$.set(false);\n this.modeChanged.emit(mode);\n }\n\n /** Model kiválasztás. */\n handleSelectModel(model: string): void {\n this.isModelDropdownOpen_$.set(false);\n this.modelChanged.emit(model);\n }\n\n /** Effort kiválasztás. */\n handleSelectEffort(effort: string): void {\n this.isEffortDropdownOpen_$.set(false);\n this.effortChanged.emit(effort);\n }\n\n // ── Attachments ──────────────────────────────────────────────────────\n\n /**\n * Fájl kiválasztás event kezelése (file input change).\n */\n async handleFilesSelected(event: Event): Promise<void> {\n const input: HTMLInputElement | null = event.target as HTMLInputElement | null;\n const list: FileList | null = input?.files ?? null;\n if (!list?.length) {\n return;\n }\n\n await this.addFiles(Array.from(list));\n\n if (input) {\n input.value = '';\n }\n }\n\n /**\n * Clipboard paste kezelése — ha kép van a vágólapon, csatolásként befogadjuk.\n */\n handlePaste(event: ClipboardEvent): void {\n if (!this.enableAttachments()) {\n return;\n }\n const items: DataTransferItemList | undefined = event.clipboardData?.items;\n if (!items?.length) {\n return;\n }\n\n const imageFiles: File[] = [];\n for (let i: number = 0; i < items.length; i++) {\n const item: DataTransferItem = items[i];\n if (item.kind === 'file' && IMAGE_MIME_PREFIXES.some(\n (prefix: string): boolean => item.type.toLowerCase().startsWith(prefix),\n )) {\n const file: File | null = item.getAsFile();\n if (file) {\n imageFiles.push(file);\n }\n }\n }\n\n if (imageFiles.length) {\n event.preventDefault();\n void this.addFiles(imageFiles);\n }\n }\n\n /**\n * Attachment eltávolítása.\n */\n handleRemoveAttachment(id: string): void {\n const found: CCAP_PendingAttachment_Interface | undefined =\n this.pendingAttachments.find(\n (a: CCAP_PendingAttachment_Interface): boolean => a.id === id,\n );\n if (found?.previewUrl) {\n URL.revokeObjectURL(found.previewUrl);\n }\n this.pendingAttachments = this.pendingAttachments.filter(\n (a: CCAP_PendingAttachment_Interface): boolean => a.id !== id,\n );\n this.attachmentsChanged.emit(this.pendingAttachments);\n }\n\n /**\n * Pending attachments törlése (szülő hívja küldés után).\n */\n clearAttachments(): void {\n for (const att of this.pendingAttachments) {\n if (att.previewUrl) {\n URL.revokeObjectURL(att.previewUrl);\n }\n }\n this.pendingAttachments = [];\n this.attachmentsChanged.emit(this.pendingAttachments);\n }\n\n // ── Privát ───────────────────────────────────────────────────────────\n\n /**\n * Küldés vagy queue-ba rakás — running alatt queueRequested, idle-ben sendRequested.\n * isSending közben nem engedjük (dupla request védelem); üres tartalom esetén sem.\n */\n private emitSendOrQueue(): void {\n if (this.isSending()) {\n return;\n }\n const hasText: boolean = (this.draftText() ?? '').trim().length > 0;\n const hasAttachments: boolean = this.pendingAttachments.length > 0;\n if (!hasText && !hasAttachments) {\n return;\n }\n if (this.isExecuting()) {\n this.queueRequested.emit();\n } else {\n this.sendRequested.emit();\n }\n }\n\n /**\n * Textarea magasság igazítása scrollHeight alapján (auto-grow mód).\n */\n private adjustTextareaAutoGrow(el: HTMLTextAreaElement): void {\n el.style.height = 'auto';\n const maxHeight: number = Math.round(window.innerHeight * TEXTAREA_AUTO_MAX_VH);\n const newHeight: number = Math.min(el.scrollHeight, maxHeight);\n el.style.height = newHeight + 'px';\n }\n\n /**\n * Resize drag mozgatás — panel magasság frissítés.\n */\n private handleResizeMove(event: PointerEvent): void {\n const wasManual: boolean = this.isManualResize_$();\n const delta: number = this.resizeStartY - event.clientY;\n const maxHeight: number = Math.round(window.innerHeight * 0.7);\n const newHeight: number = Math.max(PANEL_MIN_HEIGHT, Math.min(this.resizeStartHeight + delta, maxHeight));\n\n this.isManualResize_$.set(true);\n this.manualPanelHeight_$.set(newHeight);\n\n // Első resize mozgatás: inline auto-grow style törlés, hogy a h-full class érvényesüljön\n if (!wasManual && this.textareaElRef?.nativeElement) {\n this.textareaElRef.nativeElement.style.height = '';\n }\n }\n\n /**\n * Resize listener-ek eltávolítása (cleanup).\n */\n private cleanupResizeListeners(): void {\n if (this.resizeMoveCleanup) {\n this.resizeMoveCleanup();\n this.resizeMoveCleanup = null;\n }\n if (this.resizeUpCleanup) {\n this.resizeUpCleanup();\n this.resizeUpCleanup = null;\n }\n if (this.resizeCancelCleanup) {\n this.resizeCancelCleanup();\n this.resizeCancelCleanup = null;\n }\n }\n\n /**\n * Bezárja az összes dropdown-ot kivéve a megadottat.\n */\n private closeAllDropdownsExcept(except: string): void {\n if (except !== 'mode') {\n this.isModeDropdownOpen_$.set(false);\n }\n if (except !== 'model') {\n this.isModelDropdownOpen_$.set(false);\n }\n if (except !== 'effort') {\n this.isEffortDropdownOpen_$.set(false);\n }\n }\n\n /**\n * Fájlok hozzáadása a pending attachment listához (file input és clipboard paste közös logika).\n */\n private async addFiles(files: File[]): Promise<void> {\n const room: number = this.maxAttachmentCount() - this.pendingAttachments.length;\n if (room <= 0) {\n return;\n }\n\n const filesToProcess: File[] = files.slice(0, room);\n\n for (const file of filesToProcess) {\n try {\n const base64: string = await this.readFileToBase64(file);\n const isImage: boolean = IMAGE_MIME_PREFIXES.some(\n (prefix: string): boolean => file.type.toLowerCase().startsWith(prefix),\n );\n const id: string =\n typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function'\n ? crypto.randomUUID()\n : `att-${Date.now()}-${Math.random()}`;\n\n const attachment: CCAP_PendingAttachment_Interface = {\n id: id,\n fileName: file.name,\n mimeType: file.type || 'application/octet-stream',\n base64: base64,\n previewUrl: isImage ? URL.createObjectURL(file) : undefined,\n sizeBytes: file.size,\n isImage: isImage,\n };\n\n this.pendingAttachments = [...this.pendingAttachments, attachment];\n } catch {\n // FileReader hiba: kihagyjuk ezt a fájlt\n }\n }\n\n this.attachmentsChanged.emit(this.pendingAttachments);\n }\n\n /**\n * Fájl beolvasása base64-be.\n */\n private readFileToBase64(file: File): Promise<string> {\n return new Promise(\n (\n resolve: (v: string) => void,\n reject: (e: unknown) => void,\n ): void => {\n const reader: FileReader = new FileReader();\n reader.onload = (): void => {\n const dataUrl: string = String(reader.result ?? '');\n const commaIdx: number = dataUrl.indexOf(',');\n resolve(commaIdx >= 0 ? dataUrl.slice(commaIdx + 1) : dataUrl);\n };\n reader.onerror = (): void => {\n reject(reader.error);\n };\n reader.readAsDataURL(file);\n },\n );\n }\n}\n", "<!-- Resize handle — húzással méretezés; dupla kattintás = auto mód visszaállítás -->\n<div class=\"group flex items-center justify-center h-2.5 shrink-0 cursor-ns-resize select-none touch-none\"\n (pointerdown)=\"handleResizeStart($event)\"\n (dblclick)=\"handleResizeReset()\">\n <div class=\"w-8 h-0.5 rounded-full bg-neutral-600 transition-all\n group-hover:bg-neonCyan/50 group-hover:w-12\"></div>\n</div>\n\n<!-- Knight Rider scanner — agent futása közben a border-t vonalon sweepel -->\n@if (isExecuting()) {\n <div class=\"knight-rider-bar\"></div>\n}\n\n<div class=\"flex flex-col gap-2 p-2 flex-1 min-h-0\">\n <!-- Attachment preview sor -->\n @if (pendingAttachments.length) {\n <div class=\"flex flex-wrap gap-2\">\n @for (att of pendingAttachments; track att.id) {\n @if (att.isImage && att.previewUrl) {\n <div class=\"relative w-14 h-14 rounded border border-neonDefault overflow-hidden shrink-0\">\n <img [src]=\"att.previewUrl\" alt=\"\" class=\"w-full h-full object-cover\" />\n <button type=\"button\"\n class=\"absolute top-0 right-0 w-4 h-4 text-[10px] leading-4 bg-black/70 text-white border-0 cursor-pointer\"\n (click)=\"handleRemoveAttachment(att.id)\">\n ×\n </button>\n </div>\n } @else {\n <div class=\"relative flex items-center gap-1 px-2 py-1 rounded border border-neonDefault text-[10px] text-neutral-400 shrink-0 max-w-[140px]\">\n <svg class=\"w-3 h-3 shrink-0 opacity-60\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M7 1H3a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V4L7 1z\" stroke=\"currentColor\" stroke-width=\"1\"/>\n <polyline points=\"7 1 7 4 10 4\" stroke=\"currentColor\" stroke-width=\"1\"/>\n </svg>\n <span class=\"truncate\">{{ att.fileName }}</span>\n <button type=\"button\"\n class=\"ml-auto w-3 h-3 text-[10px] leading-3 text-neutral-500 hover:text-white cursor-pointer shrink-0\"\n (click)=\"handleRemoveAttachment(att.id)\">\n ×\n </button>\n </div>\n }\n }\n </div>\n }\n\n <!-- Queue panel (textarea fölött) -->\n @if (queueItems().length) {\n <div class=\"flex flex-col gap-1 rounded border border-neutral-700/50 bg-neutral-900/60 p-2 text-[11px]\">\n <div class=\"flex items-center gap-1.5 text-neutral-500 font-medium mb-0.5\">\n <svg class=\"w-3 h-3 opacity-60\" viewBox=\"0 0 12 12\" fill=\"none\">\n <rect x=\"1\" y=\"1\" width=\"10\" height=\"3\" rx=\"0.5\" stroke=\"currentColor\" stroke-width=\"0.8\"/>\n <rect x=\"1\" y=\"5\" width=\"10\" height=\"3\" rx=\"0.5\" stroke=\"currentColor\" stroke-width=\"0.8\" opacity=\"0.6\"/>\n <rect x=\"1\" y=\"9\" width=\"10\" height=\"3\" rx=\"0.5\" stroke=\"currentColor\" stroke-width=\"0.8\" opacity=\"0.3\"/>\n </svg>\n <span>Queued ({{ queueItems().length }})</span>\n @if (isQueueLocked()) {\n <span class=\"ml-1 rounded bg-neonAmber/15 px-1 py-px text-[9px] font-semibold text-neonAmber uppercase tracking-wider\">Editing</span>\n }\n </div>\n\n <!-- REQ-UI-QUEUE-001: a queue lista magassága korlátolt + görgethető, ha sok elem van. -->\n <div class=\"flex flex-col gap-1 max-h-[280px] overflow-y-auto overscroll-contain pr-1\">\n @for (item of queueItems(); track item.queueItemId) {\n <div class=\"flex items-start gap-1.5 rounded px-2 py-1.5 transition-colors\"\n [class]=\"editingQueueItemId() === item.queueItemId\n ? 'bg-neutral-800 border border-neonAmber/30'\n : 'bg-neutral-800/40 hover:bg-neutral-800/70'\">\n\n @if (editingQueueItemId() === item.queueItemId) {\n <!-- Edit mód -->\n <textarea\n class=\"flex-1 min-h-[36px] max-h-[100px] resize-none rounded border border-neutral-600 bg-neutral-900\n px-2 py-1 text-[11px] text-neutral-200 focus:border-neonAmber focus:outline-none\"\n rows=\"2\"\n [ngModel]=\"editingQueueText()\"\n (ngModelChange)=\"queueEditTextChange.emit($event)\">\n </textarea>\n <div class=\"flex flex-col gap-1 shrink-0\">\n <button type=\"button\"\n class=\"px-1.5 py-0.5 text-[10px] rounded bg-neonAmber/20 text-neonAmber hover:bg-neonAmber/30 transition-colors cursor-pointer\"\n (click)=\"queueEditSave.emit()\">\n Save\n </button>\n <button type=\"button\"\n class=\"px-1.5 py-0.5 text-[10px] rounded text-neutral-500 hover:text-neutral-300 hover:bg-neutral-700 transition-colors cursor-pointer\"\n (click)=\"queueEditCancel.emit()\">\n Cancel\n </button>\n </div>\n } @else {\n <!-- Read mód -->\n <span class=\"flex-1 text-neutral-300 break-words whitespace-pre-wrap leading-relaxed\">{{ item.text }}</span>\n <div class=\"flex items-center gap-1 shrink-0 opacity-0 group-hover:opacity-100 transition-opacity\"\n [class.opacity-100]=\"true\">\n <!-- Reorder gombok (fel/le) -->\n <button type=\"button\"\n class=\"px-1 py-0.5 text-[10px] rounded text-neutral-500 hover:text-neutral-200 hover:bg-neutral-700 transition-colors cursor-pointer disabled:opacity-30 disabled:cursor-not-allowed\"\n [disabled]=\"isQueueLocked() || $first\"\n (click)=\"queueMoveUp.emit(item.queueItemId)\"\n title=\"Move up\">\n <svg class=\"w-3 h-3\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M6 3L3 7h6L6 3z\" fill=\"currentColor\"/>\n </svg>\n </button>\n <button type=\"button\"\n class=\"px-1 py-0.5 text-[10px] rounded text-neutral-500 hover:text-neutral-200 hover:bg-neutral-700 transition-colors cursor-pointer disabled:opacity-30 disabled:cursor-not-allowed\"\n [disabled]=\"isQueueLocked() || $last\"\n (click)=\"queueMoveDown.emit(item.queueItemId)\"\n title=\"Move down\">\n <svg class=\"w-3 h-3\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M6 9L3 5h6L6 9z\" fill=\"currentColor\"/>\n </svg>\n </button>\n <button type=\"button\"\n class=\"px-1.5 py-0.5 text-[10px] rounded text-neutral-500 hover:text-neutral-200 hover:bg-neutral-700 transition-colors cursor-pointer disabled:opacity-30 disabled:cursor-not-allowed\"\n [disabled]=\"isQueueLocked()\"\n (click)=\"queueEditStart.emit(item.queueItemId)\">\n Edit\n </button>\n <button type=\"button\"\n class=\"px-1.5 py-0.5 text-[10px] rounded text-neutral-500 hover:text-red-400 hover:bg-red-950/30 transition-colors cursor-pointer disabled:opacity-30 disabled:cursor-not-allowed\"\n [disabled]=\"isQueueLocked()\"\n (click)=\"queueRemoveItem.emit(item.queueItemId)\">\n &times;\n </button>\n <button type=\"button\"\n class=\"px-1.5 py-0.5 text-[10px] rounded text-neutral-500 hover:text-neonCyan hover:bg-neonCyan/10 transition-colors cursor-pointer disabled:opacity-30 disabled:cursor-not-allowed\"\n [disabled]=\"isQueueLocked()\"\n (click)=\"queueSendNow.emit(item.queueItemId)\">\n Send Now\n </button>\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Textarea + send/stop gomb egymás mellett -->\n <div class=\"flex gap-2\"\n [class.flex-1]=\"isManualResize_$()\"\n [class.min-h-0]=\"isManualResize_$()\">\n <!-- Textarea -->\n <div class=\"relative min-w-0 flex-1\"\n [class.min-h-0]=\"isManualResize_$()\">\n <textarea\n #textareaEl\n class=\"min-h-[60px] w-full resize-none rounded border border-neutral-700 bg-neutral-800\n px-3 py-2 text-sm text-neutral-200 placeholder-neutral-600\n focus:border-ccapAccent focus:outline-none\"\n [class.h-full]=\"isManualResize_$()\"\n [attr.rows]=\"textareaRows()\"\n [placeholder]=\"placeholder()\"\n [ngModel]=\"draftText()\"\n (ngModelChange)=\"draftTextChange.emit($event)\"\n (input)=\"handleTextareaInput()\"\n (keydown)=\"handleKeyDown($event)\"\n (paste)=\"handlePaste($event)\">\n </textarea>\n </div>\n\n <!-- Voice (felül) + Send/Stop+Queue (alul) — textarea jobb oldalán, space-between; gap-2 minimum távolság, hogy alacsony panelnél se csúsztanak össze -->\n <div class=\"shrink-0 self-stretch flex flex-col items-center justify-between gap-2\">\n <ng-content select=\"[sInputTextareaAccessory]\"></ng-content>\n @if (isExecuting()) {\n <!-- Running: Queue (amber, felül — ez az új default Enter target) + Stop (piros, alul — execution leállítás) -->\n <div class=\"flex flex-col items-center gap-1.5\">\n <!-- Queue gomb: paper-plane + \"+\" badge a jobb-alsó sarokban; Enter is ezt hívja futás közben -->\n <button\n type=\"button\"\n class=\"flex items-center justify-center min-w-[44px] min-h-[44px] w-10 h-10 rounded-full shrink-0\n bg-neutral-900 border-2 border-neonAmber/60 text-neonAmber\n hover:border-neonAmber hover:shadow-neon-glow-amber hover:bg-neonAmber/10 transition-all duration-200 disabled:opacity-40\n focus:outline-none focus:ring-2 focus:ring-neonAmber focus:ring-offset-2 focus:ring-offset-neutral-900\"\n [disabled]=\"isSending()\"\n (click)=\"handleQueueClick()\"\n aria-label=\"Add to queue\"\n title=\"Add to queue (Enter)\">\n @if (isSending()) {\n <span class=\"inline-block w-5 h-5 shrink-0 animate-spin rounded-full border-2 border-neonAmber/40 border-t-neonAmber\"\n aria-hidden=\"true\"></span>\n } @else {\n <svg class=\"w-5 h-5 shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <!-- Paper-plane — kisebb, bal-felső orientációjú, hogy helyet adjon a plus badge-nek -->\n <polygon points=\"18 3 2 9 9 12 18 3\" />\n <polyline points=\"18 3 11 19 9 12\" />\n <!-- Plus jel — jobb-alsó sarokban, jelzi a „queue-hoz adás\" szemantikát -->\n <line x1=\"19\" y1=\"15\" x2=\"19\" y2=\"21\" />\n <line x1=\"16\" y1=\"18\" x2=\"22\" y2=\"18\" />\n </svg>\n }\n </button>\n <!-- Stop gomb: a Queue gomb FELE akkora (20×20 px vs 40×40 px), mert\n a Stop kevésbé gyakori akció és a Queue legyen a domináns Enter-target. -->\n <button\n type=\"button\"\n class=\"flex items-center justify-center w-5 h-5 rounded-full shrink-0\n bg-neutral-900 border border-neonRed/50 text-red-300\n hover:border-neonRed hover:shadow-neon-glow-red transition-all duration-200 disabled:opacity-40\n focus:outline-none focus:ring-2 focus:ring-neonRed focus:ring-offset-2 focus:ring-offset-neutral-900\"\n [disabled]=\"isStopping()\"\n (click)=\"handleStopClick()\"\n [attr.aria-label]=\"isStopping() ? 'Stopping…' : 'Stop'\"\n [attr.title]=\"isStopping() ? 'Stopping…' : 'Stop'\">\n @if (isStopping()) {\n <span class=\"inline-block w-2.5 h-2.5 shrink-0 animate-spin rounded-full border border-neonRed/40 border-t-neonRed\"\n aria-hidden=\"true\"></span>\n } @else {\n <svg class=\"w-2.5 h-2.5 shrink-0\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"2\" />\n </svg>\n }\n </button>\n </div>\n } @else {\n <!-- Idle: sima Send gomb -->\n <button\n type=\"button\"\n class=\"flex items-center justify-center min-w-[44px] min-h-[44px] w-10 h-10 rounded-full shrink-0\n bg-ccapAccent text-black transition-all duration-200 disabled:opacity-50\n hover:bg-ccapAccent/80 hover:shadow-neon-glow-cyan\n focus:outline-none focus:ring-2 focus:ring-ccapAccent focus:ring-offset-2 focus:ring-offset-neutral-900\"\n [disabled]=\"isSending()\"\n (click)=\"handleSendClick()\"\n aria-label=\"Send\"\n title=\"Send\">\n @if (isSending()) {\n <span class=\"inline-block w-5 h-5 shrink-0 animate-spin rounded-full border-2 border-black/40 border-t-black\"\n aria-hidden=\"true\"></span>\n } @else {\n <svg class=\"w-5 h-5 shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\" />\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\" />\n </svg>\n }\n </button>\n }\n </div>\n </div>\n\n <!-- Alsó sor: attach + config dropdownok -->\n <div class=\"flex flex-wrap items-center gap-2 text-[11px] shrink-0\">\n <!-- Attach gomb -->\n @if (enableAttachments()) {\n <label class=\"flex items-center gap-1 px-2 py-1 rounded border border-neutral-700\n text-neutral-400 hover:text-neutral-300 hover:border-neutral-600\n cursor-pointer transition-colors shrink-0\">\n <svg class=\"w-3 h-3 opacity-60\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M10.5 5.5l-4.3 4.3a2.5 2.5 0 0 1-3.5-3.5L7 2a1.7 1.7 0 0 1 2.4 2.4L5.1 8.7a.8.8 0 0 1-1.2-1.2L7.5 4\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\"/>\n </svg>\n Attach\n <input type=\"file\"\n class=\"sr-only\"\n [accept]=\"acceptedFileTypes()\"\n multiple\n (change)=\"handleFilesSelected($event)\" />\n </label>\n }\n\n <!-- Mode dropdown -->\n @if (modeOptions().length) {\n <div class=\"relative\">\n <button\n type=\"button\"\n class=\"flex items-center gap-1 px-2 py-0.5 rounded border transition-colors cursor-pointer\"\n [class]=\"isModeDropdownOpen_$()\n ? 'border-neonCyan/50 text-neonCyan bg-neonCyan/10'\n : 'border-neutral-700 text-neutral-400 hover:text-neutral-300 hover:border-neutral-600'\"\n (click)=\"handleToggleModeDropdown()\"\n [attr.aria-label]=\"'Mode: ' + selectedMode()\">\n <!-- REQ-MOBILE-INPUT-COMPACT-001 (cycle 440): label + ':' rejtve mobile-on, csak value. -->\n <span class=\"uppercase font-medium tracking-wide hidden gt-xs:inline\">Mode</span>\n <span class=\"text-neutral-500 mx-0.5 hidden gt-xs:inline\">:</span>\n <span class=\"capitalize\">{{ selectedMode() }}</span>\n <svg class=\"w-3 h-3 ml-0.5 opacity-50\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M3 5l3 3 3-3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </button>\n @if (isModeDropdownOpen_$()) {\n <div class=\"absolute bottom-full left-0 mb-1 bg-neutral-900 border border-neutral-700 rounded-lg shadow-lg overflow-hidden z-20 min-w-[100px]\">\n @for (mode of modeOptions(); track mode) {\n <button\n type=\"button\"\n class=\"w-full text-left px-3 py-1.5 text-[11px] capitalize transition-colors cursor-pointer\"\n [class]=\"mode === selectedMode()\n ? 'text-neonCyan bg-neonCyan/10'\n : 'text-neutral-400 hover:text-neutral-200 hover:bg-neutral-800'\"\n (click)=\"handleSelectMode(mode)\">\n {{ mode }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n <!-- Model dropdown -->\n @if (modelOptions().length) {\n <div class=\"relative\">\n <button\n type=\"button\"\n class=\"flex items-center gap-1 px-2 py-0.5 rounded border transition-colors cursor-pointer\"\n [class]=\"isModelDropdownOpen_$()\n ? 'border-neonAmber/50 text-neonAmber bg-neonAmber/10'\n : 'border-neutral-700 text-neutral-400 hover:text-neutral-300 hover:border-neutral-600'\"\n (click)=\"handleToggleModelDropdown()\"\n [attr.aria-label]=\"'Model: ' + selectedModel()\">\n <!-- REQ-MOBILE-INPUT-COMPACT-001 (cycle 440): label + ':' rejtve mobile-on, csak value. -->\n <span class=\"uppercase font-medium tracking-wide hidden gt-xs:inline\">Model</span>\n <span class=\"text-neutral-500 mx-0.5 hidden gt-xs:inline\">:</span>\n <span class=\"capitalize\">{{ selectedModel() }}</span>\n <svg class=\"w-3 h-3 ml-0.5 opacity-50\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M3 5l3 3 3-3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </button>\n @if (isModelDropdownOpen_$()) {\n <div class=\"absolute bottom-full left-0 mb-1 bg-neutral-900 border border-neutral-700 rounded-lg shadow-lg overflow-hidden z-20 min-w-[100px]\">\n @for (model of modelOptions(); track model) {\n <button\n type=\"button\"\n class=\"w-full text-left px-3 py-1.5 text-[11px] capitalize transition-colors cursor-pointer\"\n [class]=\"model === selectedModel()\n ? 'text-neonAmber bg-neonAmber/10'\n : 'text-neutral-400 hover:text-neutral-200 hover:bg-neutral-800'\"\n (click)=\"handleSelectModel(model)\">\n {{ model }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n <!-- Effort dropdown -->\n @if (effortOptions().length) {\n <div class=\"relative\">\n <button\n type=\"button\"\n class=\"flex items-center gap-1 px-2 py-0.5 rounded border transition-colors cursor-pointer\"\n [class]=\"isEffortDropdownOpen_$()\n ? 'border-neonPurple/50 text-neonPurple bg-neonPurple/10'\n : 'border-neutral-700 text-neutral-400 hover:text-neutral-300 hover:border-neutral-600'\"\n (click)=\"handleToggleEffortDropdown()\"\n [attr.aria-label]=\"'Effort: ' + selectedEffort()\">\n <!-- REQ-MOBILE-INPUT-COMPACT-001 (cycle 440): label + ':' rejtve mobile-on, csak value. -->\n <span class=\"uppercase font-medium tracking-wide hidden gt-xs:inline\">Effort</span>\n <span class=\"text-neutral-500 mx-0.5 hidden gt-xs:inline\">:</span>\n <span class=\"capitalize\">{{ selectedEffort() }}</span>\n <svg class=\"w-3 h-3 ml-0.5 opacity-50\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M3 5l3 3 3-3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </button>\n @if (isEffortDropdownOpen_$()) {\n <div class=\"absolute bottom-full left-0 mb-1 bg-neutral-900 border border-neutral-700 rounded-lg shadow-lg overflow-hidden z-20 min-w-[100px]\">\n @for (effort of effortOptions(); track effort) {\n <button\n type=\"button\"\n class=\"w-full text-left px-3 py-1.5 text-[11px] capitalize transition-colors cursor-pointer\"\n [class]=\"effort === selectedEffort()\n ? 'text-neonPurple bg-neonPurple/10'\n : 'text-neutral-400 hover:text-neutral-200 hover:bg-neutral-800'\"\n (click)=\"handleSelectEffort(effort)\">\n {{ effort }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n <div class=\"flex-1\"></div>\n\n <!-- Usage kijelzés (token szám / cost) -->\n @if (usageText()) {\n <div class=\"flex items-center gap-1.5 text-neutral-500 shrink-0\">\n <svg class=\"w-3 h-3 opacity-60\" viewBox=\"0 0 12 12\" fill=\"none\">\n <circle cx=\"6\" cy=\"6\" r=\"5\" stroke=\"currentColor\" stroke-width=\"1\"/>\n <path d=\"M6 3v3.5l2 1.5\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\"/>\n </svg>\n <span>{{ usageText() }}</span>\n </div>\n }\n </div>\n</div>\n"],
5
+ "mappings": "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",
6
6
  "names": ["S_SessionShellToolbar_Component", "selectors", "hostAttrs", "standalone", "features", "\u0275\u0275StandaloneFeature", "ngContentSelectors", "_c1", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275elementStart", "\u0275\u0275projection", "\u0275\u0275elementEnd", "CommonModule", "encapsulation", "\u0275\u0275elementStart", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r1", "ctx_r1", "\u0275\u0275nextContext", "\u0275\u0275resetView", "mobileBackdropClicked", "emit", "\u0275\u0275elementEnd", "\u0275\u0275projection", "$event", "_r3", "sidebarResizeStart", "\u0275\u0275styleProp", "sidebarWidthPx", "S_ResizableSessionShellLayout_Component", "isSidebarOpen", "input", "isResizing", "output", "isMobileBackdropActive", "selectors", "hostAttrs", "inputs", "outputs", "standalone", "features", "\u0275\u0275StandaloneFeature", "ngContentSelectors", "_c1", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275template", "S_ResizableSessionShellLayout_Component_Conditional_0_Template", "S_ResizableSessionShellLayout_Component_Conditional_1_Template", "\u0275\u0275conditional", "\u0275\u0275advance", "CommonModule", "encapsulation", "\u0275\u0275element", "\u0275\u0275elementStart", "\u0275\u0275listener", "\u0275\u0275restoreView", "_r2", "att_r3", "\u0275\u0275nextContext", "$implicit", "ctx_r3", "\u0275\u0275resetView", "handleRemoveAttachment", "id", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275advance", "\u0275\u0275property", "previewUrl", "\u0275\u0275sanitizeUrl", "_r5", "\u0275\u0275textInterpolate", "fileName", "\u0275\u0275template", "S_SessionInput_Component_Conditional_4_For_2_Conditional_0_Template", "S_SessionInput_Component_Conditional_4_For_2_Conditional_1_Template", "\u0275\u0275conditional", "isImage", "\u0275\u0275repeaterCreate", "S_SessionInput_Component_Conditional_4_For_2_Template", "_forTrack0", "\u0275\u0275repeater", "pendingAttachments", "$event", "_r6", "queueEditTextChange", "emit", "queueEditSave", "queueEditCancel", "editingQueueText", "_r7", "item_r8", "queueMoveUp", "queueItemId", "queueMoveDown", "queueEditStart", "queueRemoveItem", "queueSendNow", "text", "\u0275\u0275classProp", "isQueueLocked", "\u0275$index_59_r10", "\u0275$count_59_r11", "S_SessionInput_Component_Conditional_5_For_11_Conditional_1_Template", "S_SessionInput_Component_Conditional_5_For_11_Conditional_2_Template", "\u0275\u0275classMap", "editingQueueItemId", "S_SessionInput_Component_Conditional_5_Conditional_8_Template", "S_SessionInput_Component_Conditional_5_For_11_Template", "_forTrack1", "\u0275\u0275textInterpolate1", "queueItems", "length", "_r12", "handleQueueClick", "S_SessionInput_Component_Conditional_13_Conditional_2_Template", "S_SessionInput_Component_Conditional_13_Conditional_3_Template", "handleStopClick", "S_SessionInput_Component_Conditional_13_Conditional_5_Template", "S_SessionInput_Component_Conditional_13_Conditional_6_Template", "isSending", "isStopping", "_r13", "handleSendClick", "S_SessionInput_Component_Conditional_14_Conditional_1_Template", "S_SessionInput_Component_Conditional_14_Conditional_2_Template", "_r14", "handleFilesSelected", "acceptedFileTypes", "mode_r17", "_r16", "handleSelectMode", "selectedMode", "S_SessionInput_Component_Conditional_17_Conditional_10_For_2_Template", "\u0275\u0275repeaterTrackByIdentity", "modeOptions", "_r15", "handleToggleModeDropdown", "S_SessionInput_Component_Conditional_17_Conditional_10_Template", "isModeDropdownOpen_$", "model_r20", "_r19", "handleSelectModel", "selectedModel", "S_SessionInput_Component_Conditional_18_Conditional_10_For_2_Template", "modelOptions", "_r18", "handleToggleModelDropdown", "S_SessionInput_Component_Conditional_18_Conditional_10_Template", "isModelDropdownOpen_$", "effort_r23", "_r22", "handleSelectEffort", "selectedEffort", "S_SessionInput_Component_Conditional_19_Conditional_10_For_2_Template", "effortOptions", "_r21", "handleToggleEffortDropdown", "S_SessionInput_Component_Conditional_19_Conditional_10_Template", "isEffortDropdownOpen_$", "usageText", "IMAGE_MIME_PREFIXES", "PANEL_MIN_HEIGHT", "TEXTAREA_AUTO_MAX_VH", "S_SessionInput_Component", "elementRef", "renderer", "draftText", "input", "placeholder", "textareaRows", "draftTextChange", "output", "isExecuting", "enableAttachments", "maxAttachmentCount", "sendRequested", "queueRequested", "stopRequested", "modeChanged", "modelChanged", "effortChanged", "attachmentsChanged", "signal", "isManualResize_$", "manualPanelHeight_$", "textareaElRef", "resizeStartY", "resizeStartHeight", "resizeMoveCleanup", "resizeUpCleanup", "resizeCancelCleanup", "hostHeightPx", "undefined", "constructor", "effect", "requestAnimationFrame", "nativeElement", "adjustTextareaAutoGrow", "ngOnDestroy", "cleanupResizeListeners", "att", "URL", "revokeObjectURL", "handleKeyDown", "event", "key", "shiftKey", "preventDefault", "emitSendOrQueue", "handleTextareaInput", "handleResizeStart", "target", "currentTarget", "HTMLElement", "setPointerCapture", "pointerId", "clientY", "offsetHeight", "listen", "e", "handleResizeMove", "hasPointerCapture", "releasePointerCapture", "handleResizeReset", "set", "closeAllDropdownsExcept", "mode", "model", "effort", "__async", "list", "files", "addFiles", "Array", "from", "value", "handlePaste", "items", "clipboardData", "imageFiles", "i", "item", "kind", "some", "prefix", "type", "toLowerCase", "startsWith", "file", "getAsFile", "push", "found", "find", "a", "filter", "clearAttachments", "hasText", "trim", "hasAttachments", "el", "style", "height", "maxHeight", "Math", "round", "window", "innerHeight", "newHeight", "min", "scrollHeight", "wasManual", "delta", "max", "except", "room", "filesToProcess", "slice", "base64", "readFileToBase64", "attachment", "crypto", "randomUUID", "Date", "now", "random", "name", "mimeType", "createObjectURL", "sizeBytes", "size", "Promise", "resolve", "reject", "reader", "FileReader", "onload", "dataUrl", "String", "result", "commaIdx", "indexOf", "onerror", "error", "readAsDataURL", "\u0275\u0275directiveInject", "ElementRef", "Renderer2", "selectors", "viewQuery", "rf", "ctx", "\u0275\u0275styleProp", "i0", "_r1", "S_SessionInput_Component_Conditional_2_Template", "S_SessionInput_Component_Conditional_4_Template", "S_SessionInput_Component_Conditional_5_Template", "\u0275\u0275projection", "S_SessionInput_Component_Conditional_13_Template", "S_SessionInput_Component_Conditional_14_Template", "S_SessionInput_Component_Conditional_16_Template", "S_SessionInput_Component_Conditional_17_Template", "S_SessionInput_Component_Conditional_18_Template", "S_SessionInput_Component_Conditional_19_Template", "S_SessionInput_Component_Conditional_21_Template", "CommonModule", "FormsModule", "DefaultValueAccessor", "NgControlStatus", "NgModel", "styles"]
7
7
  }
@@ -1,3 +1,3 @@
1
- import{b as Y}from"./chunk-BS6NS62C.js";import{a as ee}from"./chunk-VUPHBESM.js";import{a as X}from"./chunk-FLAJXIYW.js";import{b as G,c as k,f as V,i as W,n as A,o as U,p as B,v as R}from"./chunk-EO4DNTT4.js";import{d as J,i as Q}from"./chunk-L3PDYXCS.js";import{a as F}from"./chunk-5UPNU54P.js";import{c as q}from"./chunk-XPUEDVEA.js";import{C as f}from"./chunk-GLADIICK.js";import{C as E,D as v,Fa as d,Ga as y,Ha as $,I as K,J as m,K as g,Q as j,T as O,Ta as z,U as C,Z as s,aa as c,da as M,fa as H,ga as _,hb as L,jb as N,k as b,la as x,na as I,oa as T,pa as P,qa as r,ra as o,ua as S,ub as D,va as p,wa as u,wb as Z}from"./chunk-TBMJSIBB.js";var te="ccap-pm-user-input-wizard-draft:",w=class a{static storageKey(l,e){let i=`${te}${l}`,t=e?.trim();return t!==void 0&&t.length>0?`${i}:qi:${t}`:i}static load(l,e){let i=a.storageKey(l,e),t=F.readJson(i,null);if(!a.isDraftShape(t))return null;let n=t;return typeof n.previewMarkdown!="string"&&(n.previewMarkdown=""),n}static save(l,e,i){let t=a.storageKey(l,i),n={rawText:e.rawText,refinementDraft:e.refinementDraft,wizardStep:e.wizardStep,suggestionJson:e.suggestionJson,previewMarkdown:e.previewMarkdown,updatedAt:e.updatedAt};F.writeJson(t,n)}static clear(l,e){let i=a.storageKey(l,e);F.remove(i)}static isDraftShape(l){if(typeof l!="object"||l===null||Array.isArray(l))return!1;let e=Reflect.get(l,"previewMarkdown"),i=typeof e=="string"||e===void 0,t=Reflect.get(l,"suggestionJson");return typeof Reflect.get(l,"rawText")=="string"&&typeof Reflect.get(l,"refinementDraft")=="string"&&typeof Reflect.get(l,"wizardStep")=="number"&&(t===null||typeof t=="string")&&i&&typeof Reflect.get(l,"updatedAt")=="string"}};function re(a,l){if(a&1){let e=S();r(0,"div",0)(1,"h3",11),d(2,"New USER-INPUT (wizard)"),o(),r(3,"button",12),p("click",function(){m(e);let t=u();return g(t.handleDiscardDraft())}),d(4," Clear draft "),o()()}}function oe(a,l){if(a&1){let e=S();r(0,"div",1)(1,"button",12),p("click",function(){m(e);let t=u();return g(t.handleDiscardDraft())}),d(2," Clear draft "),o()()}}function ae(a,l){if(a&1&&(r(0,"div",3),d(1),o()),a&2){let e=u();s(),$(" ",e.suggestErrorText_$()," ")}}function se(a,l){if(a&1&&(r(0,"div",3),d(1),o()),a&2){let e=u();s(),$(" ",e.finalizeErrorText_$()," ")}}function de(a,l){if(a&1&&(r(0,"div",4)(1,"span",13),d(2,"LLM system prompt (last suggest / refine)"),o(),r(3,"pre",14),d(4),o()()),a&2){let e=u();s(4),y(e.pm_DS.userInputWizardLastLlmSystemPrompt_$())}}function le(a,l){if(a&1&&(r(0,"div",4)(1,"span",13),d(2,"LLM user message (last suggest / refine)"),o(),r(3,"pre",15),d(4),o()()),a&2){let e=u();s(4),y(e.pm_DS.userInputWizardLastLlmUserMessage_$())}}function pe(a,l){a&1&&d(0," Formatting\u2026 ")}function _e(a,l){a&1&&d(0," Format with AI ")}function ue(a,l){if(a&1){let e=S();r(0,"div",9)(1,"button",16),p("click",function(){m(e);let t=u();return g(t.handleFormatWithAi())}),M(2,pe,1,0)(3,_e,1,0),o()()}if(a&2){let e=u();s(),_("disabled",e.pm_DS.userInputWizardSuggestLoading_$()||!e.rawText_$().trim()),s(),x(e.pm_DS.userInputWizardSuggestLoading_$()?2:3)}}function ce(a,l){if(a&1&&(r(0,"option",24),d(1),o()),a&2){let e=l.$implicit;_("value",e),s(),y(e)}}function me(a,l){if(a&1){let e=S();r(0,"div",28)(1,"label",20),d(2,"Refine instruction (optional)"),o(),r(3,"textarea",30),p("ngModelChange",function(t){m(e);let n=u(2);return g(n.handleRefinementInput(t))}),d(4," "),o(),r(5,"button",31),p("click",function(){m(e);let t=u(2);return g(t.handleRefine())}),d(6," Refine with AI "),o()()}if(a&2){let e=u(2);s(3),_("ngModel",e.refinement_$()),s(2),_("disabled",e.pm_DS.userInputWizardSuggestLoading_$()||!e.refinement_$().trim())}}function ge(a,l){a&1&&d(0," Saving\u2026 ")}function he(a,l){a&1&&d(0," Finalize (USER-INPUT.md + database) ")}function fe(a,l){if(a&1){let e=S();r(0,"div",10)(1,"h4",17),d(2,"Preview (last server response)"),o(),r(3,"pre",18),d(4),o(),r(5,"div",19)(6,"div",4)(7,"label",20),d(8,"Type"),o(),r(9,"input",21),p("ngModelChange",function(t){m(e);let n=u();return n.editType_$.set(t),g(n.handleEditorChange())}),o()(),r(10,"div",4)(11,"label",20),d(12,"Code"),o(),r(13,"input",22),p("ngModelChange",function(t){m(e);let n=u();return n.editCode_$.set(t),g(n.handleEditorChange())}),o()(),r(14,"div",4)(15,"label",20),d(16,"Priority"),o(),r(17,"select",23),p("ngModelChange",function(t){m(e);let n=u();return n.editPriority_$.set(t),g(n.handleEditorChange())}),T(18,ce,2,2,"option",24,I),o()(),r(20,"div",4)(21,"label",20),d(22,"Phase"),o(),r(23,"input",21),p("ngModelChange",function(t){m(e);let n=u();return n.editPhase_$.set(t),g(n.handleEditorChange())}),o()(),r(24,"div",25)(25,"label",20),d(26,"Area"),o(),r(27,"input",21),p("ngModelChange",function(t){m(e);let n=u();return n.editArea_$.set(t),g(n.handleEditorChange())}),o()(),r(28,"div",25)(29,"label",20),d(30,"Title (DB)"),o(),r(31,"input",21),p("ngModelChange",function(t){m(e);let n=u();return n.editTitle_$.set(t),g(n.handleEditorChange())}),o()(),r(32,"div",25)(33,"label",20),d(34,"Details (one line)"),o(),r(35,"input",21),p("ngModelChange",function(t){m(e);let n=u();return n.editDetails_$.set(t),g(n.handleEditorChange())}),o()(),r(36,"div",4)(37,"label",20),d(38,"E1"),o(),r(39,"input",21),p("ngModelChange",function(t){m(e);let n=u();return n.editE1_$.set(t),g(n.handleEditorChange())}),o()(),r(40,"div",4)(41,"label",20),d(42,"E2"),o(),r(43,"input",21),p("ngModelChange",function(t){m(e);let n=u();return n.editE2_$.set(t),g(n.handleEditorChange())}),o()(),r(44,"div",4)(45,"label",20),d(46,"E3"),o(),r(47,"input",21),p("ngModelChange",function(t){m(e);let n=u();return n.editE3_$.set(t),g(n.handleEditorChange())}),o()(),r(48,"div",4)(49,"label",20),d(50,"E4"),o(),r(51,"input",21),p("ngModelChange",function(t){m(e);let n=u();return n.editE4_$.set(t),g(n.handleEditorChange())}),o()()(),r(52,"label",26)(53,"input",27),p("ngModelChange",function(t){m(e);let n=u();return g(n.addToBacklog_$.set(t))}),o(),d(54," Also append matching line to BACKLOG.md "),o(),M(55,me,7,2,"div",28),r(56,"button",29),p("click",function(){m(e);let t=u();return g(t.handleFinalize())}),M(57,ge,1,0)(58,he,1,0),o()()}if(a&2){let e=u();s(4),y(e.previewMarkdown_$()),s(5),_("ngModel",e.editType_$()),s(4),_("ngModel",e.editCode_$()),s(4),_("ngModel",e.editPriority_$()),s(),P(e.priorities),s(5),_("ngModel",e.editPhase_$()),s(4),_("ngModel",e.editArea_$()),s(4),_("ngModel",e.editTitle_$()),s(4),_("ngModel",e.editDetails_$()),s(4),_("ngModel",e.editE1_$()),s(4),_("ngModel",e.editE2_$()),s(4),_("ngModel",e.editE3_$()),s(4),_("ngModel",e.editE4_$()),s(2),_("ngModel",e.addToBacklog_$()),s(2),x(e.skipSuggestMode?-1:55),s(),_("disabled",e.pm_DS.userInputWizardFinalizeLoading_$()||!e.rawText_$().trim()),s(),x(e.pm_DS.userInputWizardFinalizeLoading_$()?57:58)}}var xe=400,Ve=(()=>{class a{projectId="";isEmbeddedInModal=!1;wizardCompleted=new j;wizardFinalizeSuccess=new j;quickInputDraftId=null;initialRawContent="";skipSuggestMode=!1;initialStagingPriority=void 0;pm_DS=E(ee);suggestErrorText_$=L(()=>{let e=this.pm_DS.userInputWizardSuggestError_$();return e?a.formatHttpError(e):null});finalizeErrorText_$=L(()=>{let e=this.pm_DS.userInputWizardFinalizeError_$();return e?a.formatHttpError(e):null});rawText_$=c("");refinement_$=c("");wizardStep_$=c(0);previewMarkdown_$=c("");addToBacklog_$=c(!1);editType_$=c("");editCode_$=c("");editPriority_$=c(f.medium);editArea_$=c("");editPhase_$=c("MVP1");editDetails_$=c("");editTitle_$=c("");editE1_$=c("\u274C");editE2_$=c("\u274C");editE3_$=c("\u274C");editE4_$=c("\u274C");priorities=Object.values(f);draftTimer;ngOnChanges(e){(e.projectId!==void 0&&e.projectId.currentValue||e.quickInputDraftId!==void 0||e.initialRawContent!==void 0||e.skipSuggestMode!==void 0||e.initialStagingPriority!==void 0)&&this.projectId&&this.applyWizardBootstrapFromInputs()}ngOnDestroy(){this.draftTimer!==void 0&&clearTimeout(this.draftTimer)}handleVoiceTranscript(e){let i=e?.trim()??"";i.length&&(this.rawText_$.update(t=>t?`${t}
1
+ import{b as Y}from"./chunk-XBPBZNCD.js";import{a as ee}from"./chunk-S2WTIGEZ.js";import{a as X}from"./chunk-FLAJXIYW.js";import{b as G,c as k,f as V,i as W,n as A,o as U,p as B,v as R}from"./chunk-EO4DNTT4.js";import{d as J,i as Q}from"./chunk-2WCP5YOD.js";import{a as F}from"./chunk-5UPNU54P.js";import{c as q}from"./chunk-U4CWC5HD.js";import{C as f}from"./chunk-P7QASRBG.js";import{C as E,D as v,Fa as d,Ga as y,Ha as $,I as K,J as m,K as g,Q as j,T as O,Ta as z,U as C,Z as s,aa as c,da as M,fa as H,ga as _,hb as L,jb as N,k as b,la as x,na as I,oa as T,pa as P,qa as r,ra as o,ua as S,ub as D,va as p,wa as u,wb as Z}from"./chunk-TBMJSIBB.js";var te="ccap-pm-user-input-wizard-draft:",w=class a{static storageKey(l,e){let i=`${te}${l}`,t=e?.trim();return t!==void 0&&t.length>0?`${i}:qi:${t}`:i}static load(l,e){let i=a.storageKey(l,e),t=F.readJson(i,null);if(!a.isDraftShape(t))return null;let n=t;return typeof n.previewMarkdown!="string"&&(n.previewMarkdown=""),n}static save(l,e,i){let t=a.storageKey(l,i),n={rawText:e.rawText,refinementDraft:e.refinementDraft,wizardStep:e.wizardStep,suggestionJson:e.suggestionJson,previewMarkdown:e.previewMarkdown,updatedAt:e.updatedAt};F.writeJson(t,n)}static clear(l,e){let i=a.storageKey(l,e);F.remove(i)}static isDraftShape(l){if(typeof l!="object"||l===null||Array.isArray(l))return!1;let e=Reflect.get(l,"previewMarkdown"),i=typeof e=="string"||e===void 0,t=Reflect.get(l,"suggestionJson");return typeof Reflect.get(l,"rawText")=="string"&&typeof Reflect.get(l,"refinementDraft")=="string"&&typeof Reflect.get(l,"wizardStep")=="number"&&(t===null||typeof t=="string")&&i&&typeof Reflect.get(l,"updatedAt")=="string"}};function re(a,l){if(a&1){let e=S();r(0,"div",0)(1,"h3",11),d(2,"New USER-INPUT (wizard)"),o(),r(3,"button",12),p("click",function(){m(e);let t=u();return g(t.handleDiscardDraft())}),d(4," Clear draft "),o()()}}function oe(a,l){if(a&1){let e=S();r(0,"div",1)(1,"button",12),p("click",function(){m(e);let t=u();return g(t.handleDiscardDraft())}),d(2," Clear draft "),o()()}}function ae(a,l){if(a&1&&(r(0,"div",3),d(1),o()),a&2){let e=u();s(),$(" ",e.suggestErrorText_$()," ")}}function se(a,l){if(a&1&&(r(0,"div",3),d(1),o()),a&2){let e=u();s(),$(" ",e.finalizeErrorText_$()," ")}}function de(a,l){if(a&1&&(r(0,"div",4)(1,"span",13),d(2,"LLM system prompt (last suggest / refine)"),o(),r(3,"pre",14),d(4),o()()),a&2){let e=u();s(4),y(e.pm_DS.userInputWizardLastLlmSystemPrompt_$())}}function le(a,l){if(a&1&&(r(0,"div",4)(1,"span",13),d(2,"LLM user message (last suggest / refine)"),o(),r(3,"pre",15),d(4),o()()),a&2){let e=u();s(4),y(e.pm_DS.userInputWizardLastLlmUserMessage_$())}}function pe(a,l){a&1&&d(0," Formatting\u2026 ")}function _e(a,l){a&1&&d(0," Format with AI ")}function ue(a,l){if(a&1){let e=S();r(0,"div",9)(1,"button",16),p("click",function(){m(e);let t=u();return g(t.handleFormatWithAi())}),M(2,pe,1,0)(3,_e,1,0),o()()}if(a&2){let e=u();s(),_("disabled",e.pm_DS.userInputWizardSuggestLoading_$()||!e.rawText_$().trim()),s(),x(e.pm_DS.userInputWizardSuggestLoading_$()?2:3)}}function ce(a,l){if(a&1&&(r(0,"option",24),d(1),o()),a&2){let e=l.$implicit;_("value",e),s(),y(e)}}function me(a,l){if(a&1){let e=S();r(0,"div",28)(1,"label",20),d(2,"Refine instruction (optional)"),o(),r(3,"textarea",30),p("ngModelChange",function(t){m(e);let n=u(2);return g(n.handleRefinementInput(t))}),d(4," "),o(),r(5,"button",31),p("click",function(){m(e);let t=u(2);return g(t.handleRefine())}),d(6," Refine with AI "),o()()}if(a&2){let e=u(2);s(3),_("ngModel",e.refinement_$()),s(2),_("disabled",e.pm_DS.userInputWizardSuggestLoading_$()||!e.refinement_$().trim())}}function ge(a,l){a&1&&d(0," Saving\u2026 ")}function he(a,l){a&1&&d(0," Finalize (USER-INPUT.md + database) ")}function fe(a,l){if(a&1){let e=S();r(0,"div",10)(1,"h4",17),d(2,"Preview (last server response)"),o(),r(3,"pre",18),d(4),o(),r(5,"div",19)(6,"div",4)(7,"label",20),d(8,"Type"),o(),r(9,"input",21),p("ngModelChange",function(t){m(e);let n=u();return n.editType_$.set(t),g(n.handleEditorChange())}),o()(),r(10,"div",4)(11,"label",20),d(12,"Code"),o(),r(13,"input",22),p("ngModelChange",function(t){m(e);let n=u();return n.editCode_$.set(t),g(n.handleEditorChange())}),o()(),r(14,"div",4)(15,"label",20),d(16,"Priority"),o(),r(17,"select",23),p("ngModelChange",function(t){m(e);let n=u();return n.editPriority_$.set(t),g(n.handleEditorChange())}),T(18,ce,2,2,"option",24,I),o()(),r(20,"div",4)(21,"label",20),d(22,"Phase"),o(),r(23,"input",21),p("ngModelChange",function(t){m(e);let n=u();return n.editPhase_$.set(t),g(n.handleEditorChange())}),o()(),r(24,"div",25)(25,"label",20),d(26,"Area"),o(),r(27,"input",21),p("ngModelChange",function(t){m(e);let n=u();return n.editArea_$.set(t),g(n.handleEditorChange())}),o()(),r(28,"div",25)(29,"label",20),d(30,"Title (DB)"),o(),r(31,"input",21),p("ngModelChange",function(t){m(e);let n=u();return n.editTitle_$.set(t),g(n.handleEditorChange())}),o()(),r(32,"div",25)(33,"label",20),d(34,"Details (one line)"),o(),r(35,"input",21),p("ngModelChange",function(t){m(e);let n=u();return n.editDetails_$.set(t),g(n.handleEditorChange())}),o()(),r(36,"div",4)(37,"label",20),d(38,"E1"),o(),r(39,"input",21),p("ngModelChange",function(t){m(e);let n=u();return n.editE1_$.set(t),g(n.handleEditorChange())}),o()(),r(40,"div",4)(41,"label",20),d(42,"E2"),o(),r(43,"input",21),p("ngModelChange",function(t){m(e);let n=u();return n.editE2_$.set(t),g(n.handleEditorChange())}),o()(),r(44,"div",4)(45,"label",20),d(46,"E3"),o(),r(47,"input",21),p("ngModelChange",function(t){m(e);let n=u();return n.editE3_$.set(t),g(n.handleEditorChange())}),o()(),r(48,"div",4)(49,"label",20),d(50,"E4"),o(),r(51,"input",21),p("ngModelChange",function(t){m(e);let n=u();return n.editE4_$.set(t),g(n.handleEditorChange())}),o()()(),r(52,"label",26)(53,"input",27),p("ngModelChange",function(t){m(e);let n=u();return g(n.addToBacklog_$.set(t))}),o(),d(54," Also append matching line to BACKLOG.md "),o(),M(55,me,7,2,"div",28),r(56,"button",29),p("click",function(){m(e);let t=u();return g(t.handleFinalize())}),M(57,ge,1,0)(58,he,1,0),o()()}if(a&2){let e=u();s(4),y(e.previewMarkdown_$()),s(5),_("ngModel",e.editType_$()),s(4),_("ngModel",e.editCode_$()),s(4),_("ngModel",e.editPriority_$()),s(),P(e.priorities),s(5),_("ngModel",e.editPhase_$()),s(4),_("ngModel",e.editArea_$()),s(4),_("ngModel",e.editTitle_$()),s(4),_("ngModel",e.editDetails_$()),s(4),_("ngModel",e.editE1_$()),s(4),_("ngModel",e.editE2_$()),s(4),_("ngModel",e.editE3_$()),s(4),_("ngModel",e.editE4_$()),s(2),_("ngModel",e.addToBacklog_$()),s(2),x(e.skipSuggestMode?-1:55),s(),_("disabled",e.pm_DS.userInputWizardFinalizeLoading_$()||!e.rawText_$().trim()),s(),x(e.pm_DS.userInputWizardFinalizeLoading_$()?57:58)}}var xe=400,Ve=(()=>{class a{projectId="";isEmbeddedInModal=!1;wizardCompleted=new j;wizardFinalizeSuccess=new j;quickInputDraftId=null;initialRawContent="";skipSuggestMode=!1;initialStagingPriority=void 0;pm_DS=E(ee);suggestErrorText_$=L(()=>{let e=this.pm_DS.userInputWizardSuggestError_$();return e?a.formatHttpError(e):null});finalizeErrorText_$=L(()=>{let e=this.pm_DS.userInputWizardFinalizeError_$();return e?a.formatHttpError(e):null});rawText_$=c("");refinement_$=c("");wizardStep_$=c(0);previewMarkdown_$=c("");addToBacklog_$=c(!1);editType_$=c("");editCode_$=c("");editPriority_$=c(f.medium);editArea_$=c("");editPhase_$=c("MVP1");editDetails_$=c("");editTitle_$=c("");editE1_$=c("\u274C");editE2_$=c("\u274C");editE3_$=c("\u274C");editE4_$=c("\u274C");priorities=Object.values(f);draftTimer;ngOnChanges(e){(e.projectId!==void 0&&e.projectId.currentValue||e.quickInputDraftId!==void 0||e.initialRawContent!==void 0||e.skipSuggestMode!==void 0||e.initialStagingPriority!==void 0)&&this.projectId&&this.applyWizardBootstrapFromInputs()}ngOnDestroy(){this.draftTimer!==void 0&&clearTimeout(this.draftTimer)}handleVoiceTranscript(e){let i=e?.trim()??"";i.length&&(this.rawText_$.update(t=>t?`${t}
2
2
  ${i}`:i),this.scheduleDraftSave())}handleFormatWithAi(){return b(this,null,function*(){let e=this.rawText_$().trim();if(!(!e.length||!this.projectId))try{let i=yield this.pm_DS.suggestUserInputFormat(this.projectId,{rawText:e});this.previewMarkdown_$.set(i.previewMarkdown),this.applySuggestionToEditors(i.suggestion),this.wizardStep_$.set(1),this.scheduleDraftSave()}catch{}})}handleRefine(){return b(this,null,function*(){let e=this.rawText_$().trim(),i=this.refinement_$().trim();if(!e.length||!i.length||!this.projectId)return;let t=this.buildSuggestionFromEditors();if(t)try{let n=yield this.pm_DS.suggestUserInputFormat(this.projectId,{rawText:e,refinementInstruction:i,previousSuggestion:t});this.previewMarkdown_$.set(n.previewMarkdown),this.applySuggestionToEditors(n.suggestion),this.scheduleDraftSave()}catch{}})}handleFinalize(){return b(this,null,function*(){let e=this.rawText_$().trim();if(!(!e.length||!this.projectId))try{let i=yield this.pm_DS.finalizeUserInputWizard(this.projectId,{rawContent:e,type:this.editType_$().trim(),code:this.editCode_$().trim(),priority:this.editPriority_$().trim(),phase:this.editPhase_$().trim(),details:this.editDetails_$().trim(),area:this.editArea_$().trim()||void 0,title:this.editTitle_$().trim()||void 0,e1:this.editE1_$().trim(),e2:this.editE2_$().trim(),e3:this.editE3_$().trim(),e4:this.editE4_$().trim(),addToBacklog:this.addToBacklog_$()});w.clear(this.projectId,this.quickInputDraftId),this.resetWizardState(),this.wizardFinalizeSuccess.emit(i),this.wizardCompleted.emit()}catch{}})}handleDiscardDraft(){this.projectId&&w.clear(this.projectId,this.quickInputDraftId),this.resetWizardState(),this.skipSuggestMode&&this.wizardStep_$.set(1)}handleRawTextInput(e){this.rawText_$.set(e),this.scheduleDraftSave()}handleRefinementInput(e){this.refinement_$.set(e),this.scheduleDraftSave()}handleEditorChange(){this.scheduleDraftSave()}resetWizardState(){this.rawText_$.set(""),this.refinement_$.set(""),this.wizardStep_$.set(0),this.previewMarkdown_$.set(""),this.addToBacklog_$.set(!1),this.editType_$.set(""),this.editCode_$.set(""),this.editPriority_$.set(f.medium),this.editArea_$.set(""),this.editPhase_$.set("MVP1"),this.editDetails_$.set(""),this.editTitle_$.set(""),this.editE1_$.set("\u274C"),this.editE2_$.set("\u274C"),this.editE3_$.set("\u274C"),this.editE4_$.set("\u274C")}applySuggestionToEditors(e){this.editType_$.set(e.type.trim()),this.editCode_$.set(e.code.trim()),this.editPriority_$.set(e.priority.trim().toLowerCase()),this.editArea_$.set(e.area?.trim()??""),this.editPhase_$.set(e.phase.trim()),this.editDetails_$.set(e.details.trim()),this.editTitle_$.set(e.title?.trim()??""),this.editE1_$.set(e.e1.trim()),this.editE2_$.set(e.e2.trim()),this.editE3_$.set(e.e3.trim()),this.editE4_$.set(e.e4.trim())}buildSuggestionFromEditors(){let e=this.editType_$().trim(),i=this.editCode_$().trim();return!e.length||!i.length?null:{type:e,code:i,priority:this.editPriority_$().trim(),phase:this.editPhase_$().trim(),details:this.editDetails_$().trim(),e1:this.editE1_$().trim(),e2:this.editE2_$().trim(),e3:this.editE3_$().trim(),e4:this.editE4_$().trim(),area:this.editArea_$().trim()||void 0,title:this.editTitle_$().trim()||void 0}}applyWizardBootstrapFromInputs(){if(!this.projectId)return;let e=w.load(this.projectId,this.quickInputDraftId);if(e){this.rawText_$.set(e.rawText),this.refinement_$.set(e.refinementDraft);let t=e.wizardStep;if(this.skipSuggestMode&&(t=t<1?1:t),this.wizardStep_$.set(t),e.suggestionJson)try{let n=JSON.parse(e.suggestionJson);a.isSuggestionShape(n)&&this.applySuggestionToEditors(n)}catch{}this.previewMarkdown_$.set(e.previewMarkdown??""),this.scheduleDraftSave();return}this.resetWizardState();let i=this.initialRawContent?.trim()??"";i.length>0&&this.rawText_$.set(i),this.skipSuggestMode&&this.wizardStep_$.set(1),this.initialStagingPriority!==void 0&&this.editPriority_$.set(this.initialStagingPriority),this.scheduleDraftSave()}static formatHttpError(e){if(e instanceof Z){let i=a.readNestedErrorString(e.error);return i||e.message}return e instanceof Error?e.message:String(e)}static readNestedErrorString(e){if(!q.isRecord(e))return null;let i=e.error;return typeof i=="string"?i:null}static isSuggestionShape(e){return q.isRecord(e)?typeof e.type=="string"&&typeof e.code=="string"&&typeof e.priority=="string"&&typeof e.phase=="string"&&typeof e.details=="string"&&typeof e.e1=="string"&&typeof e.e2=="string"&&typeof e.e3=="string"&&typeof e.e4=="string":!1}scheduleDraftSave(){this.projectId&&(this.draftTimer!==void 0&&clearTimeout(this.draftTimer),this.draftTimer=setTimeout(()=>{this.persistDraft()},xe))}persistDraft(){if(!this.projectId)return;let e=this.buildSuggestionFromEditors(),i={rawText:this.rawText_$(),refinementDraft:this.refinement_$(),wizardStep:this.wizardStep_$(),suggestionJson:e?JSON.stringify(e):null,previewMarkdown:this.previewMarkdown_$(),updatedAt:new Date().toISOString()};w.save(this.projectId,i,this.quickInputDraftId)}static \u0275fac=function(i){return new(i||a)};static \u0275cmp=v({type:a,selectors:[["app-pm-user-input-wizard"]],inputs:{projectId:"projectId",isEmbeddedInModal:"isEmbeddedInModal",quickInputDraftId:"quickInputDraftId",initialRawContent:"initialRawContent",skipSuggestMode:"skipSuggestMode",initialStagingPriority:"initialStagingPriority"},outputs:{wizardCompleted:"wizardCompleted",wizardFinalizeSuccess:"wizardFinalizeSuccess"},standalone:!0,features:[K,z],decls:17,vars:9,consts:[[1,"flex","items-center","justify-between","gap-2","flex-wrap"],[1,"flex","justify-end"],[1,"text-xs","text-neutral-500"],[1,"rounded","border","border-red-800/50","bg-red-950/30","px-3","py-2","text-xs","text-red-300","whitespace-pre-wrap"],[1,"flex","flex-col","gap-1"],[1,"relative","pt-5"],[1,"text-xs","text-neutral-400","block","mb-1"],["rows","6",1,"w-full","bg-neutral-900","border","border-neutral-600","rounded","px-3","py-2","text-sm","text-neutral-100","placeholder:text-neutral-600","focus:outline-none","focus:border-ccapAccent","resize-y","min-h-[120px]",3,"ngModelChange","ngModel"],[1,"absolute","left-1/2","top-6","z-10","-translate-x-1/2","-translate-y-1/2",3,"transcriptReady"],[1,"flex","flex-wrap","gap-2"],[1,"border-t","border-neutral-700","pt-4","flex","flex-col","gap-3"],[1,"text-sm","font-semibold","text-neutral-200"],["type","button",1,"px-2","py-1","text-xs","text-neutral-500","hover:text-red-400","border","border-transparent","hover:border-red-900/50","rounded",3,"click"],[1,"text-xs","font-semibold","text-neutral-400"],[1,"text-[11px]","text-neutral-300","bg-neutral-950/80","border","border-neutral-700","rounded","p-2","max-h-32","overflow-auto","whitespace-pre-wrap","font-mono"],[1,"text-[11px]","text-neutral-300","bg-neutral-950/80","border","border-neutral-700","rounded","p-2","max-h-48","overflow-auto","whitespace-pre-wrap","font-mono"],["type","button",1,"px-4","py-2","border","border-ccapAccent","rounded","text-ccapAccent","text-sm","font-semibold","hover:bg-ccapAccent","hover:text-white","transition-colors","disabled:opacity-40",3,"click","disabled"],[1,"text-xs","font-semibold","text-neutral-400","uppercase","tracking-wide"],[1,"text-xs","text-neutral-300","bg-neutral-950/80","border","border-neutral-700","rounded","p-3","max-h-48","overflow-auto","whitespace-pre-wrap","font-mono"],[1,"grid","grid-cols-1","sm:grid-cols-2","gap-3"],[1,"text-xs","text-neutral-400"],["type","text",1,"bg-neutral-900","border","border-neutral-600","rounded","px-2","py-1.5","text-sm","text-neutral-100",3,"ngModelChange","ngModel"],["type","text",1,"bg-neutral-900","border","border-neutral-600","rounded","px-2","py-1.5","text-sm","font-mono","text-neonCyan",3,"ngModelChange","ngModel"],[1,"bg-neutral-900","border","border-neutral-600","rounded","px-2","py-1.5","text-sm","text-neutral-100",3,"ngModelChange","ngModel"],[3,"value"],[1,"flex","flex-col","gap-1","sm:col-span-2"],[1,"flex","items-center","gap-2","text-xs","text-neutral-400","cursor-pointer"],["type","checkbox",3,"ngModelChange","ngModel"],[1,"flex","flex-col","gap-2","border","border-neutral-700","rounded","p-3","bg-neutral-900/40"],["type","button",1,"px-4","py-2","bg-ccapAccent/20","border","border-ccapAccent","text-ccapAccent","text-sm","font-semibold","rounded","hover:bg-ccapAccent","hover:text-white","transition-colors","disabled:opacity-40",3,"click","disabled"],["rows","2",1,"bg-neutral-900","border","border-neutral-600","rounded","px-2","py-1.5","text-sm","text-neutral-100","resize-y",3,"ngModelChange","ngModel"],["type","button",1,"self-start","px-3","py-1.5","border","border-neutral-500","rounded","text-neutral-300","text-xs","font-semibold","hover:border-ccapAccent","hover:text-ccapAccent","disabled:opacity-40",3,"click","disabled"]],template:function(i,t){i&1&&(r(0,"div"),M(1,re,5,0,"div",0)(2,oe,3,0,"div",1),r(3,"p",2),d(4," Raw text is never rewritten by the model. AI suggests metadata only. Drafts are saved in this browser (localStorage). "),o(),M(5,ae,2,1,"div",3)(6,se,2,1,"div",3)(7,de,5,1,"div",4)(8,le,5,1,"div",4),r(9,"div",5)(10,"label",6),d(11,"Raw user input"),o(),r(12,"textarea",7),p("ngModelChange",function(h){return t.handleRawTextInput(h)}),d(13," "),o(),r(14,"app-ccap-voice-record-button",8),p("transcriptReady",function(h){return t.handleVoiceTranscript(h)}),o()(),M(15,ue,4,2,"div",9)(16,fe,59,16,"div",10),o()),i&2&&(H("class","flex flex-col gap-4"+(t.isEmbeddedInModal?"":" rounded-lg bg-neutral-800/50 border border-ccapAccent/30 p-4")),s(),x(t.isEmbeddedInModal?2:1),s(4),x(t.suggestErrorText_$()?5:-1),s(),x(t.finalizeErrorText_$()?6:-1),s(),x(t.pm_DS.userInputWizardLastLlmSystemPrompt_$()?7:-1),s(),x(t.pm_DS.userInputWizardLastLlmUserMessage_$()?8:-1),s(4),_("ngModel",t.rawText_$()),s(3),x(t.skipSuggestMode?-1:15),s(),x(t.wizardStep_$()>=1||t.skipSuggestMode?16:-1))},dependencies:[D,R,U,B,k,G,A,V,W,Y],encapsulation:2})}return a})();function Ce(a,l){if(a&1&&(r(0,"option",8),d(1),o()),a&2){let e=l.$implicit;_("ngValue",e),s(),y(e)}}var Je=(()=>{class a{userInput_DS=E(Q);isOpen=C(!1);isBusy=C(!1);modalZIndex=C("50");prefillTitle=C("");prefillDetails=C("");prefillPriority=C(void 0);closed=O();submitted=O();title_$=c("");details_$=c("");area_$=c("");phase_$=c("MVP1");priority_$=c(f.medium);priorityChoices=[f.low,f.medium,f.high,f.urgent];constructor(){N(()=>{if(this.isOpen()){let e=this.prefillTitle().trim(),i=this.prefillDetails().trim();this.title_$.set(e),this.details_$.set(i),this.area_$.set(""),this.phase_$.set("MVP1");let t=this.prefillPriority();this.priority_$.set(t!==void 0?t:f.medium)}}),N(()=>{this.isOpen()?this.userInput_DS.pushQuickInputOverlayAreaContextByOverlayId(J.pmManualBugModal):this.userInput_DS.popQuickInputOverlayAreaContext(J.pmManualBugModal)},{allowSignalWrites:!0})}handleClose(){this.closed.emit()}handleSubmit(){let e=this.title_$().trim(),i=this.details_$().trim();if(!e.length||!i.length)return;let t=this.area_$().trim(),n=this.phase_$().trim(),h={title:e,details:i,priority:this.priority_$(),phase:n.length>0?n:"MVP1"};t.length>0&&(h.area=t),this.submitted.emit(h)}handleTitleInput(e){this.title_$.set(e)}handleDetailsInput(e){this.details_$.set(e)}handleAreaInput(e){this.area_$.set(e)}handlePhaseInput(e){this.phase_$.set(e)}handlePriorityChange(e){if(typeof e=="string"){let i=a.parsePriority(e);i&&this.priority_$.set(i);return}this.priority_$.set(e)}static parsePriority(e){let i=e.trim().toLowerCase(),t=Object.values(f);for(let n of t)if(n===i)return n}static \u0275fac=function(i){return new(i||a)};static \u0275cmp=v({type:a,selectors:[["app-pm-manual-bug-modal"]],inputs:{isOpen:[1,"isOpen"],isBusy:[1,"isBusy"],modalZIndex:[1,"modalZIndex"],prefillTitle:[1,"prefillTitle"],prefillDetails:[1,"prefillDetails"],prefillPriority:[1,"prefillPriority"]},outputs:{closed:"closed",submitted:"submitted"},standalone:!0,features:[z],decls:30,vars:12,consts:[["title","New bug (manual)",3,"closed","isOpen","maxWidth","zIndex","headerBorderClass"],[1,"flex","flex-col","gap-3","text-sm","text-neutral-200"],[1,"flex","flex-col","gap-1"],[1,"text-xs","text-neutral-500"],["type","text",1,"w-full","rounded","border","border-neutral-600","bg-neutral-900","px-2","py-1.5","text-neutral-100",3,"ngModelChange","ngModel"],["rows","6",1,"w-full","rounded","border","border-neutral-600","bg-neutral-900","px-2","py-1.5","text-neutral-100","font-mono","text-xs",3,"ngModelChange","ngModel"],[1,"grid","grid-cols-1","sm:grid-cols-2","gap-3"],[1,"rounded","border","border-neutral-600","bg-neutral-900","px-2","py-1.5","text-neutral-100",3,"ngModelChange","ngModel"],[3,"ngValue"],["modal-footer","",1,"flex","justify-end","gap-2","px-4","py-3","border-t","border-neutral-800","shrink-0"],["type","button",1,"px-3","py-1.5","text-xs","font-semibold","rounded","border","border-neutral-600","text-neutral-300","hover:border-neutral-500","disabled:opacity-40","disabled:pointer-events-none",3,"click","disabled"],["type","button",1,"px-3","py-1.5","text-xs","font-semibold","rounded","border","border-ccapAccent","text-ccapAccent","hover:bg-ccapAccent/10","disabled:opacity-40","disabled:pointer-events-none",3,"click","disabled"]],template:function(i,t){i&1&&(r(0,"app-s-modal",0),p("closed",function(){return t.handleClose()}),r(1,"div",1)(2,"label",2)(3,"span",3),d(4,"Title"),o(),r(5,"input",4),p("ngModelChange",function(h){return t.handleTitleInput(h)}),o()(),r(6,"label",2)(7,"span",3),d(8,"Details (raw \u2014 stored verbatim)"),o(),r(9,"textarea",5),p("ngModelChange",function(h){return t.handleDetailsInput(h)}),o()(),r(10,"div",6)(11,"label",2)(12,"span",3),d(13,"Priority"),o(),r(14,"select",7),p("ngModelChange",function(h){return t.handlePriorityChange(h)}),T(15,Ce,2,2,"option",8,I),o()(),r(17,"label",2)(18,"span",3),d(19,"Phase"),o(),r(20,"input",4),p("ngModelChange",function(h){return t.handlePhaseInput(h)}),o()()(),r(21,"label",2)(22,"span",3),d(23,"Area (optional)"),o(),r(24,"input",4),p("ngModelChange",function(h){return t.handleAreaInput(h)}),o()()(),r(25,"div",9)(26,"button",10),p("click",function(){return t.handleClose()}),d(27," Cancel "),o(),r(28,"button",11),p("click",function(){return t.handleSubmit()}),d(29),o()()()),i&2&&(_("isOpen",t.isOpen())("maxWidth","lg")("zIndex",t.modalZIndex())("headerBorderClass","border-neonRed/40"),s(5),_("ngModel",t.title_$()),s(4),_("ngModel",t.details_$()),s(5),_("ngModel",t.priority_$()),s(),P(t.priorityChoices),s(5),_("ngModel",t.phase_$()),s(4),_("ngModel",t.area_$()),s(2),_("disabled",t.isBusy()),s(2),_("disabled",t.isBusy()||!t.title_$().trim().length||!t.details_$().trim().length),s(),$(" ",t.isBusy()?"Creating\u2026":"Create bug"," "))},dependencies:[D,R,U,B,k,A,V,W,X],encapsulation:2})}return a})();export{Je as a,Ve as b};
3
- //# sourceMappingURL=chunk-6TQLCMPS.js.map
3
+ //# sourceMappingURL=chunk-CHUAQGNK.js.map
@@ -1,3 +1,3 @@
1
- import{a as R,b as O}from"./chunk-3LJYOX46.js";import{a as q}from"./chunk-XG3ULHDY.js";import{a as g}from"./chunk-UFBTR2BG.js";import{a as U}from"./chunk-LWUPRATP.js";import{e as P}from"./chunk-NBYYHCJY.js";import{h as S,j as L}from"./chunk-XPUEDVEA.js";import{p as D}from"./chunk-GLADIICK.js";import{C as v,R as T,a as h,aa as p,b as f,h as A,k as d,y as M}from"./chunk-TBMJSIBB.js";var C=A(D());var I=class l{static compareAsc(_,e){let s=(_.sequence??0)-(e.sequence??0);if(s!==0)return s;let n=typeof _.timestamp=="string"?_.timestamp:"",t=typeof e.timestamp=="string"?e.timestamp:"",o=n.localeCompare(t);if(o!==0)return o;let i=typeof _.messageKey=="string"?_.messageKey:"",r=typeof e.messageKey=="string"?e.messageKey:"";return i.localeCompare(r)}static sortAsc(_){return[..._].sort(l.compareAsc)}};var x=A(D());var w=(()=>{class l{parent;agentToolUseIds=new Set;activeSubAgentId="";toolUseIdToName=new Map;init(e){this.parent=e}resetTrackingState(){this.toolUseIdToName.clear(),this.agentToolUseIds.clear(),this.activeSubAgentId=""}handleSocketEvent(e,s){let n=e.event,t=e.payload;try{let o=typeof t.ccapId=="string"?t.ccapId:"";if(n!=="cc:rate-limit-update"&&n!=="ext-session-msg:message"&&n!=="ext-session-msg:update"&&o&&s.selectedCcapId&&o!==s.selectedCcapId){x.DyFM_Log.info(`CCAP_CcSession_DS | socket event dropped by instance filter | event: ${n} | eventCcapId: ${o} | selectedCcapId: ${s.selectedCcapId}`);return}switch(n){case"cc-session:status":this.handleStatusUpdate(t);break;case"cc-session:output":this.handleOutputChunk(t);break;case"cc-session:event":this.handleSessionEvent(t);break;case"cc-session:list-update":this.handleListUpdate(t);break;case"cc-session:session-update":this.handleSessionItemUpdate(t);break;case"agent-events":this.handleAgentEvent(t);break;case"ext-session-msg:message":this.handleAssembledMessage(t);break;case"ext-session-msg:update":this.handleAssembledMessageUpdate(t);break;case"cc:rate-limit-update":this.handleRateLimitBroadcast(t);break}}catch(o){let i=o instanceof Error?o.message:String(o);x.DyFM_Log.error(`CCAP_CcSession_DS | socket event error | event: ${n}`,o),s.globalErrorShowError(o instanceof Error?o:new Error(`CC Session socket event processing failed: ${n} \u2014 ${i}`),"cc-session-socket-event")}}pushConsoleMessageFromEvent(e,s,n){let t=e.data;switch(e.eventType){case"response-chunk":{this.pushResponseChunkBlocks(t);break}case"tool-call-start":{let o=t.name??t.tool_name??"unknown",i=typeof t.id=="string"?t.id:"";i&&this.toolUseIdToName.set(i,o),o==="Agent"&&i&&this.agentToolUseIds.add(i);let r=t.input,a=r?l.summarizeToolInput(r):"",u=a?`${o}: ${a}`:o,c=o==="Edit"?l.buildEditExpandableContent(r):void 0,m=o==="Agent"?"":this.activeSubAgentId;this.parent.pushConsoleMessage({type:"tool",text:u,expandableContent:c,rawData:t,parentAgentId:m||void 0});break}case"tool-call-end":{let o=t.content??t.output,i=typeof o=="string"?o:"",r=i.length>200?i.substring(0,200)+"\u2026":i;if(r){let a=i.length>200?i:void 0;this.parent.pushConsoleMessage({type:"tool-result",text:r,expandableContent:a,rawData:t,parentAgentId:this.activeSubAgentId||void 0})}break}case"response-complete":{this.activeSubAgentId="";let o=t.cost_usd,i=typeof o=="number"?` ($${o.toFixed(4)})`:"",r=typeof t.model=="string"?` \xB7 ${t.model}`:"";this.parent.pushConsoleMessage({type:"result",text:`Response complete${r}${i}`,rawData:t,expandableContent:JSON.stringify(t,null,2)}),this.accumulateUsage(t);break}case"prompt-sent":{let o=typeof t.content=="string"?t.content:"";o&&(this.parent.consoleMessages_$().some(a=>a.type==="prompt"&&a.text===o.trim())||this.parent.pushConsoleMessage({type:"prompt",text:o,rawData:t,expandableContent:JSON.stringify(t,null,2)}));break}case"status-change":{let o=typeof t.from=="string"?t.from:"",i=typeof t.to=="string"?t.to:"";if(i){let r=typeof t.statusMessage=="string"?t.statusMessage:void 0,a=o?`${o} \u2192 ${i}`:i,u=r?`${a} \u2014 ${r}`:a;this.parent.pushConsoleMessage({type:"status",text:u,isStatus:!0,rawData:t,expandableContent:JSON.stringify(t,null,2)})}break}case"config-change":{let o=t.update,i=o&&typeof o=="object"?Object.keys(o).join(", "):"unknown";this.parent.pushConsoleMessage({type:"info",text:`Config updated: ${i}`,rawData:t,expandableContent:JSON.stringify(t,null,2)});break}case"error":{let o=typeof t.message=="string"?t.message:"Unknown error";this.parent.pushConsoleMessage({type:"error",text:o,rawData:t,expandableContent:JSON.stringify(t,null,2)}),s&&n(new Error(`CC Session error: ${o}`),"cc-session-event");break}case"usage-update":{this.accumulateUsage(t);break}case"cli-chunk":{this.handleCliChunkEvent(t);break}case"runner-overflow":{let i=`Runner buffer overflow: ${typeof t.droppedCount=="number"?t.droppedCount:0} output items lost during server disconnect`;this.parent.pushConsoleMessage({type:"error",text:i,rawData:t,expandableContent:JSON.stringify(t,null,2)});break}case"interrupted-prompt":{let o=typeof t.reason=="string"?t.reason:"",i=typeof t.lastPrompt=="string"?t.lastPrompt:"",r=i.length>80?i.substring(0,80)+"\u2026":i,a=r?`Prompt interrupted (${o}): "${r}"`:`Prompt interrupted${o?" ("+o+")":""}`;this.parent.pushConsoleMessage({type:"status",text:a,isStatus:!0,rawData:t,expandableContent:JSON.stringify(t,null,2)});break}case"session-init":{let o=typeof t.model=="string"?t.model:"",i=typeof t.claudeCodeVersion=="string"?t.claudeCodeVersion:"",r=typeof t.permissionMode=="string"?t.permissionMode:"",a=[];o&&a.push(o),r&&a.push(r),i&&a.push(`v${i}`);let u=a.length>0?`CLI init: ${a.join(" \xB7 ")}`:"CLI initialized",c=JSON.stringify(t,null,2);this.parent.pushConsoleMessage({type:"info",text:u,rawData:t,expandableContent:c});break}case"config-mismatch":{let o=t.mismatches,i=Array.isArray(o)?o.map(r=>`${r.field}: requested "${r.requested}" \u2192 actual "${r.actual}"`).join(", "):"unknown mismatch";this.parent.pushConsoleMessage({type:"error",text:`Config mismatch: ${i}`,rawData:t,expandableContent:JSON.stringify(t,null,2)});break}case"cli-args-record":{let o=typeof t.model=="string"?t.model:"default",i=typeof t.reasoningEffort=="string"?t.reasoningEffort:"default",r=typeof t.mode=="string"?t.mode:"normal",a=typeof t.permissionPolicy=="string"?t.permissionPolicy:"default",u=`CLI spawn: model=${o} \xB7 effort=${i} \xB7 mode=${r} \xB7 permission=${a}`;this.parent.pushConsoleMessage({type:"info",text:u,rawData:t,expandableContent:JSON.stringify(t,null,2)});break}case"stdout-line":case"stderr-line":break;default:{let o=e.eventType;this.parent.pushConsoleMessage({type:"raw",text:o,rawData:t});break}}}handleStatusUpdate(e){let s=e.sessionId??"",n=e.status??"",t=e.statusMessage;this.parent.lastStatusUpdate_$.set({sessionId:s,status:n,statusMessage:t});let i=this.parent.sessions_$().map(a=>a.sessionId===s?f(h({},a),{status:n,statusMessage:t}):a);this.parent.sessions_$.set(i);let r=this.parent.selectedSession_$();if(r?.session.sessionId===s){let a=l.isLiveCcSessionStatus(n);this.parent.selectedSession_$.set(f(h({},r),{session:f(h({},r.session),{status:n,statusMessage:t}),runtime:f(h({},r.runtime),{isLive:a,runtimeStatus:n})}))}if(n==="errored"){let a=t?`CC Session error (${s}): ${t}`:`CC Session error (${s}): session entered errored state`;this.parent.showGlobalError(new Error(a),"cc-session-status")}this.parent.evaluateSessionEventsPolling()}handleOutputChunk(e){let s=e.sessionId??"";if(s&&s!==this.parent.activeSessionId_$())return;let n=e.content??"",t=e.type??"stdout",o=this.parent.liveOutput_$(),i=n.split(`
1
+ import{a as R,b as O}from"./chunk-TUEKZYSI.js";import{a as q}from"./chunk-JDWJPZDR.js";import{a as g}from"./chunk-UFBTR2BG.js";import{a as U}from"./chunk-SLWCZIOD.js";import{e as P}from"./chunk-K2VUINMT.js";import{h as S,j as L}from"./chunk-U4CWC5HD.js";import{p as D}from"./chunk-P7QASRBG.js";import{C as v,R as T,a as h,aa as p,b as f,h as A,k as d,y as M}from"./chunk-TBMJSIBB.js";var C=A(D());var I=class l{static compareAsc(_,e){let s=(_.sequence??0)-(e.sequence??0);if(s!==0)return s;let n=typeof _.timestamp=="string"?_.timestamp:"",t=typeof e.timestamp=="string"?e.timestamp:"",o=n.localeCompare(t);if(o!==0)return o;let i=typeof _.messageKey=="string"?_.messageKey:"",r=typeof e.messageKey=="string"?e.messageKey:"";return i.localeCompare(r)}static sortAsc(_){return[..._].sort(l.compareAsc)}};var x=A(D());var w=(()=>{class l{parent;agentToolUseIds=new Set;activeSubAgentId="";toolUseIdToName=new Map;init(e){this.parent=e}resetTrackingState(){this.toolUseIdToName.clear(),this.agentToolUseIds.clear(),this.activeSubAgentId=""}handleSocketEvent(e,s){let n=e.event,t=e.payload;try{let o=typeof t.ccapId=="string"?t.ccapId:"";if(n!=="cc:rate-limit-update"&&n!=="ext-session-msg:message"&&n!=="ext-session-msg:update"&&o&&s.selectedCcapId&&o!==s.selectedCcapId){x.DyFM_Log.info(`CCAP_CcSession_DS | socket event dropped by instance filter | event: ${n} | eventCcapId: ${o} | selectedCcapId: ${s.selectedCcapId}`);return}switch(n){case"cc-session:status":this.handleStatusUpdate(t);break;case"cc-session:output":this.handleOutputChunk(t);break;case"cc-session:event":this.handleSessionEvent(t);break;case"cc-session:list-update":this.handleListUpdate(t);break;case"cc-session:session-update":this.handleSessionItemUpdate(t);break;case"agent-events":this.handleAgentEvent(t);break;case"ext-session-msg:message":this.handleAssembledMessage(t);break;case"ext-session-msg:update":this.handleAssembledMessageUpdate(t);break;case"cc:rate-limit-update":this.handleRateLimitBroadcast(t);break}}catch(o){let i=o instanceof Error?o.message:String(o);x.DyFM_Log.error(`CCAP_CcSession_DS | socket event error | event: ${n}`,o),s.globalErrorShowError(o instanceof Error?o:new Error(`CC Session socket event processing failed: ${n} \u2014 ${i}`),"cc-session-socket-event")}}pushConsoleMessageFromEvent(e,s,n){let t=e.data;switch(e.eventType){case"response-chunk":{this.pushResponseChunkBlocks(t);break}case"tool-call-start":{let o=t.name??t.tool_name??"unknown",i=typeof t.id=="string"?t.id:"";i&&this.toolUseIdToName.set(i,o),o==="Agent"&&i&&this.agentToolUseIds.add(i);let r=t.input,a=r?l.summarizeToolInput(r):"",u=a?`${o}: ${a}`:o,c=o==="Edit"?l.buildEditExpandableContent(r):void 0,m=o==="Agent"?"":this.activeSubAgentId;this.parent.pushConsoleMessage({type:"tool",text:u,expandableContent:c,rawData:t,parentAgentId:m||void 0});break}case"tool-call-end":{let o=t.content??t.output,i=typeof o=="string"?o:"",r=i.length>200?i.substring(0,200)+"\u2026":i;if(r){let a=i.length>200?i:void 0;this.parent.pushConsoleMessage({type:"tool-result",text:r,expandableContent:a,rawData:t,parentAgentId:this.activeSubAgentId||void 0})}break}case"response-complete":{this.activeSubAgentId="";let o=t.cost_usd,i=typeof o=="number"?` ($${o.toFixed(4)})`:"",r=typeof t.model=="string"?` \xB7 ${t.model}`:"";this.parent.pushConsoleMessage({type:"result",text:`Response complete${r}${i}`,rawData:t,expandableContent:JSON.stringify(t,null,2)}),this.accumulateUsage(t);break}case"prompt-sent":{let o=typeof t.content=="string"?t.content:"";o&&(this.parent.consoleMessages_$().some(a=>a.type==="prompt"&&a.text===o.trim())||this.parent.pushConsoleMessage({type:"prompt",text:o,rawData:t,expandableContent:JSON.stringify(t,null,2)}));break}case"status-change":{let o=typeof t.from=="string"?t.from:"",i=typeof t.to=="string"?t.to:"";if(i){let r=typeof t.statusMessage=="string"?t.statusMessage:void 0,a=o?`${o} \u2192 ${i}`:i,u=r?`${a} \u2014 ${r}`:a;this.parent.pushConsoleMessage({type:"status",text:u,isStatus:!0,rawData:t,expandableContent:JSON.stringify(t,null,2)})}break}case"config-change":{let o=t.update,i=o&&typeof o=="object"?Object.keys(o).join(", "):"unknown";this.parent.pushConsoleMessage({type:"info",text:`Config updated: ${i}`,rawData:t,expandableContent:JSON.stringify(t,null,2)});break}case"error":{let o=typeof t.message=="string"?t.message:"Unknown error";this.parent.pushConsoleMessage({type:"error",text:o,rawData:t,expandableContent:JSON.stringify(t,null,2)}),s&&n(new Error(`CC Session error: ${o}`),"cc-session-event");break}case"usage-update":{this.accumulateUsage(t);break}case"cli-chunk":{this.handleCliChunkEvent(t);break}case"runner-overflow":{let i=`Runner buffer overflow: ${typeof t.droppedCount=="number"?t.droppedCount:0} output items lost during server disconnect`;this.parent.pushConsoleMessage({type:"error",text:i,rawData:t,expandableContent:JSON.stringify(t,null,2)});break}case"interrupted-prompt":{let o=typeof t.reason=="string"?t.reason:"",i=typeof t.lastPrompt=="string"?t.lastPrompt:"",r=i.length>80?i.substring(0,80)+"\u2026":i,a=r?`Prompt interrupted (${o}): "${r}"`:`Prompt interrupted${o?" ("+o+")":""}`;this.parent.pushConsoleMessage({type:"status",text:a,isStatus:!0,rawData:t,expandableContent:JSON.stringify(t,null,2)});break}case"session-init":{let o=typeof t.model=="string"?t.model:"",i=typeof t.claudeCodeVersion=="string"?t.claudeCodeVersion:"",r=typeof t.permissionMode=="string"?t.permissionMode:"",a=[];o&&a.push(o),r&&a.push(r),i&&a.push(`v${i}`);let u=a.length>0?`CLI init: ${a.join(" \xB7 ")}`:"CLI initialized",c=JSON.stringify(t,null,2);this.parent.pushConsoleMessage({type:"info",text:u,rawData:t,expandableContent:c});break}case"config-mismatch":{let o=t.mismatches,i=Array.isArray(o)?o.map(r=>`${r.field}: requested "${r.requested}" \u2192 actual "${r.actual}"`).join(", "):"unknown mismatch";this.parent.pushConsoleMessage({type:"error",text:`Config mismatch: ${i}`,rawData:t,expandableContent:JSON.stringify(t,null,2)});break}case"cli-args-record":{let o=typeof t.model=="string"?t.model:"default",i=typeof t.reasoningEffort=="string"?t.reasoningEffort:"default",r=typeof t.mode=="string"?t.mode:"normal",a=typeof t.permissionPolicy=="string"?t.permissionPolicy:"default",u=`CLI spawn: model=${o} \xB7 effort=${i} \xB7 mode=${r} \xB7 permission=${a}`;this.parent.pushConsoleMessage({type:"info",text:u,rawData:t,expandableContent:JSON.stringify(t,null,2)});break}case"stdout-line":case"stderr-line":break;default:{let o=e.eventType;this.parent.pushConsoleMessage({type:"raw",text:o,rawData:t});break}}}handleStatusUpdate(e){let s=e.sessionId??"",n=e.status??"",t=e.statusMessage;this.parent.lastStatusUpdate_$.set({sessionId:s,status:n,statusMessage:t});let i=this.parent.sessions_$().map(a=>a.sessionId===s?f(h({},a),{status:n,statusMessage:t}):a);this.parent.sessions_$.set(i);let r=this.parent.selectedSession_$();if(r?.session.sessionId===s){let a=l.isLiveCcSessionStatus(n);this.parent.selectedSession_$.set(f(h({},r),{session:f(h({},r.session),{status:n,statusMessage:t}),runtime:f(h({},r.runtime),{isLive:a,runtimeStatus:n})}))}if(n==="errored"){let a=t?`CC Session error (${s}): ${t}`:`CC Session error (${s}): session entered errored state`;this.parent.showGlobalError(new Error(a),"cc-session-status")}this.parent.evaluateSessionEventsPolling()}handleOutputChunk(e){let s=e.sessionId??"";if(s&&s!==this.parent.activeSessionId_$())return;let n=e.content??"",t=e.type??"stdout",o=this.parent.liveOutput_$(),i=n.split(`
2
2
  `),r=3e3;if(t==="stderr"){let c=new Set(this.parent.liveStderrLines_$()),m=o.length;for(let y=0;y<i.length;y++)c.add(m+y);this.parent.liveStderrLines_$.set(c)}let u=[...o,...i];if(u.length>r){let c=u.length-r,m=u.slice(c),y=this.parent.liveStderrLines_$(),b=new Set;for(let k of y){let $=k-c;$>=0&&b.add($)}this.parent.liveStderrLines_$.set(b),this.parent.liveOutput_$.set(m)}else this.parent.liveOutput_$.set(u)}handleSessionEvent(e){let s=e.sessionId??"";if(s&&s!==this.parent.activeSessionId_$())return;let n=e.event??{},t={sessionId:s,eventType:n.eventType??"",timestamp:n.timestamp??"",data:n.data??{},sequence:n.sequence??0,eventSource:typeof n.eventSource=="string"?n.eventSource:void 0};if(t.sequence<=this.parent.getLastKnownEventSequence())return;this.parent.setLastKnownEventSequence(t.sequence);let o=this.parent.selectedSessionEvents_$();this.parent.selectedSessionEvents_$.set([...o,t]),this.pushConsoleMessageFromEvent(t,!0,(i,r)=>{this.parent.showGlobalError(i,r)})}handleAgentEvent(e){let s=typeof e.phase=="string"?e.phase:void 0;if(s)switch(s){case g.runInitialization:this.parent.pushConsoleMessage({type:"status",text:"RUN initialization",isStatus:!0});break;case g.analyze:this.parent.pushConsoleMessage({type:"status",text:"Analyzing incoming message",isStatus:!0});break;case g.analyzeResult:{let n=typeof e.runIntent=="string"?e.runIntent:"";n&&this.parent.pushConsoleMessage({type:"run-intent",text:n,isStatus:!1});break}case g.assemble:this.parent.pushConsoleMessage({type:"status",text:"Refreshing Context",isStatus:!0});break;case g.executionStart:this.parent.pushConsoleMessage({type:"status",text:"Starting Agent",isStatus:!0});break;case g.llmAgenticLoop:this.parent.pushConsoleMessage({type:"status",text:"Selecting next move",isStatus:!0});break;case g.agenticLoopIteration:{let n=typeof e.action=="string"?e.action:"",t=typeof e.tool=="string"?e.tool:"",o=typeof e.intent=="string"?e.intent:"",i=[];n&&i.push(n),t&&i.push(t),o&&i.push(o);let r=i.join(" \xB7 ");r&&this.parent.pushConsoleMessage({type:"iteration",text:r,isStatus:!1});break}case g.llmToolDescription:this.parent.pushConsoleMessage({type:"status",text:"Assembling tool inputs",isStatus:!0});break;case g.llmToolErrorRetry:this.parent.pushConsoleMessage({type:"status",text:"Figuring out what's wrong",isStatus:!0});break;case g.toolErrorRetry:this.parent.pushConsoleMessage({type:"status",text:"Trying to fix inputs",isStatus:!0});break;case g.executionEnd:this.parent.pushConsoleMessage({type:"status",text:"Finishing run",isStatus:!0});break;case g.finalization:case g.llmRunFinalization:this.parent.pushConsoleMessage({type:"status",text:"Gathering what we've done",isStatus:!0});break;case g.postFinalization:this.parent.pushConsoleMessage({type:"status",text:"Memorizing stuff",isStatus:!0});break;case g.runFlowComplete:this.parent.pushConsoleMessage({type:"status",text:"Getting back to user",isStatus:!0});break}}handleRateLimitBroadcast(e){let s=e.rate_limit_info;if(!s||typeof s!="object")return;let n=s,t={status:typeof n.status=="string"?n.status:"",resetsAt:typeof n.resetsAt=="number"?n.resetsAt:0,rateLimitType:typeof n.rateLimitType=="string"?n.rateLimitType:"",utilization:typeof n.utilization=="number"?n.utilization:0,surpassedThreshold:typeof n.surpassedThreshold=="number"?n.surpassedThreshold:0,isUsingOverage:n.isUsingOverage===!0,receivedAt:new Date().toISOString()};this.parent.rateLimitInfo_$.set(t)}handleListUpdate(e){let s=e.sessions??[],o=[...this.parent.sessions_$().some(i=>i.isArchived===!0)?s:s.filter(i=>!i.isArchived)].sort((i,r)=>{let a=i.lastActivityAt?new Date(i.lastActivityAt).getTime():0;return(r.lastActivityAt?new Date(r.lastActivityAt).getTime():0)-a});this.parent.sessions_$.set(o),this.mergeActiveSessionDetail(s)}handleSessionItemUpdate(e){let s=typeof e.sessionId=="string"?e.sessionId:"";if(!s)return;let n=typeof e.update=="object"&&e.update!==null?e.update:{},o=this.parent.sessions_$().map(r=>r.sessionId!==s?r:l.applySessionFieldUpdate(r,n));this.parent.sessions_$.set(o);let i=this.parent.selectedSession_$();i?.session.sessionId===s&&this.parent.selectedSession_$.set(f(h({},i),{session:l.applySessionFieldUpdate(i.session,n)}))}static applySessionFieldUpdate(e,s){let n=h({},e);return typeof s.toolCallCountIncrement=="number"&&(n.toolCallCount=(n.toolCallCount??0)+s.toolCallCountIncrement),typeof s.promptCountIncrement=="number"&&(n.promptCount=(n.promptCount??0)+s.promptCountIncrement),typeof s.inputTokensIncrement=="number"&&(n.inputTokensTotal=(n.inputTokensTotal??0)+s.inputTokensIncrement),typeof s.outputTokensIncrement=="number"&&(n.outputTokensTotal=(n.outputTokensTotal??0)+s.outputTokensIncrement),typeof s.costUsdIncrement=="number"&&(n.costUsdTotal=(n.costUsdTotal??0)+s.costUsdIncrement),typeof s.status=="string"&&(n.status=s.status),(typeof s.statusMessage=="string"||s.statusMessage===void 0)&&(n.statusMessage=s.statusMessage),typeof s.lastActivityAt=="string"&&(n.lastActivityAt=s.lastActivityAt),typeof s.lastPrompt=="string"&&(n.lastPrompt=s.lastPrompt),typeof s.activeModel=="string"&&(n.activeModel=s.activeModel),n}mergeActiveSessionDetail(e){let s=this.parent.activeSessionId_$();if(!s)return;let n=this.parent.selectedSession_$();if(!n)return;let t=e.find(o=>o.sessionId===s);t&&this.parent.selectedSession_$.set(f(h({},n),{session:h(h({},n.session),t)}))}handleAssembledMessage(e){let s=typeof e.sessionId=="string"?e.sessionId:"",n=this.parent.activeSessionId_$();if(!s||s!==n)return;let t=e.message;if(!t||typeof t!="object"){x.DyFM_Log.warn("CCAP_CcSession_DS | handleAssembledMessage dropped: invalid message payload",{sessionId:s,payloadKeys:Object.keys(e)});return}let o=t,i=this.parent.assembledMessages_$(),r=typeof o.messageKey=="string"?o.messageKey:"";r&&i.some(a=>a.messageKey===r)||this.parent.assembledMessages_$.set(I.sortAsc([...i,o]))}handleAssembledMessageUpdate(e){let s=typeof e.sessionId=="string"?e.sessionId:"";if(!s||s!==this.parent.activeSessionId_$())return;let n=typeof e.messageKey=="string"?e.messageKey:"";if(!n)return;let t=e.update;if(!t||typeof t!="object")return;let o=t,i=this.parent.assembledMessages_$(),r=i.findIndex(c=>c.messageKey===n);if(r<0)return;let a=h({},i[r]);typeof o.bodyText=="string"&&(a.bodyText=o.bodyText),o.toolResult!==void 0&&(a.toolResult=o.toolResult),typeof o.toolStatus=="string"&&(a.toolStatus=o.toolStatus),o.headerStatusDot!==void 0&&(a.headerStatusDot=typeof o.headerStatusDot=="string"?o.headerStatusDot:void 0);let u=[...i];u[r]=a,this.parent.assembledMessages_$.set(u)}handleCliChunkEvent(e){let s=typeof e.type=="string"?e.type:"";if(s==="rate_limit_event"){let n=e.rate_limit_info;if(n&&typeof n=="object"){let t=n,o={status:typeof t.status=="string"?t.status:"",resetsAt:typeof t.resetsAt=="number"?t.resetsAt:0,rateLimitType:typeof t.rateLimitType=="string"?t.rateLimitType:"",utilization:typeof t.utilization=="number"?t.utilization:0,surpassedThreshold:typeof t.surpassedThreshold=="number"?t.surpassedThreshold:0,isUsingOverage:t.isUsingOverage===!0,receivedAt:new Date().toISOString()};this.parent.rateLimitInfo_$.set(o)}return}if(s==="system"){this.handleCliChunkSystemEvent(e);return}this.handleCliChunkToolResults(e)||this.parent.pushConsoleMessage({type:"raw",text:s||"cli-chunk",rawData:e})}handleCliChunkSystemEvent(e){let s=typeof e.subtype=="string"?e.subtype:"",n=typeof e.description=="string"?e.description:l.buildSystemEventBrief({subtype:s,data:e}),t=typeof e.tool_use_id=="string"?e.tool_use_id:"";t&&this.agentToolUseIds.has(t)&&(this.activeSubAgentId=t);let o=t&&this.agentToolUseIds.has(t)?t:this.activeSubAgentId||void 0,i=typeof e.last_tool_name=="string"?e.last_tool_name:"";if(s==="task_progress"&&i){this.parent.pushConsoleMessage({type:"tool",text:`${i}: ${n}`,isStatus:!1,rawData:e,parentAgentId:o});return}this.parent.pushConsoleMessage({type:"status-update",text:n,subtype:s,isStatus:!1,rawData:e,parentAgentId:o})}pushResponseChunkBlocks(e){let s=e.message,n=s&&typeof s=="object"?s.content:e.content;if(Array.isArray(n)){for(let t of n){if(!t||typeof t!="object")continue;let o=t,i=typeof o.type=="string"?o.type:"";if(i==="text"){let r=typeof o.text=="string"?o.text:"";r&&(this.activeSubAgentId="",this.parent.pushConsoleMessage({type:"assistant",text:r,rawData:e}))}else if(i==="tool_use")this.handleResponseChunkToolUse(o,e);else if(i==="tool_result")this.handleResponseChunkToolResult(o);else if(i==="thinking"){let r=typeof o.thinking=="string"?o.thinking:"";r&&this.parent.pushConsoleMessage({type:"thinking",text:r,rawData:o,parentAgentId:this.activeSubAgentId||void 0})}else i&&this.parent.pushConsoleMessage({type:"raw",text:i,rawData:o})}return}if(typeof n=="string"&&n){this.parent.pushConsoleMessage({type:"assistant",text:n,rawData:e});return}this.parent.pushConsoleMessage({type:"raw",text:"response-chunk",rawData:e})}handleResponseChunkToolUse(e,s){let n=typeof e.name=="string"?e.name:"unknown",t=typeof e.id=="string"?e.id:"";t&&this.toolUseIdToName.set(t,n),n==="Agent"&&t&&this.agentToolUseIds.add(t);let o=e.input,i=o?l.summarizeToolInput(o):"",r=i?`${n}: ${i}`:n,a=n==="Edit"?l.buildEditExpandableContent(o):void 0,u=n==="Agent"?"":this.activeSubAgentId;this.parent.pushConsoleMessage({type:"tool",text:r,expandableContent:a,rawData:e,parentAgentId:u||void 0})}handleResponseChunkToolResult(e){let s=typeof e.tool_use_id=="string"?e.tool_use_id:"",n=s&&this.agentToolUseIds.has(s)?s:this.activeSubAgentId||"",t=e.content??e.output,o=typeof t=="string"?t:"",i=o.length>200?o.substring(0,200)+"\u2026":o||"tool_result";this.parent.pushConsoleMessage({type:"tool-result",text:i,expandableContent:o.length>200?o:void 0,rawData:e,parentAgentId:n||void 0})}handleCliChunkToolResults(e){if((typeof e.type=="string"?e.type:"")!=="user")return!1;let n=e.message,t=n&&typeof n=="object"?n.content:null;if(!Array.isArray(t))return!1;let o=typeof e.parent_tool_use_id=="string"?e.parent_tool_use_id:"",i=!1;for(let r of t){if(!r||typeof r!="object")continue;let a=r,u=typeof a.type=="string"?a.type:"";if(u==="tool_result"){let c=typeof a.tool_use_id=="string"?a.tool_use_id:"",m=c?this.toolUseIdToName.get(c)??"":"",y=a.content,b=typeof y=="string"?y:"",k=a.is_error===!0,$=m?`${m}: `:"",E=b.length>200?b.substring(0,200)+"\u2026":b||"tool result",K=k?`${$}ERROR \u2014 ${E}`:`${$}${E}`;this.parent.pushConsoleMessage({type:"tool-result",text:K,expandableContent:b.length>200?b:void 0,rawData:f(h({},a),{parent_tool_use_id:o||void 0}),parentAgentId:o||void 0}),i=!0}else if(u==="text"&&o){let c=typeof a.text=="string"?a.text:"";if(c){let m=c.length>200?c.substring(0,200)+"\u2026":c;this.parent.pushConsoleMessage({type:"tool-result",text:m,expandableContent:c.length>200?c:void 0,rawData:{tool_use_id:o,type:"sub-agent-prompt",text:c},parentAgentId:o}),i=!0}}}return i}static isLiveCcSessionStatus(e){return e==="running"||e==="waiting-input"||e==="starting"}static buildSystemEventBrief(e){switch(e.subtype){case"init":{let s=typeof e.data.cwd=="string"?e.data.cwd:"",n=typeof e.data.model=="string"?e.data.model:"",t=["init"];return s&&t.push(s),n&&t.push(n),t.join(" \xB7 ")}case"task_updated":{let s=e.data.patch,n=s&&typeof s=="object"&&typeof s.status=="string"?s.status:"";return n?`task ${n}`:"task updated"}case"task_notification":{let s=typeof e.data.status=="string"?e.data.status:"";return s?`task ${s}`:"task notification"}default:return e.subtype||"system"}}static buildEditExpandableContent(e){if(!e||typeof e!="object")return;let s=e,n=s.old_string,t=s.new_string;if(typeof n!="string"||typeof t!="string")return;let o=500,i=n.length>o?n.substring(0,o)+"\u2026":n,r=t.length>o?t.substring(0,o)+"\u2026":t;return JSON.stringify({old:i,new:r})}static summarizeToolInput(e){if(typeof e=="string")return e.length>120?e.substring(0,120)+"\u2026":e;if(e&&typeof e=="object"){let s=e,n=s.file_path??s.path,t=s.command,o=s.pattern;if(typeof n=="string")return n;if(typeof t=="string")return t.length>120?t.substring(0,120)+"\u2026":t;if(typeof o=="string")return o}return""}accumulateUsage(e){let s=e.usage,n=typeof e.cost_usd=="number"?e.cost_usd:0,t=0,o=0;if(s&&typeof s=="object"){let r=s;t=typeof r.input_tokens=="number"?r.input_tokens:typeof r.promptTokens=="number"?r.promptTokens:0,o=typeof r.output_tokens=="number"?r.output_tokens:typeof r.completionTokens=="number"?r.completionTokens:0}let i=this.parent.sessionUsage_$();this.parent.sessionUsage_$.set({promptTokens:i.promptTokens+t,completionTokens:i.completionTokens+o,totalTokens:i.totalTokens+t+o,costUsd:i.costUsd+n})}static \u0275fac=function(s){return new(s||l)};static \u0275prov=M({token:l,factory:l.\u0275fac,providedIn:"root"})}return l})();var ne=(()=>{class l{sessions_$=p([]);sessionsLoading_$=p(!1);sessionsLoadError_$=p(null);selectedSession_$=p(null);selectedSessionLoading_$=p(!1);selectedSessionEvents_$=p([]);liveOutput_$=p([]);liveStderrLines_$=p(new Set);consoleMessages_$=p([]);assembledMessages_$=p([]);assembledMessagesHasMore_$=p(!1);isLoadingOlderMessages_$=p(!1);assembledMessagesLoaded_$=p(!1);lastStatusUpdate_$=p(null);sessionUsage_$=p({promptTokens:0,completionTokens:0,totalTokens:0,costUsd:0});rateLimitInfo_$=p(null);activeSessionId_$=p("");ccSession_AS=v(R);extSessionMsg_AS=v(q);globalError_CS=v(L);socket_CS=v(P);ngZone=v(T);peiContext_DS=v(U);socketEventHandler_CS=v(w);eventSubscription=null;reconnectSubscription=null;lastKnownEventSequence=-1;static SESSION_EVENTS_POLL_INTERVAL_MS=5*C.second;sessionEventsPollHandle=null;isSessionEventsPollInFlight=!1;constructor(){this.socketEventHandler_CS.init(this),this.eventSubscription=this.socket_CS.event$.subscribe(e=>{this.ngZone.run(()=>{this.socketEventHandler_CS.handleSocketEvent(e,{selectedCcapId:this.peiContext_DS.activeCcapId_$(),globalErrorShowError:(s,n)=>{this.globalError_CS.showError(s,n)}})})}),this.reconnectSubscription=this.socket_CS.connected$.subscribe(e=>{if(!e)return;let s=this.activeSessionId_$();s&&(this.socket_CS.emit("cc-session:subscribe",{sessionId:s}),this.loadAssembledMessages({sessionId:s}).catch(()=>{}),this.loadSessionDetail({sessionId:s}).catch(()=>{})),this.loadSessions().catch(()=>{}),this.backfillMissedEvents()})}ngOnDestroy(){this.stopSessionEventsPolling(),this.eventSubscription&&(this.eventSubscription.unsubscribe(),this.eventSubscription=null),this.reconnectSubscription&&(this.reconnectSubscription.unsubscribe(),this.reconnectSubscription=null)}showGlobalError(e,s){this.globalError_CS.showError(e,s)}getLastKnownEventSequence(){return this.lastKnownEventSequence}setLastKnownEventSequence(e){this.lastKnownEventSequence=e}evaluateSessionEventsPolling(){let e=this.activeSessionId_$(),s=this.resolveActiveSessionStatusForEventsPolling();!!(e&&this.lastKnownEventSequence>=0&&s!=null&&w.isLiveCcSessionStatus(s))?this.ensureSessionEventsPollingStarted():this.stopSessionEventsPolling()}loadSessions(e){return d(this,null,function*(){this.sessionsLoading_$.set(!0),this.sessionsLoadError_$.set(null);try{let n=[...(yield this.ccSession_AS.listSessions({status:e?.status,workspacePath:e?.workspacePath,includeArchived:e?.includeArchived})).sessions].sort((t,o)=>{let i=t.lastActivityAt?new Date(t.lastActivityAt).getTime():0;return(o.lastActivityAt?new Date(o.lastActivityAt).getTime():0)-i});this.sessions_$.set(n)}catch(s){this.sessionsLoadError_$.set(s)}finally{this.sessionsLoading_$.set(!1)}})}loadPersistedRateLimitState(e){return d(this,null,function*(){let s=e.ccapId?.trim()??"";if(s)try{let n=yield this.ccSession_AS.getRateLimitState({ccapId:s});this.mergePersistedRateLimitState(n.items)}catch(n){C.DyFM_Log.warn(`ClaudeCode_DS | loadPersistedRateLimitState failed (non-blocking) | ccapId: ${s} | ${n instanceof Error?n.message:String(n)}`)}})}mergePersistedRateLimitState(e){if(this.rateLimitInfo_$()!==null)return;let s=O.mapServerItemsToClientInfo(e);s!==null&&this.rateLimitInfo_$.set(s)}loadSessionDetail(e){return d(this,null,function*(){this.selectedSessionLoading_$.set(!0);try{let s=yield this.ccSession_AS.getSession({sessionId:e.sessionId});this.selectedSession_$.set(s)}catch(s){this.selectedSession_$.set(null);let n=s instanceof Error?s.message:"Failed to load session details";this.pushConsoleMessage({type:"error",text:`Load session failed: ${n}`})}finally{this.selectedSessionLoading_$.set(!1),this.evaluateSessionEventsPolling()}})}loadSessionEvents(e){return d(this,null,function*(){try{let s=yield this.ccSession_AS.getSessionEvents({sessionId:e.sessionId,eventType:e.eventType,limit:e.limit??500,latest:!0});this.selectedSessionEvents_$.set(s.events),this.updateLastKnownSequence(s.events);for(let n of s.events)this.socketEventHandler_CS.pushConsoleMessageFromEvent(n,!1,(t,o)=>{this.globalError_CS.showError(t,o)});this.loadAssembledMessages({sessionId:e.sessionId}).catch(()=>{})}catch{this.selectedSessionEvents_$.set([])}finally{this.evaluateSessionEventsPolling()}})}createSession(e){return d(this,null,function*(){try{let s=yield this.ccSession_AS.createSession(e),n=String(s.session.sessionId||"");return yield this.loadSessions(),n}catch(s){throw this.pushConsoleMessage({type:"error",text:`Create session failed: ${S.getErrorMessageForDisplay(s)}`}),s}})}sendPrompt(e){return d(this,null,function*(){let s=e.attachments?.filter(n=>n.isImage&&!!n.base64).map(n=>`data:${n.mimeType};base64,${n.base64}`);this.pushConsoleMessage({type:"prompt",text:e.content,imageDataUrls:s?.length?s:void 0});try{let n=yield this.ccSession_AS.sendPrompt(e);n.relayed&&(n.targetOnline?this.pushConsoleMessage({type:"info",text:`Prompt relayed to remote instance (task: ${n.taskId?.substring(0,8)}\u2026)`}):this.pushConsoleMessage({type:"error",text:`\u26A0 A t\xE1voli instance jelenleg offline \u2014 a prompt queue-ban v\xE1rakozik (task: ${n.taskId?.substring(0,8)}\u2026) \xE9s csak akkor k\xE9zbes\xEDt\u0151dik, ha a target instance online lesz. Ellen\u0151rizd, hogy mindk\xE9t instance fut, \xE9s a Settings \u2192 Cluster sharedSecret azonos.`})),this.evaluateSessionEventsPolling()}catch(n){throw this.pushConsoleMessage({type:"error",text:`Send failed: ${S.getErrorMessageForDisplay(n)}`}),this.globalError_CS.showError(n,"CC Session sendPrompt"),n}})}forkSession(e){return d(this,null,function*(){try{let s=yield this.ccSession_AS.forkSession({sessionId:e.sessionId,label:e.label}),n=String(s.session.sessionId||"");return yield this.loadSessions(),n}catch(s){throw this.pushConsoleMessage({type:"error",text:`Fork session failed: ${S.getErrorMessageForDisplay(s)}`}),s}})}resumeSession(e){return d(this,null,function*(){try{let s=yield this.ccSession_AS.resumeSession(e);s.relayed&&this.pushConsoleMessage({type:"info",text:s.targetOnline?"Resume relayed to remote instance":"Resume queued for offline remote instance"}),yield this.loadSessions()}catch(s){throw this.pushConsoleMessage({type:"error",text:`Resume failed: ${S.getErrorMessageForDisplay(s)}`}),s}})}stopExecution(e){return d(this,null,function*(){try{let s=yield this.ccSession_AS.stopExecution(e);if(s.relayed){this.pushSystemAssembledMessage({sessionId:e.sessionId,text:s.targetOnline?"Stop execution relayed to remote instance":"Stop execution queued for offline remote instance",role:"info"});return}let n=s.message||"Execution stopped";this.pushSystemAssembledMessage({sessionId:e.sessionId,text:n,role:"info"})}catch(s){throw this.pushSystemAssembledMessage({sessionId:e.sessionId,text:`Stop execution failed: ${S.getErrorMessageForDisplay(s)}`,role:"error"}),s}})}terminateSession(e){return d(this,null,function*(){try{let s=yield this.ccSession_AS.terminateSession(e);s.relayed?this.pushSystemAssembledMessage({sessionId:e.sessionId,text:s.targetOnline?"Terminate relayed to remote instance":"Terminate queued for offline remote instance",role:"info"}):this.pushSystemAssembledMessage({sessionId:e.sessionId,text:"Session terminated",role:"status"}),yield this.loadSessions()}catch(s){throw this.pushSystemAssembledMessage({sessionId:e.sessionId,text:`Terminate failed: ${S.getErrorMessageForDisplay(s)}`,role:"error"}),s}})}setSessionArchived(e){return d(this,null,function*(){try{yield this.ccSession_AS.setSessionArchived(e),yield this.loadSessions()}catch(s){throw this.pushConsoleMessage({type:"error",text:`Archive failed: ${S.getErrorMessageForDisplay(s)}`}),s}})}updateSessionConfig(e){return d(this,null,function*(){try{yield this.ccSession_AS.updateSessionConfig(e);let s=this.selectedSession_$();if(s?.session.sessionId===e.sessionId){let n=h({},s.session);e.label!=null&&(n.label=e.label),e.mode!=null&&(n.mode=e.mode),e.permissionPolicy!=null&&(n.permissionPolicy=e.permissionPolicy),e.reasoningEffort!=null&&(n.reasoningEffort=e.reasoningEffort),e.model!=null&&(n.model=e.model),e.isDebugMode!=null&&(n.isDebugMode=e.isDebugMode),this.selectedSession_$.set(f(h({},s),{session:n}))}if(e.label!=null){let n=this.sessions_$(),t=n.findIndex(o=>o.sessionId===e.sessionId);if(t>=0){let o=[...n];o[t]=f(h({},o[t]),{label:e.label}),this.sessions_$.set(o)}}}catch(s){throw this.pushConsoleMessage({type:"error",text:`Config update failed: ${S.getErrorMessageForDisplay(s)}`}),s}})}setActiveSessionId(e){let s=this.activeSessionId_$();s!==e&&this.stopSessionEventsPolling(),s&&s!==e&&this.socket_CS.emit("cc-session:unsubscribe",{sessionId:s}),this.activeSessionId_$.set(e),e&&this.socket_CS.emit("cc-session:subscribe",{sessionId:e})}clearLiveOutput(){this.stopSessionEventsPolling(),this.liveOutput_$.set([]),this.liveStderrLines_$.set(new Set),this.consoleMessages_$.set([]),this.assembledMessages_$.set([]),this.assembledMessagesHasMore_$.set(!1),this.isLoadingOlderMessages_$.set(!1),this.assembledMessagesLoaded_$.set(!1),this.selectedSession_$.set(null),this.selectedSessionEvents_$.set([]),this.lastStatusUpdate_$.set(null),this.sessionUsage_$.set({promptTokens:0,completionTokens:0,totalTokens:0,costUsd:0}),this.lastKnownEventSequence=-1,this.socketEventHandler_CS.resetTrackingState()}pushConsoleMessage(e){let s=e.type==="assistant"||e.type==="prompt"?e.text.trim():e.text,n={listKey:e.listKey??this.allocateConsoleListKey(),type:e.type,text:s,timestamp:e.timestamp??new Date().toISOString(),isStatus:e.isStatus??!1,expandableContent:e.expandableContent,rawData:e.rawData,subtype:e.subtype,parentAgentId:e.parentAgentId,imageDataUrls:e.imageDataUrls},t=this.consoleMessages_$();this.consoleMessages_$.set([...t,n])}loadAssembledMessages(e){return d(this,null,function*(){try{let s=yield this.extSessionMsg_AS.getMessages({sessionId:e.sessionId,latest:!0}),n=this.assembledMessages_$(),t=new Set(s.messages.map(i=>i.messageKey).filter(i=>typeof i=="string"&&i.length>0)),o=n.filter(i=>!t.has(i.messageKey));this.assembledMessages_$.set(I.sortAsc([...s.messages,...o])),this.assembledMessagesHasMore_$.set(s.hasMore)}catch(s){C.DyFM_Log.error(`CCAP_CcSession_DS | loadAssembledMessages failed | sessionId: ${e.sessionId}`,s)}finally{this.assembledMessagesLoaded_$.set(!0)}})}loadOlderAssembledMessages(e){return d(this,null,function*(){if(this.isLoadingOlderMessages_$()||!this.assembledMessagesHasMore_$())return;let s=this.assembledMessages_$();if(!s.length)return;let n=s.reduce((t,o)=>(o.sequence??0)<t?o.sequence??0:t,s[0].sequence??0);this.isLoadingOlderMessages_$.set(!0);try{let t=yield this.extSessionMsg_AS.getMessages({sessionId:e.sessionId,beforeSequence:n,limit:e.limit??50});t.messages.length&&this.assembledMessages_$.set(I.sortAsc([...t.messages,...s])),this.assembledMessagesHasMore_$.set(t.hasMore)}catch(t){C.DyFM_Log.error(`CCAP_CcSession_DS | loadOlderAssembledMessages failed | sessionId: ${e.sessionId}`,t)}finally{this.isLoadingOlderMessages_$.set(!1)}})}pushSystemAssembledMessage(e){let s=this.assembledMessages_$(),n=s.length?s.reduce((o,i)=>(i.sequence??0)>o?i.sequence??0:o,0):0,t={messageKey:`sys-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,sessionId:e.sessionId,sessionType:"cc",messageRole:e.role,bodyText:e.text,timestamp:new Date().toISOString(),sequence:n+1};this.assembledMessages_$.set(I.sortAsc([...s,t])),this.pushConsoleMessage({type:e.role==="error"?"error":e.role==="status"?"status":"info",text:e.text,isStatus:e.role==="status"})}allocateConsoleListKey(){return globalThis.crypto.randomUUID()}pullEventsSinceLastKnownSequence(e){return d(this,null,function*(){let s=this.activeSessionId_$();if(!(!s||this.lastKnownEventSequence<0))try{let t=(yield this.ccSession_AS.getSessionEvents({sessionId:s,sinceSequence:this.lastKnownEventSequence})).events;if(!t.length)return;this.ngZone.run(()=>{let o=this.selectedSessionEvents_$();this.selectedSessionEvents_$.set([...o,...t]);for(let i of t)this.socketEventHandler_CS.pushConsoleMessageFromEvent(i,!0,(r,a)=>{this.globalError_CS.showError(r,a)});this.updateLastKnownSequence(t)})}catch(n){let t=e==="poll"?"session events poll failed":"backfill failed";C.DyFM_Log.warn(`CCAP_CcSession_DS | ${t}`,n)}})}backfillMissedEvents(){return d(this,null,function*(){yield this.pullEventsSinceLastKnownSequence("backfill")})}updateLastKnownSequence(e){for(let s of e)s.sequence>this.lastKnownEventSequence&&(this.lastKnownEventSequence=s.sequence)}resolveActiveSessionStatusForEventsPolling(){let e=this.activeSessionId_$();if(!e)return null;let s=this.selectedSession_$();if(s?.session.sessionId===e)return s.session.status;let n=this.lastStatusUpdate_$();return n?.sessionId===e?n.status:this.sessions_$().find(o=>o.sessionId===e)?.status??null}ensureSessionEventsPollingStarted(){this.sessionEventsPollHandle===null&&(this.sessionEventsPollHandle=setInterval(()=>{this.onSessionEventsPollTick()},l.SESSION_EVENTS_POLL_INTERVAL_MS))}stopSessionEventsPolling(){this.sessionEventsPollHandle!==null&&(clearInterval(this.sessionEventsPollHandle),this.sessionEventsPollHandle=null),this.isSessionEventsPollInFlight=!1}onSessionEventsPollTick(){return d(this,null,function*(){if(!this.isSessionEventsPollInFlight){this.isSessionEventsPollInFlight=!0;try{yield this.pullEventsSinceLastKnownSequence("poll");let e=this.activeSessionId_$();e&&(yield this.loadAssembledMessages({sessionId:e}))}finally{this.isSessionEventsPollInFlight=!1}}})}static \u0275fac=function(s){return new(s||l)};static \u0275prov=M({token:l,factory:l.\u0275fac,providedIn:"root"})}return l})();export{ne as a};
3
- //# sourceMappingURL=chunk-LXLZTYDV.js.map
3
+ //# sourceMappingURL=chunk-D5X44E36.js.map