@buoy-gg/shared-ui 7.0.35 → 7.0.36

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 (59) hide show
  1. package/lib/commonjs/hooks/safe-area-impl.js +1 -1
  2. package/lib/commonjs/icons/index.js +7 -0
  3. package/lib/commonjs/index.js +48 -0
  4. package/lib/commonjs/sync/keyedArrays.js +209 -0
  5. package/lib/commonjs/sync/toolAttention.test.js +51 -0
  6. package/lib/commonjs/sync/toolUiBridge.js +58 -0
  7. package/lib/commonjs/sync/typedEdit.js +228 -0
  8. package/lib/commonjs/sync/valuePath.js +337 -0
  9. package/lib/commonjs/sync/valueShape.js +161 -0
  10. package/lib/commonjs/ui/components/ExpandablePopover.js +38 -6
  11. package/lib/module/hooks/safe-area-impl.js +1 -1
  12. package/lib/module/icons/index.js +3 -1
  13. package/lib/module/index.js +4 -0
  14. package/lib/module/sync/keyedArrays.js +204 -0
  15. package/lib/module/sync/toolAttention.test.js +50 -0
  16. package/lib/module/sync/toolUiBridge.js +55 -0
  17. package/lib/module/sync/typedEdit.js +220 -0
  18. package/lib/module/sync/valuePath.js +330 -0
  19. package/lib/module/sync/valueShape.js +153 -0
  20. package/lib/module/ui/components/ExpandablePopover.js +38 -6
  21. package/lib/typescript/commonjs/hooks/safe-area-impl.d.ts +1 -1
  22. package/lib/typescript/commonjs/icons/index.d.ts +1 -1
  23. package/lib/typescript/commonjs/icons/index.d.ts.map +1 -1
  24. package/lib/typescript/commonjs/index.d.ts +4 -0
  25. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  26. package/lib/typescript/commonjs/sync/keyedArrays.d.ts +35 -0
  27. package/lib/typescript/commonjs/sync/keyedArrays.d.ts.map +1 -0
  28. package/lib/typescript/commonjs/sync/toolAttention.test.d.ts +2 -0
  29. package/lib/typescript/commonjs/sync/toolAttention.test.d.ts.map +1 -0
  30. package/lib/typescript/commonjs/sync/toolUiBridge.d.ts +25 -0
  31. package/lib/typescript/commonjs/sync/toolUiBridge.d.ts.map +1 -1
  32. package/lib/typescript/commonjs/sync/typedEdit.d.ts +70 -0
  33. package/lib/typescript/commonjs/sync/typedEdit.d.ts.map +1 -0
  34. package/lib/typescript/commonjs/sync/valuePath.d.ts +52 -0
  35. package/lib/typescript/commonjs/sync/valuePath.d.ts.map +1 -0
  36. package/lib/typescript/commonjs/sync/valueShape.d.ts +77 -0
  37. package/lib/typescript/commonjs/sync/valueShape.d.ts.map +1 -0
  38. package/lib/typescript/commonjs/ui/components/ExpandablePopover.d.ts +14 -1
  39. package/lib/typescript/commonjs/ui/components/ExpandablePopover.d.ts.map +1 -1
  40. package/lib/typescript/module/hooks/safe-area-impl.d.ts +1 -1
  41. package/lib/typescript/module/icons/index.d.ts +1 -1
  42. package/lib/typescript/module/icons/index.d.ts.map +1 -1
  43. package/lib/typescript/module/index.d.ts +4 -0
  44. package/lib/typescript/module/index.d.ts.map +1 -1
  45. package/lib/typescript/module/sync/keyedArrays.d.ts +35 -0
  46. package/lib/typescript/module/sync/keyedArrays.d.ts.map +1 -0
  47. package/lib/typescript/module/sync/toolAttention.test.d.ts +2 -0
  48. package/lib/typescript/module/sync/toolAttention.test.d.ts.map +1 -0
  49. package/lib/typescript/module/sync/toolUiBridge.d.ts +25 -0
  50. package/lib/typescript/module/sync/toolUiBridge.d.ts.map +1 -1
  51. package/lib/typescript/module/sync/typedEdit.d.ts +70 -0
  52. package/lib/typescript/module/sync/typedEdit.d.ts.map +1 -0
  53. package/lib/typescript/module/sync/valuePath.d.ts +52 -0
  54. package/lib/typescript/module/sync/valuePath.d.ts.map +1 -0
  55. package/lib/typescript/module/sync/valueShape.d.ts +77 -0
  56. package/lib/typescript/module/sync/valueShape.d.ts.map +1 -0
  57. package/lib/typescript/module/ui/components/ExpandablePopover.d.ts +14 -1
  58. package/lib/typescript/module/ui/components/ExpandablePopover.d.ts.map +1 -1
  59. package/package.json +4 -4
@@ -0,0 +1,330 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Addressing a single value inside cached data or a store — one implementation,
5
+ * shared by every adapter that reads or merges.
6
+ *
7
+ * WHY. The most common measured write failure is not a wrong value, it is a
8
+ * wrong DEPTH: ten of eleven `query` failures on the bench sent `{name: "x"}`
9
+ * for a payload shaped `{item: {name}}`. That is not a missing instruction — the
10
+ * system prompt says, verbatim, "if the value is {item:{name}} send
11
+ * {"item":{"name":"test123"}}, never {name}" — and models that had just called
12
+ * `getQueryData` still flattened it. The rule is being read past, not missed.
13
+ *
14
+ * So stop asking. `path: "item.name", value: "x"` has no depth to get wrong:
15
+ * there is exactly one way to write it and the adapter builds the nested patch.
16
+ * The same syntax on the READ side returns one slice instead of a payload that
17
+ * gets cut off at the engine's 24,000-character cap, which is the other half of
18
+ * the same problem — a caller cannot write a shape it was never able to see.
19
+ *
20
+ * Lists are addressed by IDENTITY, never by position. `lines[0]` is resolved to
21
+ * the id of whatever is at index 0 right now and rewritten as an id-addressed
22
+ * edit, because between the read and the write an item may have been removed and
23
+ * index 0 is then a different row. A list whose items carry no stable id is
24
+ * refused rather than guessed at — see keyedArrays.ts for why silently picking a
25
+ * row is the failure mode that loses data.
26
+ */
27
+ import { identityField } from "./keyedArrays.js";
28
+ const isPlainObject = v => typeof v === "object" && v !== null && !Array.isArray(v);
29
+ /**
30
+ * Where a field of this name actually lives, as a dotted path — breadth-first,
31
+ * capped so a big payload cannot stall the walk.
32
+ *
33
+ * A wrong `path` is not the same mistake as a wrong depth, and `path` does not
34
+ * prevent it. Measured on TWO cases in one run: grok wrote
35
+ * `path: "item.name"` against the flat PokéAPI payload `{name, id, stats, …}`,
36
+ * having generalised the shape from a different screen it had seen. The value it
37
+ * wanted was at `name`, one segment, right there. A refusal that says so is a
38
+ * one-turn recovery; a refusal that only lists the available fields makes the
39
+ * caller re-derive it.
40
+ */
41
+ function findFieldPath(obj, key, maxNodes = 2000) {
42
+ const queue = [{
43
+ node: obj,
44
+ path: ""
45
+ }];
46
+ let seen = 0;
47
+ while (queue.length && seen < maxNodes) {
48
+ const {
49
+ node,
50
+ path
51
+ } = queue.shift();
52
+ seen++;
53
+ if (Array.isArray(node)) {
54
+ node.slice(0, 20).forEach((v, i) => queue.push({
55
+ node: v,
56
+ path: `${path}[${i}]`
57
+ }));
58
+ } else if (isPlainObject(node)) {
59
+ for (const [k, v] of Object.entries(node)) {
60
+ const p = path ? `${path}.${k}` : k;
61
+ if (k === key) return p;
62
+ if (isPlainObject(v) || Array.isArray(v)) queue.push({
63
+ node: v,
64
+ path: p
65
+ });
66
+ }
67
+ }
68
+ }
69
+ return undefined;
70
+ }
71
+
72
+ /**
73
+ * "No field X here" plus, when the field exists somewhere else, the path that
74
+ * would have worked. `leaf` is the segment the caller was ultimately after.
75
+ */
76
+ function missingFieldError(root, at, key, available, leaf) {
77
+ const elsewhere = findFieldPath(root, leaf ?? key);
78
+ const has = available.slice(0, 12).join(", ") || "(no fields)";
79
+ return elsewhere ? `No field "${key}" at "${at}" — did you mean path "${elsewhere}"? "${at}" has: ${has}.` : `No field "${key}" at "${at}". It has: ${has}.`;
80
+ }
81
+
82
+ /** Read a dotted field path inside one list item. */
83
+ function fieldOf(item, field) {
84
+ let cur = item;
85
+ for (const seg of field.split(".")) {
86
+ if (!isPlainObject(cur)) return undefined;
87
+ cur = cur[seg];
88
+ }
89
+ return cur;
90
+ }
91
+
92
+ /**
93
+ * `lines[0].addonIds`, `item.name`, `results[name=pikachu].url` → segments.
94
+ *
95
+ * Returns undefined for syntax it does not understand rather than doing
96
+ * something approximate with it.
97
+ */
98
+ export function parsePath(path) {
99
+ if (!path.trim()) return undefined;
100
+ const out = [];
101
+ // Walk the string rather than splitting on ".", because a [field=value]
102
+ // selector may legitimately contain a dot ("results[url=a.b/c]").
103
+ let i = 0;
104
+ while (i < path.length) {
105
+ if (path[i] === ".") {
106
+ i++;
107
+ continue;
108
+ }
109
+ if (path[i] === "[") {
110
+ const end = path.indexOf("]", i);
111
+ if (end === -1) return undefined;
112
+ const inner = path.slice(i + 1, end);
113
+ if (/^\d+$/.test(inner)) out.push({
114
+ kind: "index",
115
+ index: Number(inner)
116
+ });else {
117
+ const eq = inner.indexOf("=");
118
+ if (eq <= 0) return undefined;
119
+ out.push({
120
+ kind: "match",
121
+ field: inner.slice(0, eq).trim(),
122
+ value: inner.slice(eq + 1).trim()
123
+ });
124
+ }
125
+ i = end + 1;
126
+ continue;
127
+ }
128
+ let j = i;
129
+ while (j < path.length && path[j] !== "." && path[j] !== "[") j++;
130
+ const key = path.slice(i, j);
131
+ if (!key) return undefined;
132
+ out.push({
133
+ kind: "key",
134
+ key
135
+ });
136
+ i = j;
137
+ }
138
+ return out.length ? out : undefined;
139
+ }
140
+
141
+ /** Read the value at `path`, or undefined if any step of it does not exist. */
142
+ export function readPath(value, path) {
143
+ const segs = parsePath(path);
144
+ if (!segs) return {
145
+ ok: false,
146
+ error: `Could not read the path "${path}". Use dotted keys with optional [0] or [field=value], like "item.name" or "lines[lineId=seed-1].qty".`
147
+ };
148
+ let cur = value;
149
+ const walked = [];
150
+ for (const seg of segs) {
151
+ if (cur === null || cur === undefined) {
152
+ return {
153
+ ok: false,
154
+ error: `"${walked.join(".") || "(root)"}" is ${cur === null ? "null" : "not set"}, so there is nothing at "${path}".`
155
+ };
156
+ }
157
+ if (seg.kind === "key") {
158
+ if (!isPlainObject(cur)) return {
159
+ ok: false,
160
+ error: `"${walked.join(".") || "(root)"}" is not an object, so it has no field "${seg.key}".`
161
+ };
162
+ if (!(seg.key in cur)) {
163
+ const leafSeg = segs[segs.length - 1];
164
+ return {
165
+ ok: false,
166
+ error: missingFieldError(value, walked.join(".") || "(root)", seg.key, Object.keys(cur), leafSeg?.kind === "key" ? leafSeg.key : undefined)
167
+ };
168
+ }
169
+ cur = cur[seg.key];
170
+ walked.push(seg.key);
171
+ } else if (seg.kind === "index") {
172
+ if (!Array.isArray(cur)) return {
173
+ ok: false,
174
+ error: `"${walked.join(".") || "(root)"}" is not a list, so [${seg.index}] means nothing.`
175
+ };
176
+ cur = cur[seg.index];
177
+ walked.push(`[${seg.index}]`);
178
+ } else {
179
+ if (!Array.isArray(cur)) return {
180
+ ok: false,
181
+ error: `"${walked.join(".") || "(root)"}" is not a list, so [${seg.field}=${seg.value}] means nothing.`
182
+ };
183
+ const hit = cur.find(el => isPlainObject(el) && String(fieldOf(el, seg.field)) === seg.value);
184
+ if (hit === undefined) return {
185
+ ok: false,
186
+ error: `No item with ${seg.field}="${seg.value}" in "${walked.join(".") || "(root)"}".`
187
+ };
188
+ cur = hit;
189
+ walked.push(`[${seg.field}=${seg.value}]`);
190
+ }
191
+ }
192
+ return {
193
+ ok: true,
194
+ value: cur
195
+ };
196
+ }
197
+
198
+ /**
199
+ * Build the merge patch that sets `path` to `value`, against the data as it is
200
+ * now.
201
+ *
202
+ * The result is an ordinary merge patch, so it goes through the SAME typed-edit
203
+ * guard as a hand-written one and gains no new powers — `path` is a way to say
204
+ * the same thing without being able to get the depth wrong, not a way around
205
+ * the rules. A list step becomes the id-addressed form, so the write stays
206
+ * proof against a truncated read.
207
+ */
208
+ export function patchFromPath(current, path, value) {
209
+ const segs = parsePath(path);
210
+ if (!segs) return {
211
+ ok: false,
212
+ error: `Could not read the path "${path}". Use dotted keys with optional [0] or [field=value], like "item.name" or "lines[lineId=seed-1].qty".`
213
+ };
214
+ if (segs[0]?.kind !== "key") return {
215
+ ok: false,
216
+ error: `A path must start with a field name, not a list index — "${path}" does not say which list.`
217
+ };
218
+ const build = (node, at) => {
219
+ if (at >= segs.length) return {
220
+ ok: true,
221
+ patch: value
222
+ };
223
+ const seg = segs[at];
224
+ if (seg.kind === "key") {
225
+ // A field that does not exist is left for the typed-edit guard, which owns
226
+ // that decision — EXCEPT when there are more segments to walk, because
227
+ // then the caller is describing a shape that is not there at all and the
228
+ // guard's message ("no field named `item`") would not say where the value
229
+ // it wanted actually lives.
230
+ if (isPlainObject(node) && !(seg.key in node) && at + 1 < segs.length) {
231
+ const leafSeg = segs[segs.length - 1];
232
+ return {
233
+ ok: false,
234
+ error: missingFieldError(current, pathUpTo(segs, at), seg.key, Object.keys(node), leafSeg?.kind === "key" ? leafSeg.key : undefined)
235
+ };
236
+ }
237
+ const child = isPlainObject(node) ? node[seg.key] : undefined;
238
+ const inner = build(child, at + 1);
239
+ return inner.ok ? {
240
+ ok: true,
241
+ patch: {
242
+ [seg.key]: inner.patch
243
+ }
244
+ } : inner;
245
+ }
246
+ if (!Array.isArray(node)) {
247
+ return {
248
+ ok: false,
249
+ error: `"${pathUpTo(segs, at)}" is not a list, so "${path}" cannot be resolved. Read it first — \`shape\` on the read says what each field holds.`
250
+ };
251
+ }
252
+ const index = seg.kind === "index" ? seg.index : node.findIndex(el => isPlainObject(el) && String(fieldOf(el, seg.field)) === seg.value);
253
+ const item = index >= 0 ? node[index] : undefined;
254
+ const missing = seg.kind === "index" ? index < 0 || index >= node.length : index < 0;
255
+ if (missing) {
256
+ return {
257
+ ok: false,
258
+ error: seg.kind === "index" ? `"${pathUpTo(segs, at)}" has ${node.length} item(s), so there is nothing at [${seg.index}].` : `No item with ${seg.field}="${seg.value}" in "${pathUpTo(segs, at)}".`
259
+ };
260
+ }
261
+ /**
262
+ * A list of PRIMITIVES, addressed by index — `tags[0]` on
263
+ * `["alpha","beta"]`.
264
+ *
265
+ * The guard below used to be `!isPlainObject(item)`, which folded this in
266
+ * with a genuinely out-of-range index and answered `"tags" has 2 item(s),
267
+ * so there is nothing at [0]` — a sentence that contradicts itself, for the
268
+ * commonest index there is. A model reading the data, seeing two items and
269
+ * being told [0] and [1] are both empty has nowhere left to go.
270
+ *
271
+ * There is nothing to descend into on a string, so the index IS the leaf:
272
+ * rebuild the list with that one element replaced, exactly as the no-stable-id
273
+ * branch below does. Anything deeper genuinely cannot be resolved, and says so.
274
+ */
275
+ if (!isPlainObject(item)) {
276
+ if (at < segs.length - 1) {
277
+ return {
278
+ ok: false,
279
+ error: `"${pathUpTo(segs, at)}[${seg.kind === "index" ? seg.index : `${seg.field}=${seg.value}`}]" holds ${item === null ? "null" : typeof item}, not an object, so "${path}" cannot go any deeper. Set the item itself.`
280
+ };
281
+ }
282
+ const replaced = node.slice();
283
+ replaced[index] = value;
284
+ return {
285
+ ok: true,
286
+ patch: replaced
287
+ };
288
+ }
289
+ const inner = build(item, at + 1);
290
+ if (!inner.ok) return inner;
291
+ const idField = identityField(node);
292
+ // Positions move; ids do not. Prefer the addressed form whichever way the
293
+ // caller named the row.
294
+ if (idField) return {
295
+ ok: true,
296
+ patch: {
297
+ [String(item[idField])]: inner.patch
298
+ }
299
+ };
300
+
301
+ // No stable id — a Pokémon's `stats` are `{stat: {name}, base_stat}`, with
302
+ // nothing flat and unique on the item itself, and that is an ordinary shape
303
+ // rather than a broken one. Rebuild the whole list here instead of refusing.
304
+ //
305
+ // This is safe in a way the SAME array coming from a model is not: we are
306
+ // holding the current list in memory, so nothing is being reconstructed from
307
+ // a truncated read and no row can be dropped by omission. The caller still
308
+ // only named one value. What it cannot be is proof against the list changing
309
+ // between this call and the write, which addressing by id would be — so the
310
+ // id form stays preferred wherever one exists.
311
+ const next = node.slice();
312
+ next[index] = isPlainObject(inner.patch) ? {
313
+ ...item,
314
+ ...inner.patch
315
+ } : inner.patch;
316
+ return {
317
+ ok: true,
318
+ patch: next
319
+ };
320
+ };
321
+ const built = build(current, 0);
322
+ if (!built.ok) return built;
323
+ return {
324
+ ok: true,
325
+ patch: built.patch
326
+ };
327
+ }
328
+ function pathUpTo(segs, at) {
329
+ return segs.slice(0, at).map(s => s.kind === "key" ? s.key : s.kind === "index" ? `[${s.index}]` : `[${s.field}=${s.value}]`).join(".").replace(/\.\[/g, "[") || "(root)";
330
+ }
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * A compact type sketch of a runtime value — one implementation, shared by every
5
+ * adapter that hands data to a model.
6
+ *
7
+ * WHY. A model cannot write a well-formed item into a list it has never seen the
8
+ * shape of, and we were not showing it. Measured on `cart/bag-still-zustand`: the
9
+ * rendered prompt is 83,000 characters and the words `lineId`, `itemId`,
10
+ * `sizeId`, `addonIds` and `unitPrice` appear in it ZERO times. Every model
11
+ * "failing" that case invented a line shape because inventing was the only move
12
+ * available. The zustand typed-edit guard would have caught the invention — but
13
+ * only on a list that already holds an item, since it builds its template from
14
+ * `list[0]`. On an EMPTY list there is no template, the guard has nothing to
15
+ * compare against, and the invented shape is written silently.
16
+ *
17
+ * So the sketch has two jobs, and the second is the one that pays:
18
+ *
19
+ * 1. Say what the items in a list look like, so an addition can match.
20
+ * 2. Say when NOTHING knows — an empty list's item shape is not merely
21
+ * unread, it is unknowable from runtime state, and the honest answer is to
22
+ * admit that rather than let a guess through unremarked.
23
+ *
24
+ * It is deliberately tiny. A sketch of a 120-line bag is the same size as a
25
+ * sketch of a 2-line one, so unlike the data it survives the engine's 24,000-
26
+ * character result cap — which is the whole point, because the cases where the
27
+ * model most needs the shape are exactly the ones where the data got cut off.
28
+ */
29
+
30
+ const isPlainObject = v => typeof v === "object" && v !== null && !Array.isArray(v);
31
+
32
+ /** Beyond this the sketch stops being cheaper to read than the data. */
33
+ const MAX_DEPTH = 3;
34
+ const MAX_KEYS = 24;
35
+ /**
36
+ * Hard caps on `listShapes`. MAX_DEPTH bounds how DEEP it goes; nothing bounded
37
+ * how WIDE it went, and it walks every entry of every object at each permitted
38
+ * level. A store holding a few hundred keyed records therefore produced a
39
+ * "compact" sketch larger than the data it was standing in for — in a value
40
+ * that rides in every prompt. Depth is not a size budget.
41
+ */
42
+ const MAX_LIST_PATHS = 40;
43
+ const MAX_ENTRIES_VISITED = 600;
44
+
45
+ /**
46
+ * `{lineId: string, qty: number, addonIds: string[]}` — a one-line type for a
47
+ * value, built from the value itself.
48
+ *
49
+ * An array is described by its FIRST item, because a list whose items disagree
50
+ * is a list nothing can safely add to and the guard will say so anyway. An empty
51
+ * array is `unknown[]`, which is the true answer and the one that matters: it
52
+ * tells a reader that adding to this list is unchecked.
53
+ */
54
+ export function shapeOf(value, depth = 0) {
55
+ if (value === null) return "null";
56
+ if (Array.isArray(value)) {
57
+ if (!value.length) return "unknown[]";
58
+ if (depth >= MAX_DEPTH) return "…[]";
59
+ const inner = shapeOf(value[0], depth + 1);
60
+ return inner.includes(" ") || inner.endsWith("]") ? `(${inner})[]` : `${inner}[]`;
61
+ }
62
+ if (isPlainObject(value)) {
63
+ if (depth >= MAX_DEPTH) return "{…}";
64
+ const keys = Object.keys(value);
65
+ const shown = keys.slice(0, MAX_KEYS);
66
+ const body = shown.map(k => `${k}: ${shapeOf(value[k], depth + 1)}`).join(", ");
67
+ const more = keys.length > shown.length ? `, +${keys.length - shown.length} more` : "";
68
+ return `{${body}${more}}`;
69
+ }
70
+ const t = typeof value;
71
+ return t === "undefined" ? "undefined" : t === "function" ? "function" : t;
72
+ }
73
+ /**
74
+ * Every list inside a value, with the shape of what goes in it.
75
+ *
76
+ * This is what a caller needs before adding to a list, and it is the part that
77
+ * cannot be recovered from a truncated read of the data itself.
78
+ *
79
+ * A list with `item: undefined` is the warning case: it is empty, so its item
80
+ * shape exists nowhere in the running app — not in the store, not in the
81
+ * persisted copy, not in this sketch. Anything added to it goes in unchecked.
82
+ */
83
+ export function listShapes(value, path = "", out = [], depth = 0, budget = {
84
+ visited: 0
85
+ }) {
86
+ if (depth > MAX_DEPTH) return out;
87
+ // Two independent stops: enough lists described, or enough of the value
88
+ // walked. The second is what a wide-but-shallow store hits.
89
+ if (out.length >= MAX_LIST_PATHS || budget.visited >= MAX_ENTRIES_VISITED) return out;
90
+ if (Array.isArray(value)) {
91
+ const first = value[0];
92
+ out.push({
93
+ path: path || "(root)",
94
+ length: value.length,
95
+ ...(value.length ? {
96
+ item: shapeOf(first)
97
+ } : {})
98
+ });
99
+ // One level into the items, so `lines[].addonIds` is reachable too.
100
+ if (value.length && isPlainObject(first)) {
101
+ for (const [k, v] of Object.entries(first)) {
102
+ if (++budget.visited >= MAX_ENTRIES_VISITED) break;
103
+ listShapes(v, path ? `${path}[].${k}` : `[].${k}`, out, depth + 1, budget);
104
+ }
105
+ }
106
+ return out;
107
+ }
108
+ if (isPlainObject(value)) {
109
+ for (const [k, v] of Object.entries(value)) {
110
+ if (++budget.visited >= MAX_ENTRIES_VISITED) break;
111
+ listShapes(v, path ? `${path}.${k}` : k, out, depth + 1, budget);
112
+ }
113
+ }
114
+ return out;
115
+ }
116
+
117
+ /** True when a sketch stopped early, so a caller can say so rather than imply completeness. */
118
+ export function shapesWereTruncated(value) {
119
+ const budget = {
120
+ visited: 0
121
+ };
122
+ const out = listShapes(value, "", [], 0, budget);
123
+ return out.length >= MAX_LIST_PATHS || budget.visited >= MAX_ENTRIES_VISITED;
124
+ }
125
+
126
+ /**
127
+ * The lists in a value that a caller could add to WITHOUT any way to know the
128
+ * item shape. Empty by definition on a healthy value; non-empty means a write
129
+ * into one of these paths cannot be checked by anything.
130
+ */
131
+ export function unshapedLists(value) {
132
+ return listShapes(value).filter(l => l.item === undefined).map(l => l.path);
133
+ }
134
+
135
+ /**
136
+ * The sketch an adapter attaches to a read: the value's own type, plus the item
137
+ * type of every list in it.
138
+ *
139
+ * Returns undefined when there is nothing worth saying (a scalar, or an object
140
+ * holding no lists) so adapters can spread it and add no noise.
141
+ */
142
+ export function shapeSummary(value) {
143
+ if (value === undefined) return undefined;
144
+ const lists = listShapes(value);
145
+ const shape = shapeOf(value);
146
+ if (!lists.length && !isPlainObject(value) && !Array.isArray(value)) return undefined;
147
+ return lists.length ? {
148
+ shape,
149
+ lists
150
+ } : {
151
+ shape
152
+ };
153
+ }
@@ -29,7 +29,8 @@ function CollapsedPeek({
29
29
  height,
30
30
  customContent,
31
31
  label,
32
- testID
32
+ testID,
33
+ attention
33
34
  }) {
34
35
  // When progress=0 (collapsed): peek is visible (opacity=1, scale=1)
35
36
  // When progress=1 (expanded): peek is hidden (opacity=0, scale=0.9)
@@ -49,17 +50,17 @@ function CollapsedPeek({
49
50
  scale
50
51
  }]
51
52
  }],
52
- children: /*#__PURE__*/_jsx(TouchableOpacity, {
53
+ children: /*#__PURE__*/_jsxs(TouchableOpacity, {
53
54
  onPress: onPress,
54
55
  activeOpacity: 0.8,
55
56
  style: [styles.peekButton, {
56
57
  width,
57
58
  height
58
59
  }],
59
- accessibilityLabel: label || `Expand options`,
60
+ accessibilityLabel: attention?.label ? `${label || "Expand options"} — ${attention.label}` : label || `Expand options`,
60
61
  accessibilityRole: "button",
61
62
  testID: testID,
62
- children: customContent || /*#__PURE__*/_jsxs(_Fragment, {
63
+ children: [customContent || /*#__PURE__*/_jsxs(_Fragment, {
63
64
  children: [/*#__PURE__*/_jsx(ChevronUp, {
64
65
  size: 12,
65
66
  color: buoyColors.textMuted,
@@ -68,7 +69,17 @@ function CollapsedPeek({
68
69
  style: styles.peekCount,
69
70
  children: count
70
71
  })]
71
- })
72
+ }), attention ? /*#__PURE__*/_jsx(View, {
73
+ pointerEvents: "none",
74
+ testID: testID ? `${testID}-attention` : undefined,
75
+ style: [styles.peekAttention, {
76
+ backgroundColor: attention.color
77
+ }],
78
+ children: attention.glyph ? /*#__PURE__*/_jsx(Text, {
79
+ style: styles.peekAttentionGlyph,
80
+ children: attention.glyph
81
+ }) : null
82
+ }) : null]
72
83
  })
73
84
  });
74
85
  }
@@ -138,6 +149,7 @@ export function ExpandablePopover({
138
149
  defaultExpanded = false,
139
150
  collapsedContent,
140
151
  collapsedLabel,
152
+ attention = null,
141
153
  expandedStyle,
142
154
  persistState = false,
143
155
  storageKey,
@@ -267,7 +279,8 @@ export function ExpandablePopover({
267
279
  height: peekHeight,
268
280
  customContent: collapsedContent,
269
281
  label: collapsedLabel,
270
- testID: testID
282
+ testID: testID,
283
+ attention: attention
271
284
  })
272
285
  })]
273
286
  });
@@ -278,6 +291,25 @@ export function ExpandablePopover({
278
291
  // ============================================================================
279
292
 
280
293
  const styles = StyleSheet.create({
294
+ peekAttention: {
295
+ position: "absolute",
296
+ top: 2,
297
+ right: 2,
298
+ minWidth: 11,
299
+ height: 11,
300
+ borderRadius: 6,
301
+ paddingHorizontal: 2,
302
+ alignItems: "center",
303
+ justifyContent: "center",
304
+ borderWidth: 1.5,
305
+ borderColor: "#0C0C0C"
306
+ },
307
+ peekAttentionGlyph: {
308
+ color: "#000",
309
+ fontSize: 8,
310
+ fontWeight: "800",
311
+ lineHeight: 9
312
+ },
281
313
  container: {
282
314
  overflow: "visible",
283
315
  zIndex: 1000
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Auto-generated safe area implementation
3
3
  * Detected: none
4
- * Generated at: 2026-09-04T23:36:20.710Z
4
+ * Generated at: 2026-09-10T21:40:50.832Z
5
5
  *
6
6
  * DO NOT EDIT - This file is generated by scripts/detect-safe-area.js
7
7
  *
@@ -20,7 +20,7 @@ export { RenderCountIcon } from "./RenderCountIcon";
20
20
  export { BenchmarkIcon as BenchmarkLegacyIcon } from "./BenchmarkIcon";
21
21
  export { IconBackground } from "./IconBackground";
22
22
  export * from "./lucide-icons";
23
- export { ActivityGlyph as Activity, AlertCircleGlyph as AlertCircle, AlertTriangleGlyph as AlertTriangle, BookmarkGlyph as Bookmark, BoxGlyph as Box, BugGlyph as Bug, CheckCircleGlyph as CheckCircle, CheckGlyph as Check, ChevronDownGlyph as ChevronDown, ChevronLeftGlyph as ChevronLeft, ChevronRightGlyph as ChevronRight, ChevronUpGlyph as ChevronUp, ClockGlyph as Clock, CopyGlyph as Copy, DatabaseGlyph as Database, DockBottomGlyph as DockBottom, DownloadGlyph as Download, Edit3Glyph as Edit3, EyeOffGlyph as EyeOff, EyeGlyph as Eye, FileJsonGlyph as FileJson, FileTextGlyph as FileText, FilmGlyph as Film, FilterGlyph as Filter, FlaskConicalGlyph as FlaskConical, FloatWindowGlyph as FloatWindow, GitBranchGlyph as GitBranch, GlobeGlyph as Globe, HashGlyph as Hash, HomeGlyph as Home, ImageGlyph as Image, InfoGlyph as Info, KeyGlyph as Key, LayersGlyph as Layers, LinkGlyph as Link, LockGlyph as Lock, MinusGlyph as Minus, MusicGlyph as Music, NavigationGlyph as Navigation, PaletteGlyph as Palette, PauseGlyph as Pause, PlayGlyph as Play, PlusGlyph as Plus, PowerGlyph as Power, RefreshCwGlyph as RefreshCw, SearchGlyph as Search, ServerGlyph as Server, SettingsGlyph as Settings, ShieldGlyph as Shield, Trash2Glyph as Trash2, Trash2Glyph as Trash, UnlockGlyph as Unlock, UploadGlyph as Upload, UserGlyph as User, WifiGlyph as Wifi, XCircleGlyph as XCircle, XGlyph as X, ZapGlyph as Zap, } from "@buoy-gg/floating-tools-core";
23
+ export { ActivityGlyph as Activity, AlertCircleGlyph as AlertCircle, AlertTriangleGlyph as AlertTriangle, BookmarkGlyph as Bookmark, BoxGlyph as Box, BugGlyph as Bug, CheckCircleGlyph as CheckCircle, CheckGlyph as Check, ChevronDownGlyph as ChevronDown, ChevronLeftGlyph as ChevronLeft, ChevronRightGlyph as ChevronRight, ChevronUpGlyph as ChevronUp, ClockGlyph as Clock, CopyGlyph as Copy, DatabaseGlyph as Database, DockBottomGlyph as DockBottom, DownloadGlyph as Download, Edit3Glyph as Edit3, EyeOffGlyph as EyeOff, EyeGlyph as Eye, FileJsonGlyph as FileJson, FileTextGlyph as FileText, FilmGlyph as Film, FilterGlyph as Filter, FlaskConicalGlyph as FlaskConical, FloatWindowGlyph as FloatWindow, GitBranchGlyph as GitBranch, GlobeGlyph as Globe, HashGlyph as Hash, HomeGlyph as Home, ImageGlyph as Image, InfoGlyph as Info, KeyGlyph as Key, LayersGlyph as Layers, LinkGlyph as Link, LockGlyph as Lock, MinusGlyph as Minus, MusicGlyph as Music, NavigationGlyph as Navigation, PaletteGlyph as Palette, PauseGlyph as Pause, PlayGlyph as Play, PlusGlyph as Plus, PowerGlyph as Power, RefreshCwGlyph as RefreshCw, SearchGlyph as Search, ServerGlyph as Server, SettingsGlyph as Settings, SettingsSolidIcon as SettingsSolid, ShieldGlyph as Shield, Trash2Glyph as Trash2, Trash2Glyph as Trash, UnlockGlyph as Unlock, UploadGlyph as Upload, UserGlyph as User, WifiGlyph as Wifi, XCircleGlyph as XCircle, XGlyph as X, ZapGlyph as Zap, } from "@buoy-gg/floating-tools-core";
24
24
  export { SentryIcon, EventsIcon, RoutesIcon, RoutePinIcon, RoutePathIcon, RouteDotIcon, RouteTwoPinsIcon, CameraIcon, HighlightIcon, ReduxIcon, StorageIcon, AskBuoyIcon, HighlighterIcon, QueryIcon, ScenariosIcon } from "@buoy-gg/floating-tools-core";
25
25
  export { WifiIcon as WifiBifIcon, BenchmarkIcon, BENCHMARK_ICON_COLOR } from "@buoy-gg/floating-tools-core";
26
26
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/icons/index.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/icons/index.tsx"],"names":[],"mappings":"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"}
@@ -1,5 +1,9 @@
1
1
  export * from "./ui";
2
2
  export * from "./stores";
3
+ export * from "./sync/keyedArrays";
4
+ export * from "./sync/valueShape";
5
+ export * from "./sync/valuePath";
6
+ export * from "./sync/typedEdit";
3
7
  export * from "./sync/wireBudget";
4
8
  export * from "./sync/wireForm";
5
9
  export * from "./sync/toolSyncAdapter";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AACA,cAAc,MAAM,CAAC;AAGrB,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AAGpC,OAAO,EAEL,YAAY,EAEZ,YAAY,EACZ,iBAAiB,EAEjB,iBAAiB,EAEjB,iBAAiB,EACjB,wBAAwB,EACxB,qBAAqB,EAErB,aAAa,EAEb,YAAY,EACZ,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,kBAAkB,EAClB,OAAO,EACP,YAAY,EAEZ,UAAU,EACV,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,UAAU,EAEV,kBAAkB,EAClB,uBAAuB,EAEvB,wBAAwB,EACxB,wBAAwB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,iBAAiB,EAEtB,6BAA6B,EAC7B,yBAAyB,EACzB,wBAAwB,EACxB,iCAAiC,EACjC,KAAK,qBAAqB,EAC1B,KAAK,2BAA2B,EAChC,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,EAC/B,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC7B,KAAK,2BAA2B,EAEhC,kBAAkB,EAClB,oBAAoB,EACpB,KAAK,eAAe,EAEpB,SAAS,EACT,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACtB,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAG3B,kBAAkB,EAElB,YAAY,EACZ,KAAK,oBAAoB,EAEzB,uBAAuB,EACvB,iCAAiC,EACjC,2BAA2B,EAE3B,aAAa,EACb,eAAe,EACf,eAAe,EACf,yBAAyB,EACzB,aAAa,EACb,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAGjD,OAAO,EACL,8BAA8B,EAC9B,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,SAAS,EACT,SAAS,EACT,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,aAAa,GACnB,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,GACxB,MAAM,oBAAoB,CAAC;AAG5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAG7B,OAAO,EAAE,aAAa,IAAI,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGzE,cAAc,SAAS,CAAC;AAGxB,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,wBAAwB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,EAC9B,aAAa,EACb,aAAa,EACb,aAAa,EACb,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,YAAY,GAClB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGvD,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,SAAS,EACT,cAAc,EACd,SAAS,EACT,WAAW,EACX,SAAS,EACT,WAAW,EACX,cAAc,EACd,UAAU,GACX,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,kBAAkB,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE1F,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAE9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,+CAA+C,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAChE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAEvF,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,YAAY,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAE5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,YAAY,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAE1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAC5E,YAAY,EAAE,8BAA8B,EAAE,MAAM,iCAAiC,CAAC;AACtF,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAGrD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAG7E,cAAc,WAAW,CAAC;AAG1B,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,YAAY,EAAE,iBAAiB,EAAE,QAAQ,EAAE,eAAe,EAAE,iBAAiB,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC3R,YAAY,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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"}