capybara-mcp-shared 0.1.0

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.
@@ -0,0 +1,271 @@
1
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
2
+ export function linkedAbortController(parentSignal) {
3
+ const controller = new AbortController();
4
+ if (!parentSignal) {
5
+ return controller;
6
+ }
7
+ if (parentSignal.aborted) {
8
+ controller.abort(parentSignal.reason);
9
+ return controller;
10
+ }
11
+ parentSignal.addEventListener("abort", () => controller.abort(parentSignal.reason), {
12
+ once: true,
13
+ });
14
+ return controller;
15
+ }
16
+ function parseSseBlock(block) {
17
+ const lines = block.split("\n");
18
+ let event = "message";
19
+ const dataLines = [];
20
+ for (const line of lines) {
21
+ if (line.startsWith("event:")) {
22
+ event = line.slice(6).trim();
23
+ }
24
+ else if (line.startsWith("data:")) {
25
+ dataLines.push(line.slice(5).trim());
26
+ }
27
+ }
28
+ if (dataLines.length === 0) {
29
+ return null;
30
+ }
31
+ const raw = dataLines.join("\n");
32
+ try {
33
+ return { event, data: JSON.parse(raw) };
34
+ }
35
+ catch {
36
+ return { event, data: raw };
37
+ }
38
+ }
39
+ function extractResultPayload(event, data) {
40
+ if (event === "error") {
41
+ const message = typeof data === "object" && data
42
+ ? data.error ||
43
+ data.message ||
44
+ "Request failed"
45
+ : String(data);
46
+ throw new Error(message);
47
+ }
48
+ const status = typeof data === "object" && data ? data.status : undefined;
49
+ const isComplete = event === "complete" ||
50
+ event === "result" ||
51
+ event === "done" ||
52
+ (status != null && ["complete", "succeeded", "success"].includes(status));
53
+ if (!isComplete) {
54
+ return null;
55
+ }
56
+ if (typeof data === "object" && data) {
57
+ const record = data;
58
+ return record.result ?? record.data ?? data;
59
+ }
60
+ return data;
61
+ }
62
+ async function reportProgressFromPayload(report, data) {
63
+ if (!report || typeof data !== "object" || !data) {
64
+ return;
65
+ }
66
+ const record = data;
67
+ const message = record.progress_message || record.message;
68
+ const progress = record.progress ?? record.progress_pct;
69
+ const total = record.total ?? record.progress_total;
70
+ if (message || progress != null) {
71
+ await report({ message, progress, total });
72
+ }
73
+ }
74
+ async function readSseResponse(response, report, signal) {
75
+ if (!response.body) {
76
+ throw new Error("SSE response has no body");
77
+ }
78
+ const reader = response.body.getReader();
79
+ const decoder = new TextDecoder();
80
+ let buffer = "";
81
+ let result = null;
82
+ while (true) {
83
+ if (signal?.aborted) {
84
+ await reader.cancel();
85
+ throw new DOMException("Cancelled", "AbortError");
86
+ }
87
+ const { done, value } = await reader.read();
88
+ if (done) {
89
+ break;
90
+ }
91
+ buffer += decoder.decode(value, { stream: true });
92
+ const blocks = buffer.split("\n\n");
93
+ buffer = blocks.pop() || "";
94
+ for (const block of blocks) {
95
+ const parsed = parseSseBlock(block);
96
+ if (!parsed) {
97
+ continue;
98
+ }
99
+ await reportProgressFromPayload(report, parsed.data);
100
+ const extracted = extractResultPayload(parsed.event, parsed.data);
101
+ if (extracted != null) {
102
+ result = extracted;
103
+ }
104
+ }
105
+ }
106
+ if (result != null) {
107
+ return result;
108
+ }
109
+ throw new Error("Stream ended before a complete result was received");
110
+ }
111
+ async function readNdjsonResponse(response, report, signal) {
112
+ if (!response.body) {
113
+ throw new Error("NDJSON response has no body");
114
+ }
115
+ const reader = response.body.getReader();
116
+ const decoder = new TextDecoder();
117
+ let buffer = "";
118
+ let result = null;
119
+ while (true) {
120
+ if (signal?.aborted) {
121
+ await reader.cancel();
122
+ throw new DOMException("Cancelled", "AbortError");
123
+ }
124
+ const { done, value } = await reader.read();
125
+ if (done) {
126
+ break;
127
+ }
128
+ buffer += decoder.decode(value, { stream: true });
129
+ const lines = buffer.split("\n");
130
+ buffer = lines.pop() || "";
131
+ for (const line of lines) {
132
+ const trimmed = line.trim();
133
+ if (!trimmed) {
134
+ continue;
135
+ }
136
+ const data = JSON.parse(trimmed);
137
+ await reportProgressFromPayload(report, data);
138
+ const extracted = extractResultPayload(data.type || data.event || "message", data);
139
+ if (extracted != null) {
140
+ result = extracted;
141
+ }
142
+ }
143
+ }
144
+ const trailing = buffer.trim();
145
+ if (trailing) {
146
+ const data = JSON.parse(trailing);
147
+ await reportProgressFromPayload(report, data);
148
+ const extracted = extractResultPayload(data.type || data.event || "message", data);
149
+ if (extracted != null) {
150
+ result = extracted;
151
+ }
152
+ }
153
+ if (result != null) {
154
+ return result;
155
+ }
156
+ throw new Error("NDJSON stream ended before a complete result was received");
157
+ }
158
+ async function pollJobUntilComplete({ data, apiKey, apiUrl, report, signal, }) {
159
+ const statusUrl = data.status_url || (data.job_id ? `${apiUrl}/jobs/${data.job_id}` : null);
160
+ if (!statusUrl) {
161
+ throw new Error("Async response is missing status_url or job_id");
162
+ }
163
+ while (true) {
164
+ if (signal?.aborted) {
165
+ throw new DOMException("Cancelled", "AbortError");
166
+ }
167
+ const response = await fetch(statusUrl, {
168
+ headers: {
169
+ Authorization: `Bearer ${apiKey}`,
170
+ Accept: "application/json",
171
+ },
172
+ signal,
173
+ });
174
+ if (!response.ok) {
175
+ const errorText = await response.text();
176
+ throw new Error(`Job status request failed (${response.status}): ${errorText}`);
177
+ }
178
+ const status = (await response.json());
179
+ await reportProgressFromPayload(report, status);
180
+ if (["complete", "succeeded", "success"].includes(status.status)) {
181
+ return status.result ?? status;
182
+ }
183
+ if (["failed", "error", "cancelled"].includes(status.status)) {
184
+ throw new Error(status.error || status.message || `Job ${status.status}`);
185
+ }
186
+ await sleep(status.poll_interval_ms ?? status.retry_after_ms ?? 3000);
187
+ }
188
+ }
189
+ export async function postApiRequest({ url, body, apiKey, apiUrl, report, onJobId, signal, }) {
190
+ const abort = linkedAbortController(signal);
191
+ await report?.({ message: "Submitting request...", progress: 0, total: 100 });
192
+ const heartbeat = setInterval(() => {
193
+ void report?.({ message: "Still working..." });
194
+ }, 15000);
195
+ let response;
196
+ try {
197
+ response = await fetch(url, {
198
+ method: "POST",
199
+ headers: {
200
+ "Content-Type": "application/json",
201
+ Authorization: `Bearer ${apiKey}`,
202
+ Accept: "application/json, text/event-stream, application/x-ndjson",
203
+ },
204
+ body: JSON.stringify(body),
205
+ signal: abort.signal,
206
+ });
207
+ }
208
+ finally {
209
+ clearInterval(heartbeat);
210
+ }
211
+ if (!response.ok && response.status !== 202) {
212
+ const errorText = await response.text();
213
+ throw new Error(`Request failed (${response.status}): ${errorText}`);
214
+ }
215
+ const contentType = response.headers.get("content-type") || "";
216
+ if (contentType.includes("text/event-stream")) {
217
+ const data = await readSseResponse(response, report, abort.signal);
218
+ await report?.({ message: "Request complete.", progress: 100, total: 100 });
219
+ return { data };
220
+ }
221
+ if (contentType.includes("application/x-ndjson") || contentType.includes("ndjson")) {
222
+ const data = await readNdjsonResponse(response, report, abort.signal);
223
+ await report?.({ message: "Request complete.", progress: 100, total: 100 });
224
+ return { data };
225
+ }
226
+ const data = (await response.json());
227
+ if (response.status === 202 || data.job_id || data.status_url) {
228
+ if (data.job_id) {
229
+ await onJobId?.(data.job_id);
230
+ }
231
+ const result = await pollJobUntilComplete({
232
+ data,
233
+ apiKey,
234
+ apiUrl,
235
+ report,
236
+ signal: abort.signal,
237
+ });
238
+ await report?.({ message: "Request complete.", progress: 100, total: 100 });
239
+ return { jobId: data.job_id, data: result };
240
+ }
241
+ await report?.({ message: "Request complete.", progress: 100, total: 100 });
242
+ return { data };
243
+ }
244
+ export async function getJobStatus({ apiUrl, apiKey, jobId, signal, }) {
245
+ const response = await fetch(`${apiUrl}/jobs/${jobId}`, {
246
+ headers: {
247
+ Authorization: `Bearer ${apiKey}`,
248
+ Accept: "application/json",
249
+ },
250
+ signal,
251
+ });
252
+ if (!response.ok) {
253
+ const errorText = await response.text();
254
+ throw new Error(`Job status request failed (${response.status}): ${errorText}`);
255
+ }
256
+ return (await response.json());
257
+ }
258
+ export async function pollJobUntilDone({ apiUrl, apiKey, jobId, report, signal, }) {
259
+ while (true) {
260
+ if (signal?.aborted) {
261
+ throw new DOMException("Cancelled", "AbortError");
262
+ }
263
+ const status = await getJobStatus({ apiUrl, apiKey, jobId, signal });
264
+ await reportProgressFromPayload(report, status);
265
+ if (status.status === "complete" || status.status === "failed") {
266
+ return status;
267
+ }
268
+ await sleep(status.poll_interval_ms ?? 3000);
269
+ }
270
+ }
271
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/streaming/api-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { ProgressUpdate, StreamEvent } from "../types/api.js";
2
+ export type SseWritable = {
3
+ setHeader(name: string, value: string): void;
4
+ write(chunk: string): void;
5
+ end(): void;
6
+ flushHeaders?(): void;
7
+ };
8
+ export declare function wantsEventStream(acceptHeader: string | undefined): boolean;
9
+ export declare function initSse(res: SseWritable): void;
10
+ export declare function writeSseEvent(res: SseWritable, event: StreamEvent): void;
11
+ export declare function writeProgress(res: SseWritable, update: ProgressUpdate): void;
12
+ export declare function writeComplete(res: SseWritable, data: Record<string, unknown>): void;
13
+ export declare function writeError(res: SseWritable, error: string, message?: string): void;
14
+ //# sourceMappingURL=sse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../src/streaming/sse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnE,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,GAAG,IAAI,IAAI,CAAC;IACZ,YAAY,CAAC,IAAI,IAAI,CAAC;CACvB,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAE1E;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAK9C;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAGxE;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAE5E;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAGnF;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAGlF"}
@@ -0,0 +1,25 @@
1
+ export function wantsEventStream(acceptHeader) {
2
+ return (acceptHeader ?? "").includes("text/event-stream");
3
+ }
4
+ export function initSse(res) {
5
+ res.setHeader("Content-Type", "text/event-stream");
6
+ res.setHeader("Cache-Control", "no-cache");
7
+ res.setHeader("Connection", "keep-alive");
8
+ res.flushHeaders?.();
9
+ }
10
+ export function writeSseEvent(res, event) {
11
+ res.write(`event: ${event.event}\n`);
12
+ res.write(`data: ${JSON.stringify(event.data)}\n\n`);
13
+ }
14
+ export function writeProgress(res, update) {
15
+ writeSseEvent(res, { event: "progress", data: update });
16
+ }
17
+ export function writeComplete(res, data) {
18
+ writeSseEvent(res, { event: "complete", data });
19
+ res.end();
20
+ }
21
+ export function writeError(res, error, message) {
22
+ writeSseEvent(res, { event: "error", data: { error, message } });
23
+ res.end();
24
+ }
25
+ //# sourceMappingURL=sse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.js","sourceRoot":"","sources":["../../src/streaming/sse.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,gBAAgB,CAAC,YAAgC;IAC/D,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAgB;IACtC,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC;IACnD,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IAC3C,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IAC1C,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAgB,EAAE,KAAkB;IAChE,GAAG,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;IACrC,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAgB,EAAE,MAAsB;IACpE,aAAa,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAgB,EAAE,IAA6B;IAC3E,aAAa,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,GAAG,CAAC,GAAG,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAgB,EAAE,KAAa,EAAE,OAAgB;IAC1E,aAAa,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IACjE,GAAG,CAAC,GAAG,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,76 @@
1
+ export type ProgressUpdate = {
2
+ message?: string;
3
+ progress?: number;
4
+ total?: number;
5
+ };
6
+ export type ProgressReporter = (update: ProgressUpdate) => void | Promise<void>;
7
+ export type JobStatus = "pending" | "running" | "complete" | "failed" | "cancelled";
8
+ export type JobKind = "generate_assets";
9
+ export type JobRecord = {
10
+ id: string;
11
+ kind: JobKind;
12
+ userId: string;
13
+ status: JobStatus;
14
+ progress?: number;
15
+ total?: number;
16
+ progress_message?: string;
17
+ message?: string;
18
+ error?: string;
19
+ result?: unknown;
20
+ createdAt: string;
21
+ updatedAt: string;
22
+ };
23
+ export type JobStartResponse = {
24
+ job_id: string;
25
+ status: JobStatus;
26
+ status_url: string;
27
+ };
28
+ export type JobStatusResponse = {
29
+ job_id: string;
30
+ kind?: JobKind;
31
+ status: JobStatus;
32
+ progress?: number;
33
+ total?: number;
34
+ progress_message?: string;
35
+ message?: string;
36
+ error?: string;
37
+ result?: unknown;
38
+ poll_interval_ms?: number;
39
+ };
40
+ export type StreamEvent = {
41
+ event: "progress";
42
+ data: ProgressUpdate;
43
+ } | {
44
+ event: "complete";
45
+ data: Record<string, unknown>;
46
+ } | {
47
+ event: "error";
48
+ data: {
49
+ error: string;
50
+ message?: string;
51
+ };
52
+ };
53
+ export type FileWriteEntry = {
54
+ path: string;
55
+ content?: string;
56
+ content_base64?: string;
57
+ };
58
+ export type GenerateAssetsResult = {
59
+ message?: string;
60
+ status?: string;
61
+ assets?: FileWriteEntry[];
62
+ files?: FileWriteEntry[];
63
+ assets_md?: string;
64
+ succeededAssetIds?: string[];
65
+ failedAssets?: Array<{
66
+ id: string;
67
+ error: string;
68
+ stage?: string;
69
+ }>;
70
+ warnings?: string[];
71
+ assetInfo?: Array<{
72
+ id: string;
73
+ summary: string;
74
+ }>;
75
+ };
76
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/types/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/types/api.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "capybara-mcp-shared",
3
+ "version": "0.1.0",
4
+ "description": "Shared schemas and API types for capybara-mcp",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": ["dist"],
16
+ "scripts": {
17
+ "build": "tsc -p tsconfig.json",
18
+ "typecheck": "tsc -p tsconfig.json --noEmit",
19
+ "prepublishOnly": "npm run build"
20
+ },
21
+ "dependencies": {
22
+ "zod": "^3.23.8"
23
+ },
24
+ "devDependencies": {
25
+ "typescript": "^5.8.3"
26
+ },
27
+ "engines": {
28
+ "node": ">=18"
29
+ }
30
+ }