@lensmcp/nest-instrumentation 1.25.75 → 1.25.76

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/capture.js CHANGED
@@ -1 +1 @@
1
- "use strict";var b=Object.defineProperty;var a=(e,n)=>b(e,"name",{value:n,configurable:!0});var h=Object.defineProperty,c=a((e,n)=>h(e,"name",{value:n,configurable:!0}),"f");import{clip as A,redactDeep as C}from"@lensmcp/core/redact";export const CAPTURE_ENV="LENSMCP_CAPTURE",MAX_CAPTURE_CHARS=2e3;const g=4,d=40,l=20,y=500;export function parseCaptureList(e){const n=new Map;for(const r of(e??"").split(/[\s,]+/)){if(!r)continue;const t=r.lastIndexOf(":"),f=t>0?r.slice(0,t):r,o=t>0?r.slice(t+1):"args";f&&(o==="args"||o==="result"||o==="both")&&n.set(f,o)}return n}a(parseCaptureList,"parseCaptureList"),c(parseCaptureList,"parseCaptureList");let m,p=new Map;export function captureFor(e,n=process.env){const r=n[CAPTURE_ENV]??"";return r!==m&&(m=r,p=parseCaptureList(r)),p.size===0?void 0:p.get(e)}a(captureFor,"captureFor"),c(captureFor,"captureFor");function u(e,n,r){if(e==null)return e;if(typeof e=="string")return e.length>y?`${e.slice(0,y)}\u2026[${e.length-y} more chars]`:e;if(typeof e=="number"||typeof e=="boolean")return e;if(typeof e=="bigint")return`${e}n`;if(typeof e=="symbol")return e.toString();if(typeof e=="function")return`[Function ${e.name||"anonymous"}]`;if(e instanceof Date)return Number.isNaN(e.getTime())?"[Invalid Date]":e.toISOString();if(e instanceof Error)return{name:e.name,message:e.message};if(typeof Buffer<"u"&&Buffer.isBuffer(e))return`[Buffer ${e.length} bytes]`;if(r.has(e))return"[Circular]";if(n>=g)return Array.isArray(e)?`[Array(${e.length})]`:`[${e.constructor?.name??"Object"}]`;r.add(e);try{if(Array.isArray(e)){const i=e.slice(0,l).map(s=>u(s,n+1,r));return e.length>l&&i.push(`\u2026[${e.length-l} more items]`),i}if(e instanceof Map)return u(Object.fromEntries([...e].slice(0,d).map(([i,s])=>[String(i),s])),n,r);if(e instanceof Set)return u([...e],n,r);const t={};let f=0,o=0;for(const i of Object.keys(e)){if(f>=d){o+=1;continue}let s;try{s=e[i]}catch{s="[threw on read]"}t[i]=u(s,n+1,r),f+=1}return o>0&&(t["\u2026"]=`${o} more keys`),t}finally{r.delete(e)}}a(u,"p"),c(u,"prune");export function capturedValue(e){try{const n=JSON.stringify(C(u(e,0,new WeakSet),0,g+2));return A(n??"undefined",MAX_CAPTURE_CHARS)}catch{return"[could not be serialised]"}}a(capturedValue,"capturedValue"),c(capturedValue,"capturedValue");export function resetCaptureForTests(){m=void 0,p=new Map}a(resetCaptureForTests,"resetCaptureForTests"),c(resetCaptureForTests,"resetCaptureForTests");
1
+ "use strict";var h=Object.defineProperty;var i=(t,r)=>h(t,"name",{value:r,configurable:!0});var C=Object.defineProperty,f=i((t,r)=>C(t,"name",{value:r,configurable:!0}),"a"),A=Object.defineProperty,p=f((t,r)=>A(t,"name",{value:r,configurable:!0}),"f");import{clip as v,redactDeep as S}from"@lensmcp/core/redact";export const CAPTURE_ENV="LENSMCP_CAPTURE",MAX_CAPTURE_CHARS=2e3;const d=4,b=40,y=20,m=500;export function parseCaptureList(t){const r=new Map;for(const e of(t??"").split(/[\s,]+/)){if(!e)continue;const n=e.lastIndexOf(":"),c=n>0?e.slice(0,n):e,o=n>0?e.slice(n+1):"args";c&&(o==="args"||o==="result"||o==="both")&&r.set(c,o)}return r}i(parseCaptureList,"parseCaptureList"),f(parseCaptureList,"parseCaptureList"),p(parseCaptureList,"parseCaptureList");let g,l=new Map;export function captureFor(t,r=process.env){const e=r[CAPTURE_ENV]??"";return e!==g&&(g=e,l=parseCaptureList(e)),l.size===0?void 0:l.get(t)}i(captureFor,"captureFor"),f(captureFor,"captureFor"),p(captureFor,"captureFor");function u(t,r,e){if(t==null)return t;if(typeof t=="string")return t.length>m?`${t.slice(0,m)}\u2026[${t.length-m} more chars]`:t;if(typeof t=="number"||typeof t=="boolean")return t;if(typeof t=="bigint")return`${t}n`;if(typeof t=="symbol")return t.toString();if(typeof t=="function")return`[Function ${t.name||"anonymous"}]`;if(t instanceof Date)return Number.isNaN(t.getTime())?"[Invalid Date]":t.toISOString();if(t instanceof Error)return{name:t.name,message:t.message};if(typeof Buffer<"u"&&Buffer.isBuffer(t))return`[Buffer ${t.length} bytes]`;if(e.has(t))return"[Circular]";if(r>=d)return Array.isArray(t)?`[Array(${t.length})]`:`[${t.constructor?.name??"Object"}]`;e.add(t);try{if(Array.isArray(t)){const s=t.slice(0,y).map(a=>u(a,r+1,e));return t.length>y&&s.push(`\u2026[${t.length-y} more items]`),s}if(t instanceof Map)return u(Object.fromEntries([...t].slice(0,b).map(([s,a])=>[String(s),a])),r,e);if(t instanceof Set)return u([...t],r,e);const n={};let c=0,o=0;for(const s of Object.keys(t)){if(c>=b){o+=1;continue}let a;try{a=t[s]}catch{a="[threw on read]"}n[s]=u(a,r+1,e),c+=1}return o>0&&(n["\u2026"]=`${o} more keys`),n}finally{e.delete(t)}}i(u,"u"),f(u,"p"),p(u,"prune");export function capturedValue(t){try{const r=JSON.stringify(S(u(t,0,new WeakSet),0,d+2));return v(r??"undefined",MAX_CAPTURE_CHARS)}catch{return"[could not be serialised]"}}i(capturedValue,"capturedValue"),f(capturedValue,"capturedValue"),p(capturedValue,"capturedValue");export function resetCaptureForTests(){g=void 0,l=new Map}i(resetCaptureForTests,"resetCaptureForTests"),f(resetCaptureForTests,"resetCaptureForTests"),p(resetCaptureForTests,"resetCaptureForTests");
@@ -1 +1 @@
1
- "use strict";var s=Object.defineProperty;var r=(e,t)=>s(e,"name",{value:t,configurable:!0});var u=Object.defineProperty,a=r((e,t)=>u(e,"name",{value:t,configurable:!0}),"r");export const CONTEXT_END=Symbol.for("lensmcp.contextEnd");export function attachContextEnd(e){let t=!1;const c=[];return Object.defineProperty(e,CONTEXT_END,{value:{get ended(){return t},onEnd(n){t?o(n):c.push(n)}}}),()=>{if(!t){t=!0;for(const n of c.splice(0))o(n)}}}r(attachContextEnd,"attachContextEnd"),a(attachContextEnd,"attachContextEnd");function o(e){try{e()}catch{}}r(o,"s"),a(o,"runListener");
1
+ "use strict";var f=Object.defineProperty;var r=(e,t)=>f(e,"name",{value:t,configurable:!0});var i=Object.defineProperty,c=r((e,t)=>i(e,"name",{value:t,configurable:!0}),"r"),s=Object.defineProperty,u=c((e,t)=>s(e,"name",{value:t,configurable:!0}),"r");export const CONTEXT_END=Symbol.for("lensmcp.contextEnd");export function attachContextEnd(e){let t=!1;const a=[];return Object.defineProperty(e,CONTEXT_END,{value:{get ended(){return t},onEnd(n){t?o(n):a.push(n)}}}),()=>{if(!t){t=!0;for(const n of a.splice(0))o(n)}}}r(attachContextEnd,"attachContextEnd"),c(attachContextEnd,"attachContextEnd"),u(attachContextEnd,"attachContextEnd");function o(e){try{e()}catch{}}r(o,"o"),c(o,"s"),u(o,"runListener");
package/lib/context.js CHANGED
@@ -1 +1 @@
1
- "use strict";var s=Object.defineProperty;var r=(e,n)=>s(e,"name",{value:n,configurable:!0});var S=Object.defineProperty,o=r((e,n)=>S(e,"name",{value:n,configurable:!0}),"o");import{AsyncLocalStorage as u}from"node:async_hooks";export const LENSMCP_CONTEXT_STORAGE=new u,DB_SECONDS_MAX=4096;export function countDbSecond(e,n){let t=e.dbSeconds;t||(e.dbSeconds=t=new Map);const c=Math.floor(n/1e3);t.set(c,(t.get(c)??0)+1),t.size>DB_SECONDS_MAX&&t.delete(t.keys().next().value)}r(countDbSecond,"countDbSecond"),o(countDbSecond,"countDbSecond");export function currentLensmcpContext(){return LENSMCP_CONTEXT_STORAGE.getStore()}r(currentLensmcpContext,"currentLensmcpContext"),o(currentLensmcpContext,"currentLensmcpContext");export const LENSMCP_SPAN_STORAGE=new u;export function currentSpanId(){return LENSMCP_SPAN_STORAGE.getStore()}r(currentSpanId,"currentSpanId"),o(currentSpanId,"currentSpanId");export function runInLensmcpContext(e,n){return LENSMCP_CONTEXT_STORAGE.run(e,n)}r(runInLensmcpContext,"runInLensmcpContext"),o(runInLensmcpContext,"runInLensmcpContext");
1
+ "use strict";var s=Object.defineProperty;var r=(e,n)=>s(e,"name",{value:n,configurable:!0});var S=Object.defineProperty,o=r((e,n)=>S(e,"name",{value:n,configurable:!0}),"r"),a=Object.defineProperty,c=o((e,n)=>a(e,"name",{value:n,configurable:!0}),"o");import{AsyncLocalStorage as p}from"node:async_hooks";export const LENSMCP_CONTEXT_STORAGE=new p,DB_SECONDS_MAX=4096;export function countDbSecond(e,n){let t=e.dbSeconds;t||(e.dbSeconds=t=new Map);const u=Math.floor(n/1e3);t.set(u,(t.get(u)??0)+1),t.size>DB_SECONDS_MAX&&t.delete(t.keys().next().value)}r(countDbSecond,"countDbSecond"),o(countDbSecond,"countDbSecond"),c(countDbSecond,"countDbSecond");export function currentLensmcpContext(){return LENSMCP_CONTEXT_STORAGE.getStore()}r(currentLensmcpContext,"currentLensmcpContext"),o(currentLensmcpContext,"currentLensmcpContext"),c(currentLensmcpContext,"currentLensmcpContext");export const LENSMCP_SPAN_STORAGE=new p;export function currentSpanId(){return LENSMCP_SPAN_STORAGE.getStore()}r(currentSpanId,"currentSpanId"),o(currentSpanId,"currentSpanId"),c(currentSpanId,"currentSpanId");export function runInLensmcpContext(e,n){return LENSMCP_CONTEXT_STORAGE.run(e,n)}r(runInLensmcpContext,"runInLensmcpContext"),o(runInLensmcpContext,"runInLensmcpContext"),c(runInLensmcpContext,"runInLensmcpContext");
package/lib/event-sink.js CHANGED
@@ -1,3 +1,3 @@
1
- "use strict";var d=Object.defineProperty;var a=(n,r)=>d(n,"name",{value:r,configurable:!0});var E=Object.defineProperty,i=a((n,r)=>E(n,"name",{value:r,configurable:!0}),"s");import{createSocket as v}from"node:dgram";import{connect as h}from"node:net";import{appendFileSync as k,closeSync as b,openSync as C,readFileSync as _,renameSync as g,statSync as p,unlinkSync as L}from"node:fs";import{dirname as N,join as w}from"node:path";import{boundedClone as F,createEventFloodGuard as M,DEFAULT_RAW_BYTE_LIMIT as P}from"@lensmcp/protocol-types";import{busCapsFromEnv as O,createBusRotator as T}from"@lensmcp/core/bus-rotation";import{CAPTURE_FILE_NAME as B,createCaptureOff as I}from"@lensmcp/core/capture-off";export function defaultEventSink(){const n=process.env.LENSMCP_EVENT_FILE;if(n){const t=M({burst:30,perSec:5}),s=y(n),c=I(()=>w(N(n),B),{statSync:p,readFileSync:_});return o=>{const u=o.raw;if(c(o.source,u?.kind)||c.part(typeof u?.project=="string"?u.project:process.env.LENSMCP_PROJECT,"observe"))return;const f=t.admit(String(o.fingerprint??""));if(!f.ok)return;const l=S(o,f.suppressed);if(l)try{s(Buffer.byteLength(l)),k(n,l)}catch{}}}const r=process.env.LENSMCP_UDS;if(r)return m(r);const e=process.env.LENSMCP_IPC_SOCKET;if(e){const[t,s]=e.split(":");if(t&&s){const c=Number(s),o=v("udp4");return o.unref(),u=>{try{const f=Buffer.from(JSON.stringify(u));o.send(f,c,t,()=>{})}catch{}}}}return t=>{(t.severity==="error"||t.severity==="fatal")&&console.warn(`[lensmcp] ${t.severity}: ${t.title}`)}}a(defaultEventSink,"defaultEventSink"),i(defaultEventSink,"defaultEventSink");function S(n,r){try{const e=F(n.raw,{rawByteLimit:P}).value,t={...n,raw:e};return r>0&&(t.floodSuppressed=r),JSON.stringify(t)+`
2
- `}catch{return}}a(S,"B"),i(S,"serializeBounded");const R={statSync:p,renameSync:g,unlinkSync:L,openSync:C,closeSync:b};function y(n){return T(n,{...O(),fs:R})}a(y,"T"),i(y,"busRotator");export function inMemorySink(){const n=[];return{sink:i(r=>n.push(r),"sink"),events:n}}a(inMemorySink,"inMemorySink"),i(inMemorySink,"inMemorySink");function m(n){const r=[];let e=null,t=!1;const s=i(()=>{if(!(!e||!e.writable))for(;r.length>0;)e.write(r.shift())},"flush"),c=i(()=>{if(t||e)return;t=!0;const o=h(n);o.on("connect",()=>{t=!1,e=o,s()}),o.on("drain",s),o.on("error",()=>{t=!1,e=null}),o.on("close",()=>{e=null}),o.unref()},"open");return c(),o=>{for(r.push(JSON.stringify(o)+`
3
- `);r.length>1e4;)r.shift();if(e&&e.writable){s();return}if(e){try{e.destroy()}catch{}e=null}c()}}a(m,"O"),i(m,"udsEventSink");
1
+ "use strict";var v=Object.defineProperty;var a=(e,n)=>v(e,"name",{value:n,configurable:!0});var E=Object.defineProperty,u=a((e,n)=>E(e,"name",{value:n,configurable:!0}),"a"),k=Object.defineProperty,i=u((e,n)=>k(e,"name",{value:n,configurable:!0}),"s");import{createSocket as b}from"node:dgram";import{connect as h}from"node:net";import{appendFileSync as g,closeSync as C,openSync as _,readFileSync as L,renameSync as N,statSync as d,unlinkSync as M}from"node:fs";import{dirname as O,join as P}from"node:path";import{boundedClone as w,createEventFloodGuard as F,DEFAULT_RAW_BYTE_LIMIT as T}from"@lensmcp/protocol-types";import{busCapsFromEnv as B,createBusRotator as I}from"@lensmcp/core/bus-rotation";import{CAPTURE_FILE_NAME as R,createCaptureOff as j}from"@lensmcp/core/capture-off";export function defaultEventSink(){const e=process.env.LENSMCP_EVENT_FILE;if(e){const t=F({burst:30,perSec:5}),o=y(e),c=j(()=>P(O(e),R),{statSync:d,readFileSync:L});return s=>{const f=s.raw;if(c(s.source,f?.kind)||c.part(typeof f?.project=="string"?f.project:process.env.LENSMCP_PROJECT,"observe"))return;const l=t.admit(String(s.fingerprint??""));if(!l.ok)return;const p=S(s,l.suppressed);if(p)try{o(Buffer.byteLength(p)),g(e,p)}catch{}}}const n=process.env.LENSMCP_UDS;if(n)return m(n);const r=process.env.LENSMCP_IPC_SOCKET;if(r){const[t,o]=r.split(":");if(t&&o){const c=Number(o),s=b("udp4");return s.unref(),f=>{try{const l=Buffer.from(JSON.stringify(f));s.send(l,c,t,()=>{})}catch{}}}}return t=>{(t.severity==="error"||t.severity==="fatal")&&console.warn(`[lensmcp] ${t.severity}: ${t.title}`)}}a(defaultEventSink,"defaultEventSink"),u(defaultEventSink,"defaultEventSink"),i(defaultEventSink,"defaultEventSink");function S(e,n){try{const r=w(e.raw,{rawByteLimit:T}).value,t={...e,raw:r};return n>0&&(t.floodSuppressed=n),JSON.stringify(t)+`
2
+ `}catch{return}}a(S,"S"),u(S,"B"),i(S,"serializeBounded");const A={statSync:d,renameSync:N,unlinkSync:M,openSync:_,closeSync:C};function y(e){return I(e,{...B(),fs:A})}a(y,"y"),u(y,"T"),i(y,"busRotator");export function inMemorySink(){const e=[];return{sink:i(n=>e.push(n),"sink"),events:e}}a(inMemorySink,"inMemorySink"),u(inMemorySink,"inMemorySink"),i(inMemorySink,"inMemorySink");function m(e){const n=[];let r=null,t=!1;const o=i(()=>{if(!(!r||!r.writable))for(;n.length>0;)r.write(n.shift())},"flush"),c=i(()=>{if(t||r)return;t=!0;const s=h(e);s.on("connect",()=>{t=!1,r=s,o()}),s.on("drain",o),s.on("error",()=>{t=!1,r=null}),s.on("close",()=>{r=null}),s.unref()},"open");return c(),s=>{for(n.push(JSON.stringify(s)+`
3
+ `);n.length>1e4;)n.shift();if(r&&r.writable){o();return}if(r){try{r.destroy()}catch{}r=null}c()}}a(m,"m"),u(m,"O"),i(m,"udsEventSink");
package/lib/flow-start.js CHANGED
@@ -1 +1 @@
1
- "use strict";var a=Object.defineProperty;var r=(t,e)=>a(t,"name",{value:e,configurable:!0});var o=Object.defineProperty,c=r((t,e)=>o(t,"name",{value:e,configurable:!0}),"e");export const FLOW_START=Symbol.for("lensmcp.flowStart");export function attachFlowStart(t,e){Object.defineProperty(t,FLOW_START,{value:e})}r(attachFlowStart,"attachFlowStart"),c(attachFlowStart,"attachFlowStart");
1
+ "use strict";var o=Object.defineProperty;var a=(t,e)=>o(t,"name",{value:e,configurable:!0});var c=Object.defineProperty,r=a((t,e)=>c(t,"name",{value:e,configurable:!0}),"r"),l=Object.defineProperty,n=r((t,e)=>l(t,"name",{value:e,configurable:!0}),"e");export const FLOW_START=Symbol.for("lensmcp.flowStart");export function attachFlowStart(t,e){Object.defineProperty(t,FLOW_START,{value:e})}a(attachFlowStart,"attachFlowStart"),r(attachFlowStart,"attachFlowStart"),n(attachFlowStart,"attachFlowStart");
package/lib/instrument.js CHANGED
@@ -1 +1 @@
1
- "use strict";var K=Object.defineProperty;var m=(e,r)=>K(e,"name",{value:r,configurable:!0});var U=Object.defineProperty,c=m((e,r)=>U(e,"name",{value:r,configurable:!0}),"d");import{fingerprint as j,ulid as x}from"@lensmcp/core";import{redactText as A}from"@lensmcp/core/redact";import{captureFor as X,capturedValue as P}from"./capture.js";import{countDbSecond as Y,currentLensmcpContext as Z,currentSpanId as tt,LENSMCP_SPAN_STORAGE as et}from"./context.js";import{activeOptions as ot}from"./state.js";import{performance as B}from"node:perf_hooks";export const LENSMCP_TRACED=Symbol.for("@lensmcp/nest-instrumentation/traced"),LENSMCP_IGNORE=Symbol.for("@lensmcp/nest-instrumentation/ignore");const E=300,rt=2e3;function _(e,r,i,u){if(!e)return;const b=Math.floor(r/1e3),f=Math.floor(i/1e3);let n=0,d=0;for(const[I,y]of e)I<b||I>f||(n+=y,d=Math.max(d,y+(I<f?e.get(I+1)??0:0)));return n>=u?Math.min(u,d):void 0}m(_,"tt"),c(_,"dbBurstOf");function G(e){if(e instanceof Error){const i=e.code,u=A(e.message??"");return{name:e.name||e.constructor?.name||"Error",...u?{message:u.length>E?`${u.slice(0,E)}\u2026`:u}:{},...typeof i=="string"&&i.length<=64?{code:i}:{}}}const r=typeof e=="string"?A(e):void 0;return{name:e==null?"nothing":typeof e=="object"?"non-Error object":`non-Error ${typeof e}`,...r?{message:r.slice(0,E)}:{}}}m(G,"et"),c(G,"thrownOf");export function LensmcpIgnore(){return((e,r)=>{if(r===void 0)e[LENSMCP_IGNORE]=!0;else{const i=e[r];typeof i=="function"&&(i[LENSMCP_IGNORE]=!0)}})}m(LensmcpIgnore,"LensmcpIgnore"),c(LensmcpIgnore,"LensmcpIgnore");export function isTraced(e){return typeof e=="function"&&!!e[LENSMCP_TRACED]}m(isTraced,"isTraced"),c(isTraced,"isTraced");export function isIgnored(e){return!!e&&(typeof e=="function"||typeof e=="object")&&!!e[LENSMCP_IGNORE]}m(isIgnored,"isIgnored"),c(isIgnored,"isIgnored");export function traceWrap(e,r,i={}){if(isTraced(e))return e;const u=i.db??!1,b=c(function(...f){let n;try{n=ot()}catch{return e.apply(this,f)}if(!n.trace.services)return e.apply(this,f);const d=Date.now();let I=d,y=0;const t=Z(),v=x(),S=tt(),W=t?.dbCallCount??0,F=t?.redisCallCount??0,Q=t?.externalCallCount??0,V=t?.loopDbCalls??0,z=t?.loopRedisCalls??0,H=t?.loopExternalCalls??0,w=i.capture??X(r),$=w==="args"||w==="both"?P(f):void 0,q=c((o,a,h)=>{const s=Date.now()-d;if(o==="ok"&&!i.explicit&&w===void 0&&!t?.flowId&&!t?.requestId&&!t?.runId&&s<n.trace.flowlessMinMs)return;const l={id:x(),sessionId:n.sessionId,timestamp:Date.now(),source:"nestjs",category:"backend",severity:o==="error"?"error":"info",context:{sessionId:n.sessionId,flowId:t?.flowId,requestId:t?.requestId,...t?.runId?{runId:t.runId}:{}},fingerprint:j({kind:"method-call",identity:r}),title:`${r} (${s}ms)${o==="error"?" \u2717":""}`,message:a instanceof Error?a.message:void 0,raw:{kind:"span",...n.projectName?{project:n.projectName}:{},span:{name:r,spanId:v,...S?{parentSpanId:S}:{},flowId:t?.flowId,requestId:t?.requestId,startTime:d,endTime:Date.now(),durationMs:s,syncStartedAt:I,syncDurationMs:y,status:o,outcome:o==="error"?"threw":"returned",...o==="error"?{error:G(a)}:{},...$!==void 0?{args:$}:{},...o==="ok"&&(w==="result"||w==="both")?{result:P(h)}:{}}}};n.emit(l)},"emitSpan"),k=c(()=>{const o=Date.now();t&&(t.dbCallCount=(t.dbCallCount??0)+1,Y(t,o)),n.emit({id:x(),sessionId:n.sessionId,timestamp:Date.now(),source:"db",category:"db",severity:"info",context:{sessionId:n.sessionId,flowId:t?.flowId,requestId:t?.requestId,...t?.runId?{runId:t.runId}:{}},fingerprint:j({kind:"db-query",identity:r}),title:`query ${r}`,raw:{kind:"db-query",...n.projectName?{project:n.projectName}:{},query:{signature:r},startedAt:d,durationMs:o-d,span:{parentSpanId:v}}})},"emitDbQuery"),N=c(()=>{if(u||!t)return;const o=(t.dbCallCount??0)-W,a=(t.redisCallCount??0)-F,h=(t.externalCallCount??0)-Q,s=Math.max(0,o-((t.loopDbCalls??0)-V)),l=Math.max(0,a-((t.loopRedisCalls??0)-z)),p=Math.max(0,h-((t.loopExternalCalls??0)-H));if(s<3&&l<3&&p<3)return;const R=Date.now(),D=R-d,C=s>=3&&D>=rt?_(t.dbSeconds,d,R,s):void 0,M=t.isStream?.()===!0,J=M&&C!==void 0&&C<3&&l<3&&p<3,g=[];s>=3&&g.push(M&&C!==void 0?`${s} DB calls over ${Math.round(D/1e3)} s of a stream, at most ${C} within two seconds`:`${s} DB calls`),l>=3&&g.push(`${l} redis calls`),p>=3&&g.push(`${p} external calls`),s>=3&&(t.loopDbCalls=(t.loopDbCalls??0)+s),l>=3&&(t.loopRedisCalls=(t.loopRedisCalls??0)+l),p>=3&&(t.loopExternalCalls=(t.loopExternalCalls??0)+p);const T=o-s+(a-l)+(h-p);n.emit({id:x(),sessionId:n.sessionId,timestamp:Date.now(),source:"nestjs",category:"backend",severity:J?"info":"warning",context:{sessionId:n.sessionId,flowId:t.flowId,requestId:t.requestId,...t.runId?{runId:t.runId}:{}},fingerprint:j({kind:"loop",identity:r}),title:`loop in ${r} (${g.join(", ")})`,raw:{kind:"loop",...n.projectName?{project:n.projectName}:{},loop:{iterations:Math.max(s,l,p),durationMs:D,startedAt:d,dbCallsInsideLoop:s,redisCallsInsideLoop:l,externalCallsInsideLoop:p,awaitedOperationsInsideLoop:s+l+p,...C!==void 0?{dbBurst:C}:{},...M?{stream:!0}:{},...T>0?{reportedBeneath:T}:{}}}})},"emitLoopIfNeeded"),L=c(o=>{u&&k(),q("ok",void 0,o),N()},"onOk"),O=c(o=>{u&&k(),q("error",o),N()},"onErr");try{const o=et.run(v,()=>{I=Date.now();const a=B.now();try{return e.apply(this,f)}finally{y=Math.round((B.now()-a)*100)/100}});return o instanceof Promise?o.then(a=>(L(a),a),a=>{throw O(a),a}):(L(o),o)}catch(o){throw O(o),o}},"wrapped");return b[LENSMCP_TRACED]=!0,b}m(traceWrap,"traceWrap"),c(traceWrap,"traceWrap");
1
+ "use strict";var U=Object.defineProperty;var m=(e,r)=>U(e,"name",{value:r,configurable:!0});var X=Object.defineProperty,y=m((e,r)=>X(e,"name",{value:r,configurable:!0}),"m"),Y=Object.defineProperty,c=y((e,r)=>Y(e,"name",{value:r,configurable:!0}),"d");import{fingerprint as E,ulid as v}from"@lensmcp/core";import{redactText as _}from"@lensmcp/core/redact";import{captureFor as Z,capturedValue as W}from"./capture.js";import{countDbSecond as tt,currentLensmcpContext as et,currentSpanId as ot,LENSMCP_SPAN_STORAGE as rt}from"./context.js";import{activeOptions as nt}from"./state.js";import{performance as G}from"node:perf_hooks";export const LENSMCP_TRACED=Symbol.for("@lensmcp/nest-instrumentation/traced"),LENSMCP_IGNORE=Symbol.for("@lensmcp/nest-instrumentation/ignore");const S=300,st=2e3;function $(e,r,i,u){if(!e)return;const g=Math.floor(r/1e3),f=Math.floor(i/1e3);let n=0,d=0;for(const[I,b]of e)I<g||I>f||(n+=b,d=Math.max(d,b+(I<f?e.get(I+1)??0:0)));return n>=u?Math.min(u,d):void 0}m($,"_"),y($,"tt"),c($,"dbBurstOf");function q(e){if(e instanceof Error){const i=e.code,u=_(e.message??"");return{name:e.name||e.constructor?.name||"Error",...u?{message:u.length>S?`${u.slice(0,S)}\u2026`:u}:{},...typeof i=="string"&&i.length<=64?{code:i}:{}}}const r=typeof e=="string"?_(e):void 0;return{name:e==null?"nothing":typeof e=="object"?"non-Error object":`non-Error ${typeof e}`,...r?{message:r.slice(0,S)}:{}}}m(q,"G"),y(q,"et"),c(q,"thrownOf");export function LensmcpIgnore(){return((e,r)=>{if(r===void 0)e[LENSMCP_IGNORE]=!0;else{const i=e[r];typeof i=="function"&&(i[LENSMCP_IGNORE]=!0)}})}m(LensmcpIgnore,"LensmcpIgnore"),y(LensmcpIgnore,"LensmcpIgnore"),c(LensmcpIgnore,"LensmcpIgnore");export function isTraced(e){return typeof e=="function"&&!!e[LENSMCP_TRACED]}m(isTraced,"isTraced"),y(isTraced,"isTraced"),c(isTraced,"isTraced");export function isIgnored(e){return!!e&&(typeof e=="function"||typeof e=="object")&&!!e[LENSMCP_IGNORE]}m(isIgnored,"isIgnored"),y(isIgnored,"isIgnored"),c(isIgnored,"isIgnored");export function traceWrap(e,r,i={}){if(isTraced(e))return e;const u=i.db??!1,g=c(function(...f){let n;try{n=nt()}catch{return e.apply(this,f)}if(!n.trace.services)return e.apply(this,f);const d=Date.now();let I=d,b=0;const t=et(),D=v(),k=ot(),F=t?.dbCallCount??0,Q=t?.redisCallCount??0,V=t?.externalCallCount??0,z=t?.loopDbCalls??0,H=t?.loopRedisCalls??0,J=t?.loopExternalCalls??0,w=i.capture??Z(r),L=w==="args"||w==="both"?W(f):void 0,N=c((o,a,h)=>{const s=Date.now()-d;if(o==="ok"&&!i.explicit&&w===void 0&&!t?.flowId&&!t?.requestId&&!t?.runId&&s<n.trace.flowlessMinMs)return;const l={id:v(),sessionId:n.sessionId,timestamp:Date.now(),source:"nestjs",category:"backend",severity:o==="error"?"error":"info",context:{sessionId:n.sessionId,flowId:t?.flowId,requestId:t?.requestId,...t?.runId?{runId:t.runId}:{}},fingerprint:E({kind:"method-call",identity:r}),title:`${r} (${s}ms)${o==="error"?" \u2717":""}`,message:a instanceof Error?a.message:void 0,raw:{kind:"span",...n.projectName?{project:n.projectName}:{},span:{name:r,spanId:D,...k?{parentSpanId:k}:{},flowId:t?.flowId,requestId:t?.requestId,startTime:d,endTime:Date.now(),durationMs:s,syncStartedAt:I,syncDurationMs:b,status:o,outcome:o==="error"?"threw":"returned",...o==="error"?{error:q(a)}:{},...L!==void 0?{args:L}:{},...o==="ok"&&(w==="result"||w==="both")?{result:W(h)}:{}}}};n.emit(l)},"emitSpan"),O=c(()=>{const o=Date.now();t&&(t.dbCallCount=(t.dbCallCount??0)+1,tt(t,o)),n.emit({id:v(),sessionId:n.sessionId,timestamp:Date.now(),source:"db",category:"db",severity:"info",context:{sessionId:n.sessionId,flowId:t?.flowId,requestId:t?.requestId,...t?.runId?{runId:t.runId}:{}},fingerprint:E({kind:"db-query",identity:r}),title:`query ${r}`,raw:{kind:"db-query",...n.projectName?{project:n.projectName}:{},query:{signature:r},startedAt:d,durationMs:o-d,span:{parentSpanId:D}}})},"emitDbQuery"),T=c(()=>{if(u||!t)return;const o=(t.dbCallCount??0)-F,a=(t.redisCallCount??0)-Q,h=(t.externalCallCount??0)-V,s=Math.max(0,o-((t.loopDbCalls??0)-z)),l=Math.max(0,a-((t.loopRedisCalls??0)-H)),p=Math.max(0,h-((t.loopExternalCalls??0)-J));if(s<3&&l<3&&p<3)return;const A=Date.now(),M=A-d,C=s>=3&&M>=st?$(t.dbSeconds,d,A,s):void 0,j=t.isStream?.()===!0,K=j&&C!==void 0&&C<3&&l<3&&p<3,x=[];s>=3&&x.push(j&&C!==void 0?`${s} DB calls over ${Math.round(M/1e3)} s of a stream, at most ${C} within two seconds`:`${s} DB calls`),l>=3&&x.push(`${l} redis calls`),p>=3&&x.push(`${p} external calls`),s>=3&&(t.loopDbCalls=(t.loopDbCalls??0)+s),l>=3&&(t.loopRedisCalls=(t.loopRedisCalls??0)+l),p>=3&&(t.loopExternalCalls=(t.loopExternalCalls??0)+p);const B=o-s+(a-l)+(h-p);n.emit({id:v(),sessionId:n.sessionId,timestamp:Date.now(),source:"nestjs",category:"backend",severity:K?"info":"warning",context:{sessionId:n.sessionId,flowId:t.flowId,requestId:t.requestId,...t.runId?{runId:t.runId}:{}},fingerprint:E({kind:"loop",identity:r}),title:`loop in ${r} (${x.join(", ")})`,raw:{kind:"loop",...n.projectName?{project:n.projectName}:{},loop:{iterations:Math.max(s,l,p),durationMs:M,startedAt:d,dbCallsInsideLoop:s,redisCallsInsideLoop:l,externalCallsInsideLoop:p,awaitedOperationsInsideLoop:s+l+p,...C!==void 0?{dbBurst:C}:{},...j?{stream:!0}:{},...B>0?{reportedBeneath:B}:{}}}})},"emitLoopIfNeeded"),P=c(o=>{u&&O(),N("ok",void 0,o),T()},"onOk"),R=c(o=>{u&&O(),N("error",o),T()},"onErr");try{const o=rt.run(D,()=>{I=Date.now();const a=G.now();try{return e.apply(this,f)}finally{b=Math.round((G.now()-a)*100)/100}});return o instanceof Promise?o.then(a=>(P(a),a),a=>{throw R(a),a}):(P(o),o)}catch(o){throw R(o),o}},"wrapped");return g[LENSMCP_TRACED]=!0,g}m(traceWrap,"traceWrap"),y(traceWrap,"traceWrap"),c(traceWrap,"traceWrap");
@@ -1 +1 @@
1
- "use strict";var n=Object.defineProperty;var r=(e,t)=>n(e,"name",{value:t,configurable:!0});var i=Object.defineProperty,a=r((e,t)=>i(e,"name",{value:t,configurable:!0}),"m");import{__decorate as l}from"tslib";import{Module as u}from"@nestjs/common";import{NestFactory as d}from"@nestjs/core";import{LensmcpModule as f}from"./lensmcp.module.js";export async function createLensmcpNestApp(e,t={}){const{nestOptions:p,projectName:c,...s}=t,m=f.forRoot({projectName:c??process.env.LENSMCP_PROJECT??"app",...s,trace:{autoInstrumentMethods:!0,...s.trace},memory:{mode:"light",scope:"all",...s.memory}});let o=class{static{r(this,"e")}static{a(this,"LensmcpRootModule")}};return o=l([u({imports:[m,e]})],o),o[Symbol.for("lensmcp.wrappedRoot")]=!0,d.create(o,p)}r(createLensmcpNestApp,"createLensmcpNestApp"),a(createLensmcpNestApp,"createLensmcpNestApp");
1
+ "use strict";var i=Object.defineProperty;var r=(e,t)=>i(e,"name",{value:t,configurable:!0});var l=Object.defineProperty,a=r((e,t)=>l(e,"name",{value:t,configurable:!0}),"r"),u=Object.defineProperty,c=a((e,t)=>u(e,"name",{value:t,configurable:!0}),"m");import{__decorate as f}from"tslib";import{Module as d}from"@nestjs/common";import{NestFactory as y}from"@nestjs/core";import{LensmcpModule as N}from"./lensmcp.module.js";export async function createLensmcpNestApp(e,t={}){const{nestOptions:p,projectName:m,...s}=t,n=N.forRoot({projectName:m??process.env.LENSMCP_PROJECT??"app",...s,trace:{autoInstrumentMethods:!0,...s.trace},memory:{mode:"light",scope:"all",...s.memory}});let o=class{static{r(this,"o")}static{a(this,"e")}static{c(this,"LensmcpRootModule")}};return o=f([d({imports:[n,e]})],o),o[Symbol.for("lensmcp.wrappedRoot")]=!0,y.create(o,p)}r(createLensmcpNestApp,"createLensmcpNestApp"),a(createLensmcpNestApp,"createLensmcpNestApp"),c(createLensmcpNestApp,"createLensmcpNestApp");
@@ -1 +1 @@
1
- "use strict";var m=Object.defineProperty;var t=(o,r)=>m(o,"name",{value:r,configurable:!0});var d=Object.defineProperty,n=t((o,r)=>d(o,"name",{value:r,configurable:!0}),"t"),s;import{__decorate as a}from"tslib";import{Module as c}from"@nestjs/common";import{APP_INTERCEPTOR as p}from"@nestjs/core";import{configureMemoryTracker as f}from"@lensmcp/memory-tracker";import{TraceInterceptor as u}from"./trace-interceptor.js";import{LensmcpProviderTracker as I}from"./provider-tracker.js";import{setActiveOptions as l}from"./state.js";import{currentLensmcpContext as v}from"./context.js";let i=s=class{static{t(this,"s")}static{n(this,"LensmcpModule")}static forRoot(o){const r=l(o);return r.memory.mode!=="off"&&f({sessionId:r.sessionId,sink:r.emit,contextGetter:n(()=>{const e=v();if(e)return{sessionId:e.sessionId,flowId:e.flowId,requestId:e.requestId,...e.runId?{runId:e.runId}:{},originNodeId:e.originNodeId}},"contextGetter")}),{module:s,providers:[{provide:p,useClass:u},I],exports:[],global:!0}}};i=s=a([c({})],i);export{i as LensmcpModule};
1
+ "use strict";var m=Object.defineProperty;var t=(r,e)=>m(r,"name",{value:e,configurable:!0});var d=Object.defineProperty,n=t((r,e)=>d(r,"name",{value:e,configurable:!0}),"t"),c=Object.defineProperty,a=n((r,e)=>c(r,"name",{value:e,configurable:!0}),"t"),s;import{__decorate as p}from"tslib";import{Module as f}from"@nestjs/common";import{APP_INTERCEPTOR as u}from"@nestjs/core";import{configureMemoryTracker as l}from"@lensmcp/memory-tracker";import{TraceInterceptor as I}from"./trace-interceptor.js";import{LensmcpProviderTracker as v}from"./provider-tracker.js";import{setActiveOptions as g}from"./state.js";import{currentLensmcpContext as P}from"./context.js";let i=s=class{static{t(this,"s")}static{n(this,"s")}static{a(this,"LensmcpModule")}static forRoot(r){const e=g(r);return e.memory.mode!=="off"&&l({sessionId:e.sessionId,sink:e.emit,contextGetter:a(()=>{const o=P();if(o)return{sessionId:o.sessionId,flowId:o.flowId,requestId:o.requestId,...o.runId?{runId:o.runId}:{},originNodeId:o.originNodeId}},"contextGetter")}),{module:s,providers:[{provide:u,useClass:I},v],exports:[],global:!0}}};i=s=p([f({})],i);export{i as LensmcpModule};
package/lib/next-hop.js CHANGED
@@ -1 +1 @@
1
- "use strict";var p=Object.defineProperty;var n=(r,e)=>p(r,"name",{value:e,configurable:!0});var s=Object.defineProperty,u=n((r,e)=>s(r,"name",{value:e,configurable:!0}),"o");import{currentLensmcpContext as c}from"./context.js";export function nextHopHeaders(r={}){const e=c();if(!e)return{};const o=r.requestHeader??"x-request-id",d=r.parentHeader??"x-lensmcp-parent-request-id",a=r.flowHeader??"x-lensmcp-flow-id",i=r.originHeader??"x-lensmcp-origin-node-id",t={};return e.requestId&&(e.hopCount=(e.hopCount??0)+1,t[o]=`${e.requestId}.${e.hopCount}`,t[d]=e.requestId),e.flowId&&(t[a]=e.flowId),e.originNodeId&&(t[i]=e.originNodeId),e.traceparent&&(t.traceparent=e.traceparent),t}n(nextHopHeaders,"nextHopHeaders"),u(nextHopHeaders,"nextHopHeaders");
1
+ "use strict";var s=Object.defineProperty;var n=(r,e)=>s(r,"name",{value:e,configurable:!0});var u=Object.defineProperty,o=n((r,e)=>u(r,"name",{value:e,configurable:!0}),"n"),c=Object.defineProperty,f=o((r,e)=>c(r,"name",{value:e,configurable:!0}),"o");import{currentLensmcpContext as l}from"./context.js";export function nextHopHeaders(r={}){const e=l();if(!e)return{};const a=r.requestHeader??"x-request-id",d=r.parentHeader??"x-lensmcp-parent-request-id",i=r.flowHeader??"x-lensmcp-flow-id",p=r.originHeader??"x-lensmcp-origin-node-id",t={};return e.requestId&&(e.hopCount=(e.hopCount??0)+1,t[a]=`${e.requestId}.${e.hopCount}`,t[d]=e.requestId),e.flowId&&(t[i]=e.flowId),e.originNodeId&&(t[p]=e.originNodeId),e.traceparent&&(t.traceparent=e.traceparent),t}n(nextHopHeaders,"nextHopHeaders"),o(nextHopHeaders,"nextHopHeaders"),f(nextHopHeaders,"nextHopHeaders");
@@ -1 +1 @@
1
- "use strict";var A=Object.defineProperty;var f=(e,t)=>A(e,"name",{value:t,configurable:!0});var T=Object.defineProperty,u=f((e,t)=>T(e,"name",{value:t,configurable:!0}),"l");import{__decorate as k,__metadata as D}from"tslib";import{Injectable as L}from"@nestjs/common";import{ModuleRef as C}from"@nestjs/core";import{fingerprint as _,ulid as B}from"@lensmcp/core";import{trackContainer as Q}from"@lensmcp/memory-tracker";import{activeOptions as g,currentGeneration as j}from"./state.js";import{readTraceProvider as G}from"./trace-provider.js";import{traceWrap as O,isTraced as S,isIgnored as v}from"./instrument.js";const w=new Set(["constructor","onModuleInit","onApplicationBootstrap","onModuleDestroy","beforeApplicationShutdown","onApplicationShutdown"]),U={DataSource:new Set(["findMetadata","getMetadata","hasMetadata","getRepository","getTreeRepository","getMongoRepository","createQueryBuilder","createEntityManager","createQueryRunner","defaultReplicationModeForReads"]),EntityManager:new Set(["getRepository","getTreeRepository","getCustomRepository","createQueryBuilder"]),Reflector:new Set(["get","getAll","getAllAndOverride","getAllAndMerge"])};function h(e,t){let o=!0;try{o=g().trace.suppressNoiseMethods}catch{}return o?U[e]?.has(t)??!1:!1}f(h,"$"),u(h,"isNoiseMethod");const b=/^(_|Object|String|Number|Array|Promise|Function|RegExp|Map|Set)$/,P=Symbol.for("@lensmcp/nest-instrumentation/proto-wrapped");let I=class{static{f(this,"I")}static{u(this,"LensmcpProviderTracker")}constructor(e){this.moduleRef=e,this.active=new Map}onApplicationBootstrap(){const e=g(),t=j(),o=this.moduleRef.container;if(o?.getModules)for(const[,n]of o.getModules()){const i=n?.controllers;i&&typeof i.forEach=="function"&&i.forEach(r=>{const s=r?.instance;if(!s||typeof s!="object")return;const p=s.constructor,a=p?.name;if(!a||b.test(a))return;const l=`nest:controller:${a}`,d=`${a}#gen${t}#${M(`${a}:${t}`)}`;this.active.set(l,d),e.emit(y({logicalId:l,instanceId:d,generation:t,module:n?.metatype?.name,scope:m(r?.scope),lifecycle:"active"})),e.trace.autoInstrumentMethods&&p&&$(s,p,a)});const c=n?.providers;!c||typeof c.forEach!="function"||c.forEach(r=>{const s=r?.instance;if(m(r?.scope)!=="SINGLETON"){this.trackScopedProvider(r,n,t,e);return}if(!s||typeof s!="object")return;const p=s.constructor,a=p?.name;if(!a||b.test(a))return;const l=`nest:provider:${a}`,d=`${a}#gen${t}#${M(`${a}:${t}`)}`;if(this.active.set(l,d),e.emit(y({logicalId:l,instanceId:d,generation:t,module:n?.metatype?.name,scope:m(r?.scope),lifecycle:"active"})),e.memory.mode!=="off"){const R=G(p);(e.memory.scope==="all"||(R?.memory??!1))&&E(s,d)}e.trace.autoInstrumentMethods&&p&&$(s,p,a)})}}onModuleDestroy(){const e=g(),t=j();for(const[o,n]of this.active)e.emit(y({logicalId:o,instanceId:n,generation:t,lifecycle:"disposed"}))}trackScopedProvider(e,t,o,n){let i;if(typeof e?.metatype=="function"?i=e.metatype:e?.instance&&typeof e.instance=="object"&&(i=e.instance.constructor),typeof i!="function")return;const c=i;if(!c.prototype)return;const r=c.name;if(!r||b.test(r))return;const s=m(e?.scope),p=`nest:provider:${r}`,a=`${r}#gen${o}#${s.toLowerCase()}`;this.active.has(p)||this.active.set(p,a),n.emit(y({logicalId:p,instanceId:a,generation:o,module:t?.metatype?.name,scope:s,lifecycle:"active"})),n.trace.autoInstrumentMethods&&N(c,r)}};I=k([L(),D("design:paramtypes",[C])],I);export{I as LensmcpProviderTracker};function m(e){return e===1||e==="TRANSIENT"?"TRANSIENT":e===2||e==="REQUEST"?"REQUEST":"SINGLETON"}f(m,"g"),u(m,"scopeLabel");function y(e){const t=g();return{id:B(),sessionId:t.sessionId,timestamp:Date.now(),source:"nestjs",category:"backend",severity:"info",context:{sessionId:t.sessionId},fingerprint:_({kind:"nest-provider",identity:e.logicalId}),title:`Nest provider ${e.logicalId} ${e.lifecycle}`,raw:{kind:"singleton-instance",...t.projectName?{project:t.projectName}:{},provider:{...e,createdAt:Date.now()}}}}f(y,"h"),u(y,"makeProviderEvent");function M(e){let t=5381;for(let o=0;o<e.length;o++)t=(t<<5)+t+e.charCodeAt(o)|0;return(t>>>0).toString(16).slice(0,6)}f(M,"P"),u(M,"shortHash");function E(e,t){for(const o of Object.keys(e)){const n=e[o];(n instanceof Map||n instanceof Set||Array.isArray(n))&&Q({ownerInstanceId:t,fieldName:o,container:n})}}f(E,"Q"),u(E,"trackProviderContainers");function $(e,t,o){if(v(t))return;const n=Object.getPrototypeOf(e);if(!(!n||n===Object.prototype))for(const i of Object.getOwnPropertyNames(n)){if(w.has(i)||h(o,i))continue;const c=Object.getOwnPropertyDescriptor(n,i);if(!c||typeof c.value!="function"||c.get||c.set)continue;const r=c.value;if(S(r)||v(r))continue;const s=O(r,`${o}.${i}`);try{Object.defineProperty(e,i,{value:s,writable:!0,enumerable:!1,configurable:!0})}catch{}}}f($,"N"),u($,"autoInstrumentProviderMethods");function N(e,t){if(v(e))return;const o=e.prototype;if(!o||o===Object.prototype)return;const n=o;if(n[P])return;const i=[];for(const c of Object.getOwnPropertyNames(o)){if(w.has(c)||h(t,c))continue;const r=Object.getOwnPropertyDescriptor(o,c);if(!r||typeof r.value!="function"||r.get||r.set)continue;const s=r.value;if(S(s)||v(s))continue;const p=O(s,`${t}.${c}`);try{Object.defineProperty(o,c,{value:p,writable:!0,enumerable:!1,configurable:!0}),i.push(c)}catch{}}n[P]=!0,process.env.LENSMCP_DEBUG&&console.error(`[lensmcp] proto-wrapped ${t}: [${i.join(", ")}]`)}f(N,"U"),u(N,"autoInstrumentPrototypeMethods");
1
+ "use strict";var T=Object.defineProperty;var f=(e,t)=>T(e,"name",{value:t,configurable:!0});var k=Object.defineProperty,u=f((e,t)=>k(e,"name",{value:t,configurable:!0}),"f"),D=Object.defineProperty,l=u((e,t)=>D(e,"name",{value:t,configurable:!0}),"l");import{__decorate as L,__metadata as C}from"tslib";import{Injectable as Q}from"@nestjs/common";import{ModuleRef as _}from"@nestjs/core";import{fingerprint as B,ulid as G}from"@lensmcp/core";import{trackContainer as U}from"@lensmcp/memory-tracker";import{activeOptions as v,currentGeneration as S}from"./state.js";import{readTraceProvider as x}from"./trace-provider.js";import{traceWrap as w,isTraced as N,isIgnored as h}from"./instrument.js";const E=new Set(["constructor","onModuleInit","onApplicationBootstrap","onModuleDestroy","beforeApplicationShutdown","onApplicationShutdown"]),F={DataSource:new Set(["findMetadata","getMetadata","hasMetadata","getRepository","getTreeRepository","getMongoRepository","createQueryBuilder","createEntityManager","createQueryRunner","defaultReplicationModeForReads"]),EntityManager:new Set(["getRepository","getTreeRepository","getCustomRepository","createQueryBuilder"]),Reflector:new Set(["get","getAll","getAllAndOverride","getAllAndMerge"])};function b(e,t){let o=!0;try{o=v().trace.suppressNoiseMethods}catch{}return o?F[e]?.has(t)??!1:!1}f(b,"h"),u(b,"$"),l(b,"isNoiseMethod");const M=/^(_|Object|String|Number|Array|Promise|Function|RegExp|Map|Set)$/,R=Symbol.for("@lensmcp/nest-instrumentation/proto-wrapped");let j=class{static{f(this,"I")}static{u(this,"I")}static{l(this,"LensmcpProviderTracker")}constructor(e){this.moduleRef=e,this.active=new Map}onApplicationBootstrap(){const e=v(),t=S(),o=this.moduleRef.container;if(o?.getModules)for(const[,n]of o.getModules()){const s=n?.controllers;s&&typeof s.forEach=="function"&&s.forEach(r=>{const i=r?.instance;if(!i||typeof i!="object")return;const p=i.constructor,a=p?.name;if(!a||M.test(a))return;const g=`nest:controller:${a}`,d=`${a}#gen${t}#${I(`${a}:${t}`)}`;this.active.set(g,d),e.emit(y({logicalId:g,instanceId:d,generation:t,module:n?.metatype?.name,scope:m(r?.scope),lifecycle:"active"})),e.trace.autoInstrumentMethods&&p&&$(i,p,a)});const c=n?.providers;!c||typeof c.forEach!="function"||c.forEach(r=>{const i=r?.instance;if(m(r?.scope)!=="SINGLETON"){this.trackScopedProvider(r,n,t,e);return}if(!i||typeof i!="object")return;const p=i.constructor,a=p?.name;if(!a||M.test(a))return;const g=`nest:provider:${a}`,d=`${a}#gen${t}#${I(`${a}:${t}`)}`;if(this.active.set(g,d),e.emit(y({logicalId:g,instanceId:d,generation:t,module:n?.metatype?.name,scope:m(r?.scope),lifecycle:"active"})),e.memory.mode!=="off"){const A=x(p);(e.memory.scope==="all"||(A?.memory??!1))&&O(i,d)}e.trace.autoInstrumentMethods&&p&&$(i,p,a)})}}onModuleDestroy(){const e=v(),t=S();for(const[o,n]of this.active)e.emit(y({logicalId:o,instanceId:n,generation:t,lifecycle:"disposed"}))}trackScopedProvider(e,t,o,n){let s;if(typeof e?.metatype=="function"?s=e.metatype:e?.instance&&typeof e.instance=="object"&&(s=e.instance.constructor),typeof s!="function")return;const c=s;if(!c.prototype)return;const r=c.name;if(!r||M.test(r))return;const i=m(e?.scope),p=`nest:provider:${r}`,a=`${r}#gen${o}#${i.toLowerCase()}`;this.active.has(p)||this.active.set(p,a),n.emit(y({logicalId:p,instanceId:a,generation:o,module:t?.metatype?.name,scope:i,lifecycle:"active"})),n.trace.autoInstrumentMethods&&P(c,r)}};j=L([Q(),C("design:paramtypes",[_])],j);export{j as LensmcpProviderTracker};function m(e){return e===1||e==="TRANSIENT"?"TRANSIENT":e===2||e==="REQUEST"?"REQUEST":"SINGLETON"}f(m,"m"),u(m,"g"),l(m,"scopeLabel");function y(e){const t=v();return{id:G(),sessionId:t.sessionId,timestamp:Date.now(),source:"nestjs",category:"backend",severity:"info",context:{sessionId:t.sessionId},fingerprint:B({kind:"nest-provider",identity:e.logicalId}),title:`Nest provider ${e.logicalId} ${e.lifecycle}`,raw:{kind:"singleton-instance",...t.projectName?{project:t.projectName}:{},provider:{...e,createdAt:Date.now()}}}}f(y,"y"),u(y,"h"),l(y,"makeProviderEvent");function I(e){let t=5381;for(let o=0;o<e.length;o++)t=(t<<5)+t+e.charCodeAt(o)|0;return(t>>>0).toString(16).slice(0,6)}f(I,"M"),u(I,"P"),l(I,"shortHash");function O(e,t){for(const o of Object.keys(e)){const n=e[o];(n instanceof Map||n instanceof Set||Array.isArray(n))&&U({ownerInstanceId:t,fieldName:o,container:n})}}f(O,"E"),u(O,"Q"),l(O,"trackProviderContainers");function $(e,t,o){if(h(t))return;const n=Object.getPrototypeOf(e);if(!(!n||n===Object.prototype))for(const s of Object.getOwnPropertyNames(n)){if(E.has(s)||b(o,s))continue;const c=Object.getOwnPropertyDescriptor(n,s);if(!c||typeof c.value!="function"||c.get||c.set)continue;const r=c.value;if(N(r)||h(r))continue;const i=w(r,`${o}.${s}`);try{Object.defineProperty(e,s,{value:i,writable:!0,enumerable:!1,configurable:!0})}catch{}}}f($,"$"),u($,"N"),l($,"autoInstrumentProviderMethods");function P(e,t){if(h(e))return;const o=e.prototype;if(!o||o===Object.prototype)return;const n=o;if(n[R])return;const s=[];for(const c of Object.getOwnPropertyNames(o)){if(E.has(c)||b(t,c))continue;const r=Object.getOwnPropertyDescriptor(o,c);if(!r||typeof r.value!="function"||r.get||r.set)continue;const i=r.value;if(N(i)||h(i))continue;const p=w(i,`${t}.${c}`);try{Object.defineProperty(o,c,{value:p,writable:!0,enumerable:!1,configurable:!0}),s.push(c)}catch{}}n[R]=!0,process.env.LENSMCP_DEBUG&&console.error(`[lensmcp] proto-wrapped ${t}: [${s.join(", ")}]`)}f(P,"N"),u(P,"U"),l(P,"autoInstrumentPrototypeMethods");
package/lib/state.js CHANGED
@@ -1 +1 @@
1
- "use strict";var u=Object.defineProperty;var s=(e,r)=>u(e,"name",{value:r,configurable:!0});var m=Object.defineProperty,n=s((e,r)=>m(e,"name",{value:r,configurable:!0}),"t");import{ulid as d}from"@lensmcp/core";import{defaultEventSink as p}from"./event-sink.js";import{performance as f}from"node:perf_hooks";import{threadId as l}from"node:worker_threads";let i,a=0;export function setActiveOptions(e){const r=e.emit??p(),o=`node:${process.pid}:${l}:${f.timeOrigin}`,t={projectName:e.projectName,sessionId:e.sessionId??process.env.LENSMCP_SESSION_ID??d(),emit:n(c=>r({...c,raw:{...c.raw,loopId:o}}),"emit"),trace:{requests:e.trace?.requests??!0,guards:e.trace?.guards??!0,controllers:e.trace?.controllers??!0,services:e.trace?.services??!0,db:e.trace?.db??!1,redis:e.trace?.redis??!1,queues:e.trace?.queues??!1,autoInstrumentMethods:e.trace?.autoInstrumentMethods??!1,suppressNoiseMethods:e.trace?.suppressNoiseMethods??!0,flowlessMinMs:flowlessMinMs(e.trace?.flowlessMinMs)},memory:{mode:e.memory?.mode??"off",scope:e.memory?.scope??"tagged"}};return i=t,a+=1,t}s(setActiveOptions,"setActiveOptions"),n(setActiveOptions,"setActiveOptions");export function flowlessMinMs(e,r=process.env){const o=r.LENSMCP_TRACE_FLOWLESS_MIN_MS,t=o!==void 0&&o.trim()!==""?Number(o):e;return t!==void 0&&Number.isFinite(t)&&t>=0?t:10}s(flowlessMinMs,"flowlessMinMs"),n(flowlessMinMs,"flowlessMinMs");export function activeOptions(){if(!i)throw new Error("@lensmcp/nest-instrumentation: LensmcpModule.forRoot(...) has not been registered. Did you forget to add it to your AppModule?");return i}s(activeOptions,"activeOptions"),n(activeOptions,"activeOptions");export function currentGeneration(){return a}s(currentGeneration,"currentGeneration"),n(currentGeneration,"currentGeneration");
1
+ "use strict";var p=Object.defineProperty;var o=(e,t)=>p(e,"name",{value:t,configurable:!0});var m=Object.defineProperty,n=o((e,t)=>m(e,"name",{value:t,configurable:!0}),"s"),d=Object.defineProperty,i=n((e,t)=>d(e,"name",{value:t,configurable:!0}),"t");import{ulid as l}from"@lensmcp/core";import{defaultEventSink as f}from"./event-sink.js";import{performance as M}from"node:perf_hooks";import{threadId as v}from"node:worker_threads";let a,u=0;export function setActiveOptions(e){const t=e.emit??f(),s=`node:${process.pid}:${v}:${M.timeOrigin}`,r={projectName:e.projectName,sessionId:e.sessionId??process.env.LENSMCP_SESSION_ID??l(),emit:i(c=>t({...c,raw:{...c.raw,loopId:s}}),"emit"),trace:{requests:e.trace?.requests??!0,guards:e.trace?.guards??!0,controllers:e.trace?.controllers??!0,services:e.trace?.services??!0,db:e.trace?.db??!1,redis:e.trace?.redis??!1,queues:e.trace?.queues??!1,autoInstrumentMethods:e.trace?.autoInstrumentMethods??!1,suppressNoiseMethods:e.trace?.suppressNoiseMethods??!0,flowlessMinMs:flowlessMinMs(e.trace?.flowlessMinMs)},memory:{mode:e.memory?.mode??"off",scope:e.memory?.scope??"tagged"}};return a=r,u+=1,r}o(setActiveOptions,"setActiveOptions"),n(setActiveOptions,"setActiveOptions"),i(setActiveOptions,"setActiveOptions");export function flowlessMinMs(e,t=process.env){const s=t.LENSMCP_TRACE_FLOWLESS_MIN_MS,r=s!==void 0&&s.trim()!==""?Number(s):e;return r!==void 0&&Number.isFinite(r)&&r>=0?r:10}o(flowlessMinMs,"flowlessMinMs"),n(flowlessMinMs,"flowlessMinMs"),i(flowlessMinMs,"flowlessMinMs");export function activeOptions(){if(!a)throw new Error("@lensmcp/nest-instrumentation: LensmcpModule.forRoot(...) has not been registered. Did you forget to add it to your AppModule?");return a}o(activeOptions,"activeOptions"),n(activeOptions,"activeOptions"),i(activeOptions,"activeOptions");export function currentGeneration(){return u}o(currentGeneration,"currentGeneration"),n(currentGeneration,"currentGeneration"),i(currentGeneration,"currentGeneration");
@@ -1,3 +1,3 @@
1
- "use strict";var oe=Object.defineProperty;var u=(t,e)=>oe(t,"name",{value:e,configurable:!0});var ne=Object.defineProperty,i=u((t,e)=>ne(t,"name",{value:e,configurable:!0}),"i");import{__decorate as ae}from"tslib";import{Injectable as ie}from"@nestjs/common";import{Observable as X}from"rxjs";import{catchError as de,tap as ue}from"rxjs/operators";import{fingerprint as E,headlessFlowId as J,headlessFlowsEnabled as K,isProbePath as V,LENS_REQUEST_ID_HEADER as ce,requestFacts as fe,responseFacts as le,shapeOf as W,ulid as v}from"@lensmcp/core";import{activeMemoryOptions as pe,onFlowStart as me,onFlowSettled as Ie}from"@lensmcp/memory-tracker";import{LENSMCP_CONTEXT_STORAGE as we}from"./context.js";import{attachContextEnd as ye}from"./context-end.js";import{attachFlowStart as ge}from"./flow-start.js";import{activeOptions as b}from"./state.js";const he=Symbol.for("lensmcp.exchangeId");let j=class{static{u(this,"O")}static{i(this,"TraceInterceptor")}intercept(t,e){const o=b();if(!o.trace.requests)return e.handle();const d=t.switchToHttp(),s=d.getRequest(),r=d.getResponse(),n=g(s.headers?.[ce])??g(s.headers?.["x-request-id"])??v(),c=g(s.headers?.["x-lensmcp-flow-id"]),f=g(s.headers?.["x-internal-token"])!==void 0,p=c??(!f&&K()&&!V(s.url)?J(n):void 0),l=t.getHandler?.(),I=!!l&&Reflect.getMetadata?.("__sse__",l)===!0,a={sessionId:o.sessionId,requestId:n,parentRequestId:g(s.headers?.["x-lensmcp-parent-request-id"]),flowId:p,originNodeId:g(s.headers?.["x-lensmcp-origin-node-id"]),traceparent:g(s.headers?.traceparent),runId:v(),dbCallCount:0,isStream:i(()=>I||x(r)==="text/event-stream","isStream")},m=s[he],q=(s.method??"GET").toUpperCase(),C=s.route?.path??s.url??"<unknown>",M=t.getClass?.()?.name,A=l?.name,h=Date.now();p&&!c&&_(a,q,C,h),!p&&f&&K()&&!V(s.url)&&ge(a,()=>(a.flowId||(a.flowId=J(n),_(a,q,C,h)),a.flowId));const H=o.memory.mode!=="off";H&&me(n);const P=i(()=>{if(!H)return;const w=pe()?.settleMs??1e3;setTimeout(()=>Ie(n,a.flowId),w).unref?.()},"settleAndCheck"),te=ye(a);let R;typeof r?.once=="function"&&qe()&&r.once("finish",()=>Y(o.projectName,a,q,C,s,r,R));let F=!1,T=typeof r?.once!="function";const B=i(()=>{F&&T&&te()},"endIfOver");if(!T){const w=i(()=>{T=!0,B()},"responseOut");r.once?.("finish",w),r.once?.("close",w)}return new X(w=>{let L;return we.run(a,()=>{L=e.handle().pipe(ue({next:i(y=>{R??={value:y},w.next(y)},"next"),complete:i(()=>{S(o.projectName,a,q,C,r.statusCode??200,h,void 0,m,x(r)),D(a,M,A,h,"ok"),P(),w.complete()},"complete")}),de(y=>{const U=y?.getResponse?.();U!==void 0&&(R??={value:U});const G=N(y);if(G!==void 0||typeof r.once!="function")S(o.projectName,a,q,C,G??O(r),h,y,m,x(r));else{let z=!1;const Q=i(se=>{if(z)return;z=!0;const re=se&&r.statusCode&&r.statusCode>=400?r.statusCode:O(r);S(o.projectName,a,q,C,re,h,y,m,x(r))},"settle");r.once("finish",()=>Q(!0)),r.once("close",()=>Q(!1))}return D(a,M,A,h,"error"),P(),w.error(y),new X})).subscribe()}),()=>{L?.unsubscribe(),F=!0,B()}})}};j=ae([ie()],j);export{j as TraceInterceptor};const k=new Map,ve=6e4,qe=i(()=>process.env.LENSMCP_HTTP_SHAPES!=="0","shapesOn");function Y(t,e,o,d,s,r,n){try{const c=r.statusCode??200,f=`${o} ${d} ${Math.floor(c/100)}`,p=Date.now();if(p-(k.get(f)??0)<ve)return;k.set(f,p),k.size>2e3&&k.delete(k.keys().next().value);const l=s.headers??{},I=s.body!==void 0&&s.body!==null&&typeof s.body=="object"&&!Buffer.isBuffer(s.body)?W(s.body):void 0,a=n&&n.value!==void 0&&typeof n.value=="object"&&n.value!==null&&!Buffer.isBuffer(n.value)&&typeof n.value.pipe!="function"?W(n.value):void 0,m={id:v(),sessionId:e.sessionId,timestamp:p,source:"nestjs",category:"backend",severity:"info",context:{sessionId:e.sessionId,flowId:e.flowId,requestId:e.requestId,...e.runId?{runId:e.runId}:{}},fingerprint:E({kind:"http-exchange",identity:f}),title:`${o} ${d} \u2192 ${c} (its shape)`,raw:{kind:"http-exchange",method:o,route:d,status:c,request:{...fe(l,s.query,s.params),...I?{body:I}:{}},response:{...le(r.getHeaders?.()??{},typeof l.origin=="string"?l.origin:void 0),...a?{body:a}:{}}}};$(m,t),b().emit(m)}catch{}}u(Y,"we"),i(Y,"recordExchange");function N(t){const e=t;if(typeof e?.getStatus=="function")return e.getStatus();if(typeof e?.status=="number"&&e.status>=100)return e.status;if(typeof e?.statusCode=="number"&&e.statusCode>=100)return e.statusCode}u(N,"Y"),i(N,"ownStatus");const Ce=new Set(["TypeError","ReferenceError","SyntaxError","RangeError","EvalError","URIError"]);export function requestOutcome(t,e){return e instanceof Error&&Ce.has(e.name)&&N(e)===void 0?"fault":t<400?"ok":t<500?"refused":t===500?"fault":"declared"}u(requestOutcome,"requestOutcome"),i(requestOutcome,"requestOutcome");function Z(t){return t==="ok"?"info":t==="refused"?"warning":"error"}u(Z,"Ce"),i(Z,"severityOf");function O(t){return t.statusCode&&t.statusCode>=400?t.statusCode:500}u(O,"J"),i(O,"inferStatus");function g(t){if(typeof t=="string")return t;if(Array.isArray(t)&&typeof t[0]=="string")return t[0]}u(g,"h"),i(g,"stringHeader");function _(t,e,o,d){const s=b(),r=`request:${e} ${o}`,n={id:v(),sessionId:t.sessionId,timestamp:d,source:"nestjs",category:"backend",severity:"info",context:{sessionId:t.sessionId,flowId:t.flowId,requestId:t.requestId,originType:"request",originNodeId:r},fingerprint:E({kind:"flow-origin",identity:`${e}:${o}`}),title:`${e} ${o}`,raw:{kind:"flow-origin",originNodeId:r,method:e,route:o}};$(n,s.projectName),s.emit(n)}u(_,"K"),i(_,"emitRequestOrigin");function D(t,e,o,d,s){if(!e||!o)return;const r=b(),n=Date.now()-d,c=`${e}.${o}`,f={id:v(),sessionId:t.sessionId,timestamp:Date.now(),source:"nestjs",category:"backend",severity:s==="error"?"error":"info",context:{sessionId:t.sessionId,flowId:t.flowId,requestId:t.requestId,...t.runId?{runId:t.runId}:{}},fingerprint:E({kind:"method-call",identity:c}),title:`${c} (${n}ms)${s==="error"?" \u2717":""}`,raw:{kind:"span",span:{name:c,role:"controller",flowId:t.flowId,requestId:t.requestId,startTime:d,endTime:Date.now(),durationMs:n,status:s}}};$(f,b().projectName),r.emit(f)}u(D,"W"),i(D,"emitControllerSpan");function ee(t){if(!(t instanceof Error))return{message:String(t)};const e=t.stack?t.stack.split(`
1
+ "use strict";var ne=Object.defineProperty;var u=(t,e)=>ne(t,"name",{value:e,configurable:!0});var ae=Object.defineProperty,c=u((t,e)=>ae(t,"name",{value:e,configurable:!0}),"u"),ie=Object.defineProperty,i=c((t,e)=>ie(t,"name",{value:e,configurable:!0}),"i");import{__decorate as de}from"tslib";import{Injectable as ue}from"@nestjs/common";import{Observable as Y}from"rxjs";import{catchError as ce,tap as fe}from"rxjs/operators";import{fingerprint as R,headlessFlowId as V,headlessFlowsEnabled as Z,isProbePath as ee,LENS_REQUEST_ID_HEADER as le,requestFacts as pe,responseFacts as me,shapeOf as te,ulid as q}from"@lensmcp/core";import{activeMemoryOptions as Ie,onFlowStart as ge,onFlowSettled as we}from"@lensmcp/memory-tracker";import{LENSMCP_CONTEXT_STORAGE as he}from"./context.js";import{attachContextEnd as ye}from"./context-end.js";import{attachFlowStart as ve}from"./flow-start.js";import{activeOptions as x}from"./state.js";const qe=Symbol.for("lensmcp.exchangeId");let M=class{static{u(this,"j")}static{c(this,"O")}static{i(this,"TraceInterceptor")}intercept(t,e){const o=x();if(!o.trace.requests)return e.handle();const d=t.switchToHttp(),r=d.getRequest(),s=d.getResponse(),n=g(r.headers?.[le])??g(r.headers?.["x-request-id"])??q(),f=g(r.headers?.["x-lensmcp-flow-id"]),l=g(r.headers?.["x-internal-token"])!==void 0,m=f??(!l&&Z()&&!ee(r.url)?V(n):void 0),p=t.getHandler?.(),w=!!p&&Reflect.getMetadata?.("__sse__",p)===!0,a={sessionId:o.sessionId,requestId:n,parentRequestId:g(r.headers?.["x-lensmcp-parent-request-id"]),flowId:m,originNodeId:g(r.headers?.["x-lensmcp-origin-node-id"]),traceparent:g(r.headers?.traceparent),runId:q(),dbCallCount:0,isStream:i(()=>w||k(s)==="text/event-stream","isStream")},I=r[qe],b=(r.method??"GET").toUpperCase(),$=r.route?.path??r.url??"<unknown>",F=t.getClass?.()?.name,B=p?.name,v=Date.now();m&&!f&&O(a,b,$,v),!m&&l&&Z()&&!ee(r.url)&&ve(a,()=>(a.flowId||(a.flowId=V(n),O(a,b,$,v)),a.flowId));const L=o.memory.mode!=="off";L&&ge(n);const U=i(()=>{if(!L)return;const h=Ie()?.settleMs??1e3;setTimeout(()=>we(n,a.flowId),h).unref?.()},"settleAndCheck"),re=ye(a);let _;typeof s?.once=="function"&&be()&&s.once("finish",()=>P(o.projectName,a,b,$,r,s,_));let G=!1,D=typeof s?.once!="function";const z=i(()=>{G&&D&&re()},"endIfOver");if(!D){const h=i(()=>{D=!0,z()},"responseOut");s.once?.("finish",h),s.once?.("close",h)}return new Y(h=>{let J;return he.run(a,()=>{J=e.handle().pipe(fe({next:i(y=>{_??={value:y},h.next(y)},"next"),complete:i(()=>{S(o.projectName,a,b,$,s.statusCode??200,v,void 0,I,k(s)),N(a,F,B,v,"ok"),U(),h.complete()},"complete")}),ce(y=>{const K=y?.getResponse?.();K!==void 0&&(_??={value:K});const Q=T(y);if(Q!==void 0||typeof s.once!="function")S(o.projectName,a,b,$,Q??j(s),v,y,I,k(s));else{let W=!1;const X=i(se=>{if(W)return;W=!0;const oe=se&&s.statusCode&&s.statusCode>=400?s.statusCode:j(s);S(o.projectName,a,b,$,oe,v,y,I,k(s))},"settle");s.once("finish",()=>X(!0)),s.once("close",()=>X(!1))}return N(a,F,B,v,"error"),U(),h.error(y),new Y})).subscribe()}),()=>{J?.unsubscribe(),G=!0,z()}})}};M=de([ue()],M);export{M as TraceInterceptor};const E=new Map,Ce=6e4,be=i(()=>process.env.LENSMCP_HTTP_SHAPES!=="0","shapesOn");function P(t,e,o,d,r,s,n){try{const f=s.statusCode??200,l=`${o} ${d} ${Math.floor(f/100)}`,m=Date.now();if(m-(E.get(l)??0)<Ce)return;E.set(l,m),E.size>2e3&&E.delete(E.keys().next().value);const p=r.headers??{},w=r.body!==void 0&&r.body!==null&&typeof r.body=="object"&&!Buffer.isBuffer(r.body)?te(r.body):void 0,a=n&&n.value!==void 0&&typeof n.value=="object"&&n.value!==null&&!Buffer.isBuffer(n.value)&&typeof n.value.pipe!="function"?te(n.value):void 0,I={id:q(),sessionId:e.sessionId,timestamp:m,source:"nestjs",category:"backend",severity:"info",context:{sessionId:e.sessionId,flowId:e.flowId,requestId:e.requestId,...e.runId?{runId:e.runId}:{}},fingerprint:R({kind:"http-exchange",identity:l}),title:`${o} ${d} \u2192 ${f} (its shape)`,raw:{kind:"http-exchange",method:o,route:d,status:f,request:{...pe(p,r.query,r.params),...w?{body:w}:{}},response:{...me(s.getHeaders?.()??{},typeof p.origin=="string"?p.origin:void 0),...a?{body:a}:{}}}};C(I,t),x().emit(I)}catch{}}u(P,"Y"),c(P,"we"),i(P,"recordExchange");function T(t){const e=t;if(typeof e?.getStatus=="function")return e.getStatus();if(typeof e?.status=="number"&&e.status>=100)return e.status;if(typeof e?.statusCode=="number"&&e.statusCode>=100)return e.statusCode}u(T,"N"),c(T,"Y"),i(T,"ownStatus");const $e=new Set(["TypeError","ReferenceError","SyntaxError","RangeError","EvalError","URIError"]);export function requestOutcome(t,e){return e instanceof Error&&$e.has(e.name)&&T(e)===void 0?"fault":t<400?"ok":t<500?"refused":t===500?"fault":"declared"}u(requestOutcome,"requestOutcome"),c(requestOutcome,"requestOutcome"),i(requestOutcome,"requestOutcome");function A(t){return t==="ok"?"info":t==="refused"?"warning":"error"}u(A,"Z"),c(A,"Ce"),i(A,"severityOf");function j(t){return t.statusCode&&t.statusCode>=400?t.statusCode:500}u(j,"O"),c(j,"J"),i(j,"inferStatus");function g(t){if(typeof t=="string")return t;if(Array.isArray(t)&&typeof t[0]=="string")return t[0]}u(g,"g"),c(g,"h"),i(g,"stringHeader");function O(t,e,o,d){const r=x(),s=`request:${e} ${o}`,n={id:q(),sessionId:t.sessionId,timestamp:d,source:"nestjs",category:"backend",severity:"info",context:{sessionId:t.sessionId,flowId:t.flowId,requestId:t.requestId,originType:"request",originNodeId:s},fingerprint:R({kind:"flow-origin",identity:`${e}:${o}`}),title:`${e} ${o}`,raw:{kind:"flow-origin",originNodeId:s,method:e,route:o}};C(n,r.projectName),r.emit(n)}u(O,"_"),c(O,"K"),i(O,"emitRequestOrigin");function N(t,e,o,d,r){if(!e||!o)return;const s=x(),n=Date.now()-d,f=`${e}.${o}`,l={id:q(),sessionId:t.sessionId,timestamp:Date.now(),source:"nestjs",category:"backend",severity:r==="error"?"error":"info",context:{sessionId:t.sessionId,flowId:t.flowId,requestId:t.requestId,...t.runId?{runId:t.runId}:{}},fingerprint:R({kind:"method-call",identity:f}),title:`${f} (${n}ms)${r==="error"?" \u2717":""}`,raw:{kind:"span",span:{name:f,role:"controller",flowId:t.flowId,requestId:t.requestId,startTime:d,endTime:Date.now(),durationMs:n,status:r}}};C(l,x().projectName),s.emit(l)}u(N,"D"),c(N,"W"),i(N,"emitControllerSpan");function H(t){if(!(t instanceof Error))return{message:String(t)};const e=t.stack?t.stack.split(`
2
2
  `).slice(0,30).join(`
3
- `):void 0;return{...t.name?{name:t.name}:{},message:t.message,...e?{stack:e}:{}}}u(ee,"qe"),i(ee,"errorDetail");function $(t,e){if(!e)return;const o=t.raw;o&&o.project===void 0&&(o.project=e)}u($,"R"),i($,"stampProject");function x(t){try{const e=t.getHeaders?.()["content-type"];return typeof e=="string"?e.split(";")[0]?.trim().toLowerCase():void 0}catch{return}}u(x,"$"),i(x,"responseContentType");function S(t,e,o,d,s,r,n,c,f){const p=b(),l=Date.now()-r,I=requestOutcome(s,n),a={id:v(),sessionId:e.sessionId,timestamp:Date.now(),source:"nestjs",category:"backend",severity:Z(I),context:{sessionId:e.sessionId,flowId:e.flowId,requestId:e.requestId,...e.runId?{runId:e.runId}:{},...e.parentRequestId?{parentRequestId:e.parentRequestId}:{},originNodeId:e.originNodeId,traceparent:e.traceparent},fingerprint:E({kind:"server-request",identity:`${o}:${d}:${Math.floor(s/100)}xx`}),title:`${o} ${d} \u2192 ${s} (${l}ms)`,message:n instanceof Error?n.message:void 0,raw:{kind:"server-request",request:{method:o,route:d,status:s,outcome:I,durationMs:l,startedAt:r,...f?{contentType:f,streaming:f==="text/event-stream"}:{},endedAt:Date.now(),flowId:e.flowId,requestId:e.requestId,...e.parentRequestId?{parentRequestId:e.parentRequestId}:{},...typeof c=="string"?{exchangeId:c}:{},...e.runId?{runId:e.runId}:{},...e.dbCallCount||e.redisCallCount?{calls:{...e.dbCallCount?{db:e.dbCallCount}:{},...e.redisCallCount?{cache:e.redisCallCount}:{}}}:{},...n?{error:ee(n)}:{}}}},m={...a,id:v(),raw:{kind:"span",span:{name:`nest.request ${o} ${d}`,traceId:e.traceparent,flowId:e.flowId,requestId:e.requestId,startTime:r,endTime:Date.now(),durationMs:l,status:I==="ok"?"ok":"error"}}};$(a,t),$(m,t),p.emit(a),p.emit(m)}u(S,"T"),i(S,"emitRequest");
3
+ `):void 0;return{...t.name?{name:t.name}:{},message:t.message,...e?{stack:e}:{}}}u(H,"ee"),c(H,"qe"),i(H,"errorDetail");function C(t,e){if(!e)return;const o=t.raw;o&&o.project===void 0&&(o.project=e)}u(C,"$"),c(C,"R"),i(C,"stampProject");function k(t){try{const e=t.getHeaders?.()["content-type"];return typeof e=="string"?e.split(";")[0]?.trim().toLowerCase():void 0}catch{return}}u(k,"x"),c(k,"$"),i(k,"responseContentType");function S(t,e,o,d,r,s,n,f,l){const m=x(),p=Date.now()-s,w=requestOutcome(r,n),a={id:q(),sessionId:e.sessionId,timestamp:Date.now(),source:"nestjs",category:"backend",severity:A(w),context:{sessionId:e.sessionId,flowId:e.flowId,requestId:e.requestId,...e.runId?{runId:e.runId}:{},...e.parentRequestId?{parentRequestId:e.parentRequestId}:{},originNodeId:e.originNodeId,traceparent:e.traceparent},fingerprint:R({kind:"server-request",identity:`${o}:${d}:${Math.floor(r/100)}xx`}),title:`${o} ${d} \u2192 ${r} (${p}ms)`,message:n instanceof Error?n.message:void 0,raw:{kind:"server-request",request:{method:o,route:d,status:r,outcome:w,durationMs:p,startedAt:s,...l?{contentType:l,streaming:l==="text/event-stream"}:{},endedAt:Date.now(),flowId:e.flowId,requestId:e.requestId,...e.parentRequestId?{parentRequestId:e.parentRequestId}:{},...typeof f=="string"?{exchangeId:f}:{},...e.runId?{runId:e.runId}:{},...e.dbCallCount||e.redisCallCount?{calls:{...e.dbCallCount?{db:e.dbCallCount}:{},...e.redisCallCount?{cache:e.redisCallCount}:{}}}:{},...n?{error:H(n)}:{}}}},I={...a,id:q(),raw:{kind:"span",span:{name:`nest.request ${o} ${d}`,traceId:e.traceparent,flowId:e.flowId,requestId:e.requestId,startTime:s,endTime:Date.now(),durationMs:p,status:w==="ok"?"ok":"error"}}};C(a,t),C(I,t),m.emit(a),m.emit(I)}u(S,"S"),c(S,"T"),i(S,"emitRequest");
@@ -1 +1 @@
1
- "use strict";var p=Object.defineProperty;var n=(e,t)=>p(e,"name",{value:t,configurable:!0});var f=Object.defineProperty,s=n((e,t)=>f(e,"name",{value:t,configurable:!0}),"a");import{traceWrap as m}from"./instrument.js";export function TraceMethod(e){const t=typeof e=="string"?{name:e}:e??{};return function(c,u,r){const a=r.value;if(typeof a!="function")return r;const o=c.constructor?.name??"Anonymous",i=t.name??`${o}.${String(u)}`;return r.value=m(a,i,{db:t.db,explicit:!0,...t.capture?{capture:t.capture}:{}}),r}}n(TraceMethod,"TraceMethod"),s(TraceMethod,"TraceMethod");
1
+ "use strict";var p=Object.defineProperty;var n=(t,e)=>p(t,"name",{value:e,configurable:!0});var s=Object.defineProperty,o=n((t,e)=>s(t,"name",{value:e,configurable:!0}),"n"),m=Object.defineProperty,d=o((t,e)=>m(t,"name",{value:e,configurable:!0}),"a");import{traceWrap as l}from"./instrument.js";export function TraceMethod(t){const e=typeof t=="string"?{name:t}:t??{};return function(c,u,r){const a=r.value;if(typeof a!="function")return r;const i=c.constructor?.name??"Anonymous",f=e.name??`${i}.${String(u)}`;return r.value=l(a,f,{db:e.db,explicit:!0,...e.capture?{capture:e.capture}:{}}),r}}n(TraceMethod,"TraceMethod"),o(TraceMethod,"TraceMethod"),d(TraceMethod,"TraceMethod");
@@ -1 +1 @@
1
- "use strict";var c=Object.defineProperty;var o=(r,e)=>c(r,"name",{value:e,configurable:!0});var i=Object.defineProperty,t=o((r,e)=>i(r,"name",{value:e,configurable:!0}),"n");const n=Symbol.for("@lensmcp/nest-instrumentation/trace-provider");export function TraceProvider(r={}){return e=>{e[n]={memory:r.memory??!0}}}o(TraceProvider,"TraceProvider"),t(TraceProvider,"TraceProvider");export function readTraceProvider(r){if(!(!r||typeof r!="function"&&typeof r!="object"))return r[n]}o(readTraceProvider,"readTraceProvider"),t(readTraceProvider,"readTraceProvider");
1
+ "use strict";var c=Object.defineProperty;var o=(e,r)=>c(e,"name",{value:r,configurable:!0});var i=Object.defineProperty,t=o((e,r)=>i(e,"name",{value:r,configurable:!0}),"o"),d=Object.defineProperty,n=t((e,r)=>d(e,"name",{value:r,configurable:!0}),"n");const a=Symbol.for("@lensmcp/nest-instrumentation/trace-provider");export function TraceProvider(e={}){return r=>{r[a]={memory:e.memory??!0}}}o(TraceProvider,"TraceProvider"),t(TraceProvider,"TraceProvider"),n(TraceProvider,"TraceProvider");export function readTraceProvider(e){if(!(!e||typeof e!="function"&&typeof e!="object"))return e[a]}o(readTraceProvider,"readTraceProvider"),t(readTraceProvider,"readTraceProvider"),n(readTraceProvider,"readTraceProvider");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lensmcp/nest-instrumentation",
3
- "version": "1.25.75",
3
+ "version": "1.25.76",
4
4
  "type": "module",
5
5
  "main": "./index.js",
6
6
  "module": "./index.js",
@@ -14,9 +14,9 @@
14
14
  }
15
15
  },
16
16
  "dependencies": {
17
- "@lensmcp/core": "1.25.75",
18
- "@lensmcp/memory-tracker": "1.25.75",
19
- "@lensmcp/protocol-types": "1.25.75",
17
+ "@lensmcp/core": "1.25.76",
18
+ "@lensmcp/memory-tracker": "1.25.76",
19
+ "@lensmcp/protocol-types": "1.25.76",
20
20
  "tslib": "^2.3.0"
21
21
  },
22
22
  "peerDependencies": {