react-native-debug-toolkit 3.1.3 → 3.1.4

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 (86) hide show
  1. package/README.md +4 -2
  2. package/README.zh-CN.md +4 -2
  3. package/lib/commonjs/core/DebugToolkit.js +118 -97
  4. package/lib/commonjs/core/DebugToolkit.js.map +1 -1
  5. package/lib/commonjs/core/initialize.js +4 -4
  6. package/lib/commonjs/core/initialize.js.map +1 -1
  7. package/lib/commonjs/features/environment/index.js +22 -24
  8. package/lib/commonjs/features/environment/index.js.map +1 -1
  9. package/lib/commonjs/features/network/index.js +25 -47
  10. package/lib/commonjs/features/network/index.js.map +1 -1
  11. package/lib/commonjs/features/network/networkInterceptor.js +3 -3
  12. package/lib/commonjs/features/network/networkInterceptor.js.map +1 -1
  13. package/lib/commonjs/index.js +0 -30
  14. package/lib/commonjs/index.js.map +1 -1
  15. package/lib/commonjs/utils/DaemonClient.js +13 -51
  16. package/lib/commonjs/utils/DaemonClient.js.map +1 -1
  17. package/lib/commonjs/utils/createChannelFeature.js +8 -1
  18. package/lib/commonjs/utils/createChannelFeature.js.map +1 -1
  19. package/lib/commonjs/utils/deviceReport.js +2 -1
  20. package/lib/commonjs/utils/deviceReport.js.map +1 -1
  21. package/lib/commonjs/utils/urlRewriter.js +15 -0
  22. package/lib/commonjs/utils/urlRewriter.js.map +1 -0
  23. package/lib/module/core/DebugToolkit.js +117 -96
  24. package/lib/module/core/DebugToolkit.js.map +1 -1
  25. package/lib/module/core/initialize.js +6 -7
  26. package/lib/module/core/initialize.js.map +1 -1
  27. package/lib/module/features/environment/index.js +22 -24
  28. package/lib/module/features/environment/index.js.map +1 -1
  29. package/lib/module/features/network/index.js +25 -46
  30. package/lib/module/features/network/index.js.map +1 -1
  31. package/lib/module/features/network/networkInterceptor.js +3 -3
  32. package/lib/module/features/network/networkInterceptor.js.map +1 -1
  33. package/lib/module/index.js +1 -1
  34. package/lib/module/index.js.map +1 -1
  35. package/lib/module/utils/DaemonClient.js +14 -42
  36. package/lib/module/utils/DaemonClient.js.map +1 -1
  37. package/lib/module/utils/createChannelFeature.js +8 -1
  38. package/lib/module/utils/createChannelFeature.js.map +1 -1
  39. package/lib/module/utils/deviceReport.js +3 -2
  40. package/lib/module/utils/deviceReport.js.map +1 -1
  41. package/lib/module/utils/urlRewriter.js +10 -0
  42. package/lib/module/utils/urlRewriter.js.map +1 -0
  43. package/lib/typescript/src/core/DebugToolkit.d.ts +23 -10
  44. package/lib/typescript/src/core/DebugToolkit.d.ts.map +1 -1
  45. package/lib/typescript/src/core/initialize.d.ts.map +1 -1
  46. package/lib/typescript/src/features/environment/index.d.ts.map +1 -1
  47. package/lib/typescript/src/features/network/index.d.ts +3 -3
  48. package/lib/typescript/src/features/network/index.d.ts.map +1 -1
  49. package/lib/typescript/src/index.d.ts +2 -2
  50. package/lib/typescript/src/index.d.ts.map +1 -1
  51. package/lib/typescript/src/types/feature.d.ts +5 -0
  52. package/lib/typescript/src/types/feature.d.ts.map +1 -1
  53. package/lib/typescript/src/types/index.d.ts +1 -1
  54. package/lib/typescript/src/types/index.d.ts.map +1 -1
  55. package/lib/typescript/src/utils/DaemonClient.d.ts +4 -11
  56. package/lib/typescript/src/utils/DaemonClient.d.ts.map +1 -1
  57. package/lib/typescript/src/utils/createChannelFeature.d.ts +4 -0
  58. package/lib/typescript/src/utils/createChannelFeature.d.ts.map +1 -1
  59. package/lib/typescript/src/utils/deviceReport.d.ts +4 -1
  60. package/lib/typescript/src/utils/deviceReport.d.ts.map +1 -1
  61. package/lib/typescript/src/utils/urlRewriter.d.ts +5 -0
  62. package/lib/typescript/src/utils/urlRewriter.d.ts.map +1 -0
  63. package/node/daemon/src/console/console.html +94 -15
  64. package/node/daemon/src/server.js +32 -2
  65. package/node/mcp/src/logs.js +15 -4
  66. package/node/mcp/src/tools.js +4 -2
  67. package/package.json +1 -1
  68. package/src/core/DebugToolkit.tsx +119 -105
  69. package/src/core/initialize.ts +7 -8
  70. package/src/features/environment/index.ts +25 -27
  71. package/src/features/network/index.ts +30 -52
  72. package/src/features/network/networkInterceptor.ts +3 -3
  73. package/src/index.ts +3 -8
  74. package/src/types/feature.ts +6 -0
  75. package/src/types/index.ts +1 -0
  76. package/src/utils/DaemonClient.ts +14 -56
  77. package/src/utils/createChannelFeature.ts +12 -1
  78. package/src/utils/deviceReport.ts +5 -3
  79. package/src/utils/urlRewriter.ts +11 -0
  80. package/lib/commonjs/utils/urlRewriterRegistry.js +0 -14
  81. package/lib/commonjs/utils/urlRewriterRegistry.js.map +0 -1
  82. package/lib/module/utils/urlRewriterRegistry.js +0 -10
  83. package/lib/module/utils/urlRewriterRegistry.js.map +0 -1
  84. package/lib/typescript/src/utils/urlRewriterRegistry.d.ts +0 -7
  85. package/lib/typescript/src/utils/urlRewriterRegistry.d.ts.map +0 -1
  86. package/src/utils/urlRewriterRegistry.ts +0 -10
@@ -1,3 +1,4 @@
1
+ import type { FeatureDataProvider } from '../types';
1
2
  import { type DebugDeviceReport, type DebugDeviceReportOptions } from './deviceReport';
2
3
  export type DaemonConnectionMode = 'simulator' | 'device';
3
4
  export interface DaemonSettings {
@@ -83,6 +84,7 @@ export declare function normalizeDaemonSettings(settings: DaemonSettings): {
83
84
  export interface DaemonClientOptions {
84
85
  fetch?: FetchLike;
85
86
  AbortController?: AbortControllerCtor;
87
+ featureProvider: FeatureDataProvider;
86
88
  onEndpointDetected?: (url: string) => void;
87
89
  }
88
90
  export declare class DaemonClient {
@@ -91,9 +93,10 @@ export declare class DaemonClient {
91
93
  private _stream;
92
94
  private _fetch;
93
95
  private _AbortController;
96
+ private _featureProvider;
94
97
  private _onEndpointDetected;
95
98
  private _restorePromise;
96
- constructor(options?: DaemonClientOptions);
99
+ constructor(options: DaemonClientOptions);
97
100
  getSettings(): DaemonSettings;
98
101
  configure(settings: DaemonSettings): void;
99
102
  checkConnection(options?: DaemonConnectionOptions): Promise<DaemonConnectionResult>;
@@ -126,16 +129,6 @@ export declare class DaemonClient {
126
129
  private enqueueSendDelta;
127
130
  }
128
131
  export declare const daemonClient: DaemonClient;
129
- export declare function loadDaemonSettings(): Promise<DaemonSettings>;
130
- export declare function saveDaemonSettings(settings: DaemonSettings): Promise<void>;
131
- export declare function loadDaemonStreamingEnabled(): Promise<boolean | null>;
132
- export declare function saveDaemonStreamingEnabled(enabled: boolean): Promise<void>;
133
- export declare function startStreaming(options?: StreamToDaemonOptions): void;
134
- export declare function stopStreaming(): void;
135
- export declare function isStreaming(): boolean;
136
- export declare function checkDaemonConnection(options?: DaemonConnectionOptions): Promise<DaemonConnectionResult>;
137
- export declare function reportDebugDeviceToDaemon(options?: ReportToDaemonOptions): Promise<ReportResult>;
138
- export declare function restoreDaemonStreaming(): Promise<void>;
139
132
  export declare function _resetDaemonClientForTesting(): void;
140
133
  export {};
141
134
  //# sourceMappingURL=DaemonClient.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DaemonClient.d.ts","sourceRoot":"","sources":["../../../../src/utils/DaemonClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DaemonClient.d.ts","sourceRoot":"","sources":["../../../../src/utils/DaemonClient.ts"],"names":[],"mappings":"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"}
@@ -23,5 +23,9 @@ export declare function createChannelFeature<TPayload, TEntry extends {
23
23
  renderContent?: ComponentType<DebugFeatureRenderProps<TEntry[]>>;
24
24
  maxLogs?: number;
25
25
  persist?: ChannelFeaturePersistConfig<TEntry>;
26
+ /** Return null to skip, or the (possibly modified) payload to proceed. */
27
+ beforePush?: (payload: TPayload) => TPayload | null;
28
+ /** Called after channel subscription in setup. Return a cleanup function. */
29
+ onSetup?: () => (() => void) | void;
26
30
  }): DebugFeature<TEntry[]>;
27
31
  //# sourceMappingURL=createChannelFeature.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createChannelFeature.d.ts","sourceRoot":"","sources":["../../../../src/utils/createChannelFeature.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAwB,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAC5F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAMzD,MAAM,WAAW,2BAA2B,CAAC,MAAM;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;CACxC;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,SAAS;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,EAC3E,UAAU,EAAE,MAAM,YAAY,CAAC,QAAQ,CAAC,EACxC,OAAO,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,KAAK,MAAM,EAClD,OAAO,EAAE;IACP,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,aAAa,CAAC,uBAAuB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,2BAA2B,CAAC,MAAM,CAAC,CAAC;CAC/C,GACA,YAAY,CAAC,MAAM,EAAE,CAAC,CA8CxB"}
1
+ {"version":3,"file":"createChannelFeature.d.ts","sourceRoot":"","sources":["../../../../src/utils/createChannelFeature.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAwB,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAC5F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAMzD,MAAM,WAAW,2BAA2B,CAAC,MAAM;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;CACxC;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,SAAS;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,EAC3E,UAAU,EAAE,MAAM,YAAY,CAAC,QAAQ,CAAC,EACxC,OAAO,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,KAAK,MAAM,EAClD,OAAO,EAAE;IACP,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,aAAa,CAAC,uBAAuB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,2BAA2B,CAAC,MAAM,CAAC,CAAC;IAC9C,0EAA0E;IAC1E,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,QAAQ,GAAG,IAAI,CAAC;IACpD,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC;CACrC,GACA,YAAY,CAAC,MAAM,EAAE,CAAC,CAqDxB"}
@@ -1,3 +1,4 @@
1
+ import type { FeatureDataProvider } from '../types';
1
2
  export interface DebugDeviceReportOptions {
2
3
  maxPerType?: number;
3
4
  maxBodyBytes?: number;
@@ -14,5 +15,7 @@ export interface DebugDeviceReport {
14
15
  device: DeviceInfo;
15
16
  logs: Record<string, unknown[] | undefined>;
16
17
  }
17
- export declare function createDebugDeviceReport(options?: DebugDeviceReportOptions): DebugDeviceReport;
18
+ export declare function createDebugDeviceReport(options?: DebugDeviceReportOptions & {
19
+ featureProvider?: FeatureDataProvider;
20
+ }): DebugDeviceReport;
18
21
  //# sourceMappingURL=deviceReport.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"deviceReport.d.ts","sourceRoot":"","sources":["../../../../src/utils/deviceReport.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,wBAAwB;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,CAAC,CAAC;IACX,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC,CAAC;CAC7C;AAuID,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,wBAA6B,GACrC,iBAAiB,CAuCnB"}
1
+ {"version":3,"file":"deviceReport.d.ts","sourceRoot":"","sources":["../../../../src/utils/deviceReport.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAOpD,MAAM,WAAW,wBAAwB;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,CAAC,CAAC;IACX,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC,CAAC;CAC7C;AAuID,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,wBAAwB,GAAG;IAAE,eAAe,CAAC,EAAE,mBAAmB,CAAA;CAAO,GACjF,iBAAiB,CAwCnB"}
@@ -0,0 +1,5 @@
1
+ type UrlRewriter = (url: string) => string;
2
+ export declare function getUrlRewriter(): UrlRewriter | null;
3
+ export declare function setUrlRewriter(rewriter: UrlRewriter | null): void;
4
+ export {};
5
+ //# sourceMappingURL=urlRewriter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urlRewriter.d.ts","sourceRoot":"","sources":["../../../../src/utils/urlRewriter.ts"],"names":[],"mappings":"AAAA,KAAK,WAAW,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;AAI3C,wBAAgB,cAAc,IAAI,WAAW,GAAG,IAAI,CAEnD;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,CAEjE"}
@@ -421,6 +421,33 @@ header h1 span{color:var(--text3);font-weight:400}
421
421
  padding:12px 14px;border-bottom:1px solid rgba(30,45,74,.5);
422
422
  display:flex;align-items:center;gap:10px;
423
423
  }
424
+ .network-meta-line{
425
+ padding:6px 14px;border-bottom:1px solid rgba(30,45,74,.5);
426
+ font-family:var(--font-mono);font-size:10px;color:var(--text3);
427
+ display:flex;gap:10px;flex-wrap:wrap;
428
+ }
429
+ .network-meta-line span{white-space:nowrap}
430
+
431
+ /* Collapsible sections */
432
+ .collapse-section{border:1px solid var(--border);border-radius:var(--radius);background:rgba(8,12,22,.35);overflow:hidden;margin-bottom:0}
433
+ .collapse-header{
434
+ display:flex;align-items:center;justify-content:space-between;
435
+ padding:7px 12px;border-bottom:1px solid var(--border);
436
+ background:rgba(0,229,255,.03);cursor:pointer;user-select:none;
437
+ }
438
+ .collapse-header:hover{background:rgba(0,229,255,.06)}
439
+ .collapse-header-left{display:flex;align-items:center;gap:6px}
440
+ .collapse-arrow{
441
+ font-size:9px;color:var(--text3);transition:transform .2s;display:inline-block;
442
+ }
443
+ .collapse-arrow.open{transform:rotate(90deg)}
444
+ .collapse-title{
445
+ font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;
446
+ color:var(--cyan);font-family:var(--font-mono);
447
+ }
448
+ .collapse-body{display:none;padding:0}
449
+ .collapse-body.open{display:block}
450
+ .section-body-inner{padding:4px 0}
424
451
  .method-badge{
425
452
  font-family:var(--font-mono);font-size:11px;font-weight:700;
426
453
  padding:3px 10px;border-radius:3px;letter-spacing:.04em;
@@ -819,6 +846,34 @@ mark{
819
846
  return renderSection(title, renderValue(object), object);
820
847
  }
821
848
 
849
+ function renderCollapsibleSection(title, content, dataForCopy, collapsed) {
850
+ var id = 'ns-' + Math.random().toString(36).slice(2,8);
851
+ var isOpen = !collapsed;
852
+ var copyAttr = dataForCopy !== undefined
853
+ ? ' data-copy="' + escapeHtml(typeof dataForCopy === 'string' ? dataForCopy : JSON.stringify(dataForCopy)) + '"'
854
+ : '';
855
+ var html = '<div class="collapse-section">';
856
+ html += '<div class="collapse-header" onclick="toggleNetworkSection(\'' + id + '\')">';
857
+ html += '<div class="collapse-header-left">';
858
+ html += '<span class="collapse-arrow' + (isOpen ? ' open' : '') + '" id="arrow-' + id + '">&#9654;</span>';
859
+ html += '<span class="collapse-title">' + escapeHtml(title) + '</span>';
860
+ html += '</div>';
861
+ html += '<button class="detail-section-copy" onclick="event.stopPropagation();copySectionData(this)" title="Copy section"' + copyAttr + '>&#9112;</button>';
862
+ html += '</div>';
863
+ html += '<div class="collapse-body' + (isOpen ? ' open' : '') + '" id="' + id + '">';
864
+ html += '<div class="section-body-inner">' + content + '</div>';
865
+ html += '</div></div>';
866
+ return html;
867
+ }
868
+
869
+ window.toggleNetworkSection = function(id) {
870
+ var body = document.getElementById(id);
871
+ var arrow = document.getElementById('arrow-' + id);
872
+ if (!body) return;
873
+ body.classList.toggle('open');
874
+ if (arrow) arrow.classList.toggle('open');
875
+ };
876
+
822
877
  function renderConsoleDetails(entry) {
823
878
  var messages = Array.isArray(entry.data) ? entry.data : [entry.data];
824
879
  return renderSection('Console', renderRows([
@@ -835,30 +890,53 @@ mark{
835
890
  var method = (request.method || 'GET').toUpperCase();
836
891
  var methodClass = 'method-' + method.toLowerCase();
837
892
 
838
- var hero = '<div class="network-hero"><span class="method-badge ' + methodClass + '">' + escapeHtml(method) + '</span>' +
893
+ // Hero - always visible
894
+ var html = '<div class="network-hero"><span class="method-badge ' + methodClass + '">' + escapeHtml(method) + '</span>' +
839
895
  '<span class="network-url">' + escapeHtml(request.url || '-') + '</span></div>';
840
896
 
841
- var reqRows = [
842
- ['Time', entry.timestamp ? formatTime(new Date(entry.timestamp).toISOString()) : ''],
843
- ['Duration', entry.duration !== undefined ? entry.duration + 'ms' : ''],
844
- ];
845
- if (request.headers) reqRows.push(['Headers', request.headers]);
846
- if (request.body) reqRows.push(['Body', request.body]);
897
+ // Compact meta line - always visible
898
+ var metaParts = [];
899
+ if (response && response.status !== undefined) {
900
+ metaParts.push(response.status + (response.statusText ? ' ' + response.statusText : ''));
901
+ }
902
+ if (entry.duration !== undefined) metaParts.push(entry.duration + 'ms');
903
+ if (entry.timestamp) metaParts.push(formatTimeShort(new Date(entry.timestamp).toISOString()));
904
+ if (metaParts.length) {
905
+ html += '<div class="network-meta-line">' + metaParts.map(function(p) { return '<span>' + escapeHtml(p) + '</span>'; }).join('') + '</div>';
906
+ }
847
907
 
848
- var html = renderSection('Request', hero + renderRows(reqRows), request);
908
+ // Request Body - EXPANDED by default, always visible
909
+ var reqBodyContent = request.body
910
+ ? renderValue(request.body)
911
+ : '<span class="value-pill" style="color:var(--text3)">No request body</span>';
912
+ html += renderCollapsibleSection('Request Body', reqBodyContent, request.body || null, false);
849
913
 
914
+ // Response Data - EXPANDED by default, always visible
850
915
  if (response) {
851
- var resRows = [
852
- ['Status', response.status !== undefined ? response.status + (response.statusText ? ' ' + response.statusText : '') : ''],
853
- ['Success', response.success !== undefined ? String(response.success) : ''],
854
- ];
855
- if (response.headers) resRows.push(['Headers', response.headers]);
856
- if (response.data) resRows.push(['Data', response.data]);
857
- html += renderSection('Response', renderRows(resRows), response);
916
+ var resDataContent = response.data != null
917
+ ? renderValue(response.data)
918
+ : '<span class="value-pill" style="color:var(--text3)">No response body</span>';
919
+ html += renderCollapsibleSection('Response Data', resDataContent, response.data || null, false);
858
920
  }
921
+
922
+ // Error - always visible if present
859
923
  if (entry.error) {
860
924
  html += renderSection('Error', renderValue(entry.error), entry.error);
861
925
  }
926
+
927
+ // Everything below is COLLAPSED by default
928
+ var reqHeadersContent = request.headers
929
+ ? renderValue(request.headers)
930
+ : '<span class="value-pill" style="color:var(--text3)">No headers</span>';
931
+ html += renderCollapsibleSection('Request Headers', reqHeadersContent, request.headers || null, true);
932
+
933
+ if (response) {
934
+ var resHeadersContent = response.headers
935
+ ? renderValue(response.headers)
936
+ : '<span class="value-pill" style="color:var(--text3)">No headers</span>';
937
+ html += renderCollapsibleSection('Response Headers', resHeadersContent, response.headers || null, true);
938
+ }
939
+
862
940
  return html;
863
941
  }
864
942
 
@@ -1058,6 +1136,7 @@ mark{
1058
1136
  html += renderCurlPanel('Curl this device', [
1059
1137
  curlCommand('/devices/' + encodeURIComponent(deviceId)),
1060
1138
  curlCommand('/devices/' + encodeURIComponent(deviceId) + '/logs?limit=200'),
1139
+ curlCommand('/devices/' + encodeURIComponent(deviceId) + '/logs?limit=200&includeBodies=true'),
1061
1140
  curlCommand('/devices/' + encodeURIComponent(deviceId) + '/logs?type=network&failedOnly=true&limit=50'),
1062
1141
  curlCommand('/devices/' + encodeURIComponent(deviceId) + '/logs?type=console&limit=200'),
1063
1142
  ]);
@@ -140,6 +140,25 @@ function toDevicePayload(deviceLog) {
140
140
  };
141
141
  }
142
142
 
143
+ function stripBodies(value, parentKey) {
144
+ if (Array.isArray(value)) {
145
+ return value.map((item) => stripBodies(item, parentKey));
146
+ }
147
+
148
+ if (!value || typeof value !== 'object') {
149
+ return value;
150
+ }
151
+
152
+ return Object.entries(value).reduce((acc, [key, child]) => {
153
+ const normalizedKey = key.toLowerCase();
154
+ if (normalizedKey === 'body' || (parentKey === 'response' && normalizedKey === 'data')) {
155
+ return acc;
156
+ }
157
+ acc[key] = stripBodies(child, normalizedKey);
158
+ return acc;
159
+ }, {});
160
+ }
161
+
143
162
  function selectLogs(deviceLog, searchParams) {
144
163
  if (!deviceLog) {
145
164
  return [];
@@ -150,6 +169,8 @@ function selectLogs(deviceLog, searchParams) {
150
169
  const limit = Number.isFinite(limitParam) && limitParam > 0
151
170
  ? Math.min(Math.floor(limitParam), 500)
152
171
  : 50;
172
+ const entryId = searchParams.get('entryId');
173
+ const includeBodies = entryId ? true : searchParams.get('includeBodies') === 'true';
153
174
  const failedOnly = searchParams.get('failedOnly') === 'true';
154
175
  const logs = deviceLog.report.logs || {};
155
176
 
@@ -160,7 +181,12 @@ function selectLogs(deviceLog, searchParams) {
160
181
  entries = Object.values(logs).flatMap((value) => Array.isArray(value) ? value : []);
161
182
  }
162
183
 
163
- if (failedOnly) {
184
+ if (entryId) {
185
+ entries = entries.filter((entry) => (
186
+ entry && typeof entry === 'object' &&
187
+ (entry.id === entryId || entry.id === Number(entryId))
188
+ ));
189
+ } else if (failedOnly) {
164
190
  entries = entries.filter((entry) => (
165
191
  entry &&
166
192
  typeof entry === 'object' &&
@@ -173,7 +199,11 @@ function selectLogs(deviceLog, searchParams) {
173
199
  ));
174
200
  }
175
201
 
176
- return entries.slice(-limit);
202
+ if (!entryId) {
203
+ entries = entries.slice(-limit);
204
+ }
205
+
206
+ return includeBodies ? entries : entries.map(stripBodies);
177
207
  }
178
208
 
179
209
  function broadcastSSE(clients, eventType, deviceLog, delta) {
@@ -40,7 +40,8 @@ function selectLogs(report, options = {}) {
40
40
  const limit = Number.isFinite(options.limit) && options.limit > 0
41
41
  ? Math.min(Math.floor(options.limit), 200)
42
42
  : 50;
43
- const includeBodies = options.includeBodies !== false;
43
+ const entryId = options.entryId;
44
+ const includeBodies = entryId ? true : options.includeBodies === true;
44
45
  const failedOnly = options.failedOnly === true;
45
46
 
46
47
  let entries;
@@ -54,11 +55,18 @@ function selectLogs(report, options = {}) {
54
55
  ));
55
56
  }
56
57
 
57
- if (failedOnly) {
58
+ if (entryId) {
59
+ entries = entries.filter((item) => {
60
+ const e = item.entry || item;
61
+ return e.id === entryId || e.id === Number(entryId);
62
+ });
63
+ } else if (failedOnly) {
58
64
  entries = entries.filter((item) => isFailedLog(item.entry || item));
59
65
  }
60
66
 
61
- entries = entries.slice(-limit);
67
+ if (!entryId) {
68
+ entries = entries.slice(-limit);
69
+ }
62
70
 
63
71
  if (logType) {
64
72
  return includeBodies ? entries : entries.map(stripBodies);
@@ -72,6 +80,8 @@ function selectLogs(report, options = {}) {
72
80
 
73
81
  function createToolPayload(device, options = {}) {
74
82
  const report = device.report || { version: 2, logs: {} };
83
+ const entryId = options.entryId;
84
+ const includeBodies = entryId ? true : options.includeBodies === true;
75
85
  const logs = selectLogs(report, options);
76
86
 
77
87
  return {
@@ -81,7 +91,8 @@ function createToolPayload(device, options = {}) {
81
91
  lastSeenAt: device.lastSeenAt,
82
92
  logType: options.logType || 'all',
83
93
  failedOnly: options.failedOnly === true,
84
- includeBodies: options.includeBodies !== false,
94
+ includeBodies,
95
+ entryId: entryId || undefined,
85
96
  count: logs.length,
86
97
  logs,
87
98
  };
@@ -5,7 +5,7 @@ const { KNOWN_LOG_TYPES, createToolPayload } = require('./logs');
5
5
 
6
6
  const getAppLogsTool = {
7
7
  name: 'get_app_logs',
8
- description: 'Read React Native Debug Toolkit logs from the local daemon. Tip: if you have shell access, curl http://127.0.0.1:3799/devices/latest is more efficient.',
8
+ description: 'Read React Native Debug Toolkit logs from the local daemon. Bodies are excluded by default to reduce token usage; set includeBodies=true or pass an entryId to fetch details. Tip: if you have shell access, curl http://127.0.0.1:3799/devices/latest/logs?includeBodies=true is more efficient.',
9
9
  inputSchema: {
10
10
  type: 'object',
11
11
  properties: {
@@ -16,7 +16,8 @@ const getAppLogsTool = {
16
16
  },
17
17
  limit: { type: 'number', default: 50 },
18
18
  failedOnly: { type: 'boolean', default: false },
19
- includeBodies: { type: 'boolean', default: true },
19
+ includeBodies: { type: 'boolean', default: false },
20
+ entryId: { type: 'string', description: 'Fetch a single entry by ID; forces includeBodies=true' },
20
21
  },
21
22
  },
22
23
  };
@@ -66,6 +67,7 @@ async function callTool(name, args = {}, context = {}) {
66
67
  limit: args.limit,
67
68
  failedOnly: args.failedOnly,
68
69
  includeBodies: args.includeBodies,
70
+ entryId: args.entryId,
69
71
  });
70
72
  } catch (error) {
71
73
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-debug-toolkit",
3
- "version": "3.1.3",
3
+ "version": "3.1.4",
4
4
  "description": "A local-first React Native debugging bridge with in-app logs, desktop daemon, Web Console, HTTP API, and MCP support",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",