@buoy-gg/agent-core 7.0.61 → 7.0.63
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/blocks/receipts.js +1 -1
- package/lib/commonjs/catalog/catalog.g.js +2 -2
- package/lib/commonjs/catalog/catalog.source.json +13 -1
- package/lib/commonjs/catalog/catalog.types.g.js +1 -1
- package/lib/commonjs/catalog/snapshotReads.js +1 -1
- package/lib/commonjs/context/buildContextPack.js +1 -1
- package/lib/commonjs/engine/emptyTap.test.js +1 -0
- package/lib/commonjs/engine/idGrounding.js +2 -0
- package/lib/commonjs/engine/planOnlyStop.js +1 -1
- package/lib/commonjs/engine/runAgentTurn.js +9 -7
- package/lib/commonjs/engine/systemPrompt.js +3 -1
- package/lib/commonjs/engine/verify.js +1 -1
- package/lib/commonjs/policy/policy.js +1 -1
- package/lib/commonjs/policy/redact.js +1 -1
- package/lib/commonjs/policy/turnScope.js +1 -0
- package/lib/commonjs/providers/anthropic.js +1 -1
- package/lib/commonjs/providers/openai.js +3 -3
- package/lib/module/blocks/receipts.js +1 -1
- package/lib/module/catalog/catalog.g.js +2 -2
- package/lib/module/catalog/catalog.source.json +13 -1
- package/lib/module/catalog/catalog.types.g.js +1 -1
- package/lib/module/catalog/snapshotReads.js +1 -1
- package/lib/module/context/buildContextPack.js +1 -1
- package/lib/module/engine/emptyTap.test.js +1 -0
- package/lib/module/engine/idGrounding.js +2 -0
- package/lib/module/engine/planOnlyStop.js +1 -1
- package/lib/module/engine/runAgentTurn.js +9 -7
- package/lib/module/engine/systemPrompt.js +3 -1
- package/lib/module/engine/verify.js +1 -1
- package/lib/module/policy/policy.js +1 -1
- package/lib/module/policy/redact.js +1 -1
- package/lib/module/policy/turnScope.js +1 -0
- package/lib/module/providers/anthropic.js +2 -2
- package/lib/module/providers/openai.js +3 -3
- package/lib/typescript/catalog/catalog.g.d.ts +2 -2
- package/lib/typescript/catalog/catalog.types.g.d.ts +2 -2
- package/lib/typescript/engine/emptyTap.test.d.ts +2 -0
- package/lib/typescript/engine/idGrounding.d.ts +7 -0
- package/lib/typescript/engine/planOnlyStop.d.ts +2 -2
- package/lib/typescript/engine/systemPrompt.d.ts +1 -1
- package/lib/typescript/policy/policy.d.ts +8 -3
- package/lib/typescript/policy/redact.d.ts +1 -0
- package/lib/typescript/policy/turnScope.d.ts +13 -0
- package/lib/typescript/providers/types.d.ts +1 -0
- package/lib/web/index.mjs +44 -36
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.projectReceipt=projectReceipt;exports.shallowDiff=shallowDiff;var _runId=require("./runId");var _types=require("./types");const id=(0,_runId.idFactory)("rc");const rec=a=>a&&typeof a==="object"&&!Array.isArray(a)?a:void 0;const arr=a=>Array.isArray(a)?a:[];const str=a=>typeof a==="string"?a:void 0;const num=a=>typeof a==="number"?a:void 0;function pathOf(a){try{const s=new URL(a);return s.pathname+(s.search.length>1?"?\u2026":"")}catch{return a}}function requestSummary(a){const s=str(a.id);const r=str(a.url);if(!s||!r)return void 0;return{id:s,method:str(a.method)??"GET",url:r,status:num(a.status),durationMs:num(a.durationMs),mocked:a.overridden===true||a.override!=null&&typeof a.override==="object"||void 0}}function patchDiff(a,s){const r=rec(a)??{};const o=rec(s)??{};const c=[];for(const n of Object.keys(o)){if(typeof r[n]==="function"||typeof o[n]==="function")continue;if(JSON.stringify(r[n])!==JSON.stringify(o[n]))c.push({path:n,before:r[n],after:o[n]})}return c}function shallowDiff(a,s){const r=rec(a)??{};const o=rec(s)??{};const c=new Set([...Object.keys(r),...Object.keys(o)]);const n=[];for(const u of c){if(typeof r[u]==="function"||typeof o[u]==="function")continue;if(JSON.stringify(r[u])!==JSON.stringify(o[u])){n.push({path:u,before:r[u],after:o[u]})}}return n}function groupLogs(a){const s=new Map;for(const r of a){const o=rec(r);if(!o)continue;const c=str(o.message)??"";const n=str(o.level)??"log";const u=`${n}:${c}`;const e=s.get(u);if(e)e.count+=1;else s.set(u,{level:n,message:c,count:1})}return[...s.values()]}function looksLikeItems(a){const s=arr(a).map(rec).filter(Boolean);if(s.length<2)return void 0;const r=s.every(o=>str(o.name)&&(o.image!==void 0||o.qty!==void 0||o.price!==void 0||o.unitPrice!==void 0));return r?s:void 0}function money(a){const s=num(a);return s===void 0?void 0:`$${(s/100).toFixed(2)}`}function projectReceipt(a){const{toolId:s,action:r,params:o,result:c}=a;const n=rec(c);const u=a.effect==="read"?"live":"changed";if(s==="network"&&r==="getSnapshot"&&n){const e=arr(n.requests).map(rec).filter(Boolean).map(t=>requestSummary(t)).filter(Boolean);if(e.length===0)return void 0;return{id:id(),kind:"requestList",requests:e,total:num(n.totalCaptured)??e.length,source:u}}if(s==="network"&&r==="getEventBody"&&n){const e=str(o.id)??"";const t=n.override!=null&&typeof n.override==="object";return{id:id(),kind:"requestCard",request:{id:e,method:str(n.method)??"",url:str(n.url)??e,status:num(n.status),mocked:t||void 0},requestBody:n.requestData??void 0,responseBody:n.responseData??void 0,source:t?"mocked":u}}if(s==="network"&&(r==="upsertOverrideRule"||r==="getOverrideRuleBody")&&n){const e=rec(n.rule)??n;const t=str(e.id);const i=str(e.urlPattern);if(!t||!i)return void 0;const d=str(e.kind)??"respond";const l=rec(o.rule)??{};return{id:id(),kind:"ruleCard",rule:{id:t,name:str(e.name)??str(l.name),urlPattern:i,methods:arr(e.methods??l.methods).map(String),kind:d,status:num(e.status)??num(l.status),delayMs:num(e.delayMs)??num(l.delayMs),times:num(e.times)??num(l.times),enabled:e.enabled!==false,hits:num(e.hits)},source:r==="upsertOverrideRule"?"changed":"live"}}if(s==="network"&&r==="listOverrideRules"&&n){const e=arr(n.rules).map(rec).filter(Boolean);if(e.length===0)return void 0;return{id:id(),kind:"list",title:`${e.length} network override${e.length===1?"":"s"}`,items:e.map(t=>({id:str(t.id),title:str(t.name)??str(t.urlPattern)??"rule",subtitle:`${arr(t.methods).join("/")||"ANY"} ${str(t.urlPattern)??""} \u2192 ${str(t.kind)??""}${t.status?` ${String(t.status)}`:""}`,trailing:t.enabled===false?"off":`on \xB7 ${num(t.hits)??0} hit${num(t.hits)===1?"":"s"}`,tone:t.enabled===false?"muted":"warning"})),total:e.length,source:"live"}}if(s==="route-events"&&r==="getSnapshot"&&n){const e=[...new Set(arr(n.routes).map(String))];if(e.length===0)return void 0;const t=rec(n.currentRoute);return{id:id(),kind:"routeChips",routes:e.map(i=>({path:i,dynamic:/\[.+\]/.test(i)})),current:str(t?.path),total:e.length,source:"live"}}if(s==="route-events"&&r==="navigate"&&n){const e=str(n.navigated)??str(o.path);return e?{id:id(),kind:"peek",label:`Opened ${e}`,path:e}:void 0}if(s==="route-events"&&(r==="stackGoBack"||r==="stackPopToTop")){return{id:id(),kind:"peek",label:r==="stackPopToTop"?"Went back to the first screen":"Went back"}}if(s==="highlight-updates"&&r==="describeScreen"&&n){const e=arr(n.elements).map(rec).filter(Boolean);const t=e.filter(i=>i.interactive===true&&!String(str(i.testID)??"").startsWith("buoy-"));if(t.length===0)return void 0;return{id:id(),kind:"screenElements",elements:t.map(i=>({nativeTag:num(i.nativeTag)??0,name:str(i.name)??"",label:str(i.label)??str(i.text),testID:str(i.testID),interactive:true})),total:t.length,source:"live"}}if(s==="highlight-updates"&&r==="tapElement"&&n?.tapped===true){const e=rec(n.matched);const t=str(e?.label)??str(e?.text)??str(e?.testID)??"element";return{id:id(),kind:"peek",label:`Tapped ${t}`}}if(s==="console"&&r==="getSnapshot"&&n){const e=arr(n.entries);if(e.length===0)return void 0;const t=groupLogs(e);return{id:id(),kind:"logList",entries:t,total:num(n.totalCaptured)??e.length,source:"live"}}if(s==="zustand"&&r==="getStoreState"&&n?.found!==false){const e=rec(n?.currentState);if(!e)return void 0;const t=looksLikeItems(e.lines??e.items);if(t){return{id:id(),kind:"list",title:str(o.storeName),items:t.map(d=>({id:str(d.lineId)??str(d.id),title:str(d.name)??"",subtitle:[str(d.sizeName),d.qty!==void 0?`\xD7${String(d.qty)}`:void 0].filter(Boolean).join(" \xB7 "),trailing:money(d.unitPrice??d.price),image:str(d.image)})),total:t.length,source:"live"}}const i=Object.entries(e).filter(([,d])=>typeof d!=="function").map(([d,l])=>({key:d,value:l}));return{id:id(),kind:"keyValue",title:str(o.storeName),pairs:i,source:"live"}}if(s==="zustand"&&r==="setState"&&n?.ok!==false){const e=rec(a.before)?.currentState??a.before;const t=a.after===void 0?void 0:rec(a.after)?.currentState??a.after;const i=t!==void 0?shallowDiff(e,t):o.replace===true?shallowDiff(e,o.state):patchDiff(e,o.state);if(i.length===0)return void 0;return{id:id(),kind:"diff",title:`${str(o.storeName)??"store"} \u2014 what changed`,changes:i,source:"changed"}}if(s==="zustand"&&r==="listStores"&&n){const e=arr(n.stores).map(rec).filter(Boolean);if(e.length===0)return void 0;return{id:id(),kind:"list",title:`${e.length} store${e.length===1?"":"s"}`,items:e.map(t=>({id:str(t.name),title:str(t.name)??"",subtitle:arr(t.keys).slice(0,6).join(", "),trailing:t.isPersisted?"persisted":void 0})),total:e.length,source:"live"}}if(s==="redux"&&r==="getState"&&n?.available!==false){const e=rec(n?.state)??n;if(!e)return void 0;const t=Object.entries(e).map(([i,d])=>({key:i,value:d}));return{id:id(),kind:"keyValue",title:"Redux state",pairs:t,source:"live"}}if(s==="storage"&&(r==="async.getItem"||r==="mmkv.get"||r==="secure.get")){const e=str(o.key)??"";let t=n&&"value"in n?n.value:c;if(n?.found===false||t===null||t===void 0)return void 0;if(typeof t==="string"){try{t=JSON.parse(t)}catch{}}const i=rec(t);const d=looksLikeItems(rec(i?.state)?.lines??i?.lines??i?.items);if(d){return{id:id(),kind:"list",title:e,items:d.map(l=>({id:str(l.lineId)??str(l.id),title:str(l.name)??"",subtitle:[str(l.sizeName),l.qty!==void 0?`\xD7${String(l.qty)}`:void 0].filter(Boolean).join(" \xB7 "),trailing:money(l.unitPrice??l.price),image:str(l.image)})),total:d.length,source:"live"}}if(i){const l=Object.entries(i).map(([p,f])=>({key:p,value:f}));return{id:id(),kind:"keyValue",title:e,pairs:l,source:"live"}}return{id:id(),kind:"keyValue",title:e,pairs:[{key:"value",value:t}],source:"live"}}if(s==="storage"&&r==="async.getAllKeys"){const e=arr(c).map(String);if(e.length===0)return void 0;return{id:id(),kind:"list",title:`${e.length} stored key${e.length===1?"":"s"}`,items:e.map(t=>({id:t,title:t,action:{label:"Read",dispatch:{toolId:"storage",action:"async.getItem",params:{key:t}}}})),total:e.length,source:"live"}}if(s==="storage"&&(r==="async.setItem"||r==="mmkv.set"||r==="secure.set")){const e=str(o.key)??"";const t=rec(a.before);const i=t?.had?t.value:void 0;return{id:id(),kind:"diff",title:`${e} \u2014 saved`,changes:[{path:e,before:i,after:o.value}],source:"changed"}}if(s==="env"&&r==="getSnapshot"&&n){const e=rec(n.env);if(!e||Object.keys(e).length===0)return void 0;const t=Object.entries(e).map(([i,d])=>({key:i,value:d}));return{id:id(),kind:"keyValue",title:`Environment \u2014 ${Object.keys(e).length} var${Object.keys(e).length===1?"":"s"}`,pairs:t,source:"live"}}if(s==="sentry"&&r==="getSnapshot"&&n){const e=arr(n.envelopes).map(rec).filter(Boolean);const t=str(n.status);if(e.length===0){if(t==="sdk-not-found"||t==="no-client"){return{id:id(),kind:"notice",tone:"warning",text:`This app has no live Sentry client, so nothing can ever be captured here \u2014 that's different from "nothing was sent".`}}return void 0}return{id:id(),kind:"list",title:`${num(n.totalCaptured)??e.length} envelope${(num(n.totalCaptured)??e.length)===1?"":"s"} sent to Sentry`,items:e.map(i=>{const d=arr(i.items).map(rec).filter(Boolean);const l=d[0];const p=d.some(f=>f.type==="event");return{id:i.id!==void 0?String(i.id):void 0,title:str(l?.summary)??str(l?.type)??"envelope",subtitle:d.map(f=>str(f.type)).filter(Boolean).join(" \xB7 "),trailing:str(i.origin),tone:p?"danger":void 0}}),total:num(n.totalCaptured)??e.length,source:"live"}}if(s==="impersonate"&&r==="searchUsers"){const e=arr(c).map(rec).filter(Boolean);if(e.length===0)return void 0;return{id:id(),kind:"list",title:`${e.length} user${e.length===1?"":"s"} found`,items:e.map(t=>({id:str(t.id),title:str(t.displayName)??str(t.email)??str(t.id)??"user",subtitle:[str(t.email),str(rec(t.metadata)?.role)].filter(Boolean).join(" \xB7 "),image:str(t.avatarUrl),action:{label:"Impersonate",dispatch:{toolId:"impersonate",action:"startImpersonation",params:{user:t}}}})),total:e.length,source:"live"}}if(s==="impersonate"&&r==="startImpersonation"&&n?.ok!==false){const e=rec(o.user);const t=str(e?.displayName)??str(e?.email)??str(e?.id)??"that user";return{id:id(),kind:"notice",tone:"warning",text:`Now viewing the app as ${t}. Cached data was cleared so everything refetches as them \u2014 stopping clears caches again.`}}if(s==="impersonate"&&r==="stopImpersonation"){return{id:id(),kind:"notice",tone:"info",text:"Stopped impersonating \u2014 back to the real account. Cached app data was cleared again."}}if(s==="scenarios"&&r==="listScenarios"&&n){const e=[...arr(n.code),...arr(n.device),...arr(n.drafts)].map(rec).filter(Boolean);if(e.length===0)return void 0;return{id:id(),kind:"list",title:`${e.length} scenario${e.length===1?"":"s"}`,items:e.map(t=>({id:str(t.id),title:str(t.name)??str(t.id)??"scenario",subtitle:str(t.description),trailing:str(t.source)==="draft"?"draft \u2014 needs accepting":num(t.stepCount)!==void 0?`${String(num(t.stepCount))} step${num(t.stepCount)===1?"":"s"}`:void 0,tone:str(t.source)==="draft"?"muted":void 0})),total:e.length,source:"live"}}if(s==="scenarios"&&r==="run"&&n){if(n.ok===false){const t=arr(n.preflightErrors).map(String).join("; ");return{id:id(),kind:"notice",tone:"warning",text:`The scenario did not run \u2014 pre-flight failed${t?`: ${t}`:""}. Nothing was applied.`}}const e=arr(n.steps).map(rec).filter(Boolean);if(e.length===0)return void 0;return{id:id(),kind:"steps",title:`Ran ${str(n.name)??"the scenario"}`,steps:e.map(t=>({text:str(t.label)??"step",state:t.skipped===true?"todo":t.ok===false?"failed":"done"}))}}if(s==="time-machine"&&r==="list"&&n){const e=arr(n.snapshots).map(rec).filter(Boolean);if(e.length===0)return void 0;return{id:id(),kind:"list",title:`${e.length} restore point${e.length===1?"":"s"}`,items:e.map(t=>({id:str(t.id),title:str(t.name)??str(t.id)??"snapshot",subtitle:str(rec(t.route)?.pathname),trailing:t.baseline===true?"baseline":void 0})),total:e.length,source:"live"}}if(s==="time-machine"&&r==="capture"&&n){return{id:id(),kind:"notice",tone:"info",text:`Saved a restore point${typeof o.name==="string"?` \u2014 "${o.name}"`:""}. The app can be brought back to this exact state any time.`}}if(s==="time-machine"&&r==="restore"&&n){return{id:id(),kind:"notice",tone:"warning",text:"Restored the snapshot \u2014 the app's state just jumped back. What's on screen now reflects the restore point, not what happened since."}}if(s==="jotai"&&r==="listAtoms"&&n){const e=arr(n.atoms).map(rec).filter(Boolean);if(e.length===0)return void 0;return{id:id(),kind:"list",title:`${num(n.total)??e.length} atom${(num(n.total)??e.length)===1?"":"s"}`,items:e.map(t=>({id:str(t.label),title:str(t.label)??"atom",subtitle:t.writable===true?"writable":"read-only (derived)",trailing:num(t.changes)!==void 0?`${String(num(t.changes))} change${num(t.changes)===1?"":"s"}`:void 0})),total:num(n.total)??e.length,source:"live"}}if(s==="images"&&r==="list"&&n){const e=arr(n.records).map(rec).filter(Boolean);const t=e.map(i=>({url:str(i.uri)??"",alt:str(i.uri)?.split("/").pop()??"image",caption:i.ms!==void 0?`${String(i.ms)} ms \xB7 ${str(i.cache)??""}`:void 0})).filter(i=>i.url);if(t.length===0)return void 0;return{id:id(),kind:"imageGrid",title:"Images the app has loaded",images:t.slice(0,_types.CAPS.gridMax),total:num(n.total)??t.length,source:"live"}}if(s==="query"&&r==="setQueryData"&&n?.ok!==false){const e=rec(a.before)?.data??a.before;const t=a.after===void 0?void 0:rec(a.after)?.data??a.after;const i=t!==void 0?shallowDiff(e,t):patchDiff(e,o.data);if(i.length===0)return void 0;const d=Array.isArray(o.queryKey)?o.queryKey.filter(l=>typeof l==="string").join(" \u203A "):void 0;return{id:id(),kind:"diff",title:`${d||str(o.queryHash)||"query"} \u2014 what changed`,changes:i,source:"changed"}}if(s==="query"&&r==="listQueries"&&n){const e=arr(n.queries).map(rec).filter(Boolean);if(e.length===0)return void 0;return{id:id(),kind:"list",title:`${e.length} cached quer${e.length===1?"y":"ies"}`,items:e.map(t=>{const i=arr(t.queryKey).filter(l=>typeof l==="string").join(" \u203A ")||str(t.queryHash)||"query";const d=t.isStale===true;return{id:str(t.queryHash),title:i,subtitle:`${str(t.status)??""}${t.fetchStatus&&t.fetchStatus!=="idle"?` \xB7 ${String(t.fetchStatus)}`:""}`,trailing:d?"stale":"fresh",tone:d?"warning":"accent"}}),total:e.length,source:"live"}}if(s==="highlight-updates"&&r==="endMeasurement"&&n){const e=arr(n.components??n.renders).map(rec).filter(Boolean);const t=e.map(i=>({label:str(i.name)??str(i.componentName)??"?",value:num(i.renders)??num(i.count)??0})).filter(i=>i.value>0).sort((i,d)=>d.value-i.value).slice(0,_types.CAPS.chartBars);if(t.length===0)return void 0;return{id:id(),kind:"chart",title:"Renders during the measurement",bars:t.map(i=>({...i,unit:"renders"})),source:"live"}}return void 0}
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.projectReceipt=projectReceipt;exports.shallowDiff=shallowDiff;var _runId=require("./runId");var _types=require("./types");const id=(0,_runId.idFactory)("rc");const rec=a=>a&&typeof a==="object"&&!Array.isArray(a)?a:void 0;const arr=a=>Array.isArray(a)?a:[];const str=a=>typeof a==="string"?a:void 0;const num=a=>typeof a==="number"?a:void 0;function pathOf(a){try{const s=new URL(a);return s.pathname+(s.search.length>1?"?\u2026":"")}catch{return a}}function requestSummary(a){const s=str(a.id);const r=str(a.url);if(!s||!r)return void 0;return{id:s,method:str(a.method)??"GET",url:r,status:num(a.status),durationMs:num(a.durationMs),mocked:a.overridden===true||a.override!=null&&typeof a.override==="object"||void 0}}function patchDiff(a,s){const r=rec(a)??{};const o=rec(s)??{};const c=[];for(const n of Object.keys(o)){if(typeof r[n]==="function"||typeof o[n]==="function")continue;if(JSON.stringify(r[n])!==JSON.stringify(o[n]))c.push({path:n,before:r[n],after:o[n]})}return c}function shallowDiff(a,s){const r=rec(a)??{};const o=rec(s)??{};const c=new Set([...Object.keys(r),...Object.keys(o)]);const n=[];for(const u of c){if(typeof r[u]==="function"||typeof o[u]==="function")continue;if(JSON.stringify(r[u])!==JSON.stringify(o[u])){n.push({path:u,before:r[u],after:o[u]})}}return n}function groupLogs(a){const s=new Map;for(const r of a){const o=rec(r);if(!o)continue;const c=str(o.message)??"";const n=str(o.level)??"log";const u=`${n}:${c}`;const e=s.get(u);if(e)e.count+=1;else s.set(u,{level:n,message:c,count:1})}return[...s.values()]}function looksLikeItems(a){const s=arr(a).map(rec).filter(Boolean);if(s.length<2)return void 0;const r=s.every(o=>str(o.name)&&(o.image!==void 0||o.qty!==void 0||o.price!==void 0||o.unitPrice!==void 0));return r?s:void 0}function money(a){const s=num(a);return s===void 0?void 0:`$${(s/100).toFixed(2)}`}function projectReceipt(a){const{toolId:s,action:r,params:o,result:c}=a;const n=rec(c);const u=a.effect==="read"?"live":"changed";if(s==="network"&&r==="getSnapshot"&&n){const e=arr(n.requests).map(rec).filter(Boolean).map(t=>requestSummary(t)).filter(Boolean);if(e.length===0)return void 0;return{id:id(),kind:"requestList",requests:e,total:num(n.totalCaptured)??e.length,source:u}}if(s==="network"&&r==="getEventBody"&&n){const e=str(o.id)??"";const t=n.override!=null&&typeof n.override==="object";return{id:id(),kind:"requestCard",request:{id:e,method:str(n.method)??"",url:str(n.url)??e,status:num(n.status),mocked:t||void 0},requestBody:n.requestData??void 0,responseBody:n.responseData??void 0,source:t?"mocked":u}}if(s==="network"&&(r==="upsertOverrideRule"||r==="getOverrideRuleBody")&&n){const e=rec(n.rule)??n;const t=str(e.id);const i=str(e.urlPattern);if(!t||!i)return void 0;const d=str(e.kind)??"respond";const l=rec(o.rule)??{};return{id:id(),kind:"ruleCard",rule:{id:t,name:str(e.name)??str(l.name),urlPattern:i,methods:arr(e.methods??l.methods).map(String),kind:d,status:num(e.status)??num(l.status),delayMs:num(e.delayMs)??num(l.delayMs),times:num(e.times)??num(l.times),enabled:e.enabled!==false,hits:num(e.hits)},source:r==="upsertOverrideRule"?"changed":"live"}}if(s==="network"&&r==="listOverrideRules"&&n){const e=arr(n.rules).map(rec).filter(Boolean);if(e.length===0)return void 0;return{id:id(),kind:"list",title:`${e.length} network override${e.length===1?"":"s"}`,items:e.map(t=>({id:str(t.id),title:str(t.name)??str(t.urlPattern)??"rule",subtitle:`${arr(t.methods).join("/")||"ANY"} ${str(t.urlPattern)??""} \u2192 ${str(t.kind)??""}${t.status?` ${String(t.status)}`:""}`,trailing:t.enabled===false?"off":`on \xB7 ${num(t.hits)??0} hit${num(t.hits)===1?"":"s"}`,tone:t.enabled===false?"muted":"warning"})),total:e.length,source:"live"}}if(s==="route-events"&&r==="getSnapshot"&&n){const e=[...new Set(arr(n.routes).map(String))];if(e.length===0)return void 0;const t=rec(n.currentRoute);return{id:id(),kind:"routeChips",routes:e.map(i=>({path:i,dynamic:/\[.+\]/.test(i)})),current:str(t?.path),total:e.length,source:"live"}}if(s==="route-events"&&r==="navigate"&&n){const e=str(n.navigated)??str(o.path);return e?{id:id(),kind:"peek",label:`Opened ${e}`,path:e}:void 0}if(s==="route-events"&&(r==="stackGoBack"||r==="stackPopToTop")){return{id:id(),kind:"peek",label:r==="stackPopToTop"?"Went back to the first screen":"Went back"}}if(s==="highlight-updates"&&r==="describeScreen"&&n){const e=arr(n.elements).map(rec).filter(Boolean);const t=e.filter(i=>i.interactive===true&&!String(str(i.testID)??"").startsWith("buoy-"));if(t.length===0)return void 0;return{id:id(),kind:"screenElements",elements:t.map(i=>({nativeTag:num(i.nativeTag)??0,name:str(i.name)??"",label:str(i.label)??str(i.text),testID:str(i.testID),interactive:true})),total:t.length,source:"live"}}if(s==="highlight-updates"&&r==="tapElement"&&n?.tapped===true){const e=rec(n.matched);const t=str(e?.label)??str(e?.text)??str(e?.testID)??"element";return{id:id(),kind:"peek",label:`Tapped ${t}`}}if(s==="console"&&r==="getSnapshot"&&n){const e=arr(n.entries);if(e.length===0)return void 0;const t=groupLogs(e);return{id:id(),kind:"logList",entries:t,total:num(n.totalCaptured)??e.length,source:"live"}}if(s==="zustand"&&r==="getStoreState"&&n?.found!==false){const e=rec(n?.currentState);if(!e)return void 0;const t=looksLikeItems(e.lines??e.items);if(t){return{id:id(),kind:"list",title:str(o.storeName),items:t.map(d=>({id:str(d.lineId)??str(d.id),title:str(d.name)??"",subtitle:[str(d.sizeName),d.qty!==void 0?`\xD7${String(d.qty)}`:void 0].filter(Boolean).join(" \xB7 "),trailing:money(d.unitPrice??d.price),image:str(d.image)})),total:t.length,source:"live"}}const i=Object.entries(e).filter(([,d])=>typeof d!=="function").map(([d,l])=>({key:d,value:l}));return{id:id(),kind:"keyValue",title:str(o.storeName),pairs:i,source:"live"}}if(s==="zustand"&&r==="setState"&&n?.ok!==false){const e=rec(a.before)?.currentState??a.before;const t=a.after===void 0?void 0:rec(a.after)?.currentState??a.after;const i=t!==void 0?shallowDiff(e,t):o.replace===true?shallowDiff(e,o.state):patchDiff(e,o.state);if(i.length===0)return void 0;return{id:id(),kind:"diff",title:`${str(o.storeName)??"store"} \u2014 what changed`,changes:i,source:"changed"}}if(s==="zustand"&&r==="listStores"&&n){const e=arr(n.stores).map(rec).filter(Boolean);if(e.length===0)return void 0;return{id:id(),kind:"list",title:`${e.length} store${e.length===1?"":"s"}`,items:e.map(t=>({id:str(t.name),title:str(t.name)??"",subtitle:arr(t.keys).slice(0,6).join(", "),trailing:t.isPersisted?"persisted":void 0})),total:e.length,source:"live"}}if(s==="redux"&&r==="getState"&&n?.available!==false){const e=rec(n?.state)??n;if(!e)return void 0;const t=Object.entries(e).map(([i,d])=>({key:i,value:d}));return{id:id(),kind:"keyValue",title:"Redux state",pairs:t,source:"live"}}if(s==="storage"&&(r==="async.getItem"||r==="mmkv.get"||r==="secure.get")){const e=str(o.key)??"";let t=n&&"value"in n?n.value:c;if(n?.found===false||t===null||t===void 0)return void 0;if(typeof t==="string"){try{t=JSON.parse(t)}catch{}}const i=rec(t);const d=looksLikeItems(rec(i?.state)?.lines??i?.lines??i?.items);if(d){return{id:id(),kind:"list",title:e,items:d.map(l=>({id:str(l.lineId)??str(l.id),title:str(l.name)??"",subtitle:[str(l.sizeName),l.qty!==void 0?`\xD7${String(l.qty)}`:void 0].filter(Boolean).join(" \xB7 "),trailing:money(l.unitPrice??l.price),image:str(l.image)})),total:d.length,source:"live"}}if(i){const l=Object.entries(i).map(([m,f])=>({key:m,value:f}));return{id:id(),kind:"keyValue",title:e,pairs:l,source:"live"}}return{id:id(),kind:"keyValue",title:e,pairs:[{key:"value",value:t}],source:"live"}}if(s==="storage"&&r==="async.getAllKeys"){const e=arr(c).map(String);if(e.length===0)return void 0;return{id:id(),kind:"list",title:`${e.length} stored key${e.length===1?"":"s"}`,items:e.map(t=>({id:t,title:t,action:{label:"Read",dispatch:{toolId:"storage",action:"async.getItem",params:{key:t}}}})),total:e.length,source:"live"}}if(s==="storage"&&(r==="async.setItem"||r==="mmkv.set"||r==="secure.set")){const e=str(o.key)??"";const t=rec(a.before);const i=t?.had?t.value:void 0;return{id:id(),kind:"diff",title:`${e} \u2014 saved`,changes:[{path:e,before:i,after:o.value}],source:"changed"}}if(s==="env"&&r==="getSnapshot"&&n){const e=rec(n.env);if(!e||Object.keys(e).length===0)return void 0;const t=Object.entries(e).map(([i,d])=>({key:i,value:d}));return{id:id(),kind:"keyValue",title:`Environment \u2014 ${Object.keys(e).length} var${Object.keys(e).length===1?"":"s"}`,pairs:t,source:"live"}}if(s==="sentry"&&r==="getSnapshot"&&n){const e=arr(n.envelopes).map(rec).filter(Boolean);const t=str(n.status);if(e.length===0){if(t==="sdk-not-found"||t==="no-client"){return{id:id(),kind:"notice",tone:"warning",text:`This app has no live Sentry client, so nothing can ever be captured here \u2014 that's different from "nothing was sent".`}}return void 0}return{id:id(),kind:"list",title:`${num(n.totalCaptured)??e.length} envelope${(num(n.totalCaptured)??e.length)===1?"":"s"} sent to Sentry`,items:e.map(i=>{const d=arr(i.items).map(rec).filter(Boolean);const l=d[0];const m=d.some(f=>f.type==="event");return{id:i.id!==void 0?String(i.id):void 0,title:str(l?.summary)??str(l?.type)??"envelope",subtitle:d.map(f=>str(f.type)).filter(Boolean).join(" \xB7 "),trailing:str(i.origin),tone:m?"danger":void 0}}),total:num(n.totalCaptured)??e.length,source:"live"}}if(s==="impersonate"&&r==="searchUsers"){const e=arr(c).map(rec).filter(Boolean);if(e.length===0)return void 0;return{id:id(),kind:"list",title:`${e.length} user${e.length===1?"":"s"} found`,items:e.map(t=>({id:str(t.id),title:str(t.displayName)??str(t.email)??str(t.id)??"user",subtitle:[str(t.email),str(rec(t.metadata)?.role)].filter(Boolean).join(" \xB7 "),image:str(t.avatarUrl),action:{label:"Impersonate",dispatch:{toolId:"impersonate",action:"startImpersonation",params:{user:t}}}})),total:e.length,source:"live"}}if(s==="impersonate"&&r==="startImpersonation"&&n?.ok!==false){const e=rec(o.user);const t=str(e?.displayName)??str(e?.email)??str(e?.id)??"that user";return{id:id(),kind:"notice",tone:"warning",text:`Now acting as ${t}. Screens from before the switch may still show old data. They may need to reload.`}}if(s==="impersonate"&&r==="stopImpersonation"&&n?.ok!==false){return{id:id(),kind:"notice",tone:"info",text:"Stopped acting as that user. Screens may still show old data. They may need to reload."}}if(s==="scenarios"&&r==="listScenarios"&&n){const e=[...arr(n.code),...arr(n.device),...arr(n.drafts)].map(rec).filter(Boolean);if(e.length===0)return void 0;return{id:id(),kind:"list",title:`${e.length} scenario${e.length===1?"":"s"}`,items:e.map(t=>({id:str(t.id),title:str(t.name)??str(t.id)??"scenario",subtitle:str(t.description),trailing:str(t.source)==="draft"?"draft \u2014 needs accepting":num(t.stepCount)!==void 0?`${String(num(t.stepCount))} step${num(t.stepCount)===1?"":"s"}`:void 0,tone:str(t.source)==="draft"?"muted":void 0})),total:e.length,source:"live"}}if(s==="scenarios"&&r==="run"&&n){if(n.ok===false){const t=arr(n.preflightErrors).map(String).join("; ");return{id:id(),kind:"notice",tone:"warning",text:`The scenario did not run \u2014 pre-flight failed${t?`: ${t}`:""}. Nothing was applied.`}}const e=arr(n.steps).map(rec).filter(Boolean);if(e.length===0)return void 0;return{id:id(),kind:"steps",title:`Ran ${str(n.name)??"the scenario"}`,steps:e.map(t=>({text:str(t.label)??"step",state:t.skipped===true?"todo":t.ok===false?"failed":"done"}))}}if(s==="time-machine"&&r==="list"&&n){const e=arr(n.snapshots).map(rec).filter(Boolean);if(e.length===0)return void 0;return{id:id(),kind:"list",title:`${e.length} restore point${e.length===1?"":"s"}`,items:e.map(t=>({id:str(t.id),title:str(t.name)??str(t.id)??"snapshot",subtitle:str(rec(t.route)?.pathname),trailing:t.baseline===true?"baseline":void 0})),total:e.length,source:"live"}}if(s==="time-machine"&&r==="capture"&&n){return{id:id(),kind:"notice",tone:"info",text:`Saved a restore point${typeof o.name==="string"?` \u2014 "${o.name}"`:""}. The app can be brought back to this exact state any time.`}}if(s==="time-machine"&&r==="restore"&&n){return{id:id(),kind:"notice",tone:"warning",text:"Restored the snapshot \u2014 the app's state just jumped back. What's on screen now reflects the restore point, not what happened since."}}if(s==="jotai"&&r==="listAtoms"&&n){const e=arr(n.atoms).map(rec).filter(Boolean);if(e.length===0)return void 0;return{id:id(),kind:"list",title:`${num(n.total)??e.length} atom${(num(n.total)??e.length)===1?"":"s"}`,items:e.map(t=>({id:str(t.label),title:str(t.label)??"atom",subtitle:t.writable===true?"writable":"read-only (derived)",trailing:num(t.changes)!==void 0?`${String(num(t.changes))} change${num(t.changes)===1?"":"s"}`:void 0})),total:num(n.total)??e.length,source:"live"}}if(s==="images"&&r==="list"&&n){const e=arr(n.records).map(rec).filter(Boolean);const t=e.map(i=>({url:str(i.uri)??"",alt:str(i.uri)?.split("/").pop()??"image",caption:i.ms!==void 0?`${String(i.ms)} ms \xB7 ${str(i.cache)??""}`:void 0})).filter(i=>i.url);if(t.length===0)return void 0;return{id:id(),kind:"imageGrid",title:"Images the app has loaded",images:t.slice(0,_types.CAPS.gridMax),total:num(n.total)??t.length,source:"live"}}if(s==="query"&&r==="setQueryData"&&n?.ok!==false){const e=rec(a.before)?.data??a.before;const t=a.after===void 0?void 0:rec(a.after)?.data??a.after;const i=t!==void 0?shallowDiff(e,t):patchDiff(e,o.data);if(i.length===0)return void 0;const d=Array.isArray(o.queryKey)?o.queryKey.filter(l=>typeof l==="string").join(" \u203A "):void 0;return{id:id(),kind:"diff",title:`${d||str(o.queryHash)||"query"} \u2014 what changed`,changes:i,source:"changed"}}if(s==="query"&&r==="listQueries"&&n){const e=arr(n.queries).map(rec).filter(Boolean);if(e.length===0)return void 0;return{id:id(),kind:"list",title:`${e.length} cached quer${e.length===1?"y":"ies"}`,items:e.map(t=>{const i=arr(t.queryKey).filter(l=>typeof l==="string").join(" \u203A ")||str(t.queryHash)||"query";const d=t.isStale===true;return{id:str(t.queryHash),title:i,subtitle:`${str(t.status)??""}${t.fetchStatus&&t.fetchStatus!=="idle"?` \xB7 ${String(t.fetchStatus)}`:""}`,trailing:d?"stale":"fresh",tone:d?"warning":"accent"}}),total:e.length,source:"live"}}if(s==="highlight-updates"&&r==="endMeasurement"&&n){const e=arr(n.components??n.renders).map(rec).filter(Boolean);const t=e.map(i=>({label:str(i.name)??str(i.componentName)??"?",value:num(i.renders)??num(i.count)??0})).filter(i=>i.value>0).sort((i,d)=>d.value-i.value).slice(0,_types.CAPS.chartBars);if(t.length===0)return void 0;return{id:id(),kind:"chart",title:"Renders during the measurement",bars:t.map(i=>({...i,unit:"renders"})),source:"live"}}return void 0}
|