@buoy-gg/js-top 7.0.3

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 (168) hide show
  1. package/LICENSE +58 -0
  2. package/README.md +56 -0
  3. package/lib/commonjs/index.js +97 -0
  4. package/lib/commonjs/index.js.map +1 -0
  5. package/lib/commonjs/js-top/components/BusySparkline.js +56 -0
  6. package/lib/commonjs/js-top/components/BusySparkline.js.map +1 -0
  7. package/lib/commonjs/js-top/components/JsTopHudOverlay.js +79 -0
  8. package/lib/commonjs/js-top/components/JsTopHudOverlay.js.map +1 -0
  9. package/lib/commonjs/js-top/components/JsTopModal.js +347 -0
  10. package/lib/commonjs/js-top/components/JsTopModal.js.map +1 -0
  11. package/lib/commonjs/js-top/components/TaskDetailView.js +329 -0
  12. package/lib/commonjs/js-top/components/TaskDetailView.js.map +1 -0
  13. package/lib/commonjs/js-top/components/TaskTable.js +360 -0
  14. package/lib/commonjs/js-top/components/TaskTable.js.map +1 -0
  15. package/lib/commonjs/js-top/engine/JsTopController.js +350 -0
  16. package/lib/commonjs/js-top/engine/JsTopController.js.map +1 -0
  17. package/lib/commonjs/js-top/engine/aggregator.js +148 -0
  18. package/lib/commonjs/js-top/engine/aggregator.js.map +1 -0
  19. package/lib/commonjs/js-top/engine/busyProbe.js +101 -0
  20. package/lib/commonjs/js-top/engine/busyProbe.js.map +1 -0
  21. package/lib/commonjs/js-top/engine/frameStack.js +133 -0
  22. package/lib/commonjs/js-top/engine/frameStack.js.map +1 -0
  23. package/lib/commonjs/js-top/engine/longtasks.js +141 -0
  24. package/lib/commonjs/js-top/engine/longtasks.js.map +1 -0
  25. package/lib/commonjs/js-top/engine/now.js +38 -0
  26. package/lib/commonjs/js-top/engine/now.js.map +1 -0
  27. package/lib/commonjs/js-top/engine/originRegistry.js +402 -0
  28. package/lib/commonjs/js-top/engine/originRegistry.js.map +1 -0
  29. package/lib/commonjs/js-top/engine/patches/bridge.js +60 -0
  30. package/lib/commonjs/js-top/engine/patches/bridge.js.map +1 -0
  31. package/lib/commonjs/js-top/engine/patches/microtasks.js +27 -0
  32. package/lib/commonjs/js-top/engine/patches/microtasks.js.map +1 -0
  33. package/lib/commonjs/js-top/engine/patches/promises.js +65 -0
  34. package/lib/commonjs/js-top/engine/patches/promises.js.map +1 -0
  35. package/lib/commonjs/js-top/engine/patches/timers.js +66 -0
  36. package/lib/commonjs/js-top/engine/patches/timers.js.map +1 -0
  37. package/lib/commonjs/js-top/engine/state.js +63 -0
  38. package/lib/commonjs/js-top/engine/state.js.map +1 -0
  39. package/lib/commonjs/js-top/engine/symbolicate.js +95 -0
  40. package/lib/commonjs/js-top/engine/symbolicate.js.map +1 -0
  41. package/lib/commonjs/js-top/sync/jsTopSyncAdapter.js +74 -0
  42. package/lib/commonjs/js-top/sync/jsTopSyncAdapter.js.map +1 -0
  43. package/lib/commonjs/js-top/types/index.js +46 -0
  44. package/lib/commonjs/js-top/types/index.js.map +1 -0
  45. package/lib/commonjs/js-top/utils/preferences.js +39 -0
  46. package/lib/commonjs/js-top/utils/preferences.js.map +1 -0
  47. package/lib/commonjs/package.json +1 -0
  48. package/lib/commonjs/preset.js +75 -0
  49. package/lib/commonjs/preset.js.map +1 -0
  50. package/lib/module/index.js +47 -0
  51. package/lib/module/index.js.map +1 -0
  52. package/lib/module/js-top/components/BusySparkline.js +52 -0
  53. package/lib/module/js-top/components/BusySparkline.js.map +1 -0
  54. package/lib/module/js-top/components/JsTopHudOverlay.js +75 -0
  55. package/lib/module/js-top/components/JsTopHudOverlay.js.map +1 -0
  56. package/lib/module/js-top/components/JsTopModal.js +343 -0
  57. package/lib/module/js-top/components/JsTopModal.js.map +1 -0
  58. package/lib/module/js-top/components/TaskDetailView.js +325 -0
  59. package/lib/module/js-top/components/TaskDetailView.js.map +1 -0
  60. package/lib/module/js-top/components/TaskTable.js +353 -0
  61. package/lib/module/js-top/components/TaskTable.js.map +1 -0
  62. package/lib/module/js-top/engine/JsTopController.js +347 -0
  63. package/lib/module/js-top/engine/JsTopController.js.map +1 -0
  64. package/lib/module/js-top/engine/aggregator.js +136 -0
  65. package/lib/module/js-top/engine/aggregator.js.map +1 -0
  66. package/lib/module/js-top/engine/busyProbe.js +94 -0
  67. package/lib/module/js-top/engine/busyProbe.js.map +1 -0
  68. package/lib/module/js-top/engine/frameStack.js +126 -0
  69. package/lib/module/js-top/engine/frameStack.js.map +1 -0
  70. package/lib/module/js-top/engine/longtasks.js +133 -0
  71. package/lib/module/js-top/engine/longtasks.js.map +1 -0
  72. package/lib/module/js-top/engine/now.js +33 -0
  73. package/lib/module/js-top/engine/now.js.map +1 -0
  74. package/lib/module/js-top/engine/originRegistry.js +388 -0
  75. package/lib/module/js-top/engine/originRegistry.js.map +1 -0
  76. package/lib/module/js-top/engine/patches/bridge.js +56 -0
  77. package/lib/module/js-top/engine/patches/bridge.js.map +1 -0
  78. package/lib/module/js-top/engine/patches/microtasks.js +23 -0
  79. package/lib/module/js-top/engine/patches/microtasks.js.map +1 -0
  80. package/lib/module/js-top/engine/patches/promises.js +62 -0
  81. package/lib/module/js-top/engine/patches/promises.js.map +1 -0
  82. package/lib/module/js-top/engine/patches/timers.js +62 -0
  83. package/lib/module/js-top/engine/patches/timers.js.map +1 -0
  84. package/lib/module/js-top/engine/state.js +54 -0
  85. package/lib/module/js-top/engine/state.js.map +1 -0
  86. package/lib/module/js-top/engine/symbolicate.js +91 -0
  87. package/lib/module/js-top/engine/symbolicate.js.map +1 -0
  88. package/lib/module/js-top/sync/jsTopSyncAdapter.js +70 -0
  89. package/lib/module/js-top/sync/jsTopSyncAdapter.js.map +1 -0
  90. package/lib/module/js-top/types/index.js +42 -0
  91. package/lib/module/js-top/types/index.js.map +1 -0
  92. package/lib/module/js-top/utils/preferences.js +34 -0
  93. package/lib/module/js-top/utils/preferences.js.map +1 -0
  94. package/lib/module/preset.js +71 -0
  95. package/lib/module/preset.js.map +1 -0
  96. package/lib/typescript/index.d.ts +21 -0
  97. package/lib/typescript/index.d.ts.map +1 -0
  98. package/lib/typescript/js-top/components/BusySparkline.d.ts +8 -0
  99. package/lib/typescript/js-top/components/BusySparkline.d.ts.map +1 -0
  100. package/lib/typescript/js-top/components/JsTopHudOverlay.d.ts +8 -0
  101. package/lib/typescript/js-top/components/JsTopHudOverlay.d.ts.map +1 -0
  102. package/lib/typescript/js-top/components/JsTopModal.d.ts +39 -0
  103. package/lib/typescript/js-top/components/JsTopModal.d.ts.map +1 -0
  104. package/lib/typescript/js-top/components/TaskDetailView.d.ts +15 -0
  105. package/lib/typescript/js-top/components/TaskDetailView.d.ts.map +1 -0
  106. package/lib/typescript/js-top/components/TaskTable.d.ts +38 -0
  107. package/lib/typescript/js-top/components/TaskTable.d.ts.map +1 -0
  108. package/lib/typescript/js-top/engine/JsTopController.d.ts +78 -0
  109. package/lib/typescript/js-top/engine/JsTopController.d.ts.map +1 -0
  110. package/lib/typescript/js-top/engine/__tests__/engine.test.d.ts +9 -0
  111. package/lib/typescript/js-top/engine/__tests__/engine.test.d.ts.map +1 -0
  112. package/lib/typescript/js-top/engine/aggregator.d.ts +33 -0
  113. package/lib/typescript/js-top/engine/aggregator.d.ts.map +1 -0
  114. package/lib/typescript/js-top/engine/busyProbe.d.ts +25 -0
  115. package/lib/typescript/js-top/engine/busyProbe.d.ts.map +1 -0
  116. package/lib/typescript/js-top/engine/frameStack.d.ts +44 -0
  117. package/lib/typescript/js-top/engine/frameStack.d.ts.map +1 -0
  118. package/lib/typescript/js-top/engine/longtasks.d.ts +37 -0
  119. package/lib/typescript/js-top/engine/longtasks.d.ts.map +1 -0
  120. package/lib/typescript/js-top/engine/now.d.ts +9 -0
  121. package/lib/typescript/js-top/engine/now.d.ts.map +1 -0
  122. package/lib/typescript/js-top/engine/originRegistry.d.ts +82 -0
  123. package/lib/typescript/js-top/engine/originRegistry.d.ts.map +1 -0
  124. package/lib/typescript/js-top/engine/patches/bridge.d.ts +17 -0
  125. package/lib/typescript/js-top/engine/patches/bridge.d.ts.map +1 -0
  126. package/lib/typescript/js-top/engine/patches/microtasks.d.ts +6 -0
  127. package/lib/typescript/js-top/engine/patches/microtasks.d.ts.map +1 -0
  128. package/lib/typescript/js-top/engine/patches/promises.d.ts +18 -0
  129. package/lib/typescript/js-top/engine/patches/promises.d.ts.map +1 -0
  130. package/lib/typescript/js-top/engine/patches/timers.d.ts +11 -0
  131. package/lib/typescript/js-top/engine/patches/timers.d.ts.map +1 -0
  132. package/lib/typescript/js-top/engine/state.d.ts +35 -0
  133. package/lib/typescript/js-top/engine/state.d.ts.map +1 -0
  134. package/lib/typescript/js-top/engine/symbolicate.d.ts +16 -0
  135. package/lib/typescript/js-top/engine/symbolicate.d.ts.map +1 -0
  136. package/lib/typescript/js-top/sync/jsTopSyncAdapter.d.ts +43 -0
  137. package/lib/typescript/js-top/sync/jsTopSyncAdapter.d.ts.map +1 -0
  138. package/lib/typescript/js-top/types/index.d.ts +130 -0
  139. package/lib/typescript/js-top/types/index.d.ts.map +1 -0
  140. package/lib/typescript/js-top/utils/preferences.d.ts +13 -0
  141. package/lib/typescript/js-top/utils/preferences.d.ts.map +1 -0
  142. package/lib/typescript/preset.d.ts +49 -0
  143. package/lib/typescript/preset.d.ts.map +1 -0
  144. package/package.json +67 -0
  145. package/src/index.tsx +69 -0
  146. package/src/js-top/components/BusySparkline.tsx +59 -0
  147. package/src/js-top/components/JsTopHudOverlay.tsx +78 -0
  148. package/src/js-top/components/JsTopModal.tsx +421 -0
  149. package/src/js-top/components/TaskDetailView.tsx +349 -0
  150. package/src/js-top/components/TaskTable.tsx +365 -0
  151. package/src/js-top/engine/JsTopController.ts +401 -0
  152. package/src/js-top/engine/__tests__/engine.test.ts +337 -0
  153. package/src/js-top/engine/aggregator.ts +148 -0
  154. package/src/js-top/engine/busyProbe.ts +100 -0
  155. package/src/js-top/engine/frameStack.ts +142 -0
  156. package/src/js-top/engine/longtasks.ts +137 -0
  157. package/src/js-top/engine/now.ts +33 -0
  158. package/src/js-top/engine/originRegistry.ts +495 -0
  159. package/src/js-top/engine/patches/bridge.ts +69 -0
  160. package/src/js-top/engine/patches/microtasks.ts +25 -0
  161. package/src/js-top/engine/patches/promises.ts +57 -0
  162. package/src/js-top/engine/patches/timers.ts +80 -0
  163. package/src/js-top/engine/state.ts +66 -0
  164. package/src/js-top/engine/symbolicate.ts +109 -0
  165. package/src/js-top/sync/jsTopSyncAdapter.ts +72 -0
  166. package/src/js-top/types/index.ts +144 -0
  167. package/src/js-top/utils/preferences.ts +35 -0
  168. package/src/preset.tsx +67 -0
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.installTimerPatches = installTimerPatches;
7
+ var _frameStack = require("../frameStack");
8
+ var _state = require("../state");
9
+ /**
10
+ * Tier 1 patches: setTimeout / setInterval / setImmediate /
11
+ * requestAnimationFrame. Public globals only — RN internals (JSTimers) are
12
+ * private API and churn across versions.
13
+ *
14
+ * Install-once, never unpatch (see state.ts). Handles are returned from the
15
+ * originals unchanged, so clearTimeout/clearInterval/cancelAnimationFrame
16
+ * need no patching. Extra setTimeout args pass through.
17
+ */
18
+
19
+ function installTimerPatches() {
20
+ const originals = (0, _state.captureOriginals)();
21
+ if (typeof _state.g.setTimeout === "function" && !_state.g.setTimeout[_state.PATCHED_TAG]) {
22
+ const buoyJsTopSetTimeout = function (
23
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
24
+ fn, timeout,
25
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
26
+ ...args) {
27
+ const cb = (0, _frameStack.buoyJsTopWrapTask)(fn, "timeout");
28
+ return originals.setTimeout(cb, timeout, ...args);
29
+ };
30
+ buoyJsTopSetTimeout[_state.PATCHED_TAG] = true;
31
+ _state.g.setTimeout = buoyJsTopSetTimeout;
32
+ }
33
+ if (typeof _state.g.setInterval === "function" && !_state.g.setInterval[_state.PATCHED_TAG]) {
34
+ const buoyJsTopSetInterval = function (
35
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
36
+ fn, timeout,
37
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
38
+ ...args) {
39
+ const cb = (0, _frameStack.buoyJsTopWrapTask)(fn, "interval");
40
+ return originals.setInterval(cb, timeout, ...args);
41
+ };
42
+ buoyJsTopSetInterval[_state.PATCHED_TAG] = true;
43
+ _state.g.setInterval = buoyJsTopSetInterval;
44
+ }
45
+ if (typeof _state.g.setImmediate === "function" && !_state.g.setImmediate[_state.PATCHED_TAG] && originals.setImmediate) {
46
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
47
+ const buoyJsTopSetImmediate = function (fn, ...args) {
48
+ const cb = (0, _frameStack.buoyJsTopWrapTask)(fn, "immediate");
49
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
50
+ return originals.setImmediate(cb, ...args);
51
+ };
52
+ buoyJsTopSetImmediate[_state.PATCHED_TAG] = true;
53
+ _state.g.setImmediate = buoyJsTopSetImmediate;
54
+ }
55
+ if (typeof _state.g.requestAnimationFrame === "function" && !_state.g.requestAnimationFrame[_state.PATCHED_TAG] && originals.requestAnimationFrame) {
56
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
57
+ const buoyJsTopRequestAnimationFrame = function (fn) {
58
+ const cb = (0, _frameStack.buoyJsTopWrapTask)(fn, "raf");
59
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
60
+ return originals.requestAnimationFrame(cb);
61
+ };
62
+ buoyJsTopRequestAnimationFrame[_state.PATCHED_TAG] = true;
63
+ _state.g.requestAnimationFrame = buoyJsTopRequestAnimationFrame;
64
+ }
65
+ }
66
+ //# sourceMappingURL=timers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_frameStack","require","_state","installTimerPatches","originals","captureOriginals","g","setTimeout","PATCHED_TAG","buoyJsTopSetTimeout","fn","timeout","args","cb","buoyJsTopWrapTask","setInterval","buoyJsTopSetInterval","setImmediate","buoyJsTopSetImmediate","requestAnimationFrame","buoyJsTopRequestAnimationFrame"],"sourceRoot":"../../../../../src","sources":["js-top/engine/patches/timers.ts"],"mappings":";;;;;;AAUA,IAAAA,WAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AAXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAKO,SAASE,mBAAmBA,CAAA,EAAS;EAC1C,MAAMC,SAAS,GAAG,IAAAC,uBAAgB,EAAC,CAAC;EAEpC,IAAI,OAAOC,QAAC,CAACC,UAAU,KAAK,UAAU,IAAI,CAACD,QAAC,CAACC,UAAU,CAACC,kBAAW,CAAC,EAAE;IACpE,MAAMC,mBAAmB,GAAG,SAAAA;IAC1B;IACAC,EAAO,EACPC,OAAgB;IAChB;IACA,GAAGC,IAAW,EACd;MACA,MAAMC,EAAE,GAAG,IAAAC,6BAAiB,EAACJ,EAAE,EAAE,SAAS,CAAC;MAC3C,OAAQN,SAAS,CAACG,UAAU,CAAuBM,EAAE,EAAEF,OAAO,EAAE,GAAGC,IAAI,CAAC;IAC1E,CAAC;IACDH,mBAAmB,CAACD,kBAAW,CAAC,GAAG,IAAI;IACvCF,QAAC,CAACC,UAAU,GAAGE,mBAAmB;EACpC;EAEA,IAAI,OAAOH,QAAC,CAACS,WAAW,KAAK,UAAU,IAAI,CAACT,QAAC,CAACS,WAAW,CAACP,kBAAW,CAAC,EAAE;IACtE,MAAMQ,oBAAoB,GAAG,SAAAA;IAC3B;IACAN,EAAO,EACPC,OAAgB;IAChB;IACA,GAAGC,IAAW,EACd;MACA,MAAMC,EAAE,GAAG,IAAAC,6BAAiB,EAACJ,EAAE,EAAE,UAAU,CAAC;MAC5C,OAAQN,SAAS,CAACW,WAAW,CAC3BF,EAAE,EACFF,OAAO,EACP,GAAGC,IACL,CAAC;IACH,CAAC;IACDI,oBAAoB,CAACR,kBAAW,CAAC,GAAG,IAAI;IACxCF,QAAC,CAACS,WAAW,GAAGC,oBAAoB;EACtC;EAEA,IACE,OAAOV,QAAC,CAACW,YAAY,KAAK,UAAU,IACpC,CAACX,QAAC,CAACW,YAAY,CAACT,kBAAW,CAAC,IAC5BJ,SAAS,CAACa,YAAY,EACtB;IACA;IACA,MAAMC,qBAAqB,GAAG,SAAAA,CAAUR,EAAO,EAAE,GAAGE,IAAW,EAAE;MAC/D,MAAMC,EAAE,GAAG,IAAAC,6BAAiB,EAACJ,EAAE,EAAE,WAAW,CAAC;MAC7C;MACA,OAAQN,SAAS,CAACa,YAAY,CAASJ,EAAE,EAAE,GAAGD,IAAI,CAAC;IACrD,CAAC;IACDM,qBAAqB,CAACV,kBAAW,CAAC,GAAG,IAAI;IACzCF,QAAC,CAACW,YAAY,GAAGC,qBAAqB;EACxC;EAEA,IACE,OAAOZ,QAAC,CAACa,qBAAqB,KAAK,UAAU,IAC7C,CAACb,QAAC,CAACa,qBAAqB,CAACX,kBAAW,CAAC,IACrCJ,SAAS,CAACe,qBAAqB,EAC/B;IACA;IACA,MAAMC,8BAA8B,GAAG,SAAAA,CAAUV,EAAO,EAAE;MACxD,MAAMG,EAAE,GAAG,IAAAC,6BAAiB,EAACJ,EAAE,EAAE,KAAK,CAAC;MACvC;MACA,OAAQN,SAAS,CAACe,qBAAqB,CAASN,EAAE,CAAC;IACrD,CAAC;IACDO,8BAA8B,CAACZ,kBAAW,CAAC,GAAG,IAAI;IAClDF,QAAC,CAACa,qBAAqB,GAAGC,8BAA8B;EAC1D;AACF","ignoreList":[]}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.WRAPPED_TAG = exports.PATCHED_TAG = void 0;
7
+ exports.captureOriginals = captureOriginals;
8
+ exports.g = void 0;
9
+ exports.getOriginals = getOriginals;
10
+ exports.isActive = isActive;
11
+ exports.setActive = setActive;
12
+ /**
13
+ * Shared engine state + pre-patch originals.
14
+ *
15
+ * `active` is the single gate every patched global checks at schedule time:
16
+ * patches install once and are NEVER removed (restoring originals would
17
+ * clobber any wrapper another library — Sentry, Reanimated — layered on top
18
+ * of ours after install; same reasoning as highlight-updates' CommitProfiler
19
+ * hook). When inactive, a patched global forwards the raw callback to the
20
+ * original at the cost of one boolean check.
21
+ *
22
+ * `originals` are captured BEFORE patching so the engine's own probe and
23
+ * notify timers never flow through the wrappers — JS TOP must not list
24
+ * itself as a task.
25
+ */
26
+
27
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
28
+ const g = exports.g =
29
+ // eslint-disable-next-line no-restricted-globals
30
+ typeof globalThis !== "undefined" ? globalThis : {};
31
+ let active = false;
32
+ function isActive() {
33
+ return active;
34
+ }
35
+ function setActive(on) {
36
+ active = on;
37
+ }
38
+ let originals = null;
39
+
40
+ /** Capture pre-patch globals. Idempotent; first call wins. */
41
+ function captureOriginals() {
42
+ if (!originals) {
43
+ originals = {
44
+ setTimeout: g.setTimeout?.bind(g),
45
+ setInterval: g.setInterval?.bind(g),
46
+ clearInterval: g.clearInterval?.bind(g),
47
+ clearTimeout: g.clearTimeout?.bind(g),
48
+ setImmediate: g.setImmediate?.bind(g),
49
+ requestAnimationFrame: g.requestAnimationFrame?.bind(g),
50
+ queueMicrotask: g.queueMicrotask?.bind(g)
51
+ };
52
+ }
53
+ return originals;
54
+ }
55
+ function getOriginals() {
56
+ return captureOriginals();
57
+ }
58
+
59
+ /** Tag interned on patched globals so duplicate module instances skip re-patching. */
60
+ const PATCHED_TAG = exports.PATCHED_TAG = Symbol.for("buoy.jsTop.patched");
61
+ /** Marker set on wrapper functions so a wrapped fn is never wrapped twice. */
62
+ const WRAPPED_TAG = exports.WRAPPED_TAG = Symbol.for("buoy.jsTop.wrapped");
63
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["g","exports","globalThis","active","isActive","setActive","on","originals","captureOriginals","setTimeout","bind","setInterval","clearInterval","clearTimeout","setImmediate","requestAnimationFrame","queueMicrotask","getOriginals","PATCHED_TAG","Symbol","for","WRAPPED_TAG"],"sourceRoot":"../../../../src","sources":["js-top/engine/state.ts"],"mappings":";;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACO,MAAMA,CAAM,GAAAC,OAAA,CAAAD,CAAA;AACjB;AACA,OAAOE,UAAU,KAAK,WAAW,GAAGA,UAAU,GAAG,CAAC,CAAC;AAErD,IAAIC,MAAM,GAAG,KAAK;AAEX,SAASC,QAAQA,CAAA,EAAY;EAClC,OAAOD,MAAM;AACf;AAEO,SAASE,SAASA,CAACC,EAAW,EAAQ;EAC3CH,MAAM,GAAGG,EAAE;AACb;AAYA,IAAIC,SAA2B,GAAG,IAAI;;AAEtC;AACO,SAASC,gBAAgBA,CAAA,EAAc;EAC5C,IAAI,CAACD,SAAS,EAAE;IACdA,SAAS,GAAG;MACVE,UAAU,EAAET,CAAC,CAACS,UAAU,EAAEC,IAAI,CAACV,CAAC,CAAC;MACjCW,WAAW,EAAEX,CAAC,CAACW,WAAW,EAAED,IAAI,CAACV,CAAC,CAAC;MACnCY,aAAa,EAAEZ,CAAC,CAACY,aAAa,EAAEF,IAAI,CAACV,CAAC,CAAC;MACvCa,YAAY,EAAEb,CAAC,CAACa,YAAY,EAAEH,IAAI,CAACV,CAAC,CAAC;MACrCc,YAAY,EAAEd,CAAC,CAACc,YAAY,EAAEJ,IAAI,CAACV,CAAC,CAAC;MACrCe,qBAAqB,EAAEf,CAAC,CAACe,qBAAqB,EAAEL,IAAI,CAACV,CAAC,CAAC;MACvDgB,cAAc,EAAEhB,CAAC,CAACgB,cAAc,EAAEN,IAAI,CAACV,CAAC;IAC1C,CAAC;EACH;EACA,OAAOO,SAAS;AAClB;AAEO,SAASU,YAAYA,CAAA,EAAc;EACxC,OAAOT,gBAAgB,CAAC,CAAC;AAC3B;;AAEA;AACO,MAAMU,WAAW,GAAAjB,OAAA,CAAAiB,WAAA,GAAGC,MAAM,CAACC,GAAG,CAAC,oBAAoB,CAAC;AAC3D;AACO,MAAMC,WAAW,GAAApB,OAAA,CAAAoB,WAAA,GAAGF,MAAM,CAACC,GAAG,CAAC,oBAAoB,CAAC","ignoreList":[]}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.buoyJsTopSymbolicateOrigin = buoyJsTopSymbolicateOrigin;
7
+ /**
8
+ * Dev-only origin symbolication via Metro's /symbolicate endpoint (the same
9
+ * one LogBox uses). Hermes stacks give function names + bundle offsets; for
10
+ * anonymous scheduling sites (the typical `useEffect(() => setInterval(…))`)
11
+ * that leaves an unreadable label. Metro maps the offset back to the real
12
+ * source file — so a row can say `setInterval ← ChatScreen.tsx:42`, which is
13
+ * component-level attribution in practice.
14
+ *
15
+ * Fire-and-forget with hard caps: one attempt per origin, few in flight,
16
+ * silent on any failure (release builds, tunnels, Metro gone). The origin's
17
+ * label/file/line are upgraded in place when the answer lands — the table
18
+ * re-renders every tick and picks it up.
19
+ */
20
+
21
+ const MAX_IN_FLIGHT = 3;
22
+ let inFlight = 0;
23
+ function isDev() {
24
+ return typeof __DEV__ !== "undefined" && __DEV__;
25
+ }
26
+
27
+ /** Last two path segments of a source path — "screens/ChatScreen.tsx". */
28
+ function tailPath(file) {
29
+ const clean = file.split("?")[0] ?? file;
30
+ const parts = clean.split("/").filter(Boolean);
31
+ return parts.slice(-2).join("/");
32
+ }
33
+
34
+ /** True for names like ChatScreen / PokemonScreen — reads as a component. */
35
+ function looksLikeComponent(name) {
36
+ return /^[A-Z][A-Za-z0-9]*$/.test(name);
37
+ }
38
+ function buoyJsTopSymbolicateOrigin(o, apiLabelText) {
39
+ if (!isDev()) return;
40
+ if (o.symbolicated || !o.frames || o.frames.length === 0) return;
41
+ if (inFlight >= MAX_IN_FLIGHT) return; // retried implicitly? no — one shot
42
+ o.symbolicated = true;
43
+ const top = o.frames[0];
44
+ if (!top || !/^https?:\/\//.test(top.file)) return;
45
+ let endpoint;
46
+ try {
47
+ endpoint = `${new URL(top.file).origin}/symbolicate`;
48
+ } catch {
49
+ return;
50
+ }
51
+ inFlight++;
52
+ const body = JSON.stringify({
53
+ stack: o.frames.map(f => ({
54
+ file: f.file,
55
+ lineNumber: f.line,
56
+ column: f.col,
57
+ methodName: ""
58
+ }))
59
+ });
60
+ fetch(endpoint, {
61
+ method: "POST",
62
+ body
63
+ }).then(res => res.ok ? res.json() : null).then(data => {
64
+ let frame = data?.stack?.find(f => f.file && !f.file.includes("node_modules")) ?? data?.stack?.[0];
65
+ // Some Metro configs (serialized source maps) reject full
66
+ // symbolication but still NAME the module in the error — that file
67
+ // path is exactly the scheduling site, so harvest it.
68
+ if (!frame?.file && data?.error) {
69
+ const m = /found: (\/.+)$/.exec(data.error);
70
+ if (m) frame = {
71
+ file: m[1]
72
+ };
73
+ }
74
+ if (!frame?.file) return;
75
+ const file = tailPath(frame.file);
76
+ const line = frame.lineNumber;
77
+ const method = frame.methodName && frame.methodName !== "<unknown>" ? frame.methodName : undefined;
78
+ o.file = file;
79
+ o.line = line ?? o.line;
80
+ // The existing label is name-anchored — append the source site
81
+ // once, and promote a component-looking method name.
82
+ const site = `${file.split("/").pop()}${line != null ? `:${line}` : ""}`;
83
+ if (method && looksLikeComponent(method) && !o.caller) {
84
+ o.caller = method;
85
+ o.label = `${o.label} ← <${method}> · ${site}`;
86
+ } else {
87
+ o.label = `${o.label} · ${site}`;
88
+ }
89
+ }).catch(() => {
90
+ // Symbolication is best-effort decoration — never surface failures.
91
+ }).finally(() => {
92
+ inFlight--;
93
+ });
94
+ }
95
+ //# sourceMappingURL=symbolicate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["MAX_IN_FLIGHT","inFlight","isDev","__DEV__","tailPath","file","clean","split","parts","filter","Boolean","slice","join","looksLikeComponent","name","test","buoyJsTopSymbolicateOrigin","o","apiLabelText","symbolicated","frames","length","top","endpoint","URL","origin","body","JSON","stringify","stack","map","f","lineNumber","line","column","col","methodName","fetch","method","then","res","ok","json","data","frame","find","includes","error","m","exec","undefined","site","pop","caller","label","catch","finally"],"sourceRoot":"../../../../src","sources":["js-top/engine/symbolicate.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.jsTopSyncAdapter = void 0;
7
+ var _JsTopController = require("../engine/JsTopController");
8
+ /**
9
+ * Sync adapter for the JS TOP tool, consumed by @buoy-gg/external-sync's
10
+ * `useExternalSync` (structurally matches its ToolSyncAdapter interface so
11
+ * this package doesn't need a dependency on it — same pattern as
12
+ * perf-monitor's adapter).
13
+ *
14
+ * `subscribe` is only called while a dashboard is watching, and subscribing
15
+ * to JsTopController is exactly what starts the engine — so a desktop
16
+ * watcher auto-starts sampling and closing the desktop tool stops it. The
17
+ * snapshot IS the live channel; there is no heavy persisted state.
18
+ */
19
+
20
+ const jsTopSyncAdapter = exports.jsTopSyncAdapter = {
21
+ version: 1,
22
+ getSnapshot: () => ({
23
+ live: _JsTopController.JsTopController.getSnapshot(),
24
+ // "enabled" mirrors perf-monitor semantics: is the device sampling for
25
+ // any viewer (its own HUD/modal or a desktop's silent remote sampling).
26
+ enabled: _JsTopController.JsTopController.isEnabled() || _JsTopController.JsTopController.isRemoteSampling()
27
+ }),
28
+ subscribe: onChange => {
29
+ const unsubSnapshot = _JsTopController.JsTopController.subscribe(() => onChange());
30
+ const unsubEnabled = _JsTopController.JsTopController.subscribeEnabled(() => onChange());
31
+ return () => {
32
+ unsubSnapshot();
33
+ unsubEnabled();
34
+ };
35
+ },
36
+ actions: {
37
+ /**
38
+ * Silent sampling for a desktop viewer: streams snapshots without
39
+ * showing the device's own HUD. (Subscribing via `subscribe` already
40
+ * runs the engine while watched; this exists so MCP / scripted callers
41
+ * can force sampling on without a watch.)
42
+ */
43
+ setEnabled: params => {
44
+ const enabled = params.enabled;
45
+ _JsTopController.JsTopController.setRemoteSampling(enabled);
46
+ },
47
+ pause: () => _JsTopController.JsTopController.pause(),
48
+ resume: () => _JsTopController.JsTopController.resume(),
49
+ clear: () => _JsTopController.JsTopController.clear(),
50
+ /** Full detail for one origin (desktop tap-through parity). */
51
+ getOriginDetail: params => _JsTopController.JsTopController.getOriginDetail(params.key),
52
+ /**
53
+ * One-shot sample for MCP/automation: ensure the engine is running,
54
+ * observe for `durationMs` (default 3s, capped 30s), return the
55
+ * resulting snapshot. `clearFirst` resets all stats before sampling so
56
+ * the result attributes exactly one interaction/window. Leaves sampling
57
+ * in its prior state.
58
+ */
59
+ sample: async params => {
60
+ const p = params;
61
+ const durationMs = Math.min(Math.max(p?.durationMs ?? 3000, 250), 30_000);
62
+ const wasSampling = _JsTopController.JsTopController.isRemoteSampling() || _JsTopController.JsTopController.isEnabled();
63
+ if (!wasSampling) _JsTopController.JsTopController.setRemoteSampling(true);
64
+ if (p?.clearFirst) _JsTopController.JsTopController.clear();
65
+ try {
66
+ await new Promise(resolve => setTimeout(resolve, durationMs));
67
+ return _JsTopController.JsTopController.getSnapshot();
68
+ } finally {
69
+ if (!wasSampling) _JsTopController.JsTopController.setRemoteSampling(false);
70
+ }
71
+ }
72
+ }
73
+ };
74
+ //# sourceMappingURL=jsTopSyncAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_JsTopController","require","jsTopSyncAdapter","exports","version","getSnapshot","live","JsTopController","enabled","isEnabled","isRemoteSampling","subscribe","onChange","unsubSnapshot","unsubEnabled","subscribeEnabled","actions","setEnabled","params","setRemoteSampling","pause","resume","clear","getOriginDetail","key","sample","p","durationMs","Math","min","max","wasSampling","clearFirst","Promise","resolve","setTimeout"],"sourceRoot":"../../../../src","sources":["js-top/sync/jsTopSyncAdapter.ts"],"mappings":";;;;;;AAYA,IAAAA,gBAAA,GAAAC,OAAA;AAZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAKO,MAAMC,gBAAgB,GAAAC,OAAA,CAAAD,gBAAA,GAAG;EAC9BE,OAAO,EAAE,CAAC;EACVC,WAAW,EAAEA,CAAA,MAAkD;IAC7DC,IAAI,EAAEC,gCAAe,CAACF,WAAW,CAAC,CAAC;IACnC;IACA;IACAG,OAAO,EACLD,gCAAe,CAACE,SAAS,CAAC,CAAC,IAAIF,gCAAe,CAACG,gBAAgB,CAAC;EACpE,CAAC,CAAC;EACFC,SAAS,EAAGC,QAAoB,IAAK;IACnC,MAAMC,aAAa,GAAGN,gCAAe,CAACI,SAAS,CAAC,MAAMC,QAAQ,CAAC,CAAC,CAAC;IACjE,MAAME,YAAY,GAAGP,gCAAe,CAACQ,gBAAgB,CAAC,MAAMH,QAAQ,CAAC,CAAC,CAAC;IACvE,OAAO,MAAM;MACXC,aAAa,CAAC,CAAC;MACfC,YAAY,CAAC,CAAC;IAChB,CAAC;EACH,CAAC;EACDE,OAAO,EAAE;IACP;AACJ;AACA;AACA;AACA;AACA;IACIC,UAAU,EAAGC,MAAe,IAAK;MAC/B,MAAMV,OAAO,GAAIU,MAAM,CAA0BV,OAAO;MACxDD,gCAAe,CAACY,iBAAiB,CAACX,OAAO,CAAC;IAC5C,CAAC;IACDY,KAAK,EAAEA,CAAA,KAAMb,gCAAe,CAACa,KAAK,CAAC,CAAC;IACpCC,MAAM,EAAEA,CAAA,KAAMd,gCAAe,CAACc,MAAM,CAAC,CAAC;IACtCC,KAAK,EAAEA,CAAA,KAAMf,gCAAe,CAACe,KAAK,CAAC,CAAC;IACpC;IACAC,eAAe,EAAGL,MAAe,IAC/BX,gCAAe,CAACgB,eAAe,CAAEL,MAAM,CAAqBM,GAAG,CAAC;IAClE;AACJ;AACA;AACA;AACA;AACA;AACA;IACIC,MAAM,EAAE,MAAOP,MAAe,IAAK;MACjC,MAAMQ,CAAC,GAAGR,MAAuD;MACjE,MAAMS,UAAU,GAAGC,IAAI,CAACC,GAAG,CAACD,IAAI,CAACE,GAAG,CAACJ,CAAC,EAAEC,UAAU,IAAI,IAAI,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC;MACzE,MAAMI,WAAW,GACfxB,gCAAe,CAACG,gBAAgB,CAAC,CAAC,IAAIH,gCAAe,CAACE,SAAS,CAAC,CAAC;MACnE,IAAI,CAACsB,WAAW,EAAExB,gCAAe,CAACY,iBAAiB,CAAC,IAAI,CAAC;MACzD,IAAIO,CAAC,EAAEM,UAAU,EAAEzB,gCAAe,CAACe,KAAK,CAAC,CAAC;MAC1C,IAAI;QACF,MAAM,IAAIW,OAAO,CAAEC,OAAO,IAAKC,UAAU,CAACD,OAAO,EAAEP,UAAU,CAAC,CAAC;QAC/D,OAAOpB,gCAAe,CAACF,WAAW,CAAC,CAAC;MACtC,CAAC,SAAS;QACR,IAAI,CAAC0B,WAAW,EAAExB,gCAAe,CAACY,iBAAiB,CAAC,KAAK,CAAC;MAC5D;IACF;EACF;AACF,CAAC","ignoreList":[]}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.WINDOW_BUCKETS = exports.SNAPSHOT_ROWS = exports.PROMOTE_MIN_TOTAL_MS = exports.PROMOTE_MIN_CALLS = exports.MAX_ORIGINS = exports.HISTORY_BUCKETS = exports.BUCKET_MS = void 0;
7
+ /**
8
+ * JS TOP — live Task Manager for the React Native JS thread.
9
+ *
10
+ * Attribution model: the engine wraps every JS-thread entry point it can
11
+ * reach (timers, rAF, microtasks, Promise reactions, legacy-bridge call-ins)
12
+ * and books EXCLUSIVE time per "origin" (the place a callback was scheduled
13
+ * from). A high-frequency probe measures true thread occupancy; the gap
14
+ * between measured busy time and attributed time is surfaced honestly as an
15
+ * "unattributed" row rather than hidden.
16
+ */
17
+
18
+ /** Which entry-point API a task came through. */
19
+
20
+ /** One captured stack frame from an origin's scheduling site (dev-readable). */
21
+
22
+ /**
23
+ * Which coverage tiers are live on this device. UIs gray out / banner what a
24
+ * runtime can't see (e.g. bridge call-ins don't exist on bridgeless).
25
+ */
26
+
27
+ /** One row of the live table — a task origin ("process" in Task Manager terms). */
28
+
29
+ /** A 50ms+ blocking task reported by the runtime, with our best attribution. */
30
+
31
+ /** The JSON-serializable live snapshot (device UI + external-sync payload). */
32
+
33
+ /** Everything the engine knows about one origin — the tap-through detail. */
34
+
35
+ /** Engine tuning constants — exported for tests. */
36
+ const BUCKET_MS = exports.BUCKET_MS = 250;
37
+ /** Rolling "recent" window: 20 buckets = 5s. */
38
+ const WINDOW_BUCKETS = exports.WINDOW_BUCKETS = 20;
39
+ /** Global busy history ring: 120 buckets = 30s. */
40
+ const HISTORY_BUCKETS = exports.HISTORY_BUCKETS = 120;
41
+ const MAX_ORIGINS = exports.MAX_ORIGINS = 500;
42
+ /** Promotion thresholds: capture a scheduling stack once an origin is hot. */
43
+ const PROMOTE_MIN_CALLS = exports.PROMOTE_MIN_CALLS = 25;
44
+ const PROMOTE_MIN_TOTAL_MS = exports.PROMOTE_MIN_TOTAL_MS = 50;
45
+ const SNAPSHOT_ROWS = exports.SNAPSHOT_ROWS = 30;
46
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["BUCKET_MS","exports","WINDOW_BUCKETS","HISTORY_BUCKETS","MAX_ORIGINS","PROMOTE_MIN_CALLS","PROMOTE_MIN_TOTAL_MS","SNAPSHOT_ROWS"],"sourceRoot":"../../../../src","sources":["js-top/types/index.ts"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAYA;;AAOA;AACA;AACA;AACA;;AAYA;;AA0BA;;AAWA;;AAwBA;;AA2BA;AACO,MAAMA,SAAS,GAAAC,OAAA,CAAAD,SAAA,GAAG,GAAG;AAC5B;AACO,MAAME,cAAc,GAAAD,OAAA,CAAAC,cAAA,GAAG,EAAE;AAChC;AACO,MAAMC,eAAe,GAAAF,OAAA,CAAAE,eAAA,GAAG,GAAG;AAC3B,MAAMC,WAAW,GAAAH,OAAA,CAAAG,WAAA,GAAG,GAAG;AAC9B;AACO,MAAMC,iBAAiB,GAAAJ,OAAA,CAAAI,iBAAA,GAAG,EAAE;AAC5B,MAAMC,oBAAoB,GAAAL,OAAA,CAAAK,oBAAA,GAAG,EAAE;AAC/B,MAAMC,aAAa,GAAAN,OAAA,CAAAM,aAAA,GAAG,EAAE","ignoreList":[]}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.loadJsTopPrefs = loadJsTopPrefs;
7
+ exports.saveJsTopPrefs = saveJsTopPrefs;
8
+ var _sharedUi = require("@buoy-gg/shared-ui");
9
+ /**
10
+ * Persisted JS TOP preferences. Same load-then-save contract as
11
+ * perf-monitor's hudPreferences: rehydrate async, and only persist
12
+ * user-driven changes after the load resolves so defaults never clobber
13
+ * last session's state.
14
+ */
15
+
16
+ const KEY = "@react_buoy/js-top/prefs";
17
+ const DEFAULTS = {
18
+ enabled: false
19
+ };
20
+ async function loadJsTopPrefs() {
21
+ try {
22
+ const raw = await _sharedUi.persistentStorage.getItem(KEY);
23
+ if (!raw) return DEFAULTS;
24
+ const parsed = JSON.parse(raw);
25
+ return {
26
+ enabled: parsed.enabled === true
27
+ };
28
+ } catch {
29
+ return DEFAULTS;
30
+ }
31
+ }
32
+ async function saveJsTopPrefs(prefs) {
33
+ try {
34
+ await _sharedUi.persistentStorage.setItem(KEY, JSON.stringify(prefs));
35
+ } catch {
36
+ // Storage unavailable — non-fatal.
37
+ }
38
+ }
39
+ //# sourceMappingURL=preferences.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_sharedUi","require","KEY","DEFAULTS","enabled","loadJsTopPrefs","raw","persistentStorage","getItem","parsed","JSON","parse","saveJsTopPrefs","prefs","setItem","stringify"],"sourceRoot":"../../../../src","sources":["js-top/utils/preferences.ts"],"mappings":";;;;;;;AAOA,IAAAA,SAAA,GAAAC,OAAA;AAPA;AACA;AACA;AACA;AACA;AACA;;AAIA,MAAMC,GAAG,GAAG,0BAA0B;AAMtC,MAAMC,QAAoB,GAAG;EAAEC,OAAO,EAAE;AAAM,CAAC;AAExC,eAAeC,cAAcA,CAAA,EAAwB;EAC1D,IAAI;IACF,MAAMC,GAAG,GAAG,MAAMC,2BAAiB,CAACC,OAAO,CAACN,GAAG,CAAC;IAChD,IAAI,CAACI,GAAG,EAAE,OAAOH,QAAQ;IACzB,MAAMM,MAAM,GAAGC,IAAI,CAACC,KAAK,CAACL,GAAG,CAAwB;IACrD,OAAO;MAAEF,OAAO,EAAEK,MAAM,CAACL,OAAO,KAAK;IAAK,CAAC;EAC7C,CAAC,CAAC,MAAM;IACN,OAAOD,QAAQ;EACjB;AACF;AAEO,eAAeS,cAAcA,CAACC,KAAiB,EAAiB;EACrE,IAAI;IACF,MAAMN,2BAAiB,CAACO,OAAO,CAACZ,GAAG,EAAEQ,IAAI,CAACK,SAAS,CAACF,KAAK,CAAC,CAAC;EAC7D,CAAC,CAAC,MAAM;IACN;EAAA;AAEJ","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"type":"commonjs"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.jsTopPreset = exports.jsTopModalPreset = exports.JS_TOP_ENABLED_COLOR = exports.JS_TOP_DISABLED_COLOR = void 0;
7
+ var _react = require("react");
8
+ var _sharedUi = require("@buoy-gg/shared-ui");
9
+ var _JsTopController = require("./js-top/engine/JsTopController");
10
+ var _JsTopModal = require("./js-top/components/JsTopModal");
11
+ var _jsxRuntime = require("react/jsx-runtime");
12
+ /**
13
+ * Pre-configured JS TOP tools for FloatingDevTools.
14
+ *
15
+ * Two presets:
16
+ * - jsTopPreset: toggle-only chip that turns the floating busy% pill on/off.
17
+ * - jsTopModalPreset: opens the Task Manager window (ranked live table).
18
+ *
19
+ * @example
20
+ * ```tsx
21
+ * import { jsTopPreset, jsTopModalPreset } from '@buoy-gg/js-top';
22
+ *
23
+ * <FloatingDevTools apps={[jsTopPreset, jsTopModalPreset]} />
24
+ * ```
25
+ */
26
+
27
+ const JS_TOP_ENABLED_COLOR = exports.JS_TOP_ENABLED_COLOR = "#34D399";
28
+ const JS_TOP_DISABLED_COLOR = exports.JS_TOP_DISABLED_COLOR = "#6B7280";
29
+ function JsTopToggleIcon({
30
+ size
31
+ }) {
32
+ const [enabled, setEnabled] = (0, _react.useState)(() => _JsTopController.JsTopController.isEnabled());
33
+ (0, _react.useEffect)(() => _JsTopController.JsTopController.subscribeEnabled(setEnabled), []);
34
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Activity, {
35
+ size: size,
36
+ color: enabled ? JS_TOP_ENABLED_COLOR : JS_TOP_DISABLED_COLOR
37
+ });
38
+ }
39
+ function EmptyComponent() {
40
+ return null;
41
+ }
42
+
43
+ /** Toggle-only preset: show/hide the floating busy% pill. */
44
+ const jsTopPreset = exports.jsTopPreset = {
45
+ id: "js-top",
46
+ name: "JS TOP",
47
+ description: "Toggle the floating JS-thread busy pill",
48
+ slot: "row",
49
+ icon: JsTopToggleIcon,
50
+ component: EmptyComponent,
51
+ props: {},
52
+ launchMode: "toggle-only",
53
+ onPress: () => {
54
+ _JsTopController.JsTopController.setEnabled(!_JsTopController.JsTopController.isEnabled());
55
+ }
56
+ };
57
+
58
+ /** Modal preset: the live Task Manager window. */
59
+ const jsTopModalPreset = exports.jsTopModalPreset = {
60
+ id: "js-top-modal",
61
+ name: "TASKS",
62
+ description: "Live Task Manager for the JS thread",
63
+ slot: "both",
64
+ icon: ({
65
+ size
66
+ }) => /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Activity, {
67
+ size: size,
68
+ color: JS_TOP_ENABLED_COLOR
69
+ }),
70
+ component: _JsTopModal.JsTopModal,
71
+ props: {
72
+ enableSharedModalDimensions: false
73
+ }
74
+ };
75
+ //# sourceMappingURL=preset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","require","_sharedUi","_JsTopController","_JsTopModal","_jsxRuntime","JS_TOP_ENABLED_COLOR","exports","JS_TOP_DISABLED_COLOR","JsTopToggleIcon","size","enabled","setEnabled","useState","JsTopController","isEnabled","useEffect","subscribeEnabled","jsx","Activity","color","EmptyComponent","jsTopPreset","id","name","description","slot","icon","component","props","launchMode","onPress","jsTopModalPreset","JsTopModal","enableSharedModalDimensions"],"sourceRoot":"../../src","sources":["preset.tsx"],"mappings":";;;;;;AAeA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,SAAA,GAAAD,OAAA;AACA,IAAAE,gBAAA,GAAAF,OAAA;AACA,IAAAG,WAAA,GAAAH,OAAA;AAA4D,IAAAI,WAAA,GAAAJ,OAAA;AAlB5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAOO,MAAMK,oBAAoB,GAAAC,OAAA,CAAAD,oBAAA,GAAG,SAAS;AACtC,MAAME,qBAAqB,GAAAD,OAAA,CAAAC,qBAAA,GAAG,SAAS;AAE9C,SAASC,eAAeA,CAAC;EAAEC;AAAuB,CAAC,EAAE;EACnD,MAAM,CAACC,OAAO,EAAEC,UAAU,CAAC,GAAG,IAAAC,eAAQ,EAAC,MAAMC,gCAAe,CAACC,SAAS,CAAC,CAAC,CAAC;EACzE,IAAAC,gBAAS,EAAC,MAAMF,gCAAe,CAACG,gBAAgB,CAACL,UAAU,CAAC,EAAE,EAAE,CAAC;EACjE,oBACE,IAAAP,WAAA,CAAAa,GAAA,EAAChB,SAAA,CAAAiB,QAAQ;IACPT,IAAI,EAAEA,IAAK;IACXU,KAAK,EAAET,OAAO,GAAGL,oBAAoB,GAAGE;EAAsB,CAC/D,CAAC;AAEN;AAEA,SAASa,cAAcA,CAAA,EAAG;EACxB,OAAO,IAAI;AACb;;AAEA;AACO,MAAMC,WAAW,GAAAf,OAAA,CAAAe,WAAA,GAAG;EACzBC,EAAE,EAAE,QAAQ;EACZC,IAAI,EAAE,QAAQ;EACdC,WAAW,EAAE,yCAAyC;EACtDC,IAAI,EAAE,KAAc;EACpBC,IAAI,EAAElB,eAAe;EACrBmB,SAAS,EAAEP,cAAc;EACzBQ,KAAK,EAAE,CAAC,CAAC;EACTC,UAAU,EAAE,aAAsB;EAClCC,OAAO,EAAEA,CAAA,KAAM;IACbjB,gCAAe,CAACF,UAAU,CAAC,CAACE,gCAAe,CAACC,SAAS,CAAC,CAAC,CAAC;EAC1D;AACF,CAAC;;AAED;AACO,MAAMiB,gBAAgB,GAAAzB,OAAA,CAAAyB,gBAAA,GAAG;EAC9BT,EAAE,EAAE,cAAc;EAClBC,IAAI,EAAE,OAAO;EACbC,WAAW,EAAE,qCAAqC;EAClDC,IAAI,EAAE,MAAe;EACrBC,IAAI,EAAEA,CAAC;IAAEjB;EAAuB,CAAC,kBAC/B,IAAAL,WAAA,CAAAa,GAAA,EAAChB,SAAA,CAAAiB,QAAQ;IAACT,IAAI,EAAEA,IAAK;IAACU,KAAK,EAAEd;EAAqB,CAAE,CACrD;EACDsB,SAAS,EAAEK,sBAAU;EACrBJ,KAAK,EAAE;IACLK,2BAA2B,EAAE;EAC/B;AACF,CAAC","ignoreList":[]}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * @buoy-gg/js-top — live Task Manager for the React Native JS thread.
5
+ *
6
+ * Pure JS (Expo Go + release compatible): wraps timers / rAF / microtasks /
7
+ * Promise reactions / legacy-bridge call-ins and books exclusive time per
8
+ * scheduling origin; a calibrated busy probe measures true thread occupancy
9
+ * so unattributable work is surfaced honestly instead of hidden.
10
+ *
11
+ * Coverage tiers beyond the core (promises, bridge, longtask correlation)
12
+ * are registered here at module scope — the controller installs them lazily
13
+ * on first engine start, so importing this package costs nothing until a
14
+ * viewer opens the tool.
15
+ */
16
+
17
+ import { JsTopController } from "./js-top/engine/JsTopController";
18
+ import { installPromisePatches } from "./js-top/engine/patches/promises";
19
+ import { installBridgePatch } from "./js-top/engine/patches/bridge";
20
+ import { installTimerPatches } from "./js-top/engine/patches/timers";
21
+ import { installMicrotaskPatches } from "./js-top/engine/patches/microtasks";
22
+ import { clearLongtasks, getFreezeStats, getLongtasks, installLongtaskObserver } from "./js-top/engine/longtasks";
23
+ JsTopController.registerTierInstaller(installPromisePatches);
24
+ JsTopController.registerTierInstaller(installBridgePatch);
25
+ JsTopController.registerTierInstaller(installLongtaskObserver);
26
+ JsTopController.registerLongtaskProvider(getLongtasks);
27
+ JsTopController.registerFreezeStatsProvider(getFreezeStats);
28
+ JsTopController.registerClearHook(clearLongtasks);
29
+
30
+ // Timer/microtask patches install at import so callbacks scheduled at APP
31
+ // BOOT — the classic forgotten setInterval, the tool's #1 target — are
32
+ // wrapped and attributable the moment any viewer opens the tool. Wrappers
33
+ // resolve their origin lazily and cost one boolean per fire while the
34
+ // engine is off. (Promise/bridge patches are more invasive and stay lazy —
35
+ // they install on first engine start and cover work scheduled after it.)
36
+ try {
37
+ installTimerPatches();
38
+ installMicrotaskPatches();
39
+ } catch {
40
+ // Never let instrumentation break an app at import time.
41
+ }
42
+ export { JsTopController } from "./js-top/engine/JsTopController";
43
+ export { jsTopSyncAdapter } from "./js-top/sync/jsTopSyncAdapter";
44
+ export { JsTopModal } from "./js-top/components/JsTopModal";
45
+ export { JsTopHudOverlay } from "./js-top/components/JsTopHudOverlay";
46
+ export { jsTopPreset, jsTopModalPreset, JS_TOP_ENABLED_COLOR, JS_TOP_DISABLED_COLOR } from "./preset";
47
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["JsTopController","installPromisePatches","installBridgePatch","installTimerPatches","installMicrotaskPatches","clearLongtasks","getFreezeStats","getLongtasks","installLongtaskObserver","registerTierInstaller","registerLongtaskProvider","registerFreezeStatsProvider","registerClearHook","jsTopSyncAdapter","JsTopModal","JsTopHudOverlay","jsTopPreset","jsTopModalPreset","JS_TOP_ENABLED_COLOR","JS_TOP_DISABLED_COLOR"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,eAAe,QAAQ,iCAAiC;AACjE,SAASC,qBAAqB,QAAQ,kCAAkC;AACxE,SAASC,kBAAkB,QAAQ,gCAAgC;AACnE,SAASC,mBAAmB,QAAQ,gCAAgC;AACpE,SAASC,uBAAuB,QAAQ,oCAAoC;AAC5E,SACEC,cAAc,EACdC,cAAc,EACdC,YAAY,EACZC,uBAAuB,QAClB,2BAA2B;AAElCR,eAAe,CAACS,qBAAqB,CAACR,qBAAqB,CAAC;AAC5DD,eAAe,CAACS,qBAAqB,CAACP,kBAAkB,CAAC;AACzDF,eAAe,CAACS,qBAAqB,CAACD,uBAAuB,CAAC;AAC9DR,eAAe,CAACU,wBAAwB,CAACH,YAAY,CAAC;AACtDP,eAAe,CAACW,2BAA2B,CAACL,cAAc,CAAC;AAC3DN,eAAe,CAACY,iBAAiB,CAACP,cAAc,CAAC;;AAEjD;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;EACFF,mBAAmB,CAAC,CAAC;EACrBC,uBAAuB,CAAC,CAAC;AAC3B,CAAC,CAAC,MAAM;EACN;AAAA;AAGF,SAASJ,eAAe,QAAQ,iCAAiC;AACjE,SAASa,gBAAgB,QAAQ,gCAAgC;AACjE,SAASC,UAAU,QAAQ,gCAAgC;AAK3D,SAASC,eAAe,QAAQ,qCAAqC;AACrE,SACEC,WAAW,EACXC,gBAAgB,EAChBC,oBAAoB,EACpBC,qBAAqB,QAChB,UAAU","ignoreList":[]}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Busy% history sparkline — plain View bars (no SVG dependency), tinted by
5
+ * severity. Renders at most the trailing 60 buckets (15s).
6
+ */
7
+
8
+ import { memo } from "react";
9
+ import { StyleSheet, View } from "react-native";
10
+ import { macOSColors } from "@buoy-gg/shared-ui";
11
+ import { jsx as _jsx } from "react/jsx-runtime";
12
+ const MAX_POINTS = 60;
13
+ function barColor(pct) {
14
+ if (pct >= 80) return macOSColors.semantic.error;
15
+ if (pct >= 40) return macOSColors.semantic.warning;
16
+ return macOSColors.semantic.success;
17
+ }
18
+ export const BusySparkline = /*#__PURE__*/memo(function BusySparkline({
19
+ history
20
+ }) {
21
+ const points = history.slice(-MAX_POINTS);
22
+ return /*#__PURE__*/_jsx(View, {
23
+ style: styles.row,
24
+ pointerEvents: "none",
25
+ children: points.map((pct, i) => /*#__PURE__*/_jsx(View
26
+ // Bars are positional by nature (a scrolling time axis); the array
27
+ // is fixed-length and rewritten wholesale each tick, so positional
28
+ // keys are correct here — this is not a prepend-list.
29
+ , {
30
+ style: [styles.bar, {
31
+ height: Math.max(2, pct / 100 * 28),
32
+ backgroundColor: barColor(pct)
33
+ }]
34
+ }, `b${i}`))
35
+ });
36
+ });
37
+ const styles = StyleSheet.create({
38
+ row: {
39
+ flexDirection: "row",
40
+ alignItems: "flex-end",
41
+ gap: 1,
42
+ height: 28,
43
+ alignSelf: "stretch"
44
+ },
45
+ bar: {
46
+ flex: 1,
47
+ maxWidth: 6,
48
+ borderRadius: 1,
49
+ opacity: 0.9
50
+ }
51
+ });
52
+ //# sourceMappingURL=BusySparkline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["memo","StyleSheet","View","macOSColors","jsx","_jsx","MAX_POINTS","barColor","pct","semantic","error","warning","success","BusySparkline","history","points","slice","style","styles","row","pointerEvents","children","map","i","bar","height","Math","max","backgroundColor","create","flexDirection","alignItems","gap","alignSelf","flex","maxWidth","borderRadius","opacity"],"sourceRoot":"../../../../src","sources":["js-top/components/BusySparkline.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;;AAEA,SAASA,IAAI,QAAQ,OAAO;AAC5B,SAASC,UAAU,EAAEC,IAAI,QAAQ,cAAc;AAC/C,SAASC,WAAW,QAAQ,oBAAoB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAEjD,MAAMC,UAAU,GAAG,EAAE;AAErB,SAASC,QAAQA,CAACC,GAAW,EAAU;EACrC,IAAIA,GAAG,IAAI,EAAE,EAAE,OAAOL,WAAW,CAACM,QAAQ,CAACC,KAAK;EAChD,IAAIF,GAAG,IAAI,EAAE,EAAE,OAAOL,WAAW,CAACM,QAAQ,CAACE,OAAO;EAClD,OAAOR,WAAW,CAACM,QAAQ,CAACG,OAAO;AACrC;AAEA,OAAO,MAAMC,aAAa,gBAAGb,IAAI,CAAC,SAASa,aAAaA,CAAC;EACvDC;AAGF,CAAC,EAAE;EACD,MAAMC,MAAM,GAAGD,OAAO,CAACE,KAAK,CAAC,CAACV,UAAU,CAAC;EACzC,oBACED,IAAA,CAACH,IAAI;IAACe,KAAK,EAAEC,MAAM,CAACC,GAAI;IAACC,aAAa,EAAC,MAAM;IAAAC,QAAA,EAC1CN,MAAM,CAACO,GAAG,CAAC,CAACd,GAAG,EAAEe,CAAC,kBACjBlB,IAAA,CAACH;IACC;IACA;IACA;IAAA;MAEAe,KAAK,EAAE,CACLC,MAAM,CAACM,GAAG,EACV;QACEC,MAAM,EAAEC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAGnB,GAAG,GAAG,GAAG,GAAI,EAAE,CAAC;QACrCoB,eAAe,EAAErB,QAAQ,CAACC,GAAG;MAC/B,CAAC;IACD,GAPG,IAAIe,CAAC,EAQX,CACF;EAAC,CACE,CAAC;AAEX,CAAC,CAAC;AAEF,MAAML,MAAM,GAAGjB,UAAU,CAAC4B,MAAM,CAAC;EAC/BV,GAAG,EAAE;IACHW,aAAa,EAAE,KAAK;IACpBC,UAAU,EAAE,UAAU;IACtBC,GAAG,EAAE,CAAC;IACNP,MAAM,EAAE,EAAE;IACVQ,SAAS,EAAE;EACb,CAAC;EACDT,GAAG,EAAE;IACHU,IAAI,EAAE,CAAC;IACPC,QAAQ,EAAE,CAAC;IACXC,YAAY,EAAE,CAAC;IACfC,OAAO,EAAE;EACX;AACF,CAAC,CAAC","ignoreList":[]}