@_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
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import {
|
|
2
|
+
JSONRPCMessageSchema,
|
|
3
|
+
StitchProxy
|
|
4
|
+
} from "./chunk-a1mk24q9.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": ";;;;;;;;AAAA;;;ACIO,MAAM,WAAW;AAAA,EACpB,MAAM,CAAC,OAAO;AAAA,IACV,KAAK,UAAU,KAAK,UAAU,OAAO,OAAO,CAAC,KAAK,SAAS,KAAK,CAAC,IAAI;AAAA;AAAA,EAEzE,WAAW,GAAG;AAAA,IACV,IAAI,CAAC,KAAK,SAAS;AAAA,MACf,OAAO;AAAA,IACX;AAAA,IACA,MAAM,QAAQ,KAAK,QAAQ,QAAQ;AAAA,CAAI;AAAA,IACvC,IAAI,UAAU,IAAI;AAAA,MACd,OAAO;AAAA,IACX;AAAA,IACA,MAAM,OAAO,KAAK,QAAQ,SAAS,QAAQ,GAAG,KAAK,EAAE,QAAQ,OAAO,EAAE;AAAA,IACtE,KAAK,UAAU,KAAK,QAAQ,SAAS,QAAQ,CAAC;AAAA,IAC9C,OAAO,mBAAmB,IAAI;AAAA;AAAA,EAElC,KAAK,GAAG;AAAA,IACJ,KAAK,UAAU;AAAA;AAEvB;AACO,SAAS,kBAAkB,CAAC,MAAM;AAAA,EACrC,OAAO,qBAAqB,MAAM,KAAK,MAAM,IAAI,CAAC;AAAA;AAE/C,SAAS,gBAAgB,CAAC,SAAS;AAAA,EACtC,OAAO,KAAK,UAAU,OAAO,IAAI;AAAA;AAAA;;;ADrB9B,MAAM,qBAAqB;AAAA,EAC9B,WAAW,CAAC,SAAS,SAAQ,OAAO,UAAU,SAAQ,QAAQ;AAAA,IAC1D,KAAK,SAAS;AAAA,IACd,KAAK,UAAU;AAAA,IACf,KAAK,cAAc,IAAI;AAAA,IACvB,KAAK,WAAW;AAAA,IAEhB,KAAK,UAAU,CAAC,UAAU;AAAA,MACtB,KAAK,YAAY,OAAO,KAAK;AAAA,MAC7B,KAAK,kBAAkB;AAAA;AAAA,IAE3B,KAAK,WAAW,CAAC,UAAU;AAAA,MACvB,KAAK,UAAU,KAAK;AAAA;AAAA;AAAA,OAMtB,MAAK,GAAG;AAAA,IACV,IAAI,KAAK,UAAU;AAAA,MACf,MAAM,IAAI,MAAM,+GAA+G;AAAA,IACnI;AAAA,IACA,KAAK,WAAW;AAAA,IAChB,KAAK,OAAO,GAAG,QAAQ,KAAK,OAAO;AAAA,IACnC,KAAK,OAAO,GAAG,SAAS,KAAK,QAAQ;AAAA;AAAA,EAEzC,iBAAiB,GAAG;AAAA,IAChB,OAAO,MAAM;AAAA,MACT,IAAI;AAAA,QACA,MAAM,UAAU,KAAK,YAAY,YAAY;AAAA,QAC7C,IAAI,YAAY,MAAM;AAAA,UAClB;AAAA,QACJ;AAAA,QACA,KAAK,YAAY,OAAO;AAAA,QAE5B,OAAO,OAAO;AAAA,QACV,KAAK,UAAU,KAAK;AAAA;AAAA,IAE5B;AAAA;AAAA,OAEE,MAAK,GAAG;AAAA,IAEV,KAAK,OAAO,IAAI,QAAQ,KAAK,OAAO;AAAA,IACpC,KAAK,OAAO,IAAI,SAAS,KAAK,QAAQ;AAAA,IAEtC,MAAM,yBAAyB,KAAK,OAAO,cAAc,MAAM;AAAA,IAC/D,IAAI,2BAA2B,GAAG;AAAA,MAG9B,KAAK,OAAO,MAAM;AAAA,IACtB;AAAA,IAEA,KAAK,YAAY,MAAM;AAAA,IACvB,KAAK,UAAU;AAAA;AAAA,EAEnB,IAAI,CAAC,SAAS;AAAA,IACV,OAAO,IAAI,QAAQ,aAAW;AAAA,MAC1B,MAAM,OAAO,iBAAiB,OAAO;AAAA,MACrC,IAAI,KAAK,QAAQ,MAAM,IAAI,GAAG;AAAA,QAC1B,QAAQ;AAAA,MACZ,EACK;AAAA,QACD,KAAK,QAAQ,KAAK,SAAS,OAAO;AAAA;AAAA,KAEzC;AAAA;AAET;;;AE1DO,MAAM,oBAAoB;AAAA,EACvB;AAAA,EACA;AAAA,EAER,WAAW,CAAC,MAGT;AAAA,IACD,KAAK,cAAc,MAAM,gBAAgB,CAAC,SAAS,IAAI,YAAY,IAAI;AAAA,IACvE,KAAK,kBAAkB,MAAM,oBAAoB,MAAM,IAAI;AAAA;AAAA,OAGvD,QAAO,CAAC,OAAuD;AAAA,IACnE,IAAI;AAAA,MACF,MAAM,QAAQ,KAAK,YAAY;AAAA,QAC7B,QAAQ,QAAQ,IAAI;AAAA,MACtB,CAAC;AAAA,MACD,MAAM,YAAY,KAAK,gBAAgB;AAAA,MACvC,MAAM,MAAM,MAAM,SAAS;AAAA,MAC3B,OAAO,EAAE,SAAS,MAAM,MAAM,EAAE,QAAQ,UAAU,EAAE;AAAA,MACpD,OAAO,GAAQ;AAAA,MACf,OAAO,EAAE,SAAS,OAAO,OAAO,EAAE,MAAM,qBAAqB,SAAS,EAAE,SAAS,aAAa,MAAM,EAAE;AAAA;AAAA;AAG5G;",
|
|
10
|
+
"debugId": "BEACF8DA099E305664756E2164756E21",
|
|
11
|
+
"names": []
|
|
12
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import {
|
|
2
|
+
icons,
|
|
3
|
+
theme
|
|
4
|
+
} from "./chunk-kbtqrkwh.js";
|
|
5
|
+
import"./chunk-3sfn889r.js";
|
|
6
|
+
import {
|
|
7
|
+
__require
|
|
8
|
+
} from "./chunk-9wyra8hs.js";
|
|
9
|
+
|
|
10
|
+
// src/commands/view/handler.ts
|
|
11
|
+
class ViewCommandHandler {
|
|
12
|
+
async execute(options) {
|
|
13
|
+
if (options.serve) {
|
|
14
|
+
await this.executeServeMode(options);
|
|
15
|
+
} else {
|
|
16
|
+
await this.executeInteractiveMode(options);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
async executeServeMode(options) {
|
|
20
|
+
if (!options.screen && !options.sourceScreen && !options.name) {
|
|
21
|
+
console.error(theme.red("Error: --serve requires a screen to be specified via --screen, --sourceScreen, or --name"));
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
const { ViewHandler } = await import("./chunk-rfrcdsfc.js");
|
|
25
|
+
const handler = new ViewHandler;
|
|
26
|
+
const execOptions = { projects: false };
|
|
27
|
+
if (options.project)
|
|
28
|
+
execOptions.project = options.project;
|
|
29
|
+
if (options.screen)
|
|
30
|
+
execOptions.screen = options.screen;
|
|
31
|
+
if (options.sourceScreen)
|
|
32
|
+
execOptions.sourceScreen = options.sourceScreen;
|
|
33
|
+
if (options.name)
|
|
34
|
+
execOptions.name = options.name;
|
|
35
|
+
const res = await handler.execute(execOptions);
|
|
36
|
+
if (!res.success)
|
|
37
|
+
throw new Error(res.error.message);
|
|
38
|
+
const resource = res.data;
|
|
39
|
+
if (!resource) {
|
|
40
|
+
throw new Error("Could not find resource");
|
|
41
|
+
}
|
|
42
|
+
if (!resource.htmlCode || !resource.htmlCode.downloadUrl) {
|
|
43
|
+
console.error(theme.red("Error: The specified resource is not a screen or has no HTML code."));
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
const { StitchViteServer } = await import("./chunk-j0y94q2c.js");
|
|
47
|
+
const { downloadText } = await import("./chunk-nzv6abbc.js");
|
|
48
|
+
const server = new StitchViteServer;
|
|
49
|
+
const url = await server.start(0);
|
|
50
|
+
console.log(theme.green(`Starting server at ${url}`));
|
|
51
|
+
console.log("Downloading content...");
|
|
52
|
+
const html = await downloadText(resource.htmlCode.downloadUrl);
|
|
53
|
+
server.mount("/", html);
|
|
54
|
+
console.log(theme.green(`Serving screen "${resource.title || "Screen"}" at ${url}/`));
|
|
55
|
+
console.log("Press Ctrl+C to stop.");
|
|
56
|
+
await new Promise(() => {});
|
|
57
|
+
}
|
|
58
|
+
async executeInteractiveMode(options) {
|
|
59
|
+
const { render } = await import("./chunk-t092ehvp.js");
|
|
60
|
+
const React = await import("./chunk-edp6faw2.js");
|
|
61
|
+
const { InteractiveViewer } = await import("./chunk-dffwrtn3.js");
|
|
62
|
+
const { ViewHandler } = await import("./chunk-rfrcdsfc.js");
|
|
63
|
+
const handler = new ViewHandler;
|
|
64
|
+
const result = await handler.execute({
|
|
65
|
+
projects: options.projects,
|
|
66
|
+
name: options.name,
|
|
67
|
+
sourceScreen: options.sourceScreen,
|
|
68
|
+
project: options.project,
|
|
69
|
+
screen: options.screen
|
|
70
|
+
});
|
|
71
|
+
if (!result.success) {
|
|
72
|
+
console.error(theme.red(`
|
|
73
|
+
${icons.error} View failed: ${result.error.message}`));
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
const createElement = React.createElement || React.default.createElement;
|
|
77
|
+
let rootLabel;
|
|
78
|
+
if (options.sourceScreen) {
|
|
79
|
+
rootLabel = "screen";
|
|
80
|
+
} else if (options.name) {
|
|
81
|
+
rootLabel = "resource";
|
|
82
|
+
}
|
|
83
|
+
const fetchResource = async (resourceName) => {
|
|
84
|
+
if (resourceName.includes("/screens/")) {
|
|
85
|
+
const navResult = await handler.execute({ projects: false, sourceScreen: resourceName });
|
|
86
|
+
if (!navResult.success)
|
|
87
|
+
throw new Error(navResult.error.message);
|
|
88
|
+
return navResult.data;
|
|
89
|
+
} else {
|
|
90
|
+
const navResult = await handler.execute({ projects: false, name: resourceName });
|
|
91
|
+
if (!navResult.success)
|
|
92
|
+
throw new Error(navResult.error.message);
|
|
93
|
+
return navResult.data;
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
const initialHistory = [];
|
|
97
|
+
if (options.sourceScreen) {
|
|
98
|
+
const projectMatch = options.sourceScreen.match(/^(projects\/\d+)/);
|
|
99
|
+
if (projectMatch) {
|
|
100
|
+
const projectName = projectMatch[1];
|
|
101
|
+
try {
|
|
102
|
+
const projectsResult = await handler.execute({ projects: true });
|
|
103
|
+
if (projectsResult.success) {
|
|
104
|
+
initialHistory.push({ data: projectsResult.data, rootLabel: undefined });
|
|
105
|
+
}
|
|
106
|
+
} catch (e) {}
|
|
107
|
+
try {
|
|
108
|
+
const projectResult = await handler.execute({ projects: false, name: projectName });
|
|
109
|
+
if (projectResult.success) {
|
|
110
|
+
initialHistory.push({ data: projectResult.data, rootLabel: "resource", resourcePath: projectName });
|
|
111
|
+
}
|
|
112
|
+
} catch (e) {}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (options.name && !options.sourceScreen) {
|
|
116
|
+
try {
|
|
117
|
+
const projectsResult = await handler.execute({ projects: true });
|
|
118
|
+
if (projectsResult.success) {
|
|
119
|
+
initialHistory.push({ data: projectsResult.data, rootLabel: undefined });
|
|
120
|
+
}
|
|
121
|
+
} catch (e) {}
|
|
122
|
+
}
|
|
123
|
+
const instance = render(createElement(InteractiveViewer, {
|
|
124
|
+
initialData: result.data,
|
|
125
|
+
initialRootLabel: rootLabel,
|
|
126
|
+
initialHistory: initialHistory.length > 0 ? initialHistory : undefined,
|
|
127
|
+
onFetch: fetchResource
|
|
128
|
+
}));
|
|
129
|
+
await instance.waitUntilExit();
|
|
130
|
+
process.exit(0);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
export {
|
|
134
|
+
ViewCommandHandler
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
//# debugId=FACA0134243A0F2764756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/commands/view/handler.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { theme, icons } from '../../ui/theme.js';\n\ninterface ViewOptions {\n projects: boolean;\n name?: string;\n sourceScreen?: string;\n project?: string;\n screen?: string;\n serve: boolean;\n}\n\nexport class ViewCommandHandler {\n async execute(options: ViewOptions): Promise<void> {\n if (options.serve) {\n await this.executeServeMode(options);\n } else {\n await this.executeInteractiveMode(options);\n }\n }\n\n private async executeServeMode(options: ViewOptions): Promise<void> {\n if (!options.screen && !options.sourceScreen && !options.name) {\n console.error(theme.red('Error: --serve requires a screen to be specified via --screen, --sourceScreen, or --name'));\n process.exit(1);\n }\n\n const { ViewHandler } = await import('../../services/view/handler.js');\n const handler = new ViewHandler();\n\n const execOptions: any = { projects: false };\n if (options.project) execOptions.project = options.project;\n if (options.screen) execOptions.screen = options.screen;\n if (options.sourceScreen) execOptions.sourceScreen = options.sourceScreen;\n if (options.name) execOptions.name = options.name;\n\n const res = await handler.execute(execOptions);\n if (!res.success) throw new Error(res.error.message);\n\n const resource = res.data;\n if (!resource) {\n throw new Error('Could not find resource');\n }\n\n if (!resource.htmlCode || !resource.htmlCode.downloadUrl) {\n console.error(theme.red('Error: The specified resource is not a screen or has no HTML code.'));\n process.exit(1);\n }\n\n const { StitchViteServer } = await import('../../lib/server/vite/StitchViteServer.js');\n const { downloadText } = await import('../../ui/copy-behaviors/clipboard.js');\n\n const server = new StitchViteServer();\n const url = await server.start(0);\n console.log(theme.green(`Starting server at ${url}`));\n\n console.log('Downloading content...');\n const html = await downloadText(resource.htmlCode.downloadUrl);\n server.mount('/', html);\n\n console.log(theme.green(`Serving screen \"${resource.title || 'Screen'}\" at ${url}/`));\n console.log('Press Ctrl+C to stop.');\n\n await new Promise(() => {});\n }\n\n private async executeInteractiveMode(options: ViewOptions): Promise<void> {\n const { render } = await import('ink');\n const React = await import('react');\n const { InteractiveViewer } = await import('../../ui/InteractiveViewer.js');\n const { ViewHandler } = await import('../../services/view/handler.js');\n\n const handler = new ViewHandler();\n const result = await handler.execute({\n projects: options.projects,\n name: options.name,\n sourceScreen: options.sourceScreen,\n project: options.project,\n screen: options.screen,\n });\n\n if (!result.success) {\n console.error(theme.red(`\\n${icons.error} View failed: ${result.error.message}`));\n process.exit(1);\n }\n\n const createElement = React.createElement || (React.default as any).createElement;\n\n let rootLabel: string | undefined;\n if (options.sourceScreen) {\n rootLabel = 'screen';\n } else if (options.name) {\n rootLabel = 'resource';\n }\n\n const fetchResource = async (resourceName: string): Promise<any> => {\n if (resourceName.includes('/screens/')) {\n const navResult = await handler.execute({ projects: false, sourceScreen: resourceName });\n if (!navResult.success) throw new Error(navResult.error.message);\n return navResult.data;\n } else {\n const navResult = await handler.execute({ projects: false, name: resourceName });\n if (!navResult.success) throw new Error(navResult.error.message);\n return navResult.data;\n }\n };\n\n const initialHistory: Array<{ data: any; rootLabel?: string; resourcePath?: string }> = [];\n\n if (options.sourceScreen) {\n const projectMatch = options.sourceScreen.match(/^(projects\\/\\d+)/);\n if (projectMatch) {\n const projectName = projectMatch[1];\n try {\n const projectsResult = await handler.execute({ projects: true });\n if (projectsResult.success) {\n initialHistory.push({ data: projectsResult.data, rootLabel: undefined });\n }\n } catch (e) {}\n\n try {\n const projectResult = await handler.execute({ projects: false, name: projectName });\n if (projectResult.success) {\n initialHistory.push({ data: projectResult.data, rootLabel: 'resource', resourcePath: projectName });\n }\n } catch (e) {}\n }\n }\n\n if (options.name && !options.sourceScreen) {\n try {\n const projectsResult = await handler.execute({ projects: true });\n if (projectsResult.success) {\n initialHistory.push({ data: projectsResult.data, rootLabel: undefined });\n }\n } catch (e) {}\n }\n\n const instance = render(createElement(InteractiveViewer, {\n initialData: result.data,\n initialRootLabel: rootLabel,\n initialHistory: initialHistory.length > 0 ? initialHistory : undefined,\n onFetch: fetchResource,\n }));\n await instance.waitUntilExit();\n process.exit(0);\n }\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "FACA0134243A0F2764756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DoctorHandler
|
|
3
|
+
} from "./chunk-7zy0vdv5.js";
|
|
4
|
+
import"./chunk-py8fhw0k.js";
|
|
5
|
+
import"./chunk-jyem6j6k.js";
|
|
6
|
+
import"./chunk-nq68kghz.js";
|
|
7
|
+
import"./chunk-q6sv0243.js";
|
|
8
|
+
import"./chunk-f2hq6bfv.js";
|
|
9
|
+
import"./chunk-4jygt4d6.js";
|
|
10
|
+
import"./chunk-tz7wnw4s.js";
|
|
11
|
+
import"./chunk-kbtqrkwh.js";
|
|
12
|
+
import"./chunk-3sfn889r.js";
|
|
13
|
+
import"./chunk-c6ge431q.js";
|
|
14
|
+
import"./chunk-9wyra8hs.js";
|
|
15
|
+
export {
|
|
16
|
+
DoctorHandler
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
//# debugId=71BB7D9626616D6E64756E2164756E21
|
|
@@ -182,7 +182,7 @@ class SnapshotHandler {
|
|
|
182
182
|
try {
|
|
183
183
|
switch (input.command) {
|
|
184
184
|
case "init": {
|
|
185
|
-
const { InitHandler } = await import("./chunk-
|
|
185
|
+
const { InitHandler } = await import("./chunk-5f2htt6r.js");
|
|
186
186
|
const handler = new InitHandler(this.services?.gcloud, this.services?.mcpConfig, this.services?.project, this.services?.stitch, mockUI);
|
|
187
187
|
const initInput = {
|
|
188
188
|
local: false,
|
|
@@ -197,7 +197,7 @@ class SnapshotHandler {
|
|
|
197
197
|
break;
|
|
198
198
|
}
|
|
199
199
|
case "doctor": {
|
|
200
|
-
const { DoctorHandler } = await import("./chunk-
|
|
200
|
+
const { DoctorHandler } = await import("./chunk-26cgk4dt.js");
|
|
201
201
|
const handler = new DoctorHandler(this.services?.gcloud, this.services?.stitch, mockUI);
|
|
202
202
|
const doctorInput = {
|
|
203
203
|
verbose: false,
|
|
@@ -210,12 +210,16 @@ class SnapshotHandler {
|
|
|
210
210
|
break;
|
|
211
211
|
}
|
|
212
212
|
case "site": {
|
|
213
|
-
const { SiteBuilder } = await import("./chunk-
|
|
214
|
-
const {
|
|
215
|
-
const mockScreens = data.screens || []
|
|
216
|
-
|
|
213
|
+
const { SiteBuilder } = await import("./chunk-44tn9dxb.js");
|
|
214
|
+
const { createMockStitch, createMockProject, createMockScreen } = await import("./chunk-98trrxk2.js");
|
|
215
|
+
const mockScreens = (data.screens || []).map((s) => createMockScreen({
|
|
216
|
+
screenId: s.name,
|
|
217
|
+
title: s.title,
|
|
218
|
+
getHtml: () => Promise.resolve(s.htmlCode?.downloadUrl || null)
|
|
219
|
+
}));
|
|
220
|
+
const mockClient = createMockStitch(createMockProject(data.inputArgs?.projectId || "mock-project", mockScreens));
|
|
217
221
|
try {
|
|
218
|
-
const { render } = await import("./chunk-
|
|
222
|
+
const { render } = await import("./chunk-gwnmywrp.js");
|
|
219
223
|
const React = await import("./chunk-edp6faw2.js");
|
|
220
224
|
const projectId = data.inputArgs?.projectId || "mock-project";
|
|
221
225
|
const { lastFrame, unmount } = render(React.createElement(SiteBuilder, {
|
|
@@ -249,4 +253,4 @@ export {
|
|
|
249
253
|
SnapshotHandler
|
|
250
254
|
};
|
|
251
255
|
|
|
252
|
-
//# debugId=
|
|
256
|
+
//# debugId=F78CBF4C733E0A4464756E2164756E21
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/commands/snapshot/handler.ts", "../src/framework/MockUI.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import fs from 'fs-extra';\nimport { type SnapshotCommand, type SnapshotInput, type SnapshotResult } from './spec.js';\nimport { MockUI } from '../../framework/MockUI.js';\nimport { theme } from '../../ui/theme.js';\nimport { type GcloudService } from '../../services/gcloud/spec.js';\nimport { type StitchService } from '../../services/stitch/spec.js';\nimport { type McpConfigService } from '../../services/mcp-config/spec.js';\nimport { type ProjectService } from '../../services/project/spec.js';\n\ninterface SnapshotServices {\n gcloud?: GcloudService;\n stitch?: StitchService;\n mcpConfig?: McpConfigService;\n project?: ProjectService;\n}\n\n// Schemas for the commands to be printed with -s\nconst SCHEMAS: Record<string, any> = {\n init: {\n description: \"Data schema for 'init' command\",\n type: \"object\",\n properties: {\n mcpClient: { type: \"string\", enum: [\"vscode\", \"cursor\", \"claude-code\", \"gemini-cli\", \"codex\", \"opencode\"] },\n authMode: { type: \"string\", enum: [\"apiKey\", \"oauth\"] },\n transportType: { type: \"string\", enum: [\"http\", \"stdio\"] },\n apiKeyStorage: { type: \"string\", enum: [\"config\", \"skip\", \".env\"] },\n apiKey: { type: \"string\" },\n confirm: { type: \"boolean\" },\n inputArgs: {\n type: \"object\",\n description: \"Arguments to pass to the command execution\",\n properties: {\n local: { type: \"boolean\" },\n defaults: { type: \"boolean\" },\n autoVerify: { type: \"boolean\" },\n client: { type: \"string\" },\n transport: { type: \"string\" }\n }\n }\n },\n required: [\"mcpClient\", \"authMode\"]\n },\n doctor: {\n description: \"Data schema for 'doctor' command\",\n type: \"object\",\n properties: {\n confirm: { type: \"boolean\" },\n inputArgs: {\n type: \"object\",\n description: \"Arguments to pass to the command execution\",\n properties: {\n verbose: { type: \"boolean\" }\n }\n }\n }\n },\n site: {\n description: \"Data schema for 'site' command\",\n type: \"object\",\n properties: {\n screens: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n id: { type: \"string\" },\n title: { type: \"string\" },\n description: { type: \"string\" },\n type: { type: \"string\" },\n content: { type: \"string\" }\n }\n }\n },\n inputArgs: {\n type: \"object\",\n properties: {\n projectId: { type: \"string\" },\n outputDir: { type: \"string\" }\n }\n }\n }\n }\n};\n\nexport class SnapshotHandler implements SnapshotCommand {\n constructor(private readonly services?: SnapshotServices) {}\n\n async execute(input: SnapshotInput): Promise<SnapshotResult> {\n if (input.schema) {\n if (input.command) {\n const schema = SCHEMAS[input.command];\n if (!schema) {\n return {\n success: false,\n error: { message: `No schema found for command '${input.command}'` }\n };\n }\n console.log(JSON.stringify(schema, null, 2));\n } else {\n console.log(JSON.stringify(Object.keys(SCHEMAS), null, 2));\n }\n return { success: true };\n }\n\n if (!input.command) {\n return { success: false, error: { message: \"Command (-c) is required unless using -s\" } };\n }\n if (!input.data) {\n return { success: false, error: { message: \"Data file (-d) is required unless using -s\" } };\n }\n\n // Load data\n let data: any;\n try {\n if (await fs.pathExists(input.data)) {\n data = await fs.readJson(input.data);\n } else {\n // Try parsing as JSON string\n try {\n data = JSON.parse(input.data);\n } catch {\n return { success: false, error: { message: `Data file not found at '${input.data}' and content is not valid JSON` } };\n }\n }\n } catch (e) {\n return { success: false, error: { message: `Failed to read data: ${e instanceof Error ? e.message : String(e)}` } };\n }\n\n const mockUI = new MockUI(data);\n\n try {\n switch (input.command) {\n case 'init': {\n const { InitHandler } = await import('../init/handler.js');\n const handler = new InitHandler(\n this.services?.gcloud,\n this.services?.mcpConfig,\n this.services?.project,\n this.services?.stitch,\n mockUI\n );\n const initInput = {\n local: false,\n defaults: false,\n autoVerify: true,\n ...data.inputArgs\n };\n const result = await handler.execute(initInput);\n if (!result.success) {\n console.error('Init failed:', result.error);\n }\n break;\n }\n case 'doctor': {\n const { DoctorHandler } = await import('../doctor/handler.js');\n const handler = new DoctorHandler(\n this.services?.gcloud,\n this.services?.stitch,\n mockUI\n );\n const doctorInput = {\n verbose: false,\n ...data.inputArgs\n };\n const result = await handler.execute(doctorInput);\n if (!result.success) {\n console.error('Doctor failed:', result.error);\n }\n break;\n }\n case 'site': {\n const { SiteBuilder } = await import('../site/ui/SiteBuilder.js');\n const { createMockStitch, createMockProject, createMockScreen } = await import('../../services/stitch-sdk/MockStitchSDK.js');\n\n const mockScreens = (data.screens || []).map((s: any) => createMockScreen({\n screenId: s.name,\n title: s.title,\n getHtml: (() => Promise.resolve(s.htmlCode?.downloadUrl || null)) as any,\n }));\n const mockClient = createMockStitch(createMockProject(data.inputArgs?.projectId || 'mock-project', mockScreens));\n\n // Use ink-testing-library to render and snapshot the UI\n try {\n // We use require to avoid type checking issues if it's not installed in prod build env,\n // although this command is a dev tool.\n const { render } = await import('ink-testing-library');\n const React = await import('react');\n\n const projectId = data.inputArgs?.projectId || 'mock-project';\n\n const { lastFrame, unmount } = render(\n React.createElement(SiteBuilder, {\n projectId,\n client: mockClient,\n onExit: () => {}\n })\n );\n\n // Wait for async operations (loading screens)\n // Simple delay for now, or check frame content until \"Loading\" is gone\n // Since we can't easily wait for a specific state without more complex logic,\n // let's try a short delay to allow useEffect to run.\n await new Promise(resolve => setTimeout(resolve, 1000));\n\n console.log(lastFrame());\n unmount();\n } catch (e) {\n if ((e as any).code === 'ERR_MODULE_NOT_FOUND') {\n console.warn(theme.yellow('ink-testing-library not found. Install dev dependencies to snapshot site command.'));\n } else {\n throw e;\n }\n }\n break;\n }\n default:\n return { success: false, error: { message: `Unsupported command '${input.command}'` } };\n }\n } catch (error) {\n console.error(theme.red('Command execution failed:'), error);\n // Return success: true because the snapshotting process ran, even if the command failed.\n // The error is part of the snapshot.\n return { success: true };\n }\n\n return { success: true };\n }\n}\n",
|
|
6
|
+
"import { type UserInterface } from './UserInterface.js';\nimport type { McpClient } from '../ui/wizard.js';\n\nexport class MockUI implements UserInterface {\n constructor(private readonly data: Record<string, any>) {}\n\n async promptMcpClient(): Promise<McpClient> {\n if (!this.data.mcpClient) {\n throw new Error('MockUI: Missing data for mcpClient');\n }\n return this.data.mcpClient;\n }\n\n async promptAuthMode(): Promise<'apiKey' | 'oauth'> {\n if (!this.data.authMode) {\n throw new Error('MockUI: Missing data for authMode');\n }\n return this.data.authMode;\n }\n\n async promptTransportType(authMode?: 'apiKey' | 'oauth'): Promise<'http' | 'stdio'> {\n if (this.data.transportType) {\n return this.data.transportType;\n }\n throw new Error('MockUI: Missing data for transportType');\n }\n\n async promptApiKeyStorage(): Promise<'config' | 'skip' | '.env'> {\n if (!this.data.apiKeyStorage) {\n throw new Error('MockUI: Missing data for apiKeyStorage');\n }\n return this.data.apiKeyStorage;\n }\n\n async promptApiKey(): Promise<string> {\n if (!this.data.apiKey) {\n throw new Error('MockUI: Missing data for apiKey');\n }\n return this.data.apiKey;\n }\n\n async promptConfirm(message: string, defaultYes?: boolean): Promise<boolean> {\n if (typeof this.data.confirm === 'boolean') {\n return this.data.confirm;\n }\n // If specific confirm keys are provided in data, could use that too.\n // For now, default to defaultYes or false.\n return defaultYes ?? false;\n }\n\n log(message: string): void {\n console.log(message);\n }\n\n warn(message: string): void {\n console.log(`WARN: ${message}`);\n }\n\n error(message: string): void {\n console.error(`ERROR: ${message}`);\n }\n\n success(message: string): void {\n console.log(`SUCCESS: ${message}`);\n }\n}\n"
|
|
7
|
+
],
|
|
8
|
+
"mappings": ";;;;;;;;;;;;;AAAA;;;ACGO,MAAM,OAAgC;AAAA,EACd;AAAA,EAA7B,WAAW,CAAkB,MAA2B;AAAA,IAA3B;AAAA;AAAA,OAEvB,gBAAe,GAAuB;AAAA,IAC1C,IAAI,CAAC,KAAK,KAAK,WAAW;AAAA,MACxB,MAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AAAA,IACA,OAAO,KAAK,KAAK;AAAA;AAAA,OAGb,eAAc,GAAgC;AAAA,IAClD,IAAI,CAAC,KAAK,KAAK,UAAU;AAAA,MACvB,MAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AAAA,IACA,OAAO,KAAK,KAAK;AAAA;AAAA,OAGb,oBAAmB,CAAC,UAA0D;AAAA,IAClF,IAAI,KAAK,KAAK,eAAe;AAAA,MAC3B,OAAO,KAAK,KAAK;AAAA,IACnB;AAAA,IACA,MAAM,IAAI,MAAM,wCAAwC;AAAA;AAAA,OAGpD,oBAAmB,GAAwC;AAAA,IAC/D,IAAI,CAAC,KAAK,KAAK,eAAe;AAAA,MAC5B,MAAM,IAAI,MAAM,wCAAwC;AAAA,IAC1D;AAAA,IACA,OAAO,KAAK,KAAK;AAAA;AAAA,OAGb,aAAY,GAAoB;AAAA,IACpC,IAAI,CAAC,KAAK,KAAK,QAAQ;AAAA,MACrB,MAAM,IAAI,MAAM,iCAAiC;AAAA,IACnD;AAAA,IACA,OAAO,KAAK,KAAK;AAAA;AAAA,OAGb,cAAa,CAAC,SAAiB,YAAwC;AAAA,IAC3E,IAAI,OAAO,KAAK,KAAK,YAAY,WAAW;AAAA,MAC1C,OAAO,KAAK,KAAK;AAAA,IACnB;AAAA,IAGA,OAAO,cAAc;AAAA;AAAA,EAGvB,GAAG,CAAC,SAAuB;AAAA,IACzB,QAAQ,IAAI,OAAO;AAAA;AAAA,EAGrB,IAAI,CAAC,SAAuB;AAAA,IAC1B,QAAQ,IAAI,SAAS,SAAS;AAAA;AAAA,EAGhC,KAAK,CAAC,SAAuB;AAAA,IAC3B,QAAQ,MAAM,UAAU,SAAS;AAAA;AAAA,EAGnC,OAAO,CAAC,SAAuB;AAAA,IAC7B,QAAQ,IAAI,YAAY,SAAS;AAAA;AAErC;;;ADhDA,IAAM,UAA+B;AAAA,EACnC,MAAM;AAAA,IACJ,aAAa;AAAA,IACb,MAAM;AAAA,IACN,YAAY;AAAA,MACV,WAAW,EAAE,MAAM,UAAU,MAAM,CAAC,UAAU,UAAU,eAAe,cAAc,SAAS,UAAU,EAAE;AAAA,MAC1G,UAAU,EAAE,MAAM,UAAU,MAAM,CAAC,UAAU,OAAO,EAAE;AAAA,MACtD,eAAe,EAAE,MAAM,UAAU,MAAM,CAAC,QAAQ,OAAO,EAAE;AAAA,MACzD,eAAe,EAAE,MAAM,UAAU,MAAM,CAAC,UAAU,QAAQ,MAAM,EAAE;AAAA,MAClE,QAAQ,EAAE,MAAM,SAAS;AAAA,MACzB,SAAS,EAAE,MAAM,UAAU;AAAA,MAC3B,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,QACb,YAAY;AAAA,UACV,OAAO,EAAE,MAAM,UAAU;AAAA,UACzB,UAAU,EAAE,MAAM,UAAU;AAAA,UAC5B,YAAY,EAAE,MAAM,UAAU;AAAA,UAC9B,QAAQ,EAAE,MAAM,SAAS;AAAA,UACzB,WAAW,EAAE,MAAM,SAAS;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAAA,IACA,UAAU,CAAC,aAAa,UAAU;AAAA,EACpC;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IACb,MAAM;AAAA,IACN,YAAY;AAAA,MACV,SAAS,EAAE,MAAM,UAAU;AAAA,MAC3B,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,QACb,YAAY;AAAA,UACV,SAAS,EAAE,MAAM,UAAU;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,aAAa;AAAA,IACb,MAAM;AAAA,IACN,YAAY;AAAA,MACV,SAAS;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,UACL,MAAM;AAAA,UACN,YAAY;AAAA,YACT,IAAI,EAAE,MAAM,SAAS;AAAA,YACrB,OAAO,EAAE,MAAM,SAAS;AAAA,YACxB,aAAa,EAAE,MAAM,SAAS;AAAA,YAC9B,MAAM,EAAE,MAAM,SAAS;AAAA,YACvB,SAAS,EAAE,MAAM,SAAS;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AAAA,MACA,WAAW;AAAA,QACR,MAAM;AAAA,QACN,YAAY;AAAA,UACR,WAAW,EAAE,MAAM,SAAS;AAAA,UAC5B,WAAW,EAAE,MAAM,SAAS;AAAA,QAChC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;AAAA;AAEO,MAAM,gBAA2C;AAAA,EACzB;AAAA,EAA7B,WAAW,CAAkB,UAA6B;AAAA,IAA7B;AAAA;AAAA,OAEvB,QAAO,CAAC,OAA+C;AAAA,IAC3D,IAAI,MAAM,QAAQ;AAAA,MAChB,IAAI,MAAM,SAAS;AAAA,QACjB,MAAM,SAAS,QAAQ,MAAM;AAAA,QAC7B,IAAI,CAAC,QAAQ;AAAA,UACX,OAAO;AAAA,YACJ,SAAS;AAAA,YACT,OAAO,EAAE,SAAS,gCAAgC,MAAM,WAAW;AAAA,UACtE;AAAA,QACF;AAAA,QACA,QAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,MAC7C,EAAO;AAAA,QACL,QAAQ,IAAI,KAAK,UAAU,OAAO,KAAK,OAAO,GAAG,MAAM,CAAC,CAAC;AAAA;AAAA,MAE3D,OAAO,EAAE,SAAS,KAAK;AAAA,IACzB;AAAA,IAEA,IAAI,CAAC,MAAM,SAAS;AAAA,MAClB,OAAO,EAAE,SAAS,OAAO,OAAO,EAAE,SAAS,2CAA2C,EAAE;AAAA,IAC1F;AAAA,IACA,IAAI,CAAC,MAAM,MAAM;AAAA,MACf,OAAO,EAAE,SAAS,OAAO,OAAO,EAAE,SAAS,6CAA6C,EAAE;AAAA,IAC5F;AAAA,IAGA,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,IAAI,MAAM,wBAAG,WAAW,MAAM,IAAI,GAAG;AAAA,QACnC,OAAO,MAAM,wBAAG,SAAS,MAAM,IAAI;AAAA,MACrC,EAAO;AAAA,QAEL,IAAI;AAAA,UACF,OAAO,KAAK,MAAM,MAAM,IAAI;AAAA,UAC5B,MAAM;AAAA,UACL,OAAO,EAAE,SAAS,OAAO,OAAO,EAAE,SAAS,2BAA2B,MAAM,sCAAsC,EAAE;AAAA;AAAA;AAAA,MAGzH,OAAO,GAAG;AAAA,MACT,OAAO,EAAE,SAAS,OAAO,OAAO,EAAE,SAAS,wBAAwB,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,IAAI,EAAE;AAAA;AAAA,IAGrH,MAAM,SAAS,IAAI,OAAO,IAAI;AAAA,IAE9B,IAAI;AAAA,MACF,QAAQ,MAAM;AAAA,aACP,QAAQ;AAAA,UACX,QAAQ,gBAAgB,MAAa;AAAA,UACrC,MAAM,UAAU,IAAI,YAClB,KAAK,UAAU,QACf,KAAK,UAAU,WACf,KAAK,UAAU,SACf,KAAK,UAAU,QACf,MACF;AAAA,UACA,MAAM,YAAY;AAAA,YACf,OAAO;AAAA,YACP,UAAU;AAAA,YACV,YAAY;AAAA,eACT,KAAK;AAAA,UACX;AAAA,UACA,MAAM,SAAS,MAAM,QAAQ,QAAQ,SAAS;AAAA,UAC9C,IAAI,CAAC,OAAO,SAAS;AAAA,YAClB,QAAQ,MAAM,gBAAgB,OAAO,KAAK;AAAA,UAC7C;AAAA,UACA;AAAA,QACF;AAAA,aACK,UAAU;AAAA,UACb,QAAQ,kBAAkB,MAAa;AAAA,UACvC,MAAM,UAAU,IAAI,cAClB,KAAK,UAAU,QACf,KAAK,UAAU,QACf,MACF;AAAA,UACA,MAAM,cAAc;AAAA,YACjB,SAAS;AAAA,eACN,KAAK;AAAA,UACX;AAAA,UACA,MAAM,SAAS,MAAM,QAAQ,QAAQ,WAAW;AAAA,UAChD,IAAI,CAAC,OAAO,SAAS;AAAA,YAClB,QAAQ,MAAM,kBAAkB,OAAO,KAAK;AAAA,UAC/C;AAAA,UACA;AAAA,QACF;AAAA,aACK,QAAQ;AAAA,UACX,QAAQ,gBAAgB,MAAa;AAAA,UACrC,QAAQ,kBAAkB,mBAAmB,qBAAqB,MAAa;AAAA,UAE/E,MAAM,eAAe,KAAK,WAAW,CAAC,GAAG,IAAI,CAAC,MAAW,iBAAiB;AAAA,YACxE,UAAU,EAAE;AAAA,YACZ,OAAO,EAAE;AAAA,YACT,SAAU,MAAM,QAAQ,QAAQ,EAAE,UAAU,eAAe,IAAI;AAAA,UACjE,CAAC,CAAC;AAAA,UACF,MAAM,aAAa,iBAAiB,kBAAkB,KAAK,WAAW,aAAa,gBAAgB,WAAW,CAAC;AAAA,UAG/G,IAAI;AAAA,YAGD,QAAQ,WAAW,MAAa;AAAA,YAChC,MAAM,QAAQ,MAAa;AAAA,YAE3B,MAAM,YAAY,KAAK,WAAW,aAAa;AAAA,YAE/C,QAAQ,WAAW,YAAY,OAC5B,MAAM,cAAc,aAAa;AAAA,cAC7B;AAAA,cACA,QAAQ;AAAA,cACR,QAAQ,MAAM;AAAA,YAClB,CAAC,CACJ;AAAA,YAMA,MAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,IAAI,CAAC;AAAA,YAEtD,QAAQ,IAAI,UAAU,CAAC;AAAA,YACvB,QAAQ;AAAA,YACT,OAAO,GAAG;AAAA,YACT,IAAK,EAAU,SAAS,wBAAwB;AAAA,cAC5C,QAAQ,KAAK,MAAM,OAAO,mFAAmF,CAAC;AAAA,YAClH,EAAO;AAAA,cACH,MAAM;AAAA;AAAA;AAAA,UAGb;AAAA,QACF;AAAA;AAAA,UAEE,OAAO,EAAE,SAAS,OAAO,OAAO,EAAE,SAAS,wBAAwB,MAAM,WAAW,EAAE;AAAA;AAAA,MAE1F,OAAO,OAAO;AAAA,MACb,QAAQ,MAAM,MAAM,IAAI,2BAA2B,GAAG,KAAK;AAAA,MAG3D,OAAO,EAAE,SAAS,KAAK;AAAA;AAAA,IAG1B,OAAO,EAAE,SAAS,KAAK;AAAA;AAE3B;",
|
|
9
|
+
"debugId": "F78CBF4C733E0A4464756E2164756E21",
|
|
10
|
+
"names": []
|
|
11
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
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
|
+
const codeUrl = await s.getHtml().catch(() => null);
|
|
19
|
+
return { screenId: s.screenId, title: s.title ?? s.screenId, codeUrl };
|
|
20
|
+
})));
|
|
21
|
+
const filtered = withHtml.filter((s) => s.codeUrl !== null).sort((a, b) => a.title.localeCompare(b.title));
|
|
22
|
+
return {
|
|
23
|
+
success: true,
|
|
24
|
+
projectId,
|
|
25
|
+
projectTitle: project.data?.title ?? projectId,
|
|
26
|
+
screens: filtered
|
|
27
|
+
};
|
|
28
|
+
} catch (e) {
|
|
29
|
+
return {
|
|
30
|
+
success: false,
|
|
31
|
+
error: { code: "SCREENS_FETCH_FAILED", message: e.message, recoverable: false }
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export {
|
|
37
|
+
ServeHandler
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
//# debugId=0608323AFA1B550164756E2164756E21
|
|
@@ -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';\nimport type { ServeSpec, ServeResult } from './spec.js';\n\nexport class ServeHandler implements ServeSpec {\n constructor(private readonly stitch: Stitch) {}\n\n async execute(projectId: string): Promise<ServeResult> {\n try {\n const project = this.stitch.project(projectId);\n const screens = await project.screens();\n\n const limit = pLimit(3);\n const withHtml = await Promise.all(\n screens.map((s: any) => limit(async () => {\n const codeUrl = await s.getHtml().catch(() => null);\n return { screenId: s.screenId, title: s.title ?? s.screenId, codeUrl };\n }))\n );\n\n const filtered = withHtml\n .filter(s => s.codeUrl !== null)\n .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 {\n success: false,\n error: { code: 'SCREENS_FETCH_FAILED', message: e.message, recoverable: false },\n };\n }\n }\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;;;;;AAIO,MAAM,aAAkC;AAAA,EAChB;AAAA,EAA7B,WAAW,CAAkB,QAAgB;AAAA,IAAhB;AAAA;AAAA,OAEvB,QAAO,CAAC,WAAyC;AAAA,IACrD,IAAI;AAAA,MACF,MAAM,UAAU,KAAK,OAAO,QAAQ,SAAS;AAAA,MAC7C,MAAM,UAAU,MAAM,QAAQ,QAAQ;AAAA,MAEtC,MAAM,QAAQ,OAAO,CAAC;AAAA,MACtB,MAAM,WAAW,MAAM,QAAQ,IAC7B,QAAQ,IAAI,CAAC,MAAW,MAAM,YAAY;AAAA,QACxC,MAAM,UAAU,MAAM,EAAE,QAAQ,EAAE,MAAM,MAAM,IAAI;AAAA,QAClD,OAAO,EAAE,UAAU,EAAE,UAAU,OAAO,EAAE,SAAS,EAAE,UAAU,QAAQ;AAAA,OACtE,CAAC,CACJ;AAAA,MAEA,MAAM,WAAW,SACd,OAAO,OAAK,EAAE,YAAY,IAAI,EAC9B,KAAK,CAAC,GAAG,MAAM,EAAE,MAAM,cAAc,EAAE,KAAK,CAAC;AAAA,MAEhD,OAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,QACA,cAAc,QAAQ,MAAM,SAAS;AAAA,QACrC,SAAS;AAAA,MACX;AAAA,MACA,OAAO,GAAQ;AAAA,MACf,OAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,EAAE,MAAM,wBAAwB,SAAS,EAAE,SAAS,aAAa,MAAM;AAAA,MAChF;AAAA;AAAA;AAGN;",
|
|
8
|
+
"debugId": "0608323AFA1B550164756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|