execbro 1.11.1 → 2.1.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 (302) hide show
  1. package/README.md +4 -4
  2. package/build/__tests__/unit/appContext.test.d.ts +2 -0
  3. package/build/__tests__/unit/appContext.test.d.ts.map +1 -0
  4. package/build/__tests__/unit/appContext.test.js +70 -0
  5. package/build/__tests__/unit/appContext.test.js.map +1 -0
  6. package/build/__tests__/unit/appRequest.test.d.ts +2 -0
  7. package/build/__tests__/unit/appRequest.test.d.ts.map +1 -0
  8. package/build/__tests__/unit/appRequest.test.js +179 -0
  9. package/build/__tests__/unit/appRequest.test.js.map +1 -0
  10. package/build/__tests__/unit/contextWiring.test.d.ts +2 -0
  11. package/build/__tests__/unit/contextWiring.test.d.ts.map +1 -0
  12. package/build/__tests__/unit/contextWiring.test.js +28 -0
  13. package/build/__tests__/unit/contextWiring.test.js.map +1 -0
  14. package/build/__tests__/unit/coordinateMiss.test.d.ts +2 -0
  15. package/build/__tests__/unit/coordinateMiss.test.d.ts.map +1 -0
  16. package/build/__tests__/unit/coordinateMiss.test.js +111 -0
  17. package/build/__tests__/unit/coordinateMiss.test.js.map +1 -0
  18. package/build/__tests__/unit/deviceResolverStaleRetry.test.d.ts +2 -0
  19. package/build/__tests__/unit/deviceResolverStaleRetry.test.d.ts.map +1 -0
  20. package/build/__tests__/unit/deviceResolverStaleRetry.test.js +69 -0
  21. package/build/__tests__/unit/deviceResolverStaleRetry.test.js.map +1 -0
  22. package/build/__tests__/unit/epochRender.test.d.ts +2 -0
  23. package/build/__tests__/unit/epochRender.test.d.ts.map +1 -0
  24. package/build/__tests__/unit/epochRender.test.js +60 -0
  25. package/build/__tests__/unit/epochRender.test.js.map +1 -0
  26. package/build/__tests__/unit/executeBudget.test.d.ts +2 -0
  27. package/build/__tests__/unit/executeBudget.test.d.ts.map +1 -0
  28. package/build/__tests__/unit/executeBudget.test.js +27 -0
  29. package/build/__tests__/unit/executeBudget.test.js.map +1 -0
  30. package/build/__tests__/unit/executor.test.js +48 -6
  31. package/build/__tests__/unit/executor.test.js.map +1 -1
  32. package/build/__tests__/unit/findElementTreeReuse.test.d.ts +2 -0
  33. package/build/__tests__/unit/findElementTreeReuse.test.d.ts.map +1 -0
  34. package/build/__tests__/unit/findElementTreeReuse.test.js +77 -0
  35. package/build/__tests__/unit/findElementTreeReuse.test.js.map +1 -0
  36. package/build/__tests__/unit/getLogsEmptyContract.test.js +4 -3
  37. package/build/__tests__/unit/getLogsEmptyContract.test.js.map +1 -1
  38. package/build/__tests__/unit/getLogsNativeSource.test.js +7 -8
  39. package/build/__tests__/unit/getLogsNativeSource.test.js.map +1 -1
  40. package/build/__tests__/unit/inspectorHarvest.test.js +1 -21
  41. package/build/__tests__/unit/inspectorHarvest.test.js.map +1 -1
  42. package/build/__tests__/unit/inspectorSource.test.js +1 -38
  43. package/build/__tests__/unit/inspectorSource.test.js.map +1 -1
  44. package/build/__tests__/unit/jsLogEvents.test.js +1 -0
  45. package/build/__tests__/unit/jsLogEvents.test.js.map +1 -1
  46. package/build/__tests__/unit/logBufferEpoch.test.d.ts +2 -0
  47. package/build/__tests__/unit/logBufferEpoch.test.d.ts.map +1 -0
  48. package/build/__tests__/unit/logBufferEpoch.test.js +63 -0
  49. package/build/__tests__/unit/logBufferEpoch.test.js.map +1 -0
  50. package/build/__tests__/unit/metro.test.js +18 -1
  51. package/build/__tests__/unit/metro.test.js.map +1 -1
  52. package/build/__tests__/unit/moduleRegistry.test.d.ts +2 -0
  53. package/build/__tests__/unit/moduleRegistry.test.d.ts.map +1 -0
  54. package/build/__tests__/unit/moduleRegistry.test.js +62 -0
  55. package/build/__tests__/unit/moduleRegistry.test.js.map +1 -0
  56. package/build/__tests__/unit/navigateVerify.test.d.ts +2 -0
  57. package/build/__tests__/unit/navigateVerify.test.d.ts.map +1 -0
  58. package/build/__tests__/unit/navigateVerify.test.js +30 -0
  59. package/build/__tests__/unit/navigateVerify.test.js.map +1 -0
  60. package/build/__tests__/unit/navigation.test.d.ts +2 -0
  61. package/build/__tests__/unit/navigation.test.d.ts.map +1 -0
  62. package/build/__tests__/unit/navigation.test.js +254 -0
  63. package/build/__tests__/unit/navigation.test.js.map +1 -0
  64. package/build/__tests__/unit/network.test.js +1 -0
  65. package/build/__tests__/unit/network.test.js.map +1 -1
  66. package/build/__tests__/unit/networkBufferEpoch.test.d.ts +2 -0
  67. package/build/__tests__/unit/networkBufferEpoch.test.d.ts.map +1 -0
  68. package/build/__tests__/unit/networkBufferEpoch.test.js +52 -0
  69. package/build/__tests__/unit/networkBufferEpoch.test.js.map +1 -0
  70. package/build/__tests__/unit/networkInterceptor.test.js +7 -7
  71. package/build/__tests__/unit/networkInterceptor.test.js.map +1 -1
  72. package/build/__tests__/unit/promiseHandles.test.d.ts +2 -0
  73. package/build/__tests__/unit/promiseHandles.test.d.ts.map +1 -0
  74. package/build/__tests__/unit/promiseHandles.test.js +61 -0
  75. package/build/__tests__/unit/promiseHandles.test.js.map +1 -0
  76. package/build/__tests__/unit/resolveBufferOffline.test.d.ts +2 -0
  77. package/build/__tests__/unit/resolveBufferOffline.test.d.ts.map +1 -0
  78. package/build/__tests__/unit/resolveBufferOffline.test.js +25 -0
  79. package/build/__tests__/unit/resolveBufferOffline.test.js.map +1 -0
  80. package/build/__tests__/unit/sdkMirrorPoller.test.d.ts +2 -0
  81. package/build/__tests__/unit/sdkMirrorPoller.test.d.ts.map +1 -0
  82. package/build/__tests__/unit/sdkMirrorPoller.test.js +118 -0
  83. package/build/__tests__/unit/sdkMirrorPoller.test.js.map +1 -0
  84. package/build/__tests__/unit/sessionEpoch.test.d.ts +2 -0
  85. package/build/__tests__/unit/sessionEpoch.test.d.ts.map +1 -0
  86. package/build/__tests__/unit/sessionEpoch.test.js +41 -0
  87. package/build/__tests__/unit/sessionEpoch.test.js.map +1 -0
  88. package/build/__tests__/unit/settleAndDiff.test.d.ts +2 -0
  89. package/build/__tests__/unit/settleAndDiff.test.d.ts.map +1 -0
  90. package/build/__tests__/unit/settleAndDiff.test.js +110 -0
  91. package/build/__tests__/unit/settleAndDiff.test.js.map +1 -0
  92. package/build/__tests__/unit/truncate.test.d.ts +2 -0
  93. package/build/__tests__/unit/truncate.test.d.ts.map +1 -0
  94. package/build/__tests__/unit/truncate.test.js +58 -0
  95. package/build/__tests__/unit/truncate.test.js.map +1 -0
  96. package/build/__tests__/unit/verifyAction.test.js +2 -1
  97. package/build/__tests__/unit/verifyAction.test.js.map +1 -1
  98. package/build/__tests__/unit/waitForMeasurements.test.d.ts +2 -0
  99. package/build/__tests__/unit/waitForMeasurements.test.d.ts.map +1 -0
  100. package/build/__tests__/unit/waitForMeasurements.test.js +69 -0
  101. package/build/__tests__/unit/waitForMeasurements.test.js.map +1 -0
  102. package/build/core/android.d.ts +3 -1
  103. package/build/core/android.d.ts.map +1 -1
  104. package/build/core/android.js +5 -5
  105. package/build/core/android.js.map +1 -1
  106. package/build/core/appContext.d.ts +53 -0
  107. package/build/core/appContext.d.ts.map +1 -0
  108. package/build/core/appContext.js +172 -0
  109. package/build/core/appContext.js.map +1 -0
  110. package/build/core/appRequest.d.ts +21 -0
  111. package/build/core/appRequest.d.ts.map +1 -0
  112. package/build/core/appRequest.js +95 -0
  113. package/build/core/appRequest.js.map +1 -0
  114. package/build/core/bufferConfig.d.ts +5 -0
  115. package/build/core/bufferConfig.d.ts.map +1 -0
  116. package/build/core/bufferConfig.js +20 -0
  117. package/build/core/bufferConfig.js.map +1 -0
  118. package/build/core/connection.d.ts.map +1 -1
  119. package/build/core/connection.js +29 -9
  120. package/build/core/connection.js.map +1 -1
  121. package/build/core/debugGlobals.d.ts.map +1 -1
  122. package/build/core/debugGlobals.js +13 -0
  123. package/build/core/debugGlobals.js.map +1 -1
  124. package/build/core/deviceDiscovery.d.ts +5 -1
  125. package/build/core/deviceDiscovery.d.ts.map +1 -1
  126. package/build/core/deviceDiscovery.js +13 -2
  127. package/build/core/deviceDiscovery.js.map +1 -1
  128. package/build/core/deviceResolver.d.ts.map +1 -1
  129. package/build/core/deviceResolver.js +17 -2
  130. package/build/core/deviceResolver.js.map +1 -1
  131. package/build/core/epochRender.d.ts +19 -0
  132. package/build/core/epochRender.d.ts.map +1 -0
  133. package/build/core/epochRender.js +38 -0
  134. package/build/core/epochRender.js.map +1 -0
  135. package/build/core/guides.d.ts.map +1 -1
  136. package/build/core/guides.js +36 -91
  137. package/build/core/guides.js.map +1 -1
  138. package/build/core/index.d.ts +2 -3
  139. package/build/core/index.d.ts.map +1 -1
  140. package/build/core/index.js +4 -4
  141. package/build/core/index.js.map +1 -1
  142. package/build/core/inspector.d.ts +0 -39
  143. package/build/core/inspector.d.ts.map +1 -1
  144. package/build/core/inspector.js +1 -358
  145. package/build/core/inspector.js.map +1 -1
  146. package/build/core/ios.d.ts +14 -3
  147. package/build/core/ios.d.ts.map +1 -1
  148. package/build/core/ios.js +41 -17
  149. package/build/core/ios.js.map +1 -1
  150. package/build/core/jsExecute.d.ts +15 -0
  151. package/build/core/jsExecute.d.ts.map +1 -1
  152. package/build/core/jsExecute.js +136 -29
  153. package/build/core/jsExecute.js.map +1 -1
  154. package/build/core/logs.d.ts +12 -3
  155. package/build/core/logs.d.ts.map +1 -1
  156. package/build/core/logs.js +28 -5
  157. package/build/core/logs.js.map +1 -1
  158. package/build/core/metro.d.ts +2 -0
  159. package/build/core/metro.d.ts.map +1 -1
  160. package/build/core/metro.js +16 -8
  161. package/build/core/metro.js.map +1 -1
  162. package/build/core/moduleRegistry.d.ts +19 -0
  163. package/build/core/moduleRegistry.d.ts.map +1 -0
  164. package/build/core/moduleRegistry.js +67 -0
  165. package/build/core/moduleRegistry.js.map +1 -0
  166. package/build/core/nativeOnlyHints.d.ts.map +1 -1
  167. package/build/core/nativeOnlyHints.js +0 -2
  168. package/build/core/nativeOnlyHints.js.map +1 -1
  169. package/build/core/navigate.d.ts +46 -0
  170. package/build/core/navigate.d.ts.map +1 -0
  171. package/build/core/navigate.js +119 -0
  172. package/build/core/navigate.js.map +1 -0
  173. package/build/core/navigation.d.ts +66 -0
  174. package/build/core/navigation.d.ts.map +1 -0
  175. package/build/core/navigation.js +269 -0
  176. package/build/core/navigation.js.map +1 -0
  177. package/build/core/network.d.ts +12 -2
  178. package/build/core/network.d.ts.map +1 -1
  179. package/build/core/network.js +52 -12
  180. package/build/core/network.js.map +1 -1
  181. package/build/core/networkInterceptor.d.ts +1 -1
  182. package/build/core/networkInterceptor.d.ts.map +1 -1
  183. package/build/core/networkInterceptor.js +3 -2
  184. package/build/core/networkInterceptor.js.map +1 -1
  185. package/build/core/pressables.d.ts +33 -0
  186. package/build/core/pressables.d.ts.map +1 -1
  187. package/build/core/pressables.js +73 -4
  188. package/build/core/pressables.js.map +1 -1
  189. package/build/core/promiseHandles.d.ts +19 -0
  190. package/build/core/promiseHandles.d.ts.map +1 -0
  191. package/build/core/promiseHandles.js +58 -0
  192. package/build/core/promiseHandles.js.map +1 -0
  193. package/build/core/register.d.ts.map +1 -1
  194. package/build/core/register.js +1 -4
  195. package/build/core/register.js.map +1 -1
  196. package/build/core/sdkMirrorPoller.d.ts +31 -0
  197. package/build/core/sdkMirrorPoller.d.ts.map +1 -0
  198. package/build/core/sdkMirrorPoller.js +210 -0
  199. package/build/core/sdkMirrorPoller.js.map +1 -0
  200. package/build/core/state.d.ts +14 -0
  201. package/build/core/state.d.ts.map +1 -1
  202. package/build/core/state.js +48 -2
  203. package/build/core/state.js.map +1 -1
  204. package/build/core/toolHelpers.d.ts.map +1 -1
  205. package/build/core/toolHelpers.js +42 -10
  206. package/build/core/toolHelpers.js.map +1 -1
  207. package/build/core/truncate.d.ts +42 -0
  208. package/build/core/truncate.d.ts.map +1 -0
  209. package/build/core/truncate.js +169 -0
  210. package/build/core/truncate.js.map +1 -0
  211. package/build/core/types.d.ts +3 -0
  212. package/build/core/types.d.ts.map +1 -1
  213. package/build/index.d.ts.map +1 -1
  214. package/build/index.js +4 -2
  215. package/build/index.js.map +1 -1
  216. package/build/pro/coordinateMiss.d.ts +55 -0
  217. package/build/pro/coordinateMiss.d.ts.map +1 -0
  218. package/build/pro/coordinateMiss.js +122 -0
  219. package/build/pro/coordinateMiss.js.map +1 -0
  220. package/build/pro/tap.d.ts +8 -0
  221. package/build/pro/tap.d.ts.map +1 -1
  222. package/build/pro/tap.js +99 -11
  223. package/build/pro/tap.js.map +1 -1
  224. package/build/pro/verifyAction.d.ts +43 -2
  225. package/build/pro/verifyAction.d.ts.map +1 -1
  226. package/build/pro/verifyAction.js +95 -36
  227. package/build/pro/verifyAction.js.map +1 -1
  228. package/build/tools/_deviceArg.d.ts +17 -1
  229. package/build/tools/_deviceArg.d.ts.map +1 -1
  230. package/build/tools/_deviceArg.js +17 -1
  231. package/build/tools/_deviceArg.js.map +1 -1
  232. package/build/tools/bundleTools.d.ts.map +1 -1
  233. package/build/tools/bundleTools.js +20 -33
  234. package/build/tools/bundleTools.js.map +1 -1
  235. package/build/tools/componentTools.d.ts.map +1 -1
  236. package/build/tools/componentTools.js +41 -219
  237. package/build/tools/componentTools.js.map +1 -1
  238. package/build/tools/connectionTools.d.ts.map +1 -1
  239. package/build/tools/connectionTools.js +17 -22
  240. package/build/tools/connectionTools.js.map +1 -1
  241. package/build/tools/deviceTools.d.ts.map +1 -1
  242. package/build/tools/deviceTools.js +13 -167
  243. package/build/tools/deviceTools.js.map +1 -1
  244. package/build/tools/executionTools.d.ts.map +1 -1
  245. package/build/tools/executionTools.js +63 -18
  246. package/build/tools/executionTools.js.map +1 -1
  247. package/build/tools/interactionTools.d.ts +6 -0
  248. package/build/tools/interactionTools.d.ts.map +1 -1
  249. package/build/tools/interactionTools.js +41 -56
  250. package/build/tools/interactionTools.js.map +1 -1
  251. package/build/tools/logTools.d.ts.map +1 -1
  252. package/build/tools/logTools.js +61 -80
  253. package/build/tools/logTools.js.map +1 -1
  254. package/build/tools/metaTools.js +1 -1
  255. package/build/tools/metaTools.js.map +1 -1
  256. package/build/tools/navigationTools.d.ts +3 -0
  257. package/build/tools/navigationTools.d.ts.map +1 -0
  258. package/build/tools/navigationTools.js +60 -0
  259. package/build/tools/navigationTools.js.map +1 -0
  260. package/build/tools/networkTools.d.ts.map +1 -1
  261. package/build/tools/networkTools.js +44 -202
  262. package/build/tools/networkTools.js.map +1 -1
  263. package/build/tools/reduxTools.d.ts.map +1 -1
  264. package/build/tools/reduxTools.js +3 -2
  265. package/build/tools/reduxTools.js.map +1 -1
  266. package/build/tools/requestTools.d.ts +3 -0
  267. package/build/tools/requestTools.d.ts.map +1 -0
  268. package/build/tools/requestTools.js +79 -0
  269. package/build/tools/requestTools.js.map +1 -0
  270. package/build/tools/screenshotTools.d.ts.map +1 -1
  271. package/build/tools/screenshotTools.js +42 -25
  272. package/build/tools/screenshotTools.js.map +1 -1
  273. package/package.json +1 -1
  274. package/tools.json +22 -78
  275. package/build/__tests__/unit/flowpoints.test.d.ts +0 -2
  276. package/build/__tests__/unit/flowpoints.test.d.ts.map +0 -1
  277. package/build/__tests__/unit/flowpoints.test.js +0 -126
  278. package/build/__tests__/unit/flowpoints.test.js.map +0 -1
  279. package/build/__tests__/unit/flowpointsQuery.test.d.ts +0 -2
  280. package/build/__tests__/unit/flowpointsQuery.test.d.ts.map +0 -1
  281. package/build/__tests__/unit/flowpointsQuery.test.js +0 -91
  282. package/build/__tests__/unit/flowpointsQuery.test.js.map +0 -1
  283. package/build/__tests__/unit/selectionPoller.test.d.ts +0 -2
  284. package/build/__tests__/unit/selectionPoller.test.d.ts.map +0 -1
  285. package/build/__tests__/unit/selectionPoller.test.js +0 -109
  286. package/build/__tests__/unit/selectionPoller.test.js.map +0 -1
  287. package/build/__tests__/unit/verifyFlow.test.d.ts +0 -2
  288. package/build/__tests__/unit/verifyFlow.test.d.ts.map +0 -1
  289. package/build/__tests__/unit/verifyFlow.test.js +0 -45
  290. package/build/__tests__/unit/verifyFlow.test.js.map +0 -1
  291. package/build/core/selectionPoller.d.ts +0 -13
  292. package/build/core/selectionPoller.d.ts.map +0 -1
  293. package/build/core/selectionPoller.js +0 -102
  294. package/build/core/selectionPoller.js.map +0 -1
  295. package/build/pro/flowpointTools.d.ts +0 -4
  296. package/build/pro/flowpointTools.d.ts.map +0 -1
  297. package/build/pro/flowpointTools.js +0 -266
  298. package/build/pro/flowpointTools.js.map +0 -1
  299. package/build/pro/flowpoints.d.ts +0 -86
  300. package/build/pro/flowpoints.d.ts.map +0 -1
  301. package/build/pro/flowpoints.js +0 -283
  302. package/build/pro/flowpoints.js.map +0 -1
@@ -0,0 +1,210 @@
1
+ import { executeInApp } from "./executor.js";
2
+ import { getLogBuffer, getNetworkBuffer, getEpoch, bumpEpoch, connectedApps } from "./state.js";
3
+ import { mapConsoleType } from "./logs.js";
4
+ export const ACTIVE_INTERVAL_MS = 3000;
5
+ export const IDLE_INTERVAL_MS = 10000;
6
+ const timers = new Map();
7
+ // Per device: epoch-scoped SDK ids already mirrored, so repeated polls are no-ops.
8
+ const mirrored = new Map();
9
+ // Per device: the JS runtime nonce seen on the last successful poll. A change
10
+ // means the app process was replaced.
11
+ const lastRunId = new Map();
12
+ function pollingDisabled() {
13
+ return process.env.EXECBRO_DISABLE_SDK_MIRROR === "1";
14
+ }
15
+ /**
16
+ * Map a caller-supplied device argument to the canonical buffer key.
17
+ *
18
+ * Tools pass a user-facing substring ("iPhone"); buffers are keyed by the full
19
+ * device name ("iPhone 17 Pro"). Mirroring under the substring creates a
20
+ * phantom buffer that device-scoped reads never resolve to, so the SDK data
21
+ * silently goes missing for exactly those calls. executeInApp does its own
22
+ * substring resolution, so the original argument still routes correctly.
23
+ */
24
+ function bufferKeyFor(device) {
25
+ const needle = device.toLowerCase();
26
+ for (const app of connectedApps.values()) {
27
+ const name = app.deviceInfo.deviceName || app.deviceInfo.title || "unknown";
28
+ if (name.toLowerCase().includes(needle))
29
+ return name;
30
+ }
31
+ return device;
32
+ }
33
+ function seenSet(device) {
34
+ let set = mirrored.get(device);
35
+ if (!set) {
36
+ set = new Set();
37
+ mirrored.set(device, set);
38
+ }
39
+ return set;
40
+ }
41
+ /** Test-only: drop all mirror bookkeeping and timers. */
42
+ export function __resetMirrorState() {
43
+ for (const timer of timers.values())
44
+ clearTimeout(timer);
45
+ timers.clear();
46
+ mirrored.clear();
47
+ lastRunId.clear();
48
+ }
49
+ // Both SDK buffers in one round-trip, plus a per-runtime nonce. The accessor
50
+ // matches sdkBridge.ts so the poller works against every published SDK version.
51
+ // Guarded so a missing SDK yields empty arrays rather than a thrown TypeError.
52
+ //
53
+ // `runId` is lazily installed on globalThis and is how we detect an app
54
+ // restart. Live verification on Android showed the CDP-level signals are not
55
+ // enough: Metro's inspector proxy hands back the SAME target id after a
56
+ // process kill (so connectToDevice reports "already connected" and never sees
57
+ // a new id), and a killed runtime emits no Runtime.executionContextsCleared —
58
+ // there is nothing left to emit it. A fresh JS runtime always has a fresh
59
+ // globalThis, so a changed nonce is direct proof, independent of CDP.
60
+ const READ_EXPRESSION = `JSON.stringify((function(){
61
+ var runId = globalThis.__EXECBRO_RUN_ID__ || (globalThis.__EXECBRO_RUN_ID__ = String(Math.random()).slice(2) + "-" + Date.now());
62
+ var sdk = globalThis.__EXECBRO__ || globalThis.__RN_AI_DEVTOOLS__;
63
+ if (!sdk) return { runId: runId, network: [], console: [] };
64
+ return {
65
+ runId: runId,
66
+ network: typeof sdk.getNetworkEntries === "function" ? sdk.getNetworkEntries() : [],
67
+ console: typeof sdk.getConsoleEntries === "function" ? sdk.getConsoleEntries() : []
68
+ };
69
+ })())`;
70
+ /**
71
+ * One mirror pass: read both SDK buffers and copy anything not already
72
+ * mirrored for the device's current epoch into the server-side buffers.
73
+ *
74
+ * This exists because the server suppresses its own network capture whenever
75
+ * the SDK is present (connection.ts) and otherwise keeps no copy at all — the
76
+ * app's JS heap is the only store, so a hard restart destroys it.
77
+ *
78
+ * Idempotent: the epoch-scoped seen-set means re-reading the same entries adds
79
+ * nothing. After an app restart the epoch changes, so the same SDK ids mirror
80
+ * again as a distinct run rather than overwriting the previous one.
81
+ */
82
+ export async function mirrorOnce(device) {
83
+ let parsed;
84
+ try {
85
+ const raw = await executeInApp(READ_EXPRESSION, false, {
86
+ maxRetries: 0,
87
+ autoReconnect: false,
88
+ timeoutMs: 5000,
89
+ originatingToolName: "_sdk_mirror",
90
+ }, device);
91
+ if (!raw.success || !raw.result)
92
+ return { logs: 0, network: 0 };
93
+ parsed = JSON.parse(raw.result);
94
+ }
95
+ catch {
96
+ return { logs: 0, network: 0 };
97
+ }
98
+ // `device` may be a substring; everything keyed below must use the
99
+ // canonical buffer key or the data lands where reads cannot find it.
100
+ const deviceKey = bufferKeyFor(device);
101
+ // A changed runtime nonce means the app process was replaced. Bump before
102
+ // stamping so the new run's entries land in their own epoch and cannot
103
+ // overwrite the previous run's (SDK ids restart their counter each run).
104
+ if (parsed.runId) {
105
+ const previous = lastRunId.get(deviceKey);
106
+ if (previous && previous !== parsed.runId) {
107
+ const next = bumpEpoch(deviceKey);
108
+ console.error(`[execbro] App restart detected on ${deviceKey} — now epoch ${next}`);
109
+ }
110
+ lastRunId.set(deviceKey, parsed.runId);
111
+ }
112
+ const epoch = getEpoch(deviceKey);
113
+ const seen = seenSet(deviceKey);
114
+ let logs = 0;
115
+ let network = 0;
116
+ for (const entry of parsed.network ?? []) {
117
+ const key = `n:${epoch}:${entry.id}`;
118
+ if (seen.has(key))
119
+ continue;
120
+ seen.add(key);
121
+ getNetworkBuffer(deviceKey).set(entry.id, {
122
+ requestId: entry.id,
123
+ timestamp: new Date(entry.timestamp),
124
+ method: entry.method,
125
+ url: entry.url,
126
+ headers: entry.requestHeaders ?? {},
127
+ postData: entry.requestBody,
128
+ status: entry.status,
129
+ statusText: entry.statusText,
130
+ responseHeaders: entry.responseHeaders,
131
+ responseBody: entry.responseBody,
132
+ mimeType: entry.mimeType,
133
+ timing: entry.duration != null ? { duration: entry.duration } : undefined,
134
+ error: entry.error,
135
+ completed: entry.completed ?? false,
136
+ epoch,
137
+ });
138
+ network++;
139
+ }
140
+ for (const entry of parsed.console ?? []) {
141
+ const key = `c:${epoch}:${entry.id}`;
142
+ if (seen.has(key))
143
+ continue;
144
+ seen.add(key);
145
+ getLogBuffer(deviceKey).add({
146
+ timestamp: new Date(entry.timestamp),
147
+ level: mapConsoleType(entry.level),
148
+ message: entry.message,
149
+ epoch,
150
+ });
151
+ logs++;
152
+ }
153
+ return { logs, network };
154
+ }
155
+ /**
156
+ * Pull anything the in-app SDK holds into the server buffer before a read.
157
+ * The background poller runs every 3-10s; this closes the gap so a read never
158
+ * shows data staler than a live SDK query would have.
159
+ */
160
+ export async function refreshMirror(device) {
161
+ try {
162
+ if (device) {
163
+ await mirrorOnce(device);
164
+ return;
165
+ }
166
+ for (const app of connectedApps.values()) {
167
+ await mirrorOnce(app.deviceInfo.deviceName || app.deviceInfo.title || "unknown");
168
+ }
169
+ }
170
+ catch {
171
+ // Non-fatal — a stale read beats a failed one.
172
+ }
173
+ }
174
+ export function isSdkMirrorPollerRunning(device) {
175
+ return timers.has(device);
176
+ }
177
+ export function startSdkMirrorPoller(device) {
178
+ if (pollingDisabled() || timers.has(device))
179
+ return;
180
+ const schedule = (delay) => {
181
+ const timer = setTimeout(async () => {
182
+ let active = false;
183
+ try {
184
+ const result = await mirrorOnce(device);
185
+ active = result.logs > 0 || result.network > 0;
186
+ }
187
+ catch {
188
+ active = false;
189
+ }
190
+ if (timers.has(device)) {
191
+ schedule(active ? ACTIVE_INTERVAL_MS : IDLE_INTERVAL_MS);
192
+ }
193
+ }, delay);
194
+ timer.unref?.();
195
+ timers.set(device, timer);
196
+ };
197
+ schedule(ACTIVE_INTERVAL_MS);
198
+ }
199
+ export function stopSdkMirrorPoller(device) {
200
+ const timer = timers.get(device);
201
+ if (timer)
202
+ clearTimeout(timer);
203
+ timers.delete(device);
204
+ }
205
+ export function stopAllSdkMirrorPollers() {
206
+ for (const device of [...timers.keys()]) {
207
+ stopSdkMirrorPoller(device);
208
+ }
209
+ }
210
+ //# sourceMappingURL=sdkMirrorPoller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdkMirrorPoller.js","sourceRoot":"","sources":["../../src/core/sdkMirrorPoller.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,20 @@ import { NetworkBuffer } from "./network.js";
4
4
  import { ImageBuffer } from "./imageBuffer.js";
5
5
  export declare const logBuffers: Map<string, LogBuffer>;
6
6
  export declare const networkBuffers: Map<string, NetworkBuffer>;
7
+ export declare function getEpoch(deviceName: string): number;
8
+ export declare function bumpEpoch(deviceName: string): number;
9
+ /** Test-only: clear all epoch state. */
10
+ export declare function resetEpochs(): void;
11
+ /**
12
+ * Resolve the "current run" epoch for a caller-supplied device argument.
13
+ *
14
+ * `device` is a user-facing substring (e.g. "iPhone"), not a buffer key
15
+ * (e.g. "iPhone 17 Pro"), so getEpoch() must not be called on it directly —
16
+ * that silently returns 1 and makes epoch:"current" serve pre-restart data
17
+ * labelled as current. Omitted device means a merged read across devices, so
18
+ * the newest run wins.
19
+ */
20
+ export declare function resolveDeviceEpoch(device?: string): number;
7
21
  export declare function getLogBuffer(deviceName: string): LogBuffer;
8
22
  export declare function getNetworkBuffer(deviceName: string): NetworkBuffer;
9
23
  export declare function getAllLogs(count?: number, level?: string): LogEntry[];
@@ -1 +1 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/core/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,eAAO,MAAM,UAAU,wBAA+B,CAAC;AACvD,eAAO,MAAM,cAAc,4BAAmC,CAAC;AAG/D,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAO1D;AAGD,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,CAOlE;AAGD,wBAAgB,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,CAWrE;AAGD,wBAAgB,gBAAgB,IAAI,MAAM,CAMzC;AAKD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGhD,eAAO,MAAM,WAAW,aAAsB,CAAC;AAG/C,eAAO,MAAM,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAa,CAAC;AAOlE,eAAO,MAAM,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAa,CAAC;AAEvD,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,SAAS,CAGtD;AAGD,eAAO,MAAM,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAa,CAAC;AAE1E;;;;;;;;GAQG;AACH,wBAAgB,8BAA8B,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAUjF;AAKD,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAOD,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,IAAI,CAEtD;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAGvF;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAKjE;AAKD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAYlE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAEzE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE5D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C"}
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/core/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAK/C,eAAO,MAAM,UAAU,wBAA+B,CAAC;AACvD,eAAO,MAAM,cAAc,4BAAmC,CAAC;AAK/D,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CASpD;AAED,wCAAwC;AACxC,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAc1D;AAGD,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAO1D;AAGD,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,CAOlE;AAGD,wBAAgB,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,CAWrE;AAGD,wBAAgB,gBAAgB,IAAI,MAAM,CAMzC;AAKD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGhD,eAAO,MAAM,WAAW,aAAsB,CAAC;AAG/C,eAAO,MAAM,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAa,CAAC;AAOlE,eAAO,MAAM,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAa,CAAC;AAEvD,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,SAAS,CAGtD;AAGD,eAAO,MAAM,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAa,CAAC;AAE1E;;;;;;;;GAQG;AACH,wBAAgB,8BAA8B,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAUjF;AAKD,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAOD,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,IAAI,CAEtD;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAGvF;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAKjE;AAKD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAYlE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAEzE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE5D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C"}
@@ -1,14 +1,60 @@
1
1
  import { LogBuffer } from "./logs.js";
2
2
  import { NetworkBuffer } from "./network.js";
3
3
  import { ImageBuffer } from "./imageBuffer.js";
4
+ import { logBufferSize, networkBufferSize } from "./bufferConfig.js";
5
+ import { clearHandlesForDevice } from "./promiseHandles.js";
4
6
  // Per-device log buffers (keyed by deviceName)
5
7
  export const logBuffers = new Map();
6
8
  export const networkBuffers = new Map();
9
+ // Per-device app-run counter. Bumped when a new JS runtime is detected.
10
+ const _sessionEpochs = new Map();
11
+ export function getEpoch(deviceName) {
12
+ return _sessionEpochs.get(deviceName) ?? 1;
13
+ }
14
+ export function bumpEpoch(deviceName) {
15
+ const next = getEpoch(deviceName) + 1;
16
+ _sessionEpochs.set(deviceName, next);
17
+ // A new JS runtime wipes every in-app promise slot, so any handle we
18
+ // handed out for this device can never resolve. Dropping them here — the
19
+ // one place every restart path funnels through — keeps us from offering a
20
+ // `collect` id that is guaranteed to come back "__missing__".
21
+ clearHandlesForDevice(deviceName);
22
+ return next;
23
+ }
24
+ /** Test-only: clear all epoch state. */
25
+ export function resetEpochs() {
26
+ _sessionEpochs.clear();
27
+ }
28
+ /**
29
+ * Resolve the "current run" epoch for a caller-supplied device argument.
30
+ *
31
+ * `device` is a user-facing substring (e.g. "iPhone"), not a buffer key
32
+ * (e.g. "iPhone 17 Pro"), so getEpoch() must not be called on it directly —
33
+ * that silently returns 1 and makes epoch:"current" serve pre-restart data
34
+ * labelled as current. Omitted device means a merged read across devices, so
35
+ * the newest run wins.
36
+ */
37
+ export function resolveDeviceEpoch(device) {
38
+ const keys = new Set([...logBuffers.keys(), ...networkBuffers.keys()]);
39
+ if (device) {
40
+ const needle = device.toLowerCase();
41
+ for (const key of keys) {
42
+ if (key.toLowerCase().includes(needle))
43
+ return getEpoch(key);
44
+ }
45
+ return getEpoch(device);
46
+ }
47
+ let max = 1;
48
+ for (const key of keys) {
49
+ max = Math.max(max, getEpoch(key));
50
+ }
51
+ return max;
52
+ }
7
53
  // Helper: get or create a log buffer for a device
8
54
  export function getLogBuffer(deviceName) {
9
55
  let buffer = logBuffers.get(deviceName);
10
56
  if (!buffer) {
11
- buffer = new LogBuffer(500);
57
+ buffer = new LogBuffer(logBufferSize(), deviceName);
12
58
  logBuffers.set(deviceName, buffer);
13
59
  }
14
60
  return buffer;
@@ -17,7 +63,7 @@ export function getLogBuffer(deviceName) {
17
63
  export function getNetworkBuffer(deviceName) {
18
64
  let buffer = networkBuffers.get(deviceName);
19
65
  if (!buffer) {
20
- buffer = new NetworkBuffer(200);
66
+ buffer = new NetworkBuffer(networkBufferSize(), deviceName);
21
67
  networkBuffers.set(deviceName, buffer);
22
68
  }
23
69
  return buffer;
@@ -1 +1 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/core/state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/core/state.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"toolHelpers.d.ts","sourceRoot":"","sources":["../../src/core/toolHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAMH,SAAS,EACT,aAAa,EAChB,MAAM,YAAY,CAAC;AAIpB,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAe3D;AAGD,wBAAgB,oBAAoB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,aAAa,CAwBnE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAoB1F;AAOD,eAAO,MAAM,sBAAsB,GAAI,QAAQ,MAAM,KAAG,MACwC,CAAC;AAEjG,eAAO,MAAM,oBAAoB,GAAI,SAAS,MAAM,KAAG,MACwB,CAAC;AAEhF,eAAO,MAAM,wBAAwB,QAAO,MACuD,CAAC;AAEpG;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CA8B9D"}
1
+ {"version":3,"file":"toolHelpers.d.ts","sourceRoot":"","sources":["../../src/core/toolHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAMH,SAAS,EACT,aAAa,EAChB,MAAM,YAAY,CAAC;AA0CpB,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAY3D;AAGD,wBAAgB,oBAAoB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,aAAa,CAqBnE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAoB1F;AAOD,eAAO,MAAM,sBAAsB,GAAI,QAAQ,MAAM,KAAG,MACwC,CAAC;AAEjG,eAAO,MAAM,oBAAoB,GAAI,SAAS,MAAM,KAAG,MACwB,CAAC;AAEhF,eAAO,MAAM,wBAAwB,QAAO,MACuD,CAAC;AAEpG;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CA8B9D"}
@@ -1,13 +1,49 @@
1
1
  import { logBuffers, networkBuffers, getLogBuffer, getNetworkBuffer, getConnectedAppByDevice, LogBuffer, NetworkBuffer, } from "./index.js";
2
2
  import { UserInputError } from "./errors.js";
3
+ /**
4
+ * Find a buffered device name matching `device` when no app is currently
5
+ * connected. Data outlives the connection now, so a read during the window
6
+ * between an app being killed and reconnecting must still resolve — otherwise
7
+ * the retained pre-restart entries are unreachable exactly when they matter.
8
+ */
9
+ function bufferedDeviceName(device, keys) {
10
+ const needle = device.toLowerCase();
11
+ for (const key of keys) {
12
+ if (key.toLowerCase().includes(needle))
13
+ return key;
14
+ }
15
+ return undefined;
16
+ }
17
+ /**
18
+ * Resolve the buffer key for `device`.
19
+ *
20
+ * Prefers a live connection (authoritative, and handles ambiguity), but
21
+ * getConnectedAppByDevice throws when nothing is connected — so fall back to a
22
+ * buffered device name before giving up, and rethrow the original, richer
23
+ * error when there is no buffered data either.
24
+ */
25
+ function resolveBufferKey(device, bufferKeys) {
26
+ try {
27
+ const app = getConnectedAppByDevice(device);
28
+ if (app) {
29
+ return app.deviceInfo.deviceName || app.deviceInfo.title || "unknown";
30
+ }
31
+ }
32
+ catch (error) {
33
+ const buffered = bufferedDeviceName(device, bufferKeys);
34
+ if (buffered)
35
+ return buffered;
36
+ throw error;
37
+ }
38
+ const buffered = bufferedDeviceName(device, bufferKeys);
39
+ if (buffered)
40
+ return buffered;
41
+ throw new UserInputError(`No connected device matches "${device}"`);
42
+ }
3
43
  // Helper: resolve log buffer for a device (or create a merged buffer from all devices)
4
44
  export function resolveLogBuffer(device) {
5
45
  if (device) {
6
- const app = getConnectedAppByDevice(device);
7
- if (!app)
8
- throw new UserInputError(`No connected device matches "${device}"`);
9
- const deviceName = app.deviceInfo.deviceName || app.deviceInfo.title || "unknown";
10
- return getLogBuffer(deviceName);
46
+ return getLogBuffer(resolveBufferKey(device, logBuffers.keys()));
11
47
  }
12
48
  // Merge all logs into a temporary buffer for read operations
13
49
  const merged = new LogBuffer(5000);
@@ -21,11 +57,7 @@ export function resolveLogBuffer(device) {
21
57
  // Helper: resolve network buffer for a device (or create a merged buffer from all devices)
22
58
  export function resolveNetworkBuffer(device) {
23
59
  if (device) {
24
- const app = getConnectedAppByDevice(device);
25
- if (!app)
26
- throw new UserInputError(`No connected device matches "${device}"`);
27
- const deviceName = app.deviceInfo.deviceName || app.deviceInfo.title || "unknown";
28
- return getNetworkBuffer(deviceName);
60
+ return getNetworkBuffer(resolveBufferKey(device, networkBuffers.keys()));
29
61
  }
30
62
  // Merge all network requests into a temporary buffer for read operations.
31
63
  // Key by the request's own id so get(requestId) works — earlier this used
@@ -1 +1 @@
1
- {"version":3,"file":"toolHelpers.js","sourceRoot":"","sources":["../../src/core/toolHelpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"toolHelpers.js","sourceRoot":"","sources":["../../src/core/toolHelpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ export interface TruncateBudget {
2
+ maxDepth: number;
3
+ maxArrayItems: number;
4
+ maxStringLength: number;
5
+ }
6
+ export interface TruncateResult {
7
+ value: unknown;
8
+ truncated: boolean;
9
+ /** null when the value fit without any bounding. */
10
+ appliedBudget: TruncateBudget | null;
11
+ originalBytes: number;
12
+ returnedBytes: number;
13
+ }
14
+ /**
15
+ * Bound `value` so its serialised form fits within `maxBytes`.
16
+ *
17
+ * A value that already fits is returned untouched — identity matters because
18
+ * most reads are tiny (Boardwise's median redux read is 70 characters) and must
19
+ * not be reshaped. Otherwise budgets are tried loosest-first so the caller
20
+ * keeps as much structure as the target allows.
21
+ */
22
+ export declare function truncateToBudget(value: unknown, maxBytes: number, explicit?: Partial<TruncateBudget>, indent?: number): TruncateResult;
23
+ export declare const DEFAULT_MAX_BYTES = 25000;
24
+ export interface BudgetReport {
25
+ truncated: boolean;
26
+ originalBytes: number;
27
+ returnedBytes: number;
28
+ appliedBudget: TruncateBudget | null;
29
+ }
30
+ /**
31
+ * Bound an already-serialised tool result.
32
+ *
33
+ * Results reach us as strings: JSON for objects, a plain scalar rendering
34
+ * otherwise. Re-parse JSON so bounding is structural — markers then carry real
35
+ * array lengths and key counts, which is what lets a caller decide the next,
36
+ * narrower read. Non-JSON text has no structure to exploit, so it is clipped.
37
+ */
38
+ export declare function applyResultBudget(text: string, maxBytes?: number, explicit?: Partial<TruncateBudget>): {
39
+ text: string;
40
+ budget: BudgetReport;
41
+ };
42
+ //# sourceMappingURL=truncate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"truncate.d.ts","sourceRoot":"","sources":["../../src/core/truncate.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC3B,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,oDAAoD;IACpD,aAAa,EAAE,cAAc,GAAG,IAAI,CAAC;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACzB;AA4ED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC5B,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,EAClC,MAAM,GAAE,MAAU,GACnB,cAAc,CAqChB;AAED,eAAO,MAAM,iBAAiB,QAAQ,CAAC;AAEvC,MAAM,WAAW,YAAY;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,cAAc,GAAG,IAAI,CAAC;CACxC;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC7B,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,MAA0B,EACpC,QAAQ,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GACnC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,CA2CxC"}