@agimon-ai/log-sink-mcp 0.23.1 → 0.24.1

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/dist/cli.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- const e=require(`./node-CFha1yzq.cjs`),t=require(`./stdio-CEClGGJy.cjs`);let n=require(`zod`),r=require(`node:fs`),i=require(`node:fs/promises`);i=e.u(i,1);let a=require(`node:path`),o=require(`node:url`),s=require(`@agimon-ai/foundation-port-registry`),c=require(`@agimon-ai/foundation-process-registry`),l=require(`commander`),u=require(`@hono/node-server`),d=require(`node:crypto`),f=require(`hono`),p=require(`hono/cors`),m=require(`hono-rate-limiter`),h=require(`hono/html`),g=require(`hono/jsx/jsx-runtime`);function _(e){return e.option(`--config <path>`,`Path to .logsink.yaml`).option(`--global`,`Use the global log-sink instance`).option(`--instance <scope>`,`Force log-sink instance: local or global`)}function v(e){let t=e.instance?.trim();if(e.global&&t&&t.toLowerCase()!==`global`)throw Error(`Use either --global or --instance local, not both`);return e.global?`global`:t}function y(t,n=e.s){t.config&&(process.env.LOG_SINK_CONFIG=t.config);let r=v(t);return r&&(process.env.LOG_SINK_INSTANCE=r),e.c({configPath:t.config,packageName:n})}const b=[`error`,`fatal`];function x(e){let t=e.trim();if(!t)return null;try{return JSON.parse(t)}catch{return null}}function S(e){if(e==null)return`unknown`;if(typeof e==`string`)return e;try{return JSON.stringify(e,null,2)}catch{return String(e)}}function C(e){return e.hook_event_name===`PostToolUseFailure`?`Current tool failure:\n- Tool: ${e.tool_name??`unknown tool`}\n- Error: ${S(e.error)}`:null}function w(e,t,n){let r=new Map;for(let t of e){let e=`${t.service}::${t.level}::${t.error_type??``}::${t.error_message??t.message}`,i=new Date(Number(t.created_at)).toISOString();r.has(e)||r.set(e,{key:e,count:0,service:t.service,level:t.level,errorType:t.error_type,errorMessage:t.error_message,message:t.message,firstSeen:i,lastSeen:i,traceIds:new Set,examples:[]});let a=r.get(e);a.count+=1,a.lastSeen=i,t.trace_id&&a.traceIds.add(t.trace_id),a.examples.length<n&&a.examples.push({id:t.id,timestamp:i,traceId:t.trace_id})}return Array.from(r.values()).sort((e,t)=>t.count-e.count||t.lastSeen.localeCompare(e.lastSeen)).slice(0,t)}function ee(e,t,n,r){let i=w(e,n,r),a=[];a.push(`Recent log errors (${e.length} new):`),t.tool_name&&a.push(`- Triggered after tool: ${t.tool_name}`);for(let[e,t]of i.entries()){a.push(`${e+1}. ${t.service} [${t.level}] x${t.count} ${t.errorType?`(${t.errorType}) `:``}${t.errorMessage??t.message}`),a.push(` First seen: ${t.firstSeen}`),a.push(` Last seen: ${t.lastSeen}`),t.traceIds.size>0&&a.push(` Trace IDs: ${Array.from(t.traceIds).slice(0,3).join(`, `)}`);for(let e of t.examples)a.push(` Example: ${e.timestamp} id=${e.id}${e.traceId?` trace=${e.traceId}`:``}`)}if(t.hook_event_name===`PostToolUseFailure`){let e=C(t);e&&a.push(``,e)}return a.join(`
2
+ const e=require(`./node-9pwprHry.cjs`),t=require(`./stdio-Gb0mj6eo.cjs`);let n=require(`zod`),r=require(`node:fs`),i=require(`node:fs/promises`);i=e.u(i,1);let a=require(`node:path`),o=require(`node:url`),s=require(`@agimon-ai/foundation-port-registry`),c=require(`@agimon-ai/foundation-process-registry`),l=require(`commander`),u=require(`@hono/node-server`),d=require(`node:crypto`),f=require(`hono`),p=require(`hono/cors`),m=require(`hono-rate-limiter`),h=require(`hono/html`),g=require(`hono/jsx/jsx-runtime`);function _(e){return e.option(`--config <path>`,`Path to .logsink.yaml`).option(`--global`,`Use the global log-sink instance`).option(`--instance <scope>`,`Force log-sink instance: local or global`)}function v(e){let t=e.instance?.trim();if(e.global&&t&&t.toLowerCase()!==`global`)throw Error(`Use either --global or --instance local, not both`);return e.global?`global`:t}function y(t,n=e.s){t.config&&(process.env.LOG_SINK_CONFIG=t.config);let r=v(t);return r&&(process.env.LOG_SINK_INSTANCE=r),e.c({configPath:t.config,packageName:n})}const b=[`error`,`fatal`];function x(e){let t=e.trim();if(!t)return null;try{return JSON.parse(t)}catch{return null}}function S(e){if(e==null)return`unknown`;if(typeof e==`string`)return e;try{return JSON.stringify(e,null,2)}catch{return String(e)}}function C(e){return e.hook_event_name===`PostToolUseFailure`?`Current tool failure:\n- Tool: ${e.tool_name??`unknown tool`}\n- Error: ${S(e.error)}`:null}function w(e,t,n){let r=new Map;for(let t of e){let e=`${t.service}::${t.level}::${t.error_type??``}::${t.error_message??t.message}`,i=new Date(Number(t.created_at)).toISOString();r.has(e)||r.set(e,{key:e,count:0,service:t.service,level:t.level,errorType:t.error_type,errorMessage:t.error_message,message:t.message,firstSeen:i,lastSeen:i,traceIds:new Set,examples:[]});let a=r.get(e);a.count+=1,a.lastSeen=i,t.trace_id&&a.traceIds.add(t.trace_id),a.examples.length<n&&a.examples.push({id:t.id,timestamp:i,traceId:t.trace_id})}return Array.from(r.values()).sort((e,t)=>t.count-e.count||t.lastSeen.localeCompare(e.lastSeen)).slice(0,t)}function ee(e,t,n,r){let i=w(e,n,r),a=[];a.push(`Recent log errors (${e.length} new):`),t.tool_name&&a.push(`- Triggered after tool: ${t.tool_name}`);for(let[e,t]of i.entries()){a.push(`${e+1}. ${t.service} [${t.level}] x${t.count} ${t.errorType?`(${t.errorType}) `:``}${t.errorMessage??t.message}`),a.push(` First seen: ${t.firstSeen}`),a.push(` Last seen: ${t.lastSeen}`),t.traceIds.size>0&&a.push(` Trace IDs: ${Array.from(t.traceIds).slice(0,3).join(`, `)}`);for(let e of t.examples)a.push(` Example: ${e.timestamp} id=${e.id}${e.traceId?` trace=${e.traceId}`:``}`)}if(t.hook_event_name===`PostToolUseFailure`){let e=C(t);e&&a.push(``,e)}return a.join(`
3
3
  `)}function te(t){if(t.session_id?.trim())return(0,s.normalizeRepositoryPath)(e.l(t.cwd?.trim()||process.cwd()))}async function ne(t,n){let i=v(n);if(n.dbPath){let e=i===`global`?`global`:`local`;return(0,r.existsSync)(n.dbPath)?{dbPath:n.dbPath,scope:e}:void 0}let a={...process.env};n.config&&(a.LOG_SINK_CONFIG=n.config),i&&(a.LOG_SINK_INSTANCE=i);let o=e.c({configPath:n.config,cwd:t.cwd??process.cwd(),env:a,packageName:e.s}),c=new s.PortRegistryService(a.PORT_REGISTRY_PATH??s.DEFAULT_REGISTRY_PATH);try{let e=await c.getPort({repositoryPath:o.repositoryPath,serviceName:`log-sink-mcp-http`,serviceType:`tool`,environment:a.NODE_ENV||`development`}),t=e.record?.metadata?.dbPath;if(e.success&&typeof t==`string`&&t&&(0,r.existsSync)(t))return{dbPath:t,scope:o.scope}}catch{}return(0,r.existsSync)(o.dbPath)?{dbPath:o.dbPath,scope:o.scope}:void 0}async function re(e,t,n,r,i,a){let o=e.getSqliteClient(),s=Date.now()-n*60*1e3,c=``;if(t){let e=o.prepare(`
4
4
  SELECT id, created_at
5
5
  FROM logs
package/dist/cli.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{a as e,c as t,d as n,f as r,i,l as a,n as o,o as s,p as c,r as l,s as u,t as d,u as f}from"./stdio-BaJeLeLp.mjs";import{d as p,f as m,p as h,u as g}from"./node-B4HdfM_E.mjs";import{z as _}from"zod";import{existsSync as v,readFileSync as y}from"node:fs";import*as b from"node:fs/promises";import{dirname as x,join as ee}from"node:path";import{fileURLToPath as te}from"node:url";import{DEFAULT_PORT_RANGE as S,DEFAULT_REGISTRY_PATH as ne,PortRegistryService as re,normalizeRepositoryPath as ie}from"@agimon-ai/foundation-port-registry";import{createProcessLease as C,resolveSiblingRegistryPath as w}from"@agimon-ai/foundation-process-registry";import{Command as T,InvalidArgumentError as E}from"commander";import{serve as ae}from"@hono/node-server";import{createHash as oe}from"node:crypto";import{Hono as D}from"hono";import{cors as se}from"hono/cors";import{rateLimiter as ce}from"hono-rate-limiter";import{raw as le}from"hono/html";import{jsx as O,jsxs as k}from"hono/jsx/jsx-runtime";function A(e){return e.option(`--config <path>`,`Path to .logsink.yaml`).option(`--global`,`Use the global log-sink instance`).option(`--instance <scope>`,`Force log-sink instance: local or global`)}function j(e){let t=e.instance?.trim();if(e.global&&t&&t.toLowerCase()!==`global`)throw Error(`Use either --global or --instance local, not both`);return e.global?`global`:t}function M(e,t=p){e.config&&(process.env.LOG_SINK_CONFIG=e.config);let n=j(e);return n&&(process.env.LOG_SINK_INSTANCE=n),m({configPath:e.config,packageName:t})}const ue=[`error`,`fatal`];function de(e){let t=e.trim();if(!t)return null;try{return JSON.parse(t)}catch{return null}}function fe(e){if(e==null)return`unknown`;if(typeof e==`string`)return e;try{return JSON.stringify(e,null,2)}catch{return String(e)}}function pe(e){return e.hook_event_name===`PostToolUseFailure`?`Current tool failure:\n- Tool: ${e.tool_name??`unknown tool`}\n- Error: ${fe(e.error)}`:null}function me(e,t,n){let r=new Map;for(let t of e){let e=`${t.service}::${t.level}::${t.error_type??``}::${t.error_message??t.message}`,i=new Date(Number(t.created_at)).toISOString();r.has(e)||r.set(e,{key:e,count:0,service:t.service,level:t.level,errorType:t.error_type,errorMessage:t.error_message,message:t.message,firstSeen:i,lastSeen:i,traceIds:new Set,examples:[]});let a=r.get(e);a.count+=1,a.lastSeen=i,t.trace_id&&a.traceIds.add(t.trace_id),a.examples.length<n&&a.examples.push({id:t.id,timestamp:i,traceId:t.trace_id})}return Array.from(r.values()).sort((e,t)=>t.count-e.count||t.lastSeen.localeCompare(e.lastSeen)).slice(0,t)}function he(e,t,n,r){let i=me(e,n,r),a=[];a.push(`Recent log errors (${e.length} new):`),t.tool_name&&a.push(`- Triggered after tool: ${t.tool_name}`);for(let[e,t]of i.entries()){a.push(`${e+1}. ${t.service} [${t.level}] x${t.count} ${t.errorType?`(${t.errorType}) `:``}${t.errorMessage??t.message}`),a.push(` First seen: ${t.firstSeen}`),a.push(` Last seen: ${t.lastSeen}`),t.traceIds.size>0&&a.push(` Trace IDs: ${Array.from(t.traceIds).slice(0,3).join(`, `)}`);for(let e of t.examples)a.push(` Example: ${e.timestamp} id=${e.id}${e.traceId?` trace=${e.traceId}`:``}`)}if(t.hook_event_name===`PostToolUseFailure`){let e=pe(t);e&&a.push(``,e)}return a.join(`
2
+ import{a as e,c as t,d as n,f as r,i,l as a,n as o,o as s,p as c,r as l,s as u,t as d,u as f}from"./stdio-DaqaONHT.mjs";import{d as p,f as m,p as h,u as g}from"./node-Bv2snZci.mjs";import{z as _}from"zod";import{existsSync as v,readFileSync as y}from"node:fs";import*as b from"node:fs/promises";import{dirname as x,join as ee}from"node:path";import{fileURLToPath as te}from"node:url";import{DEFAULT_PORT_RANGE as S,DEFAULT_REGISTRY_PATH as ne,PortRegistryService as re,normalizeRepositoryPath as ie}from"@agimon-ai/foundation-port-registry";import{createProcessLease as C,resolveSiblingRegistryPath as w}from"@agimon-ai/foundation-process-registry";import{Command as T,InvalidArgumentError as E}from"commander";import{serve as ae}from"@hono/node-server";import{createHash as oe}from"node:crypto";import{Hono as D}from"hono";import{cors as se}from"hono/cors";import{rateLimiter as ce}from"hono-rate-limiter";import{raw as le}from"hono/html";import{jsx as O,jsxs as k}from"hono/jsx/jsx-runtime";function A(e){return e.option(`--config <path>`,`Path to .logsink.yaml`).option(`--global`,`Use the global log-sink instance`).option(`--instance <scope>`,`Force log-sink instance: local or global`)}function j(e){let t=e.instance?.trim();if(e.global&&t&&t.toLowerCase()!==`global`)throw Error(`Use either --global or --instance local, not both`);return e.global?`global`:t}function M(e,t=p){e.config&&(process.env.LOG_SINK_CONFIG=e.config);let n=j(e);return n&&(process.env.LOG_SINK_INSTANCE=n),m({configPath:e.config,packageName:t})}const ue=[`error`,`fatal`];function de(e){let t=e.trim();if(!t)return null;try{return JSON.parse(t)}catch{return null}}function fe(e){if(e==null)return`unknown`;if(typeof e==`string`)return e;try{return JSON.stringify(e,null,2)}catch{return String(e)}}function pe(e){return e.hook_event_name===`PostToolUseFailure`?`Current tool failure:\n- Tool: ${e.tool_name??`unknown tool`}\n- Error: ${fe(e.error)}`:null}function me(e,t,n){let r=new Map;for(let t of e){let e=`${t.service}::${t.level}::${t.error_type??``}::${t.error_message??t.message}`,i=new Date(Number(t.created_at)).toISOString();r.has(e)||r.set(e,{key:e,count:0,service:t.service,level:t.level,errorType:t.error_type,errorMessage:t.error_message,message:t.message,firstSeen:i,lastSeen:i,traceIds:new Set,examples:[]});let a=r.get(e);a.count+=1,a.lastSeen=i,t.trace_id&&a.traceIds.add(t.trace_id),a.examples.length<n&&a.examples.push({id:t.id,timestamp:i,traceId:t.trace_id})}return Array.from(r.values()).sort((e,t)=>t.count-e.count||t.lastSeen.localeCompare(e.lastSeen)).slice(0,t)}function he(e,t,n,r){let i=me(e,n,r),a=[];a.push(`Recent log errors (${e.length} new):`),t.tool_name&&a.push(`- Triggered after tool: ${t.tool_name}`);for(let[e,t]of i.entries()){a.push(`${e+1}. ${t.service} [${t.level}] x${t.count} ${t.errorType?`(${t.errorType}) `:``}${t.errorMessage??t.message}`),a.push(` First seen: ${t.firstSeen}`),a.push(` Last seen: ${t.lastSeen}`),t.traceIds.size>0&&a.push(` Trace IDs: ${Array.from(t.traceIds).slice(0,3).join(`, `)}`);for(let e of t.examples)a.push(` Example: ${e.timestamp} id=${e.id}${e.traceId?` trace=${e.traceId}`:``}`)}if(t.hook_event_name===`PostToolUseFailure`){let e=pe(t);e&&a.push(``,e)}return a.join(`
3
3
  `)}function ge(e){if(e.session_id?.trim())return ie(h(e.cwd?.trim()||process.cwd()))}async function _e(e,t){let n=j(t);if(t.dbPath){let e=n===`global`?`global`:`local`;return v(t.dbPath)?{dbPath:t.dbPath,scope:e}:void 0}let r={...process.env};t.config&&(r.LOG_SINK_CONFIG=t.config),n&&(r.LOG_SINK_INSTANCE=n);let i=m({configPath:t.config,cwd:e.cwd??process.cwd(),env:r,packageName:p}),a=new re(r.PORT_REGISTRY_PATH??ne);try{let e=await a.getPort({repositoryPath:i.repositoryPath,serviceName:`log-sink-mcp-http`,serviceType:`tool`,environment:r.NODE_ENV||`development`}),t=e.record?.metadata?.dbPath;if(e.success&&typeof t==`string`&&t&&v(t))return{dbPath:t,scope:i.scope}}catch{}return v(i.dbPath)?{dbPath:i.dbPath,scope:i.scope}:void 0}async function ve(e,t,n,r,i,a){let o=e.getSqliteClient(),s=Date.now()-n*60*1e3,c=``;if(t){let e=o.prepare(`
4
4
  SELECT id, created_at
5
5
  FROM logs
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./node-CFha1yzq.cjs`),t=require(`./stdio-CEClGGJy.cjs`);let n=require(`@opentelemetry/api`),r=require(`@opentelemetry/api-logs`);exports.SpanKind=n.SpanKind,exports.SpanStatusCode=n.SpanStatusCode,exports.StdioTransportHandler=t.t,exports.createNodeTelemetry=e.t,exports.createServer=t.n,exports.getLogSinkOtelEndpoint=e.n,exports.log=r.logs,exports.resolveLogSinkOtelEndpoint=e.a,exports.resolveLogSinkPort=e.o,exports.resolveNodeTelemetryEndpoints=e.r,exports.trace=n.trace;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./node-9pwprHry.cjs`),t=require(`./stdio-Gb0mj6eo.cjs`);let n=require(`@opentelemetry/api`),r=require(`@opentelemetry/api-logs`);exports.SpanKind=n.SpanKind,exports.SpanStatusCode=n.SpanStatusCode,exports.StdioTransportHandler=t.t,exports.createNodeTelemetry=e.t,exports.createServer=t.n,exports.getLogSinkOtelEndpoint=e.n,exports.log=r.logs,exports.resolveLogSinkOtelEndpoint=e.a,exports.resolveLogSinkPort=e.o,exports.resolveNodeTelemetryEndpoints=e.r,exports.trace=n.trace;
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{n as e,t}from"./stdio-BaJeLeLp.mjs";import{a as n,c as r,i,l as a,n as o,o as s,r as c,t as l,u}from"./node-B4HdfM_E.mjs";export{l as SpanKind,o as SpanStatusCode,t as StdioTransportHandler,c as createNodeTelemetry,e as createServer,i as getLogSinkOtelEndpoint,n as log,a as resolveLogSinkOtelEndpoint,u as resolveLogSinkPort,s as resolveNodeTelemetryEndpoints,r as trace};
1
+ import{n as e,t}from"./stdio-DaqaONHT.mjs";import{a as n,c as r,i,l as a,n as o,o as s,r as c,t as l,u}from"./node-Bv2snZci.mjs";export{l as SpanKind,o as SpanStatusCode,t as StdioTransportHandler,c as createNodeTelemetry,e as createServer,i as getLogSinkOtelEndpoint,n as log,a as resolveLogSinkOtelEndpoint,u as resolveLogSinkPort,s as resolveNodeTelemetryEndpoints,r as trace};
@@ -1,2 +1,2 @@
1
- var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`node:fs`),l=require(`node:fs/promises`),u=require(`node:os`),d=require(`node:path`);d=s(d,1);let f=require(`@agimon-ai/foundation-port-registry`),p=require(`yaml`),m=require(`node:async_hooks`),h=require(`@opentelemetry/api`),g=require(`@opentelemetry/api-logs`),ee=require(`@opentelemetry/exporter-logs-otlp-http`),te=require(`@opentelemetry/exporter-trace-otlp-http`),ne=require(`@opentelemetry/resources`),_=require(`@opentelemetry/sdk-logs`),v=require(`@opentelemetry/sdk-trace-node`);const y=[`pnpm-workspace.yaml`,`nx.json`,`.git`];function b(e=process.cwd()){let t=(0,d.resolve)(e);for(;;){for(let e of y)if((0,c.existsSync)((0,d.join)(t,e)))return t;let e=(0,d.dirname)(t);if(e===t)return process.cwd();t=e}}function x(e){let t=(0,d.basename)(b(e));return(0,d.join)((0,u.tmpdir)(),`log-sink-mcp`,t,`session.db`)}const S=d.default.join((0,u.homedir)(),`.log-sink-mcp`,`global`),C=d.default.join(S,`session.db`),w=`.logsink.yaml`;var T=class extends Error{constructor(e,t){super(e,t),this.name=`LogSinkConfigError`}};function E(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function re(e){return e===`~`?(0,u.homedir)():e.startsWith(`~/`)?d.default.join((0,u.homedir)(),e.slice(2)):e}function D(e){let t=d.default.resolve(e);for(;;){let e=d.default.join(t,w);if((0,c.existsSync)(e))return e;let n=d.default.dirname(t);if(n===t)return;t=n}}function O(e={}){let t=e.env??process.env,n=e.configPath??t.LOG_SINK_CONFIG;if(n)return d.default.resolve(re(n));let r=D(e.cwd??e.workspaceRoot??process.cwd());if(r)return r;let i=d.default.join((0,u.homedir)(),w);return(0,c.existsSync)(i)?i:void 0}function k(e,t){if(e!==void 0){if(!Number.isInteger(e)||e<=0||e>65535)throw new T(`Invalid ${w} at ${t}: global.port must be a TCP port`);return e}}function A(e,t){if(e===void 0)return[];if(!Array.isArray(e))throw new T(`Invalid ${w} at ${t}: global.services must be a string array`);let n=new Set;for(let r of e){if(typeof r!=`string`||r.trim().length===0)throw new T(`Invalid ${w} at ${t}: global.services must only contain strings`);n.add(r.trim())}return Array.from(n)}function j(e={}){let t=O(e);if(t)try{let e=(0,p.parse)((0,c.readFileSync)(t,`utf-8`));if(e==null)return{path:t,global:{services:[]}};if(!E(e))throw new T(`Invalid ${w} at ${t}: root must be an object`);let n=e.global;if(n!==void 0&&!E(n))throw new T(`Invalid ${w} at ${t}: global must be an object`);return{path:t,global:{port:k(n?.port,t),services:A(n?.services,t)}}}catch(e){throw e instanceof T?e:new T(`Failed to read ${w} at ${t}: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}function M(e){let t=e.LOG_SINK_INSTANCE?.trim().toLowerCase();if(t){if(t===`local`||t===`global`)return t;throw new T(`LOG_SINK_INSTANCE must be either "local" or "global"`)}}function ie(){return(0,c.mkdirSync)(S,{recursive:!0}),S}function N(e={}){let t=e.env??process.env,n=e.workspaceRoot?d.default.resolve(e.workspaceRoot):b(e.cwd??process.cwd()),r=e.packageName?.trim()||e.serviceName?.trim()||t.npm_package_name?.trim(),i=j({...e,env:t,cwd:e.cwd??n,workspaceRoot:n}),a=i?.global.services??[],o=M(t)??(r&&a.includes(r)?`global`:`local`),s=o===`global`?ie():n;return{configPath:i?.path,dbPath:o===`global`?C:x(n),globalServices:a,port:o===`global`?i?.global.port:void 0,registeredName:r,repositoryPath:s,scope:o,workspaceRoot:n}}const P=`log-sink-mcp-http`;async function F(e){let{env:t=process.env,healthCheck:n=!0}=e,r=t.PORT_REGISTRY_PATH??f.DEFAULT_REGISTRY_PATH,i=N(e),a=t.NODE_ENV||`development`,o=new f.PortRegistryService(r);try{let e=await o.getPort({repositoryPath:i.repositoryPath,serviceName:P,serviceType:`tool`,environment:a});if(!e.success||!e.port)return;let t=e.record?.host===`0.0.0.0`?`127.0.0.1`:e.record?.host??`127.0.0.1`,r=`http://${t}:${e.port}`;if(!n)return{port:e.port,host:t,endpoint:r};try{let n=await fetch(`${r}/health`);if(!n.ok)return;let i=await n.json();return i.status!==`healthy`||i.serviceName!==P&&i.service!==P?void 0:{port:e.port,host:t,endpoint:r}}catch{return}}catch{return}}async function I(e){return(await F(e))?.endpoint}const L=[`pnpm-workspace.yaml`,`nx.json`,`.git`],R=d.default.join(`logs`,`telemetry`);function z(e=process.cwd()){let t=d.default.resolve(e);for(;;){for(let e of L)if((0,c.existsSync)(d.default.join(t,e)))return t;let e=d.default.dirname(t);if(e===t)return process.cwd();t=e}}async function B(e){return I(e)}function V(e,t){let n=e.endsWith(`/`)?e:`${e}/`;return n.endsWith(`/v1/${t}/`)||n.endsWith(`/v1/${t}`)?e:new URL(`v1/${t}`,n).toString()}function H(e){return e===`1`||e?.toLowerCase()===`true`||e?.toLowerCase()===`yes`||e?.toLowerCase()===`on`}function U(e){if(!e)return;let t={};for(let n of e.split(`,`)){let[e,...r]=n.split(`=`),i=e?.trim(),a=r.join(`=`).trim();!i||!a||(t[i]=a)}return Object.keys(t).length>0?t:void 0}function W(e){if(!e)return;let t=Number(e);return Number.isFinite(t)&&t>0?t:void 0}function G(...e){let t={};for(let n of e)n&&Object.assign(t,n);return Object.keys(t).length>0?t:void 0}function K(e,t){return(t===`traces`?e.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT:e.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT)||(e.OTEL_EXPORTER_OTLP_ENDPOINT?V(e.OTEL_EXPORTER_OTLP_ENDPOINT,t):void 0)}function q(e,t,n){let r=t===`traces`?e.OTEL_EXPORTER_OTLP_TRACES_HEADERS:e.OTEL_EXPORTER_OTLP_LOGS_HEADERS,i=t===`traces`?e.OTEL_EXPORTER_OTLP_TRACES_TIMEOUT:e.OTEL_EXPORTER_OTLP_LOGS_TIMEOUT;return{headers:G(Object.fromEntries([[`x-agent-session-id`,e.AGENT_SESSION_ID],[`x-agent-parent-session-id`,e.PARENT_AGENT_SESSION_ID],[`x-workflow-run-id`,e.WORKFLOW_RUN_ID],[`x-workflow-run-key`,e.WORKFLOW_RUN_KEY],[`x-workflow-id`,e.WORKFLOW_ID],[`x-workflow-name`,e.WORKFLOW_NAME],[`x-workflow-workspace`,e.WORKFLOW_WORKSPACE],[`x-workflow-job-id`,e.WORKFLOW_JOB_ID],[`x-workflow-job-name`,e.WORKFLOW_JOB_NAME],[`x-workflow-step-name`,e.WORKFLOW_STEP_NAME],[`x-workflow-phase`,e.WORKFLOW_PHASE],[`x-workflow-runner`,e.WORKFLOW_RUNNER]].filter(e=>!!e[1])),U(e.OTEL_EXPORTER_OTLP_HEADERS),U(r),n),timeoutMillis:W(i??e.OTEL_EXPORTER_OTLP_TIMEOUT)}}async function J(e){let t=e.env??process.env,n=K(t,`traces`),r=K(t,`logs`);if(n||r)return{endpointSource:`env`,endpoint:t.OTEL_EXPORTER_OTLP_ENDPOINT,tracesEndpoint:n,logsEndpoint:r};if(t.LOG_SINK_ENDPOINT){let e=t.LOG_SINK_ENDPOINT;return{endpointSource:`logsink`,endpoint:e,tracesEndpoint:V(e,`traces`),logsEndpoint:V(e,`logs`)}}if(e.discoverEndpoint===!1)return{endpointSource:`none`};let i=await B({configPath:e.configPath,cwd:e.cwd,env:t,packageName:e.packageName,serviceName:e.serviceName,workspaceRoot:e.workspaceRoot,healthCheck:e.healthCheck});return i?{endpointSource:`logsink`,endpoint:i,tracesEndpoint:V(i,`traces`),logsEndpoint:V(i,`logs`)}:{endpointSource:`none`}}function ae(e){return typeof e==`string`||typeof e==`number`||typeof e==`boolean`?e:e==null?``:JSON.stringify(e)}function Y(e){if(!e)return;let t={};for(let[n,r]of Object.entries(e))r!=null&&(t[n]=ae(r));return Object.keys(t).length>0?t:void 0}function X(e){let t=h.trace.getSpan(e);if(!t)return{};let n=t.spanContext();return{traceId:n.traceId,spanId:n.spanId}}function oe(e,t,n={},r=h.context.active()){let i=h.trace.getSpan(n.context??r)?.spanContext();return JSON.stringify({timestamp:new Date().toISOString(),level:e,message:t,traceId:i?.traceId,spanId:i?.spanId,attributes:n.attributes?Y(n.attributes):void 0,exception:n.exception instanceof Error?{name:n.exception.name,message:n.exception.message,stack:n.exception.stack}:n.exception})}var se=class{pending=Promise.resolve();constructor(e){this.options=e}write(e,t,n){this.pending=this.pending.then(async()=>{let r=`${oe(e,t,n)}\n`;await this.ensureDirectory(),await this.rotateIfNeeded(Buffer.byteLength(r)),await(0,l.appendFile)(this.options.filePath,r,`utf8`)}).catch(e=>{console.error(`[log-sink-mcp telemetry] Failed to write log file ${this.options.filePath}:`,e)})}async flush(){await this.pending}async shutdown(){await this.flush()}async ensureDirectory(){await(0,l.mkdir)(d.default.dirname(this.options.filePath),{recursive:!0})}async rotateIfNeeded(e){let t=0;try{t=(await(0,l.stat)(this.options.filePath)).size}catch{}if(!(t+e<=this.options.maxFileSizeBytes)){for(let e=this.options.maxFileCount-1;e>=1;--e){let t=`${this.options.filePath}.${e}`,n=`${this.options.filePath}.${e+1}`;(0,c.existsSync)(t)&&await(0,l.rename)(t,n).catch(()=>void 0)}(0,c.existsSync)(this.options.filePath)&&await(0,l.rename)(this.options.filePath,`${this.options.filePath}.1`).catch(()=>void 0)}}};function ce(e,t,n){return{trace(t,r){e.emit({severityNumber:g.SeverityNumber.TRACE,severityText:`TRACE`,body:t,attributes:Y(r?.attributes),context:r?.context??n(),exception:r?.exception})},debug(t,r){e.emit({severityNumber:g.SeverityNumber.DEBUG,severityText:`DEBUG`,body:t,attributes:Y(r?.attributes),context:r?.context??n(),exception:r?.exception})},info(t,r){e.emit({severityNumber:g.SeverityNumber.INFO,severityText:`INFO`,body:t,attributes:Y(r?.attributes),context:r?.context??n(),exception:r?.exception})},warn(t,r){e.emit({severityNumber:g.SeverityNumber.WARN,severityText:`WARN`,body:t,attributes:Y(r?.attributes),context:r?.context??n(),exception:r?.exception})},error(t,r){e.emit({severityNumber:g.SeverityNumber.ERROR,severityText:`ERROR`,body:t,attributes:Y(r?.attributes),context:r?.context??n(),exception:r?.exception})},fatal(t,r){e.emit({severityNumber:g.SeverityNumber.FATAL,severityText:`FATAL`,body:t,attributes:Y(r?.attributes),context:r?.context??n(),exception:r?.exception})},getTraceContext:()=>X(n()),flush:()=>t.flush(),shutdown:()=>t.shutdown()}}function le(e,t){return{trace(n,r){e.write(`trace`,n,{...r,context:r?.context??t()})},debug(n,r){e.write(`debug`,n,{...r,context:r?.context??t()})},info(n,r){e.write(`info`,n,{...r,context:r?.context??t()})},warn(n,r){e.write(`warn`,n,{...r,context:r?.context??t()})},error(n,r){e.write(`error`,n,{...r,context:r?.context??t()})},fatal(n,r){e.write(`fatal`,n,{...r,context:r?.context??t()})},getTraceContext:()=>X(t()),flush:()=>e.flush(),shutdown:()=>e.shutdown()}}function Z(e){let t=(e,t)=>void 0;return{trace:t,debug:t,info:t,warn:t,error:t,fatal:t,getTraceContext:()=>X(e()),flush:async()=>void 0,shutdown:async()=>void 0}}function Q(e){return e instanceof Error?e.message:String(e)}function $(e,t){let n=t instanceof Error?t:Error(Q(t));e.recordException(n),e.setStatus({code:h.SpanStatusCode.ERROR,message:n.message})}async function ue(e){let t=e.env??process.env,n=e.workspaceRoot??z(process.cwd()),r=e.serviceName||t.OTEL_SERVICE_NAME||`unknown-service`,i=e.serviceVersion??t.npm_package_version,a=e.enableTraces!==!1,o=e.enableLogs!==!1,s=new m.AsyncLocalStorage,c=()=>s.getStore()??h.context.active(),l=()=>X(c()),u=async(e,t,n)=>await n(void 0);if(H(t.OTEL_SDK_DISABLED)){let e=Z(c);return{backend:`disabled`,enabled:!1,trace:h.trace,log:g.logs,logger:e,endpointSource:`none`,getTraceContext:l,runInSpan:u,flush:()=>e.flush(),shutdown:()=>e.shutdown()}}let f=e.maxFileSizeBytes??Number(t.LOG_SINK_FILE_MAX_BYTES??10485760),p=e.maxFileCount??Number(t.LOG_SINK_FILE_MAX_FILES??5),y=e.logDir??d.default.join(n,R),b=e.logFileName??`${r}.jsonl`,x=d.default.join(y,b),S=e.discoverEndpoint??!0,C=await J({configPath:e.configPath,cwd:e.cwd,env:t,packageName:e.packageName,serviceName:r,workspaceRoot:n,discoverEndpoint:S}).catch(e=>(console.warn(`[log-sink-mcp telemetry] Failed to resolve log-sink endpoint, falling back to file logging: ${Q(e)}`),{endpointSource:`none`})),w=a?C.tracesEndpoint:void 0,T=o?C.logsEndpoint:void 0;if(w||T){let n={"service.name":r};i&&(n[`service.version`]=i);let a=(0,ne.resourceFromAttributes)(n),o=q(t,`traces`,e.headers),u=q(t,`logs`,e.headers),d=w?new v.NodeTracerProvider({resource:a,spanProcessors:[new v.BatchSpanProcessor(new te.OTLPTraceExporter({url:w,headers:o.headers,timeoutMillis:o.timeoutMillis}))]}):void 0,f=d?.getTracer(r,i),p=T?new _.LoggerProvider({resource:a,processors:[new _.BatchLogRecordProcessor(new ee.OTLPLogExporter({url:T,headers:u.headers,timeoutMillis:u.timeoutMillis}))]}):void 0,m=p?.getLogger(r,i),y=m?ce(m,{flush:async()=>{await Promise.allSettled([d?.forceFlush(),p?.forceFlush()])},shutdown:async()=>{await Promise.allSettled([d?.shutdown(),p?.shutdown()])}},c):Z(c);return{backend:C.endpointSource===`env`?`otel`:`logsink`,enabled:!0,trace:h.trace,log:g.logs,logger:y,endpointSource:C.endpointSource,endpoint:C.endpoint,tracesEndpoint:w,logsEndpoint:T,getTraceContext:l,runInSpan:async(e,t,n)=>{if(!f)return await n(void 0);let r=t.context??c(),i=f.startSpan(e,{attributes:Y(t.attributes),kind:t.kind??h.SpanKind.INTERNAL},r),a=h.trace.setSpan(r,i);return await s.run(a,async()=>{try{return await n(i)}catch(e){throw $(i,e),e}finally{i.end()}})},flush:async()=>{await Promise.allSettled([d?.forceFlush(),p?.forceFlush()])},shutdown:async()=>{await Promise.allSettled([d?.shutdown(),p?.shutdown()])}}}let E=new se({filePath:x,maxFileSizeBytes:f,maxFileCount:p});return{backend:`file`,enabled:o,trace:h.trace,log:g.logs,logger:o?le(E,c):Z(c),endpointSource:`none`,filePath:x,getTraceContext:l,runInSpan:u,flush:()=>E.flush(),shutdown:()=>E.shutdown()}}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return`@agimon-ai/log-sink-mcp`}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return ue}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return s}});
2
- //# sourceMappingURL=node-CFha1yzq.cjs.map
1
+ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`node:fs`),l=require(`node:fs/promises`),u=require(`node:os`),d=require(`node:path`);d=s(d,1);let f=require(`@agimon-ai/foundation-port-registry`),p=require(`yaml`),m=require(`node:async_hooks`),h=require(`@opentelemetry/api`),g=require(`@opentelemetry/api-logs`),ee=require(`@opentelemetry/exporter-logs-otlp-http`),te=require(`@opentelemetry/exporter-trace-otlp-http`),ne=require(`@opentelemetry/resources`),_=require(`@opentelemetry/sdk-logs`),v=require(`@opentelemetry/sdk-trace-node`);const y=[`pnpm-workspace.yaml`,`nx.json`,`.git`];function b(e=process.cwd()){let t=(0,d.resolve)(e);for(;;){for(let e of y)if((0,c.existsSync)((0,d.join)(t,e)))return t;let e=(0,d.dirname)(t);if(e===t)return process.cwd();t=e}}function x(e){let t=(0,d.basename)(b(e));return(0,d.join)((0,u.tmpdir)(),`log-sink-mcp`,t,`session.db`)}const S=d.default.join((0,u.homedir)(),`.log-sink-mcp`,`global`),C=d.default.join(S,`session.db`),w=`.logsink.yaml`;var T=class extends Error{constructor(e,t){super(e,t),this.name=`LogSinkConfigError`}};function E(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function re(e){return e===`~`?(0,u.homedir)():e.startsWith(`~/`)?d.default.join((0,u.homedir)(),e.slice(2)):e}function D(e){let t=d.default.resolve(e);for(;;){let e=d.default.join(t,w);if((0,c.existsSync)(e))return e;let n=d.default.dirname(t);if(n===t)return;t=n}}function O(e={}){let t=e.env??process.env,n=e.configPath??t.LOG_SINK_CONFIG;if(n)return d.default.resolve(re(n));let r=D(e.cwd??e.workspaceRoot??process.cwd());if(r)return r;let i=d.default.join((0,u.homedir)(),w);return(0,c.existsSync)(i)?i:void 0}function k(e,t){if(e!==void 0){if(!Number.isInteger(e)||e<=0||e>65535)throw new T(`Invalid ${w} at ${t}: global.port must be a TCP port`);return e}}function A(e,t){if(e===void 0)return[];if(!Array.isArray(e))throw new T(`Invalid ${w} at ${t}: global.services must be a string array`);let n=new Set;for(let r of e){if(typeof r!=`string`||r.trim().length===0)throw new T(`Invalid ${w} at ${t}: global.services must only contain strings`);n.add(r.trim())}return Array.from(n)}function j(e={}){let t=O(e);if(t)try{let e=(0,p.parse)((0,c.readFileSync)(t,`utf-8`));if(e==null)return{path:t,global:{services:[]}};if(!E(e))throw new T(`Invalid ${w} at ${t}: root must be an object`);let n=e.global;if(n!==void 0&&!E(n))throw new T(`Invalid ${w} at ${t}: global must be an object`);return{path:t,global:{port:k(n?.port,t),services:A(n?.services,t)}}}catch(e){throw e instanceof T?e:new T(`Failed to read ${w} at ${t}: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}function M(e){let t=e.LOG_SINK_INSTANCE?.trim().toLowerCase();if(t){if(t===`local`||t===`global`)return t;throw new T(`LOG_SINK_INSTANCE must be either "local" or "global"`)}}function ie(){return(0,c.mkdirSync)(S,{recursive:!0}),S}function N(e={}){let t=e.env??process.env,n=e.workspaceRoot?d.default.resolve(e.workspaceRoot):b(e.cwd??process.cwd()),r=e.packageName?.trim()||e.serviceName?.trim()||t.npm_package_name?.trim(),i=j({...e,env:t,cwd:e.cwd??n,workspaceRoot:n}),a=i?.global.services??[],o=M(t)??(r&&a.includes(r)?`global`:`local`),s=o===`global`?ie():n;return{configPath:i?.path,dbPath:o===`global`?C:x(n),globalServices:a,port:o===`global`?i?.global.port:void 0,registeredName:r,repositoryPath:s,scope:o,workspaceRoot:n}}const P=`log-sink-mcp-http`;async function F(e){let{env:t=process.env,healthCheck:n=!0}=e,r=t.PORT_REGISTRY_PATH??f.DEFAULT_REGISTRY_PATH,i=N(e),a=t.NODE_ENV||`development`,o=new f.PortRegistryService(r);try{let e=await o.getPort({repositoryPath:i.repositoryPath,serviceName:P,serviceType:`tool`,environment:a});if(!e.success||!e.port)return;let t=e.record?.host===`0.0.0.0`?`127.0.0.1`:e.record?.host??`127.0.0.1`,r=`http://${t}:${e.port}`;if(!n)return{port:e.port,host:t,endpoint:r};try{let n=await fetch(`${r}/health`);if(!n.ok)return;let i=await n.json();return i.status!==`healthy`||i.serviceName!==P&&i.service!==P?void 0:{port:e.port,host:t,endpoint:r}}catch{return}}catch{return}}async function I(e){return(await F(e))?.endpoint}const L=[`pnpm-workspace.yaml`,`nx.json`,`.git`],R=d.default.join(`logs`,`telemetry`);function z(e=process.cwd()){let t=d.default.resolve(e);for(;;){for(let e of L)if((0,c.existsSync)(d.default.join(t,e)))return t;let e=d.default.dirname(t);if(e===t)return process.cwd();t=e}}async function B(e){return I(e)}function V(e,t){let n=e.endsWith(`/`)?e:`${e}/`;return n.endsWith(`/v1/${t}/`)||n.endsWith(`/v1/${t}`)?e:new URL(`v1/${t}`,n).toString()}function H(e){return e===`1`||e?.toLowerCase()===`true`||e?.toLowerCase()===`yes`||e?.toLowerCase()===`on`}function U(e){if(!e)return;let t={};for(let n of e.split(`,`)){let[e,...r]=n.split(`=`),i=e?.trim(),a=r.join(`=`).trim();!i||!a||(t[i]=a)}return Object.keys(t).length>0?t:void 0}function W(e){if(!e)return;let t=Number(e);return Number.isFinite(t)&&t>0?t:void 0}function G(...e){let t={};for(let n of e)n&&Object.assign(t,n);return Object.keys(t).length>0?t:void 0}function K(e,t){return(t===`traces`?e.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT:e.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT)||(e.OTEL_EXPORTER_OTLP_ENDPOINT?V(e.OTEL_EXPORTER_OTLP_ENDPOINT,t):void 0)}function q(e,t,n){let r=t===`traces`?e.OTEL_EXPORTER_OTLP_TRACES_HEADERS:e.OTEL_EXPORTER_OTLP_LOGS_HEADERS,i=t===`traces`?e.OTEL_EXPORTER_OTLP_TRACES_TIMEOUT:e.OTEL_EXPORTER_OTLP_LOGS_TIMEOUT;return{headers:G(Object.fromEntries([[`x-agent-session-id`,e.AGENT_SESSION_ID],[`x-agent-parent-session-id`,e.PARENT_AGENT_SESSION_ID],[`x-workflow-run-id`,e.WORKFLOW_RUN_ID],[`x-workflow-run-key`,e.WORKFLOW_RUN_KEY],[`x-workflow-id`,e.WORKFLOW_ID],[`x-workflow-name`,e.WORKFLOW_NAME],[`x-workflow-workspace`,e.WORKFLOW_WORKSPACE],[`x-workflow-job-id`,e.WORKFLOW_JOB_ID],[`x-workflow-job-name`,e.WORKFLOW_JOB_NAME],[`x-workflow-step-name`,e.WORKFLOW_STEP_NAME],[`x-workflow-phase`,e.WORKFLOW_PHASE],[`x-workflow-runner`,e.WORKFLOW_RUNNER]].filter(e=>!!e[1])),U(e.OTEL_EXPORTER_OTLP_HEADERS),U(r),n),timeoutMillis:W(i??e.OTEL_EXPORTER_OTLP_TIMEOUT)}}async function J(e){let t=e.env??process.env,n=K(t,`traces`),r=K(t,`logs`);if(n||r)return{endpointSource:`env`,endpoint:t.OTEL_EXPORTER_OTLP_ENDPOINT,tracesEndpoint:n,logsEndpoint:r};if(t.LOG_SINK_ENDPOINT){let e=t.LOG_SINK_ENDPOINT;return{endpointSource:`logsink`,endpoint:e,tracesEndpoint:V(e,`traces`),logsEndpoint:V(e,`logs`)}}if(e.discoverEndpoint===!1)return{endpointSource:`none`};let i=await B({configPath:e.configPath,cwd:e.cwd,env:t,packageName:e.packageName,serviceName:e.serviceName,workspaceRoot:e.workspaceRoot,healthCheck:e.healthCheck});return i?{endpointSource:`logsink`,endpoint:i,tracesEndpoint:V(i,`traces`),logsEndpoint:V(i,`logs`)}:{endpointSource:`none`}}function ae(e){return typeof e==`string`||typeof e==`number`||typeof e==`boolean`?e:e==null?``:JSON.stringify(e)}function Y(e){if(!e)return;let t={};for(let[n,r]of Object.entries(e))r!=null&&(t[n]=ae(r));return Object.keys(t).length>0?t:void 0}function X(e){let t=h.trace.getSpan(e);if(!t)return{};let n=t.spanContext();return{traceId:n.traceId,spanId:n.spanId}}function oe(e,t,n={},r=h.context.active()){let i=h.trace.getSpan(n.context??r)?.spanContext();return JSON.stringify({timestamp:new Date().toISOString(),level:e,message:t,traceId:i?.traceId,spanId:i?.spanId,attributes:n.attributes?Y(n.attributes):void 0,exception:n.exception instanceof Error?{name:n.exception.name,message:n.exception.message,stack:n.exception.stack}:n.exception})}var se=class{pending=Promise.resolve();constructor(e){this.options=e}write(e,t,n){this.pending=this.pending.then(async()=>{let r=`${oe(e,t,n)}\n`;await this.ensureDirectory(),await this.rotateIfNeeded(Buffer.byteLength(r)),await(0,l.appendFile)(this.options.filePath,r,`utf8`)}).catch(e=>{console.error(`[log-sink-mcp telemetry] Failed to write log file ${this.options.filePath}:`,e)})}async flush(){await this.pending}async shutdown(){await this.flush()}async ensureDirectory(){await(0,l.mkdir)(d.default.dirname(this.options.filePath),{recursive:!0})}async rotateIfNeeded(e){let t=0;try{t=(await(0,l.stat)(this.options.filePath)).size}catch{}if(!(t+e<=this.options.maxFileSizeBytes)){for(let e=this.options.maxFileCount-1;e>=1;--e){let t=`${this.options.filePath}.${e}`,n=`${this.options.filePath}.${e+1}`;(0,c.existsSync)(t)&&await(0,l.rename)(t,n).catch(()=>void 0)}(0,c.existsSync)(this.options.filePath)&&await(0,l.rename)(this.options.filePath,`${this.options.filePath}.1`).catch(()=>void 0)}}};function ce(e,t,n){return{trace(t,r){e.emit({severityNumber:g.SeverityNumber.TRACE,severityText:`TRACE`,body:t,attributes:Y(r?.attributes),context:r?.context??n(),exception:r?.exception})},debug(t,r){e.emit({severityNumber:g.SeverityNumber.DEBUG,severityText:`DEBUG`,body:t,attributes:Y(r?.attributes),context:r?.context??n(),exception:r?.exception})},info(t,r){e.emit({severityNumber:g.SeverityNumber.INFO,severityText:`INFO`,body:t,attributes:Y(r?.attributes),context:r?.context??n(),exception:r?.exception})},warn(t,r){e.emit({severityNumber:g.SeverityNumber.WARN,severityText:`WARN`,body:t,attributes:Y(r?.attributes),context:r?.context??n(),exception:r?.exception})},error(t,r){e.emit({severityNumber:g.SeverityNumber.ERROR,severityText:`ERROR`,body:t,attributes:Y(r?.attributes),context:r?.context??n(),exception:r?.exception})},fatal(t,r){e.emit({severityNumber:g.SeverityNumber.FATAL,severityText:`FATAL`,body:t,attributes:Y(r?.attributes),context:r?.context??n(),exception:r?.exception})},getTraceContext:()=>X(n()),flush:()=>t.flush(),shutdown:()=>t.shutdown()}}function le(e,t){return{trace(n,r){e.write(`trace`,n,{...r,context:r?.context??t()})},debug(n,r){e.write(`debug`,n,{...r,context:r?.context??t()})},info(n,r){e.write(`info`,n,{...r,context:r?.context??t()})},warn(n,r){e.write(`warn`,n,{...r,context:r?.context??t()})},error(n,r){e.write(`error`,n,{...r,context:r?.context??t()})},fatal(n,r){e.write(`fatal`,n,{...r,context:r?.context??t()})},getTraceContext:()=>X(t()),flush:()=>e.flush(),shutdown:()=>e.shutdown()}}function Z(e){let t=(e,t)=>void 0;return{trace:t,debug:t,info:t,warn:t,error:t,fatal:t,getTraceContext:()=>X(e()),flush:async()=>void 0,shutdown:async()=>void 0}}function Q(e){return e instanceof Error?e.message:String(e)}function $(e,t){let n=t instanceof Error?t:Error(Q(t));e.recordException(n),e.setStatus({code:h.SpanStatusCode.ERROR,message:n.message})}async function ue(e){let t=e.env??process.env,n=e.workspaceRoot??z(process.cwd()),r=e.serviceName||t.OTEL_SERVICE_NAME||`unknown-service`,i=e.serviceVersion??t.npm_package_version,a=e.enableTraces!==!1,o=e.enableLogs!==!1,s=new m.AsyncLocalStorage,c=()=>s.getStore()??h.context.active(),l=()=>X(c()),u=async(e,t,n)=>await n(void 0);if(H(t.OTEL_SDK_DISABLED)){let e=Z(c);return{backend:`disabled`,enabled:!1,trace:h.trace,log:g.logs,logger:e,endpointSource:`none`,getTraceContext:l,runInSpan:u,flush:()=>e.flush(),shutdown:()=>e.shutdown()}}let f=e.maxFileSizeBytes??Number(t.LOG_SINK_FILE_MAX_BYTES??10485760),p=e.maxFileCount??Number(t.LOG_SINK_FILE_MAX_FILES??5),y=e.logDir??d.default.join(n,R),b=e.logFileName??`${r}.jsonl`,x=d.default.join(y,b),S=e.discoverEndpoint??!0,C=await J({configPath:e.configPath,cwd:e.cwd,env:t,packageName:e.packageName,serviceName:r,workspaceRoot:n,discoverEndpoint:S}).catch(e=>(console.warn(`[log-sink-mcp telemetry] Failed to resolve log-sink endpoint, falling back to file logging: ${Q(e)}`),{endpointSource:`none`})),w=a?C.tracesEndpoint:void 0,T=o?C.logsEndpoint:void 0;if(w||T){let n={"service.name":r};i&&(n[`service.version`]=i);let a=(0,ne.resourceFromAttributes)(n),o=q(t,`traces`,e.headers),u=q(t,`logs`,e.headers),d=w?new v.NodeTracerProvider({resource:a,spanProcessors:[new v.BatchSpanProcessor(new te.OTLPTraceExporter({url:w,headers:o.headers,timeoutMillis:o.timeoutMillis}))]}):void 0,f=d?.getTracer(r,i),p=T?new _.LoggerProvider({resource:a,processors:[new _.BatchLogRecordProcessor(new ee.OTLPLogExporter({url:T,headers:u.headers,timeoutMillis:u.timeoutMillis}))]}):void 0,m=p?.getLogger(r,i),y=m?ce(m,{flush:async()=>{await Promise.all([d?.forceFlush(),p?.forceFlush()])},shutdown:async()=>{await Promise.allSettled([d?.shutdown(),p?.shutdown()])}},c):Z(c);return{backend:C.endpointSource===`env`?`otel`:`logsink`,enabled:!0,trace:h.trace,log:g.logs,logger:y,endpointSource:C.endpointSource,endpoint:C.endpoint,tracesEndpoint:w,logsEndpoint:T,getTraceContext:l,runInSpan:async(e,t,n)=>{if(!f)return await n(void 0);let r=t.context??c(),i=f.startSpan(e,{attributes:Y(t.attributes),kind:t.kind??h.SpanKind.INTERNAL},r),a=h.trace.setSpan(r,i);return await s.run(a,async()=>{try{return await n(i)}catch(e){throw $(i,e),e}finally{i.end()}})},flush:async()=>{await Promise.all([d?.forceFlush(),p?.forceFlush()])},shutdown:async()=>{await Promise.allSettled([d?.shutdown(),p?.shutdown()])}}}let E=new se({filePath:x,maxFileSizeBytes:f,maxFileCount:p});return{backend:`file`,enabled:o,trace:h.trace,log:g.logs,logger:o?le(E,c):Z(c),endpointSource:`none`,filePath:x,getTraceContext:l,runInSpan:u,flush:()=>E.flush(),shutdown:()=>E.shutdown()}}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return`@agimon-ai/log-sink-mcp`}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return ue}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return s}});
2
+ //# sourceMappingURL=node-9pwprHry.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"node-CFha1yzq.cjs","names":["WORKSPACE_MARKERS","resolveWorkspaceRoot","path","resolveWorkspaceRoot","DEFAULT_REGISTRY_PATH","PortRegistryService","path","trace","context","SeverityNumber","SpanStatusCode","AsyncLocalStorage","logs","NodeTracerProvider","BatchSpanProcessor","OTLPTraceExporter","LoggerProvider","BatchLogRecordProcessor","OTLPLogExporter","SpanKind"],"sources":["../src/utils/resolveWorkspaceRoot.ts","../src/utils/logSinkConfig.ts","../src/utils/resolveLogSinkPort.ts","../src/telemetry/node.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { basename, dirname, join, resolve } from 'node:path';\n\nconst WORKSPACE_MARKERS = ['pnpm-workspace.yaml', 'nx.json', '.git'];\n\nexport function resolveWorkspaceRoot(startPath = process.cwd()): string {\n let current = resolve(startPath);\n\n while (true) {\n for (const marker of WORKSPACE_MARKERS) {\n if (existsSync(join(current, marker))) {\n return current;\n }\n }\n\n const parent = dirname(current);\n if (parent === current) {\n return process.cwd();\n }\n\n current = parent;\n }\n}\n\nexport function resolveDefaultDbPath(startPath?: string): string {\n const workspaceRoot = resolveWorkspaceRoot(startPath);\n const worktreeName = basename(workspaceRoot);\n return join(tmpdir(), 'log-sink-mcp', worktreeName, 'session.db');\n}\n","import { existsSync, mkdirSync, readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport path from 'node:path';\nimport { parse } from 'yaml';\nimport { resolveDefaultDbPath, resolveWorkspaceRoot } from './resolveWorkspaceRoot.js';\n\nexport const LOG_SINK_PACKAGE_NAME = '@agimon-ai/log-sink-mcp';\nexport const LOG_SINK_GLOBAL_DIR = path.join(homedir(), '.log-sink-mcp', 'global');\nexport const LOG_SINK_GLOBAL_DB_PATH = path.join(LOG_SINK_GLOBAL_DIR, 'session.db');\nexport const LOG_SINK_CONFIG_FILE_NAME = '.logsink.yaml';\n\nexport type LogSinkScope = 'local' | 'global';\n\nexport interface LogSinkGlobalConfig {\n port?: number;\n services: string[];\n}\n\nexport interface LogSinkConfig {\n path: string;\n global: LogSinkGlobalConfig;\n}\n\nexport interface ResolveLogSinkInstanceOptions {\n configPath?: string;\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n packageName?: string;\n serviceName?: string;\n workspaceRoot?: string;\n}\n\nexport interface ResolvedLogSinkInstance {\n configPath?: string;\n dbPath: string;\n globalServices: string[];\n port?: number;\n registeredName?: string;\n repositoryPath: string;\n scope: LogSinkScope;\n workspaceRoot: string;\n}\n\nexport class LogSinkConfigError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = 'LogSinkConfigError';\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction expandHome(filePath: string): string {\n if (filePath === '~') {\n return homedir();\n }\n\n if (filePath.startsWith('~/')) {\n return path.join(homedir(), filePath.slice(2));\n }\n\n return filePath;\n}\n\nfunction findNearestConfig(startPath: string): string | undefined {\n let current = path.resolve(startPath);\n\n while (true) {\n const candidate = path.join(current, LOG_SINK_CONFIG_FILE_NAME);\n if (existsSync(candidate)) {\n return candidate;\n }\n\n const parent = path.dirname(current);\n if (parent === current) {\n return undefined;\n }\n\n current = parent;\n }\n}\n\nexport function resolveLogSinkConfigPath(options: ResolveLogSinkInstanceOptions = {}): string | undefined {\n const env = options.env ?? process.env;\n const explicitConfigPath = options.configPath ?? env.LOG_SINK_CONFIG;\n if (explicitConfigPath) {\n return path.resolve(expandHome(explicitConfigPath));\n }\n\n const cwd = options.cwd ?? options.workspaceRoot ?? process.cwd();\n const nearestConfigPath = findNearestConfig(cwd);\n if (nearestConfigPath) {\n return nearestConfigPath;\n }\n\n const homeConfigPath = path.join(homedir(), LOG_SINK_CONFIG_FILE_NAME);\n return existsSync(homeConfigPath) ? homeConfigPath : undefined;\n}\n\nfunction parsePort(value: unknown, configPath: string): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!Number.isInteger(value) || (value as number) <= 0 || (value as number) > 65535) {\n throw new LogSinkConfigError(\n `Invalid ${LOG_SINK_CONFIG_FILE_NAME} at ${configPath}: global.port must be a TCP port`,\n );\n }\n\n return value as number;\n}\n\nfunction parseServices(value: unknown, configPath: string): string[] {\n if (value === undefined) {\n return [];\n }\n\n if (!Array.isArray(value)) {\n throw new LogSinkConfigError(\n `Invalid ${LOG_SINK_CONFIG_FILE_NAME} at ${configPath}: global.services must be a string array`,\n );\n }\n\n const services = new Set<string>();\n for (const item of value) {\n if (typeof item !== 'string' || item.trim().length === 0) {\n throw new LogSinkConfigError(\n `Invalid ${LOG_SINK_CONFIG_FILE_NAME} at ${configPath}: global.services must only contain strings`,\n );\n }\n\n services.add(item.trim());\n }\n\n return Array.from(services);\n}\n\nexport function loadLogSinkConfig(options: ResolveLogSinkInstanceOptions = {}): LogSinkConfig | undefined {\n const configPath = resolveLogSinkConfigPath(options);\n if (!configPath) {\n return undefined;\n }\n\n try {\n const rawConfig = readFileSync(configPath, 'utf-8');\n const parsed = parse(rawConfig);\n if (parsed == null) {\n return {\n path: configPath,\n global: { services: [] },\n };\n }\n\n if (!isRecord(parsed)) {\n throw new LogSinkConfigError(`Invalid ${LOG_SINK_CONFIG_FILE_NAME} at ${configPath}: root must be an object`);\n }\n\n const globalConfig = parsed.global;\n if (globalConfig !== undefined && !isRecord(globalConfig)) {\n throw new LogSinkConfigError(`Invalid ${LOG_SINK_CONFIG_FILE_NAME} at ${configPath}: global must be an object`);\n }\n\n return {\n path: configPath,\n global: {\n port: parsePort(globalConfig?.port, configPath),\n services: parseServices(globalConfig?.services, configPath),\n },\n };\n } catch (error) {\n if (error instanceof LogSinkConfigError) {\n throw error;\n }\n\n throw new LogSinkConfigError(\n `Failed to read ${LOG_SINK_CONFIG_FILE_NAME} at ${configPath}: ${error instanceof Error ? error.message : String(error)}`,\n { cause: error },\n );\n }\n}\n\nfunction resolveForcedScope(env: NodeJS.ProcessEnv): LogSinkScope | undefined {\n const rawScope = env.LOG_SINK_INSTANCE?.trim().toLowerCase();\n if (!rawScope) {\n return undefined;\n }\n\n if (rawScope === 'local' || rawScope === 'global') {\n return rawScope;\n }\n\n throw new LogSinkConfigError('LOG_SINK_INSTANCE must be either \"local\" or \"global\"');\n}\n\nfunction ensureGlobalDirectory(): string {\n mkdirSync(LOG_SINK_GLOBAL_DIR, { recursive: true });\n return LOG_SINK_GLOBAL_DIR;\n}\n\nexport function resolveLogSinkInstance(options: ResolveLogSinkInstanceOptions = {}): ResolvedLogSinkInstance {\n const env = options.env ?? process.env;\n const workspaceRoot = options.workspaceRoot\n ? path.resolve(options.workspaceRoot)\n : resolveWorkspaceRoot(options.cwd ?? process.cwd());\n const registeredName = options.packageName?.trim() || options.serviceName?.trim() || env.npm_package_name?.trim();\n const config = loadLogSinkConfig({ ...options, env, cwd: options.cwd ?? workspaceRoot, workspaceRoot });\n const globalServices = config?.global.services ?? [];\n const forcedScope = resolveForcedScope(env);\n const scope: LogSinkScope =\n forcedScope ?? (registeredName && globalServices.includes(registeredName) ? 'global' : 'local');\n const repositoryPath = scope === 'global' ? ensureGlobalDirectory() : workspaceRoot;\n\n return {\n configPath: config?.path,\n dbPath: scope === 'global' ? LOG_SINK_GLOBAL_DB_PATH : resolveDefaultDbPath(workspaceRoot),\n globalServices,\n port: scope === 'global' ? config?.global.port : undefined,\n registeredName,\n repositoryPath,\n scope,\n workspaceRoot,\n };\n}\n","import { DEFAULT_REGISTRY_PATH, PortRegistryService } from '@agimon-ai/foundation-port-registry';\nimport { resolveLogSinkInstance } from './logSinkConfig.js';\n\nconst LOG_SINK_SERVICE_NAME = 'log-sink-mcp-http';\n\nexport interface LogSinkPortResult {\n port: number;\n host: string;\n endpoint: string;\n}\n\nexport interface ResolveLogSinkPortOptions {\n configPath?: string;\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n packageName?: string;\n serviceName?: string;\n workspaceRoot?: string;\n healthCheck?: boolean;\n}\n\nexport async function resolveLogSinkPort(options: ResolveLogSinkPortOptions): Promise<LogSinkPortResult | undefined> {\n const { env = process.env, healthCheck = true } = options;\n const registryPath = env.PORT_REGISTRY_PATH ?? DEFAULT_REGISTRY_PATH;\n const instance = resolveLogSinkInstance(options);\n const environment = env.NODE_ENV || 'development';\n const portRegistry = new PortRegistryService(registryPath);\n\n try {\n const result = await portRegistry.getPort({\n repositoryPath: instance.repositoryPath,\n serviceName: LOG_SINK_SERVICE_NAME,\n serviceType: 'tool',\n environment,\n });\n\n if (!result.success || !result.port) {\n return undefined;\n }\n\n const host = result.record?.host === '0.0.0.0' ? '127.0.0.1' : (result.record?.host ?? '127.0.0.1');\n const endpoint = `http://${host}:${result.port}`;\n\n if (!healthCheck) {\n return { port: result.port, host, endpoint };\n }\n\n try {\n const health = await fetch(`${endpoint}/health`);\n if (!health.ok) {\n return undefined;\n }\n\n const payload = (await health.json()) as { status?: string; serviceName?: string; service?: string };\n if (payload.status !== 'healthy') {\n return undefined;\n }\n\n if (payload.serviceName !== LOG_SINK_SERVICE_NAME && payload.service !== LOG_SINK_SERVICE_NAME) {\n return undefined;\n }\n\n return { port: result.port, host, endpoint };\n } catch {\n return undefined;\n }\n } catch {\n return undefined;\n }\n}\n\nexport async function resolveLogSinkOtelEndpoint(options: ResolveLogSinkPortOptions): Promise<string | undefined> {\n const result = await resolveLogSinkPort(options);\n return result?.endpoint;\n}\n","import { AsyncLocalStorage } from 'node:async_hooks';\nimport { existsSync } from 'node:fs';\nimport { appendFile, mkdir, rename, stat } from 'node:fs/promises';\nimport path from 'node:path';\nimport { type Attributes, type Context, context, type Span, SpanKind, SpanStatusCode, trace } from '@opentelemetry/api';\nimport { logs, type Logger as OtelLogger, SeverityNumber } from '@opentelemetry/api-logs';\nimport { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport { BatchLogRecordProcessor, LoggerProvider } from '@opentelemetry/sdk-logs';\nimport { BatchSpanProcessor, NodeTracerProvider } from '@opentelemetry/sdk-trace-node';\nimport { resolveLogSinkOtelEndpoint } from '../utils/resolveLogSinkPort.js';\n\nconst WORKSPACE_MARKERS = ['pnpm-workspace.yaml', 'nx.json', '.git'];\nconst DEFAULT_LOG_DIR = path.join('logs', 'telemetry');\nconst DEFAULT_MAX_FILE_SIZE_BYTES = 10 * 1024 * 1024;\nconst DEFAULT_MAX_FILE_COUNT = 5;\n\nexport type TelemetryLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal';\nexport type NodeTelemetryBackend = 'otel' | 'logsink' | 'file' | 'disabled';\nexport type NodeTelemetryEndpointSource = 'env' | 'logsink' | 'none';\n\nexport interface NodeTelemetryLogOptions {\n attributes?: Attributes;\n context?: Context;\n exception?: unknown;\n}\n\nexport interface NodeTelemetrySpanOptions {\n attributes?: Attributes;\n context?: Context;\n kind?: SpanKind;\n}\n\nexport interface NodeTelemetryLogger {\n trace(message: string, options?: NodeTelemetryLogOptions): void;\n debug(message: string, options?: NodeTelemetryLogOptions): void;\n info(message: string, options?: NodeTelemetryLogOptions): void;\n warn(message: string, options?: NodeTelemetryLogOptions): void;\n error(message: string, options?: NodeTelemetryLogOptions): void;\n fatal(message: string, options?: NodeTelemetryLogOptions): void;\n getTraceContext(): { traceId?: string; spanId?: string };\n flush(): Promise<void>;\n shutdown(): Promise<void>;\n}\n\nexport interface NodeTelemetryOptions {\n configPath?: string;\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n serviceName: string;\n packageName?: string;\n serviceVersion?: string;\n workspaceRoot?: string;\n enableTraces?: boolean;\n enableLogs?: boolean;\n logDir?: string;\n logFileName?: string;\n maxFileSizeBytes?: number;\n maxFileCount?: number;\n /**\n * Attempt to discover a running log-sink endpoint even when the workspace does\n * not contain the log-sink package source. Discovery still health-checks, so\n * this stays a no-op when no healthy server is registered. Use this from\n * published consumers that depend on log-sink but run inside arbitrary repos.\n */\n discoverEndpoint?: boolean;\n /**\n * Extra headers attached to every OTLP export request (e.g. ingest-enrichment\n * headers used to scope telemetry by agent session / workflow).\n */\n headers?: Record<string, string>;\n}\n\nexport interface NodeTelemetryHandle {\n backend: NodeTelemetryBackend;\n enabled: boolean;\n trace: typeof trace;\n log: typeof logs;\n logger: NodeTelemetryLogger;\n endpointSource: NodeTelemetryEndpointSource;\n endpoint?: string;\n tracesEndpoint?: string;\n logsEndpoint?: string;\n filePath?: string;\n getTraceContext(): { traceId?: string; spanId?: string };\n runInSpan<T>(\n name: string,\n options: NodeTelemetrySpanOptions,\n callback: (span: Span | undefined) => Promise<T> | T,\n ): Promise<T>;\n flush(): Promise<void>;\n shutdown(): Promise<void>;\n}\n\nexport interface ResolvedNodeTelemetryEndpoints {\n endpointSource: NodeTelemetryEndpointSource;\n endpoint?: string;\n tracesEndpoint?: string;\n logsEndpoint?: string;\n}\n\ninterface SignalExporterConfig {\n url?: string;\n headers?: Record<string, string>;\n timeoutMillis?: number;\n}\n\ninterface FileSinkOptions {\n filePath: string;\n maxFileSizeBytes: number;\n maxFileCount: number;\n}\n\nfunction resolveWorkspaceRoot(startPath = process.cwd()): string {\n let currentDir = path.resolve(startPath);\n\n while (true) {\n for (const marker of WORKSPACE_MARKERS) {\n if (existsSync(path.join(currentDir, marker))) {\n return currentDir;\n }\n }\n\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n return process.cwd();\n }\n\n currentDir = parentDir;\n }\n}\n\nexport async function getLogSinkOtelEndpoint(options: {\n configPath?: string;\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n packageName?: string;\n serviceName?: string;\n workspaceRoot?: string;\n healthCheck?: boolean;\n}): Promise<string | undefined> {\n return resolveLogSinkOtelEndpoint(options);\n}\n\nfunction withSignalPath(baseUrl: string, signal: 'traces' | 'logs'): string {\n const normalizedBaseUrl = baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`;\n if (normalizedBaseUrl.endsWith(`/v1/${signal}/`) || normalizedBaseUrl.endsWith(`/v1/${signal}`)) {\n return baseUrl;\n }\n\n return new URL(`v1/${signal}`, normalizedBaseUrl).toString();\n}\n\nfunction isTruthyEnvValue(value: string | undefined): boolean {\n return (\n value === '1' || value?.toLowerCase() === 'true' || value?.toLowerCase() === 'yes' || value?.toLowerCase() === 'on'\n );\n}\n\nfunction parseHeaders(rawHeaders: string | undefined): Record<string, string> | undefined {\n if (!rawHeaders) {\n return undefined;\n }\n\n const headers: Record<string, string> = {};\n for (const pair of rawHeaders.split(',')) {\n const [rawKey, ...rawValueParts] = pair.split('=');\n const key = rawKey?.trim();\n const value = rawValueParts.join('=').trim();\n if (!key || !value) {\n continue;\n }\n headers[key] = value;\n }\n\n return Object.keys(headers).length > 0 ? headers : undefined;\n}\n\nfunction parseTimeout(rawTimeout: string | undefined): number | undefined {\n if (!rawTimeout) {\n return undefined;\n }\n\n const timeout = Number(rawTimeout);\n return Number.isFinite(timeout) && timeout > 0 ? timeout : undefined;\n}\n\nfunction mergeHeaders(...headersList: Array<Record<string, string> | undefined>): Record<string, string> | undefined {\n const merged: Record<string, string> = {};\n for (const headers of headersList) {\n if (!headers) {\n continue;\n }\n\n Object.assign(merged, headers);\n }\n\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\nfunction resolveExplicitSignalEndpoint(env: NodeJS.ProcessEnv, signal: 'traces' | 'logs'): string | undefined {\n const signalEndpoint =\n signal === 'traces' ? env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT : env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT;\n if (signalEndpoint) {\n return signalEndpoint;\n }\n\n return env.OTEL_EXPORTER_OTLP_ENDPOINT ? withSignalPath(env.OTEL_EXPORTER_OTLP_ENDPOINT, signal) : undefined;\n}\n\nexport function resolveSignalExporterConfig(\n env: NodeJS.ProcessEnv,\n signal: 'traces' | 'logs',\n optionHeaders?: Record<string, string>,\n): SignalExporterConfig {\n const signalHeaders =\n signal === 'traces' ? env.OTEL_EXPORTER_OTLP_TRACES_HEADERS : env.OTEL_EXPORTER_OTLP_LOGS_HEADERS;\n const signalTimeout =\n signal === 'traces' ? env.OTEL_EXPORTER_OTLP_TRACES_TIMEOUT : env.OTEL_EXPORTER_OTLP_LOGS_TIMEOUT;\n\n const workflowHeaders = Object.fromEntries(\n [\n ['x-agent-session-id', env.AGENT_SESSION_ID],\n ['x-agent-parent-session-id', env.PARENT_AGENT_SESSION_ID],\n ['x-workflow-run-id', env.WORKFLOW_RUN_ID],\n ['x-workflow-run-key', env.WORKFLOW_RUN_KEY],\n ['x-workflow-id', env.WORKFLOW_ID],\n ['x-workflow-name', env.WORKFLOW_NAME],\n ['x-workflow-workspace', env.WORKFLOW_WORKSPACE],\n ['x-workflow-job-id', env.WORKFLOW_JOB_ID],\n ['x-workflow-job-name', env.WORKFLOW_JOB_NAME],\n ['x-workflow-step-name', env.WORKFLOW_STEP_NAME],\n ['x-workflow-phase', env.WORKFLOW_PHASE],\n ['x-workflow-runner', env.WORKFLOW_RUNNER],\n ].filter((entry): entry is [string, string] => Boolean(entry[1])),\n );\n\n return {\n headers: mergeHeaders(\n workflowHeaders,\n parseHeaders(env.OTEL_EXPORTER_OTLP_HEADERS),\n parseHeaders(signalHeaders),\n optionHeaders,\n ),\n timeoutMillis: parseTimeout(signalTimeout ?? env.OTEL_EXPORTER_OTLP_TIMEOUT),\n };\n}\n\nexport async function resolveNodeTelemetryEndpoints(options: {\n configPath?: string;\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n packageName?: string;\n serviceName?: string;\n workspaceRoot?: string;\n discoverEndpoint?: boolean;\n healthCheck?: boolean;\n}): Promise<ResolvedNodeTelemetryEndpoints> {\n const env = options.env ?? process.env;\n const explicitTracesEndpoint = resolveExplicitSignalEndpoint(env, 'traces');\n const explicitLogsEndpoint = resolveExplicitSignalEndpoint(env, 'logs');\n if (explicitTracesEndpoint || explicitLogsEndpoint) {\n return {\n endpointSource: 'env',\n endpoint: env.OTEL_EXPORTER_OTLP_ENDPOINT,\n tracesEndpoint: explicitTracesEndpoint,\n logsEndpoint: explicitLogsEndpoint,\n };\n }\n\n if (env.LOG_SINK_ENDPOINT) {\n const sinkEndpoint = env.LOG_SINK_ENDPOINT;\n return {\n endpointSource: 'logsink',\n endpoint: sinkEndpoint,\n tracesEndpoint: withSignalPath(sinkEndpoint, 'traces'),\n logsEndpoint: withSignalPath(sinkEndpoint, 'logs'),\n };\n }\n\n if (options.discoverEndpoint === false) {\n return { endpointSource: 'none' };\n }\n\n const sinkEndpoint = await getLogSinkOtelEndpoint({\n configPath: options.configPath,\n cwd: options.cwd,\n env,\n packageName: options.packageName,\n serviceName: options.serviceName,\n workspaceRoot: options.workspaceRoot,\n healthCheck: options.healthCheck,\n });\n if (!sinkEndpoint) {\n return { endpointSource: 'none' };\n }\n\n return {\n endpointSource: 'logsink',\n endpoint: sinkEndpoint,\n tracesEndpoint: withSignalPath(sinkEndpoint, 'traces'),\n logsEndpoint: withSignalPath(sinkEndpoint, 'logs'),\n };\n}\n\nfunction toAttributeValue(value: unknown): string | number | boolean {\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n\n if (value == null) {\n return '';\n }\n\n return JSON.stringify(value);\n}\n\nfunction sanitizeAttributes(attributes?: Attributes): Attributes | undefined {\n if (!attributes) {\n return undefined;\n }\n\n const sanitized: Attributes = {};\n for (const [key, value] of Object.entries(attributes)) {\n if (value === undefined || value === null) {\n continue;\n }\n\n sanitized[key] = toAttributeValue(value);\n }\n\n return Object.keys(sanitized).length > 0 ? sanitized : undefined;\n}\n\nfunction getTraceContextFromContext(activeContext: Context): { traceId?: string; spanId?: string } {\n const activeSpan = trace.getSpan(activeContext);\n if (!activeSpan) {\n return {};\n }\n\n const spanContext = activeSpan.spanContext();\n return {\n traceId: spanContext.traceId,\n spanId: spanContext.spanId,\n };\n}\n\nfunction serializeLogRecord(\n level: TelemetryLevel,\n message: string,\n options: NodeTelemetryLogOptions = {},\n fallbackContext: Context = context.active(),\n): string {\n const activeSpan = trace.getSpan(options.context ?? fallbackContext);\n const spanContext = activeSpan?.spanContext();\n\n return JSON.stringify({\n timestamp: new Date().toISOString(),\n level,\n message,\n traceId: spanContext?.traceId,\n spanId: spanContext?.spanId,\n attributes: options.attributes ? sanitizeAttributes(options.attributes) : undefined,\n exception:\n options.exception instanceof Error\n ? { name: options.exception.name, message: options.exception.message, stack: options.exception.stack }\n : options.exception,\n });\n}\n\nclass RotatingFileSink {\n private pending: Promise<void> = Promise.resolve();\n\n constructor(private readonly options: FileSinkOptions) {}\n\n write(level: TelemetryLevel, message: string, options?: NodeTelemetryLogOptions): void {\n this.pending = this.pending\n .then(async () => {\n const entry = `${serializeLogRecord(level, message, options)}\\n`;\n await this.ensureDirectory();\n await this.rotateIfNeeded(Buffer.byteLength(entry));\n await appendFile(this.options.filePath, entry, 'utf8');\n })\n .catch((error) => {\n console.error(`[log-sink-mcp telemetry] Failed to write log file ${this.options.filePath}:`, error);\n });\n }\n\n async flush(): Promise<void> {\n await this.pending;\n }\n\n async shutdown(): Promise<void> {\n await this.flush();\n }\n\n private async ensureDirectory(): Promise<void> {\n await mkdir(path.dirname(this.options.filePath), { recursive: true });\n }\n\n private async rotateIfNeeded(incomingBytes: number): Promise<void> {\n let currentSize = 0;\n try {\n currentSize = (await stat(this.options.filePath)).size;\n } catch {\n // Missing files rotate from size zero.\n }\n\n if (currentSize + incomingBytes <= this.options.maxFileSizeBytes) {\n return;\n }\n\n for (let index = this.options.maxFileCount - 1; index >= 1; index -= 1) {\n const source = `${this.options.filePath}.${index}`;\n const target = `${this.options.filePath}.${index + 1}`;\n if (existsSync(source)) {\n await rename(source, target).catch(() => undefined);\n }\n }\n\n if (existsSync(this.options.filePath)) {\n await rename(this.options.filePath, `${this.options.filePath}.1`).catch(() => undefined);\n }\n }\n}\n\nfunction createOtelLogger(\n logger: OtelLogger,\n sink: { flush(): Promise<void>; shutdown(): Promise<void> },\n getActiveContext: () => Context,\n): NodeTelemetryLogger {\n return {\n trace(message, options) {\n logger.emit({\n severityNumber: SeverityNumber.TRACE,\n severityText: 'TRACE',\n body: message,\n attributes: sanitizeAttributes(options?.attributes),\n context: options?.context ?? getActiveContext(),\n exception: options?.exception,\n });\n },\n debug(message, options) {\n logger.emit({\n severityNumber: SeverityNumber.DEBUG,\n severityText: 'DEBUG',\n body: message,\n attributes: sanitizeAttributes(options?.attributes),\n context: options?.context ?? getActiveContext(),\n exception: options?.exception,\n });\n },\n info(message, options) {\n logger.emit({\n severityNumber: SeverityNumber.INFO,\n severityText: 'INFO',\n body: message,\n attributes: sanitizeAttributes(options?.attributes),\n context: options?.context ?? getActiveContext(),\n exception: options?.exception,\n });\n },\n warn(message, options) {\n logger.emit({\n severityNumber: SeverityNumber.WARN,\n severityText: 'WARN',\n body: message,\n attributes: sanitizeAttributes(options?.attributes),\n context: options?.context ?? getActiveContext(),\n exception: options?.exception,\n });\n },\n error(message, options) {\n logger.emit({\n severityNumber: SeverityNumber.ERROR,\n severityText: 'ERROR',\n body: message,\n attributes: sanitizeAttributes(options?.attributes),\n context: options?.context ?? getActiveContext(),\n exception: options?.exception,\n });\n },\n fatal(message, options) {\n logger.emit({\n severityNumber: SeverityNumber.FATAL,\n severityText: 'FATAL',\n body: message,\n attributes: sanitizeAttributes(options?.attributes),\n context: options?.context ?? getActiveContext(),\n exception: options?.exception,\n });\n },\n getTraceContext: () => getTraceContextFromContext(getActiveContext()),\n flush: () => sink.flush(),\n shutdown: () => sink.shutdown(),\n };\n}\n\nfunction createFileLogger(sink: RotatingFileSink, getActiveContext: () => Context): NodeTelemetryLogger {\n return {\n trace(message, options) {\n sink.write('trace', message, { ...options, context: options?.context ?? getActiveContext() });\n },\n debug(message, options) {\n sink.write('debug', message, { ...options, context: options?.context ?? getActiveContext() });\n },\n info(message, options) {\n sink.write('info', message, { ...options, context: options?.context ?? getActiveContext() });\n },\n warn(message, options) {\n sink.write('warn', message, { ...options, context: options?.context ?? getActiveContext() });\n },\n error(message, options) {\n sink.write('error', message, { ...options, context: options?.context ?? getActiveContext() });\n },\n fatal(message, options) {\n sink.write('fatal', message, { ...options, context: options?.context ?? getActiveContext() });\n },\n getTraceContext: () => getTraceContextFromContext(getActiveContext()),\n flush: () => sink.flush(),\n shutdown: () => sink.shutdown(),\n };\n}\n\nfunction createNoopLogger(getActiveContext: () => Context): NodeTelemetryLogger {\n const noop = (_message: string, _options?: NodeTelemetryLogOptions) => undefined;\n return {\n trace: noop,\n debug: noop,\n info: noop,\n warn: noop,\n error: noop,\n fatal: noop,\n getTraceContext: () => getTraceContextFromContext(getActiveContext()),\n flush: async () => undefined,\n shutdown: async () => undefined,\n };\n}\n\nfunction getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction recordSpanException(span: Span, error: unknown): void {\n const exception = error instanceof Error ? error : new Error(getErrorMessage(error));\n span.recordException(exception);\n span.setStatus({ code: SpanStatusCode.ERROR, message: exception.message });\n}\n\nexport async function createNodeTelemetry(options: NodeTelemetryOptions): Promise<NodeTelemetryHandle> {\n const env = options.env ?? process.env;\n const workspaceRoot = options.workspaceRoot ?? resolveWorkspaceRoot(process.cwd());\n const serviceName = options.serviceName || env.OTEL_SERVICE_NAME || 'unknown-service';\n const serviceVersion = options.serviceVersion ?? env.npm_package_version;\n const enableTraces = options.enableTraces !== false;\n const enableLogs = options.enableLogs !== false;\n const contextStore = new AsyncLocalStorage<Context>();\n const getActiveContext = () => contextStore.getStore() ?? context.active();\n const getTraceContext = () => getTraceContextFromContext(getActiveContext());\n const runWithoutSpan = async <T>(\n _name: string,\n _spanOptions: NodeTelemetrySpanOptions,\n callback: (span: Span | undefined) => Promise<T> | T,\n ) => await callback(undefined);\n\n if (isTruthyEnvValue(env.OTEL_SDK_DISABLED)) {\n const logger = createNoopLogger(getActiveContext);\n return {\n backend: 'disabled',\n enabled: false,\n trace,\n log: logs,\n logger,\n endpointSource: 'none',\n getTraceContext,\n runInSpan: runWithoutSpan,\n flush: () => logger.flush(),\n shutdown: () => logger.shutdown(),\n };\n }\n\n const maxFileSizeBytes =\n options.maxFileSizeBytes ?? Number(env.LOG_SINK_FILE_MAX_BYTES ?? DEFAULT_MAX_FILE_SIZE_BYTES);\n const maxFileCount = options.maxFileCount ?? Number(env.LOG_SINK_FILE_MAX_FILES ?? DEFAULT_MAX_FILE_COUNT);\n const logDir = options.logDir ?? path.join(workspaceRoot, DEFAULT_LOG_DIR);\n const logFileName = options.logFileName ?? `${serviceName}.jsonl`;\n const filePath = path.join(logDir, logFileName);\n\n const shouldDiscover = options.discoverEndpoint ?? true;\n const endpoints: ResolvedNodeTelemetryEndpoints = await resolveNodeTelemetryEndpoints({\n configPath: options.configPath,\n cwd: options.cwd,\n env,\n packageName: options.packageName,\n serviceName,\n workspaceRoot,\n discoverEndpoint: shouldDiscover,\n }).catch((error) => {\n console.warn(\n `[log-sink-mcp telemetry] Failed to resolve log-sink endpoint, falling back to file logging: ${getErrorMessage(error)}`,\n );\n return { endpointSource: 'none' };\n });\n const tracesEndpoint = enableTraces ? endpoints.tracesEndpoint : undefined;\n const logsEndpoint = enableLogs ? endpoints.logsEndpoint : undefined;\n\n if (tracesEndpoint || logsEndpoint) {\n const resourceAttributes: Attributes = {\n 'service.name': serviceName,\n };\n if (serviceVersion) {\n resourceAttributes['service.version'] = serviceVersion;\n }\n\n const resource = resourceFromAttributes(resourceAttributes);\n const tracerConfig = resolveSignalExporterConfig(env, 'traces', options.headers);\n const loggerConfig = resolveSignalExporterConfig(env, 'logs', options.headers);\n const tracerProvider = tracesEndpoint\n ? new NodeTracerProvider({\n resource,\n spanProcessors: [\n new BatchSpanProcessor(\n new OTLPTraceExporter({\n url: tracesEndpoint,\n headers: tracerConfig.headers,\n timeoutMillis: tracerConfig.timeoutMillis,\n }),\n ),\n ],\n })\n : undefined;\n const tracer = tracerProvider?.getTracer(serviceName, serviceVersion);\n\n const loggerProvider = logsEndpoint\n ? new LoggerProvider({\n resource,\n processors: [\n new BatchLogRecordProcessor(\n new OTLPLogExporter({\n url: logsEndpoint,\n headers: loggerConfig.headers,\n timeoutMillis: loggerConfig.timeoutMillis,\n }),\n ),\n ],\n })\n : undefined;\n\n const sinkLogger = loggerProvider?.getLogger(serviceName, serviceVersion);\n const logger = sinkLogger\n ? createOtelLogger(\n sinkLogger,\n {\n flush: async () => {\n await Promise.allSettled([tracerProvider?.forceFlush(), loggerProvider?.forceFlush()]);\n },\n shutdown: async () => {\n await Promise.allSettled([tracerProvider?.shutdown(), loggerProvider?.shutdown()]);\n },\n },\n getActiveContext,\n )\n : createNoopLogger(getActiveContext);\n\n const runInSpan = async <T>(\n name: string,\n spanOptions: NodeTelemetrySpanOptions,\n callback: (span: Span | undefined) => Promise<T> | T,\n ): Promise<T> => {\n if (!tracer) {\n return await callback(undefined);\n }\n\n const parentContext = spanOptions.context ?? getActiveContext();\n const span = tracer.startSpan(\n name,\n {\n attributes: sanitizeAttributes(spanOptions.attributes),\n kind: spanOptions.kind ?? SpanKind.INTERNAL,\n },\n parentContext,\n );\n const activeContext = trace.setSpan(parentContext, span);\n\n return await contextStore.run(activeContext, async () => {\n try {\n return await callback(span);\n } catch (error) {\n recordSpanException(span, error);\n throw error;\n } finally {\n span.end();\n }\n });\n };\n\n return {\n backend: endpoints.endpointSource === 'env' ? 'otel' : 'logsink',\n enabled: true,\n trace,\n log: logs,\n logger,\n endpointSource: endpoints.endpointSource,\n endpoint: endpoints.endpoint,\n tracesEndpoint,\n logsEndpoint,\n getTraceContext,\n runInSpan,\n flush: async () => {\n await Promise.allSettled([tracerProvider?.forceFlush(), loggerProvider?.forceFlush()]);\n },\n shutdown: async () => {\n await Promise.allSettled([tracerProvider?.shutdown(), loggerProvider?.shutdown()]);\n },\n };\n }\n\n const fileSink = new RotatingFileSink({\n filePath,\n maxFileSizeBytes,\n maxFileCount,\n });\n const logger = enableLogs ? createFileLogger(fileSink, getActiveContext) : createNoopLogger(getActiveContext);\n\n return {\n backend: 'file',\n enabled: enableLogs,\n trace,\n log: logs,\n logger,\n endpointSource: 'none',\n filePath,\n getTraceContext,\n runInSpan: runWithoutSpan,\n flush: () => fileSink.flush(),\n shutdown: () => fileSink.shutdown(),\n };\n}\n\nexport { logs as log, SpanKind, SpanStatusCode, trace };\n"],"mappings":"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"}
1
+ {"version":3,"file":"node-9pwprHry.cjs","names":["WORKSPACE_MARKERS","resolveWorkspaceRoot","path","resolveWorkspaceRoot","DEFAULT_REGISTRY_PATH","PortRegistryService","path","trace","context","SeverityNumber","SpanStatusCode","AsyncLocalStorage","logs","NodeTracerProvider","BatchSpanProcessor","OTLPTraceExporter","LoggerProvider","BatchLogRecordProcessor","OTLPLogExporter","SpanKind"],"sources":["../src/utils/resolveWorkspaceRoot.ts","../src/utils/logSinkConfig.ts","../src/utils/resolveLogSinkPort.ts","../src/telemetry/node.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { basename, dirname, join, resolve } from 'node:path';\n\nconst WORKSPACE_MARKERS = ['pnpm-workspace.yaml', 'nx.json', '.git'];\n\nexport function resolveWorkspaceRoot(startPath = process.cwd()): string {\n let current = resolve(startPath);\n\n while (true) {\n for (const marker of WORKSPACE_MARKERS) {\n if (existsSync(join(current, marker))) {\n return current;\n }\n }\n\n const parent = dirname(current);\n if (parent === current) {\n return process.cwd();\n }\n\n current = parent;\n }\n}\n\nexport function resolveDefaultDbPath(startPath?: string): string {\n const workspaceRoot = resolveWorkspaceRoot(startPath);\n const worktreeName = basename(workspaceRoot);\n return join(tmpdir(), 'log-sink-mcp', worktreeName, 'session.db');\n}\n","import { existsSync, mkdirSync, readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport path from 'node:path';\nimport { parse } from 'yaml';\nimport { resolveDefaultDbPath, resolveWorkspaceRoot } from './resolveWorkspaceRoot.js';\n\nexport const LOG_SINK_PACKAGE_NAME = '@agimon-ai/log-sink-mcp';\nexport const LOG_SINK_GLOBAL_DIR = path.join(homedir(), '.log-sink-mcp', 'global');\nexport const LOG_SINK_GLOBAL_DB_PATH = path.join(LOG_SINK_GLOBAL_DIR, 'session.db');\nexport const LOG_SINK_CONFIG_FILE_NAME = '.logsink.yaml';\n\nexport type LogSinkScope = 'local' | 'global';\n\nexport interface LogSinkGlobalConfig {\n port?: number;\n services: string[];\n}\n\nexport interface LogSinkConfig {\n path: string;\n global: LogSinkGlobalConfig;\n}\n\nexport interface ResolveLogSinkInstanceOptions {\n configPath?: string;\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n packageName?: string;\n serviceName?: string;\n workspaceRoot?: string;\n}\n\nexport interface ResolvedLogSinkInstance {\n configPath?: string;\n dbPath: string;\n globalServices: string[];\n port?: number;\n registeredName?: string;\n repositoryPath: string;\n scope: LogSinkScope;\n workspaceRoot: string;\n}\n\nexport class LogSinkConfigError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = 'LogSinkConfigError';\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction expandHome(filePath: string): string {\n if (filePath === '~') {\n return homedir();\n }\n\n if (filePath.startsWith('~/')) {\n return path.join(homedir(), filePath.slice(2));\n }\n\n return filePath;\n}\n\nfunction findNearestConfig(startPath: string): string | undefined {\n let current = path.resolve(startPath);\n\n while (true) {\n const candidate = path.join(current, LOG_SINK_CONFIG_FILE_NAME);\n if (existsSync(candidate)) {\n return candidate;\n }\n\n const parent = path.dirname(current);\n if (parent === current) {\n return undefined;\n }\n\n current = parent;\n }\n}\n\nexport function resolveLogSinkConfigPath(options: ResolveLogSinkInstanceOptions = {}): string | undefined {\n const env = options.env ?? process.env;\n const explicitConfigPath = options.configPath ?? env.LOG_SINK_CONFIG;\n if (explicitConfigPath) {\n return path.resolve(expandHome(explicitConfigPath));\n }\n\n const cwd = options.cwd ?? options.workspaceRoot ?? process.cwd();\n const nearestConfigPath = findNearestConfig(cwd);\n if (nearestConfigPath) {\n return nearestConfigPath;\n }\n\n const homeConfigPath = path.join(homedir(), LOG_SINK_CONFIG_FILE_NAME);\n return existsSync(homeConfigPath) ? homeConfigPath : undefined;\n}\n\nfunction parsePort(value: unknown, configPath: string): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!Number.isInteger(value) || (value as number) <= 0 || (value as number) > 65535) {\n throw new LogSinkConfigError(\n `Invalid ${LOG_SINK_CONFIG_FILE_NAME} at ${configPath}: global.port must be a TCP port`,\n );\n }\n\n return value as number;\n}\n\nfunction parseServices(value: unknown, configPath: string): string[] {\n if (value === undefined) {\n return [];\n }\n\n if (!Array.isArray(value)) {\n throw new LogSinkConfigError(\n `Invalid ${LOG_SINK_CONFIG_FILE_NAME} at ${configPath}: global.services must be a string array`,\n );\n }\n\n const services = new Set<string>();\n for (const item of value) {\n if (typeof item !== 'string' || item.trim().length === 0) {\n throw new LogSinkConfigError(\n `Invalid ${LOG_SINK_CONFIG_FILE_NAME} at ${configPath}: global.services must only contain strings`,\n );\n }\n\n services.add(item.trim());\n }\n\n return Array.from(services);\n}\n\nexport function loadLogSinkConfig(options: ResolveLogSinkInstanceOptions = {}): LogSinkConfig | undefined {\n const configPath = resolveLogSinkConfigPath(options);\n if (!configPath) {\n return undefined;\n }\n\n try {\n const rawConfig = readFileSync(configPath, 'utf-8');\n const parsed = parse(rawConfig);\n if (parsed == null) {\n return {\n path: configPath,\n global: { services: [] },\n };\n }\n\n if (!isRecord(parsed)) {\n throw new LogSinkConfigError(`Invalid ${LOG_SINK_CONFIG_FILE_NAME} at ${configPath}: root must be an object`);\n }\n\n const globalConfig = parsed.global;\n if (globalConfig !== undefined && !isRecord(globalConfig)) {\n throw new LogSinkConfigError(`Invalid ${LOG_SINK_CONFIG_FILE_NAME} at ${configPath}: global must be an object`);\n }\n\n return {\n path: configPath,\n global: {\n port: parsePort(globalConfig?.port, configPath),\n services: parseServices(globalConfig?.services, configPath),\n },\n };\n } catch (error) {\n if (error instanceof LogSinkConfigError) {\n throw error;\n }\n\n throw new LogSinkConfigError(\n `Failed to read ${LOG_SINK_CONFIG_FILE_NAME} at ${configPath}: ${error instanceof Error ? error.message : String(error)}`,\n { cause: error },\n );\n }\n}\n\nfunction resolveForcedScope(env: NodeJS.ProcessEnv): LogSinkScope | undefined {\n const rawScope = env.LOG_SINK_INSTANCE?.trim().toLowerCase();\n if (!rawScope) {\n return undefined;\n }\n\n if (rawScope === 'local' || rawScope === 'global') {\n return rawScope;\n }\n\n throw new LogSinkConfigError('LOG_SINK_INSTANCE must be either \"local\" or \"global\"');\n}\n\nfunction ensureGlobalDirectory(): string {\n mkdirSync(LOG_SINK_GLOBAL_DIR, { recursive: true });\n return LOG_SINK_GLOBAL_DIR;\n}\n\nexport function resolveLogSinkInstance(options: ResolveLogSinkInstanceOptions = {}): ResolvedLogSinkInstance {\n const env = options.env ?? process.env;\n const workspaceRoot = options.workspaceRoot\n ? path.resolve(options.workspaceRoot)\n : resolveWorkspaceRoot(options.cwd ?? process.cwd());\n const registeredName = options.packageName?.trim() || options.serviceName?.trim() || env.npm_package_name?.trim();\n const config = loadLogSinkConfig({ ...options, env, cwd: options.cwd ?? workspaceRoot, workspaceRoot });\n const globalServices = config?.global.services ?? [];\n const forcedScope = resolveForcedScope(env);\n const scope: LogSinkScope =\n forcedScope ?? (registeredName && globalServices.includes(registeredName) ? 'global' : 'local');\n const repositoryPath = scope === 'global' ? ensureGlobalDirectory() : workspaceRoot;\n\n return {\n configPath: config?.path,\n dbPath: scope === 'global' ? LOG_SINK_GLOBAL_DB_PATH : resolveDefaultDbPath(workspaceRoot),\n globalServices,\n port: scope === 'global' ? config?.global.port : undefined,\n registeredName,\n repositoryPath,\n scope,\n workspaceRoot,\n };\n}\n","import { DEFAULT_REGISTRY_PATH, PortRegistryService } from '@agimon-ai/foundation-port-registry';\nimport { resolveLogSinkInstance } from './logSinkConfig.js';\n\nconst LOG_SINK_SERVICE_NAME = 'log-sink-mcp-http';\n\nexport interface LogSinkPortResult {\n port: number;\n host: string;\n endpoint: string;\n}\n\nexport interface ResolveLogSinkPortOptions {\n configPath?: string;\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n packageName?: string;\n serviceName?: string;\n workspaceRoot?: string;\n healthCheck?: boolean;\n}\n\nexport async function resolveLogSinkPort(options: ResolveLogSinkPortOptions): Promise<LogSinkPortResult | undefined> {\n const { env = process.env, healthCheck = true } = options;\n const registryPath = env.PORT_REGISTRY_PATH ?? DEFAULT_REGISTRY_PATH;\n const instance = resolveLogSinkInstance(options);\n const environment = env.NODE_ENV || 'development';\n const portRegistry = new PortRegistryService(registryPath);\n\n try {\n const result = await portRegistry.getPort({\n repositoryPath: instance.repositoryPath,\n serviceName: LOG_SINK_SERVICE_NAME,\n serviceType: 'tool',\n environment,\n });\n\n if (!result.success || !result.port) {\n return undefined;\n }\n\n const host = result.record?.host === '0.0.0.0' ? '127.0.0.1' : (result.record?.host ?? '127.0.0.1');\n const endpoint = `http://${host}:${result.port}`;\n\n if (!healthCheck) {\n return { port: result.port, host, endpoint };\n }\n\n try {\n const health = await fetch(`${endpoint}/health`);\n if (!health.ok) {\n return undefined;\n }\n\n const payload = (await health.json()) as { status?: string; serviceName?: string; service?: string };\n if (payload.status !== 'healthy') {\n return undefined;\n }\n\n if (payload.serviceName !== LOG_SINK_SERVICE_NAME && payload.service !== LOG_SINK_SERVICE_NAME) {\n return undefined;\n }\n\n return { port: result.port, host, endpoint };\n } catch {\n return undefined;\n }\n } catch {\n return undefined;\n }\n}\n\nexport async function resolveLogSinkOtelEndpoint(options: ResolveLogSinkPortOptions): Promise<string | undefined> {\n const result = await resolveLogSinkPort(options);\n return result?.endpoint;\n}\n","import { AsyncLocalStorage } from 'node:async_hooks';\nimport { existsSync } from 'node:fs';\nimport { appendFile, mkdir, rename, stat } from 'node:fs/promises';\nimport path from 'node:path';\nimport { type Attributes, type Context, context, type Span, SpanKind, SpanStatusCode, trace } from '@opentelemetry/api';\nimport { logs, type Logger as OtelLogger, SeverityNumber } from '@opentelemetry/api-logs';\nimport { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport { BatchLogRecordProcessor, LoggerProvider } from '@opentelemetry/sdk-logs';\nimport { BatchSpanProcessor, NodeTracerProvider } from '@opentelemetry/sdk-trace-node';\nimport { resolveLogSinkOtelEndpoint } from '../utils/resolveLogSinkPort.js';\n\nconst WORKSPACE_MARKERS = ['pnpm-workspace.yaml', 'nx.json', '.git'];\nconst DEFAULT_LOG_DIR = path.join('logs', 'telemetry');\nconst DEFAULT_MAX_FILE_SIZE_BYTES = 10 * 1024 * 1024;\nconst DEFAULT_MAX_FILE_COUNT = 5;\n\nexport type TelemetryLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal';\nexport type NodeTelemetryBackend = 'otel' | 'logsink' | 'file' | 'disabled';\nexport type NodeTelemetryEndpointSource = 'env' | 'logsink' | 'none';\n\nexport interface NodeTelemetryLogOptions {\n attributes?: Attributes;\n context?: Context;\n exception?: unknown;\n}\n\nexport interface NodeTelemetrySpanOptions {\n attributes?: Attributes;\n context?: Context;\n kind?: SpanKind;\n}\n\nexport interface NodeTelemetryLogger {\n trace(message: string, options?: NodeTelemetryLogOptions): void;\n debug(message: string, options?: NodeTelemetryLogOptions): void;\n info(message: string, options?: NodeTelemetryLogOptions): void;\n warn(message: string, options?: NodeTelemetryLogOptions): void;\n error(message: string, options?: NodeTelemetryLogOptions): void;\n fatal(message: string, options?: NodeTelemetryLogOptions): void;\n getTraceContext(): { traceId?: string; spanId?: string };\n flush(): Promise<void>;\n shutdown(): Promise<void>;\n}\n\nexport interface NodeTelemetryOptions {\n configPath?: string;\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n serviceName: string;\n packageName?: string;\n serviceVersion?: string;\n workspaceRoot?: string;\n enableTraces?: boolean;\n enableLogs?: boolean;\n logDir?: string;\n logFileName?: string;\n maxFileSizeBytes?: number;\n maxFileCount?: number;\n /**\n * Attempt to discover a running log-sink endpoint even when the workspace does\n * not contain the log-sink package source. Discovery still health-checks, so\n * this stays a no-op when no healthy server is registered. Use this from\n * published consumers that depend on log-sink but run inside arbitrary repos.\n */\n discoverEndpoint?: boolean;\n /**\n * Extra headers attached to every OTLP export request (e.g. ingest-enrichment\n * headers used to scope telemetry by agent session / workflow).\n */\n headers?: Record<string, string>;\n}\n\nexport interface NodeTelemetryHandle {\n backend: NodeTelemetryBackend;\n enabled: boolean;\n trace: typeof trace;\n log: typeof logs;\n logger: NodeTelemetryLogger;\n endpointSource: NodeTelemetryEndpointSource;\n endpoint?: string;\n tracesEndpoint?: string;\n logsEndpoint?: string;\n filePath?: string;\n getTraceContext(): { traceId?: string; spanId?: string };\n runInSpan<T>(\n name: string,\n options: NodeTelemetrySpanOptions,\n callback: (span: Span | undefined) => Promise<T> | T,\n ): Promise<T>;\n flush(): Promise<void>;\n shutdown(): Promise<void>;\n}\n\nexport interface ResolvedNodeTelemetryEndpoints {\n endpointSource: NodeTelemetryEndpointSource;\n endpoint?: string;\n tracesEndpoint?: string;\n logsEndpoint?: string;\n}\n\ninterface SignalExporterConfig {\n url?: string;\n headers?: Record<string, string>;\n timeoutMillis?: number;\n}\n\ninterface FileSinkOptions {\n filePath: string;\n maxFileSizeBytes: number;\n maxFileCount: number;\n}\n\nfunction resolveWorkspaceRoot(startPath = process.cwd()): string {\n let currentDir = path.resolve(startPath);\n\n while (true) {\n for (const marker of WORKSPACE_MARKERS) {\n if (existsSync(path.join(currentDir, marker))) {\n return currentDir;\n }\n }\n\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n return process.cwd();\n }\n\n currentDir = parentDir;\n }\n}\n\nexport async function getLogSinkOtelEndpoint(options: {\n configPath?: string;\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n packageName?: string;\n serviceName?: string;\n workspaceRoot?: string;\n healthCheck?: boolean;\n}): Promise<string | undefined> {\n return resolveLogSinkOtelEndpoint(options);\n}\n\nfunction withSignalPath(baseUrl: string, signal: 'traces' | 'logs'): string {\n const normalizedBaseUrl = baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`;\n if (normalizedBaseUrl.endsWith(`/v1/${signal}/`) || normalizedBaseUrl.endsWith(`/v1/${signal}`)) {\n return baseUrl;\n }\n\n return new URL(`v1/${signal}`, normalizedBaseUrl).toString();\n}\n\nfunction isTruthyEnvValue(value: string | undefined): boolean {\n return (\n value === '1' || value?.toLowerCase() === 'true' || value?.toLowerCase() === 'yes' || value?.toLowerCase() === 'on'\n );\n}\n\nfunction parseHeaders(rawHeaders: string | undefined): Record<string, string> | undefined {\n if (!rawHeaders) {\n return undefined;\n }\n\n const headers: Record<string, string> = {};\n for (const pair of rawHeaders.split(',')) {\n const [rawKey, ...rawValueParts] = pair.split('=');\n const key = rawKey?.trim();\n const value = rawValueParts.join('=').trim();\n if (!key || !value) {\n continue;\n }\n headers[key] = value;\n }\n\n return Object.keys(headers).length > 0 ? headers : undefined;\n}\n\nfunction parseTimeout(rawTimeout: string | undefined): number | undefined {\n if (!rawTimeout) {\n return undefined;\n }\n\n const timeout = Number(rawTimeout);\n return Number.isFinite(timeout) && timeout > 0 ? timeout : undefined;\n}\n\nfunction mergeHeaders(...headersList: Array<Record<string, string> | undefined>): Record<string, string> | undefined {\n const merged: Record<string, string> = {};\n for (const headers of headersList) {\n if (!headers) {\n continue;\n }\n\n Object.assign(merged, headers);\n }\n\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\nfunction resolveExplicitSignalEndpoint(env: NodeJS.ProcessEnv, signal: 'traces' | 'logs'): string | undefined {\n const signalEndpoint =\n signal === 'traces' ? env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT : env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT;\n if (signalEndpoint) {\n return signalEndpoint;\n }\n\n return env.OTEL_EXPORTER_OTLP_ENDPOINT ? withSignalPath(env.OTEL_EXPORTER_OTLP_ENDPOINT, signal) : undefined;\n}\n\nexport function resolveSignalExporterConfig(\n env: NodeJS.ProcessEnv,\n signal: 'traces' | 'logs',\n optionHeaders?: Record<string, string>,\n): SignalExporterConfig {\n const signalHeaders =\n signal === 'traces' ? env.OTEL_EXPORTER_OTLP_TRACES_HEADERS : env.OTEL_EXPORTER_OTLP_LOGS_HEADERS;\n const signalTimeout =\n signal === 'traces' ? env.OTEL_EXPORTER_OTLP_TRACES_TIMEOUT : env.OTEL_EXPORTER_OTLP_LOGS_TIMEOUT;\n\n const workflowHeaders = Object.fromEntries(\n [\n ['x-agent-session-id', env.AGENT_SESSION_ID],\n ['x-agent-parent-session-id', env.PARENT_AGENT_SESSION_ID],\n ['x-workflow-run-id', env.WORKFLOW_RUN_ID],\n ['x-workflow-run-key', env.WORKFLOW_RUN_KEY],\n ['x-workflow-id', env.WORKFLOW_ID],\n ['x-workflow-name', env.WORKFLOW_NAME],\n ['x-workflow-workspace', env.WORKFLOW_WORKSPACE],\n ['x-workflow-job-id', env.WORKFLOW_JOB_ID],\n ['x-workflow-job-name', env.WORKFLOW_JOB_NAME],\n ['x-workflow-step-name', env.WORKFLOW_STEP_NAME],\n ['x-workflow-phase', env.WORKFLOW_PHASE],\n ['x-workflow-runner', env.WORKFLOW_RUNNER],\n ].filter((entry): entry is [string, string] => Boolean(entry[1])),\n );\n\n return {\n headers: mergeHeaders(\n workflowHeaders,\n parseHeaders(env.OTEL_EXPORTER_OTLP_HEADERS),\n parseHeaders(signalHeaders),\n optionHeaders,\n ),\n timeoutMillis: parseTimeout(signalTimeout ?? env.OTEL_EXPORTER_OTLP_TIMEOUT),\n };\n}\n\nexport async function resolveNodeTelemetryEndpoints(options: {\n configPath?: string;\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n packageName?: string;\n serviceName?: string;\n workspaceRoot?: string;\n discoverEndpoint?: boolean;\n healthCheck?: boolean;\n}): Promise<ResolvedNodeTelemetryEndpoints> {\n const env = options.env ?? process.env;\n const explicitTracesEndpoint = resolveExplicitSignalEndpoint(env, 'traces');\n const explicitLogsEndpoint = resolveExplicitSignalEndpoint(env, 'logs');\n if (explicitTracesEndpoint || explicitLogsEndpoint) {\n return {\n endpointSource: 'env',\n endpoint: env.OTEL_EXPORTER_OTLP_ENDPOINT,\n tracesEndpoint: explicitTracesEndpoint,\n logsEndpoint: explicitLogsEndpoint,\n };\n }\n\n if (env.LOG_SINK_ENDPOINT) {\n const sinkEndpoint = env.LOG_SINK_ENDPOINT;\n return {\n endpointSource: 'logsink',\n endpoint: sinkEndpoint,\n tracesEndpoint: withSignalPath(sinkEndpoint, 'traces'),\n logsEndpoint: withSignalPath(sinkEndpoint, 'logs'),\n };\n }\n\n if (options.discoverEndpoint === false) {\n return { endpointSource: 'none' };\n }\n\n const sinkEndpoint = await getLogSinkOtelEndpoint({\n configPath: options.configPath,\n cwd: options.cwd,\n env,\n packageName: options.packageName,\n serviceName: options.serviceName,\n workspaceRoot: options.workspaceRoot,\n healthCheck: options.healthCheck,\n });\n if (!sinkEndpoint) {\n return { endpointSource: 'none' };\n }\n\n return {\n endpointSource: 'logsink',\n endpoint: sinkEndpoint,\n tracesEndpoint: withSignalPath(sinkEndpoint, 'traces'),\n logsEndpoint: withSignalPath(sinkEndpoint, 'logs'),\n };\n}\n\nfunction toAttributeValue(value: unknown): string | number | boolean {\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n\n if (value == null) {\n return '';\n }\n\n return JSON.stringify(value);\n}\n\nfunction sanitizeAttributes(attributes?: Attributes): Attributes | undefined {\n if (!attributes) {\n return undefined;\n }\n\n const sanitized: Attributes = {};\n for (const [key, value] of Object.entries(attributes)) {\n if (value === undefined || value === null) {\n continue;\n }\n\n sanitized[key] = toAttributeValue(value);\n }\n\n return Object.keys(sanitized).length > 0 ? sanitized : undefined;\n}\n\nfunction getTraceContextFromContext(activeContext: Context): { traceId?: string; spanId?: string } {\n const activeSpan = trace.getSpan(activeContext);\n if (!activeSpan) {\n return {};\n }\n\n const spanContext = activeSpan.spanContext();\n return {\n traceId: spanContext.traceId,\n spanId: spanContext.spanId,\n };\n}\n\nfunction serializeLogRecord(\n level: TelemetryLevel,\n message: string,\n options: NodeTelemetryLogOptions = {},\n fallbackContext: Context = context.active(),\n): string {\n const activeSpan = trace.getSpan(options.context ?? fallbackContext);\n const spanContext = activeSpan?.spanContext();\n\n return JSON.stringify({\n timestamp: new Date().toISOString(),\n level,\n message,\n traceId: spanContext?.traceId,\n spanId: spanContext?.spanId,\n attributes: options.attributes ? sanitizeAttributes(options.attributes) : undefined,\n exception:\n options.exception instanceof Error\n ? { name: options.exception.name, message: options.exception.message, stack: options.exception.stack }\n : options.exception,\n });\n}\n\nclass RotatingFileSink {\n private pending: Promise<void> = Promise.resolve();\n\n constructor(private readonly options: FileSinkOptions) {}\n\n write(level: TelemetryLevel, message: string, options?: NodeTelemetryLogOptions): void {\n this.pending = this.pending\n .then(async () => {\n const entry = `${serializeLogRecord(level, message, options)}\\n`;\n await this.ensureDirectory();\n await this.rotateIfNeeded(Buffer.byteLength(entry));\n await appendFile(this.options.filePath, entry, 'utf8');\n })\n .catch((error) => {\n console.error(`[log-sink-mcp telemetry] Failed to write log file ${this.options.filePath}:`, error);\n });\n }\n\n async flush(): Promise<void> {\n await this.pending;\n }\n\n async shutdown(): Promise<void> {\n await this.flush();\n }\n\n private async ensureDirectory(): Promise<void> {\n await mkdir(path.dirname(this.options.filePath), { recursive: true });\n }\n\n private async rotateIfNeeded(incomingBytes: number): Promise<void> {\n let currentSize = 0;\n try {\n currentSize = (await stat(this.options.filePath)).size;\n } catch {\n // Missing files rotate from size zero.\n }\n\n if (currentSize + incomingBytes <= this.options.maxFileSizeBytes) {\n return;\n }\n\n for (let index = this.options.maxFileCount - 1; index >= 1; index -= 1) {\n const source = `${this.options.filePath}.${index}`;\n const target = `${this.options.filePath}.${index + 1}`;\n if (existsSync(source)) {\n await rename(source, target).catch(() => undefined);\n }\n }\n\n if (existsSync(this.options.filePath)) {\n await rename(this.options.filePath, `${this.options.filePath}.1`).catch(() => undefined);\n }\n }\n}\n\nfunction createOtelLogger(\n logger: OtelLogger,\n sink: { flush(): Promise<void>; shutdown(): Promise<void> },\n getActiveContext: () => Context,\n): NodeTelemetryLogger {\n return {\n trace(message, options) {\n logger.emit({\n severityNumber: SeverityNumber.TRACE,\n severityText: 'TRACE',\n body: message,\n attributes: sanitizeAttributes(options?.attributes),\n context: options?.context ?? getActiveContext(),\n exception: options?.exception,\n });\n },\n debug(message, options) {\n logger.emit({\n severityNumber: SeverityNumber.DEBUG,\n severityText: 'DEBUG',\n body: message,\n attributes: sanitizeAttributes(options?.attributes),\n context: options?.context ?? getActiveContext(),\n exception: options?.exception,\n });\n },\n info(message, options) {\n logger.emit({\n severityNumber: SeverityNumber.INFO,\n severityText: 'INFO',\n body: message,\n attributes: sanitizeAttributes(options?.attributes),\n context: options?.context ?? getActiveContext(),\n exception: options?.exception,\n });\n },\n warn(message, options) {\n logger.emit({\n severityNumber: SeverityNumber.WARN,\n severityText: 'WARN',\n body: message,\n attributes: sanitizeAttributes(options?.attributes),\n context: options?.context ?? getActiveContext(),\n exception: options?.exception,\n });\n },\n error(message, options) {\n logger.emit({\n severityNumber: SeverityNumber.ERROR,\n severityText: 'ERROR',\n body: message,\n attributes: sanitizeAttributes(options?.attributes),\n context: options?.context ?? getActiveContext(),\n exception: options?.exception,\n });\n },\n fatal(message, options) {\n logger.emit({\n severityNumber: SeverityNumber.FATAL,\n severityText: 'FATAL',\n body: message,\n attributes: sanitizeAttributes(options?.attributes),\n context: options?.context ?? getActiveContext(),\n exception: options?.exception,\n });\n },\n getTraceContext: () => getTraceContextFromContext(getActiveContext()),\n flush: () => sink.flush(),\n shutdown: () => sink.shutdown(),\n };\n}\n\nfunction createFileLogger(sink: RotatingFileSink, getActiveContext: () => Context): NodeTelemetryLogger {\n return {\n trace(message, options) {\n sink.write('trace', message, { ...options, context: options?.context ?? getActiveContext() });\n },\n debug(message, options) {\n sink.write('debug', message, { ...options, context: options?.context ?? getActiveContext() });\n },\n info(message, options) {\n sink.write('info', message, { ...options, context: options?.context ?? getActiveContext() });\n },\n warn(message, options) {\n sink.write('warn', message, { ...options, context: options?.context ?? getActiveContext() });\n },\n error(message, options) {\n sink.write('error', message, { ...options, context: options?.context ?? getActiveContext() });\n },\n fatal(message, options) {\n sink.write('fatal', message, { ...options, context: options?.context ?? getActiveContext() });\n },\n getTraceContext: () => getTraceContextFromContext(getActiveContext()),\n flush: () => sink.flush(),\n shutdown: () => sink.shutdown(),\n };\n}\n\nfunction createNoopLogger(getActiveContext: () => Context): NodeTelemetryLogger {\n const noop = (_message: string, _options?: NodeTelemetryLogOptions) => undefined;\n return {\n trace: noop,\n debug: noop,\n info: noop,\n warn: noop,\n error: noop,\n fatal: noop,\n getTraceContext: () => getTraceContextFromContext(getActiveContext()),\n flush: async () => undefined,\n shutdown: async () => undefined,\n };\n}\n\nfunction getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction recordSpanException(span: Span, error: unknown): void {\n const exception = error instanceof Error ? error : new Error(getErrorMessage(error));\n span.recordException(exception);\n span.setStatus({ code: SpanStatusCode.ERROR, message: exception.message });\n}\n\nexport async function createNodeTelemetry(options: NodeTelemetryOptions): Promise<NodeTelemetryHandle> {\n const env = options.env ?? process.env;\n const workspaceRoot = options.workspaceRoot ?? resolveWorkspaceRoot(process.cwd());\n const serviceName = options.serviceName || env.OTEL_SERVICE_NAME || 'unknown-service';\n const serviceVersion = options.serviceVersion ?? env.npm_package_version;\n const enableTraces = options.enableTraces !== false;\n const enableLogs = options.enableLogs !== false;\n const contextStore = new AsyncLocalStorage<Context>();\n const getActiveContext = () => contextStore.getStore() ?? context.active();\n const getTraceContext = () => getTraceContextFromContext(getActiveContext());\n const runWithoutSpan = async <T>(\n _name: string,\n _spanOptions: NodeTelemetrySpanOptions,\n callback: (span: Span | undefined) => Promise<T> | T,\n ) => await callback(undefined);\n\n if (isTruthyEnvValue(env.OTEL_SDK_DISABLED)) {\n const logger = createNoopLogger(getActiveContext);\n return {\n backend: 'disabled',\n enabled: false,\n trace,\n log: logs,\n logger,\n endpointSource: 'none',\n getTraceContext,\n runInSpan: runWithoutSpan,\n flush: () => logger.flush(),\n shutdown: () => logger.shutdown(),\n };\n }\n\n const maxFileSizeBytes =\n options.maxFileSizeBytes ?? Number(env.LOG_SINK_FILE_MAX_BYTES ?? DEFAULT_MAX_FILE_SIZE_BYTES);\n const maxFileCount = options.maxFileCount ?? Number(env.LOG_SINK_FILE_MAX_FILES ?? DEFAULT_MAX_FILE_COUNT);\n const logDir = options.logDir ?? path.join(workspaceRoot, DEFAULT_LOG_DIR);\n const logFileName = options.logFileName ?? `${serviceName}.jsonl`;\n const filePath = path.join(logDir, logFileName);\n\n const shouldDiscover = options.discoverEndpoint ?? true;\n const endpoints: ResolvedNodeTelemetryEndpoints = await resolveNodeTelemetryEndpoints({\n configPath: options.configPath,\n cwd: options.cwd,\n env,\n packageName: options.packageName,\n serviceName,\n workspaceRoot,\n discoverEndpoint: shouldDiscover,\n }).catch((error) => {\n console.warn(\n `[log-sink-mcp telemetry] Failed to resolve log-sink endpoint, falling back to file logging: ${getErrorMessage(error)}`,\n );\n return { endpointSource: 'none' };\n });\n const tracesEndpoint = enableTraces ? endpoints.tracesEndpoint : undefined;\n const logsEndpoint = enableLogs ? endpoints.logsEndpoint : undefined;\n\n if (tracesEndpoint || logsEndpoint) {\n const resourceAttributes: Attributes = {\n 'service.name': serviceName,\n };\n if (serviceVersion) {\n resourceAttributes['service.version'] = serviceVersion;\n }\n\n const resource = resourceFromAttributes(resourceAttributes);\n const tracerConfig = resolveSignalExporterConfig(env, 'traces', options.headers);\n const loggerConfig = resolveSignalExporterConfig(env, 'logs', options.headers);\n const tracerProvider = tracesEndpoint\n ? new NodeTracerProvider({\n resource,\n spanProcessors: [\n new BatchSpanProcessor(\n new OTLPTraceExporter({\n url: tracesEndpoint,\n headers: tracerConfig.headers,\n timeoutMillis: tracerConfig.timeoutMillis,\n }),\n ),\n ],\n })\n : undefined;\n const tracer = tracerProvider?.getTracer(serviceName, serviceVersion);\n\n const loggerProvider = logsEndpoint\n ? new LoggerProvider({\n resource,\n processors: [\n new BatchLogRecordProcessor(\n new OTLPLogExporter({\n url: logsEndpoint,\n headers: loggerConfig.headers,\n timeoutMillis: loggerConfig.timeoutMillis,\n }),\n ),\n ],\n })\n : undefined;\n\n const sinkLogger = loggerProvider?.getLogger(serviceName, serviceVersion);\n const logger = sinkLogger\n ? createOtelLogger(\n sinkLogger,\n {\n flush: async () => {\n await Promise.all([tracerProvider?.forceFlush(), loggerProvider?.forceFlush()]);\n },\n shutdown: async () => {\n await Promise.allSettled([tracerProvider?.shutdown(), loggerProvider?.shutdown()]);\n },\n },\n getActiveContext,\n )\n : createNoopLogger(getActiveContext);\n\n const runInSpan = async <T>(\n name: string,\n spanOptions: NodeTelemetrySpanOptions,\n callback: (span: Span | undefined) => Promise<T> | T,\n ): Promise<T> => {\n if (!tracer) {\n return await callback(undefined);\n }\n\n const parentContext = spanOptions.context ?? getActiveContext();\n const span = tracer.startSpan(\n name,\n {\n attributes: sanitizeAttributes(spanOptions.attributes),\n kind: spanOptions.kind ?? SpanKind.INTERNAL,\n },\n parentContext,\n );\n const activeContext = trace.setSpan(parentContext, span);\n\n return await contextStore.run(activeContext, async () => {\n try {\n return await callback(span);\n } catch (error) {\n recordSpanException(span, error);\n throw error;\n } finally {\n span.end();\n }\n });\n };\n\n return {\n backend: endpoints.endpointSource === 'env' ? 'otel' : 'logsink',\n enabled: true,\n trace,\n log: logs,\n logger,\n endpointSource: endpoints.endpointSource,\n endpoint: endpoints.endpoint,\n tracesEndpoint,\n logsEndpoint,\n getTraceContext,\n runInSpan,\n flush: async () => {\n await Promise.all([tracerProvider?.forceFlush(), loggerProvider?.forceFlush()]);\n },\n shutdown: async () => {\n await Promise.allSettled([tracerProvider?.shutdown(), loggerProvider?.shutdown()]);\n },\n };\n }\n\n const fileSink = new RotatingFileSink({\n filePath,\n maxFileSizeBytes,\n maxFileCount,\n });\n const logger = enableLogs ? createFileLogger(fileSink, getActiveContext) : createNoopLogger(getActiveContext);\n\n return {\n backend: 'file',\n enabled: enableLogs,\n trace,\n log: logs,\n logger,\n endpointSource: 'none',\n filePath,\n getTraceContext,\n runInSpan: runWithoutSpan,\n flush: () => fileSink.flush(),\n shutdown: () => fileSink.shutdown(),\n };\n}\n\nexport { logs as log, SpanKind, SpanStatusCode, trace };\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{existsSync as e,mkdirSync as t,readFileSync as n}from"node:fs";import{appendFile as r,mkdir as i,rename as a,stat as o}from"node:fs/promises";import{homedir as s,tmpdir as c}from"node:os";import l,{basename as u,dirname as d,join as f,resolve as p}from"node:path";import{DEFAULT_REGISTRY_PATH as m,PortRegistryService as h}from"@agimon-ai/foundation-port-registry";import{parse as g}from"yaml";import{AsyncLocalStorage as _}from"node:async_hooks";import{SpanKind as v,SpanStatusCode as y,context as b,trace as x}from"@opentelemetry/api";import{SeverityNumber as S,logs as C}from"@opentelemetry/api-logs";import{OTLPLogExporter as w}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPTraceExporter as T}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as ee}from"@opentelemetry/resources";import{BatchLogRecordProcessor as te,LoggerProvider as ne}from"@opentelemetry/sdk-logs";import{BatchSpanProcessor as re,NodeTracerProvider as E}from"@opentelemetry/sdk-trace-node";const D=[`pnpm-workspace.yaml`,`nx.json`,`.git`];function O(t=process.cwd()){let n=p(t);for(;;){for(let t of D)if(e(f(n,t)))return n;let t=d(n);if(t===n)return process.cwd();n=t}}function k(e){let t=u(O(e));return f(c(),`log-sink-mcp`,t,`session.db`)}const ie=`@agimon-ai/log-sink-mcp`,A=l.join(s(),`.log-sink-mcp`,`global`),ae=l.join(A,`session.db`),j=`.logsink.yaml`;var M=class extends Error{constructor(e,t){super(e,t),this.name=`LogSinkConfigError`}};function N(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function oe(e){return e===`~`?s():e.startsWith(`~/`)?l.join(s(),e.slice(2)):e}function se(t){let n=l.resolve(t);for(;;){let t=l.join(n,j);if(e(t))return t;let r=l.dirname(n);if(r===n)return;n=r}}function ce(t={}){let n=t.env??process.env,r=t.configPath??n.LOG_SINK_CONFIG;if(r)return l.resolve(oe(r));let i=se(t.cwd??t.workspaceRoot??process.cwd());if(i)return i;let a=l.join(s(),j);return e(a)?a:void 0}function le(e,t){if(e!==void 0){if(!Number.isInteger(e)||e<=0||e>65535)throw new M(`Invalid ${j} at ${t}: global.port must be a TCP port`);return e}}function ue(e,t){if(e===void 0)return[];if(!Array.isArray(e))throw new M(`Invalid ${j} at ${t}: global.services must be a string array`);let n=new Set;for(let r of e){if(typeof r!=`string`||r.trim().length===0)throw new M(`Invalid ${j} at ${t}: global.services must only contain strings`);n.add(r.trim())}return Array.from(n)}function P(e={}){let t=ce(e);if(t)try{let e=g(n(t,`utf-8`));if(e==null)return{path:t,global:{services:[]}};if(!N(e))throw new M(`Invalid ${j} at ${t}: root must be an object`);let r=e.global;if(r!==void 0&&!N(r))throw new M(`Invalid ${j} at ${t}: global must be an object`);return{path:t,global:{port:le(r?.port,t),services:ue(r?.services,t)}}}catch(e){throw e instanceof M?e:new M(`Failed to read ${j} at ${t}: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}function F(e){let t=e.LOG_SINK_INSTANCE?.trim().toLowerCase();if(t){if(t===`local`||t===`global`)return t;throw new M(`LOG_SINK_INSTANCE must be either "local" or "global"`)}}function I(){return t(A,{recursive:!0}),A}function L(e={}){let t=e.env??process.env,n=e.workspaceRoot?l.resolve(e.workspaceRoot):O(e.cwd??process.cwd()),r=e.packageName?.trim()||e.serviceName?.trim()||t.npm_package_name?.trim(),i=P({...e,env:t,cwd:e.cwd??n,workspaceRoot:n}),a=i?.global.services??[],o=F(t)??(r&&a.includes(r)?`global`:`local`),s=o===`global`?I():n;return{configPath:i?.path,dbPath:o===`global`?ae:k(n),globalServices:a,port:o===`global`?i?.global.port:void 0,registeredName:r,repositoryPath:s,scope:o,workspaceRoot:n}}const R=`log-sink-mcp-http`;async function z(e){let{env:t=process.env,healthCheck:n=!0}=e,r=t.PORT_REGISTRY_PATH??m,i=L(e),a=t.NODE_ENV||`development`,o=new h(r);try{let e=await o.getPort({repositoryPath:i.repositoryPath,serviceName:R,serviceType:`tool`,environment:a});if(!e.success||!e.port)return;let t=e.record?.host===`0.0.0.0`?`127.0.0.1`:e.record?.host??`127.0.0.1`,r=`http://${t}:${e.port}`;if(!n)return{port:e.port,host:t,endpoint:r};try{let n=await fetch(`${r}/health`);if(!n.ok)return;let i=await n.json();return i.status!==`healthy`||i.serviceName!==R&&i.service!==R?void 0:{port:e.port,host:t,endpoint:r}}catch{return}}catch{return}}async function B(e){return(await z(e))?.endpoint}const V=[`pnpm-workspace.yaml`,`nx.json`,`.git`],H=l.join(`logs`,`telemetry`);function de(t=process.cwd()){let n=l.resolve(t);for(;;){for(let t of V)if(e(l.join(n,t)))return n;let t=l.dirname(n);if(t===n)return process.cwd();n=t}}async function U(e){return B(e)}function W(e,t){let n=e.endsWith(`/`)?e:`${e}/`;return n.endsWith(`/v1/${t}/`)||n.endsWith(`/v1/${t}`)?e:new URL(`v1/${t}`,n).toString()}function fe(e){return e===`1`||e?.toLowerCase()===`true`||e?.toLowerCase()===`yes`||e?.toLowerCase()===`on`}function G(e){if(!e)return;let t={};for(let n of e.split(`,`)){let[e,...r]=n.split(`=`),i=e?.trim(),a=r.join(`=`).trim();!i||!a||(t[i]=a)}return Object.keys(t).length>0?t:void 0}function pe(e){if(!e)return;let t=Number(e);return Number.isFinite(t)&&t>0?t:void 0}function me(...e){let t={};for(let n of e)n&&Object.assign(t,n);return Object.keys(t).length>0?t:void 0}function K(e,t){return(t===`traces`?e.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT:e.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT)||(e.OTEL_EXPORTER_OTLP_ENDPOINT?W(e.OTEL_EXPORTER_OTLP_ENDPOINT,t):void 0)}function q(e,t,n){let r=t===`traces`?e.OTEL_EXPORTER_OTLP_TRACES_HEADERS:e.OTEL_EXPORTER_OTLP_LOGS_HEADERS,i=t===`traces`?e.OTEL_EXPORTER_OTLP_TRACES_TIMEOUT:e.OTEL_EXPORTER_OTLP_LOGS_TIMEOUT;return{headers:me(Object.fromEntries([[`x-agent-session-id`,e.AGENT_SESSION_ID],[`x-agent-parent-session-id`,e.PARENT_AGENT_SESSION_ID],[`x-workflow-run-id`,e.WORKFLOW_RUN_ID],[`x-workflow-run-key`,e.WORKFLOW_RUN_KEY],[`x-workflow-id`,e.WORKFLOW_ID],[`x-workflow-name`,e.WORKFLOW_NAME],[`x-workflow-workspace`,e.WORKFLOW_WORKSPACE],[`x-workflow-job-id`,e.WORKFLOW_JOB_ID],[`x-workflow-job-name`,e.WORKFLOW_JOB_NAME],[`x-workflow-step-name`,e.WORKFLOW_STEP_NAME],[`x-workflow-phase`,e.WORKFLOW_PHASE],[`x-workflow-runner`,e.WORKFLOW_RUNNER]].filter(e=>!!e[1])),G(e.OTEL_EXPORTER_OTLP_HEADERS),G(r),n),timeoutMillis:pe(i??e.OTEL_EXPORTER_OTLP_TIMEOUT)}}async function J(e){let t=e.env??process.env,n=K(t,`traces`),r=K(t,`logs`);if(n||r)return{endpointSource:`env`,endpoint:t.OTEL_EXPORTER_OTLP_ENDPOINT,tracesEndpoint:n,logsEndpoint:r};if(t.LOG_SINK_ENDPOINT){let e=t.LOG_SINK_ENDPOINT;return{endpointSource:`logsink`,endpoint:e,tracesEndpoint:W(e,`traces`),logsEndpoint:W(e,`logs`)}}if(e.discoverEndpoint===!1)return{endpointSource:`none`};let i=await U({configPath:e.configPath,cwd:e.cwd,env:t,packageName:e.packageName,serviceName:e.serviceName,workspaceRoot:e.workspaceRoot,healthCheck:e.healthCheck});return i?{endpointSource:`logsink`,endpoint:i,tracesEndpoint:W(i,`traces`),logsEndpoint:W(i,`logs`)}:{endpointSource:`none`}}function he(e){return typeof e==`string`||typeof e==`number`||typeof e==`boolean`?e:e==null?``:JSON.stringify(e)}function Y(e){if(!e)return;let t={};for(let[n,r]of Object.entries(e))r!=null&&(t[n]=he(r));return Object.keys(t).length>0?t:void 0}function X(e){let t=x.getSpan(e);if(!t)return{};let n=t.spanContext();return{traceId:n.traceId,spanId:n.spanId}}function ge(e,t,n={},r=b.active()){let i=x.getSpan(n.context??r)?.spanContext();return JSON.stringify({timestamp:new Date().toISOString(),level:e,message:t,traceId:i?.traceId,spanId:i?.spanId,attributes:n.attributes?Y(n.attributes):void 0,exception:n.exception instanceof Error?{name:n.exception.name,message:n.exception.message,stack:n.exception.stack}:n.exception})}var _e=class{pending=Promise.resolve();constructor(e){this.options=e}write(e,t,n){this.pending=this.pending.then(async()=>{let i=`${ge(e,t,n)}\n`;await this.ensureDirectory(),await this.rotateIfNeeded(Buffer.byteLength(i)),await r(this.options.filePath,i,`utf8`)}).catch(e=>{console.error(`[log-sink-mcp telemetry] Failed to write log file ${this.options.filePath}:`,e)})}async flush(){await this.pending}async shutdown(){await this.flush()}async ensureDirectory(){await i(l.dirname(this.options.filePath),{recursive:!0})}async rotateIfNeeded(t){let n=0;try{n=(await o(this.options.filePath)).size}catch{}if(!(n+t<=this.options.maxFileSizeBytes)){for(let t=this.options.maxFileCount-1;t>=1;--t){let n=`${this.options.filePath}.${t}`,r=`${this.options.filePath}.${t+1}`;e(n)&&await a(n,r).catch(()=>void 0)}e(this.options.filePath)&&await a(this.options.filePath,`${this.options.filePath}.1`).catch(()=>void 0)}}};function ve(e,t,n){return{trace(t,r){e.emit({severityNumber:S.TRACE,severityText:`TRACE`,body:t,attributes:Y(r?.attributes),context:r?.context??n(),exception:r?.exception})},debug(t,r){e.emit({severityNumber:S.DEBUG,severityText:`DEBUG`,body:t,attributes:Y(r?.attributes),context:r?.context??n(),exception:r?.exception})},info(t,r){e.emit({severityNumber:S.INFO,severityText:`INFO`,body:t,attributes:Y(r?.attributes),context:r?.context??n(),exception:r?.exception})},warn(t,r){e.emit({severityNumber:S.WARN,severityText:`WARN`,body:t,attributes:Y(r?.attributes),context:r?.context??n(),exception:r?.exception})},error(t,r){e.emit({severityNumber:S.ERROR,severityText:`ERROR`,body:t,attributes:Y(r?.attributes),context:r?.context??n(),exception:r?.exception})},fatal(t,r){e.emit({severityNumber:S.FATAL,severityText:`FATAL`,body:t,attributes:Y(r?.attributes),context:r?.context??n(),exception:r?.exception})},getTraceContext:()=>X(n()),flush:()=>t.flush(),shutdown:()=>t.shutdown()}}function Z(e,t){return{trace(n,r){e.write(`trace`,n,{...r,context:r?.context??t()})},debug(n,r){e.write(`debug`,n,{...r,context:r?.context??t()})},info(n,r){e.write(`info`,n,{...r,context:r?.context??t()})},warn(n,r){e.write(`warn`,n,{...r,context:r?.context??t()})},error(n,r){e.write(`error`,n,{...r,context:r?.context??t()})},fatal(n,r){e.write(`fatal`,n,{...r,context:r?.context??t()})},getTraceContext:()=>X(t()),flush:()=>e.flush(),shutdown:()=>e.shutdown()}}function Q(e){let t=(e,t)=>void 0;return{trace:t,debug:t,info:t,warn:t,error:t,fatal:t,getTraceContext:()=>X(e()),flush:async()=>void 0,shutdown:async()=>void 0}}function $(e){return e instanceof Error?e.message:String(e)}function ye(e,t){let n=t instanceof Error?t:Error($(t));e.recordException(n),e.setStatus({code:y.ERROR,message:n.message})}async function be(e){let t=e.env??process.env,n=e.workspaceRoot??de(process.cwd()),r=e.serviceName||t.OTEL_SERVICE_NAME||`unknown-service`,i=e.serviceVersion??t.npm_package_version,a=e.enableTraces!==!1,o=e.enableLogs!==!1,s=new _,c=()=>s.getStore()??b.active(),u=()=>X(c()),d=async(e,t,n)=>await n(void 0);if(fe(t.OTEL_SDK_DISABLED)){let e=Q(c);return{backend:`disabled`,enabled:!1,trace:x,log:C,logger:e,endpointSource:`none`,getTraceContext:u,runInSpan:d,flush:()=>e.flush(),shutdown:()=>e.shutdown()}}let f=e.maxFileSizeBytes??Number(t.LOG_SINK_FILE_MAX_BYTES??10485760),p=e.maxFileCount??Number(t.LOG_SINK_FILE_MAX_FILES??5),m=e.logDir??l.join(n,H),h=e.logFileName??`${r}.jsonl`,g=l.join(m,h),y=e.discoverEndpoint??!0,S=await J({configPath:e.configPath,cwd:e.cwd,env:t,packageName:e.packageName,serviceName:r,workspaceRoot:n,discoverEndpoint:y}).catch(e=>(console.warn(`[log-sink-mcp telemetry] Failed to resolve log-sink endpoint, falling back to file logging: ${$(e)}`),{endpointSource:`none`})),D=a?S.tracesEndpoint:void 0,O=o?S.logsEndpoint:void 0;if(D||O){let n={"service.name":r};i&&(n[`service.version`]=i);let a=ee(n),o=q(t,`traces`,e.headers),l=q(t,`logs`,e.headers),d=D?new E({resource:a,spanProcessors:[new re(new T({url:D,headers:o.headers,timeoutMillis:o.timeoutMillis}))]}):void 0,f=d?.getTracer(r,i),p=O?new ne({resource:a,processors:[new te(new w({url:O,headers:l.headers,timeoutMillis:l.timeoutMillis}))]}):void 0,m=p?.getLogger(r,i),h=m?ve(m,{flush:async()=>{await Promise.allSettled([d?.forceFlush(),p?.forceFlush()])},shutdown:async()=>{await Promise.allSettled([d?.shutdown(),p?.shutdown()])}},c):Q(c);return{backend:S.endpointSource===`env`?`otel`:`logsink`,enabled:!0,trace:x,log:C,logger:h,endpointSource:S.endpointSource,endpoint:S.endpoint,tracesEndpoint:D,logsEndpoint:O,getTraceContext:u,runInSpan:async(e,t,n)=>{if(!f)return await n(void 0);let r=t.context??c(),i=f.startSpan(e,{attributes:Y(t.attributes),kind:t.kind??v.INTERNAL},r),a=x.setSpan(r,i);return await s.run(a,async()=>{try{return await n(i)}catch(e){throw ye(i,e),e}finally{i.end()}})},flush:async()=>{await Promise.allSettled([d?.forceFlush(),p?.forceFlush()])},shutdown:async()=>{await Promise.allSettled([d?.shutdown(),p?.shutdown()])}}}let k=new _e({filePath:g,maxFileSizeBytes:f,maxFileCount:p});return{backend:`file`,enabled:o,trace:x,log:C,logger:o?Z(k,c):Q(c),endpointSource:`none`,filePath:g,getTraceContext:u,runInSpan:d,flush:()=>k.flush(),shutdown:()=>k.shutdown()}}export{C as a,x as c,ie as d,L as f,U as i,B as l,y as n,J as o,O as p,be as r,q as s,v as t,z as u};
2
- //# sourceMappingURL=node-B4HdfM_E.mjs.map
1
+ import{existsSync as e,mkdirSync as t,readFileSync as n}from"node:fs";import{appendFile as r,mkdir as i,rename as a,stat as o}from"node:fs/promises";import{homedir as s,tmpdir as c}from"node:os";import l,{basename as u,dirname as d,join as f,resolve as p}from"node:path";import{DEFAULT_REGISTRY_PATH as m,PortRegistryService as h}from"@agimon-ai/foundation-port-registry";import{parse as g}from"yaml";import{AsyncLocalStorage as _}from"node:async_hooks";import{SpanKind as v,SpanStatusCode as y,context as b,trace as x}from"@opentelemetry/api";import{SeverityNumber as S,logs as C}from"@opentelemetry/api-logs";import{OTLPLogExporter as w}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPTraceExporter as T}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as ee}from"@opentelemetry/resources";import{BatchLogRecordProcessor as te,LoggerProvider as ne}from"@opentelemetry/sdk-logs";import{BatchSpanProcessor as re,NodeTracerProvider as E}from"@opentelemetry/sdk-trace-node";const D=[`pnpm-workspace.yaml`,`nx.json`,`.git`];function O(t=process.cwd()){let n=p(t);for(;;){for(let t of D)if(e(f(n,t)))return n;let t=d(n);if(t===n)return process.cwd();n=t}}function k(e){let t=u(O(e));return f(c(),`log-sink-mcp`,t,`session.db`)}const ie=`@agimon-ai/log-sink-mcp`,A=l.join(s(),`.log-sink-mcp`,`global`),ae=l.join(A,`session.db`),j=`.logsink.yaml`;var M=class extends Error{constructor(e,t){super(e,t),this.name=`LogSinkConfigError`}};function N(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function oe(e){return e===`~`?s():e.startsWith(`~/`)?l.join(s(),e.slice(2)):e}function se(t){let n=l.resolve(t);for(;;){let t=l.join(n,j);if(e(t))return t;let r=l.dirname(n);if(r===n)return;n=r}}function ce(t={}){let n=t.env??process.env,r=t.configPath??n.LOG_SINK_CONFIG;if(r)return l.resolve(oe(r));let i=se(t.cwd??t.workspaceRoot??process.cwd());if(i)return i;let a=l.join(s(),j);return e(a)?a:void 0}function le(e,t){if(e!==void 0){if(!Number.isInteger(e)||e<=0||e>65535)throw new M(`Invalid ${j} at ${t}: global.port must be a TCP port`);return e}}function ue(e,t){if(e===void 0)return[];if(!Array.isArray(e))throw new M(`Invalid ${j} at ${t}: global.services must be a string array`);let n=new Set;for(let r of e){if(typeof r!=`string`||r.trim().length===0)throw new M(`Invalid ${j} at ${t}: global.services must only contain strings`);n.add(r.trim())}return Array.from(n)}function P(e={}){let t=ce(e);if(t)try{let e=g(n(t,`utf-8`));if(e==null)return{path:t,global:{services:[]}};if(!N(e))throw new M(`Invalid ${j} at ${t}: root must be an object`);let r=e.global;if(r!==void 0&&!N(r))throw new M(`Invalid ${j} at ${t}: global must be an object`);return{path:t,global:{port:le(r?.port,t),services:ue(r?.services,t)}}}catch(e){throw e instanceof M?e:new M(`Failed to read ${j} at ${t}: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}function F(e){let t=e.LOG_SINK_INSTANCE?.trim().toLowerCase();if(t){if(t===`local`||t===`global`)return t;throw new M(`LOG_SINK_INSTANCE must be either "local" or "global"`)}}function I(){return t(A,{recursive:!0}),A}function L(e={}){let t=e.env??process.env,n=e.workspaceRoot?l.resolve(e.workspaceRoot):O(e.cwd??process.cwd()),r=e.packageName?.trim()||e.serviceName?.trim()||t.npm_package_name?.trim(),i=P({...e,env:t,cwd:e.cwd??n,workspaceRoot:n}),a=i?.global.services??[],o=F(t)??(r&&a.includes(r)?`global`:`local`),s=o===`global`?I():n;return{configPath:i?.path,dbPath:o===`global`?ae:k(n),globalServices:a,port:o===`global`?i?.global.port:void 0,registeredName:r,repositoryPath:s,scope:o,workspaceRoot:n}}const R=`log-sink-mcp-http`;async function z(e){let{env:t=process.env,healthCheck:n=!0}=e,r=t.PORT_REGISTRY_PATH??m,i=L(e),a=t.NODE_ENV||`development`,o=new h(r);try{let e=await o.getPort({repositoryPath:i.repositoryPath,serviceName:R,serviceType:`tool`,environment:a});if(!e.success||!e.port)return;let t=e.record?.host===`0.0.0.0`?`127.0.0.1`:e.record?.host??`127.0.0.1`,r=`http://${t}:${e.port}`;if(!n)return{port:e.port,host:t,endpoint:r};try{let n=await fetch(`${r}/health`);if(!n.ok)return;let i=await n.json();return i.status!==`healthy`||i.serviceName!==R&&i.service!==R?void 0:{port:e.port,host:t,endpoint:r}}catch{return}}catch{return}}async function B(e){return(await z(e))?.endpoint}const V=[`pnpm-workspace.yaml`,`nx.json`,`.git`],H=l.join(`logs`,`telemetry`);function de(t=process.cwd()){let n=l.resolve(t);for(;;){for(let t of V)if(e(l.join(n,t)))return n;let t=l.dirname(n);if(t===n)return process.cwd();n=t}}async function U(e){return B(e)}function W(e,t){let n=e.endsWith(`/`)?e:`${e}/`;return n.endsWith(`/v1/${t}/`)||n.endsWith(`/v1/${t}`)?e:new URL(`v1/${t}`,n).toString()}function fe(e){return e===`1`||e?.toLowerCase()===`true`||e?.toLowerCase()===`yes`||e?.toLowerCase()===`on`}function G(e){if(!e)return;let t={};for(let n of e.split(`,`)){let[e,...r]=n.split(`=`),i=e?.trim(),a=r.join(`=`).trim();!i||!a||(t[i]=a)}return Object.keys(t).length>0?t:void 0}function pe(e){if(!e)return;let t=Number(e);return Number.isFinite(t)&&t>0?t:void 0}function me(...e){let t={};for(let n of e)n&&Object.assign(t,n);return Object.keys(t).length>0?t:void 0}function K(e,t){return(t===`traces`?e.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT:e.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT)||(e.OTEL_EXPORTER_OTLP_ENDPOINT?W(e.OTEL_EXPORTER_OTLP_ENDPOINT,t):void 0)}function q(e,t,n){let r=t===`traces`?e.OTEL_EXPORTER_OTLP_TRACES_HEADERS:e.OTEL_EXPORTER_OTLP_LOGS_HEADERS,i=t===`traces`?e.OTEL_EXPORTER_OTLP_TRACES_TIMEOUT:e.OTEL_EXPORTER_OTLP_LOGS_TIMEOUT;return{headers:me(Object.fromEntries([[`x-agent-session-id`,e.AGENT_SESSION_ID],[`x-agent-parent-session-id`,e.PARENT_AGENT_SESSION_ID],[`x-workflow-run-id`,e.WORKFLOW_RUN_ID],[`x-workflow-run-key`,e.WORKFLOW_RUN_KEY],[`x-workflow-id`,e.WORKFLOW_ID],[`x-workflow-name`,e.WORKFLOW_NAME],[`x-workflow-workspace`,e.WORKFLOW_WORKSPACE],[`x-workflow-job-id`,e.WORKFLOW_JOB_ID],[`x-workflow-job-name`,e.WORKFLOW_JOB_NAME],[`x-workflow-step-name`,e.WORKFLOW_STEP_NAME],[`x-workflow-phase`,e.WORKFLOW_PHASE],[`x-workflow-runner`,e.WORKFLOW_RUNNER]].filter(e=>!!e[1])),G(e.OTEL_EXPORTER_OTLP_HEADERS),G(r),n),timeoutMillis:pe(i??e.OTEL_EXPORTER_OTLP_TIMEOUT)}}async function J(e){let t=e.env??process.env,n=K(t,`traces`),r=K(t,`logs`);if(n||r)return{endpointSource:`env`,endpoint:t.OTEL_EXPORTER_OTLP_ENDPOINT,tracesEndpoint:n,logsEndpoint:r};if(t.LOG_SINK_ENDPOINT){let e=t.LOG_SINK_ENDPOINT;return{endpointSource:`logsink`,endpoint:e,tracesEndpoint:W(e,`traces`),logsEndpoint:W(e,`logs`)}}if(e.discoverEndpoint===!1)return{endpointSource:`none`};let i=await U({configPath:e.configPath,cwd:e.cwd,env:t,packageName:e.packageName,serviceName:e.serviceName,workspaceRoot:e.workspaceRoot,healthCheck:e.healthCheck});return i?{endpointSource:`logsink`,endpoint:i,tracesEndpoint:W(i,`traces`),logsEndpoint:W(i,`logs`)}:{endpointSource:`none`}}function he(e){return typeof e==`string`||typeof e==`number`||typeof e==`boolean`?e:e==null?``:JSON.stringify(e)}function Y(e){if(!e)return;let t={};for(let[n,r]of Object.entries(e))r!=null&&(t[n]=he(r));return Object.keys(t).length>0?t:void 0}function X(e){let t=x.getSpan(e);if(!t)return{};let n=t.spanContext();return{traceId:n.traceId,spanId:n.spanId}}function ge(e,t,n={},r=b.active()){let i=x.getSpan(n.context??r)?.spanContext();return JSON.stringify({timestamp:new Date().toISOString(),level:e,message:t,traceId:i?.traceId,spanId:i?.spanId,attributes:n.attributes?Y(n.attributes):void 0,exception:n.exception instanceof Error?{name:n.exception.name,message:n.exception.message,stack:n.exception.stack}:n.exception})}var _e=class{pending=Promise.resolve();constructor(e){this.options=e}write(e,t,n){this.pending=this.pending.then(async()=>{let i=`${ge(e,t,n)}\n`;await this.ensureDirectory(),await this.rotateIfNeeded(Buffer.byteLength(i)),await r(this.options.filePath,i,`utf8`)}).catch(e=>{console.error(`[log-sink-mcp telemetry] Failed to write log file ${this.options.filePath}:`,e)})}async flush(){await this.pending}async shutdown(){await this.flush()}async ensureDirectory(){await i(l.dirname(this.options.filePath),{recursive:!0})}async rotateIfNeeded(t){let n=0;try{n=(await o(this.options.filePath)).size}catch{}if(!(n+t<=this.options.maxFileSizeBytes)){for(let t=this.options.maxFileCount-1;t>=1;--t){let n=`${this.options.filePath}.${t}`,r=`${this.options.filePath}.${t+1}`;e(n)&&await a(n,r).catch(()=>void 0)}e(this.options.filePath)&&await a(this.options.filePath,`${this.options.filePath}.1`).catch(()=>void 0)}}};function ve(e,t,n){return{trace(t,r){e.emit({severityNumber:S.TRACE,severityText:`TRACE`,body:t,attributes:Y(r?.attributes),context:r?.context??n(),exception:r?.exception})},debug(t,r){e.emit({severityNumber:S.DEBUG,severityText:`DEBUG`,body:t,attributes:Y(r?.attributes),context:r?.context??n(),exception:r?.exception})},info(t,r){e.emit({severityNumber:S.INFO,severityText:`INFO`,body:t,attributes:Y(r?.attributes),context:r?.context??n(),exception:r?.exception})},warn(t,r){e.emit({severityNumber:S.WARN,severityText:`WARN`,body:t,attributes:Y(r?.attributes),context:r?.context??n(),exception:r?.exception})},error(t,r){e.emit({severityNumber:S.ERROR,severityText:`ERROR`,body:t,attributes:Y(r?.attributes),context:r?.context??n(),exception:r?.exception})},fatal(t,r){e.emit({severityNumber:S.FATAL,severityText:`FATAL`,body:t,attributes:Y(r?.attributes),context:r?.context??n(),exception:r?.exception})},getTraceContext:()=>X(n()),flush:()=>t.flush(),shutdown:()=>t.shutdown()}}function Z(e,t){return{trace(n,r){e.write(`trace`,n,{...r,context:r?.context??t()})},debug(n,r){e.write(`debug`,n,{...r,context:r?.context??t()})},info(n,r){e.write(`info`,n,{...r,context:r?.context??t()})},warn(n,r){e.write(`warn`,n,{...r,context:r?.context??t()})},error(n,r){e.write(`error`,n,{...r,context:r?.context??t()})},fatal(n,r){e.write(`fatal`,n,{...r,context:r?.context??t()})},getTraceContext:()=>X(t()),flush:()=>e.flush(),shutdown:()=>e.shutdown()}}function Q(e){let t=(e,t)=>void 0;return{trace:t,debug:t,info:t,warn:t,error:t,fatal:t,getTraceContext:()=>X(e()),flush:async()=>void 0,shutdown:async()=>void 0}}function $(e){return e instanceof Error?e.message:String(e)}function ye(e,t){let n=t instanceof Error?t:Error($(t));e.recordException(n),e.setStatus({code:y.ERROR,message:n.message})}async function be(e){let t=e.env??process.env,n=e.workspaceRoot??de(process.cwd()),r=e.serviceName||t.OTEL_SERVICE_NAME||`unknown-service`,i=e.serviceVersion??t.npm_package_version,a=e.enableTraces!==!1,o=e.enableLogs!==!1,s=new _,c=()=>s.getStore()??b.active(),u=()=>X(c()),d=async(e,t,n)=>await n(void 0);if(fe(t.OTEL_SDK_DISABLED)){let e=Q(c);return{backend:`disabled`,enabled:!1,trace:x,log:C,logger:e,endpointSource:`none`,getTraceContext:u,runInSpan:d,flush:()=>e.flush(),shutdown:()=>e.shutdown()}}let f=e.maxFileSizeBytes??Number(t.LOG_SINK_FILE_MAX_BYTES??10485760),p=e.maxFileCount??Number(t.LOG_SINK_FILE_MAX_FILES??5),m=e.logDir??l.join(n,H),h=e.logFileName??`${r}.jsonl`,g=l.join(m,h),y=e.discoverEndpoint??!0,S=await J({configPath:e.configPath,cwd:e.cwd,env:t,packageName:e.packageName,serviceName:r,workspaceRoot:n,discoverEndpoint:y}).catch(e=>(console.warn(`[log-sink-mcp telemetry] Failed to resolve log-sink endpoint, falling back to file logging: ${$(e)}`),{endpointSource:`none`})),D=a?S.tracesEndpoint:void 0,O=o?S.logsEndpoint:void 0;if(D||O){let n={"service.name":r};i&&(n[`service.version`]=i);let a=ee(n),o=q(t,`traces`,e.headers),l=q(t,`logs`,e.headers),d=D?new E({resource:a,spanProcessors:[new re(new T({url:D,headers:o.headers,timeoutMillis:o.timeoutMillis}))]}):void 0,f=d?.getTracer(r,i),p=O?new ne({resource:a,processors:[new te(new w({url:O,headers:l.headers,timeoutMillis:l.timeoutMillis}))]}):void 0,m=p?.getLogger(r,i),h=m?ve(m,{flush:async()=>{await Promise.all([d?.forceFlush(),p?.forceFlush()])},shutdown:async()=>{await Promise.allSettled([d?.shutdown(),p?.shutdown()])}},c):Q(c);return{backend:S.endpointSource===`env`?`otel`:`logsink`,enabled:!0,trace:x,log:C,logger:h,endpointSource:S.endpointSource,endpoint:S.endpoint,tracesEndpoint:D,logsEndpoint:O,getTraceContext:u,runInSpan:async(e,t,n)=>{if(!f)return await n(void 0);let r=t.context??c(),i=f.startSpan(e,{attributes:Y(t.attributes),kind:t.kind??v.INTERNAL},r),a=x.setSpan(r,i);return await s.run(a,async()=>{try{return await n(i)}catch(e){throw ye(i,e),e}finally{i.end()}})},flush:async()=>{await Promise.all([d?.forceFlush(),p?.forceFlush()])},shutdown:async()=>{await Promise.allSettled([d?.shutdown(),p?.shutdown()])}}}let k=new _e({filePath:g,maxFileSizeBytes:f,maxFileCount:p});return{backend:`file`,enabled:o,trace:x,log:C,logger:o?Z(k,c):Q(c),endpointSource:`none`,filePath:g,getTraceContext:u,runInSpan:d,flush:()=>k.flush(),shutdown:()=>k.shutdown()}}export{C as a,x as c,ie as d,L as f,U as i,B as l,y as n,J as o,O as p,be as r,q as s,v as t,z as u};
2
+ //# sourceMappingURL=node-Bv2snZci.mjs.map