react-native-nitro-tracing 0.6.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 (233) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/LICENSE +21 -0
  3. package/NitroTracing.podspec +32 -0
  4. package/README.md +75 -0
  5. package/android/CMakeLists.txt +49 -0
  6. package/android/build.gradle +133 -0
  7. package/android/fix-prefab.gradle +51 -0
  8. package/android/gradle.properties +5 -0
  9. package/android/proguard-rules.pro +5 -0
  10. package/android/src/main/AndroidManifest.xml +2 -0
  11. package/android/src/main/cpp/cpp-adapter.cpp +47 -0
  12. package/android/src/main/java/com/margelo/nitro/nitrotracing/HermesSamplingGuard.kt +43 -0
  13. package/android/src/main/java/com/margelo/nitro/nitrotracing/NitroTracingFrameSource.kt +36 -0
  14. package/android/src/main/java/com/margelo/nitro/nitrotracing/NitroTracingPackage.kt +31 -0
  15. package/client.ts +15 -0
  16. package/cpp/HermesSampling.cpp +26 -0
  17. package/cpp/HermesSampling.hpp +10 -0
  18. package/cpp/HybridRecording.cpp +66 -0
  19. package/cpp/HybridRecording.hpp +30 -0
  20. package/cpp/HybridTraceSpan.cpp +10 -0
  21. package/cpp/HybridTraceSpan.hpp +17 -0
  22. package/cpp/HybridTracing.cpp +10 -0
  23. package/cpp/HybridTracing.hpp +10 -0
  24. package/cpp/NativeConversions.cpp +77 -0
  25. package/cpp/NativeConversions.hpp +15 -0
  26. package/cpp/core/NativeSampler.cpp +152 -0
  27. package/cpp/core/NativeSampler.hpp +56 -0
  28. package/cpp/core/Recorder.cpp +218 -0
  29. package/cpp/core/Recorder.hpp +60 -0
  30. package/cpp/core/Retention.cpp +26 -0
  31. package/cpp/core/Retention.hpp +7 -0
  32. package/cpp/core/TraceJson.cpp +214 -0
  33. package/cpp/core/TraceJson.hpp +7 -0
  34. package/cpp/core/TraceTypes.hpp +62 -0
  35. package/expo.ts +2 -0
  36. package/ios/NitroTracingFrameSource.mm +35 -0
  37. package/lib/commonjs/client.cjs +767 -0
  38. package/lib/commonjs/client.cjs.map +7 -0
  39. package/lib/commonjs/expo.cjs +88 -0
  40. package/lib/commonjs/expo.cjs.map +7 -0
  41. package/lib/commonjs/index.cjs +28 -0
  42. package/lib/commonjs/index.cjs.map +7 -0
  43. package/lib/commonjs/performance.cjs +112 -0
  44. package/lib/commonjs/performance.cjs.map +7 -0
  45. package/lib/commonjs/plugins.cjs +477 -0
  46. package/lib/commonjs/plugins.cjs.map +7 -0
  47. package/lib/commonjs/react.cjs +3833 -0
  48. package/lib/commonjs/react.cjs.map +7 -0
  49. package/lib/commonjs/release-profiler.cjs +142 -0
  50. package/lib/commonjs/release-profiler.cjs.map +7 -0
  51. package/lib/commonjs/sentry.cjs +188 -0
  52. package/lib/commonjs/sentry.cjs.map +7 -0
  53. package/lib/module/client.mjs +768 -0
  54. package/lib/module/client.mjs.map +7 -0
  55. package/lib/module/expo.mjs +62 -0
  56. package/lib/module/expo.mjs.map +7 -0
  57. package/lib/module/index.mjs +7 -0
  58. package/lib/module/index.mjs.map +7 -0
  59. package/lib/module/performance.mjs +89 -0
  60. package/lib/module/performance.mjs.map +7 -0
  61. package/lib/module/plugins.mjs +461 -0
  62. package/lib/module/plugins.mjs.map +7 -0
  63. package/lib/module/react.mjs +3851 -0
  64. package/lib/module/react.mjs.map +7 -0
  65. package/lib/module/release-profiler.mjs +137 -0
  66. package/lib/module/release-profiler.mjs.map +7 -0
  67. package/lib/module/sentry.mjs +165 -0
  68. package/lib/module/sentry.mjs.map +7 -0
  69. package/lib/typescript/client.d.ts +4 -0
  70. package/lib/typescript/expo.d.ts +2 -0
  71. package/lib/typescript/performance.d.ts +2 -0
  72. package/lib/typescript/plugins.d.ts +12 -0
  73. package/lib/typescript/react.d.ts +5 -0
  74. package/lib/typescript/release-profiler.d.ts +2 -0
  75. package/lib/typescript/sentry.d.ts +2 -0
  76. package/lib/typescript/src/client/TracingSink.d.ts +10 -0
  77. package/lib/typescript/src/client/createTraceClient.d.ts +82 -0
  78. package/lib/typescript/src/client/playground.d.ts +12 -0
  79. package/lib/typescript/src/expo/ExpoAdapter.d.ts +15 -0
  80. package/lib/typescript/src/expo/index.d.ts +2 -0
  81. package/lib/typescript/src/index.d.ts +6 -0
  82. package/lib/typescript/src/plugins/TracePlugin.d.ts +22 -0
  83. package/lib/typescript/src/plugins/errors.d.ts +15 -0
  84. package/lib/typescript/src/plugins/nativeMetrics.d.ts +13 -0
  85. package/lib/typescript/src/plugins/navigation.d.ts +29 -0
  86. package/lib/typescript/src/plugins/network.d.ts +23 -0
  87. package/lib/typescript/src/plugins/orderSpans.d.ts +3 -0
  88. package/lib/typescript/src/plugins/performance.d.ts +13 -0
  89. package/lib/typescript/src/plugins/releaseProfiler.d.ts +25 -0
  90. package/lib/typescript/src/plugins/runtimeMetrics.d.ts +17 -0
  91. package/lib/typescript/src/plugins/sentry.d.ts +15 -0
  92. package/lib/typescript/src/plugins/startPlugins.d.ts +4 -0
  93. package/lib/typescript/src/react/DetailView.d.ts +11 -0
  94. package/lib/typescript/src/react/ExplorerFilters.d.ts +9 -0
  95. package/lib/typescript/src/react/ExplorerView.d.ts +9 -0
  96. package/lib/typescript/src/react/InspectorControls.d.ts +229 -0
  97. package/lib/typescript/src/react/InspectorHeader.d.ts +8 -0
  98. package/lib/typescript/src/react/InspectorSheet.d.ts +16 -0
  99. package/lib/typescript/src/react/MetricsView.d.ts +7 -0
  100. package/lib/typescript/src/react/SummaryView.d.ts +11 -0
  101. package/lib/typescript/src/react/TimelineView.d.ts +8 -0
  102. package/lib/typescript/src/react/TraceInspector.d.ts +11 -0
  103. package/lib/typescript/src/react/TraceOverlay.d.ts +17 -0
  104. package/lib/typescript/src/react/explorerModel.d.ts +38 -0
  105. package/lib/typescript/src/react/labels.d.ts +203 -0
  106. package/lib/typescript/src/react/native.d.ts +42 -0
  107. package/lib/typescript/src/react/readSnapshot.d.ts +4 -0
  108. package/lib/typescript/src/react/store.d.ts +9 -0
  109. package/lib/typescript/src/react/topics.d.ts +80 -0
  110. package/lib/typescript/src/react/useAppReadyMetric.d.ts +3 -0
  111. package/lib/typescript/src/react/useLiveRecording.d.ts +4 -0
  112. package/lib/typescript/src/react/useTraceViewer.d.ts +140 -0
  113. package/lib/typescript/src/react/viewerModel.d.ts +59 -0
  114. package/lib/typescript/src/specs/Recording.nitro.d.ts +31 -0
  115. package/lib/typescript/src/specs/TraceSpan.nitro.d.ts +14 -0
  116. package/lib/typescript/src/specs/Tracing.nitro.d.ts +17 -0
  117. package/lib/typescript/src/types/CompletedSpanOptions.d.ts +15 -0
  118. package/lib/typescript/src/types/EventContext.d.ts +8 -0
  119. package/lib/typescript/src/types/MarkEvent.d.ts +4 -0
  120. package/lib/typescript/src/types/MarkOptions.d.ts +6 -0
  121. package/lib/typescript/src/types/MetricEvent.d.ts +8 -0
  122. package/lib/typescript/src/types/MetricOptions.d.ts +10 -0
  123. package/lib/typescript/src/types/NativeSamplingOptions.d.ts +7 -0
  124. package/lib/typescript/src/types/ReadOptions.d.ts +7 -0
  125. package/lib/typescript/src/types/RecordingOptions.d.ts +11 -0
  126. package/lib/typescript/src/types/RecordingStats.d.ts +25 -0
  127. package/lib/typescript/src/types/SpanEvent.d.ts +13 -0
  128. package/lib/typescript/src/types/SpanOptions.d.ts +6 -0
  129. package/lib/typescript/src/types/SpanOutcome.d.ts +2 -0
  130. package/lib/typescript/src/types/TraceAttribute.d.ts +7 -0
  131. package/lib/typescript/src/types/TraceAttributes.d.ts +3 -0
  132. package/lib/typescript/src/types/TraceContext.d.ts +10 -0
  133. package/lib/typescript/src/types/TracePage.d.ts +18 -0
  134. package/lib/typescript/src/types.d.ts +17 -0
  135. package/nitro.json +20 -0
  136. package/nitrogen/generated/.gitattributes +1 -0
  137. package/nitrogen/generated/android/NitroTracing+autolinking.cmake +83 -0
  138. package/nitrogen/generated/android/NitroTracing+autolinking.gradle +27 -0
  139. package/nitrogen/generated/android/NitroTracingOnLoad.cpp +49 -0
  140. package/nitrogen/generated/android/NitroTracingOnLoad.hpp +34 -0
  141. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrotracing/NitroTracingOnLoad.kt +35 -0
  142. package/nitrogen/generated/ios/NitroTracing+autolinking.rb +62 -0
  143. package/nitrogen/generated/ios/NitroTracing-Swift-Cxx-Bridge.cpp +17 -0
  144. package/nitrogen/generated/ios/NitroTracing-Swift-Cxx-Bridge.hpp +27 -0
  145. package/nitrogen/generated/ios/NitroTracing-Swift-Cxx-Umbrella.hpp +38 -0
  146. package/nitrogen/generated/ios/NitroTracingAutolinking.mm +35 -0
  147. package/nitrogen/generated/ios/NitroTracingAutolinking.swift +16 -0
  148. package/nitrogen/generated/shared/c++/CompletedSpanOptions.hpp +122 -0
  149. package/nitrogen/generated/shared/c++/HybridRecordingSpec.cpp +31 -0
  150. package/nitrogen/generated/shared/c++/HybridRecordingSpec.hpp +100 -0
  151. package/nitrogen/generated/shared/c++/HybridTraceSpanSpec.cpp +23 -0
  152. package/nitrogen/generated/shared/c++/HybridTraceSpanSpec.hpp +65 -0
  153. package/nitrogen/generated/shared/c++/HybridTracingSpec.cpp +22 -0
  154. package/nitrogen/generated/shared/c++/HybridTracingSpec.hpp +68 -0
  155. package/nitrogen/generated/shared/c++/MarkEvent.hpp +102 -0
  156. package/nitrogen/generated/shared/c++/MarkOptions.hpp +99 -0
  157. package/nitrogen/generated/shared/c++/MetricEvent.hpp +110 -0
  158. package/nitrogen/generated/shared/c++/MetricOptions.hpp +107 -0
  159. package/nitrogen/generated/shared/c++/NativeSamplingOptions.hpp +87 -0
  160. package/nitrogen/generated/shared/c++/ReadOptions.hpp +87 -0
  161. package/nitrogen/generated/shared/c++/RecordingOptions.hpp +95 -0
  162. package/nitrogen/generated/shared/c++/RecordingStats.hpp +123 -0
  163. package/nitrogen/generated/shared/c++/SpanEvent.hpp +121 -0
  164. package/nitrogen/generated/shared/c++/SpanOptions.hpp +99 -0
  165. package/nitrogen/generated/shared/c++/SpanOutcome.hpp +84 -0
  166. package/nitrogen/generated/shared/c++/TraceAttribute.hpp +87 -0
  167. package/nitrogen/generated/shared/c++/TracePage.hpp +111 -0
  168. package/package.json +236 -0
  169. package/performance.ts +2 -0
  170. package/plugins.ts +24 -0
  171. package/react-native.config.js +16 -0
  172. package/react.ts +10 -0
  173. package/release-profiler.ts +6 -0
  174. package/sentry.ts +2 -0
  175. package/src/client/TracingSink.ts +25 -0
  176. package/src/client/createTraceClient.ts +439 -0
  177. package/src/client/playground.ts +143 -0
  178. package/src/expo/ExpoAdapter.ts +71 -0
  179. package/src/expo/index.ts +2 -0
  180. package/src/index.ts +8 -0
  181. package/src/plugins/TracePlugin.ts +22 -0
  182. package/src/plugins/errors.ts +69 -0
  183. package/src/plugins/nativeMetrics.ts +26 -0
  184. package/src/plugins/navigation.ts +111 -0
  185. package/src/plugins/network.ts +178 -0
  186. package/src/plugins/orderSpans.ts +22 -0
  187. package/src/plugins/performance.ts +120 -0
  188. package/src/plugins/releaseProfiler.ts +123 -0
  189. package/src/plugins/runtimeMetrics.ts +131 -0
  190. package/src/plugins/sentry.ts +176 -0
  191. package/src/plugins/startPlugins.ts +58 -0
  192. package/src/react/DetailView.tsx +514 -0
  193. package/src/react/ExplorerFilters.tsx +151 -0
  194. package/src/react/ExplorerView.tsx +243 -0
  195. package/src/react/InspectorControls.tsx +651 -0
  196. package/src/react/InspectorHeader.tsx +171 -0
  197. package/src/react/InspectorSheet.tsx +89 -0
  198. package/src/react/MetricsView.tsx +182 -0
  199. package/src/react/SummaryView.tsx +121 -0
  200. package/src/react/TimelineView.tsx +87 -0
  201. package/src/react/TraceInspector.tsx +196 -0
  202. package/src/react/TraceOverlay.tsx +585 -0
  203. package/src/react/explorerModel.ts +285 -0
  204. package/src/react/labels.ts +234 -0
  205. package/src/react/native.tsx +159 -0
  206. package/src/react/readSnapshot.ts +58 -0
  207. package/src/react/store.ts +31 -0
  208. package/src/react/topics.ts +427 -0
  209. package/src/react/useAppReadyMetric.ts +10 -0
  210. package/src/react/useLiveRecording.ts +43 -0
  211. package/src/react/useTraceViewer.ts +333 -0
  212. package/src/react/viewerModel.ts +172 -0
  213. package/src/specs/Recording.nitro.ts +40 -0
  214. package/src/specs/TraceSpan.nitro.ts +14 -0
  215. package/src/specs/Tracing.nitro.ts +14 -0
  216. package/src/types/CompletedSpanOptions.ts +15 -0
  217. package/src/types/EventContext.ts +8 -0
  218. package/src/types/MarkEvent.ts +3 -0
  219. package/src/types/MarkOptions.ts +6 -0
  220. package/src/types/MetricEvent.ts +8 -0
  221. package/src/types/MetricOptions.ts +10 -0
  222. package/src/types/NativeSamplingOptions.ts +7 -0
  223. package/src/types/ReadOptions.ts +7 -0
  224. package/src/types/RecordingOptions.ts +11 -0
  225. package/src/types/RecordingStats.ts +25 -0
  226. package/src/types/SpanEvent.ts +13 -0
  227. package/src/types/SpanOptions.ts +6 -0
  228. package/src/types/SpanOutcome.ts +2 -0
  229. package/src/types/TraceAttribute.ts +7 -0
  230. package/src/types/TraceAttributes.ts +4 -0
  231. package/src/types/TraceContext.ts +10 -0
  232. package/src/types/TracePage.ts +18 -0
  233. package/src/types.ts +17 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/react/TraceInspector.tsx", "../../src/react/store.ts", "../../src/react/readSnapshot.ts", "../../src/react/useTraceViewer.ts", "../../src/react/explorerModel.ts", "../../src/react/viewerModel.ts", "../../src/react/topics.ts", "../../src/react/InspectorHeader.tsx", "../../src/react/native.tsx", "../../src/react/InspectorControls.tsx", "../../src/react/ExplorerView.tsx", "../../src/react/ExplorerFilters.tsx", "../../src/react/InspectorSheet.tsx", "../../src/react/DetailView.tsx", "../../src/react/MetricsView.tsx", "../../src/react/SummaryView.tsx", "../../src/react/TimelineView.tsx", "../../src/react/labels.ts", "../../src/react/TraceOverlay.tsx", "../../src/react/useLiveRecording.ts", "../../src/react/useAppReadyMetric.ts"],
4
+ "sourcesContent": ["import React, { useEffect } from 'react'\nimport { Modal, ScrollView, StatusBar, StyleSheet } from 'react-native'\nimport { SafeAreaProvider, SafeAreaView } from 'react-native-safe-area-context'\nimport type { TraceClient } from '../client/createTraceClient'\nimport { useTraceViewer, type Viewer } from './useTraceViewer'\nimport { InspectorHeader } from './InspectorHeader'\nimport { ExplorerView } from './ExplorerView'\nimport { DetailView } from './DetailView'\nimport { MetricsView } from './MetricsView'\nimport { SummaryView } from './SummaryView'\nimport { TimelineView } from './TimelineView'\nimport { NativeTabs } from './native'\nimport { defaultBudgets, type Budgets } from './topics'\nimport { apple, palette, Row, Section, TabBar } from './InspectorControls'\nimport {\n createTranslator,\n type InspectorLabelKey,\n type InspectorLabels,\n type InspectorTranslator,\n} from './labels'\n\nconst tabs = [\n { value: 'overview', icon: '\u25C9', key: 'overview', iconSize: 18 },\n { value: 'timeline', icon: '\u2630', key: 'timeline', iconSize: 22 },\n { value: 'explore', icon: '\u2315', key: 'explore', iconSize: 30 },\n { value: 'metrics', icon: '\u25A5', key: 'metrics', iconSize: 22 },\n] as const\nconst scenarioKey = {\n nested: 'scenarioNested',\n concurrency: 'scenarioConcurrency',\n cancelled: 'scenarioCancelled',\n idempotent: 'scenarioIdempotent',\n error: 'scenarioError',\n metrics: 'scenarioMetrics',\n} as const satisfies Record<string, InspectorLabelKey>\n\nexport function TraceInspector({\n client,\n labels,\n translate,\n budgets,\n}: {\n client: TraceClient\n labels?: Partial<InspectorLabels>\n translate?: InspectorTranslator\n /** Local issue thresholds for the Summary and Timeline. */\n budgets?: Partial<Budgets>\n}) {\n const v = useTraceViewer(client, budgets)\n const stallMs = budgets?.stallMs ?? defaultBudgets.stallMs\n const t = translate ?? createTranslator(labels)\n // Android Modals keep the host's status bar style; push dark icons while open.\n useEffect(() => {\n if (!v.visible) return\n const entry = StatusBar.pushStackEntry({ barStyle: 'dark-content' })\n return () => StatusBar.popStackEntry(entry)\n }, [v.visible])\n const identity =\n v.detail?.kind === 'span'\n ? v.detail.value.spanId\n : v.detail?.kind === 'trace'\n ? v.detail.value.id\n : v.detail?.kind === 'metric'\n ? v.detail.value.name\n : v.detail?.kind === 'mark'\n ? String(v.detail.value.sequence)\n : ''\n return (\n <Modal\n visible={v.visible}\n animationType=\"slide\"\n presentationStyle=\"fullScreen\"\n statusBarTranslucent\n onRequestClose={v.detail ? v.back : client.close}\n >\n <SafeAreaProvider>\n <SafeAreaView\n style={styles.root}\n edges={['top', 'bottom', 'left', 'right']}\n >\n <InspectorHeader v={v} t={t} />\n {v.detail ? (\n <DetailView key={`${v.details.length}:${identity}`} v={v} t={t} />\n ) : v.tab === 'tools' ? (\n <ToolsView v={v} t={t} client={client} />\n ) : (\n <NativeTabs\n value={v.tab}\n onChange={v.setTab}\n tint={palette.accent}\n tabs={[\n {\n key: 'overview',\n title: t('overview'),\n sfSymbol: 'gauge.with.dots.needle.67percent',\n badge: v.issues.length ? String(v.issues.length) : undefined,\n render: () => <SummaryView v={v} t={t} budgetMs={stallMs} />,\n },\n {\n key: 'timeline',\n title: t('timeline'),\n sfSymbol: 'list.bullet.below.rectangle',\n render: () => <TimelineView v={v} t={t} />,\n },\n {\n key: 'explore',\n title: t('explore'),\n sfSymbol: 'magnifyingglass',\n render: () => <ExplorerView v={v} t={t} />,\n },\n {\n key: 'metrics',\n title: t('metrics'),\n sfSymbol: 'chart.xyaxis.line',\n render: () => <MetricsView v={v} t={t} />,\n },\n ]}\n fallback={(content) => (\n <>\n {content}\n <TabBar\n items={tabs.map((tab) => ({ ...tab, label: t(tab.key) }))}\n value={v.tab === 'tools' ? 'overview' : v.tab}\n onChange={v.setTab}\n />\n </>\n )}\n />\n )}\n </SafeAreaView>\n </SafeAreaProvider>\n </Modal>\n )\n}\n\nfunction ToolsView({\n v,\n t,\n client,\n}: {\n v: Viewer\n t: InspectorTranslator\n client: TraceClient\n}) {\n const result = v.playgroundResult\n return (\n <ScrollView contentContainerStyle={styles.content}>\n <Section header={t('profiling')} footer={t('profileSeparate')}>\n {client.canProfile ? (\n <Row\n icon=\"\u25F7\"\n title={t(v.profiling ? 'stopProfile' : 'startProfile')}\n subtitle={t('profilingDescription')}\n onPress={v.busy || !v.recording ? undefined : v.toggleProfile}\n last={!v.profilePath}\n />\n ) : (\n <Row title={t('noProfiler')} last />\n )}\n {v.profilePath && (\n <Row\n icon=\"\u21EA\"\n title={t('shareProfile')}\n subtitle={v.profilePath}\n onPress={client.canShareProfile ? v.shareProfile : undefined}\n last\n />\n )}\n </Section>\n <Section header={t('playground')} footer={t('playgroundDescription')}>\n <Row\n icon=\"\u25B7\"\n title={t('run')}\n onPress={v.busy || !v.recording ? undefined : v.playground}\n last={!result}\n />\n {result?.checks.map((check) => (\n <Row\n key={check.id}\n icon={check.passed ? '\u2713' : '\u2715'}\n iconColor={check.passed ? '#34c759' : palette.error}\n title={t(scenarioKey[check.id])}\n />\n ))}\n {result && (\n <Row title={t('openScenario')} onPress={v.openPlayground} last />\n )}\n </Section>\n </ScrollView>\n )\n}\n\nconst styles = StyleSheet.create({\n root: { flex: 1, backgroundColor: apple.grouped },\n content: { paddingBottom: 32 },\n})\n", "import { useSyncExternalStore } from 'react'\n/** Minimal external store so only subscribed components rerender on telemetry ticks. */\nexport interface Store<T> {\n get(): T\n set(patch: Partial<T>): void\n subscribe(listener: () => void): () => void\n}\nexport function createStore<T extends object>(initial: T): Store<T> {\n let value = initial\n const listeners = new Set<() => void>()\n return {\n get: () => value,\n set(patch) {\n value = { ...value, ...patch }\n for (const listener of listeners) listener()\n },\n subscribe(listener) {\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n },\n }\n}\n/** Selectors must return primitives or existing references. */\nexport const useStore = <T, S>(store: Store<T>, select: (value: T) => S): S =>\n useSyncExternalStore(\n store.subscribe,\n () => select(store.get()),\n () => select(store.get())\n )\n", "import type { Recording } from '../specs/Recording.nitro'\nimport type { TracePage } from '../types'\n/** Bound work to retained history at read start, not an arbitrary UI result limit. */\nexport async function readSnapshot(\n recording: Recording,\n previous?: TracePage\n): Promise<TracePage> {\n const page: TracePage = {\n spans: [],\n marks: [],\n metrics: [],\n nextSequence: previous?.nextSequence ?? 0,\n earliestSequence: 0,\n droppedEvents: 0,\n }\n const budget = Math.max(1, Math.ceil(recording.getStats().eventCount / 1000))\n for (let i = 0; i < budget; i++) {\n const batch = await recording.readEvents({\n afterSequence: page.nextSequence,\n limit: 1000,\n })\n const cursor = page.nextSequence\n page.spans.push(...batch.spans)\n page.marks.push(...batch.marks)\n page.metrics.push(...batch.metrics)\n page.nextSequence = batch.nextSequence\n page.earliestSequence = batch.earliestSequence\n page.droppedEvents = batch.droppedEvents\n if (\n batch.nextSequence === cursor ||\n batch.spans.length + batch.marks.length + batch.metrics.length < 1000\n )\n break\n }\n if (!previous) return page\n if (\n page.nextSequence === previous.nextSequence &&\n page.earliestSequence === previous.earliestSequence &&\n page.droppedEvents === previous.droppedEvents\n )\n return previous\n const keep = <T extends { sequence: number }>(old: T[], added: T[]): T[] => {\n const evicted = old.length > 0 && old[0].sequence < page.earliestSequence\n if (!evicted && added.length === 0) return old\n return [\n ...(evicted\n ? old.filter((event) => event.sequence >= page.earliestSequence)\n : old),\n ...added,\n ]\n }\n return {\n ...page,\n spans: keep(previous.spans, page.spans),\n marks: keep(previous.marks, page.marks),\n metrics: keep(previous.metrics, page.metrics),\n }\n}\n", "import { createStore } from './store'\nimport { readSnapshot } from './readSnapshot'\nimport {\n useCallback,\n useEffect,\n useDeferredValue,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n} from 'react'\nimport type { TraceClient } from '../client/createTraceClient'\nimport type { RecordingStats, TracePage, SpanEvent, MarkEvent } from '../types'\nimport {\n buildTraces,\n defaultQuery,\n queryEvents,\n queryTraces,\n traceForSpan,\n type ExplorerMode,\n type Query,\n type Trace,\n} from './explorerModel'\nimport { recordingMetrics, operationMetrics } from './viewerModel'\nimport {\n buildTimeline,\n currentScreen,\n defaultBudgets,\n summarizeTopics,\n type Budgets,\n} from './topics'\nexport type Metric = ReturnType<typeof recordingMetrics>[number]\nexport type Detail =\n | { kind: 'trace'; value: Trace }\n | { kind: 'span'; value: SpanEvent }\n | { kind: 'mark'; value: MarkEvent }\n | { kind: 'metric'; value: Metric }\nexport type Tab = 'overview' | 'timeline' | 'explore' | 'metrics' | 'tools'\nexport interface Telemetry {\n stats?: RecordingStats\n error?: string\n pending?: Pick<TracePage, 'nextSequence' | 'earliestSequence'>\n}\nconst empty = (): TracePage => ({\n spans: [],\n marks: [],\n metrics: [],\n nextSequence: 0,\n earliestSequence: 0,\n droppedEvents: 0,\n})\nexport const useTraceViewer = (\n client: TraceClient,\n budgets?: Partial<Budgets>\n) => {\n const snapshot = useSyncExternalStore(\n client.subscribe,\n client.getSnapshot,\n client.getSnapshot\n )\n const [tab, setTab] = useState<Tab>('overview')\n const [mode, setMode] = useState<ExplorerMode>('traces')\n const [page, setPage] = useState(empty)\n const [telemetry] = useState(() => createStore<Telemetry>({}))\n const setStats = (stats: RecordingStats) => telemetry.set({ stats })\n const setError = (error: string | undefined) => telemetry.set({ error })\n const pendingPage = useRef<TracePage | undefined>(undefined)\n const setPending = (value: TracePage | undefined) => {\n pendingPage.current = value\n telemetry.set({\n pending: value\n ? {\n nextSequence: value.nextSequence,\n earliestSequence: value.earliestSequence,\n }\n : undefined,\n })\n }\n const [queries, setQueries] = useState<Record<ExplorerMode, Query>>({\n traces: defaultQuery(),\n spans: defaultQuery(),\n marks: defaultQuery(),\n })\n const [details, setDetails] = useState<Detail[]>([])\n const [paused, setPaused] = useState(false)\n const [holding, setHolding] = useState(false)\n const [metricQuery, setMetricQuery] = useState('')\n const [metricCategory, setMetricCategory] = useState('all')\n const [metricSort, setMetricSort] = useState('name')\n const offsets = useRef<Record<string, number>>({})\n const detailState = useRef<\n Record<\n string,\n {\n collapsed: string[]\n layout: 'waterfall' | 'list'\n attributes: string\n offset: number\n }\n >\n >({})\n const latestPage = useRef(page)\n const session = useRef<string | undefined>(undefined)\n const controls = useRef({ paused, holding, detail: details.length > 0 })\n controls.current = { paused, holding, detail: details.length > 0 }\n latestPage.current = page\n useEffect(() => {\n if (!snapshot.visible) return\n let cached: TracePage | undefined\n let cachedRecording: ReturnType<TraceClient['getRecording']>\n let cancelled = false\n let timer: ReturnType<typeof setTimeout>\n const refresh = async () => {\n try {\n const recording = client.getRecording()\n if (recording) {\n if (cachedRecording !== recording) {\n cached = undefined\n cachedRecording = recording\n }\n const next = await readSnapshot(recording, cached)\n cached = next\n if (cancelled || recording !== client.getRecording()) return\n const current = recording.getStats()\n setStats(current)\n if (session.current !== current.sessionId) {\n session.current = current.sessionId\n setDetails([])\n setPending(undefined)\n setPage(next)\n setHolding(false)\n offsets.current = {}\n detailState.current = {}\n setQueries(\n (previous) =>\n Object.fromEntries(\n Object.entries(previous).map(([key, q]) => [\n key,\n { ...q, from: '', to: '' },\n ])\n ) as Record<ExplorerMode, Query>\n )\n } else if (\n controls.current.paused ||\n controls.current.holding ||\n controls.current.detail\n ) {\n if (\n next.nextSequence !== latestPage.current.nextSequence ||\n next.droppedEvents !== latestPage.current.droppedEvents\n )\n setPending(next)\n } else {\n setPage(next)\n setPending(undefined)\n }\n }\n if (!cancelled) setError(client.getError())\n } catch (failure) {\n if (!cancelled) setError(String(failure))\n } finally {\n if (!cancelled) timer = setTimeout(refresh, 1000)\n }\n }\n void refresh()\n return () => {\n cancelled = true\n clearTimeout(timer)\n }\n }, [client, snapshot.visible])\n const traces = useMemo(() => buildTraces(page), [page.spans, page.marks])\n const metrics = useMemo(\n () => (tab === 'explore' ? [] : recordingMetrics(page)),\n [page, tab]\n )\n const collectors = snapshot.collectors\n const { appReadyMs, screenMs, requestMs, stallMs } = {\n ...defaultBudgets,\n ...budgets,\n }\n const summary = useMemo(\n () =>\n summarizeTopics(page, collectors ?? [], {\n appReadyMs,\n screenMs,\n requestMs,\n stallMs,\n }),\n [page, collectors, appReadyMs, screenMs, requestMs, stallMs]\n )\n const timeline = useMemo(\n () => (tab === 'timeline' ? buildTimeline(page, summary.issues) : []),\n [page, summary.issues, tab]\n )\n const screen = useMemo(() => currentScreen(page), [page.marks])\n const operations = useMemo(\n () => (tab === 'metrics' ? operationMetrics(page.spans) : []),\n [page.spans, tab]\n )\n const query = queries[mode]\n const deferredQuery = useDeferredValue(query)\n const results = useMemo(\n () =>\n mode === 'traces'\n ? queryTraces(traces, deferredQuery)\n : queryEvents(\n mode === 'spans' ? page.spans : page.marks,\n deferredQuery\n ),\n [mode, traces, page.spans, page.marks, deferredQuery]\n )\n const updateQuery = (patch: Partial<Query>) => {\n setHolding(true)\n setQueries((previous) => ({\n ...previous,\n [mode]: { ...previous[mode], ...patch },\n }))\n offsets.current[mode] = 0\n }\n const apply = () => {\n const pending = pendingPage.current\n if (pending) setPage(pending)\n setPending(undefined)\n setHolding(false)\n }\n const act = (work: () => void | Promise<void>) => {\n void Promise.resolve()\n .then(work)\n .catch((failure) => {\n setError(String(failure))\n client.reportError(failure)\n })\n }\n const detail = details[details.length - 1]\n // Stable identity lets memoized list rows skip re-rendering on live ticks.\n const open = useCallback((next: Detail) => {\n setHolding(true)\n setDetails((previous) => [...previous.slice(-31), next])\n }, [])\n const showEvents = (mode: 'spans' | 'marks', patch: Partial<Query>) => {\n setTab('explore')\n setMode(mode)\n setDetails([])\n setQueries((previous) => ({\n ...previous,\n [mode]: { ...defaultQuery(), ...patch },\n }))\n offsets.current[mode] = 0\n setHolding(true)\n }\n return {\n ...snapshot,\n client,\n tab,\n setTab: (next: Tab) => {\n setDetails([])\n setTab(next)\n },\n mode,\n setMode,\n page,\n telemetry,\n traces,\n topics: summary.topics,\n issues: summary.issues,\n timeline,\n screen,\n results,\n query,\n updateQuery,\n resetQuery: () => {\n setQueries((previous) => ({ ...previous, [mode]: defaultQuery() }))\n offsets.current[mode] = 0\n },\n loaded:\n mode === 'traces'\n ? traces.length\n : mode === 'spans'\n ? page.spans.length\n : page.marks.length,\n uncorrelated: useMemo(\n () =>\n page.spans.filter((s) => !s.correlationId).length +\n page.marks.filter((s) => !s.correlationId).length,\n [page.spans, page.marks]\n ),\n detail,\n detailState,\n details,\n open,\n back: () => setDetails((previous) => previous.slice(0, -1)),\n traceFor: (span: SpanEvent) => traceForSpan(traces, span),\n showSpans: (patch: Partial<Query>) => showEvents('spans', patch),\n showMarks: (patch: Partial<Query>) => showEvents('marks', patch),\n paused,\n holding,\n setHolding,\n apply,\n togglePause: () => {\n if (paused) apply()\n setPaused(!paused)\n },\n offsets,\n metrics,\n operations,\n metricQuery,\n setMetricQuery,\n metricCategory,\n setMetricCategory,\n metricSort,\n setMetricSort,\n start: () => act(client.start),\n stop: () => act(client.stop),\n export: () => act(client.export),\n sharePerfetto: () => act(() => client.shareTrace('perfetto')),\n toggleProfile: () => act(client.toggleProfile),\n shareProfile: () => act(client.shareProfile),\n playground: () => act(client.playground),\n playgroundResult: snapshot.playground,\n openPlayground: () => {\n setTab('explore')\n setMode('traces')\n setQueries((previous) => ({\n ...previous,\n traces: {\n ...defaultQuery(),\n correlation: snapshot.playground?.correlationId ?? '',\n },\n }))\n },\n }\n}\nexport type Viewer = ReturnType<typeof useTraceViewer>\n", "import type { MarkEvent, SpanEvent, TracePage } from '../types'\n\nexport type ExplorerMode = 'traces' | 'spans' | 'marks'\nexport type Sort =\n 'newest' | 'oldest' | 'longest' | 'shortest' | 'errors' | 'count' | 'name'\nexport interface Query {\n search: string\n outcomes: string[]\n sources: string[]\n minDuration: string\n from: string\n to: string\n correlation: string\n sort: Sort\n}\nexport const defaultQuery = (): Query => ({\n search: '',\n outcomes: [],\n sources: [],\n minDuration: '',\n from: '',\n to: '',\n correlation: '',\n sort: 'newest',\n})\nexport type Event = SpanEvent | MarkEvent\nexport interface Trace {\n id: string\n name: string\n start: number\n duration: number\n errors: number\n spans: SpanEvent[]\n marks: MarkEvent[]\n sources: string[]\n}\nconst isSpan = (event: Event): event is SpanEvent => 'spanId' in event\nexport const sourceOf = (event: Event): string =>\n event.attributes.find((a) => a.key === 'source')?.value || 'unknown'\nconst compareText = (a: string, b: string) => (a < b ? -1 : a > b ? 1 : 0)\nconst identity = (event: Event) =>\n isSpan(event) ? event.spanId : `mark:${event.sequence}`\nconst tie = (a: Event, b: Event) =>\n compareText(identity(a), identity(b)) || a.sequence - b.sequence\nconst chronological = (a: Event, b: Event) =>\n a.timestampMs - b.timestampMs || tie(a, b)\nconst durationOf = (event: Event) => (isSpan(event) ? event.durationMs : 0)\nconst endOf = (event: Event) => event.timestampMs + durationOf(event)\nconst numeric = (value: string): number | undefined =>\n value.trim() && Number.isFinite(Number(value)) ? Number(value) : undefined\nconst overlaps = (start: number, duration: number, query: Query) => {\n const from = numeric(query.from)\n const to = numeric(query.to)\n return (\n (from === undefined || start + duration >= from) &&\n (to === undefined || start <= to)\n )\n}\nexport const matchesSearch = (event: Event, search: string) =>\n !search ||\n [\n event.name,\n event.correlationId,\n isSpan(event) ? event.spanId : '',\n ...event.attributes.flatMap((a) => [a.key, a.value]),\n ].some((value) => value.toLowerCase().includes(search.toLowerCase()))\n\n/** A deterministic forest: missing parents are roots and cycles are cut once. */\nconst forest = (spans: SpanEvent[]) => {\n const sorted = [...spans].sort(chronological)\n const byId = new Map(sorted.map((span) => [span.spanId, span]))\n const children = new Map<SpanEvent, SpanEvent[]>()\n const roots: SpanEvent[] = []\n for (const span of sorted) {\n const parent = byId.get(span.parentSpanId)\n if (!parent || parent === span) roots.push(span)\n else {\n const siblings = children.get(parent) ?? []\n siblings.push(span)\n children.set(parent, siblings)\n }\n }\n const visited = new Set<SpanEvent>()\n const rows: Array<{\n span: SpanEvent\n depth: number\n root: SpanEvent\n parent?: SpanEvent\n children: number\n }> = []\n const rowBySpan = new Map<SpanEvent, (typeof rows)[number]>()\n for (const root of [...roots, ...sorted]) {\n if (visited.has(root)) continue\n const stack: Array<{ span: SpanEvent; depth: number; parent?: SpanEvent }> =\n [{ span: root, depth: 0 }]\n while (stack.length) {\n const next = stack.pop()!\n if (visited.has(next.span)) continue\n visited.add(next.span)\n const row = { ...next, root, children: 0 }\n rows.push(row)\n rowBySpan.set(next.span, row)\n const descendants = children.get(next.span) ?? []\n for (let i = descendants.length - 1; i >= 0; i--)\n stack.push({\n span: descendants[i],\n depth: next.depth + 1,\n parent: next.span,\n })\n }\n }\n for (let i = rows.length - 1; i >= 0; i--) {\n const row = rows[i]\n const parent = row.parent && rowBySpan.get(row.parent)\n if (parent) parent.children += row.children + 1\n }\n return rows\n}\n\nexport const buildTraces = (page: TracePage): Trace[] => {\n const groups = new Map<string, { id: string; events: Event[] }>()\n for (const event of [...page.spans, ...page.marks]) {\n if (!event.correlationId) continue\n const key = `correlation:${event.correlationId}`\n const group = groups.get(key) ?? { id: key, events: [] }\n group.events.push(event)\n groups.set(key, group)\n }\n for (const row of forest(page.spans.filter((span) => !span.correlationId))) {\n const key = `span:${row.root.spanId}`\n const group = groups.get(key) ?? { id: key, events: [] }\n group.events.push(row.span)\n groups.set(key, group)\n }\n return [...groups.values()]\n .map(({ id, events }) => {\n events.sort(chronological)\n const spans = events.filter(isSpan)\n const start = events[0].timestampMs\n const end = events.reduce(\n (latest, event) => Math.max(latest, endOf(event)),\n start\n )\n return {\n id,\n name: events[0].name,\n start,\n duration: end - start,\n errors: spans.filter((s) => s.outcome === 'error').length,\n spans,\n marks: events.filter((e) => !isSpan(e)),\n sources: [...new Set(events.map(sourceOf))].sort(compareText),\n }\n })\n .sort((a, b) => b.start - a.start || compareText(a.id, b.id))\n}\n\nexport const queryEvents = (events: Event[], query: Query): Event[] => {\n const search = query.search.toLowerCase()\n const minimum = numeric(query.minDuration)\n return events\n .filter(\n (event) =>\n matchesSearch(event, search) &&\n (!query.correlation || event.correlationId === query.correlation) &&\n (!query.sources.length || query.sources.includes(sourceOf(event))) &&\n (!isSpan(event) ||\n !query.outcomes.length ||\n query.outcomes.includes(event.outcome)) &&\n (!isSpan(event) ||\n minimum === undefined ||\n event.durationMs >= minimum) &&\n overlaps(event.timestampMs, durationOf(event), query)\n )\n .sort((a, b) => {\n let order = 0\n switch (query.sort) {\n case 'oldest':\n order = a.timestampMs - b.timestampMs\n break\n case 'longest':\n order = durationOf(b) - durationOf(a)\n break\n case 'shortest':\n order = durationOf(a) - durationOf(b)\n break\n case 'name':\n order = compareText(a.name, b.name)\n break\n case 'errors':\n order =\n Number(isSpan(b) && b.outcome === 'error') -\n Number(isSpan(a) && a.outcome === 'error')\n break\n default:\n order = b.timestampMs - a.timestampMs\n }\n return order || tie(a, b)\n })\n}\n\nexport const queryTraces = (traces: Trace[], query: Query): Trace[] => {\n const search = query.search.toLowerCase()\n const minimum = numeric(query.minDuration)\n return traces\n .filter((trace) => {\n const events: Event[] = [...trace.spans, ...trace.marks]\n return (\n (!search || events.some((event) => matchesSearch(event, search))) &&\n (!query.correlation ||\n events.some((event) => event.correlationId === query.correlation)) &&\n (!query.sources.length ||\n trace.sources.some((source) => query.sources.includes(source))) &&\n (!query.outcomes.length ||\n query.outcomes.some((outcome) =>\n outcome === 'error'\n ? trace.errors > 0\n : (outcome === 'success' || outcome === 'no-error') &&\n trace.errors === 0\n )) &&\n (minimum === undefined || trace.duration >= minimum) &&\n overlaps(trace.start, trace.duration, query)\n )\n })\n .sort((a, b) => {\n let order = 0\n switch (query.sort) {\n case 'oldest':\n order = a.start - b.start\n break\n case 'longest':\n order = b.duration - a.duration\n break\n case 'shortest':\n order = a.duration - b.duration\n break\n case 'errors':\n order = b.errors - a.errors\n break\n case 'count':\n order = b.spans.length - a.spans.length\n break\n case 'name':\n order = compareText(a.name, b.name)\n break\n default:\n order = b.start - a.start\n }\n return order || compareText(a.id, b.id)\n })\n}\n\nexport const hierarchyRows = (spans: SpanEvent[], collapsed: Set<string>) => {\n const rows = forest(spans)\n const start = spans.reduce(\n (min, span) => Math.min(min, span.timestampMs),\n Infinity\n )\n const end = spans.reduce((max, span) => Math.max(max, endOf(span)), -Infinity)\n const duration = Math.max(1, end - start)\n let hiddenBelow = Infinity\n return rows\n .filter((row) => {\n if (row.depth > hiddenBelow) return false\n hiddenBelow = collapsed.has(row.span.spanId) ? row.depth : Infinity\n return true\n })\n .map(({ span, depth, children }) => ({\n span,\n depth,\n children,\n offset: (span.timestampMs - start) / duration,\n width: span.durationMs / duration,\n }))\n}\nexport const traceForSpan = (\n traces: Trace[],\n span: SpanEvent\n): Trace | undefined =>\n traces.find((trace) =>\n trace.spans.some(\n (member) =>\n member.spanId === span.spanId && member.sequence === span.sequence\n )\n )\n", "import type { MetricEvent, SpanEvent, TracePage } from '../types'\nexport interface TraceGroup {\n id: string\n name: string\n start: number\n duration: number\n errors: number\n events: number\n}\nexport const groupTraces = (page: TracePage, query: string): TraceGroup[] => {\n const groups = new Map<string, TraceGroup>()\n for (const event of [...page.spans, ...page.marks, ...page.metrics]) {\n const id = event.correlationId || 'uncorrelated'\n const end =\n event.timestampMs +\n ('durationMs' in event && typeof event.durationMs === 'number'\n ? event.durationMs\n : 0)\n const previous = groups.get(id)\n const start = Math.min(\n previous?.start ?? event.timestampMs,\n event.timestampMs\n )\n groups.set(id, {\n id,\n name:\n previous && previous.start <= event.timestampMs\n ? previous.name\n : event.name,\n start,\n duration:\n Math.max(previous ? previous.start + previous.duration : end, end) -\n start,\n errors:\n (previous?.errors ?? 0) +\n ('outcome' in event && event.outcome === 'error' ? 1 : 0),\n events: (previous?.events ?? 0) + 1,\n })\n }\n const search = query.toLowerCase()\n const matchingIds = new Set(\n [...page.spans, ...page.marks, ...page.metrics]\n .filter((event) =>\n `${event.name} ${event.correlationId}`.toLowerCase().includes(search)\n )\n .map((event) => event.correlationId || 'uncorrelated')\n )\n return [...groups.values()]\n .filter((group) => !search || matchingIds.has(group.id))\n .sort((a, b) => b.start - a.start)\n}\nexport const waterfall = (spans: SpanEvent[]) => {\n const byId = new Map(spans.map((span) => [span.spanId, span]))\n const base = spans.length\n ? Math.min(...spans.map((span) => span.timestampMs))\n : 0\n const duration = Math.max(\n 1,\n ...spans.map((span) => span.timestampMs + span.durationMs - base)\n )\n return [...spans]\n .sort(\n (a, b) => a.timestampMs - b.timestampMs || b.durationMs - a.durationMs\n )\n .map((span) => {\n const seen = new Set([span.spanId])\n let parent = byId.get(span.parentSpanId)\n let depth = 0\n while (parent && depth < 8 && !seen.has(parent.spanId)) {\n seen.add(parent.spanId)\n depth++\n parent = byId.get(parent.parentSpanId)\n }\n return {\n span,\n depth: Math.min(depth, 8),\n offset: (span.timestampMs - base) / duration,\n width: span.durationMs / duration,\n }\n })\n}\nconst num = (value: number) =>\n Math.abs(value) >= 100 ? value.toFixed(0) : value.toFixed(1)\n/** Human value with unit: 3653 ms \u2192 \"3.65 s\", 1240 MB \u2192 \"1.21 GB\". */\nexport const formatMetric = (value: number, unit: string) => {\n if (unit === 'ms' && Math.abs(value) >= 1000)\n return `${(value / 1000).toFixed(2)} s`\n if (unit === 'MB' && Math.abs(value) >= 1024)\n return `${(value / 1024).toFixed(2)} GB`\n if (unit === 'count') return value.toFixed(0)\n if (unit === '%') return `${num(value)}%`\n if (unit.endsWith('/s')) return `${num(value)}/s`\n return `${num(value)} ${unit}`\n}\n\nexport const metricSeries = (metrics: MetricEvent[]) => {\n const groups = new Map<string, MetricEvent[]>()\n for (const metric of metrics) {\n const key = `${metric.name} (${metric.unit})`\n const group = groups.get(key) ?? []\n group.push(metric)\n groups.set(key, group)\n }\n return [...groups].map(([name, retained]) => {\n const samples = retained\n .sort((a, b) => a.timestampMs - b.timestampMs)\n .slice(-40)\n const values = retained.map((sample) => sample.value).sort((a, b) => a - b)\n return {\n latest: retained[retained.length - 1]?.value ?? 0,\n median: values.length\n ? (values[Math.floor((values.length - 1) / 2)] +\n values[Math.ceil((values.length - 1) / 2)]) /\n 2\n : 0,\n min: values[0] ?? 0,\n peak: values[values.length - 1] ?? 0,\n p95: values[Math.max(0, Math.ceil(values.length * 0.95) - 1)] ?? 0,\n name,\n /** Metric name without the unit suffix used for grouping. */\n metric: retained[0].name,\n unit: retained[0].unit,\n samples,\n retainedCount: retained.length,\n startMs: samples[0]?.timestampMs ?? 0,\n endMs: samples[samples.length - 1]?.timestampMs ?? 0,\n max: Math.max(1, ...samples.map((sample) => Math.abs(sample.value))),\n }\n })\n}\n\n/** Durations are derived from retained completed spans, not additional native samples. */\nexport const recordingMetrics = (page: TracePage) =>\n metricSeries([\n ...page.metrics,\n ...page.spans\n .filter((span) => span.outcome === 'success' || span.outcome === 'error')\n .map((span) => ({\n ...span,\n name: `duration: ${span.name}`,\n value: span.durationMs,\n unit: 'ms',\n })),\n ])\n\nexport const operationMetrics = (spans: SpanEvent[]) => {\n const groups = new Map<string, SpanEvent[]>()\n for (const span of spans) {\n const group = groups.get(span.name) ?? []\n group.push(span)\n groups.set(span.name, group)\n }\n return [...groups]\n .map(([name, samples]) => {\n const completed = samples.filter(\n (s) => s.outcome === 'success' || s.outcome === 'error'\n )\n return {\n name,\n count: samples.length,\n errors: completed.filter((s) => s.outcome === 'error').length,\n errorRate: completed.length\n ? (completed.filter((s) => s.outcome === 'error').length /\n completed.length) *\n 100\n : undefined,\n cancelled: samples.filter((s) => s.outcome === 'cancelled').length,\n interrupted: samples.filter((s) => s.outcome === 'interrupted').length,\n }\n })\n .sort((a, b) => b.count - a.count)\n}\n", "import type { MarkEvent, MetricEvent, SpanEvent, TracePage } from '../types'\n\nexport type TopicId =\n | 'startup'\n | 'screens'\n | 'network'\n | 'responsiveness'\n | 'resources'\n | 'errors'\n | 'custom'\nexport const topicIds: TopicId[] = [\n 'startup',\n 'screens',\n 'network',\n 'responsiveness',\n 'resources',\n 'errors',\n 'custom',\n]\n/** Text-presentation glyphs (no color emoji) and system tints per topic. */\nexport const topicGlyph: Record<TopicId, { icon: string; color: string }> = {\n startup: { icon: '\u25F4', color: '#ff9500' },\n screens: { icon: '\u25A2', color: '#007aff' },\n network: { icon: '\u21C5', color: '#34c759' },\n responsiveness: { icon: '\u25F7', color: '#5856d6' },\n errors: { icon: '\u25B3', color: '#ff3b30' },\n resources: { icon: '\u25EB', color: '#30b0c7' },\n custom: { icon: '\u2022', color: '#8e8e93' },\n}\n/** Local triage thresholds, not production SLOs. */\nexport interface Budgets {\n appReadyMs: number\n screenMs: number\n requestMs: number\n stallMs: number\n}\nexport const defaultBudgets: Budgets = {\n appReadyMs: 2000,\n screenMs: 1000,\n requestMs: 1000,\n stallMs: 250,\n}\nexport type AnyEvent = SpanEvent | MarkEvent | MetricEvent\nexport type IssueKind =\n | 'slowStartup'\n | 'slowScreen'\n | 'slowRequest'\n | 'failedRequest'\n | 'stall'\n | 'uiStall'\n | 'frozenFrames'\n | 'error'\nexport interface Issue {\n kind: IssueKind\n topic: TopicId\n title: string\n valueMs?: number\n budgetMs?: number\n event: AnyEvent\n /** Errors outrank budget overruns; overruns rank by value / budget. */\n severity: number\n}\nexport interface TopicSummary {\n id: TopicId\n /** A collector is configured or the topic has events. */\n tracked: boolean\n count: number\n /** Nearest-rank p95 (screens: transition, network: duration) or latest app-ready. */\n value?: number\n /** Extra headline values, e.g. resources: latest cpu and memory. */\n values?: Record<string, string>\n issues: Issue[]\n}\n/** Collector plugin IDs that make a quiet topic \"tracked\" rather than \"not tracked\". */\nconst collectorsFor: Record<TopicId, string[]> = {\n startup: [],\n screens: ['navigation'],\n network: ['network', 'sentry'],\n responsiveness: ['runtime-metrics', 'native-metrics', 'sentry'],\n resources: ['native-metrics'],\n errors: ['errors'],\n custom: [],\n}\nexport const attribute = (event: AnyEvent, key: string) =>\n event.attributes.find((a) => a.key === key)?.value\nconst isSpan = (event: AnyEvent): event is SpanEvent => 'spanId' in event\nconst isMetric = (event: AnyEvent): event is MetricEvent => 'unit' in event\n\nexport const topicOf = (event: AnyEvent): TopicId => {\n const source = attribute(event, 'source')\n if (\n event.name.startsWith('app.ready.') ||\n event.name.startsWith('app.start.')\n )\n return 'startup'\n if (event.name.startsWith('process.')) return 'resources'\n if (event.name.startsWith('ui.')) return 'responsiveness'\n if (source === 'navigation') return 'screens'\n if (source === 'network') return 'network'\n if (source === 'error') return 'errors'\n if (source === 'js-runtime' || event.name === 'js.longtask')\n return 'responsiveness'\n return 'custom'\n}\nconst p95 = (values: number[]) => {\n if (!values.length) return undefined\n const sorted = [...values].sort((a, b) => a - b)\n return sorted[Math.max(0, Math.ceil(sorted.length * 0.95) - 1)]\n}\nconst over = (\n kind: IssueKind,\n topic: TopicId,\n title: string,\n event: AnyEvent,\n valueMs: number,\n budgetMs: number\n): Issue | undefined =>\n valueMs > budgetMs\n ? {\n kind,\n topic,\n title,\n event,\n valueMs,\n budgetMs,\n severity: valueMs / budgetMs,\n }\n : undefined\n\nexport const summarizeTopics = (\n page: TracePage,\n collectors: readonly string[],\n budgets: Budgets = defaultBudgets\n): { topics: TopicSummary[]; issues: Issue[] } => {\n const byTopic = new Map<TopicId, AnyEvent[]>(topicIds.map((id) => [id, []]))\n for (const event of [...page.spans, ...page.marks, ...page.metrics])\n byTopic.get(topicOf(event))!.push(event)\n const issues: Issue[] = []\n const add = (issue: Issue | undefined) => issue && issues.push(issue)\n for (const event of [...page.spans, ...page.marks, ...page.metrics]) {\n const topic = topicOf(event)\n if (isMetric(event)) {\n if (topic === 'startup')\n add(\n over(\n 'slowStartup',\n topic,\n event.name,\n event,\n event.value,\n budgets.appReadyMs\n )\n )\n else if (event.name === 'navigation.transition')\n add(\n over(\n 'slowScreen',\n topic,\n attribute(event, 'screen') ?? event.name,\n event,\n event.value,\n budgets.screenMs\n )\n )\n else if (event.name === 'ui.frame_gap.max')\n add(\n over(\n 'uiStall',\n topic,\n event.name,\n event,\n event.value,\n budgets.stallMs\n )\n )\n else if (event.name === 'ui.frames.frozen' && event.value > 0)\n add({\n kind: 'frozenFrames',\n topic,\n title: `${event.value} frozen frames`,\n event,\n severity: 900,\n })\n else if (\n event.name === 'js.frame_gap.max' ||\n event.name === 'js.event_loop.delay'\n )\n add(\n over('stall', topic, event.name, event, event.value, budgets.stallMs)\n )\n } else if (isSpan(event)) {\n if (topic === 'network')\n add(\n event.outcome === 'error'\n ? {\n kind: 'failedRequest',\n topic,\n title: event.name,\n event,\n severity: 1000,\n }\n : over(\n 'slowRequest',\n topic,\n event.name,\n event,\n event.durationMs,\n budgets.requestMs\n )\n )\n else if (event.name === 'js.longtask')\n add(\n over(\n 'stall',\n topic,\n event.name,\n event,\n event.durationMs,\n budgets.stallMs\n )\n )\n else if (event.outcome === 'error')\n add({\n kind: 'error',\n topic: 'errors',\n title: event.name,\n event,\n severity: 1000,\n })\n } else if (topic === 'errors')\n add({\n kind: 'error',\n topic,\n title: attribute(event, 'message') ?? event.name,\n event,\n severity: 1000,\n })\n }\n issues.sort(\n (a, b) =>\n b.severity - a.severity || b.event.timestampMs - a.event.timestampMs\n )\n const topics = topicIds.map((id): TopicSummary => {\n const events = byTopic.get(id)!\n const own = issues.filter((issue) => issue.topic === id)\n const metricValues = (name: string) =>\n events\n .filter((e): e is MetricEvent => isMetric(e) && e.name === name)\n .map((e) => e.value)\n const spans = events.filter(isSpan)\n const summary = {\n id,\n tracked:\n id === 'custom' ||\n events.length > 0 ||\n collectorsFor[id].some((collector) => collectors.includes(collector)),\n issues: own,\n }\n switch (id) {\n case 'startup':\n return {\n ...summary,\n count: events.length,\n value: events.filter(isMetric).at(-1)?.value,\n }\n case 'screens':\n return {\n ...summary,\n count: events.filter((e) => e.name === 'navigation.enter').length,\n value: p95(metricValues('navigation.transition')),\n }\n case 'network':\n return {\n ...summary,\n count: spans.length,\n value: p95(spans.map((s) => s.durationMs)),\n }\n case 'resources': {\n const latest = (name: string) => {\n const values = metricValues(name)\n return values.length ? values[values.length - 1].toFixed(0) : '\u2014'\n }\n return {\n ...summary,\n count: events.length,\n values: {\n cpu: latest('process.cpu'),\n memory: latest('process.memory'),\n },\n }\n }\n case 'responsiveness':\n case 'errors':\n return { ...summary, count: own.length }\n default:\n return { ...summary, count: spans.length }\n }\n })\n return { topics, issues }\n}\n\nexport type TimelineItem =\n | { kind: 'screen'; key: string; name: string; timestampMs: number }\n | {\n kind: 'event'\n key: string\n event: AnyEvent\n topic: TopicId\n issue: boolean\n }\n/**\n * Newest screen visit first, each followed by its events newest first. Visits come from\n * `navigation.enter` marks, so the active screen appears before its visit span completes.\n * Metrics are listed only when they are issues; periodic samples belong in Metrics.\n */\nexport const buildTimeline = (\n page: TracePage,\n issues: readonly Issue[],\n limit = 500\n): TimelineItem[] => {\n const flagged = new Set<AnyEvent>(issues.map((issue) => issue.event))\n const visits = page.marks\n .filter(\n (m) =>\n m.name === 'navigation.enter' && attribute(m, 'source') === 'navigation'\n )\n .sort((a, b) => a.timestampMs - b.timestampMs)\n const visitSet = new Set<AnyEvent>(visits)\n const events = [\n ...page.spans.filter((s) => attribute(s, 'source') !== 'navigation'),\n ...page.marks.filter((m) => !visitSet.has(m)),\n ...page.metrics.filter((m) => flagged.has(m)),\n ]\n .sort((a, b) => b.timestampMs - a.timestampMs || b.sequence - a.sequence)\n .slice(0, limit)\n const groups = new Map<number, AnyEvent[]>()\n for (const event of events) {\n // ponytail: linear scan per event; binary search if visit counts grow large.\n let index = -1\n for (let i = visits.length - 1; i >= 0; i--)\n if (visits[i].timestampMs <= event.timestampMs) {\n index = i\n break\n }\n const group = groups.get(index) ?? []\n group.push(event)\n groups.set(index, group)\n }\n const items: TimelineItem[] = []\n for (let index = visits.length - 1; index >= -1; index--) {\n const group = groups.get(index) ?? []\n const visit = visits[index]\n if (!visit && !group.length) continue\n if (visits.length)\n items.push({\n kind: 'screen',\n key: visit ? `screen:${visit.sequence}` : 'screen:before',\n name: visit ? (attribute(visit, 'screen') ?? '') : '',\n timestampMs: visit?.timestampMs ?? 0,\n })\n for (const event of group)\n items.push({\n kind: 'event',\n key: `${'spanId' in event ? event.spanId : 'unit' in event ? 'metric' : 'mark'}:${event.sequence}`,\n event,\n topic: topicOf(event),\n issue: flagged.has(event),\n })\n }\n return items\n}\nexport const currentScreen = (page: TracePage) => {\n let latest: MarkEvent | undefined\n for (const mark of page.marks)\n if (\n mark.name === 'navigation.enter' &&\n (!latest || mark.timestampMs >= latest.timestampMs)\n )\n latest = mark\n return latest && attribute(latest, 'screen')\n}\n\nexport interface VisitSummary {\n /** Undefined when no navigation collector has recorded a screen yet. */\n screen?: string\n sinceMs?: number\n events: Extract<TimelineItem, { kind: 'event' }>[]\n requests: number\n stalls: number\n errors: number\n issues: number\n}\n/** The newest screen visit in a timeline: what happened on the screen the user is looking at. */\nexport const currentVisit = (items: readonly TimelineItem[]): VisitSummary => {\n const start = items.findIndex((item) => item.kind === 'screen')\n const header = start >= 0 ? items[start] : undefined\n const next = items.findIndex((item, i) => i > start && item.kind === 'screen')\n const events = items\n .slice(start + 1, start >= 0 && next >= 0 ? next : undefined)\n .filter((item) => item.kind === 'event')\n const count = (test: (item: (typeof events)[number]) => boolean) =>\n events.filter(test).length\n return {\n screen: header?.kind === 'screen' ? header.name : undefined,\n sinceMs: header?.kind === 'screen' ? header.timestampMs : undefined,\n events,\n requests: count((item) => item.topic === 'network'),\n stalls: count((item) => item.topic === 'responsiveness' && item.issue),\n errors: count(\n (item) =>\n item.topic === 'errors' ||\n ('outcome' in item.event && item.event.outcome === 'error')\n ),\n issues: count((item) => item.issue),\n }\n}\n/** Latest sample of a metric by name; undefined when not collected. */\nexport const latestMetric = (page: TracePage, name: string) => {\n let latest: MetricEvent | undefined\n for (const metric of page.metrics)\n if (\n metric.name === name &&\n (!latest || metric.timestampMs >= latest.timestampMs)\n )\n latest = metric\n return latest?.value\n}\n", "import React from 'react'\nimport { Alert, StyleSheet, Text, View } from 'react-native'\nimport { useStore } from './store'\nimport { useMenu } from './native'\nimport type { Viewer } from './useTraceViewer'\nimport type { InspectorTranslator } from './labels'\nimport { apple, Banner, NavBar, palette, TextButton } from './InspectorControls'\n\nconst titleKey = {\n trace: 'traces',\n span: 'spans',\n metric: 'metrics',\n mark: 'marks',\n} as const\nconst tabKey = {\n overview: 'overview',\n timeline: 'timeline',\n explore: 'explore',\n metrics: 'metrics',\n tools: 'tools',\n} as const\n\n/** Navigation bar, status line and live-update banner. Only this subscribes to the 1 s telemetry tick. */\nexport function InspectorHeader({\n v: viewer,\n t,\n}: {\n v: Viewer\n t: InspectorTranslator\n}) {\n const live = useStore(viewer.telemetry, (s) => s)\n const v = { ...viewer, ...live }\n const client = v.client\n const menu = useMenu()\n const canShare = client.canShare && !!v.stats && !v.busy\n const startNew = () =>\n Alert.alert(t('replaceTitle'), t('replaceDescription'), [\n { text: t('cancel'), style: 'cancel' },\n { text: t('start'), style: 'destructive', onPress: v.start },\n ])\n const seconds = Math.round((v.stats?.nowMs ?? 0) / 1000)\n // Say what is missing, not only how much: lost spans matter more than samples.\n const lost = (\n [\n ['lostSpans', v.stats?.droppedSpans],\n ['lostMarks', v.stats?.droppedMarks],\n ['lostMetrics', v.stats?.droppedMetrics],\n ] as const\n )\n .filter(([, count]) => (count ?? 0) > 0)\n .map(([key, count]) => t(key, { count }))\n const newEvents = v.pending\n ? Math.max(0, v.pending.nextSequence - v.page.nextSequence)\n : 0\n return (\n <View style={styles.root}>\n <NavBar\n left={\n v.detail ? (\n <TextButton label={`\u2039 ${t('back')}`} onPress={v.back} />\n ) : (\n <TextButton label={t('done')} onPress={client.close} bold />\n )\n }\n title={t(v.detail ? titleKey[v.detail.kind] : tabKey[v.tab])}\n right={\n <>\n <TextButton\n icon=\"\u21EA\"\n accessibilityLabel={t('share')}\n onPress={() =>\n menu.open({\n title: t('shareTitle'),\n cancelLabel: t('cancel'),\n options: [\n {\n label: t('sharePerfetto'),\n onPress: v.sharePerfetto,\n disabled: !canShare,\n },\n {\n label: t('exportAll'),\n onPress: v.export,\n disabled: !canShare,\n },\n ...(v.profilePath && client.canShareProfile\n ? [{ label: t('shareProfile'), onPress: v.shareProfile }]\n : []),\n ],\n })\n }\n disabled={!canShare && !v.profilePath}\n />\n <TextButton\n icon=\"\u22EF\"\n accessibilityLabel={t('more')}\n onPress={() =>\n menu.open({\n cancelLabel: t('cancel'),\n options: [\n v.recording\n ? { label: t('stop'), onPress: v.stop, destructive: true }\n : { label: t('start'), onPress: v.start },\n ...(v.recording\n ? [{ label: t('startNew'), onPress: startNew }]\n : []),\n {\n label: t(v.paused ? 'resumeUpdates' : 'pauseUpdates'),\n onPress: v.togglePause,\n },\n { label: t('tools'), onPress: () => v.setTab('tools') },\n ],\n })\n }\n />\n </>\n }\n />\n <Text style={styles.status} numberOfLines={1}>\n <Text style={{ color: v.recording ? palette.error : apple.secondary }}>\n {v.recording ? '\u25CF' : '\u25CB'}\n </Text>{' '}\n {t(v.recording ? 'recording' : 'stopped')} \u00B7 {Math.floor(seconds / 60)}:\n {String(seconds % 60).padStart(2, '0')} \u00B7 {v.stats?.eventCount ?? 0}{' '}\n {t('events')}\n {v.screen ? ` \u00B7 ${v.screen}` : ''}\n {v.paused ? ` \u00B7 ${t('frozen')}` : ''}\n </Text>\n {lost.length > 0 && (\n <Text style={styles.warning}>\n {t('lostHistory', { what: lost.join(', ') })}\n </Text>\n )}\n {v.error && (\n <Text selectable style={styles.warning} numberOfLines={3}>\n {v.error}\n </Text>\n )}\n {!v.detail && newEvents > 0 && !v.paused && (\n <Banner\n label={t('newEvents', { count: newEvents })}\n onPress={v.apply}\n />\n )}\n {menu.element}\n </View>\n )\n}\n\nconst styles = StyleSheet.create({\n root: {\n backgroundColor: apple.grouped,\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderColor: apple.separator,\n paddingBottom: 8,\n },\n status: {\n fontSize: 13,\n color: apple.secondary,\n textAlign: 'center',\n paddingHorizontal: 16,\n fontVariant: ['tabular-nums'],\n },\n warning: {\n fontSize: 13,\n color: palette.error,\n textAlign: 'center',\n paddingHorizontal: 16,\n marginTop: 4,\n },\n})\n", "import React, { useCallback, useState, type ReactNode } from 'react'\nimport {\n ActionSheetIOS,\n Platform,\n View,\n type ColorValue,\n type StyleProp,\n type ViewStyle,\n} from 'react-native'\nimport { ActionSheet, type SheetOption } from './InspectorControls'\n\n/**\n * Native building blocks with React Native fallbacks. Optional peers are required directly\n * inside `try` so Metro treats them as optional; apps without them get the RN UI.\n */\ntype BottomTabs = typeof import('react-native-bottom-tabs').default\ntype GlassModule = typeof import('expo-glass-effect')\nlet NativeTabView: BottomTabs | undefined\nlet glass: GlassModule | undefined\ntry {\n NativeTabView = require('react-native-bottom-tabs').default\n} catch {\n NativeTabView = undefined\n}\ntry {\n glass = require('expo-glass-effect')\n} catch {\n glass = undefined\n}\nconst liquidGlass = (() => {\n try {\n return Platform.OS === 'ios' && !!glass?.isLiquidGlassAvailable()\n } catch {\n return false\n }\n})()\n\nexport interface MenuConfig {\n title?: string\n options: SheetOption[]\n cancelLabel: string\n}\n/**\n * `open(config)` shows a native action sheet on iOS (UIAlertController, Liquid Glass on\n * iOS 26) and the RN sheet elsewhere; render `element` once in the calling component.\n */\nexport function useMenu() {\n const [config, setConfig] = useState<MenuConfig>()\n const open = useCallback((next: MenuConfig) => {\n if (Platform.OS !== 'ios') return setConfig(next)\n const enabled = next.options.filter((option) => !option.disabled)\n const destructive = enabled.findIndex((option) => option.destructive)\n ActionSheetIOS.showActionSheetWithOptions(\n {\n title: next.title,\n options: [\n ...enabled.map(\n (option) => `${option.selected ? '\u2713 ' : ''}${option.label}`\n ),\n next.cancelLabel,\n ],\n cancelButtonIndex: enabled.length,\n destructiveButtonIndex: destructive >= 0 ? destructive : undefined,\n },\n (index) => enabled[index]?.onPress()\n )\n }, [])\n const element = config ? (\n <ActionSheet {...config} close={() => setConfig(undefined)} />\n ) : null\n return { open, element }\n}\n\nexport interface NativeTab<K extends string> {\n key: K\n title: string\n /** SF Symbol name for the native iOS tab bar. */\n sfSymbol: string\n badge?: string\n render: () => ReactNode\n}\n/**\n * Native tab bar (UITabBarController / Material) when react-native-bottom-tabs is\n * installed; inactive screens are lazy and frozen so live ticks only render the visible tab.\n */\nexport function NativeTabs<K extends string>({\n tabs,\n value,\n onChange,\n tint,\n fallback,\n}: {\n tabs: NativeTab<K>[]\n value: K\n onChange: (key: K) => void\n tint: ColorValue\n fallback: (content: ReactNode) => ReactNode\n}) {\n const index = Math.max(\n 0,\n tabs.findIndex((tab) => tab.key === value)\n )\n // ponytail: iOS only. Android's Material tab bar needs a MaterialComponents app theme\n // (crashes on AppCompat hosts) and image icons instead of SF Symbols.\n if (!NativeTabView || Platform.OS !== 'ios')\n return <>{fallback(tabs[index]?.render())}</>\n return (\n <NativeTabView\n navigationState={{\n index,\n routes: tabs.map((tab) => ({\n key: tab.key,\n title: tab.title,\n focusedIcon: { sfSymbol: tab.sfSymbol } as never,\n badge: tab.badge,\n })),\n }}\n onIndexChange={(next) => onChange(tabs[next].key)}\n renderScene={({ route }) =>\n tabs.find((tab) => tab.key === route.key)?.render() ?? null\n }\n getLazy={() => true}\n getFreezeOnBlur={() => true}\n getBadge={({ route }) => tabs.find((tab) => tab.key === route.key)?.badge}\n minimizeBehavior=\"onScrollDown\"\n tabBarActiveTintColor={tint}\n hapticFeedbackEnabled\n />\n )\n}\n\n/** Liquid Glass surface on iOS 26 (expo-glass-effect); a solid fallback elsewhere. */\nexport function Glass({\n style,\n fallbackColor,\n children,\n interactive,\n}: {\n style?: StyleProp<ViewStyle>\n fallbackColor: ColorValue\n children?: ReactNode\n interactive?: boolean\n}) {\n if (liquidGlass && glass) {\n const { GlassView } = glass\n return (\n <GlassView\n style={style}\n glassEffectStyle=\"regular\"\n isInteractive={interactive}\n >\n {children}\n </GlassView>\n )\n }\n return (\n <View style={[style, { backgroundColor: fallbackColor }]}>{children}</View>\n )\n}\n", "import React from 'react'\nimport {\n Modal,\n Pressable,\n StyleSheet,\n Text,\n TextInput,\n View,\n} from 'react-native'\nimport { SafeAreaView } from 'react-native-safe-area-context'\nexport const palette = {\n // Light system colors, in the spirit of Xcode Instruments.\n bg: '#ffffff',\n panel: '#f2f2f7',\n line: '#d8d8dc',\n text: '#1d1d1f',\n muted: '#6e6e73',\n accent: '#007aff',\n selected: '#e5efff',\n error: '#ff3b30',\n scrim: '#0003',\n}\nexport const ui = StyleSheet.create({\n bottomNav: {\n borderTopWidth: StyleSheet.hairlineWidth,\n borderColor: palette.line,\n paddingHorizontal: 10,\n paddingVertical: 8,\n alignItems: 'center',\n },\n root: { flex: 1, backgroundColor: palette.bg },\n header: {\n padding: 14,\n gap: 10,\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderColor: palette.line,\n },\n row: { flexDirection: 'row', alignItems: 'center', gap: 8, flexWrap: 'wrap' },\n spread: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 10,\n },\n content: { padding: 16, gap: 12 },\n title: {\n fontSize: 21,\n fontWeight: '700',\n color: palette.text,\n flexShrink: 1,\n },\n heading: { fontSize: 16, fontWeight: '600', color: palette.text },\n text: { fontSize: 14, color: palette.text },\n muted: { fontSize: 12, lineHeight: 18, color: palette.muted },\n error: { color: palette.error, fontSize: 13 },\n card: {\n padding: 14,\n borderRadius: 10,\n backgroundColor: palette.panel,\n gap: 9,\n },\n item: {\n padding: 15,\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderColor: palette.line,\n gap: 6,\n },\n input: {\n borderWidth: 1,\n borderColor: palette.line,\n borderRadius: 8,\n paddingHorizontal: 12,\n paddingVertical: 10,\n color: palette.text,\n fontSize: 14,\n },\n button: {\n paddingHorizontal: 12,\n paddingVertical: 8,\n borderRadius: 7,\n backgroundColor: palette.panel,\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: palette.line,\n },\n selected: { backgroundColor: palette.selected, borderColor: palette.accent },\n buttonText: { color: palette.text, fontSize: 13, fontWeight: '500' },\n selectedText: { color: palette.accent },\n link: { color: palette.accent, fontSize: 13 },\n chart: { height: 86, flexDirection: 'row', gap: 2, alignItems: 'flex-end' },\n bar: { flex: 1, backgroundColor: palette.accent, minHeight: 2 },\n track: {\n height: 7,\n backgroundColor: palette.panel,\n borderRadius: 3,\n overflow: 'hidden',\n },\n})\nexport function Button({\n label,\n onPress,\n selected,\n disabled,\n testID,\n}: {\n label: string\n onPress: () => void\n selected?: boolean\n disabled?: boolean\n testID?: string\n}) {\n return (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityState={{ selected, disabled }}\n testID={testID}\n disabled={disabled}\n onPress={onPress}\n style={[ui.button, selected && ui.selected, disabled && { opacity: 0.4 }]}\n >\n <Text style={[ui.buttonText, selected && ui.selectedText]}>{label}</Text>\n </Pressable>\n )\n}\nexport function Field({\n label,\n value,\n onChange,\n numeric = false,\n}: {\n label: string\n value: string\n onChange: (value: string) => void\n numeric?: boolean\n}) {\n return (\n <View style={{ gap: 4 }}>\n <Text style={ui.muted}>{label}</Text>\n <TextInput\n accessibilityLabel={label}\n placeholder={label}\n placeholderTextColor={palette.muted}\n value={value}\n onChangeText={onChange}\n keyboardType={numeric ? 'decimal-pad' : 'default'}\n autoCapitalize=\"none\"\n autoCorrect={false}\n style={ui.input}\n />\n </View>\n )\n}\n\n// \u2500\u2500 Apple-style primitives: grouped lists, bars and sheets \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nexport const apple = {\n grouped: '#f2f2f7',\n card: '#ffffff',\n separator: '#c6c6c8',\n secondary: '#8e8e93',\n fill: '#e3e3e8',\n}\nconst hairline = StyleSheet.hairlineWidth\nconst s = StyleSheet.create({\n navBar: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 8,\n minHeight: 44,\n backgroundColor: apple.grouped,\n },\n navSide: { flex: 1, flexDirection: 'row', alignItems: 'center', gap: 4 },\n navTitle: {\n fontSize: 17,\n fontWeight: '600',\n color: palette.text,\n textAlign: 'center',\n },\n textButton: { paddingHorizontal: 8, paddingVertical: 10 },\n textButtonLabel: { fontSize: 17, color: palette.accent },\n iconLabel: { fontSize: 20, color: palette.accent },\n section: { marginHorizontal: 16, marginTop: 20 },\n sectionHeader: {\n fontSize: 13,\n color: apple.secondary,\n textTransform: 'uppercase',\n marginLeft: 16,\n marginBottom: 6,\n },\n sectionFooter: {\n fontSize: 13,\n color: apple.secondary,\n marginHorizontal: 16,\n marginTop: 6,\n lineHeight: 18,\n },\n sectionBody: {\n backgroundColor: apple.card,\n borderRadius: 10,\n overflow: 'hidden',\n },\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n minHeight: 44,\n paddingVertical: 8,\n paddingLeft: 16,\n paddingRight: 12,\n backgroundColor: apple.card,\n gap: 12,\n },\n rowSeparator: {\n position: 'absolute',\n left: 16,\n right: 0,\n bottom: 0,\n height: hairline,\n backgroundColor: apple.separator,\n },\n rowIcon: { width: 22, textAlign: 'center', fontSize: 17 },\n rowText: { flex: 1, gap: 2 },\n rowTitle: { fontSize: 16, color: palette.text },\n rowSubtitle: { fontSize: 12, color: apple.secondary },\n rowValue: {\n fontSize: 15,\n fontWeight: '500',\n color: apple.secondary,\n fontVariant: ['tabular-nums'],\n },\n chevron: { fontSize: 20, color: '#c4c4c7', marginLeft: -4 },\n check: { width: 20, fontSize: 17, fontWeight: '600', color: palette.accent },\n pressed: { backgroundColor: '#e5e5ea' },\n search: {\n flexDirection: 'row',\n alignItems: 'center',\n marginHorizontal: 16,\n marginTop: 8,\n paddingHorizontal: 8,\n height: 36,\n borderRadius: 10,\n backgroundColor: apple.fill,\n gap: 6,\n },\n searchInput: { flex: 1, fontSize: 16, color: palette.text, padding: 0 },\n segmented: {\n flexDirection: 'row',\n marginHorizontal: 16,\n marginTop: 10,\n padding: 2,\n borderRadius: 9,\n backgroundColor: apple.fill,\n },\n segment: {\n flex: 1,\n height: 28,\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 4,\n borderRadius: 7,\n },\n segmentOn: {\n backgroundColor: apple.card,\n shadowColor: '#000',\n shadowOpacity: 0.12,\n shadowRadius: 3,\n shadowOffset: { width: 0, height: 1 },\n elevation: 1,\n },\n segmentText: { fontSize: 13, fontWeight: '500', color: palette.text },\n segmentTextOn: { fontWeight: '600' },\n tabBar: {\n flexDirection: 'row',\n borderTopWidth: hairline,\n borderColor: apple.separator,\n backgroundColor: '#f9f9f9',\n paddingTop: 6,\n paddingBottom: 4,\n },\n tab: { flex: 1, alignItems: 'center', gap: 2 },\n tabIcon: {\n height: 26,\n fontSize: 20,\n lineHeight: 26,\n textAlign: 'center',\n color: apple.secondary,\n },\n tabLabel: { fontSize: 10, fontWeight: '500', color: apple.secondary },\n tabOn: { color: palette.accent },\n banner: {\n flexDirection: 'row',\n justifyContent: 'center',\n alignSelf: 'center',\n marginTop: 8,\n paddingHorizontal: 14,\n paddingVertical: 6,\n borderRadius: 16,\n backgroundColor: palette.accent,\n },\n bannerText: { color: '#fff', fontSize: 13, fontWeight: '600' },\n scrim: {\n flex: 1,\n backgroundColor: palette.scrim,\n justifyContent: 'flex-end',\n },\n sheet: { padding: 8, gap: 8 },\n sheetGroup: {\n backgroundColor: 'rgba(249,249,249,0.97)',\n borderRadius: 14,\n overflow: 'hidden',\n },\n sheetTitle: {\n fontSize: 13,\n color: apple.secondary,\n textAlign: 'center',\n padding: 14,\n borderBottomWidth: hairline,\n borderColor: apple.separator,\n },\n sheetOption: {\n minHeight: 57,\n alignItems: 'center',\n justifyContent: 'center',\n borderBottomWidth: hairline,\n borderColor: apple.separator,\n paddingHorizontal: 16,\n },\n sheetOptionText: { fontSize: 20, color: palette.accent },\n sheetCancel: { fontWeight: '600' },\n})\n\nexport function NavBar({\n left,\n title,\n right,\n}: {\n left?: React.ReactNode\n title: string\n right?: React.ReactNode\n}) {\n return (\n <View style={s.navBar}>\n <View style={s.navSide}>{left}</View>\n <Text style={s.navTitle} numberOfLines={1} accessibilityRole=\"header\">\n {title}\n </Text>\n <View style={[s.navSide, { justifyContent: 'flex-end' }]}>{right}</View>\n </View>\n )\n}\n/** Blue text or glyph button, as in iOS navigation bars and toolbars. */\nexport function TextButton({\n label,\n icon,\n onPress,\n disabled,\n bold,\n accessibilityLabel,\n}: {\n label?: string\n icon?: string\n onPress: () => void\n disabled?: boolean\n bold?: boolean\n accessibilityLabel?: string\n}) {\n return (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={accessibilityLabel ?? label}\n disabled={disabled}\n onPress={onPress}\n hitSlop={6}\n style={[s.textButton, disabled && { opacity: 0.35 }]}\n >\n <Text\n style={[\n icon ? s.iconLabel : s.textButtonLabel,\n bold && { fontWeight: '600' },\n ]}\n >\n {icon ?? label}\n </Text>\n </Pressable>\n )\n}\nexport function Section({\n header,\n footer,\n children,\n}: {\n header?: string\n footer?: string\n children: React.ReactNode\n}) {\n return (\n <View style={s.section}>\n {header && <Text style={s.sectionHeader}>{header}</Text>}\n <View style={s.sectionBody}>{children}</View>\n {footer && <Text style={s.sectionFooter}>{footer}</Text>}\n </View>\n )\n}\nexport interface RowProps {\n title: string\n subtitle?: string\n value?: string\n icon?: string\n iconColor?: string\n /** Tints title and value, e.g. errors. */\n tint?: string\n onPress?: () => void\n /** Hide the separator on the last row of a section. */\n last?: boolean\n /** Toggle row: shows a checkmark instead of a disclosure chevron. */\n checked?: boolean\n}\n/** Memoized: unchanged rows skip re-rendering when live data ticks. */\nexport const Row = React.memo(function Row({\n title,\n subtitle,\n value,\n icon,\n iconColor,\n tint,\n onPress,\n last,\n checked,\n}: RowProps) {\n return (\n <Pressable\n accessibilityRole={\n checked !== undefined ? 'checkbox' : onPress ? 'button' : undefined\n }\n accessibilityState={checked !== undefined ? { checked } : undefined}\n disabled={!onPress}\n onPress={onPress}\n style={({ pressed }) => [s.row, pressed && s.pressed]}\n >\n {icon !== undefined && (\n <Text style={[s.rowIcon, { color: iconColor ?? palette.accent }]}>\n {icon}\n </Text>\n )}\n <View style={s.rowText}>\n <Text\n style={[s.rowTitle, tint && { color: tint }]}\n numberOfLines={1}\n ellipsizeMode=\"middle\"\n >\n {title}\n </Text>\n {!!subtitle && (\n <Text style={s.rowSubtitle} numberOfLines={2}>\n {subtitle}\n </Text>\n )}\n </View>\n {!!value && (\n <Text style={[s.rowValue, tint && { color: tint }]}>{value}</Text>\n )}\n {checked !== undefined ? (\n <Text style={s.check}>{checked ? '\u2713' : ''}</Text>\n ) : (\n onPress && <Text style={s.chevron}>\u203A</Text>\n )}\n {!last && <View style={s.rowSeparator} />}\n </Pressable>\n )\n})\nexport function SearchField({\n value,\n onChange,\n placeholder,\n}: {\n value: string\n onChange: (value: string) => void\n placeholder: string\n}) {\n return (\n <View style={s.search}>\n <Text style={{ color: apple.secondary, fontSize: 20 }}>\u2315</Text>\n <TextInput\n accessibilityLabel={placeholder}\n placeholder={placeholder}\n placeholderTextColor={apple.secondary}\n value={value}\n onChangeText={onChange}\n autoCapitalize=\"none\"\n autoCorrect={false}\n clearButtonMode=\"while-editing\"\n returnKeyType=\"search\"\n style={s.searchInput}\n />\n </View>\n )\n}\nexport function Segmented<T extends string>({\n options,\n value,\n onChange,\n}: {\n options: readonly { value: T; label: string }[]\n value: T\n onChange: (value: T) => void\n}) {\n return (\n <View style={s.segmented} accessibilityRole=\"tablist\">\n {options.map((option) => (\n <Pressable\n key={option.value}\n accessibilityRole=\"tab\"\n accessibilityState={{ selected: option.value === value }}\n onPress={() => onChange(option.value)}\n style={[s.segment, option.value === value && s.segmentOn]}\n >\n <Text\n style={[s.segmentText, option.value === value && s.segmentTextOn]}\n numberOfLines={1}\n adjustsFontSizeToFit\n minimumFontScale={0.8}\n >\n {option.label}\n </Text>\n </Pressable>\n ))}\n </View>\n )\n}\nexport function TabBar<T extends string>({\n items,\n value,\n onChange,\n}: {\n items: readonly { value: T; label: string; icon: string; iconSize?: number }[]\n value: T\n onChange: (value: T) => void\n}) {\n return (\n <View style={s.tabBar} accessibilityRole=\"tablist\">\n {items.map((item) => {\n const on = item.value === value\n return (\n <Pressable\n key={item.value}\n accessibilityRole=\"tab\"\n accessibilityState={{ selected: on }}\n onPress={() => onChange(item.value)}\n style={s.tab}\n >\n <Text\n style={[\n s.tabIcon,\n item.iconSize ? { fontSize: item.iconSize } : undefined,\n on && s.tabOn,\n ]}\n >\n {item.icon}\n </Text>\n <Text style={[s.tabLabel, on && s.tabOn]}>{item.label}</Text>\n </Pressable>\n )\n })}\n </View>\n )\n}\nexport function Banner({\n label,\n onPress,\n}: {\n label: string\n onPress: () => void\n}) {\n return (\n <Pressable accessibilityRole=\"button\" onPress={onPress} style={s.banner}>\n <Text style={s.bannerText}>\u2191 {label}</Text>\n </Pressable>\n )\n}\nexport interface SheetOption {\n label: string\n onPress: () => void\n selected?: boolean\n destructive?: boolean\n disabled?: boolean\n}\n/** iOS-style action sheet fallback (Android, or without @expo/ui). Mount only while open. */\nexport function ActionSheet({\n title,\n options,\n cancelLabel,\n close,\n}: {\n title?: string\n options: SheetOption[]\n cancelLabel: string\n close: () => void\n}) {\n return (\n <Modal visible transparent animationType=\"fade\" onRequestClose={close}>\n <Pressable\n style={s.scrim}\n onPress={close}\n accessibilityLabel={cancelLabel}\n >\n <SafeAreaView edges={['bottom']} style={s.sheet}>\n <View style={s.sheetGroup}>\n {title && <Text style={s.sheetTitle}>{title}</Text>}\n {options.map((option) => (\n <Pressable\n key={option.label}\n accessibilityRole=\"button\"\n accessibilityState={{\n selected: option.selected,\n disabled: option.disabled,\n }}\n disabled={option.disabled}\n onPress={() => {\n close()\n option.onPress()\n }}\n style={({ pressed }) => [s.sheetOption, pressed && s.pressed]}\n >\n <Text\n style={[\n s.sheetOptionText,\n option.destructive && { color: palette.error },\n option.disabled && { color: apple.secondary },\n ]}\n >\n {option.selected ? '\u2713 ' : ''}\n {option.label}\n </Text>\n </Pressable>\n ))}\n </View>\n <Pressable\n accessibilityRole=\"button\"\n onPress={close}\n style={({ pressed }) => [\n s.sheetGroup,\n s.sheetOption,\n pressed && s.pressed,\n ]}\n >\n <Text style={[s.sheetOptionText, s.sheetCancel]}>\n {cancelLabel}\n </Text>\n </Pressable>\n </SafeAreaView>\n </Pressable>\n </Modal>\n )\n}\n", "import { LegendList } from '@legendapp/list/react-native'\nimport React, { useCallback, useState } from 'react'\nimport { Pressable, StyleSheet, Text, View } from 'react-native'\nimport { ExplorerFilters } from './ExplorerFilters'\nimport { useMenu } from './native'\nimport type { InspectorTranslator } from './labels'\nimport type { Viewer } from './useTraceViewer'\nimport { sourceOf, type Event, type Sort, type Trace } from './explorerModel'\nimport {\n apple,\n palette,\n Row,\n SearchField,\n Segmented,\n} from './InspectorControls'\n\nconst toggle = (values: string[], value: string) =>\n values.includes(value)\n ? values.filter((item) => item !== value)\n : [...values, value]\nconst isTrace = (item: Trace | Event): item is Trace => 'spans' in item\nconst keyOf = (item: Trace | Event) =>\n isTrace(item)\n ? item.id\n : // Sequence is unique per event; span ids can repeat if a collector reuses one.\n `${'spanId' in item ? 'span' : 'mark'}:${item.sequence}`\nexport const sortsFor = (mode: Viewer['mode']): Sort[] =>\n mode === 'traces'\n ? ['newest', 'oldest', 'longest', 'errors', 'count', 'name']\n : mode === 'spans'\n ? ['newest', 'oldest', 'longest', 'shortest', 'name']\n : ['newest', 'oldest', 'name']\n\nexport function ExplorerView({ v, t }: { v: Viewer; t: InspectorTranslator }) {\n const [filters, setFilters] = useState(false)\n const menu = useMenu()\n const chips = [\n ...v.query.outcomes.map((value) => ({\n key: `outcome:${value}`,\n label: t(\n value === 'success' && v.mode === 'traces'\n ? 'noErrors'\n : (value as 'success')\n ),\n clear: () => v.updateQuery({ outcomes: toggle(v.query.outcomes, value) }),\n })),\n ...v.query.sources.map((value) => ({\n key: `source:${value}`,\n label: value,\n clear: () => v.updateQuery({ sources: toggle(v.query.sources, value) }),\n })),\n ...(['minDuration', 'from', 'to', 'correlation'] as const)\n .filter((key) => v.query[key])\n .map((key) => ({\n key,\n label: `${t(key)}: ${v.query[key]}`,\n clear: () => v.updateQuery({ [key]: '' }),\n })),\n ]\n const { open } = v\n const renderItem = useCallback(\n ({ item }: { item: Trace | Event }) => {\n if (isTrace(item))\n return (\n <Row\n title={item.name}\n subtitle={t('traceRow', {\n spans: item.spans.length,\n errors: item.errors,\n source: item.sources.join(', '),\n })}\n value={`${item.duration.toFixed(0)} ms`}\n tint={item.errors ? palette.error : undefined}\n onPress={() => open({ kind: 'trace', value: item })}\n />\n )\n const span = 'spanId' in item ? item : undefined\n return (\n <Row\n title={item.name}\n subtitle={`${span ? t(span.outcome) : t('marks')} \u00B7 ${sourceOf(item)} \u00B7 ${(item.timestampMs / 1000).toFixed(2)} s`}\n value={span ? `${span.durationMs.toFixed(0)} ms` : undefined}\n tint={span?.outcome === 'error' ? palette.error : undefined}\n onPress={() =>\n open(\n span\n ? { kind: 'span', value: span }\n : { kind: 'mark', value: item as never }\n )\n }\n />\n )\n },\n [open, t]\n )\n return (\n <View style={styles.root}>\n <SearchField\n value={v.query.search}\n onChange={(search) => v.updateQuery({ search })}\n placeholder={t('exploreSearch')}\n />\n <Segmented\n options={(['traces', 'spans', 'marks'] as const).map((mode) => ({\n value: mode,\n label: t(mode),\n }))}\n value={v.mode}\n onChange={v.setMode}\n />\n <View style={styles.toolbar}>\n <Pressable\n accessibilityRole=\"button\"\n onPress={() =>\n menu.open({\n title: t('sort'),\n cancelLabel: t('cancel'),\n options: sortsFor(v.mode).map((sort) => ({\n label: t(sort),\n selected: sort === v.query.sort,\n onPress: () => v.updateQuery({ sort }),\n })),\n })\n }\n hitSlop={8}\n >\n <Text style={styles.toolbarButton}>\n {t('sortBy', { sort: t(v.query.sort) })} \u2304\n </Text>\n </Pressable>\n <Text style={styles.count}>\n {t('resultCount', { matching: v.results.length, loaded: v.loaded })}\n </Text>\n <Pressable\n accessibilityRole=\"button\"\n onPress={() => {\n v.setHolding(true)\n setFilters(true)\n }}\n hitSlop={8}\n >\n <Text style={styles.toolbarButton}>\n {t('filter')}\n {chips.length ? ` (${chips.length})` : ''} \u2304\n </Text>\n </Pressable>\n </View>\n {chips.length > 0 && (\n <View style={styles.chips}>\n {chips.map((chip) => (\n <Pressable\n key={chip.key}\n accessibilityRole=\"button\"\n accessibilityLabel={`${chip.label}, ${t('reset')}`}\n onPress={chip.clear}\n style={styles.chip}\n >\n <Text style={styles.chipText}>{chip.label} \u2715</Text>\n </Pressable>\n ))}\n <Pressable\n accessibilityRole=\"button\"\n onPress={v.resetQuery}\n style={styles.chipClear}\n >\n <Text style={styles.toolbarButton}>{t('reset')}</Text>\n </Pressable>\n </View>\n )}\n {v.mode === 'traces' && v.uncorrelated > 0 && !chips.length && (\n <Text style={styles.hint}>\n {t('uncorrelatedHint', { count: v.uncorrelated })}\n </Text>\n )}\n <LegendList\n recycleItems\n contentInsetAdjustmentBehavior=\"automatic\"\n key={v.mode}\n style={styles.list}\n data={v.results as (Trace | Event)[]}\n keyExtractor={keyOf}\n estimatedItemSize={64}\n keyboardShouldPersistTaps=\"handled\"\n keyboardDismissMode=\"on-drag\"\n initialScrollOffset={v.offsets.current[v.mode] ?? 0}\n onScroll={(event) => {\n v.offsets.current[v.mode] = event.nativeEvent.contentOffset.y\n }}\n scrollEventThrottle={100}\n onScrollBeginDrag={() => v.setHolding(true)}\n ListEmptyComponent={<Text style={styles.empty}>{t('noResults')}</Text>}\n renderItem={renderItem}\n />\n {menu.element}\n {filters && (\n <ExplorerFilters v={v} t={t} close={() => setFilters(false)} />\n )}\n </View>\n )\n}\n\nconst styles = StyleSheet.create({\n root: { flex: 1 },\n toolbar: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: 16,\n paddingTop: 12,\n paddingBottom: 8,\n gap: 8,\n },\n toolbarButton: { fontSize: 15, color: palette.accent, fontWeight: '500' },\n count: { flex: 1, textAlign: 'center', fontSize: 13, color: apple.secondary },\n chips: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: 6,\n paddingHorizontal: 16,\n paddingBottom: 8,\n },\n chip: {\n paddingHorizontal: 10,\n paddingVertical: 4,\n borderRadius: 14,\n backgroundColor: palette.selected,\n },\n chipText: { fontSize: 13, color: palette.accent },\n chipClear: { paddingHorizontal: 4, paddingVertical: 4 },\n hint: {\n fontSize: 13,\n color: apple.secondary,\n paddingHorizontal: 16,\n paddingBottom: 8,\n },\n list: { flex: 1, backgroundColor: apple.card },\n empty: {\n fontSize: 15,\n color: apple.secondary,\n textAlign: 'center',\n padding: 32,\n },\n})\n", "import React, { useState } from 'react'\nimport { ScrollView, StyleSheet, Text, TextInput, View } from 'react-native'\nimport type { Viewer } from './useTraceViewer'\nimport type { InspectorTranslator } from './labels'\nimport { sourceOf, defaultQuery, type Query } from './explorerModel'\nimport { apple, palette, Row, Section } from './InspectorControls'\nimport { InspectorSheet } from './InspectorSheet'\nconst toggle = (values: string[], value: string) =>\n values.includes(value)\n ? values.filter((item) => item !== value)\n : [...values, value]\n\n/** Draft filters: Apply commits them, Cancel discards them. Sorting lives in its own menu. */\nexport function ExplorerFilters({\n v,\n t,\n close,\n}: {\n v: Viewer\n t: InspectorTranslator\n close: () => void\n}) {\n const [draft, setDraft] = useState(v.query)\n const update = (patch: Partial<Query>) =>\n setDraft((previous) => ({ ...previous, ...patch }))\n const sources = [\n ...new Set([...v.page.spans, ...v.page.marks].map(sourceOf)),\n ].sort()\n const outcomes =\n v.mode === 'traces'\n ? ['error', 'success']\n : ['success', 'error', 'cancelled', 'interrupted']\n const invalid =\n [draft.from, draft.to, draft.minDuration].some(\n (value) =>\n value !== '' && (!Number.isFinite(Number(value)) || Number(value) < 0)\n ) ||\n Boolean(draft.from && draft.to && Number(draft.from) > Number(draft.to))\n const field = (\n key: 'minDuration' | 'from' | 'to' | 'correlation',\n numeric = true\n ) => (\n <View style={styles.field}>\n <Text style={styles.fieldLabel}>{t(key)}</Text>\n <TextInput\n accessibilityLabel={t(key)}\n value={draft[key]}\n onChangeText={(value) => update({ [key]: value })}\n placeholder=\"\u2014\"\n placeholderTextColor={apple.secondary}\n keyboardType={numeric ? 'decimal-pad' : 'default'}\n autoCapitalize=\"none\"\n autoCorrect={false}\n style={styles.fieldInput}\n />\n </View>\n )\n return (\n <InspectorSheet\n title={t('filters')}\n close={close}\n closeLabel={t('cancel')}\n primary={{\n label: t('applyFilters'),\n disabled: invalid,\n onPress: () => {\n v.updateQuery(draft)\n close()\n },\n }}\n >\n <ScrollView\n keyboardShouldPersistTaps=\"handled\"\n contentContainerStyle={{ paddingBottom: 32 }}\n >\n {v.mode !== 'marks' && (\n <Section header={t('outcome')}>\n {outcomes.map((outcome, index) => (\n <Row\n key={outcome}\n title={t(\n outcome === 'success' && v.mode === 'traces'\n ? 'noErrors'\n : (outcome as 'success')\n )}\n checked={draft.outcomes.includes(outcome)}\n onPress={() =>\n update({ outcomes: toggle(draft.outcomes, outcome) })\n }\n last={index === outcomes.length - 1}\n />\n ))}\n </Section>\n )}\n {sources.length > 0 && (\n <Section header={t('source')}>\n {sources.map((source, index) => (\n <Row\n key={source}\n title={source}\n checked={draft.sources.includes(source)}\n onPress={() =>\n update({ sources: toggle(draft.sources, source) })\n }\n last={index === sources.length - 1}\n />\n ))}\n </Section>\n )}\n <Section\n header={t('range')}\n footer={invalid ? t('invalidRange') : undefined}\n >\n {v.mode !== 'marks' && field('minDuration')}\n {field('from')}\n {field('to')}\n {field('correlation', false)}\n </Section>\n <Section>\n <Row\n title={t('reset')}\n tint={palette.error}\n onPress={() => setDraft(defaultQuery())}\n last\n />\n </Section>\n </ScrollView>\n </InspectorSheet>\n )\n}\n\nconst styles = StyleSheet.create({\n field: {\n flexDirection: 'row',\n alignItems: 'center',\n minHeight: 44,\n paddingHorizontal: 16,\n backgroundColor: apple.card,\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderColor: apple.separator,\n gap: 12,\n },\n fieldLabel: { flex: 1, fontSize: 17, color: palette.text },\n fieldInput: {\n minWidth: 110,\n fontSize: 17,\n color: palette.text,\n textAlign: 'right',\n paddingVertical: 8,\n },\n})\n", "import React, { type ReactNode } from 'react'\nimport {\n KeyboardAvoidingView,\n Modal,\n Platform,\n Pressable,\n StyleSheet,\n View,\n} from 'react-native'\nimport { SafeAreaProvider, SafeAreaView } from 'react-native-safe-area-context'\nimport { apple, NavBar, palette, TextButton } from './InspectorControls'\n/**\n * iOS page sheet: nav bar with Cancel and an optional primary action, grouped body.\n * Mount only while open; a pre-mounted Modal inside the inspector's Modal presents unreliably.\n */\nexport function InspectorSheet({\n title,\n close,\n closeLabel,\n primary,\n children,\n}: {\n title: string\n close: () => void\n closeLabel: string\n primary?: { label: string; onPress: () => void; disabled?: boolean }\n children: ReactNode\n}) {\n return (\n <Modal visible transparent animationType=\"slide\" onRequestClose={close}>\n <SafeAreaProvider>\n <KeyboardAvoidingView\n style={styles.scrim}\n behavior={Platform.OS === 'ios' ? 'padding' : undefined}\n >\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={closeLabel}\n onPress={close}\n style={StyleSheet.absoluteFill}\n />\n <SafeAreaView\n edges={['bottom', 'left', 'right']}\n style={styles.sheet}\n >\n <View style={styles.grabber} />\n <NavBar\n left={<TextButton label={closeLabel} onPress={close} />}\n title={title}\n right={\n primary && (\n <TextButton\n label={primary.label}\n onPress={primary.onPress}\n disabled={primary.disabled}\n bold\n />\n )\n }\n />\n {children}\n </SafeAreaView>\n </KeyboardAvoidingView>\n </SafeAreaProvider>\n </Modal>\n )\n}\nconst styles = StyleSheet.create({\n scrim: {\n flex: 1,\n justifyContent: 'flex-end',\n backgroundColor: palette.scrim,\n },\n sheet: {\n height: '88%',\n backgroundColor: apple.grouped,\n borderTopLeftRadius: 12,\n borderTopRightRadius: 12,\n overflow: 'hidden',\n },\n grabber: {\n alignSelf: 'center',\n width: 36,\n height: 5,\n borderRadius: 3,\n backgroundColor: '#c7c7cc',\n marginTop: 6,\n },\n})\n", "import { LegendList } from '@legendapp/list/react-native'\nimport React, { useEffect, useMemo, useRef, useState } from 'react'\nimport { Pressable, ScrollView, StyleSheet, Text, View } from 'react-native'\nimport type { Metric, Viewer } from './useTraceViewer'\nimport type { InspectorTranslator } from './labels'\nimport { hierarchyRows, matchesSearch, sourceOf } from './explorerModel'\nimport {\n apple,\n palette,\n Row,\n SearchField,\n Section,\n Segmented,\n TextButton,\n} from './InspectorControls'\nimport { useStore } from './store'\nimport { formatMetric } from './viewerModel'\n\nconst fixed = (value: number) => value.toFixed(1)\n\nexport function MetricDetail({\n series,\n t,\n}: {\n series: Metric\n t: InspectorTranslator\n}) {\n const stats = [\n ['latest', series.latest],\n ['median', series.median],\n ['p95', series.p95],\n ['min', series.min],\n ['max', series.peak],\n ] as const\n return (\n <>\n <Section header={series.name} footer={t('metricsScope')}>\n <View style={styles.chartCard}>\n <View style={styles.chart}>\n {series.samples.map((sample) => (\n <View\n key={sample.sequence}\n accessibilityLabel={`${sample.value.toFixed(2)} ${sample.unit}`}\n style={[\n styles.bar,\n {\n height: `${Math.max(2, (Math.abs(sample.value) / series.max) * 100)}%`,\n },\n ]}\n />\n ))}\n </View>\n <Text style={styles.caption}>\n {t('metricWindow', {\n displayed: series.samples.length,\n retained: series.retainedCount,\n start: fixed(series.startMs),\n end: fixed(series.endMs),\n })}\n </Text>\n </View>\n {stats.map(([key, value]) => (\n <Row\n key={key}\n title={t(`stat_${key}`)}\n value={formatMetric(value, series.unit)}\n />\n ))}\n <Row title={t('samples')} value={String(series.retainedCount)} last />\n </Section>\n {!!series.samples.at(-1)?.attributes.length && (\n <Section header={t('attributes')}>\n {series.samples.at(-1)!.attributes.map((attribute, index, all) => (\n <Row\n key={attribute.key}\n title={attribute.key}\n value={attribute.value}\n last={index === all.length - 1}\n />\n ))}\n </Section>\n )}\n </>\n )\n}\n\nexport function DetailView({ v, t }: { v: Viewer; t: InspectorTranslator }) {\n const detail = v.detail!\n const key =\n detail.kind +\n ':' +\n (detail.kind === 'trace'\n ? detail.value.id\n : detail.kind === 'span'\n ? detail.value.spanId\n : detail.kind === 'mark'\n ? detail.value.sequence\n : detail.value.name)\n const saved = v.detailState.current[key]\n const [collapsed, setCollapsed] = useState(\n new Set<string>(saved?.collapsed ?? [])\n )\n const [attributes, setAttributes] = useState(saved?.attributes ?? '')\n const [layout, setLayout] = useState<'waterfall' | 'list'>(\n saved?.layout ?? 'waterfall'\n )\n const offset = useRef(saved?.offset ?? 0)\n useEffect(() => {\n if (Object.keys(v.detailState.current).length > 128)\n delete v.detailState.current[Object.keys(v.detailState.current)[0]]\n v.detailState.current[key] = {\n collapsed: [...collapsed],\n attributes,\n layout,\n offset: offset.current,\n }\n }, [collapsed, attributes, layout, key, v.detailState])\n const scrollProps = {\n contentOffset: { x: 0, y: offset.current },\n scrollEventThrottle: 100,\n onScroll: (event: { nativeEvent: { contentOffset: { y: number } } }) => {\n offset.current = event.nativeEvent.contentOffset.y\n if (v.detailState.current[key])\n v.detailState.current[key].offset = offset.current\n },\n }\n const items = useMemo(\n () =>\n detail.kind === 'trace'\n ? [\n ...hierarchyRows(detail.value.spans, collapsed).map((row) => ({\n kind: 'span' as const,\n row,\n })),\n ...detail.value.marks.map((mark) => ({\n kind: 'mark' as const,\n mark,\n })),\n ]\n : [],\n [detail, collapsed]\n )\n const traceIds = useMemo(\n () =>\n new Set(\n detail.kind === 'trace' ? detail.value.spans.map((s) => s.spanId) : []\n ),\n [detail]\n )\n if (detail.kind === 'trace') {\n const trace = detail.value\n const toggle = (spanId: string) =>\n setCollapsed((previous) => {\n const next = new Set(previous)\n if (next.has(spanId)) next.delete(spanId)\n else next.add(spanId)\n return next\n })\n return (\n <LegendList\n recycleItems\n {...scrollProps}\n style={styles.list}\n initialScrollOffset={offset.current}\n data={items}\n estimatedItemSize={64}\n keyExtractor={(item) =>\n item.kind === 'span'\n ? `span:${item.row.span.sequence}`\n : `mark:${item.mark.sequence}`\n }\n ListHeaderComponent={\n <View style={styles.traceHeader}>\n <Text style={styles.title}>{trace.name}</Text>\n <Text style={styles.subtitle}>\n {t('traceSummary', {\n duration: fixed(trace.duration),\n events: trace.spans.length + trace.marks.length,\n errors: trace.errors,\n })}\n </Text>\n <Text selectable style={styles.caption}>\n {trace.id} \u00B7 {fixed(trace.start)}\u2013\n {fixed(trace.start + trace.duration)} ms\n </Text>\n <EvictionNotice v={v} t={t} />\n <FrozenNotice v={v} t={t} />\n <Segmented\n options={[\n { value: 'waterfall', label: t('waterfall') },\n { value: 'list', label: t('spans') },\n ]}\n value={layout}\n onChange={setLayout}\n />\n <View style={styles.headerActions}>\n <TextButton\n label={t('expandAll')}\n onPress={() => setCollapsed(new Set())}\n />\n <TextButton\n label={t('collapseAll')}\n onPress={() =>\n setCollapsed(new Set(trace.spans.map((span) => span.spanId)))\n }\n />\n </View>\n </View>\n }\n ListEmptyComponent={<Text style={styles.empty}>{t('noSpans')}</Text>}\n renderItem={({ item }) => {\n if (item.kind === 'mark')\n return (\n <Row\n icon=\"\u25C6\"\n iconColor={apple.secondary}\n title={item.mark.name}\n value={`${fixed(item.mark.timestampMs)} ms`}\n onPress={() => v.open({ kind: 'mark', value: item.mark })}\n />\n )\n const { row } = item\n const error = row.span.outcome === 'error'\n return (\n <Pressable\n accessibilityRole=\"button\"\n onPress={() => v.open({ kind: 'span', value: row.span })}\n style={({ pressed }) => [\n styles.spanRow,\n pressed && styles.pressed,\n ]}\n >\n <View\n style={[\n styles.spanLine,\n { paddingLeft: Math.min(8, row.depth) * 12 },\n ]}\n >\n {row.children > 0 ? (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={`${collapsed.has(row.span.spanId) ? t('expandAll') : t('collapseAll')} ${row.span.name}`}\n onPress={() => toggle(row.span.spanId)}\n hitSlop={10}\n >\n <Text style={styles.disclosure}>\n {collapsed.has(row.span.spanId) ? '\u25B8' : '\u25BE'}\n </Text>\n </Pressable>\n ) : (\n <Text style={styles.disclosure}> </Text>\n )}\n <Text\n style={[styles.spanName, error && styles.error]}\n numberOfLines={1}\n >\n {row.span.name}\n {row.children > 0 && (\n <Text style={styles.subtitle}> ({row.children})</Text>\n )}\n </Text>\n <Text style={[styles.spanValue, error && styles.error]}>\n {row.span.durationMs.toFixed(\n row.span.durationMs < 10 ? 1 : 0\n )}{' '}\n ms\n </Text>\n </View>\n {(v.query.search &&\n matchesSearch(row.span, v.query.search.toLowerCase())) ||\n (row.span.parentSpanId &&\n !traceIds.has(row.span.parentSpanId)) ? (\n <Text\n style={[\n styles.caption,\n { paddingLeft: Math.min(8, row.depth) * 12 + 20 },\n ]}\n >\n {v.query.search &&\n matchesSearch(row.span, v.query.search.toLowerCase())\n ? t('searchMatch')\n : t('missingParent')}\n </Text>\n ) : null}\n {layout === 'waterfall' && (\n <View style={styles.track}>\n <View\n style={[\n styles.segment,\n {\n marginLeft: `${row.offset * 100}%`,\n width: `${Math.max(0.5, row.width * 100)}%`,\n backgroundColor: error ? palette.error : palette.accent,\n },\n ]}\n />\n </View>\n )}\n </Pressable>\n )\n }}\n />\n )\n }\n if (detail.kind === 'metric')\n return (\n <ScrollView {...scrollProps} contentContainerStyle={styles.content}>\n <EvictionNotice v={v} t={t} />\n <MetricDetail series={detail.value} t={t} />\n </ScrollView>\n )\n const event = detail.value\n const span = detail.kind === 'span' ? detail.value : undefined\n const parent = span\n ? v.page.spans.find((s) => s.spanId === span.parentSpanId)\n : undefined\n const children = span\n ? v.page.spans.filter((s) => s.parentSpanId === span.spanId)\n : []\n const trace = span ? v.traceFor(span) : undefined\n const shownAttributes = event.attributes.filter((a) =>\n `${a.key} ${a.value}`.toLowerCase().includes(attributes.toLowerCase())\n )\n return (\n <ScrollView\n {...scrollProps}\n contentContainerStyle={styles.content}\n keyboardShouldPersistTaps=\"handled\"\n >\n <View style={styles.traceHeader}>\n <Text style={styles.title} selectable>\n {event.name}\n </Text>\n <EvictionNotice v={v} t={t} />\n </View>\n <Section>\n {span && (\n <Row\n title={t('outcome')}\n value={t(span.outcome)}\n tint={span.outcome === 'error' ? palette.error : undefined}\n />\n )}\n {span && (\n <Row\n title={t('duration')}\n value={`${span.durationMs.toFixed(2)} ms`}\n />\n )}\n <Row title={t('source')} value={sourceOf(event)} />\n <Row\n title={t('time')}\n value={`${fixed(event.timestampMs)}\u2013${fixed(event.timestampMs + (span?.durationMs ?? 0))} ms`}\n />\n <Row\n title={t('correlationId')}\n subtitle={event.correlationId || t('uncorrelated')}\n last={!span}\n />\n {span && <Row title={t('spanId')} subtitle={span.spanId} last />}\n </Section>\n <Section\n footer={span?.parentSpanId && !parent ? t('missingParent') : undefined}\n >\n {trace && (\n <Row\n icon=\"\u2630\"\n title={t('wholeTrace')}\n onPress={() => v.open({ kind: 'trace', value: trace })}\n />\n )}\n {parent && (\n <Row\n icon=\"\u2191\"\n title={t('parent')}\n subtitle={parent.name}\n onPress={() => v.open({ kind: 'span', value: parent })}\n />\n )}\n <Row\n icon=\"\u2315\"\n title={t('similar')}\n onPress={() =>\n (detail.kind === 'mark' ? v.showMarks : v.showSpans)({\n search: event.name,\n })\n }\n last\n />\n </Section>\n {event.attributes.length > 0 && (\n <>\n <Text style={styles.sectionTitle}>{t('attributes')}</Text>\n {event.attributes.length > 6 && (\n <SearchField\n value={attributes}\n onChange={setAttributes}\n placeholder={t('attributeSearch')}\n />\n )}\n <Section>\n {shownAttributes.map((a, index) => (\n <Row\n key={a.key}\n title={a.key}\n subtitle={a.value}\n last={index === shownAttributes.length - 1}\n />\n ))}\n </Section>\n </>\n )}\n {children.length > 0 && (\n <Section header={t('children')}>\n {children.map((child, index) => (\n <Row\n key={child.spanId}\n title={child.name}\n value={`${child.durationMs.toFixed(1)} ms`}\n tint={child.outcome === 'error' ? palette.error : undefined}\n onPress={() => v.open({ kind: 'span', value: child })}\n last={index === children.length - 1}\n />\n ))}\n </Section>\n )}\n </ScrollView>\n )\n}\n\nfunction EvictionNotice({ v, t }: { v: Viewer; t: InspectorTranslator }) {\n const earliest =\n useStore(v.telemetry, (s) => s.pending?.earliestSequence) ??\n v.page.earliestSequence\n const detail = v.detail\n if (!detail) return null\n const events =\n detail.kind === 'trace'\n ? [...detail.value.spans, ...detail.value.marks]\n : detail.kind === 'metric'\n ? detail.value.samples\n : [detail.value]\n return events.some((event) => event.sequence < earliest) ? (\n <Text style={[styles.caption, styles.error]}>{t('evicted')}</Text>\n ) : null\n}\nfunction FrozenNotice({ v, t }: { v: Viewer; t: InspectorTranslator }) {\n const pending = useStore(v.telemetry, (s) => s.pending)\n return pending ? (\n <Text style={styles.caption}>{t('detailFrozen')}</Text>\n ) : null\n}\n\nconst styles = StyleSheet.create({\n list: { flex: 1 },\n content: { paddingBottom: 32 },\n traceHeader: { paddingHorizontal: 16, paddingTop: 16, gap: 4 },\n title: { fontSize: 22, fontWeight: '700', color: palette.text },\n subtitle: { fontSize: 15, color: apple.secondary },\n caption: { fontSize: 12, color: apple.secondary },\n error: { color: palette.error },\n headerActions: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n marginTop: 4,\n marginBottom: 8,\n },\n sectionTitle: {\n fontSize: 13,\n color: apple.secondary,\n textTransform: 'uppercase',\n marginLeft: 32,\n marginTop: 20,\n },\n spanRow: {\n backgroundColor: apple.card,\n paddingHorizontal: 16,\n paddingVertical: 8,\n gap: 6,\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderColor: apple.separator,\n },\n pressed: { backgroundColor: '#e5e5ea' },\n spanLine: { flexDirection: 'row', alignItems: 'center', gap: 6 },\n disclosure: { width: 14, fontSize: 13, color: apple.secondary },\n spanName: { flex: 1, fontSize: 15, color: palette.text },\n spanValue: {\n fontSize: 13,\n color: apple.secondary,\n fontVariant: ['tabular-nums'],\n },\n track: {\n height: 4,\n borderRadius: 2,\n backgroundColor: apple.fill,\n overflow: 'hidden',\n },\n segment: { height: 4, borderRadius: 2 },\n chartCard: { padding: 16, gap: 8, backgroundColor: apple.card },\n chart: { height: 96, flexDirection: 'row', alignItems: 'flex-end', gap: 2 },\n bar: {\n flex: 1,\n minHeight: 2,\n borderTopLeftRadius: 2,\n borderTopRightRadius: 2,\n backgroundColor: palette.accent,\n },\n empty: {\n fontSize: 15,\n color: apple.secondary,\n textAlign: 'center',\n padding: 32,\n },\n})\n", "import { LegendList } from '@legendapp/list/react-native'\nimport React, { useCallback, useMemo } from 'react'\nimport { Pressable, StyleSheet, Text, View } from 'react-native'\nimport type { Metric, Viewer } from './useTraceViewer'\nimport { formatMetric } from './viewerModel'\nimport type { InspectorTranslator } from './labels'\nimport { useMenu } from './native'\nimport {\n apple,\n palette,\n Row,\n SearchField,\n Segmented,\n} from './InspectorControls'\n\nconst categories = ['all', 'runtime', 'operations', 'custom'] as const\nconst sorts = ['name', 'count', 'p95'] as const\nconst category = (name: string) =>\n name.startsWith('duration: ')\n ? 'operations'\n : /^(js|ui|process|app)\\./.test(name)\n ? 'runtime'\n : 'custom'\n\nexport function MetricsView({ v, t }: { v: Viewer; t: InspectorTranslator }) {\n const menu = useMenu()\n const metrics = useMemo(\n () =>\n v.metrics\n .filter(\n (series) =>\n (v.metricCategory === 'all' ||\n category(series.name) === v.metricCategory) &&\n series.name.toLowerCase().includes(v.metricQuery.toLowerCase())\n )\n .sort((a, b) =>\n v.metricSort === 'name'\n ? a.name.localeCompare(b.name)\n : v.metricSort === 'count'\n ? b.retainedCount - a.retainedCount ||\n a.name.localeCompare(b.name)\n : b.p95 - a.p95 || a.name.localeCompare(b.name)\n ),\n [v.metrics, v.metricCategory, v.metricQuery, v.metricSort]\n )\n const { open } = v\n const renderItem = useCallback(\n ({ item }: { item: Metric }) => (\n <Row\n title={item.metric}\n subtitle={t('metricBrief', {\n latest: formatMetric(item.latest, item.unit),\n p95: formatMetric(item.p95, item.unit),\n count: item.retainedCount,\n })}\n value={formatMetric(item.latest, item.unit)}\n onPress={() => open({ kind: 'metric', value: item })}\n />\n ),\n [open, t]\n )\n return (\n <View style={styles.root}>\n <SearchField\n value={v.metricQuery}\n onChange={v.setMetricQuery}\n placeholder={t('metricSearch')}\n />\n <Segmented\n options={categories.map((value) => ({\n value,\n label: t(value === 'operations' ? 'operationsShort' : value),\n }))}\n value={v.metricCategory as (typeof categories)[number]}\n onChange={v.setMetricCategory}\n />\n <View style={styles.toolbar}>\n <Pressable\n accessibilityRole=\"button\"\n onPress={() =>\n menu.open({\n title: t('sort'),\n cancelLabel: t('cancel'),\n options: sorts.map((sort) => ({\n label: t(sort),\n selected: sort === v.metricSort,\n onPress: () => v.setMetricSort(sort),\n })),\n })\n }\n hitSlop={8}\n >\n <Text style={styles.toolbarButton}>\n {t('sortBy', {\n sort: t(v.metricSort as (typeof sorts)[number]),\n })}{' '}\n \u2304\n </Text>\n </Pressable>\n <Text style={styles.count}>{metrics.length}</Text>\n </View>\n <LegendList\n recycleItems\n contentInsetAdjustmentBehavior=\"automatic\"\n style={styles.list}\n data={metrics}\n keyExtractor={(series) => series.name}\n estimatedItemSize={56}\n keyboardDismissMode=\"on-drag\"\n initialScrollOffset={v.offsets.current.metrics ?? 0}\n onScroll={(event) => {\n v.offsets.current.metrics = event.nativeEvent.contentOffset.y\n }}\n scrollEventThrottle={100}\n onScrollBeginDrag={() => v.setHolding(true)}\n ListEmptyComponent={\n <Text style={styles.empty}>{t('emptyMetrics')}</Text>\n }\n renderItem={renderItem}\n ListFooterComponent={\n v.metricCategory === 'operations' && v.operations.length ? (\n <View>\n <Text style={styles.header}>{t('operations')}</Text>\n {v.operations\n .filter((op) =>\n op.name.toLowerCase().includes(v.metricQuery.toLowerCase())\n )\n .slice(0, 40)\n .map((op) => (\n <Row\n key={op.name}\n title={op.name}\n subtitle={t('operationStats', {\n ...op,\n errorRate:\n op.errorRate === undefined\n ? '\u2014'\n : `${op.errorRate.toFixed(1)}%`,\n })}\n tint={op.errors ? palette.error : undefined}\n onPress={() => v.showSpans({ search: op.name })}\n />\n ))}\n </View>\n ) : null\n }\n />\n {menu.element}\n </View>\n )\n}\n\nconst styles = StyleSheet.create({\n root: { flex: 1 },\n toolbar: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: 16,\n paddingTop: 10,\n paddingBottom: 6,\n },\n toolbarButton: { fontSize: 15, color: palette.accent, fontWeight: '500' },\n count: { fontSize: 13, color: apple.secondary },\n list: { flex: 1, backgroundColor: apple.card },\n header: {\n fontSize: 13,\n fontWeight: '600',\n color: apple.secondary,\n textTransform: 'uppercase',\n paddingHorizontal: 16,\n paddingTop: 18,\n paddingBottom: 6,\n backgroundColor: apple.grouped,\n },\n empty: {\n fontSize: 15,\n color: apple.secondary,\n textAlign: 'center',\n padding: 32,\n },\n})\n", "import React from 'react'\nimport { ScrollView } from 'react-native'\nimport type { InspectorLabelKey, InspectorTranslator } from './labels'\nimport type { Viewer } from './useTraceViewer'\nimport {\n defaultBudgets,\n topicGlyph,\n type AnyEvent,\n type Issue,\n type TopicId,\n} from './topics'\nimport { formatMetric } from './viewerModel'\nimport { apple, palette, Row, Section } from './InspectorControls'\nconst capital = (id: string) => id[0].toUpperCase() + id.slice(1)\nconst issueLabel = (issue: Issue) =>\n `issue${capital(issue.kind)}` as InspectorLabelKey\nconst ms = (value: number | undefined) =>\n value === undefined ? '\u2014' : formatMetric(value, 'ms')\nconst MAX_ISSUES = 20\n/** Opens the matching detail; metric samples open their series. */\nexport const openEvent = (v: Viewer, event: AnyEvent) => {\n if ('spanId' in event) v.open({ kind: 'span', value: event })\n else if ('unit' in event) {\n const series = v.metrics.find(\n (s) => s.name === `${event.name} (${event.unit})`\n )\n if (series) v.open({ kind: 'metric', value: series })\n } else v.open({ kind: 'mark', value: event })\n}\nexport function SummaryView({\n v,\n t,\n budgetMs = defaultBudgets.stallMs,\n}: {\n v: Viewer\n t: InspectorTranslator\n budgetMs?: number\n}) {\n const explore = (id: TopicId) => {\n if (id === 'startup' || id === 'responsiveness' || id === 'resources') {\n v.setTab('metrics')\n v.setMetricCategory('runtime')\n } else if (id === 'errors') v.showMarks({ sources: ['error'] })\n else if (id === 'network')\n v.showSpans({ sources: ['network'], sort: 'longest' })\n else if (id === 'screens') v.showSpans({ sources: ['navigation'] })\n else v.showSpans({})\n }\n const shown = v.issues.slice(0, MAX_ISSUES)\n return (\n <ScrollView\n contentInsetAdjustmentBehavior=\"automatic\"\n contentContainerStyle={{ paddingBottom: 32 }}\n >\n <Section\n header={\n v.issues.length ? t('issues', { count: v.issues.length }) : undefined\n }\n footer={\n v.issues.length > shown.length\n ? t('moreIssues', { count: v.issues.length - shown.length })\n : undefined\n }\n >\n {shown.length ? (\n shown.map((issue, index) => (\n <Row\n key={index}\n icon=\"\u26A0\"\n iconColor={palette.error}\n title={issue.title}\n subtitle={`${t(issueLabel(issue))} \u00B7 +${(issue.event.timestampMs / 1000).toFixed(1)} s`}\n value={\n issue.valueMs === undefined\n ? undefined\n : formatMetric(issue.valueMs, 'ms')\n }\n tint={palette.error}\n onPress={() => openEvent(v, issue.event)}\n last={index === shown.length - 1}\n />\n ))\n ) : (\n <Row icon=\"\u2713\" iconColor=\"#34c759\" title={t('noIssues')} last />\n )}\n </Section>\n <Section header={t('topics')} footer={t('summaryScope')}>\n {v.topics.map((topic, index) => {\n const name = capital(topic.id)\n const hasIssues = topic.issues.length > 0\n return (\n <Row\n key={topic.id}\n icon={topicGlyph[topic.id].icon}\n iconColor={\n topic.tracked ? topicGlyph[topic.id].color : apple.secondary\n }\n title={t(`topic${name}` as InspectorLabelKey)}\n subtitle={\n !topic.tracked\n ? `${t('notTracked')} \u00B7 ${t(`hint${name}` as InspectorLabelKey)}`\n : !topic.count && topic.id !== 'responsiveness'\n ? t('quiet')\n : t(`headline${name}` as InspectorLabelKey, {\n count: topic.count,\n value: ms(topic.value),\n budget: budgetMs,\n ...topic.values,\n })\n }\n value={hasIssues ? String(topic.issues.length) : undefined}\n tint={hasIssues ? palette.error : undefined}\n onPress={() => explore(topic.id)}\n last={index === v.topics.length - 1}\n />\n )\n })}\n </Section>\n </ScrollView>\n )\n}\n", "import { LegendList } from '@legendapp/list/react-native'\nimport React, { useCallback } from 'react'\nimport { StyleSheet, Text } from 'react-native'\nimport type { InspectorTranslator } from './labels'\nimport type { Viewer } from './useTraceViewer'\nimport { topicGlyph, type TimelineItem } from './topics'\nimport { openEvent } from './SummaryView'\nimport { formatMetric } from './viewerModel'\nimport { apple, palette, Row } from './InspectorControls'\n\nconst valueOf = (item: Extract<TimelineItem, { kind: 'event' }>) =>\n 'durationMs' in item.event\n ? formatMetric(item.event.durationMs, 'ms')\n : 'value' in item.event\n ? formatMetric(item.event.value, item.event.unit)\n : undefined\nconst messageOf = (item: Extract<TimelineItem, { kind: 'event' }>) =>\n item.event.attributes.find((a) => a.key === 'message')?.value\n\n/** Newest screen visit first; section headers are the screens the events happened on. */\nexport function TimelineView({ v, t }: { v: Viewer; t: InspectorTranslator }) {\n const renderItem = useCallback(\n ({ item }: { item: TimelineItem }) => {\n if (item.kind === 'screen')\n return (\n <Text style={styles.header}>\n {item.name || t('beforeNavigation')} \u00B7{' '}\n {(item.timestampMs / 1000).toFixed(1)} s\n </Text>\n )\n const message = messageOf(item)\n return (\n <Row\n icon={topicGlyph[item.topic].icon}\n iconColor={topicGlyph[item.topic].color}\n title={item.event.name}\n subtitle={`${(item.event.timestampMs / 1000).toFixed(2)} s${message ? ` \u00B7 ${message}` : ''}`}\n value={valueOf(item)}\n tint={item.issue ? palette.error : undefined}\n onPress={() => openEvent(v, item.event)}\n />\n )\n },\n // openEvent reads v.metrics at press time; rows only need new props when data changes.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [t, v.metrics]\n )\n return (\n <LegendList<TimelineItem>\n recycleItems\n contentInsetAdjustmentBehavior=\"automatic\"\n style={styles.list}\n data={v.timeline}\n keyExtractor={(item) => item.key}\n getItemType={(item) => item.kind}\n estimatedItemSize={60}\n initialScrollOffset={v.offsets.current.timeline ?? 0}\n onScroll={(event) => {\n v.offsets.current.timeline = event.nativeEvent.contentOffset.y\n }}\n scrollEventThrottle={100}\n onScrollBeginDrag={() => v.setHolding(true)}\n ListEmptyComponent={<Text style={styles.empty}>{t('empty')}</Text>}\n renderItem={renderItem}\n />\n )\n}\n\nconst styles = StyleSheet.create({\n list: { flex: 1 },\n header: {\n fontSize: 13,\n fontWeight: '600',\n color: apple.secondary,\n textTransform: 'uppercase',\n paddingHorizontal: 16,\n paddingTop: 18,\n paddingBottom: 6,\n backgroundColor: apple.grouped,\n },\n empty: {\n fontSize: 15,\n color: apple.secondary,\n textAlign: 'center',\n padding: 32,\n },\n})\n", "export const defaultLabels = {\n applyFilters: 'Apply',\n title: 'Performance',\n searchMatch: 'Search match',\n explore: 'Explore',\n profiles: 'Profiles',\n spans: 'Spans',\n events: 'events',\n actions: 'Actions',\n tools: 'Tools',\n back: 'Back',\n done: 'Done',\n details: 'Details',\n cancel: 'Cancel',\n filters: 'Filters',\n sort: 'Sort',\n reset: 'Reset',\n exploreSearch: 'Search',\n metricSearch: 'Search metrics',\n newest: 'Newest',\n oldest: 'Oldest',\n longest: 'Longest',\n shortest: 'Shortest',\n errors: 'Most errors',\n count: 'Most samples',\n name: 'Name',\n p95: 'Highest p95',\n source: 'Source',\n outcome: 'Outcome',\n success: 'Success',\n error: 'Error',\n cancelled: 'Cancelled',\n interrupted: 'Interrupted',\n noErrors: 'No recorded errors',\n minDuration: 'Minimum duration (ms)',\n from: 'From (ms since recording)',\n to: 'To (ms since recording)',\n correlation: 'Exact correlation ID',\n invalidRange: 'Enter nonnegative numbers, with From no later than To.',\n resultCount: '{{matching}} / {{loaded}} matching',\n traceRow: '{{spans}} spans \u00B7 {{errors}} errors \u00B7 {{source}}',\n noResults:\n 'No matching events. Change filters or reset to see the retained recording.',\n uncorrelated: 'Uncorrelated',\n uncorrelatedHint:\n '{{count}} uncorrelated events are also available in Spans and Marks.',\n pauseUpdates: 'Freeze view',\n resumeUpdates: 'Resume live view',\n newEvents: '{{count}} new events',\n detailFrozen:\n 'Detail is held steady while capture continues. Return to load newer events.',\n expandAll: 'Expand all',\n collapseAll: 'Collapse all',\n missingParent: 'Parent is outside retained history.',\n wholeTrace: 'Show entire trace',\n similar: 'Find similar spans',\n parent: 'Parent',\n children: 'Children',\n attributes: 'Search attributes',\n evicted:\n 'This event is outside retained history. Showing the last inspected snapshot.',\n all: 'All',\n runtime: 'Runtime',\n custom: 'Custom',\n metricBrief: 'p95 {{p95}} \u00B7 n={{count}}',\n metricSortNotice:\n 'All retained traces. Numeric sorting compares raw values; check units when comparing series.',\n exportAll: 'Recording JSON (stops recording)',\n sharePerfetto: 'Perfetto trace',\n replaceTitle: 'Replace current recording?',\n replaceDescription:\n 'Start a new recording and discard the currently retained history. Export first to keep a copy.',\n retainedScope:\n 'Counts and statistics cover retained history. Pause updates freezes this view, not recording or profiling.',\n lostHistory: 'Lost {{what}}; this history is incomplete.',\n lostSpans: '{{count}} spans',\n lostMarks: '{{count}} marks',\n lostMetrics: '{{count}} metric samples',\n slowest: 'Slowest spans',\n errorsOnly: 'Errors',\n profileSeparate:\n 'CPU profiles are separate from trace JSON. Stop sampling to save and share the latest artifact.',\n noProfiler: 'No CPU profiler is configured for this client.',\n\n eyebrow: 'DEVELOPER TOOLS',\n close: 'Close',\n recording: 'Recording live',\n stopped: 'Recording stopped',\n counters:\n '{{events}} events \\u00b7 {{active}} active \\u00b7 {{dropped}} dropped \\u00b7 {{bytes}} bytes',\n start: 'Start recording',\n stop: 'Stop recording',\n clear: 'Clear',\n export: 'Stop & export',\n retention: 'Bounded native history \\u00b7 refreshes while open',\n traces: 'Traces',\n search: 'Search operation or correlation ID',\n traceSummary:\n '{{duration}} ms \\u00b7 {{events}} events \\u00b7 {{errors}} errors',\n empty: 'No traces yet. Use the app to capture activity.',\n waterfall: 'Span waterfall',\n noSpans: 'No completed spans in this trace.',\n spanDetails: 'Span {{id}} \\u00b7 parent {{parent}} \\u00b7 {{outcome}}',\n metrics: 'Metrics',\n operations: 'Operation outcomes',\n operationsShort: 'Operations',\n operationStats:\n '{{count}} spans \u00B7 {{errors}} errors \u00B7 {{errorRate}} error rate \u00B7 {{cancelled}} cancelled \u00B7 {{interrupted}} interrupted',\n metricsScope:\n 'All traces \u00B7 app.ready.after_tracer_init measures tracer setup to app readiness, not TTI. duration: series are derived from completed spans. Statistics cover retained samples, not the whole session.',\n emptyMetrics:\n 'No samples yet. Use the app or run the playground. App-ready timing appears after a fresh launch; TTI requires an explicit readiness definition.',\n metricStats:\n 'Latest {{latest}} \u00B7 median {{median}} \u00B7 min {{min}} \u00B7 max {{max}} \u00B7 p95 {{p95}} \u00B7 {{count}} samples',\n marks: 'Marks',\n playground: 'Instrumentation playground',\n playgroundDescription:\n 'Check nested spans, concurrent operations with the same name, cancellation, repeated completion, errors and metrics.',\n run: 'Run sample trace',\n profiling: 'CPU profile',\n profilingDescription:\n 'Capture a native profiler artifact alongside this recording.',\n startProfile: 'Start CPU profile',\n stopProfile: 'Stop CPU profile',\n shareProfile: 'CPU profile',\n shareArtifact: 'Share performance recording',\n sharingUnavailable: 'File sharing is unavailable on this device.',\n cacheUnavailable: 'The application cache is unavailable.',\n truncated:\n 'Showing up to 100 traces, spans and marks, and 40 metric series. Search to narrow traces; export includes all retained events.',\n overview: 'Summary',\n tabs: 'Inspector views',\n recordingSummary: 'Recording summary',\n summary:\n '{{traces}} traces \u00B7 {{spans}} spans \u00B7 {{marks}} marks \u00B7 {{metrics}} metric samples loaded',\n session: 'Session {{id}} \u00B7 elapsed {{elapsed}} ms',\n metricWindow:\n 'Showing {{displayed}} / {{retained}} loaded samples \u00B7 {{start}}\u2013{{end}} ms since recording start',\n passed: 'PASS',\n failed: 'FAIL',\n scenarioResults: 'Scenario results',\n scenarioNotice:\n 'Checks inspect retained native events; dropped or expired samples can fail a check.',\n scenarioNested: 'Explicit parent hierarchy',\n scenarioConcurrency: 'Overlapping spans with the same name',\n scenarioCancelled: 'Cancelled outcome',\n scenarioIdempotent: 'Repeated completion records once',\n scenarioError: 'Error outcome',\n scenarioMetrics: 'Native metric values',\n openScenario: 'Open scenario trace',\n timeline: 'Timeline',\n issues: 'Issues: {{count}}',\n noIssues: 'Nothing over budget in retained history.',\n summaryScope:\n 'Issues compare retained events with local budgets, not production percentiles. Tap a topic to explore it.',\n moreIssues: '{{count}} more in Explore',\n issueValue: '{{value}} ms \u00B7 budget {{budget}} ms',\n notTracked: 'Not tracked',\n quiet: 'No events yet',\n topicStartup: 'Startup',\n topicScreens: 'Screens',\n topicNetwork: 'Network',\n topicResponsiveness: 'Responsiveness',\n topicErrors: 'Errors',\n topicCustom: 'Custom spans',\n headlineStartup: 'App ready {{value}} after tracer init',\n headlineScreens: '{{count}} visits \u00B7 p95 transition {{value}}',\n headlineNetwork: '{{count}} requests \u00B7 p95 {{value}}',\n headlineResponsiveness: '{{count}} stalls over {{budget}} ms',\n headlineErrors: '{{count}} errors',\n headlineCustom: '{{count}} spans',\n hintStartup: 'Call useAppReadyMetric(client, ready) from /react.',\n hintScreens: 'Add createNavigationPlugin(navigationRef) from /plugins.',\n hintNetwork: 'Add createNetworkPlugin() from /plugins.',\n hintResponsiveness:\n 'Add createNativeMetricsPlugin(), Sentry frames, or runtimeMetrics: true.',\n hintErrors: 'Add createErrorsPlugin() from /plugins.',\n hintCustom: 'Use client.trace or native spans.',\n issueSlowStartup: 'Slow startup',\n issueSlowScreen: 'Slow screen',\n issueSlowRequest: 'Slow request',\n issueFailedRequest: 'Failed request',\n issueStall: 'JS stall',\n issueError: 'Error',\n beforeNavigation: 'Before first screen',\n liveAllActivity: 'All activity',\n liveInspector: 'Inspector',\n liveRequests: 'requests',\n liveStalls: 'stalls',\n liveErrors: 'errors',\n liveEmpty:\n 'No activity on this screen yet. Use the app; events stream in here.',\n topicResources: 'Resources',\n headlineResources: 'CPU {{cpu}}% \u00B7 {{memory}} MB',\n hintResources: 'Add createNativeMetricsPlugin() from /plugins.',\n issueUiStall: 'UI stall',\n issueFrozenFrames: 'Frozen frames',\n liveFlag: 'Flag',\n liveShare: 'Share trace',\n liveFlagged: 'Flagged',\n share: 'Share',\n more: 'More',\n shareTitle: 'Share recording',\n startNew: 'Start new recording',\n frozen: 'Frozen',\n topics: 'Topics',\n sortBy: 'Sort: {{sort}}',\n filter: 'Filter',\n range: 'Range',\n stat_latest: 'Latest',\n stat_median: 'Median',\n stat_p95: 'p95',\n stat_min: 'Min',\n stat_max: 'Max',\n samples: 'Samples',\n duration: 'Duration',\n time: 'Time',\n spanId: 'Span ID',\n correlationId: 'Correlation ID',\n attributeSearch: 'Search attributes',\n} as const\nexport type InspectorLabels = { [K in keyof typeof defaultLabels]: string }\nexport type InspectorLabelKey = keyof InspectorLabels\nexport type InspectorTranslator = (\n key: InspectorLabelKey,\n values?: Record<string, unknown>\n) => string\nexport const createTranslator =\n (labels?: Partial<InspectorLabels>): InspectorTranslator =>\n (key, values) =>\n (labels?.[key] ?? defaultLabels[key]).replace(\n /{{(\\w+)}}/g,\n (_, name: string) => String(values?.[name] ?? '')\n )\n", "import React, {\n useContext,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n} from 'react'\nimport {\n Animated,\n PanResponder,\n Pressable,\n ScrollView,\n StyleSheet,\n Text,\n View,\n useWindowDimensions,\n} from 'react-native'\nimport {\n initialWindowMetrics,\n SafeAreaInsetsContext,\n} from 'react-native-safe-area-context'\nimport type { TraceClient } from '../client/createTraceClient'\nimport { palette } from './InspectorControls'\nimport {\n createTranslator,\n type InspectorLabels,\n type InspectorTranslator,\n} from './labels'\nimport {\n buildTimeline,\n currentVisit,\n defaultBudgets,\n latestMetric,\n summarizeTopics,\n topicGlyph,\n type Budgets,\n type VisitSummary,\n} from './topics'\nimport { useLiveRecording } from './useLiveRecording'\nimport { Glass } from './native'\n\ntype Detent = 'closed' | 'peek' | 'half'\nconst BUBBLE = 56\nconst PEEK = 150\nconst noInsets = { top: 0, right: 0, bottom: 0, left: 0 }\n/** The app's safe-area provider when present, else launch metrics; never adds a native view. */\nconst useInsets = () =>\n useContext(SafeAreaInsetsContext) ?? initialWindowMetrics?.insets ?? noInsets\nconst round = (value?: number) =>\n value === undefined ? '\u2014' : Math.round(value)\n\n/**\n * Floating entry point and live, non-modal sheet for the current screen. The app stays\n * usable above the sheet; mount it last at the app root. It sits below the app's own\n * native modals. Rendering it is the app's decision (e.g. internal or UAT builds only).\n */\nexport function TraceOverlay({\n client,\n labels,\n translate,\n budgets,\n bottomOffset = 0,\n}: {\n client: TraceClient\n labels?: Partial<InspectorLabels>\n translate?: InspectorTranslator\n budgets?: Partial<Budgets>\n /** Dock the sheet this far above the bottom edge, e.g. the app's tab bar height, so it stays usable. */\n bottomOffset?: number\n}) {\n return (\n // Plain Views only: a native provider here would swallow touches on Android.\n <View style={StyleSheet.absoluteFill} pointerEvents=\"box-none\">\n <Overlay\n client={client}\n t={translate ?? createTranslator(labels)}\n budgets={{ ...defaultBudgets, ...budgets }}\n bottomOffset={bottomOffset}\n />\n </View>\n )\n}\n\nfunction Overlay({\n client,\n t,\n budgets,\n bottomOffset,\n}: {\n client: TraceClient\n t: InspectorTranslator\n budgets: Budgets\n bottomOffset: number\n}) {\n const snapshot = useSyncExternalStore(\n client.subscribe,\n client.getSnapshot,\n client.getSnapshot\n )\n const [detent, setDetent] = useState<Detent>('closed')\n // The full inspector owns the screen while it is open; pause live polling meanwhile.\n // The closed bubble only needs fps and an issue count: poll half as often.\n const page = useLiveRecording(\n client,\n !snapshot.visible && snapshot.recording,\n detent === 'closed' ? 2000 : 1000\n )\n const { appReadyMs, screenMs, requestMs, stallMs } = budgets\n const visit = useMemo(() => {\n if (!page) return undefined\n const { issues } = summarizeTopics(page, snapshot.collectors ?? [], {\n appReadyMs,\n screenMs,\n requestMs,\n stallMs,\n })\n return currentVisit(buildTimeline(page, issues, 300))\n }, [page, snapshot.collectors, appReadyMs, screenMs, requestMs, stallMs])\n const vitals = useMemo(\n () => ({\n uiFps: page && latestMetric(page, 'ui.fps'),\n jsFps: page && latestMetric(page, 'js.frame_callback.rate'),\n cpu: page && latestMetric(page, 'process.cpu'),\n memory: page && latestMetric(page, 'process.memory'),\n }),\n [page]\n )\n if (snapshot.visible || snapshot.disposed) return null\n return detent === 'closed' ? (\n <Bubble\n fps={vitals.uiFps ?? vitals.jsFps}\n native={vitals.uiFps !== undefined}\n issues={visit?.issues ?? 0}\n onPress={() => setDetent('half')}\n onLongPress={client.open}\n />\n ) : (\n <Sheet\n bottomOffset={bottomOffset}\n detent={detent}\n setDetent={setDetent}\n openInspector={() => {\n setDetent('closed')\n client.open()\n }}\n nowMs={client.getRecording()?.getStats().nowMs}\n visit={visit}\n vitals={vitals}\n recording={snapshot.recording}\n flag={() => client.flag()}\n share={client.canShare ? () => client.shareTrace('perfetto') : undefined}\n t={t}\n />\n )\n}\n\nfunction Bubble({\n fps,\n native,\n issues,\n onPress,\n onLongPress,\n}: {\n fps?: number\n native: boolean\n issues: number\n onPress: () => void\n onLongPress: () => void\n}) {\n const { width, height } = useWindowDimensions()\n const insets = useInsets()\n const base = useRef({ x: width - BUBBLE - 12, y: height * 0.55 })\n const position = useRef(new Animated.ValueXY(base.current)).current\n const handlers = useRef({ onPress, onLongPress })\n handlers.current = { onPress, onLongPress }\n const responder = useMemo(() => {\n let moved = false\n let longPressed = false\n let timer: ReturnType<typeof setTimeout> | undefined\n return PanResponder.create({\n onStartShouldSetPanResponder: () => true,\n onPanResponderGrant: () => {\n moved = false\n longPressed = false\n timer = setTimeout(() => {\n longPressed = true\n handlers.current.onLongPress()\n }, 500)\n },\n onPanResponderMove: (_, g) => {\n if (Math.abs(g.dx) + Math.abs(g.dy) > 6) {\n moved = true\n clearTimeout(timer)\n }\n position.setValue({\n x: base.current.x + g.dx,\n y: base.current.y + g.dy,\n })\n },\n onPanResponderRelease: (_, g) => {\n clearTimeout(timer)\n if (!moved) {\n if (!longPressed) handlers.current.onPress()\n return\n }\n // Snap to the nearest side edge, clamped inside the safe area.\n const x = base.current.x + g.dx\n const y = base.current.y + g.dy\n base.current = {\n x: x + BUBBLE / 2 < width / 2 ? 12 : width - BUBBLE - 12,\n y: Math.min(\n Math.max(y, insets.top + 8),\n height - BUBBLE - insets.bottom - 8\n ),\n }\n Animated.spring(position, {\n toValue: base.current,\n useNativeDriver: false,\n }).start()\n },\n onPanResponderTerminate: () => {\n clearTimeout(timer)\n position.setValue(base.current)\n },\n })\n }, [position, width, height, insets.top, insets.bottom])\n const alert = issues > 0\n return (\n <Animated.View\n {...responder.panHandlers}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Performance overlay\"\n accessibilityHint=\"Tap for live activity, long press for the full inspector\"\n style={[\n styles.bubble,\n alert && styles.bubbleAlert,\n { transform: position.getTranslateTransform() },\n ]}\n >\n <Glass\n style={[StyleSheet.absoluteFill, styles.bubbleGlass]}\n fallbackColor={palette.bg}\n interactive\n />\n <Text style={[styles.bubbleValue, alert && { color: palette.error }]}>\n {fps === undefined ? '\u2014' : Math.round(fps)}\n </Text>\n <Text style={styles.bubbleUnit}>\n {alert ? `${issues} \u26A0` : native ? 'UI fps' : 'JS fps'}\n </Text>\n </Animated.View>\n )\n}\n\nfunction Sheet({\n detent,\n setDetent,\n openInspector,\n nowMs,\n visit,\n vitals,\n recording,\n flag,\n share,\n t,\n bottomOffset,\n}: {\n bottomOffset: number\n detent: Exclude<Detent, 'closed'>\n setDetent: (detent: Detent) => void\n openInspector: () => void\n nowMs?: number\n visit?: VisitSummary\n vitals: Record<'uiFps' | 'jsFps' | 'cpu' | 'memory', number | undefined>\n recording: boolean\n flag: () => void\n share?: () => Promise<void>\n t: InspectorTranslator\n}) {\n const { height } = useWindowDimensions()\n const insets = useInsets()\n const [flagged, setFlagged] = useState(false)\n const inset = bottomOffset > 0 ? 0 : insets.bottom\n const half = Math.round(height * 0.45) + inset\n const peek = PEEK + inset\n // The sheet is always `half` tall; detents translate it down so only `peek` shows.\n const offsetFor = (value: Detent) =>\n value === 'half' ? 0 : value === 'peek' ? half - peek : half + bottomOffset\n const translate = useRef(new Animated.Value(half + bottomOffset)).current\n const settle = (value: Detent) =>\n Animated.spring(translate, {\n toValue: offsetFor(value),\n useNativeDriver: true,\n bounciness: 0,\n }).start(() => value === 'closed' && setDetent('closed'))\n const current = useRef(detent)\n current.current = detent\n React.useEffect(() => {\n settle(detent)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [detent, half])\n const responder = useMemo(\n () =>\n PanResponder.create({\n onMoveShouldSetPanResponder: (_, g) => Math.abs(g.dy) > 4,\n onPanResponderMove: (_, g) =>\n translate.setValue(Math.max(-80, offsetFor(current.current) + g.dy)),\n onPanResponderRelease: (_, g) => {\n const at = offsetFor(current.current) + g.dy\n if (at < -60) {\n settle(current.current)\n openInspector()\n } else if (at > half - peek / 2 || g.vy > 1.5) settle('closed')\n else {\n const next = at < (half - peek) / 2 ? 'half' : 'peek'\n if (next === current.current) settle(next)\n else setDetent(next)\n }\n },\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [half, peek]\n )\n const elapsed =\n nowMs !== undefined && visit?.sinceMs !== undefined\n ? (nowMs - visit.sinceMs) / 1000\n : undefined\n const latest = visit?.events[0]\n return (\n <Animated.View\n style={[\n styles.sheet,\n { height: half, paddingBottom: inset, bottom: bottomOffset },\n { transform: [{ translateY: translate }] },\n ]}\n >\n <Glass\n style={[StyleSheet.absoluteFill, styles.sheetGlass]}\n fallbackColor={palette.bg}\n />\n <View {...responder.panHandlers} style={styles.grabArea}>\n <View style={styles.grabber} />\n <View style={styles.row}>\n <Text style={styles.screen} numberOfLines={1}>\n {recording ? '\u25CF' : '\u25CB'} {visit?.screen ?? t('liveAllActivity')}\n {elapsed !== undefined && (\n <Text style={styles.muted}> \u00B7 {elapsed.toFixed(0)} s</Text>\n )}\n </Text>\n <Pressable\n accessibilityRole=\"button\"\n onPress={() => setDetent(detent === 'half' ? 'peek' : 'half')}\n style={styles.chip}\n >\n <Text style={styles.chipText}>{detent === 'half' ? '\u25BE' : '\u25B4'}</Text>\n </Pressable>\n <Pressable\n accessibilityRole=\"button\"\n onPress={openInspector}\n style={styles.chip}\n >\n <Text style={styles.chipText}>{t('liveInspector')}</Text>\n </Pressable>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={t('close')}\n onPress={() => settle('closed')}\n style={styles.chip}\n >\n <Text style={styles.chipText}>\u2715</Text>\n </Pressable>\n </View>\n <View style={styles.stats}>\n <Stat label=\"UI fps\" value={round(vitals.uiFps)} />\n <Stat label=\"JS fps\" value={round(vitals.jsFps)} />\n <Stat label=\"CPU %\" value={round(vitals.cpu)} />\n <Stat label=\"MB\" value={round(vitals.memory)} />\n </View>\n <View style={styles.stats}>\n <Stat label={t('liveRequests')} value={visit?.requests ?? 0} />\n <Stat label={t('liveStalls')} value={visit?.stalls ?? 0} alert />\n <Stat label={t('liveErrors')} value={visit?.errors ?? 0} alert />\n <Pressable\n accessibilityRole=\"button\"\n onPress={() => {\n flag()\n setFlagged(true)\n setTimeout(() => setFlagged(false), 1200)\n }}\n style={styles.action}\n >\n <Text style={styles.actionText}>\n \u2691 {t(flagged ? 'liveFlagged' : 'liveFlag')}\n </Text>\n </Pressable>\n {share && (\n <Pressable\n accessibilityRole=\"button\"\n onPress={() => void share()}\n style={styles.action}\n >\n <Text style={styles.actionText}>\u21EA {t('liveShare')}</Text>\n </Pressable>\n )}\n </View>\n </View>\n {detent === 'peek' ? (\n latest && (\n <Text style={styles.muted} numberOfLines={1}>\n {topicGlyph[latest.topic].icon} {latest.event.name}\n </Text>\n )\n ) : (\n <ScrollView style={styles.list}>\n {!visit?.events.length && (\n <Text style={[styles.muted, styles.empty]}>{t('liveEmpty')}</Text>\n )}\n {visit?.events.slice(0, 100).map((item) => (\n <View key={item.key} style={styles.event}>\n <Text\n style={[styles.glyph, { color: topicGlyph[item.topic].color }]}\n >\n {topicGlyph[item.topic].icon}\n </Text>\n <Text\n style={[styles.eventName, item.issue && styles.alertText]}\n numberOfLines={1}\n >\n {item.event.name}\n </Text>\n <Text style={[styles.value, item.issue && styles.alertText]}>\n {'durationMs' in item.event\n ? `${item.event.durationMs.toFixed(0)} ms`\n : 'value' in item.event\n ? `${item.event.value.toFixed(0)} ${item.event.unit}`\n : ''}\n </Text>\n <Text style={styles.time}>\n +\n {(\n (item.event.timestampMs - (visit.sinceMs ?? 0)) /\n 1000\n ).toFixed(1)}\n s\n </Text>\n </View>\n ))}\n </ScrollView>\n )}\n </Animated.View>\n )\n}\n\nfunction Stat({\n label,\n value,\n alert,\n}: {\n label: string\n value: number | string\n alert?: boolean\n}) {\n const hot = alert && Number(value) > 0\n return (\n <View style={styles.stat}>\n <Text style={[styles.statValue, hot && styles.alertText]}>{value}</Text>\n <Text style={styles.statLabel}>{label}</Text>\n </View>\n )\n}\n\nconst styles = StyleSheet.create({\n bubble: {\n position: 'absolute',\n width: BUBBLE,\n height: BUBBLE,\n borderRadius: BUBBLE / 2,\n overflow: 'hidden',\n borderWidth: StyleSheet.hairlineWidth * 2,\n borderColor: palette.line,\n alignItems: 'center',\n justifyContent: 'center',\n shadowColor: '#000',\n shadowOpacity: 0.15,\n shadowRadius: 10,\n shadowOffset: { width: 0, height: 4 },\n elevation: 6,\n },\n bubbleGlass: { borderRadius: BUBBLE / 2 },\n sheetGlass: { borderTopLeftRadius: 22, borderTopRightRadius: 22 },\n bubbleAlert: { borderColor: palette.error, borderWidth: 2 },\n bubbleValue: {\n color: palette.text,\n fontSize: 17,\n fontWeight: '600',\n fontVariant: ['tabular-nums'],\n },\n bubbleUnit: { color: palette.muted, fontSize: 10, marginTop: -2 },\n sheet: {\n position: 'absolute',\n left: 0,\n right: 0,\n bottom: 0,\n borderTopLeftRadius: 22,\n borderTopRightRadius: 22,\n overflow: 'hidden',\n borderTopWidth: StyleSheet.hairlineWidth,\n borderColor: palette.line,\n paddingHorizontal: 14,\n shadowColor: '#000',\n shadowOpacity: 0.12,\n shadowRadius: 16,\n shadowOffset: { width: 0, height: -4 },\n elevation: 12,\n },\n grabArea: { paddingBottom: 8 },\n grabber: {\n alignSelf: 'center',\n width: 36,\n height: 5,\n borderRadius: 3,\n backgroundColor: palette.line,\n marginTop: 6,\n marginBottom: 8,\n },\n row: { flexDirection: 'row', alignItems: 'center', gap: 6 },\n screen: { flex: 1, color: palette.text, fontSize: 15, fontWeight: '600' },\n muted: { color: palette.muted, fontSize: 13, fontWeight: '400' },\n chip: {\n paddingHorizontal: 10,\n paddingVertical: 5,\n borderRadius: 6,\n backgroundColor: palette.panel,\n },\n chipText: { color: palette.accent, fontSize: 13, fontWeight: '500' },\n stats: {\n flexDirection: 'row',\n marginTop: 10,\n borderTopWidth: StyleSheet.hairlineWidth,\n borderColor: palette.line,\n paddingTop: 8,\n },\n stat: { flex: 1, alignItems: 'center' },\n action: {\n paddingHorizontal: 10,\n paddingVertical: 6,\n borderRadius: 7,\n backgroundColor: palette.panel,\n marginLeft: 6,\n alignSelf: 'center',\n },\n actionText: { color: palette.accent, fontSize: 13, fontWeight: '500' },\n statValue: {\n color: palette.text,\n fontSize: 17,\n fontWeight: '600',\n fontVariant: ['tabular-nums'],\n },\n statLabel: { color: palette.muted, fontSize: 11 },\n list: { flex: 1 },\n empty: { paddingVertical: 12 },\n event: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n paddingVertical: 7,\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderColor: palette.line,\n },\n glyph: { width: 18, textAlign: 'center', color: palette.muted },\n eventName: { flex: 1, color: palette.text, fontSize: 13 },\n value: {\n color: palette.text,\n fontSize: 13,\n fontVariant: ['tabular-nums'],\n },\n time: {\n width: 52,\n textAlign: 'right',\n color: palette.muted,\n fontSize: 12,\n fontVariant: ['tabular-nums'],\n },\n alertText: { color: palette.error },\n})\n", "import { useEffect, useState } from 'react'\nimport type { TraceClient } from '../client/createTraceClient'\nimport type { Recording } from '../specs/Recording.nitro'\nimport type { TracePage } from '../types'\nimport { readSnapshot } from './readSnapshot'\n/** Incremental polling of the active recording; unchanged snapshots keep their identity. */\nexport function useLiveRecording(\n client: TraceClient,\n active: boolean,\n intervalMs = 1000\n) {\n const [page, setPage] = useState<TracePage>()\n useEffect(() => {\n if (!active) return\n let cancelled = false\n let timer: ReturnType<typeof setTimeout>\n let cached: TracePage | undefined\n let cachedRecording: Recording | undefined\n const tick = async () => {\n try {\n const recording = client.getRecording()\n if (recording) {\n if (recording !== cachedRecording) {\n cached = undefined\n cachedRecording = recording\n }\n cached = await readSnapshot(recording, cached)\n if (!cancelled) setPage(cached)\n }\n } catch (error) {\n client.reportError(error)\n } finally {\n if (!cancelled) timer = setTimeout(tick, intervalMs)\n }\n }\n void tick()\n return () => {\n cancelled = true\n clearTimeout(timer)\n }\n }, [client, active, intervalMs])\n return page\n}\n", "import { useEffect } from 'react'\nimport type { TraceClient } from '../client/createTraceClient'\n/** Report the consumer's ready signal after a frame opportunity. Not native launch time or guaranteed TTI. */\nexport function useAppReadyMetric(client: TraceClient, ready: boolean) {\n useEffect(() => {\n if (!ready) return\n const frame = requestAnimationFrame(() => client.reportAppReady())\n return () => cancelAnimationFrame(frame)\n }, [client, ready])\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["useEffect", "Modal", "ScrollView", "StyleSheet", "SafeAreaProvider", "SafeAreaView", "useSyncExternalStore", "s", "s", "isSpan", "s", "useSyncExternalStore", "mode", "s", "StyleSheet", "Text", "View", "useCallback", "useState", "View", "Row", "jsx", "useState", "useCallback", "tabs", "View", "Fragment", "jsx", "jsxs", "s", "View", "Text", "StyleSheet", "useCallback", "useState", "Pressable", "StyleSheet", "Text", "View", "useState", "StyleSheet", "Text", "TextInput", "View", "Modal", "Platform", "Pressable", "StyleSheet", "View", "SafeAreaView", "jsx", "jsxs", "Modal", "styles", "Platform", "Pressable", "StyleSheet", "SafeAreaView", "View", "jsx", "jsxs", "useState", "numeric", "View", "styles", "Text", "TextInput", "StyleSheet", "jsx", "jsxs", "toggle", "useState", "useCallback", "View", "styles", "Pressable", "Text", "StyleSheet", "LegendList", "useEffect", "useMemo", "useRef", "useState", "Pressable", "ScrollView", "StyleSheet", "Text", "View", "Fragment", "jsx", "jsxs", "View", "styles", "Text", "attribute", "useState", "useRef", "useEffect", "event", "useMemo", "s", "trace", "toggle", "LegendList", "span", "Pressable", "ScrollView", "StyleSheet", "LegendList", "useCallback", "useMemo", "Pressable", "StyleSheet", "Text", "View", "jsx", "jsxs", "useMemo", "useCallback", "View", "styles", "Pressable", "Text", "LegendList", "StyleSheet", "ScrollView", "jsx", "jsxs", "s", "ScrollView", "LegendList", "useCallback", "StyleSheet", "Text", "jsx", "jsxs", "useCallback", "Text", "styles", "LegendList", "StyleSheet", "Fragment", "jsx", "jsxs", "useEffect", "identity", "Modal", "SafeAreaProvider", "SafeAreaView", "styles", "ScrollView", "StyleSheet", "React", "useMemo", "useRef", "useState", "useSyncExternalStore", "Pressable", "ScrollView", "StyleSheet", "Text", "View", "useEffect", "useState", "useState", "useEffect", "jsx", "jsxs", "View", "StyleSheet", "useSyncExternalStore", "useState", "useMemo", "useRef", "styles", "Text", "React", "Pressable", "ScrollView", "useEffect"]
7
+ }