@_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.
- package/dist/{chunk-hb3c6f6a.js → chunk-001yk06v.js} +2 -2
- package/dist/chunk-0cd2xak4.js +31447 -0
- package/dist/chunk-0cd2xak4.js.map +245 -0
- package/dist/{chunk-9tvppjaf.js → chunk-13mqag7n.js} +8 -10
- package/dist/{chunk-9tvppjaf.js.map → chunk-13mqag7n.js.map} +2 -2
- package/dist/chunk-1dcffh2w.js +1481 -0
- package/dist/chunk-1dcffh2w.js.map +23 -0
- package/dist/{chunk-985f11w6.js → chunk-26cgk4dt.js} +6 -8
- package/dist/{chunk-8yrtq2qs.js.map → chunk-26cgk4dt.js.map} +1 -1
- package/dist/chunk-2kg77g4q.js +167 -0
- package/dist/chunk-2kg77g4q.js.map +10 -0
- package/dist/chunk-34w2wfyp.js +68 -0
- package/dist/chunk-34w2wfyp.js.map +10 -0
- package/dist/chunk-44tn9dxb.js +19 -0
- package/dist/{chunk-985f11w6.js.map → chunk-44tn9dxb.js.map} +1 -1
- package/dist/chunk-5204d23a.js +24 -0
- package/dist/{chunk-ezmw2j8c.js.map → chunk-5204d23a.js.map} +1 -1
- package/dist/{chunk-mv9ssgmx.js → chunk-54wv5ptt.js} +5 -5
- package/dist/{chunk-mv9ssgmx.js.map → chunk-54wv5ptt.js.map} +2 -2
- package/dist/chunk-5dghg77b.js +16970 -0
- package/dist/chunk-5dghg77b.js.map +26 -0
- package/dist/{chunk-r2sg2nxa.js → chunk-5f2htt6r.js} +6 -7
- package/dist/chunk-5f2htt6r.js.map +9 -0
- package/dist/chunk-6gw9apqb.js +20 -0
- package/dist/chunk-6gw9apqb.js.map +10 -0
- package/dist/chunk-7bt2055x.js +39 -0
- package/dist/chunk-7bt2055x.js.map +10 -0
- package/dist/chunk-7egq85x5.js +273 -0
- package/dist/chunk-7egq85x5.js.map +10 -0
- package/dist/chunk-7pf2vfq9.js +69 -0
- package/dist/chunk-7pf2vfq9.js.map +10 -0
- package/dist/{chunk-q1nd6g0y.js → chunk-7rrhk07q.js} +76 -53
- package/dist/chunk-7rrhk07q.js.map +20 -0
- package/dist/{chunk-7xh1y383.js → chunk-7xsar3mr.js} +2 -2
- package/dist/{chunk-7xh1y383.js.map → chunk-7xsar3mr.js.map} +1 -1
- package/dist/chunk-7y4xzvkz.js +19132 -0
- package/dist/chunk-7y4xzvkz.js.map +115 -0
- package/dist/chunk-7zy0vdv5.js +761 -0
- package/dist/chunk-7zy0vdv5.js.map +18 -0
- package/dist/chunk-8rt3pp6g.js +256 -0
- package/dist/{chunk-jy2d17pr.js.map → chunk-8rt3pp6g.js.map} +3 -3
- package/dist/chunk-98trrxk2.js +40 -0
- package/dist/chunk-98trrxk2.js.map +10 -0
- package/dist/chunk-a1mk24q9.js +31326 -0
- package/dist/chunk-a1mk24q9.js.map +245 -0
- package/dist/chunk-a5xra9jn.js +159 -0
- package/dist/chunk-a5xra9jn.js.map +11 -0
- package/dist/chunk-abf1r0jh.js +2118 -0
- package/dist/chunk-abf1r0jh.js.map +44 -0
- package/dist/{chunk-25wakzyb.js → chunk-ahw5kfbr.js} +5 -5
- package/dist/chunk-akd997ec.js +11061 -0
- package/dist/chunk-akd997ec.js.map +238 -0
- package/dist/chunk-by28t333.js +19 -0
- package/dist/chunk-by28t333.js.map +9 -0
- package/dist/{chunk-2k7n0w2x.js → chunk-c6ge431q.js} +2 -2
- package/dist/{chunk-2k7n0w2x.js.map → chunk-c6ge431q.js.map} +1 -1
- package/dist/{chunk-ycfxp056.js → chunk-cnmspfhx.js} +7 -11
- package/dist/chunk-cnmspfhx.js.map +17 -0
- package/dist/chunk-cwqdka8y.js +6382 -0
- package/dist/chunk-cwqdka8y.js.map +109 -0
- package/dist/chunk-dffwrtn3.js +673 -0
- package/dist/chunk-dffwrtn3.js.map +17 -0
- package/dist/chunk-dyp9t5wf.js +44109 -0
- package/dist/chunk-dyp9t5wf.js.map +237 -0
- package/dist/chunk-e9881zy4.js +39 -0
- package/dist/chunk-e9881zy4.js.map +10 -0
- package/dist/chunk-ezs0qz0b.js +24 -0
- package/dist/chunk-ezs0qz0b.js.map +9 -0
- package/dist/chunk-f6cq8r7x.js +736 -0
- package/dist/chunk-f6cq8r7x.js.map +16 -0
- package/dist/{chunk-45wx7tn7.js → chunk-gwnmywrp.js} +2 -2
- package/dist/chunk-gz78f003.js +94 -0
- package/dist/chunk-gz78f003.js.map +10 -0
- package/dist/chunk-j0y94q2c.js +10 -0
- package/dist/{chunk-nthabjd9.js → chunk-jyem6j6k.js} +1848 -3
- package/dist/chunk-jyem6j6k.js.map +65 -0
- package/dist/chunk-kad4d9sf.js +11 -0
- package/dist/chunk-kad4d9sf.js.map +9 -0
- package/dist/{chunk-wz8d5vzb.js → chunk-krfqppg2.js} +32 -2
- package/dist/{chunk-wz8d5vzb.js.map → chunk-krfqppg2.js.map} +5 -4
- package/dist/chunk-kw62yeqn.js +124 -0
- package/dist/chunk-kw62yeqn.js.map +12 -0
- package/dist/chunk-mbt1wx7n.js +43 -0
- package/dist/chunk-mbt1wx7n.js.map +10 -0
- package/dist/chunk-nzv6abbc.js +22 -0
- package/dist/chunk-nzv6abbc.js.map +9 -0
- package/dist/{chunk-cwkb2wbe.js → chunk-pjpdhh0f.js} +27 -24
- package/dist/chunk-pjpdhh0f.js.map +16 -0
- package/dist/chunk-py8fhw0k.js +941 -0
- package/dist/chunk-py8fhw0k.js.map +27 -0
- package/dist/chunk-q6sv0243.js +93 -0
- package/dist/chunk-q6sv0243.js.map +13 -0
- package/dist/chunk-r8n5m3xq.js +19 -0
- package/dist/chunk-r8n5m3xq.js.map +9 -0
- package/dist/{chunk-nxpzt33t.js → chunk-rcwtjara.js} +8 -13
- package/dist/chunk-rcwtjara.js.map +10 -0
- package/dist/{chunk-t85nbjjb.js → chunk-rfrcdsfc.js} +5 -9
- package/dist/chunk-rfrcdsfc.js.map +10 -0
- package/dist/chunk-rj2gqxxb.js +415 -0
- package/dist/chunk-rj2gqxxb.js.map +20 -0
- package/dist/{chunk-v7117ywx.js → chunk-rvq1vb70.js} +5 -7
- package/dist/{chunk-v7117ywx.js.map → chunk-rvq1vb70.js.map} +2 -2
- package/dist/chunk-smvqara3.js +370 -0
- package/dist/chunk-smvqara3.js.map +16 -0
- package/dist/{chunk-pfyjtfex.js → chunk-sp8zjpbf.js} +7 -12
- package/dist/chunk-sp8zjpbf.js.map +10 -0
- package/dist/{chunk-48d17n29.js → chunk-ssbg48ec.js} +1 -1
- package/dist/chunk-ssbg48ec.js.map +9 -0
- package/dist/chunk-st7q66e5.js +109 -0
- package/dist/chunk-st7q66e5.js.map +10 -0
- package/dist/{chunk-sdp429xd.js → chunk-sw7h7asn.js} +32 -8
- package/dist/chunk-sw7h7asn.js.map +27 -0
- package/dist/chunk-t092ehvp.js +50 -0
- package/dist/chunk-t092ehvp.js.map +9 -0
- package/dist/{chunk-2cetsfw4.js → chunk-t0xqfse1.js} +50 -9
- package/dist/{chunk-2cetsfw4.js.map → chunk-t0xqfse1.js.map} +8 -3
- package/dist/chunk-v1t5vys5.js +124 -0
- package/dist/chunk-v1t5vys5.js.map +12 -0
- package/dist/chunk-v78rg840.js +137 -0
- package/dist/chunk-v78rg840.js.map +10 -0
- package/dist/chunk-v7xskyzm.js +19 -0
- package/dist/chunk-v7xskyzm.js.map +9 -0
- package/dist/{chunk-jy2d17pr.js → chunk-vjshqjmh.js} +12 -8
- package/dist/chunk-vjshqjmh.js.map +11 -0
- package/dist/chunk-w8075wyx.js +40 -0
- package/dist/chunk-w8075wyx.js.map +10 -0
- package/dist/chunk-wn8mek6a.js +189 -0
- package/dist/chunk-wn8mek6a.js.map +11 -0
- package/dist/{chunk-2kyqsrg2.js → chunk-y447ymks.js} +364 -3
- package/dist/chunk-y447ymks.js.map +18 -0
- package/dist/chunk-yej34vkc.js +247 -0
- package/dist/chunk-yej34vkc.js.map +14 -0
- package/dist/commands/doctor/command.js +2 -2
- package/dist/commands/init/command.js +2 -2
- package/dist/commands/logout/command.js +2 -2
- package/dist/commands/proxy/command.js +4 -5
- package/dist/commands/proxy/command.js.map +3 -3
- package/dist/commands/proxy/handler.d.ts +27 -5
- package/dist/commands/registry.d.ts +2 -0
- package/dist/commands/screens/ScreensView.d.ts +1 -3
- package/dist/commands/screens/command.js +8 -10
- package/dist/commands/screens/command.js.map +3 -3
- package/dist/commands/screens/handler.d.ts +5 -6
- package/dist/commands/serve/command.js +60 -10
- package/dist/commands/serve/command.js.map +7 -5
- package/dist/commands/serve/handler.d.ts +6 -21
- package/dist/commands/serve/json-server/handler.d.ts +8 -0
- package/dist/commands/serve/json-server/spec.d.ts +32 -0
- package/dist/commands/serve/list-screens/handler.d.ts +7 -0
- package/dist/commands/serve/list-screens/spec.d.ts +33 -0
- package/dist/commands/serve/spec.d.ts +30 -0
- package/dist/commands/site/command.js +12 -6
- package/dist/commands/site/command.js.map +4 -4
- package/dist/commands/site/generate/handler.d.ts +8 -0
- package/dist/commands/site/generate/spec.d.ts +44 -0
- package/dist/commands/site/hooks/useProjectHydration.d.ts +2 -2
- package/dist/commands/site/index.d.ts +5 -3
- package/dist/commands/site/list-screens/handler.d.ts +7 -0
- package/dist/commands/site/list-screens/spec.d.ts +33 -0
- package/dist/commands/site/spec.d.ts +6 -0
- package/dist/commands/site/ui/SiteBuilder.d.ts +2 -2
- package/dist/commands/site/utils/fetchWithRetry.d.ts +10 -0
- package/dist/commands/site/utils/suggestRoute.d.ts +1 -0
- package/dist/commands/snapshot/command.js +2 -2
- package/dist/commands/tool/command.js +2 -2
- package/dist/commands/tool/command.js.map +2 -2
- package/dist/commands/tool/context.d.ts +3 -2
- package/dist/commands/tool/handler.d.ts +9 -10
- package/dist/commands/tool/spec.d.ts +3 -2
- package/dist/commands/view/command.js +2 -2
- package/dist/index.js +11 -13
- package/dist/index.js.map +1 -1
- package/dist/platform/browser.d.ts +8 -0
- package/dist/services/mcp-client/client.d.ts +5 -0
- package/dist/services/mcp-client/spec.d.ts +6 -6
- package/dist/services/proxy/spec.d.ts +3 -3
- package/dist/services/stitch-sdk/MockStitchSDK.d.ts +18 -0
- package/dist/services/view/handler.d.ts +3 -3
- package/dist/ui/copy-behaviors/index.d.ts +8 -0
- package/dist/ui/navigation-behaviors/index.d.ts +34 -0
- package/dist/ui/serve-behaviors/index.d.ts +7 -0
- package/package.json +2 -1
- package/dist/chunk-2fcdwvrm.js +0 -54
- package/dist/chunk-2fcdwvrm.js.map +0 -10
- package/dist/chunk-2kyqsrg2.js.map +0 -10
- package/dist/chunk-8yrtq2qs.js +0 -18
- package/dist/chunk-cwkb2wbe.js.map +0 -16
- package/dist/chunk-djhzzcgj.js +0 -362
- package/dist/chunk-djhzzcgj.js.map +0 -13
- package/dist/chunk-ezmw2j8c.js +0 -14
- package/dist/chunk-fwb4fnkp.js +0 -31
- package/dist/chunk-fwb4fnkp.js.map +0 -10
- package/dist/chunk-h18jrqed.js +0 -9517
- package/dist/chunk-h18jrqed.js.map +0 -99
- package/dist/chunk-knbnsf6s.js +0 -92
- package/dist/chunk-knbnsf6s.js.map +0 -10
- package/dist/chunk-nthabjd9.js.map +0 -34
- package/dist/chunk-nxpzt33t.js.map +0 -10
- package/dist/chunk-pfyjtfex.js.map +0 -10
- package/dist/chunk-q1nd6g0y.js.map +0 -20
- package/dist/chunk-q4js8r0z.js +0 -4708
- package/dist/chunk-q4js8r0z.js.map +0 -29
- package/dist/chunk-qv44tmn6.js +0 -289
- package/dist/chunk-qv44tmn6.js.map +0 -13
- package/dist/chunk-r2sg2nxa.js.map +0 -9
- package/dist/chunk-rpxnm86e.js +0 -372
- package/dist/chunk-rpxnm86e.js.map +0 -17
- package/dist/chunk-sdp429xd.js.map +0 -24
- package/dist/chunk-t85nbjjb.js.map +0 -10
- package/dist/chunk-wa64nz8b.js +0 -47
- package/dist/chunk-wa64nz8b.js.map +0 -10
- package/dist/chunk-ycfxp056.js.map +0 -17
- package/dist/chunk-z9d2xc83.js +0 -3256
- package/dist/chunk-z9d2xc83.js.map +0 -84
- package/dist/services/config/handler.d.ts +0 -12
- package/dist/services/config/spec.d.ts +0 -82
- package/dist/src/cli.d.ts +0 -1
- package/dist/src/commands/doctor/handler.d.ts +0 -9
- package/dist/src/commands/doctor/handler.test.d.ts +0 -1
- package/dist/src/commands/doctor/spec.d.ts +0 -130
- package/dist/src/commands/doctor/spec.test.d.ts +0 -1
- package/dist/src/commands/init/handler.d.ts +0 -17
- package/dist/src/commands/init/handler.test.d.ts +0 -1
- package/dist/src/commands/init/spec.d.ts +0 -88
- package/dist/src/commands/init/spec.test.d.ts +0 -1
- package/dist/src/commands/proxy/handler.d.ts +0 -7
- package/dist/src/commands/proxy/handler.test.d.ts +0 -1
- package/dist/src/index.d.ts +0 -13
- package/dist/src/platform/detector.d.ts +0 -29
- package/dist/src/platform/paths.d.ts +0 -20
- package/dist/src/platform/shell.d.ts +0 -26
- package/dist/src/services/gcloud/handler.d.ts +0 -48
- package/dist/src/services/gcloud/handler.test.d.ts +0 -1
- package/dist/src/services/gcloud/spec.d.ts +0 -405
- package/dist/src/services/mcp-config/handler.d.ts +0 -12
- package/dist/src/services/mcp-config/handler.test.d.ts +0 -1
- package/dist/src/services/mcp-config/spec.d.ts +0 -88
- package/dist/src/services/mcp-config/spec.test.d.ts +0 -1
- package/dist/src/services/project/handler.d.ts +0 -11
- package/dist/src/services/project/handler.test.d.ts +0 -1
- package/dist/src/services/project/spec.d.ts +0 -86
- package/dist/src/services/project/spec.test.d.ts +0 -1
- package/dist/src/services/proxy/handler.d.ts +0 -15
- package/dist/src/services/proxy/handler.test.d.ts +0 -1
- package/dist/src/services/proxy/spec.d.ts +0 -83
- package/dist/src/services/proxy/spec.test.d.ts +0 -1
- package/dist/src/services/stitch/handler.d.ts +0 -15
- package/dist/src/services/stitch/handler.test.d.ts +0 -1
- package/dist/src/services/stitch/spec.d.ts +0 -262
- package/dist/src/services/stitch/spec.test.d.ts +0 -1
- package/dist/src/ui/spinner.d.ts +0 -11
- package/dist/src/ui/theme.d.ts +0 -18
- package/dist/src/ui/wizard.d.ts +0 -24
- package/dist/tests/mocks/shell.d.ts +0 -2
- /package/dist/{chunk-hb3c6f6a.js.map → chunk-001yk06v.js.map} +0 -0
- /package/dist/{chunk-25wakzyb.js.map → chunk-ahw5kfbr.js.map} +0 -0
- /package/dist/{chunk-45wx7tn7.js.map → chunk-gwnmywrp.js.map} +0 -0
- /package/dist/{chunk-48d17n29.js.map → chunk-j0y94q2c.js.map} +0 -0
|
@@ -229,6 +229,36 @@ var require_jsx_dev_runtime = __commonJS((exports, module) => {
|
|
|
229
229
|
}
|
|
230
230
|
});
|
|
231
231
|
|
|
232
|
-
|
|
232
|
+
// src/platform/browser.ts
|
|
233
|
+
import { spawn } from "node:child_process";
|
|
234
|
+
function validateUrl(url) {
|
|
235
|
+
try {
|
|
236
|
+
const parsedUrl = new URL(url);
|
|
237
|
+
if (parsedUrl.protocol !== "http:" && parsedUrl.protocol !== "https:") {
|
|
238
|
+
throw new Error("Invalid protocol. Only http and https are allowed.");
|
|
239
|
+
}
|
|
240
|
+
return parsedUrl.toString();
|
|
241
|
+
} catch (error) {
|
|
242
|
+
throw new Error(`Invalid URL: ${error instanceof Error ? error.message : String(error)}`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
function openUrl(url) {
|
|
246
|
+
const validatedUrl = validateUrl(url);
|
|
247
|
+
if (process.platform === "win32") {
|
|
248
|
+
spawn("cmd", ["/c", "start", '""', `"${validatedUrl}"`], {
|
|
249
|
+
detached: true,
|
|
250
|
+
stdio: "ignore",
|
|
251
|
+
shell: false
|
|
252
|
+
}).unref();
|
|
253
|
+
} else {
|
|
254
|
+
const cmd = process.platform === "darwin" ? "open" : "xdg-open";
|
|
255
|
+
spawn(cmd, [validatedUrl], {
|
|
256
|
+
detached: true,
|
|
257
|
+
stdio: "ignore"
|
|
258
|
+
}).unref();
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
export { openUrl, require_jsx_dev_runtime };
|
|
233
263
|
|
|
234
|
-
//# debugId=
|
|
264
|
+
//# debugId=2659200B7D2D7C6E64756E2164756E21
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../node_modules/react/cjs/react-jsx-dev-runtime.development.js", "../node_modules/react/jsx-dev-runtime.js"],
|
|
3
|
+
"sources": ["../node_modules/react/cjs/react-jsx-dev-runtime.development.js", "../node_modules/react/jsx-dev-runtime.js", "../src/platform/browser.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"/**\n * @license React\n * react-jsx-dev-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(type, key, props, owner, debugStack, debugTask) {\n var refProp = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== refProp ? refProp : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n maybeKey,\n getOwner(),\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n isValidElement(node)\n ? node._store && (node._store.validated = 1)\n : \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_LAZY_TYPE &&\n (\"fulfilled\" === node._payload.status\n ? isValidElement(node._payload.value) &&\n node._payload.value._store &&\n (node._payload.value._store.validated = 1)\n : node._store && (node._store.validated = 1));\n }\n function isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n react_stack_bottom_frame: function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsxDEV = function (type, config, maybeKey, isStaticChildren) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n",
|
|
6
|
-
"'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-dev-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-dev-runtime.development.js');\n}\n"
|
|
6
|
+
"'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-dev-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-dev-runtime.development.js');\n}\n",
|
|
7
|
+
"import { spawn } from 'node:child_process';\n\n/**\n * Validates a URL to ensure it uses an allowed protocol (http or https).\n */\nexport function validateUrl(url: string): string {\n try {\n const parsedUrl = new URL(url);\n if (parsedUrl.protocol !== 'http:' && parsedUrl.protocol !== 'https:') {\n throw new Error('Invalid protocol. Only http and https are allowed.');\n }\n return parsedUrl.toString();\n } catch (error) {\n throw new Error(`Invalid URL: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * Opens a URL in the system's default browser.\n */\nexport function openUrl(url: string): void {\n const validatedUrl = validateUrl(url);\n\n if (process.platform === 'win32') {\n // On Windows, 'start' is a shell builtin. We use 'cmd /c' to invoke it.\n // To prevent ampersand (&) injection, we pass the URL as a single quoted argument.\n // Node's spawn with shell: false (default) will handle basic quoting,\n // but 'cmd /c start' has complex parsing rules.\n // Using '\"\"' as the first argument to 'start' ensures the URL isn't interpreted as a window title.\n // We wrap the URL in double quotes to prevent shell characters like '&' from being interpreted.\n // Since validateUrl ensures no double quotes are in the string, this is safe.\n spawn('cmd', ['/c', 'start', '\"\"', `\"${validatedUrl}\"`], {\n detached: true,\n stdio: 'ignore',\n shell: false,\n }).unref();\n } else {\n const cmd = process.platform === 'darwin' ? 'open' : 'xdg-open';\n spawn(cmd, [validatedUrl], {\n detached: true,\n stdio: 'ignore',\n }).unref();\n }\n}\n"
|
|
7
8
|
],
|
|
8
|
-
"mappings": "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",
|
|
9
|
-
"debugId": "
|
|
9
|
+
"mappings": "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",
|
|
10
|
+
"debugId": "2659200B7D2D7C6E64756E2164756E21",
|
|
10
11
|
"names": []
|
|
11
12
|
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import {
|
|
2
|
+
JSONRPCMessageSchema,
|
|
3
|
+
StitchProxy
|
|
4
|
+
} from "./chunk-0cd2xak4.js";
|
|
5
|
+
import"./chunk-c6ge431q.js";
|
|
6
|
+
import"./chunk-9wyra8hs.js";
|
|
7
|
+
|
|
8
|
+
// node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js
|
|
9
|
+
import process2 from "node:process";
|
|
10
|
+
|
|
11
|
+
// node_modules/@modelcontextprotocol/sdk/dist/esm/shared/stdio.js
|
|
12
|
+
class ReadBuffer {
|
|
13
|
+
append(chunk) {
|
|
14
|
+
this._buffer = this._buffer ? Buffer.concat([this._buffer, chunk]) : chunk;
|
|
15
|
+
}
|
|
16
|
+
readMessage() {
|
|
17
|
+
if (!this._buffer) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
const index = this._buffer.indexOf(`
|
|
21
|
+
`);
|
|
22
|
+
if (index === -1) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
const line = this._buffer.toString("utf8", 0, index).replace(/\r$/, "");
|
|
26
|
+
this._buffer = this._buffer.subarray(index + 1);
|
|
27
|
+
return deserializeMessage(line);
|
|
28
|
+
}
|
|
29
|
+
clear() {
|
|
30
|
+
this._buffer = undefined;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function deserializeMessage(line) {
|
|
34
|
+
return JSONRPCMessageSchema.parse(JSON.parse(line));
|
|
35
|
+
}
|
|
36
|
+
function serializeMessage(message) {
|
|
37
|
+
return JSON.stringify(message) + `
|
|
38
|
+
`;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js
|
|
42
|
+
class StdioServerTransport {
|
|
43
|
+
constructor(_stdin = process2.stdin, _stdout = process2.stdout) {
|
|
44
|
+
this._stdin = _stdin;
|
|
45
|
+
this._stdout = _stdout;
|
|
46
|
+
this._readBuffer = new ReadBuffer;
|
|
47
|
+
this._started = false;
|
|
48
|
+
this._ondata = (chunk) => {
|
|
49
|
+
this._readBuffer.append(chunk);
|
|
50
|
+
this.processReadBuffer();
|
|
51
|
+
};
|
|
52
|
+
this._onerror = (error) => {
|
|
53
|
+
this.onerror?.(error);
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
async start() {
|
|
57
|
+
if (this._started) {
|
|
58
|
+
throw new Error("StdioServerTransport already started! If using Server class, note that connect() calls start() automatically.");
|
|
59
|
+
}
|
|
60
|
+
this._started = true;
|
|
61
|
+
this._stdin.on("data", this._ondata);
|
|
62
|
+
this._stdin.on("error", this._onerror);
|
|
63
|
+
}
|
|
64
|
+
processReadBuffer() {
|
|
65
|
+
while (true) {
|
|
66
|
+
try {
|
|
67
|
+
const message = this._readBuffer.readMessage();
|
|
68
|
+
if (message === null) {
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
this.onmessage?.(message);
|
|
72
|
+
} catch (error) {
|
|
73
|
+
this.onerror?.(error);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async close() {
|
|
78
|
+
this._stdin.off("data", this._ondata);
|
|
79
|
+
this._stdin.off("error", this._onerror);
|
|
80
|
+
const remainingDataListeners = this._stdin.listenerCount("data");
|
|
81
|
+
if (remainingDataListeners === 0) {
|
|
82
|
+
this._stdin.pause();
|
|
83
|
+
}
|
|
84
|
+
this._readBuffer.clear();
|
|
85
|
+
this.onclose?.();
|
|
86
|
+
}
|
|
87
|
+
send(message) {
|
|
88
|
+
return new Promise((resolve) => {
|
|
89
|
+
const json = serializeMessage(message);
|
|
90
|
+
if (this._stdout.write(json)) {
|
|
91
|
+
resolve();
|
|
92
|
+
} else {
|
|
93
|
+
this._stdout.once("drain", resolve);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// src/commands/proxy/handler.ts
|
|
100
|
+
class ProxyCommandHandler {
|
|
101
|
+
createProxy;
|
|
102
|
+
createTransport;
|
|
103
|
+
constructor(deps) {
|
|
104
|
+
this.createProxy = deps?.createProxy ?? ((opts) => new StitchProxy(opts));
|
|
105
|
+
this.createTransport = deps?.createTransport ?? (() => new StdioServerTransport);
|
|
106
|
+
}
|
|
107
|
+
async execute(input) {
|
|
108
|
+
try {
|
|
109
|
+
const proxy = this.createProxy({
|
|
110
|
+
apiKey: process.env.STITCH_API_KEY
|
|
111
|
+
});
|
|
112
|
+
const transport = this.createTransport();
|
|
113
|
+
await proxy.start(transport);
|
|
114
|
+
return { success: true, data: { status: "stopped" } };
|
|
115
|
+
} catch (e) {
|
|
116
|
+
return { success: false, error: { code: "PROXY_START_ERROR", message: e.message, recoverable: false } };
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
export {
|
|
121
|
+
ProxyCommandHandler
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
//# debugId=BEACF8DA099E305664756E2164756E21
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js", "../node_modules/@modelcontextprotocol/sdk/dist/esm/shared/stdio.js", "../src/commands/proxy/handler.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import process from 'node:process';\nimport { ReadBuffer, serializeMessage } from '../shared/stdio.js';\n/**\n * Server transport for stdio: this communicates with an MCP client by reading from the current process' stdin and writing to stdout.\n *\n * This transport is only available in Node.js environments.\n */\nexport class StdioServerTransport {\n constructor(_stdin = process.stdin, _stdout = process.stdout) {\n this._stdin = _stdin;\n this._stdout = _stdout;\n this._readBuffer = new ReadBuffer();\n this._started = false;\n // Arrow functions to bind `this` properly, while maintaining function identity.\n this._ondata = (chunk) => {\n this._readBuffer.append(chunk);\n this.processReadBuffer();\n };\n this._onerror = (error) => {\n this.onerror?.(error);\n };\n }\n /**\n * Starts listening for messages on stdin.\n */\n async start() {\n if (this._started) {\n throw new Error('StdioServerTransport already started! If using Server class, note that connect() calls start() automatically.');\n }\n this._started = true;\n this._stdin.on('data', this._ondata);\n this._stdin.on('error', this._onerror);\n }\n processReadBuffer() {\n while (true) {\n try {\n const message = this._readBuffer.readMessage();\n if (message === null) {\n break;\n }\n this.onmessage?.(message);\n }\n catch (error) {\n this.onerror?.(error);\n }\n }\n }\n async close() {\n // Remove our event listeners first\n this._stdin.off('data', this._ondata);\n this._stdin.off('error', this._onerror);\n // Check if we were the only data listener\n const remainingDataListeners = this._stdin.listenerCount('data');\n if (remainingDataListeners === 0) {\n // Only pause stdin if we were the only listener\n // This prevents interfering with other parts of the application that might be using stdin\n this._stdin.pause();\n }\n // Clear the buffer and notify closure\n this._readBuffer.clear();\n this.onclose?.();\n }\n send(message) {\n return new Promise(resolve => {\n const json = serializeMessage(message);\n if (this._stdout.write(json)) {\n resolve();\n }\n else {\n this._stdout.once('drain', resolve);\n }\n });\n }\n}\n//# sourceMappingURL=stdio.js.map",
|
|
6
|
+
"import { JSONRPCMessageSchema } from '../types.js';\n/**\n * Buffers a continuous stdio stream into discrete JSON-RPC messages.\n */\nexport class ReadBuffer {\n append(chunk) {\n this._buffer = this._buffer ? Buffer.concat([this._buffer, chunk]) : chunk;\n }\n readMessage() {\n if (!this._buffer) {\n return null;\n }\n const index = this._buffer.indexOf('\\n');\n if (index === -1) {\n return null;\n }\n const line = this._buffer.toString('utf8', 0, index).replace(/\\r$/, '');\n this._buffer = this._buffer.subarray(index + 1);\n return deserializeMessage(line);\n }\n clear() {\n this._buffer = undefined;\n }\n}\nexport function deserializeMessage(line) {\n return JSONRPCMessageSchema.parse(JSON.parse(line));\n}\nexport function serializeMessage(message) {\n return JSON.stringify(message) + '\\n';\n}\n//# sourceMappingURL=stdio.js.map",
|
|
7
|
+
"import { StitchProxy } from '@google/stitch-sdk';\nimport type { StitchProxy as StitchProxyType } from '@google/stitch-sdk';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\n\ninterface ProxyCommandInput {\n port?: number;\n debug?: boolean;\n}\n\ninterface ProxyCommandResult {\n success: boolean;\n data?: { status: string };\n error?: { code: string; message: string; recoverable: boolean };\n}\n\nexport class ProxyCommandHandler {\n private createProxy: (opts: { apiKey?: string }) => StitchProxyType;\n private createTransport: () => StdioServerTransport;\n\n constructor(deps?: {\n createProxy?: (opts: { apiKey?: string }) => StitchProxyType;\n createTransport?: () => StdioServerTransport;\n }) {\n this.createProxy = deps?.createProxy ?? ((opts) => new StitchProxy(opts));\n this.createTransport = deps?.createTransport ?? (() => new StdioServerTransport());\n }\n\n async execute(input: ProxyCommandInput): Promise<ProxyCommandResult> {\n try {\n const proxy = this.createProxy({\n apiKey: process.env.STITCH_API_KEY,\n });\n const transport = this.createTransport();\n await proxy.start(transport);\n return { success: true, data: { status: 'stopped' } };\n } catch (e: any) {\n return { success: false, error: { code: 'PROXY_START_ERROR', message: e.message, recoverable: false } };\n }\n }\n}\n"
|
|
8
|
+
],
|
|
9
|
+
"mappings": "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",
|
|
10
|
+
"debugId": "BEACF8DA099E305664756E2164756E21",
|
|
11
|
+
"names": []
|
|
12
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import {
|
|
2
|
+
pLimit
|
|
3
|
+
} from "./chunk-a5xra9jn.js";
|
|
4
|
+
import"./chunk-9wyra8hs.js";
|
|
5
|
+
|
|
6
|
+
// src/commands/screens/handler.ts
|
|
7
|
+
class ScreensHandler {
|
|
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 mapped = await Promise.all(screens.map((s) => limit(async () => {
|
|
18
|
+
const codeUrl = await s.getHtml().catch(() => null);
|
|
19
|
+
const imageUrl = await s.getImage().catch(() => null);
|
|
20
|
+
return {
|
|
21
|
+
screenId: s.screenId,
|
|
22
|
+
title: s.title ?? s.screenId,
|
|
23
|
+
hasCode: codeUrl !== null,
|
|
24
|
+
codeUrl,
|
|
25
|
+
hasImage: imageUrl !== null
|
|
26
|
+
};
|
|
27
|
+
})));
|
|
28
|
+
const sorted = mapped.sort((a, b) => {
|
|
29
|
+
if (a.hasCode !== b.hasCode)
|
|
30
|
+
return a.hasCode ? -1 : 1;
|
|
31
|
+
return a.title.localeCompare(b.title);
|
|
32
|
+
});
|
|
33
|
+
return { success: true, projectId, projectTitle: project.data?.title ?? projectId, screens: sorted };
|
|
34
|
+
} catch (e) {
|
|
35
|
+
return { success: false, error: e.message };
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export {
|
|
40
|
+
ScreensHandler
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
//# debugId=BA217A050135E6A764756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/commands/screens/handler.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type { Stitch } from '@google/stitch-sdk';\nimport pLimit from 'p-limit';\n\ninterface Screen {\n screenId: string;\n title: string;\n hasCode: boolean;\n codeUrl: string | null;\n hasImage: boolean;\n}\n\ntype ScreensResult = {\n success: true;\n projectId: string;\n projectTitle: string;\n screens: Screen[];\n} | {\n success: false;\n error: string;\n};\n\nexport class ScreensHandler {\n constructor(private readonly stitch: Stitch) {}\n\n async execute(projectId: string): Promise<ScreensResult> {\n try {\n const project = this.stitch.project(projectId);\n const screens = await project.screens();\n\n // Throttle concurrent API calls to avoid overwhelming the backend\n const limit = pLimit(3);\n const mapped = await Promise.all(screens.map((s: any) => limit(async () => {\n const codeUrl = await s.getHtml().catch(() => null);\n const imageUrl = await s.getImage().catch(() => null);\n return {\n screenId: s.screenId,\n title: s.title ?? s.screenId,\n hasCode: codeUrl !== null,\n codeUrl,\n hasImage: imageUrl !== null,\n };\n })));\n\n const sorted = mapped.sort((a, b) => {\n if (a.hasCode !== b.hasCode) return a.hasCode ? -1 : 1;\n return a.title.localeCompare(b.title);\n });\n\n return { success: true, projectId, projectTitle: project.data?.title ?? projectId, screens: sorted };\n } catch (e: any) {\n return { success: false, error: e.message };\n }\n }\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;;;;;AAqBO,MAAM,eAAe;AAAA,EACG;AAAA,EAA7B,WAAW,CAAkB,QAAgB;AAAA,IAAhB;AAAA;AAAA,OAEvB,QAAO,CAAC,WAA2C;AAAA,IACvD,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,SAAS,MAAM,QAAQ,IAAI,QAAQ,IAAI,CAAC,MAAW,MAAM,YAAY;AAAA,QACzE,MAAM,UAAU,MAAM,EAAE,QAAQ,EAAE,MAAM,MAAM,IAAI;AAAA,QAClD,MAAM,WAAW,MAAM,EAAE,SAAS,EAAE,MAAM,MAAM,IAAI;AAAA,QACpD,OAAO;AAAA,UACL,UAAU,EAAE;AAAA,UACZ,OAAO,EAAE,SAAS,EAAE;AAAA,UACpB,SAAS,YAAY;AAAA,UACrB;AAAA,UACA,UAAU,aAAa;AAAA,QACzB;AAAA,OACD,CAAC,CAAC;AAAA,MAEH,MAAM,SAAS,OAAO,KAAK,CAAC,GAAG,MAAM;AAAA,QACnC,IAAI,EAAE,YAAY,EAAE;AAAA,UAAS,OAAO,EAAE,UAAU,KAAK;AAAA,QACrD,OAAO,EAAE,MAAM,cAAc,EAAE,KAAK;AAAA,OACrC;AAAA,MAED,OAAO,EAAE,SAAS,MAAM,WAAW,cAAc,QAAQ,MAAM,SAAS,WAAW,SAAS,OAAO;AAAA,MACnG,OAAO,GAAQ;AAAA,MACf,OAAO,EAAE,SAAS,OAAO,OAAO,EAAE,QAAQ;AAAA;AAAA;AAGhD;",
|
|
8
|
+
"debugId": "BA217A050135E6A764756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import {
|
|
2
|
+
copyJson,
|
|
3
|
+
copyText,
|
|
4
|
+
downloadAndCopyImage,
|
|
5
|
+
downloadAndCopyText,
|
|
6
|
+
downloadImage,
|
|
7
|
+
downloadText
|
|
8
|
+
} from "./chunk-34w2wfyp.js";
|
|
9
|
+
import"./chunk-akd997ec.js";
|
|
10
|
+
import"./chunk-4jygt4d6.js";
|
|
11
|
+
import"./chunk-tz7wnw4s.js";
|
|
12
|
+
import"./chunk-9wyra8hs.js";
|
|
13
|
+
export {
|
|
14
|
+
downloadText,
|
|
15
|
+
downloadImage,
|
|
16
|
+
downloadAndCopyText,
|
|
17
|
+
downloadAndCopyImage,
|
|
18
|
+
copyText,
|
|
19
|
+
copyJson
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
//# debugId=8D766289CB02064164756E2164756E21
|
|
@@ -1,27 +1,29 @@
|
|
|
1
1
|
import {
|
|
2
|
+
openUrl,
|
|
2
3
|
require_jsx_dev_runtime
|
|
3
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-krfqppg2.js";
|
|
4
5
|
import {
|
|
5
6
|
Box_default,
|
|
6
7
|
Text,
|
|
7
8
|
use_app_default,
|
|
8
9
|
use_input_default,
|
|
9
10
|
use_stdout_default
|
|
10
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-t0xqfse1.js";
|
|
11
12
|
import {
|
|
12
13
|
require_react
|
|
13
14
|
} from "./chunk-4jwmvjb4.js";
|
|
14
15
|
import {
|
|
15
16
|
StitchViteServer
|
|
16
|
-
} from "./chunk-
|
|
17
|
-
import {
|
|
18
|
-
ProjectSyncer,
|
|
19
|
-
SiteService,
|
|
20
|
-
pLimit
|
|
21
|
-
} from "./chunk-qv44tmn6.js";
|
|
17
|
+
} from "./chunk-7xsar3mr.js";
|
|
22
18
|
import {
|
|
23
19
|
require_lib
|
|
24
20
|
} from "./chunk-w8q7nsm7.js";
|
|
21
|
+
import {
|
|
22
|
+
fetchWithRetry
|
|
23
|
+
} from "./chunk-6gw9apqb.js";
|
|
24
|
+
import {
|
|
25
|
+
pLimit
|
|
26
|
+
} from "./chunk-a5xra9jn.js";
|
|
25
27
|
import {
|
|
26
28
|
require_cli_spinners
|
|
27
29
|
} from "./chunk-nq68kghz.js";
|
|
@@ -294,7 +296,7 @@ var ScreenList = ({ items, activeIndex }) => {
|
|
|
294
296
|
|
|
295
297
|
// src/commands/site/hooks/useProjectHydration.ts
|
|
296
298
|
var import_react3 = __toESM(require_react(), 1);
|
|
297
|
-
function useProjectHydration(screens, server,
|
|
299
|
+
function useProjectHydration(screens, server, fetchContent, activeScreenId) {
|
|
298
300
|
const [hydrationStatus, setHydrationStatus] = import_react3.useState("idle");
|
|
299
301
|
const [progress, setProgress] = import_react3.useState(0);
|
|
300
302
|
const contentCache = import_react3.useRef(new Map);
|
|
@@ -330,7 +332,7 @@ function useProjectHydration(screens, server, syncer, activeScreenId) {
|
|
|
330
332
|
if (!screen.downloadUrl)
|
|
331
333
|
return;
|
|
332
334
|
try {
|
|
333
|
-
const html = await
|
|
335
|
+
const html = await fetchContent(screen.downloadUrl);
|
|
334
336
|
if (mounted) {
|
|
335
337
|
contentCache.current.set(screen.id, html);
|
|
336
338
|
server.mount(`/_preview/${screen.id}`, html);
|
|
@@ -356,13 +358,12 @@ function useProjectHydration(screens, server, syncer, activeScreenId) {
|
|
|
356
358
|
return () => {
|
|
357
359
|
mounted = false;
|
|
358
360
|
};
|
|
359
|
-
}, [screens, server,
|
|
361
|
+
}, [screens, server, fetchContent, activeScreenId]);
|
|
360
362
|
return { hydrationStatus, progress, htmlContent };
|
|
361
363
|
}
|
|
362
364
|
|
|
363
365
|
// src/commands/site/ui/SiteBuilder.tsx
|
|
364
366
|
var jsx_dev_runtime3 = __toESM(require_jsx_dev_runtime(), 1);
|
|
365
|
-
import { spawn } from "child_process";
|
|
366
367
|
var SiteBuilder = ({ projectId, client, onExit }) => {
|
|
367
368
|
const { exit } = use_app_default();
|
|
368
369
|
const [loading, setLoading] = import_react4.useState(true);
|
|
@@ -378,7 +379,6 @@ var SiteBuilder = ({ projectId, client, onExit }) => {
|
|
|
378
379
|
const [showAllKeys, setShowAllKeys] = import_react4.useState(false);
|
|
379
380
|
const [serverUrl, setServerUrl] = import_react4.useState(null);
|
|
380
381
|
const [server, setServer] = import_react4.useState(null);
|
|
381
|
-
const syncer = import_react4.useMemo(() => new ProjectSyncer(client), [client]);
|
|
382
382
|
import_react4.useEffect(() => {
|
|
383
383
|
let mounted = true;
|
|
384
384
|
const srv = new StitchViteServer;
|
|
@@ -388,8 +388,15 @@ var SiteBuilder = ({ projectId, client, onExit }) => {
|
|
|
388
388
|
const url = await srv.start(0);
|
|
389
389
|
if (mounted)
|
|
390
390
|
setServerUrl(url);
|
|
391
|
-
const
|
|
392
|
-
const
|
|
391
|
+
const project = client.project(projectId);
|
|
392
|
+
const sdkScreens = await project.screens();
|
|
393
|
+
const uiScreens = await Promise.all(sdkScreens.map(async (s) => ({
|
|
394
|
+
id: s.screenId,
|
|
395
|
+
title: s.title ?? s.screenId,
|
|
396
|
+
status: "ignored",
|
|
397
|
+
route: "",
|
|
398
|
+
downloadUrl: await s.getHtml().catch(() => null)
|
|
399
|
+
})));
|
|
393
400
|
const saved = await siteManifest.load();
|
|
394
401
|
for (const screen of uiScreens) {
|
|
395
402
|
const state = saved.get(screen.id);
|
|
@@ -412,7 +419,7 @@ var SiteBuilder = ({ projectId, client, onExit }) => {
|
|
|
412
419
|
mounted = false;
|
|
413
420
|
srv.stop();
|
|
414
421
|
};
|
|
415
|
-
}, [projectId,
|
|
422
|
+
}, [projectId, client]);
|
|
416
423
|
const displayList = import_react4.useMemo(() => {
|
|
417
424
|
let list = screens.map((s, i) => ({ screen: s, sourceIndex: i }));
|
|
418
425
|
if (viewMode === "discarded") {
|
|
@@ -433,7 +440,8 @@ var SiteBuilder = ({ projectId, client, onExit }) => {
|
|
|
433
440
|
}, [displayList.length]);
|
|
434
441
|
const activeItem = displayList[activeIndex];
|
|
435
442
|
const activeScreenId = activeItem?.screen.id;
|
|
436
|
-
const
|
|
443
|
+
const fetchContent = import_react4.useCallback((url) => fetchWithRetry(url), []);
|
|
444
|
+
const { hydrationStatus, progress, htmlContent } = useProjectHydration(screens, server, fetchContent, activeScreenId);
|
|
437
445
|
import_react4.useEffect(() => {
|
|
438
446
|
if (server && followMode && hydrationStatus === "ready" && activeScreenId) {
|
|
439
447
|
server.navigate(`/_preview/${activeScreenId}`);
|
|
@@ -511,13 +519,8 @@ var SiteBuilder = ({ projectId, client, onExit }) => {
|
|
|
511
519
|
}
|
|
512
520
|
if (input === "o") {
|
|
513
521
|
if (serverUrl && activeScreenId) {
|
|
514
|
-
const start = process.platform == "darwin" ? "open" : process.platform == "win32" ? "start" : "xdg-open";
|
|
515
522
|
const target = `${serverUrl}/_preview/${activeScreenId}`;
|
|
516
|
-
|
|
517
|
-
spawn("cmd", ["/c", "start", target], { detached: true, stdio: "ignore" }).unref();
|
|
518
|
-
} else {
|
|
519
|
-
spawn(start, [target], { detached: true, stdio: "ignore" }).unref();
|
|
520
|
-
}
|
|
523
|
+
openUrl(target);
|
|
521
524
|
}
|
|
522
525
|
}
|
|
523
526
|
if (input === "g") {
|
|
@@ -730,4 +733,4 @@ var SiteBuilder = ({ projectId, client, onExit }) => {
|
|
|
730
733
|
|
|
731
734
|
export { SiteManifest, SiteBuilder };
|
|
732
735
|
|
|
733
|
-
//# debugId=
|
|
736
|
+
//# debugId=871FC3A79A136BE664756E2164756E21
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/commands/site/ui/SiteBuilder.tsx", "../node_modules/ink-spinner/build/index.js", "../node_modules/ink-text-input/build/index.js", "../src/commands/site/utils/SiteManifest.ts", "../src/commands/site/ui/components/StatusIcon.tsx", "../src/commands/site/ui/ScreenList.tsx", "../src/commands/site/hooks/useProjectHydration.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import React, { useState, useEffect, useMemo, useCallback } from 'react';\nimport { Box, Text, useInput, useApp } from 'ink';\nimport Spinner from 'ink-spinner';\nimport TextInput from 'ink-text-input';\nimport { SiteService } from '../../../lib/services/site/SiteService.js';\nimport { StitchViteServer } from '../../../lib/server/vite/StitchViteServer.js';\nimport { openUrl } from '../../../platform/browser.js';\nimport { SiteManifest } from '../utils/SiteManifest.js';\nimport { fetchWithRetry } from '../utils/fetchWithRetry.js';\nimport { ScreenList } from './ScreenList.js';\nimport { useProjectHydration } from '../hooks/useProjectHydration.js';\nimport type { UIScreen, SiteConfig } from '../../../lib/services/site/types.js';\nimport type { Stitch } from '@google/stitch-sdk';\n\ninterface SiteBuilderProps {\n projectId: string;\n client: Stitch;\n onExit: (config: SiteConfig | null, htmlContent?: Map<string, string>) => void;\n}\n\nexport const SiteBuilder: React.FC<SiteBuilderProps> = ({ projectId, client, onExit }) => {\n const { exit } = useApp();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n // New state\n const [screens, setScreens] = useState<UIScreen[]>([]);\n const [showSelectedOnly, setShowSelectedOnly] = useState(false);\n const [activeIndex, setActiveIndex] = useState(0);\n const [viewMode, setViewMode] = useState<'default' | 'discarded'>('default');\n\n const siteManifest = useMemo(() => new SiteManifest(projectId), [projectId]);\n\n const [isEditingRoute, setIsEditingRoute] = useState(false);\n const [routeValue, setRouteValue] = useState('');\n\n const [followMode, setFollowMode] = useState(true);\n const [showAllKeys, setShowAllKeys] = useState(false);\n const [serverUrl, setServerUrl] = useState<string | null>(null);\n const [server, setServer] = useState<StitchViteServer | null>(null);\n\n // Initialize\n useEffect(() => {\n let mounted = true;\n const srv = new StitchViteServer();\n setServer(srv);\n\n const init = async () => {\n try {\n // Start server\n const url = await srv.start(0);\n if (mounted) setServerUrl(url);\n\n // Fetch screens\n const project = client.project(projectId);\n const sdkScreens = await project.screens();\n\n // Convert to UIScreen\n const uiScreens = await Promise.all(\n sdkScreens.map(async (s: any) => ({\n id: s.screenId,\n title: s.title ?? s.screenId,\n status: 'ignored' as const,\n route: '',\n downloadUrl: await s.getHtml().catch(() => null)\n }))\n ) as UIScreen[];\n\n // Load saved screen state (status + routes)\n const saved = await siteManifest.load();\n for (const screen of uiScreens) {\n const state = saved.get(screen.id);\n if (state?.status) screen.status = state.status;\n if (state?.route) screen.route = state.route;\n }\n\n if (mounted) {\n setScreens(uiScreens);\n setLoading(false);\n }\n } catch (e: any) {\n if (mounted) setError(e.message);\n }\n };\n\n init();\n\n return () => {\n mounted = false;\n srv.stop();\n };\n }, [projectId, client]);\n\n // Derived display list\n const displayList = useMemo(() => {\n let list = screens.map((s, i) => ({ screen: s, sourceIndex: i }));\n\n if (viewMode === 'discarded') {\n return list.filter(item => item.screen.status === 'discarded');\n }\n\n // Default: hide discarded\n list = list.filter(item => item.screen.status !== 'discarded');\n\n if (showSelectedOnly) {\n list = list.filter(item => item.screen.status === 'included');\n }\n\n return list;\n }, [screens, viewMode, showSelectedOnly]);\n\n // Clamp activeIndex when list changes\n useEffect(() => {\n setActiveIndex(prev => {\n if (displayList.length === 0) return 0;\n return Math.min(prev, Math.max(0, displayList.length - 1));\n });\n }, [displayList.length]);\n\n // Hydration logic\n const activeItem = displayList[activeIndex];\n const activeScreenId = activeItem?.screen.id;\n\n // Stable fetchContent reference using fetchWithRetry directly\n const fetchContent = useCallback((url: string) => fetchWithRetry(url), []);\n\n const { hydrationStatus, progress, htmlContent } = useProjectHydration(screens, server, fetchContent, activeScreenId);\n\n // Navigate effect (Follow Mode)\n useEffect(() => {\n if (server && followMode && hydrationStatus === 'ready' && activeScreenId) {\n server.navigate(`/_preview/${activeScreenId}`);\n }\n }, [activeScreenId, followMode, server, hydrationStatus]);\n\n // Input handling\n useInput((input, key) => {\n if (loading || error) return;\n\n // When editing route, TextInput handles input.\n // We only listen for Escape to cancel or Enter to submit (handled by TextInput onSubmit/onChange logic?)\n // Actually ink-text-input handles value updates, but we need to handle commit/cancel.\n // However, if we use useInput here, it might conflict if not careful.\n // ink-text-input captures input if focused? No, it just renders.\n // We need to capture input here if NOT editing.\n if (isEditingRoute) {\n if (key.escape) {\n setIsEditingRoute(false);\n setRouteValue(''); // Reset or keep? Reset seems better for cancel.\n }\n return;\n }\n\n if (key.upArrow) {\n setActiveIndex(prev => Math.max(0, prev - 1));\n }\n if (key.downArrow) {\n setActiveIndex(prev => Math.min(displayList.length - 1, prev + 1));\n }\n\n if (input === ' ') {\n if (activeItem) {\n const originalIndex = activeItem.sourceIndex;\n setScreens(prev => {\n const next = [...prev];\n const s = next[originalIndex];\n if (s) {\n s.status = s.status === 'included' ? 'ignored' : 'included';\n }\n siteManifest.save(next);\n return next;\n });\n }\n }\n\n if (key.return) {\n if (activeItem) {\n setRouteValue(activeItem.screen.route);\n setIsEditingRoute(true);\n }\n }\n\n if (input === 't') {\n setShowSelectedOnly(prev => !prev);\n }\n\n if (input === 'f') {\n setFollowMode(prev => !prev);\n }\n\n if (input === 'x') {\n const item = displayList[activeIndex];\n if (!item) return;\n\n if (viewMode === 'discarded') {\n // Undiscard → set to 'ignored'\n const idx = item.sourceIndex;\n setScreens(prev => {\n const next = [...prev];\n if (next[idx]) next[idx]!.status = 'ignored';\n siteManifest.save(next);\n return next;\n });\n } else {\n // Discard\n const idx = item.sourceIndex;\n setScreens(prev => {\n const next = [...prev];\n if (next[idx]) next[idx]!.status = 'discarded';\n siteManifest.save(next);\n return next;\n });\n }\n }\n\n if (input === 'd') {\n setViewMode(prev => prev === 'default' ? 'discarded' : 'default');\n setActiveIndex(0);\n }\n\n if (input === 'o') {\n if (serverUrl && activeScreenId) {\n const target = `${serverUrl}/_preview/${activeScreenId}`;\n openUrl(target);\n }\n }\n\n if (input === 'g') {\n // Validate\n const included = screens.filter(s => s.status === 'included');\n const invalid = included.find(s => !s.route || s.route.trim() === '');\n\n if (invalid) {\n // Can't show error easily without new state, maybe console error or alert?\n // For now, maybe just don't generate?\n // Or better, set an error message in UI?\n // Since we don't have a persistent error UI, let's just do nothing or maybe flash?\n // Plan didn't specify error UI.\n // \"Show a warning and refuse to generate.\"\n // I'll reuse 'error' state but that might be blocking.\n // Let's rely on validation during generation or maybe a quick alert line.\n // I'll assume valid for now or maybe just alert if I can.\n // I'll prevent exit.\n return;\n }\n\n const finalConfig: SiteConfig = {\n projectId,\n routes: included.map(s => ({\n screenId: s.id,\n route: s.route,\n status: s.status as 'included' | 'ignored'\n }))\n };\n onExit(finalConfig, htmlContent);\n exit();\n }\n\n if (input === 'e') {\n const included = screens.filter(s => s.status === 'included');\n const exportData = {\n projectId,\n routes: included.map(s => ({\n screenId: s.id,\n route: s.route,\n })),\n };\n process.stdout.write(JSON.stringify(exportData, null, 2) + '\\n');\n }\n\n if (input === '?') {\n setShowAllKeys(prev => !prev);\n }\n\n if (input === 'q') {\n onExit(null);\n exit();\n }\n });\n\n const handleRouteSubmit = (val: string) => {\n if (activeItem) {\n const originalIndex = activeItem.sourceIndex;\n setScreens(prev => {\n const next = [...prev];\n if (next[originalIndex]) {\n next[originalIndex]!.route = val;\n }\n siteManifest.save(next);\n return next;\n });\n setIsEditingRoute(false);\n // Move to next\n setActiveIndex(prev => Math.min(displayList.length - 1, prev + 1));\n }\n };\n\n if (error) {\n return <Text color=\"red\">Error: {error}</Text>;\n }\n\n if (loading) {\n return (\n <Box>\n <Text color=\"green\"><Spinner type=\"dots\" /> Loading project...</Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" height=\"100%\">\n {/* Header */}\n <Box borderStyle=\"single\" borderColor=\"cyan\" paddingX={1}>\n <Text>Stitch Site Builder</Text>\n <Box marginLeft={2}>\n <Text color=\"gray\">{serverUrl}</Text>\n </Box>\n <Box marginLeft={2}>\n {viewMode === 'discarded' ? (\n <Text color=\"red\">Viewing Discarded ({displayList.length})</Text>\n ) : (\n <Text>Filter: {showSelectedOnly ? 'Selected' : 'All'} ({displayList.length})</Text>\n )}\n </Box>\n {viewMode === 'default' && screens.filter(s => s.status === 'discarded').length > 0 && (\n <Box marginLeft={2}>\n <Text dimColor>{screens.filter(s => s.status === 'discarded').length} discarded (press d to view)</Text>\n </Box>\n )}\n <Box marginLeft={2}>\n {hydrationStatus === 'downloading' && (\n <Text color=\"yellow\">\n <Spinner type=\"dots\" /> Downloading... {Math.round(progress * 100)}%\n </Text>\n )}\n {hydrationStatus === 'ready' && <Text color=\"green\">Ready</Text>}\n </Box>\n </Box>\n\n {/* List */}\n <ScreenList items={displayList} activeIndex={activeIndex} />\n\n {/* Route Editor */}\n <Box borderStyle=\"single\" borderColor={isEditingRoute ? \"green\" : \"gray\"} paddingX={1} flexDirection=\"column\">\n {activeItem ? (\n <>\n <Text bold>Route for: {activeItem.screen.title}</Text>\n {isEditingRoute ? (\n <Box>\n <Text color=\"green\">{'> '}</Text>\n <TextInput\n value={routeValue}\n onChange={setRouteValue}\n onSubmit={handleRouteSubmit}\n />\n </Box>\n ) : (\n <Box>\n <Text color=\"gray\">{activeItem.screen.route || 'No route defined'}</Text>\n <Box marginLeft={2}>\n <Text dimColor>Press Enter to edit</Text>\n </Box>\n </Box>\n )}\n </>\n ) : (\n <Text color=\"gray\">No screen selected</Text>\n )}\n </Box>\n\n {/* Keymap */}\n <Box borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>\n {viewMode === 'discarded'\n ? '[x] Undiscard [d] Back to All [q] Quit'\n : showAllKeys\n ? `[Space] Toggle [Enter] Edit Route [x] Discard [d] View Discarded [t] Filter [f] Follow: ${followMode ? 'ON' : 'OFF'} [o] Open [g] Generate [e] Export [q] Quit [?] Less`\n : '[Space] Toggle [Enter] Edit Route [g] Generate [x] Discard [o] Open [q] Quit [?] More'\n }\n </Text>\n </Box>\n </Box>\n );\n};\n",
|
|
6
|
+
"import React, { useState, useEffect } from 'react';\nimport { Text } from 'ink';\nimport spinners from 'cli-spinners';\n/**\n * Spinner.\n */\nfunction Spinner({ type = 'dots' }) {\n const [frame, setFrame] = useState(0);\n const spinner = spinners[type];\n useEffect(() => {\n const timer = setInterval(() => {\n setFrame(previousFrame => {\n const isLastFrame = previousFrame === spinner.frames.length - 1;\n return isLastFrame ? 0 : previousFrame + 1;\n });\n }, spinner.interval);\n return () => {\n clearInterval(timer);\n };\n }, [spinner]);\n return React.createElement(Text, null, spinner.frames[frame]);\n}\nexport default Spinner;\n//# sourceMappingURL=index.js.map",
|
|
7
|
+
"import React, { useState, useEffect } from 'react';\nimport { Text, useInput } from 'ink';\nimport chalk from 'chalk';\nfunction TextInput({ value: originalValue, placeholder = '', focus = true, mask, highlightPastedText = false, showCursor = true, onChange, onSubmit, }) {\n const [state, setState] = useState({\n cursorOffset: (originalValue || '').length,\n cursorWidth: 0,\n });\n const { cursorOffset, cursorWidth } = state;\n useEffect(() => {\n setState(previousState => {\n if (!focus || !showCursor) {\n return previousState;\n }\n const newValue = originalValue || '';\n if (previousState.cursorOffset > newValue.length - 1) {\n return {\n cursorOffset: newValue.length,\n cursorWidth: 0,\n };\n }\n return previousState;\n });\n }, [originalValue, focus, showCursor]);\n const cursorActualWidth = highlightPastedText ? cursorWidth : 0;\n const value = mask ? mask.repeat(originalValue.length) : originalValue;\n let renderedValue = value;\n let renderedPlaceholder = placeholder ? chalk.grey(placeholder) : undefined;\n // Fake mouse cursor, because it's too inconvenient to deal with actual cursor and ansi escapes\n if (showCursor && focus) {\n renderedPlaceholder =\n placeholder.length > 0\n ? chalk.inverse(placeholder[0]) + chalk.grey(placeholder.slice(1))\n : chalk.inverse(' ');\n renderedValue = value.length > 0 ? '' : chalk.inverse(' ');\n let i = 0;\n for (const char of value) {\n renderedValue +=\n i >= cursorOffset - cursorActualWidth && i <= cursorOffset\n ? chalk.inverse(char)\n : char;\n i++;\n }\n if (value.length > 0 && cursorOffset === value.length) {\n renderedValue += chalk.inverse(' ');\n }\n }\n useInput((input, key) => {\n if (key.upArrow ||\n key.downArrow ||\n (key.ctrl && input === 'c') ||\n key.tab ||\n (key.shift && key.tab)) {\n return;\n }\n if (key.return) {\n if (onSubmit) {\n onSubmit(originalValue);\n }\n return;\n }\n let nextCursorOffset = cursorOffset;\n let nextValue = originalValue;\n let nextCursorWidth = 0;\n if (key.leftArrow) {\n if (showCursor) {\n nextCursorOffset--;\n }\n }\n else if (key.rightArrow) {\n if (showCursor) {\n nextCursorOffset++;\n }\n }\n else if (key.backspace || key.delete) {\n if (cursorOffset > 0) {\n nextValue =\n originalValue.slice(0, cursorOffset - 1) +\n originalValue.slice(cursorOffset, originalValue.length);\n nextCursorOffset--;\n }\n }\n else {\n nextValue =\n originalValue.slice(0, cursorOffset) +\n input +\n originalValue.slice(cursorOffset, originalValue.length);\n nextCursorOffset += input.length;\n if (input.length > 1) {\n nextCursorWidth = input.length;\n }\n }\n if (cursorOffset < 0) {\n nextCursorOffset = 0;\n }\n if (cursorOffset > originalValue.length) {\n nextCursorOffset = originalValue.length;\n }\n setState({\n cursorOffset: nextCursorOffset,\n cursorWidth: nextCursorWidth,\n });\n if (nextValue !== originalValue) {\n onChange(nextValue);\n }\n }, { isActive: focus });\n return (React.createElement(Text, null, placeholder\n ? value.length > 0\n ? renderedValue\n : renderedPlaceholder\n : renderedValue));\n}\nexport default TextInput;\nexport function UncontrolledTextInput({ initialValue = '', ...props }) {\n const [value, setValue] = useState(initialValue);\n return React.createElement(TextInput, { ...props, value: value, onChange: setValue });\n}\n//# sourceMappingURL=index.js.map",
|
|
8
|
+
"import fs from 'fs-extra';\nimport path from 'path';\nimport os from 'os';\n\ninterface ScreenState {\n status?: 'included' | 'ignored' | 'discarded';\n route?: string;\n}\n\ninterface SiteManifestData {\n screens: Record<string, ScreenState>;\n}\n\ninterface LegacyDiscardData {\n discardedScreenIds: string[];\n}\n\nexport class SiteManifest {\n private filePath: string;\n private legacyPath: string;\n\n constructor(projectId: string) {\n const dir = path.join(os.homedir(), '.stitch-mcp', 'site', projectId);\n this.filePath = path.join(dir, 'site-manifest.json');\n this.legacyPath = path.join(dir, 'discarded.json');\n }\n\n async load(): Promise<Map<string, ScreenState>> {\n try {\n const data: SiteManifestData = await fs.readJson(this.filePath);\n return new Map(Object.entries(data.screens || {}));\n } catch {\n // site-manifest.json doesn't exist or is corrupted — try legacy migration\n }\n\n try {\n const legacy: LegacyDiscardData = await fs.readJson(this.legacyPath);\n const map = new Map<string, ScreenState>();\n for (const id of legacy.discardedScreenIds || []) {\n map.set(id, { status: 'discarded' });\n }\n return map;\n } catch {\n return new Map();\n }\n }\n\n async save(screens: { id: string; status: string; route: string }[]): Promise<void> {\n const record: Record<string, ScreenState> = {};\n for (const screen of screens) {\n const entry: ScreenState = {};\n if (screen.status !== 'ignored') {\n entry.status = screen.status as ScreenState['status'];\n }\n if (screen.route !== '') {\n entry.route = screen.route;\n }\n if (entry.status || entry.route) {\n record[screen.id] = entry;\n }\n }\n await fs.ensureDir(path.dirname(this.filePath));\n const data: SiteManifestData = { screens: record };\n await fs.writeJson(this.filePath, data, { spaces: 2 });\n }\n}\n",
|
|
9
|
+
"import React from 'react';\nimport { Text } from 'ink';\n\ninterface StatusIconProps {\n status: 'included' | 'ignored' | 'discarded';\n}\n\nexport const StatusIcon: React.FC<StatusIconProps> = ({ status }) => {\n if (status === 'included') {\n return <Text color=\"green\">✔ </Text>;\n }\n if (status === 'discarded') {\n return <Text color=\"red\">✖ </Text>;\n }\n return <Text color=\"gray\">- </Text>;\n};\n",
|
|
10
|
+
"import React from 'react';\nimport { Box, Text, useStdout } from 'ink';\nimport type { UIScreen } from './types.js';\nimport { StatusIcon } from './components/StatusIcon.js';\n\ninterface ScreenListProps {\n items: { screen: UIScreen; sourceIndex: number }[];\n activeIndex: number;\n}\n\nexport const ScreenList: React.FC<ScreenListProps> = ({ items, activeIndex }) => {\n const { stdout } = useStdout();\n const height = stdout ? stdout.rows : 20; // Default to 20 if unavailable\n const LIST_HEIGHT = Math.max(5, height - 10); // Reserve space for header/footer\n\n // Adjust start to keep active item in view\n let start = 0;\n if (activeIndex >= LIST_HEIGHT) {\n start = activeIndex - LIST_HEIGHT + 1;\n }\n start = Math.max(0, activeIndex - Math.floor(LIST_HEIGHT / 2));\n const end = Math.min(items.length, start + LIST_HEIGHT);\n\n // Correction if near end\n if (end - start < LIST_HEIGHT && items.length > LIST_HEIGHT) {\n start = Math.max(0, items.length - LIST_HEIGHT);\n }\n\n const visibleItems = items.slice(start, end);\n\n return (\n <Box flexDirection=\"column\" flexGrow={1} borderStyle=\"single\" borderColor=\"blue\">\n {start > 0 && (\n <Box paddingLeft={1}>\n <Text color=\"gray\">... {start} more above ...</Text>\n </Box>\n )}\n\n {visibleItems.map((item, i) => {\n const index = start + i;\n const isActive = index === activeIndex;\n const { screen } = item;\n\n return (\n <Box key={screen.id}>\n <Text color={isActive ? 'cyan' : undefined}>\n {isActive ? '> ' : ' '}\n </Text>\n <StatusIcon status={screen.status} />\n <Text color={isActive ? 'cyan' : undefined} wrap=\"truncate\">\n {screen.title}\n </Text>\n {screen.route && (\n <Text color=\"gray\">{' -> '}{screen.route}</Text>\n )}\n </Box>\n );\n })}\n\n {end < items.length && (\n <Box paddingLeft={1}>\n <Text color=\"gray\">... {items.length - end} more below ...</Text>\n </Box>\n )}\n </Box>\n );\n};\n",
|
|
11
|
+
"import { useState, useEffect, useRef } from 'react';\nimport { StitchViteServer } from '../../../lib/server/vite/StitchViteServer.js';\nimport type { UIScreen } from '../../../lib/services/site/types.js';\nimport pLimit from 'p-limit';\n\nexport type HydrationStatus = 'idle' | 'downloading' | 'ready' | 'error';\n\nexport type FetchContentFn = (url: string) => Promise<string>;\n\nexport function useProjectHydration(\n screens: UIScreen[],\n server: StitchViteServer | null,\n fetchContent: FetchContentFn,\n activeScreenId?: string\n) {\n const [hydrationStatus, setHydrationStatus] = useState<HydrationStatus>('idle');\n const [progress, setProgress] = useState(0);\n const contentCache = useRef<Map<string, string>>(new Map());\n const [htmlContent, setHtmlContent] = useState<Map<string, string>>(new Map());\n\n useEffect(() => {\n if (!server || screens.length === 0) return;\n\n let mounted = true;\n\n const hydrate = async () => {\n // Determine what needs to be downloaded\n // 1. All included screens\n // 2. The active screen (for preview), even if ignored\n const toDownload = screens.filter(s => {\n if (contentCache.current.has(s.id)) return false;\n return s.status === 'included' || s.id === activeScreenId;\n });\n\n if (toDownload.length === 0) {\n // If nothing to download, ensure server has everything mounted\n // (Just in case activeScreenId changed to something already cached but not mounted?\n // Actually server mount is persistent as long as server is running.\n // But if we have cached content, we should ensure it is mounted.)\n\n // Also check if we should update status to ready\n if (hydrationStatus === 'idle' || hydrationStatus === 'downloading') {\n setHydrationStatus('ready');\n setHtmlContent(new Map(contentCache.current));\n }\n\n // Mount cached content to server if not already?\n // It's safer to re-mount or check.\n // For now, let's just mount the active one to be sure if it's cached.\n if (activeScreenId && contentCache.current.has(activeScreenId)) {\n server.mount(`/_preview/${activeScreenId}`, contentCache.current.get(activeScreenId)!);\n }\n\n return;\n }\n\n setHydrationStatus('downloading');\n const limit = pLimit(3);\n let completed = 0;\n const total = toDownload.length;\n\n try {\n await Promise.all(toDownload.map(screen => limit(async () => {\n if (!mounted) return;\n\n if (!screen.downloadUrl) return;\n\n try {\n const html = await fetchContent(screen.downloadUrl);\n if (mounted) {\n contentCache.current.set(screen.id, html);\n server.mount(`/_preview/${screen.id}`, html);\n }\n } catch (e) {\n console.error(`Failed to hydrate ${screen.id}`, e);\n }\n\n if (mounted) {\n completed++;\n setProgress(completed / total);\n }\n })));\n\n if (mounted) {\n setHtmlContent(new Map(contentCache.current));\n setHydrationStatus('ready');\n }\n } catch (e) {\n if (mounted) setHydrationStatus('error');\n }\n };\n\n hydrate();\n\n return () => { mounted = false; };\n }, [screens, server, fetchContent, activeScreenId]);\n\n return { hydrationStatus, progress, htmlContent };\n}\n"
|
|
12
|
+
],
|
|
13
|
+
"mappings": "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",
|
|
14
|
+
"debugId": "871FC3A79A136BE664756E2164756E21",
|
|
15
|
+
"names": []
|
|
16
|
+
}
|