@buoy-gg/shared-ui 7.0.78 → 7.0.80

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 (175) hide show
  1. package/lib/commonjs/JsModal.js +1 -1
  2. package/lib/commonjs/bugCase/appInfo.js +1 -0
  3. package/lib/commonjs/bugCase/appInfo.web.js +1 -0
  4. package/lib/commonjs/bugCase/capture.js +1 -1
  5. package/lib/commonjs/bugCase/format.js +2 -2
  6. package/lib/commonjs/bugCase/index.js +1 -1
  7. package/lib/commonjs/bugCase/lock.js +1 -1
  8. package/lib/commonjs/bugCase/media.js +1 -0
  9. package/lib/commonjs/bugCase/recorder.js +1 -1
  10. package/lib/commonjs/bugCase/scrub.js +1 -1
  11. package/lib/commonjs/bugCase/steps.js +1 -1
  12. package/lib/commonjs/bugCase/teamKey.js +1 -0
  13. package/lib/commonjs/bugCase/validate.js +1 -0
  14. package/lib/commonjs/clipboard/autoDetectClipboard.js +1 -1
  15. package/lib/commonjs/clipboard/clipboard-impl.js +1 -1
  16. package/lib/commonjs/clipboard/clipboard-impl.web.js +1 -1
  17. package/lib/commonjs/clipboard/index.js +1 -1
  18. package/lib/commonjs/dataViewer/LiveExplorer.js +1 -1
  19. package/lib/commonjs/dataViewer/VirtualizedDataExplorer.js +1 -1
  20. package/lib/commonjs/dataViewer/flattenTree.js +1 -0
  21. package/lib/commonjs/dataViewer/liveEntries.js +1 -0
  22. package/lib/commonjs/icons/index.js +1 -1
  23. package/lib/commonjs/index.js +1 -1
  24. package/lib/commonjs/license/BuoyUpgradeSheet.js +1 -1
  25. package/lib/commonjs/license/index.js +1 -1
  26. package/lib/commonjs/sync/keyedArrays.js +1 -1
  27. package/lib/commonjs/sync/valuePath.js +1 -1
  28. package/lib/commonjs/ui/components/DynamicFilterView.js +1 -1
  29. package/lib/commonjs/ui/components/EntityFilterView.js +1 -1
  30. package/lib/commonjs/ui/components/WindowControls.js +1 -1
  31. package/lib/commonjs/ui/floating/FloatingTool.js +1 -1
  32. package/lib/commonjs/ui/listPresets.js +1 -1
  33. package/lib/commonjs/utils/fiberRootAnchor.js +1 -0
  34. package/lib/commonjs/utils/index.js +1 -1
  35. package/lib/commonjs/utils/loadOptionalModule.js +1 -1
  36. package/lib/commonjs/utils/loadToolModule.js +1 -1
  37. package/lib/commonjs/utils/minimalSuperJSON.js +1 -1
  38. package/lib/commonjs/utils/persistentStorage.js +1 -1
  39. package/lib/commonjs/utils/persistentStorage.web.js +1 -1
  40. package/lib/commonjs/utils/reloadPlatform.js +1 -1
  41. package/lib/commonjs/utils/snapshotProviderKit.js +1 -1
  42. package/lib/module/JsModal.js +1 -1
  43. package/lib/module/bugCase/appInfo.js +1 -0
  44. package/lib/module/bugCase/appInfo.web.js +1 -0
  45. package/lib/module/bugCase/capture.js +1 -1
  46. package/lib/module/bugCase/format.js +2 -2
  47. package/lib/module/bugCase/index.js +1 -1
  48. package/lib/module/bugCase/lock.js +1 -1
  49. package/lib/module/bugCase/media.js +1 -0
  50. package/lib/module/bugCase/recorder.js +1 -1
  51. package/lib/module/bugCase/scrub.js +1 -1
  52. package/lib/module/bugCase/steps.js +1 -1
  53. package/lib/module/bugCase/teamKey.js +1 -0
  54. package/lib/module/bugCase/validate.js +1 -0
  55. package/lib/module/clipboard/autoDetectClipboard.js +1 -1
  56. package/lib/module/clipboard/clipboard-impl.js +1 -1
  57. package/lib/module/clipboard/clipboard-impl.web.js +1 -1
  58. package/lib/module/clipboard/index.js +1 -1
  59. package/lib/module/dataViewer/LiveExplorer.js +1 -1
  60. package/lib/module/dataViewer/VirtualizedDataExplorer.js +1 -1
  61. package/lib/module/dataViewer/flattenTree.js +1 -0
  62. package/lib/module/dataViewer/liveEntries.js +1 -0
  63. package/lib/module/icons/index.js +1 -1
  64. package/lib/module/index.js +1 -1
  65. package/lib/module/license/BuoyUpgradeSheet.js +1 -1
  66. package/lib/module/license/index.js +1 -1
  67. package/lib/module/sync/keyedArrays.js +1 -1
  68. package/lib/module/sync/valuePath.js +1 -1
  69. package/lib/module/ui/components/DynamicFilterView.js +1 -1
  70. package/lib/module/ui/components/EntityFilterView.js +1 -1
  71. package/lib/module/ui/components/WindowControls.js +1 -1
  72. package/lib/module/ui/floating/FloatingTool.js +1 -1
  73. package/lib/module/ui/listPresets.js +1 -1
  74. package/lib/module/utils/fiberRootAnchor.js +1 -0
  75. package/lib/module/utils/index.js +1 -1
  76. package/lib/module/utils/loadOptionalModule.js +1 -1
  77. package/lib/module/utils/loadToolModule.js +1 -1
  78. package/lib/module/utils/minimalSuperJSON.js +1 -1
  79. package/lib/module/utils/persistentStorage.js +1 -1
  80. package/lib/module/utils/persistentStorage.web.js +1 -1
  81. package/lib/module/utils/reloadPlatform.js +1 -1
  82. package/lib/module/utils/snapshotProviderKit.js +1 -1
  83. package/lib/typescript/commonjs/JsModal.d.ts +3 -4
  84. package/lib/typescript/commonjs/JsModal.web.d.ts +2 -0
  85. package/lib/typescript/commonjs/bugCase/appInfo.d.ts +17 -0
  86. package/lib/typescript/commonjs/bugCase/appInfo.web.d.ts +14 -0
  87. package/lib/typescript/commonjs/bugCase/format.d.ts +2 -1
  88. package/lib/typescript/commonjs/bugCase/index.d.ts +7 -0
  89. package/lib/typescript/commonjs/bugCase/lock.d.ts +13 -0
  90. package/lib/typescript/commonjs/bugCase/media.d.ts +90 -0
  91. package/lib/typescript/commonjs/bugCase/recorder.d.ts +1 -0
  92. package/lib/typescript/commonjs/bugCase/scrub.d.ts +2 -2
  93. package/lib/typescript/commonjs/bugCase/steps.d.ts +10 -0
  94. package/lib/typescript/commonjs/bugCase/teamKey.d.ts +185 -0
  95. package/lib/typescript/commonjs/bugCase/types.d.ts +10 -0
  96. package/lib/typescript/commonjs/bugCase/validate.d.ts +14 -0
  97. package/lib/typescript/commonjs/clipboard/autoDetectClipboard.d.ts +1 -1
  98. package/lib/typescript/commonjs/clipboard/clipboard-impl.d.ts +6 -0
  99. package/lib/typescript/commonjs/clipboard/clipboard-impl.web.d.ts +2 -0
  100. package/lib/typescript/commonjs/clipboard/index.d.ts +1 -1
  101. package/lib/typescript/commonjs/dataViewer/flattenTree.d.ts +35 -0
  102. package/lib/typescript/commonjs/dataViewer/liveEntries.d.ts +19 -0
  103. package/lib/typescript/commonjs/hooks/safe-area-impl.d.ts +1 -1
  104. package/lib/typescript/commonjs/icons/index.d.ts +1 -0
  105. package/lib/typescript/commonjs/index.d.ts +3 -2
  106. package/lib/typescript/commonjs/license/BuoyUpgradeSheet.d.ts +8 -0
  107. package/lib/typescript/commonjs/license/index.d.ts +1 -1
  108. package/lib/typescript/commonjs/sync/keyedArrays.d.ts +6 -1
  109. package/lib/typescript/commonjs/ui/floating/FloatingTool.d.ts +6 -1
  110. package/lib/typescript/commonjs/ui/listPresets.d.ts +2 -2
  111. package/lib/typescript/commonjs/utils/fiberRootAnchor.d.ts +19 -0
  112. package/lib/typescript/commonjs/utils/index.d.ts +2 -1
  113. package/lib/typescript/commonjs/utils/minimalSuperJSON.d.ts +4 -2
  114. package/lib/typescript/commonjs/utils/persistentStorage.d.ts +19 -0
  115. package/lib/typescript/commonjs/utils/persistentStorage.web.d.ts +17 -0
  116. package/lib/typescript/module/JsModal.d.ts +3 -4
  117. package/lib/typescript/module/JsModal.web.d.ts +2 -0
  118. package/lib/typescript/module/bugCase/appInfo.d.ts +17 -0
  119. package/lib/typescript/module/bugCase/appInfo.web.d.ts +14 -0
  120. package/lib/typescript/module/bugCase/format.d.ts +2 -1
  121. package/lib/typescript/module/bugCase/index.d.ts +7 -0
  122. package/lib/typescript/module/bugCase/lock.d.ts +13 -0
  123. package/lib/typescript/module/bugCase/media.d.ts +90 -0
  124. package/lib/typescript/module/bugCase/recorder.d.ts +1 -0
  125. package/lib/typescript/module/bugCase/scrub.d.ts +2 -2
  126. package/lib/typescript/module/bugCase/steps.d.ts +10 -0
  127. package/lib/typescript/module/bugCase/teamKey.d.ts +185 -0
  128. package/lib/typescript/module/bugCase/types.d.ts +10 -0
  129. package/lib/typescript/module/bugCase/validate.d.ts +14 -0
  130. package/lib/typescript/module/clipboard/autoDetectClipboard.d.ts +1 -1
  131. package/lib/typescript/module/clipboard/clipboard-impl.d.ts +6 -0
  132. package/lib/typescript/module/clipboard/clipboard-impl.web.d.ts +2 -0
  133. package/lib/typescript/module/clipboard/index.d.ts +1 -1
  134. package/lib/typescript/module/dataViewer/flattenTree.d.ts +35 -0
  135. package/lib/typescript/module/dataViewer/liveEntries.d.ts +19 -0
  136. package/lib/typescript/module/hooks/safe-area-impl.d.ts +1 -1
  137. package/lib/typescript/module/icons/index.d.ts +1 -0
  138. package/lib/typescript/module/index.d.ts +3 -2
  139. package/lib/typescript/module/license/BuoyUpgradeSheet.d.ts +8 -0
  140. package/lib/typescript/module/license/index.d.ts +1 -1
  141. package/lib/typescript/module/sync/keyedArrays.d.ts +6 -1
  142. package/lib/typescript/module/ui/floating/FloatingTool.d.ts +6 -1
  143. package/lib/typescript/module/ui/listPresets.d.ts +2 -2
  144. package/lib/typescript/module/utils/fiberRootAnchor.d.ts +19 -0
  145. package/lib/typescript/module/utils/index.d.ts +2 -1
  146. package/lib/typescript/module/utils/minimalSuperJSON.d.ts +4 -2
  147. package/lib/typescript/module/utils/persistentStorage.d.ts +19 -0
  148. package/lib/typescript/module/utils/persistentStorage.web.d.ts +17 -0
  149. package/lib/web/chunks/chunk-36A4T5PL.mjs +1 -0
  150. package/lib/web/chunks/{chunk-XUYN4NOF.mjs → chunk-5UII72AQ.mjs} +1 -1
  151. package/lib/web/chunks/chunk-A3N3WVKC.mjs +1 -0
  152. package/lib/web/chunks/chunk-BPL65J3F.mjs +1 -0
  153. package/lib/web/chunks/chunk-EY7GXWGI.mjs +1 -1
  154. package/lib/web/chunks/chunk-IE2U5SN2.mjs +15 -0
  155. package/lib/web/chunks/chunk-IEAXJZCR.mjs +6 -0
  156. package/lib/web/chunks/chunk-OF3VWR6K.mjs +2 -2
  157. package/lib/web/chunks/{chunk-OVTASJUJ.mjs → chunk-SUG6TLF5.mjs} +1 -1
  158. package/lib/web/chunks/chunk-SXWOOYFL.mjs +1 -0
  159. package/lib/web/chunks/chunk-T44OT3CI.mjs +6 -0
  160. package/lib/web/chunks/{chunk-OQB3GW44.mjs → chunk-UVVRCZX5.mjs} +1 -1
  161. package/lib/web/chunks/chunk-Y7FM4WZ7.mjs +6 -0
  162. package/lib/web/chunks/persistentStorage.web-BFPYMY5C.mjs +1 -0
  163. package/lib/web/dataViewer.mjs +2 -2
  164. package/lib/web/history.mjs +1 -1
  165. package/lib/web/hooks.mjs +1 -1
  166. package/lib/web/index.mjs +12 -6
  167. package/lib/web/ui.mjs +1 -1
  168. package/lib/web/utils.mjs +1 -1
  169. package/package.json +5 -5
  170. package/scripts/detect-clipboard.js +18 -2
  171. package/lib/web/chunks/chunk-BMITMQVB.mjs +0 -6
  172. package/lib/web/chunks/chunk-DJD42EPL.mjs +0 -1
  173. package/lib/web/chunks/chunk-GN75GBYZ.mjs +0 -1
  174. package/lib/web/chunks/chunk-GTRVOJUH.mjs +0 -1
  175. package/lib/web/chunks/chunk-HE5ONCAL.mjs +0 -6
@@ -0,0 +1,35 @@
1
+ import { JsonValue } from "../types/types";
2
+ /**
3
+ * Pure tree → rows flattening for VirtualizedDataExplorer.
4
+ *
5
+ * Lives outside the component so it can be unit tested without React Native.
6
+ * Every child of an expanded node becomes a row: the list is virtualized, so
7
+ * rows are cheap, and the header's "(N items)" must match what you can scroll
8
+ * to. An earlier version stopped after 150 children (a leftover `break` meant to
9
+ * "yield" that nothing ever resumed) and capped the count at 500.
10
+ */
11
+ export declare const MAX_DEPTH_LIMIT = 15;
12
+ export interface FlatDataItem {
13
+ id: string;
14
+ key: string;
15
+ value: JsonValue;
16
+ valueType: string;
17
+ depth: number;
18
+ isExpandable: boolean;
19
+ isExpanded: boolean;
20
+ parentId?: string;
21
+ hasChildren: boolean;
22
+ childCount: number;
23
+ path: string[];
24
+ type: string;
25
+ isLastChild?: boolean;
26
+ parentHasMoreSiblings?: boolean[];
27
+ siblingIndex?: number;
28
+ totalSiblings?: number;
29
+ }
30
+ export declare const getValueType: (value: JsonValue) => string;
31
+ export declare const getValueCount: (value: JsonValue, valueType: string) => number;
32
+ /** A collection's children as [key, value] pairs, in display order. */
33
+ export declare const getChildEntries: (value: JsonValue, valueType: string) => [string, JsonValue][];
34
+ export declare function flattenTree(value: JsonValue, expandedSet: Set<string>, circularCache: WeakSet<object>, maxDepth: number, key?: string, depth?: number, parentId?: string, path?: string[], siblingIndex?: number, totalSiblings?: number, parentHasMoreSiblings?: boolean[]): FlatDataItem[];
35
+ //# sourceMappingURL=flattenTree.d.ts.map
@@ -0,0 +1,19 @@
1
+ import { JsonValue } from "../types/types";
2
+ /**
3
+ * Pure helpers for LiveExplorer's child list, kept out of the component so they
4
+ * can be unit tested without React Native.
5
+ *
6
+ * Every child is listed. Long lists are split into collapsed pages of
7
+ * `LIVE_PAGE_SIZE`, so a huge array costs one header row per page until you
8
+ * open one. Children past 1,000 used to be dropped, so they could not be reached.
9
+ */
10
+ export declare const LIVE_PAGE_SIZE = 100;
11
+ export type LiveEntry = {
12
+ label: string;
13
+ value: JsonValue;
14
+ };
15
+ /** A node's children, in display order. */
16
+ export declare function getLiveSubEntries(value: JsonValue): LiveEntry[];
17
+ /** `[first...last]` for page `index`; the last page stops at the real end. */
18
+ export declare function livePageRange(index: number, total: number, size?: number): string;
19
+ //# sourceMappingURL=liveEntries.d.ts.map
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Auto-generated safe area implementation
3
3
  * Detected: none
4
- * Generated at: 2026-10-23T07:23:13.273Z
4
+ * Generated at: 2026-10-31T18:38:31.842Z
5
5
  *
6
6
  * DO NOT EDIT - This file is generated by scripts/detect-safe-area.js
7
7
  *
@@ -28,4 +28,5 @@ export { ClockToolIcon, CLOCK_TOOL_ICON_COLOR } from "@buoy-gg/floating-tools-co
28
28
  export { PermissionsIcon, PERMISSIONS_ICON_COLOR } from "@buoy-gg/floating-tools-core";
29
29
  export { LifecycleToolIcon, LIFECYCLE_TOOL_ICON_COLOR } from "@buoy-gg/floating-tools-core";
30
30
  export { LocationToolIcon, LOCATION_TOOL_ICON_COLOR } from "@buoy-gg/floating-tools-core";
31
+ export { OtaInspectorIcon, OTA_INSPECTOR_ICON_COLOR } from '@buoy-gg/floating-tools-core';
31
32
  //# sourceMappingURL=index.d.ts.map
@@ -14,10 +14,11 @@ export * from "./tools/defineTool";
14
14
  export * from "./sync/toolActionRegistry";
15
15
  export * from "./sync/toolUiBridge";
16
16
  export * from "./sync/toolScreenHeader";
17
- export { absoluteFill, displayValue, parseDisplayValue, getSafeAreaInsets, persistentStorage, isUsingPersistentStorage, getStorageBackendType, safeStringify, getValueType, isPrimitive, isJsonSerializable, isValidJson, getConstructorName, isEmpty, getValueSize, parseValue, formatValue, getTypeColor, truncateText, flattenObject, formatPath, loadOptionalModule, getCachedOptionalModule, setRenderCaptureProvider, getRenderCaptureProvider, type RenderCaptureProvider, type RenderCaptureSummary, type RenderCaptureTopComponent, type RenderCauseCounts, registerStateSnapshotProvider, getStateSnapshotProviders, getStateSnapshotProvider, subscribeToStateSnapshotProviders, type StateSnapshotProvider, type StateSnapshotProviderStatus, type StateSnapshotCapture, type StateSnapshotRestoreResult, type StateSnapshotPreview, type StateSnapshotPreviewItem, type StateSnapshotPreviewVerdict, superJsonSerialize, superJsonDeserialize, type SuperJSONResult, realNow, getRealAppState, subscribeRealAppState, BUOY_SYNTHETIC_MARK, countBuoyListener, type RealAppState, reloadApp, scheduleReloadApp, resolveReloadStrategy, REMOTE_RELOAD_DELAY_MS, type ReloadStrategy, type ResolvedReloadStrategy, getDevServerOrigin, Subscribable, type SubscribableListener, subscriberCountNotifier, subscribeToSubscriberCountChanges, notifySubscriberCountChange, useSafeRouter, useSafePathname, useSafeSegments, useSafeGlobalSearchParams, getSafeRouter, getSafeCurrentPathname, getSafeCurrentRoute, isExpoRouterAvailable, } from "./utils";
17
+ export { absoluteFill, displayValue, parseDisplayValue, getSafeAreaInsets, persistentStorage, setItemChecked, getItemChecked, storageIsMemoryOnly, isUsingPersistentStorage, getStorageBackendType, safeStringify, getValueType, isPrimitive, isJsonSerializable, isValidJson, getConstructorName, isEmpty, getValueSize, parseValue, formatValue, getTypeColor, truncateText, flattenObject, formatPath, loadOptionalModule, getCachedOptionalModule, setRenderCaptureProvider, getRenderCaptureProvider, type RenderCaptureProvider, type RenderCaptureSummary, type RenderCaptureTopComponent, type RenderCauseCounts, registerStateSnapshotProvider, getStateSnapshotProviders, getStateSnapshotProvider, subscribeToStateSnapshotProviders, type StateSnapshotProvider, type StateSnapshotProviderStatus, type StateSnapshotCapture, type StateSnapshotRestoreResult, type StateSnapshotPreview, type StateSnapshotPreviewItem, type StateSnapshotPreviewVerdict, superJsonSerialize, superJsonDeserialize, type SuperJSONResult, realNow, getRealAppState, subscribeRealAppState, BUOY_SYNTHETIC_MARK, countBuoyListener, type RealAppState, reloadApp, scheduleReloadApp, resolveReloadStrategy, REMOTE_RELOAD_DELAY_MS, type ReloadStrategy, type ResolvedReloadStrategy, getDevServerOrigin, Subscribable, type SubscribableListener, subscriberCountNotifier, subscribeToSubscriberCountChanges, notifySubscriberCountChange, useSafeRouter, useSafePathname, useSafeSegments, useSafeGlobalSearchParams, getSafeRouter, getSafeCurrentPathname, getSafeCurrentRoute, isExpoRouterAvailable, } from "./utils";
18
18
  export type { SafeRouteLocation } from "./utils";
19
19
  export * from "./utils/toolModules";
20
20
  export { subscribeStorageWrites } from "./utils/storageWrites";
21
+ export { FiberRootAnchor, getAnchoredFiberRoots } from "./utils/fiberRootAnchor";
21
22
  export { registerBrowserRouter, browserRouter, subscribeBrowserNavigation } from "./utils/browserNavigation";
22
23
  export { PREVIEW_ITEM_RENDER_BYTE_LIMIT, createRestoreScope, emptyRestoreResult, failedRestore, skippedRestore, classifyPreviewItem, wontApply, unionKeys, type RestoreScope, type RestoreScopeOptions, type ClassifyOptions, type ClassifyInput, } from "./utils/snapshotProviderKit";
23
24
  export { entityColor, formatValuePreview, shallowDiffSummary, type ValuePreviewOptions, type ShallowDiffSummary, } from "./utils/stateTools";
@@ -51,7 +52,7 @@ export type { Environment } from "./types/types";
51
52
  export { normalizeEnvironment } from "./types/types";
52
53
  export { HintsProvider, useHintsDisabled, useHintsContext } from "./context";
53
54
  export * from "./history";
54
- export { FeatureGate, UpgradePrompt, useFeatureGate, ProFeatureBanner, UpgradeModal, BuoyUpgradeSheet, BuoySignInCard, BuoyNeedsPlanCard, useSignInState, ProBadge, ProUpgradeModal, FreeAccountPrompt, LOGIN_COMMAND, getUseIsPro, getUseLicense, getUseTier, signOutOfBuoy, TIER_LIMITS, useLimit, resolveEffectiveTier } from "./license";
55
+ export { FeatureGate, UpgradePrompt, useFeatureGate, ProFeatureBanner, UpgradeModal, BuoyUpgradeSheet, BuoySignInCard, BuoyNeedsPlanCard, BuoyGetProCard, useSignInState, ProBadge, ProUpgradeModal, FreeAccountPrompt, LOGIN_COMMAND, getUseIsPro, getUseLicense, getUseTier, signOutOfBuoy, TIER_LIMITS, useLimit, resolveEffectiveTier } from "./license";
55
56
  export type { FeatureGateProps, ProFeatureBannerProps, UpgradeModalProps, BuoyUpgradeSheetProps, ProUpgradeModalProps, FreeAccountPromptProps, BuoyTier, TierLimitKey } from "./license";
56
57
  export { getAccountAccess, hasAccountAccess, assertAccountAccess, subscribeAccountAccess, getUseAccountAccess, retryAccountAccess, isProNow, getTeamCredential } from "./license/licenseModule";
57
58
  export { setBuoyAppId, getBuoyAppId } from "./utils/appIdentity";
@@ -14,6 +14,14 @@ export declare function BuoySignInCard({ onClose, onNotConfigured, footer, }: {
14
14
  export declare function BuoyNeedsPlanCard({ onClose }: {
15
15
  onClose: () => void;
16
16
  }): import("react").JSX.Element;
17
+ /**
18
+ * "Get Buoy Pro": a QR code and a link to buoy.gg/pricing, then a way to
19
+ * check again. BuoyUpgradeSheet shows it in a Modal; the parity sheet draws
20
+ * it inline.
21
+ */
22
+ export declare function BuoyGetProCard({ onClose }: {
23
+ onClose: () => void;
24
+ }): import("react").JSX.Element;
17
25
  export interface BuoyUpgradeSheetProps {
18
26
  visible: boolean;
19
27
  onClose: () => void;
@@ -1,6 +1,6 @@
1
1
  export { FeatureGate, UpgradePrompt, useFeatureGate, ProFeatureBanner, UpgradeModal, ProBadge, ProUpgradeModal } from "./FeatureGate";
2
2
  export type { FeatureGateProps, ProFeatureBannerProps, UpgradeModalProps, ProUpgradeModalProps } from "./FeatureGate";
3
- export { BuoyUpgradeSheet, BuoySignInCard, BuoyNeedsPlanCard, useSignInState } from "./BuoyUpgradeSheet";
3
+ export { BuoyUpgradeSheet, BuoySignInCard, BuoyNeedsPlanCard, BuoyGetProCard, useSignInState } from "./BuoyUpgradeSheet";
4
4
  export type { BuoyUpgradeSheetProps } from "./BuoyUpgradeSheet";
5
5
  export { FreeAccountPrompt, LOGIN_COMMAND } from "./FreeAccountPrompt";
6
6
  export type { FreeAccountPromptProps } from "./FreeAccountPrompt";
@@ -4,8 +4,13 @@
4
4
  * Every item must carry it, and every value must be a distinct string/number —
5
5
  * a duplicated id would make an addressed edit ambiguous, and silently picking
6
6
  * the first match is exactly the kind of "helpful" guess that loses data.
7
+ *
8
+ * A unique `…Id` field counts too: Haiven's `/chat/me` rows carry only
9
+ * `channelId`, and a keyed edit on them was written over the list as an object.
10
+ * When `keys` are given, the field holding one of them wins, so a studio patch
11
+ * keyed by slug edits that studio instead of appending a new one under `id`.
7
12
  */
8
- export declare function identityField(items: unknown[]): string | undefined;
13
+ export declare function identityField(items: unknown[], keys?: string[]): string | undefined;
9
14
  /**
10
15
  * Let a caller address list items by their own id instead of resending the list.
11
16
  *
@@ -27,6 +27,11 @@ export type FloatingToolProps = {
27
27
  * out of the way of app headers.
28
28
  */
29
29
  defaultPlacement?: "top" | "bottom";
30
+ /**
31
+ * Extra room a "bottom" tool keeps above the safe area, e.g. for the dev
32
+ * warning banner (LogBox) that covers the bottom of a dev build.
33
+ */
34
+ bottomClearance?: number;
30
35
  children?: ReactNode;
31
36
  /** When true, pushes the bubble to the side (hidden position) */
32
37
  pushToSide?: boolean;
@@ -70,7 +75,7 @@ export type FloatingToolProps = {
70
75
  * @performance Implements efficient boundary checking and position validation
71
76
  * @performance Includes debounced position saving for optimal storage performance
72
77
  */
73
- export declare function FloatingTool({ id, suspendPointerEvents, revealToken, variant, dragFromSurface, accessibilityLabel, minimizedStack, hasMinimizedStack, accessory, handleAdornment, enablePositionPersistence, defaultPlacement, pushToSide, centerOnboarding, children, environment, availableEnvironments, onEnvironmentSwitch, showEnvironmentSelector, }: FloatingToolProps): import("react").JSX.Element | null;
78
+ export declare function FloatingTool({ id, suspendPointerEvents, revealToken, variant, dragFromSurface, accessibilityLabel, minimizedStack, hasMinimizedStack, accessory, handleAdornment, enablePositionPersistence, defaultPlacement, bottomClearance, pushToSide, centerOnboarding, children, environment, availableEnvironments, onEnvironmentSwitch, showEnvironmentSelector, }: FloatingToolProps): import("react").JSX.Element | null;
74
79
  /** Native AppHost gets its anchor from the minimized-tools provider. */
75
80
  export declare function getBubbleAnchorPosition(): {
76
81
  x: number;
@@ -5,14 +5,14 @@
5
5
  * Spread them onto a FlatList: `<FlatList {...EVENT_LIST_PRESET} … />`.
6
6
  * A tool that later moves to FlashList changes this file, not eleven.
7
7
  */
8
- import type { FlatListProps } from "react-native";
8
+ import { type FlatListProps } from "react-native";
9
9
  /**
10
10
  * `removeClippedSubviews` is off in E2E bundles: clipped rows leave the
11
11
  * hierarchy entirely, so a row past the fold reads to the test as "the tool
12
12
  * stopped capturing".
13
13
  */
14
14
  export declare const CLIP_OFFSCREEN_CELLS: boolean;
15
- type ListPreset = Pick<FlatListProps<unknown>, "initialNumToRender" | "maxToRenderPerBatch" | "windowSize" | "updateCellsBatchingPeriod" | "removeClippedSubviews">;
15
+ type ListPreset = Pick<FlatListProps<unknown>, "initialNumToRender" | "maxToRenderPerBatch" | "windowSize" | "updateCellsBatchingPeriod" | "removeClippedSubviews" | "keyboardShouldPersistTaps" | "keyboardDismissMode">;
16
16
  /**
17
17
  * Event / change / request lists: rows are tall-ish and arrive in bursts.
18
18
  * Window and batch values are the "tuned" winner of the buoy-optimize
@@ -0,0 +1,19 @@
1
+ /**
2
+ * The app's React roots, found without React DevTools.
3
+ *
4
+ * Highlight Updates finds roots through `__REACT_DEVTOOLS_GLOBAL_HOOK__`. React
5
+ * Native sets that hook up only in dev builds, so in a release build Bug Links
6
+ * got no taps and no screen text. A class component's instance holds its own
7
+ * fiber (`_reactInternals`) in every React build. Walking up from it reaches
8
+ * the root it is mounted in. FloatingDevTools mounts one inside the app's tree.
9
+ */
10
+ import { Component } from "react";
11
+ /** Renders nothing. While mounted, its root shows in `getAnchoredFiberRoots()`. */
12
+ export declare class FiberRootAnchor extends Component {
13
+ componentDidMount(): void;
14
+ componentWillUnmount(): void;
15
+ render(): null;
16
+ }
17
+ /** The FiberRoot (with `.current`) of every mounted anchor, once each. */
18
+ export declare function getAnchoredFiberRoots(): any[];
19
+ //# sourceMappingURL=fiberRootAnchor.d.ts.map
@@ -1,7 +1,7 @@
1
1
  export { absoluteFill } from "./absoluteFill";
2
2
  export { displayValue, parseDisplayValue } from "./displayValue";
3
3
  export { getSafeAreaInsets } from "./getSafeAreaInsets";
4
- export { persistentStorage, isUsingPersistentStorage, getStorageBackendType, type DevToolsStorage, } from "./persistentStorage";
4
+ export { persistentStorage, setItemChecked, getItemChecked, storageIsMemoryOnly, isUsingPersistentStorage, getStorageBackendType, type DevToolsStorage, } from "./persistentStorage";
5
5
  export { safeStringify } from "./safeStringify";
6
6
  export { getValueType, isPrimitive, isJsonSerializable, isValidJson, getConstructorName, isEmpty, getValueSize, } from "./typeHelpers";
7
7
  export { parseValue, formatValue, getTypeColor, truncateText, flattenObject, formatPath, } from "./valueFormatting";
@@ -21,4 +21,5 @@ export { browserRouter, getBrowserHref, getBrowserRouteURL, registerBrowserRoute
21
21
  export { isDOMElement, getDOMControlProps, getDOMFiber, getDOMNodeHandle, getDOMPublicInstance, resolveDOMEventEmitter } from "./domRuntime";
22
22
  export { registerToolModules, getRegisteredToolModule, getToolModuleVersion, type ToolModule } from "./toolModules";
23
23
  export { loadToolModule } from "./loadToolModule";
24
+ export { FiberRootAnchor, getAnchoredFiberRoots } from "./fiberRootAnchor";
24
25
  //# sourceMappingURL=index.d.ts.map
@@ -13,12 +13,14 @@ export interface SuperJSONResult {
13
13
  };
14
14
  }
15
15
  export declare function serialize(object: any): SuperJSONResult;
16
- export declare function deserialize<T = unknown>(payload: SuperJSONResult): T;
16
+ export declare function deserialize<T = unknown>(payload: SuperJSONResult, options?: {
17
+ skipBadAnnotations?: boolean;
18
+ }): T;
17
19
  /**
18
20
  * Drop the annotations whose value `drop` rejects. A bug case's scrubber can
19
21
  * replace a Date with "[removed:pii]"; the Date annotation left behind would
20
22
  * turn that into Invalid Date (or throw, for a BigInt) on deserialize.
21
23
  */
22
- export declare function dropAnnotations(payload: SuperJSONResult, drop: (value: unknown) => boolean): SuperJSONResult;
24
+ export declare function dropAnnotations(payload: SuperJSONResult, drop: (value: unknown, type: unknown) => boolean): SuperJSONResult;
23
25
  export {};
24
26
  //# sourceMappingURL=minimalSuperJSON.d.ts.map
@@ -29,6 +29,21 @@ type StorageBackend = "filesystem" | "asyncstorage" | "localstorage" | "memory";
29
29
  * Same API as AsyncStorage for easy migration.
30
30
  */
31
31
  export declare const persistentStorage: DevToolsStorage;
32
+ /**
33
+ * Like persistentStorage.setItem, but says whether the value reached disk:
34
+ * false when the backend failed or kept it in memory only. For data that is
35
+ * worthless half saved (a blob in chunks, an undo copy).
36
+ */
37
+ export declare function setItemChecked(key: string, value: string, options?: {
38
+ strict?: boolean;
39
+ }): Promise<boolean>;
40
+ /**
41
+ * Like persistentStorage.getItem, but a read that fails throws instead of
42
+ * looking like a missing value: null means nothing is saved there. For data
43
+ * that a save would replace whole (a list), where "empty" and "couldn't
44
+ * read" must never be mixed up.
45
+ */
46
+ export declare function getItemChecked(key: string): Promise<string | null>;
32
47
  /**
33
48
  * Check if persistent storage (FileSystem) is being used
34
49
  */
@@ -36,10 +51,14 @@ export declare function isUsingPersistentStorage(): Promise<boolean>;
36
51
  /**
37
52
  * Get the current storage backend type
38
53
  */
54
+ /** True when nothing saved outlives the app (no file store, AsyncStorage or localStorage). */
55
+ export declare function storageIsMemoryOnly(): Promise<boolean>;
39
56
  export declare function getStorageBackendType(): Promise<StorageBackend>;
40
57
  /**
41
58
  * Force re-initialization of storage (useful for testing)
42
59
  */
43
60
  export declare function resetStorageInit(): void;
61
+ /** Tests only: use this file module (or none) and pick the store again. */
62
+ export declare function setFileSystemForTests(fs: unknown): void;
44
63
  export {};
45
64
  //# sourceMappingURL=persistentStorage.d.ts.map
@@ -3,4 +3,21 @@ export type { DevToolsStorage } from "./persistentStorage";
3
3
  export declare const persistentStorage: DevToolsStorage;
4
4
  export declare function isUsingPersistentStorage(): Promise<boolean>;
5
5
  export declare function getStorageBackendType(): Promise<"localstorage" | "memory">;
6
+ /**
7
+ * Write and report whether it reached the browser's storage, like the native
8
+ * setItemChecked: false when storage is blocked or full (the value is still
9
+ * kept for this session). Bug links saves a loaded case this way, so a reload
10
+ * can still restore the app.
11
+ */
12
+ export declare function setItemChecked(key: string, value: string, _options?: {
13
+ strict?: boolean;
14
+ }): Promise<boolean>;
15
+ /**
16
+ * Like getItem, but a read that fails throws instead of looking like a
17
+ * missing value (the native getItemChecked). With no browser storage at all,
18
+ * this session's own copy is all there is.
19
+ */
20
+ export declare function getItemChecked(key: string): Promise<string | null>;
21
+ /** True when nothing saved outlives the page. */
22
+ export declare function storageIsMemoryOnly(): Promise<boolean>;
6
23
  //# sourceMappingURL=persistentStorage.web.d.ts.map
@@ -100,10 +100,9 @@ interface JsModalProps {
100
100
  /** Chrome variant — see {@link ModalVariant}. */
101
101
  variant?: ModalVariant;
102
102
  /**
103
- * iOS, bottom sheet only: move the sheet up while the keyboard is open, so
104
- * a field in the sheet and the buttons under it stay in view. On by
105
- * default. Pass false when the body handles the keyboard itself (Ask
106
- * Buoy's composer pads for it), or the two would lift it twice.
103
+ * Lift the bottom sheet above the iOS keyboard. On by default. A body that
104
+ * keeps its own input above the keyboard (Ask Buoy's KeyboardPad) passes
105
+ * false, or it would move twice.
107
106
  */
108
107
  avoidKeyboard?: boolean;
109
108
  }
@@ -85,6 +85,8 @@ export interface ModalState {
85
85
  };
86
86
  }
87
87
  export interface JsModalProps {
88
+ /** Native only (lifts the sheet above the iOS keyboard). Accepted here for parity. */
89
+ avoidKeyboard?: boolean;
88
90
  visible: boolean;
89
91
  onClose: () => void;
90
92
  children: ReactNode;
@@ -0,0 +1,17 @@
1
+ export interface BugCaseAppInfo {
2
+ /** Bundle id (iOS) or package name (Android). */
3
+ id?: string;
4
+ /** The version people see, like "4.2.0". */
5
+ version?: string;
6
+ /** The build number, like "4210". */
7
+ build?: string;
8
+ }
9
+ type Modules = {
10
+ application?: unknown;
11
+ constants?: unknown;
12
+ };
13
+ /** Tests pass stand-ins for expo-application and expo-constants (undefined: not installed). */
14
+ export declare function setAppInfoModulesForTests(modules: Modules | null): void;
15
+ export declare function bugCaseAppInfo(): BugCaseAppInfo;
16
+ export {};
17
+ //# sourceMappingURL=appInfo.d.ts.map
@@ -0,0 +1,14 @@
1
+ /**
2
+ * The web build's app facts: none. A browser page has no bundle id or build
3
+ * number to read, and the native modules appInfo.ts reads don't exist here
4
+ * (the web build refuses them). The case leaves these fields out.
5
+ */
6
+ export interface BugCaseAppInfo {
7
+ id?: string;
8
+ version?: string;
9
+ build?: string;
10
+ }
11
+ export declare function bugCaseAppInfo(): BugCaseAppInfo;
12
+ /** The same test hook as the native file, so shared tests import either. */
13
+ export declare function setAppInfoModulesForTests(_modules: unknown): void;
14
+ //# sourceMappingURL=appInfo.web.d.ts.map
@@ -10,6 +10,7 @@ import type { BugCase, BugCaseNetworkCall } from "./types";
10
10
  export declare function isFailedCall(call: BugCaseNetworkCall): boolean;
11
11
  export declare function formatBugCase(kase: BugCase, options?: {
12
12
  link?: string;
13
- maxCalls?: number;
13
+ maxCalls?: number; /** Saved picture files, in picture order (MCP). */
14
+ pictureFiles?: readonly string[];
14
15
  }): string;
15
16
  //# sourceMappingURL=format.d.ts.map
@@ -1,3 +1,5 @@
1
+ export { bugCaseAppInfo } from "./appInfo";
2
+ export type { BugCaseAppInfo } from "./appInfo";
1
3
  export { captureBugCase, DEFAULT_BUG_CASE_BUDGET } from "./capture";
2
4
  export type { BugCaseBudget, CaptureBugCaseOptions } from "./capture";
3
5
  export { base64UrlDecode, base64UrlEncode, BUG_CASE_LOCK_FORMAT, bugCaseHeader, BugCaseLockError, bugLinkUrl, lockBugCase, MAX_BUG_CASE_BYTES, parseBugLink, readBugCaseHeader, unlockBugCase, webCaseCrypto, } from "./lock";
@@ -5,10 +7,15 @@ export type { BugCaseCrypto, BugCaseHeader, BugCaseLockErrorCode, LockedBugCase
5
7
  export { bugCaseRecorderStatus, startBugCaseRecorder, stopBugCaseRecorder } from "./recorder";
6
8
  export type { BugCaseRecorderStatus } from "./recorder";
7
9
  export { formatBugCase, isFailedCall } from "./format";
10
+ export { BugCaseShapeError, validateBugCase } from "./validate";
11
+ export { addDroppedWhy, base64Bytes, cleanDroppedWhy, DEFAULT_MEDIA_BUDGET, describeDroppedWhy, DROPPED_NOT_JPEG, DROPPED_TO_FIT, fitBugCaseMedia, frameSteps, validateBugCaseMedia, } from "./media";
12
+ export type { BugCaseFrame, BugCaseFrameKind, BugCaseMedia, BugCaseMediaBudget, BugCaseMediaSettings } from "./media";
8
13
  export { classifyKey, keyWords, REMOVED_MARK, removedMark, ScrubLimitError, scrubBugCase } from "./scrub";
9
14
  export type { ScrubbedItem, ScrubKind, ScrubResult, ScrubRules } from "./scrub";
10
15
  export { bugCaseSteps, formatBugCaseSteps, safeTouch } from "./steps";
11
16
  export type { BugCaseRouteVisit, BugCaseStep, BugCaseTouch } from "./steps";
12
17
  export { BUG_CASE_VERSION } from "./types";
13
18
  export type { BugCase, BugCaseConsoleLine, BugCaseMissing, BugCaseNetworkCall, BugCaseScreenElement, } from "./types";
19
+ export { blobSha256, deviceCode, deviceCommit, newDeviceNonce, DEVICE_NONCE_BYTES, fitCard, keyProof, keyProofHash, kitId, kitKey, lockSecret, makeKit, MAX_CARD_JSON_BYTES, newCaseKeyParts, openCard, openKitForDevice, openSecret, pairBytes, pairFrom, checkPair, parseKit, parseWrap, rootLockAad, sealCard, sealKitForDevice, signRecord, teamKeyIdOf, TeamKeyError, unwrapCaseKey, verifyRecord, versionLockAad, webTeamKeyCrypto, wrapCaseKey, WRAP_SUITE, } from "./teamKey";
20
+ export type { BugCard, BugCardFields, BugWrap, CaseKeyParts, KitKind, P256Pair, TeamKeyCrypto, TeamKeyErrorCode, TeamKeyRecord } from "./teamKey";
14
21
  //# sourceMappingURL=index.d.ts.map
@@ -39,6 +39,13 @@ export interface BugCaseHeader {
39
39
  errors: number;
40
40
  removed: number;
41
41
  missing: number;
42
+ /**
43
+ * 16 random bytes, base64url. The team wrap and the card are bound to it.
44
+ * Optional: blobs from before team keys have none, and still open.
45
+ */
46
+ caseTag?: string;
47
+ /** SHA-256 of the key proof (teamKey.ts `keyProof`), base64url. Comes with `caseTag`. */
48
+ keyProofHash?: string;
42
49
  }
43
50
  export interface LockedBugCase {
44
51
  blob: Uint8Array;
@@ -74,9 +81,15 @@ export declare function bugCaseHeader(kase: BugCase, bytes: number): BugCaseHead
74
81
  * `options.key` locks under an existing link's key (with a fresh nonce), so a
75
82
  * case can be replaced, say to add a note, and the link people already have
76
83
  * keeps working.
84
+ *
85
+ * `caseTag` and `keyProofHash` (teamKey.ts `newCaseKeyParts`) go in the plain
86
+ * header for team keys. A note edit passes the first tag again, so it never
87
+ * changes.
77
88
  */
78
89
  export declare function lockBugCase(kase: BugCase, crypto?: BugCaseCrypto, options?: {
79
90
  key?: string;
91
+ caseTag?: string;
92
+ keyProofHash?: string;
80
93
  }): Promise<LockedBugCase>;
81
94
  /** For the server: the plain header, read without the key. */
82
95
  export declare function readBugCaseHeader(blob: Uint8Array): BugCaseHeader;
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Frames in a bug case: pictures and video
3
+ * (research/bug-links-2026-10/media/SPEC.md, rules C1 to C5).
4
+ *
5
+ * A frame is a boxed JPEG from the phone. The boxes went on in native code
6
+ * before the frame was kept (H1), so nothing here looks inside the pixels.
7
+ * The text scrubber never sees `jpeg` either (C4): capture adds media after
8
+ * the scrub.
9
+ */
10
+ export type BugCaseFrameKind = "last" | "tap" | "video";
11
+ export interface BugCaseFrame {
12
+ /** Steady clock, ms (F10). Frames, taps, errors and calls share it. */
13
+ t: number;
14
+ /** Wall time, ms since 1970, for people. */
15
+ wall?: number;
16
+ /** "last" is the app just before Buoy opened (F8). */
17
+ kind: BugCaseFrameKind;
18
+ /** The touch's seq, for kind "tap". */
19
+ tap?: number;
20
+ /** Size in points. */
21
+ w: number;
22
+ h: number;
23
+ /** Base64 JPEG. */
24
+ jpeg: string;
25
+ /** How many parts were boxed. */
26
+ boxes: number;
27
+ }
28
+ export interface BugCaseMediaSettings {
29
+ maskAllText: boolean;
30
+ maskAllImages: boolean;
31
+ maskAllInputs: boolean;
32
+ }
33
+ export interface BugCaseMedia {
34
+ frames: BugCaseFrame[];
35
+ /** "Bug here" marks on the steady clock (C2a). */
36
+ marks: number[];
37
+ settings: BugCaseMediaSettings;
38
+ /** How many frames C2 left out, so the viewer can say so. */
39
+ dropped: number;
40
+ /** Why they were left out, as short reasons with a count each (C5). Old cases have none. */
41
+ droppedWhy?: Record<string, number>;
42
+ }
43
+ export interface BugCaseMediaBudget {
44
+ frames: number;
45
+ bytes: number;
46
+ }
47
+ /** C2. */
48
+ export declare const DEFAULT_MEDIA_BUDGET: BugCaseMediaBudget;
49
+ /** Bytes a base64 string decodes to. */
50
+ export declare function base64Bytes(b64: string): number;
51
+ /**
52
+ * C2: keep the frames that matter most, inside the budget. In order: the
53
+ * "last" frame, tap frames (newest first), video frames near a mark (closest
54
+ * first), then the other video frames spread across the clip.
55
+ */
56
+ export declare function fitBugCaseMedia(frames: BugCaseFrame[], marks: number[], budget?: BugCaseMediaBudget): {
57
+ frames: BugCaseFrame[];
58
+ dropped: number;
59
+ };
60
+ /** Reasons the case itself adds when it leaves frames out. */
61
+ export declare const DROPPED_TO_FIT = "left out to fit the case";
62
+ export declare const DROPPED_NOT_JPEG = "not a picture Buoy can show";
63
+ /** Adds `n` to one reason, keeping the list short and every reason plain. */
64
+ export declare function addDroppedWhy(why: Record<string, number>, reason: string, n: number): Record<string, number>;
65
+ /** The phone's reasons, kept only when each is plain words with a whole count. */
66
+ export declare function cleanDroppedWhy(raw: unknown): Record<string, number>;
67
+ /**
68
+ * Which step each frame belongs to (V1): a tap frame goes with the step its
69
+ * tap made. A frame with no tap link has no step.
70
+ */
71
+ export declare function frameSteps(frames: readonly BugCaseFrame[], touches: readonly {
72
+ seq?: number;
73
+ t: number;
74
+ }[], steps: readonly {
75
+ t: number;
76
+ taps?: number[];
77
+ }[]): (number | null)[];
78
+ /** "4 the screen was moving, 1 left out to fit the case", biggest first. */
79
+ export declare function describeDroppedWhy(why: Record<string, number> | undefined): string;
80
+ /**
81
+ * 0..n-1 in an order where every start of the list is spread across the
82
+ * range: the two ends, then the middle, then the quarters, and so on.
83
+ */
84
+ export declare function spreadOrder(n: number): number[];
85
+ /**
86
+ * C3: keep `media` only with frames that are JPEGs. A bad frame is dropped,
87
+ * not the case. Then C2 again, since a hand-made case can hold anything.
88
+ */
89
+ export declare function validateBugCaseMedia(raw: unknown): BugCaseMedia | undefined;
90
+ //# sourceMappingURL=media.d.ts.map
@@ -2,6 +2,7 @@ export interface BugCaseRecorderStatus {
2
2
  watching: string[];
3
3
  touches: boolean;
4
4
  }
5
+ /** Start recording, or add the tools that registered since the last call. */
5
6
  export declare function startBugCaseRecorder(): Promise<BugCaseRecorderStatus>;
6
7
  export declare function stopBugCaseRecorder(): void;
7
8
  export declare function bugCaseRecorderStatus(): BugCaseRecorderStatus;
@@ -22,8 +22,8 @@
22
22
  * NO "LOOKS RANDOM" RULE. Entropy caught nothing the rules above missed and
23
23
  * broke order ids, hashes and commit SHAs. It was dropped on the evidence.
24
24
  *
25
- * Removed values become `[removed:secret]` / `[removed:pii]` so the loader can
26
- * graft the teammate's own value back into the same spot (see graft.ts).
25
+ * Removed values become `[removed:secret]` / `[removed:pii]`. A load writes
26
+ * the marks as they are; Restore puts the teammate's own values back.
27
27
  *
28
28
  * Pure and synchronous so it can be argued with in a unit test. Callers on a
29
29
  * phone run it after the capture has been shown as done, off the tap.
@@ -14,6 +14,8 @@ export interface BugCaseTouch {
14
14
  /** Capture order. Wins over `t`, which moves when the app clock is faked. */
15
15
  seq?: number;
16
16
  t: number;
17
+ /** Real time, which Buoy's clock tool never moves. Tap pictures are matched by it. Old cases have none. */
18
+ wall?: number;
17
19
  kind: "press" | "longPress" | "text" | "toggle" | "slider";
18
20
  target: {
19
21
  name: string;
@@ -32,7 +34,15 @@ export interface BugCaseRouteVisit {
32
34
  export interface BugCaseStep {
33
35
  t: number;
34
36
  text: string;
37
+ /** The touches (by seq) this step stands for, so a tap picture finds its step. Old cases have none. */
38
+ taps?: number[];
35
39
  }
40
+ /**
41
+ * A tap on React Native's own dev chrome (the LogBox warning banners and
42
+ * their inspector), not on the app. It showed up on the link page as
43
+ * "Tapped LogBoxButton" when a tester closed a warning.
44
+ */
45
+ export declare function isDevChromeTouch(touch: BugCaseTouch): boolean;
36
46
  /**
37
47
  * Drop what a case must never carry: the text a field held or received.
38
48
  * Toggle and slider values stay; they are what the step is about.