browser-debug-mcp-bridge 1.9.0 → 1.11.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.
Files changed (56) hide show
  1. package/README.md +271 -188
  2. package/apps/mcp-server/dist/db/automation-repository.js +199 -0
  3. package/apps/mcp-server/dist/db/automation-repository.js.map +1 -0
  4. package/apps/mcp-server/dist/db/connection.js +1 -5
  5. package/apps/mcp-server/dist/db/connection.js.map +1 -1
  6. package/apps/mcp-server/dist/db/events-repository.js +79 -10
  7. package/apps/mcp-server/dist/db/events-repository.js.map +1 -1
  8. package/apps/mcp-server/dist/db/index.js +2 -0
  9. package/apps/mcp-server/dist/db/index.js.map +1 -1
  10. package/apps/mcp-server/dist/db/migrations.js +493 -0
  11. package/apps/mcp-server/dist/db/migrations.js.map +1 -1
  12. package/apps/mcp-server/dist/db/schema.js +192 -1
  13. package/apps/mcp-server/dist/db/schema.js.map +1 -1
  14. package/apps/mcp-server/dist/document-response-rewriter.js +196 -0
  15. package/apps/mcp-server/dist/document-response-rewriter.js.map +1 -0
  16. package/apps/mcp-server/dist/json-rewrite.js +189 -0
  17. package/apps/mcp-server/dist/json-rewrite.js.map +1 -0
  18. package/apps/mcp-server/dist/main.js +375 -4
  19. package/apps/mcp-server/dist/main.js.map +1 -1
  20. package/apps/mcp-server/dist/mcp/server.js +4168 -310
  21. package/apps/mcp-server/dist/mcp/server.js.map +1 -1
  22. package/apps/mcp-server/dist/mcp-bridge.js +46 -3
  23. package/apps/mcp-server/dist/mcp-bridge.js.map +1 -1
  24. package/apps/mcp-server/dist/next-asset-mapper.js +701 -0
  25. package/apps/mcp-server/dist/next-asset-mapper.js.map +1 -0
  26. package/apps/mcp-server/dist/next-source-override-planner.js +601 -0
  27. package/apps/mcp-server/dist/next-source-override-planner.js.map +1 -0
  28. package/apps/mcp-server/dist/override-audit-contract.js +51 -0
  29. package/apps/mcp-server/dist/override-audit-contract.js.map +1 -0
  30. package/apps/mcp-server/dist/override-audit.js +740 -0
  31. package/apps/mcp-server/dist/override-audit.js.map +1 -0
  32. package/apps/mcp-server/dist/override-capabilities.js +136 -0
  33. package/apps/mcp-server/dist/override-capabilities.js.map +1 -0
  34. package/apps/mcp-server/dist/override-observed-assets.js +179 -0
  35. package/apps/mcp-server/dist/override-observed-assets.js.map +1 -0
  36. package/apps/mcp-server/dist/override-poc.js +336 -0
  37. package/apps/mcp-server/dist/override-poc.js.map +1 -0
  38. package/apps/mcp-server/dist/override-profile-generator.js +403 -0
  39. package/apps/mcp-server/dist/override-profile-generator.js.map +1 -0
  40. package/apps/mcp-server/dist/override-response-planner.js +557 -0
  41. package/apps/mcp-server/dist/override-response-planner.js.map +1 -0
  42. package/apps/mcp-server/dist/override-rule-types.js +32 -0
  43. package/apps/mcp-server/dist/override-rule-types.js.map +1 -0
  44. package/apps/mcp-server/dist/retention.js +4 -3
  45. package/apps/mcp-server/dist/retention.js.map +1 -1
  46. package/apps/mcp-server/dist/rsc-flight-patch-safety.js +269 -0
  47. package/apps/mcp-server/dist/rsc-flight-patch-safety.js.map +1 -0
  48. package/apps/mcp-server/dist/runtime-paths.js +33 -0
  49. package/apps/mcp-server/dist/runtime-paths.js.map +1 -0
  50. package/apps/mcp-server/dist/websocket/messages.js +13 -0
  51. package/apps/mcp-server/dist/websocket/messages.js.map +1 -1
  52. package/apps/mcp-server/dist/websocket/websocket-server.js +10 -0
  53. package/apps/mcp-server/dist/websocket/websocket-server.js.map +1 -1
  54. package/apps/mcp-server/package.json +1 -0
  55. package/package.json +16 -1
  56. package/scripts/mcp-start.cjs +201 -11
@@ -0,0 +1,557 @@
1
+ import { createHash } from 'crypto';
2
+ import { existsSync, mkdirSync, writeFileSync } from 'fs';
3
+ import { dirname, extname, resolve } from 'path';
4
+ import { applyDocumentPatches, normalizeDocumentPatches, } from './document-response-rewriter.js';
5
+ import { applyJsonPatches, normalizeJsonPatches, } from './json-rewrite.js';
6
+ import { normalizeOverrideMatchMode, isOverridePocRuleType, normalizeOverrideRequestMethod, } from './override-rule-types.js';
7
+ import { assertOverrideResponseRequestProductionSafe } from './override-capabilities.js';
8
+ import { applyRscFlightTextPatches as applyStructuredRscFlightTextPatches } from './rsc-flight-patch-safety.js';
9
+ const DEFAULT_MAX_RESPONSE_PATCH_BYTES = 1024 * 1024;
10
+ const HARD_MAX_RESPONSE_PATCH_BYTES = 5 * 1024 * 1024;
11
+ const RSC_FLIGHT_LIMITED_SUPPORT_WARNING = 'RSC flight response overrides are limited to captured text/x-component responses with structured JSON string-value replacements.';
12
+ const NEXT_RSC_CONTEXT_HEADERS = new Set([
13
+ 'rsc',
14
+ 'next-router-prefetch',
15
+ 'purpose',
16
+ ]);
17
+ const SHA256_HEX_PATTERN = /^[a-f0-9]{64}$/;
18
+ function normalizeOptionalString(value) {
19
+ return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;
20
+ }
21
+ function normalizeTargetUrl(options) {
22
+ const raw = normalizeOptionalString(options.targetUrl) ?? normalizeOptionalString(options.targetAssetUrl);
23
+ if (!raw) {
24
+ throw new Error('targetUrl is required');
25
+ }
26
+ try {
27
+ const parsed = new URL(raw);
28
+ if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
29
+ throw new Error('targetUrl must use http:// or https://');
30
+ }
31
+ return parsed.toString();
32
+ }
33
+ catch (error) {
34
+ if (error instanceof Error && error.message.includes('targetUrl must use')) {
35
+ throw error;
36
+ }
37
+ throw new Error('targetUrl must be a valid absolute http(s) URL');
38
+ }
39
+ }
40
+ function resolveMaxBodyBytes(value) {
41
+ if (typeof value !== 'number' || !Number.isFinite(value)) {
42
+ return DEFAULT_MAX_RESPONSE_PATCH_BYTES;
43
+ }
44
+ const floored = Math.floor(value);
45
+ if (floored < 1) {
46
+ return DEFAULT_MAX_RESPONSE_PATCH_BYTES;
47
+ }
48
+ return Math.min(floored, HARD_MAX_RESPONSE_PATCH_BYTES);
49
+ }
50
+ function byteLength(value) {
51
+ return Buffer.byteLength(value, 'utf8');
52
+ }
53
+ function sha256(value) {
54
+ return createHash('sha256').update(value, 'utf8').digest('hex');
55
+ }
56
+ function normalizeRscCaptureSource(options) {
57
+ const raw = normalizeOptionalString(options.captureMode)
58
+ ?? normalizeOptionalString(options.captureSource)
59
+ ?? normalizeOptionalString(options.source);
60
+ if (raw === 'cdp-response' || raw === 'extension-fetch') {
61
+ return raw;
62
+ }
63
+ return undefined;
64
+ }
65
+ function normalizeRscRequestHeaders(value) {
66
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
67
+ return undefined;
68
+ }
69
+ const headers = {};
70
+ for (const [name, rawHeaderValue] of Object.entries(value)) {
71
+ const normalizedName = name.trim().toLowerCase();
72
+ if (!NEXT_RSC_CONTEXT_HEADERS.has(normalizedName) || typeof rawHeaderValue !== 'string') {
73
+ continue;
74
+ }
75
+ const trimmedValue = rawHeaderValue.trim();
76
+ if (trimmedValue.length > 0) {
77
+ headers[normalizedName] = trimmedValue;
78
+ }
79
+ }
80
+ return Object.keys(headers).length > 0 ? headers : undefined;
81
+ }
82
+ function inferRuleType(targetUrl, contentType, rawRuleType) {
83
+ if (rawRuleType !== undefined) {
84
+ if (!isOverridePocRuleType(rawRuleType)) {
85
+ throw new Error('ruleType must be one of asset, document, rsc-flight, next-data, api-response');
86
+ }
87
+ return rawRuleType;
88
+ }
89
+ const parsed = new URL(targetUrl);
90
+ const lowerContentType = contentType.toLowerCase();
91
+ if (lowerContentType.includes('text/x-component') || parsed.searchParams.has('_rsc')) {
92
+ return 'rsc-flight';
93
+ }
94
+ if (parsed.pathname.includes('/_next/data/')) {
95
+ return 'next-data';
96
+ }
97
+ if (lowerContentType.includes('text/html')) {
98
+ return 'document';
99
+ }
100
+ if (lowerContentType.includes('json') || lowerContentType.startsWith('text/')) {
101
+ return 'api-response';
102
+ }
103
+ return 'document';
104
+ }
105
+ function defaultContentType(ruleType) {
106
+ switch (ruleType) {
107
+ case 'document':
108
+ return 'text/html; charset=utf-8';
109
+ case 'rsc-flight':
110
+ return 'text/x-component; charset=utf-8';
111
+ case 'next-data':
112
+ case 'api-response':
113
+ return 'application/json; charset=utf-8';
114
+ case 'asset':
115
+ return 'text/plain; charset=utf-8';
116
+ }
117
+ }
118
+ function normalizeContentType(value, targetUrl, rawRuleType) {
119
+ const preliminary = normalizeOptionalString(value) ?? '';
120
+ const ruleType = inferRuleType(targetUrl, preliminary, rawRuleType);
121
+ return {
122
+ ruleType,
123
+ contentType: preliminary || defaultContentType(ruleType),
124
+ };
125
+ }
126
+ function isTextualContentType(contentType) {
127
+ const normalized = contentType.toLowerCase().split(';', 1)[0]?.trim() ?? '';
128
+ return normalized.startsWith('text/')
129
+ || normalized === 'application/json'
130
+ || normalized.endsWith('+json')
131
+ || normalized === 'application/javascript'
132
+ || normalized === 'application/xml'
133
+ || normalized.endsWith('+xml')
134
+ || normalized === 'image/svg+xml'
135
+ || normalized === 'application/x-ndjson';
136
+ }
137
+ function isJsonLike(ruleType, contentType, body) {
138
+ const normalized = contentType.toLowerCase();
139
+ const trimmed = body.trimStart();
140
+ return ruleType === 'next-data'
141
+ || normalized.includes('json')
142
+ || normalized.includes('+json')
143
+ || ((ruleType === 'api-response' || ruleType === 'asset') && (trimmed.startsWith('{') || trimmed.startsWith('[')));
144
+ }
145
+ function isLikelyRscFlightBody(body) {
146
+ return body.length > 0 && /(^|\n)\d+:/u.test(body);
147
+ }
148
+ function assertValidJson(body, label) {
149
+ try {
150
+ JSON.parse(body);
151
+ }
152
+ catch (error) {
153
+ throw new Error(`${label} response body must remain valid JSON: ${error instanceof Error ? error.message : 'invalid JSON'}`);
154
+ }
155
+ }
156
+ function decodeBody(options) {
157
+ const bodyText = normalizeOptionalString(options.responseBodyText) ?? normalizeOptionalString(options.bodyText);
158
+ const bodyBase64 = normalizeOptionalString(options.responseBodyBase64) ?? normalizeOptionalString(options.bodyBase64);
159
+ if (bodyText !== undefined && bodyBase64 !== undefined) {
160
+ throw new Error('Provide either responseBodyText or responseBodyBase64, not both');
161
+ }
162
+ if (bodyText !== undefined) {
163
+ return bodyText;
164
+ }
165
+ if (bodyBase64 !== undefined) {
166
+ return Buffer.from(bodyBase64, 'base64').toString('utf8');
167
+ }
168
+ throw new Error('responseBodyText or responseBodyBase64 is required');
169
+ }
170
+ function normalizeTextPatches(value) {
171
+ if (!Array.isArray(value) || value.length === 0) {
172
+ throw new Error('textPatches must include at least one patch');
173
+ }
174
+ return value.map((entry, index) => {
175
+ if (typeof entry !== 'object' || entry === null || Array.isArray(entry)) {
176
+ throw new Error(`textPatches[${index}] must be an object`);
177
+ }
178
+ const patch = entry;
179
+ const search = normalizeOptionalString(patch.search);
180
+ if (!search) {
181
+ throw new Error(`textPatches[${index}].search must be a non-empty string`);
182
+ }
183
+ if (typeof patch.replacement !== 'string') {
184
+ throw new Error(`textPatches[${index}].replacement must be a string`);
185
+ }
186
+ const expectedCount = patch.expectedCount;
187
+ if (expectedCount !== undefined
188
+ && (typeof expectedCount !== 'number' || !Number.isFinite(expectedCount) || Math.floor(expectedCount) < 0)) {
189
+ throw new Error(`textPatches[${index}].expectedCount must be a non-negative finite number when provided`);
190
+ }
191
+ return {
192
+ search,
193
+ replacement: patch.replacement,
194
+ expectedCount: expectedCount === undefined ? undefined : Math.floor(expectedCount),
195
+ required: patch.required !== false,
196
+ };
197
+ });
198
+ }
199
+ function countOccurrences(source, search) {
200
+ return source.split(search).length - 1;
201
+ }
202
+ function applyTextPatches(body, patches) {
203
+ let patchedBody = body;
204
+ const applied = [];
205
+ const warnings = [];
206
+ for (const patch of patches) {
207
+ const matchedCount = countOccurrences(patchedBody, patch.search);
208
+ if (patch.expectedCount !== undefined && matchedCount !== patch.expectedCount) {
209
+ throw new Error(`Patch search ${JSON.stringify(patch.search)} matched ${matchedCount} time(s), expected ${patch.expectedCount}`);
210
+ }
211
+ if (matchedCount === 0 && patch.required) {
212
+ throw new Error(`Patch search text was not found: ${JSON.stringify(patch.search)}`);
213
+ }
214
+ if (matchedCount === 0) {
215
+ warnings.push(`Optional patch search text was not found: ${JSON.stringify(patch.search)}`);
216
+ }
217
+ if (matchedCount > 0 && patch.search === patch.replacement) {
218
+ warnings.push(`Patch search ${JSON.stringify(patch.search)} is a no-op replacement.`);
219
+ }
220
+ patchedBody = patchedBody.split(patch.search).join(patch.replacement);
221
+ applied.push({
222
+ ...patch,
223
+ matchedCount,
224
+ });
225
+ }
226
+ if (patchedBody === body) {
227
+ throw new Error('No response patch changed the body');
228
+ }
229
+ return { patchedBody, applied, warnings };
230
+ }
231
+ function fileExtensionForContentType(contentType, ruleType) {
232
+ const normalized = contentType.toLowerCase();
233
+ if (normalized.includes('html')) {
234
+ return '.html';
235
+ }
236
+ if (normalized.includes('json') || ruleType === 'next-data') {
237
+ return '.json';
238
+ }
239
+ if (normalized.includes('javascript')) {
240
+ return '.js';
241
+ }
242
+ if (normalized.includes('css')) {
243
+ return '.css';
244
+ }
245
+ if (normalized.includes('x-component') || ruleType === 'rsc-flight') {
246
+ return '.rsc.txt';
247
+ }
248
+ return '.txt';
249
+ }
250
+ function resolveOutputPath(options) {
251
+ const outputRoot = options.outputRoot
252
+ ?? (options.configPath ? resolve(dirname(options.configPath), 'tmp', 'bn', 'response-overrides') : undefined);
253
+ if (!outputRoot) {
254
+ throw new Error('outputRoot or configPath is required when writeBody/writeConfig is true');
255
+ }
256
+ const parsed = new URL(options.targetUrl);
257
+ const basename = parsed.pathname.split('/').filter(Boolean).pop() ?? 'document';
258
+ const cleanBasename = basename.replace(/[^A-Za-z0-9._-]/g, '_').slice(0, 60) || 'response';
259
+ const currentExtension = extname(cleanBasename);
260
+ const extension = currentExtension || fileExtensionForContentType(options.contentType, options.ruleType);
261
+ const stem = currentExtension ? cleanBasename.slice(0, -currentExtension.length) : cleanBasename;
262
+ return resolve(outputRoot, `${options.ruleType}-${stem}-${options.patchedSha256.slice(0, 12)}${extension}`);
263
+ }
264
+ function writeOverrideConfig(options) {
265
+ if (existsSync(options.configPath) && options.overwrite === false) {
266
+ throw new Error(`Refusing to overwrite existing override config: ${options.configPath}`);
267
+ }
268
+ const profileId = options.profileId ?? 'response-patch';
269
+ mkdirSync(dirname(options.configPath), { recursive: true });
270
+ writeFileSync(options.configPath, `${JSON.stringify({
271
+ enabled: options.enabled ?? true,
272
+ activeProfileId: profileId,
273
+ profiles: [{
274
+ profileId,
275
+ name: options.profileName ?? 'Response body patch',
276
+ enabled: options.profileEnabled ?? true,
277
+ autoReload: options.autoReload ?? true,
278
+ rules: [options.rule],
279
+ }],
280
+ }, null, 2)}\n`, 'utf8');
281
+ }
282
+ function buildNextActions(result) {
283
+ if (result.blockers.length > 0) {
284
+ return [{ code: 'FIX_RESPONSE_PATCH_BLOCKERS', message: 'Resolve response patch blockers before enabling overrides.' }];
285
+ }
286
+ if (!result.rule) {
287
+ return [{ code: 'WRITE_RESPONSE_BODY', message: 'Run again with writeBody=true or writeConfig=true to create a local response body.' }];
288
+ }
289
+ if (!result.configWritten) {
290
+ return [{ code: 'WRITE_OVERRIDE_CONFIG', message: 'Run again with writeConfig=true to make the response patch enableable.' }];
291
+ }
292
+ return [{ code: 'ENABLE_OVERRIDES', message: 'Validate the generated profile, then enable overrides on the target tab.' }];
293
+ }
294
+ function buildRscFlightMetadata(options) {
295
+ const blockers = [];
296
+ const warnings = [RSC_FLIGHT_LIMITED_SUPPORT_WARNING];
297
+ const source = normalizeRscCaptureSource(options.plannerOptions);
298
+ const parsedTargetUrl = new URL(options.targetUrl);
299
+ if (!source) {
300
+ blockers.push('RSC flight response config writing requires a body captured with captureMode "cdp-response" or "extension-fetch".');
301
+ }
302
+ if (options.requestMethod !== 'GET') {
303
+ blockers.push('RSC flight response overrides only support GET requests.');
304
+ }
305
+ if (!parsedTargetUrl.searchParams.has('_rsc')) {
306
+ blockers.push('RSC flight response targetUrl must include the Next.js _rsc search parameter.');
307
+ }
308
+ if (!options.contentType.toLowerCase().includes('text/x-component')) {
309
+ blockers.push('RSC flight response overrides require a text/x-component content type.');
310
+ }
311
+ if (!isLikelyRscFlightBody(options.body)) {
312
+ blockers.push('Original RSC flight response body does not match the supported Flight payload shape.');
313
+ }
314
+ if (!isLikelyRscFlightBody(options.patchedBody)) {
315
+ blockers.push('Patched RSC flight response body does not match the supported Flight payload shape.');
316
+ }
317
+ if (!SHA256_HEX_PATTERN.test(options.originalSha256) || !SHA256_HEX_PATTERN.test(options.patchedSha256)) {
318
+ blockers.push('RSC flight response hashes are invalid.');
319
+ }
320
+ if (options.originalSha256 === options.patchedSha256) {
321
+ blockers.push('RSC flight response patches must change the response body hash.');
322
+ }
323
+ if (blockers.length > 0 || !source) {
324
+ return { blockers, warnings };
325
+ }
326
+ return {
327
+ blockers,
328
+ warnings,
329
+ metadata: {
330
+ productionMode: 'structured-flight-v1',
331
+ source,
332
+ patchKind: 'string-value-text',
333
+ textPatches: options.appliedPatches.map((patch) => ({
334
+ search: patch.search,
335
+ replacement: patch.replacement,
336
+ expectedCount: patch.expectedCount ?? patch.matchedCount,
337
+ })),
338
+ originalSha256: options.originalSha256,
339
+ patchedSha256: options.patchedSha256,
340
+ originalBytes: options.originalBytes,
341
+ patchedBytes: options.patchedBytes,
342
+ contentType: options.contentType,
343
+ requestHeaders: normalizeRscRequestHeaders(options.plannerOptions.requestHeaders),
344
+ },
345
+ };
346
+ }
347
+ export function planOverrideResponsePatch(options) {
348
+ const targetUrl = normalizeTargetUrl(options);
349
+ const { contentType, ruleType } = normalizeContentType(options.contentType, targetUrl, options.ruleType);
350
+ if (!isTextualContentType(contentType)) {
351
+ throw new Error(`Response content type is not supported for response patching: ${contentType}`);
352
+ }
353
+ const requestMethod = normalizeOverrideRequestMethod(options.requestMethod);
354
+ assertOverrideResponseRequestProductionSafe({
355
+ requestMethod,
356
+ requestHeaders: options.requestHeaders,
357
+ ruleType,
358
+ });
359
+ const matchMode = normalizeOverrideMatchMode(options.matchMode);
360
+ const maxBodyBytes = resolveMaxBodyBytes(options.maxBodyBytes);
361
+ const body = decodeBody(options);
362
+ const originalBytes = byteLength(body);
363
+ if (originalBytes > maxBodyBytes) {
364
+ throw new Error(`Response body is ${originalBytes} byte(s), above maxBodyBytes ${maxBodyBytes}`);
365
+ }
366
+ const hasTextPatches = options.textPatches !== undefined;
367
+ const hasJsonPatches = options.jsonPatches !== undefined;
368
+ const hasDocumentPatches = options.documentPatches !== undefined;
369
+ const providedPatchKinds = [hasTextPatches, hasJsonPatches, hasDocumentPatches].filter(Boolean).length;
370
+ if (providedPatchKinds !== 1) {
371
+ throw new Error('Provide exactly one of textPatches, jsonPatches, or documentPatches');
372
+ }
373
+ const patches = hasTextPatches ? normalizeTextPatches(options.textPatches) : [];
374
+ const jsonPatches = hasJsonPatches ? normalizeJsonPatches(options.jsonPatches) : [];
375
+ const documentPatches = hasDocumentPatches ? normalizeDocumentPatches(options.documentPatches) : [];
376
+ const jsonLike = isJsonLike(ruleType, contentType, body);
377
+ const supportsStructuredJsonPatches = ruleType === 'next-data' || ruleType === 'api-response';
378
+ if (hasJsonPatches && (!supportsStructuredJsonPatches || !jsonLike)) {
379
+ throw new Error('jsonPatches are only supported for JSON-like next-data or api-response bodies');
380
+ }
381
+ if (hasDocumentPatches && ruleType !== 'document') {
382
+ throw new Error('documentPatches are only supported for document response bodies');
383
+ }
384
+ if (jsonLike && patches.length > 0) {
385
+ assertValidJson(body, 'Original');
386
+ }
387
+ const { patchedBody, applied, appliedJsonPatches, appliedDocumentPatches, warnings, } = documentPatches.length > 0
388
+ ? (() => {
389
+ const documentResult = applyDocumentPatches(body, documentPatches);
390
+ return {
391
+ patchedBody: documentResult.patchedBody,
392
+ applied: [],
393
+ appliedJsonPatches: [],
394
+ appliedDocumentPatches: documentResult.applied,
395
+ warnings: documentResult.warnings,
396
+ };
397
+ })()
398
+ : jsonPatches.length > 0
399
+ ? (() => {
400
+ const jsonResult = applyJsonPatches(body, jsonPatches);
401
+ return {
402
+ patchedBody: jsonResult.patchedBody,
403
+ applied: [],
404
+ appliedJsonPatches: jsonResult.applied,
405
+ appliedDocumentPatches: [],
406
+ warnings: jsonResult.warnings,
407
+ };
408
+ })()
409
+ : ruleType === 'rsc-flight'
410
+ ? (() => {
411
+ const rscResult = applyStructuredRscFlightTextPatches(body, patches);
412
+ const blocker = rscResult.blockers[0];
413
+ if (blocker) {
414
+ throw new Error(blocker.message);
415
+ }
416
+ if (rscResult.patchedBody === body) {
417
+ throw new Error('No response patch changed the body');
418
+ }
419
+ return {
420
+ patchedBody: rscResult.patchedBody,
421
+ applied: rscResult.applied.map((patch) => ({
422
+ search: patch.search,
423
+ replacement: patch.replacement,
424
+ expectedCount: patch.expectedCount,
425
+ required: patch.required !== false,
426
+ matchedCount: patch.matchedCount,
427
+ })),
428
+ appliedJsonPatches: [],
429
+ appliedDocumentPatches: [],
430
+ warnings: rscResult.warnings,
431
+ };
432
+ })()
433
+ : (() => {
434
+ const textResult = applyTextPatches(body, patches);
435
+ return {
436
+ patchedBody: textResult.patchedBody,
437
+ applied: textResult.applied,
438
+ appliedJsonPatches: [],
439
+ appliedDocumentPatches: [],
440
+ warnings: textResult.warnings,
441
+ };
442
+ })();
443
+ if (isJsonLike(ruleType, contentType, patchedBody)) {
444
+ assertValidJson(patchedBody, 'Patched');
445
+ }
446
+ const patchedBytes = byteLength(patchedBody);
447
+ if (patchedBytes > maxBodyBytes) {
448
+ throw new Error(`Patched response body is ${patchedBytes} byte(s), above maxBodyBytes ${maxBodyBytes}`);
449
+ }
450
+ const originalSha256 = sha256(body);
451
+ const patchedSha256 = sha256(patchedBody);
452
+ const configPath = normalizeOptionalString(options.configPath);
453
+ const outputRoot = normalizeOptionalString(options.outputRoot);
454
+ const blockers = [];
455
+ let rscFlightMetadata;
456
+ if (ruleType === 'rsc-flight') {
457
+ const rscFlight = buildRscFlightMetadata({
458
+ plannerOptions: options,
459
+ targetUrl,
460
+ requestMethod,
461
+ contentType,
462
+ body,
463
+ patchedBody,
464
+ originalSha256,
465
+ patchedSha256,
466
+ originalBytes,
467
+ patchedBytes,
468
+ appliedPatches: applied,
469
+ });
470
+ blockers.push(...rscFlight.blockers);
471
+ warnings.push(...rscFlight.warnings);
472
+ rscFlightMetadata = rscFlight.metadata;
473
+ if (options.writeConfig === true) {
474
+ warnings.push(rscFlight.metadata
475
+ ? 'Generated RSC flight override config includes production structured-flight metadata.'
476
+ : 'Override config was not written because the RSC flight response did not pass production safety checks.');
477
+ }
478
+ }
479
+ const shouldWriteBody = options.writeBody === true || (options.writeConfig === true && blockers.length === 0);
480
+ const shouldWriteConfig = options.writeConfig === true && blockers.length === 0;
481
+ let localFilePath;
482
+ let rule;
483
+ if (shouldWriteBody || shouldWriteConfig) {
484
+ localFilePath = resolveOutputPath({
485
+ outputRoot,
486
+ configPath,
487
+ targetUrl,
488
+ ruleType,
489
+ contentType,
490
+ patchedSha256,
491
+ });
492
+ mkdirSync(dirname(localFilePath), { recursive: true });
493
+ writeFileSync(localFilePath, patchedBody, 'utf8');
494
+ if (blockers.length === 0) {
495
+ rule = {
496
+ ruleId: normalizeOptionalString(options.ruleId) ?? 'response-1',
497
+ ruleType,
498
+ requestMethod,
499
+ matchMode,
500
+ targetAssetUrl: targetUrl,
501
+ localFilePath,
502
+ contentType,
503
+ enabled: true,
504
+ rscFlight: rscFlightMetadata,
505
+ };
506
+ }
507
+ }
508
+ if (shouldWriteConfig) {
509
+ if (!configPath) {
510
+ throw new Error('configPath is required when writeConfig is true');
511
+ }
512
+ if (!rule) {
513
+ throw new Error('A generated response rule is required when writeConfig is true');
514
+ }
515
+ writeOverrideConfig({
516
+ configPath,
517
+ rule,
518
+ profileId: normalizeOptionalString(options.profileId),
519
+ profileName: normalizeOptionalString(options.profileName),
520
+ enabled: options.enabled === false ? false : true,
521
+ profileEnabled: options.profileEnabled === false ? false : true,
522
+ autoReload: options.autoReload !== false,
523
+ overwrite: typeof options.overwrite === 'boolean' ? options.overwrite : undefined,
524
+ });
525
+ }
526
+ const resultWithoutActions = {
527
+ targetUrl,
528
+ ruleType,
529
+ requestMethod,
530
+ matchMode,
531
+ contentType,
532
+ originalBytes,
533
+ patchedBytes,
534
+ originalSha256,
535
+ patchedSha256,
536
+ patches: applied,
537
+ jsonPatches: appliedJsonPatches,
538
+ documentPatches: appliedDocumentPatches,
539
+ localFilePath,
540
+ configPath,
541
+ configWritten: shouldWriteConfig,
542
+ rule,
543
+ preview: options.includePreview === true
544
+ ? {
545
+ before: body.slice(0, 500),
546
+ after: patchedBody.slice(0, 500),
547
+ }
548
+ : undefined,
549
+ warnings,
550
+ blockers,
551
+ };
552
+ return {
553
+ ...resultWithoutActions,
554
+ nextActions: buildNextActions(resultWithoutActions),
555
+ };
556
+ }
557
+ //# sourceMappingURL=override-response-planner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"override-response-planner.js","sourceRoot":"","sources":["../src/override-response-planner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export const OVERRIDE_POC_RULE_TYPES = [
2
+ 'asset',
3
+ 'document',
4
+ 'rsc-flight',
5
+ 'next-data',
6
+ 'api-response',
7
+ ];
8
+ const RULE_TYPE_SET = new Set(OVERRIDE_POC_RULE_TYPES);
9
+ export const OVERRIDE_POC_MATCH_MODES = [
10
+ 'exact',
11
+ 'prefix',
12
+ ];
13
+ const MATCH_MODE_SET = new Set(OVERRIDE_POC_MATCH_MODES);
14
+ export function isOverridePocRuleType(value) {
15
+ return typeof value === 'string' && RULE_TYPE_SET.has(value);
16
+ }
17
+ export function isOverridePocMatchMode(value) {
18
+ return typeof value === 'string' && MATCH_MODE_SET.has(value);
19
+ }
20
+ export function normalizeOverridePocRuleType(value, fallback = 'asset') {
21
+ return isOverridePocRuleType(value) ? value : fallback;
22
+ }
23
+ export function normalizeOverrideMatchMode(value, fallback = 'exact') {
24
+ return isOverridePocMatchMode(value) ? value : fallback;
25
+ }
26
+ export function normalizeOverrideRequestMethod(value, fallback = 'GET') {
27
+ if (typeof value !== 'string' || value.trim().length === 0) {
28
+ return fallback;
29
+ }
30
+ return value.trim().toUpperCase();
31
+ }
32
+ //# sourceMappingURL=override-rule-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"override-rule-types.js","sourceRoot":"","sources":["../src/override-rule-types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,OAAO;IACP,UAAU;IACV,YAAY;IACZ,WAAW;IACX,cAAc;CACN,CAAC;AAIX,MAAM,aAAa,GAAG,IAAI,GAAG,CAAS,uBAAuB,CAAC,CAAC;AAE/D,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,OAAO;IACP,QAAQ;CACA,CAAC;AAIX,MAAM,cAAc,GAAG,IAAI,GAAG,CAAS,wBAAwB,CAAC,CAAC;AAEjE,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACnD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,KAAc,EAAE,WAAgC,OAAO;IAClG,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAAc,EAAE,WAAiC,OAAO;IACjG,OAAO,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,KAAc,EAAE,QAAQ,GAAG,KAAK;IAC7E,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3D,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACpC,CAAC"}
@@ -320,9 +320,9 @@ export function importSessionFromJson(db, payload, options = {}) {
320
320
  const remappedSessionId = sessionId !== requestedSessionId;
321
321
  const importedAt = Date.now();
322
322
  const insertSession = db.prepare(`INSERT INTO sessions (
323
- session_id, created_at, ended_at, tab_id, window_id, url_start, url_last,
323
+ session_id, created_at, last_seen_at, ended_at, tab_id, window_id, url_start, url_last,
324
324
  user_agent, viewport_w, viewport_h, dpr, safe_mode, allowlist_hash, pinned
325
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
325
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
326
326
  const insertEvent = db.prepare(`INSERT INTO events (event_id, session_id, ts, type, payload_json, tab_id, origin)
327
327
  VALUES (?, ?, ?, ?, ?, ?, ?)`);
328
328
  const insertNetwork = db.prepare(`INSERT INTO network (
@@ -348,7 +348,7 @@ export function importSessionFromJson(db, payload, options = {}) {
348
348
  const row = parsed.bodyChunks[i];
349
349
  chunkRefMap.set(row.chunkRef, `${sessionId}-import-chunk-${importedAt}-${i}`);
350
350
  }
351
- insertSession.run(sessionId, parsed.session.createdAt, parsed.session.endedAt, parsed.session.tabId, parsed.session.windowId, parsed.session.urlStart, parsed.session.urlLast, parsed.session.userAgent, parsed.session.viewportW, parsed.session.viewportH, parsed.session.dpr, parsed.session.safeMode, parsed.session.allowlistHash, parsed.session.pinned);
351
+ insertSession.run(sessionId, parsed.session.createdAt, parsed.session.lastSeenAt, parsed.session.endedAt, parsed.session.tabId, parsed.session.windowId, parsed.session.urlStart, parsed.session.urlLast, parsed.session.userAgent, parsed.session.viewportW, parsed.session.viewportH, parsed.session.dpr, parsed.session.safeMode, parsed.session.allowlistHash, parsed.session.pinned);
352
352
  for (let i = 0; i < parsed.events.length; i += 1) {
353
353
  const row = parsed.events[i];
354
354
  const eventId = `${sessionId}-import-event-${importedAt}-${i}`;
@@ -773,6 +773,7 @@ function normalizeImportPayload(payload) {
773
773
  requestedSessionId,
774
774
  session: {
775
775
  createdAt,
776
+ lastSeenAt: asTimestamp(sessionRoot.last_seen_at ?? sessionRoot.lastSeenAt, createdAt),
776
777
  endedAt,
777
778
  tabId: asNullableInteger(sessionRoot.tab_id ?? sessionRoot.tabId),
778
779
  windowId: asNullableInteger(sessionRoot.window_id ?? sessionRoot.windowId),