@lensmcp/core 1.25.37 → 1.25.39

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.
@@ -1 +1 @@
1
- "use strict";var w=Object.defineProperty;var l=(d,t)=>w(d,"name",{value:t,configurable:!0});var I=Object.defineProperty,y=l((d,t)=>I(d,"name",{value:t,configurable:!0}),"l"),b=Object.defineProperty,m=y((d,t)=>b(d,"name",{value:t,configurable:!0}),"l");const B=4,M=1e3;export class GraphStore{static{l(this,"GraphStore")}static{y(this,"GraphStore")}static{m(this,"GraphStore")}constructor(){this.nodes=new Map,this.edges=new Map,this.byParent=new Map,this.byFlow=new Map,this.byLogical=new Map,this.byInstance=new Map,this.byRequest=new Map,this.outByAxis=new Map,this.inByAxis=new Map}addNode(t){this.nodes.set(t.id,t),t.parentTraceNodeId&&this.addToIndex(this.byParent,t.parentTraceNodeId,t.id),t.context.flowId&&this.addToIndex(this.byFlow,t.context.flowId,t.id),t.logicalId&&this.addToIndex(this.byLogical,t.logicalId,t.id),t.instanceId&&this.addToIndex(this.byInstance,t.instanceId,t.id),t.context.requestId&&this.addToIndex(this.byRequest,t.context.requestId,t.id)}updateNode(t,e){const i=this.nodes.get(t);if(!i)throw new Error(`Unknown node: ${t}`);const s={...i,...e,id:i.id};return this.nodes.set(t,s),s}getNode(t){return this.nodes.get(t)}addEdge(t){this.edges.set(t.id,t);let e=this.outByAxis.get(t.axis);e||(e=new Map,this.outByAxis.set(t.axis,e)),this.addToIndex(e,t.from,t.id);let i=this.inByAxis.get(t.axis);i||(i=new Map,this.inByAxis.set(t.axis,i)),this.addToIndex(i,t.to,t.id)}getEdge(t){return this.edges.get(t)}childrenOf(t){return this.materialiseNodes(this.byParent.get(t))}nodesInFlow(t){return this.materialiseNodes(this.byFlow.get(t))}nodesByLogical(t){return this.materialiseNodes(this.byLogical.get(t))}nodesByInstance(t){return this.materialiseNodes(this.byInstance.get(t))}nodesByRequest(t){return this.materialiseNodes(this.byRequest.get(t))}traverse(t){const e=this.nodes.get(t.from);if(!e)return{nodes:[],edges:[]};const i=Array.isArray(t.lens)?t.lens:[t.lens],s=t.direction??"both",x=t.depth??4,p=t.maxNodes??1e3,o=new Set,g=new Set,c=[{id:e.id,d:0}];for(;c.length&&!(o.size>=p);){const{id:n,d:u}=c.shift();if(!o.has(n)&&(o.add(n),!(u>=x)))for(const f of i){if(s==="out"||s==="both"){const a=this.outByAxis.get(f)?.get(n);if(a)for(const r of a){g.add(r);const h=this.edges.get(r);o.has(h.to)||c.push({id:h.to,d:u+1})}}if(s==="in"||s==="both"){const a=this.inByAxis.get(f)?.get(n);if(a)for(const r of a){g.add(r);const h=this.edges.get(r);o.has(h.from)||c.push({id:h.from,d:u+1})}}}}return{nodes:this.materialiseNodes(o),edges:[...g].map(n=>this.edges.get(n)).filter(n=>!!n)}}nodeCount(){return this.nodes.size}edgeCount(){return this.edges.size}addToIndex(t,e,i){let s=t.get(e);s||(s=new Set,t.set(e,s)),s.add(i)}materialiseNodes(t){if(!t)return[];const e=[];for(const i of t){const s=this.nodes.get(i);s&&e.push(s)}return e}}
1
+ "use strict";var w=Object.defineProperty;var l=(h,e)=>w(h,"name",{value:e,configurable:!0});var p=Object.defineProperty,I=l((h,e)=>p(h,"name",{value:e,configurable:!0}),"l");const m=4,N=1e3;export class GraphStore{static{l(this,"GraphStore")}static{I(this,"GraphStore")}constructor(){this.nodes=new Map,this.edges=new Map,this.byParent=new Map,this.byFlow=new Map,this.byLogical=new Map,this.byInstance=new Map,this.byRequest=new Map,this.outByAxis=new Map,this.inByAxis=new Map}addNode(e){this.nodes.set(e.id,e),e.parentTraceNodeId&&this.addToIndex(this.byParent,e.parentTraceNodeId,e.id),e.context.flowId&&this.addToIndex(this.byFlow,e.context.flowId,e.id),e.logicalId&&this.addToIndex(this.byLogical,e.logicalId,e.id),e.instanceId&&this.addToIndex(this.byInstance,e.instanceId,e.id),e.context.requestId&&this.addToIndex(this.byRequest,e.context.requestId,e.id)}updateNode(e,s){const i=this.nodes.get(e);if(!i)throw new Error(`Unknown node: ${e}`);const t={...i,...s,id:i.id};return this.nodes.set(e,t),t}getNode(e){return this.nodes.get(e)}addEdge(e){this.edges.set(e.id,e);let s=this.outByAxis.get(e.axis);s||(s=new Map,this.outByAxis.set(e.axis,s)),this.addToIndex(s,e.from,e.id);let i=this.inByAxis.get(e.axis);i||(i=new Map,this.inByAxis.set(e.axis,i)),this.addToIndex(i,e.to,e.id)}getEdge(e){return this.edges.get(e)}childrenOf(e){return this.materialiseNodes(this.byParent.get(e))}nodesInFlow(e){return this.materialiseNodes(this.byFlow.get(e))}nodesByLogical(e){return this.materialiseNodes(this.byLogical.get(e))}nodesByInstance(e){return this.materialiseNodes(this.byInstance.get(e))}nodesByRequest(e){return this.materialiseNodes(this.byRequest.get(e))}traverse(e){const s=this.nodes.get(e.from);if(!s)return{nodes:[],edges:[]};const i=Array.isArray(e.lens)?e.lens:[e.lens],t=e.direction??"both",f=e.depth??4,x=e.maxNodes??1e3,n=new Set,g=new Set,c=[{id:s.id,d:0}];for(;c.length&&!(n.size>=x);){const{id:d,d:u}=c.shift();if(!n.has(d)&&(n.add(d),!(u>=f)))for(const y of i){if(t==="out"||t==="both"){const o=this.outByAxis.get(y)?.get(d);if(o)for(const a of o){g.add(a);const r=this.edges.get(a);n.has(r.to)||c.push({id:r.to,d:u+1})}}if(t==="in"||t==="both"){const o=this.inByAxis.get(y)?.get(d);if(o)for(const a of o){g.add(a);const r=this.edges.get(a);n.has(r.from)||c.push({id:r.from,d:u+1})}}}}return{nodes:this.materialiseNodes(n),edges:[...g].map(d=>this.edges.get(d)).filter(d=>!!d)}}nodeCount(){return this.nodes.size}edgeCount(){return this.edges.size}addToIndex(e,s,i){let t=e.get(s);t||(t=new Set,e.set(s,t)),t.add(i)}materialiseNodes(e){if(!e)return[];const s=[];for(const i of e){const t=this.nodes.get(i);t&&s.push(t)}return s}}
@@ -1 +1 @@
1
- "use strict";var l=Object.defineProperty;var t=(e,s)=>l(e,"name",{value:s,configurable:!0});var r=Object.defineProperty,o=t((e,s)=>r(e,"name",{value:s,configurable:!0}),"s"),n=Object.defineProperty,a=o((e,s)=>n(e,"name",{value:s,configurable:!0}),"t");export const HEADLESS_FLOWS_ENV="LENSMCP_HEADLESS_FLOWS";export function headlessFlowsEnabled(e=process.env){return!["0","false","off","no"].includes((e[HEADLESS_FLOWS_ENV]??"").trim().toLowerCase())}t(headlessFlowsEnabled,"headlessFlowsEnabled"),o(headlessFlowsEnabled,"headlessFlowsEnabled"),a(headlessFlowsEnabled,"headlessFlowsEnabled");export const HEADLESS_REQUEST_FLOW_PREFIX="api:",HEADLESS_JOB_FLOW_PREFIX="job:";export function headlessFlowId(e){return`${HEADLESS_REQUEST_FLOW_PREFIX}${e}`}t(headlessFlowId,"headlessFlowId"),o(headlessFlowId,"headlessFlowId"),a(headlessFlowId,"headlessFlowId");export function headlessJobFlowId(e,s){return`${HEADLESS_JOB_FLOW_PREFIX}${e}#${s??"?"}`}t(headlessJobFlowId,"headlessJobFlowId"),o(headlessJobFlowId,"headlessJobFlowId"),a(headlessJobFlowId,"headlessJobFlowId");export function isHeadlessFlowId(e){return e.startsWith(HEADLESS_REQUEST_FLOW_PREFIX)||e.startsWith(HEADLESS_JOB_FLOW_PREFIX)}t(isHeadlessFlowId,"isHeadlessFlowId"),o(isHeadlessFlowId,"isHeadlessFlowId"),a(isHeadlessFlowId,"isHeadlessFlowId");const i=/^\/(?:[^/?#]+\/)*(?:health|healthz|health-check|healthcheck|ready|readyz|readiness|live|livez|liveness|ping|metrics|favicon\.ico)\/?(?:[?#].*)?$/i;export function isProbePath(e){return e?i.test(e)||e.startsWith("/__lensmcp/"):!1}t(isProbePath,"isProbePath"),o(isProbePath,"isProbePath"),a(isProbePath,"isProbePath");
1
+ "use strict";var r=Object.defineProperty;var s=(e,t)=>r(e,"name",{value:t,configurable:!0});var a=Object.defineProperty,o=s((e,t)=>a(e,"name",{value:t,configurable:!0}),"t");export const HEADLESS_FLOWS_ENV="LENSMCP_HEADLESS_FLOWS";export function headlessFlowsEnabled(e=process.env){return!["0","false","off","no"].includes((e[HEADLESS_FLOWS_ENV]??"").trim().toLowerCase())}s(headlessFlowsEnabled,"headlessFlowsEnabled"),o(headlessFlowsEnabled,"headlessFlowsEnabled");export const HEADLESS_REQUEST_FLOW_PREFIX="api:",HEADLESS_JOB_FLOW_PREFIX="job:";export function headlessFlowId(e){return`${HEADLESS_REQUEST_FLOW_PREFIX}${e}`}s(headlessFlowId,"headlessFlowId"),o(headlessFlowId,"headlessFlowId");export function headlessJobFlowId(e,t){return`${HEADLESS_JOB_FLOW_PREFIX}${e}#${t??"?"}`}s(headlessJobFlowId,"headlessJobFlowId"),o(headlessJobFlowId,"headlessJobFlowId");export function isHeadlessFlowId(e){return e.startsWith(HEADLESS_REQUEST_FLOW_PREFIX)||e.startsWith(HEADLESS_JOB_FLOW_PREFIX)}s(isHeadlessFlowId,"isHeadlessFlowId"),o(isHeadlessFlowId,"isHeadlessFlowId");const n=/^\/(?:[^/?#]+\/)*(?:health|healthz|health-check|healthcheck|ready|readyz|readiness|live|livez|liveness|ping|metrics|favicon\.ico)\/?(?:[?#].*)?$/i;export function isProbePath(e){return e?n.test(e)||e.startsWith("/__lensmcp/"):!1}s(isProbePath,"isProbePath"),o(isProbePath,"isProbePath");
@@ -1 +1 @@
1
- "use strict";var s=Object.defineProperty;var r=(t,e)=>s(t,"name",{value:e,configurable:!0});var h=Object.defineProperty,a=r((t,e)=>h(t,"name",{value:e,configurable:!0}),"n"),p=Object.defineProperty,c=a((t,e)=>p(t,"name",{value:e,configurable:!0}),"n");import*as l from"node:fs";import{dirname as x,join as o}from"node:path";export{isServiceHopHost,LENS_REQUEST_ID_HEADER}from"./service-hop.js";export const HTTP_EXCHANGE_DIR="http",HTTP_EXCHANGE_PLACES=["calls","ai","in","hops"];export function exchangePlace(t){return t.side==="ingress"?"in":t.ai?"ai":/(^|\.)localhost$/i.test(t.host)?"hops":"calls"}r(exchangePlace,"exchangePlace"),a(exchangePlace,"exchangePlace"),c(exchangePlace,"exchangePlace");const E=/^hx_[0-9a-z]{8,40}$/;export const isHttpExchangeId=c(t=>typeof t=="string"&&E.test(t),"isHttpExchangeId");export function httpExchangeDir(t,e="calls"){const n=o(x(t),HTTP_EXCHANGE_DIR);return e==="calls"?n:o(n,e)}r(httpExchangeDir,"httpExchangeDir"),a(httpExchangeDir,"httpExchangeDir"),c(httpExchangeDir,"httpExchangeDir");export function httpExchangeFile(t,e,n="calls"){if(!isHttpExchangeId(e))throw new Error("invalid http exchange id");return o(httpExchangeDir(t,n),`${e}.json`)}r(httpExchangeFile,"httpExchangeFile"),a(httpExchangeFile,"httpExchangeFile"),c(httpExchangeFile,"httpExchangeFile");export function readHttpExchange(t,e){if(isHttpExchangeId(e))for(const n of HTTP_EXCHANGE_PLACES)try{const i=JSON.parse(l.readFileSync(httpExchangeFile(t,e,n),"utf8"));if(i&&i.schemaVersion===1&&i.id===e)return i}catch{}}r(readHttpExchange,"readHttpExchange"),a(readHttpExchange,"readHttpExchange"),c(readHttpExchange,"readHttpExchange");
1
+ "use strict";var i=Object.defineProperty;var n=(t,e)=>i(t,"name",{value:e,configurable:!0});var s=Object.defineProperty,a=n((t,e)=>s(t,"name",{value:e,configurable:!0}),"n");import*as p from"node:fs";import{dirname as h,join as c}from"node:path";export{isServiceHopHost,LENS_REQUEST_ID_HEADER}from"./service-hop.js";export const HTTP_EXCHANGE_DIR="http",HTTP_EXCHANGE_PLACES=["calls","ai","in","hops"];export function exchangePlace(t){return t.side==="ingress"?"in":t.ai?"ai":/(^|\.)localhost$/i.test(t.host)?"hops":"calls"}n(exchangePlace,"exchangePlace"),a(exchangePlace,"exchangePlace");const l=/^hx_[0-9a-z]{8,40}$/;export const isHttpExchangeId=a(t=>typeof t=="string"&&l.test(t),"isHttpExchangeId");export function httpExchangeDir(t,e="calls"){const r=c(h(t),HTTP_EXCHANGE_DIR);return e==="calls"?r:c(r,e)}n(httpExchangeDir,"httpExchangeDir"),a(httpExchangeDir,"httpExchangeDir");export function httpExchangeFile(t,e,r="calls"){if(!isHttpExchangeId(e))throw new Error("invalid http exchange id");return c(httpExchangeDir(t,r),`${e}.json`)}n(httpExchangeFile,"httpExchangeFile"),a(httpExchangeFile,"httpExchangeFile");export function readHttpExchange(t,e){if(isHttpExchangeId(e))for(const r of HTTP_EXCHANGE_PLACES)try{const o=JSON.parse(p.readFileSync(httpExchangeFile(t,e,r),"utf8"));if(o&&o.schemaVersion===1&&o.id===e)return o}catch{}}n(readHttpExchange,"readHttpExchange"),a(readHttpExchange,"readHttpExchange");
package/lib/http-shape.js CHANGED
@@ -1 +1 @@
1
- "use strict";var j=Object.defineProperty;var m=(t,n)=>j(t,"name",{value:n,configurable:!0});var k=Object.defineProperty,p=m((t,n)=>k(t,"name",{value:n,configurable:!0}),"m"),S=Object.defineProperty,l=p((t,n)=>S(t,"name",{value:n,configurable:!0}),"a");import{isSecretParam as M}from"./redact.js";const x=6,h=60,F=4,O=[["uuid",/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i],["ulid",/^[0-9A-HJKMNP-TV-Z]{26}$/],["date-time",/^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}(:\d{2}(\.\d+)?)?(Z|[+-]\d{2}:?\d{2})?$/],["date",/^\d{4}-\d{2}-\d{2}$/],["email",/^[^\s@]+@[^\s@]+\.[^\s@]+$/],["url",/^https?:\/\/\S+$/i],["jwt",/^eyJ[\w-]{8,}\.[\w-]{8,}\.[\w-]{8,}$/],["int",/^-?\d{1,30}$/],["decimal",/^-?\d+\.\d+$/],["phone",/^\+\d{7,15}$/],["hex",/^[0-9a-f]{16,}$/i],["base64",/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[A-Za-z0-9+/]{32,}={0,2}$/]];export function stringFormat(t){for(const[n,e]of O)if(e.test(t))return n}m(stringFormat,"stringFormat"),p(stringFormat,"stringFormat"),l(stringFormat,"stringFormat");const $=l(t=>t.length>64||/\s/.test(t)||stringFormat(t)!==void 0&&!/^[a-z]/i.test(t)||/@/.test(t)||/^[0-9a-f]{8}-/i.test(t),"dataKey");export function shapeOf(t,n=0,e=!1){if(t==null)return{t:"null"};if(typeof t=="boolean")return{t:"bool"};if(typeof t=="number")return Number.isInteger(t)?{t:"num",int:!0}:{t:"num"};if(typeof t=="bigint")return{t:"num",int:!0};if(typeof t=="string"){const r=stringFormat(t);return{t:"str",...r?{f:r}:{},...e?{}:{max:t.length}}}if(t instanceof Date)return{t:"str",f:"date-time"};if(n>=x)return Array.isArray(t)?{t:"arr",n:[t.length,t.length]}:{t:"obj",fields:[]};if(Array.isArray(t)){const r=t.slice(0,20).map(a=>shapeOf(a,n+1,e)).reduce((a,i)=>a?mergeShapes(a,i):i,void 0);return{t:"arr",n:[t.length,t.length],...r?{of:r}:{}}}if(typeof t=="object"){const r=Object.entries(t).filter(([,a])=>typeof a!="function");if(r.length&&r.some(([a])=>$(a))){const a=r.slice(0,20).map(([,s])=>shapeOf(s,n+1,e)).reduce((s,c)=>s?mergeShapes(s,c):c,void 0),i=r.map(([s])=>stringFormat(s)).find(Boolean);return{t:"map",n:[r.length,r.length],...i?{key:i}:{},...a?{of:a}:{}}}return{t:"obj",fields:r.slice(0,h).map(([a,i])=>{const s=M(a);return{...shapeOf(i,n+1,e||s),name:a,...s?{cred:!0}:{}}}),...r.length>h?{more:r.length-h}:{}}}return{t:"null"}}m(shapeOf,"shapeOf"),p(shapeOf,"shapeOf"),l(shapeOf,"shapeOf");const v=l((t,n)=>t.t===n.t,"same"),N=new Set(["null","bool","num","str","arr","obj","map","any"]);export function isShape(t,n=0){if(!t||typeof t!="object"||n>x*2)return!1;const e=t;return typeof e.t!="string"||!N.has(e.t)?!1:e.t==="obj"?Array.isArray(e.fields)&&e.fields.every(r=>typeof r?.name=="string"&&isShape(r,n+1)):e.t==="any"?Array.isArray(e.of)&&e.of.every(r=>isShape(r,n+1)):e.t==="arr"||e.t==="map"?Array.isArray(e.n)&&(e.of===void 0||isShape(e.of,n+1)):!0}m(isShape,"isShape"),p(isShape,"isShape"),l(isShape,"isShape");export function fieldShape(t){const n={...t};return delete n.name,delete n.opt,delete n.cred,n}m(fieldShape,"fieldShape"),p(fieldShape,"fieldShape"),l(fieldShape,"fieldShape");export function mergeShapes(t,n){if(t.t==="any"||n.t==="any"){const e=[...t.t==="any"?t.of:[t],...n.t==="any"?n.of:[n]],r=[];for(const a of e){const i=r.findIndex(s=>v(s,a));i>=0?r[i]=mergeShapes(r[i],a):r.push(a)}return r.length===1?r[0]:{t:"any",of:r.slice(0,F)}}if(!v(t,n))return{t:"any",of:[t,n]};switch(t.t){case"num":return t.int&&n.int?t:{t:"num"};case"str":{const e=n,r=t.f===e.f?t.f:void 0;return{t:"str",...r?{f:r}:{},...t.max!==void 0||e.max!==void 0?{max:Math.max(t.max??0,e.max??0)}:{}}}case"arr":{const e=n,r=t.of&&e.of?mergeShapes(t.of,e.of):t.of??e.of;return{t:"arr",n:[Math.min(t.n[0],e.n[0]),Math.max(t.n[1],e.n[1])],...r?{of:r}:{}}}case"map":{const e=n,r=t.of&&e.of?mergeShapes(t.of,e.of):t.of??e.of;return{t:"map",n:[Math.min(t.n[0],e.n[0]),Math.max(t.n[1],e.n[1])],...t.key===e.key&&t.key?{key:t.key}:{},...r?{of:r}:{}}}case"obj":{const e=n,r=new Map(t.fields.map(c=>[c.name,c])),a=new Map(e.fields.map(c=>[c.name,c])),i=[...new Set([...r.keys(),...a.keys()])].slice(0,h).map(c=>{const f=r.get(c),u=a.get(c);return{...f&&u?mergeShapes(fieldShape(f),fieldShape(u)):fieldShape(f??u),name:c,...!f||!u||f.opt||u.opt?{opt:!0}:{},...f?.cred||u?.cred?{cred:!0}:{}}}),s=Math.max(t.more??0,e.more??0);return{t:"obj",fields:i,...s?{more:s}:{}}}default:return t}}m(mergeShapes,"mergeShapes"),p(mergeShapes,"mergeShapes"),l(mergeShapes,"mergeShapes");export function shapeText(t,n=0){switch(t.t){case"null":return"null";case"bool":return"boolean";case"num":return t.int?"int":"number";case"str":return t.f?`string(${t.f})`:"string";case"arr":return`[${t.n[0]===t.n[1]?t.n[0]:`${t.n[0]}..${t.n[1]}`}]${t.of?` ${shapeText(t.of,n+1)}`:""}`;case"map":return`map<${t.key??"string"}, ${t.of?shapeText(t.of,n+1):"?"}> (${t.n[0]===t.n[1]?t.n[0]:`${t.n[0]}..${t.n[1]}`} entries)`;case"any":return t.of.map(e=>shapeText(e,n)).join(" | ");case"obj":return`{ ${t.fields.map(e=>`${e.name}${e.opt?"?":""}${e.cred?" (credential-named)":""}: ${shapeText(fieldShape(e),n+1)}`).join(", ")}${t.more?`, \u2026 ${t.more} more`:""} }`}}m(shapeText,"shapeText"),p(shapeText,"shapeText"),l(shapeText,"shapeText");const o=l((t,n)=>{const e=t[n]??t[n.toLowerCase()];return e===void 0?void 0:Array.isArray(e)?e.join(", "):String(e)},"h"),y=l(t=>t?.split(";")[0]?.trim().toLowerCase()||void 0,"media");export function requestFacts(t,n,e){const r=o(t,"authorization")?.split(/\s+/)[0],a=o(t,"cookie"),i=Number(o(t,"content-length")),s=n?Object.keys(n).filter(f=>!$(f)).slice(0,30):[],c=e?Object.keys(e).slice(0,10):[];return{...y(o(t,"content-type"))?{contentType:y(o(t,"content-type"))}:{},...o(t,"accept")?{accept:o(t,"accept").slice(0,80)}:{},...r?{scheme:/^[A-Za-z][\w-]{1,20}$/.test(r)?r:"other"}:{},...a?{cookies:a.split(";").filter(f=>f.includes("=")).length}:{},...o(t,"if-match")?{ifMatch:!0}:{},...o(t,"if-none-match")?{ifNoneMatch:!0}:{},...o(t,"idempotency-key")?{idempotencyKey:!0}:{},...o(t,"origin")?{origin:!0}:{},...Number.isFinite(i)&&i>0?{bytes:i}:{},...s.length?{query:s}:{},...c.length?{params:c}:{}}}m(requestFacts,"requestFacts"),p(requestFacts,"requestFacts"),l(requestFacts,"requestFacts");export function responseFacts(t,n){const e=o(t,"etag"),r=Number(o(t,"content-length")),a=t["set-cookie"],i=(Array.isArray(a)?a:a!==void 0?[String(a)]:[]).slice(0,10).map(c=>{const[f="",...u]=c.split(";").map(g=>g.trim()),d=l(g=>u.find(A=>A.toLowerCase().startsWith(g)),"a"),w=d("samesite")?.split("=")[1],b=d("path=")?.slice(5);return{name:f.split("=")[0].slice(0,40),...d("secure")?{secure:!0}:{},...d("httponly")?{httpOnly:!0}:{},...w?{sameSite:w}:{},...d("domain=")?{domain:!0}:{},...b?{path:b}:{},...d("max-age=")?{maxAge:!0}:{},...d("expires=")?{expires:!0}:{}}}),s=o(t,"access-control-allow-origin");return{...y(o(t,"content-type"))?{contentType:y(o(t,"content-type"))}:{},...Number.isFinite(r)&&r>=0&&o(t,"content-length")!==void 0?{bytes:r}:{},...o(t,"cache-control")?{cacheControl:o(t,"cache-control").slice(0,120)}:{},...e?{etag:e.startsWith("W/")?"weak":"strong"}:{},...o(t,"last-modified")?{lastModified:!0}:{},...o(t,"location")?{location:!0}:{},...o(t,"vary")?{vary:o(t,"vary").slice(0,120)}:{},...o(t,"retry-after")?{retryAfter:!0}:{},...o(t,"www-authenticate")?{wwwAuthenticate:o(t,"www-authenticate").split(/\s+/)[0].slice(0,20)}:{},...o(t,"allow")?{allow:o(t,"allow").slice(0,80)}:{},...i.length?{cookies:i}:{},...s?{cors:{origin:s==="*"?"*":n&&s===n?"echoed":"fixed",...o(t,"access-control-allow-credentials")==="true"?{creds:!0}:{},...o(t,"access-control-allow-methods")?{methods:o(t,"access-control-allow-methods").slice(0,80)}:{},...o(t,"access-control-allow-headers")?{headers:o(t,"access-control-allow-headers").slice(0,120)}:{}}}:{},...o(t,"strict-transport-security")?{hsts:!0}:{},...o(t,"x-content-type-options")?{nosniff:!0}:{},...o(t,"x-powered-by")||o(t,"server")?{poweredBy:!0}:{},...o(t,"deprecation")?{deprecation:!0}:{},...o(t,"sunset")?{sunset:!0}:{},...o(t,"ratelimit")||o(t,"ratelimit-policy")||o(t,"x-ratelimit-limit")?{rateLimit:!0}:{},...o(t,"x-request-id")?{requestId:!0}:{}}}m(responseFacts,"responseFacts"),p(responseFacts,"responseFacts"),l(responseFacts,"responseFacts");
1
+ "use strict";var v=Object.defineProperty;var m=(e,r)=>v(e,"name",{value:r,configurable:!0});var k=Object.defineProperty,l=m((e,r)=>k(e,"name",{value:r,configurable:!0}),"a");import{isSecretParam as j}from"./redact.js";const b=6,d=60,S=4,M=[["uuid",/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i],["ulid",/^[0-9A-HJKMNP-TV-Z]{26}$/],["date-time",/^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}(:\d{2}(\.\d+)?)?(Z|[+-]\d{2}:?\d{2})?$/],["date",/^\d{4}-\d{2}-\d{2}$/],["email",/^[^\s@]+@[^\s@]+\.[^\s@]+$/],["url",/^https?:\/\/\S+$/i],["jwt",/^eyJ[\w-]{8,}\.[\w-]{8,}\.[\w-]{8,}$/],["int",/^-?\d{1,30}$/],["decimal",/^-?\d+\.\d+$/],["phone",/^\+\d{7,15}$/],["hex",/^[0-9a-f]{16,}$/i],["base64",/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[A-Za-z0-9+/]{32,}={0,2}$/]];export function stringFormat(e){for(const[r,n]of M)if(n.test(e))return r}m(stringFormat,"stringFormat"),l(stringFormat,"stringFormat");const x=l(e=>e.length>64||/\s/.test(e)||stringFormat(e)!==void 0&&!/^[a-z]/i.test(e)||/@/.test(e)||/^[0-9a-f]{8}-/i.test(e),"dataKey");export function shapeOf(e,r=0,n=!1){if(e==null)return{t:"null"};if(typeof e=="boolean")return{t:"bool"};if(typeof e=="number")return Number.isInteger(e)?{t:"num",int:!0}:{t:"num"};if(typeof e=="bigint")return{t:"num",int:!0};if(typeof e=="string"){const t=stringFormat(e);return{t:"str",...t?{f:t}:{},...n?{}:{max:e.length}}}if(e instanceof Date)return{t:"str",f:"date-time"};if(r>=b)return Array.isArray(e)?{t:"arr",n:[e.length,e.length]}:{t:"obj",fields:[]};if(Array.isArray(e)){const t=e.slice(0,20).map(o=>shapeOf(o,r+1,n)).reduce((o,i)=>o?mergeShapes(o,i):i,void 0);return{t:"arr",n:[e.length,e.length],...t?{of:t}:{}}}if(typeof e=="object"){const t=Object.entries(e).filter(([,o])=>typeof o!="function");if(t.length&&t.some(([o])=>x(o))){const o=t.slice(0,20).map(([,s])=>shapeOf(s,r+1,n)).reduce((s,c)=>s?mergeShapes(s,c):c,void 0),i=t.map(([s])=>stringFormat(s)).find(Boolean);return{t:"map",n:[t.length,t.length],...i?{key:i}:{},...o?{of:o}:{}}}return{t:"obj",fields:t.slice(0,d).map(([o,i])=>{const s=j(o);return{...shapeOf(i,r+1,n||s),name:o,...s?{cred:!0}:{}}}),...t.length>d?{more:t.length-d}:{}}}return{t:"null"}}m(shapeOf,"shapeOf"),l(shapeOf,"shapeOf");const $=l((e,r)=>e.t===r.t,"same"),F=new Set(["null","bool","num","str","arr","obj","map","any"]);export function isShape(e,r=0){if(!e||typeof e!="object"||r>b*2)return!1;const n=e;return typeof n.t!="string"||!F.has(n.t)?!1:n.t==="obj"?Array.isArray(n.fields)&&n.fields.every(t=>typeof t?.name=="string"&&isShape(t,r+1)):n.t==="any"?Array.isArray(n.of)&&n.of.every(t=>isShape(t,r+1)):n.t==="arr"||n.t==="map"?Array.isArray(n.n)&&(n.of===void 0||isShape(n.of,r+1)):!0}m(isShape,"isShape"),l(isShape,"isShape");export function fieldShape(e){const r={...e};return delete r.name,delete r.opt,delete r.cred,r}m(fieldShape,"fieldShape"),l(fieldShape,"fieldShape");export function mergeShapes(e,r){if(e.t==="any"||r.t==="any"){const n=[...e.t==="any"?e.of:[e],...r.t==="any"?r.of:[r]],t=[];for(const o of n){const i=t.findIndex(s=>$(s,o));i>=0?t[i]=mergeShapes(t[i],o):t.push(o)}return t.length===1?t[0]:{t:"any",of:t.slice(0,S)}}if(!$(e,r))return{t:"any",of:[e,r]};switch(e.t){case"num":return e.int&&r.int?e:{t:"num"};case"str":{const n=r,t=e.f===n.f?e.f:void 0;return{t:"str",...t?{f:t}:{},...e.max!==void 0||n.max!==void 0?{max:Math.max(e.max??0,n.max??0)}:{}}}case"arr":{const n=r,t=e.of&&n.of?mergeShapes(e.of,n.of):e.of??n.of;return{t:"arr",n:[Math.min(e.n[0],n.n[0]),Math.max(e.n[1],n.n[1])],...t?{of:t}:{}}}case"map":{const n=r,t=e.of&&n.of?mergeShapes(e.of,n.of):e.of??n.of;return{t:"map",n:[Math.min(e.n[0],n.n[0]),Math.max(e.n[1],n.n[1])],...e.key===n.key&&e.key?{key:e.key}:{},...t?{of:t}:{}}}case"obj":{const n=r,t=new Map(e.fields.map(c=>[c.name,c])),o=new Map(n.fields.map(c=>[c.name,c])),i=[...new Set([...t.keys(),...o.keys()])].slice(0,d).map(c=>{const f=t.get(c),u=o.get(c);return{...f&&u?mergeShapes(fieldShape(f),fieldShape(u)):fieldShape(f??u),name:c,...!f||!u||f.opt||u.opt?{opt:!0}:{},...f?.cred||u?.cred?{cred:!0}:{}}}),s=Math.max(e.more??0,n.more??0);return{t:"obj",fields:i,...s?{more:s}:{}}}default:return e}}m(mergeShapes,"mergeShapes"),l(mergeShapes,"mergeShapes");export function shapeText(e,r=0){switch(e.t){case"null":return"null";case"bool":return"boolean";case"num":return e.int?"int":"number";case"str":return e.f?`string(${e.f})`:"string";case"arr":return`[${e.n[0]===e.n[1]?e.n[0]:`${e.n[0]}..${e.n[1]}`}]${e.of?` ${shapeText(e.of,r+1)}`:""}`;case"map":return`map<${e.key??"string"}, ${e.of?shapeText(e.of,r+1):"?"}> (${e.n[0]===e.n[1]?e.n[0]:`${e.n[0]}..${e.n[1]}`} entries)`;case"any":return e.of.map(n=>shapeText(n,r)).join(" | ");case"obj":return`{ ${e.fields.map(n=>`${n.name}${n.opt?"?":""}${n.cred?" (credential-named)":""}: ${shapeText(fieldShape(n),r+1)}`).join(", ")}${e.more?`, \u2026 ${e.more} more`:""} }`}}m(shapeText,"shapeText"),l(shapeText,"shapeText");const a=l((e,r)=>{const n=e[r]??e[r.toLowerCase()];return n===void 0?void 0:Array.isArray(n)?n.join(", "):String(n)},"h"),y=l(e=>e?.split(";")[0]?.trim().toLowerCase()||void 0,"media");export function requestFacts(e,r,n){const t=a(e,"authorization")?.split(/\s+/)[0],o=a(e,"cookie"),i=Number(a(e,"content-length")),s=r?Object.keys(r).filter(f=>!x(f)).slice(0,30):[],c=n?Object.keys(n).slice(0,10):[];return{...y(a(e,"content-type"))?{contentType:y(a(e,"content-type"))}:{},...a(e,"accept")?{accept:a(e,"accept").slice(0,80)}:{},...t?{scheme:/^[A-Za-z][\w-]{1,20}$/.test(t)?t:"other"}:{},...o?{cookies:o.split(";").filter(f=>f.includes("=")).length}:{},...a(e,"if-match")?{ifMatch:!0}:{},...a(e,"if-none-match")?{ifNoneMatch:!0}:{},...a(e,"idempotency-key")?{idempotencyKey:!0}:{},...a(e,"origin")?{origin:!0}:{},...Number.isFinite(i)&&i>0?{bytes:i}:{},...s.length?{query:s}:{},...c.length?{params:c}:{}}}m(requestFacts,"requestFacts"),l(requestFacts,"requestFacts");export function responseFacts(e,r){const n=a(e,"etag"),t=Number(a(e,"content-length")),o=e["set-cookie"],i=(Array.isArray(o)?o:o!==void 0?[String(o)]:[]).slice(0,10).map(c=>{const[f="",...u]=c.split(";").map(h=>h.trim()),p=l(h=>u.find(A=>A.toLowerCase().startsWith(h)),"a"),g=p("samesite")?.split("=")[1],w=p("path=")?.slice(5);return{name:f.split("=")[0].slice(0,40),...p("secure")?{secure:!0}:{},...p("httponly")?{httpOnly:!0}:{},...g?{sameSite:g}:{},...p("domain=")?{domain:!0}:{},...w?{path:w}:{},...p("max-age=")?{maxAge:!0}:{},...p("expires=")?{expires:!0}:{}}}),s=a(e,"access-control-allow-origin");return{...y(a(e,"content-type"))?{contentType:y(a(e,"content-type"))}:{},...Number.isFinite(t)&&t>=0&&a(e,"content-length")!==void 0?{bytes:t}:{},...a(e,"cache-control")?{cacheControl:a(e,"cache-control").slice(0,120)}:{},...n?{etag:n.startsWith("W/")?"weak":"strong"}:{},...a(e,"last-modified")?{lastModified:!0}:{},...a(e,"location")?{location:!0}:{},...a(e,"vary")?{vary:a(e,"vary").slice(0,120)}:{},...a(e,"retry-after")?{retryAfter:!0}:{},...a(e,"www-authenticate")?{wwwAuthenticate:a(e,"www-authenticate").split(/\s+/)[0].slice(0,20)}:{},...a(e,"allow")?{allow:a(e,"allow").slice(0,80)}:{},...i.length?{cookies:i}:{},...s?{cors:{origin:s==="*"?"*":r&&s===r?"echoed":"fixed",...a(e,"access-control-allow-credentials")==="true"?{creds:!0}:{},...a(e,"access-control-allow-methods")?{methods:a(e,"access-control-allow-methods").slice(0,80)}:{},...a(e,"access-control-allow-headers")?{headers:a(e,"access-control-allow-headers").slice(0,120)}:{}}}:{},...a(e,"strict-transport-security")?{hsts:!0}:{},...a(e,"x-content-type-options")?{nosniff:!0}:{},...a(e,"x-powered-by")||a(e,"server")?{poweredBy:!0}:{},...a(e,"deprecation")?{deprecation:!0}:{},...a(e,"sunset")?{sunset:!0}:{},...a(e,"ratelimit")||a(e,"ratelimit-policy")||a(e,"x-ratelimit-limit")?{rateLimit:!0}:{},...a(e,"x-request-id")?{requestId:!0}:{}}}m(responseFacts,"responseFacts"),l(responseFacts,"responseFacts");
@@ -1 +1 @@
1
- "use strict";var f=Object.defineProperty;var r=(e,a)=>f(e,"name",{value:a,configurable:!0});var c=Object.defineProperty,t=r((e,a)=>c(e,"name",{value:a,configurable:!0}),"r"),l=Object.defineProperty,n=t((e,a)=>l(e,"name",{value:a,configurable:!0}),"e");const o=/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi;export function foldKeyPattern(e){return e.replace(o,"*").replace(/(?<=^|[:=/])(?=[A-Za-z0-9_-]*\d)(?=[A-Za-z0-9_-]*[A-Za-z])[A-Za-z0-9_-]{16,}(?=$|[:=/])/g,"*").replace(/(?<![A-Za-z])(?=[0-9a-f]*\d)[0-9a-f]{8,}(?![A-Za-z])/gi,"*").replace(/(?<![A-Za-z0-9])\d{2,}(?![A-Za-z0-9])/g,"*").replace(/\*(?:[_-]?\*)+/g,"*")}r(foldKeyPattern,"foldKeyPattern"),t(foldKeyPattern,"foldKeyPattern"),n(foldKeyPattern,"foldKeyPattern");
1
+ "use strict";var f=Object.defineProperty;var r=(a,e)=>f(a,"name",{value:e,configurable:!0});var t=Object.defineProperty,c=r((a,e)=>t(a,"name",{value:e,configurable:!0}),"e");const l=/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi;export function foldKeyPattern(a){return a.replace(l,"*").replace(/(?<=^|[:=/])(?=[A-Za-z0-9_-]*\d)(?=[A-Za-z0-9_-]*[A-Za-z])[A-Za-z0-9_-]{16,}(?=$|[:=/])/g,"*").replace(/(?<![A-Za-z])(?=[0-9a-f]*\d)[0-9a-f]{8,}(?![A-Za-z])/gi,"*").replace(/(?<![A-Za-z0-9])\d{2,}(?![A-Za-z0-9])/g,"*").replace(/\*(?:[_-]?\*)+/g,"*")}r(foldKeyPattern,"foldKeyPattern"),c(foldKeyPattern,"foldKeyPattern");
package/lib/lens-dir.js CHANGED
@@ -1 +1 @@
1
- "use strict";var t=Object.defineProperty;var i=(e,r)=>t(e,"name",{value:r,configurable:!0});var a=Object.defineProperty,n=i((e,r)=>a(e,"name",{value:r,configurable:!0}),"r"),s=Object.defineProperty,o=n((e,r)=>s(e,"name",{value:r,configurable:!0}),"r");export const LENS_SHARED_DIRS=["sql-review","route-review","flow-review","ui-review","cache-review","queue-review","ai-review","ai-names","team","team-design"];export function lensGitignoreLines(e="**/"){return[`${e}.lensmcp/*`,...LENS_SHARED_DIRS.map(r=>`!${e}.lensmcp/${r}/`)]}i(lensGitignoreLines,"lensGitignoreLines"),n(lensGitignoreLines,"lensGitignoreLines"),o(lensGitignoreLines,"lensGitignoreLines");
1
+ "use strict";var n=Object.defineProperty;var r=(e,i)=>n(e,"name",{value:i,configurable:!0});var t=Object.defineProperty,a=r((e,i)=>t(e,"name",{value:i,configurable:!0}),"r");export const LENS_SHARED_DIRS=["sql-review","route-review","flow-review","ui-review","cache-review","queue-review","ai-review","ai-names","team","team-design"];export function lensGitignoreLines(e="**/"){return[`${e}.lensmcp/*`,...LENS_SHARED_DIRS.map(i=>`!${e}.lensmcp/${i}/`)]}r(lensGitignoreLines,"lensGitignoreLines"),a(lensGitignoreLines,"lensGitignoreLines");
@@ -1,2 +1,2 @@
1
- "use strict";var p=Object.defineProperty;var r=(e,s)=>p(e,"name",{value:s,configurable:!0});var m=Object.defineProperty,o=r((e,s)=>m(e,"name",{value:s,configurable:!0}),"t"),d=Object.defineProperty,n=o((e,s)=>d(e,"name",{value:s,configurable:!0}),"o");import{appendFileSync as v,closeSync as S,mkdirSync as y,openSync as f,renameSync as I,statSync as N,unlinkSync as _}from"node:fs";import{dirname as g,join as b}from"node:path";import{ERROR_DISMISSED as a,ERROR_RESTORED as c,LENS_EVENT_SOURCE as R}from"@lensmcp/protocol-types";import{rotateBusFile as F}from"./bus-rotation.js";import{ulid as x}from"./ulid.js";export function lensEventFile(e=process.env,s=process.cwd()){return e.LENSMCP_EVENT_FILE??b(s,".lensmcp","events.jsonl")}r(lensEventFile,"lensEventFile"),o(lensEventFile,"lensEventFile"),n(lensEventFile,"lensEventFile");const l=n((e,s,t,i,E)=>({id:x(),sessionId:e,timestamp:s,source:R,category:"runtime",severity:"info",context:{sessionId:e},fingerprint:t,title:i,raw:E}),"lensEvent");export function dismissalEvent(e,s){return l(s,e.until,`${a}:${e.groupId}`,`error dismissed: ${e.title??e.groupId}`,{kind:a,groupId:e.groupId,until:e.until,eventIds:e.eventIds,...e.by?{by:e.by}:{},...e.reason?{reason:e.reason}:{},...e.title?{title:e.title}:{}})}r(dismissalEvent,"dismissalEvent"),o(dismissalEvent,"dismissalEvent"),n(dismissalEvent,"dismissalEvent");export function restoralEvent(e,s,t){return l(s,t,`${c}:${e}`,"error restored",{kind:c,groupId:e})}r(restoralEvent,"restoralEvent"),o(restoralEvent,"restoralEvent"),n(restoralEvent,"restoralEvent");const u=n((e,s,t)=>{const i=Number(process.env[e]);return Number.isFinite(i)&&t(i)?i:s},"envNumber");export function appendBusEvents(e,s){s.length!==0&&(y(g(e),{recursive:!0}),F(e,{maxBytes:u("LENSMCP_EVENT_MAX_BYTES",50*1024*1024,t=>t>0),maxFiles:u("LENSMCP_EVENT_MAX_FILES",5,t=>t>=1&&t<=20),fs:{statSync:N,renameSync:I,unlinkSync:_,openSync:f,closeSync:S}}),v(e,s.map(t=>JSON.stringify(t)+`
2
- `).join("")))}r(appendBusEvents,"appendBusEvents"),o(appendBusEvents,"appendBusEvents"),n(appendBusEvents,"appendBusEvents");
1
+ "use strict";var p=Object.defineProperty;var t=(n,e)=>p(n,"name",{value:e,configurable:!0});var E=Object.defineProperty,r=t((n,e)=>E(n,"name",{value:e,configurable:!0}),"o");import{appendFileSync as m,closeSync as d,mkdirSync as S,openSync as v,renameSync as y,statSync as f,unlinkSync as I}from"node:fs";import{dirname as N,join as _}from"node:path";import{ERROR_DISMISSED as o,ERROR_RESTORED as a,LENS_EVENT_SOURCE as g}from"@lensmcp/protocol-types";import{rotateBusFile as R}from"./bus-rotation.js";import{ulid as b}from"./ulid.js";export function lensEventFile(n=process.env,e=process.cwd()){return n.LENSMCP_EVENT_FILE??_(e,".lensmcp","events.jsonl")}t(lensEventFile,"lensEventFile"),r(lensEventFile,"lensEventFile");const c=r((n,e,s,i,l)=>({id:b(),sessionId:n,timestamp:e,source:g,category:"runtime",severity:"info",context:{sessionId:n},fingerprint:s,title:i,raw:l}),"lensEvent");export function dismissalEvent(n,e){return c(e,n.until,`${o}:${n.groupId}`,`error dismissed: ${n.title??n.groupId}`,{kind:o,groupId:n.groupId,until:n.until,eventIds:n.eventIds,...n.by?{by:n.by}:{},...n.reason?{reason:n.reason}:{},...n.title?{title:n.title}:{}})}t(dismissalEvent,"dismissalEvent"),r(dismissalEvent,"dismissalEvent");export function restoralEvent(n,e,s){return c(e,s,`${a}:${n}`,"error restored",{kind:a,groupId:n})}t(restoralEvent,"restoralEvent"),r(restoralEvent,"restoralEvent");const u=r((n,e,s)=>{const i=Number(process.env[n]);return Number.isFinite(i)&&s(i)?i:e},"envNumber");export function appendBusEvents(n,e){e.length!==0&&(S(N(n),{recursive:!0}),R(n,{maxBytes:u("LENSMCP_EVENT_MAX_BYTES",50*1024*1024,s=>s>0),maxFiles:u("LENSMCP_EVENT_MAX_FILES",5,s=>s>=1&&s<=20),fs:{statSync:f,renameSync:y,unlinkSync:I,openSync:v,closeSync:d}}),m(n,e.map(s=>JSON.stringify(s)+`
2
+ `).join("")))}t(appendBusEvents,"appendBusEvents"),r(appendBusEvents,"appendBusEvents");
package/lib/patterns.js CHANGED
@@ -1 +1 @@
1
- "use strict";var y=Object.defineProperty;var u=(o,n)=>y(o,"name",{value:n,configurable:!0});var j=Object.defineProperty,p=u((o,n)=>j(o,"name",{value:n,configurable:!0}),"u"),v=Object.defineProperty,f=p((o,n)=>v(o,"name",{value:n,configurable:!0}),"l");export function detectDbInLoop(o,n={}){const s=n.threshold??5,i=[];for(const t of o){const e=t.raw??null;if(e?.kind!=="loop"||!e.loop)continue;const a=e.loop.dbCallsInsideLoop??0;a>s&&i.push({kind:"db-in-loop",severity:"warning",title:`${a} DB calls inside a loop (${e.loop.iterations??"?"} iterations)`,evidence:[t.id],details:{dbCallsInsideLoop:a,iterations:e.loop.iterations,durationMs:e.loop.durationMs,threshold:s},detectedAt:t.timestamp})}return i}u(detectDbInLoop,"detectDbInLoop"),p(detectDbInLoop,"detectDbInLoop"),f(detectDbInLoop,"detectDbInLoop");const I=new Set(["egress","db-query","redis-op","ai-call"]);function w(o){const n=o.raw??null;if(!n||typeof n.kind!="string"||!I.has(n.kind))return;const s=typeof n.durationMs=="number"?n.durationMs:void 0;if(s===void 0)return;const i=typeof n.startedAt=="number"?n.startedAt:o.timestamp-s,t=o.context??{};return{id:o.id,start:i,end:i+s,label:o.title,...typeof t.requestId=="string"?{requestId:t.requestId}:{},...typeof n.project=="string"?{project:n.project}:typeof t.projectName=="string"?{project:t.projectName}:{}}}u(w,"b"),p(w,"M"),f(w,"timedCall");function M(o){const n=o.raw??null,s=n?.kind==="span"?n.span:void 0;if(!s||typeof s.name!="string"||s.name.startsWith("nest.request "))return;const i=typeof s.durationMs=="number"?s.durationMs:void 0;if(i===void 0||i<=0)return;const t=typeof s.startTime=="number"?s.startTime:o.timestamp-i,e=o.context??{};return{id:o.id,start:t,end:t+i,label:s.name,...typeof e.requestId=="string"?{requestId:e.requestId}:{},...typeof n?.project=="string"?{project:n.project}:typeof e.projectName=="string"?{project:e.projectName}:{}}}u(M,"g"),p(M,"b"),f(M,"timedSpan");export function abandonedAwaitOf(o,n,s={}){const i=s.thresholdMs??250,t=w(o);if(!t||!t.requestId||t.end-t.start<i)return;let e;for(const r of n){const d=M(r);!d||d.requestId!==t.requestId||d.project!==void 0&&t.project!==void 0&&d.project!==t.project||d.start>t.start||d.end<=t.start||(!e||d.start>e.start||d.start===e.start&&d.end<e.end)&&(e=d)}if(!e)return;const a=Math.round(t.end-e.end);if(!(a<i))return{kind:"abandoned-await",severity:"warning",title:`${e.label} ended ${a}ms before a call it started had finished (${t.label})`,evidence:[e.id,t.id],details:{span:e.label,call:t.label,ranOnMs:a,spanMs:Math.round(e.end-e.start),callMs:Math.round(t.end-t.start),thresholdMs:i,...t.project?{project:t.project}:{}},detectedAt:o.timestamp}}u(abandonedAwaitOf,"abandonedAwaitOf"),p(abandonedAwaitOf,"abandonedAwaitOf"),f(abandonedAwaitOf,"abandonedAwaitOf");export function detectAbandonedAwait(o,n={}){const s=[];for(const i of o){const t=abandonedAwaitOf(i,o,n);t&&s.push(t)}return s}u(detectAbandonedAwait,"detectAbandonedAwait"),p(detectAbandonedAwait,"detectAbandonedAwait"),f(detectAbandonedAwait,"detectAbandonedAwait");export function detectNPlusOne(o,n={}){const s=n.threshold??3,i=new Map;for(const e of o){const a=e.raw??null;if(a?.kind!=="db-query"||!a.query?.signature)continue;const r=a.query.signature;let d=i.get(r);d||(d=[],i.set(r,d)),d.push(e)}const t=[];for(const[e,a]of i)a.length>=s&&t.push({kind:"n+1-query",severity:"warning",title:`Query repeated ${a.length}\xD7 \u2014 likely N+1`,evidence:a.map(r=>r.id),details:{signature:e,count:a.length,threshold:s},detectedAt:a[a.length-1].timestamp});return t}u(detectNPlusOne,"detectNPlusOne"),p(detectNPlusOne,"detectNPlusOne"),f(detectNPlusOne,"detectNPlusOne");export function detectRenderStorm(o,n={}){const s=n.threshold??5,i=n.windowMs??250,t=new Map;for(const a of o){if(a.source!=="react")continue;const r=a.raw??null;if(r?.kind!=="render"||!r.render?.componentInstanceId)continue;const d=r.render.componentInstanceId;let c=t.get(d);c||(c=[],t.set(d,c)),c.push(a)}const e=[];for(const[a,r]of t){r.sort((c,m)=>c.timestamp-m.timestamp);let d=0;for(let c=0;c<r.length;c++){for(;r[c].timestamp-r[d].timestamp>i;)d++;const m=c-d+1;if(m>s){const l=r.slice(d,c+1),h=l[0].raw.render?.componentName??a;e.push({kind:"render-storm",severity:"warning",title:`${h} rendered ${m}\xD7 in ${i}ms`,evidence:l.map(b=>b.id),details:{componentInstanceId:a,count:m,windowMs:i,threshold:s},detectedAt:l[l.length-1].timestamp});break}}}return e}u(detectRenderStorm,"detectRenderStorm"),p(detectRenderStorm,"detectRenderStorm"),f(detectRenderStorm,"detectRenderStorm");export function findSlowPath(o,n,s){const i=new Map,t=new Set;function e(r){const d=i.get(r);if(d)return d;if(t.has(r))return{path:[r],totalDurationMs:s(r)};t.add(r);const c=s(r),m=n.get(r)??[];let l;for(const b of m){const g=e(b);(!l||g.totalDurationMs>l.totalDurationMs)&&(l=g)}t.delete(r);const h=l?{path:[r,...l.path],totalDurationMs:c+l.totalDurationMs}:{path:[r],totalDurationMs:c};return i.set(r,h),h}u(e,"e"),p(e,"e"),f(e,"best");let a={path:[],totalDurationMs:0};for(const r of o){const d=e(r);d.totalDurationMs>a.totalDurationMs&&(a=d)}return a}u(findSlowPath,"findSlowPath"),p(findSlowPath,"findSlowPath"),f(findSlowPath,"findSlowPath");
1
+ "use strict";var w=Object.defineProperty;var u=(i,n)=>w(i,"name",{value:n,configurable:!0});var y=Object.defineProperty,p=u((i,n)=>y(i,"name",{value:n,configurable:!0}),"l");export function detectDbInLoop(i,n={}){const r=n.threshold??5,d=[];for(const t of i){const e=t.raw??null;if(e?.kind!=="loop"||!e.loop)continue;const s=e.loop.dbCallsInsideLoop??0;s>r&&d.push({kind:"db-in-loop",severity:"warning",title:`${s} DB calls inside a loop (${e.loop.iterations??"?"} iterations)`,evidence:[t.id],details:{dbCallsInsideLoop:s,iterations:e.loop.iterations,durationMs:e.loop.durationMs,threshold:r},detectedAt:t.timestamp})}return d}u(detectDbInLoop,"detectDbInLoop"),p(detectDbInLoop,"detectDbInLoop");const j=new Set(["egress","db-query","redis-op","ai-call"]);function b(i){const n=i.raw??null;if(!n||typeof n.kind!="string"||!j.has(n.kind))return;const r=typeof n.durationMs=="number"?n.durationMs:void 0;if(r===void 0)return;const d=typeof n.startedAt=="number"?n.startedAt:i.timestamp-r,t=i.context??{};return{id:i.id,start:d,end:d+r,label:i.title,...typeof t.requestId=="string"?{requestId:t.requestId}:{},...typeof n.project=="string"?{project:n.project}:typeof t.projectName=="string"?{project:t.projectName}:{}}}u(b,"M"),p(b,"timedCall");function g(i){const n=i.raw??null,r=n?.kind==="span"?n.span:void 0;if(!r||typeof r.name!="string"||r.name.startsWith("nest.request "))return;const d=typeof r.durationMs=="number"?r.durationMs:void 0;if(d===void 0||d<=0)return;const t=typeof r.startTime=="number"?r.startTime:i.timestamp-d,e=i.context??{};return{id:i.id,start:t,end:t+d,label:r.name,...typeof e.requestId=="string"?{requestId:e.requestId}:{},...typeof n?.project=="string"?{project:n.project}:typeof e.projectName=="string"?{project:e.projectName}:{}}}u(g,"b"),p(g,"timedSpan");export function abandonedAwaitOf(i,n,r={}){const d=r.thresholdMs??250,t=b(i);if(!t||!t.requestId||t.end-t.start<d)return;let e;for(const o of n){const a=g(o);!a||a.requestId!==t.requestId||a.project!==void 0&&t.project!==void 0&&a.project!==t.project||a.start>t.start||a.end<=t.start||(!e||a.start>e.start||a.start===e.start&&a.end<e.end)&&(e=a)}if(!e)return;const s=Math.round(t.end-e.end);if(!(s<d))return{kind:"abandoned-await",severity:"warning",title:`${e.label} ended ${s}ms before a call it started had finished (${t.label})`,evidence:[e.id,t.id],details:{span:e.label,call:t.label,ranOnMs:s,spanMs:Math.round(e.end-e.start),callMs:Math.round(t.end-t.start),thresholdMs:d,...t.project?{project:t.project}:{}},detectedAt:i.timestamp}}u(abandonedAwaitOf,"abandonedAwaitOf"),p(abandonedAwaitOf,"abandonedAwaitOf");export function detectAbandonedAwait(i,n={}){const r=[];for(const d of i){const t=abandonedAwaitOf(d,i,n);t&&r.push(t)}return r}u(detectAbandonedAwait,"detectAbandonedAwait"),p(detectAbandonedAwait,"detectAbandonedAwait");export function detectNPlusOne(i,n={}){const r=n.threshold??3,d=new Map;for(const e of i){const s=e.raw??null;if(s?.kind!=="db-query"||!s.query?.signature)continue;const o=s.query.signature;let a=d.get(o);a||(a=[],d.set(o,a)),a.push(e)}const t=[];for(const[e,s]of d)s.length>=r&&t.push({kind:"n+1-query",severity:"warning",title:`Query repeated ${s.length}\xD7 \u2014 likely N+1`,evidence:s.map(o=>o.id),details:{signature:e,count:s.length,threshold:r},detectedAt:s[s.length-1].timestamp});return t}u(detectNPlusOne,"detectNPlusOne"),p(detectNPlusOne,"detectNPlusOne");export function detectRenderStorm(i,n={}){const r=n.threshold??5,d=n.windowMs??250,t=new Map;for(const s of i){if(s.source!=="react")continue;const o=s.raw??null;if(o?.kind!=="render"||!o.render?.componentInstanceId)continue;const a=o.render.componentInstanceId;let c=t.get(a);c||(c=[],t.set(a,c)),c.push(s)}const e=[];for(const[s,o]of t){o.sort((c,f)=>c.timestamp-f.timestamp);let a=0;for(let c=0;c<o.length;c++){for(;o[c].timestamp-o[a].timestamp>d;)a++;const f=c-a+1;if(f>r){const l=o.slice(a,c+1),m=l[0].raw.render?.componentName??s;e.push({kind:"render-storm",severity:"warning",title:`${m} rendered ${f}\xD7 in ${d}ms`,evidence:l.map(h=>h.id),details:{componentInstanceId:s,count:f,windowMs:d,threshold:r},detectedAt:l[l.length-1].timestamp});break}}}return e}u(detectRenderStorm,"detectRenderStorm"),p(detectRenderStorm,"detectRenderStorm");export function findSlowPath(i,n,r){const d=new Map,t=new Set;function e(o){const a=d.get(o);if(a)return a;if(t.has(o))return{path:[o],totalDurationMs:r(o)};t.add(o);const c=r(o),f=n.get(o)??[];let l;for(const h of f){const M=e(h);(!l||M.totalDurationMs>l.totalDurationMs)&&(l=M)}t.delete(o);const m=l?{path:[o,...l.path],totalDurationMs:c+l.totalDurationMs}:{path:[o],totalDurationMs:c};return d.set(o,m),m}u(e,"e"),p(e,"best");let s={path:[],totalDurationMs:0};for(const o of i){const a=e(o);a.totalDurationMs>s.totalDurationMs&&(s=a)}return s}u(findSlowPath,"findSlowPath"),p(findSlowPath,"findSlowPath");
package/lib/pg-errors.js CHANGED
@@ -1 +1 @@
1
- "use strict";var u=Object.defineProperty;var t=(o,e)=>u(o,"name",{value:e,configurable:!0});var l=Object.defineProperty,a=t((o,e)=>l(o,"name",{value:e,configurable:!0}),"n"),f=Object.defineProperty,p=a((o,e)=>f(o,"name",{value:e,configurable:!0}),"t");export const PG_CONNECT_MEANING={"pool-wait-timeout":"waited for a free connection in the service\u2019s own pool and the wait ran out \u2014 not Postgres refusing","connect-timeout":"opening a new connection to Postgres took longer than the limit","server-full":"Postgres is at its max_connections and refused a new connection","server-unreachable":"nothing answered at the database\u2019s address","pool-ended":"the code used a pool that had already been closed (an app being shut down)","auth-failed":"Postgres refused the user or password"};const r=[["pool-wait-timeout",/timeout exceeded when trying to connect/i],["connect-timeout",/Connection terminated due to connection timeout/i],["server-full",/sorry, too many clients already|remaining connection slots are reserved|too many connections for role/i],["pool-ended",/Cannot use a pool after calling end on the pool/i],["auth-failed",/password authentication failed|no pg_hba\.conf entry/i],["server-unreachable",/connect (ECONNREFUSED|EHOSTUNREACH|ETIMEDOUT)|getaddrinfo ENOTFOUND/i]],s={53300:"server-full","28P01":"auth-failed",28e3:"auth-failed",ECONNREFUSED:"server-unreachable",EHOSTUNREACH:"server-unreachable",ENOTFOUND:"server-unreachable"};export const PG_CONNECT_TEXT=new RegExp(r.map(([,o])=>o.source).join("|"),"i");export function pgConnectReason(o){const e=o,n=typeof e=="object"&&e&&typeof e.code=="string"?e.code:void 0;if(n&&s[n])return s[n];const i=typeof e=="string"?e:typeof e=="object"&&e&&typeof e.message=="string"?e.message:"";for(const[c,d]of r)if(d.test(i))return c}t(pgConnectReason,"pgConnectReason"),a(pgConnectReason,"pgConnectReason"),p(pgConnectReason,"pgConnectReason");
1
+ "use strict";var d=Object.defineProperty;var n=(o,e)=>d(o,"name",{value:e,configurable:!0});var u=Object.defineProperty,l=n((o,e)=>u(o,"name",{value:e,configurable:!0}),"t");export const PG_CONNECT_MEANING={"pool-wait-timeout":"waited for a free connection in the service\u2019s own pool and the wait ran out \u2014 not Postgres refusing","connect-timeout":"opening a new connection to Postgres took longer than the limit","server-full":"Postgres is at its max_connections and refused a new connection","server-unreachable":"nothing answered at the database\u2019s address","pool-ended":"the code used a pool that had already been closed (an app being shut down)","auth-failed":"Postgres refused the user or password"};const a=[["pool-wait-timeout",/timeout exceeded when trying to connect/i],["connect-timeout",/Connection terminated due to connection timeout/i],["server-full",/sorry, too many clients already|remaining connection slots are reserved|too many connections for role/i],["pool-ended",/Cannot use a pool after calling end on the pool/i],["auth-failed",/password authentication failed|no pg_hba\.conf entry/i],["server-unreachable",/connect (ECONNREFUSED|EHOSTUNREACH|ETIMEDOUT)|getaddrinfo ENOTFOUND/i]],r={53300:"server-full","28P01":"auth-failed",28e3:"auth-failed",ECONNREFUSED:"server-unreachable",EHOSTUNREACH:"server-unreachable",ENOTFOUND:"server-unreachable"};export const PG_CONNECT_TEXT=new RegExp(a.map(([,o])=>o.source).join("|"),"i");export function pgConnectReason(o){const e=o,t=typeof e=="object"&&e&&typeof e.code=="string"?e.code:void 0;if(t&&r[t])return r[t];const s=typeof e=="string"?e:typeof e=="object"&&e&&typeof e.message=="string"?e.message:"";for(const[i,c]of a)if(c.test(s))return i}n(pgConnectReason,"pgConnectReason"),l(pgConnectReason,"pgConnectReason");
package/lib/redact.js CHANGED
@@ -1 +1 @@
1
- "use strict";var v=Object.defineProperty;var f=(e,t)=>v(e,"name",{value:t,configurable:!0});var I=Object.defineProperty,u=f((e,t)=>I(e,"name",{value:t,configurable:!0}),"f"),P=Object.defineProperty,l=u((e,t)=>P(e,"name",{value:t,configurable:!0}),"a");export const REDACTED="REDACTED",MAX_TITLE_CHARS=300,MAX_MESSAGE_CHARS=4096,MAX_URL_CHARS=1024;const Z=["token","secret","password","passwd","apikey","credential","assertion","signature"],R=new Set(["key","auth","authorization","jwt","code","sig","pwd","pass","session","sid","bearer","otp","cookie","set-cookie"]),C=/^(?:(?:prompt|completion|total|input|output|cache|cached|cacheread|cachewrite|reasoning|thinking|max|min|remaining|used|billed)tokens|tokens?(?:count|used|limit|remaining))$/;export function isSecretParam(e){const t=h.get(e);if(t!==void 0)return t;const r=A(e);return e.length<=64&&h.size<N&&h.set(e,r),r}f(isSecretParam,"isSecretParam"),u(isSecretParam,"isSecretParam"),l(isSecretParam,"isSecretParam");const O=new Set(["sess","csrf","xsrf","refresh","nonce","reset","magic","mfa","2fa","verify","verification","invite","login"]);export function isSecretCacheKey(e){for(const t of e.split(/[:/{}#]+/))if(!(!t||t.length>64)){if(isSecretParam(t))return!0;for(const r of t.toLowerCase().split(/[-_.]+/))if(O.has(r))return!0}return!1}f(isSecretCacheKey,"isSecretCacheKey"),u(isSecretCacheKey,"isSecretCacheKey"),l(isSecretCacheKey,"isSecretCacheKey");const N=4096,h=new Map;function A(e){const t=e.toLowerCase();if(C.test(t.replace(/[-_.]+/g,"")))return!1;if(Z.some(r=>t.includes(r)))return!0;for(const r of t.split(/[-_.]+/))if(r&&R.has(r))return!0;return!1}f(A,"m"),u(A,"N"),l(A,"judgeParam");const D=/^([a-z][a-z0-9+.-]*:\/\/)[^/?#@\s]*@/i,U=/([?&#])([^=&#\s]+)=([^&#\s]*)/g;export function redactUrlParams(e){return e&&e.replace(D,`$1${REDACTED}@`).replace(U,(t,r,n)=>isSecretParam(n)?`${r}${n}=${REDACTED}`:t)}f(redactUrlParams,"redactUrlParams"),u(redactUrlParams,"redactUrlParams"),l(redactUrlParams,"redactUrlParams");export function redactUrl(e){return e&&clip(redactUrlParams(e),1024)}f(redactUrl,"redactUrl"),u(redactUrl,"redactUrl"),l(redactUrl,"redactUrl");const K=/\beyJ[A-Za-z0-9_-]{6,}\.[A-Za-z0-9_-]{4,}\.[A-Za-z0-9_-]*/g,M=/\b(bearer|basic)\s+[A-Za-z0-9._~+/=-]{8,}/gi,j=/\b(authorization|x-api-key|api-key|cookie|set-cookie|proxy-authorization)\b(\s*[:=]\s*)(["']?)((?:(?:bearer|basic)\s+)?[^\s"',;]{4,})\3/gi,L=/[@=:]|eyJ|bearer|basic/i;export function redactText(e){return L.test(e)?redactUrlParams(e).replace(j,(t,r,n,o)=>`${r}${n}${o}${REDACTED}${o}`).replace(K,REDACTED).replace(M,(t,r)=>`${r} ${REDACTED}`):e}f(redactText,"redactText"),u(redactText,"redactText"),l(redactText,"redactText");const q=[/\bsk-(?:ant-|proj-|live-|test-)?[A-Za-z0-9_-]{20,}/g,/\b(?:AKIA|ASIA)[0-9A-Z]{16}\b/g,/\bgh[pousr]_[A-Za-z0-9]{30,}/g,/\bxox[abprs]-[A-Za-z0-9-]{10,}/g,/\bAIza[0-9A-Za-z_-]{35}\b/g],x="-----BEGIN ",H=4096;function m(e){if(!e.includes("PRIVATE KEY-----"))return e;let t="",r=0,n=!1;for(;;){const o=e.indexOf(x,r);if(o===-1)break;const c=e.indexOf("-----",o+x.length);if(c===-1)break;const s=e.slice(o+x.length,c);if(!/^[A-Z ]{0,30}PRIVATE KEY$/.test(s)){t+=e.slice(r,c+5),r=c+5;continue}t+=e.slice(r,o);const i=n?-1:e.indexOf("-----END ",c+5);let a;if(i===-1)n=!0,a=Math.min(e.length,c+5+H);else{const p=e.indexOf("-----",i+9);a=p===-1?e.length:p+5}t+=REDACTED,r=a}return t+e.slice(r)}f(m,"S"),u(m,"y"),l(m,"redactPrivateKeys");const V=/"([A-Za-z0-9_.-]{1,64})"\s*:\s*"((?:[^"\\]|\\.){1,8192})"/g,X=/\b([A-Za-z][A-Za-z0-9_-]{1,40})(\s*[:=]\s*)([^\s"'`,;&)}\]]{8,200})/g,G=/(token|secret|pass(?:word|wd)?|pwd|api[-_]?key|apikey|credential|authorization|bearer)/i;function b(e){return e.replace(V,(t,r)=>isSecretParam(r)?`"${r}": "${REDACTED}"`:t).replace(X,(t,r,n)=>G.test(r)&&isSecretParam(r)?`${r}${n}${REDACTED}`:t)}f(b,"w"),u(b,"U"),l(b,"redactStructured");export function redactSecretText(e){let t=b(redactText(m(e)));for(const r of q)t=t.replace(r,REDACTED);return t}f(redactSecretText,"redactSecretText"),u(redactSecretText,"redactSecretText"),l(redactSecretText,"redactSecretText");export function clip(e,t){return e.length<=t?e:`${e.slice(0,t)}\u2026[lensmcp truncated: ${e.length-t} more chars]`}f(clip,"clip"),u(clip,"clip"),l(clip,"clip");export function safeText(e,t=4096){if(e!==void 0)return clip(redactText(e),t)}f(safeText,"safeText"),u(safeText,"safeText"),l(safeText,"safeText");export function safeTitle(e){return clip(redactText(e),300)}f(safeTitle,"safeTitle"),u(safeTitle,"safeTitle"),l(safeTitle,"safeTitle");const J=6,Y=64,B=/^TS\d{1,5}$/,F=l((e,t)=>e==="code"&&typeof t=="string"&&B.test(t),"isDiagnosticCode");export function redactDeep(e,t=0,r=J){if(typeof e=="string")return redactText(e);if(e===null||typeof e!="object"||t>=r)return e;if(Array.isArray(e)){let s;for(let i=0;i<e.length;i++){if(i>=Y){s&&s.push(e[i]);continue}const a=e[i],p=redactDeep(a,t+1,r);s?s.push(p):p!==a&&(s=e.slice(0,i),s.push(p))}return s??e}const n=e,o=Object.keys(n);let c;for(let s=0;s<o.length;s++){const i=o[s],a=n[i],p=isSecretParam(i)&&a!==void 0&&a!==null&&!F(i,a)?REDACTED:redactDeep(a,t+1,r);if(c)c[i]=p;else if(p!==a){c={};for(let d=0;d<s;d++)c[o[d]]=n[o[d]];c[i]=p}}return c??e}f(redactDeep,"redactDeep"),u(redactDeep,"redactDeep"),l(redactDeep,"redactDeep");const S=String.raw`(?:"(?:[^"]|"")+"|[A-Za-z_][\w$]*)`,$=String.raw`${S}(?:\s*\.\s*${S})*`,W=String.raw`(?:=|<>|!=|<=|>=|<|>|(?:NOT\s+)?I?LIKE|IS\s+(?:NOT\s+)?DISTINCT\s+FROM)`,Q=new RegExp(String.raw`(${$})\s*${W}\s*(?:[A-Za-z_]\w*\s*\(\s*)?\$(\d+)`,"gi"),ee=new RegExp(String.raw`(${$})\s+(?:NOT\s+)?IN\s*\(([^()]*)\)`,"gi"),te=new RegExp(String.raw`\bINSERT\s+INTO\s+${$}\s*\(([^()]*)\)\s*VALUES\s*`,"gi"),re=new RegExp(S,"g"),k=/\$(\d+)/g,E=16384,ne=256,se=4096,g=new Map,w=l(e=>{const t=e.match(re)??[],r=t[t.length-1]??"";return r.startsWith('"')?r.slice(1,-1).replace(/""/g,'"'):r},"lastIdent");function T(e,t){const r=[];let n=t;for(;;){for(;n<e.length&&/\s/.test(e[n]);)n++;if(e[n]!=="(")return r;const o=[];let c=n+1,s=0,i=!1;for(n+=1;n<e.length;n++){const a=e[n];if(i){a==="'"&&(i=!1);continue}if(a==="'")i=!0;else if(a==="(")s++;else if(a===")"){if(s===0)break;s--}else a===","&&s===0&&(o.push(e.slice(c,n)),c=n+1)}if(n>=e.length)return r;for(o.push(e.slice(c,n)),r.push(o),n+=1;n<e.length&&/\s/.test(e[n]);)n++;if(e[n]!==",")return r;n+=1}}f(T,"k"),u(T,"q"),l(T,"valuesTuples");function y(e){const t=e.length<=se,r=t?g.get(e):void 0;if(r)return r;const n=e.length>E?e.slice(0,E):e,o=new Set,c=l((s,i)=>{i&&isSecretParam(i)&&o.add(Number(s))},"bind");for(const s of n.matchAll(Q))c(s[2],w(s[1]));for(const s of n.matchAll(ee)){const i=w(s[1]);for(const a of s[2].matchAll(k))c(a[1],i)}for(const s of n.matchAll(te)){const i=s[1].split(",").map(a=>w(a.trim()));for(const a of T(n,(s.index??0)+s[0].length))a.forEach((p,d)=>{const z=i[d];if(z)for(const _ of p.matchAll(k))c(_[1],z)})}if(t){if(g.size>=ne){const s=g.keys().next().value;s!==void 0&&g.delete(s)}g.set(e,o)}return o}f(y,"y"),u(y,"ee"),l(y,"secretPlaceholders");export function redactSqlParams(e,t){if(t.length===0||!e.includes("$"))return t;const r=y(e);if(r.size===0)return t;let n=!1;const o=t.map((c,s)=>c==null||!r.has(s+1)?c:(n=!0,REDACTED));return n?o:t}f(redactSqlParams,"redactSqlParams"),u(redactSqlParams,"redactSqlParams"),l(redactSqlParams,"redactSqlParams");
1
+ "use strict";var _=Object.defineProperty;var f=(t,e)=>_(t,"name",{value:e,configurable:!0});var I=Object.defineProperty,l=f((t,e)=>I(t,"name",{value:e,configurable:!0}),"a");export const REDACTED="REDACTED",MAX_TITLE_CHARS=300,MAX_MESSAGE_CHARS=4096,MAX_URL_CHARS=1024;const v=["token","secret","password","passwd","apikey","credential","assertion","signature"],Z=new Set(["key","auth","authorization","jwt","code","sig","pwd","pass","session","sid","bearer","otp","cookie","set-cookie"]),R=/^(?:(?:prompt|completion|total|input|output|cache|cached|cacheread|cachewrite|reasoning|thinking|max|min|remaining|used|billed)tokens|tokens?(?:count|used|limit|remaining))$/;export function isSecretParam(t){const e=d.get(t);if(e!==void 0)return e;const r=m(t);return t.length<=64&&d.size<C&&d.set(t,r),r}f(isSecretParam,"isSecretParam"),l(isSecretParam,"isSecretParam");const P=new Set(["sess","csrf","xsrf","refresh","nonce","reset","magic","mfa","2fa","verify","verification","invite","login"]);export function isSecretCacheKey(t){for(const e of t.split(/[:/{}#]+/))if(!(!e||e.length>64)){if(isSecretParam(e))return!0;for(const r of e.toLowerCase().split(/[-_.]+/))if(P.has(r))return!0}return!1}f(isSecretCacheKey,"isSecretCacheKey"),l(isSecretCacheKey,"isSecretCacheKey");const C=4096,d=new Map;function m(t){const e=t.toLowerCase();if(R.test(e.replace(/[-_.]+/g,"")))return!1;if(v.some(r=>e.includes(r)))return!0;for(const r of e.split(/[-_.]+/))if(r&&Z.has(r))return!0;return!1}f(m,"N"),l(m,"judgeParam");const O=/^([a-z][a-z0-9+.-]*:\/\/)[^/?#@\s]*@/i,N=/([?&#])([^=&#\s]+)=([^&#\s]*)/g;export function redactUrlParams(t){return t&&t.replace(O,`$1${REDACTED}@`).replace(N,(e,r,n)=>isSecretParam(n)?`${r}${n}=${REDACTED}`:e)}f(redactUrlParams,"redactUrlParams"),l(redactUrlParams,"redactUrlParams");export function redactUrl(t){return t&&clip(redactUrlParams(t),1024)}f(redactUrl,"redactUrl"),l(redactUrl,"redactUrl");const D=/\beyJ[A-Za-z0-9_-]{6,}\.[A-Za-z0-9_-]{4,}\.[A-Za-z0-9_-]*/g,M=/\b(bearer|basic)\s+[A-Za-z0-9._~+/=-]{8,}/gi,K=/\b(authorization|x-api-key|api-key|cookie|set-cookie|proxy-authorization)\b(\s*[:=]\s*)(["']?)((?:(?:bearer|basic)\s+)?[^\s"',;]{4,})\3/gi,j=/[@=:]|eyJ|bearer|basic/i;export function redactText(t){return j.test(t)?redactUrlParams(t).replace(K,(e,r,n,a)=>`${r}${n}${a}${REDACTED}${a}`).replace(D,REDACTED).replace(M,(e,r)=>`${r} ${REDACTED}`):t}f(redactText,"redactText"),l(redactText,"redactText");const L=[/\bsk-(?:ant-|proj-|live-|test-)?[A-Za-z0-9_-]{20,}/g,/\b(?:AKIA|ASIA)[0-9A-Z]{16}\b/g,/\bgh[pousr]_[A-Za-z0-9]{30,}/g,/\bxox[abprs]-[A-Za-z0-9-]{10,}/g,/\bAIza[0-9A-Za-z_-]{35}\b/g],h="-----BEGIN ",U=4096;function S(t){if(!t.includes("PRIVATE KEY-----"))return t;let e="",r=0,n=!1;for(;;){const a=t.indexOf(h,r);if(a===-1)break;const o=t.indexOf("-----",a+h.length);if(o===-1)break;const s=t.slice(a+h.length,o);if(!/^[A-Z ]{0,30}PRIVATE KEY$/.test(s)){e+=t.slice(r,o+5),r=o+5;continue}e+=t.slice(r,a);const i=n?-1:t.indexOf("-----END ",o+5);let c;if(i===-1)n=!0,c=Math.min(t.length,o+5+U);else{const u=t.indexOf("-----",i+9);c=u===-1?t.length:u+5}e+=REDACTED,r=c}return e+t.slice(r)}f(S,"y"),l(S,"redactPrivateKeys");const H=/"([A-Za-z0-9_.-]{1,64})"\s*:\s*"((?:[^"\\]|\\.){1,8192})"/g,V=/\b([A-Za-z][A-Za-z0-9_-]{1,40})(\s*[:=]\s*)([^\s"'`,;&)}\]]{8,200})/g,X=/(token|secret|pass(?:word|wd)?|pwd|api[-_]?key|apikey|credential|authorization|bearer)/i;function w(t){return t.replace(H,(e,r)=>isSecretParam(r)?`"${r}": "${REDACTED}"`:e).replace(V,(e,r,n)=>X.test(r)&&isSecretParam(r)?`${r}${n}${REDACTED}`:e)}f(w,"U"),l(w,"redactStructured");export function redactSecretText(t){let e=w(redactText(S(t)));for(const r of L)e=e.replace(r,REDACTED);return e}f(redactSecretText,"redactSecretText"),l(redactSecretText,"redactSecretText");export function clip(t,e){return t.length<=e?t:`${t.slice(0,e)}\u2026[lensmcp truncated: ${t.length-e} more chars]`}f(clip,"clip"),l(clip,"clip");export function safeText(t,e=4096){if(t!==void 0)return clip(redactText(t),e)}f(safeText,"safeText"),l(safeText,"safeText");export function safeTitle(t){return clip(redactText(t),300)}f(safeTitle,"safeTitle"),l(safeTitle,"safeTitle");const q=6,G=64,J=/^TS\d{1,5}$/,Y=l((t,e)=>t==="code"&&typeof e=="string"&&J.test(e),"isDiagnosticCode");export function redactDeep(t,e=0,r=q){if(typeof t=="string")return redactText(t);if(t===null||typeof t!="object"||e>=r)return t;if(Array.isArray(t)){let s;for(let i=0;i<t.length;i++){if(i>=G){s&&s.push(t[i]);continue}const c=t[i],u=redactDeep(c,e+1,r);s?s.push(u):u!==c&&(s=t.slice(0,i),s.push(u))}return s??t}const n=t,a=Object.keys(n);let o;for(let s=0;s<a.length;s++){const i=a[s],c=n[i],u=isSecretParam(i)&&c!==void 0&&c!==null&&!Y(i,c)?REDACTED:redactDeep(c,e+1,r);if(o)o[i]=u;else if(u!==c){o={};for(let p=0;p<s;p++)o[a[p]]=n[a[p]];o[i]=u}}return o??t}f(redactDeep,"redactDeep"),l(redactDeep,"redactDeep");const A=String.raw`(?:"(?:[^"]|"")+"|[A-Za-z_][\w$]*)`,x=String.raw`${A}(?:\s*\.\s*${A})*`,B=String.raw`(?:=|<>|!=|<=|>=|<|>|(?:NOT\s+)?I?LIKE|IS\s+(?:NOT\s+)?DISTINCT\s+FROM)`,F=new RegExp(String.raw`(${x})\s*${B}\s*(?:[A-Za-z_]\w*\s*\(\s*)?\$(\d+)`,"gi"),W=new RegExp(String.raw`(${x})\s+(?:NOT\s+)?IN\s*\(([^()]*)\)`,"gi"),Q=new RegExp(String.raw`\bINSERT\s+INTO\s+${x}\s*\(([^()]*)\)\s*VALUES\s*`,"gi"),tt=new RegExp(A,"g"),z=/\$(\d+)/g,T=16384,et=256,rt=4096,g=new Map,b=l(t=>{const e=t.match(tt)??[],r=e[e.length-1]??"";return r.startsWith('"')?r.slice(1,-1).replace(/""/g,'"'):r},"lastIdent");function k(t,e){const r=[];let n=e;for(;;){for(;n<t.length&&/\s/.test(t[n]);)n++;if(t[n]!=="(")return r;const a=[];let o=n+1,s=0,i=!1;for(n+=1;n<t.length;n++){const c=t[n];if(i){c==="'"&&(i=!1);continue}if(c==="'")i=!0;else if(c==="(")s++;else if(c===")"){if(s===0)break;s--}else c===","&&s===0&&(a.push(t.slice(o,n)),o=n+1)}if(n>=t.length)return r;for(a.push(t.slice(o,n)),r.push(a),n+=1;n<t.length&&/\s/.test(t[n]);)n++;if(t[n]!==",")return r;n+=1}}f(k,"q"),l(k,"valuesTuples");function y(t){const e=t.length<=rt,r=e?g.get(t):void 0;if(r)return r;const n=t.length>T?t.slice(0,T):t,a=new Set,o=l((s,i)=>{i&&isSecretParam(i)&&a.add(Number(s))},"bind");for(const s of n.matchAll(F))o(s[2],b(s[1]));for(const s of n.matchAll(W)){const i=b(s[1]);for(const c of s[2].matchAll(z))o(c[1],i)}for(const s of n.matchAll(Q)){const i=s[1].split(",").map(c=>b(c.trim()));for(const c of k(n,(s.index??0)+s[0].length))c.forEach((u,p)=>{const $=i[p];if($)for(const E of u.matchAll(z))o(E[1],$)})}if(e){if(g.size>=et){const s=g.keys().next().value;s!==void 0&&g.delete(s)}g.set(t,a)}return a}f(y,"ee"),l(y,"secretPlaceholders");export function redactSqlParams(t,e){if(e.length===0||!t.includes("$"))return e;const r=y(t);if(r.size===0)return e;let n=!1;const a=e.map((o,s)=>o==null||!r.has(s+1)?o:(n=!0,REDACTED));return n?a:e}f(redactSqlParams,"redactSqlParams"),l(redactSqlParams,"redactSqlParams");
@@ -1 +1 @@
1
- "use strict";var k=Object.defineProperty;var o=(n,e)=>k(n,"name",{value:e,configurable:!0});var E=Object.defineProperty,c=o((n,e)=>E(n,"name",{value:e,configurable:!0}),"o"),a=Object.defineProperty,p=c((n,e)=>a(n,"name",{value:e,configurable:!0}),"k");export function redisExpiry(n,e){const t=n.toLowerCase();if(t==="setex"||t==="psetex")return e.length===3&&/^\d+$/.test(String(e[1]))&&Number(e[1])>0?"set":"unknown";if(t==="getset"||t==="setnx"||t==="mset"||t==="msetnx")return"none";if(t!=="set"&&t!=="getex")return"unknown";const f=t==="set"?2:1;if(e.length<f)return"unknown";let u=t==="set"?"none":"kept",i=!1,l=!1,g=!1;for(let r=f;r<e.length;r++){const s=String(e[r]).toUpperCase();if(["EX","PX","EXAT","PXAT"].includes(s)){if(i||r+1>=e.length||!/^\d+$/.test(String(e[++r]))||Number(e[r])<=0)return"unknown";i=!0,u="set"}else if(t==="set"&&s==="KEEPTTL"||t==="getex"&&s==="PERSIST"){if(i)return"unknown";i=!0,u=s==="KEEPTTL"?"kept":"none"}else if(t==="set"&&["NX","XX"].includes(s)){if(l)return"unknown";l=!0}else if(t==="set"&&s==="GET"){if(g)return"unknown";g=!0}else return"unknown"}return u}o(redisExpiry,"redisExpiry"),c(redisExpiry,"redisExpiry"),p(redisExpiry,"redisExpiry");
1
+ "use strict";var k=Object.defineProperty;var o=(s,n)=>k(s,"name",{value:n,configurable:!0});var c=Object.defineProperty,E=o((s,n)=>c(s,"name",{value:n,configurable:!0}),"k");export function redisExpiry(s,n){const e=s.toLowerCase();if(e==="setex"||e==="psetex")return n.length===3&&/^\d+$/.test(String(n[1]))&&Number(n[1])>0?"set":"unknown";if(e==="getset"||e==="setnx"||e==="mset"||e==="msetnx")return"none";if(e!=="set"&&e!=="getex")return"unknown";const f=e==="set"?2:1;if(n.length<f)return"unknown";let i=e==="set"?"none":"kept",u=!1,l=!1,g=!1;for(let t=f;t<n.length;t++){const r=String(n[t]).toUpperCase();if(["EX","PX","EXAT","PXAT"].includes(r)){if(u||t+1>=n.length||!/^\d+$/.test(String(n[++t]))||Number(n[t])<=0)return"unknown";u=!0,i="set"}else if(e==="set"&&r==="KEEPTTL"||e==="getex"&&r==="PERSIST"){if(u)return"unknown";u=!0,i=r==="KEEPTTL"?"kept":"none"}else if(e==="set"&&["NX","XX"].includes(r)){if(l)return"unknown";l=!0}else if(e==="set"&&r==="GET"){if(g)return"unknown";g=!0}else return"unknown"}return i}o(redisExpiry,"redisExpiry"),E(redisExpiry,"redisExpiry");
@@ -1 +1 @@
1
- "use strict";var a=Object.defineProperty;var c=(r,e)=>a(r,"name",{value:e,configurable:!0});var u=Object.defineProperty,i=c((r,e)=>u(r,"name",{value:e,configurable:!0}),"c"),n=Object.defineProperty,d=i((r,e)=>n(r,"name",{value:e,configurable:!0}),"c");export class ReducerRegistry{static{c(this,"ReducerRegistry")}static{i(this,"ReducerRegistry")}static{d(this,"ReducerRegistry")}constructor(){this.reducers=[]}register(e,s){if(this.reducers.some(t=>t.name===e))throw new Error(`Reducer already registered: ${e}`);this.reducers.push({name:e,reducer:s})}list(){return this.reducers}async dispatch(e){for(const{reducer:s}of this.reducers)try{const t=s(e);t&&typeof t.then=="function"&&await t}catch{}}}
1
+ "use strict";var i=Object.defineProperty;var c=(t,e)=>i(t,"name",{value:e,configurable:!0});var u=Object.defineProperty,a=c((t,e)=>u(t,"name",{value:e,configurable:!0}),"c");export class ReducerRegistry{static{c(this,"ReducerRegistry")}static{a(this,"ReducerRegistry")}constructor(){this.reducers=[]}register(e,s){if(this.reducers.some(r=>r.name===e))throw new Error(`Reducer already registered: ${e}`);this.reducers.push({name:e,reducer:s})}list(){return this.reducers}async dispatch(e){for(const{reducer:s}of this.reducers)try{const r=s(e);r&&typeof r.then=="function"&&await r}catch{}}}
@@ -1 +1 @@
1
- "use strict";var p=Object.defineProperty;var t=(e,r)=>p(e,"name",{value:r,configurable:!0});var i=Object.defineProperty,o=t((e,r)=>i(e,"name",{value:r,configurable:!0}),"o"),c=Object.defineProperty,n=o((e,r)=>c(e,"name",{value:r,configurable:!0}),"e");import{homedir as l}from"node:os";import{dirname as s,join as m}from"node:path";import{lensEventFile as E}from"./lens-events.js";export function replayPathSegment(e){const r=e?.trim().replace(/[^A-Za-z0-9._-]/g,"-").replace(/^[.-]+/,"");return r?r.slice(0,80):void 0}t(replayPathSegment,"replayPathSegment"),o(replayPathSegment,"replayPathSegment"),n(replayPathSegment,"replayPathSegment");export function replayStoreFromEnv(e=process.env,r=process.cwd()){const a=replayPathSegment(e.LENSMCP_REPLAY_WORKSPACE||e.LENSMCP_WS_KEY);return{root:e.LENSMCP_REPLAY_DIR?.trim()||(a?m(e.LENSMCP_HOME||l(),".lensmcp","replay",a):m(s(E(e,r)),"replay")),checkout:replayPathSegment(e.LENSMCP_INSTANCE)??"main"}}t(replayStoreFromEnv,"replayStoreFromEnv"),o(replayStoreFromEnv,"replayStoreFromEnv"),n(replayStoreFromEnv,"replayStoreFromEnv");
1
+ "use strict";var c=Object.defineProperty;var o=(e,r)=>c(e,"name",{value:r,configurable:!0});var i=Object.defineProperty,n=o((e,r)=>i(e,"name",{value:r,configurable:!0}),"e");import{homedir as m}from"node:os";import{dirname as p,join as a}from"node:path";import{lensEventFile as s}from"./lens-events.js";export function replayPathSegment(e){const r=e?.trim().replace(/[^A-Za-z0-9._-]/g,"-").replace(/^[.-]+/,"");return r?r.slice(0,80):void 0}o(replayPathSegment,"replayPathSegment"),n(replayPathSegment,"replayPathSegment");export function replayStoreFromEnv(e=process.env,r=process.cwd()){const t=replayPathSegment(e.LENSMCP_REPLAY_WORKSPACE||e.LENSMCP_WS_KEY);return{root:e.LENSMCP_REPLAY_DIR?.trim()||(t?a(e.LENSMCP_HOME||m(),".lensmcp","replay",t):a(p(s(e,r)),"replay")),checkout:replayPathSegment(e.LENSMCP_INSTANCE)??"main"}}o(replayStoreFromEnv,"replayStoreFromEnv"),n(replayStoreFromEnv,"replayStoreFromEnv");
@@ -1 +1 @@
1
- "use strict";var d=Object.defineProperty;var n=(r,t)=>d(r,"name",{value:t,configurable:!0});var l=Object.defineProperty,c=n((r,t)=>l(r,"name",{value:t,configurable:!0}),"a"),p=Object.defineProperty,u=c((r,t)=>p(r,"name",{value:t,configurable:!0}),"a");export class ResourceStore{static{n(this,"ResourceStore")}static{c(this,"ResourceStore")}static{u(this,"ResourceStore")}constructor(t={}){this.entries=new Map,this.subs=new Map,this.queued=new Map,this.lastRun=new Map,this.lastCost=new Map,this.coalesceMs=Math.max(0,t.coalesceMs??0),this.costFactor=Math.max(0,t.costFactor??0),this.maxGapMs=Math.max(0,t.maxGapMs??3e4)}register(t,e){if(this.entries.has(t))throw new Error(`Resource already registered: ${t}`);return this.entries.set(t,{uri:t,produce:e,revision:0}),()=>{this.entries.delete(t),this.subs.delete(t),this.lastRun.delete(t),this.lastCost.delete(t)}}async read(t){const e=this.entries.get(t);if(!e)throw new Error(`Unknown resource: ${t}`);const s=await e.produce();return e.produced={at:Date.now(),value:s},s}async readRecent(t,e){const s=this.entries.get(t);if(!s)throw new Error(`Unknown resource: ${t}`);return s.produced&&Date.now()-s.produced.at<=e?s.produced.value:this.read(t)}list(){return[...this.entries.keys()]}markDirty(t){if(this.coalesceMs===0&&this.costFactor===0)return this.recompute(t);if(!this.entries.has(t))return Promise.resolve();const e=this.queued.get(t);if(e)return e;const s=Math.max(0,(this.lastRun.get(t)??Number.NEGATIVE_INFINITY)+this.gapFor(t)-Date.now()),i=new Promise(o=>{const a=u(()=>{this.queued.delete(t),this.lastRun.set(t,Date.now()),this.recompute(t).then(o,()=>o())},"go");s===0?setImmediate(a):setTimeout(a,s).unref?.()});return this.queued.set(t,i),i}gapFor(t){const e=this.lastCost.get(t)??0;return Math.max(this.coalesceMs,Math.min(this.maxGapMs,this.costFactor*e))}cost(t){return this.lastCost.get(t)}async recompute(t){const e=this.entries.get(t);if(!e)return;const s=performance.now(),i=await e.produce();e.produced={at:Date.now(),value:i};const o=JSON.stringify(i);if(this.lastCost.set(t,performance.now()-s),o===e.lastJson)return;e.lastJson=o,e.revision+=1;const a=this.subs.get(t);if(a)for(const h of a)try{h(t,e.revision)}catch{}}revision(t){return this.entries.get(t)?.revision}subscribe(t,e){let s=this.subs.get(t);return s||(s=new Set,this.subs.set(t,s)),s.add(e),()=>{s?.delete(e)}}}
1
+ "use strict";var h=Object.defineProperty;var a=(n,e)=>h(n,"name",{value:e,configurable:!0});var d=Object.defineProperty,c=a((n,e)=>d(n,"name",{value:e,configurable:!0}),"a");export class ResourceStore{static{a(this,"ResourceStore")}static{c(this,"ResourceStore")}constructor(e={}){this.entries=new Map,this.subs=new Map,this.queued=new Map,this.lastRun=new Map,this.lastCost=new Map,this.coalesceMs=Math.max(0,e.coalesceMs??0),this.costFactor=Math.max(0,e.costFactor??0),this.maxGapMs=Math.max(0,e.maxGapMs??3e4)}register(e,s){if(this.entries.has(e))throw new Error(`Resource already registered: ${e}`);return this.entries.set(e,{uri:e,produce:s,revision:0}),()=>{this.entries.delete(e),this.subs.delete(e),this.lastRun.delete(e),this.lastCost.delete(e)}}async read(e){const s=this.entries.get(e);if(!s)throw new Error(`Unknown resource: ${e}`);const t=await s.produce();return s.produced={at:Date.now(),value:t},t}async readRecent(e,s){const t=this.entries.get(e);if(!t)throw new Error(`Unknown resource: ${e}`);return t.produced&&Date.now()-t.produced.at<=s?t.produced.value:this.read(e)}list(){return[...this.entries.keys()]}markDirty(e){if(this.coalesceMs===0&&this.costFactor===0)return this.recompute(e);if(!this.entries.has(e))return Promise.resolve();const s=this.queued.get(e);if(s)return s;const t=Math.max(0,(this.lastRun.get(e)??Number.NEGATIVE_INFINITY)+this.gapFor(e)-Date.now()),r=new Promise(i=>{const o=c(()=>{this.queued.delete(e),this.lastRun.set(e,Date.now()),this.recompute(e).then(i,()=>i())},"go");t===0?setImmediate(o):setTimeout(o,t).unref?.()});return this.queued.set(e,r),r}gapFor(e){const s=this.lastCost.get(e)??0;return Math.max(this.coalesceMs,Math.min(this.maxGapMs,this.costFactor*s))}cost(e){return this.lastCost.get(e)}async recompute(e){const s=this.entries.get(e);if(!s)return;const t=performance.now(),r=await s.produce();s.produced={at:Date.now(),value:r};const i=JSON.stringify(r);if(this.lastCost.set(e,performance.now()-t),i===s.lastJson)return;s.lastJson=i,s.revision+=1;const o=this.subs.get(e);if(o)for(const u of o)try{u(e,s.revision)}catch{}}revision(e){return this.entries.get(e)?.revision}subscribe(e,s){let t=this.subs.get(e);return t||(t=new Set,this.subs.set(e,t)),t.add(s),()=>{t?.delete(s)}}}
@@ -1 +1 @@
1
- "use strict";var u=Object.defineProperty;var n=(e,t)=>u(e,"name",{value:t,configurable:!0});var c=Object.defineProperty,r=n((e,t)=>c(e,"name",{value:t,configurable:!0}),"s"),p=Object.defineProperty,l=r((e,t)=>p(e,"name",{value:t,configurable:!0}),"r");function s(e){return e.length===0?!1:!!(/^\d{2,}$/.test(e)||/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(e)||/^[A-Z][A-Z0-9]*-\d+$/.test(e)||e.length>=16&&/^[A-Za-z0-9_-]+$/.test(e)&&/\d/.test(e))}n(s,"f"),r(s,"a"),l(s,"isIdSegment");export function templatisePath(e){const[t="/"]=e.split("?"),o=t.split("/"),a=[];for(const f of o){if(a.length>12){a.push("\u2026");break}a.push(s(f)?":id":f)}const i=a.join("/");return i.length===0?"/":i}n(templatisePath,"templatisePath"),r(templatisePath,"templatisePath"),l(templatisePath,"templatisePath");
1
+ "use strict";var u=Object.defineProperty;var s=(t,e)=>u(t,"name",{value:e,configurable:!0});var l=Object.defineProperty,r=s((t,e)=>l(t,"name",{value:e,configurable:!0}),"r");function f(t){return t.length===0?!1:!!(/^\d{2,}$/.test(t)||/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(t)||/^[A-Z][A-Z0-9]*-\d+$/.test(t)||t.length>=16&&/^[A-Za-z0-9_-]+$/.test(t)&&/\d/.test(t))}s(f,"a"),r(f,"isIdSegment");export function templatisePath(t){const[e="/"]=t.split("?"),o=e.split("/"),n=[];for(const i of o){if(n.length>12){n.push("\u2026");break}n.push(f(i)?":id":i)}const a=n.join("/");return a.length===0?"/":a}s(templatisePath,"templatisePath"),r(templatisePath,"templatisePath");
@@ -1 +1 @@
1
- "use strict";var c=Object.defineProperty;var t=(e,r)=>c(e,"name",{value:r,configurable:!0});var i=Object.defineProperty,o=t((e,r)=>i(e,"name",{value:r,configurable:!0}),"r"),s=Object.defineProperty,a=o((e,r)=>s(e,"name",{value:r,configurable:!0}),"t");export function isServiceHopHost(e){return e?/.\.localhost$/i.test(e.replace(/\.$/,"")):!1}t(isServiceHopHost,"isServiceHopHost"),o(isServiceHopHost,"isServiceHopHost"),a(isServiceHopHost,"isServiceHopHost");export const LENS_REQUEST_ID_HEADER="x-lensmcp-request-id";
1
+ "use strict";var o=Object.defineProperty;var r=(e,t)=>o(e,"name",{value:t,configurable:!0});var s=Object.defineProperty,c=r((e,t)=>s(e,"name",{value:t,configurable:!0}),"t");export function isServiceHopHost(e){return e?/.\.localhost$/i.test(e.replace(/\.$/,"")):!1}r(isServiceHopHost,"isServiceHopHost"),c(isServiceHopHost,"isServiceHopHost");export const LENS_REQUEST_ID_HEADER="x-lensmcp-request-id";
package/lib/sql-shape.js CHANGED
@@ -1,3 +1,3 @@
1
- "use strict";var b=Object.defineProperty;var f=(e,n)=>b(e,"name",{value:n,configurable:!0});var $=Object.defineProperty,T=f((e,n)=>$(e,"name",{value:n,configurable:!0}),"a"),F=Object.defineProperty,p=T((e,n)=>F(e,"name",{value:n,configurable:!0}),"p");const G=/[A-Za-z_\u0080-￿]/,v=/[A-Za-z0-9_$\u0080-￿]/;function N(e){const n=[],u=[];let l=0;const o=e.length;let s=0;const r=p((i,t)=>n.push({kind:i,text:t,up:i==="word"?t.toUpperCase():t}),"push");for(;s<o;){const i=e[s];if(i===" "||i===`
2
- `||i===" "||i==="\r")s++;else if(i==="-"&&e[s+1]==="-"){l++;const t=e.indexOf(`
3
- `,s);u.push(e.slice(s+2,t<0?o:t).trim()),s=t<0?o:t+1}else if(i==="/"&&e[s+1]==="*"){const t=e.indexOf("*/",s+2);u.push(e.slice(s+2,t<0?o:t).trim()),s=t<0?o:t+2}else if(i==="'"||(i==="E"||i==="e")&&e[s+1]==="'"){let t=i==="'"?s+1:s+2;for(;t<o;)if(e[t]==="\\"&&i!=="'")t+=2;else if(e[t]==="'"&&e[t+1]==="'")t+=2;else{if(e[t]==="'")break;t++}r("string",e.slice(s,t+1)),s=t+1}else if(i==="$"&&/[0-9]/.test(e[s+1]??"")){let t=s+1;for(;t<o&&/[0-9]/.test(e[t]);)t++;r("param",e.slice(s,t)),s=t}else if(i==="$"){const t=/^\$([A-Za-z_][A-Za-z0-9_]*)?\$/.exec(e.slice(s,s+64));if(t){const a=e.indexOf(t[0],s+t[0].length),A=a<0?o:a+t[0].length;r("string",e.slice(s,A)),s=A}else r("punct",i),s++}else if(i==='"'){let t=s+1;for(;t<o&&!(e[t]==='"'&&e[t+1]!=='"');)t+=e[t]==='"'?2:1;t<o&&r("qident",e.slice(s,t+1)),s=t+1}else if(/[0-9]/.test(i)||i==="."&&/[0-9]/.test(e[s+1]??"")){let t=s;for(;t<o&&/[0-9.eE]/.test(e[t]);)t++;r("number",e.slice(s,t)),s=t}else if(G.test(i)){let t=s;for(;t<o&&v.test(e[t]);)t++;r("word",e.slice(s,t)),s=t}else if("(),;[].".includes(i))r("punct",i),s++;else{let t=s;for(;t<o&&/[+\-*/<>=~!@#%^&|`?:]/.test(e[t])&&!(e[t]==="-"&&e[t+1]==="-")&&!(e[t]==="/"&&e[t+1]==="*");)t++;t===s&&(t=s+1),r("op",e.slice(s,t)),s=t}}return{tokens:n,comments:u,lineComments:l}}f(N,"I"),T(N,"I"),p(N,"lex");function g(e){const n=new Map,u=[],l=[],o=[];e.forEach((s,r)=>{if(s.text===")"||s.text==="]"){const i=o.pop();i!==void 0&&n.set(i,r)}u.push(o.length),l.push(o[o.length-1]??-1),(s.text==="("||s.text==="[")&&o.push(r)});for(const s of o)n.set(s,e.length);return{close:n,depth:u,opener:l}}f(g,"U"),T(g,"D"),p(g,"structure");const H=new Set(["SELECT","INSERT","UPDATE","DELETE","MERGE","VALUES","TABLE"]),k=new Set(["SELECT","FROM","WHERE","JOIN","LEFT","RIGHT","INNER","OUTER","FULL","CROSS","NATURAL","ON","USING","GROUP","ORDER","BY","HAVING","LIMIT","OFFSET","FETCH","UNION","EXCEPT","INTERSECT","RETURNING","SET","VALUES","WINDOW","FOR","LATERAL","ONLY","AS","WITH","INTO","UPDATE","DELETE","INSERT","DEFAULT","DO","NOTHING","CONFLICT","AND","OR","NOT","IS","NULL","IN","EXISTS","CASE","WHEN","THEN","ELSE","END","TABLESAMPLE","OVERRIDING","MATCHED","MERGE"]);function m(e,n,u=!1){const l=p(r=>r?r.kind==="qident"?r.text.slice(1,-1).replace(/""/g,'"'):r.kind==="word"&&!k.has(r.up)?r.text:void 0:void 0,"part");let o=l(e[n]);if(!o)return;let s=n+1;for(;e[s]?.text==="."&&l(e[s+1]);)o=`${o}.${l(e[s+1])}`,s+=2;if(!(e[s]?.text==="("&&!u))return{name:o.replace(/^public\./i,""),next:s}}f(m,"O"),T(m,"g"),p(m,"tableAt");function U(e,n,u){e[n]?.up==="AS"&&n++;const l=e[n];return l&&(l.kind==="qident"||l.kind==="word"&&!k.has(l.up))&&(n++,e[n]?.text==="("&&(n=(u.get(n)??n)+1)),n}f(U,"C"),T(U,"k"),p(U,"skipAlias");function O(e){let n=2166136261,u=16777619;for(let l=0;l<e.length;l++){const o=e.charCodeAt(l);n=Math.imul(n^o,16777619)>>>0,u=Math.imul(u^o,1540483477)>>>0}return(n.toString(16).padStart(8,"0")+u.toString(16).padStart(8,"0")).slice(0,12)}f(O,"m"),T(O,"w"),p(O,"hashId");function C(e,n){const u=p((r,i)=>r.kind==="string"||r.kind==="number"||r.kind==="param"||[",","::","-","[","]"].includes(r.text)||r.kind==="word"&&(/^(NULL|TRUE|FALSE|DEFAULT)$/i.test(r.text)||i?.text==="::"),"isValue"),l=[];let o=0;for(;o<e.length;){const r=e[o],i=e[o-1];if(r.text==="("&&(i?.up==="IN"||i?.up==="VALUES")){const t=n.get(o)??e.length,a=e.slice(o+1,t);if(a.length&&a.every((A,L)=>u(A,a[L-1]))){if(l.push({kind:"punct",text:"(\u2026)",up:"(\u2026)"}),o=t+1,i.up==="VALUES")for(;e[o]?.text===","&&e[o+1]?.text==="(";)o=(n.get(o+1)??e.length)+1;continue}}l.push(r.kind==="string"||r.kind==="number"?{kind:"op",text:"?",up:"?"}:r),o++}let s="";return l.forEach((r,i)=>{const t=l[i-1],a=!t||["(","[",".","::"].includes(t.text)||[")","]",",",".","::"].includes(r.text)||(r.text==="("||r.text==="(\u2026)"||r.text==="[")&&(t.kind==="qident"||t.kind==="word"&&!k.has(t.up));s+=(a?"":" ")+r.text}),s.trim()}f(C,"w"),T(C,"$"),p(C,"templateOf");const I=new Map,q=512;export function sqlShape(e){const n=I.get(e);if(n)return n;let u;try{u=w(e)}catch{u={id:O(e),template:e.trim().replace(/\s+/g," "),verb:"QUERY",tables:[]}}return I.set(e,u),I.size>q&&I.delete(I.keys().next().value),u}f(sqlShape,"sqlShape"),T(sqlShape,"sqlShape"),p(sqlShape,"sqlShape");function w(e){const{tokens:n,comments:u}=N(e),{close:l,depth:o,opener:s}=g(n);let r=n.find(E=>E.kind==="word")?.up??"QUERY";const i=new Set;n.forEach((E,d)=>{if(E.up!=="WITH"||n[d-1]?.up==="START")return;let c=d+1;for(n[c]?.up==="RECURSIVE"&&c++;;){const S=n[c];if(!S||S.kind!=="word"&&S.kind!=="qident"||(i.add(S.kind==="qident"?S.text.slice(1,-1):S.text),c++,n[c]?.text==="("&&(c=(l.get(c)??c)+1),n[c]?.up!=="AS")||(c++,n[c]?.up==="NOT"&&c++,n[c]?.up==="MATERIALIZED"&&c++,n[c]?.text!=="(")||(c=(l.get(c)??n.length)+1,n[c]?.text!==","))break;c++}}),r==="WITH"&&(r=n.find((E,d)=>o[d]===0&&H.has(E.up)&&d>0)?.up??"SELECT");const t=[];let a;const A=p(E=>{i.has(E)||/^\$/.test(E)||t.includes(E)||t.push(E)},"add");if(n.forEach((E,d)=>{const c=n[d-1]?.up,S=E.up==="FROM"||E.up==="JOIN",M=E.up==="INTO"&&(c==="INSERT"||c==="MERGE")||E.up==="UPDATE"&&c!=="DO"&&c!=="FOR"&&c!=="KEY"&&c!=="NO"||E.up==="USING"||E.up==="TABLE"&&d===0;if(!S&&!M)return;const x=s[d]??-1;if(S&&x>=0&&n[x-1]?.kind==="word"&&!["IN","EXISTS","ANY","ALL","AS","FROM","JOIN","LATERAL","SOME","ARRAY"].includes(n[x-1].up)&&n[x+1]?.up!=="SELECT"&&n[x+1]?.up!=="WITH")return;let h=d+1;for(;n[h]?.up==="ONLY"||n[h]?.up==="LATERAL";)h++;for(;;){const R=m(n,h,E.up==="INTO");if(!R||(A(R.name),M&&!a&&E.up!=="USING"&&(a=R.name),h=U(n,R.next,l),!S||n[h]?.text!==","))break;h++}}),(r==="DELETE"||r==="UPDATE"||r==="INSERT"||r==="MERGE")&&!a){const E=n.findIndex((d,c)=>d.up==="FROM"&&n[c-1]?.up==="DELETE");E>=0&&(a=m(n,E+1)?.name)}const L=C(n,l),D=u.find(E=>/^[\w.\-/:]{3,80}$/.test(E));return{id:O(`${r} ${L.replace(/\$\d+/g,"$?")}`),template:L,verb:r,tables:t,...a?{target:a}:{},...D?{name:D}:{}}}f(w,"D"),T(w,"G"),p(w,"compute");export function statementCount(e){let n=0,u=!1;for(const l of N(e).tokens)l.text===";"?(u&&n++,u=!1):u=!0;return n+(u?1:0)}f(statementCount,"statementCount"),T(statementCount,"statementCount"),p(statementCount,"statementCount");export function shapeMatchKey(e){const n=sqlShape(e),u=n.template.replace(/"(?:[^"]|"")*"|[^"]+/g,l=>l.startsWith('"')?l:l.toLowerCase());return`${n.verb} ${u.replace(/\$\d+/g,"?").replace(/\b(?:true|false)\b/g,"?")}`}f(shapeMatchKey,"shapeMatchKey"),T(shapeMatchKey,"shapeMatchKey"),p(shapeMatchKey,"shapeMatchKey");export function lineCommentSwallows(e){return!/\n/.test(e)&&N(e).lineComments>0}f(lineCommentSwallows,"lineCommentSwallows"),T(lineCommentSwallows,"lineCommentSwallows"),p(lineCommentSwallows,"lineCommentSwallows");
1
+ "use strict";var M=Object.defineProperty;var a=(t,n)=>M(t,"name",{value:n,configurable:!0});var b=Object.defineProperty,f=a((t,n)=>b(t,"name",{value:n,configurable:!0}),"p");const $=/[A-Za-z_\u0080-￿]/,F=/[A-Za-z0-9_$\u0080-￿]/;function I(t){const n=[],c=[];let o=0;const r=t.length;let s=0;const i=f((u,e)=>n.push({kind:u,text:e,up:u==="word"?e.toUpperCase():e}),"push");for(;s<r;){const u=t[s];if(u===" "||u===`
2
+ `||u===" "||u==="\r")s++;else if(u==="-"&&t[s+1]==="-"){o++;const e=t.indexOf(`
3
+ `,s);c.push(t.slice(s+2,e<0?r:e).trim()),s=e<0?r:e+1}else if(u==="/"&&t[s+1]==="*"){const e=t.indexOf("*/",s+2);c.push(t.slice(s+2,e<0?r:e).trim()),s=e<0?r:e+2}else if(u==="'"||(u==="E"||u==="e")&&t[s+1]==="'"){let e=u==="'"?s+1:s+2;for(;e<r;)if(t[e]==="\\"&&u!=="'")e+=2;else if(t[e]==="'"&&t[e+1]==="'")e+=2;else{if(t[e]==="'")break;e++}i("string",t.slice(s,e+1)),s=e+1}else if(u==="$"&&/[0-9]/.test(t[s+1]??"")){let e=s+1;for(;e<r&&/[0-9]/.test(t[e]);)e++;i("param",t.slice(s,e)),s=e}else if(u==="$"){const e=/^\$([A-Za-z_][A-Za-z0-9_]*)?\$/.exec(t.slice(s,s+64));if(e){const E=t.indexOf(e[0],s+e[0].length),S=E<0?r:E+e[0].length;i("string",t.slice(s,S)),s=S}else i("punct",u),s++}else if(u==='"'){let e=s+1;for(;e<r&&!(t[e]==='"'&&t[e+1]!=='"');)e+=t[e]==='"'?2:1;e<r&&i("qident",t.slice(s,e+1)),s=e+1}else if(/[0-9]/.test(u)||u==="."&&/[0-9]/.test(t[s+1]??"")){let e=s;for(;e<r&&/[0-9.eE]/.test(t[e]);)e++;i("number",t.slice(s,e)),s=e}else if($.test(u)){let e=s;for(;e<r&&F.test(t[e]);)e++;i("word",t.slice(s,e)),s=e}else if("(),;[].".includes(u))i("punct",u),s++;else{let e=s;for(;e<r&&/[+\-*/<>=~!@#%^&|`?:]/.test(t[e])&&!(t[e]==="-"&&t[e+1]==="-")&&!(t[e]==="/"&&t[e+1]==="*");)e++;e===s&&(e=s+1),i("op",t.slice(s,e)),s=e}}return{tokens:n,comments:c,lineComments:o}}a(I,"I"),f(I,"lex");function U(t){const n=new Map,c=[],o=[],r=[];t.forEach((s,i)=>{if(s.text===")"||s.text==="]"){const u=r.pop();u!==void 0&&n.set(u,i)}c.push(r.length),o.push(r[r.length-1]??-1),(s.text==="("||s.text==="[")&&r.push(i)});for(const s of r)n.set(s,t.length);return{close:n,depth:c,opener:o}}a(U,"D"),f(U,"structure");const G=new Set(["SELECT","INSERT","UPDATE","DELETE","MERGE","VALUES","TABLE"]),R=new Set(["SELECT","FROM","WHERE","JOIN","LEFT","RIGHT","INNER","OUTER","FULL","CROSS","NATURAL","ON","USING","GROUP","ORDER","BY","HAVING","LIMIT","OFFSET","FETCH","UNION","EXCEPT","INTERSECT","RETURNING","SET","VALUES","WINDOW","FOR","LATERAL","ONLY","AS","WITH","INTO","UPDATE","DELETE","INSERT","DEFAULT","DO","NOTHING","CONFLICT","AND","OR","NOT","IS","NULL","IN","EXISTS","CASE","WHEN","THEN","ELSE","END","TABLESAMPLE","OVERRIDING","MATCHED","MERGE"]);function O(t,n,c=!1){const o=f(i=>i?i.kind==="qident"?i.text.slice(1,-1).replace(/""/g,'"'):i.kind==="word"&&!R.has(i.up)?i.text:void 0:void 0,"part");let r=o(t[n]);if(!r)return;let s=n+1;for(;t[s]?.text==="."&&o(t[s+1]);)r=`${r}.${o(t[s+1])}`,s+=2;if(!(t[s]?.text==="("&&!c))return{name:r.replace(/^public\./i,""),next:s}}a(O,"g"),f(O,"tableAt");function C(t,n,c){t[n]?.up==="AS"&&n++;const o=t[n];return o&&(o.kind==="qident"||o.kind==="word"&&!R.has(o.up))&&(n++,t[n]?.text==="("&&(n=(c.get(n)??n)+1)),n}a(C,"k"),f(C,"skipAlias");function m(t){let n=2166136261,c=16777619;for(let o=0;o<t.length;o++){const r=t.charCodeAt(o);n=Math.imul(n^r,16777619)>>>0,c=Math.imul(c^r,1540483477)>>>0}return(n.toString(16).padStart(8,"0")+c.toString(16).padStart(8,"0")).slice(0,12)}a(m,"w"),f(m,"hashId");function w(t,n){const c=f((i,u)=>i.kind==="string"||i.kind==="number"||i.kind==="param"||[",","::","-","[","]"].includes(i.text)||i.kind==="word"&&(/^(NULL|TRUE|FALSE|DEFAULT)$/i.test(i.text)||u?.text==="::"),"isValue"),o=[];let r=0;for(;r<t.length;){const i=t[r],u=t[r-1];if(i.text==="("&&(u?.up==="IN"||u?.up==="VALUES")){const e=n.get(r)??t.length,E=t.slice(r+1,e);if(E.length&&E.every((S,N)=>c(S,E[N-1]))){if(o.push({kind:"punct",text:"(\u2026)",up:"(\u2026)"}),r=e+1,u.up==="VALUES")for(;t[r]?.text===","&&t[r+1]?.text==="(";)r=(n.get(r+1)??t.length)+1;continue}}o.push(i.kind==="string"||i.kind==="number"?{kind:"op",text:"?",up:"?"}:i),r++}let s="";return o.forEach((i,u)=>{const e=o[u-1],E=!e||["(","[",".","::"].includes(e.text)||[")","]",",",".","::"].includes(i.text)||(i.text==="("||i.text==="(\u2026)"||i.text==="[")&&(e.kind==="qident"||e.kind==="word"&&!R.has(e.up));s+=(E?"":" ")+i.text}),s.trim()}a(w,"$"),f(w,"templateOf");const x=new Map,H=512;export function sqlShape(t){const n=x.get(t);if(n)return n;let c;try{c=D(t)}catch{c={id:m(t),template:t.trim().replace(/\s+/g," "),verb:"QUERY",tables:[]}}return x.set(t,c),x.size>H&&x.delete(x.keys().next().value),c}a(sqlShape,"sqlShape"),f(sqlShape,"sqlShape");function D(t){const{tokens:n,comments:c}=I(t),{close:o,depth:r,opener:s}=U(n);let i=n.find(p=>p.kind==="word")?.up??"QUERY";const u=new Set;n.forEach((p,d)=>{if(p.up!=="WITH"||n[d-1]?.up==="START")return;let l=d+1;for(n[l]?.up==="RECURSIVE"&&l++;;){const T=n[l];if(!T||T.kind!=="word"&&T.kind!=="qident"||(u.add(T.kind==="qident"?T.text.slice(1,-1):T.text),l++,n[l]?.text==="("&&(l=(o.get(l)??l)+1),n[l]?.up!=="AS")||(l++,n[l]?.up==="NOT"&&l++,n[l]?.up==="MATERIALIZED"&&l++,n[l]?.text!=="(")||(l=(o.get(l)??n.length)+1,n[l]?.text!==","))break;l++}}),i==="WITH"&&(i=n.find((p,d)=>r[d]===0&&G.has(p.up)&&d>0)?.up??"SELECT");const e=[];let E;const S=f(p=>{u.has(p)||/^\$/.test(p)||e.includes(p)||e.push(p)},"add");if(n.forEach((p,d)=>{const l=n[d-1]?.up,T=p.up==="FROM"||p.up==="JOIN",k=p.up==="INTO"&&(l==="INSERT"||l==="MERGE")||p.up==="UPDATE"&&l!=="DO"&&l!=="FOR"&&l!=="KEY"&&l!=="NO"||p.up==="USING"||p.up==="TABLE"&&d===0;if(!T&&!k)return;const A=s[d]??-1;if(T&&A>=0&&n[A-1]?.kind==="word"&&!["IN","EXISTS","ANY","ALL","AS","FROM","JOIN","LATERAL","SOME","ARRAY"].includes(n[A-1].up)&&n[A+1]?.up!=="SELECT"&&n[A+1]?.up!=="WITH")return;let h=d+1;for(;n[h]?.up==="ONLY"||n[h]?.up==="LATERAL";)h++;for(;;){const L=O(n,h,p.up==="INTO");if(!L||(S(L.name),k&&!E&&p.up!=="USING"&&(E=L.name),h=C(n,L.next,o),!T||n[h]?.text!==","))break;h++}}),(i==="DELETE"||i==="UPDATE"||i==="INSERT"||i==="MERGE")&&!E){const p=n.findIndex((d,l)=>d.up==="FROM"&&n[l-1]?.up==="DELETE");p>=0&&(E=O(n,p+1)?.name)}const N=w(n,o),g=c.find(p=>/^[\w.\-/:]{3,80}$/.test(p));return{id:m(`${i} ${N.replace(/\$\d+/g,"$?")}`),template:N,verb:i,tables:e,...E?{target:E}:{},...g?{name:g}:{}}}a(D,"G"),f(D,"compute");export function statementCount(t){let n=0,c=!1;for(const o of I(t).tokens)o.text===";"?(c&&n++,c=!1):c=!0;return n+(c?1:0)}a(statementCount,"statementCount"),f(statementCount,"statementCount");export function shapeMatchKey(t){const n=sqlShape(t),c=n.template.replace(/"(?:[^"]|"")*"|[^"]+/g,o=>o.startsWith('"')?o:o.toLowerCase());return`${n.verb} ${c.replace(/\$\d+/g,"?").replace(/\b(?:true|false)\b/g,"?")}`}a(shapeMatchKey,"shapeMatchKey"),f(shapeMatchKey,"shapeMatchKey");export function lineCommentSwallows(t){return!/\n/.test(t)&&I(t).lineComments>0}a(lineCommentSwallows,"lineCommentSwallows"),f(lineCommentSwallows,"lineCommentSwallows");
package/lib/sql-values.js CHANGED
@@ -1 +1 @@
1
- "use strict";var S=Object.defineProperty;var r=(e,t)=>S(e,"name",{value:t,configurable:!0});var v=Object.defineProperty,l=r((e,t)=>v(e,"name",{value:t,configurable:!0}),"s"),$=Object.defineProperty,c=l((e,t)=>$(e,"name",{value:t,configurable:!0}),"c");import{createReadStream as q}from"node:fs";import{join as _}from"node:path";import{createInterface as g}from"node:readline";export const SQL_VALUES_DIR="sql",CACHE_VALUES_DIR="cache";const h=/^(sqv|cav)_(\d{12})_(\d{1,10})_([0-9a-z]{1,12})$/,x={sqv:SQL_VALUES_DIR,cav:CACHE_VALUES_DIR};export function sqlValuesId(e,t,a){return`sqv_${V(e)}_${t}_${a.toString(36)}`}r(sqlValuesId,"sqlValuesId"),l(sqlValuesId,"sqlValuesId"),c(sqlValuesId,"sqlValuesId");export function cacheValuesId(e,t,a){return`cav_${V(e)}_${t}_${a.toString(36)}`}r(cacheValuesId,"cacheValuesId"),l(cacheValuesId,"cacheValuesId"),c(cacheValuesId,"cacheValuesId");export function keptValuesFile(e,t){const a=h.exec(t);return a?_(e,x[a[1]],`${a[3]}-${a[2]}.jsonl`):void 0}r(keptValuesFile,"keptValuesFile"),l(keptValuesFile,"keptValuesFile"),c(keptValuesFile,"keptValuesFile");export function sqlValuesFile(e,t){return isSqlValuesId(t)?keptValuesFile(e,t):void 0}r(sqlValuesFile,"sqlValuesFile"),l(sqlValuesFile,"sqlValuesFile"),c(sqlValuesFile,"sqlValuesFile");export function isSqlValuesId(e){return typeof e=="string"&&h.test(e)&&e.startsWith("sqv_")}r(isSqlValuesId,"isSqlValuesId"),l(isSqlValuesId,"isSqlValuesId"),c(isSqlValuesId,"isSqlValuesId");export function isCacheValuesId(e){return typeof e=="string"&&h.test(e)&&e.startsWith("cav_")}r(isCacheValuesId,"isCacheValuesId"),l(isCacheValuesId,"isCacheValuesId"),c(isCacheValuesId,"isCacheValuesId");export async function readSqlValues(e,t){return isSqlValuesId(t)?await p(e,t):void 0}r(readSqlValues,"readSqlValues"),l(readSqlValues,"readSqlValues"),c(readSqlValues,"readSqlValues");export async function readCacheValues(e,t){return isCacheValuesId(t)?await p(e,t):void 0}r(readCacheValues,"readCacheValues"),l(readCacheValues,"readCacheValues"),c(readCacheValues,"readCacheValues");async function p(e,t){const a=keptValuesFile(e,t);if(!a)return;const o=`{"id":${JSON.stringify(t)},`,n=q(a,{encoding:"utf8"}),s=g({input:n,crlfDelay:1/0});try{for await(const i of s){if(!i.startsWith(o))continue;const u=JSON.parse(i);return u.id===t?u:void 0}}catch{}finally{s.close(),n.destroy()}}r(p,"p"),l(p,"h"),c(p,"readKeptValues");export async function readSqlValuesMany(e,t){return await readKeptValuesMany(e,t.filter(isSqlValuesId))}r(readSqlValuesMany,"readSqlValuesMany"),l(readSqlValuesMany,"readSqlValuesMany"),c(readSqlValuesMany,"readSqlValuesMany");export async function readKeptValuesMany(e,t){const a=new Map;for(const n of t){const s=keptValuesFile(e,n);if(!s)continue;const i=a.get(s)??new Set;i.add(n),a.set(s,i)}const o=new Map;for(const[n,s]of a){const i=q(n,{encoding:"utf8"}),u=g({input:i,crlfDelay:1/0});let d=s.size;try{for await(const y of u){const f=/^\{"id":"((?:sqv|cav)_[0-9a-z_]+)",/.exec(y);if(!(!f||!s.has(f[1])||o.has(f[1]))){try{o.set(f[1],JSON.parse(y))}catch{continue}if(--d===0)break}}}catch{}finally{u.close(),i.destroy()}}return o}r(readKeptValuesMany,"readKeptValuesMany"),l(readKeptValuesMany,"readKeptValuesMany"),c(readKeptValuesMany,"readKeptValuesMany");export function sqlWithValues(e,t){if(!t?.length)return e;const a=c(s=>s==="null"||s==="undefined"?"NULL":`'${s.replace(/'/g,"''")}'`,"literal");let o="",n=0;for(;n<e.length;){const s=e[n];if(s==="'"){const u=e.indexOf("'",n+1),d=u<0?e.length:u+1;o+=e.slice(n,d),n=d;continue}const i=s==="$"?/^\$(\d+)/.exec(e.slice(n,n+12)):null;if(i){const u=t[Number(i[1])-1];o+=u===void 0?i[0]:a(u),n+=i[0].length;continue}o+=s,n++}return o}r(sqlWithValues,"sqlWithValues"),l(sqlWithValues,"sqlWithValues"),c(sqlWithValues,"sqlWithValues");function V(e){const t=new Date(e),a=c(o=>String(o).padStart(2,"0"),"p");return`${t.getUTCFullYear()}${a(t.getUTCMonth()+1)}${a(t.getUTCDate())}${a(t.getUTCHours())}${a(t.getUTCMinutes())}`}r(V,"V"),l(V,"g"),c(V,"minuteStamp");
1
+ "use strict";var S=Object.defineProperty;var s=(e,t)=>S(e,"name",{value:t,configurable:!0});var v=Object.defineProperty,o=s((e,t)=>v(e,"name",{value:t,configurable:!0}),"c");import{createReadStream as y}from"node:fs";import{join as $}from"node:path";import{createInterface as g}from"node:readline";export const SQL_VALUES_DIR="sql",CACHE_VALUES_DIR="cache";const d=/^(sqv|cav)_(\d{12})_(\d{1,10})_([0-9a-z]{1,12})$/,q={sqv:SQL_VALUES_DIR,cav:CACHE_VALUES_DIR};export function sqlValuesId(e,t,n){return`sqv_${V(e)}_${t}_${n.toString(36)}`}s(sqlValuesId,"sqlValuesId"),o(sqlValuesId,"sqlValuesId");export function cacheValuesId(e,t,n){return`cav_${V(e)}_${t}_${n.toString(36)}`}s(cacheValuesId,"cacheValuesId"),o(cacheValuesId,"cacheValuesId");export function keptValuesFile(e,t){const n=d.exec(t);return n?$(e,q[n[1]],`${n[3]}-${n[2]}.jsonl`):void 0}s(keptValuesFile,"keptValuesFile"),o(keptValuesFile,"keptValuesFile");export function sqlValuesFile(e,t){return isSqlValuesId(t)?keptValuesFile(e,t):void 0}s(sqlValuesFile,"sqlValuesFile"),o(sqlValuesFile,"sqlValuesFile");export function isSqlValuesId(e){return typeof e=="string"&&d.test(e)&&e.startsWith("sqv_")}s(isSqlValuesId,"isSqlValuesId"),o(isSqlValuesId,"isSqlValuesId");export function isCacheValuesId(e){return typeof e=="string"&&d.test(e)&&e.startsWith("cav_")}s(isCacheValuesId,"isCacheValuesId"),o(isCacheValuesId,"isCacheValuesId");export async function readSqlValues(e,t){return isSqlValuesId(t)?await p(e,t):void 0}s(readSqlValues,"readSqlValues"),o(readSqlValues,"readSqlValues");export async function readCacheValues(e,t){return isCacheValuesId(t)?await p(e,t):void 0}s(readCacheValues,"readCacheValues"),o(readCacheValues,"readCacheValues");async function p(e,t){const n=keptValuesFile(e,t);if(!n)return;const c=`{"id":${JSON.stringify(t)},`,a=y(n,{encoding:"utf8"}),r=g({input:a,crlfDelay:1/0});try{for await(const i of r){if(!i.startsWith(c))continue;const u=JSON.parse(i);return u.id===t?u:void 0}}catch{}finally{r.close(),a.destroy()}}s(p,"h"),o(p,"readKeptValues");export async function readSqlValuesMany(e,t){return await readKeptValuesMany(e,t.filter(isSqlValuesId))}s(readSqlValuesMany,"readSqlValuesMany"),o(readSqlValuesMany,"readSqlValuesMany");export async function readKeptValuesMany(e,t){const n=new Map;for(const a of t){const r=keptValuesFile(e,a);if(!r)continue;const i=n.get(r)??new Set;i.add(a),n.set(r,i)}const c=new Map;for(const[a,r]of n){const i=y(a,{encoding:"utf8"}),u=g({input:i,crlfDelay:1/0});let l=r.size;try{for await(const h of u){const f=/^\{"id":"((?:sqv|cav)_[0-9a-z_]+)",/.exec(h);if(!(!f||!r.has(f[1])||c.has(f[1]))){try{c.set(f[1],JSON.parse(h))}catch{continue}if(--l===0)break}}}catch{}finally{u.close(),i.destroy()}}return c}s(readKeptValuesMany,"readKeptValuesMany"),o(readKeptValuesMany,"readKeptValuesMany");export function sqlWithValues(e,t){if(!t?.length)return e;const n=o(r=>r==="null"||r==="undefined"?"NULL":`'${r.replace(/'/g,"''")}'`,"literal");let c="",a=0;for(;a<e.length;){const r=e[a];if(r==="'"){const u=e.indexOf("'",a+1),l=u<0?e.length:u+1;c+=e.slice(a,l),a=l;continue}const i=r==="$"?/^\$(\d+)/.exec(e.slice(a,a+12)):null;if(i){const u=t[Number(i[1])-1];c+=u===void 0?i[0]:n(u),a+=i[0].length;continue}c+=r,a++}return c}s(sqlWithValues,"sqlWithValues"),o(sqlWithValues,"sqlWithValues");function V(e){const t=new Date(e),n=o(c=>String(c).padStart(2,"0"),"p");return`${t.getUTCFullYear()}${n(t.getUTCMonth()+1)}${n(t.getUTCDate())}${n(t.getUTCHours())}${n(t.getUTCMinutes())}`}s(V,"g"),o(V,"minuteStamp");
package/lib/stores.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var U=Object.defineProperty;var l=(s,e)=>U(s,"name",{value:e,configurable:!0});var j=Object.defineProperty,f=l((s,e)=>j(s,"name",{value:e,configurable:!0}),"p"),R=Object.defineProperty,p=f((s,e)=>R(s,"name",{value:e,configurable:!0}),"u");import{readFileSync as b}from"node:fs";import{join as g}from"node:path";const S=/^[A-Za-z0-9_-]+$/,A=new Set(["kind","url","databases","lens","run"]);export function readStoresDecl(s){let e;try{e=JSON.parse(b(g(s,"nx.json"),"utf8"))}catch{return{stores:{},errors:[],notes:[]}}const t=e?.lensmcp?.stores;return t===void 0?{stores:{},errors:[],notes:[]}:validateStoresDecl(t)}l(readStoresDecl,"readStoresDecl"),f(readStoresDecl,"readStoresDecl"),p(readStoresDecl,"readStoresDecl");export function validateStoresDecl(s){const e=[],t=[],i={};if(!s||typeof s!="object"||Array.isArray(s))return{stores:i,errors:["`lensmcp.stores` must be an object"],notes:t};for(const[n,a]of Object.entries(s)){const r=`stores.${n}`;if(!S.test(n)){e.push(`${r}: a store name is letters, digits, '-' and '_'`);continue}if(!a||typeof a!="object"||Array.isArray(a)){e.push(`${r}: must be an object`);continue}const o=a,m=o.kind;if(m!=="postgres"&&m!=="redis"){e.push(`${r}.kind: one of "postgres", "redis"`);continue}const v=typeof o.url=="string"?o.url.trim():"";if(!v){e.push(`${r}.url: the connection URL is required (e.g. "\${${m==="postgres"?"PG_URL":"REDIS_URL"}}")`);continue}const h=o.databases??[];if(!Array.isArray(h)||!h.every(u=>typeof u=="string"&&u.trim())){e.push(`${r}.databases: a list of URLs or database names`);continue}if(h.length&&m!=="postgres"){e.push(`${r}.databases: only a postgres store has databases`);continue}const d=o.lens??{};if(!d||typeof d!="object"||Array.isArray(d)){e.push(`${r}.lens: must be an object`);continue}const c=d;if(c.url!==void 0&&(typeof c.url!="string"||!c.url.trim())){e.push(`${r}.lens.url: a connection URL`);continue}if(c.read!==void 0&&typeof c.read!="boolean"){e.push(`${r}.lens.read: true or false`);continue}if(c.prepare!==void 0&&typeof c.prepare!="boolean"){e.push(`${r}.lens.prepare: true or false`);continue}o.run!==void 0&&t.push(`${r}.run: planned \u2014 lensmcp does not start stores yet; the store is used as declared`);for(const u of Object.keys(o))A.has(u)||t.push(`${r}.${u}: not a store setting \u2014 ignored`);i[n]={kind:m,url:v,databases:h.map(u=>u.trim()),lens:{...typeof c.url=="string"?{url:c.url.trim()}:{},read:c.read!==!1,prepare:c.prepare!==!1}}}return{stores:i,errors:e,notes:t}}l(validateStoresDecl,"validateStoresDecl"),f(validateStoresDecl,"validateStoresDecl"),p(validateStoresDecl,"validateStoresDecl");export function parseDotenv(s,e={}){const t={},i=p(n=>n.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)\}/g,(a,r)=>t[r]??e[r]??""),"expand");for(const n of s.split(/\r?\n/)){const a=/^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*?)\s*$/.exec(n);if(!a)continue;const r=a[1],o=a[2];o.startsWith("'")&&o.indexOf("'",1)>0?t[r]=o.slice(1,o.indexOf("'",1)):o.startsWith('"')&&o.indexOf('"',1)>0?t[r]=i(o.slice(1,o.indexOf('"',1)).replace(/\\n/g,`
2
- `)):t[r]=i(o.replace(/\s+#.*$/,""))}return t}l(parseDotenv,"parseDotenv"),f(parseDotenv,"parseDotenv"),p(parseDotenv,"parseDotenv");function $(s,e){try{return parseDotenv(b(s,"utf8"),e)}catch{return{}}}l($,"g"),f($,"$"),p($,"readDotenv");export function checkoutEnv(s,e=process.env){let t={};for(const n of[".env",".env.local"])t={...t,...$(g(s,n),{...t})};const i=Object.fromEntries(Object.entries(e).filter(n=>typeof n[1]=="string"));t={...t,...i};for(const n of[g(".lensmcp","instance.resources.env"),g(".lensmcp","instance.env")])t={...t,...$(g(s,n),{...t})};return t}l(checkoutEnv,"checkoutEnv"),f(checkoutEnv,"checkoutEnv"),p(checkoutEnv,"checkoutEnv");export function expandVars(s,e){const t=[];return{value:s.replace(/\$\{([A-Za-z_][A-Za-z0-9_.]*)\}/g,(i,n)=>{const a=e[n];return(a===void 0||a==="")&&t.push(n),a??""}),missing:t}}l(expandVars,"expandVars"),f(expandVars,"expandVars"),p(expandVars,"expandVars");const y=p(s=>s.port||(s.protocol.startsWith("redis")?"6379":"5432"),"portOf");export function withDatabase(s,e){const t=new URL(s);return t.pathname=`/${e}`,t.toString()}l(withDatabase,"withDatabase"),f(withDatabase,"withDatabase"),p(withDatabase,"withDatabase");export function redactUrl(s){try{const e=new URL(s);return`${e.protocol}//${e.username?`${decodeURIComponent(e.username)}@`:""}${e.hostname}:${y(e)}${e.pathname}`}catch{return"(not a URL)"}}l(redactUrl,"redactUrl"),f(redactUrl,"redactUrl"),p(redactUrl,"redactUrl");export function resolveStores(s,e){return Object.entries(s).map(([t,i])=>{const n=expandVars(i.url,e),a=[...n.missing];let r;try{r=n.missing.length?void 0:new URL(n.value)}catch{r=void 0}const o=[];if(r&&i.kind==="postgres"){o.push({name:decodeURIComponent(r.pathname.replace(/^\//,""))||"postgres",url:n.value});for(const h of i.databases){const d=expandVars(h,e);if(d.missing.length){a.push(...d.missing);continue}const c=/^[a-z]+:\/\//i.test(d.value)?d.value:withDatabase(n.value,d.value);try{const u=decodeURIComponent(new URL(c).pathname.replace(/^\//,""));u&&!o.some(x=>x.name===u)&&o.push({name:u,url:c})}catch{}}}const m=i.lens.url?expandVars(i.lens.url,e):void 0;m?.missing.length&&a.push(...m.missing);const v=i.lens.read?a.length?`${[...new Set(a)].map(h=>`\${${h}}`).join(", ")} not set in this checkout`:r?void 0:"`url` is not a connection URL":"reading is off (`lens.read: false`)";return{name:t,kind:i.kind,server:r?`${r.hostname}:${y(r)}`:"?",databases:o,...v?{noRead:v}:{readUrl:m?.value||n.value},prepare:i.lens.prepare!==!1,missing:[...new Set(a)]}})}l(resolveStores,"resolveStores"),f(resolveStores,"resolveStores"),p(resolveStores,"resolveStores");
1
+ "use strict";var x=Object.defineProperty;var p=(n,e)=>x(n,"name",{value:e,configurable:!0});var U=Object.defineProperty,l=p((n,e)=>U(n,"name",{value:e,configurable:!0}),"u");import{readFileSync as $}from"node:fs";import{join as v}from"node:path";const R=/^[A-Za-z0-9_-]+$/,j=new Set(["kind","url","databases","lens","run"]);export function readStoresDecl(n){let e;try{e=JSON.parse($(v(n,"nx.json"),"utf8"))}catch{return{stores:{},errors:[],notes:[]}}const t=e?.lensmcp?.stores;return t===void 0?{stores:{},errors:[],notes:[]}:validateStoresDecl(t)}p(readStoresDecl,"readStoresDecl"),l(readStoresDecl,"readStoresDecl");export function validateStoresDecl(n){const e=[],t=[],i={};if(!n||typeof n!="object"||Array.isArray(n))return{stores:i,errors:["`lensmcp.stores` must be an object"],notes:t};for(const[s,a]of Object.entries(n)){const r=`stores.${s}`;if(!R.test(s)){e.push(`${r}: a store name is letters, digits, '-' and '_'`);continue}if(!a||typeof a!="object"||Array.isArray(a)){e.push(`${r}: must be an object`);continue}const o=a,f=o.kind;if(f!=="postgres"&&f!=="redis"){e.push(`${r}.kind: one of "postgres", "redis"`);continue}const h=typeof o.url=="string"?o.url.trim():"";if(!h){e.push(`${r}.url: the connection URL is required (e.g. "\${${f==="postgres"?"PG_URL":"REDIS_URL"}}")`);continue}const m=o.databases??[];if(!Array.isArray(m)||!m.every(u=>typeof u=="string"&&u.trim())){e.push(`${r}.databases: a list of URLs or database names`);continue}if(m.length&&f!=="postgres"){e.push(`${r}.databases: only a postgres store has databases`);continue}const d=o.lens??{};if(!d||typeof d!="object"||Array.isArray(d)){e.push(`${r}.lens: must be an object`);continue}const c=d;if(c.url!==void 0&&(typeof c.url!="string"||!c.url.trim())){e.push(`${r}.lens.url: a connection URL`);continue}if(c.read!==void 0&&typeof c.read!="boolean"){e.push(`${r}.lens.read: true or false`);continue}if(c.prepare!==void 0&&typeof c.prepare!="boolean"){e.push(`${r}.lens.prepare: true or false`);continue}o.run!==void 0&&t.push(`${r}.run: planned \u2014 lensmcp does not start stores yet; the store is used as declared`);for(const u of Object.keys(o))j.has(u)||t.push(`${r}.${u}: not a store setting \u2014 ignored`);i[s]={kind:f,url:h,databases:m.map(u=>u.trim()),lens:{...typeof c.url=="string"?{url:c.url.trim()}:{},read:c.read!==!1,prepare:c.prepare!==!1}}}return{stores:i,errors:e,notes:t}}p(validateStoresDecl,"validateStoresDecl"),l(validateStoresDecl,"validateStoresDecl");export function parseDotenv(n,e={}){const t={},i=l(s=>s.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)\}/g,(a,r)=>t[r]??e[r]??""),"expand");for(const s of n.split(/\r?\n/)){const a=/^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*?)\s*$/.exec(s);if(!a)continue;const r=a[1],o=a[2];o.startsWith("'")&&o.indexOf("'",1)>0?t[r]=o.slice(1,o.indexOf("'",1)):o.startsWith('"')&&o.indexOf('"',1)>0?t[r]=i(o.slice(1,o.indexOf('"',1)).replace(/\\n/g,`
2
+ `)):t[r]=i(o.replace(/\s+#.*$/,""))}return t}p(parseDotenv,"parseDotenv"),l(parseDotenv,"parseDotenv");function g(n,e){try{return parseDotenv($(n,"utf8"),e)}catch{return{}}}p(g,"$"),l(g,"readDotenv");export function checkoutEnv(n,e=process.env){let t={};for(const s of[".env",".env.local"])t={...t,...g(v(n,s),{...t})};const i=Object.fromEntries(Object.entries(e).filter(s=>typeof s[1]=="string"));t={...t,...i};for(const s of[v(".lensmcp","instance.resources.env"),v(".lensmcp","instance.env")])t={...t,...g(v(n,s),{...t})};return t}p(checkoutEnv,"checkoutEnv"),l(checkoutEnv,"checkoutEnv");export function expandVars(n,e){const t=[];return{value:n.replace(/\$\{([A-Za-z_][A-Za-z0-9_.]*)\}/g,(i,s)=>{const a=e[s];return(a===void 0||a==="")&&t.push(s),a??""}),missing:t}}p(expandVars,"expandVars"),l(expandVars,"expandVars");const y=l(n=>n.port||(n.protocol.startsWith("redis")?"6379":"5432"),"portOf");export function withDatabase(n,e){const t=new URL(n);return t.pathname=`/${e}`,t.toString()}p(withDatabase,"withDatabase"),l(withDatabase,"withDatabase");export function redactUrl(n){try{const e=new URL(n);return`${e.protocol}//${e.username?`${decodeURIComponent(e.username)}@`:""}${e.hostname}:${y(e)}${e.pathname}`}catch{return"(not a URL)"}}p(redactUrl,"redactUrl"),l(redactUrl,"redactUrl");export function resolveStores(n,e){return Object.entries(n).map(([t,i])=>{const s=expandVars(i.url,e),a=[...s.missing];let r;try{r=s.missing.length?void 0:new URL(s.value)}catch{r=void 0}const o=[];if(r&&i.kind==="postgres"){o.push({name:decodeURIComponent(r.pathname.replace(/^\//,""))||"postgres",url:s.value});for(const m of i.databases){const d=expandVars(m,e);if(d.missing.length){a.push(...d.missing);continue}const c=/^[a-z]+:\/\//i.test(d.value)?d.value:withDatabase(s.value,d.value);try{const u=decodeURIComponent(new URL(c).pathname.replace(/^\//,""));u&&!o.some(b=>b.name===u)&&o.push({name:u,url:c})}catch{}}}const f=i.lens.url?expandVars(i.lens.url,e):void 0;f?.missing.length&&a.push(...f.missing);const h=i.lens.read?a.length?`${[...new Set(a)].map(m=>`\${${m}}`).join(", ")} not set in this checkout`:r?void 0:"`url` is not a connection URL":"reading is off (`lens.read: false`)";return{name:t,kind:i.kind,server:r?`${r.hostname}:${y(r)}`:"?",databases:o,...h?{noRead:h}:{readUrl:f?.value||s.value},prepare:i.lens.prepare!==!1,missing:[...new Set(a)]}})}p(resolveStores,"resolveStores"),l(resolveStores,"resolveStores");
package/lib/story.js CHANGED
@@ -1 +1 @@
1
- "use strict";var I=Object.defineProperty;var u=(t,n)=>I(t,"name",{value:n,configurable:!0});var k=Object.defineProperty,c=u((t,n)=>k(t,"name",{value:n,configurable:!0}),"u"),b=Object.defineProperty,p=c((t,n)=>b(t,"name",{value:n,configurable:!0}),"c");export function groupByFlow(t){const n=new Map;for(const e of t){const o=e.context.flowId;if(!o)continue;let s=n.get(o);s||(s=[],n.set(o,s)),s.push(e)}return n}u(groupByFlow,"groupByFlow"),c(groupByFlow,"groupByFlow"),p(groupByFlow,"groupByFlow");export function compileStory(t,n={}){let e,o;if(n.flowId)o=n.flowId,e=t.filter(r=>r.context.flowId===o);else{const r=t.find(i=>i.context.flowId);if(!r)return;o=r.context.flowId,e=t.filter(i=>i.context.flowId===o)}if(e.length===0)return;e.sort((r,i)=>r.timestamp-i.timestamp);const s=1e3;e.length>s&&(e=[e[0],...e.slice(e.length-(s-1))]);const m=e[0],d=[];let l,v;for(const r of e){const i=f(r);if(i){if(d.push(i),i.kind==="render"||i.kind==="final-render"){const a=r.raw;a?.render&&(l={id:a.render.id,page:a.render.page,route:a.render.route,componentName:a.render.componentName})}else if(r.source==="visual"&&i.kind==="visual-violation"){const a=r.raw;a?.frame&&(v=a.frame.id)}}}for(let r=d.length-1;r>=0;r--)if(d[r].kind==="render"){d[r]={...d[r],kind:"final-render"};break}const g=e[0].timestamp,w=e[e.length-1].timestamp;return{flowId:o,origin:{type:m.context.originType,nodeId:m.context.originNodeId,at:m.timestamp},phases:d,finalState:l?{page:l.page,route:l.route,componentName:l.componentName,renderId:l.id,visualFrameId:v}:void 0,startedAt:g,endedAt:w,eventCount:e.length}}u(compileStory,"compileStory"),c(compileStory,"compileStory"),p(compileStory,"compileStory");function f(t){const n=(t.raw??null)?.kind;if(n==="flow-origin"||t.source==="client-runtime"&&n==="user-action"){const e=t.raw;return{kind:"user-action",at:t.timestamp,label:e?.origin?.label??t.title,eventIds:[t.id]}}if(t.source==="react"&&n==="render"){const e=t.raw;return{kind:"render",at:t.timestamp,label:`render ${e?.render?.componentName??"?"}`,eventIds:[t.id],details:e?.render?{componentName:e.render.componentName,durationMs:e.render.actualDurationMs}:void 0}}if(t.source==="react"&&n==="slot-content-changed"){const e=t.raw,o=e?.slot?.toComponent??"?";return{kind:/spinner|loader|loading/i.test(o)?"loading-ui":"idle-ui",at:t.timestamp,label:`slot ${e?.slot?.slotLogicalId??""} \u2192 ${o}`,eventIds:[t.id]}}if(t.source==="client-runtime"&&n==="route"){const e=t.raw;return{kind:"route-transition",at:t.timestamp,label:`route ${e?.from??""} \u2192 ${e?.url??""}`,eventIds:[t.id]}}if(t.source==="valtio"&&n==="state-update"){const e=t.raw;return{kind:"state-update",at:t.timestamp,label:`${e?.update?.storeId??"?"}.${e?.update?.path??"?"}`,eventIds:[t.id],details:e?.update}}if(t.source==="nestjs"&&n==="server-request"){const e=t.raw;return{kind:"backend-request",at:t.timestamp,label:`${e?.request?.method??"?"} ${e?.request?.route??"?"} \u2192 ${e?.request?.status??"?"}`,eventIds:[t.id],details:e?.request}}if(t.source==="chrome"&&t.category==="network")return{kind:"backend-request",at:t.timestamp,label:t.title,eventIds:[t.id]};if(t.source==="visual"&&n==="visual-violation"){const e=t.raw;return{kind:"visual-violation",at:t.timestamp,label:`${e?.violation?.ruleType??"rule"} ${e?.violation?.ruleId??""}`,eventIds:[t.id]}}}u(f,"f"),c(f,"g"),p(f,"classifyEvent");
1
+ "use strict";var w=Object.defineProperty;var u=(e,n)=>w(e,"name",{value:n,configurable:!0});var I=Object.defineProperty,m=u((e,n)=>I(e,"name",{value:n,configurable:!0}),"c");export function groupByFlow(e){const n=new Map;for(const t of e){const o=t.context.flowId;if(!o)continue;let s=n.get(o);s||(s=[],n.set(o,s)),s.push(t)}return n}u(groupByFlow,"groupByFlow"),m(groupByFlow,"groupByFlow");export function compileStory(e,n={}){let t,o;if(n.flowId)o=n.flowId,t=e.filter(r=>r.context.flowId===o);else{const r=e.find(i=>i.context.flowId);if(!r)return;o=r.context.flowId,t=e.filter(i=>i.context.flowId===o)}if(t.length===0)return;t.sort((r,i)=>r.timestamp-i.timestamp);const s=1e3;t.length>s&&(t=[t[0],...t.slice(t.length-(s-1))]);const c=t[0],d=[];let l,p;for(const r of t){const i=f(r);if(i){if(d.push(i),i.kind==="render"||i.kind==="final-render"){const a=r.raw;a?.render&&(l={id:a.render.id,page:a.render.page,route:a.render.route,componentName:a.render.componentName})}else if(r.source==="visual"&&i.kind==="visual-violation"){const a=r.raw;a?.frame&&(p=a.frame.id)}}}for(let r=d.length-1;r>=0;r--)if(d[r].kind==="render"){d[r]={...d[r],kind:"final-render"};break}const v=t[0].timestamp,g=t[t.length-1].timestamp;return{flowId:o,origin:{type:c.context.originType,nodeId:c.context.originNodeId,at:c.timestamp},phases:d,finalState:l?{page:l.page,route:l.route,componentName:l.componentName,renderId:l.id,visualFrameId:p}:void 0,startedAt:v,endedAt:g,eventCount:t.length}}u(compileStory,"compileStory"),m(compileStory,"compileStory");function f(e){const n=(e.raw??null)?.kind;if(n==="flow-origin"||e.source==="client-runtime"&&n==="user-action"){const t=e.raw;return{kind:"user-action",at:e.timestamp,label:t?.origin?.label??e.title,eventIds:[e.id]}}if(e.source==="react"&&n==="render"){const t=e.raw;return{kind:"render",at:e.timestamp,label:`render ${t?.render?.componentName??"?"}`,eventIds:[e.id],details:t?.render?{componentName:t.render.componentName,durationMs:t.render.actualDurationMs}:void 0}}if(e.source==="react"&&n==="slot-content-changed"){const t=e.raw,o=t?.slot?.toComponent??"?";return{kind:/spinner|loader|loading/i.test(o)?"loading-ui":"idle-ui",at:e.timestamp,label:`slot ${t?.slot?.slotLogicalId??""} \u2192 ${o}`,eventIds:[e.id]}}if(e.source==="client-runtime"&&n==="route"){const t=e.raw;return{kind:"route-transition",at:e.timestamp,label:`route ${t?.from??""} \u2192 ${t?.url??""}`,eventIds:[e.id]}}if(e.source==="valtio"&&n==="state-update"){const t=e.raw;return{kind:"state-update",at:e.timestamp,label:`${t?.update?.storeId??"?"}.${t?.update?.path??"?"}`,eventIds:[e.id],details:t?.update}}if(e.source==="nestjs"&&n==="server-request"){const t=e.raw;return{kind:"backend-request",at:e.timestamp,label:`${t?.request?.method??"?"} ${t?.request?.route??"?"} \u2192 ${t?.request?.status??"?"}`,eventIds:[e.id],details:t?.request}}if(e.source==="chrome"&&e.category==="network")return{kind:"backend-request",at:e.timestamp,label:e.title,eventIds:[e.id]};if(e.source==="visual"&&n==="visual-violation"){const t=e.raw;return{kind:"visual-violation",at:e.timestamp,label:`${t?.violation?.ruleType??"rule"} ${t?.violation?.ruleId??""}`,eventIds:[e.id]}}}u(f,"g"),m(f,"classifyEvent");
package/lib/thresholds.js CHANGED
@@ -1 +1 @@
1
- "use strict";var l=Object.defineProperty;var r=(e,s)=>l(e,"name",{value:s,configurable:!0});var u=Object.defineProperty,t=r((e,s)=>u(e,"name",{value:s,configurable:!0}),"r"),a=Object.defineProperty,c=t((e,s)=>a(e,"name",{value:s,configurable:!0}),"n");export const DEFAULT_THRESHOLDS={dbInLoop:5,nPlusOne:3,renderStorm:5,slowRouteMs:500,slowPageMs:1e3,slowRenderMs:16,slowQueryMs:100,duplicateRequestPeak:3,slowEgressMs:1e3};export function resolveThresholds(e){const s={...DEFAULT_THRESHOLDS};if(e)for(const n of Object.keys(DEFAULT_THRESHOLDS)){const o=e[n];typeof o=="number"&&Number.isFinite(o)&&o>=0&&(s[n]=o)}return s}r(resolveThresholds,"resolveThresholds"),t(resolveThresholds,"resolveThresholds"),c(resolveThresholds,"resolveThresholds");
1
+ "use strict";var n=Object.defineProperty;var r=(e,s)=>n(e,"name",{value:s,configurable:!0});var l=Object.defineProperty,u=r((e,s)=>l(e,"name",{value:s,configurable:!0}),"n");export const DEFAULT_THRESHOLDS={dbInLoop:5,nPlusOne:3,renderStorm:5,slowRouteMs:500,slowPageMs:1e3,slowRenderMs:16,slowQueryMs:100,duplicateRequestPeak:3,slowEgressMs:1e3};export function resolveThresholds(e){const s={...DEFAULT_THRESHOLDS};if(e)for(const t of Object.keys(DEFAULT_THRESHOLDS)){const o=e[t];typeof o=="number"&&Number.isFinite(o)&&o>=0&&(s[t]=o)}return s}r(resolveThresholds,"resolveThresholds"),u(resolveThresholds,"resolveThresholds");
package/lib/ulid.js CHANGED
@@ -1 +1 @@
1
- "use strict";var s=Object.defineProperty;var o=(e,n)=>s(e,"name",{value:n,configurable:!0});var b=Object.defineProperty,a=o((e,n)=>b(e,"name",{value:n,configurable:!0}),"r"),m=Object.defineProperty,u=a((e,n)=>m(e,"name",{value:n,configurable:!0}),"r");const f="0123456789ABCDEFGHJKMNPQRSTVWXYZ",g=16;function c(e,n){let r="",t=e;for(let l=n-1;l>=0;l--){const d=t%32;r=f[d]+r,t=(t-d)/32}return r}o(c,"l"),a(c,"s"),u(c,"encodeTime");function i(e){const n=new Uint8Array(e);globalThis.crypto.getRandomValues(n);let r="";for(let t=0;t<e;t++)r+=f[(n[t]??0)&31];return r}o(i,"s"),a(i,"a"),u(i,"encodeRandom");export function ulid(e=Date.now()){return c(e,10)+i(16)}o(ulid,"ulid"),a(ulid,"ulid"),u(ulid,"ulid");
1
+ "use strict";var d=Object.defineProperty;var r=(e,n)=>d(e,"name",{value:n,configurable:!0});var f=Object.defineProperty,c=r((e,n)=>f(e,"name",{value:n,configurable:!0}),"r");const i="0123456789ABCDEFGHJKMNPQRSTVWXYZ",b=16;function l(e,n){let o="",t=e;for(let u=n-1;u>=0;u--){const a=t%32;o=i[a]+o,t=(t-a)/32}return o}r(l,"s"),c(l,"encodeTime");function s(e){const n=new Uint8Array(e);globalThis.crypto.getRandomValues(n);let o="";for(let t=0;t<e;t++)o+=i[(n[t]??0)&31];return o}r(s,"a"),c(s,"encodeRandom");export function ulid(e=Date.now()){return l(e,10)+s(16)}r(ulid,"ulid"),c(ulid,"ulid");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lensmcp/core",
3
- "version": "1.25.37",
3
+ "version": "1.25.39",
4
4
  "type": "module",
5
5
  "main": "./index.js",
6
6
  "module": "./index.js",
@@ -84,7 +84,7 @@
84
84
  }
85
85
  },
86
86
  "dependencies": {
87
- "@lensmcp/protocol-types": "1.25.37",
87
+ "@lensmcp/protocol-types": "1.25.39",
88
88
  "tslib": "^2.3.0"
89
89
  },
90
90
  "license": "Apache-2.0",