@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,325 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * TaskDetailView — the "inspect process" screen behind a row tap.
5
+ *
6
+ * Shows everything the engine knows about one origin: a 5s activity bar
7
+ * chart (the per-origin bucket ring, rendered nowhere else), the full stat
8
+ * grid (schedules vs runs, avg/max/total, freezes), the captured scheduling
9
+ * site (caller + raw frames), and a plain-language explanation of what this
10
+ * origin type means. Data refreshes with the modal's snapshot tick — the
11
+ * parent re-renders us and we re-pull the detail.
12
+ */
13
+
14
+ import { memo } from "react";
15
+ import { ScrollView, StyleSheet, Text, View } from "react-native";
16
+ import { macOSColors, useSafeAreaInsets } from "@buoy-gg/shared-ui";
17
+ import { badgeFor, displayName } from "./TaskTable";
18
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
19
+ const API_EXPLAINER = {
20
+ timeout: "Work scheduled with setTimeout. Time shown is the callback's exclusive run time on the JS thread.",
21
+ interval: "A repeating setInterval. One scheduling site, many runs — a hot interval is the classic silent JS-FPS killer.",
22
+ immediate: "Work scheduled with setImmediate — runs at the end of the current event-loop turn.",
23
+ raf: "requestAnimationFrame work — runs once per frame while scheduled. Cost here directly trades against 60fps.",
24
+ microtask: "queueMicrotask work — runs after the current task, before the thread yields.",
25
+ then: "Promise reaction (.then/.catch/.finally). Named by the function that attached the reaction. Note: async/await bodies bypass .then and land in the System row instead.",
26
+ bridge: "A native→JS call-in over the legacy bridge (events, module callbacks), measured as its un-nested remainder.",
27
+ unattributed: "Thread time the probe measured but no JS wrapper could claim: touch handlers, React commits, native call-ins, and async/await bodies. High here on New Architecture is normal — it's where UI work lives.",
28
+ other: "Origins evicted from the table when the registry hit its cap — their totals are preserved here."
29
+ };
30
+ function explainerFor(api) {
31
+ return API_EXPLAINER[api] ?? API_EXPLAINER.other;
32
+ }
33
+ function fmt(n) {
34
+ if (n >= 10_000) return `${Math.round(n / 1000)}k`;
35
+ if (n >= 1000) return `${(n / 1000).toFixed(1)}k`;
36
+ if (n >= 100) return `${Math.round(n)}`;
37
+ return `${Math.round(n * 100) / 100}`;
38
+ }
39
+ function agoFmt(ms) {
40
+ if (ms <= 0) return "—";
41
+ const sec = ms / 1000;
42
+ if (sec < 1) return "just now";
43
+ if (sec < 60) return `${Math.round(sec)}s ago`;
44
+ return `${Math.floor(sec / 60)}m ago`;
45
+ }
46
+ function Stat({
47
+ label,
48
+ value,
49
+ accent
50
+ }) {
51
+ return /*#__PURE__*/_jsxs(View, {
52
+ style: styles.stat,
53
+ children: [/*#__PURE__*/_jsx(Text, {
54
+ style: styles.statLabel,
55
+ children: label
56
+ }), /*#__PURE__*/_jsx(Text, {
57
+ style: [styles.statValue, accent ? {
58
+ color: accent
59
+ } : null],
60
+ children: value
61
+ })]
62
+ });
63
+ }
64
+ export const TaskDetailView = /*#__PURE__*/memo(function TaskDetailView({
65
+ detail
66
+ }) {
67
+ const badge = badgeFor(detail.api);
68
+ const insets = useSafeAreaInsets({
69
+ minBottom: 12
70
+ });
71
+ const maxBucket = Math.max(1, ...detail.buckets);
72
+ return /*#__PURE__*/_jsxs(ScrollView, {
73
+ style: styles.root,
74
+ contentContainerStyle: {
75
+ paddingBottom: insets.bottom
76
+ },
77
+ children: [/*#__PURE__*/_jsxs(View, {
78
+ style: styles.identityRow,
79
+ children: [/*#__PURE__*/_jsx(View, {
80
+ style: [styles.badge, {
81
+ borderColor: badge.color,
82
+ backgroundColor: `${badge.color}1A`
83
+ }],
84
+ children: /*#__PURE__*/_jsx(Text, {
85
+ style: [styles.badgeText, {
86
+ color: badge.color
87
+ }],
88
+ children: badge.text
89
+ })
90
+ }), /*#__PURE__*/_jsx(Text, {
91
+ style: styles.name,
92
+ numberOfLines: 2,
93
+ children: displayName(detail)
94
+ })]
95
+ }), /*#__PURE__*/_jsx(Text, {
96
+ style: styles.explainer,
97
+ children: explainerFor(detail.api)
98
+ }), /*#__PURE__*/_jsx(Text, {
99
+ style: styles.sectionTitle,
100
+ children: "ACTIVITY \xB7 LAST 5S"
101
+ }), /*#__PURE__*/_jsx(View, {
102
+ style: styles.chartRow,
103
+ children: detail.buckets.map((ms, i) => /*#__PURE__*/_jsx(View, {
104
+ style: styles.chartBarSlot,
105
+ children: /*#__PURE__*/_jsx(View, {
106
+ style: [styles.chartBar, {
107
+ height: Math.max(2, ms / maxBucket * 44),
108
+ backgroundColor: badge.color
109
+ }]
110
+ })
111
+ }, `bk${i}`))
112
+ }), /*#__PURE__*/_jsxs(View, {
113
+ style: styles.chartLegend,
114
+ children: [/*#__PURE__*/_jsxs(Text, {
115
+ style: styles.chartLegendText,
116
+ children: [fmt(detail.windowMs), " ms in window \xB7 ", detail.pctOfBusy.toFixed(1), "% of busy time"]
117
+ }), /*#__PURE__*/_jsxs(Text, {
118
+ style: styles.chartLegendText,
119
+ children: ["peak ", fmt(maxBucket), " ms/250ms"]
120
+ })]
121
+ }), /*#__PURE__*/_jsx(Text, {
122
+ style: styles.sectionTitle,
123
+ children: "STATS \xB7 SINCE START"
124
+ }), /*#__PURE__*/_jsxs(View, {
125
+ style: styles.statGrid,
126
+ children: [/*#__PURE__*/_jsx(Stat, {
127
+ label: "RUNS",
128
+ value: detail.calls > 0 ? fmt(detail.calls) : "—"
129
+ }), /*#__PURE__*/_jsx(Stat, {
130
+ label: "SCHEDULED",
131
+ value: detail.scheduleCount > 0 ? fmt(detail.scheduleCount) : "—"
132
+ }), /*#__PURE__*/_jsx(Stat, {
133
+ label: "AVG / RUN",
134
+ value: detail.calls > 0 ? `${fmt(detail.avgMs)} ms` : "—"
135
+ }), /*#__PURE__*/_jsx(Stat, {
136
+ label: "MAX / RUN",
137
+ value: detail.maxMs > 0 ? `${fmt(detail.maxMs)} ms` : "—",
138
+ accent: detail.maxMs >= 50 ? macOSColors.semantic.warning : undefined
139
+ }), /*#__PURE__*/_jsx(Stat, {
140
+ label: "TOTAL",
141
+ value: detail.totalMs > 0 ? `${fmt(detail.totalMs)} ms` : "—"
142
+ }), /*#__PURE__*/_jsx(Stat, {
143
+ label: "LAST RUN",
144
+ value: agoFmt(detail.lastSeenAgoMs)
145
+ }), /*#__PURE__*/_jsx(Stat, {
146
+ label: "FREEZES \xB7 60S",
147
+ value: detail.freezes > 0 ? `${detail.freezes}` : "0",
148
+ accent: detail.freezes > 0 ? macOSColors.semantic.error : undefined
149
+ }), /*#__PURE__*/_jsx(Stat, {
150
+ label: "WORST FREEZE",
151
+ value: detail.worstFreezeMs > 0 ? `${detail.worstFreezeMs} ms` : "—",
152
+ accent: detail.worstFreezeMs >= 100 ? macOSColors.semantic.error : detail.worstFreezeMs > 0 ? macOSColors.semantic.warning : undefined
153
+ })]
154
+ }), (detail.caller || (detail.frames?.length ?? 0) > 0) && /*#__PURE__*/_jsxs(_Fragment, {
155
+ children: [/*#__PURE__*/_jsx(Text, {
156
+ style: styles.sectionTitle,
157
+ children: "SCHEDULED FROM"
158
+ }), /*#__PURE__*/_jsxs(View, {
159
+ style: styles.siteCard,
160
+ children: [detail.caller && /*#__PURE__*/_jsxs(Text, {
161
+ style: styles.siteCaller,
162
+ children: [detail.caller, "()"]
163
+ }), detail.file && /*#__PURE__*/_jsxs(Text, {
164
+ style: styles.siteFile,
165
+ children: [detail.file, detail.line != null ? `:${detail.line}` : ""]
166
+ }), detail.frames?.map((f, i) => /*#__PURE__*/_jsxs(Text, {
167
+ style: styles.siteFrame,
168
+ numberOfLines: 1,
169
+ children: [f.file, ":", f.line, ":", f.col]
170
+ }, `fr${i}`)), /*#__PURE__*/_jsx(Text, {
171
+ style: styles.siteNote,
172
+ children: "Frames are bundle offsets (Hermes) \u2014 the caller name above is the readable part. Captured once when this origin got hot."
173
+ })]
174
+ })]
175
+ }), !detail.caller && (detail.frames?.length ?? 0) === 0 && detail.api !== "unattributed" && detail.api !== "other" && /*#__PURE__*/_jsxs(_Fragment, {
176
+ children: [/*#__PURE__*/_jsx(Text, {
177
+ style: styles.sectionTitle,
178
+ children: "SCHEDULED FROM"
179
+ }), /*#__PURE__*/_jsx(Text, {
180
+ style: styles.sitePending,
181
+ children: detail.promoted ? "Stack capture pending — next schedule from this site will record it." : "Not hot enough yet — the scheduling stack is captured once an origin passes 25 schedules or 50ms total."
182
+ })]
183
+ })]
184
+ });
185
+ });
186
+ const styles = StyleSheet.create({
187
+ root: {
188
+ flex: 1,
189
+ backgroundColor: macOSColors.background.base,
190
+ paddingHorizontal: 12
191
+ },
192
+ identityRow: {
193
+ flexDirection: "row",
194
+ alignItems: "center",
195
+ gap: 8,
196
+ paddingTop: 12
197
+ },
198
+ badge: {
199
+ borderWidth: 1,
200
+ borderRadius: 3,
201
+ paddingHorizontal: 5,
202
+ paddingVertical: 2
203
+ },
204
+ badgeText: {
205
+ fontSize: 9,
206
+ fontWeight: "700",
207
+ letterSpacing: 0.4
208
+ },
209
+ name: {
210
+ flex: 1,
211
+ color: macOSColors.text.primary,
212
+ fontSize: 15,
213
+ fontWeight: "600"
214
+ },
215
+ explainer: {
216
+ color: macOSColors.text.muted,
217
+ fontSize: 11,
218
+ lineHeight: 15,
219
+ marginTop: 6,
220
+ marginBottom: 4
221
+ },
222
+ sectionTitle: {
223
+ color: macOSColors.text.muted,
224
+ fontSize: 9,
225
+ fontWeight: "700",
226
+ letterSpacing: 0.5,
227
+ marginTop: 14,
228
+ marginBottom: 6
229
+ },
230
+ chartRow: {
231
+ flexDirection: "row",
232
+ alignItems: "flex-end",
233
+ height: 48,
234
+ gap: 2,
235
+ backgroundColor: macOSColors.background.card,
236
+ borderRadius: 6,
237
+ borderWidth: 1,
238
+ borderColor: macOSColors.border.default,
239
+ paddingHorizontal: 6,
240
+ paddingTop: 2
241
+ },
242
+ chartBarSlot: {
243
+ flex: 1,
244
+ alignItems: "center",
245
+ justifyContent: "flex-end"
246
+ },
247
+ chartBar: {
248
+ width: "70%",
249
+ borderTopLeftRadius: 2,
250
+ borderTopRightRadius: 2,
251
+ opacity: 0.9
252
+ },
253
+ chartLegend: {
254
+ flexDirection: "row",
255
+ justifyContent: "space-between",
256
+ marginTop: 4
257
+ },
258
+ chartLegendText: {
259
+ color: macOSColors.text.muted,
260
+ fontSize: 10,
261
+ fontVariant: ["tabular-nums"]
262
+ },
263
+ statGrid: {
264
+ flexDirection: "row",
265
+ flexWrap: "wrap",
266
+ gap: 8
267
+ },
268
+ stat: {
269
+ width: "23%",
270
+ minWidth: 76,
271
+ flexGrow: 1,
272
+ backgroundColor: macOSColors.background.card,
273
+ borderWidth: 1,
274
+ borderColor: macOSColors.border.default,
275
+ borderRadius: 6,
276
+ paddingHorizontal: 8,
277
+ paddingVertical: 6
278
+ },
279
+ statLabel: {
280
+ color: macOSColors.text.muted,
281
+ fontSize: 8,
282
+ fontWeight: "700",
283
+ letterSpacing: 0.4,
284
+ marginBottom: 3
285
+ },
286
+ statValue: {
287
+ color: macOSColors.text.primary,
288
+ fontSize: 13,
289
+ fontWeight: "600",
290
+ fontVariant: ["tabular-nums"]
291
+ },
292
+ siteCard: {
293
+ backgroundColor: macOSColors.background.card,
294
+ borderWidth: 1,
295
+ borderColor: macOSColors.border.default,
296
+ borderRadius: 6,
297
+ padding: 10,
298
+ gap: 3
299
+ },
300
+ siteCaller: {
301
+ color: macOSColors.text.primary,
302
+ fontSize: 13,
303
+ fontWeight: "600"
304
+ },
305
+ siteFile: {
306
+ color: macOSColors.semantic.info,
307
+ fontSize: 11
308
+ },
309
+ siteFrame: {
310
+ color: macOSColors.text.muted,
311
+ fontSize: 10,
312
+ fontVariant: ["tabular-nums"]
313
+ },
314
+ siteNote: {
315
+ color: macOSColors.text.muted,
316
+ fontSize: 9,
317
+ opacity: 0.8,
318
+ marginTop: 4
319
+ },
320
+ sitePending: {
321
+ color: macOSColors.text.muted,
322
+ fontSize: 11
323
+ }
324
+ });
325
+ //# sourceMappingURL=TaskDetailView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["memo","ScrollView","StyleSheet","Text","View","macOSColors","useSafeAreaInsets","badgeFor","displayName","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","API_EXPLAINER","timeout","interval","immediate","raf","microtask","then","bridge","unattributed","other","explainerFor","api","fmt","n","Math","round","toFixed","agoFmt","ms","sec","floor","Stat","label","value","accent","style","styles","stat","children","statLabel","statValue","color","TaskDetailView","detail","badge","insets","minBottom","maxBucket","max","buckets","root","contentContainerStyle","paddingBottom","bottom","identityRow","borderColor","backgroundColor","badgeText","text","name","numberOfLines","explainer","sectionTitle","chartRow","map","i","chartBarSlot","chartBar","height","chartLegend","chartLegendText","windowMs","pctOfBusy","statGrid","calls","scheduleCount","avgMs","maxMs","semantic","warning","undefined","totalMs","lastSeenAgoMs","freezes","error","worstFreezeMs","caller","frames","length","siteCard","siteCaller","file","siteFile","line","f","siteFrame","col","siteNote","sitePending","promoted","create","flex","background","base","paddingHorizontal","flexDirection","alignItems","gap","paddingTop","borderWidth","borderRadius","paddingVertical","fontSize","fontWeight","letterSpacing","primary","muted","lineHeight","marginTop","marginBottom","card","border","default","justifyContent","width","borderTopLeftRadius","borderTopRightRadius","opacity","fontVariant","flexWrap","minWidth","flexGrow","padding","info"],"sourceRoot":"../../../../src","sources":["js-top/components/TaskDetailView.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,353 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * The ranked task table — the "process list".
5
+ *
6
+ * Row layout (phone-first): the API is a small colored badge and the FULL
7
+ * width goes to the task name (the part that varies); numbers live on a
8
+ * second stats line instead of fixed-width columns, so nothing truncates:
9
+ *
10
+ * 1 [INTERVAL] hotIntervalWork 1240 ms 41%
11
+ * ▓▓▓▓▓░░░░░ 50 calls · avg 24.8 · max 31.0 · total 1.2k
12
+ *
13
+ * Sorting is a chip row above the list (column headers don't survive on a
14
+ * narrow screen). Rows keyed by origin key (never index: rows re-rank every
15
+ * tick) and memoized with a precise comparator so a tick only re-renders
16
+ * rows whose numbers moved.
17
+ */
18
+
19
+ import { memo, useState } from "react";
20
+ import { ScrollView, StyleSheet, Text, TouchableOpacity, View } from "react-native";
21
+ import { macOSColors } from "@buoy-gg/shared-ui";
22
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
23
+ const SORT_OPTIONS = [{
24
+ key: "windowMs",
25
+ title: "RECENT"
26
+ }, {
27
+ key: "calls",
28
+ title: "CALLS"
29
+ }, {
30
+ key: "avgMs",
31
+ title: "AVG"
32
+ }, {
33
+ key: "maxMs",
34
+ title: "MAX"
35
+ }, {
36
+ key: "totalMs",
37
+ title: "TOTAL"
38
+ }];
39
+ export const API_BADGE = {
40
+ timeout: {
41
+ text: "TIMEOUT",
42
+ color: "#38BDF8",
43
+ prefix: "setTimeout"
44
+ },
45
+ interval: {
46
+ text: "INTERVAL",
47
+ color: "#22D3EE",
48
+ prefix: "setInterval"
49
+ },
50
+ immediate: {
51
+ text: "IMMED",
52
+ color: "#60A5FA",
53
+ prefix: "setImmediate"
54
+ },
55
+ raf: {
56
+ text: "RAF",
57
+ color: "#34D399",
58
+ prefix: "requestAnimationFrame"
59
+ },
60
+ microtask: {
61
+ text: "MICRO",
62
+ color: "#A78BFA",
63
+ prefix: "queueMicrotask"
64
+ },
65
+ then: {
66
+ text: "PROMISE",
67
+ color: "#BF5AF2",
68
+ prefix: "Promise.then"
69
+ },
70
+ bridge: {
71
+ text: "BRIDGE",
72
+ color: "#FBBF24",
73
+ prefix: "bridge"
74
+ },
75
+ unattributed: {
76
+ text: "SYSTEM",
77
+ color: "#8E8E93"
78
+ },
79
+ other: {
80
+ text: "OTHER",
81
+ color: "#8E8E93",
82
+ prefix: "other"
83
+ }
84
+ };
85
+ export function badgeFor(api) {
86
+ return API_BADGE[api] ?? API_BADGE.other;
87
+ }
88
+
89
+ /** The row label minus its API prefix — the badge already says the API. */
90
+ export function displayName(row) {
91
+ if (row.api === "unattributed") return "events · React · native call-ins";
92
+ if (row.api === "other") return "evicted cold origins";
93
+ const prefix = badgeFor(row.api).prefix;
94
+ let name = row.label;
95
+ if (prefix && name.startsWith(prefix)) name = name.slice(prefix.length);
96
+ name = name.replace(/^[\s←@]+/, "").trim();
97
+ return name.length > 0 ? name : "anonymous";
98
+ }
99
+ function fmt(n) {
100
+ if (n >= 10_000) return `${Math.round(n / 1000)}k`;
101
+ if (n >= 1000) return `${(n / 1000).toFixed(1)}k`;
102
+ if (n >= 100) return `${Math.round(n)}`;
103
+ return `${Math.round(n * 10) / 10}`;
104
+ }
105
+ function statsLine(row) {
106
+ if (row.calls <= 0) return "measured by probe · not reachable from JS";
107
+ return `${fmt(row.calls)} calls · avg ${fmt(row.avgMs)} · max ${fmt(row.maxMs)} · total ${fmt(row.totalMs)} ms`;
108
+ }
109
+ const TaskRow = /*#__PURE__*/memo(function TaskRow({
110
+ row,
111
+ rank,
112
+ onPress
113
+ }) {
114
+ const badge = badgeFor(row.api);
115
+ const Wrapper = onPress ? TouchableOpacity : View;
116
+ return /*#__PURE__*/_jsxs(Wrapper, {
117
+ style: rowStyles.row,
118
+ ...(onPress ? {
119
+ onPress: () => onPress(row),
120
+ activeOpacity: 0.6
121
+ } : {}),
122
+ children: [/*#__PURE__*/_jsxs(View, {
123
+ style: rowStyles.topLine,
124
+ children: [/*#__PURE__*/_jsx(Text, {
125
+ style: rowStyles.rank,
126
+ children: rank
127
+ }), /*#__PURE__*/_jsx(View, {
128
+ style: [rowStyles.badge, {
129
+ borderColor: badge.color,
130
+ backgroundColor: `${badge.color}1A`
131
+ }],
132
+ children: /*#__PURE__*/_jsx(Text, {
133
+ style: [rowStyles.badgeText, {
134
+ color: badge.color
135
+ }],
136
+ children: badge.text
137
+ })
138
+ }), /*#__PURE__*/_jsx(Text, {
139
+ style: rowStyles.name,
140
+ numberOfLines: 1,
141
+ children: displayName(row)
142
+ }), row.freezes > 0 && /*#__PURE__*/_jsxs(Text, {
143
+ style: [rowStyles.freezeBadge, row.worstFreezeMs >= 100 && rowStyles.freezeBadgeSevere],
144
+ children: ["\u26A0 \xD7", row.freezes]
145
+ }), /*#__PURE__*/_jsxs(Text, {
146
+ style: [rowStyles.windowMs, row.api !== "unattributed" && row.pctOfBusy >= 25 && {
147
+ color: row.pctOfBusy >= 50 ? macOSColors.semantic.error : macOSColors.semantic.warning
148
+ }],
149
+ children: [fmt(row.windowMs), /*#__PURE__*/_jsx(Text, {
150
+ style: rowStyles.unit,
151
+ children: " ms"
152
+ })]
153
+ }), /*#__PURE__*/_jsxs(Text, {
154
+ style: [rowStyles.pct, row.api === "unattributed" && rowStyles.pctMuted],
155
+ children: [Math.round(row.pctOfBusy), "%"]
156
+ })]
157
+ }), /*#__PURE__*/_jsxs(View, {
158
+ style: rowStyles.subLine,
159
+ children: [/*#__PURE__*/_jsx(View, {
160
+ style: rowStyles.barTrack,
161
+ children: /*#__PURE__*/_jsx(View, {
162
+ style: [rowStyles.barFill, {
163
+ width: `${Math.min(100, row.pctOfBusy)}%`,
164
+ backgroundColor: badge.color
165
+ }]
166
+ })
167
+ }), /*#__PURE__*/_jsx(Text, {
168
+ style: rowStyles.stats,
169
+ numberOfLines: 1,
170
+ children: statsLine(row)
171
+ })]
172
+ })]
173
+ });
174
+ }, (prev, next) => prev.rank === next.rank && prev.onPress === next.onPress && prev.row.key === next.row.key && prev.row.windowMs === next.row.windowMs && prev.row.calls === next.row.calls && prev.row.maxMs === next.row.maxMs && prev.row.totalMs === next.row.totalMs && prev.row.pctOfBusy === next.row.pctOfBusy && prev.row.freezes === next.row.freezes && prev.row.worstFreezeMs === next.row.worstFreezeMs);
175
+ export function TaskTable({
176
+ rows,
177
+ onSelectRow
178
+ }) {
179
+ const [sortKey, setSortKey] = useState("windowMs");
180
+ const sorted = sortKey === "windowMs" ? rows : [...rows].sort((a, b) => b[sortKey] - a[sortKey]);
181
+ return /*#__PURE__*/_jsxs(View, {
182
+ style: styles.root,
183
+ children: [/*#__PURE__*/_jsxs(View, {
184
+ style: styles.sortRow,
185
+ children: [/*#__PURE__*/_jsx(Text, {
186
+ style: styles.sortLabel,
187
+ children: "SORT"
188
+ }), SORT_OPTIONS.map(o => /*#__PURE__*/_jsx(TouchableOpacity, {
189
+ onPress: () => setSortKey(o.key),
190
+ style: [styles.sortChip, sortKey === o.key && styles.sortChipOn],
191
+ children: /*#__PURE__*/_jsx(Text, {
192
+ style: [styles.sortChipText, sortKey === o.key && styles.sortChipTextOn],
193
+ children: o.title
194
+ })
195
+ }, o.key))]
196
+ }), /*#__PURE__*/_jsxs(ScrollView, {
197
+ style: styles.body,
198
+ children: [sorted.map((row, i) => /*#__PURE__*/_jsx(TaskRow, {
199
+ row: row,
200
+ rank: i + 1,
201
+ onPress: onSelectRow
202
+ }, row.key)), sorted.length === 0 && /*#__PURE__*/_jsx(Text, {
203
+ style: styles.empty,
204
+ children: "No tasks observed yet \u2014 interact with the app."
205
+ })]
206
+ })]
207
+ });
208
+ }
209
+ const styles = StyleSheet.create({
210
+ root: {
211
+ flex: 1,
212
+ minHeight: 0
213
+ },
214
+ sortRow: {
215
+ flexDirection: "row",
216
+ alignItems: "center",
217
+ gap: 6,
218
+ paddingHorizontal: 10,
219
+ paddingVertical: 6,
220
+ borderBottomWidth: 1,
221
+ borderBottomColor: macOSColors.border.default,
222
+ backgroundColor: macOSColors.background.card
223
+ },
224
+ sortLabel: {
225
+ color: macOSColors.text.muted,
226
+ fontSize: 9,
227
+ fontWeight: "700",
228
+ letterSpacing: 0.5,
229
+ marginRight: 2
230
+ },
231
+ sortChip: {
232
+ borderWidth: 1,
233
+ borderColor: macOSColors.border.default,
234
+ borderRadius: 4,
235
+ paddingHorizontal: 7,
236
+ paddingVertical: 3
237
+ },
238
+ sortChipOn: {
239
+ borderColor: macOSColors.semantic.info,
240
+ backgroundColor: `${macOSColors.semantic.info}1A`
241
+ },
242
+ sortChipText: {
243
+ color: macOSColors.text.muted,
244
+ fontSize: 9,
245
+ fontWeight: "600",
246
+ fontVariant: ["tabular-nums"]
247
+ },
248
+ sortChipTextOn: {
249
+ color: macOSColors.semantic.info
250
+ },
251
+ body: {
252
+ flex: 1
253
+ },
254
+ empty: {
255
+ color: macOSColors.text.muted,
256
+ fontSize: 12,
257
+ textAlign: "center",
258
+ paddingVertical: 24
259
+ }
260
+ });
261
+ const rowStyles = StyleSheet.create({
262
+ row: {
263
+ paddingHorizontal: 10,
264
+ paddingVertical: 8,
265
+ borderBottomWidth: StyleSheet.hairlineWidth,
266
+ borderBottomColor: macOSColors.border.default,
267
+ gap: 5
268
+ },
269
+ topLine: {
270
+ flexDirection: "row",
271
+ alignItems: "center",
272
+ gap: 6
273
+ },
274
+ rank: {
275
+ width: 16,
276
+ color: macOSColors.text.muted,
277
+ fontSize: 10,
278
+ fontVariant: ["tabular-nums"]
279
+ },
280
+ badge: {
281
+ borderWidth: 1,
282
+ borderRadius: 3,
283
+ paddingHorizontal: 4,
284
+ paddingVertical: 1
285
+ },
286
+ badgeText: {
287
+ fontSize: 8,
288
+ fontWeight: "700",
289
+ letterSpacing: 0.4
290
+ },
291
+ name: {
292
+ flex: 1,
293
+ color: macOSColors.text.primary,
294
+ fontSize: 13,
295
+ fontWeight: "500"
296
+ },
297
+ freezeBadge: {
298
+ color: macOSColors.semantic.warning,
299
+ fontSize: 10,
300
+ fontWeight: "700",
301
+ fontVariant: ["tabular-nums"]
302
+ },
303
+ freezeBadgeSevere: {
304
+ color: macOSColors.semantic.error
305
+ },
306
+ windowMs: {
307
+ color: macOSColors.text.primary,
308
+ fontSize: 13,
309
+ fontWeight: "700",
310
+ fontVariant: ["tabular-nums"]
311
+ },
312
+ unit: {
313
+ color: macOSColors.text.muted,
314
+ fontSize: 10,
315
+ fontWeight: "400"
316
+ },
317
+ pct: {
318
+ width: 38,
319
+ textAlign: "right",
320
+ color: macOSColors.text.secondary,
321
+ fontSize: 12,
322
+ fontWeight: "600",
323
+ fontVariant: ["tabular-nums"]
324
+ },
325
+ pctMuted: {
326
+ color: macOSColors.text.muted
327
+ },
328
+ subLine: {
329
+ flexDirection: "row",
330
+ alignItems: "center",
331
+ gap: 8,
332
+ paddingLeft: 22
333
+ },
334
+ barTrack: {
335
+ width: 72,
336
+ height: 4,
337
+ borderRadius: 2,
338
+ backgroundColor: macOSColors.background.input,
339
+ overflow: "hidden"
340
+ },
341
+ barFill: {
342
+ height: 4,
343
+ borderRadius: 2,
344
+ opacity: 0.85
345
+ },
346
+ stats: {
347
+ flex: 1,
348
+ color: macOSColors.text.muted,
349
+ fontSize: 10,
350
+ fontVariant: ["tabular-nums"]
351
+ }
352
+ });
353
+ //# sourceMappingURL=TaskTable.js.map