@osdk/react-devtools 0.5.0

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 (443) hide show
  1. package/CHANGELOG.md +79 -0
  2. package/build/esm/DevToolsContext.js +19 -0
  3. package/build/esm/DevToolsContext.js.map +1 -0
  4. package/build/esm/components/ActionMetrics.js +89 -0
  5. package/build/esm/components/ActionMetrics.js.map +1 -0
  6. package/build/esm/components/BubbleChart.js +175 -0
  7. package/build/esm/components/BubbleChart.js.map +1 -0
  8. package/build/esm/components/BubbleChart.module.scss.js +6 -0
  9. package/build/esm/components/CacheInspectorTab.js +291 -0
  10. package/build/esm/components/CacheInspectorTab.js.map +1 -0
  11. package/build/esm/components/CacheInspectorTab.module.scss.js +39 -0
  12. package/build/esm/components/CacheMetrics.js +55 -0
  13. package/build/esm/components/CacheMetrics.js.map +1 -0
  14. package/build/esm/components/ComponentCard.js +124 -0
  15. package/build/esm/components/ComponentCard.js.map +1 -0
  16. package/build/esm/components/ComponentCard.module.scss.js +31 -0
  17. package/build/esm/components/ComputeTab.js +175 -0
  18. package/build/esm/components/ComputeTab.js.map +1 -0
  19. package/build/esm/components/CopyableCodeBlock.js +49 -0
  20. package/build/esm/components/CopyableCodeBlock.js.map +1 -0
  21. package/build/esm/components/CopyableCodeBlock.module.scss.js +10 -0
  22. package/build/esm/components/DebuggingTab.js +342 -0
  23. package/build/esm/components/DebuggingTab.js.map +1 -0
  24. package/build/esm/components/DebuggingTab.module.scss.js +18 -0
  25. package/build/esm/components/HookRow.js +180 -0
  26. package/build/esm/components/HookRow.js.map +1 -0
  27. package/build/esm/components/HookRow.module.scss.js +16 -0
  28. package/build/esm/components/ImprovementsTab.js +138 -0
  29. package/build/esm/components/ImprovementsTab.js.map +1 -0
  30. package/build/esm/components/ImprovementsTab.module.scss.js +30 -0
  31. package/build/esm/components/InspectorSelectionHeader.js +65 -0
  32. package/build/esm/components/InspectorSelectionHeader.js.map +1 -0
  33. package/build/esm/components/InterceptTab.js +862 -0
  34. package/build/esm/components/InterceptTab.js.map +1 -0
  35. package/build/esm/components/InterceptTab.module.scss.js +49 -0
  36. package/build/esm/components/IssueCard.js +115 -0
  37. package/build/esm/components/IssueCard.js.map +1 -0
  38. package/build/esm/components/IssueCard.module.scss.js +24 -0
  39. package/build/esm/components/LogEntryCard.js +94 -0
  40. package/build/esm/components/LogEntryCard.js.map +1 -0
  41. package/build/esm/components/LogEntryCard.module.scss.js +19 -0
  42. package/build/esm/components/MockEditor.js +316 -0
  43. package/build/esm/components/MockEditor.js.map +1 -0
  44. package/build/esm/components/MonitorErrorBoundary.js +64 -0
  45. package/build/esm/components/MonitorErrorBoundary.js.map +1 -0
  46. package/build/esm/components/MonitorErrorBoundary.module.scss.js +9 -0
  47. package/build/esm/components/MonitoringPanel.js +434 -0
  48. package/build/esm/components/MonitoringPanel.js.map +1 -0
  49. package/build/esm/components/MonitoringPanel.module.scss.js +81 -0
  50. package/build/esm/components/ObjectLoadingMetrics.js +60 -0
  51. package/build/esm/components/ObjectLoadingMetrics.js.map +1 -0
  52. package/build/esm/components/OsdkAppErrorBoundary.js +68 -0
  53. package/build/esm/components/OsdkAppErrorBoundary.js.map +1 -0
  54. package/build/esm/components/OsdkDevTools.js +40 -0
  55. package/build/esm/components/OsdkDevTools.js.map +1 -0
  56. package/build/esm/components/OverrideEditor.js +197 -0
  57. package/build/esm/components/OverrideEditor.js.map +1 -0
  58. package/build/esm/components/PerformanceTab.js +297 -0
  59. package/build/esm/components/PerformanceTab.js.map +1 -0
  60. package/build/esm/components/PrimitiveSelectionPanel.js +220 -0
  61. package/build/esm/components/PrimitiveSelectionPanel.js.map +1 -0
  62. package/build/esm/components/PrimitiveSelectionPanel.module.scss.js +26 -0
  63. package/build/esm/components/issueTypes.js +2 -0
  64. package/build/esm/components/issueTypes.js.map +1 -0
  65. package/build/esm/components/resolveComponentName.js +57 -0
  66. package/build/esm/components/resolveComponentName.js.map +1 -0
  67. package/build/esm/components/testHelpers.js +312 -0
  68. package/build/esm/components/testHelpers.js.map +1 -0
  69. package/build/esm/css.d.ts +20 -0
  70. package/build/esm/fiber/DegradationNotice.js +193 -0
  71. package/build/esm/fiber/DegradationNotice.js.map +1 -0
  72. package/build/esm/fiber/DevtoolsHook.js +252 -0
  73. package/build/esm/fiber/DevtoolsHook.js.map +1 -0
  74. package/build/esm/fiber/FiberAccess.js +65 -0
  75. package/build/esm/fiber/FiberAccess.js.map +1 -0
  76. package/build/esm/fiber/FiberInspection.js +140 -0
  77. package/build/esm/fiber/FiberInspection.js.map +1 -0
  78. package/build/esm/fiber/FiberTags.js +52 -0
  79. package/build/esm/fiber/FiberTags.js.map +1 -0
  80. package/build/esm/fiber/HookStateInspector.js +254 -0
  81. package/build/esm/fiber/HookStateInspector.js.map +1 -0
  82. package/build/esm/fiber/SafeFiberOperation.js +35 -0
  83. package/build/esm/fiber/SafeFiberOperation.js.map +1 -0
  84. package/build/esm/fiber/capabilities.js +180 -0
  85. package/build/esm/fiber/capabilities.js.map +1 -0
  86. package/build/esm/fiber/traverseFiber.js +129 -0
  87. package/build/esm/fiber/traverseFiber.js.map +1 -0
  88. package/build/esm/fiber/types.js +2 -0
  89. package/build/esm/fiber/types.js.map +1 -0
  90. package/build/esm/fiber/validation.js +155 -0
  91. package/build/esm/fiber/validation.js.map +1 -0
  92. package/build/esm/hooks/createPollingStore.js +81 -0
  93. package/build/esm/hooks/createPollingStore.js.map +1 -0
  94. package/build/esm/hooks/useActiveComponents.js +27 -0
  95. package/build/esm/hooks/useActiveComponents.js.map +1 -0
  96. package/build/esm/hooks/useComponentRegistry.js +25 -0
  97. package/build/esm/hooks/useComponentRegistry.js.map +1 -0
  98. package/build/esm/hooks/useComputeSelectors.js +43 -0
  99. package/build/esm/hooks/useComputeSelectors.js.map +1 -0
  100. package/build/esm/hooks/useConsoleLogs.js +46 -0
  101. package/build/esm/hooks/useConsoleLogs.js.map +1 -0
  102. package/build/esm/hooks/useInspectorSelection.js +93 -0
  103. package/build/esm/hooks/useInspectorSelection.js.map +1 -0
  104. package/build/esm/hooks/useMetrics.js +23 -0
  105. package/build/esm/hooks/useMetrics.js.map +1 -0
  106. package/build/esm/hooks/usePersistedState.js +89 -0
  107. package/build/esm/hooks/usePersistedState.js.map +1 -0
  108. package/build/esm/hooks/useRecommendations.js +123 -0
  109. package/build/esm/hooks/useRecommendations.js.map +1 -0
  110. package/build/esm/hooks/useSharedTick.js +49 -0
  111. package/build/esm/hooks/useSharedTick.js.map +1 -0
  112. package/build/esm/hooks/useTimeElapsed.js +51 -0
  113. package/build/esm/hooks/useTimeElapsed.js.map +1 -0
  114. package/build/esm/hooks/useTrackerSubscription.js +97 -0
  115. package/build/esm/hooks/useTrackerSubscription.js.map +1 -0
  116. package/build/esm/hooks/useUnusedFieldAnalysis.js +99 -0
  117. package/build/esm/hooks/useUnusedFieldAnalysis.js.map +1 -0
  118. package/build/esm/index.js +31 -0
  119. package/build/esm/index.js.map +1 -0
  120. package/build/esm/inspector/ClickToInspectSystem.js +228 -0
  121. package/build/esm/inspector/ClickToInspectSystem.js.map +1 -0
  122. package/build/esm/inspector/components/ComponentLabel.js +175 -0
  123. package/build/esm/inspector/components/ComponentLabel.js.map +1 -0
  124. package/build/esm/inspector/components/ComponentLabel.module.scss.js +12 -0
  125. package/build/esm/inspector/components/InspectorBanner.js +79 -0
  126. package/build/esm/inspector/components/InspectorBanner.js.map +1 -0
  127. package/build/esm/inspector/components/InspectorOverlay.js +149 -0
  128. package/build/esm/inspector/components/InspectorOverlay.js.map +1 -0
  129. package/build/esm/inspector/components/SelectionHighlight.js +74 -0
  130. package/build/esm/inspector/components/SelectionHighlight.js.map +1 -0
  131. package/build/esm/inspector/createClickToInspect.js +21 -0
  132. package/build/esm/inspector/createClickToInspect.js.map +1 -0
  133. package/build/esm/inspector/hooks/useAnimatedBounds.js +167 -0
  134. package/build/esm/inspector/hooks/useAnimatedBounds.js.map +1 -0
  135. package/build/esm/inspector/index.js +40 -0
  136. package/build/esm/inspector/index.js.map +1 -0
  137. package/build/esm/inspector/inspectorController.js +328 -0
  138. package/build/esm/inspector/inspectorController.js.map +1 -0
  139. package/build/esm/inspector/types.js +2 -0
  140. package/build/esm/inspector/types.js.map +1 -0
  141. package/build/esm/inspector/utils/elementBounds.js +72 -0
  142. package/build/esm/inspector/utils/elementBounds.js.map +1 -0
  143. package/build/esm/inspector/utils/interpolation.js +26 -0
  144. package/build/esm/inspector/utils/interpolation.js.map +1 -0
  145. package/build/esm/inspector/utils/labelPositioning.js +62 -0
  146. package/build/esm/inspector/utils/labelPositioning.js.map +1 -0
  147. package/build/esm/mocking/MockCacheKeyGenerator.js +109 -0
  148. package/build/esm/mocking/MockCacheKeyGenerator.js.map +1 -0
  149. package/build/esm/mocking/MockManager.js +281 -0
  150. package/build/esm/mocking/MockManager.js.map +1 -0
  151. package/build/esm/prototyping/PrototypeOverrideStore.js +66 -0
  152. package/build/esm/prototyping/PrototypeOverrideStore.js.map +1 -0
  153. package/build/esm/prototyping/index.js +18 -0
  154. package/build/esm/prototyping/index.js.map +1 -0
  155. package/build/esm/public/vite.js +19 -0
  156. package/build/esm/public/vite.js.map +1 -0
  157. package/build/esm/register.js +41 -0
  158. package/build/esm/register.js.map +1 -0
  159. package/build/esm/scss.d.ts +20 -0
  160. package/build/esm/store/ComputeStore.js +269 -0
  161. package/build/esm/store/ComputeStore.js.map +1 -0
  162. package/build/esm/store/ConsoleLogStore.js +289 -0
  163. package/build/esm/store/ConsoleLogStore.js.map +1 -0
  164. package/build/esm/store/MetricsStore.js +428 -0
  165. package/build/esm/store/MetricsStore.js.map +1 -0
  166. package/build/esm/store/MonitorStore.js +288 -0
  167. package/build/esm/store/MonitorStore.js.map +1 -0
  168. package/build/esm/store/SubscribableStore.js +38 -0
  169. package/build/esm/store/SubscribableStore.js.map +1 -0
  170. package/build/esm/store/WindowErrorStore.js +195 -0
  171. package/build/esm/store/WindowErrorStore.js.map +1 -0
  172. package/build/esm/styles.css +19441 -0
  173. package/build/esm/styles.js +31 -0
  174. package/build/esm/styles.js.map +1 -0
  175. package/build/esm/types/compute.js +2 -0
  176. package/build/esm/types/compute.js.map +1 -0
  177. package/build/esm/types/emissions.js +2 -0
  178. package/build/esm/types/emissions.js.map +1 -0
  179. package/build/esm/types/index.js +23 -0
  180. package/build/esm/types/index.js.map +1 -0
  181. package/build/esm/utils/ActionLifecycleTracker.js +178 -0
  182. package/build/esm/utils/ActionLifecycleTracker.js.map +1 -0
  183. package/build/esm/utils/CacheEfficiencyAnalyzer.js +198 -0
  184. package/build/esm/utils/CacheEfficiencyAnalyzer.js.map +1 -0
  185. package/build/esm/utils/CircularBuffer.js +96 -0
  186. package/build/esm/utils/CircularBuffer.js.map +1 -0
  187. package/build/esm/utils/ComponentContextCapture.js +215 -0
  188. package/build/esm/utils/ComponentContextCapture.js.map +1 -0
  189. package/build/esm/utils/ComponentPrimitiveDiscovery.js +173 -0
  190. package/build/esm/utils/ComponentPrimitiveDiscovery.js.map +1 -0
  191. package/build/esm/utils/ComponentQueryRegistry.js +340 -0
  192. package/build/esm/utils/ComponentQueryRegistry.js.map +1 -0
  193. package/build/esm/utils/ComputeMonitor.js +199 -0
  194. package/build/esm/utils/ComputeMonitor.js.map +1 -0
  195. package/build/esm/utils/EventTimeline.js +130 -0
  196. package/build/esm/utils/EventTimeline.js.map +1 -0
  197. package/build/esm/utils/LinkTraversalTracker.js +116 -0
  198. package/build/esm/utils/LinkTraversalTracker.js.map +1 -0
  199. package/build/esm/utils/MockDataGenerator.js +473 -0
  200. package/build/esm/utils/MockDataGenerator.js.map +1 -0
  201. package/build/esm/utils/ObservableClientMonitor.js +768 -0
  202. package/build/esm/utils/ObservableClientMonitor.js.map +1 -0
  203. package/build/esm/utils/PerformanceRecommendationEngine.js +185 -0
  204. package/build/esm/utils/PerformanceRecommendationEngine.js.map +1 -0
  205. package/build/esm/utils/PropertyAccessTracker.js +238 -0
  206. package/build/esm/utils/PropertyAccessTracker.js.map +1 -0
  207. package/build/esm/utils/RecommendationMatcher.js +53 -0
  208. package/build/esm/utils/RecommendationMatcher.js.map +1 -0
  209. package/build/esm/utils/SubscriptionTracker.js +132 -0
  210. package/build/esm/utils/SubscriptionTracker.js.map +1 -0
  211. package/build/esm/utils/UnusedFieldAnalyzer.js +186 -0
  212. package/build/esm/utils/UnusedFieldAnalyzer.js.map +1 -0
  213. package/build/esm/utils/WaterfallDetector.js +200 -0
  214. package/build/esm/utils/WaterfallDetector.js.map +1 -0
  215. package/build/esm/utils/computePayload.js +37 -0
  216. package/build/esm/utils/computePayload.js.map +1 -0
  217. package/build/esm/utils/computeRequest.js +29 -0
  218. package/build/esm/utils/computeRequest.js.map +1 -0
  219. package/build/esm/utils/format.js +69 -0
  220. package/build/esm/utils/format.js.map +1 -0
  221. package/build/esm/utils/logger.js +31 -0
  222. package/build/esm/utils/logger.js.map +1 -0
  223. package/build/esm/vite/constants.js +18 -0
  224. package/build/esm/vite/constants.js.map +1 -0
  225. package/build/esm/vite/hookInstaller.js +99 -0
  226. package/build/esm/vite/hookInstaller.js.map +1 -0
  227. package/build/esm/vite/index.js +77 -0
  228. package/build/esm/vite/index.js.map +1 -0
  229. package/build/types/DevToolsContext.d.ts +3 -0
  230. package/build/types/DevToolsContext.d.ts.map +1 -0
  231. package/build/types/components/ActionMetrics.d.ts +6 -0
  232. package/build/types/components/ActionMetrics.d.ts.map +1 -0
  233. package/build/types/components/BubbleChart.d.ts +10 -0
  234. package/build/types/components/BubbleChart.d.ts.map +1 -0
  235. package/build/types/components/CacheInspectorTab.d.ts +6 -0
  236. package/build/types/components/CacheInspectorTab.d.ts.map +1 -0
  237. package/build/types/components/CacheMetrics.d.ts +6 -0
  238. package/build/types/components/CacheMetrics.d.ts.map +1 -0
  239. package/build/types/components/ComponentCard.d.ts +13 -0
  240. package/build/types/components/ComponentCard.d.ts.map +1 -0
  241. package/build/types/components/ComputeTab.d.ts +6 -0
  242. package/build/types/components/ComputeTab.d.ts.map +1 -0
  243. package/build/types/components/CopyableCodeBlock.d.ts +7 -0
  244. package/build/types/components/CopyableCodeBlock.d.ts.map +1 -0
  245. package/build/types/components/DebuggingTab.d.ts +6 -0
  246. package/build/types/components/DebuggingTab.d.ts.map +1 -0
  247. package/build/types/components/HookRow.d.ts +9 -0
  248. package/build/types/components/HookRow.d.ts.map +1 -0
  249. package/build/types/components/ImprovementsTab.d.ts +7 -0
  250. package/build/types/components/ImprovementsTab.d.ts.map +1 -0
  251. package/build/types/components/InspectorSelectionHeader.d.ts +12 -0
  252. package/build/types/components/InspectorSelectionHeader.d.ts.map +1 -0
  253. package/build/types/components/InterceptTab.d.ts +126 -0
  254. package/build/types/components/InterceptTab.d.ts.map +1 -0
  255. package/build/types/components/IssueCard.d.ts +8 -0
  256. package/build/types/components/IssueCard.d.ts.map +1 -0
  257. package/build/types/components/LogEntryCard.d.ts +7 -0
  258. package/build/types/components/LogEntryCard.d.ts.map +1 -0
  259. package/build/types/components/MockEditor.d.ts +58 -0
  260. package/build/types/components/MockEditor.d.ts.map +1 -0
  261. package/build/types/components/MonitorErrorBoundary.d.ts +16 -0
  262. package/build/types/components/MonitorErrorBoundary.d.ts.map +1 -0
  263. package/build/types/components/MonitoringPanel.d.ts +8 -0
  264. package/build/types/components/MonitoringPanel.d.ts.map +1 -0
  265. package/build/types/components/ObjectLoadingMetrics.d.ts +7 -0
  266. package/build/types/components/ObjectLoadingMetrics.d.ts.map +1 -0
  267. package/build/types/components/OsdkAppErrorBoundary.d.ts +18 -0
  268. package/build/types/components/OsdkAppErrorBoundary.d.ts.map +1 -0
  269. package/build/types/components/OsdkDevTools.d.ts +2 -0
  270. package/build/types/components/OsdkDevTools.d.ts.map +1 -0
  271. package/build/types/components/OverrideEditor.d.ts +26 -0
  272. package/build/types/components/OverrideEditor.d.ts.map +1 -0
  273. package/build/types/components/PerformanceTab.d.ts +8 -0
  274. package/build/types/components/PerformanceTab.d.ts.map +1 -0
  275. package/build/types/components/PrimitiveSelectionPanel.d.ts +28 -0
  276. package/build/types/components/PrimitiveSelectionPanel.d.ts.map +1 -0
  277. package/build/types/components/issueTypes.d.ts +16 -0
  278. package/build/types/components/issueTypes.d.ts.map +1 -0
  279. package/build/types/components/resolveComponentName.d.ts +3 -0
  280. package/build/types/components/resolveComponentName.d.ts.map +1 -0
  281. package/build/types/components/testHelpers.d.ts +2 -0
  282. package/build/types/components/testHelpers.d.ts.map +1 -0
  283. package/build/types/css.d.d.ts +4 -0
  284. package/build/types/css.d.d.ts.map +1 -0
  285. package/build/types/fiber/DegradationNotice.d.ts +8 -0
  286. package/build/types/fiber/DegradationNotice.d.ts.map +1 -0
  287. package/build/types/fiber/DevtoolsHook.d.ts +7 -0
  288. package/build/types/fiber/DevtoolsHook.d.ts.map +1 -0
  289. package/build/types/fiber/FiberAccess.d.ts +2 -0
  290. package/build/types/fiber/FiberAccess.d.ts.map +1 -0
  291. package/build/types/fiber/FiberInspection.d.ts +6 -0
  292. package/build/types/fiber/FiberInspection.d.ts.map +1 -0
  293. package/build/types/fiber/FiberTags.d.ts +33 -0
  294. package/build/types/fiber/FiberTags.d.ts.map +1 -0
  295. package/build/types/fiber/HookStateInspector.d.ts +45 -0
  296. package/build/types/fiber/HookStateInspector.d.ts.map +1 -0
  297. package/build/types/fiber/SafeFiberOperation.d.ts +7 -0
  298. package/build/types/fiber/SafeFiberOperation.d.ts.map +1 -0
  299. package/build/types/fiber/capabilities.d.ts +38 -0
  300. package/build/types/fiber/capabilities.d.ts.map +1 -0
  301. package/build/types/fiber/traverseFiber.d.ts +5 -0
  302. package/build/types/fiber/traverseFiber.d.ts.map +1 -0
  303. package/build/types/fiber/types.d.ts +87 -0
  304. package/build/types/fiber/types.d.ts.map +1 -0
  305. package/build/types/fiber/validation.d.ts +10 -0
  306. package/build/types/fiber/validation.d.ts.map +1 -0
  307. package/build/types/hooks/createPollingStore.d.ts +5 -0
  308. package/build/types/hooks/createPollingStore.d.ts.map +1 -0
  309. package/build/types/hooks/useActiveComponents.d.ts +3 -0
  310. package/build/types/hooks/useActiveComponents.d.ts.map +1 -0
  311. package/build/types/hooks/useComponentRegistry.d.ts +3 -0
  312. package/build/types/hooks/useComponentRegistry.d.ts.map +1 -0
  313. package/build/types/hooks/useComputeSelectors.d.ts +7 -0
  314. package/build/types/hooks/useComputeSelectors.d.ts.map +1 -0
  315. package/build/types/hooks/useConsoleLogs.d.ts +7 -0
  316. package/build/types/hooks/useConsoleLogs.d.ts.map +1 -0
  317. package/build/types/hooks/useInspectorSelection.d.ts +9 -0
  318. package/build/types/hooks/useInspectorSelection.d.ts.map +1 -0
  319. package/build/types/hooks/useMetrics.d.ts +3 -0
  320. package/build/types/hooks/useMetrics.d.ts.map +1 -0
  321. package/build/types/hooks/usePersistedState.d.ts +1 -0
  322. package/build/types/hooks/usePersistedState.d.ts.map +1 -0
  323. package/build/types/hooks/useRecommendations.d.ts +10 -0
  324. package/build/types/hooks/useRecommendations.d.ts.map +1 -0
  325. package/build/types/hooks/useSharedTick.d.ts +1 -0
  326. package/build/types/hooks/useSharedTick.d.ts.map +1 -0
  327. package/build/types/hooks/useTimeElapsed.d.ts +1 -0
  328. package/build/types/hooks/useTimeElapsed.d.ts.map +1 -0
  329. package/build/types/hooks/useTrackerSubscription.d.ts +16 -0
  330. package/build/types/hooks/useTrackerSubscription.d.ts.map +1 -0
  331. package/build/types/hooks/useUnusedFieldAnalysis.d.ts +8 -0
  332. package/build/types/hooks/useUnusedFieldAnalysis.d.ts.map +1 -0
  333. package/build/types/index.d.ts +21 -0
  334. package/build/types/index.d.ts.map +1 -0
  335. package/build/types/inspector/ClickToInspectSystem.d.ts +40 -0
  336. package/build/types/inspector/ClickToInspectSystem.d.ts.map +1 -0
  337. package/build/types/inspector/components/ComponentLabel.d.ts +3 -0
  338. package/build/types/inspector/components/ComponentLabel.d.ts.map +1 -0
  339. package/build/types/inspector/components/InspectorBanner.d.ts +5 -0
  340. package/build/types/inspector/components/InspectorBanner.d.ts.map +1 -0
  341. package/build/types/inspector/components/InspectorOverlay.d.ts +3 -0
  342. package/build/types/inspector/components/InspectorOverlay.d.ts.map +1 -0
  343. package/build/types/inspector/components/SelectionHighlight.d.ts +3 -0
  344. package/build/types/inspector/components/SelectionHighlight.d.ts.map +1 -0
  345. package/build/types/inspector/createClickToInspect.d.ts +3 -0
  346. package/build/types/inspector/createClickToInspect.d.ts.map +1 -0
  347. package/build/types/inspector/hooks/useAnimatedBounds.d.ts +2 -0
  348. package/build/types/inspector/hooks/useAnimatedBounds.d.ts.map +1 -0
  349. package/build/types/inspector/index.d.ts +13 -0
  350. package/build/types/inspector/index.d.ts.map +1 -0
  351. package/build/types/inspector/inspectorController.d.ts +2 -0
  352. package/build/types/inspector/inspectorController.d.ts.map +1 -0
  353. package/build/types/inspector/types.d.ts +94 -0
  354. package/build/types/inspector/types.d.ts.map +1 -0
  355. package/build/types/inspector/utils/elementBounds.d.ts +3 -0
  356. package/build/types/inspector/utils/elementBounds.d.ts.map +1 -0
  357. package/build/types/inspector/utils/interpolation.d.ts +7 -0
  358. package/build/types/inspector/utils/interpolation.d.ts.map +1 -0
  359. package/build/types/inspector/utils/labelPositioning.d.ts +3 -0
  360. package/build/types/inspector/utils/labelPositioning.d.ts.map +1 -0
  361. package/build/types/mocking/MockCacheKeyGenerator.d.ts +41 -0
  362. package/build/types/mocking/MockCacheKeyGenerator.d.ts.map +1 -0
  363. package/build/types/mocking/MockManager.d.ts +103 -0
  364. package/build/types/mocking/MockManager.d.ts.map +1 -0
  365. package/build/types/prototyping/PrototypeOverrideStore.d.ts +33 -0
  366. package/build/types/prototyping/PrototypeOverrideStore.d.ts.map +1 -0
  367. package/build/types/prototyping/index.d.ts +1 -0
  368. package/build/types/prototyping/index.d.ts.map +1 -0
  369. package/build/types/public/vite.d.ts +2 -0
  370. package/build/types/public/vite.d.ts.map +1 -0
  371. package/build/types/register.d.ts +1 -0
  372. package/build/types/register.d.ts.map +1 -0
  373. package/build/types/scss.d.d.ts +6 -0
  374. package/build/types/scss.d.d.ts.map +1 -0
  375. package/build/types/store/ComputeStore.d.ts +47 -0
  376. package/build/types/store/ComputeStore.d.ts.map +1 -0
  377. package/build/types/store/ConsoleLogStore.d.ts +29 -0
  378. package/build/types/store/ConsoleLogStore.d.ts.map +1 -0
  379. package/build/types/store/MetricsStore.d.ts +42 -0
  380. package/build/types/store/MetricsStore.d.ts.map +1 -0
  381. package/build/types/store/MonitorStore.d.ts +86 -0
  382. package/build/types/store/MonitorStore.d.ts.map +1 -0
  383. package/build/types/store/SubscribableStore.d.ts +6 -0
  384. package/build/types/store/SubscribableStore.d.ts.map +1 -0
  385. package/build/types/store/WindowErrorStore.d.ts +32 -0
  386. package/build/types/store/WindowErrorStore.d.ts.map +1 -0
  387. package/build/types/styles.d.ts +1 -0
  388. package/build/types/styles.d.ts.map +1 -0
  389. package/build/types/types/compute.d.ts +73 -0
  390. package/build/types/types/compute.d.ts.map +1 -0
  391. package/build/types/types/emissions.d.ts +24 -0
  392. package/build/types/types/emissions.d.ts.map +1 -0
  393. package/build/types/types/index.d.ts +143 -0
  394. package/build/types/types/index.d.ts.map +1 -0
  395. package/build/types/utils/ActionLifecycleTracker.d.ts +39 -0
  396. package/build/types/utils/ActionLifecycleTracker.d.ts.map +1 -0
  397. package/build/types/utils/CacheEfficiencyAnalyzer.d.ts +45 -0
  398. package/build/types/utils/CacheEfficiencyAnalyzer.d.ts.map +1 -0
  399. package/build/types/utils/CircularBuffer.d.ts +18 -0
  400. package/build/types/utils/CircularBuffer.d.ts.map +1 -0
  401. package/build/types/utils/ComponentContextCapture.d.ts +29 -0
  402. package/build/types/utils/ComponentContextCapture.d.ts.map +1 -0
  403. package/build/types/utils/ComponentPrimitiveDiscovery.d.ts +62 -0
  404. package/build/types/utils/ComponentPrimitiveDiscovery.d.ts.map +1 -0
  405. package/build/types/utils/ComponentQueryRegistry.d.ts +91 -0
  406. package/build/types/utils/ComponentQueryRegistry.d.ts.map +1 -0
  407. package/build/types/utils/ComputeMonitor.d.ts +14 -0
  408. package/build/types/utils/ComputeMonitor.d.ts.map +1 -0
  409. package/build/types/utils/EventTimeline.d.ts +102 -0
  410. package/build/types/utils/EventTimeline.d.ts.map +1 -0
  411. package/build/types/utils/LinkTraversalTracker.d.ts +43 -0
  412. package/build/types/utils/LinkTraversalTracker.d.ts.map +1 -0
  413. package/build/types/utils/MockDataGenerator.d.ts +23 -0
  414. package/build/types/utils/MockDataGenerator.d.ts.map +1 -0
  415. package/build/types/utils/ObservableClientMonitor.d.ts +62 -0
  416. package/build/types/utils/ObservableClientMonitor.d.ts.map +1 -0
  417. package/build/types/utils/PerformanceRecommendationEngine.d.ts +67 -0
  418. package/build/types/utils/PerformanceRecommendationEngine.d.ts.map +1 -0
  419. package/build/types/utils/PropertyAccessTracker.d.ts +50 -0
  420. package/build/types/utils/PropertyAccessTracker.d.ts.map +1 -0
  421. package/build/types/utils/RecommendationMatcher.d.ts +5 -0
  422. package/build/types/utils/RecommendationMatcher.d.ts.map +1 -0
  423. package/build/types/utils/SubscriptionTracker.d.ts +17 -0
  424. package/build/types/utils/SubscriptionTracker.d.ts.map +1 -0
  425. package/build/types/utils/UnusedFieldAnalyzer.d.ts +46 -0
  426. package/build/types/utils/UnusedFieldAnalyzer.d.ts.map +1 -0
  427. package/build/types/utils/WaterfallDetector.d.ts +28 -0
  428. package/build/types/utils/WaterfallDetector.d.ts.map +1 -0
  429. package/build/types/utils/computePayload.d.ts +3 -0
  430. package/build/types/utils/computePayload.d.ts.map +1 -0
  431. package/build/types/utils/computeRequest.d.ts +20 -0
  432. package/build/types/utils/computeRequest.d.ts.map +1 -0
  433. package/build/types/utils/format.d.ts +5 -0
  434. package/build/types/utils/format.d.ts.map +1 -0
  435. package/build/types/utils/logger.d.ts +2 -0
  436. package/build/types/utils/logger.d.ts.map +1 -0
  437. package/build/types/vite/constants.d.ts +1 -0
  438. package/build/types/vite/constants.d.ts.map +1 -0
  439. package/build/types/vite/hookInstaller.d.ts +1 -0
  440. package/build/types/vite/hookInstaller.d.ts.map +1 -0
  441. package/build/types/vite/index.d.ts +20 -0
  442. package/build/types/vite/index.d.ts.map +1 -0
  443. package/package.json +114 -0
@@ -0,0 +1,31 @@
1
+ // AUTO-GENERATED by scripts/build-css.mjs. Do not edit by hand.
2
+ const styles = {
3
+ "componentCard": "ComponentCard-module__componentCard___CXSvCQzk",
4
+ "dt-fade-up": "ComponentCard-module__dt-fade-up___psFECV6x",
5
+ "header": "ComponentCard-module__header___Jn2yzzpo",
6
+ "headerLeft": "ComponentCard-module__headerLeft___lSFBRZeU",
7
+ "expandIcon": "ComponentCard-module__expandIcon___bVDJMvCw",
8
+ "componentName": "ComponentCard-module__componentName___zi9kmHje",
9
+ "headerRight": "ComponentCard-module__headerRight___Onizt4Xz",
10
+ "hookCountTag": "ComponentCard-module__hookCountTag___Au-g656K",
11
+ "warningTag": "ComponentCard-module__warningTag___SEHm7XTm",
12
+ "renderCount": "ComponentCard-module__renderCount___x5573ve1",
13
+ "avgDuration": "ComponentCard-module__avgDuration___DNliVFhR",
14
+ "healthDot": "ComponentCard-module__healthDot___am-3Y3CP",
15
+ "health_healthy": "ComponentCard-module__health_healthy___SzlgxyYl",
16
+ "health_warning": "ComponentCard-module__health_warning___ArfusCDB",
17
+ "health_error": "ComponentCard-module__health_error___douF5P6Z",
18
+ "issueCountTag": "ComponentCard-module__issueCountTag___nGCcS8sq",
19
+ "healthyLabel": "ComponentCard-module__healthyLabel___4ZF6SbZo",
20
+ "body": "ComponentCard-module__body___8jD0iuDQ",
21
+ "hooks": "ComponentCard-module__hooks___FXXF01wg",
22
+ "inlineIssues": "ComponentCard-module__inlineIssues___KDlbm-3o",
23
+ "inlineIssue": "ComponentCard-module__inlineIssue___NaFdeja5",
24
+ "inlineIssue_error": "ComponentCard-module__inlineIssue_error___Amx-Dk0L",
25
+ "inlineIssue_warning": "ComponentCard-module__inlineIssue_warning___nObMVMm3",
26
+ "inlineIssue_info": "ComponentCard-module__inlineIssue_info___8eBQmfKv",
27
+ "inlineIssueText": "ComponentCard-module__inlineIssueText___2VPigAUS",
28
+ "inlineIssueSuggestion": "ComponentCard-module__inlineIssueSuggestion___tcOUGQc-",
29
+ "dt-shimmer": "ComponentCard-module__dt-shimmer___Tet5666-"
30
+ };
31
+ export default styles;
@@ -0,0 +1,175 @@
1
+ /*
2
+ * Copyright 2025 Palantir Technologies, Inc. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import { Button } from "@blueprintjs/core";
18
+ import classNames from "classnames";
19
+ import React, { useMemo } from "react";
20
+ import { useComputeMetrics, useComputeNetworkPaused, useComputeRecording, useComputeRequests } from "../hooks/useComputeSelectors.js";
21
+ import { formatBytes, formatNumber } from "../utils/format.js";
22
+ import { BubbleChart } from "./BubbleChart.js";
23
+ import styles from "./MonitoringPanel.module.scss.js";
24
+ export const ComputeTab = ({
25
+ computeStore
26
+ }) => {
27
+ const metrics = useComputeMetrics(computeStore);
28
+ const requests = useComputeRequests(computeStore);
29
+ const isRecording = useComputeRecording(computeStore);
30
+ const isNetworkPaused = useComputeNetworkPaused(computeStore);
31
+ const [selectedIds, setSelectedIds] = React.useState([]);
32
+ const selectedIdSet = useMemo(() => new Set(selectedIds), [selectedIds]);
33
+ const recentRequests = useMemo(() => requests.slice(-50).reverse(), [requests]);
34
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
35
+ className: styles.computeControls
36
+ }, isRecording ? /*#__PURE__*/React.createElement(Button, {
37
+ onClick: () => computeStore.setIsRecording(false),
38
+ icon: "stop",
39
+ intent: "danger",
40
+ size: "small"
41
+ }, "Stop Recording") : /*#__PURE__*/React.createElement(Button, {
42
+ onClick: () => computeStore.setIsRecording(true),
43
+ icon: "record",
44
+ intent: "primary",
45
+ size: "small"
46
+ }, "Start Recording"), /*#__PURE__*/React.createElement(Button, {
47
+ onClick: () => computeStore.toggleNetworkPaused(),
48
+ icon: isNetworkPaused ? "play" : "pause",
49
+ size: "small",
50
+ title: "Block all OSDK network requests"
51
+ }, isNetworkPaused ? "Resume" : "Pause", " Network")), (() => /*#__PURE__*/React.createElement("div", {
52
+ className: styles.computeMetricsGrid
53
+ }, /*#__PURE__*/React.createElement("div", {
54
+ className: styles.metricCell
55
+ }, /*#__PURE__*/React.createElement("span", {
56
+ className: styles.metricLabel
57
+ }, "Total Usage"), /*#__PURE__*/React.createElement("span", {
58
+ className: styles.metricValue
59
+ }, formatNumber(metrics.totalUsage)), /*#__PURE__*/React.createElement("span", {
60
+ className: styles.metricSubtext
61
+ }, metrics.fulfilledCount, " requests")), /*#__PURE__*/React.createElement("div", {
62
+ className: styles.metricCell
63
+ }, /*#__PURE__*/React.createElement("span", {
64
+ className: styles.metricLabel
65
+ }, "Last Minute"), /*#__PURE__*/React.createElement("span", {
66
+ className: styles.metricValue
67
+ }, formatNumber(metrics.lastMinuteUsage)), /*#__PURE__*/React.createElement("span", {
68
+ className: styles.metricSubtext
69
+ }, "compute units")), /*#__PURE__*/React.createElement("div", {
70
+ className: styles.metricCell
71
+ }, /*#__PURE__*/React.createElement("span", {
72
+ className: styles.metricLabel
73
+ }, "Avg per Request"), /*#__PURE__*/React.createElement("span", {
74
+ className: styles.metricValue
75
+ }, formatNumber(metrics.averageUsagePerRequest)), /*#__PURE__*/React.createElement("span", {
76
+ className: styles.metricSubtext
77
+ }, "compute units")), /*#__PURE__*/React.createElement("div", {
78
+ className: styles.metricCell
79
+ }, /*#__PURE__*/React.createElement("span", {
80
+ className: styles.metricLabel
81
+ }, "Avg Response Size"), /*#__PURE__*/React.createElement("span", {
82
+ className: styles.metricValue
83
+ }, formatBytes(metrics.averageResponseBytes)), /*#__PURE__*/React.createElement("span", {
84
+ className: styles.metricSubtext
85
+ }, metrics.requestCount, " total", metrics.fulfilledWithoutUsageCount > 0 && /*#__PURE__*/React.createElement(React.Fragment, null, ", ", metrics.fulfilledWithoutUsageCount, " without usage data")))))(), requests.length > 0 && /*#__PURE__*/React.createElement("div", {
86
+ className: styles.bubbleChartContainer
87
+ }, /*#__PURE__*/React.createElement(BubbleChart, {
88
+ computeStore: computeStore,
89
+ fillHeight: false,
90
+ selectedIds: selectedIds,
91
+ onSelectRequest: id => {
92
+ if (id) {
93
+ setSelectedIds([id]);
94
+ } else {
95
+ setSelectedIds([]);
96
+ }
97
+ }
98
+ })), /*#__PURE__*/React.createElement("div", {
99
+ className: styles.operationsList
100
+ }, recentRequests.length > 0 ? recentRequests.map(req => /*#__PURE__*/React.createElement(ComputeRequestItem, {
101
+ key: req.id,
102
+ request: req,
103
+ isSelected: selectedIdSet.has(req.id)
104
+ })) : /*#__PURE__*/React.createElement("div", {
105
+ className: styles.emptyState
106
+ }, isRecording ? "No compute requests yet" : "Start recording to track compute usage")));
107
+ };
108
+ const REQUEST_DISPLAY = {
109
+ "fulfilled": {
110
+ icon: "\u2713",
111
+ class: styles.computeFulfilled
112
+ },
113
+ "fulfilled-without-usage": {
114
+ icon: "\u00b7",
115
+ class: styles.computeFulfilledWithoutUsage
116
+ },
117
+ "failed": {
118
+ icon: "\u00d7",
119
+ class: styles.computeFailed
120
+ },
121
+ "pending": {
122
+ icon: "\u22ef",
123
+ class: styles.computePending
124
+ }
125
+ };
126
+ const DEFAULT_REQUEST_DISPLAY = {
127
+ icon: "\u2022",
128
+ class: ""
129
+ };
130
+ function getUsageClass(usage) {
131
+ if (usage > 1000) {
132
+ return styles.danger;
133
+ }
134
+ if (usage > 100) {
135
+ return styles.warning;
136
+ }
137
+ return styles.success;
138
+ }
139
+ const ComputeRequestItem = ({
140
+ request,
141
+ isSelected
142
+ }) => {
143
+ const {
144
+ icon: requestIcon,
145
+ class: requestClass
146
+ } = REQUEST_DISPLAY[request.type] ?? DEFAULT_REQUEST_DISPLAY;
147
+ return /*#__PURE__*/React.createElement("div", {
148
+ className: classNames(styles.operationItem, {
149
+ [styles.selectedItem]: isSelected
150
+ })
151
+ }, /*#__PURE__*/React.createElement("span", {
152
+ className: classNames(styles.operationType, requestClass)
153
+ }, requestIcon), /*#__PURE__*/React.createElement("div", {
154
+ className: styles.operationDetails
155
+ }, /*#__PURE__*/React.createElement("div", {
156
+ className: styles.operationSignature
157
+ }, request.requestUrl), /*#__PURE__*/React.createElement("div", {
158
+ className: styles.operationTime
159
+ }, new Date(request.requestTimestamp).toLocaleTimeString()), /*#__PURE__*/React.createElement("div", {
160
+ className: styles.operationMetrics
161
+ }, request.type === "fulfilled" && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("span", {
162
+ className: classNames(styles.operationMetric, getUsageClass(request.computeUsage))
163
+ }, formatNumber(request.computeUsage), " CU"), /*#__PURE__*/React.createElement("span", {
164
+ className: styles.operationMetric
165
+ }, formatBytes(request.responsePayloadBytes))), request.type === "fulfilled-without-usage" && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("span", {
166
+ className: styles.operationMetric
167
+ }, "no usage data"), /*#__PURE__*/React.createElement("span", {
168
+ className: styles.operationMetric
169
+ }, formatBytes(request.responsePayloadBytes))), request.type === "failed" && /*#__PURE__*/React.createElement("span", {
170
+ className: classNames(styles.operationMetric, styles.danger)
171
+ }, request.error.type), request.type === "pending" && /*#__PURE__*/React.createElement("span", {
172
+ className: styles.operationMetric
173
+ }, "Loading..."))));
174
+ };
175
+ //# sourceMappingURL=ComputeTab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ComputeTab.js","names":["Button","classNames","React","useMemo","useComputeMetrics","useComputeNetworkPaused","useComputeRecording","useComputeRequests","formatBytes","formatNumber","BubbleChart","styles","ComputeTab","computeStore","metrics","requests","isRecording","isNetworkPaused","selectedIds","setSelectedIds","useState","selectedIdSet","Set","recentRequests","slice","reverse","createElement","Fragment","className","computeControls","onClick","setIsRecording","icon","intent","size","toggleNetworkPaused","title","computeMetricsGrid","metricCell","metricLabel","metricValue","totalUsage","metricSubtext","fulfilledCount","lastMinuteUsage","averageUsagePerRequest","averageResponseBytes","requestCount","fulfilledWithoutUsageCount","length","bubbleChartContainer","fillHeight","onSelectRequest","id","operationsList","map","req","ComputeRequestItem","key","request","isSelected","has","emptyState","REQUEST_DISPLAY","class","computeFulfilled","computeFulfilledWithoutUsage","computeFailed","computePending","DEFAULT_REQUEST_DISPLAY","getUsageClass","usage","danger","warning","success","requestIcon","requestClass","type","operationItem","selectedItem","operationType","operationDetails","operationSignature","requestUrl","operationTime","Date","requestTimestamp","toLocaleTimeString","operationMetrics","operationMetric","computeUsage","responsePayloadBytes","error"],"sources":["ComputeTab.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Button } from \"@blueprintjs/core\";\nimport classNames from \"classnames\";\nimport React, { useMemo } from \"react\";\nimport {\n useComputeMetrics,\n useComputeNetworkPaused,\n useComputeRecording,\n useComputeRequests,\n} from \"../hooks/useComputeSelectors.js\";\nimport type { ComputeStore } from \"../store/ComputeStore.js\";\nimport type { ComputeRequest } from \"../types/compute.js\";\nimport { formatBytes, formatNumber } from \"../utils/format.js\";\nimport { BubbleChart } from \"./BubbleChart.js\";\nimport styles from \"./MonitoringPanel.module.scss\";\n\nexport interface ComputeTabProps {\n computeStore: ComputeStore;\n}\n\nexport const ComputeTab: React.FC<ComputeTabProps> = ({ computeStore }) => {\n const metrics = useComputeMetrics(computeStore);\n const requests = useComputeRequests(computeStore);\n const isRecording = useComputeRecording(computeStore);\n const isNetworkPaused = useComputeNetworkPaused(computeStore);\n const [selectedIds, setSelectedIds] = React.useState<string[]>([]);\n\n const selectedIdSet = useMemo(() => new Set(selectedIds), [selectedIds]);\n\n const renderMetrics = () => (\n <div className={styles.computeMetricsGrid}>\n <div className={styles.metricCell}>\n <span className={styles.metricLabel}>Total Usage</span>\n <span className={styles.metricValue}>\n {formatNumber(metrics.totalUsage)}\n </span>\n <span className={styles.metricSubtext}>\n {metrics.fulfilledCount} requests\n </span>\n </div>\n\n <div className={styles.metricCell}>\n <span className={styles.metricLabel}>Last Minute</span>\n <span className={styles.metricValue}>\n {formatNumber(metrics.lastMinuteUsage)}\n </span>\n <span className={styles.metricSubtext}>compute units</span>\n </div>\n\n <div className={styles.metricCell}>\n <span className={styles.metricLabel}>Avg per Request</span>\n <span className={styles.metricValue}>\n {formatNumber(metrics.averageUsagePerRequest)}\n </span>\n <span className={styles.metricSubtext}>compute units</span>\n </div>\n\n <div className={styles.metricCell}>\n <span className={styles.metricLabel}>Avg Response Size</span>\n <span className={styles.metricValue}>\n {formatBytes(metrics.averageResponseBytes)}\n </span>\n <span className={styles.metricSubtext}>\n {metrics.requestCount} total\n {metrics.fulfilledWithoutUsageCount > 0 && (\n <>\n {\", \"}\n {metrics.fulfilledWithoutUsageCount} without usage data\n </>\n )}\n </span>\n </div>\n </div>\n );\n\n const recentRequests = useMemo(\n () => requests.slice(-50).reverse(),\n [requests],\n );\n\n return (\n <>\n <div className={styles.computeControls}>\n {isRecording\n ? (\n <Button\n onClick={() => computeStore.setIsRecording(false)}\n icon=\"stop\"\n intent=\"danger\"\n size=\"small\"\n >\n Stop Recording\n </Button>\n )\n : (\n <Button\n onClick={() => computeStore.setIsRecording(true)}\n icon=\"record\"\n intent=\"primary\"\n size=\"small\"\n >\n Start Recording\n </Button>\n )}\n <Button\n onClick={() => computeStore.toggleNetworkPaused()}\n icon={isNetworkPaused ? \"play\" : \"pause\"}\n size=\"small\"\n title=\"Block all OSDK network requests\"\n >\n {isNetworkPaused ? \"Resume\" : \"Pause\"} Network\n </Button>\n </div>\n\n {renderMetrics()}\n\n {requests.length > 0 && (\n <div className={styles.bubbleChartContainer}>\n <BubbleChart\n computeStore={computeStore}\n fillHeight={false}\n selectedIds={selectedIds}\n onSelectRequest={(id) => {\n if (id) {\n setSelectedIds([id]);\n } else {\n setSelectedIds([]);\n }\n }}\n />\n </div>\n )}\n\n <div className={styles.operationsList}>\n {recentRequests.length > 0\n ? recentRequests.map((req) => (\n <ComputeRequestItem\n key={req.id}\n request={req}\n isSelected={selectedIdSet.has(req.id)}\n />\n ))\n : (\n <div className={styles.emptyState}>\n {isRecording\n ? \"No compute requests yet\"\n : \"Start recording to track compute usage\"}\n </div>\n )}\n </div>\n </>\n );\n};\n\nconst REQUEST_DISPLAY: Record<string, { icon: string; class: string }> = {\n \"fulfilled\": { icon: \"\\u2713\", class: styles.computeFulfilled },\n \"fulfilled-without-usage\": {\n icon: \"\\u00b7\",\n class: styles.computeFulfilledWithoutUsage,\n },\n \"failed\": { icon: \"\\u00d7\", class: styles.computeFailed },\n \"pending\": { icon: \"\\u22ef\", class: styles.computePending },\n};\n\nconst DEFAULT_REQUEST_DISPLAY = { icon: \"\\u2022\", class: \"\" };\n\ninterface ComputeRequestItemProps {\n request: ComputeRequest;\n isSelected: boolean;\n}\n\nfunction getUsageClass(usage: number): string {\n if (usage > 1000) {\n return styles.danger;\n }\n if (usage > 100) {\n return styles.warning;\n }\n return styles.success;\n}\n\nconst ComputeRequestItem: React.FC<ComputeRequestItemProps> = ({\n request,\n isSelected,\n}) => {\n const { icon: requestIcon, class: requestClass } =\n REQUEST_DISPLAY[request.type] ?? DEFAULT_REQUEST_DISPLAY;\n\n return (\n <div\n className={classNames(styles.operationItem, {\n [styles.selectedItem]: isSelected,\n })}\n >\n <span className={classNames(styles.operationType, requestClass)}>\n {requestIcon}\n </span>\n <div className={styles.operationDetails}>\n <div className={styles.operationSignature}>\n {request.requestUrl}\n </div>\n <div className={styles.operationTime}>\n {new Date(request.requestTimestamp).toLocaleTimeString()}\n </div>\n <div className={styles.operationMetrics}>\n {request.type === \"fulfilled\" && (\n <>\n <span\n className={classNames(\n styles.operationMetric,\n getUsageClass(request.computeUsage),\n )}\n >\n {formatNumber(request.computeUsage)} CU\n </span>\n <span className={styles.operationMetric}>\n {formatBytes(request.responsePayloadBytes)}\n </span>\n </>\n )}\n {request.type === \"fulfilled-without-usage\" && (\n <>\n <span className={styles.operationMetric}>\n no usage data\n </span>\n <span className={styles.operationMetric}>\n {formatBytes(request.responsePayloadBytes)}\n </span>\n </>\n )}\n {request.type === \"failed\" && (\n <span className={classNames(styles.operationMetric, styles.danger)}>\n {request.error.type}\n </span>\n )}\n {request.type === \"pending\" && (\n <span className={styles.operationMetric}>\n Loading...\n </span>\n )}\n </div>\n </div>\n </div>\n );\n};\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,49 @@
1
+ /*
2
+ * Copyright 2025 Palantir Technologies, Inc. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import { Button } from "@blueprintjs/core";
18
+ import classNames from "classnames";
19
+ import React, { useCallback, useRef, useState } from "react";
20
+ import styles from "./CopyableCodeBlock.module.scss.js";
21
+ export const CopyableCodeBlock = ({
22
+ children,
23
+ className
24
+ }) => {
25
+ const [copied, setCopied] = useState(false);
26
+ const copyTimeoutRef = useRef(undefined);
27
+ const handleCopy = useCallback(async () => {
28
+ const text = typeof children === "string" ? children : String(children ?? "");
29
+ try {
30
+ await navigator.clipboard.writeText(text);
31
+ setCopied(true);
32
+ clearTimeout(copyTimeoutRef.current);
33
+ copyTimeoutRef.current = setTimeout(() => setCopied(false), 1500);
34
+ } catch {}
35
+ }, [children]);
36
+ return /*#__PURE__*/React.createElement("div", {
37
+ className: styles.container
38
+ }, /*#__PURE__*/React.createElement("pre", {
39
+ className: classNames(styles.code, className)
40
+ }, children), /*#__PURE__*/React.createElement(Button, {
41
+ variant: "minimal",
42
+ size: "small",
43
+ icon: copied ? "tick" : "clipboard",
44
+ className: classNames(styles.copyButton, copied && styles.copied),
45
+ onClick: () => void handleCopy(),
46
+ "aria-label": "Copy to clipboard"
47
+ }));
48
+ };
49
+ //# sourceMappingURL=CopyableCodeBlock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CopyableCodeBlock.js","names":["Button","classNames","React","useCallback","useRef","useState","styles","CopyableCodeBlock","children","className","copied","setCopied","copyTimeoutRef","undefined","handleCopy","text","String","navigator","clipboard","writeText","clearTimeout","current","setTimeout","createElement","container","code","variant","size","icon","copyButton","onClick"],"sources":["CopyableCodeBlock.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Button } from \"@blueprintjs/core\";\nimport classNames from \"classnames\";\nimport React, { useCallback, useRef, useState } from \"react\";\nimport styles from \"./CopyableCodeBlock.module.scss\";\n\ninterface CopyableCodeBlockProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport const CopyableCodeBlock: React.FC<CopyableCodeBlockProps> = ({\n children,\n className,\n}) => {\n const [copied, setCopied] = useState(false);\n const copyTimeoutRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n const handleCopy = useCallback(async () => {\n const text = typeof children === \"string\"\n ? children\n : String(children ?? \"\");\n try {\n await navigator.clipboard.writeText(text);\n setCopied(true);\n clearTimeout(copyTimeoutRef.current);\n copyTimeoutRef.current = setTimeout(() => setCopied(false), 1500);\n } catch {\n }\n }, [children]);\n\n return (\n <div className={styles.container}>\n <pre className={classNames(styles.code, className)}>{children}</pre>\n <Button\n variant=\"minimal\"\n size=\"small\"\n icon={copied ? \"tick\" : \"clipboard\"}\n className={classNames(styles.copyButton, copied && styles.copied)}\n onClick={() => void handleCopy()}\n aria-label=\"Copy to clipboard\"\n />\n </div>\n );\n};\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,MAAM,QAAQ,mBAAmB;AAC1C,OAAOC,UAAU,MAAM,YAAY;AACnC,OAAOC,KAAK,IAAIC,WAAW,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,OAAO;AAC5D,OAAOC,MAAM,MAAM,iCAAiC;AAOpD,OAAO,MAAMC,iBAAmD,GAAGA,CAAC;EAClEC,QAAQ;EACRC;AACF,CAAC,KAAK;EACJ,MAAM,CAACC,MAAM,EAAEC,SAAS,CAAC,GAAGN,QAAQ,CAAC,KAAK,CAAC;EAC3C,MAAMO,cAAc,GAAGR,MAAM,CAAgCS,SAAS,CAAC;EAEvE,MAAMC,UAAU,GAAGX,WAAW,CAAC,YAAY;IACzC,MAAMY,IAAI,GAAG,OAAOP,QAAQ,KAAK,QAAQ,GACrCA,QAAQ,GACRQ,MAAM,CAACR,QAAQ,IAAI,EAAE,CAAC;IAC1B,IAAI;MACF,MAAMS,SAAS,CAACC,SAAS,CAACC,SAAS,CAACJ,IAAI,CAAC;MACzCJ,SAAS,CAAC,IAAI,CAAC;MACfS,YAAY,CAACR,cAAc,CAACS,OAAO,CAAC;MACpCT,cAAc,CAACS,OAAO,GAAGC,UAAU,CAAC,MAAMX,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC;IACnE,CAAC,CAAC,MAAM,CACR;EACF,CAAC,EAAE,CAACH,QAAQ,CAAC,CAAC;EAEd,oBACEN,KAAA,CAAAqB,aAAA;IAAKd,SAAS,EAAEH,MAAM,CAACkB;EAAU,gBAC/BtB,KAAA,CAAAqB,aAAA;IAAKd,SAAS,EAAER,UAAU,CAACK,MAAM,CAACmB,IAAI,EAAEhB,SAAS;EAAE,GAAED,QAAc,CAAC,eACpEN,KAAA,CAAAqB,aAAA,CAACvB,MAAM;IACL0B,OAAO,EAAC,SAAS;IACjBC,IAAI,EAAC,OAAO;IACZC,IAAI,EAAElB,MAAM,GAAG,MAAM,GAAG,WAAY;IACpCD,SAAS,EAAER,UAAU,CAACK,MAAM,CAACuB,UAAU,EAAEnB,MAAM,IAAIJ,MAAM,CAACI,MAAM,CAAE;IAClEoB,OAAO,EAAEA,CAAA,KAAM,KAAKhB,UAAU,CAAC,CAAE;IACjC,cAAW;EAAmB,CAC/B,CACE,CAAC;AAEV,CAAC","ignoreList":[]}
@@ -0,0 +1,10 @@
1
+ // AUTO-GENERATED by scripts/build-css.mjs. Do not edit by hand.
2
+ const styles = {
3
+ "container": "CopyableCodeBlock-module__container___sqmTeXF-",
4
+ "copyButton": "CopyableCodeBlock-module__copyButton___L3vWF1Yx",
5
+ "code": "CopyableCodeBlock-module__code___Pn9fDhKT",
6
+ "copied": "CopyableCodeBlock-module__copied___TlrZLIlu",
7
+ "dt-shimmer": "CopyableCodeBlock-module__dt-shimmer___vnQsR71K",
8
+ "dt-fade-up": "CopyableCodeBlock-module__dt-fade-up___HbuWnBAS"
9
+ };
10
+ export default styles;
@@ -0,0 +1,342 @@
1
+ /*
2
+ * Copyright 2025 Palantir Technologies, Inc. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import { Icon, InputGroup } from "@blueprintjs/core";
18
+ import classNames from "classnames";
19
+ import React, { useCallback, useMemo, useRef, useState } from "react";
20
+ import { createPollingStore } from "../hooks/createPollingStore.js";
21
+ import { useActiveComponents } from "../hooks/useActiveComponents.js";
22
+ import { useConsoleLogs } from "../hooks/useConsoleLogs.js";
23
+ import { formatTime } from "../utils/format.js";
24
+ import { CacheInspectorTab } from "./CacheInspectorTab.js";
25
+ import { ComponentCard } from "./ComponentCard.js";
26
+ import styles from "./DebuggingTab.module.scss.js";
27
+ import { ImprovementsTab } from "./ImprovementsTab.js";
28
+ import { IssueCard } from "./IssueCard.js";
29
+ import { LogEntryCard } from "./LogEntryCard.js";
30
+ import { resolveComponentName } from "./resolveComponentName.js";
31
+ const SEVERITY_ORDER = {
32
+ error: 0,
33
+ warning: 1,
34
+ info: 2
35
+ };
36
+ function collectIssues(monitorStore, now) {
37
+ const issues = [];
38
+ for (const err of monitorStore.getMetricsStore().getActionErrors()) {
39
+ issues.push({
40
+ id: err.id,
41
+ severity: "error",
42
+ category: "action failure",
43
+ title: "Action failed",
44
+ message: err.message,
45
+ suggestion: err.validationErrors?.length ? "Fix validation errors before retrying" : undefined,
46
+ timestamp: err.timestamp,
47
+ expandable: {
48
+ stack: err.stack,
49
+ detailsJson: JSON.stringify({
50
+ actionType: err.actionType,
51
+ parameters: err.parameters
52
+ }, null, 2)
53
+ }
54
+ });
55
+ }
56
+ const windowErrors = monitorStore.getWindowErrorStore().getEntries();
57
+ // Bucketed at 100ms granularity. The lookup checks the current bucket plus
58
+ // the two adjacent buckets so that any console.error within ±100ms of a
59
+ // window error collides regardless of where the timestamps fall.
60
+ const windowErrorBuckets = new Set();
61
+ for (const we of windowErrors) {
62
+ const expandable = {};
63
+ if (we.stack) {
64
+ expandable.stack = we.stack;
65
+ }
66
+ if (we.filename || we.lineno || we.colno) {
67
+ expandable.detailsJson = JSON.stringify({
68
+ filename: we.filename,
69
+ lineno: we.lineno,
70
+ colno: we.colno
71
+ }, null, 2);
72
+ }
73
+ const hasExpandable = expandable.stack !== undefined || expandable.detailsJson !== undefined;
74
+ issues.push({
75
+ id: `windowError-${we.id}`,
76
+ severity: "error",
77
+ category: we.kind === "unhandledrejection" ? "unhandled rejection" : "uncaught error",
78
+ title: we.kind === "unhandledrejection" ? "Unhandled promise rejection" : "Uncaught error",
79
+ message: we.message,
80
+ timestamp: we.timestamp,
81
+ ...(hasExpandable ? {
82
+ expandable
83
+ } : {})
84
+ });
85
+ const bucket = Math.floor(we.timestamp / 100);
86
+ windowErrorBuckets.add(`${we.message}|${bucket}`);
87
+ }
88
+ for (const entry of monitorStore.getConsoleLogStore().getEntries()) {
89
+ if (entry.level !== "error") {
90
+ continue;
91
+ }
92
+ const messageText = entry.args.join(" ");
93
+ const bucket = Math.floor(entry.timestamp / 100);
94
+ if (windowErrorBuckets.has(`${messageText}|${bucket - 1}`) || windowErrorBuckets.has(`${messageText}|${bucket}`) || windowErrorBuckets.has(`${messageText}|${bucket + 1}`)) {
95
+ continue;
96
+ }
97
+ const issue = {
98
+ id: `console-${entry.id}`,
99
+ severity: "error",
100
+ category: "console error",
101
+ title: "console.error",
102
+ message: messageText,
103
+ timestamp: entry.timestamp
104
+ };
105
+ if (entry.source) {
106
+ issue.expandable = {
107
+ detailsJson: JSON.stringify({
108
+ source: entry.source
109
+ }, null, 2)
110
+ };
111
+ }
112
+ issues.push(issue);
113
+ }
114
+ for (const wr of monitorStore.getPropertyAccessTracker().getWastedRenders()) {
115
+ issues.push({
116
+ id: `wasted-${wr.componentId}-${wr.timestamp}`,
117
+ severity: "warning",
118
+ category: "wasted render",
119
+ title: `${wr.count} renders without property access`,
120
+ message: `${wr.componentName} renders but doesn't use the data`,
121
+ suggestion: "Check if this component needs this data subscription",
122
+ componentId: wr.componentId,
123
+ componentName: wr.componentName,
124
+ timestamp: wr.timestamp
125
+ });
126
+ }
127
+ for (const up of monitorStore.getPropertyAccessTracker().getUnusedProperties()) {
128
+ issues.push({
129
+ id: `unused-${up.componentId}-${up.propertyName}`,
130
+ severity: "info",
131
+ category: "unused field",
132
+ title: `"${up.propertyName}" loaded but never accessed`,
133
+ message: `${up.componentName} fetches this field but never reads it`,
134
+ suggestion: "Remove from query to reduce payload",
135
+ componentId: up.componentId,
136
+ componentName: up.componentName,
137
+ timestamp: now
138
+ });
139
+ }
140
+ issues.sort((a, b) => SEVERITY_ORDER[a.severity] - SEVERITY_ORDER[b.severity] || b.timestamp - a.timestamp);
141
+ return issues;
142
+ }
143
+ export const DebuggingTab = ({
144
+ monitorStore
145
+ }) => {
146
+ const [searchQuery, setSearchQuery] = useState("");
147
+ const [cacheExpanded, setCacheExpanded] = useState(false);
148
+ const [consoleExpanded, setConsoleExpanded] = useState(true);
149
+ const [improvementsExpanded, setImprovementsExpanded] = useState(true);
150
+ const componentRefs = useRef(new Map());
151
+ const activeComponents = useActiveComponents(monitorStore);
152
+ const {
153
+ entries: consoleEntries,
154
+ count: consoleCount,
155
+ clear: clearConsole
156
+ } = useConsoleLogs(monitorStore);
157
+ const issueStore = React.useMemo(() => createPollingStore(() => collectIssues(monitorStore, Date.now()), 2000), [monitorStore]);
158
+ const issues = React.useSyncExternalStore(issueStore.subscribe, issueStore.getSnapshot) ?? [];
159
+ const cacheCountStore = React.useMemo(() => createPollingStore(async () => {
160
+ const entries = await monitorStore.loadCacheEntries();
161
+ return entries.length;
162
+ }, 5000), [monitorStore]);
163
+ const cacheCount = React.useSyncExternalStore(cacheCountStore.subscribe, cacheCountStore.getSnapshot) ?? 0;
164
+ const searchFilter = useCallback(issue => {
165
+ if (!searchQuery.trim()) {
166
+ return true;
167
+ }
168
+ const q = searchQuery.toLowerCase();
169
+ return issue.title.toLowerCase().includes(q) || issue.message.toLowerCase().includes(q) || (issue.componentName?.toLowerCase().includes(q) ?? false) || issue.category.toLowerCase().includes(q);
170
+ }, [searchQuery]);
171
+ const errorIssues = useMemo(() => issues.filter(i => i.severity === "error").filter(searchFilter), [issues, searchFilter]);
172
+ const filteredConsoleEntries = useMemo(() => {
173
+ if (!searchQuery.trim()) {
174
+ return consoleEntries;
175
+ }
176
+ const q = searchQuery.toLowerCase();
177
+ return consoleEntries.filter(entry => entry.args.some(arg => arg.toLowerCase().includes(q)) || entry.level.includes(q) || (entry.source?.toLowerCase().includes(q) ?? false));
178
+ }, [consoleEntries, searchQuery]);
179
+ const issuesByComponent = useMemo(() => {
180
+ const map = new Map();
181
+ for (const issue of issues) {
182
+ if (issue.componentId) {
183
+ const existing = map.get(issue.componentId);
184
+ if (existing) {
185
+ existing.push(issue);
186
+ } else {
187
+ map.set(issue.componentId, [issue]);
188
+ }
189
+ }
190
+ }
191
+ return map;
192
+ }, [issues]);
193
+ const filteredComponents = useMemo(() => {
194
+ if (!searchQuery.trim()) {
195
+ return activeComponents;
196
+ }
197
+ const q = searchQuery.toLowerCase();
198
+ const filtered = new Map();
199
+ for (const [componentId, bindings] of activeComponents) {
200
+ const displayName = resolveComponentName(bindings).toLowerCase();
201
+ if (displayName.includes(q) || componentId.includes(q)) {
202
+ filtered.set(componentId, bindings);
203
+ }
204
+ }
205
+ return filtered;
206
+ }, [activeComponents, searchQuery]);
207
+ const handleComponentClick = useCallback(componentId => {
208
+ const el = componentRefs.current.get(componentId);
209
+ if (el) {
210
+ el.scrollIntoView({
211
+ behavior: "smooth",
212
+ block: "center"
213
+ });
214
+ el.click();
215
+ }
216
+ }, []);
217
+ return /*#__PURE__*/React.createElement("div", {
218
+ className: styles.debuggingTab
219
+ }, /*#__PURE__*/React.createElement("div", {
220
+ className: styles.controls
221
+ }, /*#__PURE__*/React.createElement(InputGroup, {
222
+ leftIcon: "search",
223
+ placeholder: "Search issues and components...",
224
+ value: searchQuery,
225
+ onChange: e => setSearchQuery(e.target.value),
226
+ className: styles.searchInput,
227
+ fill: true
228
+ })), /*#__PURE__*/React.createElement("div", {
229
+ className: styles.feed
230
+ }, /*#__PURE__*/React.createElement("div", {
231
+ className: styles.section
232
+ }, /*#__PURE__*/React.createElement("div", {
233
+ className: classNames(styles.sectionHeader, styles.errorSectionHeader)
234
+ }, /*#__PURE__*/React.createElement(Icon, {
235
+ icon: "error",
236
+ size: 14,
237
+ color: "var(--dt-red)"
238
+ }), /*#__PURE__*/React.createElement("span", null, "Errors"), /*#__PURE__*/React.createElement("span", {
239
+ className: styles.sectionCount
240
+ }, errorIssues.length)), errorIssues.length === 0 ? /*#__PURE__*/React.createElement("div", {
241
+ className: styles.emptyState
242
+ }, "No errors") : errorIssues.map((issue, index) => /*#__PURE__*/React.createElement(IssueCard, {
243
+ key: issue.id,
244
+ issue: issue,
245
+ onComponentClick: handleComponentClick,
246
+ style: {
247
+ "--entrance-index": index
248
+ }
249
+ }))), /*#__PURE__*/React.createElement("div", {
250
+ className: styles.section
251
+ }, /*#__PURE__*/React.createElement("button", {
252
+ type: "button",
253
+ className: styles.sectionHeaderButton,
254
+ onClick: () => setConsoleExpanded(!consoleExpanded)
255
+ }, /*#__PURE__*/React.createElement(Icon, {
256
+ icon: "console",
257
+ size: 14,
258
+ color: "var(--dt-text-tertiary)"
259
+ }), /*#__PURE__*/React.createElement("span", null, "Console"), /*#__PURE__*/React.createElement("span", {
260
+ className: styles.sectionCount
261
+ }, consoleCount), consoleCount > 0 && /*#__PURE__*/React.createElement("span", {
262
+ className: styles.sectionCount,
263
+ role: "button",
264
+ tabIndex: 0,
265
+ onClick: e => {
266
+ e.stopPropagation();
267
+ clearConsole();
268
+ },
269
+ onKeyDown: e => {
270
+ if (e.key === "Enter" || e.key === " ") {
271
+ e.stopPropagation();
272
+ e.preventDefault();
273
+ clearConsole();
274
+ }
275
+ }
276
+ }, "clear"), /*#__PURE__*/React.createElement(Icon, {
277
+ icon: consoleExpanded ? "chevron-down" : "chevron-right",
278
+ size: 14,
279
+ className: styles.sectionChevron
280
+ })), consoleExpanded && (filteredConsoleEntries.length === 0 ? /*#__PURE__*/React.createElement("div", {
281
+ className: styles.emptyState
282
+ }, "No console output captured") : filteredConsoleEntries.slice(-100).map((entry, index) => /*#__PURE__*/React.createElement(LogEntryCard, {
283
+ key: entry.id,
284
+ entry: entry,
285
+ style: {
286
+ "--entrance-index": index
287
+ }
288
+ })))), /*#__PURE__*/React.createElement("div", {
289
+ className: styles.section
290
+ }, /*#__PURE__*/React.createElement("div", {
291
+ className: styles.sectionHeader
292
+ }, /*#__PURE__*/React.createElement("span", null, "Components"), /*#__PURE__*/React.createElement("span", {
293
+ className: styles.sectionCount
294
+ }, filteredComponents.size)), filteredComponents.size === 0 && /*#__PURE__*/React.createElement("div", {
295
+ className: styles.emptyState
296
+ }, searchQuery ? "No components match your search" : "No active components found"), Array.from(filteredComponents).map(([componentId, bindings], index) => /*#__PURE__*/React.createElement("div", {
297
+ key: componentId,
298
+ ref: el => {
299
+ if (el) {
300
+ componentRefs.current.set(componentId, el);
301
+ } else {
302
+ componentRefs.current.delete(componentId);
303
+ }
304
+ }
305
+ }, /*#__PURE__*/React.createElement(ComponentCard, {
306
+ componentId: componentId,
307
+ bindings: bindings,
308
+ formatTime: formatTime,
309
+ monitorStore: monitorStore,
310
+ issues: issuesByComponent.get(componentId),
311
+ style: {
312
+ "--entrance-index": index
313
+ }
314
+ })))), /*#__PURE__*/React.createElement("div", {
315
+ className: styles.section
316
+ }, /*#__PURE__*/React.createElement("button", {
317
+ type: "button",
318
+ className: styles.sectionHeaderButton,
319
+ onClick: () => setImprovementsExpanded(!improvementsExpanded)
320
+ }, /*#__PURE__*/React.createElement("span", null, "Improvements"), /*#__PURE__*/React.createElement(Icon, {
321
+ icon: improvementsExpanded ? "chevron-down" : "chevron-right",
322
+ size: 14,
323
+ className: styles.sectionChevron
324
+ })), improvementsExpanded && /*#__PURE__*/React.createElement(ImprovementsTab, {
325
+ monitorStore: monitorStore
326
+ })), /*#__PURE__*/React.createElement("div", {
327
+ className: styles.section
328
+ }, /*#__PURE__*/React.createElement("button", {
329
+ type: "button",
330
+ className: styles.sectionHeaderButton,
331
+ onClick: () => setCacheExpanded(!cacheExpanded)
332
+ }, /*#__PURE__*/React.createElement("span", null, "Cache"), /*#__PURE__*/React.createElement("span", {
333
+ className: styles.sectionCount
334
+ }, cacheCount, " entries"), /*#__PURE__*/React.createElement(Icon, {
335
+ icon: cacheExpanded ? "chevron-down" : "chevron-right",
336
+ size: 14,
337
+ className: styles.sectionChevron
338
+ })), cacheExpanded && /*#__PURE__*/React.createElement(CacheInspectorTab, {
339
+ monitorStore: monitorStore
340
+ }))));
341
+ };
342
+ //# sourceMappingURL=DebuggingTab.js.map