@_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
@@ -1,20 +1,19 @@
1
1
  import {
2
2
  InitHandler
3
- } from "./chunk-v7117ywx.js";
4
- import"./chunk-sdp429xd.js";
5
- import"./chunk-z9d2xc83.js";
3
+ } from "./chunk-rvq1vb70.js";
4
+ import"./chunk-sw7h7asn.js";
5
+ import"./chunk-cwqdka8y.js";
6
6
  import"./chunk-nq68kghz.js";
7
- import"./chunk-mv9ssgmx.js";
7
+ import"./chunk-54wv5ptt.js";
8
8
  import"./chunk-f2hq6bfv.js";
9
- import"./chunk-nthabjd9.js";
10
9
  import"./chunk-4jygt4d6.js";
11
10
  import"./chunk-tz7wnw4s.js";
12
11
  import"./chunk-kbtqrkwh.js";
13
12
  import"./chunk-3sfn889r.js";
14
- import"./chunk-2k7n0w2x.js";
13
+ import"./chunk-c6ge431q.js";
15
14
  import"./chunk-9wyra8hs.js";
16
15
  export {
17
16
  InitHandler
18
17
  };
19
18
 
20
- //# debugId=8B9766FC1E9BEF0464756E2164756E21
19
+ //# debugId=383410DAD74C59F864756E2164756E21
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [
5
+ ],
6
+ "mappings": "",
7
+ "debugId": "383410DAD74C59F864756E2164756E21",
8
+ "names": []
9
+ }
@@ -0,0 +1,20 @@
1
+ // src/commands/site/utils/fetchWithRetry.ts
2
+ async function fetchWithRetry(url, maxRetries = 4, maxBackoffMs = 8000) {
3
+ for (let attempt = 0;attempt <= maxRetries; attempt++) {
4
+ const response = await fetch(url);
5
+ if (response.ok) {
6
+ return await response.text();
7
+ }
8
+ if (response.status === 429 && attempt < maxRetries) {
9
+ const backoff = Math.min(1000 * 2 ** attempt, maxBackoffMs);
10
+ await new Promise((r) => setTimeout(r, backoff));
11
+ continue;
12
+ }
13
+ throw new Error(`Failed to fetch content: ${response.statusText}`);
14
+ }
15
+ throw new Error(`Failed to fetch content after ${maxRetries + 1} attempts`);
16
+ }
17
+
18
+ export { fetchWithRetry };
19
+
20
+ //# debugId=F07D33AA3782D0A764756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/commands/site/utils/fetchWithRetry.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Fetches text content from a URL with exponential backoff retry on 429 (Too Many Requests).\n * Non-429 errors are thrown immediately without retrying.\n *\n * @param url - The URL to fetch\n * @param maxRetries - Maximum number of retries (default: 4, so 5 total attempts)\n * @param maxBackoffMs - Maximum backoff delay in ms (default: 8000)\n * @returns The response body as text\n */\nexport async function fetchWithRetry(\n url: string,\n maxRetries = 4,\n maxBackoffMs = 8000,\n): Promise<string> {\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n const response = await fetch(url);\n\n if (response.ok) {\n return await response.text();\n }\n\n if (response.status === 429 && attempt < maxRetries) {\n const backoff = Math.min(1000 * 2 ** attempt, maxBackoffMs);\n await new Promise(r => setTimeout(r, backoff));\n continue;\n }\n\n throw new Error(`Failed to fetch content: ${response.statusText}`);\n }\n\n throw new Error(`Failed to fetch content after ${maxRetries + 1} attempts`);\n}\n"
6
+ ],
7
+ "mappings": ";AASA,eAAsB,cAAc,CAClC,KACA,aAAa,GACb,eAAe,MACE;AAAA,EACjB,SAAS,UAAU,EAAG,WAAW,YAAY,WAAW;AAAA,IACtD,MAAM,WAAW,MAAM,MAAM,GAAG;AAAA,IAEhC,IAAI,SAAS,IAAI;AAAA,MACf,OAAO,MAAM,SAAS,KAAK;AAAA,IAC7B;AAAA,IAEA,IAAI,SAAS,WAAW,OAAO,UAAU,YAAY;AAAA,MACnD,MAAM,UAAU,KAAK,IAAI,OAAO,KAAK,SAAS,YAAY;AAAA,MAC1D,MAAM,IAAI,QAAQ,OAAK,WAAW,GAAG,OAAO,CAAC;AAAA,MAC7C;AAAA,IACF;AAAA,IAEA,MAAM,IAAI,MAAM,4BAA4B,SAAS,YAAY;AAAA,EACnE;AAAA,EAEA,MAAM,IAAI,MAAM,iCAAiC,aAAa,YAAY;AAAA;",
8
+ "debugId": "F07D33AA3782D0A764756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,39 @@
1
+ import {
2
+ pLimit
3
+ } from "./chunk-a5xra9jn.js";
4
+ import"./chunk-9wyra8hs.js";
5
+
6
+ // src/commands/serve/handler.ts
7
+ class ServeHandler {
8
+ stitch;
9
+ constructor(stitch) {
10
+ this.stitch = stitch;
11
+ }
12
+ async execute(projectId) {
13
+ try {
14
+ const project = this.stitch.project(projectId);
15
+ const screens = await project.screens();
16
+ const limit = pLimit(3);
17
+ const withHtml = await Promise.all(screens.map((s) => limit(async () => ({
18
+ screenId: s.screenId,
19
+ title: s.title ?? s.screenId,
20
+ codeUrl: await s.getHtml()
21
+ }))));
22
+ const filtered = withHtml.filter((s) => s.codeUrl !== null);
23
+ filtered.sort((a, b) => a.title.localeCompare(b.title));
24
+ return {
25
+ success: true,
26
+ projectId,
27
+ projectTitle: project.data?.title ?? projectId,
28
+ screens: filtered
29
+ };
30
+ } catch (e) {
31
+ return { success: false, error: e.message };
32
+ }
33
+ }
34
+ }
35
+ export {
36
+ ServeHandler
37
+ };
38
+
39
+ //# debugId=1093F49EB96B9D0D64756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/commands/serve/handler.ts"],
4
+ "sourcesContent": [
5
+ "import type { Stitch } from '@google/stitch-sdk';\nimport pLimit from 'p-limit';\n\ninterface CodeScreen {\n screenId: string;\n title: string;\n codeUrl: string;\n}\n\ntype ServeHandlerResult = {\n success: true;\n projectId: string;\n projectTitle: string;\n screens: CodeScreen[];\n} | {\n success: false;\n error: string;\n};\n\nexport class ServeHandler {\n constructor(private readonly stitch: Stitch) {}\n\n async execute(projectId: string): Promise<ServeHandlerResult> {\n try {\n const project = this.stitch.project(projectId);\n const screens = await project.screens();\n\n // Throttle concurrent API calls\n const limit = pLimit(3);\n const withHtml = await Promise.all(\n screens.map((s: any) => limit(async () => ({\n screenId: s.screenId,\n title: s.title ?? s.screenId,\n codeUrl: await s.getHtml(),\n })))\n );\n\n const filtered = withHtml.filter(s => s.codeUrl !== null);\n\n // Sort alphabetically by title\n filtered.sort((a, b) => a.title.localeCompare(b.title));\n\n return {\n success: true,\n projectId,\n projectTitle: project.data?.title ?? projectId,\n screens: filtered,\n };\n } catch (e: any) {\n return { success: false, error: e.message };\n }\n }\n}\n"
6
+ ],
7
+ "mappings": ";;;;;;AAmBO,MAAM,aAAa;AAAA,EACK;AAAA,EAA7B,WAAW,CAAkB,QAAgB;AAAA,IAAhB;AAAA;AAAA,OAEvB,QAAO,CAAC,WAAgD;AAAA,IAC5D,IAAI;AAAA,MACF,MAAM,UAAU,KAAK,OAAO,QAAQ,SAAS;AAAA,MAC7C,MAAM,UAAU,MAAM,QAAQ,QAAQ;AAAA,MAGtC,MAAM,QAAQ,OAAO,CAAC;AAAA,MACtB,MAAM,WAAW,MAAM,QAAQ,IAC7B,QAAQ,IAAI,CAAC,MAAW,MAAM,aAAa;AAAA,QACzC,UAAU,EAAE;AAAA,QACZ,OAAO,EAAE,SAAS,EAAE;AAAA,QACpB,SAAS,MAAM,EAAE,QAAQ;AAAA,MAC3B,EAAE,CAAC,CACL;AAAA,MAEA,MAAM,WAAW,SAAS,OAAO,OAAK,EAAE,YAAY,IAAI;AAAA,MAGxD,SAAS,KAAK,CAAC,GAAG,MAAM,EAAE,MAAM,cAAc,EAAE,KAAK,CAAC;AAAA,MAEtD,OAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,QACA,cAAc,QAAQ,MAAM,SAAS;AAAA,QACrC,SAAS;AAAA,MACX;AAAA,MACA,OAAO,GAAQ;AAAA,MACf,OAAO,EAAE,SAAS,OAAO,OAAO,EAAE,QAAQ;AAAA;AAAA;AAGhD;",
8
+ "debugId": "1093F49EB96B9D0D64756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,273 @@
1
+ import {
2
+ openUrl,
3
+ require_jsx_dev_runtime
4
+ } from "./chunk-krfqppg2.js";
5
+ import {
6
+ StitchViteServer
7
+ } from "./chunk-dyp9t5wf.js";
8
+ import"./chunk-abf1r0jh.js";
9
+ import {
10
+ Box_default,
11
+ Text,
12
+ use_app_default,
13
+ use_input_default
14
+ } from "./chunk-7y4xzvkz.js";
15
+ import {
16
+ require_react
17
+ } from "./chunk-4jwmvjb4.js";
18
+ import {
19
+ downloadText
20
+ } from "./chunk-34w2wfyp.js";
21
+ import {
22
+ clipboardy_default
23
+ } from "./chunk-akd997ec.js";
24
+ import"./chunk-q6sv0243.js";
25
+ import"./chunk-4jygt4d6.js";
26
+ import"./chunk-tz7wnw4s.js";
27
+ import"./chunk-3sfn889r.js";
28
+ import {
29
+ __toESM
30
+ } from "./chunk-9wyra8hs.js";
31
+
32
+ // src/commands/screens/ScreensView.tsx
33
+ var import_react = __toESM(require_react(), 1);
34
+ var jsx_dev_runtime = __toESM(require_jsx_dev_runtime(), 1);
35
+ function ScreensView({ projectId, projectTitle, screens }) {
36
+ const { exit } = use_app_default();
37
+ const [selectedIndex, setSelectedIndex] = import_react.useState(0);
38
+ const [windowStart, setWindowStart] = import_react.useState(0);
39
+ const [status, setStatus] = import_react.useState("");
40
+ const [serverUrl, setServerUrl] = import_react.useState(null);
41
+ const serverRef = import_react.useRef(null);
42
+ const VIEW_HEIGHT = 10;
43
+ import_react.default.useEffect(() => {
44
+ if (selectedIndex < windowStart) {
45
+ setWindowStart(selectedIndex);
46
+ } else if (selectedIndex >= windowStart + VIEW_HEIGHT) {
47
+ setWindowStart(selectedIndex - VIEW_HEIGHT + 1);
48
+ }
49
+ }, [selectedIndex, windowStart, VIEW_HEIGHT]);
50
+ import_react.useEffect(() => {
51
+ return () => {
52
+ if (serverRef.current)
53
+ serverRef.current.stop();
54
+ };
55
+ }, []);
56
+ async function serveScreen(screen) {
57
+ if (!screen.hasCode || !screen.codeUrl) {
58
+ setStatus("No HTML to serve");
59
+ return;
60
+ }
61
+ setStatus("Preparing server...");
62
+ let srv = serverRef.current;
63
+ let url = serverUrl;
64
+ let justStarted = false;
65
+ if (!srv) {
66
+ srv = new StitchViteServer;
67
+ url = await srv.start(0);
68
+ serverRef.current = srv;
69
+ setServerUrl(url);
70
+ justStarted = true;
71
+ }
72
+ if (!url)
73
+ return;
74
+ try {
75
+ const html = await downloadText(screen.codeUrl);
76
+ const route = `/screens/${screen.screenId}`;
77
+ srv.mount(route, html);
78
+ const fullUrl = `${url}${route}`;
79
+ if (justStarted) {
80
+ openUrl(fullUrl);
81
+ } else {
82
+ srv.navigate(fullUrl);
83
+ }
84
+ setStatus(`Serving at ${fullUrl}`);
85
+ } catch (e) {
86
+ setStatus("Error serving screen");
87
+ }
88
+ }
89
+ use_input_default((input, key) => {
90
+ if (input === "q") {
91
+ exit();
92
+ return;
93
+ }
94
+ if (key.upArrow || input === "k") {
95
+ setSelectedIndex((prev) => Math.max(0, prev - 1));
96
+ setStatus("");
97
+ }
98
+ if (key.downArrow || input === "j") {
99
+ setSelectedIndex((prev) => Math.min(screens.length - 1, prev + 1));
100
+ setStatus("");
101
+ }
102
+ if (input === "c") {
103
+ const screen = screens[selectedIndex];
104
+ if (screen?.hasCode && screen.codeUrl) {
105
+ setStatus("Copying...");
106
+ downloadText(screen.codeUrl).then((code) => {
107
+ clipboardy_default.write(code);
108
+ setStatus("HTML copied!");
109
+ }).catch(() => setStatus("Failed to copy"));
110
+ } else {
111
+ setStatus("No HTML available");
112
+ }
113
+ }
114
+ if (input === "i") {
115
+ const screen = screens[selectedIndex];
116
+ if (screen?.hasImage) {
117
+ setStatus("Image copy not implemented");
118
+ } else {
119
+ setStatus("No image available");
120
+ }
121
+ }
122
+ if (input === "s") {
123
+ const screen = screens[selectedIndex];
124
+ if (screen) {
125
+ serveScreen(screen);
126
+ }
127
+ }
128
+ });
129
+ const visibleScreens = screens.slice(windowStart, windowStart + VIEW_HEIGHT);
130
+ return /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Box_default, {
131
+ flexDirection: "column",
132
+ padding: 1,
133
+ children: [
134
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
135
+ bold: true,
136
+ children: [
137
+ projectTitle,
138
+ " (",
139
+ screens.length,
140
+ " screens)"
141
+ ]
142
+ }, undefined, true, undefined, this),
143
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
144
+ dimColor: true,
145
+ children: [
146
+ "projectId: ",
147
+ projectId
148
+ ]
149
+ }, undefined, true, undefined, this),
150
+ serverUrl && /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
151
+ dimColor: true,
152
+ children: [
153
+ "Server: ",
154
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
155
+ color: "green",
156
+ children: serverUrl
157
+ }, undefined, false, undefined, this)
158
+ ]
159
+ }, undefined, true, undefined, this),
160
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
161
+ children: " "
162
+ }, undefined, false, undefined, this),
163
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Box_default, {
164
+ flexDirection: "column",
165
+ borderStyle: "single",
166
+ borderColor: "yellow",
167
+ paddingX: 1,
168
+ children: [
169
+ windowStart > 0 && /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
170
+ dimColor: true,
171
+ children: [
172
+ "... ",
173
+ windowStart,
174
+ " more above ..."
175
+ ]
176
+ }, undefined, true, undefined, this),
177
+ visibleScreens.map((screen, index) => {
178
+ const absoluteIndex = windowStart + index;
179
+ const isSelected = absoluteIndex === selectedIndex;
180
+ const num = String(absoluteIndex + 1).padStart(2, " ");
181
+ const selector = isSelected ? "▸" : " ";
182
+ return /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Box_default, {
183
+ flexDirection: "column",
184
+ children: [
185
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Box_default, {
186
+ justifyContent: "space-between",
187
+ children: [
188
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Box_default, {
189
+ children: [
190
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
191
+ dimColor: true,
192
+ children: num
193
+ }, undefined, false, undefined, this),
194
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
195
+ color: isSelected ? "cyan" : undefined,
196
+ children: [
197
+ " ",
198
+ selector,
199
+ " "
200
+ ]
201
+ }, undefined, true, undefined, this),
202
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
203
+ color: isSelected ? "cyan" : undefined,
204
+ bold: isSelected,
205
+ children: screen.title.slice(0, 28)
206
+ }, undefined, false, undefined, this)
207
+ ]
208
+ }, undefined, true, undefined, this),
209
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Box_default, {
210
+ children: [
211
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
212
+ dimColor: true,
213
+ children: "html"
214
+ }, undefined, false, undefined, this),
215
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
216
+ color: screen.hasCode ? "green" : "gray",
217
+ children: screen.hasCode ? "[✓]" : "[ ]"
218
+ }, undefined, false, undefined, this),
219
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
220
+ children: " "
221
+ }, undefined, false, undefined, this),
222
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
223
+ dimColor: true,
224
+ children: "img"
225
+ }, undefined, false, undefined, this),
226
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
227
+ color: screen.hasImage ? "green" : "gray",
228
+ children: screen.hasImage ? "[✓]" : "[ ]"
229
+ }, undefined, false, undefined, this)
230
+ ]
231
+ }, undefined, true, undefined, this)
232
+ ]
233
+ }, undefined, true, undefined, this),
234
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
235
+ dimColor: true,
236
+ color: "gray",
237
+ children: [
238
+ " screenId: ",
239
+ screen.screenId
240
+ ]
241
+ }, undefined, true, undefined, this),
242
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
243
+ children: " "
244
+ }, undefined, false, undefined, this)
245
+ ]
246
+ }, screen.screenId, true, undefined, this);
247
+ }),
248
+ windowStart + VIEW_HEIGHT < screens.length && /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
249
+ dimColor: true,
250
+ children: [
251
+ "... ",
252
+ screens.length - (windowStart + VIEW_HEIGHT),
253
+ " more below ..."
254
+ ]
255
+ }, undefined, true, undefined, this)
256
+ ]
257
+ }, undefined, true, undefined, this),
258
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
259
+ dimColor: true,
260
+ children: "[c]opy html [i]mage [s]erve [q]uit"
261
+ }, undefined, false, undefined, this),
262
+ status && /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Text, {
263
+ color: "yellow",
264
+ children: status
265
+ }, undefined, false, undefined, this)
266
+ ]
267
+ }, undefined, true, undefined, this);
268
+ }
269
+ export {
270
+ ScreensView
271
+ };
272
+
273
+ //# debugId=A890852E888CB14764756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/commands/screens/ScreensView.tsx"],
4
+ "sourcesContent": [
5
+ "import React, { useState, useEffect, useRef } from 'react';\nimport { Box, Text, useInput, useApp } from 'ink';\nimport { downloadText } from '../../ui/copy-behaviors/clipboard.js';\nimport clipboard from 'clipboardy';\nimport { StitchViteServer } from '../../lib/server/vite/StitchViteServer.js';\nimport { openUrl } from '../../platform/browser.js';\n\ninterface Screen {\n screenId: string;\n title: string;\n hasCode: boolean;\n codeUrl: string | null;\n hasImage: boolean;\n}\n\ninterface ScreensViewProps {\n projectId: string;\n projectTitle: string;\n screens: Screen[];\n}\n\nexport function ScreensView({ projectId, projectTitle, screens }: ScreensViewProps) {\n const { exit } = useApp();\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [windowStart, setWindowStart] = useState(0);\n const [status, setStatus] = useState('');\n const [serverUrl, setServerUrl] = useState<string | null>(null);\n\n const serverRef = useRef<StitchViteServer | null>(null);\n\n const VIEW_HEIGHT = 10;\n\n // Helper to sync window with selection\n React.useEffect(() => {\n if (selectedIndex < windowStart) {\n setWindowStart(selectedIndex);\n } else if (selectedIndex >= windowStart + VIEW_HEIGHT) {\n setWindowStart(selectedIndex - VIEW_HEIGHT + 1);\n }\n }, [selectedIndex, windowStart, VIEW_HEIGHT]);\n\n useEffect(() => {\n return () => {\n if (serverRef.current) serverRef.current.stop();\n };\n }, []);\n\n async function serveScreen(screen: Screen) {\n if (!screen.hasCode || !screen.codeUrl) {\n setStatus('No HTML to serve');\n return;\n }\n\n setStatus('Preparing server...');\n let srv = serverRef.current;\n let url = serverUrl;\n let justStarted = false;\n\n if (!srv) {\n srv = new StitchViteServer();\n url = await srv.start(0);\n serverRef.current = srv;\n setServerUrl(url);\n justStarted = true;\n }\n\n if (!url) return; // Should not happen\n\n try {\n const html = await downloadText(screen.codeUrl);\n const route = `/screens/${screen.screenId}`;\n srv.mount(route, html);\n\n const fullUrl = `${url}${route}`;\n\n if (justStarted) {\n openUrl(fullUrl);\n } else {\n srv.navigate(fullUrl);\n }\n setStatus(`Serving at ${fullUrl}`);\n } catch (e) {\n setStatus('Error serving screen');\n }\n }\n\n useInput((input, key) => {\n if (input === 'q') {\n exit();\n return;\n }\n\n if (key.upArrow || input === 'k') {\n setSelectedIndex(prev => Math.max(0, prev - 1));\n setStatus('');\n }\n\n if (key.downArrow || input === 'j') {\n setSelectedIndex(prev => Math.min(screens.length - 1, prev + 1));\n setStatus('');\n }\n\n // Copy code\n if (input === 'c') {\n const screen = screens[selectedIndex];\n if (screen?.hasCode && screen.codeUrl) {\n setStatus('Copying...');\n downloadText(screen.codeUrl)\n .then(code => {\n clipboard.write(code);\n setStatus('HTML copied!');\n })\n .catch(() => setStatus('Failed to copy'));\n } else {\n setStatus('No HTML available');\n }\n }\n\n // Copy image (placeholder)\n if (input === 'i') {\n const screen = screens[selectedIndex];\n if (screen?.hasImage) {\n setStatus('Image copy not implemented');\n } else {\n setStatus('No image available');\n }\n }\n\n // Serve\n if (input === 's') {\n const screen = screens[selectedIndex];\n if (screen) {\n serveScreen(screen);\n }\n }\n });\n\n const visibleScreens = screens.slice(windowStart, windowStart + VIEW_HEIGHT);\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n {/* Header */}\n <Text bold>{projectTitle} ({screens.length} screens)</Text>\n <Text dimColor>projectId: {projectId}</Text>\n {serverUrl && <Text dimColor>Server: <Text color=\"green\">{serverUrl}</Text></Text>}\n <Text> </Text>\n\n {/* Screen List */}\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor=\"yellow\" paddingX={1}>\n {windowStart > 0 && <Text dimColor>... {windowStart} more above ...</Text>}\n\n {visibleScreens.map((screen, index) => {\n // Adjust index for absolute position\n const absoluteIndex = windowStart + index;\n const isSelected = absoluteIndex === selectedIndex;\n const num = String(absoluteIndex + 1).padStart(2, ' ');\n const selector = isSelected ? '▸' : ' ';\n\n return (\n <Box key={screen.screenId} flexDirection=\"column\">\n {/* Row 1: Title + Checkboxes */}\n <Box justifyContent=\"space-between\">\n <Box>\n <Text dimColor>{num}</Text>\n <Text color={isSelected ? 'cyan' : undefined}> {selector} </Text>\n <Text color={isSelected ? 'cyan' : undefined} bold={isSelected}>\n {screen.title.slice(0, 28)}\n </Text>\n </Box>\n <Box>\n <Text dimColor>html</Text>\n <Text color={screen.hasCode ? 'green' : 'gray'}>\n {screen.hasCode ? '[✓]' : '[ ]'}\n </Text>\n <Text> </Text>\n <Text dimColor>img</Text>\n <Text color={screen.hasImage ? 'green' : 'gray'}>\n {screen.hasImage ? '[✓]' : '[ ]'}\n </Text>\n </Box>\n </Box>\n {/* Row 2: screenId */}\n <Text dimColor color=\"gray\"> screenId: {screen.screenId}</Text>\n <Text> </Text>\n </Box>\n );\n })}\n\n {windowStart + VIEW_HEIGHT < screens.length && (\n <Text dimColor>... {screens.length - (windowStart + VIEW_HEIGHT)} more below ...</Text>\n )}\n </Box>\n\n {/* Footer */}\n <Text dimColor>[c]opy html [i]mage [s]erve [q]uit</Text>\n {status && <Text color=\"yellow\">{status}</Text>}\n </Box>\n );\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "A890852E888CB14764756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,69 @@
1
+ import {
2
+ StitchViteServer
3
+ } from "./chunk-dyp9t5wf.js";
4
+ import"./chunk-abf1r0jh.js";
5
+ import {
6
+ downloadText
7
+ } from "./chunk-34w2wfyp.js";
8
+ import"./chunk-akd997ec.js";
9
+ import {
10
+ pLimit
11
+ } from "./chunk-a5xra9jn.js";
12
+ import"./chunk-4jygt4d6.js";
13
+ import"./chunk-tz7wnw4s.js";
14
+ import"./chunk-9wyra8hs.js";
15
+
16
+ // src/commands/serve/json-server/handler.ts
17
+ class JsonServerHandler {
18
+ client;
19
+ downloadHtml;
20
+ constructor(client, downloadHtml = downloadText) {
21
+ this.client = client;
22
+ this.downloadHtml = downloadHtml;
23
+ }
24
+ async execute(input) {
25
+ let sdkScreens;
26
+ try {
27
+ const project = this.client.project(input.projectId);
28
+ sdkScreens = await project.screens();
29
+ } catch (e) {
30
+ return {
31
+ success: false,
32
+ error: { code: "SCREENS_FETCH_FAILED", message: e.message, recoverable: false }
33
+ };
34
+ }
35
+ const server = new StitchViteServer;
36
+ let baseUrl;
37
+ try {
38
+ baseUrl = await server.start(0);
39
+ } catch (e) {
40
+ return {
41
+ success: false,
42
+ error: { code: "SERVER_START_FAILED", message: e.message, recoverable: false }
43
+ };
44
+ }
45
+ const limit = pLimit(3);
46
+ const screens = [];
47
+ await Promise.all(sdkScreens.map((s) => limit(async () => {
48
+ try {
49
+ const codeUrl = await s.getHtml();
50
+ if (codeUrl) {
51
+ const html = await this.downloadHtml(codeUrl);
52
+ server.mount(`/screens/${s.screenId}`, html);
53
+ }
54
+ screens.push({
55
+ screenId: s.screenId,
56
+ title: s.title ?? s.screenId,
57
+ url: `${baseUrl}/screens/${s.screenId}`
58
+ });
59
+ } catch {}
60
+ })));
61
+ screens.sort((a, b) => a.title.localeCompare(b.title));
62
+ return { success: true, url: baseUrl, screens };
63
+ }
64
+ }
65
+ export {
66
+ JsonServerHandler
67
+ };
68
+
69
+ //# debugId=48EA0F841F0EE79D64756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/commands/serve/json-server/handler.ts"],
4
+ "sourcesContent": [
5
+ "import type { Stitch } from '@google/stitch-sdk';\nimport pLimit from 'p-limit';\nimport { StitchViteServer } from '../../../lib/server/vite/StitchViteServer.js';\nimport { downloadText } from '../../../ui/copy-behaviors/clipboard.js';\nimport type { JsonServerSpec, JsonServerInput, JsonServerResult } from './spec.js';\n\nexport class JsonServerHandler implements JsonServerSpec {\n constructor(\n private readonly client: Stitch,\n private readonly downloadHtml: (url: string) => Promise<string> = downloadText,\n ) {}\n\n async execute(input: JsonServerInput): Promise<JsonServerResult> {\n let sdkScreens: any[];\n\n try {\n const project = this.client.project(input.projectId);\n sdkScreens = await project.screens();\n } catch (e: any) {\n return {\n success: false,\n error: { code: 'SCREENS_FETCH_FAILED', message: e.message, recoverable: false },\n };\n }\n\n const server = new StitchViteServer();\n let baseUrl: string;\n\n try {\n baseUrl = await server.start(0);\n } catch (e: any) {\n return {\n success: false,\n error: { code: 'SERVER_START_FAILED', message: e.message, recoverable: false },\n };\n }\n\n // Mount screens concurrently\n const limit = pLimit(3);\n const screens: Array<{ screenId: string; title: string; url: string }> = [];\n\n await Promise.all(\n sdkScreens.map((s: any) => limit(async () => {\n try {\n const codeUrl = await s.getHtml();\n if (codeUrl) {\n const html = await this.downloadHtml(codeUrl);\n server.mount(`/screens/${s.screenId}`, html);\n }\n screens.push({\n screenId: s.screenId,\n title: s.title ?? s.screenId,\n url: `${baseUrl}/screens/${s.screenId}`,\n });\n } catch {\n // Skip screens that fail to load\n }\n }))\n );\n\n screens.sort((a, b) => a.title.localeCompare(b.title));\n\n return { success: true, url: baseUrl, screens };\n }\n}\n"
6
+ ],
7
+ "mappings": ";;;;;;;;;;;;;;;;AAMO,MAAM,kBAA4C;AAAA,EAEpC;AAAA,EACA;AAAA,EAFnB,WAAW,CACQ,QACA,eAAiD,cAClE;AAAA,IAFiB;AAAA,IACA;AAAA;AAAA,OAGb,QAAO,CAAC,OAAmD;AAAA,IAC/D,IAAI;AAAA,IAEJ,IAAI;AAAA,MACF,MAAM,UAAU,KAAK,OAAO,QAAQ,MAAM,SAAS;AAAA,MACnD,aAAa,MAAM,QAAQ,QAAQ;AAAA,MACnC,OAAO,GAAQ;AAAA,MACf,OAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,EAAE,MAAM,wBAAwB,SAAS,EAAE,SAAS,aAAa,MAAM;AAAA,MAChF;AAAA;AAAA,IAGF,MAAM,SAAS,IAAI;AAAA,IACnB,IAAI;AAAA,IAEJ,IAAI;AAAA,MACF,UAAU,MAAM,OAAO,MAAM,CAAC;AAAA,MAC9B,OAAO,GAAQ;AAAA,MACf,OAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,EAAE,MAAM,uBAAuB,SAAS,EAAE,SAAS,aAAa,MAAM;AAAA,MAC/E;AAAA;AAAA,IAIF,MAAM,QAAQ,OAAO,CAAC;AAAA,IACtB,MAAM,UAAmE,CAAC;AAAA,IAE1E,MAAM,QAAQ,IACZ,WAAW,IAAI,CAAC,MAAW,MAAM,YAAY;AAAA,MAC3C,IAAI;AAAA,QACF,MAAM,UAAU,MAAM,EAAE,QAAQ;AAAA,QAChC,IAAI,SAAS;AAAA,UACX,MAAM,OAAO,MAAM,KAAK,aAAa,OAAO;AAAA,UAC5C,OAAO,MAAM,YAAY,EAAE,YAAY,IAAI;AAAA,QAC7C;AAAA,QACA,QAAQ,KAAK;AAAA,UACX,UAAU,EAAE;AAAA,UACZ,OAAO,EAAE,SAAS,EAAE;AAAA,UACpB,KAAK,GAAG,mBAAmB,EAAE;AAAA,QAC/B,CAAC;AAAA,QACD,MAAM;AAAA,KAGT,CAAC,CACJ;AAAA,IAEA,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,MAAM,cAAc,EAAE,KAAK,CAAC;AAAA,IAErD,OAAO,EAAE,SAAS,MAAM,KAAK,SAAS,QAAQ;AAAA;AAElD;",
8
+ "debugId": "48EA0F841F0EE79D64756E2164756E21",
9
+ "names": []
10
+ }