@keak/sdk 2.0.6 → 2.0.8

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 (51) hide show
  1. package/dist/index.cjs.js +74 -26
  2. package/dist/index.cjs.js.map +1 -1
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +74 -26
  5. package/dist/index.js.map +1 -1
  6. package/dist/toolbar/utils/fiberSource.d.ts.map +1 -1
  7. package/dist/toolbar.js +59 -25
  8. package/dist/toolbar.js.map +1 -1
  9. package/package.json +1 -1
  10. package/dist/KeakToolbarShadow.d.ts +0 -21
  11. package/dist/KeakToolbarShadow.d.ts.map +0 -1
  12. package/dist/components/ui/card.d.ts +0 -9
  13. package/dist/components/ui/card.d.ts.map +0 -1
  14. package/dist/components/ui/html-preview.d.ts +0 -9
  15. package/dist/components/ui/html-preview.d.ts.map +0 -1
  16. package/dist/components/ui/simple-tabs.d.ts +0 -26
  17. package/dist/components/ui/simple-tabs.d.ts.map +0 -1
  18. package/dist/components/ui/spinner.d.ts +0 -6
  19. package/dist/components/ui/spinner.d.ts.map +0 -1
  20. package/dist/components/ui/tabs.d.ts +0 -13
  21. package/dist/components/ui/tabs.d.ts.map +0 -1
  22. package/dist/components/ui/textarea.d.ts +0 -6
  23. package/dist/components/ui/textarea.d.ts.map +0 -1
  24. package/dist/services/telemetry/index.d.ts +0 -20
  25. package/dist/services/telemetry/index.d.ts.map +0 -1
  26. package/dist/services/telemetry/telemetryService.d.ts +0 -66
  27. package/dist/services/telemetry/telemetryService.d.ts.map +0 -1
  28. package/dist/services/telemetry/types.d.ts +0 -64
  29. package/dist/services/telemetry/types.d.ts.map +0 -1
  30. package/dist/toolbar/AIPromptPanel.d.ts +0 -9
  31. package/dist/toolbar/AIPromptPanel.d.ts.map +0 -1
  32. package/dist/toolbar/ExperimentPanel.d.ts +0 -9
  33. package/dist/toolbar/ExperimentPanel.d.ts.map +0 -1
  34. package/dist/toolbar/MetricsPanel.d.ts +0 -7
  35. package/dist/toolbar/MetricsPanel.d.ts.map +0 -1
  36. package/dist/toolbar/PageScanPanel.d.ts +0 -15
  37. package/dist/toolbar/PageScanPanel.d.ts.map +0 -1
  38. package/dist/toolbar/components/PrimaryButton.d.ts +0 -12
  39. package/dist/toolbar/components/PrimaryButton.d.ts.map +0 -1
  40. package/dist/toolbar/components/WarningButton.d.ts +0 -12
  41. package/dist/toolbar/components/WarningButton.d.ts.map +0 -1
  42. package/dist/toolbar/components/ui/Badge.d.ts +0 -10
  43. package/dist/toolbar/components/ui/Badge.d.ts.map +0 -1
  44. package/dist/toolbar/components/ui/Button.d.ts +0 -12
  45. package/dist/toolbar/components/ui/Button.d.ts.map +0 -1
  46. package/dist/toolbar/components/ui/Progress.d.ts +0 -5
  47. package/dist/toolbar/components/ui/Progress.d.ts.map +0 -1
  48. package/dist/toolbar/components/ui/Tabs.d.ts +0 -44
  49. package/dist/toolbar/components/ui/Tabs.d.ts.map +0 -1
  50. package/dist/toolbar/components/ui/dropdown-menu.d.ts +0 -28
  51. package/dist/toolbar/components/ui/dropdown-menu.d.ts.map +0 -1
package/dist/index.js CHANGED
@@ -193,6 +193,10 @@ if (typeof window !== 'undefined') {
193
193
  * React adds debug source information in development mode that includes the original
194
194
  * file path, line number, and column number where a component was defined.
195
195
  */
196
+ // Debug flag - set window.__KEAK_DEBUG__ = true to enable verbose logging
197
+ const DEBUG = typeof window !== 'undefined' && window.__KEAK_DEBUG__;
198
+ // Cache for Fiber source lookups to avoid repeated traversals
199
+ const fiberSourceCache = new WeakMap();
196
200
  /**
197
201
  * Extract React Fiber from a DOM element
198
202
  */
@@ -202,10 +206,14 @@ function getReactFiberFromElement(element) {
202
206
  key.startsWith('__reactInternalInstance') ||
203
207
  key.startsWith('__reactProps'));
204
208
  if (!fiberKey) {
205
- console.log('[Keak Fiber] No React Fiber key found on element. Keys:', Object.keys(element).filter(k => k.startsWith('__')));
209
+ if (DEBUG) {
210
+ console.log('[Keak Fiber] No React Fiber key found on element. Keys:', Object.keys(element).filter(k => k.startsWith('__')));
211
+ }
206
212
  return null;
207
213
  }
208
- console.log('[Keak Fiber] Found Fiber key:', fiberKey);
214
+ if (DEBUG) {
215
+ console.log('[Keak Fiber] Found Fiber key:', fiberKey);
216
+ }
209
217
  return element[fiberKey];
210
218
  }
211
219
  /**
@@ -277,7 +285,9 @@ function traverseChildren(fiber, visited, remainingDepth) {
277
285
  columnNumber: source.columnNumber || 1,
278
286
  componentName
279
287
  };
280
- console.log('[Keak Fiber] Found valid source in child traversal:', sourceInfo);
288
+ if (DEBUG) {
289
+ console.log('[Keak Fiber] Found valid source in child traversal:', sourceInfo);
290
+ }
281
291
  return sourceInfo; // Return first valid match
282
292
  }
283
293
  }
@@ -309,7 +319,9 @@ function extractSourceFromFiber(fiber) {
309
319
  if (!fiber) {
310
320
  return null;
311
321
  }
312
- console.log('[Keak Fiber] Starting Fiber traversal');
322
+ if (DEBUG) {
323
+ console.log('[Keak Fiber] Starting Fiber traversal');
324
+ }
313
325
  // Track visited fibers to avoid infinite loops
314
326
  const visited = new Set();
315
327
  let current = fiber;
@@ -324,14 +336,16 @@ function extractSourceFromFiber(fiber) {
324
336
  visited.add(current);
325
337
  // Check for debug source
326
338
  const source = current._debugSource || current.__source;
327
- if (depth === 0) {
339
+ if (DEBUG && depth === 0) {
328
340
  console.log('[Keak Fiber] Root fiber has source?', !!source);
329
341
  if (source) {
330
342
  console.log('[Keak Fiber] Root source:', source);
331
343
  }
332
344
  }
333
345
  if (source && source.fileName && source.lineNumber) {
334
- console.log('[Keak Fiber] Found source at depth', depth, ':', source.fileName, ':', source.lineNumber);
346
+ if (DEBUG) {
347
+ console.log('[Keak Fiber] Found source at depth', depth, ':', source.fileName, ':', source.lineNumber);
348
+ }
335
349
  const componentName = getComponentName(current);
336
350
  // Filter out React internals, node_modules, layout wrappers, and dynamic imports
337
351
  const isInternalFile = source.fileName.includes('node_modules') ||
@@ -353,15 +367,19 @@ function extractSourceFromFiber(fiber) {
353
367
  columnNumber: source.columnNumber || 1,
354
368
  componentName
355
369
  };
356
- console.log('[Keak Fiber] Valid source found:', sourceInfo);
370
+ if (DEBUG) {
371
+ console.log('[Keak Fiber] Valid source found:', sourceInfo);
372
+ }
357
373
  // Take the first valid source (lowest depth = most specific)
358
374
  if (!bestMatch) {
359
375
  bestMatch = sourceInfo;
360
- console.log('[Keak Fiber] Using source at depth', depth);
376
+ if (DEBUG) {
377
+ console.log('[Keak Fiber] Using source at depth', depth);
378
+ }
361
379
  return sourceInfo;
362
380
  }
363
381
  }
364
- else {
382
+ else if (DEBUG) {
365
383
  console.log('[Keak Fiber] Skipping source (wrapper/layout):', {
366
384
  file: source.fileName.split('/').pop(),
367
385
  component: componentName,
@@ -387,17 +405,21 @@ function extractSourceFromFiber(fiber) {
387
405
  }
388
406
  // After upward traversal, try downward/sibling traversal if no match found
389
407
  if (!bestMatch && fiber.child) {
390
- console.log('[Keak Fiber] No match found in upward traversal, trying children/siblings');
408
+ if (DEBUG) {
409
+ console.log('[Keak Fiber] No match found in upward traversal, trying children/siblings');
410
+ }
391
411
  const childMatch = traverseChildren(fiber, visited, maxDepth - depth);
392
412
  if (childMatch) {
393
413
  bestMatch = childMatch;
394
414
  }
395
415
  }
396
- if (bestMatch) {
397
- console.log('[Keak Fiber] Returning best match:', bestMatch);
398
- }
399
- else {
400
- console.log('[Keak Fiber] No component source found after traversing', depth, 'levels');
416
+ if (DEBUG) {
417
+ if (bestMatch) {
418
+ console.log('[Keak Fiber] Returning best match:', bestMatch);
419
+ }
420
+ else {
421
+ console.log('[Keak Fiber] No component source found after traversing', depth, 'levels');
422
+ }
401
423
  }
402
424
  return bestMatch;
403
425
  }
@@ -405,27 +427,39 @@ function extractSourceFromFiber(fiber) {
405
427
  * Main function to get source information from a DOM element
406
428
  */
407
429
  function getReactFiberSource(element) {
430
+ // Check cache first to avoid repeated Fiber traversals
431
+ if (fiberSourceCache.has(element)) {
432
+ return fiberSourceCache.get(element) || null;
433
+ }
408
434
  try {
409
435
  const fiber = getReactFiberFromElement(element);
410
436
  if (!fiber) {
411
- console.log('[Keak Fiber] No React Fiber found on element');
437
+ if (DEBUG) {
438
+ console.log('[Keak Fiber] No React Fiber found on element');
439
+ }
440
+ fiberSourceCache.set(element, null);
412
441
  return null;
413
442
  }
414
443
  const sourceInfo = extractSourceFromFiber(fiber);
415
- if (sourceInfo) {
416
- console.log('[Keak Fiber] Found source:', {
417
- file: sourceInfo.fileName,
418
- line: sourceInfo.lineNumber,
419
- component: sourceInfo.componentName
420
- });
421
- }
422
- else {
423
- console.log('[Keak Fiber] No source information found in Fiber tree');
444
+ if (DEBUG) {
445
+ if (sourceInfo) {
446
+ console.log('[Keak Fiber] Found source:', {
447
+ file: sourceInfo.fileName,
448
+ line: sourceInfo.lineNumber,
449
+ component: sourceInfo.componentName
450
+ });
451
+ }
452
+ else {
453
+ console.log('[Keak Fiber] No source information found in Fiber tree');
454
+ }
424
455
  }
456
+ // Cache the result
457
+ fiberSourceCache.set(element, sourceInfo);
425
458
  return sourceInfo;
426
459
  }
427
460
  catch (error) {
428
461
  console.error('[Keak Fiber] Error extracting source:', error);
462
+ fiberSourceCache.set(element, null);
429
463
  return null;
430
464
  }
431
465
  }
@@ -2845,7 +2879,14 @@ function useKeak(config = {}) {
2845
2879
  });
2846
2880
  // Cleanup on unmount
2847
2881
  return () => {
2848
- // Keep instance alive for session, don't destroy
2882
+ // Remove toolbar from DOM on unmount
2883
+ const toolbarRoot = document.getElementById('keak-toolbar-root');
2884
+ if (toolbarRoot) {
2885
+ toolbarRoot.remove();
2886
+ console.log('[Keak] Cleaned up toolbar on unmount');
2887
+ }
2888
+ // Reset flag to allow re-initialization
2889
+ toolbarInitialized = false;
2849
2890
  };
2850
2891
  }, []); // Empty deps - only run once
2851
2892
  return keakInstance;
@@ -3149,6 +3190,13 @@ function initializeToolbar(config) {
3149
3190
  import('react'),
3150
3191
  import('react-dom/client')
3151
3192
  ]).then(([React, ReactDOMClient]) => {
3193
+ // DOM-based duplicate prevention: Check if toolbar already exists
3194
+ const existingToolbar = document.getElementById('keak-toolbar-root');
3195
+ if (existingToolbar) {
3196
+ console.log('[Keak] Toolbar already exists in DOM, skipping initialization');
3197
+ toolbarInitialized = true;
3198
+ return;
3199
+ }
3152
3200
  const toolbarRoot = document.createElement('div');
3153
3201
  toolbarRoot.id = 'keak-toolbar-root';
3154
3202
  document.body.appendChild(toolbarRoot);