@xiaou66/vite-plugin-vue-mcp-next 1.3.5 → 1.3.7

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.
@@ -139,7 +139,7 @@ var DEFAULT_OPTIONS = {
139
139
  };
140
140
 
141
141
  // src/runtime/consoleHook.ts
142
- var import_nanoid = require("nanoid");
142
+ var import_nanoid2 = require("nanoid");
143
143
 
144
144
  // src/shared/serialization.ts
145
145
  var DEFAULT_PREVIEW_OPTIONS = {
@@ -303,7 +303,56 @@ function elementLabel(value) {
303
303
  return `[Element:${name}${id}${className}]`;
304
304
  }
305
305
 
306
+ // src/runtime/consoleArgRegistry.ts
307
+ var import_nanoid = require("nanoid");
308
+ var CONSOLE_ARG_ID_PREFIX = "console-arg-";
309
+ var MAX_CONSOLE_ARG_REFERENCES = 200;
310
+ var consoleArgReferences = /* @__PURE__ */ new Map();
311
+ function registerConsoleArg(value) {
312
+ const argId = `${CONSOLE_ARG_ID_PREFIX}${(0, import_nanoid.nanoid)()}`;
313
+ const kind = Array.isArray(value) ? "array" : "object";
314
+ const label = `[${kind === "array" ? "Array" : "Object"}:${argId}]`;
315
+ consoleArgReferences.set(argId, value);
316
+ trimConsoleArgReferences();
317
+ return { type: "object", kind, argId, label };
318
+ }
319
+ function inspectConsoleArg(request) {
320
+ if (!consoleArgReferences.has(request.argId)) {
321
+ return {
322
+ ok: false,
323
+ argId: request.argId,
324
+ error: "Console object reference not found or expired"
325
+ };
326
+ }
327
+ return {
328
+ ok: true,
329
+ argId: request.argId,
330
+ preview: createBoundedPreview(consoleArgReferences.get(request.argId), {
331
+ maxDepth: request.maxDepth,
332
+ maxKeys: request.maxKeys,
333
+ maxArrayItems: request.maxArrayItems,
334
+ maxStringLength: request.maxStringLength,
335
+ maxTotalNodes: request.maxTotalNodes
336
+ })
337
+ };
338
+ }
339
+ function trimConsoleArgReferences() {
340
+ while (consoleArgReferences.size > MAX_CONSOLE_ARG_REFERENCES) {
341
+ const [oldestArgId] = consoleArgReferences.keys();
342
+ if (!oldestArgId) {
343
+ return;
344
+ }
345
+ consoleArgReferences.delete(oldestArgId);
346
+ }
347
+ }
348
+
306
349
  // src/runtime/consoleHook.ts
350
+ var MAX_MESSAGE_CHAR_LENGTH = 5e3;
351
+ var MAX_CONSECUTIVE_DUPLICATES = 50;
352
+ var MAX_SKIPPED_COUNT = 500;
353
+ var DEDUPE_ARG_SAMPLE_COUNT = 3;
354
+ var DEDUPE_STRING_PREFIX_LENGTH = 80;
355
+ var MAX_ARGUMENT_PREVIEW_COUNT = 3;
307
356
  function installConsoleHook(options) {
308
357
  const originalConsole = {
309
358
  log: console.log,
@@ -312,14 +361,36 @@ function installConsoleHook(options) {
312
361
  error: console.error,
313
362
  debug: console.debug
314
363
  };
364
+ let duplicateState;
315
365
  const emit = (level, args) => {
366
+ const dedupe = createDedupeInfo(level, args);
367
+ if (duplicateState?.key === dedupe.key) {
368
+ duplicateState.count++;
369
+ if (duplicateState.count > MAX_CONSECUTIVE_DUPLICATES) {
370
+ duplicateState.skipped = Math.min(
371
+ duplicateState.skipped + 1,
372
+ MAX_SKIPPED_COUNT
373
+ );
374
+ return;
375
+ }
376
+ } else {
377
+ flushSuppressedSummary(options, duplicateState);
378
+ duplicateState = {
379
+ key: dedupe.key,
380
+ level,
381
+ label: dedupe.label,
382
+ count: 1,
383
+ skipped: 0
384
+ };
385
+ }
386
+ const payload = createConsolePayload(args);
316
387
  options.send({
317
- id: (0, import_nanoid.nanoid)(),
388
+ id: (0, import_nanoid2.nanoid)(),
318
389
  pageId: options.pageId,
319
390
  source: "hook",
320
391
  level,
321
- message: args.map((arg) => safeStringify(arg)).join(" "),
322
- args: args.map((arg) => createBoundedPreview(arg)),
392
+ message: payload.message,
393
+ args: payload.args,
323
394
  timestamp: Date.now()
324
395
  });
325
396
  };
@@ -331,7 +402,7 @@ function installConsoleHook(options) {
331
402
  });
332
403
  const onError = (event) => {
333
404
  options.send({
334
- id: (0, import_nanoid.nanoid)(),
405
+ id: (0, import_nanoid2.nanoid)(),
335
406
  pageId: options.pageId,
336
407
  source: "hook",
337
408
  level: "error",
@@ -342,18 +413,145 @@ function installConsoleHook(options) {
342
413
  };
343
414
  window.addEventListener("error", onError);
344
415
  return () => {
416
+ flushSuppressedSummary(options, duplicateState);
417
+ duplicateState = void 0;
345
418
  Object.assign(console, originalConsole);
346
419
  window.removeEventListener("error", onError);
347
420
  };
348
421
  }
422
+ function createDedupeInfo(level, args) {
423
+ const signatures = args.slice(0, DEDUPE_ARG_SAMPLE_COUNT).map((arg) => createValueSignature(arg));
424
+ const key = `${level}:${signatures.join("|")}`;
425
+ const label = createDedupeLabel(args, signatures);
426
+ return { key, label };
427
+ }
428
+ function createDedupeLabel(args, signatures) {
429
+ const [firstArg] = args;
430
+ if (typeof firstArg === "string") {
431
+ return sliceDedupeString(firstArg);
432
+ }
433
+ return signatures.join(" ") || "[empty]";
434
+ }
435
+ function createConsolePayload(args) {
436
+ const entries = args.map(createArgEntry);
437
+ const rawMessage = entries.map((entry) => entry.message).join(" ");
438
+ const oversizedInput = args.some(isOversizedString);
439
+ const oversizedMessage = rawMessage.length > MAX_MESSAGE_CHAR_LENGTH;
440
+ const message = oversizedMessage ? `${rawMessage.slice(0, MAX_MESSAGE_CHAR_LENGTH)}[Truncated]` : rawMessage;
441
+ const includeArgs = !oversizedInput && !oversizedMessage;
442
+ return {
443
+ message,
444
+ args: includeArgs ? entries.slice(0, MAX_ARGUMENT_PREVIEW_COUNT).map((entry) => entry.preview) : []
445
+ };
446
+ }
447
+ function createArgEntry(value) {
448
+ if (typeof value === "string") {
449
+ return {
450
+ message: truncateMessageString(value),
451
+ preview: value
452
+ };
453
+ }
454
+ if (value && typeof value === "object") {
455
+ const reference = registerConsoleArg(value);
456
+ return {
457
+ message: reference.label,
458
+ preview: reference
459
+ };
460
+ }
461
+ const preview = createPrimitivePreview(value);
462
+ return {
463
+ message: safeStringify(value),
464
+ preview
465
+ };
466
+ }
467
+ function createPrimitivePreview(value) {
468
+ if (value === null) {
469
+ return null;
470
+ }
471
+ if (typeof value === "number") {
472
+ return Number.isFinite(value) ? value : String(value);
473
+ }
474
+ if (typeof value === "bigint") {
475
+ return value.toString();
476
+ }
477
+ if (typeof value === "symbol") {
478
+ return value.description ? `[Symbol(${value.description})]` : "[Symbol]";
479
+ }
480
+ if (typeof value === "function") {
481
+ return value.name ? `[Function:${value.name}]` : "[Function]";
482
+ }
483
+ return value;
484
+ }
485
+ function flushSuppressedSummary(options, state) {
486
+ if (!state || state.skipped === 0) {
487
+ return;
488
+ }
489
+ const skipped = state.skipped >= MAX_SKIPPED_COUNT ? `${String(MAX_SKIPPED_COUNT)}+` : String(state.skipped);
490
+ options.send({
491
+ id: (0, import_nanoid2.nanoid)(),
492
+ pageId: options.pageId,
493
+ source: "hook",
494
+ level: state.level,
495
+ message: `Suppressed ${skipped} duplicate ${state.level} logs: ${state.label}`,
496
+ args: [],
497
+ timestamp: Date.now()
498
+ });
499
+ }
500
+ function createValueSignature(value) {
501
+ if (value && typeof value === "object") {
502
+ return createObjectTypeLabel(value);
503
+ }
504
+ return createPrimitiveSignature(value);
505
+ }
506
+ function createObjectTypeLabel(value) {
507
+ if (Array.isArray(value)) {
508
+ return "[Array]";
509
+ }
510
+ return "[Object]";
511
+ }
512
+ function createPrimitiveSignature(value) {
513
+ if (typeof value === "string") {
514
+ return `string:${sliceDedupeString(value)}`;
515
+ }
516
+ if (value === null) {
517
+ return "null";
518
+ }
519
+ switch (typeof value) {
520
+ case "number":
521
+ case "boolean":
522
+ case "bigint":
523
+ case "undefined":
524
+ return `${typeof value}:${String(value)}`;
525
+ case "symbol":
526
+ return value.description ? `symbol:${sliceDedupeString(value.description)}` : "symbol";
527
+ case "function":
528
+ return value.name ? `function:${sliceDedupeString(value.name)}` : "function";
529
+ case "object":
530
+ return `object:${Object.prototype.toString.call(value)}`;
531
+ default:
532
+ return "unknown";
533
+ }
534
+ }
535
+ function isOversizedString(value) {
536
+ return typeof value === "string" && value.length > MAX_MESSAGE_CHAR_LENGTH;
537
+ }
538
+ function truncateMessageString(value) {
539
+ if (value.length <= MAX_MESSAGE_CHAR_LENGTH) {
540
+ return value;
541
+ }
542
+ return `${value.slice(0, MAX_MESSAGE_CHAR_LENGTH)}[Truncated]`;
543
+ }
544
+ function sliceDedupeString(value) {
545
+ return value.slice(0, DEDUPE_STRING_PREFIX_LENGTH);
546
+ }
349
547
 
350
548
  // src/runtime/elementRegistry.ts
351
- var import_nanoid2 = require("nanoid");
549
+ var import_nanoid3 = require("nanoid");
352
550
  var RUNTIME_ELEMENT_ID_PREFIX = "runtime:vmcp_";
353
551
  var RUNTIME_ELEMENT_ID_SIZE = 8;
354
552
  var runtimeElementRegistry = createRuntimeElementRegistry();
355
553
  function createRuntimeElementId() {
356
- return `${RUNTIME_ELEMENT_ID_PREFIX}${(0, import_nanoid2.nanoid)(RUNTIME_ELEMENT_ID_SIZE)}`;
554
+ return `${RUNTIME_ELEMENT_ID_PREFIX}${(0, import_nanoid3.nanoid)(RUNTIME_ELEMENT_ID_SIZE)}`;
357
555
  }
358
556
  function createRuntimeElementRegistry() {
359
557
  const records = /* @__PURE__ */ new Map();
@@ -854,7 +1052,7 @@ function escapeSelector(value) {
854
1052
  }
855
1053
 
856
1054
  // src/runtime/networkHook.ts
857
- var import_nanoid3 = require("nanoid");
1055
+ var import_nanoid4 = require("nanoid");
858
1056
 
859
1057
  // src/shared/url.ts
860
1058
  function parseRequestQuery(url) {
@@ -885,7 +1083,7 @@ function safeUrlPathname(url) {
885
1083
  // src/runtime/networkHook.ts
886
1084
  function createHookNetworkRecord(input) {
887
1085
  return {
888
- id: (0, import_nanoid3.nanoid)(),
1086
+ id: (0, import_nanoid4.nanoid)(),
889
1087
  pageId: input.pageId,
890
1088
  source: "hook",
891
1089
  url: input.url,
@@ -1040,12 +1238,12 @@ function safeReadXhrResponseText(xhr) {
1040
1238
  }
1041
1239
 
1042
1240
  // src/runtime/pageIdentity.ts
1043
- var import_nanoid4 = require("nanoid");
1241
+ var import_nanoid5 = require("nanoid");
1044
1242
  var RUNTIME_CLIENT_ID_STORAGE_KEY = "vite-plugin-vue-mcp-next:runtime-client-id";
1045
1243
  var RUNTIME_CLIENT_ID_WINDOW_NAME_PREFIX = "vite-plugin-vue-mcp-next:runtime-client-id=";
1046
1244
  var RUNTIME_CLIENT_ID_WINDOW_NAME_SEPARATOR = "\n";
1047
1245
  function createRuntimeClientId() {
1048
- return `runtime-client-${(0, import_nanoid4.nanoid)()}`;
1246
+ return `runtime-client-${(0, import_nanoid5.nanoid)()}`;
1049
1247
  }
1050
1248
  function readRuntimeClientIdFromTabScope(tabScope) {
1051
1249
  if (!tabScope) {
@@ -1094,7 +1292,7 @@ function getRuntimeClientId(storage, tabScope) {
1094
1292
  }
1095
1293
  }
1096
1294
  function createRuntimePageId() {
1097
- return `runtime-${(0, import_nanoid4.nanoid)()}`;
1295
+ return `runtime-${(0, import_nanoid5.nanoid)()}`;
1098
1296
  }
1099
1297
  function getRuntimePageIdentity(input) {
1100
1298
  return {
@@ -1114,7 +1312,7 @@ function getRuntimePageIdentity(input) {
1114
1312
  }
1115
1313
 
1116
1314
  // src/runtime/performanceHook.ts
1117
- var import_nanoid5 = require("nanoid");
1315
+ var import_nanoid6 = require("nanoid");
1118
1316
 
1119
1317
  // src/performance/summary.ts
1120
1318
  function buildPerformanceSummary(input) {
@@ -1288,7 +1486,7 @@ function createPerformanceCollector(deps) {
1288
1486
  };
1289
1487
  }
1290
1488
  function createRecordingId() {
1291
- return `performance-${(0, import_nanoid5.nanoid)()}`;
1489
+ return `performance-${(0, import_nanoid6.nanoid)()}`;
1292
1490
  }
1293
1491
  function startSession(state, deps, options) {
1294
1492
  const recordingId = createRecordingId();
@@ -2152,7 +2350,14 @@ function createRuntimeDevtoolsRpc(getRpc) {
2152
2350
  await bridge.manageStorage(options)
2153
2351
  );
2154
2352
  },
2155
- onStorageUpdated: () => void 0
2353
+ onStorageUpdated: () => void 0,
2354
+ inspectConsoleArg(options) {
2355
+ if (!options.event) {
2356
+ return;
2357
+ }
2358
+ getRpc().onConsoleArgInspected(options.event, inspectConsoleArg(options));
2359
+ },
2360
+ onConsoleArgInspected: () => void 0
2156
2361
  };
2157
2362
  }
2158
2363