@_davideast/stitch-mcp 0.5.0 → 0.5.1

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 (258) hide show
  1. package/dist/{chunk-hb3c6f6a.js → chunk-001yk06v.js} +2 -2
  2. package/dist/chunk-0cd2xak4.js +31447 -0
  3. package/dist/chunk-0cd2xak4.js.map +245 -0
  4. package/dist/{chunk-9tvppjaf.js → chunk-13mqag7n.js} +8 -10
  5. package/dist/{chunk-9tvppjaf.js.map → chunk-13mqag7n.js.map} +2 -2
  6. package/dist/chunk-1dcffh2w.js +1481 -0
  7. package/dist/chunk-1dcffh2w.js.map +23 -0
  8. package/dist/{chunk-985f11w6.js → chunk-26cgk4dt.js} +6 -8
  9. package/dist/{chunk-8yrtq2qs.js.map → chunk-26cgk4dt.js.map} +1 -1
  10. package/dist/chunk-2kg77g4q.js +167 -0
  11. package/dist/chunk-2kg77g4q.js.map +10 -0
  12. package/dist/chunk-34w2wfyp.js +68 -0
  13. package/dist/chunk-34w2wfyp.js.map +10 -0
  14. package/dist/chunk-44tn9dxb.js +19 -0
  15. package/dist/{chunk-985f11w6.js.map → chunk-44tn9dxb.js.map} +1 -1
  16. package/dist/chunk-5204d23a.js +24 -0
  17. package/dist/{chunk-ezmw2j8c.js.map → chunk-5204d23a.js.map} +1 -1
  18. package/dist/{chunk-mv9ssgmx.js → chunk-54wv5ptt.js} +5 -5
  19. package/dist/{chunk-mv9ssgmx.js.map → chunk-54wv5ptt.js.map} +2 -2
  20. package/dist/chunk-5dghg77b.js +16970 -0
  21. package/dist/chunk-5dghg77b.js.map +26 -0
  22. package/dist/{chunk-r2sg2nxa.js → chunk-5f2htt6r.js} +6 -7
  23. package/dist/chunk-5f2htt6r.js.map +9 -0
  24. package/dist/chunk-6gw9apqb.js +20 -0
  25. package/dist/chunk-6gw9apqb.js.map +10 -0
  26. package/dist/chunk-7bt2055x.js +39 -0
  27. package/dist/chunk-7bt2055x.js.map +10 -0
  28. package/dist/chunk-7egq85x5.js +273 -0
  29. package/dist/chunk-7egq85x5.js.map +10 -0
  30. package/dist/chunk-7pf2vfq9.js +69 -0
  31. package/dist/chunk-7pf2vfq9.js.map +10 -0
  32. package/dist/{chunk-q1nd6g0y.js → chunk-7rrhk07q.js} +76 -53
  33. package/dist/chunk-7rrhk07q.js.map +20 -0
  34. package/dist/{chunk-7xh1y383.js → chunk-7xsar3mr.js} +2 -2
  35. package/dist/{chunk-7xh1y383.js.map → chunk-7xsar3mr.js.map} +1 -1
  36. package/dist/chunk-7y4xzvkz.js +19132 -0
  37. package/dist/chunk-7y4xzvkz.js.map +115 -0
  38. package/dist/chunk-7zy0vdv5.js +761 -0
  39. package/dist/chunk-7zy0vdv5.js.map +18 -0
  40. package/dist/chunk-8rt3pp6g.js +256 -0
  41. package/dist/{chunk-jy2d17pr.js.map → chunk-8rt3pp6g.js.map} +3 -3
  42. package/dist/chunk-98trrxk2.js +40 -0
  43. package/dist/chunk-98trrxk2.js.map +10 -0
  44. package/dist/chunk-a1mk24q9.js +31326 -0
  45. package/dist/chunk-a1mk24q9.js.map +245 -0
  46. package/dist/chunk-a5xra9jn.js +159 -0
  47. package/dist/chunk-a5xra9jn.js.map +11 -0
  48. package/dist/chunk-abf1r0jh.js +2118 -0
  49. package/dist/chunk-abf1r0jh.js.map +44 -0
  50. package/dist/{chunk-25wakzyb.js → chunk-ahw5kfbr.js} +5 -5
  51. package/dist/chunk-akd997ec.js +11061 -0
  52. package/dist/chunk-akd997ec.js.map +238 -0
  53. package/dist/chunk-by28t333.js +19 -0
  54. package/dist/chunk-by28t333.js.map +9 -0
  55. package/dist/{chunk-2k7n0w2x.js → chunk-c6ge431q.js} +2 -2
  56. package/dist/{chunk-2k7n0w2x.js.map → chunk-c6ge431q.js.map} +1 -1
  57. package/dist/{chunk-ycfxp056.js → chunk-cnmspfhx.js} +7 -11
  58. package/dist/chunk-cnmspfhx.js.map +17 -0
  59. package/dist/chunk-cwqdka8y.js +6382 -0
  60. package/dist/chunk-cwqdka8y.js.map +109 -0
  61. package/dist/chunk-dffwrtn3.js +673 -0
  62. package/dist/chunk-dffwrtn3.js.map +17 -0
  63. package/dist/chunk-dyp9t5wf.js +44109 -0
  64. package/dist/chunk-dyp9t5wf.js.map +237 -0
  65. package/dist/chunk-e9881zy4.js +39 -0
  66. package/dist/chunk-e9881zy4.js.map +10 -0
  67. package/dist/chunk-ezs0qz0b.js +24 -0
  68. package/dist/chunk-ezs0qz0b.js.map +9 -0
  69. package/dist/chunk-f6cq8r7x.js +736 -0
  70. package/dist/chunk-f6cq8r7x.js.map +16 -0
  71. package/dist/{chunk-45wx7tn7.js → chunk-gwnmywrp.js} +2 -2
  72. package/dist/chunk-gz78f003.js +94 -0
  73. package/dist/chunk-gz78f003.js.map +10 -0
  74. package/dist/chunk-j0y94q2c.js +10 -0
  75. package/dist/{chunk-nthabjd9.js → chunk-jyem6j6k.js} +1848 -3
  76. package/dist/chunk-jyem6j6k.js.map +65 -0
  77. package/dist/chunk-kad4d9sf.js +11 -0
  78. package/dist/chunk-kad4d9sf.js.map +9 -0
  79. package/dist/{chunk-wz8d5vzb.js → chunk-krfqppg2.js} +32 -2
  80. package/dist/{chunk-wz8d5vzb.js.map → chunk-krfqppg2.js.map} +5 -4
  81. package/dist/chunk-kw62yeqn.js +124 -0
  82. package/dist/chunk-kw62yeqn.js.map +12 -0
  83. package/dist/chunk-mbt1wx7n.js +43 -0
  84. package/dist/chunk-mbt1wx7n.js.map +10 -0
  85. package/dist/chunk-nzv6abbc.js +22 -0
  86. package/dist/chunk-nzv6abbc.js.map +9 -0
  87. package/dist/{chunk-cwkb2wbe.js → chunk-pjpdhh0f.js} +27 -24
  88. package/dist/chunk-pjpdhh0f.js.map +16 -0
  89. package/dist/chunk-py8fhw0k.js +941 -0
  90. package/dist/chunk-py8fhw0k.js.map +27 -0
  91. package/dist/chunk-q6sv0243.js +93 -0
  92. package/dist/chunk-q6sv0243.js.map +13 -0
  93. package/dist/chunk-r8n5m3xq.js +19 -0
  94. package/dist/chunk-r8n5m3xq.js.map +9 -0
  95. package/dist/{chunk-nxpzt33t.js → chunk-rcwtjara.js} +8 -13
  96. package/dist/chunk-rcwtjara.js.map +10 -0
  97. package/dist/{chunk-t85nbjjb.js → chunk-rfrcdsfc.js} +5 -9
  98. package/dist/chunk-rfrcdsfc.js.map +10 -0
  99. package/dist/chunk-rj2gqxxb.js +415 -0
  100. package/dist/chunk-rj2gqxxb.js.map +20 -0
  101. package/dist/{chunk-v7117ywx.js → chunk-rvq1vb70.js} +5 -7
  102. package/dist/{chunk-v7117ywx.js.map → chunk-rvq1vb70.js.map} +2 -2
  103. package/dist/chunk-smvqara3.js +370 -0
  104. package/dist/chunk-smvqara3.js.map +16 -0
  105. package/dist/{chunk-pfyjtfex.js → chunk-sp8zjpbf.js} +7 -12
  106. package/dist/chunk-sp8zjpbf.js.map +10 -0
  107. package/dist/{chunk-48d17n29.js → chunk-ssbg48ec.js} +1 -1
  108. package/dist/chunk-ssbg48ec.js.map +9 -0
  109. package/dist/chunk-st7q66e5.js +109 -0
  110. package/dist/chunk-st7q66e5.js.map +10 -0
  111. package/dist/{chunk-sdp429xd.js → chunk-sw7h7asn.js} +32 -8
  112. package/dist/chunk-sw7h7asn.js.map +27 -0
  113. package/dist/chunk-t092ehvp.js +50 -0
  114. package/dist/chunk-t092ehvp.js.map +9 -0
  115. package/dist/{chunk-2cetsfw4.js → chunk-t0xqfse1.js} +50 -9
  116. package/dist/{chunk-2cetsfw4.js.map → chunk-t0xqfse1.js.map} +8 -3
  117. package/dist/chunk-v1t5vys5.js +124 -0
  118. package/dist/chunk-v1t5vys5.js.map +12 -0
  119. package/dist/chunk-v78rg840.js +137 -0
  120. package/dist/chunk-v78rg840.js.map +10 -0
  121. package/dist/chunk-v7xskyzm.js +19 -0
  122. package/dist/chunk-v7xskyzm.js.map +9 -0
  123. package/dist/{chunk-jy2d17pr.js → chunk-vjshqjmh.js} +12 -8
  124. package/dist/chunk-vjshqjmh.js.map +11 -0
  125. package/dist/chunk-w8075wyx.js +40 -0
  126. package/dist/chunk-w8075wyx.js.map +10 -0
  127. package/dist/chunk-wn8mek6a.js +189 -0
  128. package/dist/chunk-wn8mek6a.js.map +11 -0
  129. package/dist/{chunk-2kyqsrg2.js → chunk-y447ymks.js} +364 -3
  130. package/dist/chunk-y447ymks.js.map +18 -0
  131. package/dist/chunk-yej34vkc.js +247 -0
  132. package/dist/chunk-yej34vkc.js.map +14 -0
  133. package/dist/commands/doctor/command.js +2 -2
  134. package/dist/commands/init/command.js +2 -2
  135. package/dist/commands/logout/command.js +2 -2
  136. package/dist/commands/proxy/command.js +4 -5
  137. package/dist/commands/proxy/command.js.map +3 -3
  138. package/dist/commands/proxy/handler.d.ts +27 -5
  139. package/dist/commands/registry.d.ts +2 -0
  140. package/dist/commands/screens/ScreensView.d.ts +1 -3
  141. package/dist/commands/screens/command.js +8 -10
  142. package/dist/commands/screens/command.js.map +3 -3
  143. package/dist/commands/screens/handler.d.ts +5 -6
  144. package/dist/commands/serve/command.js +60 -10
  145. package/dist/commands/serve/command.js.map +7 -5
  146. package/dist/commands/serve/handler.d.ts +6 -21
  147. package/dist/commands/serve/json-server/handler.d.ts +8 -0
  148. package/dist/commands/serve/json-server/spec.d.ts +32 -0
  149. package/dist/commands/serve/list-screens/handler.d.ts +7 -0
  150. package/dist/commands/serve/list-screens/spec.d.ts +33 -0
  151. package/dist/commands/serve/spec.d.ts +30 -0
  152. package/dist/commands/site/command.js +12 -6
  153. package/dist/commands/site/command.js.map +4 -4
  154. package/dist/commands/site/generate/handler.d.ts +8 -0
  155. package/dist/commands/site/generate/spec.d.ts +44 -0
  156. package/dist/commands/site/hooks/useProjectHydration.d.ts +2 -2
  157. package/dist/commands/site/index.d.ts +5 -3
  158. package/dist/commands/site/list-screens/handler.d.ts +7 -0
  159. package/dist/commands/site/list-screens/spec.d.ts +33 -0
  160. package/dist/commands/site/spec.d.ts +6 -0
  161. package/dist/commands/site/ui/SiteBuilder.d.ts +2 -2
  162. package/dist/commands/site/utils/fetchWithRetry.d.ts +10 -0
  163. package/dist/commands/site/utils/suggestRoute.d.ts +1 -0
  164. package/dist/commands/snapshot/command.js +2 -2
  165. package/dist/commands/tool/command.js +2 -2
  166. package/dist/commands/tool/command.js.map +2 -2
  167. package/dist/commands/tool/context.d.ts +3 -2
  168. package/dist/commands/tool/handler.d.ts +9 -10
  169. package/dist/commands/tool/spec.d.ts +3 -2
  170. package/dist/commands/view/command.js +2 -2
  171. package/dist/index.js +11 -13
  172. package/dist/index.js.map +1 -1
  173. package/dist/platform/browser.d.ts +8 -0
  174. package/dist/services/mcp-client/client.d.ts +5 -0
  175. package/dist/services/mcp-client/spec.d.ts +6 -6
  176. package/dist/services/proxy/spec.d.ts +3 -3
  177. package/dist/services/stitch-sdk/MockStitchSDK.d.ts +18 -0
  178. package/dist/services/view/handler.d.ts +3 -3
  179. package/dist/ui/copy-behaviors/index.d.ts +8 -0
  180. package/dist/ui/navigation-behaviors/index.d.ts +34 -0
  181. package/dist/ui/serve-behaviors/index.d.ts +7 -0
  182. package/package.json +2 -1
  183. package/dist/chunk-2fcdwvrm.js +0 -54
  184. package/dist/chunk-2fcdwvrm.js.map +0 -10
  185. package/dist/chunk-2kyqsrg2.js.map +0 -10
  186. package/dist/chunk-8yrtq2qs.js +0 -18
  187. package/dist/chunk-cwkb2wbe.js.map +0 -16
  188. package/dist/chunk-djhzzcgj.js +0 -362
  189. package/dist/chunk-djhzzcgj.js.map +0 -13
  190. package/dist/chunk-ezmw2j8c.js +0 -14
  191. package/dist/chunk-fwb4fnkp.js +0 -31
  192. package/dist/chunk-fwb4fnkp.js.map +0 -10
  193. package/dist/chunk-h18jrqed.js +0 -9517
  194. package/dist/chunk-h18jrqed.js.map +0 -99
  195. package/dist/chunk-knbnsf6s.js +0 -92
  196. package/dist/chunk-knbnsf6s.js.map +0 -10
  197. package/dist/chunk-nthabjd9.js.map +0 -34
  198. package/dist/chunk-nxpzt33t.js.map +0 -10
  199. package/dist/chunk-pfyjtfex.js.map +0 -10
  200. package/dist/chunk-q1nd6g0y.js.map +0 -20
  201. package/dist/chunk-q4js8r0z.js +0 -4708
  202. package/dist/chunk-q4js8r0z.js.map +0 -29
  203. package/dist/chunk-qv44tmn6.js +0 -289
  204. package/dist/chunk-qv44tmn6.js.map +0 -13
  205. package/dist/chunk-r2sg2nxa.js.map +0 -9
  206. package/dist/chunk-rpxnm86e.js +0 -372
  207. package/dist/chunk-rpxnm86e.js.map +0 -17
  208. package/dist/chunk-sdp429xd.js.map +0 -24
  209. package/dist/chunk-t85nbjjb.js.map +0 -10
  210. package/dist/chunk-wa64nz8b.js +0 -47
  211. package/dist/chunk-wa64nz8b.js.map +0 -10
  212. package/dist/chunk-ycfxp056.js.map +0 -17
  213. package/dist/chunk-z9d2xc83.js +0 -3256
  214. package/dist/chunk-z9d2xc83.js.map +0 -84
  215. package/dist/services/config/handler.d.ts +0 -12
  216. package/dist/services/config/spec.d.ts +0 -82
  217. package/dist/src/cli.d.ts +0 -1
  218. package/dist/src/commands/doctor/handler.d.ts +0 -9
  219. package/dist/src/commands/doctor/handler.test.d.ts +0 -1
  220. package/dist/src/commands/doctor/spec.d.ts +0 -130
  221. package/dist/src/commands/doctor/spec.test.d.ts +0 -1
  222. package/dist/src/commands/init/handler.d.ts +0 -17
  223. package/dist/src/commands/init/handler.test.d.ts +0 -1
  224. package/dist/src/commands/init/spec.d.ts +0 -88
  225. package/dist/src/commands/init/spec.test.d.ts +0 -1
  226. package/dist/src/commands/proxy/handler.d.ts +0 -7
  227. package/dist/src/commands/proxy/handler.test.d.ts +0 -1
  228. package/dist/src/index.d.ts +0 -13
  229. package/dist/src/platform/detector.d.ts +0 -29
  230. package/dist/src/platform/paths.d.ts +0 -20
  231. package/dist/src/platform/shell.d.ts +0 -26
  232. package/dist/src/services/gcloud/handler.d.ts +0 -48
  233. package/dist/src/services/gcloud/handler.test.d.ts +0 -1
  234. package/dist/src/services/gcloud/spec.d.ts +0 -405
  235. package/dist/src/services/mcp-config/handler.d.ts +0 -12
  236. package/dist/src/services/mcp-config/handler.test.d.ts +0 -1
  237. package/dist/src/services/mcp-config/spec.d.ts +0 -88
  238. package/dist/src/services/mcp-config/spec.test.d.ts +0 -1
  239. package/dist/src/services/project/handler.d.ts +0 -11
  240. package/dist/src/services/project/handler.test.d.ts +0 -1
  241. package/dist/src/services/project/spec.d.ts +0 -86
  242. package/dist/src/services/project/spec.test.d.ts +0 -1
  243. package/dist/src/services/proxy/handler.d.ts +0 -15
  244. package/dist/src/services/proxy/handler.test.d.ts +0 -1
  245. package/dist/src/services/proxy/spec.d.ts +0 -83
  246. package/dist/src/services/proxy/spec.test.d.ts +0 -1
  247. package/dist/src/services/stitch/handler.d.ts +0 -15
  248. package/dist/src/services/stitch/handler.test.d.ts +0 -1
  249. package/dist/src/services/stitch/spec.d.ts +0 -262
  250. package/dist/src/services/stitch/spec.test.d.ts +0 -1
  251. package/dist/src/ui/spinner.d.ts +0 -11
  252. package/dist/src/ui/theme.d.ts +0 -18
  253. package/dist/src/ui/wizard.d.ts +0 -24
  254. package/dist/tests/mocks/shell.d.ts +0 -2
  255. /package/dist/{chunk-hb3c6f6a.js.map → chunk-001yk06v.js.map} +0 -0
  256. /package/dist/{chunk-25wakzyb.js.map → chunk-ahw5kfbr.js.map} +0 -0
  257. /package/dist/{chunk-45wx7tn7.js.map → chunk-gwnmywrp.js.map} +0 -0
  258. /package/dist/{chunk-48d17n29.js.map → chunk-j0y94q2c.js.map} +0 -0
@@ -0,0 +1,941 @@
1
+ import {
2
+ GcloudExecutor
3
+ } from "./chunk-jyem6j6k.js";
4
+ import {
5
+ require_cli_spinners
6
+ } from "./chunk-nq68kghz.js";
7
+ import {
8
+ eastAsianWidth
9
+ } from "./chunk-q6sv0243.js";
10
+ import {
11
+ isUnicodeSupported
12
+ } from "./chunk-4jygt4d6.js";
13
+ import {
14
+ onExit
15
+ } from "./chunk-tz7wnw4s.js";
16
+ import {
17
+ source_default
18
+ } from "./chunk-3sfn889r.js";
19
+ import {
20
+ __commonJS,
21
+ __toESM
22
+ } from "./chunk-9wyra8hs.js";
23
+
24
+ // node_modules/ora/node_modules/emoji-regex/index.js
25
+ var require_emoji_regex = __commonJS((exports, module) => {
26
+ module.exports = () => {
27
+ return /[#*0-9]\uFE0F?\u20E3|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26AA\u26B0\u26B1\u26BD\u26BE\u26C4\u26C8\u26CF\u26D1\u26E9\u26F0-\u26F5\u26F7\u26F8\u26FA\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B55\u3030\u303D\u3297\u3299]\uFE0F?|[\u261D\u270C\u270D](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?|[\u270A\u270B](?:\uD83C[\uDFFB-\uDFFF])?|[\u23E9-\u23EC\u23F0\u23F3\u25FD\u2693\u26A1\u26AB\u26C5\u26CE\u26D4\u26EA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2795-\u2797\u27B0\u27BF\u2B50]|\u26D3\uFE0F?(?:\u200D\uD83D\uDCA5)?|\u26F9(?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|\u2764\uFE0F?(?:\u200D(?:\uD83D\uDD25|\uD83E\uDE79))?|\uD83C(?:[\uDC04\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]\uFE0F?|[\uDF85\uDFC2\uDFC7](?:\uD83C[\uDFFB-\uDFFF])?|[\uDFC4\uDFCA](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDFCB\uDFCC](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF43\uDF45-\uDF4A\uDF4C-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF7\uDDFA-\uDDFF]|\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uDDF4\uD83C\uDDF2|\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uDDF6\uD83C\uDDE6|\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF]|\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uDDFC\uD83C[\uDDEB\uDDF8]|\uDDFD\uD83C\uDDF0|\uDDFE\uD83C[\uDDEA\uDDF9]|\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uDF44(?:\u200D\uD83D\uDFEB)?|\uDF4B(?:\u200D\uD83D\uDFE9)?|\uDFC3(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDFF3\uFE0F?(?:\u200D(?:\u26A7\uFE0F?|\uD83C\uDF08))?|\uDFF4(?:\u200D\u2620\uFE0F?|\uDB40\uDC67\uDB40\uDC62\uDB40(?:\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDC73\uDB40\uDC63\uDB40\uDC74|\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F)?)|\uD83D(?:[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3]\uFE0F?|[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC](?:\uD83C[\uDFFB-\uDFFF])?|[\uDC6E-\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4\uDEB5](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD74\uDD90](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?|[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC25\uDC27-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE41\uDE43\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED8\uDEDC-\uDEDF\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB\uDFF0]|\uDC08(?:\u200D\u2B1B)?|\uDC15(?:\u200D\uD83E\uDDBA)?|\uDC26(?:\u200D(?:\u2B1B|\uD83D\uDD25))?|\uDC3B(?:\u200D\u2744\uFE0F?)?|\uDC41\uFE0F?(?:\u200D\uD83D\uDDE8\uFE0F?)?|\uDC68(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDC68\uDC69]\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFC-\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFC-\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFE])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFE]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?))?|\uDC69(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?[\uDC68\uDC69]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?|\uDC69\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?))|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFC-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFC-\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFD-\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFD\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFE])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFE]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFE])))?))?|\uDD75(?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|\uDE2E(?:\u200D\uD83D\uDCA8)?|\uDE35(?:\u200D\uD83D\uDCAB)?|\uDE36(?:\u200D\uD83C\uDF2B\uFE0F?)?|\uDE42(?:\u200D[\u2194\u2195]\uFE0F?)?|\uDEB6(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?)|\uD83E(?:[\uDD0C\uDD0F\uDD18-\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5\uDEC3-\uDEC5\uDEF0\uDEF2-\uDEF8](?:\uD83C[\uDFFB-\uDFFF])?|[\uDD26\uDD35\uDD37-\uDD39\uDD3C-\uDD3E\uDDB8\uDDB9\uDDCD\uDDCF\uDDD4\uDDD6-\uDDDD](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDDDE\uDDDF](?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD0D\uDD0E\uDD10-\uDD17\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCC\uDDD0\uDDE0-\uDDFF\uDE70-\uDE7C\uDE80-\uDE8A\uDE8E-\uDEC2\uDEC6\uDEC8\uDECD-\uDEDC\uDEDF-\uDEEA\uDEEF]|\uDDCE(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDDD1(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1|\uDDD1\u200D\uD83E\uDDD2(?:\u200D\uD83E\uDDD2)?|\uDDD2(?:\u200D\uD83E\uDDD2)?))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE])))?))?|\uDEF1(?:\uD83C(?:\uDFFB(?:\u200D\uD83E\uDEF2\uD83C[\uDFFC-\uDFFF])?|\uDFFC(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFD-\uDFFF])?|\uDFFD(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])?|\uDFFE(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFD\uDFFF])?|\uDFFF(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFE])?))?)/g;
28
+ };
29
+ });
30
+
31
+ // src/services/stitch/iam.ts
32
+ class StitchIamService {
33
+ executor;
34
+ constructor(executor) {
35
+ this.executor = executor;
36
+ }
37
+ async configureIAM(input) {
38
+ try {
39
+ const role = "roles/serviceusage.serviceUsageConsumer";
40
+ const member = `user:${input.userEmail}`;
41
+ const result = await this.executor.exec([
42
+ "projects",
43
+ "add-iam-policy-binding",
44
+ input.projectId,
45
+ `--member=${member}`,
46
+ `--role=${role}`,
47
+ "--condition=None",
48
+ "--quiet"
49
+ ]);
50
+ if (!result.success) {
51
+ const errorMsg = result.stderr || result.error || result.stdout || "Unknown error";
52
+ return {
53
+ success: false,
54
+ error: {
55
+ code: "IAM_CONFIG_FAILED",
56
+ message: `Failed to configure IAM permissions: ${errorMsg}`,
57
+ suggestion: "Ensure you have Owner or Editor role on the project",
58
+ recoverable: true,
59
+ details: `Exit code: ${result.exitCode}
60
+ Stderr: ${result.stderr}
61
+ Stdout: ${result.stdout}`
62
+ }
63
+ };
64
+ }
65
+ return {
66
+ success: true,
67
+ data: {
68
+ role,
69
+ member
70
+ }
71
+ };
72
+ } catch (error) {
73
+ return {
74
+ success: false,
75
+ error: {
76
+ code: "IAM_CONFIG_FAILED",
77
+ message: error instanceof Error ? error.message : String(error),
78
+ recoverable: false
79
+ }
80
+ };
81
+ }
82
+ }
83
+ async checkIAMRole(input) {
84
+ try {
85
+ const role = "roles/serviceusage.serviceUsageConsumer";
86
+ const member = `user:${input.userEmail}`;
87
+ const result = await this.executor.exec([
88
+ "projects",
89
+ "get-iam-policy",
90
+ input.projectId,
91
+ `--flatten=bindings[].members`,
92
+ `--filter=bindings.role=${role} AND bindings.members=${member}`,
93
+ "--format=value(bindings.members)"
94
+ ]);
95
+ return result.success && result.stdout.trim().includes(member);
96
+ } catch {
97
+ return false;
98
+ }
99
+ }
100
+ }
101
+
102
+ // src/services/stitch/api.ts
103
+ class StitchApiService {
104
+ executor;
105
+ constructor(executor) {
106
+ this.executor = executor;
107
+ }
108
+ async enableAPI(input) {
109
+ try {
110
+ const api = "stitch.googleapis.com";
111
+ const result = await this.executor.exec(["beta", "services", "mcp", "enable", api, `--project=${input.projectId}`, "--quiet"]);
112
+ if (!result.success) {
113
+ const errorMsg = result.stderr || result.error || result.stdout || "Unknown error";
114
+ return {
115
+ success: false,
116
+ error: {
117
+ code: "API_ENABLE_FAILED",
118
+ message: `Failed to enable Stitch API: ${errorMsg}`,
119
+ suggestion: "Ensure the project has billing enabled",
120
+ recoverable: true,
121
+ details: `Exit code: ${result.exitCode}
122
+ Stderr: ${result.stderr}
123
+ Stdout: ${result.stdout}`
124
+ }
125
+ };
126
+ }
127
+ return {
128
+ success: true,
129
+ data: {
130
+ api,
131
+ enabled: true
132
+ }
133
+ };
134
+ } catch (error) {
135
+ return {
136
+ success: false,
137
+ error: {
138
+ code: "API_ENABLE_FAILED",
139
+ message: error instanceof Error ? error.message : String(error),
140
+ recoverable: false
141
+ }
142
+ };
143
+ }
144
+ }
145
+ async checkAPIEnabled(input) {
146
+ try {
147
+ const result = await this.executor.exec([
148
+ "services",
149
+ "list",
150
+ `--project=${input.projectId}`,
151
+ "--enabled",
152
+ "--filter=name:stitch.googleapis.com",
153
+ "--format=value(name)"
154
+ ]);
155
+ return result.success && result.stdout.trim().includes("stitch.googleapis.com");
156
+ } catch {
157
+ return false;
158
+ }
159
+ }
160
+ }
161
+
162
+ // src/services/stitch/connection.ts
163
+ class StitchConnectionService {
164
+ async testConnectionWithApiKey(input) {
165
+ try {
166
+ const url = process.env.STITCH_HOST || "https://stitch.googleapis.com/mcp";
167
+ const payload = {
168
+ method: "tools/call",
169
+ jsonrpc: "2.0",
170
+ params: {
171
+ name: "list_projects",
172
+ arguments: {}
173
+ },
174
+ id: 1
175
+ };
176
+ const response = await fetch(url, {
177
+ method: "POST",
178
+ headers: {
179
+ "Content-Type": "application/json",
180
+ Accept: "application/json, text/event-stream",
181
+ "X-Goog-Api-Key": input.apiKey
182
+ },
183
+ body: JSON.stringify(payload)
184
+ });
185
+ if (!response.ok) {
186
+ let errorDetails = "";
187
+ let errorMessage = `API request failed with status ${response.status}`;
188
+ try {
189
+ const errorBody = await response.json();
190
+ errorDetails = JSON.stringify(errorBody, null, 2);
191
+ if (errorBody?.error?.message) {
192
+ errorMessage = errorBody.error.message;
193
+ }
194
+ } catch {
195
+ try {
196
+ errorDetails = await response.text();
197
+ } catch {
198
+ errorDetails = `Status ${response.status}: ${response.statusText}`;
199
+ }
200
+ }
201
+ return {
202
+ success: false,
203
+ error: {
204
+ code: response.status === 403 ? "PERMISSION_DENIED" : "CONNECTION_TEST_FAILED",
205
+ message: errorMessage,
206
+ suggestion: response.status === 403 ? "Check that your API key is valid and has access to the Stitch API" : "Verify API key configuration and try again",
207
+ recoverable: true,
208
+ details: errorDetails
209
+ }
210
+ };
211
+ }
212
+ const data = await response.json();
213
+ return {
214
+ success: true,
215
+ data: {
216
+ connected: true,
217
+ statusCode: response.status,
218
+ url,
219
+ response: data
220
+ }
221
+ };
222
+ } catch (error) {
223
+ return {
224
+ success: false,
225
+ error: {
226
+ code: "CONNECTION_TEST_FAILED",
227
+ message: error instanceof Error ? error.message : String(error),
228
+ recoverable: false
229
+ }
230
+ };
231
+ }
232
+ }
233
+ async testConnection(input) {
234
+ try {
235
+ const url = process.env.STITCH_HOST || "https://stitch.googleapis.com/mcp";
236
+ const payload = {
237
+ method: "tools/call",
238
+ jsonrpc: "2.0",
239
+ params: {
240
+ name: "list_projects",
241
+ arguments: {}
242
+ },
243
+ id: 1
244
+ };
245
+ const response = await fetch(url, {
246
+ method: "POST",
247
+ headers: {
248
+ "Content-Type": "application/json",
249
+ Accept: "application/json, text/event-stream",
250
+ Authorization: `Bearer ${input.accessToken}`,
251
+ "X-Goog-User-Project": input.projectId
252
+ },
253
+ body: JSON.stringify(payload)
254
+ });
255
+ if (!response.ok) {
256
+ let errorDetails = "";
257
+ let errorMessage = `API request failed with status ${response.status}`;
258
+ try {
259
+ const errorBody = await response.json();
260
+ errorDetails = JSON.stringify(errorBody, null, 2);
261
+ if (errorBody?.error?.message) {
262
+ errorMessage = errorBody.error.message;
263
+ }
264
+ } catch {
265
+ try {
266
+ errorDetails = await response.text();
267
+ } catch {
268
+ errorDetails = `Status ${response.status}: ${response.statusText}`;
269
+ }
270
+ }
271
+ return {
272
+ success: false,
273
+ error: {
274
+ code: response.status === 403 ? "PERMISSION_DENIED" : "CONNECTION_TEST_FAILED",
275
+ message: errorMessage,
276
+ suggestion: response.status === 403 ? "Check IAM permissions and ensure API is enabled" : "Verify project configuration and try again",
277
+ recoverable: true,
278
+ details: errorDetails
279
+ }
280
+ };
281
+ }
282
+ const data = await response.json();
283
+ return {
284
+ success: true,
285
+ data: {
286
+ connected: true,
287
+ statusCode: response.status,
288
+ url,
289
+ response: data
290
+ }
291
+ };
292
+ } catch (error) {
293
+ return {
294
+ success: false,
295
+ error: {
296
+ code: "CONNECTION_TEST_FAILED",
297
+ message: error instanceof Error ? error.message : String(error),
298
+ recoverable: false
299
+ }
300
+ };
301
+ }
302
+ }
303
+ }
304
+
305
+ // src/services/stitch/handler.ts
306
+ class StitchHandler {
307
+ executor;
308
+ iamService;
309
+ apiService;
310
+ connectionService;
311
+ constructor() {
312
+ this.executor = new GcloudExecutor;
313
+ this.iamService = new StitchIamService(this.executor);
314
+ this.apiService = new StitchApiService(this.executor);
315
+ this.connectionService = new StitchConnectionService;
316
+ }
317
+ async configureIAM(input) {
318
+ return this.iamService.configureIAM(input);
319
+ }
320
+ async enableAPI(input) {
321
+ return this.apiService.enableAPI(input);
322
+ }
323
+ async checkIAMRole(input) {
324
+ return this.iamService.checkIAMRole(input);
325
+ }
326
+ async checkAPIEnabled(input) {
327
+ return this.apiService.checkAPIEnabled(input);
328
+ }
329
+ async testConnectionWithApiKey(input) {
330
+ return this.connectionService.testConnectionWithApiKey(input);
331
+ }
332
+ async testConnection(input) {
333
+ return this.connectionService.testConnection(input);
334
+ }
335
+ }
336
+
337
+ // node_modules/ora/index.js
338
+ import process6 from "node:process";
339
+
340
+ // node_modules/ora/node_modules/cli-cursor/index.js
341
+ import process3 from "node:process";
342
+
343
+ // node_modules/ora/node_modules/restore-cursor/index.js
344
+ import process2 from "node:process";
345
+
346
+ // node_modules/mimic-function/index.js
347
+ var copyProperty = (to, from, property, ignoreNonConfigurable) => {
348
+ if (property === "length" || property === "prototype") {
349
+ return;
350
+ }
351
+ if (property === "arguments" || property === "caller") {
352
+ return;
353
+ }
354
+ const toDescriptor = Object.getOwnPropertyDescriptor(to, property);
355
+ const fromDescriptor = Object.getOwnPropertyDescriptor(from, property);
356
+ if (!canCopyProperty(toDescriptor, fromDescriptor) && ignoreNonConfigurable) {
357
+ return;
358
+ }
359
+ Object.defineProperty(to, property, fromDescriptor);
360
+ };
361
+ var canCopyProperty = function(toDescriptor, fromDescriptor) {
362
+ return toDescriptor === undefined || toDescriptor.configurable || toDescriptor.writable === fromDescriptor.writable && toDescriptor.enumerable === fromDescriptor.enumerable && toDescriptor.configurable === fromDescriptor.configurable && (toDescriptor.writable || toDescriptor.value === fromDescriptor.value);
363
+ };
364
+ var changePrototype = (to, from) => {
365
+ const fromPrototype = Object.getPrototypeOf(from);
366
+ if (fromPrototype === Object.getPrototypeOf(to)) {
367
+ return;
368
+ }
369
+ Object.setPrototypeOf(to, fromPrototype);
370
+ };
371
+ var wrappedToString = (withName, fromBody) => `/* Wrapped ${withName}*/
372
+ ${fromBody}`;
373
+ var toStringDescriptor = Object.getOwnPropertyDescriptor(Function.prototype, "toString");
374
+ var toStringName = Object.getOwnPropertyDescriptor(Function.prototype.toString, "name");
375
+ var changeToString = (to, from, name) => {
376
+ const withName = name === "" ? "" : `with ${name.trim()}() `;
377
+ const newToString = wrappedToString.bind(null, withName, from.toString());
378
+ Object.defineProperty(newToString, "name", toStringName);
379
+ const { writable, enumerable, configurable } = toStringDescriptor;
380
+ Object.defineProperty(to, "toString", { value: newToString, writable, enumerable, configurable });
381
+ };
382
+ function mimicFunction(to, from, { ignoreNonConfigurable = false } = {}) {
383
+ const { name } = to;
384
+ for (const property of Reflect.ownKeys(from)) {
385
+ copyProperty(to, from, property, ignoreNonConfigurable);
386
+ }
387
+ changePrototype(to, from);
388
+ changeToString(to, from, name);
389
+ return to;
390
+ }
391
+
392
+ // node_modules/onetime/index.js
393
+ var calledFunctions = new WeakMap;
394
+ var onetime = (function_, options = {}) => {
395
+ if (typeof function_ !== "function") {
396
+ throw new TypeError("Expected a function");
397
+ }
398
+ let returnValue;
399
+ let callCount = 0;
400
+ const functionName = function_.displayName || function_.name || "<anonymous>";
401
+ const onetime2 = function(...arguments_) {
402
+ calledFunctions.set(onetime2, ++callCount);
403
+ if (callCount === 1) {
404
+ returnValue = function_.apply(this, arguments_);
405
+ function_ = undefined;
406
+ } else if (options.throw === true) {
407
+ throw new Error(`Function \`${functionName}\` can only be called once`);
408
+ }
409
+ return returnValue;
410
+ };
411
+ mimicFunction(onetime2, function_);
412
+ calledFunctions.set(onetime2, callCount);
413
+ return onetime2;
414
+ };
415
+ onetime.callCount = (function_) => {
416
+ if (!calledFunctions.has(function_)) {
417
+ throw new Error(`The given function \`${function_.name}\` is not wrapped by the \`onetime\` package`);
418
+ }
419
+ return calledFunctions.get(function_);
420
+ };
421
+ var onetime_default = onetime;
422
+
423
+ // node_modules/ora/node_modules/restore-cursor/index.js
424
+ var terminal = process2.stderr.isTTY ? process2.stderr : process2.stdout.isTTY ? process2.stdout : undefined;
425
+ var restoreCursor = terminal ? onetime_default(() => {
426
+ onExit(() => {
427
+ terminal.write("\x1B[?25h");
428
+ }, { alwaysLast: true });
429
+ }) : () => {};
430
+ var restore_cursor_default = restoreCursor;
431
+
432
+ // node_modules/ora/node_modules/cli-cursor/index.js
433
+ var isHidden = false;
434
+ var cliCursor = {};
435
+ cliCursor.show = (writableStream = process3.stderr) => {
436
+ if (!writableStream.isTTY) {
437
+ return;
438
+ }
439
+ isHidden = false;
440
+ writableStream.write("\x1B[?25h");
441
+ };
442
+ cliCursor.hide = (writableStream = process3.stderr) => {
443
+ if (!writableStream.isTTY) {
444
+ return;
445
+ }
446
+ restore_cursor_default();
447
+ isHidden = true;
448
+ writableStream.write("\x1B[?25l");
449
+ };
450
+ cliCursor.toggle = (force, writableStream) => {
451
+ if (force !== undefined) {
452
+ isHidden = force;
453
+ }
454
+ if (isHidden) {
455
+ cliCursor.show(writableStream);
456
+ } else {
457
+ cliCursor.hide(writableStream);
458
+ }
459
+ };
460
+ var cli_cursor_default = cliCursor;
461
+
462
+ // node_modules/ora/index.js
463
+ var import_cli_spinners = __toESM(require_cli_spinners(), 1);
464
+
465
+ // node_modules/ora/node_modules/log-symbols/node_modules/is-unicode-supported/index.js
466
+ import process4 from "node:process";
467
+ function isUnicodeSupported2() {
468
+ if (process4.platform !== "win32") {
469
+ return process4.env.TERM !== "linux";
470
+ }
471
+ return Boolean(process4.env.CI) || Boolean(process4.env.WT_SESSION) || Boolean(process4.env.TERMINUS_SUBLIME) || process4.env.ConEmuTask === "{cmd::Cmder}" || process4.env.TERM_PROGRAM === "Terminus-Sublime" || process4.env.TERM_PROGRAM === "vscode" || process4.env.TERM === "xterm-256color" || process4.env.TERM === "alacritty" || process4.env.TERMINAL_EMULATOR === "JetBrains-JediTerm";
472
+ }
473
+
474
+ // node_modules/ora/node_modules/log-symbols/index.js
475
+ var main = {
476
+ info: source_default.blue("ℹ"),
477
+ success: source_default.green("✔"),
478
+ warning: source_default.yellow("⚠"),
479
+ error: source_default.red("✖")
480
+ };
481
+ var fallback = {
482
+ info: source_default.blue("i"),
483
+ success: source_default.green("√"),
484
+ warning: source_default.yellow("‼"),
485
+ error: source_default.red("×")
486
+ };
487
+ var logSymbols = isUnicodeSupported2() ? main : fallback;
488
+ var log_symbols_default = logSymbols;
489
+
490
+ // node_modules/ora/node_modules/ansi-regex/index.js
491
+ function ansiRegex({ onlyFirst = false } = {}) {
492
+ const ST = "(?:\\u0007|\\u001B\\u005C|\\u009C)";
493
+ const osc = `(?:\\u001B\\][\\s\\S]*?${ST})`;
494
+ const csi = "[\\u001B\\u009B][[\\]()#;?]*(?:\\d{1,4}(?:[;:]\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]";
495
+ const pattern = `${osc}|${csi}`;
496
+ return new RegExp(pattern, onlyFirst ? undefined : "g");
497
+ }
498
+
499
+ // node_modules/ora/node_modules/strip-ansi/index.js
500
+ var regex = ansiRegex();
501
+ function stripAnsi(string) {
502
+ if (typeof string !== "string") {
503
+ throw new TypeError(`Expected a \`string\`, got \`${typeof string}\``);
504
+ }
505
+ if (!string.includes("\x1B") && !string.includes("›")) {
506
+ return string;
507
+ }
508
+ return string.replace(regex, "");
509
+ }
510
+
511
+ // node_modules/ora/node_modules/string-width/index.js
512
+ var import_emoji_regex = __toESM(require_emoji_regex(), 1);
513
+ var segmenter = new Intl.Segmenter;
514
+ var defaultIgnorableCodePointRegex = /^\p{Default_Ignorable_Code_Point}$/u;
515
+ function stringWidth(string, options = {}) {
516
+ if (typeof string !== "string" || string.length === 0) {
517
+ return 0;
518
+ }
519
+ const {
520
+ ambiguousIsNarrow = true,
521
+ countAnsiEscapeCodes = false
522
+ } = options;
523
+ if (!countAnsiEscapeCodes) {
524
+ string = stripAnsi(string);
525
+ }
526
+ if (string.length === 0) {
527
+ return 0;
528
+ }
529
+ let width = 0;
530
+ const eastAsianWidthOptions = { ambiguousAsWide: !ambiguousIsNarrow };
531
+ for (const { segment: character } of segmenter.segment(string)) {
532
+ const codePoint = character.codePointAt(0);
533
+ if (codePoint <= 31 || codePoint >= 127 && codePoint <= 159) {
534
+ continue;
535
+ }
536
+ if (codePoint >= 8203 && codePoint <= 8207 || codePoint === 65279) {
537
+ continue;
538
+ }
539
+ if (codePoint >= 768 && codePoint <= 879 || codePoint >= 6832 && codePoint <= 6911 || codePoint >= 7616 && codePoint <= 7679 || codePoint >= 8400 && codePoint <= 8447 || codePoint >= 65056 && codePoint <= 65071) {
540
+ continue;
541
+ }
542
+ if (codePoint >= 55296 && codePoint <= 57343) {
543
+ continue;
544
+ }
545
+ if (codePoint >= 65024 && codePoint <= 65039) {
546
+ continue;
547
+ }
548
+ if (defaultIgnorableCodePointRegex.test(character)) {
549
+ continue;
550
+ }
551
+ if (import_emoji_regex.default().test(character)) {
552
+ width += 2;
553
+ continue;
554
+ }
555
+ width += eastAsianWidth(codePoint, eastAsianWidthOptions);
556
+ }
557
+ return width;
558
+ }
559
+
560
+ // node_modules/is-interactive/index.js
561
+ function isInteractive({ stream = process.stdout } = {}) {
562
+ return Boolean(stream && stream.isTTY && process.env.TERM !== "dumb" && !("CI" in process.env));
563
+ }
564
+
565
+ // node_modules/stdin-discarder/index.js
566
+ import process5 from "node:process";
567
+ var ASCII_ETX_CODE = 3;
568
+
569
+ class StdinDiscarder {
570
+ #activeCount = 0;
571
+ start() {
572
+ this.#activeCount++;
573
+ if (this.#activeCount === 1) {
574
+ this.#realStart();
575
+ }
576
+ }
577
+ stop() {
578
+ if (this.#activeCount <= 0) {
579
+ throw new Error("`stop` called more times than `start`");
580
+ }
581
+ this.#activeCount--;
582
+ if (this.#activeCount === 0) {
583
+ this.#realStop();
584
+ }
585
+ }
586
+ #realStart() {
587
+ if (process5.platform === "win32" || !process5.stdin.isTTY) {
588
+ return;
589
+ }
590
+ process5.stdin.setRawMode(true);
591
+ process5.stdin.on("data", this.#handleInput);
592
+ process5.stdin.resume();
593
+ }
594
+ #realStop() {
595
+ if (!process5.stdin.isTTY) {
596
+ return;
597
+ }
598
+ process5.stdin.off("data", this.#handleInput);
599
+ process5.stdin.pause();
600
+ process5.stdin.setRawMode(false);
601
+ }
602
+ #handleInput(chunk) {
603
+ if (chunk[0] === ASCII_ETX_CODE) {
604
+ process5.emit("SIGINT");
605
+ }
606
+ }
607
+ }
608
+ var stdinDiscarder = new StdinDiscarder;
609
+ var stdin_discarder_default = stdinDiscarder;
610
+
611
+ // node_modules/ora/index.js
612
+ var import_cli_spinners2 = __toESM(require_cli_spinners(), 1);
613
+
614
+ class Ora {
615
+ #linesToClear = 0;
616
+ #isDiscardingStdin = false;
617
+ #lineCount = 0;
618
+ #frameIndex = -1;
619
+ #lastSpinnerFrameTime = 0;
620
+ #options;
621
+ #spinner;
622
+ #stream;
623
+ #id;
624
+ #initialInterval;
625
+ #isEnabled;
626
+ #isSilent;
627
+ #indent;
628
+ #text;
629
+ #prefixText;
630
+ #suffixText;
631
+ color;
632
+ constructor(options) {
633
+ if (typeof options === "string") {
634
+ options = {
635
+ text: options
636
+ };
637
+ }
638
+ this.#options = {
639
+ color: "cyan",
640
+ stream: process6.stderr,
641
+ discardStdin: true,
642
+ hideCursor: true,
643
+ ...options
644
+ };
645
+ this.color = this.#options.color;
646
+ this.spinner = this.#options.spinner;
647
+ this.#initialInterval = this.#options.interval;
648
+ this.#stream = this.#options.stream;
649
+ this.#isEnabled = typeof this.#options.isEnabled === "boolean" ? this.#options.isEnabled : isInteractive({ stream: this.#stream });
650
+ this.#isSilent = typeof this.#options.isSilent === "boolean" ? this.#options.isSilent : false;
651
+ this.text = this.#options.text;
652
+ this.prefixText = this.#options.prefixText;
653
+ this.suffixText = this.#options.suffixText;
654
+ this.indent = this.#options.indent;
655
+ if (process6.env.NODE_ENV === "test") {
656
+ this._stream = this.#stream;
657
+ this._isEnabled = this.#isEnabled;
658
+ Object.defineProperty(this, "_linesToClear", {
659
+ get() {
660
+ return this.#linesToClear;
661
+ },
662
+ set(newValue) {
663
+ this.#linesToClear = newValue;
664
+ }
665
+ });
666
+ Object.defineProperty(this, "_frameIndex", {
667
+ get() {
668
+ return this.#frameIndex;
669
+ }
670
+ });
671
+ Object.defineProperty(this, "_lineCount", {
672
+ get() {
673
+ return this.#lineCount;
674
+ }
675
+ });
676
+ }
677
+ }
678
+ get indent() {
679
+ return this.#indent;
680
+ }
681
+ set indent(indent = 0) {
682
+ if (!(indent >= 0 && Number.isInteger(indent))) {
683
+ throw new Error("The `indent` option must be an integer from 0 and up");
684
+ }
685
+ this.#indent = indent;
686
+ this.#updateLineCount();
687
+ }
688
+ get interval() {
689
+ return this.#initialInterval ?? this.#spinner.interval ?? 100;
690
+ }
691
+ get spinner() {
692
+ return this.#spinner;
693
+ }
694
+ set spinner(spinner) {
695
+ this.#frameIndex = -1;
696
+ this.#initialInterval = undefined;
697
+ if (typeof spinner === "object") {
698
+ if (spinner.frames === undefined) {
699
+ throw new Error("The given spinner must have a `frames` property");
700
+ }
701
+ this.#spinner = spinner;
702
+ } else if (!isUnicodeSupported()) {
703
+ this.#spinner = import_cli_spinners.default.line;
704
+ } else if (spinner === undefined) {
705
+ this.#spinner = import_cli_spinners.default.dots;
706
+ } else if (spinner !== "default" && import_cli_spinners.default[spinner]) {
707
+ this.#spinner = import_cli_spinners.default[spinner];
708
+ } else {
709
+ throw new Error(`There is no built-in spinner named '${spinner}'. See https://github.com/sindresorhus/cli-spinners/blob/main/spinners.json for a full list.`);
710
+ }
711
+ }
712
+ get text() {
713
+ return this.#text;
714
+ }
715
+ set text(value = "") {
716
+ this.#text = value;
717
+ this.#updateLineCount();
718
+ }
719
+ get prefixText() {
720
+ return this.#prefixText;
721
+ }
722
+ set prefixText(value = "") {
723
+ this.#prefixText = value;
724
+ this.#updateLineCount();
725
+ }
726
+ get suffixText() {
727
+ return this.#suffixText;
728
+ }
729
+ set suffixText(value = "") {
730
+ this.#suffixText = value;
731
+ this.#updateLineCount();
732
+ }
733
+ get isSpinning() {
734
+ return this.#id !== undefined;
735
+ }
736
+ #getFullPrefixText(prefixText = this.#prefixText, postfix = " ") {
737
+ if (typeof prefixText === "string" && prefixText !== "") {
738
+ return prefixText + postfix;
739
+ }
740
+ if (typeof prefixText === "function") {
741
+ return prefixText() + postfix;
742
+ }
743
+ return "";
744
+ }
745
+ #getFullSuffixText(suffixText = this.#suffixText, prefix = " ") {
746
+ if (typeof suffixText === "string" && suffixText !== "") {
747
+ return prefix + suffixText;
748
+ }
749
+ if (typeof suffixText === "function") {
750
+ return prefix + suffixText();
751
+ }
752
+ return "";
753
+ }
754
+ #updateLineCount() {
755
+ const columns = this.#stream.columns ?? 80;
756
+ const fullPrefixText = this.#getFullPrefixText(this.#prefixText, "-");
757
+ const fullSuffixText = this.#getFullSuffixText(this.#suffixText, "-");
758
+ const fullText = " ".repeat(this.#indent) + fullPrefixText + "--" + this.#text + "--" + fullSuffixText;
759
+ this.#lineCount = 0;
760
+ for (const line of stripAnsi(fullText).split(`
761
+ `)) {
762
+ this.#lineCount += Math.max(1, Math.ceil(stringWidth(line, { countAnsiEscapeCodes: true }) / columns));
763
+ }
764
+ }
765
+ get isEnabled() {
766
+ return this.#isEnabled && !this.#isSilent;
767
+ }
768
+ set isEnabled(value) {
769
+ if (typeof value !== "boolean") {
770
+ throw new TypeError("The `isEnabled` option must be a boolean");
771
+ }
772
+ this.#isEnabled = value;
773
+ }
774
+ get isSilent() {
775
+ return this.#isSilent;
776
+ }
777
+ set isSilent(value) {
778
+ if (typeof value !== "boolean") {
779
+ throw new TypeError("The `isSilent` option must be a boolean");
780
+ }
781
+ this.#isSilent = value;
782
+ }
783
+ frame() {
784
+ const now = Date.now();
785
+ if (this.#frameIndex === -1 || now - this.#lastSpinnerFrameTime >= this.interval) {
786
+ this.#frameIndex = ++this.#frameIndex % this.#spinner.frames.length;
787
+ this.#lastSpinnerFrameTime = now;
788
+ }
789
+ const { frames } = this.#spinner;
790
+ let frame = frames[this.#frameIndex];
791
+ if (this.color) {
792
+ frame = source_default[this.color](frame);
793
+ }
794
+ const fullPrefixText = typeof this.#prefixText === "string" && this.#prefixText !== "" ? this.#prefixText + " " : "";
795
+ const fullText = typeof this.text === "string" ? " " + this.text : "";
796
+ const fullSuffixText = typeof this.#suffixText === "string" && this.#suffixText !== "" ? " " + this.#suffixText : "";
797
+ return fullPrefixText + frame + fullText + fullSuffixText;
798
+ }
799
+ clear() {
800
+ if (!this.#isEnabled || !this.#stream.isTTY) {
801
+ return this;
802
+ }
803
+ this.#stream.cursorTo(0);
804
+ for (let index = 0;index < this.#linesToClear; index++) {
805
+ if (index > 0) {
806
+ this.#stream.moveCursor(0, -1);
807
+ }
808
+ this.#stream.clearLine(1);
809
+ }
810
+ if (this.#indent || this.lastIndent !== this.#indent) {
811
+ this.#stream.cursorTo(this.#indent);
812
+ }
813
+ this.lastIndent = this.#indent;
814
+ this.#linesToClear = 0;
815
+ return this;
816
+ }
817
+ render() {
818
+ if (this.#isSilent) {
819
+ return this;
820
+ }
821
+ this.clear();
822
+ this.#stream.write(this.frame());
823
+ this.#linesToClear = this.#lineCount;
824
+ return this;
825
+ }
826
+ start(text) {
827
+ if (text) {
828
+ this.text = text;
829
+ }
830
+ if (this.#isSilent) {
831
+ return this;
832
+ }
833
+ if (!this.#isEnabled) {
834
+ if (this.text) {
835
+ this.#stream.write(`- ${this.text}
836
+ `);
837
+ }
838
+ return this;
839
+ }
840
+ if (this.isSpinning) {
841
+ return this;
842
+ }
843
+ if (this.#options.hideCursor) {
844
+ cli_cursor_default.hide(this.#stream);
845
+ }
846
+ if (this.#options.discardStdin && process6.stdin.isTTY) {
847
+ this.#isDiscardingStdin = true;
848
+ stdin_discarder_default.start();
849
+ }
850
+ this.render();
851
+ this.#id = setInterval(this.render.bind(this), this.interval);
852
+ return this;
853
+ }
854
+ stop() {
855
+ if (!this.#isEnabled) {
856
+ return this;
857
+ }
858
+ clearInterval(this.#id);
859
+ this.#id = undefined;
860
+ this.#frameIndex = 0;
861
+ this.clear();
862
+ if (this.#options.hideCursor) {
863
+ cli_cursor_default.show(this.#stream);
864
+ }
865
+ if (this.#options.discardStdin && process6.stdin.isTTY && this.#isDiscardingStdin) {
866
+ stdin_discarder_default.stop();
867
+ this.#isDiscardingStdin = false;
868
+ }
869
+ return this;
870
+ }
871
+ succeed(text) {
872
+ return this.stopAndPersist({ symbol: log_symbols_default.success, text });
873
+ }
874
+ fail(text) {
875
+ return this.stopAndPersist({ symbol: log_symbols_default.error, text });
876
+ }
877
+ warn(text) {
878
+ return this.stopAndPersist({ symbol: log_symbols_default.warning, text });
879
+ }
880
+ info(text) {
881
+ return this.stopAndPersist({ symbol: log_symbols_default.info, text });
882
+ }
883
+ stopAndPersist(options = {}) {
884
+ if (this.#isSilent) {
885
+ return this;
886
+ }
887
+ const prefixText = options.prefixText ?? this.#prefixText;
888
+ const fullPrefixText = this.#getFullPrefixText(prefixText, " ");
889
+ const symbolText = options.symbol ?? " ";
890
+ const text = options.text ?? this.text;
891
+ const separatorText = symbolText ? " " : "";
892
+ const fullText = typeof text === "string" ? separatorText + text : "";
893
+ const suffixText = options.suffixText ?? this.#suffixText;
894
+ const fullSuffixText = this.#getFullSuffixText(suffixText, " ");
895
+ const textToWrite = fullPrefixText + symbolText + fullText + fullSuffixText + `
896
+ `;
897
+ this.stop();
898
+ this.#stream.write(textToWrite);
899
+ return this;
900
+ }
901
+ }
902
+ function ora(options) {
903
+ return new Ora(options);
904
+ }
905
+
906
+ // src/ui/spinner.ts
907
+ class Spinner {
908
+ spinner = null;
909
+ start(message) {
910
+ this.spinner = ora({
911
+ text: message,
912
+ color: "blue",
913
+ spinner: "dots"
914
+ }).start();
915
+ }
916
+ succeed(message) {
917
+ if (this.spinner) {
918
+ this.spinner.succeed(message);
919
+ this.spinner = null;
920
+ }
921
+ }
922
+ fail(message) {
923
+ if (this.spinner) {
924
+ this.spinner.fail(message);
925
+ this.spinner = null;
926
+ }
927
+ }
928
+ stop() {
929
+ if (this.spinner) {
930
+ this.spinner.stop();
931
+ this.spinner = null;
932
+ }
933
+ }
934
+ }
935
+ function createSpinner() {
936
+ return new Spinner;
937
+ }
938
+
939
+ export { StitchHandler, createSpinner };
940
+
941
+ //# debugId=4DBCFC88D5528EA464756E2164756E21