@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,185 @@
1
+ /** A P-256 key pair: the 32-byte private scalar and the 65-byte uncompressed public point. */
2
+ export interface P256Pair {
3
+ d: Uint8Array;
4
+ pub: Uint8Array;
5
+ }
6
+ export interface TeamKeyCrypto {
7
+ randomBytes(length: number): Uint8Array;
8
+ sha256(data: Uint8Array): Promise<Uint8Array>;
9
+ hmacSha256(key: Uint8Array, data: Uint8Array): Promise<Uint8Array>;
10
+ /** AES-GCM with a 16- or 32-byte key; returns ciphertext with the tag at the end. */
11
+ seal(key: Uint8Array, nonce: Uint8Array, data: Uint8Array, aad: Uint8Array): Promise<Uint8Array>;
12
+ /** Throws when the key is wrong or a byte changed. */
13
+ open(key: Uint8Array, nonce: Uint8Array, sealed: Uint8Array, aad: Uint8Array): Promise<Uint8Array>;
14
+ p256Generate(): Promise<P256Pair>;
15
+ /** The shared x coordinate (32 bytes). Throws on a point that isn't on the curve. */
16
+ p256Ecdh(own: P256Pair, peerPub: Uint8Array): Promise<Uint8Array>;
17
+ /** ECDSA over SHA-256 of `message`; 64 bytes, r then s. */
18
+ p256Sign(own: P256Pair, message: Uint8Array): Promise<Uint8Array>;
19
+ /** Takes high-S signatures too: WebCrypto makes them. */
20
+ p256Verify(pub: Uint8Array, message: Uint8Array, signature: Uint8Array): Promise<boolean>;
21
+ }
22
+ export type TeamKeyErrorCode =
23
+ /** A kit that isn't a kit, or the wrong kind. */
24
+ "bad_kit"
25
+ /** The kit is fine but doesn't open this lock. */
26
+ | "wrong_kit"
27
+ /** A record, wrap or card that isn't the right shape. */
28
+ | "bad_shape"
29
+ /** A signature or a key id that doesn't check out. */
30
+ | "untrusted"
31
+ /** Won't open: the wrong key, or a byte changed. */
32
+ | "locked" | "too_big";
33
+ export declare class TeamKeyError extends Error {
34
+ readonly code: TeamKeyErrorCode;
35
+ constructor(code: TeamKeyErrorCode, message: string);
36
+ }
37
+ export declare function concatBytes(...parts: Uint8Array[]): Uint8Array;
38
+ export declare function hkdfExtract(c: TeamKeyCrypto, salt: Uint8Array, ikm: Uint8Array): Promise<Uint8Array>;
39
+ export declare function hkdfExpand(c: TeamKeyCrypto, prk: Uint8Array, info: Uint8Array, length: number): Promise<Uint8Array>;
40
+ export declare function hkdf(c: TeamKeyCrypto, ikm: Uint8Array, info: string, length?: number): Promise<Uint8Array>;
41
+ export declare const HPKE_AES128_GCM = 1;
42
+ export declare const HPKE_AES256_GCM = 2;
43
+ /** Exposed for the RFC vector test. */
44
+ export declare function hpkeKeySchedule(c: TeamKeyCrypto, sharedSecret: Uint8Array, info: Uint8Array, aeadId: number): Promise<{
45
+ key: Uint8Array<ArrayBufferLike>;
46
+ baseNonce: Uint8Array<ArrayBufferLike>;
47
+ }>;
48
+ /**
49
+ * One message to `pkR` (sequence 0). `ephemeral` is for test vectors only;
50
+ * a real seal always makes a fresh one.
51
+ */
52
+ export declare function hpkeSeal(c: TeamKeyCrypto, pkR: Uint8Array, info: Uint8Array, aad: Uint8Array, plaintext: Uint8Array, options?: {
53
+ aeadId?: number;
54
+ ephemeral?: P256Pair;
55
+ }): Promise<{
56
+ enc: Uint8Array;
57
+ ct: Uint8Array;
58
+ sharedSecret: Uint8Array;
59
+ }>;
60
+ export declare function hpkeOpen(c: TeamKeyCrypto, skR: P256Pair, encapped: Uint8Array, info: Uint8Array, aad: Uint8Array, ct: Uint8Array, aeadId?: number): Promise<Uint8Array>;
61
+ export type KitKind = "team" | "admin";
62
+ /** A new kit as text, like `buoy-team-7F3Q-K2M9-…`. Shown once; never sent to Buoy. */
63
+ export declare function makeKit(c: TeamKeyCrypto, kind: KitKind): string;
64
+ export declare function formatKit(kind: KitKind, bytes: Uint8Array): string;
65
+ /** Reads a pasted kit. Spaces, dashes and case don't matter; O reads as 0 and I or L as 1. */
66
+ export declare function parseKit(text: string, kind: KitKind): Uint8Array;
67
+ /** The kit's lock key. */
68
+ export declare function kitKey(c: TeamKeyCrypto, kit: Uint8Array, kind: KitKind): Promise<Uint8Array>;
69
+ /** A short id for a kit, so the server can say which kit locked a key. It can't open anything. */
70
+ export declare function kitId(c: TeamKeyCrypto, kit: Uint8Array, kind: KitKind): Promise<string>;
71
+ /** `nonce | sealed`, as base64url. */
72
+ export declare function lockSecret(c: TeamKeyCrypto, key: Uint8Array, aad: string, secret: Uint8Array): Promise<string>;
73
+ export declare function openSecret(c: TeamKeyCrypto, key: Uint8Array, aad: string, locked: string): Promise<Uint8Array>;
74
+ export declare const rootLockAad: (owner: string, teamKeyId: string) => string;
75
+ export declare const versionLockAad: (owner: string, teamKeyId: string, keyVersion: number) => string;
76
+ /** A private key and its public key, as stored inside a lock. */
77
+ export declare const pairBytes: (pair: P256Pair) => Uint8Array<ArrayBufferLike>;
78
+ export declare function pairFrom(bytes: Uint8Array, expectPub?: Uint8Array): P256Pair;
79
+ /**
80
+ * Checks a private key really belongs to its public key: a pair that doesn't
81
+ * would make wraps no one can open. ECDH with itself and with a fresh key
82
+ * from each side must agree.
83
+ */
84
+ export declare function checkPair(c: TeamKeyCrypto, pair: P256Pair): Promise<void>;
85
+ /** A root's id: the SHA-256 of its public key. Apps can pin it. */
86
+ export declare function teamKeyIdOf(c: TeamKeyCrypto, rootPub: Uint8Array): Promise<string>;
87
+ export interface TeamKeyRecord {
88
+ owner: string;
89
+ teamKeyId: string;
90
+ keyVersion: number;
91
+ /** The version's ECDH public key, base64url. */
92
+ pub: string;
93
+ /** The root's signature over `recordMessage`, base64url. */
94
+ sig: string;
95
+ }
96
+ export declare function recordMessage(owner: string, teamKeyId: string, keyVersion: number, pub: string): Uint8Array;
97
+ export declare function signRecord(c: TeamKeyCrypto, root: P256Pair, owner: string, keyVersion: number, versionPub: Uint8Array): Promise<TeamKeyRecord>;
98
+ /** Throws unless `record` is signed by `rootPub` and names that root. Returns the version's public key. */
99
+ export declare function verifyRecord(c: TeamKeyCrypto, rootPub: Uint8Array, record: TeamKeyRecord): Promise<Uint8Array>;
100
+ export interface CaseKeyParts {
101
+ /** The link's key, base64url (32 bytes). */
102
+ key: string;
103
+ /** 16 random bytes, base64url: goes in the blob's plain header. */
104
+ caseTag: string;
105
+ /** SHA-256 of the key proof, base64url: goes in the blob's plain header. */
106
+ keyProofHash: string;
107
+ }
108
+ export declare function newCaseTag(c: TeamKeyCrypto): string;
109
+ export declare const isCaseTag: (text: unknown) => text is string;
110
+ export declare const isKeyHash: (text: unknown) => text is string;
111
+ /**
112
+ * Proof that someone holds a case's key, without showing the key. The blob's
113
+ * header has its hash, so the server can check a late wrap comes from someone
114
+ * who can open the case.
115
+ */
116
+ export declare function keyProof(c: TeamKeyCrypto, caseKey: string): Promise<string>;
117
+ export declare function keyProofHash(c: TeamKeyCrypto, proof: string): Promise<string>;
118
+ /** A fresh key, a fresh tag, and the key proof's hash, for a new case. */
119
+ export declare function newCaseKeyParts(c: TeamKeyCrypto, existing?: {
120
+ key?: string;
121
+ caseTag?: string;
122
+ }): Promise<CaseKeyParts>;
123
+ export declare const WRAP_SUITE = "P256-SHA256-A256GCM";
124
+ export interface BugWrap {
125
+ v: 1;
126
+ suite: typeof WRAP_SUITE;
127
+ teamKeyId: string;
128
+ keyVersion: number;
129
+ /** The HPKE key share, base64url (65 bytes). */
130
+ enc: string;
131
+ /** The sealed case key, base64url (48 bytes). */
132
+ ct: string;
133
+ }
134
+ export declare const wrapInfo: (owner: string, teamKeyId: string, keyVersion: number, caseTag: string) => Uint8Array<ArrayBufferLike>;
135
+ export declare function wrapCaseKey(c: TeamKeyCrypto, target: {
136
+ owner: string;
137
+ teamKeyId: string;
138
+ keyVersion: number;
139
+ pub: Uint8Array;
140
+ }, caseKey: string, caseTag: string): Promise<BugWrap>;
141
+ export declare function unwrapCaseKey(c: TeamKeyCrypto, wrap: BugWrap, owner: string, versionKey: P256Pair, caseTag: string): Promise<string>;
142
+ /** Rebuilt field by field from untrusted JSON. */
143
+ export declare function parseWrap(raw: unknown): BugWrap;
144
+ export interface BugCardFields {
145
+ note?: string;
146
+ app?: string;
147
+ version?: string;
148
+ build?: string;
149
+ route?: string;
150
+ error?: string;
151
+ sender?: string;
152
+ }
153
+ export interface BugCard extends BugCardFields {
154
+ v: 1;
155
+ caseTag: string;
156
+ /** SHA-256 of the blob this card goes with, base64url. */
157
+ blobSha256: string;
158
+ }
159
+ /** The whole card as JSON stays under this, so the locked card fits in 4 KB. */
160
+ export declare const MAX_CARD_JSON_BYTES = 3800;
161
+ /** Cuts text to at most `maxBytes` of UTF-8, at a whole letter, with "…" when cut. */
162
+ export declare function cutUtf8(text: string, maxBytes: number): string;
163
+ /** Caps each field, then trims the note, the error and the route until the JSON fits. */
164
+ export declare function fitCard(card: BugCard): BugCard;
165
+ export declare function blobSha256(c: TeamKeyCrypto, blob: Uint8Array): Promise<string>;
166
+ /** `nonce | sealed`, as base64url. */
167
+ export declare function sealCard(c: TeamKeyCrypto, caseKey: string, caseTag: string, cardRevision: number, fields: BugCardFields, blob: Uint8Array): Promise<string>;
168
+ export declare function openCard(c: TeamKeyCrypto, caseKey: string, caseTag: string, cardRevision: number, sealed: string): Promise<BugCard>;
169
+ export declare const DEVICE_NONCE_BYTES = 16;
170
+ export declare function newDeviceNonce(c: TeamKeyCrypto): string;
171
+ /** What the new device sends first: a hash of its key and nonce. */
172
+ export declare function deviceCommit(c: TeamKeyCrypto, devicePub: Uint8Array, deviceNonce: string): Promise<string>;
173
+ /** The code both screens show. If they match, no one swapped the device's key. */
174
+ export declare function deviceCode(c: TeamKeyCrypto, check: {
175
+ owner: string;
176
+ requestId: string;
177
+ devicePub: Uint8Array;
178
+ deviceNonce: string;
179
+ approverNonce: string;
180
+ }): Promise<string>;
181
+ /** The approving device seals the team kit to the new device's public key. */
182
+ export declare function sealKitForDevice(c: TeamKeyCrypto, owner: string, requestId: string, devicePub: Uint8Array, kit: Uint8Array): Promise<string>;
183
+ export declare function openKitForDevice(c: TeamKeyCrypto, owner: string, requestId: string, device: P256Pair, sealed: string): Promise<Uint8Array>;
184
+ export declare function webTeamKeyCrypto(): TeamKeyCrypto;
185
+ //# sourceMappingURL=teamKey.d.ts.map
@@ -6,6 +6,7 @@
6
6
  import type { SuperJSONResult } from "../utils/minimalSuperJSON";
7
7
  import type { ScrubbedItem } from "./scrub";
8
8
  import type { BugCaseStep, BugCaseTouch } from "./steps";
9
+ import type { BugCaseMedia } from "./media";
9
10
  export declare const BUG_CASE_VERSION = 1;
10
11
  export interface BugCaseNetworkCall {
11
12
  t: number;
@@ -19,6 +20,8 @@ export interface BugCaseNetworkCall {
19
20
  requestData?: unknown;
20
21
  responseHeaders?: Record<string, string>;
21
22
  responseData?: unknown;
23
+ /** The answer was parsed from JSON text, so a string was a JSON string. Missing in older cases. */
24
+ responseJson?: boolean;
22
25
  /** True when a body was over the case budget and left out. */
23
26
  bodyOmitted?: boolean;
24
27
  }
@@ -48,6 +51,11 @@ export interface BugCase {
48
51
  app: {
49
52
  platform: string;
50
53
  os: string;
54
+ /** Bundle id or package name, when the app could say. */
55
+ id?: string;
56
+ /** The version people see ("4.2.0") and the build number ("4210"), so a load on another build can say so. */
57
+ version?: string;
58
+ build?: string;
51
59
  appearance?: string;
52
60
  locale?: string;
53
61
  timeZone?: string;
@@ -82,6 +90,8 @@ export interface BugCase {
82
90
  /** B2: newest first, with answers for replay. */
83
91
  network: BugCaseNetworkCall[];
84
92
  console: BugCaseConsoleLine[];
93
+ /** Pictures and video, boxed on the phone (media/SPEC.md C1). Old cases and old phones have none. */
94
+ media?: BugCaseMedia;
85
95
  missing: BugCaseMissing[];
86
96
  scrub: {
87
97
  removed: number;
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Check an opened bug case before anyone uses it.
3
+ *
4
+ * A case comes from someone else's phone, and a hand-made blob can say
5
+ * anything. Every reader (the link page, the Mac, the phone's loader) gets the
6
+ * same shapes: wrong-typed parts become empty, oversize text is cut, and a
7
+ * case without its core (version, date, app) is refused.
8
+ */
9
+ import { type BugCase } from "./types";
10
+ export declare class BugCaseShapeError extends Error {
11
+ constructor(part: string);
12
+ }
13
+ export declare function validateBugCase(raw: unknown): BugCase;
14
+ //# sourceMappingURL=validate.d.ts.map
@@ -15,7 +15,7 @@
15
15
  * - Metro sees static imports only
16
16
  * - Works with any Metro version
17
17
  */
18
- export { clipboardFunction, clipboardType, isClipboardAvailable, type ClipboardFunction, } from "./clipboard-impl";
18
+ export { clipboardFunction, clipboardType, isClipboardAvailable, readClipboardText, type ClipboardFunction, } from "./clipboard-impl";
19
19
  import { clipboardFunction } from "./clipboard-impl";
20
20
  /**
21
21
  * Attempts to auto-detect and return a clipboard implementation.
@@ -21,4 +21,10 @@ export type ClipboardFunction = (text: string) => Promise<boolean>;
21
21
  export declare const clipboardType: () => "expo" | "react-native" | "web" | null;
22
22
  export declare const isClipboardAvailable: () => boolean;
23
23
  export declare const clipboardFunction: ClipboardFunction;
24
+ /**
25
+ * The clipboard's text, for a Paste button. Only ever called from a tap: iOS
26
+ * shows its "pasted from" banner for each read, and a silent read on open
27
+ * would show it for nothing (the bug links panels ruled that out).
28
+ */
29
+ export declare const readClipboardText: () => Promise<string | null>;
24
30
  //# sourceMappingURL=clipboard-impl.d.ts.map
@@ -2,4 +2,6 @@ export type ClipboardFunction = (text: string) => Promise<boolean>;
2
2
  export declare const isClipboardAvailable: () => boolean;
3
3
  export declare const clipboardType: () => "web" | null;
4
4
  export declare const clipboardFunction: ClipboardFunction;
5
+ /** The clipboard's text, for a Paste button. Only ever called from a tap. */
6
+ export declare const readClipboardText: () => Promise<string | null>;
5
7
  //# sourceMappingURL=clipboard-impl.web.d.ts.map
@@ -1,4 +1,4 @@
1
1
  export { copyToClipboard } from "./copyToClipboard";
2
- export { createAutoDetectedClipboard, getAutoDetectedClipboard, } from "./autoDetectClipboard";
2
+ export { createAutoDetectedClipboard, getAutoDetectedClipboard, readClipboardText, } from "./autoDetectClipboard";
3
3
  export type { ClipboardFunction } from "./autoDetectClipboard";
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -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