lensmcp 1.23.10 → 1.23.11
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/README.md +9 -3
- package/bin.js +1 -1
- package/bundled/dashboard.js +1 -1
- package/lib/agent-plugins.js +2 -2
- package/lib/cli-help.js +3 -3
- package/lib/cli.js +23 -18
- package/lib/dismiss-command.js +2 -2
- package/lib/duplicate-registration.js +1 -1
- package/lib/hook-memory.js +1 -1
- package/lib/lint-args.js +1 -1
- package/lib/mcp-mode.js +2 -2
- package/lib/mcp-restart.js +1 -1
- package/lib/mcp-wiring.js +2 -2
- package/lib/plugin-version.js +3 -3
- package/lib/process-identity.js +1 -1
- package/lib/recycle-policy.js +1 -1
- package/lib/status-client.js +2 -2
- package/lib/status-policy.js +2 -2
- package/lib/sweep.js +1 -1
- package/lib/upgrade.d.ts +66 -0
- package/lib/upgrade.js +3 -1
- package/lib/workspace-scope.js +2 -2
- package/package.json +3 -3
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugins/lensmcp/.codex-plugin/plugin.json +1 -1
package/README.md
CHANGED
|
@@ -84,7 +84,7 @@ scope of the existing install.
|
|
|
84
84
|
### `lensmcp upgrade`
|
|
85
85
|
|
|
86
86
|
```bash
|
|
87
|
-
lensmcp upgrade [version] [--dry-run] [--no-install] [--no-plugins] [--no-global] [--no-restart]
|
|
87
|
+
lensmcp upgrade [version] [--dry-run] [--no-install] [--no-plugins] [--no-global] [--no-restart] [--no-registry-check]
|
|
88
88
|
```
|
|
89
89
|
|
|
90
90
|
One command that moves the whole machine to one lensmcp version (latest by default), in
|
|
@@ -102,8 +102,14 @@ the only order that works:
|
|
|
102
102
|
when no package.json moved, if it provably lags the target.
|
|
103
103
|
|
|
104
104
|
Per-workspace failure posture: one failed install never blocks the others, every failure
|
|
105
|
-
names the command that finishes the job by hand, and re-running converges
|
|
106
|
-
|
|
105
|
+
names the command that finishes the job by hand, and re-running converges — a workspace
|
|
106
|
+
whose package.json is already at the target but whose node_modules is not gets its install
|
|
107
|
+
run again. `--dry-run` prints the full plan without changing anything.
|
|
108
|
+
|
|
109
|
+
A version the npm registry does not have is refused before anything is touched (a typo, or a
|
|
110
|
+
publish still in flight); `--no-registry-check` skips the question. The command ends by naming
|
|
111
|
+
each workspace that still needs `lensmcp setup`: the lens gates its tools until setup has run
|
|
112
|
+
for the installed version, so every upgrade closes that gate.
|
|
107
113
|
|
|
108
114
|
### `lensmcp doctor`
|
|
109
115
|
|
package/bin.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";import{runCli as
|
|
2
|
+
"use strict";import{runCli as s}from"./lib/cli.js";import{ignoreEpipe as e}from"./lib/cli-help.js";e(process.stdout),e(process.stderr),s({cwd:process.cwd(),argv:process.argv.slice(2)}).then(r=>{process.exit(r.exitCode)},r=>{console.error(r instanceof Error?r.stack??r.message:String(r)),process.exit(1)});
|
package/bundled/dashboard.js
CHANGED
|
@@ -71,7 +71,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
71
71
|
`)}s(K6,"pj"),o(K6,"buildExplanation");import{Tool as Wx,ToolContext as Gx,z as je}from"@frontmcp/sdk";import{mkdirSync as Kx,readFileSync as Hx,renameSync as Xx,writeFileSync as Yx}from"node:fs";import{join as Qx}from"node:path";var eC=500;function H6(e){try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}s(H6,"bj"),o(H6,"pidAlive");function X6(e){try{let t=JSON.parse(Hx(e,"utf8"));return Array.isArray(t?.rules)?t.rules:[]}catch{return[]}}s(X6,"wj"),o(X6,"readEntries");function Y6(e,t,r={}){let i=r.pid??process.pid,u=r.isAlive??H6,n=Qx(e,lD),a=[...X6(n).filter(d=>typeof d?.registeredBy=="number"&&typeof d?.rule?.id=="string"&&d.rule.id!==t.id&&(d.registeredBy===i||u(d.registeredBy))),{rule:t,registeredBy:i,registeredAt:(r.now??Date.now)()}].slice(-eC);Kx(e,{recursive:!0});let l=`${n}.${i}.tmp`;return Yx(l,JSON.stringify({schemaVersion:1,rules:a})),Xx(l,n),a}s(Y6,"K$"),o(Y6,"registerSessionRule");var Pc=class extends Gx{static{s(this,"fv")}static{o(this,"VisualRegisterRuleTool")}async execute(e){let t=this.get(Ir),r=this.get(q),i={id:e.id,type:e.type,target:e.target,severity:e.severity,timing:e.timing,expected:e.expected,breakpoints:e.breakpoints};t.publish({id:tt(),sessionId:"visual.register_rule",timestamp:Date.now(),source:"visual",category:"visual",severity:"info",context:{sessionId:"visual.register_rule"},fingerprint:`visual-rule-registered:${e.id}`,title:`visual.register_rule(${e.id})`,raw:{kind:"visual-rule-registered",rule:i}});let u=jc(),n=!1,a;try{Y6(u,i),n=zc(u)!==void 0,a=n?"The capture runner evaluates this rule on the next captured frame (visual.capture_frame).":"No capture runner is listening, so nothing will evaluate this rule until one starts (the dev cluster gateway or agent-dev). It is listed, not enforced."}catch(l){a=`Could not hand the rule to the capture runner (${l.message}). It is listed, but will NOT be evaluated.`}return{registered:!0,evaluated:n,note:a,rule:{id:e.id,type:e.type,target:e.target},rules:await r.read("visual://rules")}}};Pc=S([Wx({name:"visual.register_rule",description:"Register (or replace) a visual rule. It is handed to the capture runner, which evaluates it on every frame captured from now on, for as long as this lens server runs. The result says whether a runner is listening; if `evaluated` is false the rule is only listed, and no violation can come of it.",inputSchema:{id:je.string().describe("Stable rule id; replaces a prior rule with the same id."),type:je.enum(["grid-spacing","alignment","overflow","text-clipping","color-contrast","token-usage","z-index","responsive","custom"]).describe("Built-in rule type to evaluate."),target:je.string().optional().describe('CSS-like selector / role:label / [data-agent-component="\u2026"]; default = every node.'),severity:je.enum(["info","warning","error"]).default("warning"),timing:je.enum(["always","after-animation","stable-only","during-animation"]).default("always"),expected:je.record(je.string(),je.unknown()).default({}).describe('Rule-type-specific expectations (e.g. { gap: "spacing.6" }).'),breakpoints:je.record(je.string(),je.record(je.string(),je.unknown())).optional().describe("Per-breakpoint expectation overrides for the responsive rule type.")}})],Pc);var tC=Pc,Q6=class{static{s(this,"hv")}static{o(this,"VisualApp")}};Q6=S([ox({id:"visual",name:"Visual",description:"Visual rule engine: DOMSnapshot/LayerTree diffs, grid/alignment/overflow/contrast/z-index rules, design tokens.",resources:[cx,fx,vx,bx,$x,Cx],tools:[zx,Tx,Zx,Vx,tC]})],Q6);var Zr="visual://current",qr="visual://violations/current",Lr="visual://violations/stable",Jr="visual://violations/during-animation",Vr="visual://rules",Wr="visual://tokens";function ey(e){let t=(e.now??(()=>Date.now()))(),r={violations:[],rules:[],framesSeen:0,changedAt:new Map},i=o((m,f)=>{r.changedAt.set(m,f),e.resources.markDirty(m)},"touch"),u=o(m=>{i(qr,m),i(Lr,m),i(Jr,m)},"touchViolationViews"),n=o(m=>{let f=m.raw??null;if(f?.kind)switch(f.kind){case"visual-frame":{let g=f.frame;if(!g)return;r.currentFrame=g,r.lastFrameAt=m.timestamp,r.framesSeen+=1,r.rulesEvaluated=typeof f.rulesEvaluated=="number"?f.rulesEvaluated:void 0,i(Zr,m.timestamp);let E=r.violations.length;r.violations=r.violations.filter(b=>b.frameId===g.id),E!==r.violations.length&&u(m.timestamp);return}case"visual-violation":if(!f.violation)return;r.violations.push(f.violation),r.violations.length>50&&r.violations.splice(0,r.violations.length-50),u(m.timestamp);return;case"visual-rule-registered":{let g=f.rule;if(!g)return;let E=r.rules.findIndex(b=>b.id===g.id);E>=0&&r.rules.splice(E,1),r.rules.push(g),r.rules.length>500&&r.rules.splice(0,r.rules.length-500),i(Vr,m.timestamp);return}case"visual-tokens-loaded":if(!f.tokens)return;r.tokens=f.tokens,i(Wr,m.timestamp);return;default:return}},"handler"),a=e.bus.subscribe(n),l=o(m=>new Date(r.changedAt.get(m)??t).toISOString(),"stamp"),d="No visual frame has ever been captured \u2014 an empty violation list is NOT evidence the UI is correct, nothing is looking. Drive a capture (visual_capture_frame) or run the browser-capture loop so frames reach this session.",c=o(()=>`${r.framesSeen} frame${r.framesSeen===1?"":"s"} captured`,"frameCount"),p=o(()=>({framesSeen:r.framesSeen,lastFrameAt:r.lastFrameAt,currentFrameId:r.currentFrame?.id,...r.rulesEvaluated!==void 0?{rulesEvaluated:r.rulesEvaluated}:{},producer:r.framesSeen===0?"none":"connected",detail:r.framesSeen===0?d:r.rulesEvaluated===void 0?`${c()}; ${r.rules.length} rule${r.rules.length===1?"":"s"} registered.`:`${c()}; ${r.rulesEvaluated} rule${r.rulesEvaluated===1?"":"s"} evaluated on the current one.`}),"frameHealth"),h=o(()=>{let m=p();return r.framesSeen===0||r.rulesEvaluated===void 0?r.framesSeen===0?m:{...m,detail:`${m.detail} Violations are those of the CURRENT frame \u2014 every rule is re-run per frame, so anything fixed simply stops being reported.`}:r.rulesEvaluated===0?{...m,producer:"none",detail:`${c()}, but NO rule was evaluated on the current one \u2014 an empty violation list is NOT evidence the UI is correct, nothing is being checked. Add rules to \`lensmcp.rules.json\` at the workspace root, or register one with visual.register_rule.`}:{...m,detail:`${m.detail} Violations are those of the CURRENT frame \u2014 every rule is re-run per frame, so anything fixed simply stops being reported.`}},"violationHealth");return e.resources.register(Zr,()=>({schemaVersion:1,revision:e.resources.revision(Zr)??0,updatedAt:l(Zr),frame:r.currentFrame??null,...p()})),e.resources.register(qr,()=>({schemaVersion:1,revision:e.resources.revision(qr)??0,updatedAt:l(qr),violations:r.violations.slice(),...h()})),e.resources.register(Lr,()=>({schemaVersion:1,revision:e.resources.revision(Lr)??0,updatedAt:l(Lr),violations:r.violations.filter(m=>m.timing==="after-animation"||m.timing==="stable-only"||m.timing==="always"),...h()})),e.resources.register(Jr,()=>({schemaVersion:1,revision:e.resources.revision(Jr)??0,updatedAt:l(Jr),violations:r.violations.filter(m=>m.timing==="during-animation"),...h()})),e.resources.register(Vr,()=>({schemaVersion:1,revision:e.resources.revision(Vr)??0,updatedAt:l(Vr),rules:r.rules.slice()})),e.resources.register(Wr,()=>({schemaVersion:1,revision:e.resources.revision(Wr)??0,updatedAt:l(Wr),tokens:r.tokens??null})),{unsubscribe:a,uris:[Zr,qr,Lr,Jr,Vr,Wr]}}s(ey,"gv"),o(ey,"installVisualReducer");import{App as uC}from"@frontmcp/sdk";import{Resource as rC,ResourceContext as nC}from"@frontmcp/sdk";var Uc=class extends nC{static{s(this,"vv")}static{o(this,"ReactPagesCurrentResource")}async execute(){return this.get(q).read("react://pages/current")}};Uc=S([rC({name:"react-pages-current",uri:"react://pages/current",mimeType:"application/json",description:"The most recently active React page (from <LensmcpRoot>)."})],Uc);var iC=Uc;import{Resource as sC,ResourceContext as aC}from"@frontmcp/sdk";var Zc=class extends aC{static{s(this,"bv")}static{o(this,"ReactComponentsHotResource")}async execute(){return this.get(q).read("react://components/hot")}};Zc=S([sC({name:"react-components-hot",uri:"react://components/hot",mimeType:"application/json",description:"Components ranked by render count this session."})],Zc);var oC=Zc;import{Resource as lC,ResourceContext as dC}from"@frontmcp/sdk";var qc=class extends dC{static{s(this,"xv")}static{o(this,"ReactRendersSlowResource")}async execute(){return this.get(q).read("react://renders/slow")}};qc=S([lC({name:"react-renders-slow",uri:"react://renders/slow",mimeType:"application/json",description:"Renders with actualDurationMs >= threshold (default 16ms)."})],qc);var cC=qc;import{Resource as pC,ResourceContext as mC}from"@frontmcp/sdk";var Lc=class extends mC{static{s(this,"_v")}static{o(this,"ReactRendersRecentResource")}async execute(){return this.get(q).read("react://renders/recent")}};Lc=S([pC({name:"react-renders-recent",uri:"react://renders/recent",mimeType:"application/json",description:"Last 100 render commits with attribution (why)."})],Lc);var fC=Lc;import{Resource as hC,ResourceContext as gC}from"@frontmcp/sdk";var Jc=class extends gC{static{s(this,"Sv")}static{o(this,"ReactEffectsRecentResource")}async execute(){return this.get(q).read("react://effects/recent")}};Jc=S([hC({name:"react-effects-recent",uri:"react://effects/recent",mimeType:"application/json",description:"Last 100 useEffect runs/cleanups from tracedUseEffect."})],Jc);var vC=Jc;import{Resource as yC,ResourceContext as EC}from"@frontmcp/sdk";var Vc=class extends EC{static{s(this,"Rv")}static{o(this,"ReactMemosRecomputedResource")}async execute(){return this.get(q).read("react://memos/recomputed")}};Vc=S([yC({name:"react-memos-recomputed",uri:"react://memos/recomputed",mimeType:"application/json",description:"Recent useMemo recomputations (depsHash changed)."})],Vc);var bC=Vc;import{Resource as DC,ResourceContext as wC}from"@frontmcp/sdk";var Wc=class extends wC{static{s(this,"Tv")}static{o(this,"ReactHooksRecentResource")}async execute(){return this.get(q).read("react://hooks/recent")}};Wc=S([DC({name:"react-hooks-recent",uri:"react://hooks/recent",mimeType:"application/json",description:"Recent hook-run events (useMemo / useCallback)."})],Wc);var $C=Wc;import{Tool as BC,ToolContext as xC,z as Gc}from"@frontmcp/sdk";var Kc=class extends xC{static{s(this,"jv")}static{o(this,"GraphExplainRerenderTool")}async execute(e){let t=await this.get(q).read("react://renders/recent"),r;if(e.renderNodeId)r=t.renders.find(u=>u.id===e.renderNodeId);else if(e.componentInstanceId)for(let u=t.renders.length-1;u>=0;u--){let n=t.renders[u];if(n&&n.componentInstanceId===e.componentInstanceId){r=n;break}}else if(e.componentLogicalId)for(let u=t.renders.length-1;u>=0;u--){let n=t.renders[u];if(n&&n.componentLogicalId===e.componentLogicalId){r=n;break}}if(!r)return{found:!1,searched:e};let i=(r.why??[]).map(u=>({...u,summary:ty(u)}));return{found:!0,renderNodeId:r.id,componentInstanceId:r.componentInstanceId,componentLogicalId:r.componentLogicalId,componentName:r.componentName,page:r.page,route:r.route,phase:r.phase,actualDurationMs:r.actualDurationMs,why:i,parentRenderId:r.parentRenderId}}};Kc=S([BC({name:"graph.explain_rerender",description:"Returns the most recent render record for a component (by `renderNodeId`, `componentInstanceId`, or `componentLogicalId`), with its `why` causal list (valtio-path / parent-render / hook-dep-changed / props / context / react-state / force).",inputSchema:{renderNodeId:Gc.string().optional().describe("Exact render commit id from react://renders/recent."),componentInstanceId:Gc.string().optional().describe("Component instance id; resolves to that instance\u2019s last render."),componentLogicalId:Gc.string().optional().describe("Component logical id (e.g. react:component:src/App.tsx:CardGrid); resolves to its most recent render across HMR generations.")}})],Kc);var CC=Kc;function ty(e){switch(e.type){case"valtio-path":return`valtio path ${String(e.path)} changed (${e.changedKeys?.join(",")??""})`;case"react-state":return`useState hook #${String(e.hookIndex)} changed`;case"context":return`context ${String(e.contextName)} changed`;case"props":return`prop(s) changed: ${e.changedKeys?.join(",")??""}`;case"parent-render":return`parent render ${String(e.parentRenderId)} triggered this`;case"hook-dep-changed":return`hook ${String(e.hookInstanceId)} deps changed`;case"force":return`forced render: ${String(e.reason)}`;default:return`unknown cause: ${JSON.stringify(e)}`}}s(ty,"Lj"),o(ty,"summariseWhy");var uy=class{static{s(this,"Nv")}static{o(this,"ReactApp")}};uy=S([uC({id:"react",name:"React",description:"React render attribution: pages, hot components, slow renders, hook + effect + memo events. Hosts graph.explain_rerender.",resources:[iC,oC,cC,fC,vC,bC,$C],tools:[CC]})],uy);var Gr="react://pages/current",ws="react://components/hot",$s="react://renders/slow",Bs="react://renders/recent",xs="react://effects/recent",Cs="react://memos/recomputed",ks="react://hooks/recent",As=100,Hc=50,ry=500;function ny(e){let t=Je(e.thresholds).slowRenderMs,r={rendersRecent:[],rendersSlow:[],effectsRecent:[],hooksRecent:[],memosRecomputed:[],rendersByInstance:new Map,hotByLogical:new Map},i=o(n=>{if(n.source!=="react")return;let a=n.raw??null;if(a?.kind)switch(a.kind){case"render":{let l=a.render;if(!l)return;if(Du(r.rendersRecent,l,As),r.rendersByInstance.delete(l.componentInstanceId),r.rendersByInstance.set(l.componentInstanceId,l),r.rendersByInstance.size>ry){for(let c of r.rendersByInstance.keys())if(r.rendersByInstance.delete(c),r.rendersByInstance.size<=ry)break}l.actualDurationMs>=t&&(Du(r.rendersSlow,l,Hc),r.rendersSlow.sort((c,p)=>p.actualDurationMs-c.actualDurationMs),r.rendersSlow.length>Hc&&(r.rendersSlow.length=Hc));let d=r.hotByLogical.get(l.componentLogicalId);d?(d.renderCount+=1,d.totalActualMs+=l.actualDurationMs,d.lastRenderId=l.id):r.hotByLogical.set(l.componentLogicalId,{componentLogicalId:l.componentLogicalId,componentName:l.componentName,renderCount:1,totalActualMs:l.actualDurationMs,lastRenderId:l.id}),(l.page||l.route)&&(r.currentPage={page:l.page??"(unknown)",route:l.route,updatedAt:n.timestamp},e.resources.markDirty(Gr)),e.resources.markDirty(Bs),e.resources.markDirty(ws),l.actualDurationMs>=t&&e.resources.markDirty($s);return}case"effect-run":{let l=a.effect;if(!l)return;Du(r.effectsRecent,l,As),e.resources.markDirty(xs);return}case"hook-run":{let l=a.hook;if(!l)return;Du(r.hooksRecent,l,As),e.resources.markDirty(ks),l.recomputed&&l.hookType==="useMemo"&&(Du(r.memosRecomputed,l,As),e.resources.markDirty(Cs));return}case"component-mount":case"component-unmount":{let l=a.component;if(!l)return;(l.page||l.route)&&(r.currentPage={page:l.page??"(unknown)",route:l.route,updatedAt:n.timestamp},e.resources.markDirty(Gr));return}default:return}},"handler"),u=e.bus.subscribe(i);return e.resources.register(Gr,()=>({schemaVersion:1,revision:e.resources.revision(Gr)??0,updatedAt:new Date().toISOString(),page:r.currentPage??null})),e.resources.register(ws,()=>({schemaVersion:1,revision:e.resources.revision(ws)??0,updatedAt:new Date().toISOString(),components:[...r.hotByLogical.values()].sort((n,a)=>a.renderCount-n.renderCount)})),e.resources.register($s,()=>({schemaVersion:1,revision:e.resources.revision($s)??0,updatedAt:new Date().toISOString(),thresholdMs:t,renders:r.rendersSlow.slice()})),e.resources.register(Bs,()=>({schemaVersion:1,revision:e.resources.revision(Bs)??0,updatedAt:new Date().toISOString(),renders:r.rendersRecent.slice()})),e.resources.register(xs,()=>({schemaVersion:1,revision:e.resources.revision(xs)??0,updatedAt:new Date().toISOString(),effects:r.effectsRecent.slice()})),e.resources.register(Cs,()=>({schemaVersion:1,revision:e.resources.revision(Cs)??0,updatedAt:new Date().toISOString(),memos:r.memosRecomputed.slice()})),e.resources.register(ks,()=>({schemaVersion:1,revision:e.resources.revision(ks)??0,updatedAt:new Date().toISOString(),hooks:r.hooksRecent.slice()})),{unsubscribe:u,uris:[Gr,ws,$s,Bs,xs,Cs,ks],lookups:{latestRenderFor(n){return r.rendersByInstance.get(n)},latestRenderForLogical(n){if(r.hotByLogical.get(n))for(let a=r.rendersRecent.length-1;a>=0;a--){let l=r.rendersRecent[a];if(l&&l.componentLogicalId===n)return l}}}}}s(ny,"Pv"),o(ny,"installReactReducer");function Du(e,t,r){e.push(t),e.length>r&&e.splice(0,e.length-r)}s(Du,"xo"),o(Du,"pushBounded");import{App as kC}from"@frontmcp/sdk";import{Resource as AC,ResourceContext as IC}from"@frontmcp/sdk";var Xc=class extends IC{static{s(this,"Mv")}static{o(this,"ValtioUpdatesRecentResource")}async execute(){return this.get(q).read("valtio://updates/recent")}};Xc=S([AC({name:"valtio-updates-recent",uri:"valtio://updates/recent",mimeType:"application/json",description:"Last 100 Valtio state-update events with path + changedKeys + subscribers."})],Xc);var _C=Xc;import{Resource as SC,ResourceContext as FC}from"@frontmcp/sdk";var Yc=class extends FC{static{s(this,"Uv")}static{o(this,"ValtioStoresResource")}async execute(){return this.get(q).read("valtio://stores")}};Yc=S([SC({name:"valtio-stores",uri:"valtio://stores",mimeType:"application/json",description:"Registered Valtio stores (created via lensmcp-wrapped proxy())."})],Yc);var jC=Yc;import{Resource as zC,ResourceContext as NC}from"@frontmcp/sdk";var Qc=class extends NC{static{s(this,"Fv")}static{o(this,"ValtioSubscribersResource")}async execute(){return this.get(q).read("valtio://subscribers")}};Qc=S([zC({name:"valtio-subscribers",uri:"valtio://subscribers",mimeType:"application/json",description:"Per-(storeId, path) list of component instance ids currently subscribed via tracked useSnapshot."})],Qc);var OC=Qc,iy=class{static{s(this,"Zv")}static{o(this,"ValtioApp")}};iy=S([kC({id:"valtio",name:"Valtio",description:"Valtio store + subscription tracking. Phase 5 ships updates/stores/subscribers; per-path subscriber walks land via graph.explain_rerender.",resources:[_C,jC,OC]})],iy);var Is="valtio://updates/recent",_s="valtio://stores",Kr="valtio://subscribers",sy=100,ay=1e3,RC=1e3,TC=256,MC=256;function oy(e,t){if(e.size<=t)return;let r=e.values();for(;e.size>t;){let i=r.next();if(i.done)break;e.delete(i.value)}}s(oy,"Yj"),o(oy,"capSet");function ep(e){let t=Array.isArray(e.paths)?e.paths.filter(r=>typeof r=="string"):void 0;return t&&t.length>0?t.slice(0,TC):typeof e.path=="string"?[e.path]:[]}s(ep,"Y$"),o(ep,"subscriptionPaths");function tp(e){return e.componentLogicalId??e.componentInstanceId??"react:component:anonymous"}s(tp,"Q$"),o(tp,"subscriberId");function ly(e){let t={updates:[],stores:new Map,subscribers:new Map,latestUpdateByPath:new Map},r=o(u=>{if(u.source!=="valtio")return;let n=u.raw??null;if(n?.kind)switch(n.kind){case"state-update":{let a=n.update;if(!a)return;let l={...a,emittedAt:u.timestamp};t.updates.push(l),t.updates.length>sy&&t.updates.splice(0,t.updates.length-sy);let d=`${a.storeId}::${a.path}`;if(t.latestUpdateByPath.delete(d),t.latestUpdateByPath.set(d,l),t.latestUpdateByPath.size>ay){for(let c of t.latestUpdateByPath.keys())if(t.latestUpdateByPath.delete(c),t.latestUpdateByPath.size<=ay)break}e.resources.markDirty(Is);return}case"store-created":{let a=n.store;if(!a)return;t.stores.set(a.storeId,{...a,createdAt:u.timestamp}),e.resources.markDirty(_s);return}case"subscription-added":{let a=n.subscription;if(!a||!a.componentInstanceId)return;let l=tp(a);for(let d of ep(a)){let c=`${a.storeId}::${d}`,p=t.subscribers.get(c);p||(p=new Map,t.subscribers.set(c,p));let h=p.get(l);h||(h=new Set,p.set(l,h)),h.add(a.componentInstanceId),Ot(p,_r),oy(h,MC)}Ot(t.subscribers,RC),e.resources.markDirty(Kr);return}case"subscription-removed":{let a=n.subscription;if(!a||!a.componentInstanceId)return;let l=tp(a);for(let d of ep(a)){let c=`${a.storeId}::${d}`,p=t.subscribers.get(c);if(!p)continue;let h=p.get(l);h&&(h.delete(a.componentInstanceId),h.size===0&&p.delete(l)),p.size===0&&t.subscribers.delete(c)}e.resources.markDirty(Kr);return}default:return}},"handler"),i=e.bus.subscribe(r);return e.resources.register(Is,()=>({schemaVersion:1,revision:e.resources.revision(Is)??0,updatedAt:new Date().toISOString(),updates:t.updates.slice()})),e.resources.register(_s,()=>({schemaVersion:1,revision:e.resources.revision(_s)??0,updatedAt:new Date().toISOString(),stores:[...t.stores.values()]})),e.resources.register(Kr,()=>({schemaVersion:1,revision:e.resources.revision(Kr)??0,updatedAt:new Date().toISOString(),subscriptions:[...t.subscribers.entries()].map(([u,n])=>{let[a,l]=u.split("::");return{storeId:a,path:l,componentInstanceIds:[...n.keys()]}})})),{unsubscribe:i,uris:[Is,_s,Kr],lookups:{latestUpdateForPath(u,n){return t.latestUpdateByPath.get(`${u}::${n}`)},subscribersFor(u,n){return[...t.subscribers.get(`${u}::${n}`)?.keys()??[]]}}}}s(ly,"qv"),o(ly,"installValtioReducer");import{App as PC}from"@frontmcp/sdk";import{Resource as UC,ResourceContext as ZC}from"@frontmcp/sdk";var up=class extends ZC{static{s(this,"Vv")}static{o(this,"GraphPatternsResource")}async execute(){return this.get(q).read("graph://patterns")}};up=S([UC({name:"graph-patterns",uri:"graph://patterns",mimeType:"application/json",description:"Recent detected anti-patterns (db-in-loop, n+1-query, render-storm)."})],up);var qC=up;import{Resource as LC,ResourceContext as JC}from"@frontmcp/sdk";var rp=class extends JC{static{s(this,"Jv")}static{o(this,"GraphEventLoopLagResource")}async execute(){return this.get(q).read("graph://performance/event-loop-lag")}};rp=S([LC({name:"graph-event-loop-lag",uri:"graph://performance/event-loop-lag",mimeType:"application/json",description:"Recent event-loop-lag samples + the max lag seen."})],rp);var VC=rp;import{Tool as WC,ToolContext as GC,z as KC}from"@frontmcp/sdk";var dy;function np(e){dy=e}s(np,"Ia"),o(np,"setActiveGraphBuffer");function Hr(){return dy?.events??[]}s(Hr,"Nt"),o(Hr,"currentEvents");function Pt(){let e=new mm;return T1(e,Hr()),e}s(Pt,"Fe"),o(Pt,"buildGraph");var ip=class extends GC{static{s(this,"Wv")}static{o(this,"GraphGetNodeTool")}async execute(e){let t=Pt().getNode(e.nodeId);return t?{found:!0,node:t}:{found:!1,nodeId:e.nodeId}}};ip=S([WC({name:"graph.get_node",description:"Returns a single graph node by id (built from the current event window).",inputSchema:{nodeId:KC.string().describe("Node id (usually the originating event id).")}})],ip);var HC=ip;import{Tool as XC,ToolContext as YC,z as wu}from"@frontmcp/sdk";var QC=["ownership","caused","async","data","render","state","network","backend","db","visual","performance","memory","lifecycle"],sp=class extends YC{static{s(this,"Hv")}static{o(this,"GraphTraverseTool")}async execute(e){let t=Pt().traverse({from:e.from,lens:e.lens,depth:e.depth,direction:e.direction,maxNodes:e.maxNodes});return{nodeCount:t.nodes.length,edgeCount:t.edges.length,nodes:t.nodes.map(r=>({id:r.id,type:r.type,name:r.name,durationMs:r.durationMs,flowId:r.context.flowId})),edges:t.edges.map(r=>({from:r.from,to:r.to,axis:r.axis,type:r.type}))}}};sp=S([XC({name:"graph.traverse",description:'Walk the multi-axis trace graph from a node along one or more edge axes (the "lens"). Bounded by depth + node count.',inputSchema:{from:wu.string().describe("Start node id."),lens:wu.array(wu.enum(QC)).min(1).describe('Edge axes to follow (e.g. ["caused","backend"]).'),depth:wu.number().int().positive().max(12).default(4),direction:wu.enum(["out","in","both"]).default("both"),maxNodes:wu.number().int().positive().max(1e3).default(200)}})],sp);var ek=sp;import{Tool as tk,ToolContext as uk,z as rk}from"@frontmcp/sdk";var ap=class extends uk{static{s(this,"Qv")}static{o(this,"GraphFindDbInLoopTool")}async execute(e){let t=rd(Hr(),{threshold:e.threshold});return{count:t.length,matches:t}}};ap=S([tk({name:"graph.find_db_in_loop",description:"Scan the current event window for loops that issued more than `threshold` DB calls (N+1-ish backend anti-pattern).",inputSchema:{threshold:rk.number().int().positive().default(5)}})],ap);var nk=ap;import{Tool as ik,ToolContext as sk,z as ak}from"@frontmcp/sdk";var op=class extends sk{static{s(this,"ty")}static{o(this,"GraphFindSlowPathTool")}async execute(e){let t=Pt(),r=new Map,i=Hr(),u=e.from?[e.from]:i.filter(l=>l.context.originNodeId===void 0&&l.context.flowId).map(l=>l.id);for(let l of i){let d=t.traverse({from:l.id,lens:["caused","async","backend"],depth:1,direction:"out",maxNodes:50});r.set(l.id,d.edges.filter(c=>c.from===l.id).map(c=>c.to))}let n=o(l=>t.getNode(l)?.durationMs??0,"durationOf"),a=N1(u.length?u:i.map(l=>l.id),r,n);return{totalDurationMs:a.totalDurationMs,path:a.path.map(l=>{let d=t.getNode(l);return{id:l,name:d?.name,type:d?.type,durationMs:d?.durationMs}})}}};op=S([ik({name:"graph.find_slow_path",description:"Find the slowest cumulative chain on the caused/async/backend axes starting from a node (or every flow origin if `from` is omitted).",inputSchema:{from:ak.string().optional().describe("Start node id; defaults to all flow origins.")}})],op);var ok=op;import{Tool as lk,ToolContext as dk,z as cy}from"@frontmcp/sdk";var lp=class extends dk{static{s(this,"ny")}static{o(this,"GraphTraceFromOriginTool")}async execute(e){let t=Pt(),r=e.originNodeId;if(!t.getNode(r)){let n=Hr().find(a=>a.context.originNodeId===e.originNodeId||a.raw?.origin?.nodeId===e.originNodeId);n&&(r=n.id)}let i=t.getNode(r);if(!i)return{found:!1,originNodeId:e.originNodeId};let u=t.traverse({from:r,lens:["caused","render","state","backend","async"],depth:e.depth,direction:"out",maxNodes:500});return{found:!0,origin:{id:r,name:i.name,type:i.type},nodeCount:u.nodes.length,nodes:u.nodes.map(n=>({id:n.id,type:n.type,name:n.name,durationMs:n.durationMs}))}}};lp=S([lk({name:"graph.trace_from_origin",description:'Given an origin node id (e.g. a data-agent-component value or an event id), returns every node reachable on the caused/render/state/backend axes \u2014 "what did this cause?".',inputSchema:{originNodeId:cy.string().describe("Origin node id, logicalId, or originating event id."),depth:cy.number().int().positive().max(12).default(6)}})],lp);var ck=lp;import{Tool as pk,ToolContext as mk,z as py}from"@frontmcp/sdk";var dp=class extends mk{static{s(this,"iy")}static{o(this,"GraphFindStateUpdatesCausedByTool")}async execute(e){let t=Pt();if(!t.getNode(e.from))return{found:!1,from:e.from};let r=t.traverse({from:e.from,lens:["caused","state"],depth:e.depth,direction:"out",maxNodes:500}).nodes.filter(i=>i.type==="state-update");return{found:!0,count:r.length,stateUpdates:r.map(i=>({id:i.id,name:i.name,logicalId:i.logicalId}))}}};dp=S([pk({name:"graph.find_state_updates_caused_by",description:'From an origin node, returns the state-update nodes reachable on the caused/state axes \u2014 "what state changed because of this?".',inputSchema:{from:py.string().describe("Origin node id."),depth:py.number().int().positive().max(12).default(6)}})],dp);var fk=dp;import{Tool as hk,ToolContext as gk,z as my}from"@frontmcp/sdk";var cp=class extends gk{static{s(this,"ay")}static{o(this,"GraphFindBackendWorkCausedByClickTool")}async execute(e){let t=Pt();if(!t.getNode(e.from))return{found:!1,from:e.from};let r=t.traverse({from:e.from,lens:["caused","backend","async"],depth:e.depth,direction:"out",maxNodes:500}).nodes.filter(i=>i.type==="server-request");return{found:!0,count:r.length,requests:r.map(i=>({id:i.id,name:i.name,durationMs:i.durationMs}))}}};cp=S([hk({name:"graph.find_backend_work_caused_by_click",description:'From a UI origin node, returns the server-request nodes reachable on the caused/backend/async axes \u2014 "what backend work did this click trigger?".',inputSchema:{from:my.string().describe("UI origin node id (e.g. the user-action event id)."),depth:my.number().int().positive().max(12).default(8)}})],cp);var vk=cp,fy=class{static{s(this,"uy")}static{o(this,"GraphApp")}};fy=S([PC({id:"graph",name:"Graph",description:"Multi-axis causal graph: traverse by lens, trace from origin, find slow paths + db-in-loop / n+1 / render-storm patterns.",resources:[qC,VC],tools:[HC,ek,nk,ok,ck,fk,vk]})],fy);var $u="graph://patterns",Bu="graph://performance/event-loop-lag",pp=2e3,hy=8*1024*1024,yk=100,gy=100;function vy(e){let t=Je(e.thresholds),r=(e.now??(()=>Date.now()))(),i={events:[]},u=[],n=0,a=0,l=0,d=new Set,c=[],p=new Map,h,m=new Map,f=o(j=>{switch(j.kind){case"n+1-query":return`n+1:${String(j.details.signature??"")}`;case"render-storm":return`storm:${String(j.details.componentInstanceId??"")}`;case"db-in-loop":return`dbloop:${j.evidence[0]??""}`;default:return`${j.kind}:${j.evidence.join(",")}`}},"patternKey"),g=o(j=>{p.set($u,j),e.resources.markDirty($u)},"markPatterns"),E=o((j,F)=>{let D=f(j);if(m.delete(D),m.set(D,j),m.size>yk){let B=m.keys().next().value;B!==void 0&&m.delete(B)}g(F)},"pushPattern"),b=o(j=>{let F=!1;for(let[D,B]of m){if(B.evidence.length===0)continue;let x=B.evidence.filter(N=>d.has(N));if(x.length===0){m.delete(D),F=!0;continue}x.length!==B.evidence.length&&(B.evidence=x,F=!0)}F&&g(j)},"dropUnevidencedPatterns"),$=o(j=>{h=j.timestamp;let F=Ni(j);i.events.push(j),u.push(F),n+=F,d.add(j.id);let D=Math.max(0,i.events.length-pp),B=n;for(let O=0;O<D;O+=1)B-=u[O]??0;let x=0;for(;B>hy&&D<u.length;)B-=u[D]??0,D+=1,x+=1;if(D>0){let O=i.events.splice(0,D);u.splice(0,D),n=Math.max(0,B),a+=O.length,l+=x;for(let K of O)d.delete(K.id);b(j.timestamp)}let N=j.raw??null;if(N?.kind==="loop")for(let O of rd(i.events,{threshold:t.dbInLoop}))E(O,j.timestamp);if(N?.kind==="db-query")for(let O of j1(i.events,{threshold:t.nPlusOne}))E(O,j.timestamp);if(j.source==="react"&&N?.kind==="render")for(let O of z1(i.events,{threshold:t.renderStorm}))E(O,j.timestamp);j.source==="perf"&&N?.kind==="event-loop-lag"&&typeof N.lagMs=="number"&&(c.push({at:j.timestamp,lagMs:N.lagMs,source:j.source}),c.length>gy&&c.splice(0,c.length-gy),p.set(Bu,j.timestamp),e.resources.markDirty(Bu))},"handler"),A=e.bus.subscribe($);np(i);let _=o(j=>new Date(p.get(j)??r).toISOString(),"stamp");return e.resources.register($u,()=>({schemaVersion:1,revision:e.resources.revision($u)??0,updatedAt:_($u),patterns:[...m.values()],eventsBuffered:i.events.length,eventBufferCapacity:pp,lastEventAt:h,producer:h===void 0?"none":"connected"})),e.resources.register(Bu,()=>({schemaVersion:1,revision:e.resources.revision(Bu)??0,updatedAt:_(Bu),samples:c.slice(),maxLagMs:c.reduce((j,F)=>Math.max(j,F.lagMs),0),lastEventAt:h})),{unsubscribe:o(()=>{np(void 0),A()},"unsubscribe"),uris:[$u,Bu],retentionStats:o(()=>({residentEvents:i.events.length,residentBytes:n,evictedEvents:a,evictedForBytes:l,eventCap:pp,byteCap:hy}),"retentionStats")}}s(vy,"dy"),o(vy,"installGraphReducer");import{App as Ek}from"@frontmcp/sdk";import{Resource as bk,ResourceContext as Dk}from"@frontmcp/sdk";var mp=class extends Dk{static{s(this,"py")}static{o(this,"MemoryCurrentResource")}async execute(){return this.get(q).read("memory://current")}};mp=S([bk({name:"memory-current",uri:"memory://current",mimeType:"application/json",description:"Last process-memory sample (heapUsed / rss)."})],mp);var wk=mp;import{Resource as $k,ResourceContext as Bk}from"@frontmcp/sdk";var fp=class extends Bk{static{s(this,"my")}static{o(this,"MemoryOwnersResource")}async execute(){return this.get(q).read("memory://owners")}};fp=S([$k({name:"memory-owners",uri:"memory://owners",mimeType:"application/json",description:"All tracked container owners with current item count + byte estimate."})],fp);var xk=fp;import{Resource as Ck,ResourceContext as kk}from"@frontmcp/sdk";var hp=class extends kk{static{s(this,"gy")}static{o(this,"MemoryOwnersGrowingResource")}async execute(){return this.get(q).read("memory://owners/growing")}};hp=S([Ck({name:"memory-owners-growing",uri:"memory://owners/growing",mimeType:"application/json",description:"Top 20 container owners by growth-since-start."})],hp);var Ak=hp;import{Resource as Ik,ResourceContext as _k}from"@frontmcp/sdk";var gp=class extends _k{static{s(this,"yy")}static{o(this,"MemoryLeaksSuspectedResource")}async execute(){return this.get(q).read("memory://leaks/suspected")}};gp=S([Ik({name:"memory-leaks-suspected",uri:"memory://leaks/suspected",mimeType:"application/json",description:"Suspected leaks: per-flow retentions + stale-generation singletons."})],gp);var Sk=gp;import{Tool as Fk,ToolContext as jk,z as zk}from"@frontmcp/sdk";var yy;function vp(e){yy=e}s(vp,"Ra"),o(vp,"setActiveMemoryLookups");function Ss(){return yy}s(Ss,"er"),o(Ss,"activeMemoryLookups");var yp=class extends jk{static{s(this,"wy")}static{o(this,"MemoryFindGrowthByFlowTool")}async execute(e){let t=Ss();if(!t)return{found:!1,reason:"no active memory reducer"};let r=t.growthByFlow(e.flowId);return{found:!0,flowId:e.flowId,owners:r}}};yp=S([Fk({name:"memory.find_growth_by_flow",description:'Returns the container owners mutated during a flow and how much each grew \u2014 "what did this flow allocate?".',inputSchema:{flowId:zk.string().describe("Flow id.")}})],yp);var Nk=yp;import{Tool as Ok,ToolContext as Rk,z as Tk}from"@frontmcp/sdk";var Ep=class extends Rk{static{s(this,"$y")}static{o(this,"MemoryFindFlowsThatMutatedOwnerTool")}async execute(e){let t=Ss();if(!t)return{found:!1,reason:"no active memory reducer"};let r=t.flowsThatMutatedOwner(e.ownerId);return{found:!0,ownerId:e.ownerId,flowIds:r}}};Ep=S([Ok({name:"memory.find_flows_that_mutated_owner",description:"Returns the flow ids that mutated a given container owner.",inputSchema:{ownerId:Tk.string().describe("Owner id (<ownerInstanceId>::<fieldName>).")}})],Ep);var Mk=Ep;import{Tool as Pk,ToolContext as Uk,z as Zk}from"@frontmcp/sdk";var bp=class extends Uk{static{s(this,"ky")}static{o(this,"MemoryExplainLeakTool")}async execute(e){let t=Ss();if(!t)return{found:!1,reason:"no active memory reducer"};let r=t.getLeak(e.leakIndex);if(!r)return{found:!1,leakIndex:e.leakIndex};let i,u;if(r.kind==="retention"){let n=r.detail;i=`Owner ${n.ownerId} grew by ${n.growth} items during flow ${n.flowId} and did not shrink after the flow settled.`,u="Add a TTL / max-size eviction policy to this container, or clear it when the owning scope is disposed. If it is a request-scoped cache, move it off the singleton."}else{let n=r.detail;i=`Disposed singleton ${n.logicalId} (generation ${n.generation}) still retains ${n.retainedBytes} bytes \u2014 a stale generation kept alive after HMR/reload.`,u="Ensure listeners/timers registered by the old instance are removed in the dispose hook (OnModuleDestroy / cleanup), so the previous generation can be garbage-collected."}return{found:!0,leak:r,narrative:i,recommendation:u}}};bp=S([Pk({name:"memory.explain_leak",description:"Returns a narrative explanation of a suspected leak (by index in memory://leaks/suspected): which owner, which flow, what grew, and a remediation hint.",inputSchema:{leakIndex:Zk.number().int().nonnegative().describe("Index into memory://leaks/suspected.")}})],bp);var qk=bp,Ey=class{static{s(this,"Iy")}static{o(this,"MemoryApp")}};Ey=S([Ek({id:"memory",name:"Memory",description:"Container-owner growth tracking + suspect-leak / stale-generation detection. Hosts memory.explain_leak.",resources:[wk,xk,Ak,Sk],tools:[Nk,Mk,qk]})],Ey);var Xr="memory://current",Yr="memory://owners",Qr="memory://owners/growing",Ut="memory://leaks/suspected",Lk=200,by=50,Jk=500;function Dy(e){let t=(e.now??(()=>Date.now()))(),r={owners:new Map,leaks:new Map,changedAt:new Map},i=o((E,b)=>{r.changedAt.set(E,b),e.resources.markDirty(E)},"touch"),u=o((E,b)=>{if(r.leaks.delete(E),r.leaks.set(E,b),r.leaks.size>Lk){let $=r.leaks.keys().next().value;$!==void 0&&r.leaks.delete($)}},"pushLeak"),n=new Map,a=o((E,b)=>{E!==b&&(n.delete(E),n.set(E,b),n.size>5e3&&n.delete(n.keys().next().value))},"noteRequestFlow"),l=o((E,b)=>{if(E.flowIds.add(b),E.flowIds.size>by){for(let $ of E.flowIds)if(E.flowIds.delete($),E.flowIds.size<=by)break}},"noteFlow"),d=o((E,b,$)=>{let A=r.owners.get(E);if(A||(A={ownerId:E,itemCount:b,estimatedBytes:0,startCount:b,mutations:0,flowIds:new Set,lastMutatedAt:$}),r.owners.delete(E),r.owners.set(E,A),r.owners.size>Jk){let _=r.owners.keys().next().value;_!==void 0&&_!==E&&r.owners.delete(_)}return A},"ensure"),c=o((E,b)=>{let $=!1;for(let[A,_]of r.leaks){if(_.kind!=="retention"||_.ownerId!==E)continue;let j=_.detail.startCount;typeof j=="number"&&b<=j&&(r.leaks.delete(A),$=!0)}return $},"retractReleasedRetentions"),p=o(E=>{if(E.source!=="memory"&&E.source!=="perf")return;let b=E.raw??null;if(b?.kind)switch(r.lastEventAt=Math.max(r.lastEventAt??0,E.timestamp),b.kind){case"memory-mutation":{if(!b.mutation)return;let $=b.mutation,A=d($.ownerNodeId,$.beforeCount??$.afterCount,E.timestamp);A.itemCount=$.afterCount,A.estimatedBytes=$.afterCount*64,A.mutations+=1,A.lastMutatedAt=E.timestamp,E.context.flowId&&l(A,E.context.flowId),E.context.requestId&&E.context.flowId&&a(E.context.requestId,E.context.flowId),i(Yr,E.timestamp),i(Qr,E.timestamp),c($.ownerNodeId,$.afterCount)&&i(Ut,E.timestamp);return}case"memory-retention":{if(!b.retention)return;let $=b.retention,A=$.requestId?$.flowId:n.get($.flowId)??$.flowId;u(`retention:${$.ownerId}:${A}`,{kind:"retention",ownerId:$.ownerId,flowId:A,detail:{...$,flowId:A},at:E.timestamp}),i(Ut,E.timestamp);return}case"singleton-stale-generation":{if(!b.staleGeneration)return;let $=b.staleGeneration;u(`stale:${$.logicalId}:${$.generation}`,{kind:"stale-generation",logicalId:$.logicalId,detail:{...$},at:E.timestamp}),i(Ut,E.timestamp);return}case"process-memory":{if(!b.memory)return;r.current={...b.role?{role:b.role}:{},heapUsed:b.memory.heapUsed,heapTotal:b.memory.heapTotal,rss:b.memory.rss,external:b.memory.external,arrayBuffers:b.memory.arrayBuffers,at:E.timestamp},i(Xr,E.timestamp);return}default:return}},"handler"),h=e.bus.subscribe(p),m=o(E=>new Date(r.changedAt.get(E)??t).toISOString(),"stamp"),f=o(()=>({lastEventAt:r.lastEventAt,ownersTracked:r.owners.size,producer:r.lastEventAt===void 0?"none":"connected",detail:r.lastEventAt===void 0?"No memory event has ever been observed \u2014 an empty leak list is NOT evidence there is no leak, nothing is watching. Run under the dev cluster with @lensmcp/memory-tracker wired.":`${r.owners.size} owner${r.owners.size===1?"":"s"} tracked; ${r.leaks.size} suspected leak${r.leaks.size===1?"":"s"}.`}),"health");e.resources.register(Xr,()=>({schemaVersion:1,revision:e.resources.revision(Xr)??0,updatedAt:m(Xr),current:r.current??null})),e.resources.register(Yr,()=>({schemaVersion:1,revision:e.resources.revision(Yr)??0,updatedAt:m(Yr),owners:[...r.owners.values()].map(Dp),...f()})),e.resources.register(Qr,()=>({schemaVersion:1,revision:e.resources.revision(Qr)??0,updatedAt:m(Qr),owners:[...r.owners.values()].map(Dp).filter(E=>E.growthSinceStart>0).sort((E,b)=>b.growthSinceStart-E.growthSinceStart).slice(0,20),...f()})),e.resources.register(Ut,()=>({schemaVersion:1,revision:e.resources.revision(Ut)??0,updatedAt:m(Ut),suspected:[...r.leaks.values()],...f()}));let g={ownersMutatedByFlow(E){return[...r.owners.values()].filter(b=>b.flowIds.has(E))},growthByFlow(E){return[...r.owners.values()].filter(b=>b.flowIds.has(E)).map(b=>({ownerId:b.ownerId,growth:b.itemCount-b.startCount}))},flowsThatMutatedOwner(E){let b=r.owners.get(E);return b?[...b.flowIds]:[]},getLeak(E){return[...r.leaks.values()][E]},allLeaks(){return[...r.leaks.values()]}};return vp(g),{unsubscribe:o(()=>{vp(void 0),h()},"unsubscribe"),uris:[Xr,Yr,Qr,Ut],lookups:g}}s(Dy,"Ry"),o(Dy,"installMemoryReducer");function Dp(e){return{ownerId:e.ownerId,itemCount:e.itemCount,estimatedBytes:e.estimatedBytes,mutations:e.mutations,startCount:e.startCount,growthSinceStart:e.itemCount-e.startCount,lastMutatedAt:e.lastMutatedAt,flowIds:[...e.flowIds]}}s(Dp,"c_"),o(Dp,"toOwnerView");function wy(){let{session:e,providers:t}=q1(),r=X1(),i=Y1();for(let E of i.problems)console.error(`[lensmcp] nx.json lensmcp.flows: ${E}`);Q3({bus:e.bus,resources:e.resources}),u6({bus:e.bus,resources:e.resources}),i6({bus:e.bus,resources:e.resources}),o6({bus:e.bus,resources:e.resources}),m6({bus:e.bus,resources:e.resources}),b6({bus:e.bus,resources:e.resources}),w6({bus:e.bus,resources:e.resources}),B6({bus:e.bus,resources:e.resources}),k6({bus:e.bus,resources:e.resources,thresholds:r}),F6({bus:e.bus,resources:e.resources,thresholds:r}),O6({bus:e.bus,resources:e.resources,thresholds:r}),q6({bus:e.bus,resources:e.resources,thresholds:r}),ey({bus:e.bus,resources:e.resources}),ny({bus:e.bus,resources:e.resources,thresholds:r}),ly({bus:e.bus,resources:e.resources});let u=Z3({bus:e.bus,resources:e.resources,flows:i});e.registerReducerRetention("flow",u.retentionStats),L3({resources:e.resources});let n=vy({bus:e.bus,resources:e.resources,thresholds:r});e.registerReducerRetention("graph",n.retentionStats),Dy({bus:e.bus,resources:e.resources}),k3({bus:e.bus,resources:e.resources,sessionId:e.id});let a=3e4,l=512*1024*1024,d=0,c=o(()=>{let E=process.memoryUsage(),b=Date.now(),$=E.rss>=l;$&&b-d>=5*6e4&&(d=b,console.warn(`[lensmcp] high process memory: rss=${Math.round(E.rss/1024/1024)}MB heap=${Math.round(E.heapUsed/1024/1024)}MB`)),e.bus.publish({id:tt(),sessionId:e.id,timestamp:b,source:"perf",category:"runtime",severity:$?"warning":"info",context:{sessionId:e.id},fingerprint:hm({kind:"process-memory",identity:process.env.LENSMCP_PROCESS_ROLE??"session"}),title:`LensMCP process memory (${process.env.LENSMCP_PROCESS_ROLE??"session"})`,raw:{kind:"process-memory",role:process.env.LENSMCP_PROCESS_ROLE??"session",memory:{rss:E.rss,heapUsed:E.heapUsed,heapTotal:E.heapTotal,external:E.external,arrayBuffers:E.arrayBuffers}}})},"publishProcessMemory");c();let p=setInterval(c,a);p.unref?.(),e.onShutdown({name:"process-memory",stop:o(()=>clearInterval(p),"stop")});let h=1200,m=new Map,f=e.bus.subscribe(E=>{let b=E.context.flowId;if(!b)return;let $=m.get(b);$&&clearTimeout($);let A=setTimeout(()=>{m.delete(b);try{let _=Ve()?.getFlowEvents(b);if(!_||_.length===0)return;let j=qs(_,{flowId:b});j&&Md(j)}catch{}},h);A.unref?.(),m.set(b,A)});e.onShutdown({name:"story-autocompile",stop:o(()=>{f();for(let E of m.values())clearTimeout(E);m.clear()},"stop")});let g=K1({bus:e.bus,sessionId:e.id,onError:o(E=>console.error("[lensmcp] ingest error:",E),"onError")});return g.mode!=="none"&&console.error(`[lensmcp] event ingest active (mode=${g.mode})`),e.onShutdown({name:"event-ingest",stop:o(()=>g.stop(),"stop")}),{session:e,providers:t,ingest:g,flows:i}}s(wy,"u_"),o(wy,"createLensSession");var Vk=new Set(["localhost","127.0.0.1","lensmcp.local"]);function $y(e){if(!e)return!1;let t=e.trim().toLowerCase();if(t.startsWith("[")){let r=t.indexOf("]");return r!==-1&&t.slice(1,r)==="::1"}return t.indexOf(":")===t.lastIndexOf(":")&&(t=t.split(":")[0]??""),Vk.has(t)}s($y,"qO"),o($y,"hostHeaderIsLocal");function By(e,t){if(!e||$y(t))return{ok:!0};let r=(t??"").replace(/[^\x20-\x7e]/g,"?").slice(0,80);return{ok:!1,status:403,error:"this dashboard answers only requests addressed to this machine (localhost, 127.0.0.1, [::1] or lensmcp.local)"+(r?`; this one was addressed to "${r}"`:"")}}s(By,"l_"),o(By,"dashboardHostVerdict");import{randomBytes as Wk,timingSafeEqual as Gk}from"node:crypto";import{chmodSync as Kk,mkdirSync as Hk,readFileSync as Xk,writeFileSync as Yk}from"node:fs";import{dirname as Qk,join as e7}from"node:path";var wp="__lensmcp_token";function $p(e){return e7(e,".lensmcp","dashboard-token")}s($p,"Ey"),o($p,"dashboardTokenPath");function xy(e,t,r,i={}){if(r)return{source:"loopback"};if(e.LENSMCP_ALLOW_INSECURE==="1")return{source:"disabled"};let u=e.LENSMCP_DASHBOARD_TOKEN?.trim();if(u)return{token:u,source:"env"};let n=i.read??(p=>Xk(p,"utf8")),a=i.write??((p,h)=>Yk(p,h,{mode:384})),l=i.ensureDir??(p=>{Hk(p,{recursive:!0,mode:448})}),d=i.chmod??((p,h)=>Kk(p,h)),c=$p(t);try{let p=n(c).trim();if(p){try{d(c,384)}catch{}return{token:p,source:"file"}}}catch{}try{l(Qk(c));let p=Wk(32).toString("hex");a(c,`${p}
|
|
72
72
|
`);try{d(c,384)}catch{}return{token:p,source:"created"}}catch(p){return{source:"unavailable",reason:p instanceof Error?p.message:String(p)}}}s(xy,"p_"),o(xy,"resolveDashboardToken");function Bp(e,t){let r=Buffer.from(e,"utf8"),i=Buffer.from(t,"utf8");return r.length!==i.length?!1:Gk(r,i)}s(Bp,"d_"),o(Bp,"sameSecret");function Cy(e,t,r){if(!e)return!0;let i=Array.isArray(t)?t[0]:t,u=/^Bearer\s+(.+)$/i.exec((i??"").trim())?.[1]?.trim();if(u&&Bp(u,e))return!0;let n=r?.trim();return!!n&&Bp(n,e)}s(Cy,"f_"),o(Cy,"dashboardAuthorized");function ky(e){return e==="/api"||e.startsWith("/api/")}s(ky,"m_"),o(ky,"isDataEndpoint");function Ay(e){let t=Number(process.env.LENSMCP_PARENT_PID??0);!Number.isInteger(t)||t<=0||setInterval(()=>{process.ppid!==t&&(console.error(`[lensmcp] ${e}: parent gateway (pid ${t}) is gone \u2014 exiting to free the port.`),process.exit(0))},5e3).unref()}s(Ay,"h_"),o(Ay,"watchParentGateway");import{closeSync as t7,openSync as u7,readSync as r7,statSync as n7}from"node:fs";function Iy(e,t,r){let i=n7(e).size;if(i===0)return[];let u=Math.max(0,i-t),n=Buffer.alloc(i-u),a=u7(e,"r");try{r7(a,n,0,n.length,u)}finally{t7(a)}let l=n.toString("utf8").trim().split(`
|
|
73
73
|
`);return u>0&&l.shift(),l.slice(-r)}s(Iy,"g_"),o(Iy,"readEventTailLines");import{execFileSync as i7}from"node:child_process";import{createHash as s7}from"node:crypto";import{readdirSync as _y,readFileSync as Fs}from"node:fs";import{homedir as a7}from"node:os";var Sy=new Set(["db","redis","queue","memory","external","fs","exec"]);function Qe(e){let t=Number(e??0);return Number.isFinite(t)&&t>=0?t:0}s(Qe,"Dt"),o(Qe,"finite");var o7=class{static{s(this,"Ta")}static{o(this,"ClusterState")}constructor(e){this.opts=e,this.gateway=null,this.services=new Map,this.edges=new Map,this.recent=[],this.dataNodes=new Map,this.declCache={at:0,decls:[]},this.registryCache={at:0}}reduce(e){if(Sy.has(e.source)){let u=e.raw??{},n=e.context??{},a=String(u.queue??u.store??u.name??e.source),l=n.projectName??u.project,d=typeof l=="string"&&l?l:void 0,c=e.source+":"+a,p=this.dataNodes.get(c),h=u.kind==="queue-state",m=u.kind==="fs-ops"?Qe(u.reads)+Qe(u.writes):h?0:1,f=new Set(p?.usedBy??[]);d&&f.add(d),this.dataNodes.set(c,{id:c,kind:e.source,name:a,viaProject:p?.viaProject??d??"unknown",usedBy:[...f].sort(),count:(p?.count??0)+m,lastSeenAt:e.timestamp,counts:h?u.counts:p?.counts,recent:h?u.recent:p?.recent}),this.opts.onChange?.();return}if(e.source!=="gateway")return;let t=e.raw??{},r=typeof t.kind=="string"?t.kind:"",i=e.timestamp;if(r==="gateway-up")this.gateway={at:i,ports:t.ports??[],routes:t.routes??[]};else if(r==="gateway-down")this.gateway&&(this.gateway={...this.gateway,ports:[]});else if(r==="gateway-traffic"){this.gateway||(this.gateway={at:i,ports:[],routes:[]}),this.gateway.aliveAt=i;let u=String(t.host??""),n=String(t.project??""),a=typeof t.caller=="string"?t.caller:void 0,l=(a?a+"\u21D2":"")+u+"\u2192"+n,d=this.edges.get(l);this.edges.set(l,{host:u,project:n,caller:a,count:(d?.count??0)+Qe(t.count),avgMs:Qe(t.avgMs),errors:(d?.errors??0)+Qe(t.errors),lastSeenAt:i})}else if(r.startsWith("service-")||r==="cold-start"||r==="autoscale"||r==="idle-kill"){let u=String(t.project??"");if(!u)return;let n=this.services.get(u),a={project:u,state:n?.state??"unknown",pods:n?.pods,lastColdStartMs:n?.lastColdStartMs,lastEventAt:i,lastEvent:e.title};r==="service-starting"&&(a.state="starting"),r==="service-up"&&(a.state="up",a.pods=Qe(t.pods??a.pods)),r==="cold-start"&&(a.state="up",a.pods=Qe(t.pods??a.pods),typeof t.durationMs=="number"&&(a.lastColdStartMs=t.durationMs)),r==="autoscale"&&(a.pods=Qe(t.to??a.pods)),(r==="service-down"||r==="idle-kill")&&(a.state="down",a.pods=0,r==="idle-kill"&&(a.idle=!0)),this.services.set(u,a)}this.recent.push({at:i,title:e.title,severity:e.severity}),this.recent.length>40&&this.recent.splice(0,this.recent.length-40),this.opts.onChange?.()}discoverDecls(){if(Date.now()-this.declCache.at<1e4)return this.declCache.decls;let e=[],t,r=o((i,u)=>{if(u>4)return;let n;try{n=_y(i,{withFileTypes:!0})}catch{return}for(let a of n){if(a.name==="node_modules"||a.name.startsWith("."))continue;let l=`${i}/${a.name}`;if(a.isDirectory())r(l,u+1);else if(a.name==="project.json")try{let d=JSON.parse(Fs(l,"utf8")),c=d.targets??{};!t&&/cluster:trust$/.test(c.trust?.executor??"")&&(t=String(d.name??""));let p=d.cluster??d.davnx;if(!p)continue;let h=c["serve-hmr"]?.options?.internalPort,m=(c["serve-hmr"]?.options?.workers??[]).map(g=>g.name),f=typeof p.service=="string"?p.service:void 0;e.push({project:String(d.name??l),host:p.host,path:p.path,internalHost:p.internalHost,service:f,port:p.port,upstream:p.upstream,prependPrefix:p.prependPrefix,default:p.default,internalPort:h,workers:m,podNames:f?this.podNames(f):[],eager:p.eager,minPods:p.minPods,maxPods:p.maxPods,auth:p.auth})}catch{}}},"walk");return r(this.opts.root,0),this.declCache={at:Date.now(),decls:e,...t?{trustProject:t}:{}},e}trustCommand(){return this.discoverDecls(),`yarn nx run ${this.declCache.trustProject||"gateway"}:trust`}podNames(e){try{return _y(this.opts.podSockDir(e)).filter(t=>t.endsWith(".sock")).map(t=>t.replace(".sock","")).sort()}catch{return[]}}hostsSetup(e){let t="";try{t=(this.opts.readHosts??(()=>Fs("/etc/hosts","utf8")))()}catch{}let r=t.split(`
|
|
74
|
-
`).map(n=>n.trim()).filter(n=>n&&!n.startsWith("#")).map(n=>n.split(/\s+/)),i=o((n,a)=>r.some(l=>l[0]===n&&l.slice(1).includes(a)),"has"),u=[];for(let n of e)n.host&&!n.host.includes("*")&&(u.push(n.host),n.service&&n.internalHost!==!1&&u.push(typeof n.internalHost=="string"?n.internalHost:`internal.${n.host}`));return[...new Set(u)].map(n=>({host:n,v4:i("127.0.0.1",n),v6:i("::1",n)}))}serviceKeyView(){let e;try{e=JSON.parse(Fs(`${this.opts.root}/${l7}`,"utf8"))}catch{return{}}let t={};for(let[r,i]of Object.entries(e))typeof i!="string"||i===""||(t[r]={fingerprint:s7("sha256").update(i).digest("hex").slice(0,12)});return t}liveDecls(){let e=this.discoverDecls();for(let t of e)t.service&&(t.podNames=this.podNames(t.service));return e}legacyView(){let e=this.liveDecls();return{at:Date.now(),gateway:this.gateway,decls:e,hostsSetup:this.hostsSetup(e),trustCommand:this.trustCommand(),serviceKeys:this.serviceKeyView(),services:[...this.services.values()].sort((t,r)=>t.project.localeCompare(r.project)),edges:[...this.edges.values()].sort((t,r)=>r.lastSeenAt-t.lastSeenAt),dataNodes:[...this.dataNodes.values()].sort((t,r)=>r.count-t.count).slice(0,24),recent:this.recent.slice(-20).reverse()}}gatewayLiveness(e=Date.now()){let t=this.opts.env??process.env,r=(t.LENSMCP_GATEWAY_PORTS??"").split(",").map(d=>Number(d.trim())).filter(d=>Number.isInteger(d)&&d>0),i=this.gateway?.ports??[],u=r.length?r:i,n=Number(t.LENSMCP_PARENT_PID??0);if(n>0)return xp(n)?{state:"live",role:"gateway-child",ports:u,since:this.gateway?.at,evidence:`served by the gateway process (pid ${n})`}:{state:"down",role:"gateway-child",ports:u,evidence:`the gateway that started this dashboard (pid ${n}) is gone`};if(i.length>0)return{state:"live",role:"standalone",ports:u,since:this.gateway?.at,evidence:"gateway-up event on this workspace\u2019s bus"};let a=this.registeredGateway(e);if(a)return{state:"live",role:"standalone",ports:u,evidence:`registered with the gateway daemon (pid ${a})`};let l=this.gateway?.aliveAt??0;return l>e-3e4?{state:"live",role:"standalone",ports:u,since:l,evidence:`gateway traffic ${Math.round((e-l)/1e3)}s ago`}:this.gateway?{state:"down",role:"standalone",ports:u,evidence:"no gateway traffic in the last 30s"}:{state:"unknown",role:"standalone",ports:u,evidence:"no gateway events seen \u2014 is this dashboard running without the gateway?"}}registeredGateway(e){if(e-this.registryCache.at<15e3)return this.registryCache.pid;let t;try{let r=`${(this.opts.env??process.env).LENSMCP_HOME||a7()}/.lensmcp/workspaces.json`,i=JSON.parse(Fs(r,"utf8")),u=Array.isArray(i)?i.find(n=>n.root===this.opts.root):void 0;u&&typeof u.pid=="number"&&u.pid>0&&xp(u.pid)&&(!u.procStamp||jy(u.pid)===u.procStamp)&&(t=u.pid)}catch{}return this.registryCache={at:e,...t?{pid:t}:{}},t}view(e){let t=e.now??Date.now(),r=this.liveDecls(),i=this.hostsSetup(r),u=this.serviceKeyView(),n=new Map((e.processCluster?.services??[]).map(f=>[f.project,f])),a=new Map;for(let f of e.processCluster?.errors??[]){if(!f.project||!f.line)continue;let g=a.get(f.project)??[];g.push(f.line),a.set(f.project,g.slice(-6))}let l=[...this.edges.values()].filter(f=>!f.caller),d=r.map(f=>{let g=f.service?f.eager?"eager":"lazy":"web",E=this.services.get(f.project),b=n.get(f.project),$=(e.processCluster?.errors??[]).filter(K=>K.project===f.project&&K.fault!=="types"),A=b?.buildFailed===!0&&$.length>0&&$.every(K=>K.fault==="process"),{state:_,reason:j}=zy(g,E,b,f.podNames.length,A),F=l.filter(K=>K.project===f.project),D=F.reduce((K,Q)=>K+Q.count,0),B=F.reduce((K,Q)=>K+Q.errors,0),x=F.slice().sort((K,Q)=>Q.lastSeenAt-K.lastSeenAt)[0],N=e.kpis?.projectStats(f.project,t),O=f.service&&f.internalHost!==!1&&f.host?typeof f.internalHost=="string"?f.internalHost:`internal.${f.host}`:void 0;return{project:f.project,kind:g,state:_,...j?{stateReason:j}:{},...f.host?{host:f.host}:{},...f.path?{path:f.path}:{},...O?{internalHost:O}:{},...f.port!==void 0?{port:f.port}:{},...f.internalPort!==void 0?{internalPort:f.internalPort}:{},pods:{running:f.podNames.length,names:f.podNames,...f.minPods!==void 0?{min:f.minPods}:{},...f.maxPods!==void 0?{max:f.maxPods}:{}},workers:f.workers??[],...E?.lastColdStartMs!==void 0?{lastColdStartMs:E.lastColdStartMs}:{},restarts:b?.restarts??0,buildFailed:(b?.buildFailed??!1)&&!A,processError:A,typeErrors:b?.typeErrors??!1,errorLines:a.get(f.project)??[],...f.auth?{auth:{...f.auth.default?{default:f.auth.default}:{},overrides:f.auth.overrides?.length??0}}:{},traffic:{count:D,errors:B,avgMs:x?x.avgMs:null,...x?{lastSeenAt:x.lastSeenAt}:{}},...N?{window:N}:{},...u[f.project]?{keyFingerprint:u[f.project].fingerprint}:{},...E?{lastEvent:{at:E.lastEventAt,title:E.lastEvent}}:b?.lastTitle?{lastEvent:{at:b.lastSeenAt??0,title:b.lastTitle}}:{}}}).sort((f,g)=>Fy[f.kind]-Fy[g.kind]||f.project.localeCompare(g.project)),c=l.map(f=>({host:f.host,project:f.project,count:f.count,errors:f.errors,avgMs:f.avgMs,lastSeenAt:f.lastSeenAt})).sort((f,g)=>g.count-f.count);for(let f of r)f.host&&!c.some(g=>g.host===f.host&&g.project===f.project)&&c.push({host:f.host,project:f.project,count:0,errors:0,avgMs:null});let p=[...this.edges.values()].filter(f=>!!f.caller).map(f=>({caller:f.caller,callee:f.project,host:f.host,count:f.count,errors:f.errors,avgMs:f.avgMs,lastSeenAt:f.lastSeenAt})).sort((f,g)=>g.count-f.count),h=[...this.dataNodes.values()].filter(f=>f.kind!=="memory").map(f=>({id:f.id,kind:f.kind,name:f.name,usedBy:f.usedBy??(f.viaProject&&f.viaProject!=="unknown"?[f.viaProject]:[]),ops:f.count,lastSeenAt:f.lastSeenAt,...f.kind==="queue"&&(f.counts||f.recent)?{queue:{counts:f.counts??{},recent:(f.recent??[]).slice(0,8).map(g=>({id:String(g.id??""),...typeof g.name=="string"?{name:g.name}:{},...typeof g.state=="string"?{state:g.state}:typeof g.status=="string"?{state:g.status}:{},...typeof g.finishedOn=="number"?{at:g.finishedOn}:typeof g.timestamp=="number"?{at:g.timestamp}:{}}))}}:{}})).sort((f,g)=>g.ops-f.ops).slice(0,24),m=i.filter(f=>!f.v4||!f.v6);return{at:t,gateway:this.gatewayLiveness(t),services:d,routes:c,edges:p,backends:h,hosts:i,...m.length?{hostsFix:Ny(m)}:{},trustCommand:this.trustCommand(),recent:this.recent.slice(-20).reverse()}}},Fy={web:0,eager:1,lazy:2},l7="node_modules/.cache/davnx-webpack/service-keys.json";function jy(e){if(process.platform==="win32")return"";try{return i7("ps",["-p",String(e),"-o","lstart="],{encoding:"utf8",timeout:2e3,stdio:["ignore","pipe","ignore"]}).trim()}catch{return""}}s(jy,"aN"),o(jy,"processStamp");function xp(e){if(process.ppid===e)return!0;try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}s(xp,"b_"),o(xp,"pidAlive");function zy(e,t,r,i,u=!1){let n=r?.state;if(n==="crash-looping")return{state:"crash-looping",reason:"keeps exiting right after start"};if(n==="wedged")return{state:"wedged",reason:"running but not answering"};let a=n==="up"||t?.state==="up";return r?.buildFailed&&!a?{state:"down",reason:`${u?"a process error":"build failed"} \u2014 see the error lines`}:a?r?.buildFailed?{state:"up",reason:u?"reported a process error \u2014 see the error lines":"serving its last good build \u2014 the current build failed"}:{state:"up"}:n==="starting"||t?.state==="starting"?{state:"starting",reason:e==="lazy"?"cold start in progress":"starting"}:!n&&!t&&i>0?{state:"up",reason:`${i} pod socket${i===1?"":"s"} live`}:n==="idle"||t?.idle||e==="lazy"&&(n==="down"||t?.state==="down"||!t)?{state:"idle",reason:"scaled to zero \u2014 starts on the next request"}:n==="down"||t?.state==="down"?{state:"down",reason:"not running"}:{state:"unknown",reason:"no lifecycle events seen yet"}}s(zy,"cN"),o(zy,"serviceState");function Ny(e){let t=e.filter(i=>!i.v4).map(i=>i.host),r=e.filter(i=>!i.v6).map(i=>i.host);return`printf '${[...t.length?[`127.0.0.1 ${t.join(" ")}`]:[],...r.length?[`::1 ${r.join(" ")}`]:[]].join("\\n")}\\n' | sudo tee -a /etc/hosts`}s(Ny,"uN"),o(Ny,"hostsFixCommand");var d7=class{static{s(this,"Aa")}static{o(this,"LogRing")}constructor(e=5e3){this.cap=e,this.lines=[],this.seqN=0,this.sourceSet=new Set}get seq(){return this.seqN}get size(){return this.lines.length}sources(){return[...this.sourceSet].sort()}append(e){let t=Oy(e,++this.seqN);return this.sourceSet.add(t.source),this.lines.push(t),this.lines.length>this.cap+Math.ceil(this.cap/10)&&this.lines.splice(0,this.lines.length-this.cap),t}since(e,t=this.cap){let r=this.indexAfter(e),i=this.lines.slice(r);return i.length>t?i.slice(i.length-t):i}recent(e){return this.lines.slice(Math.max(0,this.lines.length-e))}query(e){let t=e.limit??2e3,r=e.q?.toLowerCase(),i=e.since&&e.since>0?this.lines.slice(this.indexAfter(e.since)):this.lines,u=[];for(let n=i.length-1;n>=0&&u.length<t;n--){let a=i[n];e.flowId&&a.flowId!==e.flowId||e.from!==void 0&&a.at<e.from||e.to!==void 0&&a.at>e.to||r&&!`${a.title} ${a.message??""} ${a.source}`.toLowerCase().includes(r)||u.push(a)}return u.reverse()}indexAfter(e){let t=0,r=this.lines.length;for(;t<r;){let i=t+r>>>1;this.lines[i].seq<=e?t=i+1:r=i}return t}};function Oy(e,t){let r=e.raw??{},i=e.context??{},u=typeof r.project=="string"&&r.project?r.project:e.source,n=typeof i.flowId=="string"?i.flowId:typeof i.traceId=="string"?i.traceId:void 0;return{seq:t,at:e.timestamp,source:u,category:e.category,severity:e.severity,title:e.title,...e.message?{message:e.message}:{},...n?{flowId:n}:{}}}s(Oy,"lN"),o(Oy,"logLineOf");var Ry=class{static{s(this,"Ro")}static{o(this,"SeenIds")}constructor(e=5e4){this.cap=e,this.set=new Set,this.order=[]}firstTime(e){if(!e)return!0;if(this.set.has(e))return!1;if(this.set.add(e),this.order.push(e),this.order.length>this.cap)for(let t of this.order.splice(0,this.order.length-this.cap))this.set.delete(t);return!0}},Ty=class{static{s(this,"za")}static{o(this,"Series")}constructor(e){this.horizonSec=e,this.buckets=new Map}bucket(e){let t=this.buckets.get(e);return t||(t={sec:e,count:0,errors:0,lat:[],latReq:[]},this.buckets.set(e,t)),t}addTraffic(e,t,r){let i=this.bucket(e);i.count+=t,i.errors+=r}addLatency(e,t,r){let i=this.bucket(e),u=r?i.lat:i.latReq;u.length<256&&u.push(t)}prune(e){for(let t of this.buckets.keys())t<=e-this.horizonSec&&this.buckets.delete(t)}range(e,t){let r=[];for(let i of this.buckets.values())i.sec>e&&i.sec<=t&&r.push(i);return r}},c7=class{static{s(this,"ja")}static{o(this,"KpiWindow")}constructor(e={}){this.byProject=new Map,this.windowSec=e.windowSec??300,this.sparkBuckets=e.sparkBuckets??30,this.sparkBucketSec=e.sparkBucketSec??10,this.horizonSec=Math.max(this.windowSec,this.sparkBuckets*this.sparkBucketSec)+5,this.global=new Ty(this.horizonSec)}project(e){let t=this.byProject.get(e);return t||(t=new Ty(this.horizonSec),this.byProject.set(e,t)),t}observe(e){if(e.source!=="gateway")return;let t=e.raw??{},r=t.kind,i=Math.floor(e.timestamp/1e3),u=typeof t.project=="string"?t.project:"",n=typeof t.caller=="string"&&t.caller?t.caller:void 0;if(r==="gateway-traffic"){let a=Cp(t.count),l=Cp(t.errors);if(a===0&&l===0)return;n||this.global.addTraffic(i,a,l),u&&this.project(u).addTraffic(i,a,l);let d=Array.isArray(t.durationsMs)?t.durationsMs:[];for(let c of d){let p=Number(c);!Number.isFinite(p)||p<0||(n||this.global.addLatency(i,p,!0),u&&this.project(u).addLatency(i,p,!0))}}else if(r==="gateway-request"){let a=Number(t.durationMs);if(!Number.isFinite(a)||a<0)return;n||this.global.addLatency(i,a,!1),u&&this.project(u).addLatency(i,a,!1)}}snapshot(e=Date.now()){let t=Math.floor(e/1e3);this.global.prune(t);for(let u of this.byProject.values())u.prune(t);let r=this.global,i=Ip(r,t,this.sparkBuckets,this.sparkBucketSec);return{at:e,windowSec:this.windowSec,req60:Zt(r.range(t-60,t),"count"),last:Ap(r.range(t-this.windowSec,t)),sparkBucketSec:this.sparkBucketSec,spark:i}}projectStats(e,t=Date.now()){let r=this.byProject.get(e);if(!r)return;let i=Math.floor(t/1e3);return r.prune(i),{...Ap(r.range(i-this.windowSec,i)),req60:Zt(r.range(i-60,i),"count"),spark:Ip(r,i,this.sparkBuckets,this.sparkBucketSec).req}}};function Cp(e){let t=Number(e??0);return Number.isFinite(t)&&t>0?t:0}s(Cp,"w_"),o(Cp,"nonNeg");function Zt(e,t){let r=0;for(let i of e)r+=i[t];return r}s(Zt,"nn"),o(Zt,"sum");function kp(e){let t=[];for(let i of e)for(let u of i.lat)t.push(u);if(t.length)return{lat:t.sort((i,u)=>i-u),complete:!0};let r=[];for(let i of e)for(let u of i.latReq)r.push(u);return{lat:r.sort((i,u)=>i-u),complete:!1}}s(kp,"__"),o(kp,"latencies");function Ap(e){let t=Zt(e,"count"),r=Zt(e,"errors"),{lat:i,complete:u}=kp(e),n=i.length?i.reduce((a,l)=>a+l,0)/i.length:null;return{count:t,errors:r,errorRate:t>0?r/t:null,p50:js(i,.5),p95:js(i,.95),avgMs:n===null?null:Math.round(n),samples:i.length,sampled:!u||i.length<t}}s(Ap,"x_"),o(Ap,"statsOf");function js(e,t){if(e.length===0)return null;let r=Math.min(e.length-1,Math.max(0,Math.ceil(t*e.length)-1));return Math.round(e[r])}s(js,"Ay"),o(js,"percentile");function Ip(e,t,r,i){let u=[],n=[],a=[];for(let l=r-1;l>=0;l--){let d=t-l*i,c=e.range(d-i,d);u.push(Zt(c,"count")),n.push(Zt(c,"errors")),a.push(js(kp(c).lat,.95))}return{req:u,errors:n,p95:a}}s(Ip,"$_"),o(Ip,"sparkOf");var p7=class{static{s(this,"Oa")}static{o(this,"FlowIndex")}constructor(e={flows:2e3,events:5e4},t=dt){this.caps=e,this.config=t,this.revs=new Map,this.pending=new Set,this.eventFlow=new Map,this.cache=new Map,this.evidenceCache=new Map}observe(e){let t=_p(e);if(!t)return;let r=(this.revs.get(t)??0)+1;this.revs.delete(t),this.revs.set(t,r),this.revs.size>this.caps.flows&&this.revs.delete(this.revs.keys().next().value),this.pending.add(t),e.id&&(this.eventFlow.set(e.id,t),this.eventFlow.size>this.caps.events&&this.eventFlow.delete(this.eventFlow.keys().next().value))}rev(e){return this.revs.get(e)??0}drainRevs(){let e=[...this.pending].map(t=>({flowId:t,rev:this.rev(t)}));return this.pending.clear(),e}flowOfEvent(e){return this.eventFlow.get(e)}summaries(e,t=50){if(!e)return[];let r=[];for(let u of e.recentFlowIds().slice(0,t)){let n=this.rev(u),a=this.cache.get(u);if(a&&a.rev===n&&n>0){r.push(a.summary);continue}let l=e.getFlowSummary(u);if(!l)continue;let d=e.getFlowEvents(u)??[],c=e.analyzeFlow?.(u)??(d.length?zi(d,this.config):void 0),p=Jy(l,d,n,c);this.cache.set(u,{rev:n,summary:p}),r.push(p)}let i=new Set(r.map(u=>u.flowId));for(let u of this.cache.keys())i.has(u)||this.cache.delete(u);return r.sort((u,n)=>n.lastSeenAt-u.lastSeenAt)}evidence(e,t=50){let r=[];if(e){for(let i of e.recentFlowIds().slice(0,t)){let u=this.rev(i),n=this.evidenceCache.get(i);if(n&&n.rev===u&&u>0){r.push(...n.samples);continue}let a=My(i,e.getFlowEvents(i)??[]);this.evidenceCache.set(i,{rev:u,samples:a}),r.push(...a)}if(this.evidenceCache.size>t*2){let i=new Set(e.recentFlowIds().slice(0,t));for(let u of this.evidenceCache.keys())i.has(u)||this.evidenceCache.delete(u)}}return new m7(r)}findByRoute(e,t,r){let i=zs(r);return e.find(u=>u.request&&u.request.method===t&&i.test(u.request.path))?.flowId}};function My(e,t){let r=[],i=new Map;for(let n of t){let a=n.raw??{};if(a.kind==="server-request"&&n.id){let l=a.request??{},d=Uy(n)??(typeof l.requestId=="string"?l.requestId:void 0);if(!d)continue;let c=typeof l.endedAt=="number"?l.endedAt:Py(n),p=typeof l.startedAt=="number"?l.startedAt:c-(typeof l.durationMs=="number"?l.durationMs:0);i.set(d,[...i.get(d)??[],{id:n.id,start:p,end:c}])}}let u=o((n,a)=>{let l=n?i.get(n):void 0;if(l?.length)return l.length===1?l[0].id:l.filter(d=>d.start-5<=a&&a<=d.end+5).sort((d,c)=>c.start-d.start)[0]?.id},"handlerAt");for(let n of t){if(!n.id)continue;let a=n.raw??{},l=Py(n),d=o(p=>typeof p=="number"&&Number.isFinite(p)?p:0,"num"),c=a.kind;if(c==="server-request"){let p=a.request??{};if(typeof p.route!="string")continue;r.push({key:`route:${String(p.method??"GET")} ${p.route}`,flowId:e,eventId:n.id,ms:d(p.durationMs),at:l,failed:d(p.status)>=500})}else if(c==="db-query"&&typeof a.project=="string"){let p=`${String(a.op??"query")} ${String(a.table??"")}`.trim(),h=n.title.replace(/\s*\(.*$/,"").trim();for(let m of new Set([p,h]))r.push({key:`sql:${a.project}:${m}`,flowId:e,eventId:n.id,ms:d(a.durationMs),at:l,failed:n.severity==="error"})}else if(c==="egress"&&typeof a.project=="string"&&typeof a.host=="string"){let p=typeof a.error=="string"||d(a.status)>=500||n.severity==="error";r.push({key:`egress:${a.project}:${a.host}`,flowId:e,eventId:n.id,ms:d(a.durationMs),at:l,failed:p})}else if(c==="memory-mutation"){let p=(a.mutation??{}).ownerNodeId;if(typeof p!="string")continue;r.push({key:`mem:${p}`,flowId:e,eventId:u(Uy(n),l)??n.id,ms:0,at:l,failed:!1})}}return r}s(My,"dN"),o(My,"evidenceSamples");var Py=o(e=>typeof e.timestamp=="number"?e.timestamp:Date.parse(String(e.timestamp))||0,"tsOf"),Uy=o(e=>{let t=e.context??{};return typeof t.requestId=="string"&&t.requestId?t.requestId:void 0},"requestIdOf"),m7=class{static{s(this,"zy")}static{o(this,"EvidenceLookup")}constructor(e){this.samples=e}find(e,t,r={}){let i;for(let u of this.samples)!e(u.key)||r.inFlow!==void 0&&u.flowId!==r.inFlow||t==="failing"&&!u.failed||r.minMs!==void 0&&u.ms<r.minMs||(i?(t==="slowest"?u.ms>i.ms||u.ms===i.ms&&u.at>i.at:u.at>i.at)&&(i=u):i=u);return i?{flowId:i.flowId,nodeId:i.eventId}:void 0}};function _p(e){let t=e.context??{};return typeof t.flowId=="string"&&t.flowId?t.flowId:void 0}s(_p,"jy"),o(_p,"flowIdOf");function zs(e){let t=e.split("/").map(r=>r.startsWith(":")?"[^/?#]+":r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("/");return new RegExp(`^${t}(?:[?#].*)?$`)}s(zs,"Na"),o(zs,"routeRegex");var f7=new Set(["memory-mutation","memory-retention","singleton-instance","subscription-added","subscription-removed","store-created","hook-run"]),h7={"user-click":"click","user-input":"input","input-change":"input",keyboard:"key press","route-load":"navigate","page-load":"page load","form-submit":"submit",effect:"effect",timer:"timer","websocket-message":"socket message","backend-response":"response","hmr-update":"hot reload","ai-turn":"AI turn"};function Zy(e){return e?h7[e]??e.replace(/-/g," "):"request"}s(Zy,"mN"),o(Zy,"originLabelOf");function qy(e){if(!e)return;if(e.startsWith("page:"))return e.slice(5)||"/";let t=/([^/:]+\.[cm]?[jt]sx?):(\d+)/.exec(e);if(t)return`${t[1]}:${t[2]}`;let r=e.replace(/^[a-z]+:/,"");return r.length>40?"\u2026"+r.slice(-39):r}s(qy,"hN"),o(qy,"originWhereOf");function Ly(e){let t=_i.indexOf(e);return t===-1?_i.length:t}s(Ly,"gN"),o(Ly,"categoryRankOf");function Jy(e,t,r,i){let u={},n=new Set,a="ok",l,d=1/0,c,p=1/0,h=1/0,m=-1/0,f=new Set,g=0,E=0,b,$=o(N=>{(N==="error"||N==="warn"&&a==="ok")&&(a=N)},"bump");for(let N of t){let O=N.raw??{},K=N.context??{},Q=typeof O.kind=="string"?O.kind:void 0,Dt=Gl({source:N.source,category:N.category,title:N.title,kind:Q});u[Dt]=(u[Dt]??0)+1;let We=typeof O.project=="string"?O.project:typeof K.projectName=="string"?K.projectName:void 0;We&&N.source!=="gateway"&&n.add(We),N.severity==="error"||N.severity==="fatal"?($("error"),E++,(!b||N.timestamp<b.at)&&(b={at:N.timestamp,title:N.title})):N.severity==="warning"&&$("warn");let Me=Number(O.status??O.request?.status);if(Number.isFinite(Me)&&(Me>=500?$("error"):Me>=400&&$("warn")),(Q==="fetch-start"||Q==="fetch-done"||Q==="fetch-error")&&typeof O.url=="string"){let ze=Number(O.startedAt??N.timestamp);(ze<d||ze===d&&l&&l.status===void 0)&&(d=ze,l={method:String(O.method??"GET"),path:O.url,...Number.isFinite(Me)?{status:Me}:l?.status!==void 0?{status:l.status}:{}})}if(f.size<80)if(Q==="gateway-request"&&typeof O.url=="string")f.add(`${String(O.method??"GET")} ${Sp(O.url)}`);else if(Q==="server-request"){let ze=O.request??{};typeof ze.route=="string"&&f.add(`${String(ze.method??"GET")} ${ze.route}`)}else Q==="db-query"&&We?f.add(`sql:${We}:${N.title.replace(/\s*\(.*$/,"")}`):Q==="egress"&&We&&typeof O.host=="string"&&f.add(`egress:${We}:${O.host}`);if(Q==="gateway-request"&&!O.caller&&N.source==="gateway"&&g++,Q==="gateway-request"&&!O.caller&&typeof O.url=="string"&&N.timestamp<p&&(p=N.timestamp,c={method:String(O.method??"GET"),path:O.url,...Number.isFinite(Me)?{status:Me}:{}}),Q&&f7.has(Q))continue;let wt=Number(O.durationMs??O.request?.durationMs??0),et=Number(O.startedAt),Iu=Number.isFinite(et)&&et>0?et:N.timestamp-(Number.isFinite(wt)?wt:0),$t=Number.isFinite(et)&&et>0&&Number.isFinite(wt)?et+wt:N.timestamp;Iu<h&&(h=Iu),$t>m&&(m=$t)}!l&&c&&(l=c);let A=Zy(e.originType),_=qy(e.originNodeId),j=l?`${l.method} ${Sp(l.path)}`:void 0,F=e.headline&&e.headline!==e.originType?e.headline:void 0,D=!e.originType&&g>1?` +${g-1} more request${g===2?"":"s"}`:"",B=e.originType?`${A}${_?` \xB7 ${_}`:""}`:j?`${j}${D}`:F??A,x=e.originType&&j?`${B} \u2192 ${j}`:B;return{flowId:e.flowId,...e.originType?{originType:e.originType}:{},...e.originNodeId?{originNodeId:e.originNodeId}:{},startedAt:e.startedAt,lastSeenAt:e.lastSeenAt,eventCount:e.eventCount,headline:x,originLabel:A,..._?{originWhere:_}:{},...l?{request:l}:{},worst:a,durationMs:Number.isFinite(h)&&m>=h?Math.round(m-h):0,lanes:u,projects:[...n].sort(),rev:r,...g?{requestCount:g}:{},...E?{errorCount:E,firstError:Wy(b.title)}:{},...f.size?{touches:[...f]}:{},...i?Vy(i):{}}}s(Jy,"vN"),o(Jy,"summarizeFlow");function Vy(e){let t=e.classification,r=e.segmentation.stats;return{category:t.category,categoryRank:Ly(t.category),decidedBy:t.decidedBy,...t.subject?{subject:t.subject}:{},tags:t.tags,segmentCount:r.segments,phaseCount:r.phases,signalCount:r.signal}}s(Vy,"yN"),o(Vy,"analysisFields");function Wy(e){return e.replace(/\s*✗\s*$/,"").replace(/\s*\((?:\d+ rows?, )?[\d.]+ ?ms\)$/,"")}s(Wy,"bN"),o(Wy,"cleanTitle");function Sp(e){let t=e.indexOf("?");return t>=0?e.slice(0,t):e}s(Sp,"I_"),o(Sp,"stripQuery");function Fp(e,t){return{id:e.id,kind:e.kind,label:e.label,phase:e.phase,start:e.start,end:e.end,durationMs:e.durationMs,counts:e.counts,projects:e.projects,...e.method?{method:e.method}:{},...e.route?{route:e.route}:{},...e.requestId?{requestId:e.requestId}:{},...e.after?{after:e.after}:{},...e.hot?{hot:e.hot}:{},...e.part?{part:e.part}:{},worstSeverity:e.worstSeverity,category:t}}s(Fp,"R_"),o(Fp,"toDashSegment");function Gy(e,t,r){if(!e)return{flowId:t,summary:null,events:[],rev:r.rev};let i=e.getFlowSummary(t)??null,u=e.getFlowEvents(t)??[],n=e.analyzeFlow?.(t)??(u.length?zi(u,r.config??dt):void 0),a,l=u;if(r.segmentId!==void 0){a=n?.segmentation.segments.find(g=>g.id===r.segmentId);let f=new Set(a?.eventIds??[]);l=u.filter(g=>f.has(g.id))}let d=Ii(l,{includeRaw:r.includeRaw===!0}),c={flowId:t,summary:i,...d,rev:r.rev};if(!n)return c;let p=n.segmentation.assignment;c.events=c.events.map(f=>{let g=p[f.id]??(f.memberIds?.[0]?p[f.memberIds[0]]:void 0);return g?{...f,segmentId:g}:f});let h=o(f=>n.segmentCategories[f.id]??"other","category");c.segments=n.segmentation.segments.map(f=>Fp(f,h(f))),c.phases=n.segmentation.phases,c.segmentCategories=n.segmentCategories,c.segmentStats=n.segmentation.stats;let m=n.classification;return c.classification={category:m.category,decidedBy:m.decidedBy,...m.ruleIndex!==void 0?{ruleIndex:m.ruleIndex}:{},...m.subject?{subject:m.subject}:{},tags:m.tags,origin:m.origin},a&&(c.focus=Fp(a,h(a))),c}s(Gy,"E_"),o(Gy,"flowDetailPayload");var g7=300,v7=1e3,Ky=20,Hy=30,y7=1500,be=o(e=>e&&typeof e=="object"?e:{},"obj"),M=o(e=>typeof e=="string"&&e?e:void 0,"str"),ve=o(e=>typeof e=="number"&&Number.isFinite(e)?e:void 0,"num"),E7=class{static{s(this,"Ma")}static{o(this,"ErrorLog")}constructor(e=Date.now){this.now=e,this.groups=new Map,this.pending=[],this.byRequest=new Map,this.projectOfRequest=new Map,this.seen=new Set,this.dismissals=new Map,this.changed=!1}observe(e){if(e.id){if(this.seen.has(e.id))return!1;this.seen.add(e.id),this.seen.size>2e4&&this.seen.delete(this.seen.values().next().value)}let t=Wl(e);if(t)return this.dismissals.delete(t.groupId),t.kind===mu&&(this.dismissals.set(t.groupId,{until:t.until,at:e.timestamp,eventIds:new Set(t.eventIds),...t.by?{by:t.by}:{},...t.reason?{reason:t.reason}:{}}),this.dismissals.size>v7&&this.dismissals.delete(this.dismissals.keys().next().value)),this.changed=!0,!0;let r=be(e.raw),i=be(e.context),u=M(r.kind),n=M(i.requestId);u==="gateway-request"&&n&&M(r.project)&&(this.projectOfRequest.set(n,M(r.project)),this.projectOfRequest.size>5e3&&this.projectOfRequest.delete(this.projectOfRequest.keys().next().value));let a=e.severity==="error"||e.severity==="fatal",l=be(r.request),d=ve(r.status)??ve(l.status);return u==="server-request"&&(a||(d??0)>=500)?this.defer(e,"server"):e.source==="client-runtime"&&a&&(u==="error"||u==="unhandledrejection"||u==="resource-error"||u==="console")?this.browser(e,r,i):u==="egress"&&(M(r.error)||(d??0)>=500)?this.external(e,r,i,d):u==="queue-failed"?this.queue(e,r,i):u==="span"&&a?this.defer(e,"span"):u==="gateway-request"&&((d??0)>=500||d===0)?this.defer(e,"gateway"):u==="fetch-done"&&(d??0)>=500||u==="fetch-error"?this.defer(e,"fetch"):u==="log"&&a&&(e.source==="nestjs"||e.source==="nest")?this.defer(e,"log"):!1}flush(e=!1){let t=this.now(),r=o(a=>e||t-a.arrivedAt>=y7,"ready"),i=o(a=>M(be(a.event.context).requestId),"requestOf");for(let a of this.pending.filter(l=>l.kind==="server"&&r(l))){this.pending.splice(this.pending.indexOf(a),1);let l=be(a.event.raw);this.server(a.event,l,be(l.request),be(a.event.context))}let u=new Set(this.pending.filter(a=>a.kind==="server").map(i).filter(Boolean));for(let a of this.pending.filter(l=>l.kind!=="server"&&r(l)&&!(i(l)&&u.has(i(l)))))this.pending.splice(this.pending.indexOf(a),1),this.settle(a);let n=this.changed;return this.changed=!1,n}snapshot(e=[],t=15*6e4){let r=this.now(),i=Math.floor(r/6e4),u=[...this.groups.values()].map(c=>{let p=[];for(let E=i-Hy+1;E<=i;E++)p.push(c.perMinute.get(E)??0);let{flows:h,perMinute:m,eventIds:f,...g}=c;return{...g,occurrences:[...g.occurrences],flowCount:h.size,spark:p}}),n=this.hiddenEvents(),a=[],l=[];for(let c of[...e,...u].sort((p,h)=>+!!h.ongoing-+!!p.ongoing||h.lastSeenAt-p.lastSeenAt)){let p=this.dismissalOf(c,n);p?l.push({...c,dismissedAt:p.at,...p.by?{dismissedBy:p.by}:{},...p.reason?{dismissedReason:p.reason}:{}}):a.push(c)}let d=a.filter(c=>c.ongoing||r-c.lastSeenAt<=t);return{at:r,recentMs:t,groups:a,recentGroups:d.length,recentOccurrences:d.reduce((c,p)=>c+(p.ongoing?1:p.occurrences.filter(h=>r-h.at<=t).length),0),dismissed:l}}hiddenEvents(){let e=new Map;for(let t of this.dismissals.values())for(let r of t.eventIds)(e.get(r)?.at??-1)<=t.at&&e.set(r,t);return e}dismissalOf(e,t){let r=this.dismissals.get(e.id);if(r&&e.lastSeenAt<=r.until)return r;let i=this.groups.get(e.id)?.eventIds;if(!i?.length||t.size===0)return;let u;for(let n of i){let a=t.get(n);if(!a)return;(!u||a.at>u.at)&&(u=a)}return u}dismissalsFor(e,t=[],r=this.now()){let i=[];for(let u of new Set(e)){let n=this.groups.get(u),a=n??t.find(l=>l.id===u);a&&i.push({groupId:u,until:Math.max(r,a.lastSeenAt),eventIds:n?n.eventIds.slice():[],by:"dashboard",title:a.title})}return i}restorable(e){let t=new Set;for(let r of new Set(e)){this.dismissals.has(r)&&t.add(r);let i=this.groups.get(r)?.eventIds??[];for(let[u,n]of this.dismissals)i.some(a=>n.eventIds.has(a))&&t.add(u)}return[...t]}server(e,t,r,i){let u=M(i.requestId)??M(r.requestId),n=M(i.projectName)??M(t.project)??(u?this.projectOfRequest.get(u):void 0),a=M(r.method)??"GET",l=M(r.route)??"?",d=ve(r.status)??ve(t.status),c=be(r.error),p=M(c.message)??M(e.message),h=M(c.name),m=`${a} ${l}${d?` \u2192 ${d}`:""}`,f=`server:${n??"?"}:${a} ${l}:${d??""}:${h??""}:${qt(p)}`,g=this.record(f,"server",e,{title:m,...n?{where:n,project:n}:{},...p?{message:p}:{},...M(c.stack)?{stack:en(M(c.stack))}:{},...d!==void 0?{status:d}:{}},u,d);return u&&this.byRequest.set(u,{group:this.groups.get(f),occ:g}),this.trimRequests(),!0}browser(e,t,r){let i=M(t.message)??e.title,u=M(r.url)??M(r.route),n=`browser:${M(t.kind)}:${qt(i)}`;return this.record(n,"browser",e,{title:i.split(`
|
|
74
|
+
`).map(n=>n.trim()).filter(n=>n&&!n.startsWith("#")).map(n=>n.split(/\s+/)),i=o((n,a)=>r.some(l=>l[0]===n&&l.slice(1).includes(a)),"has"),u=[];for(let n of e)n.host&&!n.host.includes("*")&&(u.push(n.host),n.service&&n.internalHost!==!1&&u.push(typeof n.internalHost=="string"?n.internalHost:`internal.${n.host}`));return[...new Set(u)].map(n=>({host:n,v4:i("127.0.0.1",n),v6:i("::1",n)}))}serviceKeyView(){let e;try{e=JSON.parse(Fs(`${this.opts.root}/${l7}`,"utf8"))}catch{return{}}let t={};for(let[r,i]of Object.entries(e))typeof i!="string"||i===""||(t[r]={fingerprint:s7("sha256").update(i).digest("hex").slice(0,12)});return t}liveDecls(){let e=this.discoverDecls();for(let t of e)t.service&&(t.podNames=this.podNames(t.service));return e}legacyView(){let e=this.liveDecls();return{at:Date.now(),gateway:this.gateway,decls:e,hostsSetup:this.hostsSetup(e),trustCommand:this.trustCommand(),serviceKeys:this.serviceKeyView(),services:[...this.services.values()].sort((t,r)=>t.project.localeCompare(r.project)),edges:[...this.edges.values()].sort((t,r)=>r.lastSeenAt-t.lastSeenAt),dataNodes:[...this.dataNodes.values()].sort((t,r)=>r.count-t.count).slice(0,24),recent:this.recent.slice(-20).reverse()}}gatewayLiveness(e=Date.now()){let t=this.opts.env??process.env,r=(t.LENSMCP_GATEWAY_PORTS??"").split(",").map(d=>Number(d.trim())).filter(d=>Number.isInteger(d)&&d>0),i=this.gateway?.ports??[],u=r.length?r:i,n=Number(t.LENSMCP_PARENT_PID??0);if(n>0)return xp(n)?{state:"live",role:"gateway-child",ports:u,since:this.gateway?.at,evidence:`served by the gateway process (pid ${n})`}:{state:"down",role:"gateway-child",ports:u,evidence:`the gateway that started this dashboard (pid ${n}) is gone`};if(i.length>0)return{state:"live",role:"standalone",ports:u,since:this.gateway?.at,evidence:"gateway-up event on this workspace\u2019s bus"};let a=this.registeredGateway(e);if(a)return{state:"live",role:"standalone",ports:u,evidence:`registered with the gateway daemon (pid ${a})`};let l=this.gateway?.aliveAt??0;return l>e-3e4?{state:"live",role:"standalone",ports:u,since:l,evidence:`gateway traffic ${Math.round((e-l)/1e3)}s ago`}:this.gateway?{state:"down",role:"standalone",ports:u,evidence:"no gateway traffic in the last 30s"}:{state:"unknown",role:"standalone",ports:u,evidence:"no gateway events seen \u2014 is this dashboard running without the gateway?"}}registeredGateway(e){if(e-this.registryCache.at<15e3)return this.registryCache.pid;let t;try{let r=`${(this.opts.env??process.env).LENSMCP_HOME||a7()}/.lensmcp/workspaces.json`,i=JSON.parse(Fs(r,"utf8")),u=Array.isArray(i)?i.find(n=>n.root===this.opts.root):void 0;u&&typeof u.pid=="number"&&u.pid>0&&xp(u.pid)&&(!u.procStamp||jy(u.pid)===u.procStamp)&&(t=u.pid)}catch{}return this.registryCache={at:e,...t?{pid:t}:{}},t}view(e){let t=e.now??Date.now(),r=this.liveDecls(),i=this.hostsSetup(r),u=this.serviceKeyView(),n=new Map((e.processCluster?.services??[]).map(f=>[f.project,f])),a=new Map;for(let f of e.processCluster?.errors??[]){if(!f.project||!f.line)continue;let g=a.get(f.project)??[];g.push(f.line),a.set(f.project,g.slice(-6))}let l=[...this.edges.values()].filter(f=>!f.caller),d=r.map(f=>{let g=f.service?f.eager?"eager":"lazy":"web",E=this.services.get(f.project),b=n.get(f.project),$=(e.processCluster?.errors??[]).filter(K=>K.project===f.project&&K.fault!=="types"),A=b?.buildFailed===!0&&$.length>0&&$.every(K=>K.fault==="process"),{state:_,reason:j}=zy(g,E,b,f.podNames.length,A),F=l.filter(K=>K.project===f.project),D=F.reduce((K,Q)=>K+Q.count,0),B=F.reduce((K,Q)=>K+Q.errors,0),x=F.slice().sort((K,Q)=>Q.lastSeenAt-K.lastSeenAt)[0],N=e.kpis?.projectStats(f.project,t),O=f.service&&f.internalHost!==!1&&f.host?typeof f.internalHost=="string"?f.internalHost:`internal.${f.host}`:void 0;return{project:f.project,kind:g,state:_,...j?{stateReason:j}:{},...f.host?{host:f.host}:{},...f.path?{path:f.path}:{},...O?{internalHost:O}:{},...f.port!==void 0?{port:f.port}:{},...f.internalPort!==void 0?{internalPort:f.internalPort}:{},pods:{running:f.podNames.length,names:f.podNames,...f.minPods!==void 0?{min:f.minPods}:{},...f.maxPods!==void 0?{max:f.maxPods}:{}},workers:f.workers??[],...E?.lastColdStartMs!==void 0?{lastColdStartMs:E.lastColdStartMs}:{},restarts:b?.restarts??0,buildFailed:(b?.buildFailed??!1)&&!A,processError:A,typeErrors:b?.typeErrors??!1,errorLines:a.get(f.project)??[],...f.auth?{auth:{...f.auth.default?{default:f.auth.default}:{},overrides:f.auth.overrides?.length??0}}:{},traffic:{count:D,errors:B,avgMs:x?x.avgMs:null,...x?{lastSeenAt:x.lastSeenAt}:{}},...N?{window:N}:{},...u[f.project]?{keyFingerprint:u[f.project].fingerprint}:{},...E?{lastEvent:{at:E.lastEventAt,title:E.lastEvent}}:b?.lastTitle?{lastEvent:{at:b.lastSeenAt??0,title:b.lastTitle}}:{}}}).sort((f,g)=>Fy[f.kind]-Fy[g.kind]||f.project.localeCompare(g.project)),c=l.map(f=>({host:f.host,project:f.project,count:f.count,errors:f.errors,avgMs:f.avgMs,lastSeenAt:f.lastSeenAt})).sort((f,g)=>g.count-f.count);for(let f of r)f.host&&!c.some(g=>g.host===f.host&&g.project===f.project)&&c.push({host:f.host,project:f.project,count:0,errors:0,avgMs:null});let p=[...this.edges.values()].filter(f=>!!f.caller).map(f=>({caller:f.caller,callee:f.project,host:f.host,count:f.count,errors:f.errors,avgMs:f.avgMs,lastSeenAt:f.lastSeenAt})).sort((f,g)=>g.count-f.count),h=[...this.dataNodes.values()].filter(f=>f.kind!=="memory").map(f=>({id:f.id,kind:f.kind,name:f.name,usedBy:f.usedBy??(f.viaProject&&f.viaProject!=="unknown"?[f.viaProject]:[]),ops:f.count,lastSeenAt:f.lastSeenAt,...f.kind==="queue"&&(f.counts||f.recent)?{queue:{counts:f.counts??{},recent:(f.recent??[]).slice(0,8).map(g=>({id:String(g.id??""),...typeof g.name=="string"?{name:g.name}:{},...typeof g.state=="string"?{state:g.state}:typeof g.status=="string"?{state:g.status}:{},...typeof g.finishedOn=="number"?{at:g.finishedOn}:typeof g.timestamp=="number"?{at:g.timestamp}:{}}))}}:{}})).sort((f,g)=>g.ops-f.ops).slice(0,24),m=i.filter(f=>!f.v4||!f.v6);return{at:t,gateway:this.gatewayLiveness(t),services:d,routes:c,edges:p,backends:h,hosts:i,...m.length?{hostsFix:Ny(m)}:{},trustCommand:this.trustCommand(),recent:this.recent.slice(-20).reverse()}}},Fy={web:0,eager:1,lazy:2},l7="node_modules/.cache/davnx-webpack/service-keys.json";function jy(e){if(process.platform==="win32")return"";try{return i7("ps",["-p",String(e),"-o","lstart="],{encoding:"utf8",timeout:2e3,stdio:["ignore","pipe","ignore"]}).trim()}catch{return""}}s(jy,"aN"),o(jy,"processStamp");function xp(e){if(process.ppid===e)return!0;try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}s(xp,"b_"),o(xp,"pidAlive");function zy(e,t,r,i,u=!1){let n=r?.state;if(n==="crash-looping")return{state:"crash-looping",reason:"keeps exiting right after start"};if(n==="wedged")return{state:"wedged",reason:"running but not answering"};let a=n==="up"||t?.state==="up";return r?.buildFailed&&!a?{state:"down",reason:`${u?"a process error":"build failed"} \u2014 see the error lines`}:a?r?.buildFailed?{state:"up",reason:u?"reported a process error \u2014 see the error lines":"serving its last good build \u2014 the current build failed"}:{state:"up"}:n==="starting"||t?.state==="starting"?{state:"starting",reason:e==="lazy"?"cold start in progress":"starting"}:!n&&!t&&i>0?{state:"up",reason:`${i} pod socket${i===1?"":"s"} live`}:n==="idle"||t?.idle||e==="lazy"&&(n==="down"||t?.state==="down"||!t)?{state:"idle",reason:"scaled to zero \u2014 starts on the next request"}:n==="down"||t?.state==="down"?{state:"down",reason:"not running"}:{state:"unknown",reason:"no lifecycle events seen yet"}}s(zy,"cN"),o(zy,"serviceState");function Ny(e){let t=e.filter(i=>!i.v4).map(i=>i.host),r=e.filter(i=>!i.v6).map(i=>i.host);return`printf '${[...t.length?[`127.0.0.1 ${t.join(" ")}`]:[],...r.length?[`::1 ${r.join(" ")}`]:[]].join("\\n")}\\n' | sudo tee -a /etc/hosts`}s(Ny,"uN"),o(Ny,"hostsFixCommand");var d7=class{static{s(this,"Aa")}static{o(this,"LogRing")}constructor(e=5e3){this.cap=e,this.lines=[],this.seqN=0,this.sourceSet=new Set}get seq(){return this.seqN}get size(){return this.lines.length}sources(){return[...this.sourceSet].sort()}append(e){let t=Oy(e,++this.seqN);return this.sourceSet.add(t.source),this.lines.push(t),this.lines.length>this.cap+Math.ceil(this.cap/10)&&this.lines.splice(0,this.lines.length-this.cap),t}since(e,t=this.cap){let r=this.indexAfter(e),i=this.lines.slice(r);return i.length>t?i.slice(i.length-t):i}recent(e){return this.lines.slice(Math.max(0,this.lines.length-e))}query(e){let t=e.limit??2e3,r=e.q?.toLowerCase(),i=e.since&&e.since>0?this.lines.slice(this.indexAfter(e.since)):this.lines,u=[];for(let n=i.length-1;n>=0&&u.length<t;n--){let a=i[n];e.flowId&&a.flowId!==e.flowId||e.from!==void 0&&a.at<e.from||e.to!==void 0&&a.at>e.to||r&&!`${a.title} ${a.message??""} ${a.source}`.toLowerCase().includes(r)||u.push(a)}return u.reverse()}indexAfter(e){let t=0,r=this.lines.length;for(;t<r;){let i=t+r>>>1;this.lines[i].seq<=e?t=i+1:r=i}return t}};function Oy(e,t){let r=e.raw??{},i=e.context??{},u=typeof r.project=="string"&&r.project?r.project:e.source,n=typeof i.flowId=="string"?i.flowId:typeof i.traceId=="string"?i.traceId:void 0;return{seq:t,at:e.timestamp,source:u,category:e.category,severity:e.severity,title:e.title,...e.message?{message:e.message}:{},...n?{flowId:n}:{}}}s(Oy,"lN"),o(Oy,"logLineOf");var Ry=class{static{s(this,"Ro")}static{o(this,"SeenIds")}constructor(e=5e4){this.cap=e,this.set=new Set,this.order=[]}firstTime(e){if(!e)return!0;if(this.set.has(e))return!1;if(this.set.add(e),this.order.push(e),this.order.length>this.cap)for(let t of this.order.splice(0,this.order.length-this.cap))this.set.delete(t);return!0}},Ty=class{static{s(this,"za")}static{o(this,"Series")}constructor(e){this.horizonSec=e,this.buckets=new Map}bucket(e){let t=this.buckets.get(e);return t||(t={sec:e,count:0,errors:0,lat:[],latReq:[]},this.buckets.set(e,t)),t}addTraffic(e,t,r){let i=this.bucket(e);i.count+=t,i.errors+=r}addLatency(e,t,r){let i=this.bucket(e),u=r?i.lat:i.latReq;u.length<256&&u.push(t)}prune(e){for(let t of this.buckets.keys())t<=e-this.horizonSec&&this.buckets.delete(t)}range(e,t){let r=[];for(let i of this.buckets.values())i.sec>e&&i.sec<=t&&r.push(i);return r}},c7=class{static{s(this,"ja")}static{o(this,"KpiWindow")}constructor(e={}){this.byProject=new Map,this.windowSec=e.windowSec??300,this.sparkBuckets=e.sparkBuckets??30,this.sparkBucketSec=e.sparkBucketSec??10,this.horizonSec=Math.max(this.windowSec,this.sparkBuckets*this.sparkBucketSec)+5,this.global=new Ty(this.horizonSec)}project(e){let t=this.byProject.get(e);return t||(t=new Ty(this.horizonSec),this.byProject.set(e,t)),t}observe(e){if(e.source!=="gateway")return;let t=e.raw??{},r=t.kind,i=Math.floor(e.timestamp/1e3),u=typeof t.project=="string"?t.project:"",n=typeof t.caller=="string"&&t.caller?t.caller:void 0;if(r==="gateway-traffic"){let a=Cp(t.count),l=Cp(t.errors);if(a===0&&l===0)return;n||this.global.addTraffic(i,a,l),u&&this.project(u).addTraffic(i,a,l);let d=Array.isArray(t.durationsMs)?t.durationsMs:[];for(let c of d){let p=Number(c);!Number.isFinite(p)||p<0||(n||this.global.addLatency(i,p,!0),u&&this.project(u).addLatency(i,p,!0))}}else if(r==="gateway-request"){let a=Number(t.durationMs);if(!Number.isFinite(a)||a<0)return;n||this.global.addLatency(i,a,!1),u&&this.project(u).addLatency(i,a,!1)}}snapshot(e=Date.now()){let t=Math.floor(e/1e3);this.global.prune(t);for(let u of this.byProject.values())u.prune(t);let r=this.global,i=Ip(r,t,this.sparkBuckets,this.sparkBucketSec);return{at:e,windowSec:this.windowSec,req60:Zt(r.range(t-60,t),"count"),last:Ap(r.range(t-this.windowSec,t)),sparkBucketSec:this.sparkBucketSec,spark:i}}projectStats(e,t=Date.now()){let r=this.byProject.get(e);if(!r)return;let i=Math.floor(t/1e3);return r.prune(i),{...Ap(r.range(i-this.windowSec,i)),req60:Zt(r.range(i-60,i),"count"),spark:Ip(r,i,this.sparkBuckets,this.sparkBucketSec).req}}};function Cp(e){let t=Number(e??0);return Number.isFinite(t)&&t>0?t:0}s(Cp,"w_"),o(Cp,"nonNeg");function Zt(e,t){let r=0;for(let i of e)r+=i[t];return r}s(Zt,"nn"),o(Zt,"sum");function kp(e){let t=[];for(let i of e)for(let u of i.lat)t.push(u);if(t.length)return{lat:t.sort((i,u)=>i-u),complete:!0};let r=[];for(let i of e)for(let u of i.latReq)r.push(u);return{lat:r.sort((i,u)=>i-u),complete:!1}}s(kp,"__"),o(kp,"latencies");function Ap(e){let t=Zt(e,"count"),r=Zt(e,"errors"),{lat:i,complete:u}=kp(e),n=i.length?i.reduce((a,l)=>a+l,0)/i.length:null;return{count:t,errors:r,errorRate:t>0?r/t:null,p50:js(i,.5),p95:js(i,.95),avgMs:n===null?null:Math.round(n),samples:i.length,sampled:!u||i.length<t}}s(Ap,"x_"),o(Ap,"statsOf");function js(e,t){if(e.length===0)return null;let r=Math.min(e.length-1,Math.max(0,Math.ceil(t*e.length)-1));return Math.round(e[r])}s(js,"Ay"),o(js,"percentile");function Ip(e,t,r,i){let u=[],n=[],a=[];for(let l=r-1;l>=0;l--){let d=t-l*i,c=e.range(d-i,d);u.push(Zt(c,"count")),n.push(Zt(c,"errors")),a.push(js(kp(c).lat,.95))}return{req:u,errors:n,p95:a}}s(Ip,"$_"),o(Ip,"sparkOf");var p7=class{static{s(this,"Oa")}static{o(this,"FlowIndex")}constructor(e={flows:2e3,events:5e4},t=dt){this.caps=e,this.config=t,this.revs=new Map,this.pending=new Set,this.eventFlow=new Map,this.cache=new Map,this.evidenceCache=new Map}observe(e){let t=_p(e);if(!t)return;let r=(this.revs.get(t)??0)+1;this.revs.delete(t),this.revs.set(t,r),this.revs.size>this.caps.flows&&this.revs.delete(this.revs.keys().next().value),this.pending.add(t),e.id&&(this.eventFlow.set(e.id,t),this.eventFlow.size>this.caps.events&&this.eventFlow.delete(this.eventFlow.keys().next().value))}rev(e){return this.revs.get(e)??0}drainRevs(){let e=[...this.pending].map(t=>({flowId:t,rev:this.rev(t)}));return this.pending.clear(),e}flowOfEvent(e){return this.eventFlow.get(e)}summaries(e,t=50){if(!e)return[];let r=[];for(let u of e.recentFlowIds().slice(0,t)){let n=this.rev(u),a=this.cache.get(u);if(a&&a.rev===n&&n>0){r.push(a.summary);continue}let l=e.getFlowSummary(u);if(!l)continue;let d=e.getFlowEvents(u)??[],c=e.analyzeFlow?.(u)??(d.length?zi(d,this.config):void 0),p=Jy(l,d,n,c);this.cache.set(u,{rev:n,summary:p}),r.push(p)}let i=new Set(r.map(u=>u.flowId));for(let u of this.cache.keys())i.has(u)||this.cache.delete(u);return r.sort((u,n)=>n.lastSeenAt-u.lastSeenAt)}evidence(e,t=50){let r=[];if(e){for(let i of e.recentFlowIds().slice(0,t)){let u=this.rev(i),n=this.evidenceCache.get(i);if(n&&n.rev===u&&u>0){r.push(...n.samples);continue}let a=My(i,e.getFlowEvents(i)??[]);this.evidenceCache.set(i,{rev:u,samples:a}),r.push(...a)}if(this.evidenceCache.size>t*2){let i=new Set(e.recentFlowIds().slice(0,t));for(let u of this.evidenceCache.keys())i.has(u)||this.evidenceCache.delete(u)}}return new m7(r)}findByRoute(e,t,r){let i=zs(r);return e.find(u=>u.request&&u.request.method===t&&i.test(u.request.path))?.flowId}};function My(e,t){let r=[],i=new Map;for(let n of t){let a=n.raw??{};if(a.kind==="server-request"&&n.id){let l=a.request??{},d=Uy(n)??(typeof l.requestId=="string"?l.requestId:void 0);if(!d)continue;let c=typeof l.endedAt=="number"?l.endedAt:Py(n),p=typeof l.startedAt=="number"?l.startedAt:c-(typeof l.durationMs=="number"?l.durationMs:0);i.set(d,[...i.get(d)??[],{id:n.id,start:p,end:c}])}}let u=o((n,a)=>{let l=n?i.get(n):void 0;if(l?.length)return l.length===1?l[0].id:l.filter(d=>d.start-5<=a&&a<=d.end+5).sort((d,c)=>c.start-d.start)[0]?.id},"handlerAt");for(let n of t){if(!n.id)continue;let a=n.raw??{},l=Py(n),d=o(p=>typeof p=="number"&&Number.isFinite(p)?p:0,"num"),c=a.kind;if(c==="server-request"){let p=a.request??{};if(typeof p.route!="string")continue;r.push({key:`route:${String(p.method??"GET")} ${p.route}`,flowId:e,eventId:n.id,ms:d(p.durationMs),at:l,failed:d(p.status)>=500})}else if(c==="db-query"&&typeof a.project=="string"){let p=`${String(a.op??"query")} ${String(a.table??"")}`.trim(),h=n.title.replace(/\s*\(.*$/,"").trim();for(let m of new Set([p,h]))r.push({key:`sql:${a.project}:${m}`,flowId:e,eventId:n.id,ms:d(a.durationMs),at:l,failed:n.severity==="error"})}else if(c==="egress"&&typeof a.project=="string"&&typeof a.host=="string"){let p=typeof a.error=="string"||d(a.status)>=500||n.severity==="error";r.push({key:`egress:${a.project}:${a.host}`,flowId:e,eventId:n.id,ms:d(a.durationMs),at:l,failed:p})}else if(c==="memory-mutation"){let p=(a.mutation??{}).ownerNodeId;if(typeof p!="string")continue;r.push({key:`mem:${p}`,flowId:e,eventId:u(Uy(n),l)??n.id,ms:0,at:l,failed:!1})}}return r}s(My,"dN"),o(My,"evidenceSamples");var Py=o(e=>typeof e.timestamp=="number"?e.timestamp:Date.parse(String(e.timestamp))||0,"tsOf"),Uy=o(e=>{let t=e.context??{};return typeof t.requestId=="string"&&t.requestId?t.requestId:void 0},"requestIdOf"),m7=class{static{s(this,"zy")}static{o(this,"EvidenceLookup")}constructor(e){this.samples=e}find(e,t,r={}){let i;for(let u of this.samples)!e(u.key)||r.inFlow!==void 0&&u.flowId!==r.inFlow||t==="failing"&&!u.failed||r.minMs!==void 0&&u.ms<r.minMs||(i?(t==="slowest"?u.ms>i.ms||u.ms===i.ms&&u.at>i.at:u.at>i.at)&&(i=u):i=u);return i?{flowId:i.flowId,nodeId:i.eventId}:void 0}};function _p(e){let t=e.context??{};return typeof t.flowId=="string"&&t.flowId?t.flowId:void 0}s(_p,"jy"),o(_p,"flowIdOf");function zs(e){let t=e.split("/").map(r=>r.startsWith(":")?"[^/?#]+":r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("/");return new RegExp(`^${t}(?:[?#].*)?$`)}s(zs,"Na"),o(zs,"routeRegex");var f7=new Set(["memory-mutation","memory-retention","singleton-instance","subscription-added","subscription-removed","store-created","hook-run"]),h7={"user-click":"click","user-input":"input","input-change":"input",keyboard:"key press","route-load":"navigate","page-load":"page load","form-submit":"submit",effect:"effect",timer:"timer","websocket-message":"socket message","backend-response":"response","hmr-update":"hot reload","ai-turn":"AI turn"};function Zy(e){return e?h7[e]??e.replace(/-/g," "):"request"}s(Zy,"mN"),o(Zy,"originLabelOf");function qy(e){if(!e)return;if(e.startsWith("page:"))return e.slice(5)||"/";let t=/([^/:]+\.[cm]?[jt]sx?):(\d+)/.exec(e);if(t)return`${t[1]}:${t[2]}`;let r=e.replace(/^[a-z]+:/,"");return r.length>40?"\u2026"+r.slice(-39):r}s(qy,"hN"),o(qy,"originWhereOf");function Ly(e){let t=_i.indexOf(e);return t===-1?_i.length:t}s(Ly,"gN"),o(Ly,"categoryRankOf");function Jy(e,t,r,i){let u={},n=new Set,a="ok",l,d=1/0,c,p=1/0,h=1/0,m=-1/0,f=new Set,g=0,E=0,b,$=o(N=>{(N==="error"||N==="warn"&&a==="ok")&&(a=N)},"bump");for(let N of t){let O=N.raw??{},K=N.context??{},Q=typeof O.kind=="string"?O.kind:void 0,Dt=Gl({source:N.source,category:N.category,title:N.title,kind:Q});u[Dt]=(u[Dt]??0)+1;let We=typeof O.project=="string"?O.project:typeof K.projectName=="string"?K.projectName:void 0;We&&N.source!=="gateway"&&n.add(We),N.severity==="error"||N.severity==="fatal"?($("error"),E++,(!b||N.timestamp<b.at)&&(b={at:N.timestamp,title:N.title})):N.severity==="warning"&&$("warn");let Me=Number(O.status??O.request?.status);if(Number.isFinite(Me)&&(Me>=500?$("error"):Me>=400&&$("warn")),(Q==="fetch-start"||Q==="fetch-done"||Q==="fetch-error")&&typeof O.url=="string"){let ze=Number(O.startedAt??N.timestamp);(ze<d||ze===d&&l&&l.status===void 0)&&(d=ze,l={method:String(O.method??"GET"),path:O.url,...Number.isFinite(Me)?{status:Me}:l?.status!==void 0?{status:l.status}:{}})}if(f.size<80)if(Q==="gateway-request"&&typeof O.url=="string")f.add(`${String(O.method??"GET")} ${Sp(O.url)}`);else if(Q==="server-request"){let ze=O.request??{};typeof ze.route=="string"&&f.add(`${String(ze.method??"GET")} ${ze.route}`)}else Q==="db-query"&&We?f.add(`sql:${We}:${N.title.replace(/\s*\(.*$/,"")}`):Q==="egress"&&We&&typeof O.host=="string"&&f.add(`egress:${We}:${O.host}`);if(Q==="gateway-request"&&!O.caller&&N.source==="gateway"&&g++,Q==="gateway-request"&&!O.caller&&typeof O.url=="string"&&N.timestamp<p&&(p=N.timestamp,c={method:String(O.method??"GET"),path:O.url,...Number.isFinite(Me)?{status:Me}:{}}),Q&&f7.has(Q))continue;let wt=Number(O.durationMs??O.request?.durationMs??0),et=Number(O.startedAt),Iu=Number.isFinite(et)&&et>0?et:N.timestamp-(Number.isFinite(wt)?wt:0),$t=Number.isFinite(et)&&et>0&&Number.isFinite(wt)?et+wt:N.timestamp;Iu<h&&(h=Iu),$t>m&&(m=$t)}!l&&c&&(l=c);let A=Zy(e.originType),_=qy(e.originNodeId),j=l?`${l.method} ${Sp(l.path)}`:void 0,F=e.headline&&e.headline!==e.originType?e.headline:void 0,D=!e.originType&&g>1?` +${g-1} more request${g===2?"":"s"}`:"",B=e.originType?`${A}${_?` \xB7 ${_}`:""}`:j?`${j}${D}`:F??A,x=e.originType&&j?`${B} \u2192 ${j}`:B;return{flowId:e.flowId,...e.originType?{originType:e.originType}:{},...e.originNodeId?{originNodeId:e.originNodeId}:{},startedAt:e.startedAt,lastSeenAt:e.lastSeenAt,eventCount:e.eventCount,headline:x,originLabel:A,..._?{originWhere:_}:{},...l?{request:l}:{},worst:a,durationMs:Number.isFinite(h)&&m>=h?Math.round(m-h):0,lanes:u,projects:[...n].sort(),rev:r,...g?{requestCount:g}:{},...E?{errorCount:E,firstError:Wy(b.title)}:{},...f.size?{touches:[...f]}:{},...i?Vy(i):{}}}s(Jy,"vN"),o(Jy,"summarizeFlow");function Vy(e){let t=e.classification,r=e.segmentation.stats;return{category:t.category,categoryRank:Ly(t.category),decidedBy:t.decidedBy,...t.subject?{subject:t.subject}:{},tags:t.tags,segmentCount:r.segments,phaseCount:r.phases,signalCount:r.signal}}s(Vy,"yN"),o(Vy,"analysisFields");function Wy(e){return e.replace(/\s*✗\s*$/,"").replace(/\s*\((?:\d+ rows?, )?[\d.]+ ?ms\)$/,"")}s(Wy,"bN"),o(Wy,"cleanTitle");function Sp(e){let t=e.indexOf("?");return t>=0?e.slice(0,t):e}s(Sp,"I_"),o(Sp,"stripQuery");function Fp(e,t){return{id:e.id,kind:e.kind,label:e.label,phase:e.phase,start:e.start,end:e.end,durationMs:e.durationMs,counts:e.counts,projects:e.projects,...e.method?{method:e.method}:{},...e.route?{route:e.route}:{},...e.requestId?{requestId:e.requestId}:{},...e.after?{after:e.after}:{},...e.hot?{hot:e.hot}:{},...e.part?{part:e.part}:{},worstSeverity:e.worstSeverity,category:t}}s(Fp,"R_"),o(Fp,"toDashSegment");function Gy(e,t,r){if(!e)return{flowId:t,summary:null,events:[],rev:r.rev};let i=e.getFlowSummary(t)??null,u=e.getFlowEvents(t)??[],n=e.analyzeFlow?.(t)??(u.length?zi(u,r.config??dt):void 0),a,l=u;if(r.segmentId!==void 0){a=n?.segmentation.segments.find(g=>g.id===r.segmentId);let f=new Set(a?.eventIds??[]);l=u.filter(g=>f.has(g.id))}let d=Ii(l,{includeRaw:r.includeRaw===!0}),c={flowId:t,summary:i,...d,rev:r.rev};if(!n)return c;let p=n.segmentation.assignment;c.events=c.events.map(f=>{let g=p[f.id]??(f.memberIds?.[0]?p[f.memberIds[0]]:void 0);return g?{...f,segmentId:g}:f});let h=o(f=>n.segmentCategories[f.id]??"other","category");c.segments=n.segmentation.segments.map(f=>Fp(f,h(f))),c.phases=n.segmentation.phases,c.segmentCategories=n.segmentCategories,c.segmentStats=n.segmentation.stats;let m=n.classification;return c.classification={category:m.category,decidedBy:m.decidedBy,...m.ruleIndex!==void 0?{ruleIndex:m.ruleIndex}:{},...m.subject?{subject:m.subject}:{},tags:m.tags,origin:m.origin},a&&(c.focus=Fp(a,h(a))),c}s(Gy,"E_"),o(Gy,"flowDetailPayload");var g7=300,v7=1e3,Ky=20,Hy=30,y7=1500,be=o(e=>e&&typeof e=="object"?e:{},"obj"),M=o(e=>typeof e=="string"&&e?e:void 0,"str"),ve=o(e=>typeof e=="number"&&Number.isFinite(e)?e:void 0,"num"),E7=class{static{s(this,"Ma")}static{o(this,"ErrorLog")}constructor(e=Date.now){this.now=e,this.groups=new Map,this.pending=[],this.byRequest=new Map,this.projectOfRequest=new Map,this.seen=new Set,this.dismissals=new Map,this.changed=!1}observe(e){if(e.id){if(this.seen.has(e.id))return!1;this.seen.add(e.id),this.seen.size>2e4&&this.seen.delete(this.seen.values().next().value)}let t=Wl(e);if(t)return this.dismissals.delete(t.groupId),t.kind===mu&&(this.dismissals.set(t.groupId,{until:t.until,at:e.timestamp,eventIds:new Set(t.eventIds),...t.by?{by:t.by}:{},...t.reason?{reason:t.reason}:{}}),this.dismissals.size>v7&&this.dismissals.delete(this.dismissals.keys().next().value)),this.changed=!0,!0;let r=be(e.raw),i=be(e.context),u=M(r.kind),n=M(i.requestId);u==="gateway-request"&&n&&M(r.project)&&(this.projectOfRequest.set(n,M(r.project)),this.projectOfRequest.size>5e3&&this.projectOfRequest.delete(this.projectOfRequest.keys().next().value));let a=e.severity==="error"||e.severity==="fatal",l=be(r.request),d=ve(r.status)??ve(l.status);return u==="server-request"&&(a||(d??0)>=500)?this.defer(e,"server"):e.source==="client-runtime"&&a&&(u==="error"||u==="unhandledrejection"||u==="resource-error"||u==="console")?this.browser(e,r,i):u==="egress"&&(M(r.error)||(d??0)>=500)?this.external(e,r,i,d):u==="queue-failed"?this.queue(e,r,i):u==="span"&&a?this.defer(e,"span"):u==="gateway-request"&&((d??0)>=500||d===0)?this.defer(e,"gateway"):u==="fetch-done"&&(d??0)>=500||u==="fetch-error"?this.defer(e,"fetch"):u==="log"&&a&&(e.source==="nestjs"||e.source==="nest")?this.defer(e,"log"):!1}flush(e=!1){let t=this.now(),r=o(a=>e||t-a.arrivedAt>=y7,"ready"),i=o(a=>M(be(a.event.context).requestId),"requestOf");for(let a of this.pending.filter(l=>l.kind==="server"&&r(l))){this.pending.splice(this.pending.indexOf(a),1);let l=be(a.event.raw);this.server(a.event,l,be(l.request),be(a.event.context))}let u=new Set(this.pending.filter(a=>a.kind==="server").map(i).filter(Boolean));for(let a of this.pending.filter(l=>l.kind!=="server"&&r(l)&&!(i(l)&&u.has(i(l)))))this.pending.splice(this.pending.indexOf(a),1),this.settle(a);let n=this.changed;return this.changed=!1,n}snapshot(e=[],t=15*6e4){let r=this.now(),i=Math.floor(r/6e4),u=[...this.groups.values()].map(c=>{let p=[];for(let E=i-Hy+1;E<=i;E++)p.push(c.perMinute.get(E)??0);let{flows:h,perMinute:m,eventIds:f,...g}=c;return{...g,occurrences:[...g.occurrences],flowCount:h.size,spark:p}}),n=this.hiddenEvents(),a=[],l=[];for(let c of[...e,...u].sort((p,h)=>+!!h.ongoing-+!!p.ongoing||h.lastSeenAt-p.lastSeenAt)){let p=this.dismissalOf(c,n);p?l.push({...c,dismissedAt:p.at,...p.by?{dismissedBy:p.by}:{},...p.reason?{dismissedReason:p.reason}:{}}):a.push(c)}let d=a.filter(c=>c.ongoing||r-c.lastSeenAt<=t);return{at:r,recentMs:t,groups:a,recentGroups:d.length,recentOccurrences:d.reduce((c,p)=>c+(p.ongoing?1:p.occurrences.filter(h=>r-h.at<=t).length),0),dismissed:l}}hiddenEvents(){let e=new Map;for(let t of this.dismissals.values())for(let r of t.eventIds)(e.get(r)?.at??-1)<=t.at&&e.set(r,t);return e}dismissalOf(e,t){let r=this.dismissals.get(e.id);if(r&&e.lastSeenAt<=r.until)return r;let i=this.groups.get(e.id)?.eventIds,u=i?.[i.length-1];return u===void 0?void 0:t.get(u)}dismissalsFor(e,t=[],r=this.now()){let i=[];for(let u of new Set(e)){let n=this.groups.get(u),a=n??t.find(l=>l.id===u);a&&i.push({groupId:u,until:Math.max(r,a.lastSeenAt),eventIds:n?n.eventIds.slice():[],by:"dashboard",title:a.title})}return i}restorable(e){let t=new Set;for(let r of new Set(e)){this.dismissals.has(r)&&t.add(r);let i=this.groups.get(r)?.eventIds??[];for(let[u,n]of this.dismissals)i.some(a=>n.eventIds.has(a))&&t.add(u)}return[...t]}server(e,t,r,i){let u=M(i.requestId)??M(r.requestId),n=M(i.projectName)??M(t.project)??(u?this.projectOfRequest.get(u):void 0),a=M(r.method)??"GET",l=M(r.route)??"?",d=ve(r.status)??ve(t.status),c=be(r.error),p=M(c.message)??M(e.message),h=M(c.name),m=`${a} ${l}${d?` \u2192 ${d}`:""}`,f=`server:${n??"?"}:${a} ${l}:${d??""}:${h??""}:${qt(p)}`,g=this.record(f,"server",e,{title:m,...n?{where:n,project:n}:{},...p?{message:p}:{},...M(c.stack)?{stack:en(M(c.stack))}:{},...d!==void 0?{status:d}:{}},u,d);return u&&this.byRequest.set(u,{group:this.groups.get(f),occ:g}),this.trimRequests(),!0}browser(e,t,r){let i=M(t.message)??e.title,u=M(r.url)??M(r.route),n=`browser:${M(t.kind)}:${qt(i)}`;return this.record(n,"browser",e,{title:i.split(`
|
|
75
75
|
`)[0].slice(0,160),...u?{where:Xy(u)}:{},message:i,...M(t.stack)?{stack:en(M(t.stack))}:{}},M(r.requestId)),!0}external(e,t,r,i){let u=M(t.project)??M(r.projectName),n=M(t.host)??"?",a=M(t.method)??"GET",l=M(t.path)??"",d=M(t.error),c=i?String(i):d??"failed",p=`external:${u??"?"}:${n}:${a} ${xu(l)}:${i??qt(d)}`;return this.record(p,"external",e,{title:`${a} ${n}${xu(l)} \u2192 ${c}`,where:`${u??"?"} \u2192 ${n}`,...u?{project:u}:{},...d?{message:d}:{},...i?{status:i}:{}},M(r.requestId),i),!0}queue(e,t,r){let i=M(t.queue)??"?",u=M(t.failedReason)??M(t.error)??e.message,n=M(t.project)??M(r.projectName),a=`queue:${i}:${M(t.name)??""}:${qt(u)}`;return this.record(a,"queue",e,{title:`Job ${M(t.name)??""} failed on ${i}`.replace(/\s+/g," "),where:n?`${n} \xB7 ${i}`:i,...n?{project:n}:{},...u?{message:u}:{},...M(t.stack)?{stack:en(M(t.stack))}:{}},M(r.requestId)),!0}defer(e,t){return this.pending.push({event:e,kind:t,arrivedAt:this.now()}),this.pending.length>2e3&&this.pending.splice(0,this.pending.length-2e3),!1}settle(e){let t=e.event,r=be(t.raw),i=be(t.context),u=M(i.requestId),n=u?this.byRequest.get(u):void 0;if(n){e.kind==="span"&&!n.occ.stepId&&(n.occ.stepId=t.id),!n.occ.flowId&&M(i.flowId)&&(n.occ.flowId=M(i.flowId)),this.changed=!0;return}if(e.kind==="log"){let E=M(r.project)??M(i.projectName);if([...this.groups.values()].some(A=>A.kind==="server"&&(A.project===E||!A.project)&&Math.abs(A.lastSeenAt-t.timestamp)<3e3))return;let b=be(be(r.request).error),$=Np(M(b.message)??t.title);this.record(`log:${E??"?"}:${qt($)}`,"log",t,{title:$.split(`
|
|
76
76
|
`)[0].slice(0,160),...E?{where:E,project:E}:{},message:$,...M(b.stack)?{stack:en(Np(M(b.stack)))}:{}},u);return}if(e.kind==="span"){let E=be(r.span),b=M(E.name)??t.title.replace(/\s*\(\d+ms\)\s*✗?$/,""),$=M(i.projectName)??(u?this.projectOfRequest.get(u):void 0),A=M(t.message)??M(be(E.error).message),_=this.record(`exception:${$??"?"}:${b}:${qt(A)}`,"exception",t,{title:`${b} threw${A?`: ${A.split(`
|
|
77
77
|
`)[0].slice(0,100)}`:""}`,...$?{where:$,project:$}:{},...A?{message:A}:{}},u);u&&this.byRequest.set(u,{group:[...this.groups.values()].find(j=>j.occurrences.includes(_)),occ:_});return}let a=ve(r.status),l=M(r.method)??"GET",d=M(r.url)??"?",c=M(r.project),p=M(r.host),h=e.kind==="fetch"&&!a?"network error":String(a??"failed"),m=e.kind==="gateway"?`${l} ${p??""}${xu(d)} \u2192 ${h}`:`${l} ${xu(d)} \u2192 ${h}`,f=`request:${e.kind}:${c??p??""}:${l} ${xu(d)}:${h}`,g=this.record(f,"request",t,{title:m,where:e.kind==="gateway"?`gateway \u2192 ${c??p??"?"}`:"browser",...c?{project:c}:{},...a!==void 0?{status:a}:{},...e.kind==="gateway"?{message:Yy(r,a)}:{}},u,a);u&&this.byRequest.set(u,{group:this.groups.get(f),occ:g})}record(e,t,r,i,u,n){let a=be(r.context),l=M(a.flowId),d=this.groups.get(e);d||(d={id:e,kind:t,...i,count:0,firstSeenAt:r.timestamp,lastSeenAt:r.timestamp,occurrences:[],flows:new Set,perMinute:new Map,eventIds:[]},this.groups.set(e,d),this.evict()),d.count+=1,d.eventIds.push(r.id),d.eventIds.length>200&&d.eventIds.shift(),d.firstSeenAt=Math.min(d.firstSeenAt,r.timestamp),r.timestamp>=d.lastSeenAt&&(d.lastSeenAt=r.timestamp,i.stack&&(d.stack=i.stack),i.message&&(d.message=i.message)),l&&d.flows.add(l);let c=Math.floor(r.timestamp/6e4);d.perMinute.set(c,(d.perMinute.get(c)??0)+1);for(let h of d.perMinute.keys())h<c-Hy&&d.perMinute.delete(h);let p={id:r.id,at:r.timestamp,...l?{flowId:l}:{},...u?{requestId:u}:{},...n!==void 0?{status:n}:{}};return d.occurrences.unshift(p),d.occurrences.sort((h,m)=>m.at-h.at),d.occurrences.length>Ky&&(d.occurrences.length=Ky),this.changed=!0,p}evict(){if(this.groups.size<=g7)return;let e=[...this.groups.values()].sort((t,r)=>t.lastSeenAt-r.lastSeenAt)[0];e&&this.groups.delete(e.id)}trimRequests(){this.byRequest.size>5e3&&this.byRequest.delete(this.byRequest.keys().next().value)}};function jp(e,t,r){if(t==="crash-looping")return{kind:"service",title:`${e} keeps crashing`,serving:!1};if(t==="wedged")return{kind:"service",title:`${e} is not answering`,serving:!1};let i=r.length>0&&r.every(n=>n.fault==="process"),u=t==="up";return{kind:u?i?"log":"build":"service",title:i?`${e} reported a process error`:`${e} failed to build`,serving:u}}s(jp,"Oy"),o(jp,"describeServiceFault");function zp(e,t=Date.now()){let r=[],i=o((c,p=!0)=>({...c,count:c.count??1,firstSeenAt:c.at??t,lastSeenAt:c.at??t,occurrences:[],flowCount:0,spark:[],...p?{ongoing:!0}:{}}),"base"),u=o(c=>{let p=new Map;for(let h of Ns(be(e[c]).errors))p.set(M(h.project)??"workspace",[...p.get(M(h.project)??"workspace")??[],h]);return p},"grouped"),n=u("typecheck://errors"),a=u("lint://errors");for(let c of Ns(be(e["build://failures"]).failures)){let p=c.domain==="typecheck"||c.domain==="lint"?c.domain:"build",h=M(c.project)??"workspace";p==="typecheck"&&n.has(h)||p==="lint"&&a.has(h)||r.push(i({id:`build:${M(c.fingerprint)??M(c.message)??"?"}`,kind:p,title:`${p==="typecheck"?"Type error":p==="lint"?"Lint error":"Build error"}${M(c.project)?` in ${M(c.project)}`:""}`,...M(c.file)?{where:M(c.file)}:{},...M(c.project)?{project:M(c.project)}:{},...M(c.message)?{message:M(c.message)}:{},resource:"build://failures",...ve(c.timestamp)!==void 0?{at:ve(c.timestamp)}:{}}))}for(let[c,p]of n){let h=p[0];r.push(i({id:`typecheck:${c}`,kind:"typecheck",title:`${p.length} type error${p.length===1?"":"s"} in ${c}`,where:[M(h.file),ve(h.line)].filter(m=>m!==void 0).join(":")||c,project:c,message:p.slice(0,5).map(m=>`${M(m.file)??""}${ve(m.line)!==void 0?`:${ve(m.line)}`:""} ${M(m.code)??""} ${M(m.message)??""}`.trim()).join(`
|
package/lib/agent-plugins.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
`).filter(Boolean).pop();return{...a,outcome:"failed",detail:f&&f.length>0?f:`\`${
|
|
1
|
+
"use strict";var k=Object.defineProperty;var l=(t,e)=>k(t,"name",{value:e,configurable:!0});var y=Object.defineProperty,c=l((t,e)=>y(t,"name",{value:e,configurable:!0}),"d");import{spawnSync as j}from"node:child_process";import{existsSync as m,readFileSync as v}from"node:fs";import{dirname as A,isAbsolute as P,join as d,resolve as x}from"node:path";export const MARKETPLACE="lensmcp-marketplace",PLUGIN="lensmcp",PLUGIN_ID=`${PLUGIN}@${MARKETPLACE}`,AGENTS=[{id:"claude",label:"Claude Code",bin:"claude",manifest:".claude-plugin/marketplace.json",pluginManifest:"plugin/.claude-plugin/plugin.json",since:"1.9.0",restartHint:"restart Claude Code (or run /plugin) for the new version to load"},{id:"codex",label:"Codex",bin:"codex",manifest:".agents/plugins/marketplace.json",pluginManifest:"plugins/lensmcp/.codex-plugin/plugin.json",since:"1.20.0",restartHint:"start a new Codex thread for the plugin to load"}];export function agentById(t){return AGENTS.find(e=>e.id===t)}l(agentById,"agentById"),c(agentById,"agentById");export function resolvePluginRoot(t){const e=t.exists??m,o=c(r=>{try{const s=JSON.parse(v(d(r,"package.json"),"utf8"));return typeof s.version=="string"?s.version:void 0}catch{return}},"readVersion"),i=c((r,s)=>{const a=o(r);return{root:r,source:s,...a?{version:a}:{}}},"decorate");if(t.from){const r=P(t.from)?t.from:x(t.cwd,t.from);return e(d(r,"package.json"))?i(r,"flag"):void 0}let n=x(t.cwd);for(let r=0;r<8;r++){const s=d(n,"node_modules","lensmcp");if(e(d(s,"package.json")))return i(s,"workspace");const a=A(n);if(a===n)break;n=a}if(t.selfRoot&&e(d(t.selfRoot,"package.json")))return i(t.selfRoot,"self")}l(resolvePluginRoot,"resolvePluginRoot"),c(resolvePluginRoot,"resolvePluginRoot");export function readPluginManifestVersion(t,e){try{const o=JSON.parse(v(d(t,e.pluginManifest),"utf8"));return typeof o.version=="string"?o.version:void 0}catch{return}}l(readPluginManifestVersion,"readPluginManifestVersion"),c(readPluginManifestVersion,"readPluginManifestVersion");export function planAgentInstall(t,e){if(t.id==="codex")return[[t.bin,"plugin","marketplace","add",e.root],[t.bin,"plugin","add",PLUGIN_ID]];const o=e.scope?["--scope",e.scope]:[];return[[t.bin,"plugin","marketplace","add",e.root],[t.bin,"plugin","marketplace","update",MARKETPLACE],[t.bin,"plugin","install",PLUGIN_ID,...o,"--yes"]]}l(planAgentInstall,"planAgentInstall"),c(planAgentInstall,"planAgentInstall");export function installAgentPlugin(t,e,o){const i=o.exists??m,n=planAgentInstall(t,e),r=n.map(p=>p.join(" ")),s=readPluginManifestVersion(e.root,t),a={agent:t.id,label:t.label,commands:r,...s?{version:s}:{}};if(!i(d(e.root,t.manifest)))return{...a,outcome:"skipped-not-packaged",detail:`${e.root} ships no ${t.manifest} \u2014 the ${t.label} plugin arrived in lensmcp ${t.since}. Upgrade first: \`lensmcp upgrade\`.`};for(const p of n){const[g,...b]=p,u=g===void 0?void 0:o.run(g,b);if(!u)return{...a,outcome:"skipped-no-cli",detail:`\`${t.bin}\` is not on PATH`};if(u.code!==0){const f=(u.stderr??u.stdout??"").trim().split(`
|
|
2
|
+
`).filter(Boolean).pop();return{...a,outcome:"failed",detail:f&&f.length>0?f:`\`${p.join(" ")}\` exited ${u.code}`}}}return{...a,outcome:"installed",restartHint:t.restartHint}}l(installAgentPlugin,"installAgentPlugin"),c(installAgentPlugin,"installAgentPlugin");export function spawnAgentRunner(t,e=12e4){return(o,i)=>{try{const n=j(o,i,{encoding:"utf8",timeout:e,env:t,stdio:["ignore","pipe","pipe"]});return n.error&&n.error.code==="ENOENT"?void 0:{code:n.status??1,...n.stdout?{stdout:n.stdout}:{},...n.stderr?{stderr:n.stderr}:{}}}catch{return}}}l(spawnAgentRunner,"spawnAgentRunner"),c(spawnAgentRunner,"spawnAgentRunner");export function codexInstalledVersion(t){const e=t("codex",["plugin","list","--json"]);if(!(!e||e.code!==0||!e.stdout))try{const o=(JSON.parse(e.stdout).installed??[]).find(i=>i.pluginId===PLUGIN_ID||i.name===PLUGIN&&i.marketplaceName===MARKETPLACE)?.version;return typeof o=="string"?o:void 0}catch{return}}l(codexInstalledVersion,"codexInstalledVersion"),c(codexInstalledVersion,"codexInstalledVersion");
|
package/lib/cli-help.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
`);let
|
|
3
|
-
`).replace(/\s+$/,"")}
|
|
1
|
+
"use strict";var g=Object.defineProperty;var o=(t,e)=>g(t,"name",{value:e,configurable:!0});var h=Object.defineProperty,r=o((t,e)=>h(t,"name",{value:e,configurable:!0}),"r");const k=new Set(["rollout"]);export function wantsHelp(t,e){const u=e!==void 0&&k.has(e);for(const n of t){if(u&&n==="--")break;if(n==="--help"||n==="-h")return!0}return!1}o(wantsHelp,"wantsHelp"),r(wantsHelp,"wantsHelp");const d={plugins:"plugin"};function f(t){return/^ {2}\S/.test(t)}o(f,"l"),r(f,"opensBlock");export function commandUsage(t,e){const u=d[e]??e,n=t.split(`
|
|
2
|
+
`);let i=-1;for(let s=0;s<n.length;s++){if(!f(n[s]))continue;const l=n[s].slice(2);if(l===u||l.startsWith(`${u} `)){i=s;break}}if(i===-1)return;let c=i+1;for(;c<n.length&&!f(n[c]);)c++;return["Usage:",...n.slice(i,c)].join(`
|
|
3
|
+
`).replace(/\s+$/,"")}o(commandUsage,"commandUsage"),r(commandUsage,"commandUsage");export function ignoreEpipe(t){t.on("error",e=>{if(e?.code==="EPIPE"){p=!0;for(const u of a)try{u()}catch{}return}throw e})}o(ignoreEpipe,"ignoreEpipe"),r(ignoreEpipe,"ignoreEpipe");const a=new Set;export function onOutputBroken(t){if(p){t();return}a.add(t)}o(onOutputBroken,"onOutputBroken"),r(onOutputBroken,"onOutputBroken");let p=!1;export function isOutputBroken(){return p}o(isOutputBroken,"isOutputBroken"),r(isOutputBroken,"isOutputBroken");export function resetOutputBrokenForTests(){p=!1}o(resetOutputBrokenForTests,"resetOutputBrokenForTests"),r(resetOutputBrokenForTests,"resetOutputBrokenForTests");
|