react-native-debug-toolkit 3.3.8 → 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. package/lib/commonjs/constants/logLevels.js +19 -0
  2. package/lib/commonjs/constants/logLevels.js.map +1 -0
  3. package/lib/commonjs/core/initialize.js +30 -19
  4. package/lib/commonjs/core/initialize.js.map +1 -1
  5. package/lib/commonjs/features/console/ConsoleLogTab.js +4 -15
  6. package/lib/commonjs/features/console/ConsoleLogTab.js.map +1 -1
  7. package/lib/commonjs/features/console/index.js +15 -8
  8. package/lib/commonjs/features/console/index.js.map +1 -1
  9. package/lib/commonjs/features/network/NetworkLogTab.js +91 -93
  10. package/lib/commonjs/features/network/NetworkLogTab.js.map +1 -1
  11. package/lib/commonjs/features/network/index.js +7 -4
  12. package/lib/commonjs/features/network/index.js.map +1 -1
  13. package/lib/commonjs/features/sessionHistory/SessionHistoryTab.js +1044 -0
  14. package/lib/commonjs/features/sessionHistory/SessionHistoryTab.js.map +1 -0
  15. package/lib/commonjs/features/sessionHistory/index.js +103 -0
  16. package/lib/commonjs/features/sessionHistory/index.js.map +1 -0
  17. package/lib/commonjs/features/track/index.js +4 -3
  18. package/lib/commonjs/features/track/index.js.map +1 -1
  19. package/lib/commonjs/index.js +20 -0
  20. package/lib/commonjs/index.js.map +1 -1
  21. package/lib/commonjs/ui/DebugView.js +1 -0
  22. package/lib/commonjs/ui/DebugView.js.map +1 -1
  23. package/lib/commonjs/ui/panel/DebugPanel.js +67 -34
  24. package/lib/commonjs/ui/panel/DebugPanel.js.map +1 -1
  25. package/lib/commonjs/ui/panel/FeatureIntroCard.js +131 -0
  26. package/lib/commonjs/ui/panel/FeatureIntroCard.js.map +1 -0
  27. package/lib/commonjs/ui/panel/FeatureRail.js +163 -0
  28. package/lib/commonjs/ui/panel/FeatureRail.js.map +1 -0
  29. package/lib/commonjs/ui/panel/FloatPanelView.js +147 -22
  30. package/lib/commonjs/ui/panel/FloatPanelView.js.map +1 -1
  31. package/lib/commonjs/ui/panel/buildFeatureSummary.js +207 -0
  32. package/lib/commonjs/ui/panel/buildFeatureSummary.js.map +1 -0
  33. package/lib/commonjs/ui/panel/filterFeatureSnapshot.js +43 -0
  34. package/lib/commonjs/ui/panel/filterFeatureSnapshot.js.map +1 -0
  35. package/lib/commonjs/ui/theme/colors.js +6 -0
  36. package/lib/commonjs/ui/theme/colors.js.map +1 -1
  37. package/lib/commonjs/utils/DaemonClient.js +30 -8
  38. package/lib/commonjs/utils/DaemonClient.js.map +1 -1
  39. package/lib/commonjs/utils/SessionManager.js +132 -0
  40. package/lib/commonjs/utils/SessionManager.js.map +1 -0
  41. package/lib/commonjs/utils/StorageAdapter.js +104 -0
  42. package/lib/commonjs/utils/StorageAdapter.js.map +1 -0
  43. package/lib/commonjs/utils/createChannelFeature.js +22 -5
  44. package/lib/commonjs/utils/createChannelFeature.js.map +1 -1
  45. package/lib/commonjs/utils/createPersistedObservableStore.js +14 -8
  46. package/lib/commonjs/utils/createPersistedObservableStore.js.map +1 -1
  47. package/lib/commonjs/utils/debugPreferences.js +28 -5
  48. package/lib/commonjs/utils/debugPreferences.js.map +1 -1
  49. package/lib/commonjs/utils/deviceReport.js +5 -1
  50. package/lib/commonjs/utils/deviceReport.js.map +1 -1
  51. package/lib/commonjs/utils/logRuntime.js +32 -0
  52. package/lib/commonjs/utils/logRuntime.js.map +1 -0
  53. package/lib/module/constants/logLevels.js +15 -0
  54. package/lib/module/constants/logLevels.js.map +1 -0
  55. package/lib/module/core/initialize.js +30 -19
  56. package/lib/module/core/initialize.js.map +1 -1
  57. package/lib/module/features/console/ConsoleLogTab.js +1 -12
  58. package/lib/module/features/console/ConsoleLogTab.js.map +1 -1
  59. package/lib/module/features/console/index.js +15 -8
  60. package/lib/module/features/console/index.js.map +1 -1
  61. package/lib/module/features/network/NetworkLogTab.js +91 -93
  62. package/lib/module/features/network/NetworkLogTab.js.map +1 -1
  63. package/lib/module/features/network/index.js +7 -4
  64. package/lib/module/features/network/index.js.map +1 -1
  65. package/lib/module/features/sessionHistory/SessionHistoryTab.js +1039 -0
  66. package/lib/module/features/sessionHistory/SessionHistoryTab.js.map +1 -0
  67. package/lib/module/features/sessionHistory/index.js +99 -0
  68. package/lib/module/features/sessionHistory/index.js.map +1 -0
  69. package/lib/module/features/track/index.js +4 -3
  70. package/lib/module/features/track/index.js.map +1 -1
  71. package/lib/module/index.js +3 -0
  72. package/lib/module/index.js.map +1 -1
  73. package/lib/module/ui/DebugView.js +1 -0
  74. package/lib/module/ui/DebugView.js.map +1 -1
  75. package/lib/module/ui/panel/DebugPanel.js +67 -34
  76. package/lib/module/ui/panel/DebugPanel.js.map +1 -1
  77. package/lib/module/ui/panel/FeatureIntroCard.js +126 -0
  78. package/lib/module/ui/panel/FeatureIntroCard.js.map +1 -0
  79. package/lib/module/ui/panel/FeatureRail.js +158 -0
  80. package/lib/module/ui/panel/FeatureRail.js.map +1 -0
  81. package/lib/module/ui/panel/FloatPanelView.js +148 -23
  82. package/lib/module/ui/panel/FloatPanelView.js.map +1 -1
  83. package/lib/module/ui/panel/buildFeatureSummary.js +203 -0
  84. package/lib/module/ui/panel/buildFeatureSummary.js.map +1 -0
  85. package/lib/module/ui/panel/filterFeatureSnapshot.js +39 -0
  86. package/lib/module/ui/panel/filterFeatureSnapshot.js.map +1 -0
  87. package/lib/module/ui/theme/colors.js +6 -0
  88. package/lib/module/ui/theme/colors.js.map +1 -1
  89. package/lib/module/utils/DaemonClient.js +30 -8
  90. package/lib/module/utils/DaemonClient.js.map +1 -1
  91. package/lib/module/utils/SessionManager.js +127 -0
  92. package/lib/module/utils/SessionManager.js.map +1 -0
  93. package/lib/module/utils/StorageAdapter.js +96 -0
  94. package/lib/module/utils/StorageAdapter.js.map +1 -0
  95. package/lib/module/utils/createChannelFeature.js +22 -5
  96. package/lib/module/utils/createChannelFeature.js.map +1 -1
  97. package/lib/module/utils/createPersistedObservableStore.js +14 -8
  98. package/lib/module/utils/createPersistedObservableStore.js.map +1 -1
  99. package/lib/module/utils/debugPreferences.js +27 -5
  100. package/lib/module/utils/debugPreferences.js.map +1 -1
  101. package/lib/module/utils/deviceReport.js +4 -1
  102. package/lib/module/utils/deviceReport.js.map +1 -1
  103. package/lib/module/utils/logRuntime.js +26 -0
  104. package/lib/module/utils/logRuntime.js.map +1 -0
  105. package/lib/typescript/src/constants/logLevels.d.ts +3 -0
  106. package/lib/typescript/src/constants/logLevels.d.ts.map +1 -0
  107. package/lib/typescript/src/core/initialize.d.ts +4 -0
  108. package/lib/typescript/src/core/initialize.d.ts.map +1 -1
  109. package/lib/typescript/src/features/console/ConsoleLogTab.d.ts.map +1 -1
  110. package/lib/typescript/src/features/console/index.d.ts +2 -1
  111. package/lib/typescript/src/features/console/index.d.ts.map +1 -1
  112. package/lib/typescript/src/features/network/NetworkLogTab.d.ts.map +1 -1
  113. package/lib/typescript/src/features/network/index.d.ts +2 -1
  114. package/lib/typescript/src/features/network/index.d.ts.map +1 -1
  115. package/lib/typescript/src/features/sessionHistory/SessionHistoryTab.d.ts +20 -0
  116. package/lib/typescript/src/features/sessionHistory/SessionHistoryTab.d.ts.map +1 -0
  117. package/lib/typescript/src/features/sessionHistory/index.d.ts +4 -0
  118. package/lib/typescript/src/features/sessionHistory/index.d.ts.map +1 -0
  119. package/lib/typescript/src/features/track/index.d.ts +2 -1
  120. package/lib/typescript/src/features/track/index.d.ts.map +1 -1
  121. package/lib/typescript/src/index.d.ts +4 -0
  122. package/lib/typescript/src/index.d.ts.map +1 -1
  123. package/lib/typescript/src/types/feature.d.ts +1 -1
  124. package/lib/typescript/src/types/feature.d.ts.map +1 -1
  125. package/lib/typescript/src/types/index.d.ts +2 -0
  126. package/lib/typescript/src/types/index.d.ts.map +1 -1
  127. package/lib/typescript/src/ui/DebugView.d.ts.map +1 -1
  128. package/lib/typescript/src/ui/panel/DebugPanel.d.ts +3 -1
  129. package/lib/typescript/src/ui/panel/DebugPanel.d.ts.map +1 -1
  130. package/lib/typescript/src/ui/panel/FeatureIntroCard.d.ts +11 -0
  131. package/lib/typescript/src/ui/panel/FeatureIntroCard.d.ts.map +1 -0
  132. package/lib/typescript/src/ui/panel/FeatureRail.d.ts +16 -0
  133. package/lib/typescript/src/ui/panel/FeatureRail.d.ts.map +1 -0
  134. package/lib/typescript/src/ui/panel/FloatPanelView.d.ts.map +1 -1
  135. package/lib/typescript/src/ui/panel/buildFeatureSummary.d.ts +13 -0
  136. package/lib/typescript/src/ui/panel/buildFeatureSummary.d.ts.map +1 -0
  137. package/lib/typescript/src/ui/panel/filterFeatureSnapshot.d.ts +3 -0
  138. package/lib/typescript/src/ui/panel/filterFeatureSnapshot.d.ts.map +1 -0
  139. package/lib/typescript/src/ui/theme/colors.d.ts +5 -0
  140. package/lib/typescript/src/ui/theme/colors.d.ts.map +1 -1
  141. package/lib/typescript/src/utils/DaemonClient.d.ts +7 -1
  142. package/lib/typescript/src/utils/DaemonClient.d.ts.map +1 -1
  143. package/lib/typescript/src/utils/SessionManager.d.ts +30 -0
  144. package/lib/typescript/src/utils/SessionManager.d.ts.map +1 -0
  145. package/lib/typescript/src/utils/StorageAdapter.d.ts +38 -0
  146. package/lib/typescript/src/utils/StorageAdapter.d.ts.map +1 -0
  147. package/lib/typescript/src/utils/createChannelFeature.d.ts +2 -0
  148. package/lib/typescript/src/utils/createChannelFeature.d.ts.map +1 -1
  149. package/lib/typescript/src/utils/createPersistedObservableStore.d.ts +4 -1
  150. package/lib/typescript/src/utils/createPersistedObservableStore.d.ts.map +1 -1
  151. package/lib/typescript/src/utils/debugPreferences.d.ts +1 -3
  152. package/lib/typescript/src/utils/debugPreferences.d.ts.map +1 -1
  153. package/lib/typescript/src/utils/deviceReport.d.ts +1 -0
  154. package/lib/typescript/src/utils/deviceReport.d.ts.map +1 -1
  155. package/lib/typescript/src/utils/logRuntime.d.ts +13 -0
  156. package/lib/typescript/src/utils/logRuntime.d.ts.map +1 -0
  157. package/package.json +9 -1
  158. package/src/constants/logLevels.ts +13 -0
  159. package/src/core/initialize.ts +49 -25
  160. package/src/features/console/ConsoleLogTab.tsx +1 -14
  161. package/src/features/console/index.ts +18 -8
  162. package/src/features/network/NetworkLogTab.tsx +61 -71
  163. package/src/features/network/index.ts +12 -3
  164. package/src/features/sessionHistory/SessionHistoryTab.tsx +691 -0
  165. package/src/features/sessionHistory/index.ts +102 -0
  166. package/src/features/track/index.ts +10 -3
  167. package/src/index.ts +11 -0
  168. package/src/types/feature.ts +2 -1
  169. package/src/types/index.ts +10 -0
  170. package/src/ui/DebugView.tsx +1 -0
  171. package/src/ui/panel/DebugPanel.tsx +60 -30
  172. package/src/ui/panel/FeatureIntroCard.tsx +127 -0
  173. package/src/ui/panel/FeatureRail.tsx +165 -0
  174. package/src/ui/panel/FloatPanelView.tsx +154 -15
  175. package/src/ui/panel/buildFeatureSummary.ts +288 -0
  176. package/src/ui/panel/filterFeatureSnapshot.ts +51 -0
  177. package/src/ui/theme/colors.ts +7 -0
  178. package/src/utils/DaemonClient.ts +33 -5
  179. package/src/utils/SessionManager.ts +174 -0
  180. package/src/utils/StorageAdapter.ts +135 -0
  181. package/src/utils/createChannelFeature.ts +28 -6
  182. package/src/utils/createPersistedObservableStore.ts +18 -10
  183. package/src/utils/debugPreferences.ts +38 -7
  184. package/src/utils/deviceReport.ts +5 -1
  185. package/src/utils/logRuntime.ts +39 -0
  186. package/lib/commonjs/ui/panel/FeatureTabBar.js +0 -182
  187. package/lib/commonjs/ui/panel/FeatureTabBar.js.map +0 -1
  188. package/lib/module/ui/panel/FeatureTabBar.js +0 -177
  189. package/lib/module/ui/panel/FeatureTabBar.js.map +0 -1
  190. package/lib/typescript/src/ui/panel/FeatureTabBar.d.ts +0 -13
  191. package/lib/typescript/src/ui/panel/FeatureTabBar.d.ts.map +0 -1
  192. package/src/ui/panel/FeatureTabBar.tsx +0 -204
@@ -0,0 +1,1044 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.SessionHistoryTab = void 0;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _reactNative = require("react-native");
9
+ var _colors = require("../../ui/theme/colors");
10
+ var _CollapsibleSection = require("../../ui/shared/CollapsibleSection");
11
+ var _JsonView = require("../../ui/shared/JsonView");
12
+ var _CopyButton = require("../../ui/shared/CopyButton");
13
+ var _LogListScreen = require("../../ui/shared/LogListScreen");
14
+ var _safeStringify = require("../../utils/safeStringify");
15
+ var _copyToComputer = require("../../utils/copyToComputer");
16
+ var _logLevels = require("../../constants/logLevels");
17
+ var _jsxRuntime = require("react/jsx-runtime");
18
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
19
+ // ── Types ──────────────────────────────────────────────────────────────
20
+
21
+ // ── Constants ──────────────────────────────────────────────────────────
22
+
23
+ const FEATURE_LABELS = {
24
+ console_logs: 'Console',
25
+ network_logs: 'Network',
26
+ track_logs: 'Track'
27
+ };
28
+ const FEATURE_COLORS = {
29
+ console_logs: _colors.Colors.info,
30
+ network_logs: _colors.Colors.success,
31
+ track_logs: _colors.Colors.purple
32
+ };
33
+ const FEATURE_KEYS = Object.keys(FEATURE_LABELS);
34
+
35
+ // ── Helpers ────────────────────────────────────────────────────────────
36
+
37
+ function relativeTime(ts) {
38
+ const diff = Date.now() - ts;
39
+ const mins = Math.floor(diff / 60000);
40
+ if (mins < 1) return 'Just now';
41
+ if (mins < 60) return `${mins}m ago`;
42
+ const hours = Math.floor(mins / 60);
43
+ if (hours < 24) return `${hours}h ago`;
44
+ const days = Math.floor(hours / 24);
45
+ if (days === 1) return 'Yesterday';
46
+ if (days < 7) return `${days}d ago`;
47
+ return new Date(ts).toLocaleDateString(undefined, {
48
+ month: 'short',
49
+ day: 'numeric'
50
+ });
51
+ }
52
+ function formatTime(ts) {
53
+ return new Date(ts).toLocaleTimeString(undefined, {
54
+ hour: '2-digit',
55
+ minute: '2-digit'
56
+ });
57
+ }
58
+ function formatFullDate(ts) {
59
+ const d = new Date(ts);
60
+ const now = new Date();
61
+ const isToday = d.toDateString() === now.toDateString();
62
+ const time = d.toLocaleTimeString(undefined, {
63
+ hour: '2-digit',
64
+ minute: '2-digit',
65
+ second: '2-digit'
66
+ });
67
+ if (isToday) return `Today ${time}`;
68
+ return d.toLocaleDateString(undefined, {
69
+ month: 'short',
70
+ day: 'numeric'
71
+ }) + ' ' + time;
72
+ }
73
+ function totalCounts(counts) {
74
+ return (counts.console_logs ?? 0) + (counts.network_logs ?? 0) + (counts.track_logs ?? 0);
75
+ }
76
+ function totalLogs(logs) {
77
+ return Object.values(logs).reduce((sum, arr) => sum + arr.length, 0);
78
+ }
79
+ function shortId(id) {
80
+ return id.slice(-6).toUpperCase();
81
+ }
82
+ function flattenLogs(logs, filter) {
83
+ const keys = filter === 'all' ? ['console_logs', 'network_logs', 'track_logs'] : [filter];
84
+ const entries = [];
85
+ for (const key of keys) {
86
+ const items = logs[key] ?? [];
87
+ items.forEach((raw, i) => {
88
+ const e = raw;
89
+ entries.push({
90
+ id: `${key}-${i}`,
91
+ type: key,
92
+ timestamp: e.timestamp ?? 0,
93
+ raw
94
+ });
95
+ });
96
+ }
97
+ entries.sort((a, b) => b.timestamp - a.timestamp);
98
+ return entries;
99
+ }
100
+ function toRecord(entry) {
101
+ return entry.raw;
102
+ }
103
+ function shortenUrl(url) {
104
+ try {
105
+ const u = new URL(url);
106
+ return u.pathname + u.search;
107
+ } catch {
108
+ return url;
109
+ }
110
+ }
111
+
112
+ // ── Main Tab ───────────────────────────────────────────────────────────
113
+
114
+ const SessionHistoryTab = exports.SessionHistoryTab = /*#__PURE__*/_react.default.memo(({
115
+ snapshot,
116
+ feature
117
+ }) => {
118
+ const {
119
+ sessions,
120
+ currentSessionId,
121
+ loading,
122
+ selectedSession,
123
+ logCounts
124
+ } = snapshot;
125
+ const handleSelectSession = (0, _react.useCallback)(session => {
126
+ if (session.id === currentSessionId) return;
127
+ feature.loadSession(session.id);
128
+ }, [feature, currentSessionId]);
129
+ const handleBack = (0, _react.useCallback)(() => {
130
+ feature.loadSession(null);
131
+ }, [feature]);
132
+ if (loading) {
133
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
134
+ style: s.center,
135
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ActivityIndicator, {
136
+ color: _colors.Colors.primary
137
+ })
138
+ });
139
+ }
140
+ if (selectedSession) {
141
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(SessionDetail, {
142
+ logs: selectedSession.logs,
143
+ sessionId: selectedSession.sessionId,
144
+ onBack: handleBack
145
+ });
146
+ }
147
+ const previousSessions = sessions.filter(s => s.id !== currentSessionId);
148
+ const currentSession = sessions.find(s => s.id === currentSessionId);
149
+ if (previousSessions.length === 0) {
150
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
151
+ style: s.center,
152
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
153
+ style: s.emptyClock,
154
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
155
+ style: s.emptyClockText,
156
+ children: "\u23F1"
157
+ })
158
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
159
+ style: s.emptyTitle,
160
+ children: "No session history"
161
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
162
+ style: s.emptySub,
163
+ children: "Previous sessions will appear here after you restart the app."
164
+ })]
165
+ });
166
+ }
167
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.ScrollView, {
168
+ style: s.container,
169
+ contentContainerStyle: s.scrollContent,
170
+ children: [currentSession && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
171
+ style: s.currentCard,
172
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
173
+ style: s.currentRow,
174
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
175
+ style: s.pulseDot
176
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
177
+ style: s.currentLabel,
178
+ children: "CURRENT"
179
+ })]
180
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
181
+ style: s.currentTime,
182
+ children: formatFullDate(currentSession.startedAt)
183
+ })]
184
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
185
+ style: s.timelineSection,
186
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
187
+ style: s.timelineHeader,
188
+ children: "PREVIOUS SESSIONS"
189
+ }), previousSessions.map((session, idx) => {
190
+ const counts = logCounts[session.id];
191
+ const total = counts ? totalCounts(counts) : 0;
192
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Pressable, {
193
+ style: s.timelineRow,
194
+ onPress: () => handleSelectSession(session),
195
+ android_ripple: {
196
+ color: 'rgba(0,0,0,0.04)'
197
+ },
198
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
199
+ style: s.railCol,
200
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
201
+ style: s.railDot
202
+ }), idx < previousSessions.length - 1 && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
203
+ style: s.railLine
204
+ })]
205
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
206
+ style: s.historyCard,
207
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
208
+ style: s.cardTop,
209
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
210
+ style: s.cardTime,
211
+ children: formatTime(session.startedAt)
212
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
213
+ style: s.cardRelative,
214
+ children: relativeTime(session.startedAt)
215
+ })]
216
+ }), counts && total > 0 ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
217
+ style: s.pillRow,
218
+ children: FEATURE_KEYS.map(key => {
219
+ const c = counts[key] ?? 0;
220
+ if (c === 0) return null;
221
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
222
+ style: [s.pill, {
223
+ backgroundColor: FEATURE_COLORS[key] + '18'
224
+ }],
225
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
226
+ style: [s.pillDot, {
227
+ backgroundColor: FEATURE_COLORS[key]
228
+ }]
229
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
230
+ style: [s.pillText, {
231
+ color: FEATURE_COLORS[key]
232
+ }],
233
+ children: [c, " ", FEATURE_LABELS[key]]
234
+ })]
235
+ }, key);
236
+ })
237
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
238
+ style: s.cardEmpty,
239
+ children: "No logs recorded"
240
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
241
+ style: s.cardFooter,
242
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
243
+ style: s.cardId,
244
+ children: ["#", shortId(session.id)]
245
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
246
+ style: s.cardChevron,
247
+ children: "\u203A"
248
+ })]
249
+ })]
250
+ })]
251
+ }, session.id);
252
+ })]
253
+ })]
254
+ });
255
+ });
256
+
257
+ // ── Session Detail (uses LogListScreen for tap-to-detail) ──────────────
258
+
259
+ const SessionDetail = /*#__PURE__*/_react.default.memo(({
260
+ logs,
261
+ sessionId,
262
+ onBack
263
+ }) => {
264
+ const [filter, setFilter] = (0, _react.useState)('all');
265
+ const total = totalLogs(logs);
266
+ const flatEntries = (0, _react.useMemo)(() => flattenLogs(logs, filter), [logs, filter]);
267
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
268
+ style: s.container,
269
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
270
+ style: s.sessionHeader,
271
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Pressable, {
272
+ onPress: onBack,
273
+ hitSlop: 12,
274
+ style: s.headerBackBtn,
275
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
276
+ style: s.headerArrow,
277
+ children: "\u2039"
278
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
279
+ style: s.headerBackLabel,
280
+ children: "Sessions"
281
+ })]
282
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
283
+ style: s.headerMeta,
284
+ children: ["#", shortId(sessionId)]
285
+ })]
286
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_LogListScreen.LogListScreen, {
287
+ data: flatEntries,
288
+ reversed: false,
289
+ emptyText: filter === 'all' ? 'No logs in this session' : `No ${FEATURE_LABELS[filter]} logs`,
290
+ renderListHeader: () => /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
291
+ style: s.filterBar,
292
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(FilterChip, {
293
+ label: "All",
294
+ count: total,
295
+ active: filter === 'all',
296
+ onPress: () => setFilter('all'),
297
+ color: _colors.Colors.text
298
+ }), FEATURE_KEYS.map(key => {
299
+ const c = (logs[key] ?? []).length;
300
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(FilterChip, {
301
+ label: FEATURE_LABELS[key],
302
+ count: c,
303
+ active: filter === key,
304
+ onPress: () => setFilter(key),
305
+ color: FEATURE_COLORS[key]
306
+ }, key);
307
+ })]
308
+ }),
309
+ renderRow: item => /*#__PURE__*/(0, _jsxRuntime.jsx)(LogRow, {
310
+ entry: item
311
+ }),
312
+ renderDetailHeader: item => /*#__PURE__*/(0, _jsxRuntime.jsx)(LogDetailHeader, {
313
+ entry: item
314
+ }),
315
+ renderDetailBody: item => /*#__PURE__*/(0, _jsxRuntime.jsx)(LogDetailBody, {
316
+ entry: item
317
+ })
318
+ })]
319
+ });
320
+ });
321
+
322
+ // ── Filter Chips ───────────────────────────────────────────────────────
323
+
324
+ const FilterChip = /*#__PURE__*/_react.default.memo(({
325
+ label,
326
+ count,
327
+ active,
328
+ onPress,
329
+ color
330
+ }) => /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Pressable, {
331
+ onPress: onPress,
332
+ style: [s.chip, active && {
333
+ backgroundColor: color
334
+ }],
335
+ hitSlop: 4,
336
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
337
+ style: [s.chipLabel, active && s.chipLabelActive],
338
+ children: [label, " ", /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
339
+ style: [s.chipCount, active && s.chipCountActive],
340
+ children: count
341
+ })]
342
+ })
343
+ }));
344
+
345
+ // ── Log List Row ───────────────────────────────────────────────────────
346
+
347
+ const LogRow = /*#__PURE__*/_react.default.memo(({
348
+ entry
349
+ }) => {
350
+ const e = toRecord(entry);
351
+ if (entry.type === 'console_logs') {
352
+ const level = e.level ?? 'log';
353
+ const msg = Array.isArray(e.data) ? e.data.map(d => typeof d === 'string' ? d : (0, _safeStringify.safeStringify)(d)).join(' ') : (0, _safeStringify.safeStringify)(e.data);
354
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
355
+ style: s.rowContent,
356
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
357
+ style: [s.levelDot, {
358
+ backgroundColor: _logLevels.LEVEL_COLORS[level] ?? '#8E8E93'
359
+ }],
360
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
361
+ style: s.levelIcon,
362
+ children: _logLevels.LEVEL_ICONS[level] ?? '●'
363
+ })
364
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
365
+ style: s.rowBody,
366
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
367
+ style: s.rowMsg,
368
+ numberOfLines: 2,
369
+ children: msg
370
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
371
+ style: s.rowTime,
372
+ children: new Date(e.timestamp).toLocaleTimeString()
373
+ })]
374
+ })]
375
+ });
376
+ }
377
+ if (entry.type === 'network_logs') {
378
+ const method = e.request?.method ?? '?';
379
+ const url = e.request?.url ?? '';
380
+ const status = e.response?.status;
381
+ const ok = !e.error && (!status || status < 400);
382
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
383
+ style: s.rowContent,
384
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
385
+ style: [s.statusBar, {
386
+ backgroundColor: ok ? _colors.Colors.success : _colors.Colors.error
387
+ }]
388
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
389
+ style: s.rowBody,
390
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
391
+ style: s.rowMeta,
392
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
393
+ style: [s.methodText, {
394
+ color: (0, _colors.getMethodColor)(method)
395
+ }],
396
+ children: method
397
+ }), status != null && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
398
+ style: [s.miniPill, {
399
+ backgroundColor: ok ? _colors.Colors.success : _colors.Colors.error
400
+ }],
401
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
402
+ style: s.miniPillText,
403
+ children: status
404
+ })
405
+ })]
406
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
407
+ style: [s.rowMsg, !ok && {
408
+ color: _colors.Colors.error
409
+ }],
410
+ numberOfLines: 1,
411
+ children: shortenUrl(url)
412
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
413
+ style: s.rowTime,
414
+ children: new Date(e.timestamp).toLocaleTimeString()
415
+ })]
416
+ })]
417
+ });
418
+ }
419
+
420
+ // track_logs
421
+ const name = e.eventName ?? e.action ?? 'Event';
422
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
423
+ style: s.rowContent,
424
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
425
+ style: s.trackDot
426
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
427
+ style: s.rowBody,
428
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
429
+ style: s.rowMsg,
430
+ numberOfLines: 1,
431
+ children: name
432
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
433
+ style: s.rowTime,
434
+ children: e.timestamp ? new Date(e.timestamp).toLocaleTimeString() : ''
435
+ })]
436
+ })]
437
+ });
438
+ });
439
+
440
+ // ── Log Detail Header ──────────────────────────────────────────────────
441
+
442
+ const LogDetailHeader = /*#__PURE__*/_react.default.memo(({
443
+ entry
444
+ }) => {
445
+ const e = toRecord(entry);
446
+ if (entry.type === 'console_logs') {
447
+ const level = e.level ?? 'log';
448
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
449
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
450
+ style: [s.levelBadge, {
451
+ backgroundColor: _logLevels.LEVEL_COLORS[level] ?? '#8E8E93'
452
+ }],
453
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
454
+ style: s.levelBadgeText,
455
+ children: level.toUpperCase()
456
+ })
457
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
458
+ style: s.detailTimestamp,
459
+ children: new Date(e.timestamp).toLocaleString()
460
+ })]
461
+ });
462
+ }
463
+ if (entry.type === 'network_logs') {
464
+ const method = e.request?.method ?? '?';
465
+ const status = e.response?.status;
466
+ const ok = !e.error && (!status || status < 400);
467
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
468
+ style: s.networkHeaderBadges,
469
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
470
+ style: [s.methodBadge, {
471
+ backgroundColor: (0, _colors.getMethodColor)(method)
472
+ }],
473
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
474
+ style: s.methodBadgeText,
475
+ children: method
476
+ })
477
+ }), status != null && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
478
+ style: [s.statusPill, {
479
+ backgroundColor: ok ? _colors.Colors.success : _colors.Colors.error
480
+ }],
481
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
482
+ style: s.statusPillText,
483
+ children: status
484
+ })
485
+ }), e.duration != null && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
486
+ style: s.durationText,
487
+ children: [e.duration, "ms"]
488
+ })]
489
+ });
490
+ }
491
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
492
+ style: s.detailTimestamp,
493
+ children: new Date(e.timestamp).toLocaleString()
494
+ });
495
+ });
496
+
497
+ // ── Log Detail Body ────────────────────────────────────────────────────
498
+
499
+ const LogDetailBody = /*#__PURE__*/_react.default.memo(({
500
+ entry
501
+ }) => {
502
+ const e = toRecord(entry);
503
+ if (entry.type === 'console_logs') {
504
+ const data = Array.isArray(e.data) ? e.data : [e.data];
505
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ScrollView, {
506
+ style: s.detailBody,
507
+ contentContainerStyle: s.detailBodyContent,
508
+ children: data.map((d, i) => {
509
+ const formatted = typeof d === 'object' && d !== null ? (0, _copyToComputer.fmt)(d) : String(d);
510
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_CollapsibleSection.CollapsibleSection, {
511
+ title: typeof d === 'object' && d !== null ? `Arg ${i + 1} (object)` : `Arg ${i + 1}`,
512
+ initiallyExpanded: i === 0,
513
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
514
+ style: s.sectionWithCopy,
515
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_CopyButton.CopyButton, {
516
+ text: formatted,
517
+ label: `Arg ${i + 1}`
518
+ }), typeof d === 'object' && d !== null ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_JsonView.JsonView, {
519
+ data: d,
520
+ maxHeight: 250
521
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
522
+ style: s.plainText,
523
+ selectable: true,
524
+ children: String(d)
525
+ })]
526
+ })
527
+ }, i);
528
+ })
529
+ });
530
+ }
531
+ if (entry.type === 'network_logs') {
532
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.ScrollView, {
533
+ style: s.detailBody,
534
+ contentContainerStyle: s.detailBodyContent,
535
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
536
+ style: s.urlCard,
537
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
538
+ style: s.urlText,
539
+ selectable: true,
540
+ numberOfLines: 3,
541
+ children: e.request?.url
542
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_CopyButton.CopyButton, {
543
+ text: e.request?.url ?? '',
544
+ label: "URL"
545
+ })]
546
+ }), e.error && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
547
+ style: s.errorBox,
548
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
549
+ style: s.errorIcon,
550
+ children: "\u26A0"
551
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
552
+ style: s.errorText,
553
+ children: e.error
554
+ })]
555
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_CollapsibleSection.CollapsibleSection, {
556
+ title: "Request Body",
557
+ initiallyExpanded: true,
558
+ children: e.request?.body != null ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
559
+ style: s.sectionWithCopy,
560
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_CopyButton.CopyButton, {
561
+ text: (0, _copyToComputer.fmt)(e.request.body),
562
+ label: "Request Body"
563
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_JsonView.JsonView, {
564
+ data: e.request.body,
565
+ maxHeight: 250
566
+ })]
567
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
568
+ style: s.emptySection,
569
+ children: "No request body"
570
+ })
571
+ }), e.request?.headers && /*#__PURE__*/(0, _jsxRuntime.jsx)(_CollapsibleSection.CollapsibleSection, {
572
+ title: "Request Headers",
573
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
574
+ style: s.sectionWithCopy,
575
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_CopyButton.CopyButton, {
576
+ text: (0, _copyToComputer.fmt)(e.request.headers),
577
+ label: "Request Headers"
578
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_JsonView.JsonView, {
579
+ data: e.request.headers,
580
+ maxHeight: 200
581
+ })]
582
+ })
583
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_CollapsibleSection.CollapsibleSection, {
584
+ title: "Response Body",
585
+ initiallyExpanded: true,
586
+ children: e.response?.data != null ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
587
+ style: s.sectionWithCopy,
588
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_CopyButton.CopyButton, {
589
+ text: (0, _copyToComputer.fmt)(e.response.data),
590
+ label: "Response Body"
591
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_JsonView.JsonView, {
592
+ data: e.response.data,
593
+ maxHeight: 300
594
+ })]
595
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
596
+ style: s.emptySection,
597
+ children: "No response body"
598
+ })
599
+ }), e.response?.headers && /*#__PURE__*/(0, _jsxRuntime.jsx)(_CollapsibleSection.CollapsibleSection, {
600
+ title: "Response Headers",
601
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
602
+ style: s.sectionWithCopy,
603
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_CopyButton.CopyButton, {
604
+ text: (0, _copyToComputer.fmt)(e.response.headers),
605
+ label: "Response Headers"
606
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_JsonView.JsonView, {
607
+ data: e.response.headers,
608
+ maxHeight: 200
609
+ })]
610
+ })
611
+ })]
612
+ });
613
+ }
614
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ScrollView, {
615
+ style: s.detailBody,
616
+ contentContainerStyle: s.detailBodyContent,
617
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
618
+ style: s.sectionWithCopy,
619
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_CopyButton.CopyButton, {
620
+ text: (0, _copyToComputer.fmt)(entry.raw),
621
+ label: "Event"
622
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_JsonView.JsonView, {
623
+ data: entry.raw,
624
+ maxHeight: 400
625
+ })]
626
+ })
627
+ });
628
+ });
629
+
630
+ // ── Styles ─────────────────────────────────────────────────────────────
631
+
632
+ const s = _reactNative.StyleSheet.create({
633
+ container: {
634
+ flex: 1,
635
+ backgroundColor: _colors.Colors.background
636
+ },
637
+ scrollContent: {
638
+ paddingTop: 12,
639
+ paddingBottom: 60
640
+ },
641
+ // Center (loading / empty)
642
+ center: {
643
+ flex: 1,
644
+ justifyContent: 'center',
645
+ alignItems: 'center',
646
+ backgroundColor: _colors.Colors.background,
647
+ padding: 32
648
+ },
649
+ emptyClock: {
650
+ width: 64,
651
+ height: 64,
652
+ borderRadius: 32,
653
+ backgroundColor: _colors.Colors.surface,
654
+ alignItems: 'center',
655
+ justifyContent: 'center',
656
+ borderWidth: 1,
657
+ borderColor: _colors.Colors.border,
658
+ marginBottom: 16
659
+ },
660
+ emptyClockText: {
661
+ fontSize: 28
662
+ },
663
+ emptyTitle: {
664
+ fontSize: 17,
665
+ fontWeight: '600',
666
+ color: _colors.Colors.text,
667
+ marginBottom: 6
668
+ },
669
+ emptySub: {
670
+ fontSize: 14,
671
+ color: _colors.Colors.textSecondary,
672
+ textAlign: 'center',
673
+ lineHeight: 20
674
+ },
675
+ // Current session
676
+ currentCard: {
677
+ backgroundColor: _colors.Colors.primary,
678
+ marginHorizontal: 16,
679
+ borderRadius: 14,
680
+ padding: 16,
681
+ marginBottom: 20
682
+ },
683
+ currentRow: {
684
+ flexDirection: 'row',
685
+ alignItems: 'center',
686
+ marginBottom: 6
687
+ },
688
+ pulseDot: {
689
+ width: 8,
690
+ height: 8,
691
+ borderRadius: 4,
692
+ backgroundColor: '#4CD964',
693
+ marginRight: 8
694
+ },
695
+ currentLabel: {
696
+ fontSize: 11,
697
+ fontWeight: '700',
698
+ color: 'rgba(255,255,255,0.7)',
699
+ letterSpacing: 0.8
700
+ },
701
+ currentTime: {
702
+ fontSize: 15,
703
+ color: '#FFFFFF',
704
+ fontWeight: '500'
705
+ },
706
+ // Timeline
707
+ timelineSection: {
708
+ paddingHorizontal: 16
709
+ },
710
+ timelineHeader: {
711
+ fontSize: 11,
712
+ fontWeight: '700',
713
+ color: _colors.Colors.textLight,
714
+ letterSpacing: 0.8,
715
+ marginBottom: 12
716
+ },
717
+ timelineRow: {
718
+ flexDirection: 'row'
719
+ },
720
+ railCol: {
721
+ width: 24,
722
+ alignItems: 'center',
723
+ paddingTop: 14
724
+ },
725
+ railDot: {
726
+ width: 10,
727
+ height: 10,
728
+ borderRadius: 5,
729
+ backgroundColor: _colors.Colors.surface,
730
+ borderWidth: 2,
731
+ borderColor: _colors.Colors.textLight,
732
+ zIndex: 1
733
+ },
734
+ railLine: {
735
+ width: 2,
736
+ flex: 1,
737
+ backgroundColor: _colors.Colors.border,
738
+ marginTop: -1
739
+ },
740
+ historyCard: {
741
+ flex: 1,
742
+ backgroundColor: _colors.Colors.surface,
743
+ borderRadius: 12,
744
+ padding: 14,
745
+ marginBottom: 10,
746
+ marginLeft: 8
747
+ },
748
+ cardTop: {
749
+ flexDirection: 'row',
750
+ alignItems: 'baseline',
751
+ justifyContent: 'space-between',
752
+ marginBottom: 8
753
+ },
754
+ cardTime: {
755
+ fontSize: 15,
756
+ fontWeight: '600',
757
+ color: _colors.Colors.text
758
+ },
759
+ cardRelative: {
760
+ fontSize: 13,
761
+ color: _colors.Colors.textSecondary
762
+ },
763
+ cardEmpty: {
764
+ fontSize: 13,
765
+ color: _colors.Colors.textLight,
766
+ marginBottom: 4
767
+ },
768
+ pillRow: {
769
+ flexDirection: 'row',
770
+ flexWrap: 'wrap',
771
+ gap: 6,
772
+ marginBottom: 8
773
+ },
774
+ pill: {
775
+ flexDirection: 'row',
776
+ alignItems: 'center',
777
+ paddingHorizontal: 8,
778
+ paddingVertical: 3,
779
+ borderRadius: 6
780
+ },
781
+ pillDot: {
782
+ width: 6,
783
+ height: 6,
784
+ borderRadius: 3,
785
+ marginRight: 5
786
+ },
787
+ pillText: {
788
+ fontSize: 12,
789
+ fontWeight: '600'
790
+ },
791
+ cardFooter: {
792
+ flexDirection: 'row',
793
+ justifyContent: 'space-between',
794
+ alignItems: 'center',
795
+ marginTop: 4
796
+ },
797
+ cardId: {
798
+ fontSize: 11,
799
+ color: _colors.Colors.textLight,
800
+ fontFamily: 'Courier',
801
+ fontWeight: '500'
802
+ },
803
+ cardChevron: {
804
+ fontSize: 20,
805
+ color: _colors.Colors.textLight,
806
+ fontWeight: '400'
807
+ },
808
+ // ── Session detail header ──
809
+ sessionHeader: {
810
+ flexDirection: 'row',
811
+ alignItems: 'center',
812
+ justifyContent: 'space-between',
813
+ paddingHorizontal: 16,
814
+ paddingVertical: 10,
815
+ backgroundColor: _colors.Colors.surface,
816
+ borderBottomWidth: _reactNative.StyleSheet.hairlineWidth,
817
+ borderBottomColor: _colors.Colors.border
818
+ },
819
+ headerBackBtn: {
820
+ flexDirection: 'row',
821
+ alignItems: 'center',
822
+ paddingVertical: 4
823
+ },
824
+ headerArrow: {
825
+ fontSize: 22,
826
+ color: _colors.Colors.primary,
827
+ fontWeight: '400',
828
+ marginRight: 2
829
+ },
830
+ headerBackLabel: {
831
+ fontSize: 15,
832
+ color: _colors.Colors.primary,
833
+ fontWeight: '600'
834
+ },
835
+ headerMeta: {
836
+ fontSize: 12,
837
+ color: _colors.Colors.textSecondary,
838
+ fontFamily: 'Courier'
839
+ },
840
+ // ── Filter bar ──
841
+ filterBar: {
842
+ flexDirection: 'row',
843
+ paddingHorizontal: 12,
844
+ paddingVertical: 8,
845
+ backgroundColor: _colors.Colors.background,
846
+ gap: 6
847
+ },
848
+ chip: {
849
+ paddingHorizontal: 12,
850
+ paddingVertical: 6,
851
+ borderRadius: 8,
852
+ backgroundColor: _colors.Colors.surface
853
+ },
854
+ chipLabel: {
855
+ fontSize: 13,
856
+ fontWeight: '500',
857
+ color: _colors.Colors.textSecondary
858
+ },
859
+ chipLabelActive: {
860
+ color: '#FFFFFF'
861
+ },
862
+ chipCount: {
863
+ fontSize: 12,
864
+ fontWeight: '600',
865
+ color: _colors.Colors.textLight
866
+ },
867
+ chipCountActive: {
868
+ color: 'rgba(255,255,255,0.8)'
869
+ },
870
+ // ── Log rows (inside LogListScreen cards) ──
871
+ rowContent: {
872
+ flexDirection: 'row',
873
+ padding: 14,
874
+ alignItems: 'flex-start'
875
+ },
876
+ levelDot: {
877
+ width: 24,
878
+ height: 24,
879
+ borderRadius: 12,
880
+ alignItems: 'center',
881
+ justifyContent: 'center',
882
+ marginRight: 12,
883
+ marginTop: 1
884
+ },
885
+ levelIcon: {
886
+ color: '#FFF',
887
+ fontSize: 11,
888
+ fontWeight: '700'
889
+ },
890
+ statusBar: {
891
+ width: 3,
892
+ borderRadius: 2,
893
+ marginRight: 12,
894
+ minHeight: 36
895
+ },
896
+ rowBody: {
897
+ flex: 1
898
+ },
899
+ rowMsg: {
900
+ fontSize: 14,
901
+ color: _colors.Colors.text,
902
+ lineHeight: 20
903
+ },
904
+ rowTime: {
905
+ fontSize: 12,
906
+ color: _colors.Colors.textSecondary,
907
+ marginTop: 4
908
+ },
909
+ rowMeta: {
910
+ flexDirection: 'row',
911
+ alignItems: 'center',
912
+ marginBottom: 4,
913
+ gap: 6
914
+ },
915
+ methodText: {
916
+ fontSize: 13,
917
+ fontWeight: '700'
918
+ },
919
+ miniPill: {
920
+ paddingHorizontal: 7,
921
+ paddingVertical: 2,
922
+ borderRadius: 4
923
+ },
924
+ miniPillText: {
925
+ color: '#FFF',
926
+ fontSize: 10,
927
+ fontWeight: '700'
928
+ },
929
+ trackDot: {
930
+ width: 10,
931
+ height: 10,
932
+ borderRadius: 5,
933
+ backgroundColor: _colors.Colors.purple,
934
+ marginRight: 10,
935
+ marginTop: 5
936
+ },
937
+ // ── Log detail header ──
938
+ levelBadge: {
939
+ paddingHorizontal: 10,
940
+ paddingVertical: 4,
941
+ borderRadius: 6
942
+ },
943
+ levelBadgeText: {
944
+ color: '#FFF',
945
+ fontSize: 12,
946
+ fontWeight: '700'
947
+ },
948
+ detailTimestamp: {
949
+ flex: 1,
950
+ fontSize: 13,
951
+ color: _colors.Colors.textSecondary,
952
+ textAlign: 'right'
953
+ },
954
+ networkHeaderBadges: {
955
+ flexDirection: 'row',
956
+ alignItems: 'center',
957
+ gap: 8,
958
+ flex: 1
959
+ },
960
+ methodBadge: {
961
+ paddingHorizontal: 10,
962
+ paddingVertical: 4,
963
+ borderRadius: 6
964
+ },
965
+ methodBadgeText: {
966
+ color: '#FFF',
967
+ fontSize: 12,
968
+ fontWeight: '700'
969
+ },
970
+ statusPill: {
971
+ paddingHorizontal: 9,
972
+ paddingVertical: 3,
973
+ borderRadius: 6
974
+ },
975
+ statusPillText: {
976
+ color: '#FFF',
977
+ fontSize: 11,
978
+ fontWeight: '700'
979
+ },
980
+ durationText: {
981
+ fontSize: 12,
982
+ color: _colors.Colors.textSecondary,
983
+ fontWeight: '500'
984
+ },
985
+ // ── Log detail body ──
986
+ detailBody: {
987
+ flex: 1
988
+ },
989
+ detailBodyContent: {
990
+ padding: 12,
991
+ paddingBottom: 40
992
+ },
993
+ sectionWithCopy: {
994
+ gap: 8
995
+ },
996
+ plainText: {
997
+ fontFamily: 'Courier',
998
+ fontSize: 13,
999
+ color: _colors.Colors.text,
1000
+ lineHeight: 20
1001
+ },
1002
+ urlCard: {
1003
+ flexDirection: 'row',
1004
+ alignItems: 'center',
1005
+ backgroundColor: _colors.Colors.surface,
1006
+ borderRadius: 12,
1007
+ padding: 14,
1008
+ marginBottom: 8,
1009
+ gap: 8
1010
+ },
1011
+ urlText: {
1012
+ flex: 1,
1013
+ fontSize: 13,
1014
+ color: _colors.Colors.textSecondary,
1015
+ lineHeight: 18
1016
+ },
1017
+ emptySection: {
1018
+ fontSize: 13,
1019
+ color: _colors.Colors.textLight,
1020
+ paddingVertical: 4
1021
+ },
1022
+ errorBox: {
1023
+ backgroundColor: 'rgba(255,59,48,0.06)',
1024
+ borderWidth: 1,
1025
+ borderColor: 'rgba(255,59,48,0.15)',
1026
+ borderRadius: 10,
1027
+ padding: 12,
1028
+ marginBottom: 10,
1029
+ flexDirection: 'row',
1030
+ alignItems: 'flex-start',
1031
+ gap: 8
1032
+ },
1033
+ errorIcon: {
1034
+ fontSize: 14,
1035
+ color: _colors.Colors.error
1036
+ },
1037
+ errorText: {
1038
+ flex: 1,
1039
+ fontSize: 13,
1040
+ color: _colors.Colors.error,
1041
+ lineHeight: 18
1042
+ }
1043
+ });
1044
+ //# sourceMappingURL=SessionHistoryTab.js.map