@buoy-gg/agent-core 7.0.39 → 7.0.41
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.
- package/lib/commonjs/catalog/catalog.g.js +364 -15
- package/lib/commonjs/catalog/catalog.g.js.map +1 -1
- package/lib/commonjs/catalog/catalog.source.json +407 -12
- package/lib/commonjs/catalog/catalog.types.g.js +6 -4
- package/lib/commonjs/catalog/catalog.types.g.js.map +1 -1
- package/lib/commonjs/effects/ledger.js +20 -0
- package/lib/commonjs/effects/ledger.js.map +1 -1
- package/lib/commonjs/engine/effectFor.js +47 -0
- package/lib/commonjs/engine/effectFor.js.map +1 -1
- package/lib/commonjs/engine/runAgentTurn.js +37 -4
- package/lib/commonjs/engine/runAgentTurn.js.map +1 -1
- package/lib/module/catalog/catalog.g.js +364 -15
- package/lib/module/catalog/catalog.g.js.map +1 -1
- package/lib/module/catalog/catalog.source.json +407 -12
- package/lib/module/catalog/catalog.types.g.js +6 -4
- package/lib/module/catalog/catalog.types.g.js.map +1 -1
- package/lib/module/effects/ledger.js +20 -0
- package/lib/module/effects/ledger.js.map +1 -1
- package/lib/module/engine/effectFor.js +47 -0
- package/lib/module/engine/effectFor.js.map +1 -1
- package/lib/module/engine/runAgentTurn.js +37 -4
- package/lib/module/engine/runAgentTurn.js.map +1 -1
- package/lib/typescript/catalog/catalog.g.d.ts +3 -3
- package/lib/typescript/catalog/catalog.g.d.ts.map +1 -1
- package/lib/typescript/catalog/catalog.types.g.d.ts +6 -4
- package/lib/typescript/catalog/catalog.types.g.d.ts.map +1 -1
- package/lib/typescript/effects/ledger.d.ts +16 -1
- package/lib/typescript/effects/ledger.d.ts.map +1 -1
- package/lib/typescript/engine/effectFor.d.ts.map +1 -1
- package/lib/web/index.mjs +153 -0
- package/package.json +24 -3
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* GENERATED by scripts/gen-agent-catalog.mjs — do not edit.
|
|
5
5
|
* Source: packages/agent-core/src/catalog/catalog.source.json
|
|
6
6
|
*
|
|
7
|
-
*
|
|
7
|
+
* 26 Buoy tools, 218 actions.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
export const CATALOG = [{
|
|
@@ -456,7 +456,7 @@ export const CATALOG = [{
|
|
|
456
456
|
"requires": ["a change id from the zustand change log (the tool snapshot, or get_events sources:['zustand'])"]
|
|
457
457
|
}, {
|
|
458
458
|
"action": "setState",
|
|
459
|
-
"summary": "Change a live zustand store. Ask Buoy MERGES by default (replace:false): it
|
|
459
|
+
"summary": "Change a live zustand store. Ask Buoy MERGES by default (replace:false): it merges the fields you send, including inside nested objects (so {\"member\":{\"crowns\":5}} changes crowns and keeps member's other fields), and KEEPS the store's action functions (setQty, removeLine, …) and untouched keys. Never send replace:true unless you mean to reset the whole store — replacing drops the functions (they can't cross the wire), and the app's buttons that call them then crash. To change a list in the store, ADDRESS ITEMS BY THEIR OWN id instead of resending the list: {\"lines\":{\"seed-1\":{\"qty\":5}}} changes one field of one item, {\"lines\":{\"seed-2\":null}} removes that item, and a key that isn't in the list yet appends a new item (send all its fields). Items you don't name are untouched, so this is the only safe form when you haven't seen the whole list — a capped read means you CANNOT resend it without deleting what you weren't shown. Sending a plain ARRAY still works and still replaces the whole list, which is how you deliberately empty it. On a merge it's a TYPED EDIT: you can only change a field that already exists, to the same type, and any list item you add must match the shape of the ones already there — a wrong type, an unknown field, or a malformed new item is refused with the exact path. force:true bypasses. To change a single value, `path` + `value` is the safest form (path:\"lines[lineId=seed-1].qty\", value:5): it is always a merge and there is no nesting to get wrong.",
|
|
460
460
|
"params": {
|
|
461
461
|
"type": "object",
|
|
462
462
|
"properties": {
|
|
@@ -1067,7 +1067,7 @@ export const CATALOG = [{
|
|
|
1067
1067
|
}, {
|
|
1068
1068
|
"toolId": "events",
|
|
1069
1069
|
"title": "Events",
|
|
1070
|
-
"summary": "The cross-tool activity timeline: one chronological ring buffer (max 200, newest-first) that aggregates events from every other installed Buoy tool — network requests, redux/zustand/jotai state changes, react-query query/mutation updates, AsyncStorage/MMKV writes, route navigations, and component renders. Reach for it first for any \"what just happened in the app?\" question, before drilling into a single-tool reader. It exposes 3 actions: exportEvents (formatted read), setEnabledSources (choose what the device records), clearEvents (wipe the timeline). CRITICAL: it only records while something is watching — a cold exportEvents on a freshly connected session usually returns 0 events because nothing has ever armed capture, which is NOT the same as \"the app did nothing\".",
|
|
1070
|
+
"summary": "The cross-tool activity timeline: one chronological ring buffer (max 200, newest-first) that aggregates events from every other installed Buoy tool — network requests, redux/zustand/jotai state changes, react-query query/mutation updates, AsyncStorage/MMKV writes, route navigations, and component renders. Reach for it first for any \"what just happened in the app?\" question, before drilling into a single-tool reader. It exposes 3 actions: exportEvents (formatted read), setEnabledSources (choose what the device records), clearEvents (wipe the timeline). CRITICAL: it only records while something is watching — a cold exportEvents on a freshly connected session usually returns 0 events because nothing has ever armed capture, which is NOT the same as \"the app did nothing\". Swift captures network, storage-async, storage-mmkv, and route. React state and render sources are unavailable. Native export accepts format, includeEventData, includeSource, includeStatus, includeTitle, includeSubtitle, includeSummaryHeader, filterMode, filterSources, dataSizeThreshold, and timestampFormat; other settings are rejected. Native detail inherits source snapshot payload limits.",
|
|
1071
1071
|
"actions": [{
|
|
1072
1072
|
"action": "exportEvents",
|
|
1073
1073
|
"summary": "Read the recorded cross-tool timeline as a formatted string (markdown/json/plaintext/mermaid), optionally filtered by source and status.",
|
|
@@ -1179,7 +1179,7 @@ export const CATALOG = [{
|
|
|
1179
1179
|
},
|
|
1180
1180
|
"effect": "read",
|
|
1181
1181
|
"release": "works",
|
|
1182
|
-
"description": "Runs the device's own \"Copy Settings\" formatter over the unified store and returns {output: string, returned: number, totalAvailable: number, includedData: boolean, format: string}. The store is a 200-event ring, newest-first. Defaults are compact: includeEventData=false, so heavy raw payloads (network bodies, redux state trees, query data) stay on the device — pass settings.includeEventData=true only when you actually need them.\n\nTHREE traps a caller must know:\n(1) COLD READS ARE EMPTY. Sources are only subscribed while a consumer holds a watch on toolId \"events\" (the adapter's subscribe() calls ensureRemoteSourcesDefault) or the on-device Events modal is open. A bare call_action does NOT arm capture — the MCP SyncClient only watches on getSnapshot, never on callAction (packages/mcp/src/tools/packs/events.ts:80). If totalAvailable is 0, say \"nothing was being recorded\", not \"nothing happened\": arm it first (read the events snapshot, or call setEnabledSources), reproduce, then export.\n(2) limit IS APPLIED BEFORE FILTERING. The adapter does all.slice(0, limit) and only then does generateExport filter by settings.filterSources / filterMode (packages/events/src/sync/eventsSyncAdapter.ts:378-381 + eventExportFormatter.ts:616). Filtering to one source with limit:25 can produce an EMPTY output while `returned` still reports 25 — `returned` counts events handed to the formatter, not events in the output. When filtering by source, pass a large limit (or omit it, which uses the whole buffer).\n(3) filterSources takes GRANULAR EventSource values, not friendly names. \"storage\" matches nothing — use [\"storage-async\",\"storage-mmkv\"]; react-query is three values ([\"react-query\",\"react-query-query\",\"react-query-mutation\"]). The MCP get_events wrapper expands those aliases for you; a direct call_action does not.\n\nAn unrecognized preset name silently falls back to DEFAULT_COPY_SETTINGS instead of erroring. settings is shallow-merged OVER the preset.",
|
|
1182
|
+
"description": "Runs the device's own \"Copy Settings\" formatter over the unified store and returns {output: string, returned: number, totalAvailable: number, includedData: boolean, format: string}. The store is a 200-event ring, newest-first. Defaults are compact: includeEventData=false, so heavy raw payloads (network bodies, redux state trees, query data) stay on the device — pass settings.includeEventData=true only when you actually need them.\n\nTHREE traps a caller must know:\n(1) COLD READS ARE EMPTY. Sources are only subscribed while a consumer holds a watch on toolId \"events\" (the adapter's subscribe() calls ensureRemoteSourcesDefault) or the on-device Events modal is open. A bare call_action does NOT arm capture — the MCP SyncClient only watches on getSnapshot, never on callAction (packages/mcp/src/tools/packs/events.ts:80). If totalAvailable is 0, say \"nothing was being recorded\", not \"nothing happened\": arm it first (read the events snapshot, or call setEnabledSources), reproduce, then export.\n(2) limit IS APPLIED BEFORE FILTERING. The adapter does all.slice(0, limit) and only then does generateExport filter by settings.filterSources / filterMode (packages/events/src/sync/eventsSyncAdapter.ts:378-381 + eventExportFormatter.ts:616). Filtering to one source with limit:25 can produce an EMPTY output while `returned` still reports 25 — `returned` counts events handed to the formatter, not events in the output. When filtering by source, pass a large limit (or omit it, which uses the whole buffer).\n(3) filterSources takes GRANULAR EventSource values, not friendly names. \"storage\" matches nothing — use [\"storage-async\",\"storage-mmkv\"]; react-query is three values ([\"react-query\",\"react-query-query\",\"react-query-mutation\"]). The MCP get_events wrapper expands those aliases for you; a direct call_action does not.\n\nAn unrecognized preset name silently falls back to DEFAULT_COPY_SETTINGS instead of erroring. settings is shallow-merged OVER the preset. Swift captures network, storage-async, storage-mmkv, and route. React state and render sources are unavailable. Native export accepts format, includeEventData, includeSource, includeStatus, includeTitle, includeSubtitle, includeSummaryHeader, filterMode, filterSources, dataSizeThreshold, and timestampFormat; other settings are rejected. Native detail inherits source snapshot payload limits.",
|
|
1183
1183
|
"requires": ["@buoy-gg/events installed and auto-discovered by FloatingDevTools", "a live watch on toolId \"events\" (an events snapshot read, a desktop Events panel, or a prior setEnabledSources call) before the window you want recorded — otherwise the buffer is empty", "the source packages you want in the timeline (@buoy-gg/network, /redux, /storage, /react-query, /route-events, /zustand, /jotai); the /highlight-updates 'render' source produces NOTHING in a release build"],
|
|
1184
1184
|
"armsCapture": true
|
|
1185
1185
|
}, {
|
|
@@ -1777,7 +1777,7 @@ export const CATALOG = [{
|
|
|
1777
1777
|
}, {
|
|
1778
1778
|
"toolId": "time-machine",
|
|
1779
1779
|
"title": "Time Machine",
|
|
1780
|
-
"summary": "Save and restore the app's entire client-side state (device storage, redux, zustand, jotai, react-query) as named snapshots (\"restore points\"), plus the route it was captured on. Reach for it to put the app back into a known state before re-running a flow, to preview exactly what a restore would change before committing, or to wipe the app to fresh-install state. Snapshot payloads stay on-device — `list` returns metadata only; use `inspect` for one source's actual captured data and `preview` for item-level diffs.",
|
|
1780
|
+
"summary": "Save and restore the app's entire client-side state (device storage, redux, zustand, jotai, react-query) as named snapshots (\"restore points\"), plus the route it was captured on. Reach for it to put the app back into a known state before re-running a flow, to preview exactly what a restore would change before committing, or to wipe the app to fresh-install state. Snapshot payloads stay on-device — `list` returns metadata only; use `inspect` for one source's actual captured data and `preview` for item-level diffs. Swift supports live restore of registered providers, with UserDefaults and MMKV supplied by default. Keychain is excluded. Read provider detail and restoreModes. Native capabilities omit captureBaseline and wipeAll, and mode reload is rejected before writes. Snapshots include a safety copy before restoration; this is not a full process reset.",
|
|
1781
1781
|
"actions": [{
|
|
1782
1782
|
"action": "list",
|
|
1783
1783
|
"summary": "List all restore points plus which state sources can currently be captured/restored and whether the device can navigate routes.",
|
|
@@ -1788,7 +1788,7 @@ export const CATALOG = [{
|
|
|
1788
1788
|
},
|
|
1789
1789
|
"effect": "read",
|
|
1790
1790
|
"release": "works",
|
|
1791
|
-
"description": "Same payload as the tool's synced snapshot. Returns { snapshots, busy, lastOutcome, providers, route }. `snapshots[]` = { id (e.g. \"snap_m1x2y3_4\"), name, createdAt, sizeBytes, baseline?, route?:{pathname,href}, restoreRoute?, scope?, excludedKeys?, sources:{ [sourceId]: { warnings:string[] } } } — METADATA ONLY, no captured values. `providers[]` = { id, label, canCapture, canRestore, detail } for the registered sources: \"storage\", \"redux\", \"zustand\", \"jotai\", \"query\" (plus any custom ones the app registered). Read `detail` before reporting a source as broken — e.g. redux says \"Auto-instrumented store cannot be restored\" when the app didn't wrap its root reducer. `route.available` is false on apps without expo-router (those snapshots record no route). `lastOutcome` is the previous restore's per-source result. Call this first — every other action needs an `id` from here.",
|
|
1791
|
+
"description": "Same payload as the tool's synced snapshot. Returns { snapshots, busy, lastOutcome, providers, route }. `snapshots[]` = { id (e.g. \"snap_m1x2y3_4\"), name, createdAt, sizeBytes, baseline?, route?:{pathname,href}, restoreRoute?, scope?, excludedKeys?, sources:{ [sourceId]: { warnings:string[] } } } — METADATA ONLY, no captured values. `providers[]` = { id, label, canCapture, canRestore, detail } for the registered sources: \"storage\", \"redux\", \"zustand\", \"jotai\", \"query\" (plus any custom ones the app registered). Read `detail` before reporting a source as broken — e.g. redux says \"Auto-instrumented store cannot be restored\" when the app didn't wrap its root reducer. `route.available` is false on apps without expo-router (those snapshots record no route). `lastOutcome` is the previous restore's per-source result. Call this first — every other action needs an `id` from here. Swift supports live restore of registered providers, with UserDefaults and MMKV supplied by default. Keychain is excluded. Read provider detail and restoreModes. Native capabilities omit captureBaseline and wipeAll, and mode reload is rejected before writes. Snapshots include a safety copy before restoration; this is not a full process reset.",
|
|
1792
1792
|
"requires": ["@buoy-gg/time-machine registered in FloatingDevTools"]
|
|
1793
1793
|
}, {
|
|
1794
1794
|
"action": "capture",
|
|
@@ -1870,7 +1870,7 @@ export const CATALOG = [{
|
|
|
1870
1870
|
},
|
|
1871
1871
|
"effect": "destructive",
|
|
1872
1872
|
"release": "works",
|
|
1873
|
-
"description": "Requires `id` (throws \"restore requires a snapshot `id`\" without it). mode \"live\" (default) replaces state in place source by source in a fixed order (storage → redux → zustand → jotai → query); mode \"reload\" restores ONLY persisted storage and then reloads the JS bundle so in-memory stores rebuild themselves. A baseline snapshot ALWAYS takes the clear+reload path regardless of mode. Storage restore is a diff — app keys missing from the snapshot are DELETED. Returns a RestoreOutcome: read `results[sourceId].applied` / `.skipped[].reason` / `.warnings` rather than assuming success (a source with canRestore:false comes back skipped with a reason, not an error), and read `willReload` and `route.status` (\"navigated\" | \"deferred\" | \"failed\" | \"unavailable\"). TWO GOTCHAS: (1) omitting `excludeKeys` makes the snapshot's own SAVED excludedKeys apply, and a saved `scope` narrows the restore to only the scoped items — passing an explicit `excludeKeys` array disables that saved scope. (2) omitting `restoreRoute` does NOT mean false: it falls back to the snapshot's own setting, which is ON whenever the snapshot captured a route. Pass restoreRoute:false to keep the app on the current screen.",
|
|
1873
|
+
"description": "Requires `id` (throws \"restore requires a snapshot `id`\" without it). mode \"live\" (default) replaces state in place source by source in a fixed order (storage → redux → zustand → jotai → query); mode \"reload\" restores ONLY persisted storage and then reloads the JS bundle so in-memory stores rebuild themselves. A baseline snapshot ALWAYS takes the clear+reload path regardless of mode. Storage restore is a diff — app keys missing from the snapshot are DELETED. Returns a RestoreOutcome: read `results[sourceId].applied` / `.skipped[].reason` / `.warnings` rather than assuming success (a source with canRestore:false comes back skipped with a reason, not an error), and read `willReload` and `route.status` (\"navigated\" | \"deferred\" | \"failed\" | \"unavailable\"). TWO GOTCHAS: (1) omitting `excludeKeys` makes the snapshot's own SAVED excludedKeys apply, and a saved `scope` narrows the restore to only the scoped items — passing an explicit `excludeKeys` array disables that saved scope. (2) omitting `restoreRoute` does NOT mean false: it falls back to the snapshot's own setting, which is ON whenever the snapshot captured a route. Pass restoreRoute:false to keep the app on the current screen. Swift supports live restore of registered providers, with UserDefaults and MMKV supplied by default. Keychain is excluded. Read provider detail and restoreModes. Native capabilities omit captureBaseline and wipeAll, and mode reload is rejected before writes. Snapshots include a safety copy before restoration; this is not a full process reset.",
|
|
1874
1874
|
"requires": ["a source's provider must report canRestore:true or that source is skipped with a reason", "expo-router for the route leg", "expo-updates for the reload leg in a release build"]
|
|
1875
1875
|
}, {
|
|
1876
1876
|
"action": "preview",
|
|
@@ -2061,6 +2061,17 @@ export const CATALOG = [{
|
|
|
2061
2061
|
"title": "Storage",
|
|
2062
2062
|
"summary": "Read and write the app's persisted state across all three backends — AsyncStorage, every registered MMKV instance, and registered Expo SecureStore keys — plus a recorded timeline of storage writes with per-event undo/jump. Reach for this first when a value is wrong, stale, missing, or only broken after a restart/upgrade: the bad value is usually sitting in storage. Buoy's own devtool keys (@react_buoy*, @buoy*, buoy-*) are stripped from every read path, so results are app data only. Nothing here is __DEV__-gated — every action really runs in a release build.",
|
|
2063
2063
|
"actions": [{
|
|
2064
|
+
"action": "getRequiredKeys",
|
|
2065
|
+
"summary": "List the storage keys the app declares as required, with their expected types and backends.",
|
|
2066
|
+
"params": {
|
|
2067
|
+
"type": "object",
|
|
2068
|
+
"properties": {},
|
|
2069
|
+
"additionalProperties": false
|
|
2070
|
+
},
|
|
2071
|
+
"effect": "read",
|
|
2072
|
+
"release": "works",
|
|
2073
|
+
"description": "Returns the requiredStorageKeys array given to createStorageTool (or the FloatingDevTools requiredStorageKeys prop): each entry is a key, or an object with key, expectedType or expectedValue, description and storageType (async, mmkv or secure). Returns [] when the app declared none. It reports the configuration only; read the keys themselves to see whether they are present and valid. Swift returns the requirements configured through BuoyStorageModule.configure(requiredKeys:)."
|
|
2074
|
+
}, {
|
|
2064
2075
|
"action": "async.getAllKeys",
|
|
2065
2076
|
"summary": "List every AsyncStorage key in the app (Buoy's own devtool keys stripped).",
|
|
2066
2077
|
"params": {
|
|
@@ -2468,7 +2479,7 @@ export const CATALOG = [{
|
|
|
2468
2479
|
}, {
|
|
2469
2480
|
"toolId": "highlight-updates",
|
|
2470
2481
|
"title": "Highlight Updates",
|
|
2471
|
-
"summary": "
|
|
2482
|
+
"summary": "Read and drive the live screen with describeScreen, tapElement, and waitFor. RN also exposes React render tracking; native Swift does not. Inspect the connected device’s actions before calling a platform-specific operation. The touch-capture actions support Scenarios recording. Native capture is restricted to development builds and excludes Buoy controls and secure text inputs.",
|
|
2472
2483
|
"actions": [{
|
|
2473
2484
|
"action": "describeScreen",
|
|
2474
2485
|
"summary": "List every meaningful/interactive element currently on screen, with normalized tap points — the read half of driving the app. The ONLY way to read what is on screen but in no store: text, values and names held in component state, which no other Buoy tool can see.",
|
|
@@ -2753,8 +2764,57 @@ export const CATALOG = [{
|
|
|
2753
2764
|
"description": "Clears the nativeTag->count map and empties RenderTracker's entire renders store. There is no undo and no snapshot: any render history a human was watching accumulate, or that a colleague armed tracking to collect, is gone. Only call this when the user explicitly asks to reset counts, typically to get a clean baseline before measuring an interaction. Prefer beginMeasurement/endMeasurement for measuring — that opens its own window and never touches the user's overlay data. Takes no params. Returns undefined.",
|
|
2754
2765
|
"releaseNote": "packages/highlight-updates/src/highlight-updates/utils/HighlightUpdatesController.ts:1744 (initialize), :1819 (enable), :1905 (enableBackgroundTracking) all return early when __DEV__===false, and the only writers of nodeRenderCounts/RenderTracker are the DevTools-hook interceptors (ProfilerInterceptor.ts:107, CommitProfiler.ts:74). In a release build those stores are permanently empty, so clearRen",
|
|
2755
2766
|
"requires": ["@buoy-gg/highlight-updates installed and registered with <FloatingDevTools>"]
|
|
2767
|
+
}, {
|
|
2768
|
+
"action": "startTouchCapture",
|
|
2769
|
+
"summary": "Start recording supported host interactions.",
|
|
2770
|
+
"description": "Returns capture status and a reason if unavailable. RN uses its touch stream; Swift uses UIKit events and native-driver interactions in development builds. Read the status before driving the app. This does not save a scenario.",
|
|
2771
|
+
"params": {
|
|
2772
|
+
"type": "object",
|
|
2773
|
+
"properties": {},
|
|
2774
|
+
"additionalProperties": false
|
|
2775
|
+
},
|
|
2776
|
+
"effect": "write",
|
|
2777
|
+
"release": "empty"
|
|
2778
|
+
}, {
|
|
2779
|
+
"action": "stopTouchCapture",
|
|
2780
|
+
"summary": "Stop capturing new interactions and retain recorded data.",
|
|
2781
|
+
"description": "Read retained records with readTouchCapture. Stopping does not save a scenario.",
|
|
2782
|
+
"params": {
|
|
2783
|
+
"type": "object",
|
|
2784
|
+
"properties": {},
|
|
2785
|
+
"additionalProperties": false
|
|
2786
|
+
},
|
|
2787
|
+
"effect": "write",
|
|
2788
|
+
"release": "works"
|
|
2789
|
+
}, {
|
|
2790
|
+
"action": "clearTouchCapture",
|
|
2791
|
+
"summary": "Clear retained interactions and reset the sequence number.",
|
|
2792
|
+
"description": "Existing recording data is removed. Start subsequent reads with sinceSeq:0.",
|
|
2793
|
+
"params": {
|
|
2794
|
+
"type": "object",
|
|
2795
|
+
"properties": {},
|
|
2796
|
+
"additionalProperties": false
|
|
2797
|
+
},
|
|
2798
|
+
"effect": "destructive",
|
|
2799
|
+
"release": "works"
|
|
2800
|
+
}, {
|
|
2801
|
+
"action": "readTouchCapture",
|
|
2802
|
+
"summary": "Read captured interactions after a sequence number.",
|
|
2803
|
+
"description": "Returns {status, reason, records, seq}. Pass the last returned seq as sinceSeq on the next read. Coverage depends on platform; records do not prove every gesture was captured or replayable.",
|
|
2804
|
+
"params": {
|
|
2805
|
+
"type": "object",
|
|
2806
|
+
"properties": {
|
|
2807
|
+
"sinceSeq": {
|
|
2808
|
+
"type": "number",
|
|
2809
|
+
"description": "Return records with a sequence number greater than this value. Default 0."
|
|
2810
|
+
}
|
|
2811
|
+
},
|
|
2812
|
+
"additionalProperties": false
|
|
2813
|
+
},
|
|
2814
|
+
"effect": "read",
|
|
2815
|
+
"release": "works"
|
|
2756
2816
|
}],
|
|
2757
|
-
"unavailableWhen": "
|
|
2817
|
+
"unavailableWhen": "RN requires @buoy-gg/highlight-updates registered with FloatingDevTools; React inspection and render tracking depend on a development build. Swift exposes native interaction and touch-capture actions under this ID, without React render tracking. Inspect the connected device’s available actions. Swift touch capture refuses production builds."
|
|
2758
2818
|
}, {
|
|
2759
2819
|
"toolId": "scenarios",
|
|
2760
2820
|
"title": "Scenarios",
|
|
@@ -3138,7 +3198,7 @@ export const CATALOG = [{
|
|
|
3138
3198
|
"unavailableWhen": "The app does not install the Scenarios tool (no `createScenariosTool` / scenarios preset passed to `<FloatingDevTools />`), so \"scenarios\" is absent from the device's capability list. Driven through MCP or the desktop dashboard, the device must also be on a Pro license (`requireProDevice`)."
|
|
3139
3199
|
}, {
|
|
3140
3200
|
"toolId": "perf-monitor",
|
|
3141
|
-
"title": "
|
|
3201
|
+
"title": "Bench",
|
|
3142
3202
|
"summary": "Measures runtime performance on the device: live JS/UI FPS, CPU and memory sampled every 250ms, plus recorded \"benchmark runs\" saved to disk and an automation mode that navigates a screen with different query params and ranks the variants. Reach for it to answer \"is this screen slow / which variant is faster / did my fix land\", not to inspect data — it reads no app state. Two traps: live metrics are all zeros until `setEnabled {enabled:true}` arms sampling, and `startAutomation` swallows every validation error, so a bad config returns ok and simply never runs.",
|
|
3143
3203
|
"actions": [{
|
|
3144
3204
|
"action": "setEnabled",
|
|
@@ -3552,7 +3612,7 @@ export const CATALOG = [{
|
|
|
3552
3612
|
}, {
|
|
3553
3613
|
"toolId": "assets",
|
|
3554
3614
|
"title": "Assets",
|
|
3555
|
-
"summary": "Inventory of what the app SHIPS — every bundled asset (images, fonts, video, audio, data) with dimensions, @1x/@2x/@3x scale coverage, content hash, byte size, loaded-vs-never-loaded state, audit findings (duplicates, unused, WebP candidates, over-decode, heavy GIFs/fonts, scale gaps), and a diff vs a saved baseline. Reach for it for bundle-size questions (\"what's making the app big\", \"did this branch add megabytes\", \"which images ship but are never used\"); use the images tool instead for what the app actually RENDERS. Nothing here is __DEV__-gated (zero `__DEV__` in packages/assets/src), but the Metro dev server is what supplies the full-bundle graph and real byte sizes — in an embedded/release bundle the inventory shrinks to registry-only records with estimated sizes.",
|
|
3615
|
+
"summary": "Inventory of what the app SHIPS — every bundled asset (images, fonts, video, audio, data) with dimensions, @1x/@2x/@3x scale coverage, content hash, byte size, loaded-vs-never-loaded state, audit findings (duplicates, unused, WebP candidates, over-decode, heavy GIFs/fonts, scale gaps), and a diff vs a saved baseline. Reach for it for bundle-size questions (\"what's making the app big\", \"did this branch add megabytes\", \"which images ship but are never used\"); use the images tool instead for what the app actually RENDERS. Nothing here is __DEV__-gated (zero `__DEV__` in packages/assets/src), but the Metro dev server is what supplies the full-bundle graph and real byte sizes — in an embedded/release bundle the inventory shrinks to registry-only records with estimated sizes. Swift inventories loose resources in the main bundle and explicitly registered app resource bundles. Buoy resource bundles are excluded. Compiled Assets.car files are aggregate records, not per-image inventory. Native loaded status requires host calls to BuoyAssets.markLoaded; unobserved does not mean unused. Native scale and decoded-memory insight arrays are currently empty. Check scanStatus.coverage and warnings.",
|
|
3556
3616
|
"actions": [{
|
|
3557
3617
|
"action": "list",
|
|
3558
3618
|
"summary": "The whole asset inventory, largest-first, plus stats, scan status, audit insights and the baseline diff in one call.",
|
|
@@ -3578,7 +3638,7 @@ export const CATALOG = [{
|
|
|
3578
3638
|
},
|
|
3579
3639
|
"effect": "read",
|
|
3580
3640
|
"release": "works",
|
|
3581
|
-
"description": "Returns { stats, scanStatus, insights, diff, total, records }. `records` is sorted by size descending and sliced to `limit`; `total` is the count AFTER kind/loadedOnly filtering but BEFORE the slice. Each record: { id, key, registryId, name, type, kind, hash, location, width, height, scales, uri, loaded, sizeBytes, sizeSource }. `sizeSource` is \"measured\" (real bytes from the Metro dev server) or \"estimate\" (decoded RGBA memory, width*scale*height*scale*4) — never present them as the same number. `insights` carries id lists: duplicates (grouped by content hash, with wastedBytes), neverLoaded, webpCandidates (png/jpg >= 50KB), overDecode (decodes to >2 screenfuls), heavyGifs (>= 100KB), heavyFonts (>= 150KB), scaleGaps, scaleAnomalies. If `scanStatus.lastScanAt` is null or `graphCount` is null, run `rescan` first — the inventory is registry-only until the Metro graph is merged. If `scanStatus.measuring` is true, byte totals are partial; re-run shortly.",
|
|
3641
|
+
"description": "Returns { stats, scanStatus, insights, diff, total, records }. `records` is sorted by size descending and sliced to `limit`; `total` is the count AFTER kind/loadedOnly filtering but BEFORE the slice. Each record: { id, key, registryId, name, type, kind, hash, location, width, height, scales, uri, loaded, sizeBytes, sizeSource }. `sizeSource` is \"measured\" (real bytes from the Metro dev server) or \"estimate\" (decoded RGBA memory, width*scale*height*scale*4) — never present them as the same number. `insights` carries id lists: duplicates (grouped by content hash, with wastedBytes), neverLoaded, webpCandidates (png/jpg >= 50KB), overDecode (decodes to >2 screenfuls), heavyGifs (>= 100KB), heavyFonts (>= 150KB), scaleGaps, scaleAnomalies. If `scanStatus.lastScanAt` is null or `graphCount` is null, run `rescan` first — the inventory is registry-only until the Metro graph is merged. If `scanStatus.measuring` is true, byte totals are partial; re-run shortly. Swift inventories loose resources in the main bundle and explicitly registered app resource bundles. Buoy resource bundles are excluded. Compiled Assets.car files are aggregate records, not per-image inventory. Native loaded status requires host calls to BuoyAssets.markLoaded; unobserved does not mean unused. Native scale and decoded-memory insight arrays are currently empty. Check scanStatus.coverage and warnings.",
|
|
3582
3642
|
"requires": ["@buoy-gg/assets imported in the app", "Metro dev server (for full-bundle coverage, never-loaded detection and measured bytes)"]
|
|
3583
3643
|
}, {
|
|
3584
3644
|
"action": "getDetail",
|
|
@@ -3676,7 +3736,7 @@ export const CATALOG = [{
|
|
|
3676
3736
|
},
|
|
3677
3737
|
"effect": "read",
|
|
3678
3738
|
"release": "works",
|
|
3679
|
-
"description": "Returns { registryAvailable, patched, registryCount, graphSupported, graphCount, graphError, lastScanAt, measuring, measuredCount, fontFamilies: string[], localAssetCount }. Use it to explain a thin or surprising inventory before drawing conclusions: registryAvailable:false means the RN asset registry could not be required at all; graphCount:null with a graphError means only runtime-registered assets are known (so 'never loaded' is unanswerable); measuring:true means byte totals are still landing. lastScanAt:null means nothing has scanned yet — call rescan."
|
|
3739
|
+
"description": "Returns { registryAvailable, patched, registryCount, graphSupported, graphCount, graphError, lastScanAt, measuring, measuredCount, fontFamilies: string[], localAssetCount }. Use it to explain a thin or surprising inventory before drawing conclusions: registryAvailable:false means the RN asset registry could not be required at all; graphCount:null with a graphError means only runtime-registered assets are known (so 'never loaded' is unanswerable); measuring:true means byte totals are still landing. lastScanAt:null means nothing has scanned yet — call rescan. Swift inventories loose resources in the main bundle and explicitly registered app resource bundles. Buoy resource bundles are excluded. Compiled Assets.car files are aggregate records, not per-image inventory. Native loaded status requires host calls to BuoyAssets.markLoaded; unobserved does not mean unused. Native scale and decoded-memory insight arrays are currently empty. Check scanStatus.coverage and warnings."
|
|
3680
3740
|
}],
|
|
3681
3741
|
"unavailableWhen": "The app doesn't import @buoy-gg/assets (autoExternalSync only registers the adapter when the module resolves — packages/devtools-floating-menu/src/floatingMenu/autoExternalSync.tsx:391), or the app is a release/production JS bundle that didn't opt in with `externalSync.enableInRelease` plus a real Pro license, in which case the device never connects to the broker at all."
|
|
3682
3742
|
}, {
|
|
@@ -4199,7 +4259,296 @@ export const CATALOG = [{
|
|
|
4199
4259
|
"description": "Returns `{id, title, version?, requires?, body, note}`; `{ok:false, error}` naming the available ids when the id is unknown or the app has none. A procedure grants nothing: each step still runs through the same catalog, policy, approval card and undo as any other call."
|
|
4200
4260
|
}],
|
|
4201
4261
|
"unavailableWhen": "Only present while an Ask Buoy session is running — which is exactly when this catalog is in use, so in practice always available to you."
|
|
4262
|
+
}, {
|
|
4263
|
+
"toolId": "push-notifications",
|
|
4264
|
+
"title": "Push Notifications",
|
|
4265
|
+
"summary": "Inspect notification receipt, responses, presentation decisions, background-task results and tokens from an explicitly configured Expo capture adapter. Use test IDs to correlate stages. Simulator sending lives in the desktop host and is not a device action. Real-provider sending is not implemented.",
|
|
4266
|
+
"unavailableWhen": "Capture requires @buoy-gg/notifications and early installExpoNotificationCapture setup with the app SDK. Release capture needs an explicit enableInRelease option; release desktop sync separately requires its own opt-in and Pro. Background evidence requires the app task wrapper. Native delivery validation covers Expo 56 on iOS.",
|
|
4267
|
+
"actions": [{
|
|
4268
|
+
"action": "getSnapshot",
|
|
4269
|
+
"summary": "Read captured notification evidence and tokens.",
|
|
4270
|
+
"description": "Returns the bounded journal, session, provider capabilities, permissions and token observations. A missing callback does not prove that no OS alert appeared.",
|
|
4271
|
+
"effect": "read",
|
|
4272
|
+
"release": "works",
|
|
4273
|
+
"params": {
|
|
4274
|
+
"type": "object",
|
|
4275
|
+
"properties": {},
|
|
4276
|
+
"additionalProperties": false
|
|
4277
|
+
}
|
|
4278
|
+
}, {
|
|
4279
|
+
"action": "getCapabilities",
|
|
4280
|
+
"summary": "Check notification capture setup.",
|
|
4281
|
+
"description": "Returns provider/version, app ID, platform, supported operations and durable-storage state. No device tokens are registered by this action.",
|
|
4282
|
+
"effect": "read",
|
|
4283
|
+
"release": "works",
|
|
4284
|
+
"params": {
|
|
4285
|
+
"type": "object",
|
|
4286
|
+
"properties": {},
|
|
4287
|
+
"additionalProperties": false
|
|
4288
|
+
}
|
|
4289
|
+
}, {
|
|
4290
|
+
"action": "getEvent",
|
|
4291
|
+
"summary": "Read one captured event by id.",
|
|
4292
|
+
"description": "Returns an event by its Buoy record ID, or null after eviction. Native notification ID and test ID are separate fields.",
|
|
4293
|
+
"effect": "read",
|
|
4294
|
+
"release": "works",
|
|
4295
|
+
"params": {
|
|
4296
|
+
"type": "object",
|
|
4297
|
+
"properties": {
|
|
4298
|
+
"id": {
|
|
4299
|
+
"type": "string",
|
|
4300
|
+
"description": "Buoy event record id from getSnapshot.events."
|
|
4301
|
+
}
|
|
4302
|
+
},
|
|
4303
|
+
"additionalProperties": false,
|
|
4304
|
+
"required": ["id"]
|
|
4305
|
+
}
|
|
4306
|
+
}, {
|
|
4307
|
+
"action": "getPermissions",
|
|
4308
|
+
"summary": "Refresh notification permission settings.",
|
|
4309
|
+
"description": "Reads the existing OS settings through Expo. Does not display a permission prompt.",
|
|
4310
|
+
"effect": "read",
|
|
4311
|
+
"release": "works",
|
|
4312
|
+
"params": {
|
|
4313
|
+
"type": "object",
|
|
4314
|
+
"properties": {},
|
|
4315
|
+
"additionalProperties": false
|
|
4316
|
+
}
|
|
4317
|
+
}, {
|
|
4318
|
+
"action": "listPresented",
|
|
4319
|
+
"summary": "Inspect notifications currently in the system tray.",
|
|
4320
|
+
"description": "Reads a current snapshot through Expo. This is not a historical record and does not dismiss notifications.",
|
|
4321
|
+
"effect": "read",
|
|
4322
|
+
"release": "works",
|
|
4323
|
+
"params": {
|
|
4324
|
+
"type": "object",
|
|
4325
|
+
"properties": {},
|
|
4326
|
+
"additionalProperties": false
|
|
4327
|
+
}
|
|
4328
|
+
}, {
|
|
4329
|
+
"action": "refreshToken",
|
|
4330
|
+
"summary": "Register a token with type \"device\" or \"expo\". Expo registration requires a configured projectId.",
|
|
4331
|
+
"description": "May register with APNs/FCM or contact Expo Push Service. Expo tokens require projectId in app setup. Never invoke merely to open the inspector.",
|
|
4332
|
+
"effect": "write",
|
|
4333
|
+
"release": "works",
|
|
4334
|
+
"params": {
|
|
4335
|
+
"type": "object",
|
|
4336
|
+
"properties": {
|
|
4337
|
+
"type": {
|
|
4338
|
+
"type": "string",
|
|
4339
|
+
"enum": ["device", "expo"],
|
|
4340
|
+
"description": "device returns APNs on iOS or FCM on Android; expo requests an Expo token."
|
|
4341
|
+
}
|
|
4342
|
+
},
|
|
4343
|
+
"additionalProperties": false,
|
|
4344
|
+
"required": ["type"]
|
|
4345
|
+
}
|
|
4346
|
+
}, {
|
|
4347
|
+
"action": "setCaptureSession",
|
|
4348
|
+
"summary": "Set runId and optional durationMs to arm capture, or runId:null to stop.",
|
|
4349
|
+
"description": "Arm while the app is connected, before backgrounding or stopping it. Await durable:true before relying on cold-launch recovery. Sessions last at most one hour.",
|
|
4350
|
+
"effect": "write",
|
|
4351
|
+
"release": "works",
|
|
4352
|
+
"params": {
|
|
4353
|
+
"type": "object",
|
|
4354
|
+
"properties": {
|
|
4355
|
+
"runId": {
|
|
4356
|
+
"description": "A test-run label of 1 to 128 characters, or null to stop capture.",
|
|
4357
|
+
"anyOf": [{
|
|
4358
|
+
"type": "string"
|
|
4359
|
+
}, {
|
|
4360
|
+
"type": "null"
|
|
4361
|
+
}]
|
|
4362
|
+
},
|
|
4363
|
+
"durationMs": {
|
|
4364
|
+
"type": "number",
|
|
4365
|
+
"description": "Capture duration in milliseconds. Default 1800000."
|
|
4366
|
+
}
|
|
4367
|
+
},
|
|
4368
|
+
"additionalProperties": false,
|
|
4369
|
+
"required": ["runId"]
|
|
4370
|
+
}
|
|
4371
|
+
}, {
|
|
4372
|
+
"action": "clearCapturedEvents",
|
|
4373
|
+
"summary": "Clear Buoy notification history.",
|
|
4374
|
+
"description": "Deletes retained captured events. Leaves device tokens, OS notifications and the capture session unchanged.",
|
|
4375
|
+
"effect": "destructive",
|
|
4376
|
+
"release": "works",
|
|
4377
|
+
"params": {
|
|
4378
|
+
"type": "object",
|
|
4379
|
+
"properties": {},
|
|
4380
|
+
"additionalProperties": false
|
|
4381
|
+
}
|
|
4382
|
+
}, {
|
|
4383
|
+
"action": "scheduleLocal",
|
|
4384
|
+
"summary": "Schedule a local notification with title, body, optional data and a delay in seconds.",
|
|
4385
|
+
"description": "This tests local notification behavior, not APNs or FCM delivery. The app must be connected before scheduling. Uses the app SDK and notification settings.",
|
|
4386
|
+
"effect": "write",
|
|
4387
|
+
"release": "works",
|
|
4388
|
+
"params": {
|
|
4389
|
+
"type": "object",
|
|
4390
|
+
"properties": {
|
|
4391
|
+
"title": {
|
|
4392
|
+
"type": "string",
|
|
4393
|
+
"description": "Displayed title."
|
|
4394
|
+
},
|
|
4395
|
+
"body": {
|
|
4396
|
+
"type": "string",
|
|
4397
|
+
"description": "Displayed message."
|
|
4398
|
+
},
|
|
4399
|
+
"data": {
|
|
4400
|
+
"type": "object",
|
|
4401
|
+
"description": "Custom notification data. Include __buoyTestId to correlate with a test run."
|
|
4402
|
+
},
|
|
4403
|
+
"seconds": {
|
|
4404
|
+
"type": "number",
|
|
4405
|
+
"description": "Delay before local delivery."
|
|
4406
|
+
}
|
|
4407
|
+
},
|
|
4408
|
+
"additionalProperties": false,
|
|
4409
|
+
"required": ["title", "body", "seconds"]
|
|
4410
|
+
}
|
|
4411
|
+
}]
|
|
4412
|
+
}, {
|
|
4413
|
+
"toolId": "image-overlay",
|
|
4414
|
+
"title": "Image Overlay",
|
|
4415
|
+
"summary": "Control the Swift design-image overlay. Uses the same state as the on-device controls. Read getSnapshot after loadImage to check loading and error. Available on Swift iOS only; check device capabilities.",
|
|
4416
|
+
"actions": [{
|
|
4417
|
+
"action": "getSnapshot",
|
|
4418
|
+
"summary": "Read overlay loading, image presence, placement, selected target and settings.",
|
|
4419
|
+
"params": {
|
|
4420
|
+
"type": "object",
|
|
4421
|
+
"properties": {},
|
|
4422
|
+
"additionalProperties": false
|
|
4423
|
+
},
|
|
4424
|
+
"effect": "read",
|
|
4425
|
+
"release": "works"
|
|
4426
|
+
}, {
|
|
4427
|
+
"action": "listTargets",
|
|
4428
|
+
"summary": "Scan visible app image-overlay targets and return their ids, labels and frames.",
|
|
4429
|
+
"params": {
|
|
4430
|
+
"type": "object",
|
|
4431
|
+
"properties": {},
|
|
4432
|
+
"additionalProperties": false
|
|
4433
|
+
},
|
|
4434
|
+
"effect": "read",
|
|
4435
|
+
"release": "works"
|
|
4436
|
+
}, {
|
|
4437
|
+
"action": "selectTarget",
|
|
4438
|
+
"summary": "Attach the overlay to a visible target.",
|
|
4439
|
+
"params": {
|
|
4440
|
+
"type": "object",
|
|
4441
|
+
"properties": {
|
|
4442
|
+
"id": {
|
|
4443
|
+
"type": "string",
|
|
4444
|
+
"description": "Target id returned by listTargets."
|
|
4445
|
+
}
|
|
4446
|
+
},
|
|
4447
|
+
"additionalProperties": false,
|
|
4448
|
+
"required": ["id"]
|
|
4449
|
+
},
|
|
4450
|
+
"effect": "write",
|
|
4451
|
+
"release": "works"
|
|
4452
|
+
}, {
|
|
4453
|
+
"action": "loadImage",
|
|
4454
|
+
"summary": "Start loading a design image; returns {scheduled:true}. Check getSnapshot for completion or error.",
|
|
4455
|
+
"params": {
|
|
4456
|
+
"type": "object",
|
|
4457
|
+
"properties": {
|
|
4458
|
+
"url": {
|
|
4459
|
+
"type": "string",
|
|
4460
|
+
"description": "HTTP(S) image URL."
|
|
4461
|
+
}
|
|
4462
|
+
},
|
|
4463
|
+
"additionalProperties": false,
|
|
4464
|
+
"required": ["url"]
|
|
4465
|
+
},
|
|
4466
|
+
"effect": "write",
|
|
4467
|
+
"release": "works"
|
|
4468
|
+
}, {
|
|
4469
|
+
"action": "setSettings",
|
|
4470
|
+
"summary": "Update overlay settings. Invalid batches fail before any settings change.",
|
|
4471
|
+
"params": {
|
|
4472
|
+
"type": "object",
|
|
4473
|
+
"properties": {
|
|
4474
|
+
"visible": {
|
|
4475
|
+
"type": "boolean",
|
|
4476
|
+
"description": "Show the overlay."
|
|
4477
|
+
},
|
|
4478
|
+
"locked": {
|
|
4479
|
+
"type": "boolean",
|
|
4480
|
+
"description": "Lock direct manipulation."
|
|
4481
|
+
},
|
|
4482
|
+
"flipped": {
|
|
4483
|
+
"type": "boolean",
|
|
4484
|
+
"description": "Flip horizontally."
|
|
4485
|
+
},
|
|
4486
|
+
"flippedY": {
|
|
4487
|
+
"type": "boolean",
|
|
4488
|
+
"description": "Flip vertically."
|
|
4489
|
+
},
|
|
4490
|
+
"showOutline": {
|
|
4491
|
+
"type": "boolean",
|
|
4492
|
+
"description": "Show the target outline."
|
|
4493
|
+
},
|
|
4494
|
+
"autoTrack": {
|
|
4495
|
+
"type": "boolean",
|
|
4496
|
+
"description": "Follow the selected target."
|
|
4497
|
+
},
|
|
4498
|
+
"opacity": {
|
|
4499
|
+
"type": "number",
|
|
4500
|
+
"description": "Opacity from 0 to 1."
|
|
4501
|
+
},
|
|
4502
|
+
"scale": {
|
|
4503
|
+
"type": "number",
|
|
4504
|
+
"description": "Positive scale factor."
|
|
4505
|
+
},
|
|
4506
|
+
"offsetX": {
|
|
4507
|
+
"type": "number",
|
|
4508
|
+
"description": "Horizontal offset in points."
|
|
4509
|
+
},
|
|
4510
|
+
"offsetY": {
|
|
4511
|
+
"type": "number",
|
|
4512
|
+
"description": "Vertical offset in points."
|
|
4513
|
+
}
|
|
4514
|
+
},
|
|
4515
|
+
"additionalProperties": false
|
|
4516
|
+
},
|
|
4517
|
+
"effect": "write",
|
|
4518
|
+
"release": "works"
|
|
4519
|
+
}, {
|
|
4520
|
+
"action": "fitToScreen",
|
|
4521
|
+
"summary": "Fit the image to the screen width while preserving its aspect ratio.",
|
|
4522
|
+
"params": {
|
|
4523
|
+
"type": "object",
|
|
4524
|
+
"properties": {},
|
|
4525
|
+
"additionalProperties": false
|
|
4526
|
+
},
|
|
4527
|
+
"effect": "write",
|
|
4528
|
+
"release": "works"
|
|
4529
|
+
}, {
|
|
4530
|
+
"action": "resetSettings",
|
|
4531
|
+
"summary": "Reset opacity, flips, scale and offsets.",
|
|
4532
|
+
"params": {
|
|
4533
|
+
"type": "object",
|
|
4534
|
+
"properties": {},
|
|
4535
|
+
"additionalProperties": false
|
|
4536
|
+
},
|
|
4537
|
+
"effect": "write",
|
|
4538
|
+
"release": "works"
|
|
4539
|
+
}, {
|
|
4540
|
+
"action": "remove",
|
|
4541
|
+
"summary": "Remove the image and target; cancel pending image loading.",
|
|
4542
|
+
"params": {
|
|
4543
|
+
"type": "object",
|
|
4544
|
+
"properties": {},
|
|
4545
|
+
"additionalProperties": false
|
|
4546
|
+
},
|
|
4547
|
+
"effect": "write",
|
|
4548
|
+
"release": "works"
|
|
4549
|
+
}],
|
|
4550
|
+
"unavailableWhen": "The native Swift image-overlay adapter is not registered. React Native does not expose these actions."
|
|
4202
4551
|
}];
|
|
4203
|
-
export const CATALOG_TOOL_COUNT =
|
|
4204
|
-
export const CATALOG_ACTION_COUNT =
|
|
4552
|
+
export const CATALOG_TOOL_COUNT = 26;
|
|
4553
|
+
export const CATALOG_ACTION_COUNT = 218;
|
|
4205
4554
|
//# sourceMappingURL=catalog.g.js.map
|