@lensmcp/node-instrumentation 1.22.5 → 1.22.6

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/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var p=Object.defineProperty;var o=(t,r)=>p(t,"name",{value:r,configurable:!0});var n=Object.defineProperty,e=o((t,r)=>n(t,"name",{value:r,configurable:!0}),"e");Object.defineProperty(exports,"__esModule",{value:!0}),exports.resetActiveWorkForTests=exports.installActiveWorkProbe=exports.beginActiveWork=exports.activeWorkSnapshot=exports.installLensmcpNodeInstrumentation=exports.installChildAppBridge=exports.nestTap=exports.bullmqTap=exports.redisTap=exports.pgTap=exports.tapExec=exports.tapFs=exports.stopEventLoopTapForTests=exports.tapEventLoop=exports.resetEgressTapForTests=exports.tapEgress=exports.installRequireHook=exports.createEventFloodGuard=exports.maybeRotateEventFile=exports.EVENT_MAX_FILES=exports.EVENT_MAX_BYTES=exports.EVENT_FILE=exports.PROJECT=exports.isLensWriting=exports.lensEmit=void 0;var emit_1=require("./lib/emit");Object.defineProperty(exports,"lensEmit",{enumerable:!0,get:e(function(){return emit_1.lensEmit},"get")}),Object.defineProperty(exports,"isLensWriting",{enumerable:!0,get:e(function(){return emit_1.isLensWriting},"get")}),Object.defineProperty(exports,"PROJECT",{enumerable:!0,get:e(function(){return emit_1.PROJECT},"get")}),Object.defineProperty(exports,"EVENT_FILE",{enumerable:!0,get:e(function(){return emit_1.EVENT_FILE},"get")}),Object.defineProperty(exports,"EVENT_MAX_BYTES",{enumerable:!0,get:e(function(){return emit_1.EVENT_MAX_BYTES},"get")}),Object.defineProperty(exports,"EVENT_MAX_FILES",{enumerable:!0,get:e(function(){return emit_1.EVENT_MAX_FILES},"get")}),Object.defineProperty(exports,"maybeRotateEventFile",{enumerable:!0,get:e(function(){return emit_1.maybeRotateEventFile},"get")});var flood_guard_1=require("./lib/flood-guard");Object.defineProperty(exports,"createEventFloodGuard",{enumerable:!0,get:e(function(){return flood_guard_1.createEventFloodGuard},"get")});var require_hook_1=require("./lib/require-hook");Object.defineProperty(exports,"installRequireHook",{enumerable:!0,get:e(function(){return require_hook_1.installRequireHook},"get")});var tap_egress_1=require("./lib/tap-egress");Object.defineProperty(exports,"tapEgress",{enumerable:!0,get:e(function(){return tap_egress_1.tapEgress},"get")}),Object.defineProperty(exports,"resetEgressTapForTests",{enumerable:!0,get:e(function(){return tap_egress_1.resetEgressTapForTests},"get")});var tap_event_loop_1=require("./lib/tap-event-loop");Object.defineProperty(exports,"tapEventLoop",{enumerable:!0,get:e(function(){return tap_event_loop_1.tapEventLoop},"get")}),Object.defineProperty(exports,"stopEventLoopTapForTests",{enumerable:!0,get:e(function(){return tap_event_loop_1.stopEventLoopTapForTests},"get")});var tap_fs_1=require("./lib/tap-fs");Object.defineProperty(exports,"tapFs",{enumerable:!0,get:e(function(){return tap_fs_1.tapFs},"get")});var tap_exec_1=require("./lib/tap-exec");Object.defineProperty(exports,"tapExec",{enumerable:!0,get:e(function(){return tap_exec_1.tapExec},"get")});var tap_pg_1=require("./lib/tap-pg");Object.defineProperty(exports,"pgTap",{enumerable:!0,get:e(function(){return tap_pg_1.pgTap},"get")});var tap_redis_1=require("./lib/tap-redis");Object.defineProperty(exports,"redisTap",{enumerable:!0,get:e(function(){return tap_redis_1.redisTap},"get")});var tap_bullmq_1=require("./lib/tap-bullmq");Object.defineProperty(exports,"bullmqTap",{enumerable:!0,get:e(function(){return tap_bullmq_1.bullmqTap},"get")});var tap_nest_1=require("./lib/tap-nest");Object.defineProperty(exports,"nestTap",{enumerable:!0,get:e(function(){return tap_nest_1.nestTap},"get")}),Object.defineProperty(exports,"installChildAppBridge",{enumerable:!0,get:e(function(){return tap_nest_1.installChildAppBridge},"get")});var install_1=require("./lib/install");Object.defineProperty(exports,"installLensmcpNodeInstrumentation",{enumerable:!0,get:e(function(){return install_1.installLensmcpNodeInstrumentation},"get")});var active_work_1=require("./lib/active-work");Object.defineProperty(exports,"activeWorkSnapshot",{enumerable:!0,get:e(function(){return active_work_1.activeWorkSnapshot},"get")}),Object.defineProperty(exports,"beginActiveWork",{enumerable:!0,get:e(function(){return active_work_1.beginActiveWork},"get")}),Object.defineProperty(exports,"installActiveWorkProbe",{enumerable:!0,get:e(function(){return active_work_1.installActiveWorkProbe},"get")}),Object.defineProperty(exports,"resetActiveWorkForTests",{enumerable:!0,get:e(function(){return active_work_1.resetActiveWorkForTests},"get")});
1
+ "use strict";var n=Object.defineProperty;var e=(t,r)=>n(t,"name",{value:r,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.resetActiveWorkForTests=exports.installActiveWorkProbe=exports.beginActiveWork=exports.activeWorkSnapshot=exports.installLensmcpNodeInstrumentation=exports.installChildAppBridge=exports.nestTap=exports.bullmqTap=exports.redisTap=exports.pgTap=exports.tapExec=exports.tapFs=exports.stopEventLoopTapForTests=exports.tapEventLoop=exports.resetEgressTapForTests=exports.tapEgress=exports.installRequireHook=exports.createEventFloodGuard=exports.maybeRotateEventFile=exports.EVENT_MAX_FILES=exports.EVENT_MAX_BYTES=exports.EVENT_FILE=exports.PROJECT=exports.isLensWriting=exports.lensEmit=void 0;var emit_1=require("./lib/emit");Object.defineProperty(exports,"lensEmit",{enumerable:!0,get:e(function(){return emit_1.lensEmit},"get")}),Object.defineProperty(exports,"isLensWriting",{enumerable:!0,get:e(function(){return emit_1.isLensWriting},"get")}),Object.defineProperty(exports,"PROJECT",{enumerable:!0,get:e(function(){return emit_1.PROJECT},"get")}),Object.defineProperty(exports,"EVENT_FILE",{enumerable:!0,get:e(function(){return emit_1.EVENT_FILE},"get")}),Object.defineProperty(exports,"EVENT_MAX_BYTES",{enumerable:!0,get:e(function(){return emit_1.EVENT_MAX_BYTES},"get")}),Object.defineProperty(exports,"EVENT_MAX_FILES",{enumerable:!0,get:e(function(){return emit_1.EVENT_MAX_FILES},"get")}),Object.defineProperty(exports,"maybeRotateEventFile",{enumerable:!0,get:e(function(){return emit_1.maybeRotateEventFile},"get")});var flood_guard_1=require("./lib/flood-guard");Object.defineProperty(exports,"createEventFloodGuard",{enumerable:!0,get:e(function(){return flood_guard_1.createEventFloodGuard},"get")});var require_hook_1=require("./lib/require-hook");Object.defineProperty(exports,"installRequireHook",{enumerable:!0,get:e(function(){return require_hook_1.installRequireHook},"get")});var tap_egress_1=require("./lib/tap-egress");Object.defineProperty(exports,"tapEgress",{enumerable:!0,get:e(function(){return tap_egress_1.tapEgress},"get")}),Object.defineProperty(exports,"resetEgressTapForTests",{enumerable:!0,get:e(function(){return tap_egress_1.resetEgressTapForTests},"get")});var tap_event_loop_1=require("./lib/tap-event-loop");Object.defineProperty(exports,"tapEventLoop",{enumerable:!0,get:e(function(){return tap_event_loop_1.tapEventLoop},"get")}),Object.defineProperty(exports,"stopEventLoopTapForTests",{enumerable:!0,get:e(function(){return tap_event_loop_1.stopEventLoopTapForTests},"get")});var tap_fs_1=require("./lib/tap-fs");Object.defineProperty(exports,"tapFs",{enumerable:!0,get:e(function(){return tap_fs_1.tapFs},"get")});var tap_exec_1=require("./lib/tap-exec");Object.defineProperty(exports,"tapExec",{enumerable:!0,get:e(function(){return tap_exec_1.tapExec},"get")});var tap_pg_1=require("./lib/tap-pg");Object.defineProperty(exports,"pgTap",{enumerable:!0,get:e(function(){return tap_pg_1.pgTap},"get")});var tap_redis_1=require("./lib/tap-redis");Object.defineProperty(exports,"redisTap",{enumerable:!0,get:e(function(){return tap_redis_1.redisTap},"get")});var tap_bullmq_1=require("./lib/tap-bullmq");Object.defineProperty(exports,"bullmqTap",{enumerable:!0,get:e(function(){return tap_bullmq_1.bullmqTap},"get")});var tap_nest_1=require("./lib/tap-nest");Object.defineProperty(exports,"nestTap",{enumerable:!0,get:e(function(){return tap_nest_1.nestTap},"get")}),Object.defineProperty(exports,"installChildAppBridge",{enumerable:!0,get:e(function(){return tap_nest_1.installChildAppBridge},"get")});var install_1=require("./lib/install");Object.defineProperty(exports,"installLensmcpNodeInstrumentation",{enumerable:!0,get:e(function(){return install_1.installLensmcpNodeInstrumentation},"get")});var active_work_1=require("./lib/active-work");Object.defineProperty(exports,"activeWorkSnapshot",{enumerable:!0,get:e(function(){return active_work_1.activeWorkSnapshot},"get")}),Object.defineProperty(exports,"beginActiveWork",{enumerable:!0,get:e(function(){return active_work_1.beginActiveWork},"get")}),Object.defineProperty(exports,"installActiveWorkProbe",{enumerable:!0,get:e(function(){return active_work_1.installActiveWorkProbe},"get")}),Object.defineProperty(exports,"resetActiveWorkForTests",{enumerable:!0,get:e(function(){return active_work_1.resetActiveWorkForTests},"get")});
@@ -1 +1 @@
1
- "use strict";var a=Object.defineProperty;var o=(t,e)=>a(t,"name",{value:e,configurable:!0});var i=Object.defineProperty,n=o((t,e)=>i(t,"name",{value:e,configurable:!0}),"n");Object.defineProperty(exports,"__esModule",{value:!0}),exports.beginActiveWorkGeneration=beginActiveWorkGeneration,exports.activeWorkGeneration=activeWorkGeneration,exports.beginActiveWork=beginActiveWork,exports.activeWorkSnapshot=activeWorkSnapshot,exports.installActiveWorkProbe=installActiveWorkProbe,exports.resetActiveWorkForTests=resetActiveWorkForTests;const GLOBAL_KEY="__lensmcpActiveWork",running=new Set;let currentGeneration=0;function beginActiveWorkGeneration(){return++currentGeneration}o(beginActiveWorkGeneration,"beginActiveWorkGeneration"),n(beginActiveWorkGeneration,"beginActiveWorkGeneration");function activeWorkGeneration(){return currentGeneration}o(activeWorkGeneration,"activeWorkGeneration"),n(activeWorkGeneration,"activeWorkGeneration");function beginActiveWork(t){const e={at:Date.now(),...t===void 0?{}:{gen:t}};running.add(e);let r=!1;return()=>{r||(r=!0,running.delete(e))}}o(beginActiveWork,"beginActiveWork"),n(beginActiveWork,"beginActiveWork");function activeWorkSnapshot(t){let e,r=0;for(const c of running)t!==void 0&&c.gen!==void 0&&c.gen!==t||(r+=1,(e===void 0||c.at<e)&&(e=c.at));return{count:r,...e===void 0?{}:{oldestStartedAt:e}}}o(activeWorkSnapshot,"activeWorkSnapshot"),n(activeWorkSnapshot,"activeWorkSnapshot");function installActiveWorkProbe(){globalThis[GLOBAL_KEY]=activeWorkSnapshot,globalThis.__lensmcpBeginWorkGeneration=beginActiveWorkGeneration}o(installActiveWorkProbe,"installActiveWorkProbe"),n(installActiveWorkProbe,"installActiveWorkProbe");function resetActiveWorkForTests(){running.clear(),currentGeneration=0}o(resetActiveWorkForTests,"resetActiveWorkForTests"),n(resetActiveWorkForTests,"resetActiveWorkForTests");
1
+ "use strict";var i=Object.defineProperty;var n=(t,e)=>i(t,"name",{value:e,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.beginActiveWorkGeneration=beginActiveWorkGeneration,exports.activeWorkGeneration=activeWorkGeneration,exports.beginActiveWork=beginActiveWork,exports.activeWorkSnapshot=activeWorkSnapshot,exports.installActiveWorkProbe=installActiveWorkProbe,exports.resetActiveWorkForTests=resetActiveWorkForTests;const GLOBAL_KEY="__lensmcpActiveWork",running=new Set;let currentGeneration=0;function beginActiveWorkGeneration(){return++currentGeneration}n(beginActiveWorkGeneration,"beginActiveWorkGeneration");function activeWorkGeneration(){return currentGeneration}n(activeWorkGeneration,"activeWorkGeneration");function beginActiveWork(t){const e={at:Date.now(),...t===void 0?{}:{gen:t}};running.add(e);let r=!1;return()=>{r||(r=!0,running.delete(e))}}n(beginActiveWork,"beginActiveWork");function activeWorkSnapshot(t){let e,r=0;for(const o of running)t!==void 0&&o.gen!==void 0&&o.gen!==t||(r+=1,(e===void 0||o.at<e)&&(e=o.at));return{count:r,...e===void 0?{}:{oldestStartedAt:e}}}n(activeWorkSnapshot,"activeWorkSnapshot");function installActiveWorkProbe(){globalThis[GLOBAL_KEY]=activeWorkSnapshot,globalThis.__lensmcpBeginWorkGeneration=beginActiveWorkGeneration}n(installActiveWorkProbe,"installActiveWorkProbe");function resetActiveWorkForTests(){running.clear(),currentGeneration=0}n(resetActiveWorkForTests,"resetActiveWorkForTests");
package/lib/emit.js CHANGED
@@ -1,3 +1,3 @@
1
- "use strict";var u=Object.defineProperty;var E=(e,s)=>u(e,"name",{value:s,configurable:!0});var a=Object.defineProperty,c=E((e,s)=>a(e,"name",{value:s,configurable:!0}),"c");Object.defineProperty(exports,"__esModule",{value:!0}),exports.EVENT_FILE=exports.PROJECT=exports.EVENT_MAX_FILES=exports.EVENT_MAX_BYTES=void 0,exports.maybeRotateEventFile=maybeRotateEventFile,exports.isLensWriting=isLensWriting,exports.lensEmit=lensEmit,exports.lensLog=lensLog;const tslib_1=require("tslib"),nodeFs=tslib_1.__importStar(require("node:fs")),node_path_1=require("node:path"),flood_guard_1=require("./flood-guard"),flow_context_1=require("./flow-context"),appendFileSync=nodeFs.appendFileSync,mkdirSync=nodeFs.mkdirSync,statSync=nodeFs.statSync,renameSync=nodeFs.renameSync,unlinkSync=nodeFs.unlinkSync;exports.EVENT_MAX_BYTES=(()=>{const e=Number(process.env.LENSMCP_EVENT_MAX_BYTES);return Number.isFinite(e)&&e>0?e:50*1024*1024})(),exports.EVENT_MAX_FILES=(()=>{const e=Number(process.env.LENSMCP_EVENT_MAX_FILES);return Number.isFinite(e)&&e>=1&&e<=20?Math.floor(e):5})();const ROTATE_CHECK_BYTES=1024*1024,bytesSinceCheck=new Map;function maybeRotateEventFile(e,s,o){const n=(bytesSinceCheck.get(e)??0)+s;if(n<ROTATE_CHECK_BYTES&&o===void 0){bytesSinceCheck.set(e,n);return}const i=o?.maxBytes??exports.EVENT_MAX_BYTES,t=o?.maxFiles??exports.EVENT_MAX_FILES;try{const r=statSync(e).size;if(bytesSinceCheck.set(e,0),r<=i)return}catch{bytesSinceCheck.set(e,n);return}try{unlinkSync(`${e}.${t}`)}catch{}for(let r=t-1;r>=1;r--)try{renameSync(`${e}.${r}`,`${e}.${r+1}`)}catch{}try{renameSync(e,`${e}.1`)}catch{}}E(maybeRotateEventFile,"maybeRotateEventFile"),c(maybeRotateEventFile,"maybeRotateEventFile"),exports.PROJECT=process.env.LENSMCP_PROJECT||process.env.SERVICE_NAME||"app",exports.EVENT_FILE=process.env.LENSMCP_EVENT_FILE||`${process.cwd()}/.lensmcp/events.jsonl`;let writing=!1,dirReady=!1;const emitGuard=(0,flood_guard_1.createEventFloodGuard)({burst:30,perSec:5}),logGuard=(0,flood_guard_1.createEventFloodGuard)({burst:120,perSec:20});function isLensWriting(){return writing}E(isLensWriting,"isLensWriting"),c(isLensWriting,"isLensWriting");function lensEmit(e,s,o,n,i,t,r="cluster"){try{writing=!0;const d=i??`${e}:${String(n.name??e)}`,p=emitGuard.admit(d);if(!p.ok)return;dirReady||(mkdirSync((0,node_path_1.dirname)(exports.EVENT_FILE),{recursive:!0}),dirReady=!0);const l=JSON.stringify({id:Date.now().toString(36)+Math.random().toString(36).slice(2,10),sessionId:"pending",timestamp:Date.now(),source:e,category:r,severity:s,context:{sessionId:"pending",projectName:exports.PROJECT,...t?.flowId?{flowId:t.flowId}:{},...t?.requestId?{requestId:t.requestId}:{},...t?.originNodeId?{originNodeId:t.originNodeId}:{}},fingerprint:d,title:o,raw:{project:exports.PROJECT,...n,...p.suppressed>0?{floodSuppressed:p.suppressed}:{}}})+`
2
- `;maybeRotateEventFile(exports.EVENT_FILE,l.length),appendFileSync(exports.EVENT_FILE,l)}catch{}finally{writing=!1}}E(lensEmit,"lensEmit"),c(lensEmit,"lensEmit");function lensLog(e,s,o){try{writing=!0;const n=e==="error"||e==="fatal"?`log:error:${exports.PROJECT}`:`log:${exports.PROJECT}`,i=logGuard.admit(n);if(!i.ok)return;dirReady||(mkdirSync((0,node_path_1.dirname)(exports.EVENT_FILE),{recursive:!0}),dirReady=!0);const t=(0,flow_context_1.flowContext)(),r=JSON.stringify({id:Date.now().toString(36)+Math.random().toString(36).slice(2,10),sessionId:"pending",timestamp:Date.now(),source:"nestjs",category:"runtime",severity:e,context:{sessionId:"pending",projectName:exports.PROJECT,...t?.flowId?{flowId:t.flowId}:{},...t?.requestId?{requestId:t.requestId}:{}},fingerprint:n,title:s,raw:{project:exports.PROJECT,kind:"log",...o?.stack?{request:{error:{message:s,stack:o.stack}}}:{},...i.suppressed>0?{floodSuppressed:i.suppressed}:{}}})+`
3
- `;maybeRotateEventFile(exports.EVENT_FILE,r.length),appendFileSync(exports.EVENT_FILE,r)}catch{}finally{writing=!1}}E(lensLog,"lensLog"),c(lensLog,"lensLog");
1
+ "use strict";var a=Object.defineProperty;var c=(e,n)=>a(e,"name",{value:n,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.EVENT_FILE=exports.PROJECT=exports.EVENT_MAX_FILES=exports.EVENT_MAX_BYTES=void 0,exports.maybeRotateEventFile=maybeRotateEventFile,exports.isLensWriting=isLensWriting,exports.lensEmit=lensEmit,exports.lensLog=lensLog;const tslib_1=require("tslib"),nodeFs=tslib_1.__importStar(require("node:fs")),node_path_1=require("node:path"),flood_guard_1=require("./flood-guard"),flow_context_1=require("./flow-context"),appendFileSync=nodeFs.appendFileSync,mkdirSync=nodeFs.mkdirSync,statSync=nodeFs.statSync,renameSync=nodeFs.renameSync,unlinkSync=nodeFs.unlinkSync;exports.EVENT_MAX_BYTES=(()=>{const e=Number(process.env.LENSMCP_EVENT_MAX_BYTES);return Number.isFinite(e)&&e>0?e:50*1024*1024})(),exports.EVENT_MAX_FILES=(()=>{const e=Number(process.env.LENSMCP_EVENT_MAX_FILES);return Number.isFinite(e)&&e>=1&&e<=20?Math.floor(e):5})();const ROTATE_CHECK_BYTES=1024*1024,bytesSinceCheck=new Map;function maybeRotateEventFile(e,n,o){const s=(bytesSinceCheck.get(e)??0)+n;if(s<ROTATE_CHECK_BYTES&&o===void 0){bytesSinceCheck.set(e,s);return}const i=o?.maxBytes??exports.EVENT_MAX_BYTES,t=o?.maxFiles??exports.EVENT_MAX_FILES;try{const r=statSync(e).size;if(bytesSinceCheck.set(e,0),r<=i)return}catch{bytesSinceCheck.set(e,s);return}try{unlinkSync(`${e}.${t}`)}catch{}for(let r=t-1;r>=1;r--)try{renameSync(`${e}.${r}`,`${e}.${r+1}`)}catch{}try{renameSync(e,`${e}.1`)}catch{}}c(maybeRotateEventFile,"maybeRotateEventFile"),exports.PROJECT=process.env.LENSMCP_PROJECT||process.env.SERVICE_NAME||"app",exports.EVENT_FILE=process.env.LENSMCP_EVENT_FILE||`${process.cwd()}/.lensmcp/events.jsonl`;let writing=!1,dirReady=!1;const emitGuard=(0,flood_guard_1.createEventFloodGuard)({burst:30,perSec:5}),logGuard=(0,flood_guard_1.createEventFloodGuard)({burst:120,perSec:20});function isLensWriting(){return writing}c(isLensWriting,"isLensWriting");function lensEmit(e,n,o,s,i,t,r="cluster"){try{writing=!0;const p=i??`${e}:${String(s.name??e)}`,E=emitGuard.admit(p);if(!E.ok)return;dirReady||(mkdirSync((0,node_path_1.dirname)(exports.EVENT_FILE),{recursive:!0}),dirReady=!0);const d=JSON.stringify({id:Date.now().toString(36)+Math.random().toString(36).slice(2,10),sessionId:"pending",timestamp:Date.now(),source:e,category:r,severity:n,context:{sessionId:"pending",projectName:exports.PROJECT,...t?.flowId?{flowId:t.flowId}:{},...t?.requestId?{requestId:t.requestId}:{},...t?.originNodeId?{originNodeId:t.originNodeId}:{}},fingerprint:p,title:o,raw:{project:exports.PROJECT,...s,...E.suppressed>0?{floodSuppressed:E.suppressed}:{}}})+`
2
+ `;maybeRotateEventFile(exports.EVENT_FILE,d.length),appendFileSync(exports.EVENT_FILE,d)}catch{}finally{writing=!1}}c(lensEmit,"lensEmit");function lensLog(e,n,o){try{writing=!0;const s=e==="error"||e==="fatal"?`log:error:${exports.PROJECT}`:`log:${exports.PROJECT}`,i=logGuard.admit(s);if(!i.ok)return;dirReady||(mkdirSync((0,node_path_1.dirname)(exports.EVENT_FILE),{recursive:!0}),dirReady=!0);const t=(0,flow_context_1.flowContext)(),r=JSON.stringify({id:Date.now().toString(36)+Math.random().toString(36).slice(2,10),sessionId:"pending",timestamp:Date.now(),source:"nestjs",category:"runtime",severity:e,context:{sessionId:"pending",projectName:exports.PROJECT,...t?.flowId?{flowId:t.flowId}:{},...t?.requestId?{requestId:t.requestId}:{}},fingerprint:s,title:n,raw:{project:exports.PROJECT,kind:"log",...o?.stack?{request:{error:{message:n,stack:o.stack}}}:{},...i.suppressed>0?{floodSuppressed:i.suppressed}:{}}})+`
3
+ `;maybeRotateEventFile(exports.EVENT_FILE,r.length),appendFileSync(exports.EVENT_FILE,r)}catch{}finally{writing=!1}}c(lensLog,"lensLog");
@@ -1 +1 @@
1
- "use strict";var n=Object.defineProperty;var a=(r,t)=>n(r,"name",{value:t,configurable:!0});var o=Object.defineProperty,e=a((r,t)=>o(r,"name",{value:t,configurable:!0}),"e");Object.defineProperty(exports,"__esModule",{value:!0}),exports.createEventFloodGuard=void 0;var protocol_types_1=require("@lensmcp/protocol-types");Object.defineProperty(exports,"createEventFloodGuard",{enumerable:!0,get:e(function(){return protocol_types_1.createEventFloodGuard},"get")});
1
+ "use strict";var o=Object.defineProperty;var e=(r,t)=>o(r,"name",{value:t,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.createEventFloodGuard=void 0;var protocol_types_1=require("@lensmcp/protocol-types");Object.defineProperty(exports,"createEventFloodGuard",{enumerable:!0,get:e(function(){return protocol_types_1.createEventFloodGuard},"get")});
@@ -1 +1 @@
1
- "use strict";var u=Object.defineProperty;var o=(e,t)=>u(e,"name",{value:t,configurable:!0});var s=Object.defineProperty,n=o((e,t)=>s(e,"name",{value:t,configurable:!0}),"n");Object.defineProperty(exports,"__esModule",{value:!0}),exports.flowContextStatus=flowContextStatus,exports.resetFlowContextForTests=resetFlowContextForTests,exports.isRequireEsmError=isRequireEsmError,exports.isModuleNotFoundError=isModuleNotFoundError,exports.primeFlowContext=primeFlowContext,exports.runInFlowContext=runInFlowContext,exports.liveFlowContext=liveFlowContext,exports.flowContext=flowContext;let getCtx=null,runWith=null,status={state:"not-primed"},warned=!1;function flowContextStatus(){return status}o(flowContextStatus,"flowContextStatus"),n(flowContextStatus,"flowContextStatus");function resetFlowContextForTests(){getCtx=null,runWith=null,status={state:"not-primed"},warned=!1}o(resetFlowContextForTests,"resetFlowContextForTests"),n(resetFlowContextForTests,"resetFlowContextForTests");function isRequireEsmError(e){const t=e?.code;return t==="ERR_REQUIRE_ESM"||t==="ERR_REQUIRE_ASYNC_MODULE"}o(isRequireEsmError,"isRequireEsmError"),n(isRequireEsmError,"isRequireEsmError");function isModuleNotFoundError(e){const t=e;return t?.code!=="MODULE_NOT_FOUND"&&t?.code!=="ERR_MODULE_NOT_FOUND"?!1:String(t?.message??"").includes("@lensmcp/nest-instrumentation")}o(isModuleNotFoundError,"isModuleNotFoundError"),n(isModuleNotFoundError,"isModuleNotFoundError");function requireNestInstrumentation(){return require("@lensmcp/nest-instrumentation")}o(requireNestInstrumentation,"requireNestInstrumentation"),n(requireNestInstrumentation,"requireNestInstrumentation");function primeFlowContext(e=requireNestInstrumentation){try{const t=e();getCtx=t.currentLensmcpContext,runWith=t.runInLensmcpContext,status={state:"ready"}}catch(t){if(getCtx=null,runWith=null,isModuleNotFoundError(t)){status={state:"absent"};return}const r=t instanceof Error?t.message:String(t);if(status=isRequireEsmError(t)?{state:"runtime-too-old",detail:r}:{state:"failed",detail:r},!warned){warned=!0;const i=status.state==="runtime-too-old"?`this Node (${process.version}) cannot require an ESM package; @lensmcp/node-instrumentation needs >=20.19`:r;console.warn(`[lensmcp] flow correlation is OFF \u2014 could not load @lensmcp/nest-instrumentation: ${i}`)}}}o(primeFlowContext,"primeFlowContext"),n(primeFlowContext,"primeFlowContext");function runInFlowContext(e,t){if(!runWith)return t();try{return runWith({sessionId:"pending",requestId:e.requestId,...e.flowId?{flowId:e.flowId}:{}},t)}catch{return t()}}o(runInFlowContext,"runInFlowContext"),n(runInFlowContext,"runInFlowContext");function liveFlowContext(){try{return getCtx?.()}catch{return}}o(liveFlowContext,"liveFlowContext"),n(liveFlowContext,"liveFlowContext");function flowContext(){const e=liveFlowContext();if(e)return{...e.flowId?{flowId:e.flowId}:{},...e.requestId?{requestId:e.requestId}:{},...e.originNodeId?{originNodeId:e.originNodeId}:{}}}o(flowContext,"flowContext"),n(flowContext,"flowContext");
1
+ "use strict";var s=Object.defineProperty;var n=(t,e)=>s(t,"name",{value:e,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.flowContextStatus=flowContextStatus,exports.resetFlowContextForTests=resetFlowContextForTests,exports.isRequireEsmError=isRequireEsmError,exports.isModuleNotFoundError=isModuleNotFoundError,exports.primeFlowContext=primeFlowContext,exports.runInFlowContext=runInFlowContext,exports.liveFlowContext=liveFlowContext,exports.flowContext=flowContext;let getCtx=null,runWith=null,status={state:"not-primed"},warned=!1;function flowContextStatus(){return status}n(flowContextStatus,"flowContextStatus");function resetFlowContextForTests(){getCtx=null,runWith=null,status={state:"not-primed"},warned=!1}n(resetFlowContextForTests,"resetFlowContextForTests");function isRequireEsmError(t){const e=t?.code;return e==="ERR_REQUIRE_ESM"||e==="ERR_REQUIRE_ASYNC_MODULE"}n(isRequireEsmError,"isRequireEsmError");function isModuleNotFoundError(t){const e=t;return e?.code!=="MODULE_NOT_FOUND"&&e?.code!=="ERR_MODULE_NOT_FOUND"?!1:String(e?.message??"").includes("@lensmcp/nest-instrumentation")}n(isModuleNotFoundError,"isModuleNotFoundError");function requireNestInstrumentation(){return require("@lensmcp/nest-instrumentation")}n(requireNestInstrumentation,"requireNestInstrumentation");function primeFlowContext(t=requireNestInstrumentation){try{const e=t();getCtx=e.currentLensmcpContext,runWith=e.runInLensmcpContext,status={state:"ready"}}catch(e){if(getCtx=null,runWith=null,isModuleNotFoundError(e)){status={state:"absent"};return}const o=e instanceof Error?e.message:String(e);if(status=isRequireEsmError(e)?{state:"runtime-too-old",detail:o}:{state:"failed",detail:o},!warned){warned=!0;const r=status.state==="runtime-too-old"?`this Node (${process.version}) cannot require an ESM package; @lensmcp/node-instrumentation needs >=20.19`:o;console.warn(`[lensmcp] flow correlation is OFF \u2014 could not load @lensmcp/nest-instrumentation: ${r}`)}}}n(primeFlowContext,"primeFlowContext");function runInFlowContext(t,e){if(!runWith)return e();try{return runWith({sessionId:"pending",requestId:t.requestId,...t.flowId?{flowId:t.flowId}:{}},e)}catch{return e()}}n(runInFlowContext,"runInFlowContext");function liveFlowContext(){try{return getCtx?.()}catch{return}}n(liveFlowContext,"liveFlowContext");function flowContext(){const t=liveFlowContext();if(t)return{...t.flowId?{flowId:t.flowId}:{},...t.requestId?{requestId:t.requestId}:{},...t.originNodeId?{originNodeId:t.originNodeId}:{}}}n(flowContext,"flowContext");
package/lib/install.js CHANGED
@@ -1 +1 @@
1
- "use strict";var p=Object.defineProperty;var a=(t,r)=>p(t,"name",{value:r,configurable:!0});var s=Object.defineProperty,e=a((t,r)=>s(t,"name",{value:r,configurable:!0}),"e");Object.defineProperty(exports,"__esModule",{value:!0}),exports.installLensmcpNodeInstrumentation=installLensmcpNodeInstrumentation;const require_hook_1=require("./require-hook"),flow_context_1=require("./flow-context"),tap_egress_1=require("./tap-egress"),tap_fs_1=require("./tap-fs"),tap_exec_1=require("./tap-exec"),tap_pg_1=require("./tap-pg"),tap_redis_1=require("./tap-redis"),active_work_1=require("./active-work"),tap_bullmq_1=require("./tap-bullmq"),tap_nest_1=require("./tap-nest"),tap_event_loop_1=require("./tap-event-loop"),tap_stdout_1=require("./tap-stdout");function installLensmcpNodeInstrumentation(){const t=globalThis;if(!t.__lensmcpNodeInstrumented&&(t.__lensmcpNodeInstrumented=!0,process.env.LENSMCP_AUTO!=="0")){try{(0,active_work_1.installActiveWorkProbe)()}catch{}try{(0,flow_context_1.primeFlowContext)()}catch{}try{(0,tap_egress_1.tapEgress)()}catch{}try{(0,tap_fs_1.tapFs)()}catch{}try{(0,tap_exec_1.tapExec)()}catch{}try{(0,tap_stdout_1.tapStdout)()}catch{}try{(0,tap_event_loop_1.tapEventLoop)()}catch{}try{(0,require_hook_1.installRequireHook)({pg:tap_pg_1.pgTap,ioredis:tap_redis_1.redisTap,bullmq:tap_bullmq_1.bullmqTap,"@nestjs/core":tap_nest_1.nestTap})}catch{}try{(0,tap_nest_1.installChildAppBridge)()}catch{}}}a(installLensmcpNodeInstrumentation,"installLensmcpNodeInstrumentation"),e(installLensmcpNodeInstrumentation,"installLensmcpNodeInstrumentation");
1
+ "use strict";var s=Object.defineProperty;var e=(t,r)=>s(t,"name",{value:r,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.installLensmcpNodeInstrumentation=installLensmcpNodeInstrumentation;const require_hook_1=require("./require-hook"),flow_context_1=require("./flow-context"),tap_egress_1=require("./tap-egress"),tap_fs_1=require("./tap-fs"),tap_exec_1=require("./tap-exec"),tap_pg_1=require("./tap-pg"),tap_redis_1=require("./tap-redis"),active_work_1=require("./active-work"),tap_bullmq_1=require("./tap-bullmq"),tap_nest_1=require("./tap-nest"),tap_event_loop_1=require("./tap-event-loop"),tap_stdout_1=require("./tap-stdout");function installLensmcpNodeInstrumentation(){const t=globalThis;if(!t.__lensmcpNodeInstrumented&&(t.__lensmcpNodeInstrumented=!0,process.env.LENSMCP_AUTO!=="0")){try{(0,active_work_1.installActiveWorkProbe)()}catch{}try{(0,flow_context_1.primeFlowContext)()}catch{}try{(0,tap_egress_1.tapEgress)()}catch{}try{(0,tap_fs_1.tapFs)()}catch{}try{(0,tap_exec_1.tapExec)()}catch{}try{(0,tap_stdout_1.tapStdout)()}catch{}try{(0,tap_event_loop_1.tapEventLoop)()}catch{}try{(0,require_hook_1.installRequireHook)({pg:tap_pg_1.pgTap,ioredis:tap_redis_1.redisTap,bullmq:tap_bullmq_1.bullmqTap,"@nestjs/core":tap_nest_1.nestTap})}catch{}try{(0,tap_nest_1.installChildAppBridge)()}catch{}}}e(installLensmcpNodeInstrumentation,"installLensmcpNodeInstrumentation");
@@ -1 +1 @@
1
- "use strict";var l=Object.defineProperty;var s=(e,n)=>l(e,"name",{value:n,configurable:!0});var a=Object.defineProperty,r=s((e,n)=>a(e,"name",{value:n,configurable:!0}),"r");Object.defineProperty(exports,"__esModule",{value:!0}),exports.installRequireHook=installRequireHook;const tapped=new Set;function runTap(e,n,u){try{n(u)!==!1&&tapped.add(e)}catch{tapped.add(e)}}s(runTap,"runTap"),r(runTap,"runTap");function installRequireHook(e){const n=require("node:module"),u=n._load;n._load=function(t,...c){const i=u.call(this,t,...c),o=e[t];return o&&!tapped.has(t)&&runTap(t,o,i),i};for(const t of Object.keys(e)){if(tapped.has(t))continue;const c=e[t];if(c)try{const i=require.resolve(t),o=require.cache[i];o&&runTap(t,c,o.exports)}catch{}}}s(installRequireHook,"installRequireHook"),r(installRequireHook,"installRequireHook");
1
+ "use strict";var a=Object.defineProperty;var r=(o,t)=>a(o,"name",{value:t,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.installRequireHook=installRequireHook;const tapped=new Set;function runTap(o,t,s){try{t(s)!==!1&&tapped.add(o)}catch{tapped.add(o)}}r(runTap,"runTap");function installRequireHook(o){const t=require("node:module"),s=t._load;t._load=function(e,...c){const i=s.call(this,e,...c),n=o[e];return n&&!tapped.has(e)&&runTap(e,n,i),i};for(const e of Object.keys(o)){if(tapped.has(e))continue;const c=o[e];if(c)try{const i=require.resolve(e),n=require.cache[i];n&&runTap(e,c,n.exports)}catch{}}}r(installRequireHook,"installRequireHook");
package/lib/tap-bullmq.js CHANGED
@@ -1 +1 @@
1
- "use strict";var b=Object.defineProperty;var f=(n,e)=>b(n,"name",{value:e,configurable:!0});var w=Object.defineProperty,l=f((n,e)=>w(n,"name",{value:e,configurable:!0}),"l");Object.defineProperty(exports,"__esModule",{value:!0}),exports.bullmqTap=bullmqTap;const active_work_1=require("./active-work"),workerGeneration=new WeakMap,emit_1=require("./emit"),flow_context_1=require("./flow-context");function jobFlow(n){const e=n?.opts?.__lensmcpFlow;return e&&typeof e=="object"?e:void 0}f(jobFlow,"jobFlow"),l(jobFlow,"jobFlow");const jobLegId=l((n,e)=>`job:${n}#${e?.id??"?"}`,"jobLegId"),publishers=new Map;function bullmqTap(n){const e=n;if(typeof e?.Queue!="function"||typeof e?.Worker!="function")return!1;try{tapQueueAdd(e)}catch{}try{tapWorkerEmit(e)}catch{}try{tapWorkerProcess(e)}catch{}try{tapWorkerConstruct(e)}catch{}return!0}f(bullmqTap,"bullmqTap"),l(bullmqTap,"bullmqTap");function tapWorkerConstruct(n){const e=n.Worker;if(typeof e!="function"||e.__lensmcpGen)return;const u=new Proxy(e,{construct(r,t,s){const a=Reflect.construct(r,t,s);try{workerGeneration.set(a,(0,active_work_1.activeWorkGeneration)())}catch{}return a}});Object.defineProperty(e,"__lensmcpGen",{value:!0,enumerable:!1}),n.Worker=u}f(tapWorkerConstruct,"tapWorkerConstruct"),l(tapWorkerConstruct,"tapWorkerConstruct");function tapWorkerProcess(n){const e=n.Worker?.prototype,u=e?.callProcessJob;if(!e||typeof u!="function"||u.__lensmcp)return;const r=l(async function(t,...s){const a=workerGeneration.get(this),i=(0,active_work_1.beginActiveWork)(a),c=jobFlow(t);if(!c?.flowId)return u.call(this,t,...s).finally(i);const o=String(this?.name??t?.queueName??"queue"),m=jobLegId(o,t),d=Date.now(),p={flowId:c.flowId,requestId:m};return(0,flow_context_1.runInFlowContext)(p,async()=>{try{const q=await u.call(this,t,...s);return(0,emit_1.lensEmit)("queue","info",`process ${t?.name}#${t?.id} (${Date.now()-d}ms)`,{queue:o,kind:"queue-process",job:t?.name,jobId:t?.id,startedAt:d,durationMs:Date.now()-d,status:"ok"},`queue:${o}`,p),q}catch(q){throw(0,emit_1.lensEmit)("queue","error",`process ${t?.name}#${t?.id} failed (${Date.now()-d}ms)`,{queue:o,kind:"queue-process",job:t?.name,jobId:t?.id,startedAt:d,durationMs:Date.now()-d,status:"error",error:String(q?.message??q)},`queue:${o}`,p),q}finally{i()}})},"wrapped");r.__lensmcp=!0,e.callProcessJob=r}f(tapWorkerProcess,"tapWorkerProcess"),l(tapWorkerProcess,"tapWorkerProcess");function tapQueueAdd(n){const e=n.Queue?.prototype,u=e?.add;if(!e||typeof u!="function"||u.__lensmcp)return;const r=l(async function(t,...s){const a=Date.now(),i=(0,flow_context_1.flowContext)();if(i?.flowId){const o=s[1]??{};s[1]={...o,__lensmcpFlow:{flowId:i.flowId,...i.requestId?{originRequestId:i.requestId}:{}}}}const c=await u.call(this,t,...s);try{const o=String(this?.name??"queue"),m=s[0];let d;try{const p=JSON.stringify(m);d=p&&p!=="undefined"?p.length>300?p.slice(0,299)+"\u2026":p:void 0}catch{}(0,emit_1.lensEmit)("queue","info",`enqueued ${t}#${c?.id} \u2192 ${o}`,{queue:o,kind:"queue-enqueued",job:t,jobId:c?.id,...d?{data:d}:{},startedAt:a,durationMs:Date.now()-a},`queue:${o}`,i),ensureStatePublisher(o,this)}catch{}return c},"wrapped");r.__lensmcp=!0,e.add=r}f(tapQueueAdd,"tapQueueAdd"),l(tapQueueAdd,"tapQueueAdd");function tapWorkerEmit(n){const e=n.Worker?.prototype,u=e?.emit;if(!e||typeof u!="function"||u.__lensmcp)return;const r=l(function(t,...s){try{observeWorkerEvent(this,String(t),s)}catch{}return u.call(this,t,...s)},"wrapped");r.__lensmcp=!0,e.emit=r}f(tapWorkerEmit,"tapWorkerEmit"),l(tapWorkerEmit,"tapWorkerEmit");function observeWorkerEvent(n,e,u){if(e!=="active"&&e!=="completed"&&e!=="failed")return;const r=String(n.name??"queue"),t=u[0],s=jobFlow(t),a=s?.flowId?{flowId:s.flowId,requestId:jobLegId(r,t)}:void 0;if(e==="active")(0,emit_1.lensEmit)("queue","info",`processing ${t?.name}#${t?.id}`,{queue:r,kind:"queue-active",jobId:t?.id},`queue:${r}`,a);else if(e==="completed"){let i;try{const c=t?.returnvalue??u[1],o=JSON.stringify(c);i=o&&o!=="undefined"?o.length>160?o.slice(0,159)+"\u2026":o:void 0}catch{}(0,emit_1.lensEmit)("queue","info",`completed ${t?.name}#${t?.id}`,{queue:r,kind:"queue-completed",jobId:t?.id,...i?{returned:i}:{}},`queue:${r}`,a)}else{const i=u[1];(0,emit_1.lensEmit)("queue","error",`job ${t?.id} failed: ${i?.message}`,{queue:r,kind:"queue-failed",jobId:t?.id,error:String(i?.message??i)},`queue:${r}`,a)}if(!publishers.has(r))try{const i=n.opts,c=require("bullmq").Queue;ensureStatePublisher(r,new c(r,{connection:i?.connection}))}catch{}}f(observeWorkerEvent,"observeWorkerEvent"),l(observeWorkerEvent,"observeWorkerEvent");function ensureStatePublisher(n,e){if(publishers.has(n))return;let u="";const r=setInterval(()=>{(async()=>{try{const t=await e.getJobCounts(),s=[];for(const c of["active","waiting","failed","completed","delayed"])for(const o of await e.getJobs([c],0,7)){const m=o?.data?.to;s.push({id:String(o.id),name:o.name,state:c,timestamp:o.timestamp??0,...typeof m=="string"?{to:m}:{}})}s.sort((c,o)=>Number(o.timestamp)-Number(c.timestamp));const a=s.slice(0,8),i=JSON.stringify([t,a.map(c=>`${c.id}${c.state}`)]);if(i===u)return;u=i,(0,emit_1.lensEmit)("queue","info",`queue state: ${t.active??0} active \xB7 ${t.waiting??0} waiting \xB7 ${t.failed??0} failed`,{queue:n,kind:"queue-state",counts:t,recent:a},`queue:${n}`)}catch{}})()},2e3);r.unref?.(),publishers.set(n,r)}f(ensureStatePublisher,"ensureStatePublisher"),l(ensureStatePublisher,"ensureStatePublisher");
1
+ "use strict";var w=Object.defineProperty;var l=(r,e)=>w(r,"name",{value:e,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.bullmqTap=bullmqTap;const active_work_1=require("./active-work"),workerGeneration=new WeakMap,emit_1=require("./emit"),flow_context_1=require("./flow-context");function jobFlow(r){const e=r?.opts?.__lensmcpFlow;return e&&typeof e=="object"?e:void 0}l(jobFlow,"jobFlow");const jobLegId=l((r,e)=>`job:${r}#${e?.id??"?"}`,"jobLegId"),publishers=new Map;function bullmqTap(r){const e=r;if(typeof e?.Queue!="function"||typeof e?.Worker!="function")return!1;try{tapQueueAdd(e)}catch{}try{tapWorkerEmit(e)}catch{}try{tapWorkerProcess(e)}catch{}try{tapWorkerConstruct(e)}catch{}return!0}l(bullmqTap,"bullmqTap");function tapWorkerConstruct(r){const e=r.Worker;if(typeof e!="function"||e.__lensmcpGen)return;const u=new Proxy(e,{construct(n,o,t){const c=Reflect.construct(n,o,t);try{workerGeneration.set(c,(0,active_work_1.activeWorkGeneration)())}catch{}return c}});Object.defineProperty(e,"__lensmcpGen",{value:!0,enumerable:!1}),r.Worker=u}l(tapWorkerConstruct,"tapWorkerConstruct");function tapWorkerProcess(r){const u=r.Worker?.prototype,n=u?.callProcessJob;if(!u||typeof n!="function"||n.__lensmcp)return;const o=l(async function(t,...c){const a=workerGeneration.get(this),i=(0,active_work_1.beginActiveWork)(a),s=jobFlow(t);if(!s?.flowId)return n.call(this,t,...c).finally(i);const d=String(this?.name??t?.queueName??"queue"),q=jobLegId(d,t),f=Date.now(),p={flowId:s.flowId,requestId:q};return(0,flow_context_1.runInFlowContext)(p,async()=>{try{const m=await n.call(this,t,...c);return(0,emit_1.lensEmit)("queue","info",`process ${t?.name}#${t?.id} (${Date.now()-f}ms)`,{queue:d,kind:"queue-process",job:t?.name,jobId:t?.id,startedAt:f,durationMs:Date.now()-f,status:"ok"},`queue:${d}`,p),m}catch(m){throw(0,emit_1.lensEmit)("queue","error",`process ${t?.name}#${t?.id} failed (${Date.now()-f}ms)`,{queue:d,kind:"queue-process",job:t?.name,jobId:t?.id,startedAt:f,durationMs:Date.now()-f,status:"error",error:String(m?.message??m)},`queue:${d}`,p),m}finally{i()}})},"wrapped");o.__lensmcp=!0,u.callProcessJob=o}l(tapWorkerProcess,"tapWorkerProcess");function tapQueueAdd(r){const u=r.Queue?.prototype,n=u?.add;if(!u||typeof n!="function"||n.__lensmcp)return;const o=l(async function(t,...c){const a=Date.now(),i=(0,flow_context_1.flowContext)();if(i?.flowId){const d=c[1]??{};c[1]={...d,__lensmcpFlow:{flowId:i.flowId,...i.requestId?{originRequestId:i.requestId}:{}}}}const s=await n.call(this,t,...c);try{const d=String(this?.name??"queue"),q=c[0];let f;try{const p=JSON.stringify(q);f=p&&p!=="undefined"?p.length>300?p.slice(0,299)+"\u2026":p:void 0}catch{}(0,emit_1.lensEmit)("queue","info",`enqueued ${t}#${s?.id} \u2192 ${d}`,{queue:d,kind:"queue-enqueued",job:t,jobId:s?.id,...f?{data:f}:{},startedAt:a,durationMs:Date.now()-a},`queue:${d}`,i),ensureStatePublisher(d,this)}catch{}return s},"wrapped");o.__lensmcp=!0,u.add=o}l(tapQueueAdd,"tapQueueAdd");function tapWorkerEmit(r){const u=r.Worker?.prototype,n=u?.emit;if(!u||typeof n!="function"||n.__lensmcp)return;const o=l(function(t,...c){try{observeWorkerEvent(this,String(t),c)}catch{}return n.call(this,t,...c)},"wrapped");o.__lensmcp=!0,u.emit=o}l(tapWorkerEmit,"tapWorkerEmit");function observeWorkerEvent(r,e,u){if(e!=="active"&&e!=="completed"&&e!=="failed")return;const n=String(r.name??"queue"),o=u[0],t=jobFlow(o),c=t?.flowId?{flowId:t.flowId,requestId:jobLegId(n,o)}:void 0;if(e==="active")(0,emit_1.lensEmit)("queue","info",`processing ${o?.name}#${o?.id}`,{queue:n,kind:"queue-active",jobId:o?.id},`queue:${n}`,c);else if(e==="completed"){let a;try{const i=o?.returnvalue??u[1],s=JSON.stringify(i);a=s&&s!=="undefined"?s.length>160?s.slice(0,159)+"\u2026":s:void 0}catch{}(0,emit_1.lensEmit)("queue","info",`completed ${o?.name}#${o?.id}`,{queue:n,kind:"queue-completed",jobId:o?.id,...a?{returned:a}:{}},`queue:${n}`,c)}else{const a=u[1];(0,emit_1.lensEmit)("queue","error",`job ${o?.id} failed: ${a?.message}`,{queue:n,kind:"queue-failed",jobId:o?.id,error:String(a?.message??a)},`queue:${n}`,c)}if(!publishers.has(n))try{const a=r.opts,s=require("bullmq").Queue;ensureStatePublisher(n,new s(n,{connection:a?.connection}))}catch{}}l(observeWorkerEvent,"observeWorkerEvent");function ensureStatePublisher(r,e){if(publishers.has(r))return;let u="";const n=setInterval(()=>{(async()=>{try{const o=await e.getJobCounts(),t=[];for(const i of["active","waiting","failed","completed","delayed"])for(const s of await e.getJobs([i],0,7)){const d=s?.data?.to;t.push({id:String(s.id),name:s.name,state:i,timestamp:s.timestamp??0,...typeof d=="string"?{to:d}:{}})}t.sort((i,s)=>Number(s.timestamp)-Number(i.timestamp));const c=t.slice(0,8),a=JSON.stringify([o,c.map(i=>`${i.id}${i.state}`)]);if(a===u)return;u=a,(0,emit_1.lensEmit)("queue","info",`queue state: ${o.active??0} active \xB7 ${o.waiting??0} waiting \xB7 ${o.failed??0} failed`,{queue:r,kind:"queue-state",counts:o,recent:c},`queue:${r}`)}catch{}})()},2e3);n.unref?.(),publishers.set(r,n)}l(ensureStatePublisher,"ensureStatePublisher");
package/lib/tap-egress.js CHANGED
@@ -1 +1 @@
1
- "use strict";var y=Object.defineProperty;var f=(t,s)=>y(t,"name",{value:s,configurable:!0});var g=Object.defineProperty,i=f((t,s)=>g(t,"name",{value:s,configurable:!0}),"i");Object.defineProperty(exports,"__esModule",{value:!0}),exports.tapEgress=tapEgress,exports.resetEgressTapForTests=resetEgressTapForTests;const redact_1=require("@lensmcp/core/redact"),emit_1=require("./emit"),flow_context_1=require("./flow-context"),INTERNAL=[/\.local$/i,/\.internal$/i,/^localhost$/i,/^127\./,/^\[?::1\]?$/,/^0\.0\.0\.0$/,/^10\./,/^192\.168\./,/^172\.(1[6-9]|2\d|3[01])\./,/^169\.254\./,/^\[?[fF][cCdD][0-9a-fA-F]{2}:/,/^\[?[fF][eE]80:/],isInternal=i(t=>t===""||INTERNAL.some(s=>s.test(t)),"isInternal"),CAPTURE_QUERY=process.env.LENSMCP_EGRESS_QUERY==="1",MAX_PATH_CHARS=256,clipPath=i(t=>t.length>MAX_PATH_CHARS?`${t.slice(0,MAX_PATH_CHARS)}\u2026`:t,"clipPath");function capturePath(t,s){const e=t||"/";return!CAPTURE_QUERY||s.length<=1?clipPath(e):(0,redact_1.redactUrl)(`${e}${s}`)}f(capturePath,"capturePath"),i(capturePath,"capturePath");const fingerprintFor=i((t,s)=>s?`external:error:${t}`:`external:${t}`,"fingerprintFor");function tapEgress(){tapFetch(),tapHttpModule("http"),tapHttpModule("https")}f(tapEgress,"tapEgress"),i(tapEgress,"tapEgress");let savedFetch;const httpOriginals=new Map;function resetEgressTapForTests(){const t=globalThis;savedFetch&&(t.fetch=savedFetch),delete t.__lensmcpFetchTap,restoreHttp("http"),restoreHttp("https"),savedFetch=void 0}f(resetEgressTapForTests,"resetEgressTapForTests"),i(resetEgressTapForTests,"resetEgressTapForTests");function restoreHttp(t){const s=httpOriginals.get(t);if(!s)return;const e=require(`node:${t}`);e.request=s.request,e.get=s.get,httpOriginals.delete(t)}f(restoreHttp,"restoreHttp"),i(restoreHttp,"restoreHttp");function tapFetch(){const t=globalThis;if(typeof t.fetch!="function"||t.__lensmcpFetchTap)return;t.__lensmcpFetchTap=!0;const s=t.fetch.bind(globalThis);savedFetch=t.fetch,t.fetch=(async(e,a)=>{let r="",c="/",o=!1;try{const p=new URL(typeof e=="string"?e:e instanceof URL?e.href:e.url);r=p.hostname,o=p.search.length>1,c=capturePath(p.pathname,p.search)}catch{}if(isInternal(r))return s(e,a);const n=Date.now(),u=(0,flow_context_1.flowContext)(),h=(0,flow_context_1.liveFlowContext)();h&&(h.externalCallCount=(h.externalCallCount??0)+1);const d=typeof e=="object"&&e!==null&&!(e instanceof URL)?e.method:void 0,l=String(a?.method??d??"GET").toUpperCase();try{const p=await s(e,a),m=p.status>=500;return(0,emit_1.lensEmit)("external","info",`egress ${l} ${r} \u2192 ${p.status}`,{name:r,kind:"egress",method:l,host:r,path:c,status:p.status,...o?{hasQuery:!0}:{},startedAt:n,durationMs:Date.now()-n},fingerprintFor(r,m),u),p}catch(p){throw(0,emit_1.lensEmit)("external","error",`egress ${l} ${r} failed`,{name:r,kind:"egress",method:l,host:r,path:c,...o?{hasQuery:!0}:{},error:String(p?.message??p),startedAt:n,durationMs:Date.now()-n},fingerprintFor(r,!0),u),p}})}f(tapFetch,"tapFetch"),i(tapFetch,"tapFetch");function tapHttpModule(t){const s=require(`node:${t}`),e=s.request;if(typeof e!="function"||e.__lensmcp)return;httpOriginals.set(t,{request:e,get:s.get});const a=i(function(...r){const c=e.apply(this,r);try{observe(r,c)}catch{}return c},"wrapped");a.__lensmcp=!0,s.request=a,typeof s.get=="function"&&(s.get=function(...r){const c=a.apply(this,r);return c.end(),c})}f(tapHttpModule,"tapHttpModule"),i(tapHttpModule,"tapHttpModule");function observe(t,s){const{host:e,method:a,path:r,hasQuery:c}=parseTarget(t);if(isInternal(e))return;const o=Date.now(),n=(0,flow_context_1.flowContext)(),u=(0,flow_context_1.liveFlowContext)();u&&(u.externalCallCount=(u.externalCallCount??0)+1);let h=!1;s.once("response",(...d)=>{if(h)return;h=!0;const l=d[0]?.statusCode;(0,emit_1.lensEmit)("external","info",`egress ${a} ${e} \u2192 ${l??"?"}`,{name:e,kind:"egress",method:a,host:e,path:r,...l!=null?{status:l}:{},...c?{hasQuery:!0}:{},startedAt:o,durationMs:Date.now()-o},fingerprintFor(e,l!=null&&l>=500),n)}),s.once("error",(...d)=>{if(h)return;h=!0;const l=d[0];(0,emit_1.lensEmit)("external","error",`egress ${a} ${e} failed`,{name:e,kind:"egress",method:a,host:e,path:r,...c?{hasQuery:!0}:{},error:String(l?.message??l),startedAt:o,durationMs:Date.now()-o},fingerprintFor(e,!0),n)})}f(observe,"observe"),i(observe,"observe");function parseTarget(t){let s="",e="GET",a="/",r=!1;const c=i((o,n)=>{r=n.length>1,a=capturePath(o,n)},"take");for(const o of t)if(typeof o=="string")try{const n=new URL(o);s=n.hostname,c(n.pathname,n.search)}catch{}else if(o instanceof URL)s=o.hostname,c(o.pathname,o.search);else if(o&&typeof o=="object"){const n=o;if(typeof n.method=="string"&&(e=n.method.toUpperCase()),typeof n.socketPath=="string")return{host:"",method:e,path:a,hasQuery:r};if(typeof n.path=="string"){const u=n.path,h=u.indexOf("?");c(h===-1?u:u.slice(0,h),h===-1?"":u.slice(h))}typeof n.hostname=="string"&&n.hostname?s=n.hostname:typeof n.host=="string"&&n.host&&(s=n.host.split(":")[0]??"")}return{host:s,method:e,path:a,hasQuery:r}}f(parseTarget,"parseTarget"),i(parseTarget,"parseTarget");
1
+ "use strict";var g=Object.defineProperty;var i=(t,s)=>g(t,"name",{value:s,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.tapEgress=tapEgress,exports.resetEgressTapForTests=resetEgressTapForTests;const redact_1=require("@lensmcp/core/redact"),emit_1=require("./emit"),flow_context_1=require("./flow-context"),INTERNAL=[/\.local$/i,/\.internal$/i,/^localhost$/i,/^127\./,/^\[?::1\]?$/,/^0\.0\.0\.0$/,/^10\./,/^192\.168\./,/^172\.(1[6-9]|2\d|3[01])\./,/^169\.254\./,/^\[?[fF][cCdD][0-9a-fA-F]{2}:/,/^\[?[fF][eE]80:/],isInternal=i(t=>t===""||INTERNAL.some(s=>s.test(t)),"isInternal"),CAPTURE_QUERY=process.env.LENSMCP_EGRESS_QUERY==="1",MAX_PATH_CHARS=256,clipPath=i(t=>t.length>MAX_PATH_CHARS?`${t.slice(0,MAX_PATH_CHARS)}\u2026`:t,"clipPath");function capturePath(t,s){const e=t||"/";return!CAPTURE_QUERY||s.length<=1?clipPath(e):(0,redact_1.redactUrl)(`${e}${s}`)}i(capturePath,"capturePath");const fingerprintFor=i((t,s)=>s?`external:error:${t}`:`external:${t}`,"fingerprintFor");function tapEgress(){tapFetch(),tapHttpModule("http"),tapHttpModule("https")}i(tapEgress,"tapEgress");let savedFetch;const httpOriginals=new Map;function resetEgressTapForTests(){const t=globalThis;savedFetch&&(t.fetch=savedFetch),delete t.__lensmcpFetchTap,restoreHttp("http"),restoreHttp("https"),savedFetch=void 0}i(resetEgressTapForTests,"resetEgressTapForTests");function restoreHttp(t){const s=httpOriginals.get(t);if(!s)return;const e=require(`node:${t}`);e.request=s.request,e.get=s.get,httpOriginals.delete(t)}i(restoreHttp,"restoreHttp");function tapFetch(){const t=globalThis;if(typeof t.fetch!="function"||t.__lensmcpFetchTap)return;t.__lensmcpFetchTap=!0;const s=t.fetch.bind(globalThis);savedFetch=t.fetch,t.fetch=(async(e,c)=>{let a="",l="/",n=!1;try{const o=new URL(typeof e=="string"?e:e instanceof URL?e.href:e.url);a=o.hostname,n=o.search.length>1,l=capturePath(o.pathname,o.search)}catch{}if(isInternal(a))return s(e,c);const r=Date.now(),u=(0,flow_context_1.flowContext)(),f=(0,flow_context_1.liveFlowContext)();f&&(f.externalCallCount=(f.externalCallCount??0)+1);const p=typeof e=="object"&&e!==null&&!(e instanceof URL)?e.method:void 0,h=String(c?.method??p??"GET").toUpperCase();try{const o=await s(e,c),d=o.status>=500;return(0,emit_1.lensEmit)("external","info",`egress ${h} ${a} \u2192 ${o.status}`,{name:a,kind:"egress",method:h,host:a,path:l,status:o.status,...n?{hasQuery:!0}:{},startedAt:r,durationMs:Date.now()-r},fingerprintFor(a,d),u),o}catch(o){throw(0,emit_1.lensEmit)("external","error",`egress ${h} ${a} failed`,{name:a,kind:"egress",method:h,host:a,path:l,...n?{hasQuery:!0}:{},error:String(o?.message??o),startedAt:r,durationMs:Date.now()-r},fingerprintFor(a,!0),u),o}})}i(tapFetch,"tapFetch");function tapHttpModule(t){const s=require(`node:${t}`),e=s.request;if(typeof e!="function"||e.__lensmcp)return;httpOriginals.set(t,{request:e,get:s.get});const c=i(function(...l){const n=e.apply(this,l);try{observe(l,n)}catch{}return n},"wrapped");c.__lensmcp=!0,s.request=c,typeof s.get=="function"&&(s.get=function(...l){const n=c.apply(this,l);return n.end(),n})}i(tapHttpModule,"tapHttpModule");function observe(t,s){const{host:e,method:c,path:a,hasQuery:l}=parseTarget(t);if(isInternal(e))return;const n=Date.now(),r=(0,flow_context_1.flowContext)(),u=(0,flow_context_1.liveFlowContext)();u&&(u.externalCallCount=(u.externalCallCount??0)+1);let f=!1;s.once("response",(...p)=>{if(f)return;f=!0;const o=p[0]?.statusCode;(0,emit_1.lensEmit)("external","info",`egress ${c} ${e} \u2192 ${o??"?"}`,{name:e,kind:"egress",method:c,host:e,path:a,...o!=null?{status:o}:{},...l?{hasQuery:!0}:{},startedAt:n,durationMs:Date.now()-n},fingerprintFor(e,o!=null&&o>=500),r)}),s.once("error",(...p)=>{if(f)return;f=!0;const h=p[0];(0,emit_1.lensEmit)("external","error",`egress ${c} ${e} failed`,{name:e,kind:"egress",method:c,host:e,path:a,...l?{hasQuery:!0}:{},error:String(h?.message??h),startedAt:n,durationMs:Date.now()-n},fingerprintFor(e,!0),r)})}i(observe,"observe");function parseTarget(t){let s="",e="GET",c="/",a=!1;const l=i((n,r)=>{a=r.length>1,c=capturePath(n,r)},"take");for(const n of t)if(typeof n=="string")try{const r=new URL(n);s=r.hostname,l(r.pathname,r.search)}catch{}else if(n instanceof URL)s=n.hostname,l(n.pathname,n.search);else if(n&&typeof n=="object"){const r=n;if(typeof r.method=="string"&&(e=r.method.toUpperCase()),typeof r.socketPath=="string")return{host:"",method:e,path:c,hasQuery:a};if(typeof r.path=="string"){const u=r.path,f=u.indexOf("?");l(f===-1?u:u.slice(0,f),f===-1?"":u.slice(f))}typeof r.hostname=="string"&&r.hostname?s=r.hostname:typeof r.host=="string"&&r.host&&(s=r.host.split(":")[0]??"")}return{host:s,method:e,path:c,hasQuery:a}}i(parseTarget,"parseTarget");
@@ -1 +1 @@
1
- "use strict";var m=Object.defineProperty;var r=(e,o)=>m(e,"name",{value:o,configurable:!0});var a=Object.defineProperty,n=r((e,o)=>a(e,"name",{value:o,configurable:!0}),"n");Object.defineProperty(exports,"__esModule",{value:!0}),exports.tapEventLoop=tapEventLoop,exports.stopEventLoopTapForTests=stopEventLoopTapForTests;const node_perf_hooks_1=require("node:perf_hooks"),emit_1=require("./emit"),SAMPLE_MS=(()=>{const e=Number(process.env.LENSMCP_EVENT_LOOP_SAMPLE_MS);return Number.isFinite(e)&&e>=1e3?e:3e4})(),REPORT_ABOVE_MS=(()=>{const e=Number(process.env.LENSMCP_EVENT_LOOP_MIN_MS);return Number.isFinite(e)&&e>=0?e:50})(),RESOLUTION_MS=20;let timer,published=!1;function tapEventLoop(){if(process.env.LENSMCP_EVENT_LOOP==="0"||timer)return;const e=(0,node_perf_hooks_1.monitorEventLoopDelay)({resolution:RESOLUTION_MS});e.enable(),timer=setInterval(()=>{const o=RESOLUTION_MS,s=e.mean/1e6;if(!Number.isFinite(s))return;const i=Math.max(0,s-o),t=Math.max(0,e.max/1e6-o),p=Math.max(0,e.percentile(99)/1e6-o);e.reset(),!(published&&t<REPORT_ABOVE_MS)&&(published=!0,(0,emit_1.lensEmit)("perf",t>=1e3?"error":"info",`event loop lag ${i.toFixed(1)}ms mean / ${t.toFixed(1)}ms max`,{kind:"event-loop-lag",lagMs:Number(i.toFixed(2)),maxMs:Number(t.toFixed(2)),p99Ms:Number(p.toFixed(2)),windowMs:SAMPLE_MS},"perf:event-loop-lag",void 0,"performance"))},SAMPLE_MS),timer.unref?.()}r(tapEventLoop,"tapEventLoop"),n(tapEventLoop,"tapEventLoop");function stopEventLoopTapForTests(){timer&&clearInterval(timer),timer=void 0,published=!1}r(stopEventLoopTapForTests,"stopEventLoopTapForTests"),n(stopEventLoopTapForTests,"stopEventLoopTapForTests");
1
+ "use strict";var a=Object.defineProperty;var n=(e,t)=>a(e,"name",{value:t,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.tapEventLoop=tapEventLoop,exports.stopEventLoopTapForTests=stopEventLoopTapForTests;const node_perf_hooks_1=require("node:perf_hooks"),emit_1=require("./emit"),SAMPLE_MS=(()=>{const e=Number(process.env.LENSMCP_EVENT_LOOP_SAMPLE_MS);return Number.isFinite(e)&&e>=1e3?e:3e4})(),REPORT_ABOVE_MS=(()=>{const e=Number(process.env.LENSMCP_EVENT_LOOP_MIN_MS);return Number.isFinite(e)&&e>=0?e:50})(),RESOLUTION_MS=20;let timer,published=!1;function tapEventLoop(){if(process.env.LENSMCP_EVENT_LOOP==="0"||timer)return;const e=(0,node_perf_hooks_1.monitorEventLoopDelay)({resolution:RESOLUTION_MS});e.enable(),timer=setInterval(()=>{const t=RESOLUTION_MS,r=e.mean/1e6;if(!Number.isFinite(r))return;const s=Math.max(0,r-t),o=Math.max(0,e.max/1e6-t),i=Math.max(0,e.percentile(99)/1e6-t);e.reset(),!(published&&o<REPORT_ABOVE_MS)&&(published=!0,(0,emit_1.lensEmit)("perf",o>=1e3?"error":"info",`event loop lag ${s.toFixed(1)}ms mean / ${o.toFixed(1)}ms max`,{kind:"event-loop-lag",lagMs:Number(s.toFixed(2)),maxMs:Number(o.toFixed(2)),p99Ms:Number(i.toFixed(2)),windowMs:SAMPLE_MS},"perf:event-loop-lag",void 0,"performance"))},SAMPLE_MS),timer.unref?.()}n(tapEventLoop,"tapEventLoop");function stopEventLoopTapForTests(){timer&&clearInterval(timer),timer=void 0,published=!1}n(stopEventLoopTapForTests,"stopEventLoopTapForTests");
package/lib/tap-exec.js CHANGED
@@ -1 +1 @@
1
- "use strict";var f=Object.defineProperty;var l=(t,e)=>f(t,"name",{value:e,configurable:!0});var x=Object.defineProperty,u=l((t,e)=>x(t,"name",{value:e,configurable:!0}),"u");Object.defineProperty(exports,"__esModule",{value:!0}),exports.tapExec=tapExec;const emit_1=require("./emit"),fmtCmd=u((t,e)=>{const c=Array.isArray(e)?e.map(String).slice(0,8).join(" "):"";return`${String(t)}${c?" "+c:""}`.slice(0,200)},"fmtCmd");function wrap(t,e,c){const n=t[e];if(typeof n!="function"||n.__lensmcp)return;const r=c(n);r.__lensmcp=!0,t[e]=r}l(wrap,"wrap"),u(wrap,"wrap");function observeChild(t,e,c){if(!c||typeof c.once!="function")return;const n=c;if(n.__lensmcpObserved)return;n.__lensmcpObserved=!0;const r=Date.now();c.once("exit",(...s)=>{const i=s[0],a=s[1];(0,emit_1.lensEmit)("exec",i===0?"info":"error",`exec ${e.split(" ")[0]} \u2192 ${i??a}`,{name:"exec",kind:"exec",cmd:e,via:t,...i!=null?{code:i}:{},...a?{signal:a}:{},durationMs:Date.now()-r,...c.pid?{pid:c.pid}:{}})}),c.once("error",(...s)=>{const i=s[0];(0,emit_1.lensEmit)("exec","error",`exec ${e.split(" ")[0]} failed to start`,{name:"exec",kind:"exec",cmd:e,via:t,error:String(i?.message??i),durationMs:Date.now()-r})})}l(observeChild,"observeChild"),u(observeChild,"observeChild");function tapExec(){const t=require("node:child_process");for(const e of["spawn","fork"])wrap(t,e,c=>function(n,...r){const s=Array.isArray(r[0])?r[0]:[],i=c.call(this,n,...r);try{observeChild(e,fmtCmd(n,s),i)}catch{}return i});wrap(t,"exec",e=>function(c,...n){const r=e.call(this,c,...n);try{observeChild("exec",String(c).slice(0,200),r)}catch{}return r}),wrap(t,"execFile",e=>function(c,...n){const r=Array.isArray(n[0])?n[0]:[],s=e.call(this,c,...n);try{observeChild("execFile",fmtCmd(c,r),s)}catch{}return s});for(const e of["execSync","execFileSync","spawnSync"])wrap(t,e,c=>function(n,...r){const s=Array.isArray(r[0])?r[0]:[],i=e==="execSync"?String(n).slice(0,200):fmtCmd(n,s),a=Date.now();try{const o=c.call(this,n,...r),d=o&&typeof o=="object"&&"status"in o?o.status??0:0;return(0,emit_1.lensEmit)("exec",d===0?"info":"error",`exec ${i.split(" ")[0]} \u2192 ${d}`,{name:"exec",kind:"exec",cmd:i,via:e,code:d,durationMs:Date.now()-a,sync:!0}),o}catch(o){throw(0,emit_1.lensEmit)("exec","error",`exec ${i.split(" ")[0]} failed`,{name:"exec",kind:"exec",cmd:i,via:e,error:String(o?.message??o),durationMs:Date.now()-a,sync:!0}),o}})}l(tapExec,"tapExec"),u(tapExec,"tapExec");
1
+ "use strict";var x=Object.defineProperty;var u=(o,e)=>x(o,"name",{value:e,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.tapExec=tapExec;const emit_1=require("./emit"),fmtCmd=u((o,e)=>{const t=Array.isArray(e)?e.map(String).slice(0,8).join(" "):"";return`${String(o)}${t?" "+t:""}`.slice(0,200)},"fmtCmd");function wrap(o,e,t){const n=o[e];if(typeof n!="function"||n.__lensmcp)return;const r=t(n);r.__lensmcp=!0,o[e]=r}u(wrap,"wrap");function observeChild(o,e,t){if(!t||typeof t.once!="function")return;const n=t;if(n.__lensmcpObserved)return;n.__lensmcpObserved=!0;const r=Date.now();t.once("exit",(...s)=>{const c=s[0],a=s[1];(0,emit_1.lensEmit)("exec",c===0?"info":"error",`exec ${e.split(" ")[0]} \u2192 ${c??a}`,{name:"exec",kind:"exec",cmd:e,via:o,...c!=null?{code:c}:{},...a?{signal:a}:{},durationMs:Date.now()-r,...t.pid?{pid:t.pid}:{}})}),t.once("error",(...s)=>{const c=s[0];(0,emit_1.lensEmit)("exec","error",`exec ${e.split(" ")[0]} failed to start`,{name:"exec",kind:"exec",cmd:e,via:o,error:String(c?.message??c),durationMs:Date.now()-r})})}u(observeChild,"observeChild");function tapExec(){const o=require("node:child_process");for(const e of["spawn","fork"])wrap(o,e,t=>function(n,...r){const s=Array.isArray(r[0])?r[0]:[],c=t.call(this,n,...r);try{observeChild(e,fmtCmd(n,s),c)}catch{}return c});wrap(o,"exec",e=>function(t,...n){const r=e.call(this,t,...n);try{observeChild("exec",String(t).slice(0,200),r)}catch{}return r}),wrap(o,"execFile",e=>function(t,...n){const r=Array.isArray(n[0])?n[0]:[],s=e.call(this,t,...n);try{observeChild("execFile",fmtCmd(t,r),s)}catch{}return s});for(const e of["execSync","execFileSync","spawnSync"])wrap(o,e,t=>function(n,...r){const s=Array.isArray(r[0])?r[0]:[],c=e==="execSync"?String(n).slice(0,200):fmtCmd(n,s),a=Date.now();try{const i=t.call(this,n,...r),l=i&&typeof i=="object"&&"status"in i?i.status??0:0;return(0,emit_1.lensEmit)("exec",l===0?"info":"error",`exec ${c.split(" ")[0]} \u2192 ${l}`,{name:"exec",kind:"exec",cmd:c,via:e,code:l,durationMs:Date.now()-a,sync:!0}),i}catch(i){throw(0,emit_1.lensEmit)("exec","error",`exec ${c.split(" ")[0]} failed`,{name:"exec",kind:"exec",cmd:c,via:e,error:String(i?.message??i),durationMs:Date.now()-a,sync:!0}),i}})}u(tapExec,"tapExec");
package/lib/tap-fs.js CHANGED
@@ -1 +1 @@
1
- "use strict";var d=Object.defineProperty;var c=(e,i)=>d(e,"name",{value:i,configurable:!0});var u=Object.defineProperty,l=c((e,i)=>u(e,"name",{value:i,configurable:!0}),"l");Object.defineProperty(exports,"__esModule",{value:!0}),exports.tapFs=tapFs;const tslib_1=require("tslib"),os=tslib_1.__importStar(require("node:os")),emit_1=require("./emit"),bucket={reads:0,writes:0,bytesRead:0,bytesWritten:0,paths:new Map};let timer=null;const TMP=os.tmpdir(),CWD=process.cwd(),SKIP=["node_modules","/.nx/","/dist/","/.git/",".lensmcp"];function trackedPath(e){if((0,emit_1.isLensWriting)())return null;const i=typeof e=="string"?e:Buffer.isBuffer(e)?e.toString():e instanceof URL?e.pathname:null;return!i||i===emit_1.EVENT_FILE||i.startsWith(TMP)||SKIP.some(n=>i.includes(n))?null:i}c(trackedPath,"trackedPath"),l(trackedPath,"trackedPath");function record(e,i,n=0){const t=trackedPath(i);if(!t)return;e==="read"?(bucket.reads+=1,bucket.bytesRead+=n):(bucket.writes+=1,bucket.bytesWritten+=n);const r=t.startsWith(CWD)?t.slice(CWD.length+1):t;bucket.paths.size<50&&bucket.paths.set(r,(bucket.paths.get(r)??0)+1),timer||(timer=setTimeout(flush,1e3),timer.unref?.())}c(record,"record"),l(record,"record");function flush(){timer=null;const{reads:e,writes:i,bytesRead:n,bytesWritten:t}=bucket;if(e+i===0)return;const r=[...bucket.paths.entries()].sort((s,a)=>a[1]-s[1]).slice(0,3).map(([s])=>s);bucket.reads=bucket.writes=bucket.bytesRead=bucket.bytesWritten=0,bucket.paths.clear(),(0,emit_1.lensEmit)("fs","info",`fs ${e} reads \xB7 ${i} writes`,{name:"fs",kind:"fs-ops",reads:e,writes:i,bytesRead:n,bytesWritten:t,top:r},`fs:${emit_1.PROJECT}`)}c(flush,"flush"),l(flush,"flush");const byteLen=l(e=>typeof e=="string"?Buffer.byteLength(e):Buffer.isBuffer(e)?e.length:0,"byteLen");function wrap(e,i,n){const t=e?.[i];if(!e||typeof t!="function"||t.__lensmcp)return;const r=n(t);r.__lensmcp=!0;try{e[i]=r}catch{}}c(wrap,"wrap"),l(wrap,"wrap");function tapFs(){const e=require("node:fs");wrap(e,"readFileSync",n=>function(t,...r){const s=n.call(this,t,...r);return record("read",t,byteLen(s)),s}),wrap(e,"writeFileSync",n=>function(t,r,...s){const a=n.call(this,t,r,...s);return record("write",t,byteLen(r)),a}),wrap(e,"appendFileSync",n=>function(t,r,...s){const a=n.call(this,t,r,...s);return record("write",t,byteLen(r)),a}),wrap(e,"readFile",n=>function(t,...r){const s=r[r.length-1];return typeof s=="function"&&(r[r.length-1]=(a,o)=>{a||record("read",t,byteLen(o)),s(a,o)}),n.call(this,t,...r)});for(const n of["writeFile","appendFile"])wrap(e,n,t=>function(r,s,...a){const o=a[a.length-1];return typeof o=="function"&&(a[a.length-1]=f=>{f||record("write",r,byteLen(s)),o(f)}),t.call(this,r,s,...a)});const i=e.promises;wrap(i,"readFile",n=>async function(t,...r){const s=await n.call(this,t,...r);return record("read",t,byteLen(s)),s});for(const n of["writeFile","appendFile"])wrap(i,n,t=>async function(r,s,...a){const o=await t.call(this,r,s,...a);return record("write",r,byteLen(s)),o});wrap(e,"createReadStream",n=>function(t,...r){return record("read",t,0),n.call(this,t,...r)}),wrap(e,"createWriteStream",n=>function(t,...r){return record("write",t,0),n.call(this,t,...r)})}c(tapFs,"tapFs"),l(tapFs,"tapFs");
1
+ "use strict";var u=Object.defineProperty;var l=(n,s)=>u(n,"name",{value:s,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.tapFs=tapFs;const tslib_1=require("tslib"),os=tslib_1.__importStar(require("node:os")),emit_1=require("./emit"),bucket={reads:0,writes:0,bytesRead:0,bytesWritten:0,paths:new Map};let timer=null;const TMP=os.tmpdir(),CWD=process.cwd(),SKIP=["node_modules","/.nx/","/dist/","/.git/",".lensmcp"];function trackedPath(n){if((0,emit_1.isLensWriting)())return null;const s=typeof n=="string"?n:Buffer.isBuffer(n)?n.toString():n instanceof URL?n.pathname:null;return!s||s===emit_1.EVENT_FILE||s.startsWith(TMP)||SKIP.some(r=>s.includes(r))?null:s}l(trackedPath,"trackedPath");function record(n,s,r=0){const t=trackedPath(s);if(!t)return;n==="read"?(bucket.reads+=1,bucket.bytesRead+=r):(bucket.writes+=1,bucket.bytesWritten+=r);const e=t.startsWith(CWD)?t.slice(CWD.length+1):t;bucket.paths.size<50&&bucket.paths.set(e,(bucket.paths.get(e)??0)+1),timer||(timer=setTimeout(flush,1e3),timer.unref?.())}l(record,"record");function flush(){timer=null;const{reads:n,writes:s,bytesRead:r,bytesWritten:t}=bucket;if(n+s===0)return;const e=[...bucket.paths.entries()].sort((i,c)=>c[1]-i[1]).slice(0,3).map(([i])=>i);bucket.reads=bucket.writes=bucket.bytesRead=bucket.bytesWritten=0,bucket.paths.clear(),(0,emit_1.lensEmit)("fs","info",`fs ${n} reads \xB7 ${s} writes`,{name:"fs",kind:"fs-ops",reads:n,writes:s,bytesRead:r,bytesWritten:t,top:e},`fs:${emit_1.PROJECT}`)}l(flush,"flush");const byteLen=l(n=>typeof n=="string"?Buffer.byteLength(n):Buffer.isBuffer(n)?n.length:0,"byteLen");function wrap(n,s,r){const t=n?.[s];if(!n||typeof t!="function"||t.__lensmcp)return;const e=r(t);e.__lensmcp=!0;try{n[s]=e}catch{}}l(wrap,"wrap");function tapFs(){const n=require("node:fs");wrap(n,"readFileSync",r=>function(t,...e){const i=r.call(this,t,...e);return record("read",t,byteLen(i)),i}),wrap(n,"writeFileSync",r=>function(t,e,...i){const c=r.call(this,t,e,...i);return record("write",t,byteLen(e)),c}),wrap(n,"appendFileSync",r=>function(t,e,...i){const c=r.call(this,t,e,...i);return record("write",t,byteLen(e)),c}),wrap(n,"readFile",r=>function(t,...e){const i=e[e.length-1];return typeof i=="function"&&(e[e.length-1]=(c,o)=>{c||record("read",t,byteLen(o)),i(c,o)}),r.call(this,t,...e)});for(const r of["writeFile","appendFile"])wrap(n,r,t=>function(e,i,...c){const o=c[c.length-1];return typeof o=="function"&&(c[c.length-1]=f=>{f||record("write",e,byteLen(i)),o(f)}),t.call(this,e,i,...c)});const s=n.promises;wrap(s,"readFile",r=>async function(t,...e){const i=await r.call(this,t,...e);return record("read",t,byteLen(i)),i});for(const r of["writeFile","appendFile"])wrap(s,r,t=>async function(e,i,...c){const o=await t.call(this,e,i,...c);return record("write",e,byteLen(i)),o});wrap(n,"createReadStream",r=>function(t,...e){return record("read",t,0),r.call(this,t,...e)}),wrap(n,"createWriteStream",r=>function(t,...e){return record("write",t,0),r.call(this,t,...e)})}l(tapFs,"tapFs");
package/lib/tap-nest.js CHANGED
@@ -1 +1 @@
1
- "use strict";var d=Object.defineProperty;var c=(e,t)=>d(e,"name",{value:t,configurable:!0});var f=Object.defineProperty,s=c((e,t)=>f(e,"name",{value:t,configurable:!0}),"s");Object.defineProperty(exports,"__esModule",{value:!0}),exports.installChildAppBridge=installChildAppBridge,exports.nestTap=nestTap;const emit_1=require("./emit"),WRAPPED=Symbol.for("lensmcp.wrappedRoot"),captures=[],waiters=[];function pushCapture(e){const t=waiters.shift();t?(clearTimeout(t.timer),t.resolve(e)):captures.push(e)}c(pushCapture,"pushCapture"),s(pushCapture,"pushCapture");function nextCapture(e=6e4){const t=captures.shift();return t?Promise.resolve(t):new Promise((n,r)=>{const i={resolve:n,reject:r,timer:setTimeout(()=>{const o=waiters.indexOf(i);o>=0&&waiters.splice(o,1),r(new Error("[lensmcp] no NestJS app captured within 60s \u2014 does main.ts call app.listen()? (zero-touch pods boot by running your main and intercepting listen)"))},e)};i.timer.unref?.(),waiters.push(i)})}c(nextCapture,"nextCapture"),s(nextCapture,"nextCapture");function installChildAppBridge(){if(process.env.APP_RUNNER!=="1")return;const e=global,t=s(()=>nextCapture(),"factory");e.createChildApp=t,e.__lensmcpCreateChildApp=t}c(installChildAppBridge,"installChildAppBridge"),s(installChildAppBridge,"installChildAppBridge");function nestTap(e){const t=e,n=t?.NestFactory,r=n?.create;if(!n||typeof r!="function")return!1;if(r.__lensmcp)return!0;const i=s(async function(o,...a){let p=o;const l=o,u=!!(l?.[WRAPPED]||l?.module?.[WRAPPED]);if(process.env.LENSMCP_NEST!=="0"&&!u)try{p=await buildLensmcpRoot(o)}catch{p=o}return r.call(this??n,p,...a)},"wrapped");if(i.__lensmcp=!0,n.create=i,process.env.APP_RUNNER==="1"){const o=t?.NestApplication?.prototype,a=o?.listen;if(o&&typeof a=="function"&&!a.__lensmcp){const p=s(async function(l,...u){return captureApp(this,l).catch(m=>(console.error("[lensmcp] pod capture failed, falling back to TCP listen:",m),a.call(this,l,...u)))},"listenWrapped");p.__lensmcp=!0,o.listen=p}}return!0}c(nestTap,"nestTap"),s(nestTap,"nestTap");async function buildLensmcpRoot(e){const t=await import("@lensmcp/nest-instrumentation"),n=require("@nestjs/common"),r=t.LensmcpModule.forRoot({projectName:emit_1.PROJECT,trace:{autoInstrumentMethods:!0},memory:{mode:"light",scope:"all"}});class i{static{c(this,"n")}static{s(this,"LensmcpZeroTouchRoot")}}return i[WRAPPED]=!0,n.Module({imports:[r,e]})(i),i}c(buildLensmcpRoot,"buildLensmcpRoot"),s(buildLensmcpRoot,"buildLensmcpRoot");async function captureApp(e,t){await e.init();let n=e.getHttpAdapter?.()?.getInstance?.();if(typeof n!="function"){const r=n;r?.ready&&await r.ready(),typeof r?.routing=="function"&&(n=s((i,o)=>r.routing(i,o),"handler"))}if(typeof n!="function")throw new Error("[lensmcp] cannot derive a request handler from the HTTP adapter");return pushCapture({handler:n,serviceConfig:{port:t??process.env.PORT??0},close:s(()=>Promise.resolve(e.close()).then(()=>{}),"close")}),e.getHttpServer?.()}c(captureApp,"captureApp"),s(captureApp,"captureApp");
1
+ "use strict";var f=Object.defineProperty;var s=(e,t)=>f(e,"name",{value:t,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.installChildAppBridge=installChildAppBridge,exports.nestTap=nestTap;const emit_1=require("./emit"),WRAPPED=Symbol.for("lensmcp.wrappedRoot"),captures=[],waiters=[];function pushCapture(e){const t=waiters.shift();t?(clearTimeout(t.timer),t.resolve(e)):captures.push(e)}s(pushCapture,"pushCapture");function nextCapture(e=6e4){const t=captures.shift();return t?Promise.resolve(t):new Promise((c,o)=>{const n={resolve:c,reject:o,timer:setTimeout(()=>{const r=waiters.indexOf(n);r>=0&&waiters.splice(r,1),o(new Error("[lensmcp] no NestJS app captured within 60s \u2014 does main.ts call app.listen()? (zero-touch pods boot by running your main and intercepting listen)"))},e)};n.timer.unref?.(),waiters.push(n)})}s(nextCapture,"nextCapture");function installChildAppBridge(){if(process.env.APP_RUNNER!=="1")return;const e=global,t=s(()=>nextCapture(),"factory");e.createChildApp=t,e.__lensmcpCreateChildApp=t}s(installChildAppBridge,"installChildAppBridge");function nestTap(e){const t=e,c=t?.NestFactory,o=c?.create;if(!c||typeof o!="function")return!1;if(o.__lensmcp)return!0;const n=s(async function(r,...i){let p=r;const a=r,u=!!(a?.[WRAPPED]||a?.module?.[WRAPPED]);if(process.env.LENSMCP_NEST!=="0"&&!u)try{p=await buildLensmcpRoot(r)}catch{p=r}return o.call(this??c,p,...i)},"wrapped");if(n.__lensmcp=!0,c.create=n,process.env.APP_RUNNER==="1"){const r=t?.NestApplication?.prototype,i=r?.listen;if(r&&typeof i=="function"&&!i.__lensmcp){const p=s(async function(a,...u){return captureApp(this,a).catch(l=>(console.error("[lensmcp] pod capture failed, falling back to TCP listen:",l),i.call(this,a,...u)))},"listenWrapped");p.__lensmcp=!0,r.listen=p}}return!0}s(nestTap,"nestTap");async function buildLensmcpRoot(e){const t=await import("@lensmcp/nest-instrumentation"),c=require("@nestjs/common"),o=t.LensmcpModule.forRoot({projectName:emit_1.PROJECT,trace:{autoInstrumentMethods:!0},memory:{mode:"light",scope:"all"}});class n{static{s(this,"LensmcpZeroTouchRoot")}}return n[WRAPPED]=!0,c.Module({imports:[o,e]})(n),n}s(buildLensmcpRoot,"buildLensmcpRoot");async function captureApp(e,t){await e.init();let o=e.getHttpAdapter?.()?.getInstance?.();if(typeof o!="function"){const n=o;n?.ready&&await n.ready(),typeof n?.routing=="function"&&(o=s((r,i)=>n.routing(r,i),"handler"))}if(typeof o!="function")throw new Error("[lensmcp] cannot derive a request handler from the HTTP adapter");return pushCapture({handler:o,serviceConfig:{port:t??process.env.PORT??0},close:s(()=>Promise.resolve(e.close()).then(()=>{}),"close")}),e.getHttpServer?.()}s(captureApp,"captureApp");
package/lib/tap-pg.js CHANGED
@@ -1 +1 @@
1
- "use strict";var x=Object.defineProperty;var c=(t,e)=>x(t,"name",{value:e,configurable:!0});var E=Object.defineProperty,n=c((t,e)=>E(t,"name",{value:e,configurable:!0}),"n");Object.defineProperty(exports,"__esModule",{value:!0}),exports.pgTap=pgTap;const emit_1=require("./emit"),flow_context_1=require("./flow-context"),SKIP_OPS=new Set(["BEGIN","COMMIT","ROLLBACK","SET","SHOW","DEALLOCATE","DISCARD"]);function parseSql(t){const e=(t.match(/^\s*(\w+)/)?.[1]??"query").toUpperCase(),r=t.match(/\b(?:from|into|update|join|table(?:\s+if\s+not\s+exists)?)\s+"?([\w$.]+)"?/i)?.[1]?.split(".").pop();return{op:e,...r?{table:r}:{}}}c(parseSql,"parseSql"),n(parseSql,"parseSql");const oneLine=n(t=>t.replace(/\s+/g," ").trim(),"oneLine"),clip=n((t,e)=>t.length>e?t.slice(0,e-1)+"\u2026":t,"clip");function paramPreview(t){if(!(!Array.isArray(t)||t.length===0))return t.slice(0,10).map(e=>{if(e==null)return String(e);const r=typeof e=="string"?e:(()=>{try{return JSON.stringify(e)}catch{return String(e)}})();return clip(r,80)})}c(paramPreview,"paramPreview"),n(paramPreview,"paramPreview");const rowsOf=n(t=>t?.rowCount??t?.rows?.length??0,"rowsOf");function resultPreview(t){const e=t?.rows;if(!(!Array.isArray(e)||e.length===0))try{return clip(JSON.stringify(e.slice(0,2)),240)}catch{return}}c(resultPreview,"resultPreview"),n(resultPreview,"resultPreview");function pgTap(t){const e=t?.Client?.prototype,r=e?.query;if(!e||typeof r!="function")return!1;if(r.__lensmcp)return!0;const C=n(function(a,i,y){const l=a,m=typeof l=="string"?l:l?.text;if(!m||l&&typeof l=="object"&&typeof l.submit=="function")return r.call(this,a,i,y);const{op:q,table:s}=parseSql(m);if(SKIP_OPS.has(q))return r.call(this,a,i,y);const p=q.toLowerCase(),_=`db:${p}:${s??"query"}`,b=Date.now(),S=(0,flow_context_1.flowContext)(),g=(0,flow_context_1.liveFlowContext)();g&&(g.dbCallCount=(g.dbCallCount??0)+1);const v=clip(oneLine(m),500),d=paramPreview(Array.isArray(i)?i:a?.values),h=n((o,f)=>{const u=Date.now()-b;if(o)(0,emit_1.lensEmit)("db","error",`${p}${s?" "+s:""} failed (${u}ms)`,{name:"postgres",kind:"db-query",op:p,...s?{table:s}:{},query:v,...d?{params:d}:{},startedAt:b,error:String(o?.message??o),durationMs:u},`db:error:${p}:${s??"query"}`,S);else{const $=rowsOf(f),O=resultPreview(f);(0,emit_1.lensEmit)("db","info",`${p} ${s??"query"} (${$} rows, ${u}ms)`,{name:"postgres",kind:"db-query",op:p,...s?{table:s}:{},query:v,...d?{params:d}:{},...O?{result:O}:{},startedAt:b,rows:$,durationMs:u},_,S)}},"done"),A=typeof y=="function"?y:typeof i=="function"?i:void 0;if(A){const o=n((f,u)=>{try{h(f,u)}catch{}A(f,u)},"wrappedCb");return typeof i=="function"?r.call(this,a,o):r.call(this,a,i,o)}const w=r.call(this,a,i);return w&&typeof w.then=="function"&&w.then(o=>h(void 0,o),o=>h(o,void 0)),w},"wrapped");return C.__lensmcp=!0,e.query=C,!0}c(pgTap,"pgTap"),n(pgTap,"pgTap");
1
+ "use strict";var E=Object.defineProperty;var n=(t,e)=>E(t,"name",{value:e,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.pgTap=pgTap;const emit_1=require("./emit"),flow_context_1=require("./flow-context"),SKIP_OPS=new Set(["BEGIN","COMMIT","ROLLBACK","SET","SHOW","DEALLOCATE","DISCARD"]);function parseSql(t){const e=(t.match(/^\s*(\w+)/)?.[1]??"query").toUpperCase(),r=t.match(/\b(?:from|into|update|join|table(?:\s+if\s+not\s+exists)?)\s+"?([\w$.]+)"?/i)?.[1]?.split(".").pop();return{op:e,...r?{table:r}:{}}}n(parseSql,"parseSql");const oneLine=n(t=>t.replace(/\s+/g," ").trim(),"oneLine"),clip=n((t,e)=>t.length>e?t.slice(0,e-1)+"\u2026":t,"clip");function paramPreview(t){if(!(!Array.isArray(t)||t.length===0))return t.slice(0,10).map(e=>{if(e==null)return String(e);const p=typeof e=="string"?e:(()=>{try{return JSON.stringify(e)}catch{return String(e)}})();return clip(p,80)})}n(paramPreview,"paramPreview");const rowsOf=n(t=>t?.rowCount??t?.rows?.length??0,"rowsOf");function resultPreview(t){const e=t?.rows;if(!(!Array.isArray(e)||e.length===0))try{return clip(JSON.stringify(e.slice(0,2)),240)}catch{return}}n(resultPreview,"resultPreview");function pgTap(t){const p=t?.Client?.prototype,r=p?.query;if(!p||typeof r!="function")return!1;if(r.__lensmcp)return!0;const b=n(function(c,s,a){const f=c,w=typeof f=="string"?f:f?.text;if(!w||f&&typeof f=="object"&&typeof f.submit=="function")return r.call(this,c,s,a);const{op:q,table:i}=parseSql(w);if(SKIP_OPS.has(q))return r.call(this,c,s,a);const d=q.toLowerCase(),O=`db:${d}:${i??"query"}`,h=Date.now(),A=(0,flow_context_1.flowContext)(),g=(0,flow_context_1.liveFlowContext)();g&&(g.dbCallCount=(g.dbCallCount??0)+1);const S=clip(oneLine(w),500),y=paramPreview(Array.isArray(s)?s:c?.values),C=n((o,l)=>{const u=Date.now()-h;if(o)(0,emit_1.lensEmit)("db","error",`${d}${i?" "+i:""} failed (${u}ms)`,{name:"postgres",kind:"db-query",op:d,...i?{table:i}:{},query:S,...y?{params:y}:{},startedAt:h,error:String(o?.message??o),durationMs:u},`db:error:${d}:${i??"query"}`,A);else{const _=rowsOf(l),x=resultPreview(l);(0,emit_1.lensEmit)("db","info",`${d} ${i??"query"} (${_} rows, ${u}ms)`,{name:"postgres",kind:"db-query",op:d,...i?{table:i}:{},query:S,...y?{params:y}:{},...x?{result:x}:{},startedAt:h,rows:_,durationMs:u},O,A)}},"done"),$=typeof a=="function"?a:typeof s=="function"?s:void 0;if($){const o=n((l,u)=>{try{C(l,u)}catch{}$(l,u)},"wrappedCb");return typeof s=="function"?r.call(this,c,o):r.call(this,c,s,o)}const m=r.call(this,c,s);return m&&typeof m.then=="function"&&m.then(o=>C(void 0,o),o=>C(o,void 0)),m},"wrapped");return b.__lensmcp=!0,p.query=b,!0}n(pgTap,"pgTap");
package/lib/tap-redis.js CHANGED
@@ -1 +1 @@
1
- "use strict";var b=Object.defineProperty;var a=(t,e)=>b(t,"name",{value:e,configurable:!0});var h=Object.defineProperty,c=a((t,e)=>h(t,"name",{value:e,configurable:!0}),"c");Object.defineProperty(exports,"__esModule",{value:!0}),exports.redisTap=redisTap;const emit_1=require("./emit"),flow_context_1=require("./flow-context"),HOUSEKEEPING=new Set(["info","ping","hello","auth","select","client","cluster","command","subscribe","psubscribe","unsubscribe","punsubscribe","echo","quit","wait","script","config","debug","memory","readonly","readwrite"]),MAX_PER_SEC=30;let emitted=0,windowStart=0;function isBullTraffic(t){const e=String(t.name??"").toLowerCase();if(e==="eval"||e==="evalsha")return!0;const r=t.args??[];for(let n=0;n<Math.min(r.length,4);n++){const s=String(r[n]??"");if(s.startsWith("bull:")||s.startsWith("{bull"))return!0}return!1}a(isBullTraffic,"isBullTraffic"),c(isBullTraffic,"isBullTraffic");function redisTap(t){const e=t,r=(e?.default??e)?.prototype,n=r?.sendCommand;if(!r||typeof n!="function")return!1;if(n.__lensmcp)return!0;const s=c(function(i,l){const f=n.call(this,i,l);try{observe(i)}catch{}return f},"wrapped");return s.__lensmcp=!0,r.sendCommand=s,!0}a(redisTap,"redisTap"),c(redisTap,"redisTap");const clip=c((t,e)=>t.length>e?t.slice(0,e-1)+"\u2026":t,"clip");function commandLine(t,e){const r=e.slice(0,6).map((n,s)=>{const i=String(n??"");return s>0&&i.length>48?`\u2026(${(i.length/1024).toFixed(1)}kb)`:clip(i,64)});return[t.toUpperCase(),...r].join(" ")}a(commandLine,"commandLine"),c(commandLine,"commandLine");function observe(t){const e=String(t?.name??"").toLowerCase();if(!e||HOUSEKEEPING.has(e)||isBullTraffic(t))return;const r=(0,flow_context_1.liveFlowContext)();r&&(r.redisCallCount=(r.redisCallCount??0)+1);const n=Date.now();if(n-windowStart>1e3&&(windowStart=n,emitted=0),++emitted>MAX_PER_SEC)return;const s=t?.args??[],i=String(s[0]??""),l=(0,flow_context_1.flowContext)(),f=commandLine(e,s),m={name:"cache",kind:"redis-op",op:e,key:i,command:f,startedAt:n};if(e==="get"&&t.promise&&typeof t.promise.then=="function"){const d=n;t.promise.then(u=>{const o=u!=null;(0,emit_1.lensEmit)("redis","info",`cache ${o?"hit":"miss"} ${i}`,{...m,hit:o,durationMs:Date.now()-d,...o?{value:clip(String(u),120)}:{}},"redis:cache",l)},()=>{});return}if(e==="set"){const d=s.map(p=>String(p)),u=d.findIndex(p=>p.toUpperCase()==="EX"),o=u>=0?Number(d[u+1]):void 0;(0,emit_1.lensEmit)("redis","info",o?`cache set ${i} (ttl ${o}s)`:`cache set ${i}`,{...m,...o?{ttlSec:o}:{}},"redis:cache",l);return}(0,emit_1.lensEmit)("redis","info",`cache ${e} ${i}`,m,"redis:cache",l)}a(observe,"observe"),c(observe,"observe");
1
+ "use strict";var h=Object.defineProperty;var c=(e,t)=>h(e,"name",{value:t,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.redisTap=redisTap;const emit_1=require("./emit"),flow_context_1=require("./flow-context"),HOUSEKEEPING=new Set(["info","ping","hello","auth","select","client","cluster","command","subscribe","psubscribe","unsubscribe","punsubscribe","echo","quit","wait","script","config","debug","memory","readonly","readwrite"]),MAX_PER_SEC=30;let emitted=0,windowStart=0;function isBullTraffic(e){const t=String(e.name??"").toLowerCase();if(t==="eval"||t==="evalsha")return!0;const i=e.args??[];for(let n=0;n<Math.min(i.length,4);n++){const s=String(i[n]??"");if(s.startsWith("bull:")||s.startsWith("{bull"))return!0}return!1}c(isBullTraffic,"isBullTraffic");function redisTap(e){const t=e,n=(t?.default??t)?.prototype,s=n?.sendCommand;if(!n||typeof s!="function")return!1;if(s.__lensmcp)return!0;const r=c(function(u,d){const l=s.call(this,u,d);try{observe(u)}catch{}return l},"wrapped");return r.__lensmcp=!0,n.sendCommand=r,!0}c(redisTap,"redisTap");const clip=c((e,t)=>e.length>t?e.slice(0,t-1)+"\u2026":e,"clip");function commandLine(e,t){const i=t.slice(0,6).map((n,s)=>{const r=String(n??"");return s>0&&r.length>48?`\u2026(${(r.length/1024).toFixed(1)}kb)`:clip(r,64)});return[e.toUpperCase(),...i].join(" ")}c(commandLine,"commandLine");function observe(e){const t=String(e?.name??"").toLowerCase();if(!t||HOUSEKEEPING.has(t)||isBullTraffic(e))return;const i=(0,flow_context_1.liveFlowContext)();i&&(i.redisCallCount=(i.redisCallCount??0)+1);const n=Date.now();if(n-windowStart>1e3&&(windowStart=n,emitted=0),++emitted>MAX_PER_SEC)return;const s=e?.args??[],r=String(s[0]??""),u=(0,flow_context_1.flowContext)(),d=commandLine(t,s),l={name:"cache",kind:"redis-op",op:t,key:r,command:d,startedAt:n};if(t==="get"&&e.promise&&typeof e.promise.then=="function"){const f=n;e.promise.then(a=>{const o=a!=null;(0,emit_1.lensEmit)("redis","info",`cache ${o?"hit":"miss"} ${r}`,{...l,hit:o,durationMs:Date.now()-f,...o?{value:clip(String(a),120)}:{}},"redis:cache",u)},()=>{});return}if(t==="set"){const f=s.map(p=>String(p)),a=f.findIndex(p=>p.toUpperCase()==="EX"),o=a>=0?Number(f[a+1]):void 0;(0,emit_1.lensEmit)("redis","info",o?`cache set ${r} (ttl ${o}s)`:`cache set ${r}`,{...l,...o?{ttlSec:o}:{}},"redis:cache",u);return}(0,emit_1.lensEmit)("redis","info",`cache ${t} ${r}`,l,"redis:cache",u)}c(observe,"observe");
package/lib/tap-stdout.js CHANGED
@@ -1,3 +1,3 @@
1
- "use strict";var a=Object.defineProperty;var c=(e,t)=>a(e,"name",{value:t,configurable:!0});var u=Object.defineProperty,o=c((e,t)=>u(e,"name",{value:t,configurable:!0}),"o");Object.defineProperty(exports,"__esModule",{value:!0}),exports.tapStdout=tapStdout;const emit_1=require("./emit"),ANSI=new RegExp("\x1B\\[[0-9;]*m","g");function severityOf(e,t){return/\bFATAL\b/.test(e)?"fatal":/\bERROR\b/.test(e)?"error":/\bWARN\b/.test(e)?"warning":/\bDEBUG\b/.test(e)||/\bVERBOSE\b/.test(e)?"debug":/\bLOG\b/.test(e)?"info":t}c(severityOf,"severityOf"),o(severityOf,"severityOf");const STACK_FRAME=/^\s+(at\s|\.\.\.\s\d+\smore)/;function emitChunk(e,t){const i=e.split(`
2
- `).map(r=>r.replace(ANSI,"").replace(/\s+$/,""));let s=0;for(;s<i.length;){const r=i[s];if(s+=1,!r.trim())continue;const n=[];for(;s<i.length&&STACK_FRAME.test(i[s]);)n.push(i[s]),s+=1;const f=n.length>0?"error":severityOf(r,t);(0,emit_1.lensLog)(f,r,n.length>0?{stack:[r,...n].join(`
3
- `)}:void 0)}}c(emitChunk,"emitChunk"),o(emitChunk,"emitChunk");function tapStdout(){if(process.env.LENSMCP_LOGS==="0"||process.env.APP_RUNNER!=="1")return;const e=[[process.stdout,"info"],[process.stderr,"error"]];for(const[t,i]of e){if(t.write.__lensmcp)continue;const s=t.write.bind(t),r=o(function(n,...f){try{if(!(0,emit_1.isLensWriting)()){const p=typeof n=="string"?n:Buffer.isBuffer(n)?n.toString("utf8"):"";p&&p.indexOf("[lensmcp]")===-1&&emitChunk(p,i)}}catch{}return s(n,...f)},"wrapped");r.__lensmcp=!0,t.write=r}}c(tapStdout,"tapStdout"),o(tapStdout,"tapStdout");
1
+ "use strict";var u=Object.defineProperty;var o=(t,e)=>u(t,"name",{value:e,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.tapStdout=tapStdout;const emit_1=require("./emit"),ANSI=new RegExp("\x1B\\[[0-9;]*m","g");function severityOf(t,e){return/\bFATAL\b/.test(t)?"fatal":/\bERROR\b/.test(t)?"error":/\bWARN\b/.test(t)?"warning":/\bDEBUG\b/.test(t)||/\bVERBOSE\b/.test(t)?"debug":/\bLOG\b/.test(t)?"info":e}o(severityOf,"severityOf");const STACK_FRAME=/^\s+(at\s|\.\.\.\s\d+\smore)/;function emitChunk(t,e){const i=t.split(`
2
+ `).map(n=>n.replace(ANSI,"").replace(/\s+$/,""));let s=0;for(;s<i.length;){const n=i[s];if(s+=1,!n.trim())continue;const r=[];for(;s<i.length&&STACK_FRAME.test(i[s]);)r.push(i[s]),s+=1;const f=r.length>0?"error":severityOf(n,e);(0,emit_1.lensLog)(f,n,r.length>0?{stack:[n,...r].join(`
3
+ `)}:void 0)}}o(emitChunk,"emitChunk");function tapStdout(){if(process.env.LENSMCP_LOGS==="0"||process.env.APP_RUNNER!=="1")return;const t=[[process.stdout,"info"],[process.stderr,"error"]];for(const[e,i]of t){if(e.write.__lensmcp)continue;const s=e.write.bind(e),n=o(function(r,...f){try{if(!(0,emit_1.isLensWriting)()){const c=typeof r=="string"?r:Buffer.isBuffer(r)?r.toString("utf8"):"";c&&c.indexOf("[lensmcp]")===-1&&emitChunk(c,i)}}catch{}return s(r,...f)},"wrapped");n.__lensmcp=!0,e.write=n}}o(tapStdout,"tapStdout");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lensmcp/node-instrumentation",
3
- "version": "1.22.5",
3
+ "version": "1.22.6",
4
4
  "main": "./index.js",
5
5
  "types": "./index.d.ts",
6
6
  "exports": {
@@ -15,9 +15,9 @@
15
15
  }
16
16
  },
17
17
  "dependencies": {
18
- "@lensmcp/core": "1.22.5",
19
- "@lensmcp/nest-instrumentation": "1.22.5",
20
- "@lensmcp/protocol-types": "1.22.5",
18
+ "@lensmcp/core": "1.22.6",
19
+ "@lensmcp/nest-instrumentation": "1.22.6",
20
+ "@lensmcp/protocol-types": "1.22.6",
21
21
  "tslib": "^2.3.0"
22
22
  },
23
23
  "optionalDependencies": {
package/register.js CHANGED
@@ -1 +1 @@
1
- "use strict";var i=Object.defineProperty;var r=(t,n)=>i(t,"name",{value:n,configurable:!0});var s=Object.defineProperty,e=r((t,n)=>s(t,"name",{value:n,configurable:!0}),"e");Object.defineProperty(exports,"__esModule",{value:!0}),exports.installLensmcpNodeInstrumentation=void 0;const install_1=require("./lib/install");Object.defineProperty(exports,"installLensmcpNodeInstrumentation",{enumerable:!0,get:e(function(){return install_1.installLensmcpNodeInstrumentation},"get")}),(0,install_1.installLensmcpNodeInstrumentation)();
1
+ "use strict";var s=Object.defineProperty;var e=(t,n)=>s(t,"name",{value:n,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.installLensmcpNodeInstrumentation=void 0;const install_1=require("./lib/install");Object.defineProperty(exports,"installLensmcpNodeInstrumentation",{enumerable:!0,get:e(function(){return install_1.installLensmcpNodeInstrumentation},"get")}),(0,install_1.installLensmcpNodeInstrumentation)();