@_davideast/stitch-mcp 0.5.5 → 0.7.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-0xbbvsve.js +370 -0
- package/dist/chunk-0xbbvsve.js.map +16 -0
- package/dist/chunk-11ab03kg.js +137 -0
- package/dist/chunk-11ab03kg.js.map +10 -0
- package/dist/chunk-17cs61t4.js +270 -0
- package/dist/chunk-17cs61t4.js.map +10 -0
- package/dist/chunk-1mz7188j.js +20 -0
- package/dist/chunk-1mz7188j.js.map +9 -0
- package/dist/chunk-1txb8kjb.js +17 -0
- package/dist/chunk-1txb8kjb.js.map +9 -0
- package/dist/chunk-1v5q6d3n.js +17 -0
- package/dist/chunk-1v5q6d3n.js.map +9 -0
- package/dist/chunk-1wcg0pjg.js +94 -0
- package/dist/chunk-1wcg0pjg.js.map +10 -0
- package/dist/chunk-2zp03jky.js +19 -0
- package/dist/chunk-2zp03jky.js.map +9 -0
- package/dist/chunk-441ntz7a.js +137 -0
- package/dist/chunk-441ntz7a.js.map +10 -0
- package/dist/chunk-543135qd.js +43679 -0
- package/dist/chunk-543135qd.js.map +234 -0
- package/dist/chunk-564wpgj7.js +246 -0
- package/dist/chunk-564wpgj7.js.map +14 -0
- package/dist/chunk-5jbenaez.js +19185 -0
- package/dist/chunk-5jbenaez.js.map +115 -0
- package/dist/chunk-633ma50k.js +371 -0
- package/dist/chunk-633ma50k.js.map +16 -0
- package/dist/chunk-7ryqstaa.js +7065 -0
- package/dist/chunk-7ryqstaa.js.map +115 -0
- package/dist/chunk-7z5z40ar.js +165 -0
- package/dist/chunk-7z5z40ar.js.map +10 -0
- package/dist/chunk-86gwwcyr.js +46325 -0
- package/dist/chunk-86gwwcyr.js.map +261 -0
- package/dist/chunk-8gegrmmt.js +256 -0
- package/dist/chunk-8gegrmmt.js.map +11 -0
- package/dist/chunk-8hgrrc49.js +17 -0
- package/dist/chunk-8hgrrc49.js.map +9 -0
- package/dist/chunk-8w97w2wa.js +50 -0
- package/dist/chunk-8w97w2wa.js.map +9 -0
- package/dist/chunk-8yfetpqq.js +19132 -0
- package/dist/chunk-8yfetpqq.js.map +115 -0
- package/dist/chunk-94knm2sw.js +1495 -0
- package/dist/chunk-94knm2sw.js.map +23 -0
- package/dist/chunk-9ckyz47q.js +518 -0
- package/dist/chunk-9ckyz47q.js.map +12 -0
- package/dist/chunk-appd0sxm.js +5217 -0
- package/dist/chunk-appd0sxm.js.map +67 -0
- package/dist/chunk-b9atzag0.js +67 -0
- package/dist/chunk-b9atzag0.js.map +10 -0
- package/dist/chunk-c08qy4ty.js +67 -0
- package/dist/chunk-c08qy4ty.js.map +10 -0
- package/dist/chunk-c5dtqvff.js +11 -0
- package/dist/chunk-c5dtqvff.js.map +9 -0
- package/dist/chunk-d1ea3tmp.js +17 -0
- package/dist/chunk-d1ea3tmp.js.map +9 -0
- package/dist/chunk-ecn1ca83.js +34253 -0
- package/dist/chunk-ecn1ca83.js.map +261 -0
- package/dist/chunk-ef1c6gq5.js +947 -0
- package/dist/chunk-ef1c6gq5.js.map +28 -0
- package/dist/chunk-ef355a3f.js +20 -0
- package/dist/chunk-ef355a3f.js.map +9 -0
- package/dist/chunk-f0dt9hv8.js +680 -0
- package/dist/chunk-f0dt9hv8.js.map +17 -0
- package/dist/chunk-f2aj8ff8.js +11 -0
- package/dist/chunk-f2aj8ff8.js.map +9 -0
- package/dist/chunk-f3wp07zw.js +24 -0
- package/dist/chunk-f3wp07zw.js.map +9 -0
- package/dist/chunk-f5wqd3z3.js +10 -0
- package/dist/chunk-f5wqd3z3.js.map +9 -0
- package/dist/chunk-g8hwy0wx.js +504 -0
- package/dist/chunk-g8hwy0wx.js.map +21 -0
- package/dist/chunk-gcx3c3yc.js +680 -0
- package/dist/chunk-gcx3c3yc.js.map +17 -0
- package/dist/chunk-gq6vxp70.js +202 -0
- package/dist/chunk-gq6vxp70.js.map +13 -0
- package/dist/chunk-gw64p5pg.js +164 -0
- package/dist/chunk-gw64p5pg.js.map +10 -0
- package/dist/chunk-hgv5frj1.js +256 -0
- package/dist/chunk-hgv5frj1.js.map +11 -0
- package/dist/chunk-hst78da7.js +87 -0
- package/dist/chunk-hst78da7.js.map +13 -0
- package/dist/chunk-hsxpgjyd.js +256 -0
- package/dist/chunk-hsxpgjyd.js.map +11 -0
- package/dist/chunk-j1v44zzm.js +109 -0
- package/dist/chunk-j1v44zzm.js.map +10 -0
- package/dist/chunk-jfd5md63.js +736 -0
- package/dist/chunk-jfd5md63.js.map +16 -0
- package/dist/chunk-jn5pcnz9.js +270 -0
- package/dist/chunk-jn5pcnz9.js.map +10 -0
- package/dist/chunk-jvhzgyhy.js +62 -0
- package/dist/chunk-jvhzgyhy.js.map +10 -0
- package/dist/chunk-k86st2r8.js +7 -0
- package/dist/chunk-k86st2r8.js.map +9 -0
- package/dist/chunk-kztccppz.js +606 -0
- package/dist/chunk-kztccppz.js.map +15 -0
- package/dist/chunk-m2vk15q9.js +503 -0
- package/dist/chunk-m2vk15q9.js.map +21 -0
- package/dist/chunk-mk40f3ka.js +31529 -0
- package/dist/chunk-mk40f3ka.js.map +245 -0
- package/dist/chunk-mp1sf8x6.js +264 -0
- package/dist/chunk-mp1sf8x6.js.map +12 -0
- package/dist/chunk-mzyqavzd.js +736 -0
- package/dist/chunk-mzyqavzd.js.map +16 -0
- package/dist/chunk-n9fs543g.js +94 -0
- package/dist/chunk-n9fs543g.js.map +10 -0
- package/dist/chunk-nbbwjw90.js +165 -0
- package/dist/chunk-nbbwjw90.js.map +10 -0
- package/dist/chunk-nh14pn95.js +137 -0
- package/dist/chunk-nh14pn95.js.map +10 -0
- package/dist/chunk-qnd877d5.js +947 -0
- package/dist/chunk-qnd877d5.js.map +28 -0
- package/dist/chunk-rng2ypf7.js +538 -0
- package/dist/chunk-rng2ypf7.js.map +15 -0
- package/dist/chunk-sjq10wbw.js +39 -0
- package/dist/chunk-sjq10wbw.js.map +9 -0
- package/dist/chunk-snv6a65k.js +759 -0
- package/dist/chunk-snv6a65k.js.map +19 -0
- package/dist/chunk-sqhdg0mf.js +2138 -0
- package/dist/chunk-sqhdg0mf.js.map +44 -0
- package/dist/chunk-tebher8z.js +514 -0
- package/dist/chunk-tebher8z.js.map +12 -0
- package/dist/chunk-v0wtyr4k.js +66 -0
- package/dist/chunk-v0wtyr4k.js.map +10 -0
- package/dist/chunk-v20274k8.js +246 -0
- package/dist/chunk-v20274k8.js.map +14 -0
- package/dist/chunk-vcp9fp2w.js +839 -0
- package/dist/chunk-vcp9fp2w.js.map +11 -0
- package/dist/chunk-vz737k5f.js +269 -0
- package/dist/chunk-vz737k5f.js.map +10 -0
- package/dist/chunk-x6bsgeqa.js +736 -0
- package/dist/chunk-x6bsgeqa.js.map +16 -0
- package/dist/chunk-xg9kcbp1.js +371 -0
- package/dist/chunk-xg9kcbp1.js.map +16 -0
- package/dist/chunk-xhad5b8x.js +110 -0
- package/dist/chunk-xhad5b8x.js.map +10 -0
- package/dist/chunk-xkwa1mn5.js +203 -0
- package/dist/chunk-xkwa1mn5.js.map +13 -0
- package/dist/chunk-xtcg74kf.js +50 -0
- package/dist/chunk-xtcg74kf.js.map +9 -0
- package/dist/chunk-xzjkaqe9.js +759 -0
- package/dist/chunk-xzjkaqe9.js.map +19 -0
- package/dist/chunk-y65xgj69.js +1495 -0
- package/dist/chunk-y65xgj69.js.map +23 -0
- package/dist/commands/doctor/command.js +1 -1
- package/dist/commands/init/command.js +1 -1
- package/dist/commands/logout/command.js +1 -1
- package/dist/commands/proxy/LoggingCallToolHandler.d.ts +11 -0
- package/dist/commands/proxy/command.js +1 -1
- package/dist/commands/screens/command.js +4 -4
- package/dist/commands/serve/command.js +5 -5
- package/dist/commands/site/command.js +1 -1
- package/dist/commands/snapshot/command.js +1 -1
- package/dist/commands/tool/command.js +1 -1
- package/dist/commands/tool/steps/LogExecuteToolStep.d.ts +19 -0
- package/dist/commands/upload/command.d.ts +2 -0
- package/dist/commands/upload/command.js +77 -0
- package/dist/commands/upload/command.js.map +11 -0
- package/dist/commands/upload/handler.d.ts +20 -0
- package/dist/commands/upload/spec.d.ts +38 -0
- package/dist/commands/view/command.js +1 -1
- package/dist/index.js +9 -9
- package/dist/index.js.map +1 -1
- package/dist/lib/log/append.d.ts +12 -0
- package/dist/lib/log/blob-store/handler.d.ts +10 -0
- package/dist/lib/log/blob-store/spec.d.ts +251 -0
- package/dist/lib/log/capture/handler.d.ts +10 -0
- package/dist/lib/log/capture/spec.d.ts +1504 -0
- package/dist/lib/log/factory.d.ts +4 -0
- package/package.json +2 -2
|
@@ -0,0 +1,538 @@
|
|
|
1
|
+
import {
|
|
2
|
+
exports_external
|
|
3
|
+
} from "./chunk-c6ge431q.js";
|
|
4
|
+
|
|
5
|
+
// src/lib/log/factory.ts
|
|
6
|
+
import { join as join2 } from "node:path";
|
|
7
|
+
|
|
8
|
+
// src/lib/log/append.ts
|
|
9
|
+
import { appendFile, mkdir } from "node:fs/promises";
|
|
10
|
+
import { dirname } from "node:path";
|
|
11
|
+
var EnvelopeSchema = exports_external.object({
|
|
12
|
+
id: exports_external.string().min(1),
|
|
13
|
+
time: exports_external.string().min(1),
|
|
14
|
+
trace_id: exports_external.string().min(1),
|
|
15
|
+
schema_version: exports_external.literal(1),
|
|
16
|
+
type: exports_external.string().min(1),
|
|
17
|
+
payload: exports_external.unknown()
|
|
18
|
+
});
|
|
19
|
+
async function appendEvent(eventsPath, event) {
|
|
20
|
+
const parsed = EnvelopeSchema.safeParse(event);
|
|
21
|
+
if (!parsed.success) {
|
|
22
|
+
return {
|
|
23
|
+
success: false,
|
|
24
|
+
error: {
|
|
25
|
+
code: "EVENT_VALIDATION_FAILED",
|
|
26
|
+
message: parsed.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; "),
|
|
27
|
+
recoverable: false
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
await mkdir(dirname(eventsPath), { recursive: true });
|
|
33
|
+
await appendFile(eventsPath, JSON.stringify(parsed.data) + `
|
|
34
|
+
`, "utf8");
|
|
35
|
+
return { success: true };
|
|
36
|
+
} catch (e) {
|
|
37
|
+
return {
|
|
38
|
+
success: false,
|
|
39
|
+
error: {
|
|
40
|
+
code: "EVENT_WRITE_FAILED",
|
|
41
|
+
message: e instanceof Error ? e.message : String(e),
|
|
42
|
+
recoverable: false
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// src/lib/log/blob-store/handler.ts
|
|
49
|
+
import { createHash } from "node:crypto";
|
|
50
|
+
import { mkdir as mkdir2, readdir, readFile, stat, writeFile } from "node:fs/promises";
|
|
51
|
+
import { dirname as dirname2, join } from "node:path";
|
|
52
|
+
var EXT_BY_MIME = {
|
|
53
|
+
"application/json": "json",
|
|
54
|
+
"text/html": "html",
|
|
55
|
+
"image/png": "png",
|
|
56
|
+
"image/webp": "webp",
|
|
57
|
+
"image/jpeg": "jpg"
|
|
58
|
+
};
|
|
59
|
+
function extForMime(mime) {
|
|
60
|
+
return EXT_BY_MIME[mime] ?? "bin";
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
class BlobStoreHandler {
|
|
64
|
+
root;
|
|
65
|
+
constructor(root) {
|
|
66
|
+
this.root = root;
|
|
67
|
+
}
|
|
68
|
+
async put(buffer, mime) {
|
|
69
|
+
try {
|
|
70
|
+
const sha256 = createHash("sha256").update(buffer).digest("hex");
|
|
71
|
+
const existing = await this.findBySha(sha256);
|
|
72
|
+
if (existing) {
|
|
73
|
+
const s = await stat(existing);
|
|
74
|
+
return { success: true, data: { sha256, size: s.size, mime } };
|
|
75
|
+
}
|
|
76
|
+
const path = join(this.root, sha256.slice(0, 2), `${sha256}.${extForMime(mime)}`);
|
|
77
|
+
await mkdir2(dirname2(path), { recursive: true });
|
|
78
|
+
await writeFile(path, buffer);
|
|
79
|
+
return { success: true, data: { sha256, size: buffer.length, mime } };
|
|
80
|
+
} catch (e) {
|
|
81
|
+
return {
|
|
82
|
+
success: false,
|
|
83
|
+
error: {
|
|
84
|
+
code: "BLOB_WRITE_FAILED",
|
|
85
|
+
message: e instanceof Error ? e.message : String(e),
|
|
86
|
+
recoverable: false
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async findBySha(sha256) {
|
|
92
|
+
const dir = join(this.root, sha256.slice(0, 2));
|
|
93
|
+
let entries;
|
|
94
|
+
try {
|
|
95
|
+
entries = await readdir(dir);
|
|
96
|
+
} catch {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
const match = entries.find((e) => e.startsWith(`${sha256}.`));
|
|
100
|
+
return match ? join(dir, match) : null;
|
|
101
|
+
}
|
|
102
|
+
async fetch(url, mimeHint) {
|
|
103
|
+
let response;
|
|
104
|
+
try {
|
|
105
|
+
response = await globalThis.fetch(url, {
|
|
106
|
+
redirect: "follow",
|
|
107
|
+
headers: { "User-Agent": "stitch-mcp-log/0.1 (Mozilla/5.0)" }
|
|
108
|
+
});
|
|
109
|
+
} catch (e) {
|
|
110
|
+
return {
|
|
111
|
+
success: false,
|
|
112
|
+
error: {
|
|
113
|
+
code: "BLOB_FETCH_NETWORK",
|
|
114
|
+
message: e instanceof Error ? e.message : String(e),
|
|
115
|
+
recoverable: true
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
if (!response.ok) {
|
|
120
|
+
return {
|
|
121
|
+
success: false,
|
|
122
|
+
error: {
|
|
123
|
+
code: "BLOB_FETCH_HTTP_ERROR",
|
|
124
|
+
message: `HTTP ${response.status} for ${url}`,
|
|
125
|
+
recoverable: false
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
const mime = (response.headers.get("content-type") ?? mimeHint ?? "application/octet-stream").split(";")[0].trim();
|
|
130
|
+
const buffer = Buffer.from(await response.arrayBuffer());
|
|
131
|
+
return this.put(buffer, mime);
|
|
132
|
+
}
|
|
133
|
+
async has(sha256) {
|
|
134
|
+
const path = await this.findBySha(sha256);
|
|
135
|
+
return { success: true, data: path != null };
|
|
136
|
+
}
|
|
137
|
+
async get(sha256) {
|
|
138
|
+
const path = await this.findBySha(sha256);
|
|
139
|
+
if (!path)
|
|
140
|
+
return { success: true, data: null };
|
|
141
|
+
const buf = await readFile(path);
|
|
142
|
+
return { success: true, data: buf };
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// src/lib/log/capture/handler.ts
|
|
147
|
+
import { randomUUID } from "node:crypto";
|
|
148
|
+
|
|
149
|
+
// src/lib/log/blob-store/spec.ts
|
|
150
|
+
var Sha256Schema = exports_external.string().regex(/^[0-9a-f]{64}$/, "must be 64-char lowercase hex");
|
|
151
|
+
var MimeSchema = exports_external.string().min(1);
|
|
152
|
+
var BlobRefSchema = exports_external.object({
|
|
153
|
+
sha256: Sha256Schema,
|
|
154
|
+
size: exports_external.number().int().nonnegative(),
|
|
155
|
+
mime: MimeSchema
|
|
156
|
+
});
|
|
157
|
+
var BlobStoreErrorCodeSchema = exports_external.enum([
|
|
158
|
+
"BLOB_FETCH_NETWORK",
|
|
159
|
+
"BLOB_FETCH_HTTP_ERROR",
|
|
160
|
+
"BLOB_WRITE_FAILED",
|
|
161
|
+
"BLOB_READ_FAILED",
|
|
162
|
+
"BLOB_INVALID_INPUT"
|
|
163
|
+
]);
|
|
164
|
+
var BlobStoreErrorSchema = exports_external.object({
|
|
165
|
+
code: BlobStoreErrorCodeSchema,
|
|
166
|
+
message: exports_external.string(),
|
|
167
|
+
suggestion: exports_external.string().optional(),
|
|
168
|
+
recoverable: exports_external.boolean()
|
|
169
|
+
});
|
|
170
|
+
var FailureSchema = exports_external.object({
|
|
171
|
+
success: exports_external.literal(false),
|
|
172
|
+
error: BlobStoreErrorSchema
|
|
173
|
+
});
|
|
174
|
+
var PutSuccessSchema = exports_external.object({
|
|
175
|
+
success: exports_external.literal(true),
|
|
176
|
+
data: BlobRefSchema
|
|
177
|
+
});
|
|
178
|
+
var PutResultSchema = exports_external.union([PutSuccessSchema, FailureSchema]);
|
|
179
|
+
var HasSuccessSchema = exports_external.object({
|
|
180
|
+
success: exports_external.literal(true),
|
|
181
|
+
data: exports_external.boolean()
|
|
182
|
+
});
|
|
183
|
+
var HasResultSchema = exports_external.union([HasSuccessSchema, FailureSchema]);
|
|
184
|
+
var GetSuccessSchema = exports_external.object({
|
|
185
|
+
success: exports_external.literal(true),
|
|
186
|
+
data: exports_external.instanceof(Buffer).nullable()
|
|
187
|
+
});
|
|
188
|
+
var GetResultSchema = exports_external.union([GetSuccessSchema, FailureSchema]);
|
|
189
|
+
|
|
190
|
+
// src/lib/log/capture/spec.ts
|
|
191
|
+
var GENERATIVE_TOOLS = new Set([
|
|
192
|
+
"generate_screen_from_text",
|
|
193
|
+
"edit_screens",
|
|
194
|
+
"generate_variants"
|
|
195
|
+
]);
|
|
196
|
+
var READ_TOOLS = new Set([
|
|
197
|
+
"get_screen",
|
|
198
|
+
"list_screens",
|
|
199
|
+
"list_projects",
|
|
200
|
+
"get_project",
|
|
201
|
+
"create_project"
|
|
202
|
+
]);
|
|
203
|
+
function kindOf(tool) {
|
|
204
|
+
if (GENERATIVE_TOOLS.has(tool))
|
|
205
|
+
return "generative";
|
|
206
|
+
if (READ_TOOLS.has(tool))
|
|
207
|
+
return "read";
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
var ProducedScreenSchema = exports_external.object({
|
|
211
|
+
project_id: exports_external.string(),
|
|
212
|
+
screen_id: exports_external.string(),
|
|
213
|
+
name: exports_external.string(),
|
|
214
|
+
parent_screen_id: exports_external.string().nullable(),
|
|
215
|
+
sibling_screen_ids: exports_external.array(exports_external.string()),
|
|
216
|
+
effective_prompt: exports_external.string(),
|
|
217
|
+
html_blob: BlobRefSchema.nullable(),
|
|
218
|
+
screenshot_blob: BlobRefSchema.nullable(),
|
|
219
|
+
theme_blob: BlobRefSchema.nullable(),
|
|
220
|
+
design_system_blob: BlobRefSchema.nullable()
|
|
221
|
+
});
|
|
222
|
+
var RequestedPayloadSchema = exports_external.object({
|
|
223
|
+
tool: exports_external.string(),
|
|
224
|
+
project_id: exports_external.string().optional(),
|
|
225
|
+
selected_screen_ids: exports_external.array(exports_external.string()).optional(),
|
|
226
|
+
user_prompt: exports_external.string().optional(),
|
|
227
|
+
variant_options: exports_external.record(exports_external.string(), exports_external.unknown()).optional(),
|
|
228
|
+
device_type: exports_external.string().optional(),
|
|
229
|
+
model_id: exports_external.string().optional(),
|
|
230
|
+
args_blob: BlobRefSchema
|
|
231
|
+
});
|
|
232
|
+
var CompletedGenerativePayloadSchema = exports_external.object({
|
|
233
|
+
tool: exports_external.string(),
|
|
234
|
+
duration_ms: exports_external.number().int().nonnegative(),
|
|
235
|
+
kind: exports_external.literal("generative"),
|
|
236
|
+
stitch_session_id: exports_external.string().optional(),
|
|
237
|
+
structured_content_blob: BlobRefSchema,
|
|
238
|
+
produced_screens: exports_external.array(ProducedScreenSchema)
|
|
239
|
+
});
|
|
240
|
+
var CompletedReadPayloadSchema = exports_external.object({
|
|
241
|
+
tool: exports_external.string(),
|
|
242
|
+
duration_ms: exports_external.number().int().nonnegative(),
|
|
243
|
+
kind: exports_external.literal("read"),
|
|
244
|
+
project_id: exports_external.string().optional(),
|
|
245
|
+
screen_ids: exports_external.array(exports_external.string()).optional()
|
|
246
|
+
});
|
|
247
|
+
var CompletedPayloadSchema = exports_external.discriminatedUnion("kind", [
|
|
248
|
+
CompletedGenerativePayloadSchema,
|
|
249
|
+
CompletedReadPayloadSchema
|
|
250
|
+
]);
|
|
251
|
+
var FailedPayloadSchema = exports_external.object({
|
|
252
|
+
tool: exports_external.string(),
|
|
253
|
+
duration_ms: exports_external.number().int().nonnegative(),
|
|
254
|
+
is_error: exports_external.union([exports_external.literal(true), exports_external.literal("empty")]),
|
|
255
|
+
error_text: exports_external.string().optional(),
|
|
256
|
+
raw_blob: BlobRefSchema.optional()
|
|
257
|
+
});
|
|
258
|
+
var baseEnvelope = {
|
|
259
|
+
id: exports_external.string().min(1),
|
|
260
|
+
time: exports_external.string().min(1),
|
|
261
|
+
trace_id: exports_external.string().min(1),
|
|
262
|
+
schema_version: exports_external.literal(1)
|
|
263
|
+
};
|
|
264
|
+
var EventSchema = exports_external.discriminatedUnion("type", [
|
|
265
|
+
exports_external.object({ ...baseEnvelope, type: exports_external.literal("call.requested"), payload: RequestedPayloadSchema }),
|
|
266
|
+
exports_external.object({ ...baseEnvelope, type: exports_external.literal("call.completed"), payload: CompletedPayloadSchema }),
|
|
267
|
+
exports_external.object({ ...baseEnvelope, type: exports_external.literal("call.failed"), payload: FailedPayloadSchema })
|
|
268
|
+
]);
|
|
269
|
+
var CaptureInputSchema = exports_external.object({
|
|
270
|
+
tool: exports_external.string().min(1),
|
|
271
|
+
args: exports_external.record(exports_external.string(), exports_external.unknown()),
|
|
272
|
+
result: exports_external.unknown(),
|
|
273
|
+
duration_ms: exports_external.number().int().nonnegative(),
|
|
274
|
+
started_at: exports_external.string().min(1),
|
|
275
|
+
finished_at: exports_external.string().min(1)
|
|
276
|
+
});
|
|
277
|
+
var CaptureErrorCodeSchema = exports_external.enum([
|
|
278
|
+
"CAPTURE_UNKNOWN_TOOL",
|
|
279
|
+
"CAPTURE_APPEND_FAILED",
|
|
280
|
+
"CAPTURE_BLOB_FATAL",
|
|
281
|
+
"CAPTURE_INVALID_INPUT"
|
|
282
|
+
]);
|
|
283
|
+
var CaptureFailure = exports_external.object({
|
|
284
|
+
success: exports_external.literal(false),
|
|
285
|
+
error: exports_external.object({
|
|
286
|
+
code: CaptureErrorCodeSchema,
|
|
287
|
+
message: exports_external.string(),
|
|
288
|
+
recoverable: exports_external.boolean()
|
|
289
|
+
})
|
|
290
|
+
});
|
|
291
|
+
var CaptureSuccess = exports_external.object({
|
|
292
|
+
success: exports_external.literal(true),
|
|
293
|
+
data: exports_external.object({
|
|
294
|
+
trace_id: exports_external.string(),
|
|
295
|
+
produced_screen_ids: exports_external.array(exports_external.string()),
|
|
296
|
+
warnings: exports_external.array(exports_external.string())
|
|
297
|
+
})
|
|
298
|
+
});
|
|
299
|
+
var CaptureResultSchema = exports_external.union([CaptureSuccess, CaptureFailure]);
|
|
300
|
+
|
|
301
|
+
// src/lib/log/capture/handler.ts
|
|
302
|
+
class CaptureHandler {
|
|
303
|
+
blobs;
|
|
304
|
+
append;
|
|
305
|
+
now;
|
|
306
|
+
newId;
|
|
307
|
+
constructor(deps) {
|
|
308
|
+
this.blobs = deps.blobs;
|
|
309
|
+
this.append = deps.append;
|
|
310
|
+
this.now = deps.now ?? (() => new Date);
|
|
311
|
+
this.newId = deps.newId ?? (() => randomUUID());
|
|
312
|
+
}
|
|
313
|
+
async capture(input) {
|
|
314
|
+
const parsed = CaptureInputSchema.safeParse(input);
|
|
315
|
+
if (!parsed.success) {
|
|
316
|
+
return this.fail("CAPTURE_INVALID_INPUT", parsed.error.message, false);
|
|
317
|
+
}
|
|
318
|
+
const kind = kindOf(input.tool);
|
|
319
|
+
if (!kind) {
|
|
320
|
+
return this.fail("CAPTURE_UNKNOWN_TOOL", `Unknown tool: ${input.tool}`, false);
|
|
321
|
+
}
|
|
322
|
+
const trace_id = this.newId();
|
|
323
|
+
const warnings = [];
|
|
324
|
+
const argsBuf = Buffer.from(JSON.stringify(input.args));
|
|
325
|
+
const argsBlob = await this.blobs.put(argsBuf, "application/json");
|
|
326
|
+
if (!argsBlob.success) {
|
|
327
|
+
return this.fail("CAPTURE_BLOB_FATAL", `args_blob: ${argsBlob.error.message}`, false);
|
|
328
|
+
}
|
|
329
|
+
const requested = {
|
|
330
|
+
id: this.newId(),
|
|
331
|
+
time: input.started_at,
|
|
332
|
+
trace_id,
|
|
333
|
+
schema_version: 1,
|
|
334
|
+
type: "call.requested",
|
|
335
|
+
payload: {
|
|
336
|
+
tool: input.tool,
|
|
337
|
+
project_id: typeof input.args.projectId === "string" ? input.args.projectId : undefined,
|
|
338
|
+
selected_screen_ids: Array.isArray(input.args.selectedScreenIds) ? input.args.selectedScreenIds : undefined,
|
|
339
|
+
user_prompt: typeof input.args.prompt === "string" ? input.args.prompt : undefined,
|
|
340
|
+
variant_options: input.args.variantOptions && typeof input.args.variantOptions === "object" ? input.args.variantOptions : undefined,
|
|
341
|
+
device_type: typeof input.args.deviceType === "string" ? input.args.deviceType : undefined,
|
|
342
|
+
model_id: typeof input.args.modelId === "string" ? input.args.modelId : undefined,
|
|
343
|
+
args_blob: argsBlob.data
|
|
344
|
+
}
|
|
345
|
+
};
|
|
346
|
+
const ar = await this.append(requested);
|
|
347
|
+
if (!ar.success)
|
|
348
|
+
return this.fail("CAPTURE_APPEND_FAILED", ar.error.message, true);
|
|
349
|
+
const r = input.result;
|
|
350
|
+
if (r && r.isError === true) {
|
|
351
|
+
const errorText = r.content?.find((c) => c.type === "text")?.text ?? "";
|
|
352
|
+
const rawBlob = await this.blobs.put(Buffer.from(JSON.stringify(r)), "application/json");
|
|
353
|
+
const failed = {
|
|
354
|
+
id: this.newId(),
|
|
355
|
+
time: input.finished_at,
|
|
356
|
+
trace_id,
|
|
357
|
+
schema_version: 1,
|
|
358
|
+
type: "call.failed",
|
|
359
|
+
payload: {
|
|
360
|
+
tool: input.tool,
|
|
361
|
+
duration_ms: input.duration_ms,
|
|
362
|
+
is_error: true,
|
|
363
|
+
error_text: errorText,
|
|
364
|
+
raw_blob: rawBlob.success ? rawBlob.data : undefined
|
|
365
|
+
}
|
|
366
|
+
};
|
|
367
|
+
const fr = await this.append(failed);
|
|
368
|
+
if (!fr.success)
|
|
369
|
+
return this.fail("CAPTURE_APPEND_FAILED", fr.error.message, true);
|
|
370
|
+
return { success: true, data: { trace_id, produced_screen_ids: [], warnings } };
|
|
371
|
+
}
|
|
372
|
+
if (kind === "read") {
|
|
373
|
+
const completed2 = {
|
|
374
|
+
id: this.newId(),
|
|
375
|
+
time: input.finished_at,
|
|
376
|
+
trace_id,
|
|
377
|
+
schema_version: 1,
|
|
378
|
+
type: "call.completed",
|
|
379
|
+
payload: {
|
|
380
|
+
tool: input.tool,
|
|
381
|
+
duration_ms: input.duration_ms,
|
|
382
|
+
kind: "read",
|
|
383
|
+
project_id: typeof input.args.projectId === "string" ? input.args.projectId : undefined,
|
|
384
|
+
screen_ids: typeof input.args.screenId === "string" ? [input.args.screenId] : Array.isArray(input.args.selectedScreenIds) ? input.args.selectedScreenIds : undefined
|
|
385
|
+
}
|
|
386
|
+
};
|
|
387
|
+
const cr2 = await this.append(completed2);
|
|
388
|
+
if (!cr2.success)
|
|
389
|
+
return this.fail("CAPTURE_APPEND_FAILED", cr2.error.message, true);
|
|
390
|
+
return { success: true, data: { trace_id, produced_screen_ids: [], warnings } };
|
|
391
|
+
}
|
|
392
|
+
const sc = r?.structuredContent ?? null;
|
|
393
|
+
const screens = pickScreens(sc);
|
|
394
|
+
if (screens.length === 0) {
|
|
395
|
+
const rawBlob = await this.blobs.put(Buffer.from(JSON.stringify(r ?? {})), "application/json");
|
|
396
|
+
const failed = {
|
|
397
|
+
id: this.newId(),
|
|
398
|
+
time: input.finished_at,
|
|
399
|
+
trace_id,
|
|
400
|
+
schema_version: 1,
|
|
401
|
+
type: "call.failed",
|
|
402
|
+
payload: {
|
|
403
|
+
tool: input.tool,
|
|
404
|
+
duration_ms: input.duration_ms,
|
|
405
|
+
is_error: "empty",
|
|
406
|
+
raw_blob: rawBlob.success ? rawBlob.data : undefined
|
|
407
|
+
}
|
|
408
|
+
};
|
|
409
|
+
const fr = await this.append(failed);
|
|
410
|
+
if (!fr.success)
|
|
411
|
+
return this.fail("CAPTURE_APPEND_FAILED", fr.error.message, true);
|
|
412
|
+
return { success: true, data: { trace_id, produced_screen_ids: [], warnings } };
|
|
413
|
+
}
|
|
414
|
+
const structuredBlob = await this.blobs.put(Buffer.from(JSON.stringify(sc)), "application/json");
|
|
415
|
+
if (!structuredBlob.success) {
|
|
416
|
+
return this.fail("CAPTURE_BLOB_FATAL", `structured_content_blob: ${structuredBlob.error.message}`, false);
|
|
417
|
+
}
|
|
418
|
+
const dsAsset = pickDesignSystemComponent(sc);
|
|
419
|
+
let dsAssetBlob = null;
|
|
420
|
+
if (dsAsset) {
|
|
421
|
+
const r2 = await this.blobs.put(Buffer.from(JSON.stringify(dsAsset)), "application/json");
|
|
422
|
+
if (r2.success)
|
|
423
|
+
dsAssetBlob = r2.data;
|
|
424
|
+
else
|
|
425
|
+
warnings.push(`design_system_asset put failed: ${r2.error.message}`);
|
|
426
|
+
}
|
|
427
|
+
const allScreenIds = screens.map((s) => s.id ?? "").filter(Boolean);
|
|
428
|
+
const selectedParents = input.args.selectedScreenIds ?? [];
|
|
429
|
+
const parent = selectedParents[0] ?? null;
|
|
430
|
+
const produced = [];
|
|
431
|
+
for (const s of screens) {
|
|
432
|
+
const screenId = s.id ?? "";
|
|
433
|
+
const siblings = allScreenIds.filter((id) => id !== screenId);
|
|
434
|
+
let themeBlob = null;
|
|
435
|
+
if (s.theme && Object.keys(s.theme).length > 0) {
|
|
436
|
+
const tr = await this.blobs.put(Buffer.from(JSON.stringify(s.theme)), "application/json");
|
|
437
|
+
if (tr.success)
|
|
438
|
+
themeBlob = tr.data;
|
|
439
|
+
else
|
|
440
|
+
warnings.push(`screen ${screenId} theme: ${tr.error.message}`);
|
|
441
|
+
}
|
|
442
|
+
let dsBlob = null;
|
|
443
|
+
if (s.designSystem) {
|
|
444
|
+
const dr = await this.blobs.put(Buffer.from(JSON.stringify(s.designSystem)), "application/json");
|
|
445
|
+
if (dr.success)
|
|
446
|
+
dsBlob = dr.data;
|
|
447
|
+
else
|
|
448
|
+
warnings.push(`screen ${screenId} design_system: ${dr.error.message}`);
|
|
449
|
+
} else if (dsAssetBlob) {
|
|
450
|
+
dsBlob = dsAssetBlob;
|
|
451
|
+
}
|
|
452
|
+
let htmlBlob = null;
|
|
453
|
+
if (s.htmlCode?.downloadUrl) {
|
|
454
|
+
const fr = await this.blobs.fetch(s.htmlCode.downloadUrl, s.htmlCode.mimeType ?? "text/html");
|
|
455
|
+
if (fr.success)
|
|
456
|
+
htmlBlob = fr.data;
|
|
457
|
+
else
|
|
458
|
+
warnings.push(`screen ${screenId} html: ${fr.error.code} ${fr.error.message}`);
|
|
459
|
+
}
|
|
460
|
+
let shotBlob = null;
|
|
461
|
+
if (s.screenshot?.downloadUrl) {
|
|
462
|
+
const fr = await this.blobs.fetch(s.screenshot.downloadUrl);
|
|
463
|
+
if (fr.success)
|
|
464
|
+
shotBlob = fr.data;
|
|
465
|
+
else
|
|
466
|
+
warnings.push(`screen ${screenId} screenshot: ${fr.error.code} ${fr.error.message}`);
|
|
467
|
+
}
|
|
468
|
+
produced.push({
|
|
469
|
+
project_id: input.args.projectId ?? sc?.projectId ?? "",
|
|
470
|
+
screen_id: screenId,
|
|
471
|
+
name: s.name ?? "",
|
|
472
|
+
parent_screen_id: parent,
|
|
473
|
+
sibling_screen_ids: siblings,
|
|
474
|
+
effective_prompt: s.prompt ?? "",
|
|
475
|
+
html_blob: htmlBlob,
|
|
476
|
+
screenshot_blob: shotBlob,
|
|
477
|
+
theme_blob: themeBlob,
|
|
478
|
+
design_system_blob: dsBlob
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
const completed = {
|
|
482
|
+
id: this.newId(),
|
|
483
|
+
time: input.finished_at,
|
|
484
|
+
trace_id,
|
|
485
|
+
schema_version: 1,
|
|
486
|
+
type: "call.completed",
|
|
487
|
+
payload: {
|
|
488
|
+
tool: input.tool,
|
|
489
|
+
duration_ms: input.duration_ms,
|
|
490
|
+
kind: "generative",
|
|
491
|
+
stitch_session_id: typeof sc?.sessionId !== "undefined" ? String(sc.sessionId) : undefined,
|
|
492
|
+
structured_content_blob: structuredBlob.data,
|
|
493
|
+
produced_screens: produced
|
|
494
|
+
}
|
|
495
|
+
};
|
|
496
|
+
const cr = await this.append(completed);
|
|
497
|
+
if (!cr.success)
|
|
498
|
+
return this.fail("CAPTURE_APPEND_FAILED", cr.error.message, true);
|
|
499
|
+
return {
|
|
500
|
+
success: true,
|
|
501
|
+
data: { trace_id, produced_screen_ids: produced.map((p) => p.screen_id), warnings }
|
|
502
|
+
};
|
|
503
|
+
}
|
|
504
|
+
fail(code, message, recoverable) {
|
|
505
|
+
return { success: false, error: { code, message, recoverable } };
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
function pickScreens(sc) {
|
|
509
|
+
const out = [];
|
|
510
|
+
for (const c of sc?.outputComponents ?? []) {
|
|
511
|
+
if (c?.design?.screens)
|
|
512
|
+
for (const s of c.design.screens)
|
|
513
|
+
out.push(s);
|
|
514
|
+
}
|
|
515
|
+
return out;
|
|
516
|
+
}
|
|
517
|
+
function pickDesignSystemComponent(sc) {
|
|
518
|
+
const c = (sc?.outputComponents ?? []).find((x) => x?.designSystem);
|
|
519
|
+
return c?.designSystem ?? null;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
// src/lib/log/factory.ts
|
|
523
|
+
var DEFAULT_LOG_ROOT = ".stitch-mcp/log";
|
|
524
|
+
function isLogEnabled() {
|
|
525
|
+
return process.env.STITCH_MCP_LOG === "1";
|
|
526
|
+
}
|
|
527
|
+
function createCaptureHandler(root = DEFAULT_LOG_ROOT) {
|
|
528
|
+
const blobs = new BlobStoreHandler(join2(root, "blobs"));
|
|
529
|
+
const eventsPath = join2(root, "events.jsonl");
|
|
530
|
+
return new CaptureHandler({
|
|
531
|
+
blobs,
|
|
532
|
+
append: (event) => appendEvent(eventsPath, event)
|
|
533
|
+
});
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
export { isLogEnabled, createCaptureHandler };
|
|
537
|
+
|
|
538
|
+
//# debugId=2D3FD9FDAEC0740E64756E2164756E21
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/lib/log/factory.ts", "../src/lib/log/append.ts", "../src/lib/log/blob-store/handler.ts", "../src/lib/log/capture/handler.ts", "../src/lib/log/blob-store/spec.ts", "../src/lib/log/capture/spec.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { join } from 'node:path';\nimport { appendEvent } from './append.js';\nimport { BlobStoreHandler } from './blob-store/handler.js';\nimport { CaptureHandler } from './capture/handler.js';\nimport type { CaptureSpec } from './capture/spec.js';\n\nexport const DEFAULT_LOG_ROOT = '.stitch-mcp/log';\n\nexport function isLogEnabled(): boolean {\n return process.env.STITCH_MCP_LOG === '1';\n}\n\nexport function createCaptureHandler(root: string = DEFAULT_LOG_ROOT): CaptureSpec {\n const blobs = new BlobStoreHandler(join(root, 'blobs'));\n const eventsPath = join(root, 'events.jsonl');\n return new CaptureHandler({\n blobs,\n append: (event) => appendEvent(eventsPath, event),\n });\n}\n",
|
|
6
|
+
"import { appendFile, mkdir } from 'node:fs/promises';\nimport { dirname } from 'node:path';\nimport { z } from 'zod';\n\nconst EnvelopeSchema = z.object({\n id: z.string().min(1),\n time: z.string().min(1),\n trace_id: z.string().min(1),\n schema_version: z.literal(1),\n type: z.string().min(1),\n payload: z.unknown(),\n});\n\nexport type AppendResult =\n | { success: true }\n | {\n success: false;\n error: {\n code: 'EVENT_VALIDATION_FAILED' | 'EVENT_WRITE_FAILED';\n message: string;\n recoverable: boolean;\n };\n };\n\n/** Validate envelope shape and append exactly one JSON line, ending in `\\n`. */\nexport async function appendEvent(eventsPath: string, event: unknown): Promise<AppendResult> {\n const parsed = EnvelopeSchema.safeParse(event);\n if (!parsed.success) {\n return {\n success: false,\n error: {\n code: 'EVENT_VALIDATION_FAILED',\n message: parsed.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join('; '),\n recoverable: false,\n },\n };\n }\n try {\n await mkdir(dirname(eventsPath), { recursive: true });\n await appendFile(eventsPath, JSON.stringify(parsed.data) + '\\n', 'utf8');\n return { success: true };\n } catch (e) {\n return {\n success: false,\n error: {\n code: 'EVENT_WRITE_FAILED',\n message: e instanceof Error ? e.message : String(e),\n recoverable: false,\n },\n };\n }\n}\n",
|
|
7
|
+
"import { createHash } from 'node:crypto';\nimport { mkdir, readdir, readFile, stat, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport type { BlobStoreSpec, PutResult, HasResult, GetResult } from './spec.js';\n\nconst EXT_BY_MIME: Record<string, string> = {\n 'application/json': 'json',\n 'text/html': 'html',\n 'image/png': 'png',\n 'image/webp': 'webp',\n 'image/jpeg': 'jpg',\n};\n\nfunction extForMime(mime: string): string {\n return EXT_BY_MIME[mime] ?? 'bin';\n}\n\nexport class BlobStoreHandler implements BlobStoreSpec {\n constructor(private readonly root: string) {}\n\n async put(buffer: Buffer, mime: string): Promise<PutResult> {\n try {\n const sha256 = createHash('sha256').update(buffer).digest('hex');\n const existing = await this.findBySha(sha256);\n if (existing) {\n const s = await stat(existing);\n return { success: true, data: { sha256, size: s.size, mime } };\n }\n const path = join(this.root, sha256.slice(0, 2), `${sha256}.${extForMime(mime)}`);\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, buffer);\n return { success: true, data: { sha256, size: buffer.length, mime } };\n } catch (e) {\n return {\n success: false,\n error: {\n code: 'BLOB_WRITE_FAILED',\n message: e instanceof Error ? e.message : String(e),\n recoverable: false,\n },\n };\n }\n }\n\n private async findBySha(sha256: string): Promise<string | null> {\n const dir = join(this.root, sha256.slice(0, 2));\n let entries: string[];\n try { entries = await readdir(dir); } catch { return null; }\n const match = entries.find((e) => e.startsWith(`${sha256}.`));\n return match ? join(dir, match) : null;\n }\n\n async fetch(url: string, mimeHint?: string): Promise<PutResult> {\n let response: Response;\n try {\n response = await globalThis.fetch(url, {\n redirect: 'follow',\n headers: { 'User-Agent': 'stitch-mcp-log/0.1 (Mozilla/5.0)' },\n });\n } catch (e) {\n return {\n success: false,\n error: {\n code: 'BLOB_FETCH_NETWORK',\n message: e instanceof Error ? e.message : String(e),\n recoverable: true,\n },\n };\n }\n if (!response.ok) {\n return {\n success: false,\n error: {\n code: 'BLOB_FETCH_HTTP_ERROR',\n message: `HTTP ${response.status} for ${url}`,\n recoverable: false,\n },\n };\n }\n const mime = (response.headers.get('content-type') ?? mimeHint ?? 'application/octet-stream').split(';')[0]!.trim();\n const buffer = Buffer.from(await response.arrayBuffer());\n return this.put(buffer, mime);\n }\n async has(sha256: string): Promise<HasResult> {\n const path = await this.findBySha(sha256);\n return { success: true, data: path != null };\n }\n async get(sha256: string): Promise<GetResult> {\n const path = await this.findBySha(sha256);\n if (!path) return { success: true, data: null };\n const buf = await readFile(path);\n return { success: true, data: buf };\n }\n}\n",
|
|
8
|
+
"import { randomUUID } from 'node:crypto';\nimport type { BlobRef } from '../blob-store/spec.js';\nimport {\n type AppendFn,\n type CaptureDeps,\n type CaptureInput,\n type CaptureResult,\n type CaptureSpec,\n type Event,\n type ProducedScreen,\n type ToolKind,\n CaptureInputSchema,\n kindOf,\n} from './spec.js';\n\ninterface ScreenComponent {\n id?: string;\n name?: string;\n prompt?: string;\n theme?: Record<string, unknown>;\n designSystem?: Record<string, unknown> | null;\n htmlCode?: { downloadUrl?: string; mimeType?: string };\n screenshot?: { downloadUrl?: string };\n}\n\nexport class CaptureHandler implements CaptureSpec {\n private readonly blobs: CaptureDeps['blobs'];\n private readonly append: AppendFn;\n private readonly now: () => Date;\n private readonly newId: () => string;\n\n constructor(deps: CaptureDeps) {\n this.blobs = deps.blobs;\n this.append = deps.append;\n this.now = deps.now ?? (() => new Date());\n this.newId = deps.newId ?? (() => randomUUID());\n }\n\n async capture(input: CaptureInput): Promise<CaptureResult> {\n const parsed = CaptureInputSchema.safeParse(input);\n if (!parsed.success) {\n return this.fail('CAPTURE_INVALID_INPUT', parsed.error.message, false);\n }\n const kind = kindOf(input.tool);\n if (!kind) {\n return this.fail('CAPTURE_UNKNOWN_TOOL', `Unknown tool: ${input.tool}`, false);\n }\n\n const trace_id = this.newId();\n const warnings: string[] = [];\n\n // 1) requested event — always\n const argsBuf = Buffer.from(JSON.stringify(input.args));\n const argsBlob = await this.blobs.put(argsBuf, 'application/json');\n if (!argsBlob.success) {\n return this.fail('CAPTURE_BLOB_FATAL', `args_blob: ${argsBlob.error.message}`, false);\n }\n\n const requested: Event = {\n id: this.newId(),\n time: input.started_at,\n trace_id,\n schema_version: 1,\n type: 'call.requested',\n payload: {\n tool: input.tool,\n project_id: typeof input.args.projectId === 'string' ? input.args.projectId : undefined,\n selected_screen_ids: Array.isArray(input.args.selectedScreenIds)\n ? (input.args.selectedScreenIds as string[])\n : undefined,\n user_prompt: typeof input.args.prompt === 'string' ? input.args.prompt : undefined,\n variant_options:\n input.args.variantOptions && typeof input.args.variantOptions === 'object'\n ? (input.args.variantOptions as Record<string, unknown>)\n : undefined,\n device_type: typeof input.args.deviceType === 'string' ? input.args.deviceType : undefined,\n model_id: typeof input.args.modelId === 'string' ? input.args.modelId : undefined,\n args_blob: argsBlob.data,\n },\n };\n const ar = await this.append(requested);\n if (!ar.success) return this.fail('CAPTURE_APPEND_FAILED', ar.error.message, true);\n\n // 2) explicit failure\n const r = input.result as { isError?: boolean; structuredContent?: any; content?: { type: string; text?: string }[] } | null;\n if (r && r.isError === true) {\n const errorText = r.content?.find((c) => c.type === 'text')?.text ?? '';\n const rawBlob = await this.blobs.put(Buffer.from(JSON.stringify(r)), 'application/json');\n const failed: Event = {\n id: this.newId(),\n time: input.finished_at,\n trace_id,\n schema_version: 1,\n type: 'call.failed',\n payload: {\n tool: input.tool,\n duration_ms: input.duration_ms,\n is_error: true,\n error_text: errorText,\n raw_blob: rawBlob.success ? rawBlob.data : undefined,\n },\n };\n const fr = await this.append(failed);\n if (!fr.success) return this.fail('CAPTURE_APPEND_FAILED', fr.error.message, true);\n return { success: true, data: { trace_id, produced_screen_ids: [], warnings } };\n }\n\n if (kind === 'read') {\n const completed: Event = {\n id: this.newId(),\n time: input.finished_at,\n trace_id,\n schema_version: 1,\n type: 'call.completed',\n payload: {\n tool: input.tool,\n duration_ms: input.duration_ms,\n kind: 'read',\n project_id: typeof input.args.projectId === 'string' ? input.args.projectId : undefined,\n screen_ids:\n typeof input.args.screenId === 'string'\n ? [input.args.screenId]\n : Array.isArray(input.args.selectedScreenIds)\n ? (input.args.selectedScreenIds as string[])\n : undefined,\n },\n };\n const cr = await this.append(completed);\n if (!cr.success) return this.fail('CAPTURE_APPEND_FAILED', cr.error.message, true);\n return { success: true, data: { trace_id, produced_screen_ids: [], warnings } };\n }\n\n // 3) generative path\n const sc = (r as any)?.structuredContent ?? null;\n const screens: ScreenComponent[] = pickScreens(sc);\n\n // implicit failure: zero produced screens on a generative call\n if (screens.length === 0) {\n const rawBlob = await this.blobs.put(Buffer.from(JSON.stringify(r ?? {})), 'application/json');\n const failed: Event = {\n id: this.newId(),\n time: input.finished_at,\n trace_id,\n schema_version: 1,\n type: 'call.failed',\n payload: {\n tool: input.tool,\n duration_ms: input.duration_ms,\n is_error: 'empty',\n raw_blob: rawBlob.success ? rawBlob.data : undefined,\n },\n };\n const fr = await this.append(failed);\n if (!fr.success) return this.fail('CAPTURE_APPEND_FAILED', fr.error.message, true);\n return { success: true, data: { trace_id, produced_screen_ids: [], warnings } };\n }\n\n const structuredBlob = await this.blobs.put(Buffer.from(JSON.stringify(sc)), 'application/json');\n if (!structuredBlob.success) {\n return this.fail('CAPTURE_BLOB_FATAL', `structured_content_blob: ${structuredBlob.error.message}`, false);\n }\n\n // top-level designSystem component (only on generate_screen_from_text in practice)\n const dsAsset = pickDesignSystemComponent(sc);\n let dsAssetBlob: BlobRef | null = null;\n if (dsAsset) {\n const r2 = await this.blobs.put(Buffer.from(JSON.stringify(dsAsset)), 'application/json');\n if (r2.success) dsAssetBlob = r2.data;\n else warnings.push(`design_system_asset put failed: ${r2.error.message}`);\n }\n\n const allScreenIds = screens.map((s) => s.id ?? '').filter(Boolean);\n const selectedParents = (input.args.selectedScreenIds as string[] | undefined) ?? [];\n const parent = selectedParents[0] ?? null;\n\n const produced: ProducedScreen[] = [];\n for (const s of screens) {\n const screenId = s.id ?? '';\n const siblings = allScreenIds.filter((id) => id !== screenId);\n\n // theme blob (populated for generate/edit; empty {} for variants)\n let themeBlob: BlobRef | null = null;\n if (s.theme && Object.keys(s.theme).length > 0) {\n const tr = await this.blobs.put(Buffer.from(JSON.stringify(s.theme)), 'application/json');\n if (tr.success) themeBlob = tr.data;\n else warnings.push(`screen ${screenId} theme: ${tr.error.message}`);\n }\n\n // per-screen design system (generate only)\n let dsBlob: BlobRef | null = null;\n if (s.designSystem) {\n const dr = await this.blobs.put(Buffer.from(JSON.stringify(s.designSystem)), 'application/json');\n if (dr.success) dsBlob = dr.data;\n else warnings.push(`screen ${screenId} design_system: ${dr.error.message}`);\n } else if (dsAssetBlob) {\n // fall back to the top-level designSystem component blob when per-screen is absent\n dsBlob = dsAssetBlob;\n }\n\n // eager downloads\n let htmlBlob: BlobRef | null = null;\n if (s.htmlCode?.downloadUrl) {\n const fr = await this.blobs.fetch(s.htmlCode.downloadUrl, s.htmlCode.mimeType ?? 'text/html');\n if (fr.success) htmlBlob = fr.data;\n else warnings.push(`screen ${screenId} html: ${fr.error.code} ${fr.error.message}`);\n }\n let shotBlob: BlobRef | null = null;\n if (s.screenshot?.downloadUrl) {\n const fr = await this.blobs.fetch(s.screenshot.downloadUrl);\n if (fr.success) shotBlob = fr.data;\n else warnings.push(`screen ${screenId} screenshot: ${fr.error.code} ${fr.error.message}`);\n }\n\n produced.push({\n project_id: (input.args.projectId as string) ?? sc?.projectId ?? '',\n screen_id: screenId,\n name: s.name ?? '',\n parent_screen_id: parent,\n sibling_screen_ids: siblings,\n effective_prompt: s.prompt ?? '',\n html_blob: htmlBlob,\n screenshot_blob: shotBlob,\n theme_blob: themeBlob,\n design_system_blob: dsBlob,\n });\n }\n\n const completed: Event = {\n id: this.newId(),\n time: input.finished_at,\n trace_id,\n schema_version: 1,\n type: 'call.completed',\n payload: {\n tool: input.tool,\n duration_ms: input.duration_ms,\n kind: 'generative',\n stitch_session_id: typeof sc?.sessionId !== 'undefined' ? String(sc.sessionId) : undefined,\n structured_content_blob: structuredBlob.data,\n produced_screens: produced,\n },\n };\n const cr = await this.append(completed);\n if (!cr.success) return this.fail('CAPTURE_APPEND_FAILED', cr.error.message, true);\n\n return {\n success: true,\n data: { trace_id, produced_screen_ids: produced.map((p) => p.screen_id), warnings },\n };\n }\n\n private fail(code: any, message: string, recoverable: boolean): CaptureResult {\n return { success: false, error: { code, message, recoverable } };\n }\n}\n\n// --- helpers (extraction over heterogeneous outputComponents) ---------------\n\nfunction pickScreens(sc: any): ScreenComponent[] {\n const out: ScreenComponent[] = [];\n for (const c of sc?.outputComponents ?? []) {\n if (c?.design?.screens) for (const s of c.design.screens) out.push(s as ScreenComponent);\n }\n return out;\n}\n\nfunction pickDesignSystemComponent(sc: any): Record<string, unknown> | null {\n const c = (sc?.outputComponents ?? []).find((x: any) => x?.designSystem);\n return c?.designSystem ?? null;\n}\n",
|
|
9
|
+
"import { z } from 'zod';\n\n// --- shared schemas ---------------------------------------------------------\n\nexport const Sha256Schema = z.string().regex(/^[0-9a-f]{64}$/, 'must be 64-char lowercase hex');\nexport const MimeSchema = z.string().min(1);\n\nexport const BlobRefSchema = z.object({\n sha256: Sha256Schema,\n size: z.number().int().nonnegative(),\n mime: MimeSchema,\n});\nexport type BlobRef = z.infer<typeof BlobRefSchema>;\n\n// --- error union ------------------------------------------------------------\n\nexport const BlobStoreErrorCodeSchema = z.enum([\n 'BLOB_FETCH_NETWORK',\n 'BLOB_FETCH_HTTP_ERROR',\n 'BLOB_WRITE_FAILED',\n 'BLOB_READ_FAILED',\n 'BLOB_INVALID_INPUT',\n]);\nexport type BlobStoreErrorCode = z.infer<typeof BlobStoreErrorCodeSchema>;\n\nexport const BlobStoreErrorSchema = z.object({\n code: BlobStoreErrorCodeSchema,\n message: z.string(),\n suggestion: z.string().optional(),\n recoverable: z.boolean(),\n});\nexport type BlobStoreError = z.infer<typeof BlobStoreErrorSchema>;\n\nconst FailureSchema = z.object({\n success: z.literal(false),\n error: BlobStoreErrorSchema,\n});\n\n// --- per-method result schemas ---------------------------------------------\n\nexport const PutSuccessSchema = z.object({\n success: z.literal(true),\n data: BlobRefSchema,\n});\nexport const PutResultSchema = z.union([PutSuccessSchema, FailureSchema]);\nexport type PutResult = z.infer<typeof PutResultSchema>;\n\nexport const HasSuccessSchema = z.object({\n success: z.literal(true),\n data: z.boolean(),\n});\nexport const HasResultSchema = z.union([HasSuccessSchema, FailureSchema]);\nexport type HasResult = z.infer<typeof HasResultSchema>;\n\nexport const GetSuccessSchema = z.object({\n success: z.literal(true),\n // null = not found; success=true because \"absent\" is a valid answer, not an error\n data: z.instanceof(Buffer).nullable(),\n});\nexport const GetResultSchema = z.union([GetSuccessSchema, FailureSchema]);\nexport type GetResult = z.infer<typeof GetResultSchema>;\n\n// --- capability -------------------------------------------------------------\n\nexport interface BlobStoreSpec {\n /** Hash, dedupe, and persist a buffer. Returns a content-addressed BlobRef. */\n put(buffer: Buffer, mime: string): Promise<PutResult>;\n\n /** Fetch a URL (following redirects) and persist the bytes. */\n fetch(url: string, mimeHint?: string): Promise<PutResult>;\n\n /** Cheap existence check by sha256. */\n has(sha256: string): Promise<HasResult>;\n\n /** Read bytes by sha256. data === null when absent. */\n get(sha256: string): Promise<GetResult>;\n}\n",
|
|
10
|
+
"import { z } from 'zod';\nimport { BlobRefSchema } from '../blob-store/spec.js';\n\n// --- tool taxonomy ----------------------------------------------------------\n\nexport const GENERATIVE_TOOLS = new Set([\n 'generate_screen_from_text',\n 'edit_screens',\n 'generate_variants',\n] as const);\n\nexport const READ_TOOLS = new Set([\n 'get_screen',\n 'list_screens',\n 'list_projects',\n 'get_project',\n 'create_project',\n] as const);\n\nexport type ToolKind = 'generative' | 'read';\n\nexport function kindOf(tool: string): ToolKind | null {\n if (GENERATIVE_TOOLS.has(tool as any)) return 'generative';\n if (READ_TOOLS.has(tool as any)) return 'read';\n return null;\n}\n\n// --- per-screen artifact -----------------------------------------------------\n\nexport const ProducedScreenSchema = z.object({\n project_id: z.string(),\n screen_id: z.string(),\n name: z.string(),\n parent_screen_id: z.string().nullable(),\n sibling_screen_ids: z.array(z.string()),\n effective_prompt: z.string(),\n // null when a fetch failed (warning recorded) or absent on the response (variants)\n html_blob: BlobRefSchema.nullable(),\n screenshot_blob: BlobRefSchema.nullable(),\n theme_blob: BlobRefSchema.nullable(),\n design_system_blob: BlobRefSchema.nullable(),\n});\nexport type ProducedScreen = z.infer<typeof ProducedScreenSchema>;\n\n// --- event payloads ---------------------------------------------------------\n\nexport const RequestedPayloadSchema = z.object({\n tool: z.string(),\n project_id: z.string().optional(),\n selected_screen_ids: z.array(z.string()).optional(),\n user_prompt: z.string().optional(),\n variant_options: z.record(z.string(), z.unknown()).optional(),\n device_type: z.string().optional(),\n model_id: z.string().optional(),\n args_blob: BlobRefSchema,\n});\n\nexport const CompletedGenerativePayloadSchema = z.object({\n tool: z.string(),\n duration_ms: z.number().int().nonnegative(),\n kind: z.literal('generative'),\n stitch_session_id: z.string().optional(),\n structured_content_blob: BlobRefSchema,\n produced_screens: z.array(ProducedScreenSchema),\n});\n\nexport const CompletedReadPayloadSchema = z.object({\n tool: z.string(),\n duration_ms: z.number().int().nonnegative(),\n kind: z.literal('read'),\n project_id: z.string().optional(),\n screen_ids: z.array(z.string()).optional(),\n});\n\nexport const CompletedPayloadSchema = z.discriminatedUnion('kind', [\n CompletedGenerativePayloadSchema,\n CompletedReadPayloadSchema,\n]);\n\nexport const FailedPayloadSchema = z.object({\n tool: z.string(),\n duration_ms: z.number().int().nonnegative(),\n is_error: z.union([z.literal(true), z.literal('empty')]),\n error_text: z.string().optional(),\n raw_blob: BlobRefSchema.optional(),\n});\n\n// --- envelope + event union --------------------------------------------------\n\nconst baseEnvelope = {\n id: z.string().min(1),\n time: z.string().min(1),\n trace_id: z.string().min(1),\n schema_version: z.literal(1),\n};\n\nexport const EventSchema = z.discriminatedUnion('type', [\n z.object({ ...baseEnvelope, type: z.literal('call.requested'), payload: RequestedPayloadSchema }),\n z.object({ ...baseEnvelope, type: z.literal('call.completed'), payload: CompletedPayloadSchema }),\n z.object({ ...baseEnvelope, type: z.literal('call.failed'), payload: FailedPayloadSchema }),\n]);\nexport type Event = z.infer<typeof EventSchema>;\n\n// --- capture I/O ------------------------------------------------------------\n\nexport const CaptureInputSchema = z.object({\n tool: z.string().min(1),\n args: z.record(z.string(), z.unknown()),\n result: z.unknown(), // raw MCP CallToolResult\n duration_ms: z.number().int().nonnegative(),\n started_at: z.string().min(1),\n finished_at: z.string().min(1),\n});\nexport type CaptureInput = z.infer<typeof CaptureInputSchema>;\n\nexport const CaptureErrorCodeSchema = z.enum([\n 'CAPTURE_UNKNOWN_TOOL', // tool isn't in either taxonomy set\n 'CAPTURE_APPEND_FAILED', // appendEvent rejected\n 'CAPTURE_BLOB_FATAL', // critical blob (args/result) failed; can't proceed\n 'CAPTURE_INVALID_INPUT',\n]);\n\nconst CaptureFailure = z.object({\n success: z.literal(false),\n error: z.object({\n code: CaptureErrorCodeSchema,\n message: z.string(),\n recoverable: z.boolean(),\n }),\n});\nconst CaptureSuccess = z.object({\n success: z.literal(true),\n data: z.object({\n trace_id: z.string(),\n produced_screen_ids: z.array(z.string()),\n warnings: z.array(z.string()), // soft-failures (one blob fetch died, etc.)\n }),\n});\nexport const CaptureResultSchema = z.union([CaptureSuccess, CaptureFailure]);\nexport type CaptureResult = z.infer<typeof CaptureResultSchema>;\n\n// --- dependency contracts (for testability) ---------------------------------\n\nimport type { BlobStoreSpec } from '../blob-store/spec.js';\nimport type { AppendResult } from '../append.js';\n\nexport type AppendFn = (event: Event) => Promise<AppendResult>;\n\nexport interface CaptureSpec {\n capture(input: CaptureInput): Promise<CaptureResult>;\n}\n\nexport interface CaptureDeps {\n blobs: BlobStoreSpec;\n append: AppendFn;\n now?: () => Date; // injectable for deterministic tests\n newId?: () => string;\n}\n"
|
|
11
|
+
],
|
|
12
|
+
"mappings": "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",
|
|
13
|
+
"debugId": "2D3FD9FDAEC0740E64756E2164756E21",
|
|
14
|
+
"names": []
|
|
15
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DesignSystem,
|
|
3
|
+
Project,
|
|
4
|
+
Screen,
|
|
5
|
+
Stitch,
|
|
6
|
+
StitchError,
|
|
7
|
+
StitchErrorCode,
|
|
8
|
+
StitchProxy,
|
|
9
|
+
StitchProxyConfigSchema,
|
|
10
|
+
StitchToolClient,
|
|
11
|
+
buildFifeSuffix,
|
|
12
|
+
downloadAssetsTool,
|
|
13
|
+
parseResourceName,
|
|
14
|
+
stitch,
|
|
15
|
+
toolDefinitions,
|
|
16
|
+
toolMap
|
|
17
|
+
} from "./chunk-ecn1ca83.js";
|
|
18
|
+
import"./chunk-543135qd.js";
|
|
19
|
+
import"./chunk-c6ge431q.js";
|
|
20
|
+
import"./chunk-9wyra8hs.js";
|
|
21
|
+
export {
|
|
22
|
+
toolMap,
|
|
23
|
+
toolDefinitions,
|
|
24
|
+
stitch,
|
|
25
|
+
parseResourceName,
|
|
26
|
+
downloadAssetsTool,
|
|
27
|
+
buildFifeSuffix,
|
|
28
|
+
StitchToolClient,
|
|
29
|
+
StitchProxyConfigSchema,
|
|
30
|
+
StitchProxy,
|
|
31
|
+
StitchErrorCode,
|
|
32
|
+
StitchError,
|
|
33
|
+
Stitch,
|
|
34
|
+
Screen,
|
|
35
|
+
Project,
|
|
36
|
+
DesignSystem
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
//# debugId=28F7E6B0F5A41BBD64756E2164756E21
|