@nac3/forge-cli 1.0.51 → 1.0.53

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 (292) hide show
  1. package/README.md +466 -390
  2. package/dist/chat/panel.d.ts.map +1 -1
  3. package/dist/chat/panel.js +315 -94
  4. package/dist/chat/panel.js.map +1 -1
  5. package/dist/chat/server.d.ts.map +1 -1
  6. package/dist/chat/server.js +77 -5
  7. package/dist/chat/server.js.map +1 -1
  8. package/dist/commands/chat.d.ts +4 -4
  9. package/dist/commands/chat.js +1 -1
  10. package/dist/commands/chat.js.map +1 -1
  11. package/dist/commands/pilot.d.ts.map +1 -1
  12. package/dist/commands/pilot.js +3 -1
  13. package/dist/commands/pilot.js.map +1 -1
  14. package/dist/core/file_tree.d.ts +27 -0
  15. package/dist/core/file_tree.d.ts.map +1 -0
  16. package/dist/core/file_tree.js +87 -0
  17. package/dist/core/file_tree.js.map +1 -0
  18. package/dist/version.d.ts +1 -1
  19. package/dist/version.js +1 -1
  20. package/package.json +113 -111
  21. package/src/i18n/catalogs/ar.json +13 -3
  22. package/src/i18n/catalogs/de.json +13 -3
  23. package/src/i18n/catalogs/en.json +13 -3
  24. package/src/i18n/catalogs/es.json +13 -3
  25. package/src/i18n/catalogs/fr.json +13 -3
  26. package/src/i18n/catalogs/hi.json +13 -3
  27. package/src/i18n/catalogs/it.json +13 -3
  28. package/src/i18n/catalogs/ja.json +13 -3
  29. package/src/i18n/catalogs/pt.json +13 -3
  30. package/src/i18n/catalogs/zh.json +13 -3
  31. package/yujin-design-system/_preview.mjs +77 -0
  32. package/yujin-design-system/components/_index.json +156 -0
  33. package/yujin-design-system/components/accordion.yujin.json +24 -0
  34. package/yujin-design-system/components/alert.yujin.json +30 -0
  35. package/yujin-design-system/components/avatar.yujin.json +23 -0
  36. package/yujin-design-system/components/badge.yujin.json +30 -0
  37. package/yujin-design-system/components/breadcrumb.yujin.json +22 -0
  38. package/yujin-design-system/components/button.yujin.json +35 -0
  39. package/yujin-design-system/components/card.yujin.json +33 -0
  40. package/yujin-design-system/components/checkbox.yujin.json +25 -0
  41. package/yujin-design-system/components/datepicker.yujin.json +26 -0
  42. package/yujin-design-system/components/dropdown.yujin.json +26 -0
  43. package/yujin-design-system/components/file-upload.yujin.json +25 -0
  44. package/yujin-design-system/components/form-field.yujin.json +29 -0
  45. package/yujin-design-system/components/input.yujin.json +32 -0
  46. package/yujin-design-system/components/kanban-card.yujin.json +32 -0
  47. package/yujin-design-system/components/modal.yujin.json +28 -0
  48. package/yujin-design-system/components/pagination.yujin.json +24 -0
  49. package/yujin-design-system/components/progress.yujin.json +23 -0
  50. package/yujin-design-system/components/radio.yujin.json +24 -0
  51. package/yujin-design-system/components/search-bar.yujin.json +26 -0
  52. package/yujin-design-system/components/select.yujin.json +25 -0
  53. package/yujin-design-system/components/sidebar.yujin.json +28 -0
  54. package/yujin-design-system/components/skeleton.yujin.json +23 -0
  55. package/yujin-design-system/components/slider.yujin.json +22 -0
  56. package/yujin-design-system/components/switch.yujin.json +23 -0
  57. package/yujin-design-system/components/table.yujin.json +28 -0
  58. package/yujin-design-system/components/tabs.yujin.json +28 -0
  59. package/yujin-design-system/components/toast.yujin.json +28 -0
  60. package/yujin-design-system/components/tooltip.yujin.json +27 -0
  61. package/yujin-design-system/components/topbar.yujin.json +23 -0
  62. package/yujin-design-system/components/view.yujin.json +24 -0
  63. package/yujin-design-system/fonts/README.md +31 -0
  64. package/yujin-design-system/icons/sumie/abacus-soroban.svg +1 -0
  65. package/yujin-design-system/icons/sumie/antenna-signal.svg +1 -0
  66. package/yujin-design-system/icons/sumie/anvil-block.svg +1 -0
  67. package/yujin-design-system/icons/sumie/arrow-down-trend.svg +1 -0
  68. package/yujin-design-system/icons/sumie/arrow-up-trend.svg +1 -0
  69. package/yujin-design-system/icons/sumie/aurora-band.svg +1 -0
  70. package/yujin-design-system/icons/sumie/badge-id.svg +1 -0
  71. package/yujin-design-system/icons/sumie/badge-medal.svg +1 -0
  72. package/yujin-design-system/icons/sumie/bamboo-stalk.svg +1 -0
  73. package/yujin-design-system/icons/sumie/bandage-cross.svg +1 -0
  74. package/yujin-design-system/icons/sumie/barcode-strip.svg +1 -0
  75. package/yujin-design-system/icons/sumie/barrel-cask.svg +1 -0
  76. package/yujin-design-system/icons/sumie/bell-temple.svg +1 -0
  77. package/yujin-design-system/icons/sumie/bird-perched.svg +1 -0
  78. package/yujin-design-system/icons/sumie/boat-junk.svg +1 -0
  79. package/yujin-design-system/icons/sumie/boat-sail.svg +1 -0
  80. package/yujin-design-system/icons/sumie/book-bound.svg +1 -0
  81. package/yujin-design-system/icons/sumie/bow-arrow.svg +1 -0
  82. package/yujin-design-system/icons/sumie/box-crate.svg +1 -0
  83. package/yujin-design-system/icons/sumie/box-stacked.svg +1 -0
  84. package/yujin-design-system/icons/sumie/brain-cells.svg +1 -0
  85. package/yujin-design-system/icons/sumie/branch-sakura.svg +1 -0
  86. package/yujin-design-system/icons/sumie/bridge-arched.svg +1 -0
  87. package/yujin-design-system/icons/sumie/briefcase.svg +1 -0
  88. package/yujin-design-system/icons/sumie/brush-ink.svg +1 -0
  89. package/yujin-design-system/icons/sumie/brush-tip.svg +1 -0
  90. package/yujin-design-system/icons/sumie/butterfly-wing.svg +1 -0
  91. package/yujin-design-system/icons/sumie/calendar-grid.svg +1 -0
  92. package/yujin-design-system/icons/sumie/caliper-precision.svg +1 -0
  93. package/yujin-design-system/icons/sumie/cart-basket.svg +1 -0
  94. package/yujin-design-system/icons/sumie/castle-walls.svg +1 -0
  95. package/yujin-design-system/icons/sumie/cat-whisker.svg +1 -0
  96. package/yujin-design-system/icons/sumie/check-mark.svg +1 -0
  97. package/yujin-design-system/icons/sumie/check-shield.svg +1 -0
  98. package/yujin-design-system/icons/sumie/chopsticks.svg +1 -0
  99. package/yujin-design-system/icons/sumie/circuit-node.svg +1 -0
  100. package/yujin-design-system/icons/sumie/clipboard-list.svg +1 -0
  101. package/yujin-design-system/icons/sumie/cloud-curl.svg +1 -0
  102. package/yujin-design-system/icons/sumie/cloud-platform.svg +1 -0
  103. package/yujin-design-system/icons/sumie/coin-mon.svg +1 -0
  104. package/yujin-design-system/icons/sumie/coin-stack.svg +1 -0
  105. package/yujin-design-system/icons/sumie/comb-wooden.svg +1 -0
  106. package/yujin-design-system/icons/sumie/comet-trail.svg +1 -0
  107. package/yujin-design-system/icons/sumie/compass-marine.svg +1 -0
  108. package/yujin-design-system/icons/sumie/conveyor-belt.svg +1 -0
  109. package/yujin-design-system/icons/sumie/crane-flying.svg +1 -0
  110. package/yujin-design-system/icons/sumie/cross-mark.svg +1 -0
  111. package/yujin-design-system/icons/sumie/database-disk.svg +1 -0
  112. package/yujin-design-system/icons/sumie/deer-antler.svg +1 -0
  113. package/yujin-design-system/icons/sumie/document-page.svg +1 -0
  114. package/yujin-design-system/icons/sumie/dragon-curl.svg +1 -0
  115. package/yujin-design-system/icons/sumie/eclipse-ring.svg +1 -0
  116. package/yujin-design-system/icons/sumie/envelope-letter.svg +1 -0
  117. package/yujin-design-system/icons/sumie/eye-vision.svg +1 -0
  118. package/yujin-design-system/icons/sumie/fan-folded.svg +1 -0
  119. package/yujin-design-system/icons/sumie/fan-open.svg +1 -0
  120. package/yujin-design-system/icons/sumie/fern-frond.svg +1 -0
  121. package/yujin-design-system/icons/sumie/flag-banner.svg +1 -0
  122. package/yujin-design-system/icons/sumie/flame-forge.svg +1 -0
  123. package/yujin-design-system/icons/sumie/folder-tab.svg +1 -0
  124. package/yujin-design-system/icons/sumie/forklift.svg +1 -0
  125. package/yujin-design-system/icons/sumie/fox-tail.svg +1 -0
  126. package/yujin-design-system/icons/sumie/gear-cog.svg +1 -0
  127. package/yujin-design-system/icons/sumie/gear-double.svg +1 -0
  128. package/yujin-design-system/icons/sumie/gift-wrapped.svg +1 -0
  129. package/yujin-design-system/icons/sumie/globe-grid.svg +1 -0
  130. package/yujin-design-system/icons/sumie/gong-disk.svg +1 -0
  131. package/yujin-design-system/icons/sumie/hammer-craft.svg +1 -0
  132. package/yujin-design-system/icons/sumie/handshake-knot.svg +1 -0
  133. package/yujin-design-system/icons/sumie/heart-affinity.svg +1 -0
  134. package/yujin-design-system/icons/sumie/helmet-care.svg +1 -0
  135. package/yujin-design-system/icons/sumie/horse-gallop.svg +1 -0
  136. package/yujin-design-system/icons/sumie/house-traditional.svg +1 -0
  137. package/yujin-design-system/icons/sumie/incense-stick.svg +1 -0
  138. package/yujin-design-system/icons/sumie/inkstone-suzuri.svg +1 -0
  139. package/yujin-design-system/icons/sumie/invoice-doc.svg +1 -0
  140. package/yujin-design-system/icons/sumie/iris-bloom.svg +1 -0
  141. package/yujin-design-system/icons/sumie/key-skeleton.svg +1 -0
  142. package/yujin-design-system/icons/sumie/kimono-robe.svg +1 -0
  143. package/yujin-design-system/icons/sumie/koi-leaping.svg +1 -0
  144. package/yujin-design-system/icons/sumie/koi-pond.svg +1 -0
  145. package/yujin-design-system/icons/sumie/lantern-stone.svg +1 -0
  146. package/yujin-design-system/icons/sumie/ledger-tally.svg +1 -0
  147. package/yujin-design-system/icons/sumie/lifebuoy-ring.svg +1 -0
  148. package/yujin-design-system/icons/sumie/lock-shut.svg +1 -0
  149. package/yujin-design-system/icons/sumie/lotus-flower.svg +1 -0
  150. package/yujin-design-system/icons/sumie/magnify-glass.svg +1 -0
  151. package/yujin-design-system/icons/sumie/manifest.json +1263 -0
  152. package/yujin-design-system/icons/sumie/maple-leaf.svg +1 -0
  153. package/yujin-design-system/icons/sumie/mask-noh.svg +1 -0
  154. package/yujin-design-system/icons/sumie/megaphone-flare.svg +1 -0
  155. package/yujin-design-system/icons/sumie/mic-voice.svg +1 -0
  156. package/yujin-design-system/icons/sumie/mirror-bronze.svg +1 -0
  157. package/yujin-design-system/icons/sumie/mobile-phone.svg +1 -0
  158. package/yujin-design-system/icons/sumie/moon-full.svg +1 -0
  159. package/yujin-design-system/icons/sumie/moon-half.svg +1 -0
  160. package/yujin-design-system/icons/sumie/mountain-mist.svg +1 -0
  161. package/yujin-design-system/icons/sumie/mountain-twin.svg +1 -0
  162. package/yujin-design-system/icons/sumie/owl-eye.svg +1 -0
  163. package/yujin-design-system/icons/sumie/pagoda-tiers.svg +1 -0
  164. package/yujin-design-system/icons/sumie/pallet-stack.svg +1 -0
  165. package/yujin-design-system/icons/sumie/paper-lantern.svg +1 -0
  166. package/yujin-design-system/icons/sumie/paper-plane.svg +1 -0
  167. package/yujin-design-system/icons/sumie/pay-card.svg +1 -0
  168. package/yujin-design-system/icons/sumie/pdf-stack.svg +1 -0
  169. package/yujin-design-system/icons/sumie/pencil-write.svg +1 -0
  170. package/yujin-design-system/icons/sumie/people-pair.svg +1 -0
  171. package/yujin-design-system/icons/sumie/people-trio.svg +1 -0
  172. package/yujin-design-system/icons/sumie/person-bow.svg +1 -0
  173. package/yujin-design-system/icons/sumie/phoenix-tail.svg +1 -0
  174. package/yujin-design-system/icons/sumie/piggy-bank.svg +1 -0
  175. package/yujin-design-system/icons/sumie/pin-location.svg +1 -0
  176. package/yujin-design-system/icons/sumie/pine-tree.svg +1 -0
  177. package/yujin-design-system/icons/sumie/pipeline-funnel.svg +1 -0
  178. package/yujin-design-system/icons/sumie/plane-flight.svg +1 -0
  179. package/yujin-design-system/icons/sumie/plug-power.svg +1 -0
  180. package/yujin-design-system/icons/sumie/plum-blossom.svg +1 -0
  181. package/yujin-design-system/icons/sumie/qr-grid.svg +1 -0
  182. package/yujin-design-system/icons/sumie/rabbit-hop.svg +1 -0
  183. package/yujin-design-system/icons/sumie/rain-falling.svg +1 -0
  184. package/yujin-design-system/icons/sumie/receipt-strip.svg +1 -0
  185. package/yujin-design-system/icons/sumie/reed-grass.svg +1 -0
  186. package/yujin-design-system/icons/sumie/rice-bowl.svg +1 -0
  187. package/yujin-design-system/icons/sumie/river-bend.svg +1 -0
  188. package/yujin-design-system/icons/sumie/rock-stack.svg +1 -0
  189. package/yujin-design-system/icons/sumie/rope-shimenawa.svg +1 -0
  190. package/yujin-design-system/icons/sumie/safe-vault.svg +1 -0
  191. package/yujin-design-system/icons/sumie/sake-bottle.svg +1 -0
  192. package/yujin-design-system/icons/sumie/sandal-geta.svg +1 -0
  193. package/yujin-design-system/icons/sumie/scales-balance.svg +1 -0
  194. package/yujin-design-system/icons/sumie/scroll-rolled.svg +1 -0
  195. package/yujin-design-system/icons/sumie/seal-stamp.svg +1 -0
  196. package/yujin-design-system/icons/sumie/server-rack.svg +1 -0
  197. package/yujin-design-system/icons/sumie/shield-knight.svg +1 -0
  198. package/yujin-design-system/icons/sumie/shrine-roof.svg +1 -0
  199. package/yujin-design-system/icons/sumie/signature-loop.svg +1 -0
  200. package/yujin-design-system/icons/sumie/snow-flake.svg +1 -0
  201. package/yujin-design-system/icons/sumie/spark-ai.svg +1 -0
  202. package/yujin-design-system/icons/sumie/spark-burst.svg +1 -0
  203. package/yujin-design-system/icons/sumie/speech-cloud.svg +1 -0
  204. package/yujin-design-system/icons/sumie/spider-silk.svg +1 -0
  205. package/yujin-design-system/icons/sumie/star-cluster.svg +1 -0
  206. package/yujin-design-system/icons/sumie/star-five.svg +1 -0
  207. package/yujin-design-system/icons/sumie/star-rating.svg +1 -0
  208. package/yujin-design-system/icons/sumie/sun-rising.svg +1 -0
  209. package/yujin-design-system/icons/sumie/sword-katana.svg +1 -0
  210. package/yujin-design-system/icons/sumie/tablet-flat.svg +1 -0
  211. package/yujin-design-system/icons/sumie/tag-price.svg +1 -0
  212. package/yujin-design-system/icons/sumie/target-bullseye.svg +1 -0
  213. package/yujin-design-system/icons/sumie/tax-stamp.svg +1 -0
  214. package/yujin-design-system/icons/sumie/tea-cup.svg +1 -0
  215. package/yujin-design-system/icons/sumie/tea-house.svg +1 -0
  216. package/yujin-design-system/icons/sumie/tea-pot.svg +1 -0
  217. package/yujin-design-system/icons/sumie/temple-gate.svg +1 -0
  218. package/yujin-design-system/icons/sumie/thermo-bulb.svg +1 -0
  219. package/yujin-design-system/icons/sumie/thread-spool.svg +1 -0
  220. package/yujin-design-system/icons/sumie/tiger-claw.svg +1 -0
  221. package/yujin-design-system/icons/sumie/time-clock.svg +1 -0
  222. package/yujin-design-system/icons/sumie/torii-double.svg +1 -0
  223. package/yujin-design-system/icons/sumie/train-rail.svg +1 -0
  224. package/yujin-design-system/icons/sumie/truck-cargo.svg +1 -0
  225. package/yujin-design-system/icons/sumie/turtle-shell.svg +1 -0
  226. package/yujin-design-system/icons/sumie/umbrella-folded.svg +1 -0
  227. package/yujin-design-system/icons/sumie/umbrella-wagasa.svg +1 -0
  228. package/yujin-design-system/icons/sumie/wallet-pouch.svg +1 -0
  229. package/yujin-design-system/icons/sumie/warehouse-roof.svg +1 -0
  230. package/yujin-design-system/icons/sumie/wave-curl.svg +1 -0
  231. package/yujin-design-system/icons/sumie/wave-great.svg +1 -0
  232. package/yujin-design-system/icons/sumie/willow-leaf.svg +1 -0
  233. package/yujin-design-system/icons/sumie/wind-gust.svg +1 -0
  234. package/yujin-design-system/icons/sumie/wrench-spanner.svg +1 -0
  235. package/yujin-design-system/manifest.json +69 -0
  236. package/yujin-design-system/preview.html +32 -0
  237. package/yujin-design-system/tokens/yujin-tokens.css +2386 -0
  238. package/yujin-design-system/tokens/yujin-tokens.json +1170 -0
  239. package/yujin-design-system-artdeco/icons/_generate.mjs +142 -0
  240. package/yujin-design-system-artdeco/icons/artdeco/add.svg +1 -0
  241. package/yujin-design-system-artdeco/icons/artdeco/arrow-right.svg +1 -0
  242. package/yujin-design-system-artdeco/icons/artdeco/bell.svg +1 -0
  243. package/yujin-design-system-artdeco/icons/artdeco/briefcase.svg +1 -0
  244. package/yujin-design-system-artdeco/icons/artdeco/building.svg +1 -0
  245. package/yujin-design-system-artdeco/icons/artdeco/calendar.svg +1 -0
  246. package/yujin-design-system-artdeco/icons/artdeco/chart-bar.svg +1 -0
  247. package/yujin-design-system-artdeco/icons/artdeco/chart-line.svg +1 -0
  248. package/yujin-design-system-artdeco/icons/artdeco/chat.svg +1 -0
  249. package/yujin-design-system-artdeco/icons/artdeco/check.svg +1 -0
  250. package/yujin-design-system-artdeco/icons/artdeco/chevron-right.svg +1 -0
  251. package/yujin-design-system-artdeco/icons/artdeco/clipboard.svg +1 -0
  252. package/yujin-design-system-artdeco/icons/artdeco/clock.svg +1 -0
  253. package/yujin-design-system-artdeco/icons/artdeco/close.svg +1 -0
  254. package/yujin-design-system-artdeco/icons/artdeco/coin.svg +1 -0
  255. package/yujin-design-system-artdeco/icons/artdeco/dashboard.svg +1 -0
  256. package/yujin-design-system-artdeco/icons/artdeco/database.svg +1 -0
  257. package/yujin-design-system-artdeco/icons/artdeco/delete.svg +1 -0
  258. package/yujin-design-system-artdeco/icons/artdeco/document.svg +1 -0
  259. package/yujin-design-system-artdeco/icons/artdeco/download.svg +1 -0
  260. package/yujin-design-system-artdeco/icons/artdeco/edit.svg +1 -0
  261. package/yujin-design-system-artdeco/icons/artdeco/expand.svg +1 -0
  262. package/yujin-design-system-artdeco/icons/artdeco/filter.svg +1 -0
  263. package/yujin-design-system-artdeco/icons/artdeco/folder.svg +1 -0
  264. package/yujin-design-system-artdeco/icons/artdeco/globe.svg +1 -0
  265. package/yujin-design-system-artdeco/icons/artdeco/handshake.svg +1 -0
  266. package/yujin-design-system-artdeco/icons/artdeco/heart.svg +1 -0
  267. package/yujin-design-system-artdeco/icons/artdeco/home.svg +1 -0
  268. package/yujin-design-system-artdeco/icons/artdeco/info.svg +1 -0
  269. package/yujin-design-system-artdeco/icons/artdeco/invoice.svg +1 -0
  270. package/yujin-design-system-artdeco/icons/artdeco/list.svg +1 -0
  271. package/yujin-design-system-artdeco/icons/artdeco/lock.svg +1 -0
  272. package/yujin-design-system-artdeco/icons/artdeco/mail.svg +1 -0
  273. package/yujin-design-system-artdeco/icons/artdeco/manifest.json +365 -0
  274. package/yujin-design-system-artdeco/icons/artdeco/menu.svg +1 -0
  275. package/yujin-design-system-artdeco/icons/artdeco/phone.svg +1 -0
  276. package/yujin-design-system-artdeco/icons/artdeco/search.svg +1 -0
  277. package/yujin-design-system-artdeco/icons/artdeco/send.svg +1 -0
  278. package/yujin-design-system-artdeco/icons/artdeco/settings.svg +1 -0
  279. package/yujin-design-system-artdeco/icons/artdeco/share.svg +1 -0
  280. package/yujin-design-system-artdeco/icons/artdeco/shield.svg +1 -0
  281. package/yujin-design-system-artdeco/icons/artdeco/star.svg +1 -0
  282. package/yujin-design-system-artdeco/icons/artdeco/sun.svg +1 -0
  283. package/yujin-design-system-artdeco/icons/artdeco/table.svg +1 -0
  284. package/yujin-design-system-artdeco/icons/artdeco/tag.svg +1 -0
  285. package/yujin-design-system-artdeco/icons/artdeco/target.svg +1 -0
  286. package/yujin-design-system-artdeco/icons/artdeco/user.svg +1 -0
  287. package/yujin-design-system-artdeco/icons/artdeco/users.svg +1 -0
  288. package/yujin-design-system-artdeco/icons/artdeco/warning.svg +1 -0
  289. package/yujin-design-system-artdeco/manifest.json +44 -0
  290. package/yujin-design-system-artdeco/preview.html +25 -0
  291. package/yujin-design-system-artdeco/tokens/artdeco-tokens.css +145 -0
  292. package/yujin-design-system-artdeco/tokens/artdeco-tokens.json +40 -0
@@ -1 +1 @@
1
- {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/chat/panel.ts"],"names":[],"mappings":"AAmBA,OAAO,EAEL,KAAK,iBAAiB,EAEvB,MAAM,kBAAkB,CAAC;AAG1B,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb;;;;;2BAKuB;IACvB,IAAI,CAAC,EAAE,iBAAiB,CAAC;CAC1B;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CA6yWxD"}
1
+ {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/chat/panel.ts"],"names":[],"mappings":"AAmBA,OAAO,EAEL,KAAK,iBAAiB,EAEvB,MAAM,kBAAkB,CAAC;AAG1B,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb;;;;;2BAKuB;IACvB,IAAI,CAAC,EAAE,iBAAiB,CAAC;CAC1B;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CA0gXxD"}
@@ -46,6 +46,16 @@ export function renderPanelHtml(cfg) {
46
46
  projectTitle: tForLang(lang, 'panel.project.title'),
47
47
  projectAdd: tForLang(lang, 'panel.project.add'),
48
48
  projectAddPrompt: tForLang(lang, 'panel.project.addPrompt'),
49
+ projectRemove: tForLang(lang, 'panel.project.remove'),
50
+ projectRemoveConfirm: tForLang(lang, 'panel.project.removeConfirm'),
51
+ projectRemoved: tForLang(lang, 'panel.project.removed'),
52
+ filesRefresh: tForLang(lang, 'panel.files.refresh'),
53
+ filesLoading: tForLang(lang, 'panel.files.loading'),
54
+ filesError: tForLang(lang, 'panel.files.error'),
55
+ filesEmpty: tForLang(lang, 'panel.files.empty'),
56
+ filesTruncated: tForLang(lang, 'panel.files.truncated'),
57
+ filesOpened: tForLang(lang, 'panel.files.opened'),
58
+ filesOpenFailed: tForLang(lang, 'panel.files.openFailed'),
49
59
  projectSwitching: tForLang(lang, 'panel.project.switching'),
50
60
  micButton: tForLang(lang, 'panel.button.mic'),
51
61
  micButtonRec: tForLang(lang, 'panel.button.mic.recording'),
@@ -474,6 +484,26 @@ body {
474
484
  font-family: ui-monospace, monospace;
475
485
  line-height: 1.45;
476
486
  }
487
+ /* File explorer tab (kind 'files'). */
488
+ .pz-files-wrap { display: flex; flex-direction: column; height: 100%; overflow: hidden; }
489
+ .pz-files-bar { display: flex; align-items: center; gap: 10px; padding: 6px 10px;
490
+ border-bottom: 1px solid var(--border-subtle, #e3ddcf); flex: 0 0 auto; }
491
+ .pz-files-bar .pz-files-refresh { font: inherit; font-size: 11px; cursor: pointer;
492
+ border: 1px solid var(--border-subtle, #d9d2c4); background: #fff; color: #3a3a3a;
493
+ border-radius: 6px; padding: 3px 10px; }
494
+ .pz-files-bar .pz-files-refresh:hover { background: var(--bg2, #f1efe7); }
495
+ .pz-files-bar .pz-files-status { font-size: 11px; color: var(--ink-muted, #8a8275); }
496
+ .pz-files-tree { flex: 1; overflow: auto; padding: 8px 10px; font-size: 12.5px; line-height: 1.5; }
497
+ .pz-files-tree ul.pz-files-ul { list-style: none; margin: 0; padding: 0 0 0 16px; }
498
+ .pz-files-tree ul.pz-files-root { padding-left: 0; }
499
+ .pz-files-tree .pz-file-li { margin: 0; }
500
+ .pz-files-tree .pz-file-row { display: flex; align-items: center; gap: 6px;
501
+ padding: 2px 6px; border-radius: 5px; cursor: pointer; white-space: nowrap; }
502
+ .pz-files-tree .pz-file-row:hover { background: var(--bg2, #f1efe7); }
503
+ .pz-files-tree .pz-file-caret { width: 12px; flex: 0 0 auto; color: var(--ink-muted, #8a8275); font-size: 10px; }
504
+ .pz-files-tree .pz-file-ic { flex: 0 0 auto; }
505
+ .pz-files-tree .pz-file-name { overflow: hidden; text-overflow: ellipsis; }
506
+ .pz-files-tree .pz-file-dir > .pz-file-name { font-weight: 600; }
477
507
  /* PIZ-3 (PND-073) -- grafo de nodos dinamico, estetica sumi-e. */
478
508
  #yf-full .pz-graph-wrap {
479
509
  display: flex; gap: 0; height: 100%; min-height: 360px; padding: 0;
@@ -516,6 +546,13 @@ body {
516
546
  background-repeat: no-repeat; background-position: 0 100%; background-size: 100% 1.5px;
517
547
  padding-bottom: 6px; margin-bottom: 8px; word-break: break-word;
518
548
  }
549
+ #yf-full .pz-graph-detail-path { margin: 4px 0 8px; }
550
+ #yf-full .pz-graph-detail-path a {
551
+ font-family: ui-monospace, monospace; font-size: 11px; color: var(--indigo, #4f5b87);
552
+ cursor: pointer; text-decoration: none; border-bottom: 1px dotted var(--indigo, #4f5b87);
553
+ word-break: break-all;
554
+ }
555
+ #yf-full .pz-graph-detail-path a:hover { color: var(--shu, #b7410e); border-bottom-color: var(--shu, #b7410e); }
519
556
  #yf-full .pz-graph-detail-kind {
520
557
  display: inline-block; font-size: 10px; text-transform: uppercase; letter-spacing: 0.5px;
521
558
  color: var(--indigo, #4f5b87); border: 1px solid var(--indigo, #4f5b87);
@@ -885,13 +922,19 @@ body {
885
922
  box-shadow: 0 6px 24px rgba(0,0,0,0.18); padding: 4px; }
886
923
  .proj-menu .proj-menu-title { font-size: 10px; text-transform: uppercase; letter-spacing: .06em;
887
924
  color: var(--ink-muted); padding: 6px 8px 2px; }
888
- .proj-menu .proj-row { display: flex; flex-direction: column; gap: 1px;
925
+ .proj-menu .proj-row { display: flex; flex-direction: row; align-items: center; gap: 6px;
889
926
  padding: 6px 8px; border-radius: 6px; cursor: pointer; }
927
+ .proj-menu .proj-row .proj-row-main { display: flex; flex-direction: column; gap: 1px; min-width: 0; flex: 1; }
890
928
  .proj-menu .proj-row:hover { background: var(--bg2, #f1efe7); }
891
929
  .proj-menu .proj-row.on { background: rgba(80,90,160,0.08); }
892
930
  .proj-menu .proj-row .proj-row-name { font-size: 13px; font-weight: 600; }
893
931
  .proj-menu .proj-row .proj-row-path { font-size: 10px; color: var(--ink-muted);
894
932
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
933
+ .proj-menu .proj-row .proj-row-x { flex: 0 0 auto; width: 22px; height: 22px; line-height: 1;
934
+ border: none; background: transparent; color: var(--ink-muted); font-size: 17px; cursor: pointer;
935
+ border-radius: 5px; opacity: 0; transition: opacity .12s, background .12s, color .12s; }
936
+ .proj-menu .proj-row:hover .proj-row-x, .proj-menu .proj-row:focus-within .proj-row-x { opacity: 1; }
937
+ .proj-menu .proj-row .proj-row-x:hover { background: rgba(183,65,14,0.12); color: #b7410e; }
895
938
  .proj-menu .proj-add { color: var(--indigo); font-weight: 600; border-top: 1px solid var(--border-subtle); margin-top: 2px; }
896
939
  .header .actions { display: flex; gap: 4px; }
897
940
  .header .actions button {
@@ -2893,9 +2936,13 @@ async function openProjectMenu(anchor) {
2893
2936
  return String(b.last_active_at || '').localeCompare(String(a.last_active_at || ''));
2894
2937
  }).map(function (p) {
2895
2938
  const active = p.slug === reg.active_slug;
2939
+ const rmLabel = escapeHtml((CONFIG.i18n && CONFIG.i18n.projectRemove) || 'Quitar de la lista');
2896
2940
  return '<div class="proj-row' + (active ? ' on' : '') + '" data-proj-slug="' + escapeHtml(p.slug) + '" role="button" tabindex="0">'
2941
+ + '<span class="proj-row-main">'
2897
2942
  + '<span class="proj-row-name">' + (active ? '&#9679; ' : '') + escapeHtml(p.slug) + '</span>'
2898
2943
  + '<span class="proj-row-path">' + escapeHtml(String(p.path || '')) + '</span>'
2944
+ + '</span>'
2945
+ + '<button type="button" class="proj-row-x" data-proj-remove="' + escapeHtml(p.slug) + '" title="' + rmLabel + '" aria-label="' + rmLabel + '">&times;</button>'
2899
2946
  + '</div>';
2900
2947
  }).join('');
2901
2948
  menu.innerHTML = '<div class="proj-menu-title">' + escapeHtml(CONFIG.i18n.projectTitle) + '</div>'
@@ -2911,6 +2958,14 @@ async function openProjectMenu(anchor) {
2911
2958
  menu.querySelectorAll('[data-proj-slug]').forEach(function (row) {
2912
2959
  row.addEventListener('click', function () { switchProject(row.getAttribute('data-proj-slug')); });
2913
2960
  });
2961
+ /* The "X" removes the project from the list (never from disk). stopPropagation
2962
+ * so the click does NOT also trigger the row's switch handler. */
2963
+ menu.querySelectorAll('[data-proj-remove]').forEach(function (x) {
2964
+ x.addEventListener('click', function (e) {
2965
+ e.stopPropagation();
2966
+ removeProjectViaClick(x.getAttribute('data-proj-remove'), x.closest('.proj-row'));
2967
+ });
2968
+ });
2914
2969
  const addRow = menu.querySelector('[data-proj-add]');
2915
2970
  if (addRow) addRow.addEventListener('click', addProjectViaPrompt);
2916
2971
  setTimeout(function () { document.addEventListener('click', onProjMenuOutside, true); }, 0);
@@ -2938,6 +2993,30 @@ async function switchProject(slug) {
2938
2993
  setStatus('No se pudo cambiar de proyecto.', true);
2939
2994
  }
2940
2995
  }
2996
+ /* Remove a project from the list (the "X"). Confirms first; on success drops
2997
+ * the row from the open menu. Server-side this only edits projects.json --
2998
+ * the repo on disk is never touched. */
2999
+ async function removeProjectViaClick(slug, rowEl) {
3000
+ if (!slug) return;
3001
+ const msg = ((CONFIG.i18n && CONFIG.i18n.projectRemoveConfirm) || 'Quitar este proyecto de la lista? (no borra los archivos del disco)') + '\\n\\n' + slug;
3002
+ if (!window.confirm(msg)) return;
3003
+ try {
3004
+ const r = await fetch('/api/forge/projects/remove', {
3005
+ method: 'POST', headers: { 'content-type': 'application/json' },
3006
+ body: JSON.stringify({ slug: slug }),
3007
+ });
3008
+ const j = await r.json();
3009
+ if (j && j.ok) {
3010
+ if (rowEl && rowEl.parentNode) rowEl.parentNode.removeChild(rowEl);
3011
+ setStatus(((CONFIG.i18n && CONFIG.i18n.projectRemoved) || 'Proyecto quitado de la lista') + ': ' + slug);
3012
+ setTimeout(function () { setStatus(''); }, 2500);
3013
+ } else {
3014
+ setStatus((j && j.error) || 'No se pudo quitar el proyecto.', true);
3015
+ }
3016
+ } catch (e) {
3017
+ setStatus('No se pudo quitar el proyecto.', true);
3018
+ }
3019
+ }
2941
3020
  async function addProjectViaPrompt() {
2942
3021
  closeProjectMenu();
2943
3022
  const path = prompt(CONFIG.i18n.projectAddPrompt, '');
@@ -5209,6 +5288,18 @@ function renderPizarronCardBody(it) {
5209
5288
  if (it.kind === 'tree') {
5210
5289
  return bodyOpen + '<pre class="pz-tree">' + escapeHtml(it.content) + '</pre></div>';
5211
5290
  }
5291
+ if (it.kind === 'files') {
5292
+ /* File explorer of the local repo. The tree is fetched live by
5293
+ * initFilesTab from /api/forge/files-tree; clicking a file opens it
5294
+ * with the OS-associated app via /api/forge/open-native. */
5295
+ return '<div class="pz-body pz-files-wrap" data-nac-id="yujin.pizarron.item.' + it.id + '.body" data-nac-role="region">'
5296
+ + '<div class="pz-files-bar">'
5297
+ + '<button type="button" class="pz-files-refresh" data-pz-files-refresh>' + escapeHtml((CONFIG.i18n && CONFIG.i18n.filesRefresh) || 'Actualizar') + '</button>'
5298
+ + '<span class="pz-files-status" data-pz-files-status></span>'
5299
+ + '</div>'
5300
+ + '<div class="pz-files-tree" data-pz-files-tree>' + escapeHtml((CONFIG.i18n && CONFIG.i18n.filesLoading) || 'Cargando...') + '</div>'
5301
+ + '</div>';
5302
+ }
5212
5303
  if (it.kind === 'bpmn' || it.kind === 'flow') {
5213
5304
  const trimmed = it.content.trim();
5214
5305
  /* SVG crudo -> passthrough (compat). */
@@ -5318,6 +5409,9 @@ function renderPizarron() {
5318
5409
  if (it.kind === 'workflow') {
5319
5410
  try { initWorkflowTab(it); } catch (e) { /* render best-effort */ }
5320
5411
  }
5412
+ if (it.kind === 'files') {
5413
+ try { initFilesTab(it); } catch (e) { /* render best-effort */ }
5414
+ }
5321
5415
  }
5322
5416
 
5323
5417
  /* Selector multi-workflow: persiste el indice elegido por tab id (igual
@@ -6170,12 +6264,11 @@ function unmarkStartupTabClosed(key) {
6170
6264
  * titulo real lo recordamos del ultimo fetch; el fallback cubre las que
6171
6265
  * nunca se vieron. */
6172
6266
  var yfStartupTitles = {};
6173
- var NATIVE_TAB_KEYS = ['startup_graph', 'startup_graph_func', 'startup_graph_sem', 'startup_pendings', 'startup_workflow', 'startup_tasks', 'coding_canvas'];
6267
+ var NATIVE_TAB_KEYS = ['startup_graph', 'startup_graph_sem', 'startup_pendings', 'startup_workflow', 'startup_tasks', 'startup_files', 'coding_canvas'];
6174
6268
  var NATIVE_TAB_FALLBACK = {
6175
- startup_graph: 'Grafo', startup_graph_func: 'Grafo funcional',
6176
- startup_graph_sem: 'Grafo semantico',
6269
+ startup_graph: 'Grafo', startup_graph_sem: 'Grafo semantico',
6177
6270
  startup_pendings: 'Pendientes', startup_workflow: 'Workflow',
6178
- startup_tasks: 'Tareas', coding_canvas: 'Coding',
6271
+ startup_tasks: 'Tareas', startup_files: 'Archivos', coding_canvas: 'Coding',
6179
6272
  };
6180
6273
  function nativeTabLabel(key) { return yfStartupTitles[key] || NATIVE_TAB_FALLBACK[key] || key; }
6181
6274
 
@@ -6307,11 +6400,6 @@ const PZ_GROUP_COLORS = {
6307
6400
  * entre re-renders para que un refresh con datos nuevos NO reinicie la
6308
6401
  * seleccion del usuario. */
6309
6402
  const _graphFilterByTab = {};
6310
- /* Vista funcional (startup_graph_func): funcionalidad de front-end
6311
- * seleccionada por tab (id de tab -> id de nodo ancla, o null=todas).
6312
- * Se conserva entre re-renders por la misma razon que el filtro de
6313
- * grupos: un refresh con datos nuevos NO debe perder la seleccion. */
6314
- const _graphFuncByTab = {};
6315
6403
  function graphNodeGroup(n) {
6316
6404
  const id = String((n && n.id) || '');
6317
6405
  const s = (id + ' ' + String((n && (n.label || n.name)) || '')).toLowerCase();
@@ -6328,6 +6416,165 @@ function graphNodeGroup(n) {
6328
6416
  return 'backend';
6329
6417
  }
6330
6418
 
6419
+ /* Best-effort project-relative path of a graph node, recovered from its
6420
+ * detail/purpose: derive.ts writes loose files as "Archivo X (src/foo.py)."
6421
+ * and directory modules as "... (src/foo).". We pick the last parenthetical
6422
+ * that looks like a path (has a separator or a file extension). Returns ''
6423
+ * when none -- libraries/protocols have no file. Used to make the node's
6424
+ * path clickable so it opens with the OS-associated app. */
6425
+ function graphNodePath(n) {
6426
+ if (n && n.path) return String(n.path);
6427
+ const d = String((n && n.detail) || '');
6428
+ /* No literal backslashes here: the panel lives inside a template literal,
6429
+ * which eats them. We extract parentheticals with indexOf and detect a
6430
+ * backslash via char code 92. */
6431
+ const BSLASH = String.fromCharCode(92);
6432
+ const candidates = [];
6433
+ let i = 0;
6434
+ while (i < d.length) {
6435
+ const open = d.indexOf('(', i);
6436
+ if (open < 0) break;
6437
+ const close = d.indexOf(')', open + 1);
6438
+ if (close < 0) break;
6439
+ candidates.push(d.slice(open + 1, close).trim());
6440
+ i = close + 1;
6441
+ }
6442
+ for (let k = candidates.length - 1; k >= 0; k--) {
6443
+ let inner = candidates[k];
6444
+ if (!inner || inner.length > 240) continue;
6445
+ while (inner.length && '.,;'.indexOf(inner[inner.length - 1]) >= 0) inner = inner.slice(0, -1);
6446
+ const hasSep = inner.indexOf('/') >= 0 || inner.indexOf(BSLASH) >= 0;
6447
+ let hasExt = false;
6448
+ const dot = inner.lastIndexOf('.');
6449
+ if (dot > 0 && dot < inner.length - 1) {
6450
+ const ext = inner.slice(dot + 1);
6451
+ hasExt = ext.length <= 8 && /^[a-z0-9]+$/i.test(ext);
6452
+ }
6453
+ if (!hasSep && !hasExt) continue;
6454
+ /* skip prose: spaces are only OK when it clearly has a path separator */
6455
+ if (inner.indexOf(' ') >= 0 && !hasSep) continue;
6456
+ return inner;
6457
+ }
6458
+ return '';
6459
+ }
6460
+
6461
+ /* ====================================================================
6462
+ * File explorer tab (startup_files / kind 'files', Pablo 2026-06-29).
6463
+ * Fetches the repo tree from /api/forge/files-tree, renders a collapsible
6464
+ * tree, and on a file click opens it with the OS-associated app via
6465
+ * /api/forge/open-native. Expand state is preserved per tab across the
6466
+ * 12s startup-tabs refresh.
6467
+ * ================================================================== */
6468
+ const _filesExpandByTab = {};
6469
+
6470
+ function fmtFileSize(n) {
6471
+ if (typeof n !== 'number' || !isFinite(n)) return '';
6472
+ if (n < 1024) return n + ' B';
6473
+ if (n < 1024 * 1024) return (n / 1024).toFixed(1) + ' KB';
6474
+ return (n / (1024 * 1024)).toFixed(1) + ' MB';
6475
+ }
6476
+
6477
+ function initFilesTab(it) {
6478
+ const wrap = document.querySelector('[data-pz-files-tree]');
6479
+ if (!wrap) return;
6480
+ const statusEl = document.querySelector('[data-pz-files-status]');
6481
+ const refreshBtn = document.querySelector('[data-pz-files-refresh]');
6482
+ const expanded = _filesExpandByTab[it.id] || (_filesExpandByTab[it.id] = new Set());
6483
+
6484
+ function setFilesStatus(msg) { if (statusEl) statusEl.textContent = msg || ''; }
6485
+
6486
+ function renderNode(node) {
6487
+ const li = document.createElement('li');
6488
+ li.className = 'pz-file-li';
6489
+ const row = document.createElement('div');
6490
+ row.className = 'pz-file-row pz-file-' + (node.kind === 'dir' ? 'dir' : 'file');
6491
+ row.setAttribute('role', 'button');
6492
+ row.setAttribute('tabindex', '0');
6493
+ if (node.kind === 'dir') {
6494
+ const isOpen = expanded.has(node.path);
6495
+ row.innerHTML = '<span class="pz-file-caret">' + (isOpen ? '&#9662;' : '&#9656;') + '</span>'
6496
+ + '<span class="pz-file-ic">&#128193;</span>'
6497
+ + '<span class="pz-file-name">' + escapeHtml(node.name) + '</span>';
6498
+ li.appendChild(row);
6499
+ const childUl = document.createElement('ul');
6500
+ childUl.className = 'pz-files-ul';
6501
+ childUl.style.display = isOpen ? '' : 'none';
6502
+ (node.children || []).forEach(function (c) { childUl.appendChild(renderNode(c)); });
6503
+ li.appendChild(childUl);
6504
+ row.addEventListener('click', function () {
6505
+ const nowOpen = childUl.style.display === 'none';
6506
+ childUl.style.display = nowOpen ? '' : 'none';
6507
+ const caret = row.querySelector('.pz-file-caret');
6508
+ if (caret) caret.innerHTML = nowOpen ? '&#9662;' : '&#9656;';
6509
+ if (nowOpen) expanded.add(node.path); else expanded.delete(node.path);
6510
+ });
6511
+ } else {
6512
+ row.setAttribute('data-pz-file-path', node.path);
6513
+ const sz = fmtFileSize(node.size);
6514
+ row.title = node.path + (sz ? ' (' + sz + ')' : '');
6515
+ row.innerHTML = '<span class="pz-file-caret"></span>'
6516
+ + '<span class="pz-file-ic">&#128196;</span>'
6517
+ + '<span class="pz-file-name">' + escapeHtml(node.name) + '</span>';
6518
+ li.appendChild(row);
6519
+ row.addEventListener('click', function () { openFileWithOS(node.path, setFilesStatus); });
6520
+ }
6521
+ return li;
6522
+ }
6523
+
6524
+ async function load() {
6525
+ wrap.textContent = (CONFIG.i18n && CONFIG.i18n.filesLoading) || 'Cargando...';
6526
+ setFilesStatus('');
6527
+ try {
6528
+ const r = await fetch('/api/forge/files-tree');
6529
+ const j = await r.json();
6530
+ if (!j || !j.ok || !j.tree) {
6531
+ wrap.textContent = (j && j.error) || ((CONFIG.i18n && CONFIG.i18n.filesError) || 'No pude leer los archivos.');
6532
+ return;
6533
+ }
6534
+ wrap.innerHTML = '';
6535
+ const rootUl = document.createElement('ul');
6536
+ rootUl.className = 'pz-files-ul pz-files-root';
6537
+ (j.tree.children || []).forEach(function (c) { rootUl.appendChild(renderNode(c)); });
6538
+ if (!j.tree.children || j.tree.children.length === 0) {
6539
+ wrap.textContent = (CONFIG.i18n && CONFIG.i18n.filesEmpty) || '(sin archivos)';
6540
+ return;
6541
+ }
6542
+ wrap.appendChild(rootUl);
6543
+ if (j.truncated) setFilesStatus((CONFIG.i18n && CONFIG.i18n.filesTruncated) || '(lista truncada)');
6544
+ } catch (e) {
6545
+ wrap.textContent = (CONFIG.i18n && CONFIG.i18n.filesError) || 'No pude leer los archivos.';
6546
+ }
6547
+ }
6548
+
6549
+ if (refreshBtn && !refreshBtn._wired) {
6550
+ refreshBtn._wired = true;
6551
+ refreshBtn.addEventListener('click', load);
6552
+ }
6553
+ load();
6554
+ }
6555
+
6556
+ async function openFileWithOS(relPath, setFilesStatus) {
6557
+ try {
6558
+ const r = await fetch('/api/forge/open-native', {
6559
+ method: 'POST', headers: { 'content-type': 'application/json' },
6560
+ body: JSON.stringify({ path: relPath }),
6561
+ });
6562
+ const j = await r.json();
6563
+ if (j && j.ok) {
6564
+ const msg = ((CONFIG.i18n && CONFIG.i18n.filesOpened) || 'Abierto') + ': ' + (j.opened || relPath)
6565
+ + (j.app_hint ? ' (' + j.app_hint + ')' : '');
6566
+ if (setFilesStatus) setFilesStatus(msg);
6567
+ setStatus(msg);
6568
+ } else {
6569
+ const m = (j && j.error) || ((CONFIG.i18n && CONFIG.i18n.filesOpenFailed) || 'No se pudo abrir el archivo.');
6570
+ if (setFilesStatus) setFilesStatus(m);
6571
+ setStatus(m, true);
6572
+ }
6573
+ } catch (e) {
6574
+ setStatus((CONFIG.i18n && CONFIG.i18n.filesOpenFailed) || 'No se pudo abrir el archivo.', true);
6575
+ }
6576
+ }
6577
+
6331
6578
  function initGraphTab(it) {
6332
6579
  const canvas = document.querySelector('[data-pz-graph-canvas]');
6333
6580
  const detail = document.querySelector('[data-pz-graph-detail]');
@@ -6365,6 +6612,12 @@ function initGraphTab(it) {
6365
6612
  * abajo, izq y der). Se topa para no colapsar en canvases pequenos. */
6366
6613
  const _maxR = nodes.reduce((m, n) => Math.max(m, 9 + (n.weight || 0) * 11), 9);
6367
6614
  const MARGIN = Math.max(28, Math.min(2 * _maxR, Math.min(W, H) * 0.42 - 8));
6615
+ /* Circular containment (Pablo 2026-06-29): keep the cluster inside a
6616
+ * CIRCLE (not the rectangle), so the graph reads round instead of
6617
+ * filling the corners. BOUND_R is the disc radius the node CENTERS live
6618
+ * in; each node is further pulled in by its own radius so it fits whole. */
6619
+ const CX = W / 2, CY = H / 2;
6620
+ const BOUND_R = Math.max(_maxR + 4, Math.min(W, H) / 2 - MARGIN);
6368
6621
 
6369
6622
  const idIndex = {};
6370
6623
  nodes.forEach((n, i) => { idIndex[n.id] = i; });
@@ -6436,36 +6689,6 @@ function initGraphTab(it) {
6436
6689
  return g;
6437
6690
  });
6438
6691
 
6439
- /* ---- Vista funcional (startup_graph_func) ----
6440
- * Centrada en las funcionalidades de front-end (nodos del grupo
6441
- * 'frontend') y como conectan con TODO lo demas. Permite elegir una
6442
- * funcionalidad y ver solo su subgrafo alcanzable (lo que esa
6443
- * funcionalidad toca, directa o transitivamente). El filtro de grupos
6444
- * de abajo sigue aplicando ENCIMA de la funcionalidad elegida. */
6445
- const functional = data.mode === 'functional';
6446
- /* Adyacencia DIRIGIDA (from->to) para el alcance. Convencion del grafo
6447
- * (semantic_graph/derive.ts): la arista va del consumidor a lo que usa
6448
- * (owner --uses--> target, owner --depends_on--> lib). Asi, partir de
6449
- * una funcionalidad de front-end y seguir las salientes da su CONO de
6450
- * dependencias: exactamente los componentes con los que conecta. (No
6451
- * dirigido daria todo el grafo cuando es un unico componente conexo.) */
6452
- const adj = nodes.map(() => []);
6453
- edges.forEach((e) => { adj[e.from].push(e.to); });
6454
- function computeReach(startIdx) {
6455
- const seen = new Set([startIdx]);
6456
- const stack = [startIdx];
6457
- while (stack.length) {
6458
- const u = stack.pop();
6459
- const ns = adj[u];
6460
- for (let i = 0; i < ns.length; i++) { if (!seen.has(ns[i])) { seen.add(ns[i]); stack.push(ns[i]); } }
6461
- }
6462
- return seen;
6463
- }
6464
- /* Funcionalidad seleccionada (id de nodo) restaurada de un render
6465
- * previo; null = todas. funcReach = set de indices visibles, o null. */
6466
- const savedFunc = functional ? (_graphFuncByTab[it.id] || null) : null;
6467
- let funcReach = (savedFunc != null && idIndex[savedFunc] != null) ? computeReach(idIndex[savedFunc]) : null;
6468
-
6469
6692
  /* ---- Filtro por grupo (legend toggleable) -- desktop a la par del
6470
6693
  * mobile. Colorea por backend/frontend/mobile/tests/tools/scripts/
6471
6694
  * libs/protocol y permite mostrar/ocultar cada grupo. ---- */
@@ -6479,9 +6702,7 @@ function initGraphTab(it) {
6479
6702
  counts[n.group] = (counts[n.group] || 0) + 1;
6480
6703
  });
6481
6704
  _graphFilterByTab[it.id] = vis; /* el toggle muta este mismo objeto */
6482
- /* En modo funcional la barra de funcionalidades ocupa la fila de
6483
- * arriba; la leyenda de grupos baja una fila para no solaparse. */
6484
- const legendTop = functional ? 36 : 6;
6705
+ const legendTop = 6;
6485
6706
  const legend = document.createElement('div');
6486
6707
  legend.setAttribute('style', 'position:absolute;top:' + legendTop + 'px;left:6px;right:6px;display:flex;flex-wrap:wrap;gap:5px;z-index:6;pointer-events:auto;');
6487
6708
  Object.keys(counts).sort().forEach((k) => {
@@ -6503,56 +6724,8 @@ function initGraphTab(it) {
6503
6724
  canvas.style.position = canvas.style.position || 'relative';
6504
6725
  canvas.appendChild(legend);
6505
6726
 
6506
- /* ---- Barra de funcionalidades de front-end (solo modo funcional) ---- */
6507
- if (functional) {
6508
- const en = !!(CONFIG && CONFIG.lang === 'en');
6509
- const anchors = nodes
6510
- .map((n, i) => ({ n, i }))
6511
- .filter((x) => x.n.group === 'frontend')
6512
- .sort((a, b) => String(a.n.label).localeCompare(String(b.n.label)));
6513
- const bar = document.createElement('div');
6514
- bar.setAttribute('style', 'position:absolute;top:6px;left:6px;right:6px;display:flex;align-items:center;gap:6px;z-index:7;pointer-events:auto;');
6515
- const lab = document.createElement('span');
6516
- lab.setAttribute('style', 'font:inherit;font-size:11px;color:#3a3a3a;white-space:nowrap;');
6517
- lab.textContent = en ? 'Front-end feature:' : 'Funcionalidad front-end:';
6518
- const sel = document.createElement('select');
6519
- sel.setAttribute('style', 'font:inherit;font-size:11px;color:#3a3a3a;border:1px solid #d9d2c4;'
6520
- + 'border-radius:14px;padding:3px 9px;background:#fff;cursor:pointer;max-width:60%;');
6521
- const optAll = document.createElement('option');
6522
- optAll.value = '';
6523
- optAll.textContent = (en ? 'All features' : 'Todas las funcionalidades') + ' (' + anchors.length + ')';
6524
- sel.appendChild(optAll);
6525
- anchors.forEach((x) => {
6526
- const o = document.createElement('option');
6527
- o.value = x.n.id;
6528
- o.textContent = x.n.label.length > 40 ? x.n.label.slice(0, 39) + '…' : x.n.label;
6529
- if (savedFunc != null && x.n.id === savedFunc) o.selected = true;
6530
- sel.appendChild(o);
6531
- });
6532
- sel.addEventListener('change', () => {
6533
- const v = sel.value;
6534
- funcReach = (v && idIndex[v] != null) ? computeReach(idIndex[v]) : null;
6535
- _graphFuncByTab[it.id] = v || null;
6536
- if (v && idIndex[v] != null) { try { showDetail(nodes[idIndex[v]]); } catch (e) { /* */ } }
6537
- applyGraphFilter();
6538
- });
6539
- bar.appendChild(lab);
6540
- bar.appendChild(sel);
6541
- if (anchors.length === 0) {
6542
- const hint = document.createElement('span');
6543
- hint.setAttribute('style', 'font:inherit;font-size:11px;color:#9a8f7a;');
6544
- hint.textContent = en ? '(no front-end nodes detected)' : '(sin nodos de front-end detectados)';
6545
- bar.appendChild(hint);
6546
- }
6547
- canvas.appendChild(bar);
6548
- /* Si habia una funcionalidad recordada, reflejarla en el detalle. */
6549
- if (savedFunc != null && idIndex[savedFunc] != null) { try { showDetail(nodes[idIndex[savedFunc]]); } catch (e) { /* */ } }
6550
- }
6551
-
6552
6727
  function nodeVisible(i) {
6553
- if (!vis[nodes[i].group]) return false;
6554
- if (funcReach && !funcReach.has(i)) return false;
6555
- return true;
6728
+ return !!vis[nodes[i].group];
6556
6729
  }
6557
6730
  function applyGraphFilter() {
6558
6731
  for (let i = 0; i < nodeEls.length; i++) nodeEls[i].style.display = nodeVisible(i) ? '' : 'none';
@@ -6566,13 +6739,25 @@ function initGraphTab(it) {
6566
6739
  function showDetail(n) {
6567
6740
  if (!detail) return;
6568
6741
  nodeEls.forEach((g) => g.classList.toggle('selected', g._node === n));
6742
+ const npath = graphNodePath(n);
6569
6743
  detail.innerHTML =
6570
6744
  '<div class="pz-graph-detail-title">' + escapeHtml(n.label) + '</div>'
6571
6745
  + (n.kind ? '<div class="pz-graph-detail-kind">' + escapeHtml(String(n.kind)) + '</div>' : '')
6572
6746
  + '<div class="pz-graph-detail-meta">' + escapeHtml(CONFIG.i18n.pzGraphWeight) + ' ' + (Math.round(n.weight * 100) / 100)
6573
6747
  + ' &middot; id ' + escapeHtml(n.id) + '</div>'
6748
+ + (npath ? '<div class="pz-graph-detail-path"><a href="#" data-graph-open-path role="button" title="'
6749
+ + escapeHtml(((CONFIG.i18n && CONFIG.i18n.filesOpened) || 'Abrir') + ': ' + npath) + '">'
6750
+ + escapeHtml(npath) + '</a></div>' : '')
6574
6751
  + (n.detail ? '<div class="pz-graph-detail-body">' + renderMdRich(String(n.detail)) + '</div>'
6575
6752
  : '<div class="pz-graph-detail-hint">' + escapeHtml(CONFIG.i18n.pzGraphEmpty) + '</div>');
6753
+ if (npath) {
6754
+ const link = detail.querySelector('[data-graph-open-path]');
6755
+ if (link) link.addEventListener('click', (ev) => {
6756
+ ev.preventDefault();
6757
+ /* relative path -> the open-native endpoint prepends the project root */
6758
+ openFileWithOS(npath);
6759
+ });
6760
+ }
6576
6761
  }
6577
6762
 
6578
6763
  /* ---- Simulacion force-directed ---- */
@@ -6603,13 +6788,49 @@ function initGraphTab(it) {
6603
6788
  if (!a.fixed) { a._fx += ox; a._fy += oy; }
6604
6789
  if (!b.fixed) { b._fx -= ox; b._fy -= oy; }
6605
6790
  }
6791
+ /* integrate velocities -- containment + collision handled below. */
6606
6792
  for (const n of nodes) {
6607
6793
  if (n.fixed) continue;
6608
6794
  n.vx = (n.vx + n._fx * alpha) * DAMP;
6609
6795
  n.vy = (n.vy + n._fy * alpha) * DAMP;
6610
6796
  n.x += n.vx; n.y += n.vy;
6611
- n.x = Math.max(MARGIN, Math.min(W - MARGIN, n.x));
6612
- n.y = Math.max(MARGIN, Math.min(H - MARGIN, n.y));
6797
+ }
6798
+ /* Anti-overlap: separate node circles by their radii (a couple of
6799
+ * position passes; O(n^2) but the graph is small). The plain 1/d^2
6800
+ * repulse ignores radii, so big nodes overlapped without this. */
6801
+ const COL_PAD = 4;
6802
+ for (let pass = 0; pass < 2; pass++) {
6803
+ for (let i = 0; i < nodes.length; i++) {
6804
+ const a = nodes[i]; const ra = 9 + a.weight * 11;
6805
+ for (let j = i + 1; j < nodes.length; j++) {
6806
+ const b = nodes[j]; const rb = 9 + b.weight * 11;
6807
+ let dx = b.x - a.x, dy = b.y - a.y;
6808
+ const minD = ra + rb + COL_PAD;
6809
+ const d2 = dx * dx + dy * dy;
6810
+ if (d2 >= minD * minD) continue;
6811
+ let d = Math.sqrt(d2);
6812
+ if (d < 0.01) { dx = 1; dy = 0; d = 1; } /* coincident -> split on x */
6813
+ const push = (minD - d) / 2;
6814
+ const ox = (dx / d) * push, oy = (dy / d) * push;
6815
+ if (!a.fixed) { a.x -= ox; a.y -= oy; }
6816
+ if (!b.fixed) { b.x += ox; b.y += oy; }
6817
+ }
6818
+ }
6819
+ }
6820
+ /* Circular containment: clamp each node CENTER inside the disc, leaving
6821
+ * room for its own radius so the whole node stays in -- the cluster
6822
+ * reads round, not a rectangle filling the corners. */
6823
+ for (const n of nodes) {
6824
+ if (n.fixed) continue;
6825
+ const r = 9 + n.weight * 11;
6826
+ const dxc = n.x - CX, dyc = n.y - CY;
6827
+ const dist = Math.sqrt(dxc * dxc + dyc * dyc);
6828
+ const limit = Math.max(0, BOUND_R - r);
6829
+ if (dist > limit && dist > 0.001) {
6830
+ n.x = CX + (dxc / dist) * limit;
6831
+ n.y = CY + (dyc / dist) * limit;
6832
+ n.vx *= 0.5; n.vy *= 0.5;
6833
+ }
6613
6834
  }
6614
6835
  alpha *= 0.985; if (alpha < 0.02) alpha = 0.02;
6615
6836
  }
@@ -1 +1 @@
1
- {"version":3,"file":"panel.js","sourceRoot":"","sources":["../../src/chat/panel.ts"],"names":[],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAolRpB,kBAAkB;;QAEpB,CAAC;AACT,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC;SACL,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC"}
1
+ {"version":3,"file":"panel.js","sourceRoot":"","sources":["../../src/chat/panel.ts"],"names":[],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAswRpB,kBAAkB;;QAEpB,CAAC;AACT,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC;SACL,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC"}