@lensmcp/node-instrumentation 1.25.35 → 1.25.37
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 +1 -1
- package/lib/active-work.js +1 -1
- package/lib/ai-providers.js +9 -9
- package/lib/ai-store.js +1 -1
- package/lib/callsite.js +2 -2
- package/lib/capture-file.js +1 -1
- package/lib/emit-custom.js +1 -1
- package/lib/emit.d.ts +5 -0
- package/lib/emit.js +3 -3
- package/lib/flood-guard.js +1 -1
- package/lib/flow-context.js +1 -1
- package/lib/http-capture.js +2 -2
- package/lib/http-store.js +1 -1
- package/lib/install.js +1 -1
- package/lib/loop-watchdog.js +2 -2
- package/lib/require-hook.js +1 -1
- package/lib/sql-accounting.js +1 -1
- package/lib/sql-values.js +2 -2
- package/lib/tap-ai.js +1 -1
- package/lib/tap-bullmq.js +1 -1
- package/lib/tap-egress.js +1 -1
- package/lib/tap-event-loop.js +1 -1
- package/lib/tap-exec.js +1 -1
- package/lib/tap-fs.js +1 -1
- package/lib/tap-ingress.js +1 -1
- package/lib/tap-loop-callbacks.js +1 -1
- package/lib/tap-nest-logger.js +5 -5
- package/lib/tap-nest.js +1 -1
- package/lib/tap-pg-pool.js +2 -2
- package/lib/tap-pg.js +1 -1
- package/lib/tap-redis.js +1 -1
- package/lib/tap-stdout.d.ts +13 -0
- package/lib/tap-stdout.js +5 -5
- package/package.json +4 -4
- package/register.js +1 -1
package/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var p=Object.defineProperty;var i=(t,r)=>p(t,"name",{value:r,configurable:!0});var s=Object.defineProperty,o=i((t,r)=>s(t,"name",{value:r,configurable:!0}),"o"),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.EXCHANGE_ID=exports.resetIngressTapForTests=exports.tapIngress=exports.resetEgressTapForTests=exports.tapEgress=exports.installRequireHook=exports.createEventFloodGuard=exports.installCustomEmit=exports.EMIT_CUSTOM=exports.lensEmitCustom=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 emit_custom_1=require("./lib/emit-custom");Object.defineProperty(exports,"lensEmitCustom",{enumerable:!0,get:e(function(){return emit_custom_1.lensEmitCustom},"get")}),Object.defineProperty(exports,"EMIT_CUSTOM",{enumerable:!0,get:e(function(){return emit_custom_1.EMIT_CUSTOM},"get")}),Object.defineProperty(exports,"installCustomEmit",{enumerable:!0,get:e(function(){return emit_custom_1.installCustomEmit},"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_ingress_1=require("./lib/tap-ingress");Object.defineProperty(exports,"tapIngress",{enumerable:!0,get:e(function(){return tap_ingress_1.tapIngress},"get")}),Object.defineProperty(exports,"resetIngressTapForTests",{enumerable:!0,get:e(function(){return tap_ingress_1.resetIngressTapForTests},"get")}),Object.defineProperty(exports,"EXCHANGE_ID",{enumerable:!0,get:e(function(){return tap_ingress_1.EXCHANGE_ID},"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")});
|
package/lib/active-work.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var v=Object.defineProperty;var r=(t,e)=>v(t,"name",{value:e,configurable:!0});var a=Object.defineProperty,o=r((t,e)=>a(t,"name",{value:e,configurable:!0}),"o"),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}r(beginActiveWorkGeneration,"beginActiveWorkGeneration"),o(beginActiveWorkGeneration,"beginActiveWorkGeneration"),n(beginActiveWorkGeneration,"beginActiveWorkGeneration");function activeWorkGeneration(){return currentGeneration}r(activeWorkGeneration,"activeWorkGeneration"),o(activeWorkGeneration,"activeWorkGeneration"),n(activeWorkGeneration,"activeWorkGeneration");function beginActiveWork(t){const e={at:Date.now(),...t===void 0?{}:{gen:t}};running.add(e);let c=!1;return()=>{c||(c=!0,running.delete(e))}}r(beginActiveWork,"beginActiveWork"),o(beginActiveWork,"beginActiveWork"),n(beginActiveWork,"beginActiveWork");function activeWorkSnapshot(t){let e,c=0;for(const s of running)t!==void 0&&s.gen!==void 0&&s.gen!==t||(c+=1,(e===void 0||s.at<e)&&(e=s.at));return{count:c,...e===void 0?{}:{oldestStartedAt:e}}}r(activeWorkSnapshot,"activeWorkSnapshot"),o(activeWorkSnapshot,"activeWorkSnapshot"),n(activeWorkSnapshot,"activeWorkSnapshot");function installActiveWorkProbe(){globalThis[GLOBAL_KEY]=activeWorkSnapshot,globalThis.__lensmcpBeginWorkGeneration=beginActiveWorkGeneration}r(installActiveWorkProbe,"installActiveWorkProbe"),o(installActiveWorkProbe,"installActiveWorkProbe"),n(installActiveWorkProbe,"installActiveWorkProbe");function resetActiveWorkForTests(){running.clear(),currentGeneration=0}r(resetActiveWorkForTests,"resetActiveWorkForTests"),o(resetActiveWorkForTests,"resetActiveWorkForTests"),n(resetActiveWorkForTests,"resetActiveWorkForTests");
|
package/lib/ai-providers.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
`)}d(flattenContent,"flattenContent"),u(flattenContent,"flattenContent");const SCALAR_PARAMS={chat:["temperature","top_p","max_tokens","max_completion_tokens","n","seed","presence_penalty","frequency_penalty","tool_choice","reasoning_effort","service_tier"],responses:["temperature","top_p","max_output_tokens","tool_choice","parallel_tool_calls","service_tier"],messages:["max_tokens","temperature","top_p","top_k"],embeddings:["dimensions","encoding_format"]};function scalarParams(t,e){const o={};for(const p of SCALAR_PARAMS[e]){const
|
|
3
|
-
`:""}[tool_call ${asStr(a.name)??""} ${asStr(a.arguments)??""}]`}return{role:asStr(t.role)??"unknown",content:e}}d(chatMessage,"chatMessage"),u(chatMessage,"chatMessage");function responsesInput(t){if(typeof t=="string")return[{role:"user",content:t}];const e=[];for(const o of asArr(t)){if(!isObj(o))continue;const a=asStr(o.type);a==="function_call_output"?e.push({role:"tool",content:flattenContent(o.output)}):a==="function_call"?e.push({role:"assistant",content:`[tool_call ${asStr(o.name)??""} ${asStr(o.arguments)??""}]`}):e.push({role:asStr(o.role)??a??"user",content:flattenContent(o.content)})}return e}d(responsesInput,"responsesInput"),u(responsesInput,"responsesInput");function normalizeRequest(t,e){const o={messages:[],tools:[],params:{},stream:!1};if(!isObj(e))return o;const a={...o,...asStr(e.model)?{model:asStr(e.model)}:{},stream:e.stream===!0,params:scalarParams(e,t.api),tools:toolsOf(e)};switch(t.api){case"chat":a.messages=asArr(e.messages).filter(isObj).map(chatMessage);break;case"responses":{const n=asStr(e.instructions);n&&(a.system=n),a.messages=responsesInput(e.input);break}case"messages":{const n=e.system,
|
|
4
|
-
`:""}[refusal] ${
|
|
1
|
+
"use strict";var z=Object.defineProperty;var _=(t,e)=>z(t,"name",{value:e,configurable:!0});var j=Object.defineProperty,d=_((t,e)=>j(t,"name",{value:e,configurable:!0}),"d"),M=Object.defineProperty,u=d((t,e)=>M(t,"name",{value:e,configurable:!0}),"u");Object.defineProperty(exports,"__esModule",{value:!0}),exports.parseExtraHosts=parseExtraHosts,exports.matchTarget=matchTarget,exports.flattenContent=flattenContent,exports.normalizeRequest=normalizeRequest,exports.mapUsage=mapUsage,exports.normalizeResponse=normalizeResponse,exports.createStreamAccumulator=createStreamAccumulator;const isObj=u(t=>typeof t=="object"&&t!==null&&!Array.isArray(t),"isObj"),asArr=u(t=>Array.isArray(t)?t:[],"asArr"),asStr=u(t=>typeof t=="string"?t:void 0,"asStr"),asNum=u(t=>typeof t=="number"&&Number.isFinite(t)?t:void 0,"asNum"),MAX_ACCUMULATED_CHARS=512*1024,MAX_EVENT_BUFFER_CHARS=1024*1024,MAX_BLOCK_JSON_CHARS=2e3,KNOWN_HOSTS=[{test:/^api\.openai\.com$/i,provider:"openai"},{test:/\.openai\.azure\.com$/i,provider:"openai"},{test:/^api\.anthropic\.com$/i,provider:"anthropic"}],authorityOf=u(t=>t.trim().toLowerCase().replace(/^[a-z][a-z0-9+.-]*:\/\//,"").replace(/[/?#].*$/,""),"authorityOf");function parseExtraHosts(t){const e=new Map;for(const o of(t??"").split(",")){const a=o.lastIndexOf("=");if(a===-1)continue;const n=authorityOf(o.slice(0,a)),i=o.slice(a+1).trim().toLowerCase();n&&(i==="openai"||i==="anthropic")&&e.set(n,i)}return e}_(parseExtraHosts,"parseExtraHosts"),d(parseExtraHosts,"parseExtraHosts"),u(parseExtraHosts,"parseExtraHosts");function apiFor(t,e){const o=e.replace(/\/+$/,"").toLowerCase();if(t==="anthropic")return o.endsWith("/messages")?"messages":void 0;if(o.endsWith("/chat/completions"))return"chat";if(o.endsWith("/responses"))return"responses";if(o.endsWith("/embeddings"))return"embeddings"}_(apiFor,"apiFor"),d(apiFor,"apiFor"),u(apiFor,"apiFor");function matchTarget(t,e,o,a){const n=t.toLowerCase(),i=a.get(e?`${n}:${e}`:n)??a.get(n)??KNOWN_HOSTS.find(p=>p.test.test(n))?.provider;if(!i)return;const c=apiFor(i,o);return c?{provider:i,api:c}:void 0}_(matchTarget,"matchTarget"),d(matchTarget,"matchTarget"),u(matchTarget,"matchTarget");function jsonText(t,e=MAX_BLOCK_JSON_CHARS){try{const o=JSON.stringify(t);return o===void 0?"":o.length>e?`${o.slice(0,e)}\u2026`:o}catch{return""}}_(jsonText,"jsonText"),d(jsonText,"jsonText"),u(jsonText,"jsonText");const argsText=u(t=>typeof t=="string"?t:t==null?void 0:jsonText(t,8192),"argsText");function flattenContent(t){if(t==null)return"";if(typeof t=="string")return t;if(!Array.isArray(t))return jsonText(t);const e=[];for(const o of t){if(typeof o=="string"){e.push(o);continue}if(!isObj(o))continue;const a=asStr(o.type)??"";switch(a){case"text":case"input_text":case"output_text":e.push(asStr(o.text)??"");break;case"refusal":e.push(`[refusal] ${asStr(o.refusal)??""}`);break;case"image_url":case"image":case"input_image":e.push("[image]");break;case"input_audio":case"audio":e.push("[audio]");break;case"file":case"input_file":case"document":e.push("[file]");break;case"tool_use":e.push(`[tool_use ${asStr(o.name)??""} ${jsonText(o.input)}]`);break;case"tool_result":e.push(`[tool_result ${flattenContent(o.content)}]`);break;case"thinking":e.push(`[thinking] ${asStr(o.thinking)??""}`);break;case"redacted_thinking":e.push("[redacted_thinking]");break;default:e.push(asStr(o.text)??`[${a||"part"}]`)}}return e.filter(o=>o!=="").join(`
|
|
2
|
+
`)}_(flattenContent,"flattenContent"),d(flattenContent,"flattenContent"),u(flattenContent,"flattenContent");const SCALAR_PARAMS={chat:["temperature","top_p","max_tokens","max_completion_tokens","n","seed","presence_penalty","frequency_penalty","tool_choice","reasoning_effort","service_tier"],responses:["temperature","top_p","max_output_tokens","tool_choice","parallel_tool_calls","service_tier"],messages:["max_tokens","temperature","top_p","top_k"],embeddings:["dimensions","encoding_format"]};function scalarParams(t,e){const o={};for(const p of SCALAR_PARAMS[e]){const h=t[p];(typeof h=="string"||typeof h=="number"||typeof h=="boolean")&&(o[p]=h)}const a=t.reasoning;isObj(a)&&typeof a.effort=="string"&&(o.reasoning_effort=a.effort);const n=t.thinking;isObj(n)&&(typeof n.type=="string"&&(o.thinking=n.type),typeof n.budget_tokens=="number"&&(o.thinking_budget_tokens=n.budget_tokens));const i=t.response_format;isObj(i)&&typeof i.type=="string"&&(o.response_format=i.type);const c=t.tool_choice;return isObj(c)&&typeof c.type=="string"&&(o.tool_choice=c.type),o}_(scalarParams,"scalarParams"),d(scalarParams,"scalarParams"),u(scalarParams,"scalarParams");function toolsOf(t){const e=[];for(const o of asArr(t.tools)){if(!isObj(o))continue;const a=isObj(o.function)?o.function:void 0,n=asStr(a?.name)??asStr(o.name)??asStr(o.type);if(!n)continue;const i=asStr(a?.description)??asStr(o.description);e.push(i?{name:n,description:i}:{name:n})}return e}_(toolsOf,"toolsOf"),d(toolsOf,"toolsOf"),u(toolsOf,"toolsOf");function chatMessage(t){let e=flattenContent(t.content);for(const o of asArr(t.tool_calls)){if(!isObj(o))continue;const a=isObj(o.function)?o.function:{};e+=`${e?`
|
|
3
|
+
`:""}[tool_call ${asStr(a.name)??""} ${asStr(a.arguments)??""}]`}return{role:asStr(t.role)??"unknown",content:e}}_(chatMessage,"chatMessage"),d(chatMessage,"chatMessage"),u(chatMessage,"chatMessage");function responsesInput(t){if(typeof t=="string")return[{role:"user",content:t}];const e=[];for(const o of asArr(t)){if(!isObj(o))continue;const a=asStr(o.type);a==="function_call_output"?e.push({role:"tool",content:flattenContent(o.output)}):a==="function_call"?e.push({role:"assistant",content:`[tool_call ${asStr(o.name)??""} ${asStr(o.arguments)??""}]`}):e.push({role:asStr(o.role)??a??"user",content:flattenContent(o.content)})}return e}_(responsesInput,"responsesInput"),d(responsesInput,"responsesInput"),u(responsesInput,"responsesInput");function normalizeRequest(t,e){const o={messages:[],tools:[],params:{},stream:!1};if(!isObj(e))return o;const a={...o,...asStr(e.model)?{model:asStr(e.model)}:{},stream:e.stream===!0,params:scalarParams(e,t.api),tools:toolsOf(e)};switch(t.api){case"chat":a.messages=asArr(e.messages).filter(isObj).map(chatMessage);break;case"responses":{const n=asStr(e.instructions);n&&(a.system=n),a.messages=responsesInput(e.input);break}case"messages":{const n=e.system,i=typeof n=="string"?n:flattenContent(n);i&&(a.system=i),a.messages=asArr(e.messages).filter(isObj).map(c=>({role:asStr(c.role)??"unknown",content:flattenContent(c.content)}));break}case"embeddings":{const n=e.input;a.inputCount=Array.isArray(n)?n.length:n===void 0?0:1;break}}return a}_(normalizeRequest,"normalizeRequest"),d(normalizeRequest,"normalizeRequest"),u(normalizeRequest,"normalizeRequest");function mapUsage(t,e=!0){if(!isObj(t))return{};const o=isObj(t.prompt_tokens_details)?t.prompt_tokens_details:isObj(t.input_tokens_details)?t.input_tokens_details:{},a=isObj(t.completion_tokens_details)?t.completion_tokens_details:isObj(t.output_tokens_details)?t.output_tokens_details:{},n={},i=asNum(t.prompt_tokens)??asNum(t.input_tokens),c=asNum(t.completion_tokens)??asNum(t.output_tokens),p=asNum(o.cached_tokens)??asNum(t.cache_read_input_tokens),h=asNum(a.reasoning_tokens);i!==void 0&&(n.promptTokens=i),c!==void 0&&(n.completionTokens=c),p!==void 0&&(n.cachedTokens=p),h!==void 0&&(n.reasoningTokens=h);const m=asNum(t.total_tokens);return m!==void 0?n.totalTokens=m:e&&i!==void 0&&c!==void 0&&(n.totalTokens=i+c),n}_(mapUsage,"mapUsage"),d(mapUsage,"mapUsage"),u(mapUsage,"mapUsage");const withTotal=u(t=>t.totalTokens===void 0&&t.promptTokens!==void 0&&t.completionTokens!==void 0?{...t,totalTokens:t.promptTokens+t.completionTokens}:t,"withTotal");function errorMessage(t){const e=t.error;if(typeof e=="string")return e;if(isObj(e))return asStr(e.message)??asStr(e.type)??asStr(e.code)}_(errorMessage,"errorMessage"),d(errorMessage,"errorMessage"),u(errorMessage,"errorMessage");function normalizeResponse(t,e){const o={completion:"",toolCalls:[],usage:{}};if(!isObj(e))return o;const a=asStr(e.id),n=asStr(e.model);a&&(o.id=a),n&&(o.model=n);const i=errorMessage(e);switch(i&&(o.error=i),o.usage=mapUsage(e.usage),t.api){case"chat":{const c=asArr(e.choices).find(isObj),p=c&&isObj(c.message)?c.message:void 0;if(p){o.completion=flattenContent(p.content);const m=asStr(p.refusal);m&&(o.completion+=`${o.completion?`
|
|
4
|
+
`:""}[refusal] ${m}`);const k=asStr(p.reasoning_content)??asStr(p.reasoning);k&&(o.reasoning=k);for(const y of asArr(p.tool_calls)){if(!isObj(y))continue;const v=isObj(y.function)?y.function:{},C=argsText(v.arguments);o.toolCalls.push({...asStr(y.id)?{id:asStr(y.id)}:{},name:asStr(v.name)??"tool",...C!==void 0?{arguments:C}:{}})}const f=isObj(p.function_call)?p.function_call:void 0;if(f){const y=argsText(f.arguments);o.toolCalls.push({name:asStr(f.name)??"tool",...y!==void 0?{arguments:y}:{}})}}const h=asStr(c?.finish_reason);h&&(o.finishReason=h);break}case"responses":{const c=[],p=[];for(const f of asArr(e.output)){if(!isObj(f))continue;const y=asStr(f.type);if(y==="message")c.push(flattenContent(f.content));else if(y==="function_call")o.toolCalls.push({...asStr(f.call_id)??asStr(f.id)?{id:asStr(f.call_id)??asStr(f.id)}:{},name:asStr(f.name)??"tool",...asStr(f.arguments)!==void 0?{arguments:asStr(f.arguments)}:{}});else if(y==="reasoning")for(const v of asArr(f.summary))isObj(v)&&asStr(v.text)&&p.push(asStr(v.text))}o.completion=c.filter(Boolean).join(`
|
|
5
5
|
`),p.length&&(o.reasoning=p.join(`
|
|
6
|
-
`));const
|
|
6
|
+
`));const h=isObj(e.incomplete_details)?asStr(e.incomplete_details.reason):void 0,m=asStr(e.status),k=h??m;k&&(o.finishReason=k),!o.error&&isObj(e.error)&&(o.error=errorMessage(e));break}case"messages":{const c=[],p=[];for(const m of asArr(e.content)){if(!isObj(m))continue;const k=asStr(m.type);k==="text"?c.push(asStr(m.text)??""):k==="thinking"?p.push(asStr(m.thinking)??""):(k==="tool_use"||k==="server_tool_use"||k==="mcp_tool_use")&&o.toolCalls.push({...asStr(m.id)?{id:asStr(m.id)}:{},name:asStr(m.name)??"tool",arguments:jsonText(m.input)})}o.completion=c.filter(Boolean).join(`
|
|
7
7
|
`),p.length&&(o.reasoning=p.filter(Boolean).join(`
|
|
8
|
-
`));const
|
|
8
|
+
`));const h=asStr(e.stop_reason);h&&(o.finishReason=h);break}case"embeddings":o.vectorCount=asArr(e.data).length;break}return o}_(normalizeResponse,"normalizeResponse"),d(normalizeResponse,"normalizeResponse"),u(normalizeResponse,"normalizeResponse");function createStreamAccumulator(t){let e="",o=0,a,n,i="",c="",p="",h,m={},k,f;const y=new Map,v=u((r,s)=>{s&&(r==="text"?i.length<MAX_ACCUMULATED_CHARS&&(i+=s):r==="reasoning"?c.length<MAX_ACCUMULATED_CHARS&&(c+=s):p.length<MAX_ACCUMULATED_CHARS&&(p+=s))},"append"),C=u(r=>{let s=y.get(r);return s||(s={name:"",args:""},y.set(r,s)),s},"tool");function $(r){const s=asArr(r.choices).find(isObj),g=s&&isObj(s.delta)?s.delta:void 0;if(g){v("text",asStr(g.content)??""),v("refusal",asStr(g.refusal)??""),v("reasoning",asStr(g.reasoning_content)??asStr(g.reasoning)??"");const x=isObj(g.function_call)?g.function_call:void 0;if(x){const b=C(-1);asStr(x.name)&&(b.name+=asStr(x.name)),asStr(x.arguments)&&(b.args+=asStr(x.arguments))}for(const b of asArr(g.tool_calls)){if(!isObj(b))continue;const w=C(asNum(b.index)??0);asStr(b.id)&&(w.id=asStr(b.id));const T=isObj(b.function)?b.function:{};asStr(T.name)&&(w.name+=asStr(T.name)),asStr(T.arguments)&&(w.args+=asStr(T.arguments))}}const l=asStr(s?.finish_reason);l&&(h=l),isObj(r.usage)&&(m={...m,...mapUsage(r.usage,!1)})}_($,"$"),d($,"R"),u($,"onChat");function O(r){const s=asStr(r.type)??"";s==="response.output_text.delta"?v("text",asStr(r.delta)??""):s==="response.completed"||s==="response.incomplete"||s==="response.failed"?f=normalizeResponse(t,r.response):s==="error"&&(k=asStr(r.message)??k)}_(O,"O"),d(O,"O"),u(O,"onResponses");function R(r){const s=asStr(r.type)??"",g=asNum(r.index)??0;if(s==="message_start"){const l=isObj(r.message)?r.message:{};a=asStr(l.id)??a,n=asStr(l.model)??n,m={...m,...mapUsage(l.usage,!1)}}else if(s==="content_block_start"){const l=isObj(r.content_block)?r.content_block:{};if(asStr(l.type)==="tool_use"||asStr(l.type)==="server_tool_use"||asStr(l.type)==="mcp_tool_use"){const x=C(g);x.id=asStr(l.id),x.name=asStr(l.name)??"tool"}else asStr(l.type)==="text"&&v("text",asStr(l.text)??"")}else if(s==="content_block_delta"){const l=isObj(r.delta)?r.delta:{},x=asStr(l.type);x==="text_delta"?v("text",asStr(l.text)??""):x==="thinking_delta"?v("reasoning",asStr(l.thinking)??""):x==="input_json_delta"&&(C(g).args+=asStr(l.partial_json)??"")}else if(s==="message_delta"){const l=isObj(r.delta)?r.delta:{};asStr(l.stop_reason)&&(h=asStr(l.stop_reason)),m={...m,...mapUsage(r.usage,!1)}}else s==="error"&&(k=errorMessage(r)??k)}_(R,"R"),d(R,"S"),u(R,"onAnthropic");function S(r){o+=1,a=asStr(r.id)??a,n=asStr(r.model)??n,t.api==="messages"?R(r):t.api==="responses"?O(r):$(r);const s=t.api==="messages"?void 0:errorMessage(r);s&&(k=s)}_(S,"S"),d(S,"b"),u(S,"onEvent");function A(r){const s=[];for(const l of r.split(`
|
|
9
9
|
`))l.startsWith("data:")&&s.push(l.slice(5).replace(/^ /,""));if(!s.length)return;const g=s.join(`
|
|
10
|
-
`);if(g!=="[DONE]")try{const l=JSON.parse(g);isObj(l)&&S(l)}catch{}}return d(A,"$"),u(A,"parseEvent"),{push(
|
|
10
|
+
`);if(g!=="[DONE]")try{const l=JSON.parse(g);isObj(l)&&S(l)}catch{}}return _(A,"A"),d(A,"$"),u(A,"parseEvent"),{push(r){e=(e+r).replace(/\r\n/g,`
|
|
11
11
|
`);let s=e.indexOf(`
|
|
12
12
|
|
|
13
13
|
`);for(;s!==-1;)A(e.slice(0,s)),e=e.slice(s+2),s=e.indexOf(`
|
|
14
14
|
|
|
15
|
-
`);e.length>MAX_EVENT_BUFFER_CHARS&&(e="")},end(){e.trim()&&A(e),e="";const
|
|
16
|
-
`:""}[refusal] ${p}`:
|
|
15
|
+
`);e.length>MAX_EVENT_BUFFER_CHARS&&(e="")},end(){e.trim()&&A(e),e="";const r=[...y.entries()].sort((g,l)=>g[0]-l[0]).map(([,g])=>({...g.id?{id:g.id}:{},name:g.name||"tool",...g.args?{arguments:g.args}:{}})),s={...a?{id:a}:{},...n?{model:n}:{},completion:p?`${i}${i?`
|
|
16
|
+
`:""}[refusal] ${p}`:i,...c?{reasoning:c}:{},toolCalls:r,...h?{finishReason:h}:{},usage:withTotal(m),...k?{error:k}:{}};return f?{...s,...f,completion:f.completion||s.completion,toolCalls:f.toolCalls.length?f.toolCalls:s.toolCalls,usage:{...s.usage,...f.usage}}:s},get eventCount(){return o}}}_(createStreamAccumulator,"createStreamAccumulator"),d(createStreamAccumulator,"createStreamAccumulator"),u(createStreamAccumulator,"createStreamAccumulator");
|
package/lib/ai-store.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var f=Object.defineProperty;var p=(e,o)=>f(e,"name",{value:o,configurable:!0});var g=Object.defineProperty,d=p((e,o)=>g(e,"name",{value:o,configurable:!0}),"d"),m=Object.defineProperty,c=d((e,o)=>m(e,"name",{value:o,configurable:!0}),"c");Object.defineProperty(exports,"__esModule",{value:!0}),exports.redactAiText=void 0,exports.newAiCallId=newAiCallId,exports.fitAiContent=fitAiContent,exports.writeAiContent=writeAiContent;const tslib_1=require("tslib"),nodeFs=tslib_1.__importStar(require("node:fs")),ai_content_1=require("@lensmcp/core/ai-content"),redact_1=require("@lensmcp/core/redact"),emit_1=require("./emit"),mkdirSync=nodeFs.mkdirSync,writeFileSync=nodeFs.writeFileSync,renameSync=nodeFs.renameSync;exports.redactAiText=redact_1.redactSecretText;const intEnv=c((e,o,s,n)=>{const r=Number(process.env[e]);return Number.isFinite(r)&&r>=s&&r<=n?Math.floor(r):o},"intEnv"),maxFieldChars=c(()=>intEnv("LENSMCP_AI_MAX_CHARS",32*1024,256,4*1024*1024),"maxFieldChars"),maxFileBytes=c(()=>intEnv("LENSMCP_AI_MAX_BYTES",256*1024,4*1024,16*1024*1024),"maxFileBytes");function newAiCallId(){const e=Date.now().toString(36).padStart(9,"0"),o=Math.random().toString(36).slice(2,8).padEnd(6,"0");return`ai_${e}${o}`}p(newAiCallId,"newAiCallId"),d(newAiCallId,"newAiCallId"),c(newAiCallId,"newAiCallId");const PRE_CLIP_FACTOR=4,MAX_MESSAGES=400;function sanitize(e,o){const s={cut:e.truncated===!0},n=c((t,l=o)=>{if(t===void 0)return;const a=l*PRE_CLIP_FACTOR;let u=t;return u.length>a&&(s.cut=!0,u=u.slice(0,a)),(0,exports.redactAiText)(u)},"clean"),r={...e,request:{...e.request,...e.request.system!==void 0?{system:n(e.request.system)}:{},messages:e.request.messages.slice(0,MAX_MESSAGES*4).map(t=>({role:t.role,content:n(t.content)})),...e.request.tools?{tools:e.request.tools.map(t=>({name:n(t.name,200),...t.description?{description:n(t.description,512)}:{}}))}:{}},...e.response?{response:{...e.response,...e.response.completion!==void 0?{completion:n(e.response.completion)}:{},...e.response.reasoning!==void 0?{reasoning:n(e.response.reasoning)}:{},...e.response.error!==void 0?{error:n(e.response.error,2048)}:{},...e.response.toolCalls?{toolCalls:e.response.toolCalls.map(t=>({...t.id?{id:t.id}:{},name:n(t.name,200),...t.arguments!==void 0?{arguments:n(t.arguments,8192)}:{}}))}:{}}}:{}};return e.request.messages.length>MAX_MESSAGES*4&&(s.cut=!0),s.cut&&(r.truncated=!0),r}p(sanitize,"sanitize"),d(sanitize,"sanitize"),c(sanitize,"sanitize");function clipTo(e,o,s){const n={cut:e.truncated===!0},r=c((i,C=o)=>{if(i!==void 0)return i.length>C&&(n.cut=!0),(0,redact_1.clip)(i,C)},"c"),t=e.request.messages;let l=t;if(t.length>s){const i=Math.min(2,s);l=[...t.slice(0,i),...t.slice(t.length-(s-i))],n.cut=!0}const a=e.response,u={...e,request:{...e.request,...e.request.system!==void 0?{system:r(e.request.system)}:{},messages:l.map(i=>({role:i.role,content:r(i.content)}))},...a?{response:{...a,...a.completion!==void 0?{completion:r(a.completion)}:{},...a.reasoning!==void 0?{reasoning:r(a.reasoning)}:{},...a.toolCalls?{toolCalls:a.toolCalls.map(i=>({...i,...i.arguments!==void 0?{arguments:r(i.arguments,Math.min(o,8192))}:{}}))}:{}}}:{}};return n.cut?u.truncated=!0:delete u.truncated,u}p(clipTo,"clipTo"),d(clipTo,"clipTo"),c(clipTo,"clipTo");function fitAiContent(e){const o=maxFileBytes();let s=maxFieldChars(),n=MAX_MESSAGES;const r=sanitize(e,s);let t=clipTo(r,s,n),l=JSON.stringify(t);for(;l.length>o&&(s>256||n>2);)s>256?s=Math.max(256,Math.floor(s/2)):n=Math.max(2,Math.floor(n/2)),t=clipTo(r,s,n),l=JSON.stringify(t);return{json:l,content:t}}p(fitAiContent,"fitAiContent"),d(fitAiContent,"fitAiContent"),c(fitAiContent,"fitAiContent");function writeAiContent(e){try{const o=(0,ai_content_1.aiContentDir)(emit_1.EVENT_FILE);mkdirSync(o,{recursive:!0,mode:448});const{json:s,content:n}=fitAiContent(e),r=`${o}/${e.id}.json`;return writeFileSync(`${r}.tmp`,s,{mode:384}),renameSync(`${r}.tmp`,r),{id:e.id,truncated:n.truncated===!0}}catch{return}}p(writeAiContent,"writeAiContent"),d(writeAiContent,"writeAiContent"),c(writeAiContent,"writeAiContent");
|
package/lib/callsite.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
`).slice(1)){const r=parseFrame(o,e,n);if(r&&(t.push(r),t.length>=exports.FRAMES_KEPT))break}if(t.length)return{frames:t,mapped:process.sourceMapsEnabled===!0}}a(appSite,"appSite"),c(appSite,"appSite");const siteKey=c(s=>`${s.frames[0].file}:${s.frames[0].line}`,"siteKey");exports.siteKey=siteKey;const FIRST_RUNS=5,EVERY=20,RESEND_MS=10*6e4,MAX_KEYS=2e3,MAX_SITES_PER_KEY=20;class SiteSampler{static{a(this,"SiteSampler")}static{c(this,"SiteSampler")}constructor(e={}){this.opts=e,this.keys=new Map}site(e,n,i={}){if(!n&&!i.fallback)return;let t=this.keys.get(e);if(t||(t={runs:0,sent:new Map},this.keys.set(e,t),this.keys.size>MAX_KEYS&&this.keys.delete(this.keys.keys().next().value)),t.runs+=1,!i.force&&t.runs>FIRST_RUNS&&t.runs%EVERY!==0)return;const o=appSite(n,this.opts.cwd,this.opts.own)??appSite(i.fallback,this.opts.cwd,this.opts.own);if(!o)return;const r=(this.opts.now??Date.now)(),
|
|
1
|
+
"use strict";var m=Object.defineProperty;var u=(s,e)=>m(s,"name",{value:e,configurable:!0});var l=Object.defineProperty,a=u((s,e)=>l(s,"name",{value:e,configurable:!0}),"a"),f=Object.defineProperty,c=a((s,e)=>f(s,"name",{value:e,configurable:!0}),"c");Object.defineProperty(exports,"__esModule",{value:!0}),exports.SiteSampler=exports.siteKey=exports.FRAMES_KEPT=void 0,exports.captureSite=captureSite,exports.parseFrame=parseFrame,exports.appSite=appSite;const node_path_1=require("node:path"),node_url_1=require("node:url"),CAPTURE_LIMIT=40;exports.FRAMES_KEPT=3;const OFF=process.env.LENSMCP_CALLSITES==="0",OWN=__dirname,CWD=process.cwd();function captureSite(){if(OFF)return;const s={},e=Error.stackTraceLimit;try{Error.stackTraceLimit=CAPTURE_LIMIT,Error.captureStackTrace(s,captureSite)}catch{return}finally{try{Error.stackTraceLimit=e}catch{}}return s}u(captureSite,"captureSite"),a(captureSite,"captureSite"),c(captureSite,"captureSite");const FRAME=/^\s*at (?:async )?(?:(.+?) \((.+)\)|(.+))$/,LOCATION=/^(.*):(\d+):(\d+)$/;function parseFrame(s,e=CWD,n=OWN){const i=FRAME.exec(s);if(!i)return;const t=i[2]??i[3]??"";if(t.startsWith("eval at ")||t.includes("<anonymous>"))return;const o=LOCATION.exec(t);if(!o)return;let r=o[1];if(r.startsWith("file://"))try{r=(0,node_url_1.fileURLToPath)(r)}catch{return}if(!(0,node_path_1.isAbsolute)(r)||r.includes(`${node_path_1.sep}node_modules${node_path_1.sep}`)||r===n||r.startsWith(n+node_path_1.sep))return;const p=functionName(i[1]);return{file:r.startsWith(e+node_path_1.sep)?(0,node_path_1.relative)(e,r):r,line:Number(o[2]),column:Number(o[3]),...p?{fn:p}:{}}}u(parseFrame,"parseFrame"),a(parseFrame,"parseFrame"),c(parseFrame,"parseFrame");function functionName(s){if(!s)return;let e=s.replace(/^new /,"");const n=/ \[as ([^\]]+)\]$/.exec(e);if(n&&(e=/(?:^|\.)(?:eval|<anonymous>)$/.test(e.slice(0,n.index))?n[1]:e.slice(0,n.index)),!(e==="eval"||e.includes("<anonymous>")||e==="Object.eval"))return e}u(functionName,"functionName"),a(functionName,"functionName"),c(functionName,"functionName");function appSite(s,e=CWD,n=OWN){const i=s?.stack;if(!i)return;const t=[];for(const o of i.split(`
|
|
2
|
+
`).slice(1)){const r=parseFrame(o,e,n);if(r&&(t.push(r),t.length>=exports.FRAMES_KEPT))break}if(t.length)return{frames:t,mapped:process.sourceMapsEnabled===!0}}u(appSite,"appSite"),a(appSite,"appSite"),c(appSite,"appSite");const siteKey=c(s=>`${s.frames[0].file}:${s.frames[0].line}`,"siteKey");exports.siteKey=siteKey;const FIRST_RUNS=5,EVERY=20,RESEND_MS=10*6e4,MAX_KEYS=2e3,MAX_SITES_PER_KEY=20;class SiteSampler{static{u(this,"SiteSampler")}static{a(this,"SiteSampler")}static{c(this,"SiteSampler")}constructor(e={}){this.opts=e,this.keys=new Map}site(e,n,i={}){if(!n&&!i.fallback)return;let t=this.keys.get(e);if(t||(t={runs:0,sent:new Map},this.keys.set(e,t),this.keys.size>MAX_KEYS&&this.keys.delete(this.keys.keys().next().value)),t.runs+=1,!i.force&&t.runs>FIRST_RUNS&&t.runs%EVERY!==0)return;const o=appSite(n,this.opts.cwd,this.opts.own)??appSite(i.fallback,this.opts.cwd,this.opts.own);if(!o)return;const r=(this.opts.now??Date.now)(),p=(0,exports.siteKey)(o),S=t.sent.get(p);if(!(!i.force&&S!==void 0&&r-S<RESEND_MS))return t.sent.delete(p),t.sent.set(p,r),t.sent.size>MAX_SITES_PER_KEY&&t.sent.delete(t.sent.keys().next().value),o}}exports.SiteSampler=SiteSampler;
|
package/lib/capture-file.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var c=Object.defineProperty;var a=(e,t)=>c(e,"name",{value:t,configurable:!0});var u=Object.defineProperty,i=a((e,t)=>u(e,"name",{value:t,configurable:!0}),"i"),n=Object.defineProperty,r=i((e,t)=>n(e,"name",{value:t,configurable:!0}),"r");Object.defineProperty(exports,"__esModule",{value:!0}),exports.captureFile=void 0,exports.aiBodiesAsked=aiBodiesAsked,exports.sqlValuesAsked=sqlValuesAsked,exports.resetCaptureFileForTests=resetCaptureFileForTests;const tslib_1=require("tslib"),nodeFs=tslib_1.__importStar(require("node:fs")),node_path_1=require("node:path"),emit_1=require("./emit"),statSync=nodeFs.statSync,readFileSync=nodeFs.readFileSync,EVERY_MS=5e3;let last;const captureFile=r(()=>(0,node_path_1.join)((0,node_path_1.dirname)(emit_1.EVENT_FILE),"capture.json"),"captureFile");exports.captureFile=captureFile;function asked(e){if(last&&e-last.at<EVERY_MS)return last;let t;try{t=statSync((0,exports.captureFile)()).mtimeMs}catch{return last={at:e,mtimeMs:-1,ai:!1,sql:!0},last}if(last&&last.mtimeMs===t)return last={...last,at:e},last;let s=!1,o=!0;try{const l=JSON.parse(readFileSync((0,exports.captureFile)(),"utf8"));s=l.ai==="content",o=l.sql!=="off"}catch{}return last={at:e,mtimeMs:t,ai:s,sql:o},last}a(asked,"asked"),i(asked,"asked"),r(asked,"asked");function aiBodiesAsked(e=Date.now()){return asked(e).ai}a(aiBodiesAsked,"aiBodiesAsked"),i(aiBodiesAsked,"aiBodiesAsked"),r(aiBodiesAsked,"aiBodiesAsked");function sqlValuesAsked(e=Date.now(),t=process.env){const s=t.LENSMCP_SQL_VALUES?.trim().toLowerCase();return s==="0"||s==="off"||s==="false"?!1:asked(e).sql}a(sqlValuesAsked,"sqlValuesAsked"),i(sqlValuesAsked,"sqlValuesAsked"),r(sqlValuesAsked,"sqlValuesAsked");function resetCaptureFileForTests(){last=void 0}a(resetCaptureFileForTests,"resetCaptureFileForTests"),i(resetCaptureFileForTests,"resetCaptureFileForTests"),r(resetCaptureFileForTests,"resetCaptureFileForTests");
|
package/lib/emit-custom.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var M=Object.defineProperty;var l=(e,t)=>M(e,"name",{value:t,configurable:!0});var O=Object.defineProperty,d=l((e,t)=>O(e,"name",{value:t,configurable:!0}),"d"),C=Object.defineProperty,c=d((e,t)=>C(e,"name",{value:t,configurable:!0}),"c");Object.defineProperty(exports,"__esModule",{value:!0}),exports.EMIT_CUSTOM=void 0,exports.emitCustomHere=emitCustomHere,exports.installCustomEmit=installCustomEmit,exports.lensEmitCustom=lensEmitCustom;const protocol_types_1=require("@lensmcp/protocol-types"),emit_1=require("./emit"),flood_guard_1=require("./flood-guard"),flow_context_1=require("./flow-context");exports.EMIT_CUSTOM=Symbol.for("lensmcp.emitCustom");const ITEM_MAX=200,ERROR_MAX=500,NAME_RE=/^[^\u0000-\u001f\u007f]{1,100}$/,customGuard=(0,flood_guard_1.createEventFloodGuard)({burst:30,perSec:5}),CHANNEL_BUCKETS_PER_SOURCE=protocol_types_1.TRAFFIC_PUSH_CHANNELS,CHANNEL_BUCKETS_MAX=1e3,channelBuckets=new Map;let channelBucketCount=0;function trafficBucket(e,t,n,m){const s=`custom:${emit_1.PROJECT}:traffic:${e}:${t}`,r=channelBuckets.get(e);return r?.has(n)?`${s}:${n}`:(r?.size??0)<CHANNEL_BUCKETS_PER_SOURCE&&channelBucketCount<CHANNEL_BUCKETS_MAX?(r?r.add(n):channelBuckets.set(e,new Set([n])),channelBucketCount++,`${s}:${n}`):(say(channelBucketCount>=CHANNEL_BUCKETS_MAX?`${m}: ${CHANNEL_BUCKETS_MAX} channels already have a flood bucket in this process \u2014 this source's further channels share one`:`${m}: more than ${CHANNEL_BUCKETS_PER_SOURCE} channels \u2014 its further channels share one flood bucket (is a channel minted per message?)`),s)}l(trafficBucket,"trafficBucket"),d(trafficBucket,"trafficBucket"),c(trafficBucket,"trafficBucket");const SAID_MAX=50,said=new Set;function refuse(e){return say(`${e} \u2014 not written`),!1}l(refuse,"refuse"),d(refuse,"refuse"),c(refuse,"refuse");function say(e){try{if(said.has(e)||said.size>=SAID_MAX)return;said.add(e);const t=said.size===SAID_MAX?" (further problems with lensEmitCustom are not said)":"";console.warn(`[lensmcp] lensEmitCustom: ${e}${t}`)}catch{}}l(say,"say"),d(say,"say"),c(say,"say");function shown(e){return typeof e=="string"?JSON.stringify(e.length>40?`${e.slice(0,39)}\u2026`:e):e===null?"null":typeof e}l(shown,"shown"),d(shown,"shown"),c(shown,"shown");const isObj=c(e=>typeof e=="object"&&e!==null&&!Array.isArray(e),"isObj"),cut=c((e,t)=>e.length>t?`${e.slice(0,t-1)}\u2026`:e,"cut");function idText(e,t){const n=typeof e=="string"?e:typeof e=="number"&&Number.isFinite(e)||typeof e=="bigint"?String(e):void 0;return n?cut(n,t):void 0}l(idText,"idText"),d(idText,"idText"),c(idText,"idText");function errorText(e){const t=typeof e=="string"?e:e instanceof Error?e.message:void 0;return t?cut(t,ERROR_MAX):void 0}l(errorText,"errorText"),d(errorText,"errorText"),c(errorText,"errorText");const oneLine=c((e,t)=>cut(e.replace(/\s+/g," ").trim(),t),"oneLine"),text=c((e,t)=>typeof e=="string"&&e?cut(e,t):void 0,"text");function summary(e,t,n){return`${[e,...t.filter(m=>m!==!1)].join(", ")}${n?` \u2014 ${oneLine(n,120)}`:""}`}l(summary,"summary"),d(summary,"summary"),c(summary,"summary");const sized=c(e=>`${String(e).replace(/\B(?=(\d{3})+(?!\d))/g,",")} byte${e===1?"":"s"}`,"sized");function emitCustomHere(e){try{if(!isObj(e))return refuse(`the event is ${shown(e)}, not { kind, name, event }`);const t=e.kind;if(!protocol_types_1.SOURCE_KINDS_READ.includes(t))return refuse(`kind ${shown(t)} is not a source kind (${protocol_types_1.SOURCE_KINDS_READ.join(", ")})`);const n=t,m=e.name;if(typeof m!="string"||!m.trim()||!NAME_RE.test(m))return refuse(`${n} name ${shown(m)} is not 1\u2013100 characters without control characters (the declared source's name)`);const s=`${n} ${JSON.stringify(m)}`,r=e.event,S=protocol_types_1.SOURCE_PUSH_EVENTS[n];if(typeof r!="string"||!S.includes(r))return refuse(`${s}: event ${shown(r)} is not a ${n} event (${S.join(", ")})`);const u={kind:"source-event",provenance:protocol_types_1.SOURCE_PROVENANCE,sourceKind:n,name:m,event:r};let p="info",E=r,_=`custom:${emit_1.PROJECT}:${n}:${m}:${r}`;if(n==="queue"){const i=idText(e.item,ITEM_MAX),o=idText(e.group,ITEM_MAX),a=errorText(e.error);i&&(u.item=i),o&&(u.group=o),a&&(u.error=a),r==="failed"&&(p="warning"),E=summary(`${r}${i?` ${oneLine(i,80)}`:""}${o?` \xB7 ${oneLine(o,80)}`:""}`,[],a)}else if(n==="loop"){if(r==="run-end"){const i=e.outcome;if(!isOutcome(n,i))return refuse(`${s}: outcome ${shown(i)} is not a run outcome (${protocol_types_1.SOURCE_PUSH_OUTCOMES.loop.join(", ")})`);const o=count(e.items,s,"items",!1),a=count(e.durationMs,s,"durationMs",!0),f=errorText(e.error);i!==void 0&&(u.outcome=i),o!==void 0&&(u.items=o),a!==void 0&&(u.durationMs=a),f&&(u.error=f),i==="failed"&&(p="warning"),E=summary(i?`${r} ${i}`:r,[o!==void 0&&`${o} item${o===1?"":"s"}`,a!==void 0&&`${a} ms`],f)}}else if(n==="store"){const i=idText(e.object,ITEM_MAX),o=idText(e.group,ITEM_MAX),a=r==="write"?count(e.bytes,s,"bytes",!1):void 0,f=count(e.durationMs,s,"durationMs",!0),$=errorText(e.error);i&&(u.object=i),o&&(u.group=o),a!==void 0&&(u.bytes=a),f!==void 0&&(u.durationMs=f),$&&(u.error=$),r==="error"&&(p="warning"),E=summary(`${r}${i?` ${oneLine(i,80)}`:""}${o?` \xB7 ${oneLine(o,80)}`:""}`,[a!==void 0&&sized(a),f!==void 0&&`${f} ms`],$)}else{const i=e.channel;if(typeof i!="string"||!i.trim())return refuse(`${s}: channel ${shown(i)} is not a channel \u2014 every traffic event says its channel (the snapshot channel's key)`);const o=e.outcome;if(!isOutcome(n,o))return refuse(`${s}: outcome ${shown(o)} is not a message outcome (${protocol_types_1.SOURCE_PUSH_OUTCOMES.traffic.join(", ")})`);const a=cut(i,ITEM_MAX),f=text(e.counterpart,ITEM_MAX),$=count(e.durationMs,s,"durationMs",!0),h=count(e.bytes,s,"bytes",!1),g=idText(e.correlation,ITEM_MAX),v=errorText(e.error);u.channel=a,f&&(u.counterpart=f),o!==void 0&&(u.outcome=o),$!==void 0&&(u.durationMs=$),h!==void 0&&(u.bytes=h),g&&(u.correlation=g),v&&(u.error=v),(o==="failed"||o==="rate-limited")&&(p="warning");const b=f?` ${r==="inbound"?"\u2190":"\u2192"} ${oneLine(f,80)}`:"";E=summary(`${r} ${oneLine(a,80)}${b}${o?` ${o}`:""}`,[h!==void 0&&sized(h),$!==void 0&&`${$} ms`],v),_=trafficBucket(m,r,a,s)}const y=(0,flow_context_1.flowContext)();return(0,emit_1.lensEmitOutcome)(protocol_types_1.CUSTOM_EVENT_SOURCE,p,`${n} ${emit_1.PROJECT}/${m} (reported): ${E}`,u,_,y?{flowId:y.flowId,requestId:y.requestId,runId:y.runId}:void 0,"backend",customGuard)==="written"}catch{return!1}}l(emitCustomHere,"emitCustomHere"),d(emitCustomHere,"emitCustomHere"),c(emitCustomHere,"emitCustomHere");function isOutcome(e,t){return t===void 0||typeof t=="string"&&protocol_types_1.SOURCE_PUSH_OUTCOMES[e].includes(t)}l(isOutcome,"isOutcome"),d(isOutcome,"isOutcome"),c(isOutcome,"isOutcome");function count(e,t,n,m){if(e===void 0)return;const s=typeof e=="number"&&m&&Number.isFinite(e)?Math.round(e):e;if(typeof s=="number"&&Number.isSafeInteger(s)&&s>=0)return s;say(`${t}: ${n} ${typeof e=="number"?String(e):shown(e)} is not a count \u2014 written without it`)}l(count,"count"),d(count,"count"),c(count,"count");function installCustomEmit(){try{const e=globalThis;if(typeof e[exports.EMIT_CUSTOM]=="function")return!1;const t=emitCustomHere;return e[exports.EMIT_CUSTOM]=t,!0}catch{return!1}}l(installCustomEmit,"installCustomEmit"),d(installCustomEmit,"installCustomEmit"),c(installCustomEmit,"installCustomEmit");function lensEmitCustom(e){try{const t=globalThis[exports.EMIT_CUSTOM];return typeof t=="function"?t(e)===!0:!1}catch{return!1}}l(lensEmitCustom,"lensEmitCustom"),d(lensEmitCustom,"lensEmitCustom"),c(lensEmitCustom,"lensEmitCustom");
|
package/lib/emit.d.ts
CHANGED
|
@@ -31,6 +31,11 @@ export type LensSeverity = 'info' | 'warning' | 'error';
|
|
|
31
31
|
export type LogSeverity = 'debug' | 'info' | 'warning' | 'error' | 'fatal';
|
|
32
32
|
/** Service identity stamped on every event (set by the cluster serve executor). */
|
|
33
33
|
export declare const PROJECT: string;
|
|
34
|
+
/**
|
|
35
|
+
* The `serve` worker this process is (`LENSMCP_WORKER`, set by the devserver's `workerEnv`) — absent in a pod. A
|
|
36
|
+
* worker shares its service's PROJECT, so its log lines say which process wrote them (issues/closed/foodguard-112).
|
|
37
|
+
*/
|
|
38
|
+
export declare const WORKER: string | undefined;
|
|
34
39
|
/** The file bus — same default the cluster gateway and dashboard use. */
|
|
35
40
|
export declare const EVENT_FILE: string;
|
|
36
41
|
/** True while the lens itself is appending — the fs tap skips self-writes. */
|
package/lib/emit.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
`;return maybeRotateEventFile(exports.EVENT_FILE,
|
|
3
|
-
`;return maybeRotateEventFile(exports.EVENT_FILE,
|
|
1
|
+
"use strict";var g=Object.defineProperty;var p=(r,s)=>g(r,"name",{value:s,configurable:!0});var x=Object.defineProperty,i=p((r,s)=>x(r,"name",{value:s,configurable:!0}),"i"),a=Object.defineProperty,c=i((r,s)=>a(r,"name",{value:s,configurable:!0}),"c");Object.defineProperty(exports,"__esModule",{value:!0}),exports.EVENT_FILE=exports.WORKER=exports.PROJECT=exports.EVENT_MAX_FILES=exports.EVENT_MAX_BYTES=void 0,exports.maybeRotateEventFile=maybeRotateEventFile,exports.isLensWriting=isLensWriting,exports.lensEmit=lensEmit,exports.lensEmitOutcome=lensEmitOutcome,exports.lensLog=lensLog;const tslib_1=require("tslib"),nodeFs=tslib_1.__importStar(require("node:fs")),node_path_1=require("node:path"),bus_rotation_1=require("@lensmcp/core/bus-rotation"),flood_guard_1=require("./flood-guard"),flow_context_1=require("./flow-context"),loop_identity_1=require("./loop-identity"),appendFileSync=nodeFs.appendFileSync,mkdirSync=nodeFs.mkdirSync,statSync=nodeFs.statSync,renameSync=nodeFs.renameSync,unlinkSync=nodeFs.unlinkSync,openSync=nodeFs.openSync,closeSync=nodeFs.closeSync,BUS_CAPS=(0,bus_rotation_1.busCapsFromEnv)();exports.EVENT_MAX_BYTES=BUS_CAPS.maxBytes,exports.EVENT_MAX_FILES=BUS_CAPS.maxFiles;const rotators=new Map,BUS_FS={statSync,renameSync,unlinkSync,openSync,closeSync};function maybeRotateEventFile(r,s,e){if(e!==void 0){const n=e.maxBytes??exports.EVENT_MAX_BYTES,t=e.maxFiles??exports.EVENT_MAX_FILES;(0,bus_rotation_1.createBusRotator)(r,{maxBytes:n,maxFiles:t,fs:BUS_FS,checkEveryBytes:0})(s);return}let o=rotators.get(r);o||(o=(0,bus_rotation_1.createBusRotator)(r,{maxBytes:exports.EVENT_MAX_BYTES,maxFiles:exports.EVENT_MAX_FILES,fs:BUS_FS}),rotators.set(r,o)),o(s)}p(maybeRotateEventFile,"maybeRotateEventFile"),i(maybeRotateEventFile,"maybeRotateEventFile"),c(maybeRotateEventFile,"maybeRotateEventFile"),exports.PROJECT=process.env.LENSMCP_PROJECT||process.env.SERVICE_NAME||"app",exports.WORKER=process.env.LENSMCP_WORKER||void 0,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}p(isLensWriting,"isLensWriting"),i(isLensWriting,"isLensWriting"),c(isLensWriting,"isLensWriting");function lensEmit(r,s,e,o,n,t,E="cluster"){return lensEmitOutcome(r,s,e,o,n,t,E)==="written"}p(lensEmit,"lensEmit"),i(lensEmit,"lensEmit"),c(lensEmit,"lensEmit");function lensEmitOutcome(r,s,e,o,n,t,E="cluster",m=emitGuard){try{writing=!0;const l=n??`${r}:${String(o.name??r)}`,d=m.admit(l);if(!d.ok)return"suppressed";dirReady||(mkdirSync((0,node_path_1.dirname)(exports.EVENT_FILE),{recursive:!0}),dirReady=!0);const u=JSON.stringify({id:Date.now().toString(36)+Math.random().toString(36).slice(2,10),sessionId:"pending",timestamp:Date.now(),source:r,category:E,severity:s,context:{sessionId:"pending",projectName:exports.PROJECT,...t?.flowId?{flowId:t.flowId}:{},...t?.requestId?{requestId:t.requestId}:{},...t?.runId?{runId:t.runId}:{},...t?.originNodeId?{originNodeId:t.originNodeId}:{},...t?.originType?{originType:t.originType}:{}},fingerprint:l,title:e,raw:{project:exports.PROJECT,...o,loopId:loop_identity_1.NODE_LOOP.id,...d.suppressed>0?{floodSuppressed:d.suppressed}:{}}})+`
|
|
2
|
+
`;return maybeRotateEventFile(exports.EVENT_FILE,u.length),appendFileSync(exports.EVENT_FILE,u),"written"}catch{return"failed"}finally{writing=!1}}p(lensEmitOutcome,"lensEmitOutcome"),i(lensEmitOutcome,"lensEmitOutcome"),c(lensEmitOutcome,"lensEmitOutcome");function lensLog(r,s,e){try{writing=!0;const o=e?.bucket!==void 0?`log:${exports.PROJECT}:${e.bucket}`:r==="error"||r==="fatal"?`log:error:${exports.PROJECT}`:`log:${exports.PROJECT}`,n=e?.bucket!==void 0?{ok:!0,suppressed:e.suppressed??0}:logGuard.admit(o);if(!n.ok)return!1;dirReady||(mkdirSync((0,node_path_1.dirname)(exports.EVENT_FILE),{recursive:!0}),dirReady=!0);const t=(0,flow_context_1.flowContext)(),E=JSON.stringify({id:Date.now().toString(36)+Math.random().toString(36).slice(2,10),sessionId:"pending",timestamp:Date.now(),source:"nestjs",category:"runtime",severity:r,context:{sessionId:"pending",projectName:exports.PROJECT,...t?.flowId?{flowId:t.flowId}:{},...t?.requestId?{requestId:t.requestId}:{},...t?.runId?{runId:t.runId}:{}},fingerprint:o,title:s,raw:{project:exports.PROJECT,kind:"log",...exports.WORKER?{worker:exports.WORKER}:{},...e?.stack?{request:{error:{message:s,stack:e.stack}}}:{},...e?.text?{text:e.text}:{},...e?.continues?{continues:!0}:{},...e?.stream?{stream:e.stream}:{},...e?.level?{level:e.level}:{},...e?.logger?{logger:e.logger}:{},...n.suppressed>0?{floodSuppressed:n.suppressed}:{}}})+`
|
|
3
|
+
`;return maybeRotateEventFile(exports.EVENT_FILE,E.length),appendFileSync(exports.EVENT_FILE,E),!0}catch{return!1}finally{writing=!1}}p(lensLog,"lensLog"),i(lensLog,"lensLog"),c(lensLog,"lensLog");
|
package/lib/flood-guard.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var u=Object.defineProperty;var c=(r,t)=>u(r,"name",{value:t,configurable:!0});var n=Object.defineProperty,a=c((r,t)=>n(r,"name",{value:t,configurable:!0}),"a"),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")});
|
package/lib/flow-context.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var f=Object.defineProperty;var r=(t,e)=>f(t,"name",{value:e,configurable:!0});var d=Object.defineProperty,o=r((t,e)=>d(t,"name",{value:e,configurable:!0}),"o"),l=Object.defineProperty,n=o((t,e)=>l(t,"name",{value:e,configurable:!0}),"n");Object.defineProperty(exports,"__esModule",{value:!0}),exports.FLOW_START=exports.CONTEXT_END=void 0,exports.flowContextStatus=flowContextStatus,exports.resetFlowContextForTests=resetFlowContextForTests,exports.isRequireEsmError=isRequireEsmError,exports.isModuleNotFoundError=isModuleNotFoundError,exports.primeFlowContext=primeFlowContext,exports.attachContextEnd=attachContextEnd,exports.contextEndOf=contextEndOf,exports.startLiveFlow=startLiveFlow,exports.runInFlowContext=runInFlowContext,exports.liveFlowContext=liveFlowContext,exports.flowContext=flowContext;let getCtx=null,runWith=null,status={state:"not-primed"},warned=!1;function flowContextStatus(){return status}r(flowContextStatus,"flowContextStatus"),o(flowContextStatus,"flowContextStatus"),n(flowContextStatus,"flowContextStatus");function resetFlowContextForTests(){getCtx=null,runWith=null,status={state:"not-primed"},warned=!1}r(resetFlowContextForTests,"resetFlowContextForTests"),o(resetFlowContextForTests,"resetFlowContextForTests"),n(resetFlowContextForTests,"resetFlowContextForTests");function isRequireEsmError(t){const e=t?.code;return e==="ERR_REQUIRE_ESM"||e==="ERR_REQUIRE_ASYNC_MODULE"}r(isRequireEsmError,"isRequireEsmError"),o(isRequireEsmError,"isRequireEsmError"),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")}r(isModuleNotFoundError,"isModuleNotFoundError"),o(isModuleNotFoundError,"isModuleNotFoundError"),n(isModuleNotFoundError,"isModuleNotFoundError");function requireNestInstrumentation(){return require("@lensmcp/nest-instrumentation")}r(requireNestInstrumentation,"requireNestInstrumentation"),o(requireNestInstrumentation,"requireNestInstrumentation"),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 s=e instanceof Error?e.message:String(e);if(status=isRequireEsmError(e)?{state:"runtime-too-old",detail:s}:{state:"failed",detail:s},!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`:s;console.warn(`[lensmcp] flow correlation is OFF \u2014 could not load @lensmcp/nest-instrumentation: ${i}`)}}}r(primeFlowContext,"primeFlowContext"),o(primeFlowContext,"primeFlowContext"),n(primeFlowContext,"primeFlowContext"),exports.CONTEXT_END=Symbol.for("lensmcp.contextEnd");function attachContextEnd(t){let e=!1;const s=[],i={get ended(){return e},onEnd(u){e?runEndListener(u):s.push(u)}};return Object.defineProperty(t,exports.CONTEXT_END,{value:i}),()=>{if(!e){e=!0;for(const u of s.splice(0))runEndListener(u)}}}r(attachContextEnd,"attachContextEnd"),o(attachContextEnd,"attachContextEnd"),n(attachContextEnd,"attachContextEnd");function runEndListener(t){try{t()}catch{}}r(runEndListener,"runEndListener"),o(runEndListener,"runEndListener"),n(runEndListener,"runEndListener");function contextEndOf(t){const e=t?.[exports.CONTEXT_END];return e&&typeof e.onEnd=="function"?e:void 0}r(contextEndOf,"contextEndOf"),o(contextEndOf,"contextEndOf"),n(contextEndOf,"contextEndOf"),exports.FLOW_START=Symbol.for("lensmcp.flowStart");function startLiveFlow(){const t=liveFlowContext();if(!t)return;if(t.flowId)return t.flowId;const e=t[exports.FLOW_START];if(typeof e=="function")try{return e()??t.flowId}catch{return t.flowId}}r(startLiveFlow,"startLiveFlow"),o(startLiveFlow,"startLiveFlow"),n(startLiveFlow,"startLiveFlow");function runInFlowContext(t,e){if(!runWith)return e();const s={sessionId:"pending",requestId:t.requestId,...t.flowId?{flowId:t.flowId}:{}},i=attachContextEnd(s);let u;try{u=runWith(s,e)}catch{return i(),e()}const c=u;return c&&typeof c.then=="function"?c.then(a=>(i(),a),a=>{throw i(),a}):(i(),u)}r(runInFlowContext,"runInFlowContext"),o(runInFlowContext,"runInFlowContext"),n(runInFlowContext,"runInFlowContext");function liveFlowContext(){try{return getCtx?.()}catch{return}}r(liveFlowContext,"liveFlowContext"),o(liveFlowContext,"liveFlowContext"),n(liveFlowContext,"liveFlowContext");function flowContext(){const t=liveFlowContext();if(t)return{...t.flowId?{flowId:t.flowId}:{},...t.requestId?{requestId:t.requestId}:{},...t.runId?{runId:t.runId}:{},...t.originNodeId?{originNodeId:t.originNodeId}:{}}}r(flowContext,"flowContext"),o(flowContext,"flowContext"),n(flowContext,"flowContext");
|
package/lib/http-capture.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
`)}:void 0}p(sseEvent,"sseEvent"),c(sseEvent,"sseEvent");class ResponseSink{static{p(this,"ResponseSink")}static{c(this,"ResponseSink")}constructor(e,s,n){this.contentType=e,this.startedAt=s,this.opts=n,this.total=0,this.kept=[],this.keptBytes=0,this.hash=(0,node_crypto_1.createHash)("sha256"),this.events=[],this.eventTotal=0,this.eventData=0,this.cut=!1,this.pendingText="",this.decoder=new TextDecoder,this.encoding=encodingOf(n.encoding),this.sse=!this.encoding&&/text\/event-stream/i.test(e),this.parsing=this.sse,this.hashing=!/json|^text\/|xml|form/i.test(e)}get size(){return this.total}take(e){const s=sseEvent(e);if(!s)return;this.eventTotal++;const n=Date.now()-this.startedAt;this.firstEventMs??=n;const r=limitsOf(this.opts.large);if(this.events.length>=r.events||this.eventData>=r.streamKept){this.cut=!0;return}const a=this.opts.ai?void 0:(0,ai_store_1.redactAiText)(s.data).slice(0,r.eventData);a&&(this.eventData+=a.length),this.events.push({atMs:n,event:s.event,bytes:Buffer.byteLength(e),...a!==void 0?{data:a}:{}})}push(e){if(this.total+=e.byteLength,this.sse){if(!this.parsing)return this.inTime();this.pendingText+=this.decoder.decode(e,{stream:!0});let s;for(;(s=this.pendingText.search(/\r?\n\r?\n/))>=0;){const n=/\r?\n\r?\n/.exec(this.pendingText.slice(s));this.take(this.pendingText.slice(0,s)),this.pendingText=this.pendingText.slice(s+n[0].length)}this.pendingText.length>limitsOf(this.opts.large).read&&(this.pendingText="",this.parsing=!1,this.cut=!0)}else this.opts.ai||(this.keptBytes<limitsOf(this.opts.large).read&&(this.kept.push(e),this.keptBytes+=e.byteLength),this.hashing&&!this.encoding&&(this.total<=MAX_HASH_BYTES?this.hash.update(e):this.hashing=!1));return this.inTime()}inTime(){return Date.now()-this.startedAt<=exports.MAX_STREAM_MS?!0:(this.cut=!0,!1)}finish(e=!1,s=Date.now()){e?this.cut=!0:this.parsing&&this.pendingText.trim()&&this.take(this.pendingText);const n=this.total,r=this.contentType.split(";")[0].trim();if(this.sse)return{endedAt:s,stream:{protocol:"sse",...this.firstEventMs!==void 0?{firstEventMs:this.firstEventMs}:{},events:this.events,bytes:n,total:this.eventTotal,...this.cut?{cut:!0}:{}}};if(this.opts.ai)return{endedAt:s,body:{contentType:r,size:n,kept:0,truncated:!1,omitted:"ai"}};const a=Buffer.concat(this.kept);if(this.encoding){const o=n<=MAX_READ?unpacked(this.encoding,a):void 0;if(!o)return{endedAt:s,body:{contentType:r.toLowerCase(),size:n,kept:0,truncated:!1,omitted:"encoded"}};const i=this.hashing&&o.length<=MAX_HASH_BYTES?(0,node_crypto_1.createHash)("sha256").update(o).digest("hex"):void 0;return{endedAt:s,body:(0,http_store_1.keepBody)(this.contentType,o,o.length,this.opts.paths,i,limitsOf(this.opts.large).keep)}}const h=this.hashing&&n<=MAX_HASH_BYTES?this.hash.digest("hex"):void 0;return{endedAt:s,body:(0,http_store_1.keepBody)(this.contentType,a,n,this.opts.paths,h,limitsOf(this.opts.large).keep)}}}exports.ResponseSink=ResponseSink;function readResponse(t,e,s,n){const r=(()=>{try{return t.headers.get("content-type")??""}catch{return""}})(),a=e.body;if(!a)return Promise.resolve({endedAt:Date.now()});const h=a.getReader(),o=new ResponseSink(r,s,n);return(async()=>{try{for(;;){const{done:i,value:
|
|
1
|
+
"use strict";var T=Object.defineProperty;var u=(t,e)=>T(t,"name",{value:e,configurable:!0});var g=Object.defineProperty,p=u((t,e)=>g(t,"name",{value:e,configurable:!0}),"p"),l=Object.defineProperty,c=p((t,e)=>l(t,"name",{value:e,configurable:!0}),"c");Object.defineProperty(exports,"__esModule",{value:!0}),exports.ResponseSink=exports.WrittenBody=exports.headerPairs=exports.MAX_STREAM_MS=void 0,exports.takeRequest=takeRequest,exports.chunkBytes=chunkBytes,exports.unpacked=unpacked,exports.writtenRequest=writtenRequest,exports.readResponse=readResponse,exports.requestPart=requestPart;const tslib_1=require("tslib"),node_crypto_1=require("node:crypto"),zlib=tslib_1.__importStar(require("node:zlib")),ai_store_1=require("./ai-store"),http_store_1=require("./http-store"),MAX_EVENTS=2e3,MAX_EVENT_DATA=4*1024,MAX_STREAM_KEPT=256*1024;exports.MAX_STREAM_MS=300*1e3;const MAX_HASH_BYTES=1024*1024,MAX_READ=http_store_1.MAX_KEPT_BYTES*32,LIMITS={standard:{read:MAX_READ,keep:http_store_1.MAX_KEPT_BYTES,events:MAX_EVENTS,eventData:MAX_EVENT_DATA,streamKept:MAX_STREAM_KEPT},large:{read:http_store_1.MAX_AI_KEPT_BYTES,keep:http_store_1.MAX_AI_KEPT_BYTES,events:2e4,eventData:1024*1024,streamKept:8*1024*1024}},limitsOf=c(t=>t?LIMITS.large:LIMITS.standard,"limitsOf"),headerPairs=c(t=>{try{if(!t)return[];if(typeof t.forEach=="function"&&typeof t.get=="function"){const e=[];return t.forEach((s,n)=>e.push([n,s])),e}return Array.isArray(t)?t.map(([e,s])=>[String(e),String(s)]):Object.entries(t).map(([e,s])=>[e,Array.isArray(s)?s.join(", "):String(s)])}catch{return[]}},"headerPairs");exports.headerPairs=headerPairs;function takeRequest(t,e,s,n=!1){const r=typeof t=="object"&&t!==null&&!(t instanceof URL)?t:void 0,a=[...(0,exports.headerPairs)(r?.headers),...(0,exports.headerPairs)(e?.headers)],h=a.find(([d])=>d.toLowerCase()==="content-type")?.[1]??"",o={headers:a,contentType:h};if(!s)return o;const i=e?.body,f=c(d=>new TextEncoder().encode(d),"enc");if(typeof i=="string")return{...o,bytes:f(i),size:Buffer.byteLength(i)};if(i instanceof URLSearchParams)return{...o,contentType:h||"application/x-www-form-urlencoded",bytes:f(i.toString())};if(i instanceof ArrayBuffer)return{...o,bytes:new Uint8Array(i),size:i.byteLength};if(ArrayBuffer.isView(i))return{...o,bytes:new Uint8Array(i.buffer,i.byteOffset,i.byteLength),size:i.byteLength};if(typeof Blob<"u"&&i instanceof Blob)return{...o,size:i.size,...i.size<=limitsOf(n).read?{pending:i.arrayBuffer().then(d=>new Uint8Array(d)).catch(()=>{})}:{}};if(typeof FormData<"u"&&i instanceof FormData)return{...o,omitted:"form-data"};if(i!=null)return{...o,omitted:"stream"};if(r&&!r.bodyUsed&&r.body)try{return{...o,pending:r.clone().arrayBuffer().then(d=>new Uint8Array(d)).catch(()=>{})}}catch{return o}return o}u(takeRequest,"takeRequest"),p(takeRequest,"takeRequest"),c(takeRequest,"takeRequest");function chunkBytes(t,e){if(t instanceof Uint8Array)return t;if(typeof t=="string")return Buffer.from(t,typeof e=="string"&&Buffer.isEncoding(e)?e:"utf8")}u(chunkBytes,"chunkBytes"),p(chunkBytes,"chunkBytes"),c(chunkBytes,"chunkBytes");class WrittenBody{static{u(this,"WrittenBody")}static{p(this,"WrittenBody")}static{c(this,"WrittenBody")}constructor(e,s=!1){this.keep=e,this.large=s,this.chunks=[],this.read=0,this.size=0}take(e,s){if(e==null||typeof e=="function")return;const n=chunkBytes(e,s);n&&(this.size+=n.byteLength,this.keep&&this.read<limitsOf(this.large).read&&(this.chunks.push(n),this.read+=n.byteLength))}get whole(){return this.read>=this.size}bytes(){return Buffer.concat(this.chunks)}}exports.WrittenBody=WrittenBody;function unpacked(t,e){try{if(t==="gzip"||t==="x-gzip")return zlib.gunzipSync(e,{maxOutputLength:MAX_READ});if(t==="br")return zlib.brotliDecompressSync(e,{maxOutputLength:MAX_READ});if(t==="deflate")return zlib.inflateSync(e,{maxOutputLength:MAX_READ})}catch{return}}u(unpacked,"unpacked"),p(unpacked,"unpacked"),c(unpacked,"unpacked");const encodingOf=c(t=>{const e=(t??"").trim().toLowerCase();return e==="identity"?"":e},"encodingOf");function writtenRequest(t,e){const s=(0,exports.headerPairs)(t),n=c(o=>s.find(([i])=>i.toLowerCase()===o)?.[1],"header"),r={headers:s,contentType:n("content-type")??""};if(!e||!e.size)return r;const a=encodingOf(n("content-encoding"));if(!a)return{...r,bytes:e.bytes(),size:e.size};const h=e.whole?unpacked(a,e.bytes()):void 0;return h?{...r,bytes:h,size:h.length}:{...r,size:e.size,omitted:"encoded"}}u(writtenRequest,"writtenRequest"),p(writtenRequest,"writtenRequest"),c(writtenRequest,"writtenRequest");function sseEvent(t){let e="message";const s=[];for(const n of t.split(/\r?\n/)){if(!n||n.startsWith(":"))continue;const r=n.indexOf(":"),a=r<0?n:n.slice(0,r),h=r<0?"":n.slice(r+1).replace(/^ /,"");a==="event"?e=h||"message":a==="data"&&s.push(h)}return s.length||e!=="message"?{event:e,data:s.join(`
|
|
2
|
+
`)}:void 0}u(sseEvent,"sseEvent"),p(sseEvent,"sseEvent"),c(sseEvent,"sseEvent");class ResponseSink{static{u(this,"ResponseSink")}static{p(this,"ResponseSink")}static{c(this,"ResponseSink")}constructor(e,s,n){this.contentType=e,this.startedAt=s,this.opts=n,this.total=0,this.kept=[],this.keptBytes=0,this.hash=(0,node_crypto_1.createHash)("sha256"),this.events=[],this.eventTotal=0,this.eventData=0,this.cut=!1,this.pendingText="",this.decoder=new TextDecoder,this.encoding=encodingOf(n.encoding),this.sse=!this.encoding&&/text\/event-stream/i.test(e),this.parsing=this.sse,this.hashing=!/json|^text\/|xml|form/i.test(e)}get size(){return this.total}take(e){const s=sseEvent(e);if(!s)return;this.eventTotal++;const n=Date.now()-this.startedAt;this.firstEventMs??=n;const r=limitsOf(this.opts.large);if(this.events.length>=r.events||this.eventData>=r.streamKept){this.cut=!0;return}const a=this.opts.ai?void 0:(0,ai_store_1.redactAiText)(s.data).slice(0,r.eventData);a&&(this.eventData+=a.length),this.events.push({atMs:n,event:s.event,bytes:Buffer.byteLength(e),...a!==void 0?{data:a}:{}})}push(e){if(this.total+=e.byteLength,this.sse){if(!this.parsing)return this.inTime();this.pendingText+=this.decoder.decode(e,{stream:!0});let s;for(;(s=this.pendingText.search(/\r?\n\r?\n/))>=0;){const n=/\r?\n\r?\n/.exec(this.pendingText.slice(s));this.take(this.pendingText.slice(0,s)),this.pendingText=this.pendingText.slice(s+n[0].length)}this.pendingText.length>limitsOf(this.opts.large).read&&(this.pendingText="",this.parsing=!1,this.cut=!0)}else this.opts.ai||(this.keptBytes<limitsOf(this.opts.large).read&&(this.kept.push(e),this.keptBytes+=e.byteLength),this.hashing&&!this.encoding&&(this.total<=MAX_HASH_BYTES?this.hash.update(e):this.hashing=!1));return this.inTime()}inTime(){return Date.now()-this.startedAt<=exports.MAX_STREAM_MS?!0:(this.cut=!0,!1)}finish(e=!1,s=Date.now()){e?this.cut=!0:this.parsing&&this.pendingText.trim()&&this.take(this.pendingText);const n=this.total,r=this.contentType.split(";")[0].trim();if(this.sse)return{endedAt:s,stream:{protocol:"sse",...this.firstEventMs!==void 0?{firstEventMs:this.firstEventMs}:{},events:this.events,bytes:n,total:this.eventTotal,...this.cut?{cut:!0}:{}}};if(this.opts.ai)return{endedAt:s,body:{contentType:r,size:n,kept:0,truncated:!1,omitted:"ai"}};const a=Buffer.concat(this.kept);if(this.encoding){const o=n<=MAX_READ?unpacked(this.encoding,a):void 0;if(!o)return{endedAt:s,body:{contentType:r.toLowerCase(),size:n,kept:0,truncated:!1,omitted:"encoded"}};const i=this.hashing&&o.length<=MAX_HASH_BYTES?(0,node_crypto_1.createHash)("sha256").update(o).digest("hex"):void 0;return{endedAt:s,body:(0,http_store_1.keepBody)(this.contentType,o,o.length,this.opts.paths,i,limitsOf(this.opts.large).keep)}}const h=this.hashing&&n<=MAX_HASH_BYTES?this.hash.digest("hex"):void 0;return{endedAt:s,body:(0,http_store_1.keepBody)(this.contentType,a,n,this.opts.paths,h,limitsOf(this.opts.large).keep)}}}exports.ResponseSink=ResponseSink;function readResponse(t,e,s,n){const r=(()=>{try{return t.headers.get("content-type")??""}catch{return""}})(),a=e.body;if(!a)return Promise.resolve({endedAt:Date.now()});const h=a.getReader(),o=new ResponseSink(r,s,n);return(async()=>{try{for(;;){const{done:i,value:f}=await h.read();if(i)break;if(!o.push(f)){await h.cancel().catch(()=>{});break}}}catch{return o.finish(!0)}return o.finish()})()}u(readResponse,"readResponse"),p(readResponse,"readResponse"),c(readResponse,"readResponse");async function requestPart(t,e,s,n,r,a,h=!1){const{headers:o,redacted:i}=(0,http_store_1.redactHeaders)(t.headers);a.push(...i);const f=s==="bodies"&&e.length>1?(0,http_store_1.redactQuery)(e):[];let d;if(s==="bodies"){const b=t.contentType.split(";")[0].trim().toLowerCase();if(n)d={contentType:b,size:t.size??t.bytes?.byteLength??0,kept:0,truncated:!1,omitted:"ai"};else if(t.omitted)d={contentType:b,size:t.size??0,kept:0,truncated:!1,omitted:t.omitted};else{const y=t.bytes??await t.pending;y&&y.byteLength&&(d=(0,http_store_1.keepBody)(t.contentType,y,t.size??y.byteLength,r,void 0,limitsOf(h).keep))}}return{headers:o,...f.length?{query:f}:{},...d?{body:d}:{}}}u(requestPart,"requestPart"),p(requestPart,"requestPart"),c(requestPart,"requestPart");
|
package/lib/http-store.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var f=Object.defineProperty;var d=(e,t)=>f(e,"name",{value:t,configurable:!0});var _=Object.defineProperty,u=d((e,t)=>_(e,"name",{value:t,configurable:!0}),"u"),x=Object.defineProperty,a=u((e,t)=>x(e,"name",{value:t,configurable:!0}),"a");Object.defineProperty(exports,"__esModule",{value:!0}),exports.exchangeTime=exports.DEFAULT_HTTP_MAX_AGE_MS=exports.DEFAULT_HTTP_MAX_FILES=exports.newExchangeId=exports.MAX_AI_KEPT_BYTES=exports.MAX_KEPT_BYTES=exports.REMOVED=void 0,exports.httpCaptureMode=httpCaptureMode,exports.redactHeaders=redactHeaders,exports.redactQuery=redactQuery,exports.keepBody=keepBody,exports.pruneHttpExchanges=pruneHttpExchanges,exports.writeHttpExchange=writeHttpExchange;const tslib_1=require("tslib"),nodeFs=tslib_1.__importStar(require("node:fs")),node_crypto_1=require("node:crypto"),http_exchange_1=require("@lensmcp/core/http-exchange"),redact_1=require("@lensmcp/core/redact"),ai_store_1=require("./ai-store"),emit_1=require("./emit"),mkdirSync=nodeFs.mkdirSync,writeFileSync=nodeFs.writeFileSync,renameSync=nodeFs.renameSync,readdirSync=nodeFs.readdirSync,readFileSync=nodeFs.readFileSync,unlinkSync=nodeFs.unlinkSync;function httpCaptureMode(e=process.env){const t=(e.LENSMCP_HTTP_CAPTURE??"").trim().toLowerCase();return t==="off"||t==="0"||t==="false"||t==="none"?"off":t==="headers"?"headers":"bodies"}d(httpCaptureMode,"httpCaptureMode"),u(httpCaptureMode,"httpCaptureMode"),a(httpCaptureMode,"httpCaptureMode"),exports.REMOVED="\u2022\u2022\u2022\u2022 redacted",exports.MAX_KEPT_BYTES=64*1024,exports.MAX_AI_KEPT_BYTES=4*1024*1024;const MAX_PARSE_BYTES=2*1024*1024,newExchangeId=a(()=>`hx_${Date.now().toString(36)}${(0,node_crypto_1.randomBytes)(5).toString("hex")}`,"newExchangeId");exports.newExchangeId=newExchangeId;const CREDENTIAL_HEADERS=/^(authorization|proxy-authorization|cookie|set-cookie|x-api-key|api-key|openai-organization|openai-project|x-internal-token|x-amz-security-token)$|-api-key$|-token$|-secret$/i,CREDENTIAL_FIELD=/pass(word|wd)?|secret|token|api[-_]?key|authorization|credential|cookie|signature/i;function jwtClaims(e){const t=e.split(".");if(t.length===3)try{const r=JSON.parse(Buffer.from(t[1].replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"));return`JWT \xB7 ${["iss","aud","sub","exp"].filter(n=>r[n]!==void 0).map(n=>`${n}=${n==="exp"&&typeof r[n]=="number"?new Date(r[n]*1e3).toISOString():String(r[n]).slice(0,80)}`).join(" \xB7 ")||"no claims"} \xB7 ${exports.REMOVED.split(" ")[0]} signature`}catch{return}}d(jwtClaims,"jwtClaims"),u(jwtClaims,"jwtClaims"),a(jwtClaims,"jwtClaims");function redactHeaders(e){const t=[],r=[];for(const[n,o]of e){const s=n.toLowerCase();if(CREDENTIAL_HEADERS.test(s)||(0,redact_1.isSecretParam)(s)){r.push(s);const c=/^bearer\s+(\S+)$/i.exec(o.trim()),i=c?jwtClaims(c[1]):void 0,p=/^(\w+)\s+\S/.exec(o.trim())?.[1];t.push([s,i?`Bearer ${i}`:p&&s.endsWith("authorization")?`${p} ${exports.REMOVED}`:exports.REMOVED])}else t.push([s,(0,ai_store_1.redactAiText)(o).slice(0,2048)])}return{headers:t,redacted:r}}d(redactHeaders,"redactHeaders"),u(redactHeaders,"redactHeaders"),a(redactHeaders,"redactHeaders");function redactQuery(e){const t=[];try{for(const[r,n]of new URLSearchParams(e))t.push([r,(0,redact_1.isSecretParam)(r)||CREDENTIAL_FIELD.test(r)?exports.REMOVED:(0,ai_store_1.redactAiText)(n).slice(0,1024)])}catch{}return t.slice(0,100)}d(redactQuery,"redactQuery"),u(redactQuery,"redactQuery"),a(redactQuery,"redactQuery");function redactJson(e,t,r,n=0){if(n>32||e===null||typeof e!="object")return typeof e=="string"?(0,ai_store_1.redactAiText)(e):e;if(Array.isArray(e))return e.map((s,c)=>redactJson(s,`${t}[${c}]`,r,n+1));const o={};for(const[s,c]of Object.entries(e)){const i=t?`${t}.${s}`:s,p=typeof c=="number"&&/tokens/i.test(s);CREDENTIAL_FIELD.test(s)&&c!==null&&typeof c!="object"&&!p?(o[s]=exports.REMOVED,r.length<50&&r.push(i)):o[s]=redactJson(c,i,r,n+1)}return o}d(redactJson,"redactJson"),u(redactJson,"redactJson"),a(redactJson,"redactJson");const textual=a(e=>/json|^text\/|x-www-form-urlencoded|xml|javascript|graphql|event-stream/i.test(e)||e==="","textual");function keepBody(e,t,r,n,o,s=exports.MAX_KEPT_BYTES){const c=e.split(";")[0].trim().toLowerCase();if(!textual(c))return{contentType:c||"application/octet-stream",size:r,kept:0,truncated:!1,omitted:"binary",...o?{sha256:o}:{}};const i=t.byteLength>=r&&r<=Math.max(MAX_PARSE_BYTES,s),p=Buffer.from(t.buffer,t.byteOffset,t.byteLength).toString("utf8");let E;if(i&&/json/.test(c))try{E=JSON.stringify(redactJson(JSON.parse(p),"",n))}catch{E=(0,ai_store_1.redactAiText)(p)}else i&&/x-www-form-urlencoded/.test(c)?E=new URLSearchParams(redactQuery(p)).toString():E=(0,ai_store_1.redactAiText)(p);const h=Buffer.byteLength(E)>s?Buffer.from(E).subarray(0,s).toString("utf8"):E;return{contentType:c,size:r,kept:Buffer.byteLength(h),text:h,truncated:r>t.byteLength||h.length<E.length}}d(keepBody,"keepBody"),u(keepBody,"keepBody"),a(keepBody,"keepBody"),exports.DEFAULT_HTTP_MAX_FILES=1e4,exports.DEFAULT_HTTP_MAX_AGE_MS=1440*6e4;const PRUNE_EVERY_MS=3e4,maxFiles=a(()=>{const e=Number(process.env.LENSMCP_HTTP_MAX_FILES);return Number.isInteger(e)&&e>=10?e:exports.DEFAULT_HTTP_MAX_FILES},"maxFiles"),maxAgeMs=a(()=>{const e=Number(process.env.LENSMCP_HTTP_MAX_AGE_MS);return Number.isFinite(e)&&e>=6e4?e:exports.DEFAULT_HTTP_MAX_AGE_MS},"maxAgeMs"),exchangeTime=a(e=>{const t=/^hx_([0-9a-z]{8})/.exec(e),r=t?parseInt(t[1],36):NaN;return Number.isFinite(r)?r:void 0},"exchangeTime");exports.exchangeTime=exchangeTime;const lastPrune=new Map;function pruneHttpExchanges(e,t=Date.now(),r=`${e}/ai`){let n=0;try{const o=readdirSync(e).filter(i=>/^hx_[0-9a-z]+\.json$/.test(i)).sort(),s=o.length-maxFiles(),c=t-maxAgeMs();for(let i=0;i<o.length;i+=1){const p=(0,exports.exchangeTime)(o[i]);if(i>=s&&(p===void 0||p>=c))break;try{if(JSON.parse(readFileSync(`${e}/${o[i]}`,"utf8"))?.ai){mkdirSync(r,{recursive:!0,mode:448}),renameSync(`${e}/${o[i]}`,`${r}/${o[i]}`);continue}unlinkSync(`${e}/${o[i]}`),n+=1}catch{}}}catch{}return n}d(pruneHttpExchanges,"pruneHttpExchanges"),u(pruneHttpExchanges,"pruneHttpExchanges"),a(pruneHttpExchanges,"pruneHttpExchanges");function writeHttpExchange(e){try{const t=(0,http_exchange_1.exchangePlace)(e),r=(0,http_exchange_1.httpExchangeDir)(emit_1.EVENT_FILE,t);mkdirSync(r,{recursive:!0,mode:448});const n=(0,http_exchange_1.httpExchangeFile)(emit_1.EVENT_FILE,e.id,t);writeFileSync(`${n}.tmp`,JSON.stringify(e),{mode:384}),renameSync(`${n}.tmp`,n);const o=Date.now();return t!=="ai"&&o-(lastPrune.get(t)??0)>=PRUNE_EVERY_MS&&(lastPrune.set(t,o),pruneHttpExchanges(r,o,(0,http_exchange_1.httpExchangeDir)(emit_1.EVENT_FILE,"ai"))),!0}catch{return!1}}d(writeHttpExchange,"writeHttpExchange"),u(writeHttpExchange,"writeHttpExchange"),a(writeHttpExchange,"writeHttpExchange");
|
package/lib/install.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var i=Object.defineProperty;var n=(t,r)=>i(t,"name",{value:r,configurable:!0});var p=Object.defineProperty,a=n((t,r)=>p(t,"name",{value:r,configurable:!0}),"a"),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"),emit_custom_1=require("./emit-custom"),tap_egress_1=require("./tap-egress"),tap_ai_1=require("./tap-ai"),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_nest_logger_1=require("./tap-nest-logger"),tap_event_loop_1=require("./tap-event-loop"),tap_ingress_1=require("./tap-ingress"),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,emit_custom_1.installCustomEmit)()}catch{}try{(0,tap_egress_1.tapEgress)()}catch{}try{(0,tap_ingress_1.tapIngress)()}catch{}try{(0,tap_ai_1.tapAi)()}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,"@nestjs/common":tap_nest_logger_1.nestLoggerTap})}catch{}try{(0,tap_nest_1.installChildAppBridge)()}catch{}}}n(installLensmcpNodeInstrumentation,"installLensmcpNodeInstrumentation"),a(installLensmcpNodeInstrumentation,"installLensmcpNodeInstrumentation"),e(installLensmcpNodeInstrumentation,"installLensmcpNodeInstrumentation");
|
package/lib/loop-watchdog.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var u=Object.defineProperty;var s=(t,e)=>u(t,"name",{value:e,configurable:!0});var p=Object.defineProperty,i=s((t,e)=>p(t,"name",{value:e,configurable:!0}),"i"),d=Object.defineProperty,o=i((t,e)=>d(t,"name",{value:e,configurable:!0}),"o");Object.defineProperty(exports,"__esModule",{value:!0}),exports.startLoopWatchdog=startLoopWatchdog;const node_worker_threads_1=require("node:worker_threads"),node_path_1=require("node:path"),loop_identity_1=require("./loop-identity"),emit_1=require("./emit"),WATCHER=`
|
|
2
2
|
const { workerData } = require('node:worker_threads');
|
|
3
3
|
const fs = require('node:fs');
|
|
4
4
|
const path = require('node:path');
|
|
@@ -35,4 +35,4 @@ setInterval(() => {
|
|
|
35
35
|
incident = undefined;
|
|
36
36
|
}
|
|
37
37
|
}, 250);
|
|
38
|
-
`;function startLoopWatchdog(t){if(process.env.LENSMCP_EVENT_LOOP_WATCHDOG==="0")return;const e=new SharedArrayBuffer(16),
|
|
38
|
+
`;function startLoopWatchdog(t){if(process.env.LENSMCP_EVENT_LOOP_WATCHDOG==="0")return;const e=new SharedArrayBuffer(16),c=new BigInt64Array(e),l=o(()=>{Atomics.store(c,0,process.hrtime.bigint()),Atomics.store(c,1,BigInt(Date.now()))},"beat");l();const r=setInterval(l,20);r.unref();try{let a=!1;const n=new node_worker_threads_1.Worker(WATCHER,{eval:!0,execArgv:[],env:{...process.env,NODE_OPTIONS:"",LENSMCP_AUTO:"0",LENSMCP_EVENT_LOOP:"0"},workerData:{shared:e,loop:loop_identity_1.NODE_LOOP,threshold:1e3,file:(0,node_path_1.join)((0,node_path_1.dirname)(emit_1.EVENT_FILE),"event-loops",`${process.pid}-${loop_identity_1.NODE_LOOP.threadId}-${Math.floor(performance.timeOrigin)}.json`)}}),w=o(()=>{clearInterval(r),a||(a=!0,t?.())},"unavailable");return n.on("error",w),n.on("exit",w),n.unref(),()=>{a=!0,clearInterval(r),n.terminate()}}catch{clearInterval(r);return}}s(startLoopWatchdog,"startLoopWatchdog"),i(startLoopWatchdog,"startLoopWatchdog"),o(startLoopWatchdog,"startLoopWatchdog");
|
package/lib/require-hook.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var f=Object.defineProperty;var u=(e,o)=>f(e,"name",{value:o,configurable:!0});var l=Object.defineProperty,s=u((e,o)=>l(e,"name",{value:o,configurable:!0}),"s"),a=Object.defineProperty,r=s((e,o)=>a(e,"name",{value:o,configurable:!0}),"r");Object.defineProperty(exports,"__esModule",{value:!0}),exports.installRequireHook=installRequireHook;const tapped=new Set;function runTap(e,o,d){try{o(d)!==!1&&tapped.add(e)}catch{tapped.add(e)}}u(runTap,"runTap"),s(runTap,"runTap"),r(runTap,"runTap");function installRequireHook(e){const o=require("node:module"),d=o._load;o._load=function(n,...i){const c=d.call(this,n,...i),t=e[n];return t&&!tapped.has(n)&&runTap(n,t,c),c};for(const n of Object.keys(e)){if(tapped.has(n))continue;const i=e[n];if(i)try{const c=require.resolve(n),t=require.cache[c];t&&runTap(n,i,t.exports)}catch{}}}u(installRequireHook,"installRequireHook"),s(installRequireHook,"installRequireHook"),r(installRequireHook,"installRequireHook");
|
package/lib/sql-accounting.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var S=Object.defineProperty;var r=(e,t)=>S(e,"name",{value:t,configurable:!0});var u=Object.defineProperty,n=r((e,t)=>u(e,"name",{value:t,configurable:!0}),"n"),l=Object.defineProperty,s=n((e,t)=>l(e,"name",{value:t,configurable:!0}),"s");Object.defineProperty(exports,"__esModule",{value:!0}),exports.SQL_ACCOUNT_SETTLE_MS=exports.SQL_ACCOUNT_KIND=void 0,exports.beginSqlStatement=beginSqlStatement,exports.endSqlStatement=endSqlStatement,exports.abandonSqlStatement=abandonSqlStatement;const flood_guard_1=require("./flood-guard"),emit_1=require("./emit"),flow_context_1=require("./flow-context");exports.SQL_ACCOUNT_KIND="db-request-account",exports.SQL_ACCOUNT_SETTLE_MS=1e3;const accountGuard=(0,flood_guard_1.createEventFloodGuard)({burst:120,perSec:20}),accounts=new WeakMap;let accountSeq=0;function newAccountId(){return accountSeq=(accountSeq+1)%16777215,`${Date.now().toString(36)}${accountSeq.toString(36)}${Math.random().toString(36).slice(2,6)}`}r(newAccountId,"newAccountId"),n(newAccountId,"newAccountId"),s(newAccountId,"newAccountId");function beginSqlStatement(e,t,o){if(!e||!t?.flowId||!t.requestId)return;let d=accounts.get(e);if(!d){const i=e.runId;d={accountId:newAccountId(),...typeof i=="string"&&i?{runId:i}:{},ctx:t,seq:0,inFlight:0,statements:0,failed:0,workMs:0,recorded:0,recordedWorkMs:0,suppressed:0,unwritten:0,firstStartedAt:o,lastEndedAt:o,awaitsEnd:!1,ended:!1},accounts.set(e,d);const a=(0,flow_context_1.contextEndOf)(e);if(a&&!a.ended){const c=d;c.awaitsEnd=!0,a.onEnd(()=>endSqlAccount(c))}}return d.inFlight+=1,d.timer&&(clearTimeout(d.timer),d.timer=void 0),d}r(beginSqlStatement,"beginSqlStatement"),n(beginSqlStatement,"beginSqlStatement"),s(beginSqlStatement,"beginSqlStatement");function endSqlStatement(e,t){e&&(e.inFlight=Math.max(0,e.inFlight-1),e.statements+=1,e.workMs+=t.durationMs,t.failed&&(e.failed+=1),t.emitted==="written"?(e.recorded+=1,e.recordedWorkMs+=t.durationMs):t.emitted==="suppressed"?e.suppressed+=1:e.unwritten+=1,e.lastEndedAt=Math.max(e.lastEndedAt,Date.now()),writeWhenDue(e))}r(endSqlStatement,"endSqlStatement"),n(endSqlStatement,"endSqlStatement"),s(endSqlStatement,"endSqlStatement");function abandonSqlStatement(e){e&&(e.inFlight=Math.max(0,e.inFlight-1),writeWhenDue(e))}r(abandonSqlStatement,"abandonSqlStatement"),n(abandonSqlStatement,"abandonSqlStatement"),s(abandonSqlStatement,"abandonSqlStatement");function endSqlAccount(e){e.ended=!0,writeWhenDue(e)}r(endSqlAccount,"endSqlAccount"),n(endSqlAccount,"endSqlAccount"),s(endSqlAccount,"endSqlAccount");function writeWhenDue(e){if(!(e.inFlight>0||e.statements===0)&&!(e.awaitsEnd&&!e.ended)){if(e.ended&&e.seq===0){writeAccount(e);return}settleLater(e)}}r(writeWhenDue,"writeWhenDue"),n(writeWhenDue,"writeWhenDue"),s(writeWhenDue,"writeWhenDue");function settleLater(e){e.timer&&clearTimeout(e.timer);const t=setTimeout(()=>writeAccount(e),exports.SQL_ACCOUNT_SETTLE_MS);t.unref?.(),e.timer=t}r(settleLater,"settleLater"),n(settleLater,"settleLater"),s(settleLater,"settleLater");function writeAccount(e){e.timer&&clearTimeout(e.timer),e.timer=void 0,e.seq+=1;const t=e.suppressed+e.unwritten,o=e.ended?"end":"settled";(0,emit_1.lensEmitOutcome)("lens","info",`SQL account: ${e.statements} statement${e.statements===1?"":"s"}`+(t>0?`, ${t} not on the bus`:", all on the bus"),{kind:exports.SQL_ACCOUNT_KIND,accountId:e.accountId,...e.runId?{runId:e.runId}:{},seq:e.seq,basis:o,statements:e.statements,failed:e.failed,workMs:e.workMs,recorded:e.recorded,recordedWorkMs:e.recordedWorkMs,suppressed:e.suppressed,unwritten:e.unwritten,firstStartedAt:e.firstStartedAt,lastEndedAt:e.lastEndedAt},`lens:sql-account:${emit_1.PROJECT}`,e.ctx,"db",accountGuard)}r(writeAccount,"writeAccount"),n(writeAccount,"writeAccount"),s(writeAccount,"writeAccount");
|
package/lib/sql-values.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var m=Object.defineProperty;var u=(e,o)=>m(e,"name",{value:o,configurable:!0});var g=Object.defineProperty,a=u((e,o)=>g(e,"name",{value:o,configurable:!0}),"a"),y=Object.defineProperty,c=a((e,o)=>y(e,"name",{value:o,configurable:!0}),"c");Object.defineProperty(exports,"__esModule",{value:!0}),exports.SQL_VALUES_RUN_MAX_CHARS=void 0,exports.newSqlValuesId=newSqlValuesId,exports.newCacheValuesId=newCacheValuesId,exports.keepSqlValues=keepSqlValues,exports.keepCacheValues=keepCacheValues,exports.pruneSqlValues=pruneSqlValues,exports.flushSqlValuesForTests=flushSqlValuesForTests;const tslib_1=require("tslib"),nodeFs=tslib_1.__importStar(require("node:fs")),node_path_1=require("node:path"),sql_values_1=require("@lensmcp/core/sql-values"),redact_1=require("@lensmcp/core/redact"),ai_store_1=require("./ai-store"),capture_file_1=require("./capture-file"),emit_1=require("./emit"),appendFile=nodeFs.appendFile,appendFileSync=nodeFs.appendFileSync,mkdirSync=nodeFs.mkdirSync,readdirSync=nodeFs.readdirSync,statSync=nodeFs.statSync,unlinkSync=nodeFs.unlinkSync;exports.SQL_VALUES_RUN_MAX_CHARS=64*1024;const MAX_AGE_MS=1440*6e4,MAX_TOTAL_BYTES=200*1024*1024,FLUSH_MS=1e3,PRUNE_EVERY_MS=10*6e4,PRUNE_EVERY_BYTES=20*1024*1024;let seq=0,pending=[],timer,lastPrune=0,appended=0;const made=new Set;let lensDir=c(()=>(0,node_path_1.dirname)(emit_1.EVENT_FILE),"lensDir");function newSqlValuesId(e){if((0,capture_file_1.sqlValuesAsked)(e))return seq=(seq+1)%2147483647,(0,sql_values_1.sqlValuesId)(e,process.pid,seq)}u(newSqlValuesId,"newSqlValuesId"),a(newSqlValuesId,"newSqlValuesId"),c(newSqlValuesId,"newSqlValuesId");function newCacheValuesId(e){if((0,capture_file_1.sqlValuesAsked)(e))return seq=(seq+1)%2147483647,(0,sql_values_1.cacheValuesId)(e,process.pid,seq)}u(newCacheValuesId,"newCacheValuesId"),a(newCacheValuesId,"newCacheValuesId"),c(newCacheValuesId,"newCacheValuesId");const MIN_VALUE_CHARS=256;function keptParam(e,o){let s;if(e==null)s=String(e);else if(typeof e=="string")s=e;else if(e instanceof Date)s=e.toISOString();else if(e instanceof Uint8Array)s=`<${e.byteLength} bytes>`;else if(typeof e=="bigint")s=e.toString();else try{s=JSON.stringify(typeof e=="object"?(0,redact_1.redactDeep)(e):e)??String(e)}catch{s=String(e)}const n=s.length>o,r=(0,ai_store_1.redactAiText)(n?s.slice(0,o+4096):s);return r.length>o?{text:`${r.slice(0,o-1)}\u2026`,cut:!0}:{text:r,cut:n}}u(keptParam,"keptParam"),a(keptParam,"keptParam"),c(keptParam,"keptParam");function cells(e,o=0){if(typeof e=="string")return(0,ai_store_1.redactAiText)(e);if(typeof e=="bigint")return e.toString();if(e instanceof Date)return Number.isNaN(e.getTime())?null:e.toISOString();if(e instanceof Uint8Array)return`<${e.byteLength} bytes>`;if(o>8||e===null||typeof e!="object")return e;if(Array.isArray(e))return e.map(n=>cells(n,o+1));const s={};for(const[n,r]of Object.entries(e))s[n]=cells(r,o+1);return s}u(cells,"cells"),a(cells,"cells"),c(cells,"cells");function json(e){try{return JSON.stringify(e,function(o,s){const n=this[o];return n instanceof Uint8Array?`<${n.byteLength} bytes>`:typeof s=="bigint"?s.toString():s})??""}catch{return""}}u(json,"json"),a(json,"json"),c(json,"json");function keepSqlValues(e,o,s,n,r){try{const t={id:e,at:o};let i=exports.SQL_VALUES_RUN_MAX_CHARS-256;if(n?.length){const l=(0,redact_1.redactSqlParams)(s,n),f=Math.max(MIN_VALUE_CHARS,Math.floor(i/l.length)-8),p=[];for(const h of l){const d=keptParam(h,f),S=json(d.text).length+1;if(S>i){t.cut=!0;break}d.cut&&(t.cut=!0),p.push(d.text),i-=S}t.params=p,p.length<l.length&&(t.paramCount=l.length)}if(r?.length){const l=[];for(const f of r){if(json(f).length+1>i){t.cut=!0;break}const p=(0,redact_1.redactDeep)(cells(f)),h=json(p).length+1;if(h>i){t.cut=!0;break}l.push(p),i-=h}l.length&&(t.rows=l),t.rowCount=r.length}pending.push(t),timer??=setTimeout(flush,FLUSH_MS),timer.unref?.()}catch{}}u(keepSqlValues,"keepSqlValues"),a(keepSqlValues,"keepSqlValues"),c(keepSqlValues,"keepSqlValues");function keptReply(e,o){if(e==null)return;if(e instanceof Uint8Array)return{reply:`<${e.byteLength} bytes>`,size:24,cut:!1};if(typeof e=="number"||typeof e=="boolean")return{reply:e,size:16,cut:!1};if(typeof e=="string"){const n=e.trimStart();if((n.startsWith("{")||n.startsWith("["))&&e.length<=o)try{const t=(0,redact_1.redactDeep)(cells(JSON.parse(e))),i=json(t).length;if(i<=o)return{reply:t,size:i,cut:!1}}catch{}const r=keptParam(e,Math.max(MIN_VALUE_CHARS,o-8));return{reply:r.text,size:json(r.text).length,cut:r.cut}}if(Array.isArray(e)){const n=[];let r=2;for(const t of e){if(json(t).length+1>o-r)return{reply:n,size:r,cut:!0};const i=(0,redact_1.redactDeep)(cells(t));r+=json(i).length+1,n.push(i)}return{reply:n,size:r,cut:!1}}if(json(e).length>o){const n=keptParam(e,Math.max(MIN_VALUE_CHARS,o-8));return{reply:n.text,size:json(n.text).length,cut:!0}}const s=(0,redact_1.redactDeep)(cells(e));return{reply:s,size:json(s).length,cut:!1}}u(keptReply,"keptReply"),a(keptReply,"keptReply"),c(keptReply,"keptReply");function keepCacheValues(e,o,s,n,r,t){try{const i={id:e,at:o,op:s,key:(0,ai_store_1.redactAiText)(n.slice(0,1024))};let l=exports.SQL_VALUES_RUN_MAX_CHARS-256-i.key.length;if(r?.length){const p=Math.max(MIN_VALUE_CHARS,Math.floor(l/2/r.length)-8),h=[];for(const d of r){const S=keptParam(d,p),_=json(S.text).length+1;if(_>l){i.cut=!0;break}S.cut&&(i.cut=!0),h.push(S.text),l-=_}i.args=h,h.length<r.length&&(i.argCount=r.length)}const f=keptReply(t,l);f&&(i.reply=f.reply,f.cut&&(i.cut=!0)),pending.push(i),timer??=setTimeout(flush,FLUSH_MS),timer.unref?.()}catch{}}u(keepCacheValues,"keepCacheValues"),a(keepCacheValues,"keepCacheValues"),c(keepCacheValues,"keepCacheValues");function flush(e=!1){if(timer=void 0,!pending.length)return;const o=pending;pending=[];const s=new Map;for(const n of o){const r=(0,sql_values_1.keptValuesFile)(lensDir(),n.id);if(!r)continue;const t=s.get(r)??[];t.push(JSON.stringify(n)),s.set(r,t)}try{for(const[n,r]of s){const t=(0,node_path_1.dirname)(n);made.has(t)||(mkdirSync(t,{recursive:!0,mode:448}),made.add(t));const i=`${r.join(`
|
|
2
2
|
`)}
|
|
3
|
-
`;appended+=i.length,
|
|
3
|
+
`;appended+=i.length,e?appendFileSync(n,i,{mode:384}):appendFile(n,i,{mode:384},()=>{})}}catch{}(Date.now()-lastPrune>=PRUNE_EVERY_MS||appended>=PRUNE_EVERY_BYTES)&&(lastPrune=Date.now(),appended=0,pruneSqlValues((0,node_path_1.join)(lensDir(),sql_values_1.SQL_VALUES_DIR)),pruneSqlValues((0,node_path_1.join)(lensDir(),sql_values_1.CACHE_VALUES_DIR)))}u(flush,"flush"),a(flush,"flush"),c(flush,"flush");function pruneSqlValues(e,o=Date.now()){let s;try{s=readdirSync(e).filter(t=>t.endsWith(".jsonl")).map(t=>{const i=statSync((0,node_path_1.join)(e,t));return{file:(0,node_path_1.join)(e,t),mtime:i.mtimeMs,size:i.size}}).sort((t,i)=>t.mtime-i.mtime)}catch{return 0}let n=s.reduce((t,i)=>t+i.size,0),r=0;for(const t of s){if(o-t.mtime<=MAX_AGE_MS&&n<=MAX_TOTAL_BYTES)break;try{unlinkSync(t.file),n-=t.size,r+=1}catch{}}return r}u(pruneSqlValues,"pruneSqlValues"),a(pruneSqlValues,"pruneSqlValues"),c(pruneSqlValues,"pruneSqlValues"),process.once("exit",()=>flush(!0));function flushSqlValuesForTests(e){e&&(lensDir=c(()=>e,"lensDir"),made.clear()),timer&&clearTimeout(timer),flush(!0)}u(flushSqlValuesForTests,"flushSqlValuesForTests"),a(flushSqlValuesForTests,"flushSqlValuesForTests"),c(flushSqlValuesForTests,"flushSqlValuesForTests");
|